{
  "swagger": "2.0",
  "info": {
    "title": "API Eje Comercial & Financiero",
    "description": "Documentación Swagger de EC&F",
    "version": "v1"
  },
  "host": "test.back.ejecomercial.co",
  "schemes": [
    "https"
  ],
  "basePath": "/",
  "consumes": [
    "application/json"
  ],
  "produces": [
    "application/json"
  ],
  "securityDefinitions": {
    "Basic": {
      "type": "basic"
    }
  },
  "security": [
    {
      "Basic": []
    }
  ],
  "paths": {
    "/api/admin-reports/": {
      "get": {
        "operationId": "api_admin-reports_list",
        "description": "GET /api/admin-reports/ -> informes y bitácoras publicados (sin contenido).",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/admin-reports/{slug}/": {
      "get": {
        "operationId": "api_admin-reports_read",
        "description": "GET /api/admin-reports/<slug>/ -> metadatos + `html` (y `markdown` si aplica).",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": [
        {
          "name": "slug",
          "in": "path",
          "required": true,
          "type": "string"
        }
      ]
    },
    "/api/advisor/commercial_audit/": {
      "get": {
        "operationId": "api_advisor_commercial_audit_list",
        "description": "GET /api/advisor/commercial_audit/?date=YYYY-MM-DD : gestiones de contacto\ndel día por asesor (resultado, descartes, leads sin gestión). Solo admin.",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/advisor/funnel_roi/": {
      "get": {
        "operationId": "api_advisor_funnel_roi_list",
        "description": "GET /api/advisor/funnel_roi/?period=YYYY-MM : embudo por etapa, colocación\ndel mes y ROI frente al costo del asesor (AdvisorCost o costo por defecto).",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/advisor/goals/": {
      "get": {
        "operationId": "api_advisor_goals_list",
        "description": "CRUD de metas mensuales (M5) — solo admin.",
        "parameters": [
          {
            "name": "page",
            "in": "query",
            "description": "Un número de página dentro del conjunto de resultados paginado.",
            "required": false,
            "type": "integer"
          },
          {
            "name": "page_size",
            "in": "query",
            "description": "Número de resultados a devolver por página.",
            "required": false,
            "type": "integer"
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "required": [
                "count",
                "results"
              ],
              "type": "object",
              "properties": {
                "count": {
                  "type": "integer"
                },
                "next": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "previous": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "results": {
                  "type": "array",
                  "items": {
                    "$ref": "#/definitions/AdvisorGoal"
                  }
                }
              }
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "post": {
        "operationId": "api_advisor_goals_create",
        "description": "CRUD de metas mensuales (M5) — solo admin.",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/AdvisorGoal"
            }
          }
        ],
        "responses": {
          "201": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/AdvisorGoal"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/advisor/goals/{id}/": {
      "get": {
        "operationId": "api_advisor_goals_read",
        "description": "CRUD de metas mensuales (M5) — solo admin.",
        "parameters": [],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/AdvisorGoal"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "put": {
        "operationId": "api_advisor_goals_update",
        "description": "CRUD de metas mensuales (M5) — solo admin.",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/AdvisorGoal"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/AdvisorGoal"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "patch": {
        "operationId": "api_advisor_goals_partial_update",
        "description": "CRUD de metas mensuales (M5) — solo admin.",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/AdvisorGoal"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/AdvisorGoal"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "delete": {
        "operationId": "api_advisor_goals_delete",
        "description": "CRUD de metas mensuales (M5) — solo admin.",
        "parameters": [],
        "responses": {
          "204": {
            "description": ""
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "description": "Un valor de entero único que identifique este advisor goal.",
          "required": true,
          "type": "integer"
        }
      ]
    },
    "/api/advisor/heartbeat/": {
      "post": {
        "operationId": "api_advisor_heartbeat_create",
        "summary": "POST /api/advisor/heartbeat/ — recepción liviana de latidos.",
        "description": "El servidor acota active_seconds a 1.5× el intervalo configurado para\nimpedir inflado desde un cliente manipulado, y hace upsert (no insert)\npor (sesión diaria, módulo, entidad).",
        "parameters": [],
        "responses": {
          "201": {
            "description": ""
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/advisor/monitoring_stats/": {
      "get": {
        "operationId": "api_advisor_monitoring_stats_list",
        "description": "GET /api/advisor/monitoring_stats/?date=YYYY-MM-DD&role=<rol> — solo admin.\nSemáforo en vivo + agregados de jornada por asesor.",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/advisor/my_activity/": {
      "get": {
        "operationId": "api_advisor_my_activity_list",
        "description": "GET /api/advisor/my_activity/?from=&to= — transparencia (M8):\nel asesor ve exactamente sus propios datos + la política de medición.",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/advisor/nps/": {
      "get": {
        "operationId": "api_advisor_nps_list",
        "description": "GET /api/advisor/nps/?period=YYYY-MM : tablero NPS por asesor (encuestas de\nsatisfacción respondidas en el mes): promotores, pasivos, detractores y NPS.",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/advisor/presence_config/": {
      "get": {
        "operationId": "api_advisor_presence_config_list",
        "description": "GET /api/advisor/presence_config/ — umbrales vigentes para el hook.",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/advisor/scorecard/": {
      "get": {
        "operationId": "api_advisor_scorecard_list",
        "description": "GET /api/advisor/scorecard/?period=YYYY-MM[&user=<id>] — metas vs real.\nSolo admin (el asesor ve lo suyo vía my_activity + dashboard CRM).",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/advisor_roles/": {
      "get": {
        "operationId": "api_advisor_roles_list",
        "description": "Catálogo de roles operativos (M1) para el selector de la UI de usuarios:\n[{value, label, groups}] — groups son los grupos Django que deriva el rol.",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/audit-logs/": {
      "get": {
        "operationId": "api_audit-logs_list",
        "description": "",
        "parameters": [
          {
            "name": "page",
            "in": "query",
            "description": "Un número de página dentro del conjunto de resultados paginado.",
            "required": false,
            "type": "integer"
          },
          {
            "name": "page_size",
            "in": "query",
            "description": "Número de resultados a devolver por página.",
            "required": false,
            "type": "integer"
          }
        ],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/audit-logs/{id}/": {
      "get": {
        "operationId": "api_audit-logs_read",
        "description": "Consulta de Bitácora de Auditoría e Inmutabilidad (Audit Trail Ledger).\nGET /api/audit-logs/",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "description": "Un valor de entero único que identifique este Evento de Auditoría.",
          "required": true,
          "type": "integer"
        }
      ]
    },
    "/api/auth/otp/request/": {
      "post": {
        "operationId": "api_auth_otp_request_create",
        "description": "Genera un código OTP de 6 dígitos para el email proveído,\nlo guarda en caché por 5 minutos y lo envía usando SMTP.",
        "parameters": [],
        "responses": {
          "201": {
            "description": ""
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/auth/otp/verify/": {
      "post": {
        "operationId": "api_auth_otp_verify_create",
        "description": "Valida el código OTP de 6 dígitos enviado por el usuario\ny retorna el par de tokens JWT.",
        "parameters": [],
        "responses": {
          "201": {
            "description": ""
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/aux-contracts/": {
      "get": {
        "operationId": "api_aux-contracts_list",
        "description": "",
        "parameters": [
          {
            "name": "page",
            "in": "query",
            "description": "Un número de página dentro del conjunto de resultados paginado.",
            "required": false,
            "type": "integer"
          },
          {
            "name": "page_size",
            "in": "query",
            "description": "Número de resultados a devolver por página.",
            "required": false,
            "type": "integer"
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "required": [
                "count",
                "results"
              ],
              "type": "object",
              "properties": {
                "count": {
                  "type": "integer"
                },
                "next": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "previous": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "results": {
                  "type": "array",
                  "items": {
                    "$ref": "#/definitions/Contract"
                  }
                }
              }
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "post": {
        "operationId": "api_aux-contracts_create",
        "description": "",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/Contract"
            }
          }
        ],
        "responses": {
          "201": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/Contract"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/aux-contracts/{no_contrato}/": {
      "get": {
        "operationId": "api_aux-contracts_read",
        "description": "",
        "parameters": [],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/Contract"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "put": {
        "operationId": "api_aux-contracts_update",
        "description": "",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/Contract"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/Contract"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "patch": {
        "operationId": "api_aux-contracts_partial_update",
        "description": "",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/Contract"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/Contract"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "delete": {
        "operationId": "api_aux-contracts_delete",
        "description": "",
        "parameters": [],
        "responses": {
          "204": {
            "description": ""
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": [
        {
          "name": "no_contrato",
          "in": "path",
          "description": "Identificador único del contrato",
          "required": true,
          "type": "string"
        }
      ]
    },
    "/api/bi/cartera-estados/": {
      "get": {
        "operationId": "api_bi_cartera-estados_list",
        "summary": "GET /api/bi/cartera-estados/",
        "description": "Retorna la distribución de cartera por estados.",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/bi/cashflow/": {
      "get": {
        "operationId": "api_bi_cashflow_list",
        "summary": "GET /api/bi/cashflow/",
        "description": "Retorna datos de flujo de caja para el gráfico.\n\nQuery params:\n    - group_by: 'month' (default), 'quarter', 'year'\n    - years: número de años hacia atrás (default: 1)",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/bi/investors/ranking/": {
      "get": {
        "operationId": "api_bi_investors_ranking_list",
        "summary": "GET /api/bi/investors/ranking/",
        "description": "Retorna el ranking de inversionistas por capital invertido.\n\nQuery params:\n    - limit: número máximo de inversionistas (default: 5, max: 20)",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/bi/summary/": {
      "get": {
        "operationId": "api_bi_summary_list",
        "summary": "GET /api/bi/summary/",
        "description": "Retorna los KPIs pre-calculados para las tarjetas del dashboard.",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/biometria/verificar_identidad/": {
      "post": {
        "operationId": "api_biometria_verificar_identidad_create",
        "description": "Firma Biométrica & Verificación de Identidad Facial (Liveness Detection).\nPOST /api/biometria/verificar_identidad/",
        "parameters": [],
        "responses": {
          "201": {
            "description": ""
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/blog/editorial/": {
      "get": {
        "operationId": "api_blog_editorial_list",
        "description": "Calendario editorial (M7). Lectura: cualquier usuario autenticado.",
        "parameters": [
          {
            "name": "page",
            "in": "query",
            "description": "Un número de página dentro del conjunto de resultados paginado.",
            "required": false,
            "type": "integer"
          },
          {
            "name": "page_size",
            "in": "query",
            "description": "Número de resultados a devolver por página.",
            "required": false,
            "type": "integer"
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "required": [
                "count",
                "results"
              ],
              "type": "object",
              "properties": {
                "count": {
                  "type": "integer"
                },
                "next": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "previous": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "results": {
                  "type": "array",
                  "items": {
                    "$ref": "#/definitions/EditorialEntry"
                  }
                }
              }
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "post": {
        "operationId": "api_blog_editorial_create",
        "description": "Calendario editorial (M7). Lectura: cualquier usuario autenticado.",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/EditorialEntry"
            }
          }
        ],
        "responses": {
          "201": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/EditorialEntry"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/blog/editorial/{id}/": {
      "get": {
        "operationId": "api_blog_editorial_read",
        "description": "Calendario editorial (M7). Lectura: cualquier usuario autenticado.",
        "parameters": [],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/EditorialEntry"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "put": {
        "operationId": "api_blog_editorial_update",
        "description": "Calendario editorial (M7). Lectura: cualquier usuario autenticado.",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/EditorialEntry"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/EditorialEntry"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "patch": {
        "operationId": "api_blog_editorial_partial_update",
        "description": "Calendario editorial (M7). Lectura: cualquier usuario autenticado.",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/EditorialEntry"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/EditorialEntry"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "delete": {
        "operationId": "api_blog_editorial_delete",
        "description": "Calendario editorial (M7). Lectura: cualquier usuario autenticado.",
        "parameters": [],
        "responses": {
          "204": {
            "description": ""
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "required": true,
          "type": "string"
        }
      ]
    },
    "/api/blog/episodes/": {
      "get": {
        "operationId": "api_blog_episodes_list",
        "description": "Podcast episodes API.\n- Public: list (only published)\n- Admin: full CRUD",
        "parameters": [
          {
            "name": "page",
            "in": "query",
            "description": "Un número de página dentro del conjunto de resultados paginado.",
            "required": false,
            "type": "integer"
          },
          {
            "name": "page_size",
            "in": "query",
            "description": "Número de resultados a devolver por página.",
            "required": false,
            "type": "integer"
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "required": [
                "count",
                "results"
              ],
              "type": "object",
              "properties": {
                "count": {
                  "type": "integer"
                },
                "next": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "previous": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "results": {
                  "type": "array",
                  "items": {
                    "$ref": "#/definitions/PodcastEpisodeList"
                  }
                }
              }
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "post": {
        "operationId": "api_blog_episodes_create",
        "description": "Podcast episodes API.\n- Public: list (only published)\n- Admin: full CRUD",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/PodcastEpisodeWrite"
            }
          }
        ],
        "responses": {
          "201": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/PodcastEpisodeWrite"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/blog/episodes/{id}/": {
      "get": {
        "operationId": "api_blog_episodes_read",
        "description": "Podcast episodes API.\n- Public: list (only published)\n- Admin: full CRUD",
        "parameters": [],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/PodcastEpisodeList"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "put": {
        "operationId": "api_blog_episodes_update",
        "description": "Podcast episodes API.\n- Public: list (only published)\n- Admin: full CRUD",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/PodcastEpisodeWrite"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/PodcastEpisodeWrite"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "patch": {
        "operationId": "api_blog_episodes_partial_update",
        "description": "Podcast episodes API.\n- Public: list (only published)\n- Admin: full CRUD",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/PodcastEpisodeWrite"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/PodcastEpisodeWrite"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "delete": {
        "operationId": "api_blog_episodes_delete",
        "description": "Podcast episodes API.\n- Public: list (only published)\n- Admin: full CRUD",
        "parameters": [],
        "responses": {
          "204": {
            "description": ""
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "required": true,
          "type": "string"
        }
      ]
    },
    "/api/blog/posts/": {
      "get": {
        "operationId": "api_blog_posts_list",
        "description": "Blog posts API.\n- Public: list/retrieve (only published)\n- Admin: full CRUD",
        "parameters": [
          {
            "name": "search",
            "in": "query",
            "description": "Un término de búsqueda.",
            "required": false,
            "type": "string"
          },
          {
            "name": "ordering",
            "in": "query",
            "description": "Qué campo usar para ordenar los resultados.",
            "required": false,
            "type": "string"
          },
          {
            "name": "page",
            "in": "query",
            "description": "Un número de página dentro del conjunto de resultados paginado.",
            "required": false,
            "type": "integer"
          },
          {
            "name": "page_size",
            "in": "query",
            "description": "Número de resultados a devolver por página.",
            "required": false,
            "type": "integer"
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "required": [
                "count",
                "results"
              ],
              "type": "object",
              "properties": {
                "count": {
                  "type": "integer"
                },
                "next": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "previous": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "results": {
                  "type": "array",
                  "items": {
                    "$ref": "#/definitions/BlogPostList"
                  }
                }
              }
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "post": {
        "operationId": "api_blog_posts_create",
        "description": "Blog posts API.\n- Public: list/retrieve (only published)\n- Admin: full CRUD",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/BlogPostWrite"
            }
          }
        ],
        "responses": {
          "201": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/BlogPostWrite"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/blog/posts/{slug}/": {
      "get": {
        "operationId": "api_blog_posts_read",
        "description": "Blog posts API.\n- Public: list/retrieve (only published)\n- Admin: full CRUD",
        "parameters": [],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/BlogPostDetail"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "put": {
        "operationId": "api_blog_posts_update",
        "description": "Blog posts API.\n- Public: list/retrieve (only published)\n- Admin: full CRUD",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/BlogPostWrite"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/BlogPostWrite"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "patch": {
        "operationId": "api_blog_posts_partial_update",
        "description": "Blog posts API.\n- Public: list/retrieve (only published)\n- Admin: full CRUD",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/BlogPostWrite"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/BlogPostWrite"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "delete": {
        "operationId": "api_blog_posts_delete",
        "description": "Blog posts API.\n- Public: list/retrieve (only published)\n- Admin: full CRUD",
        "parameters": [],
        "responses": {
          "204": {
            "description": ""
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": [
        {
          "name": "slug",
          "in": "path",
          "required": true,
          "type": "string"
        }
      ]
    },
    "/api/bot/consultar/": {
      "post": {
        "operationId": "api_bot_consultar_create",
        "description": "Asistente Conversacional Inteligente Autónomo para Auto-Servicio.\nPOST /api/bot/consultar/",
        "parameters": [],
        "responses": {
          "201": {
            "description": ""
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/business-lines/": {
      "get": {
        "operationId": "api_business-lines_list",
        "description": "CRUD de líneas de negocio (incluye servicios anidados).",
        "parameters": [
          {
            "name": "page",
            "in": "query",
            "description": "Un número de página dentro del conjunto de resultados paginado.",
            "required": false,
            "type": "integer"
          },
          {
            "name": "page_size",
            "in": "query",
            "description": "Número de resultados a devolver por página.",
            "required": false,
            "type": "integer"
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "required": [
                "count",
                "results"
              ],
              "type": "object",
              "properties": {
                "count": {
                  "type": "integer"
                },
                "next": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "previous": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "results": {
                  "type": "array",
                  "items": {
                    "$ref": "#/definitions/CoreBusinessLineSerializer"
                  }
                }
              }
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "post": {
        "operationId": "api_business-lines_create",
        "description": "CRUD de líneas de negocio (incluye servicios anidados).",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/CoreBusinessLineSerializer"
            }
          }
        ],
        "responses": {
          "201": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/CoreBusinessLineSerializer"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/business-lines/{code}/": {
      "get": {
        "operationId": "api_business-lines_read",
        "description": "CRUD de líneas de negocio (incluye servicios anidados).",
        "parameters": [],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/CoreBusinessLineSerializer"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "put": {
        "operationId": "api_business-lines_update",
        "description": "CRUD de líneas de negocio (incluye servicios anidados).",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/CoreBusinessLineSerializer"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/CoreBusinessLineSerializer"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "patch": {
        "operationId": "api_business-lines_partial_update",
        "description": "CRUD de líneas de negocio (incluye servicios anidados).",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/CoreBusinessLineSerializer"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/CoreBusinessLineSerializer"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "delete": {
        "operationId": "api_business-lines_delete",
        "description": "CRUD de líneas de negocio (incluye servicios anidados).",
        "parameters": [],
        "responses": {
          "204": {
            "description": ""
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": [
        {
          "name": "code",
          "in": "path",
          "description": "Un valor único que identifique este business line.",
          "required": true,
          "type": "string"
        }
      ]
    },
    "/api/cashflow-ai/proyeccion/": {
      "get": {
        "operationId": "api_cashflow-ai_proyeccion_list",
        "description": "Predicción de Flujo de Caja por Inteligencia Artificial (Cashflow AI Forecast).\nGET /api/cashflow-ai/proyeccion/?weeks=4",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/clients/": {
      "get": {
        "operationId": "api_clients_list",
        "summary": "CRUD de clientes con permisos basados en perfil.\nIncluye endpoints personalizados para portal de clientes.",
        "description": "Auditoría: toda creación, modificación (con diff de campos) y eliminación\nqueda registrada en core.SystemAuditEvent (API /api/audit-logs/).\nEliminar clientes es exclusivo de administradores (staff).",
        "parameters": [
          {
            "name": "page",
            "in": "query",
            "description": "Un número de página dentro del conjunto de resultados paginado.",
            "required": false,
            "type": "integer"
          },
          {
            "name": "page_size",
            "in": "query",
            "description": "Número de resultados a devolver por página.",
            "required": false,
            "type": "integer"
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "required": [
                "count",
                "results"
              ],
              "type": "object",
              "properties": {
                "count": {
                  "type": "integer"
                },
                "next": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "previous": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "results": {
                  "type": "array",
                  "items": {
                    "$ref": "#/definitions/ClientDetailSerializer"
                  }
                }
              }
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "post": {
        "operationId": "api_clients_create",
        "summary": "CRUD de clientes con permisos basados en perfil.\nIncluye endpoints personalizados para portal de clientes.",
        "description": "Auditoría: toda creación, modificación (con diff de campos) y eliminación\nqueda registrada en core.SystemAuditEvent (API /api/audit-logs/).\nEliminar clientes es exclusivo de administradores (staff).",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/ClientDetailSerializer"
            }
          }
        ],
        "responses": {
          "201": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/ClientDetailSerializer"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/clients/dashboard_stats/": {
      "get": {
        "operationId": "api_clients_dashboard_stats",
        "summary": "Retorna estadísticas del dashboard para el cliente autenticado.\nUsa Profile para identificar al cliente.",
        "description": "REGLA DE NEGOCIO - Honorarios:\n- Los honorarios (costo de abogados, basado en SMLV) SOLO se incluyen\n  en la deuda si el contrato está en mora (ATRASADO, VENCIDO, PROCESO JURIDICO).\n- Contratos AL DÍA o DESEMBOLSADO: deuda = valor_proyectado - honorarios",
        "parameters": [
          {
            "name": "page",
            "in": "query",
            "description": "Un número de página dentro del conjunto de resultados paginado.",
            "required": false,
            "type": "integer"
          },
          {
            "name": "page_size",
            "in": "query",
            "description": "Número de resultados a devolver por página.",
            "required": false,
            "type": "integer"
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "required": [
                "count",
                "results"
              ],
              "type": "object",
              "properties": {
                "count": {
                  "type": "integer"
                },
                "next": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "previous": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "results": {
                  "type": "array",
                  "items": {
                    "$ref": "#/definitions/ClientDetailSerializer"
                  }
                }
              }
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/clients/debt_evolution/": {
      "get": {
        "operationId": "api_clients_debt_evolution",
        "description": "Evolución de deuda últimos 12 meses\nPara gráfica de línea en dashboard de cliente",
        "parameters": [
          {
            "name": "page",
            "in": "query",
            "description": "Un número de página dentro del conjunto de resultados paginado.",
            "required": false,
            "type": "integer"
          },
          {
            "name": "page_size",
            "in": "query",
            "description": "Número de resultados a devolver por página.",
            "required": false,
            "type": "integer"
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "required": [
                "count",
                "results"
              ],
              "type": "object",
              "properties": {
                "count": {
                  "type": "integer"
                },
                "next": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "previous": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "results": {
                  "type": "array",
                  "items": {
                    "$ref": "#/definitions/ClientDetailSerializer"
                  }
                }
              }
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/clients/monthly_payments/": {
      "get": {
        "operationId": "api_clients_monthly_payments",
        "description": "Pagos mensuales últimos 12 meses\nPara gráfica de barras en dashboard de cliente",
        "parameters": [
          {
            "name": "page",
            "in": "query",
            "description": "Un número de página dentro del conjunto de resultados paginado.",
            "required": false,
            "type": "integer"
          },
          {
            "name": "page_size",
            "in": "query",
            "description": "Número de resultados a devolver por página.",
            "required": false,
            "type": "integer"
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "required": [
                "count",
                "results"
              ],
              "type": "object",
              "properties": {
                "count": {
                  "type": "integer"
                },
                "next": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "previous": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "results": {
                  "type": "array",
                  "items": {
                    "$ref": "#/definitions/ClientDetailSerializer"
                  }
                }
              }
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/clients/my_contracts/": {
      "get": {
        "operationId": "api_clients_my_contracts",
        "description": "Listado de contratos del cliente (como cliente principal o codeudor)",
        "parameters": [
          {
            "name": "page",
            "in": "query",
            "description": "Un número de página dentro del conjunto de resultados paginado.",
            "required": false,
            "type": "integer"
          },
          {
            "name": "page_size",
            "in": "query",
            "description": "Número de resultados a devolver por página.",
            "required": false,
            "type": "integer"
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "required": [
                "count",
                "results"
              ],
              "type": "object",
              "properties": {
                "count": {
                  "type": "integer"
                },
                "next": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "previous": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "results": {
                  "type": "array",
                  "items": {
                    "$ref": "#/definitions/ClientDetailSerializer"
                  }
                }
              }
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/clients/my_transactions/": {
      "get": {
        "operationId": "api_clients_my_transactions",
        "description": "Historial de transacciones del cliente.\nIncluye transacciones directas del cliente Y transacciones de sus contratos.",
        "parameters": [
          {
            "name": "page",
            "in": "query",
            "description": "Un número de página dentro del conjunto de resultados paginado.",
            "required": false,
            "type": "integer"
          },
          {
            "name": "page_size",
            "in": "query",
            "description": "Número de resultados a devolver por página.",
            "required": false,
            "type": "integer"
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "required": [
                "count",
                "results"
              ],
              "type": "object",
              "properties": {
                "count": {
                  "type": "integer"
                },
                "next": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "previous": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "results": {
                  "type": "array",
                  "items": {
                    "$ref": "#/definitions/ClientDetailSerializer"
                  }
                }
              }
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/clients/profile/": {
      "get": {
        "operationId": "api_clients_profile_read",
        "description": "",
        "parameters": [
          {
            "name": "page",
            "in": "query",
            "description": "Un número de página dentro del conjunto de resultados paginado.",
            "required": false,
            "type": "integer"
          },
          {
            "name": "page_size",
            "in": "query",
            "description": "Número de resultados a devolver por página.",
            "required": false,
            "type": "integer"
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "required": [
                "count",
                "results"
              ],
              "type": "object",
              "properties": {
                "count": {
                  "type": "integer"
                },
                "next": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "previous": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "results": {
                  "type": "array",
                  "items": {
                    "$ref": "#/definitions/ClientDetailSerializer"
                  }
                }
              }
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "patch": {
        "operationId": "api_clients_profile_partial_update",
        "description": "",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/ClientDetailSerializer"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/ClientDetailSerializer"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/clients/{identificacion}/": {
      "get": {
        "operationId": "api_clients_read",
        "summary": "CRUD de clientes con permisos basados en perfil.\nIncluye endpoints personalizados para portal de clientes.",
        "description": "Auditoría: toda creación, modificación (con diff de campos) y eliminación\nqueda registrada en core.SystemAuditEvent (API /api/audit-logs/).\nEliminar clientes es exclusivo de administradores (staff).",
        "parameters": [],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/ClientDetailSerializer"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "put": {
        "operationId": "api_clients_update",
        "summary": "CRUD de clientes con permisos basados en perfil.\nIncluye endpoints personalizados para portal de clientes.",
        "description": "Auditoría: toda creación, modificación (con diff de campos) y eliminación\nqueda registrada en core.SystemAuditEvent (API /api/audit-logs/).\nEliminar clientes es exclusivo de administradores (staff).",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/ClientDetailSerializer"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/ClientDetailSerializer"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "patch": {
        "operationId": "api_clients_partial_update",
        "summary": "CRUD de clientes con permisos basados en perfil.\nIncluye endpoints personalizados para portal de clientes.",
        "description": "Auditoría: toda creación, modificación (con diff de campos) y eliminación\nqueda registrada en core.SystemAuditEvent (API /api/audit-logs/).\nEliminar clientes es exclusivo de administradores (staff).",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/ClientDetailSerializer"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/ClientDetailSerializer"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "delete": {
        "operationId": "api_clients_delete",
        "summary": "CRUD de clientes con permisos basados en perfil.\nIncluye endpoints personalizados para portal de clientes.",
        "description": "Auditoría: toda creación, modificación (con diff de campos) y eliminación\nqueda registrada en core.SystemAuditEvent (API /api/audit-logs/).\nEliminar clientes es exclusivo de administradores (staff).",
        "parameters": [],
        "responses": {
          "204": {
            "description": ""
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": [
        {
          "name": "identificacion",
          "in": "path",
          "description": "Un valor único que identifique este client.",
          "required": true,
          "type": "string"
        }
      ]
    },
    "/api/clients/{identificacion}/paz_y_salvo/": {
      "get": {
        "operationId": "api_clients_paz_y_salvo",
        "description": "Genera el Certificado de Paz y Salvo Oficial con QR de Verificación.\nGET /api/clients/{id}/paz_y_salvo/",
        "parameters": [],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/ClientDetailSerializer"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": [
        {
          "name": "identificacion",
          "in": "path",
          "description": "Un valor único que identifique este client.",
          "required": true,
          "type": "string"
        }
      ]
    },
    "/api/clients_list/": {
      "get": {
        "operationId": "api_clients_list_list",
        "description": "Vista ligera de clientes para listados.\nFiltrada según tipo de usuario:\n- Admin: ve todos los clientes\n- Cliente: ve solo su propio perfil\n- Inversionista: ve solo clientes de sus contratos",
        "parameters": [
          {
            "name": "page",
            "in": "query",
            "description": "Un número de página dentro del conjunto de resultados paginado.",
            "required": false,
            "type": "integer"
          },
          {
            "name": "page_size",
            "in": "query",
            "description": "Número de resultados a devolver por página.",
            "required": false,
            "type": "integer"
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "required": [
                "count",
                "results"
              ],
              "type": "object",
              "properties": {
                "count": {
                  "type": "integer"
                },
                "next": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "previous": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "results": {
                  "type": "array",
                  "items": {
                    "$ref": "#/definitions/ClientListSerializer"
                  }
                }
              }
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "post": {
        "operationId": "api_clients_list_create",
        "description": "Vista ligera de clientes para listados.\nFiltrada según tipo de usuario:\n- Admin: ve todos los clientes\n- Cliente: ve solo su propio perfil\n- Inversionista: ve solo clientes de sus contratos",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/ClientListSerializer"
            }
          }
        ],
        "responses": {
          "201": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/ClientListSerializer"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/clients_list/{identificacion}/": {
      "get": {
        "operationId": "api_clients_list_read",
        "description": "Vista ligera de clientes para listados.\nFiltrada según tipo de usuario:\n- Admin: ve todos los clientes\n- Cliente: ve solo su propio perfil\n- Inversionista: ve solo clientes de sus contratos",
        "parameters": [],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/ClientListSerializer"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "put": {
        "operationId": "api_clients_list_update",
        "description": "Vista ligera de clientes para listados.\nFiltrada según tipo de usuario:\n- Admin: ve todos los clientes\n- Cliente: ve solo su propio perfil\n- Inversionista: ve solo clientes de sus contratos",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/ClientListSerializer"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/ClientListSerializer"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "patch": {
        "operationId": "api_clients_list_partial_update",
        "description": "Vista ligera de clientes para listados.\nFiltrada según tipo de usuario:\n- Admin: ve todos los clientes\n- Cliente: ve solo su propio perfil\n- Inversionista: ve solo clientes de sus contratos",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/ClientListSerializer"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/ClientListSerializer"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "delete": {
        "operationId": "api_clients_list_delete",
        "description": "Vista ligera de clientes para listados.\nFiltrada según tipo de usuario:\n- Admin: ve todos los clientes\n- Cliente: ve solo su propio perfil\n- Inversionista: ve solo clientes de sus contratos",
        "parameters": [],
        "responses": {
          "204": {
            "description": ""
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": [
        {
          "name": "identificacion",
          "in": "path",
          "required": true,
          "type": "string"
        }
      ]
    },
    "/api/collection-actions/": {
      "get": {
        "operationId": "api_collection-actions_list",
        "description": "ViewSet para acciones de cobro.\nPermite registrar y consultar gestiones de cobro por contrato.",
        "parameters": [
          {
            "name": "page",
            "in": "query",
            "description": "Un número de página dentro del conjunto de resultados paginado.",
            "required": false,
            "type": "integer"
          },
          {
            "name": "page_size",
            "in": "query",
            "description": "Número de resultados a devolver por página.",
            "required": false,
            "type": "integer"
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "required": [
                "count",
                "results"
              ],
              "type": "object",
              "properties": {
                "count": {
                  "type": "integer"
                },
                "next": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "previous": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "results": {
                  "type": "array",
                  "items": {
                    "$ref": "#/definitions/CollectionAction"
                  }
                }
              }
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "post": {
        "operationId": "api_collection-actions_create",
        "description": "ViewSet para acciones de cobro.\nPermite registrar y consultar gestiones de cobro por contrato.",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/CollectionAction"
            }
          }
        ],
        "responses": {
          "201": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/CollectionAction"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/collection-actions/by_contract/": {
      "get": {
        "operationId": "api_collection-actions_by_contract",
        "description": "Historial de gestiones de un contrato específico.\nGET /api/collection-actions/by_contract/?contract=1234",
        "parameters": [
          {
            "name": "page",
            "in": "query",
            "description": "Un número de página dentro del conjunto de resultados paginado.",
            "required": false,
            "type": "integer"
          },
          {
            "name": "page_size",
            "in": "query",
            "description": "Número de resultados a devolver por página.",
            "required": false,
            "type": "integer"
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "required": [
                "count",
                "results"
              ],
              "type": "object",
              "properties": {
                "count": {
                  "type": "integer"
                },
                "next": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "previous": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "results": {
                  "type": "array",
                  "items": {
                    "$ref": "#/definitions/CollectionAction"
                  }
                }
              }
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/collection-actions/pending_promises/": {
      "get": {
        "operationId": "api_collection-actions_pending_promises",
        "description": "Promesas de pago pendientes (fecha >= hoy).\nGET /api/collection-actions/pending_promises/",
        "parameters": [
          {
            "name": "page",
            "in": "query",
            "description": "Un número de página dentro del conjunto de resultados paginado.",
            "required": false,
            "type": "integer"
          },
          {
            "name": "page_size",
            "in": "query",
            "description": "Número de resultados a devolver por página.",
            "required": false,
            "type": "integer"
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "required": [
                "count",
                "results"
              ],
              "type": "object",
              "properties": {
                "count": {
                  "type": "integer"
                },
                "next": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "previous": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "results": {
                  "type": "array",
                  "items": {
                    "$ref": "#/definitions/CollectionAction"
                  }
                }
              }
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/collection-actions/{id}/": {
      "get": {
        "operationId": "api_collection-actions_read",
        "description": "ViewSet para acciones de cobro.\nPermite registrar y consultar gestiones de cobro por contrato.",
        "parameters": [],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/CollectionAction"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "put": {
        "operationId": "api_collection-actions_update",
        "description": "ViewSet para acciones de cobro.\nPermite registrar y consultar gestiones de cobro por contrato.",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/CollectionAction"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/CollectionAction"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "patch": {
        "operationId": "api_collection-actions_partial_update",
        "description": "ViewSet para acciones de cobro.\nPermite registrar y consultar gestiones de cobro por contrato.",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/CollectionAction"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/CollectionAction"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "delete": {
        "operationId": "api_collection-actions_delete",
        "description": "ViewSet para acciones de cobro.\nPermite registrar y consultar gestiones de cobro por contrato.",
        "parameters": [],
        "responses": {
          "204": {
            "description": ""
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "description": "Un valor de entero único que identifique este Acción de Cobro.",
          "required": true,
          "type": "integer"
        }
      ]
    },
    "/api/contact-messages/": {
      "get": {
        "operationId": "api_contact-messages_list",
        "description": "",
        "parameters": [
          {
            "name": "search",
            "in": "query",
            "description": "Un término de búsqueda.",
            "required": false,
            "type": "string"
          },
          {
            "name": "ordering",
            "in": "query",
            "description": "Qué campo usar para ordenar los resultados.",
            "required": false,
            "type": "string"
          },
          {
            "name": "page",
            "in": "query",
            "description": "Un número de página dentro del conjunto de resultados paginado.",
            "required": false,
            "type": "integer"
          },
          {
            "name": "page_size",
            "in": "query",
            "description": "Número de resultados a devolver por página.",
            "required": false,
            "type": "integer"
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "required": [
                "count",
                "results"
              ],
              "type": "object",
              "properties": {
                "count": {
                  "type": "integer"
                },
                "next": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "previous": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "results": {
                  "type": "array",
                  "items": {
                    "$ref": "#/definitions/ContactMessage"
                  }
                }
              }
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "post": {
        "operationId": "api_contact-messages_create",
        "description": "",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/ContactMessage"
            }
          }
        ],
        "responses": {
          "201": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/ContactMessage"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/contact-messages/{id}/": {
      "get": {
        "operationId": "api_contact-messages_read",
        "description": "",
        "parameters": [],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/ContactMessage"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "put": {
        "operationId": "api_contact-messages_update",
        "description": "",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/ContactMessage"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/ContactMessage"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "patch": {
        "operationId": "api_contact-messages_partial_update",
        "description": "",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/ContactMessage"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/ContactMessage"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "delete": {
        "operationId": "api_contact-messages_delete",
        "description": "",
        "parameters": [],
        "responses": {
          "204": {
            "description": ""
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "description": "Un valor de entero único que identifique este Mensaje de Contacto (Deprecado).",
          "required": true,
          "type": "integer"
        }
      ]
    },
    "/api/contact-messages/{id}/create_request/": {
      "post": {
        "operationId": "api_contact-messages_create_request",
        "description": "Convierte el mensaje en una ServiceRequest",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/ContactMessage"
            }
          }
        ],
        "responses": {
          "201": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/ContactMessage"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "description": "Un valor de entero único que identifique este Mensaje de Contacto (Deprecado).",
          "required": true,
          "type": "integer"
        }
      ]
    },
    "/api/contact/": {
      "post": {
        "operationId": "api_contact_create",
        "description": "",
        "parameters": [],
        "responses": {
          "201": {
            "description": ""
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/contact_messages/": {
      "get": {
        "operationId": "api_contact_messages_list",
        "description": "",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/contract-state-history/": {
      "get": {
        "operationId": "api_contract-state-history_list",
        "description": "ViewSet de solo lectura para historial de estados.\nLos cambios de estado se hacen a través del servicio de Portfolio.",
        "parameters": [
          {
            "name": "page",
            "in": "query",
            "description": "Un número de página dentro del conjunto de resultados paginado.",
            "required": false,
            "type": "integer"
          },
          {
            "name": "page_size",
            "in": "query",
            "description": "Número de resultados a devolver por página.",
            "required": false,
            "type": "integer"
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "required": [
                "count",
                "results"
              ],
              "type": "object",
              "properties": {
                "count": {
                  "type": "integer"
                },
                "next": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "previous": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "results": {
                  "type": "array",
                  "items": {
                    "$ref": "#/definitions/ContractStateHistory"
                  }
                }
              }
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/contract-state-history/{id}/": {
      "get": {
        "operationId": "api_contract-state-history_read",
        "description": "ViewSet de solo lectura para historial de estados.\nLos cambios de estado se hacen a través del servicio de Portfolio.",
        "parameters": [],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/ContractStateHistory"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "description": "Un valor de entero único que identifique este Historial de Estado.",
          "required": true,
          "type": "integer"
        }
      ]
    },
    "/api/contract-statuses/": {
      "get": {
        "operationId": "api_contract-statuses_list",
        "description": "",
        "parameters": [
          {
            "name": "page",
            "in": "query",
            "description": "Un número de página dentro del conjunto de resultados paginado.",
            "required": false,
            "type": "integer"
          },
          {
            "name": "page_size",
            "in": "query",
            "description": "Número de resultados a devolver por página.",
            "required": false,
            "type": "integer"
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "required": [
                "count",
                "results"
              ],
              "type": "object",
              "properties": {
                "count": {
                  "type": "integer"
                },
                "next": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "previous": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "results": {
                  "type": "array",
                  "items": {
                    "$ref": "#/definitions/ContractStatus"
                  }
                }
              }
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "post": {
        "operationId": "api_contract-statuses_create",
        "description": "",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/ContractStatus"
            }
          }
        ],
        "responses": {
          "201": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/ContractStatus"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/contract-statuses/{code}/": {
      "get": {
        "operationId": "api_contract-statuses_read",
        "description": "",
        "parameters": [],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/ContractStatus"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "put": {
        "operationId": "api_contract-statuses_update",
        "description": "",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/ContractStatus"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/ContractStatus"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "patch": {
        "operationId": "api_contract-statuses_partial_update",
        "description": "",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/ContractStatus"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/ContractStatus"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "delete": {
        "operationId": "api_contract-statuses_delete",
        "description": "",
        "parameters": [],
        "responses": {
          "204": {
            "description": ""
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": [
        {
          "name": "code",
          "in": "path",
          "description": "Un valor único que identifique este contract status.",
          "required": true,
          "type": "integer"
        }
      ]
    },
    "/api/contracts-inmobiliario/": {
      "get": {
        "operationId": "api_contracts-inmobiliario_list",
        "description": "",
        "parameters": [
          {
            "name": "page",
            "in": "query",
            "description": "Un número de página dentro del conjunto de resultados paginado.",
            "required": false,
            "type": "integer"
          },
          {
            "name": "page_size",
            "in": "query",
            "description": "Número de resultados a devolver por página.",
            "required": false,
            "type": "integer"
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "required": [
                "count",
                "results"
              ],
              "type": "object",
              "properties": {
                "count": {
                  "type": "integer"
                },
                "next": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "previous": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "results": {
                  "type": "array",
                  "items": {
                    "$ref": "#/definitions/ContractInmobiliario"
                  }
                }
              }
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "post": {
        "operationId": "api_contracts-inmobiliario_create",
        "description": "",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/ContractInmobiliario"
            }
          }
        ],
        "responses": {
          "201": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/ContractInmobiliario"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/contracts-inmobiliario/{contract}/": {
      "get": {
        "operationId": "api_contracts-inmobiliario_read",
        "description": "",
        "parameters": [],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/ContractInmobiliario"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "put": {
        "operationId": "api_contracts-inmobiliario_update",
        "description": "",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/ContractInmobiliario"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/ContractInmobiliario"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "patch": {
        "operationId": "api_contracts-inmobiliario_partial_update",
        "description": "",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/ContractInmobiliario"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/ContractInmobiliario"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "delete": {
        "operationId": "api_contracts-inmobiliario_delete",
        "description": "",
        "parameters": [],
        "responses": {
          "204": {
            "description": ""
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": [
        {
          "name": "contract",
          "in": "path",
          "description": "Un valor único que identifique este contract inmobiliario.",
          "required": true,
          "type": "string"
        }
      ]
    },
    "/api/contracts/": {
      "get": {
        "operationId": "api_contracts_list",
        "description": "- list: serializer â€œligeroâ€\n- retrieve: serializer â€œcompletoâ€ con obligaciones, carteras, transacciones, cliente e inversionista",
        "parameters": [
          {
            "name": "page",
            "in": "query",
            "description": "Un número de página dentro del conjunto de resultados paginado.",
            "required": false,
            "type": "integer"
          },
          {
            "name": "page_size",
            "in": "query",
            "description": "Número de resultados a devolver por página.",
            "required": false,
            "type": "integer"
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "required": [
                "count",
                "results"
              ],
              "type": "object",
              "properties": {
                "count": {
                  "type": "integer"
                },
                "next": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "previous": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "results": {
                  "type": "array",
                  "items": {
                    "$ref": "#/definitions/ContractList"
                  }
                }
              }
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "post": {
        "operationId": "api_contracts_create",
        "description": "- list: serializer â€œligeroâ€\n- retrieve: serializer â€œcompletoâ€ con obligaciones, carteras, transacciones, cliente e inversionista",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/Contract"
            }
          }
        ],
        "responses": {
          "201": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/Contract"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/contracts/bulk_add_to_portfolio/": {
      "post": {
        "operationId": "api_contracts_bulk_add_to_portfolio",
        "summary": "Agrega múltiples contratos a gestión de cartera.",
        "description": "POST /api/contracts/bulk_add_to_portfolio/",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/Contract"
            }
          }
        ],
        "responses": {
          "201": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/Contract"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/contracts/bulk_assign_to_legal/": {
      "post": {
        "operationId": "api_contracts_bulk_assign_to_legal",
        "summary": "Asigna múltiples contratos a una Firma Jurídica.\nCrea el caso jurídico y actualiza el estado del contrato.",
        "description": "POST /api/contracts/bulk_assign_to_legal/",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/Contract"
            }
          }
        ],
        "responses": {
          "201": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/Contract"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/contracts/{id}/print-url/": {
      "get": {
        "operationId": "api_contracts_print-url_list",
        "description": "Devuelve la URL firmada de impresión del contrato (cliente o inversionista).",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "required": true,
          "type": "string"
        }
      ]
    },
    "/api/contracts/{no_contrato}/": {
      "get": {
        "operationId": "api_contracts_read",
        "description": "- list: serializer â€œligeroâ€\n- retrieve: serializer â€œcompletoâ€ con obligaciones, carteras, transacciones, cliente e inversionista",
        "parameters": [],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/DetailedContract"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "put": {
        "operationId": "api_contracts_update",
        "description": "- list: serializer â€œligeroâ€\n- retrieve: serializer â€œcompletoâ€ con obligaciones, carteras, transacciones, cliente e inversionista",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/Contract"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/Contract"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "patch": {
        "operationId": "api_contracts_partial_update",
        "description": "- list: serializer â€œligeroâ€\n- retrieve: serializer â€œcompletoâ€ con obligaciones, carteras, transacciones, cliente e inversionista",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/Contract"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/Contract"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "delete": {
        "operationId": "api_contracts_delete",
        "description": "- list: serializer â€œligeroâ€\n- retrieve: serializer â€œcompletoâ€ con obligaciones, carteras, transacciones, cliente e inversionista",
        "parameters": [],
        "responses": {
          "204": {
            "description": ""
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": [
        {
          "name": "no_contrato",
          "in": "path",
          "description": "Identificador único del contrato",
          "required": true,
          "type": "string"
        }
      ]
    },
    "/api/contracts/{no_contrato}/add_to_portfolio/": {
      "post": {
        "operationId": "api_contracts_add_to_portfolio",
        "summary": "Agrega un contrato a gestión de cartera.\nCrea o actualiza el portfolio con métricas calculadas.",
        "description": "POST /api/contracts/{no_contrato}/add_to_portfolio/",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/Contract"
            }
          }
        ],
        "responses": {
          "201": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/Contract"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": [
        {
          "name": "no_contrato",
          "in": "path",
          "description": "Identificador único del contrato",
          "required": true,
          "type": "string"
        }
      ]
    },
    "/api/contracts/{no_contrato}/calcular_abono/": {
      "post": {
        "operationId": "api_contracts_calcular_abono",
        "description": "Calcula la distribución sugerida de un abono entre capital e intereses.\nUsa AmortizationService para determinar la distribución óptima:\nprimero intereses pendientes, luego capital.\n\nPOST /api/contracts/{no_contrato}/calcular_abono/",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/Contract"
            }
          }
        ],
        "responses": {
          "201": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/Contract"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": [
        {
          "name": "no_contrato",
          "in": "path",
          "description": "Identificador único del contrato",
          "required": true,
          "type": "string"
        }
      ]
    },
    "/api/contracts/{no_contrato}/calcular_descuento/": {
      "get": {
        "operationId": "api_contracts_calcular_descuento",
        "description": "Calcula la sugerencia de descuento para un contrato según la matriz de escalas (DiscountScale)\nbasado en la deuda acumulada y los días de mora real.",
        "parameters": [],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/Contract"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": [
        {
          "name": "no_contrato",
          "in": "path",
          "description": "Identificador único del contrato",
          "required": true,
          "type": "string"
        }
      ]
    },
    "/api/contracts/{no_contrato}/confirmar_desembolso/": {
      "post": {
        "operationId": "api_contracts_confirmar_desembolso",
        "summary": "Verifica código y ejecuta desembolso.",
        "description": "POST /api/contracts/{no_contrato}/confirmar_desembolso/",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/Contract"
            }
          }
        ],
        "responses": {
          "201": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/Contract"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": [
        {
          "name": "no_contrato",
          "in": "path",
          "description": "Identificador único del contrato",
          "required": true,
          "type": "string"
        }
      ]
    },
    "/api/contracts/{no_contrato}/create_auxiliary/": {
      "post": {
        "operationId": "api_contracts_create_auxiliary",
        "summary": "Crea un contrato auxiliar (de inversionista) vinculado al contrato principal.",
        "description": "Validación: Verifica que el inversionista tenga capital disponible suficiente.",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/Contract"
            }
          }
        ],
        "responses": {
          "201": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/Contract"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": [
        {
          "name": "no_contrato",
          "in": "path",
          "description": "Identificador único del contrato",
          "required": true,
          "type": "string"
        }
      ]
    },
    "/api/contracts/{no_contrato}/debt_summary/": {
      "get": {
        "operationId": "api_contracts_debt_summary",
        "summary": "Resumen de deuda del contrato para sugerir cuotas y validar pagos.",
        "description": "GET /api/contracts/{no_contrato}/debt_summary/",
        "parameters": [],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/Contract"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": [
        {
          "name": "no_contrato",
          "in": "path",
          "description": "Identificador único del contrato",
          "required": true,
          "type": "string"
        }
      ]
    },
    "/api/contracts/{no_contrato}/desembolsar/": {
      "post": {
        "operationId": "api_contracts_desembolsar",
        "description": "[LEGACY] Registra el desembolso de un contrato.\nCrea automáticamente las transacciones necesarias:\n- Crédito al cliente (recibe dinero)\n- Crédito a cada inversionista (sale de su disponible)\n\nPOST /api/contracts/{no_contrato}/desembolsar/",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/Contract"
            }
          }
        ],
        "responses": {
          "201": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/Contract"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": [
        {
          "name": "no_contrato",
          "in": "path",
          "description": "Identificador único del contrato",
          "required": true,
          "type": "string"
        }
      ]
    },
    "/api/contracts/{no_contrato}/estado_verificacion_desembolso/": {
      "get": {
        "operationId": "api_contracts_estado_verificacion_desembolso",
        "description": "Retorna información del código activo si existe.\nGET /api/contracts/{no_contrato}/estado_verificacion_desembolso/",
        "parameters": [],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/Contract"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": [
        {
          "name": "no_contrato",
          "in": "path",
          "description": "Identificador único del contrato",
          "required": true,
          "type": "string"
        }
      ]
    },
    "/api/contracts/{no_contrato}/generar_pagare_pdf/": {
      "get": {
        "operationId": "api_contracts_generar_pagare_pdf",
        "description": "Genera los datos y estructura del Pagaré en Blanco con Carta de Instrucciones.\nGET /api/contracts/{id}/generar_pagare_pdf/",
        "parameters": [],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/Contract"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": [
        {
          "name": "no_contrato",
          "in": "path",
          "description": "Identificador único del contrato",
          "required": true,
          "type": "string"
        }
      ]
    },
    "/api/contracts/{no_contrato}/generar_paz_salvo/": {
      "post": {
        "operationId": "api_contracts_generar_paz_salvo",
        "summary": "Genera un certificado de paz y salvo para un contrato FINALIZADO.\nOpcionalmente envía el certificado por email.",
        "description": "POST /api/contracts/{no_contrato}/generar_paz_salvo/",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/Contract"
            }
          }
        ],
        "responses": {
          "201": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/Contract"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": [
        {
          "name": "no_contrato",
          "in": "path",
          "description": "Identificador único del contrato",
          "required": true,
          "type": "string"
        }
      ]
    },
    "/api/contracts/{no_contrato}/recalculate_portfolio/": {
      "post": {
        "operationId": "api_contracts_recalculate_portfolio",
        "summary": "Recalcula las métricas del portfolio de un contrato.",
        "description": "POST /api/contracts/{no_contrato}/recalculate_portfolio/",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/Contract"
            }
          }
        ],
        "responses": {
          "201": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/Contract"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": [
        {
          "name": "no_contrato",
          "in": "path",
          "description": "Identificador único del contrato",
          "required": true,
          "type": "string"
        }
      ]
    },
    "/api/contracts/{no_contrato}/registrar_abono/": {
      "post": {
        "operationId": "api_contracts_registrar_abono",
        "description": "Registra un abono de un cliente a un contrato.\nCrea automáticamente las causaciones:\n- Débito al cliente (capital e intereses)\n- Débito a inversionistas (retorno de capital e intereses según TRI)\n- Débito a empresa (ganancia por diferencia de intereses)\n\nPOST /api/contracts/{no_contrato}/registrar_abono/",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/Contract"
            }
          }
        ],
        "responses": {
          "201": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/Contract"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": [
        {
          "name": "no_contrato",
          "in": "path",
          "description": "Identificador único del contrato",
          "required": true,
          "type": "string"
        }
      ]
    },
    "/api/contracts/{no_contrato}/solicitar_desembolso/": {
      "post": {
        "operationId": "api_contracts_solicitar_desembolso",
        "summary": "Genera y envía código de verificación para desembolso.\nEl código se envía al email del cliente.",
        "description": "POST /api/contracts/{no_contrato}/solicitar_desembolso/",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/Contract"
            }
          }
        ],
        "responses": {
          "201": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/Contract"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": [
        {
          "name": "no_contrato",
          "in": "path",
          "description": "Identificador único del contrato",
          "required": true,
          "type": "string"
        }
      ]
    },
    "/api/contrato-intermediacion/{id}/data/": {
      "get": {
        "operationId": "api_contrato-intermediacion_data_list",
        "description": "Devuelve en formato JSON la información del contrato.",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "required": true,
          "type": "string"
        }
      ]
    },
    "/api/cooperativa/agreements/": {
      "get": {
        "operationId": "api_cooperativa_agreements_list",
        "description": "",
        "parameters": [
          {
            "name": "page",
            "in": "query",
            "description": "Un número de página dentro del conjunto de resultados paginado.",
            "required": false,
            "type": "integer"
          },
          {
            "name": "page_size",
            "in": "query",
            "description": "Número de resultados a devolver por página.",
            "required": false,
            "type": "integer"
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "required": [
                "count",
                "results"
              ],
              "type": "object",
              "properties": {
                "count": {
                  "type": "integer"
                },
                "next": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "previous": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "results": {
                  "type": "array",
                  "items": {
                    "$ref": "#/definitions/CooperativeAgreement"
                  }
                }
              }
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "post": {
        "operationId": "api_cooperativa_agreements_create",
        "description": "",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/CooperativeAgreement"
            }
          }
        ],
        "responses": {
          "201": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/CooperativeAgreement"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/cooperativa/agreements/{id}/": {
      "get": {
        "operationId": "api_cooperativa_agreements_read",
        "description": "",
        "parameters": [],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/CooperativeAgreement"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "put": {
        "operationId": "api_cooperativa_agreements_update",
        "description": "",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/CooperativeAgreement"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/CooperativeAgreement"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "patch": {
        "operationId": "api_cooperativa_agreements_partial_update",
        "description": "",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/CooperativeAgreement"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/CooperativeAgreement"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "delete": {
        "operationId": "api_cooperativa_agreements_delete",
        "description": "",
        "parameters": [],
        "responses": {
          "204": {
            "description": ""
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "description": "Un valor de entero único que identifique este Convenio.",
          "required": true,
          "type": "integer"
        }
      ]
    },
    "/api/cooperativa/check-migratable/{contract_no}/": {
      "get": {
        "operationId": "api_cooperativa_check-migratable_read",
        "summary": "Verifica si un contrato específico es elegible para migración.",
        "description": "GET /api/cooperativa/check-migratable/{contract_no}/",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": [
        {
          "name": "contract_no",
          "in": "path",
          "required": true,
          "type": "string"
        }
      ]
    },
    "/api/cooperativa/companies/": {
      "get": {
        "operationId": "api_cooperativa_companies_list",
        "description": "ViewSet para empresas con convenio.",
        "parameters": [
          {
            "name": "page",
            "in": "query",
            "description": "Un número de página dentro del conjunto de resultados paginado.",
            "required": false,
            "type": "integer"
          },
          {
            "name": "page_size",
            "in": "query",
            "description": "Número de resultados a devolver por página.",
            "required": false,
            "type": "integer"
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "required": [
                "count",
                "results"
              ],
              "type": "object",
              "properties": {
                "count": {
                  "type": "integer"
                },
                "next": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "previous": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "results": {
                  "type": "array",
                  "items": {
                    "$ref": "#/definitions/Company"
                  }
                }
              }
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "post": {
        "operationId": "api_cooperativa_companies_create",
        "description": "ViewSet para empresas con convenio.",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/Company"
            }
          }
        ],
        "responses": {
          "201": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/Company"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/cooperativa/companies/{id}/": {
      "get": {
        "operationId": "api_cooperativa_companies_read",
        "description": "ViewSet para empresas con convenio.",
        "parameters": [],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/Company"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "put": {
        "operationId": "api_cooperativa_companies_update",
        "description": "ViewSet para empresas con convenio.",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/Company"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/Company"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "patch": {
        "operationId": "api_cooperativa_companies_partial_update",
        "description": "ViewSet para empresas con convenio.",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/Company"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/Company"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "delete": {
        "operationId": "api_cooperativa_companies_delete",
        "description": "ViewSet para empresas con convenio.",
        "parameters": [],
        "responses": {
          "204": {
            "description": ""
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "description": "Un valor de entero único que identifique este Empresa.",
          "required": true,
          "type": "integer"
        }
      ]
    },
    "/api/cooperativa/companies/{id}/agreements/": {
      "get": {
        "operationId": "api_cooperativa_companies_agreements",
        "description": "Lista convenios de la empresa",
        "parameters": [],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/Company"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "description": "Un valor de entero único que identifique este Empresa.",
          "required": true,
          "type": "integer"
        }
      ]
    },
    "/api/cooperativa/companies/{id}/employees/": {
      "get": {
        "operationId": "api_cooperativa_companies_employees",
        "description": "Lista empleados de la empresa",
        "parameters": [],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/Company"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "description": "Un valor de entero único que identifique este Empresa.",
          "required": true,
          "type": "integer"
        }
      ]
    },
    "/api/cooperativa/contracts/": {
      "get": {
        "operationId": "api_cooperativa_contracts_list",
        "description": "",
        "parameters": [
          {
            "name": "page",
            "in": "query",
            "description": "Un número de página dentro del conjunto de resultados paginado.",
            "required": false,
            "type": "integer"
          },
          {
            "name": "page_size",
            "in": "query",
            "description": "Número de resultados a devolver por página.",
            "required": false,
            "type": "integer"
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "required": [
                "count",
                "results"
              ],
              "type": "object",
              "properties": {
                "count": {
                  "type": "integer"
                },
                "next": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "previous": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "results": {
                  "type": "array",
                  "items": {
                    "$ref": "#/definitions/ContractCooperativa"
                  }
                }
              }
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "post": {
        "operationId": "api_cooperativa_contracts_create",
        "description": "",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/ContractCooperativa"
            }
          }
        ],
        "responses": {
          "201": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/ContractCooperativa"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/cooperativa/contracts/{contract}/": {
      "get": {
        "operationId": "api_cooperativa_contracts_read",
        "description": "",
        "parameters": [],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/ContractCooperativa"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "put": {
        "operationId": "api_cooperativa_contracts_update",
        "description": "",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/ContractCooperativa"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/ContractCooperativa"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "patch": {
        "operationId": "api_cooperativa_contracts_partial_update",
        "description": "",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/ContractCooperativa"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/ContractCooperativa"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "delete": {
        "operationId": "api_cooperativa_contracts_delete",
        "description": "",
        "parameters": [],
        "responses": {
          "204": {
            "description": ""
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": [
        {
          "name": "contract",
          "in": "path",
          "description": "Un valor único que identifique este Contrato Cooperativa.",
          "required": true,
          "type": "string"
        }
      ]
    },
    "/api/cooperativa/contributions/": {
      "get": {
        "operationId": "api_cooperativa_contributions_list",
        "description": "ViewSet para gestión de aportes sociales.",
        "parameters": [
          {
            "name": "page",
            "in": "query",
            "description": "Un número de página dentro del conjunto de resultados paginado.",
            "required": false,
            "type": "integer"
          },
          {
            "name": "page_size",
            "in": "query",
            "description": "Número de resultados a devolver por página.",
            "required": false,
            "type": "integer"
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "required": [
                "count",
                "results"
              ],
              "type": "object",
              "properties": {
                "count": {
                  "type": "integer"
                },
                "next": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "previous": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "results": {
                  "type": "array",
                  "items": {
                    "$ref": "#/definitions/SocialContribution"
                  }
                }
              }
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "post": {
        "operationId": "api_cooperativa_contributions_create",
        "description": "ViewSet para gestión de aportes sociales.",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/SocialContributionCreate"
            }
          }
        ],
        "responses": {
          "201": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/SocialContributionCreate"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/cooperativa/contributions/generate_monthly/": {
      "post": {
        "operationId": "api_cooperativa_contributions_generate_monthly",
        "description": "Genera aportes del mes actual para todos los asociados activos",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/SocialContribution"
            }
          }
        ],
        "responses": {
          "201": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/SocialContribution"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/cooperativa/contributions/pending/": {
      "get": {
        "operationId": "api_cooperativa_contributions_pending",
        "description": "Lista aportes pendientes",
        "parameters": [
          {
            "name": "page",
            "in": "query",
            "description": "Un número de página dentro del conjunto de resultados paginado.",
            "required": false,
            "type": "integer"
          },
          {
            "name": "page_size",
            "in": "query",
            "description": "Número de resultados a devolver por página.",
            "required": false,
            "type": "integer"
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "required": [
                "count",
                "results"
              ],
              "type": "object",
              "properties": {
                "count": {
                  "type": "integer"
                },
                "next": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "previous": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "results": {
                  "type": "array",
                  "items": {
                    "$ref": "#/definitions/SocialContribution"
                  }
                }
              }
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/cooperativa/contributions/stats/": {
      "get": {
        "operationId": "api_cooperativa_contributions_stats",
        "description": "Estadísticas de aportes",
        "parameters": [
          {
            "name": "page",
            "in": "query",
            "description": "Un número de página dentro del conjunto de resultados paginado.",
            "required": false,
            "type": "integer"
          },
          {
            "name": "page_size",
            "in": "query",
            "description": "Número de resultados a devolver por página.",
            "required": false,
            "type": "integer"
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "required": [
                "count",
                "results"
              ],
              "type": "object",
              "properties": {
                "count": {
                  "type": "integer"
                },
                "next": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "previous": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "results": {
                  "type": "array",
                  "items": {
                    "$ref": "#/definitions/SocialContribution"
                  }
                }
              }
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/cooperativa/contributions/{id}/": {
      "get": {
        "operationId": "api_cooperativa_contributions_read",
        "description": "ViewSet para gestión de aportes sociales.",
        "parameters": [],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/SocialContribution"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "put": {
        "operationId": "api_cooperativa_contributions_update",
        "description": "ViewSet para gestión de aportes sociales.",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/SocialContribution"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/SocialContribution"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "patch": {
        "operationId": "api_cooperativa_contributions_partial_update",
        "description": "ViewSet para gestión de aportes sociales.",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/SocialContribution"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/SocialContribution"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "delete": {
        "operationId": "api_cooperativa_contributions_delete",
        "description": "ViewSet para gestión de aportes sociales.",
        "parameters": [],
        "responses": {
          "204": {
            "description": ""
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "description": "Un valor de entero único que identifique este Aporte Social.",
          "required": true,
          "type": "integer"
        }
      ]
    },
    "/api/cooperativa/contributions/{id}/mark_paid/": {
      "post": {
        "operationId": "api_cooperativa_contributions_mark_paid",
        "description": "Marca un aporte como pagado",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/SocialContribution"
            }
          }
        ],
        "responses": {
          "201": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/SocialContribution"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "description": "Un valor de entero único que identifique este Aporte Social.",
          "required": true,
          "type": "integer"
        }
      ]
    },
    "/api/cooperativa/credit-applications/": {
      "get": {
        "operationId": "api_cooperativa_credit-applications_list",
        "description": "ViewSet para solicitudes de crédito.",
        "parameters": [
          {
            "name": "page",
            "in": "query",
            "description": "Un número de página dentro del conjunto de resultados paginado.",
            "required": false,
            "type": "integer"
          },
          {
            "name": "page_size",
            "in": "query",
            "description": "Número de resultados a devolver por página.",
            "required": false,
            "type": "integer"
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "required": [
                "count",
                "results"
              ],
              "type": "object",
              "properties": {
                "count": {
                  "type": "integer"
                },
                "next": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "previous": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "results": {
                  "type": "array",
                  "items": {
                    "$ref": "#/definitions/CreditApplication"
                  }
                }
              }
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "post": {
        "operationId": "api_cooperativa_credit-applications_create",
        "description": "ViewSet para solicitudes de crédito.",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/CreditApplicationCreate"
            }
          }
        ],
        "responses": {
          "201": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/CreditApplicationCreate"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/cooperativa/credit-applications/{id}/": {
      "get": {
        "operationId": "api_cooperativa_credit-applications_read",
        "description": "ViewSet para solicitudes de crédito.",
        "parameters": [],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/CreditApplication"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "put": {
        "operationId": "api_cooperativa_credit-applications_update",
        "description": "ViewSet para solicitudes de crédito.",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/CreditApplication"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/CreditApplication"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "patch": {
        "operationId": "api_cooperativa_credit-applications_partial_update",
        "description": "ViewSet para solicitudes de crédito.",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/CreditApplication"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/CreditApplication"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "delete": {
        "operationId": "api_cooperativa_credit-applications_delete",
        "description": "ViewSet para solicitudes de crédito.",
        "parameters": [],
        "responses": {
          "204": {
            "description": ""
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "description": "Un valor de entero único que identifique este Solicitud de Crédito.",
          "required": true,
          "type": "integer"
        }
      ]
    },
    "/api/cooperativa/credit-applications/{id}/approve/": {
      "post": {
        "operationId": "api_cooperativa_credit-applications_approve",
        "description": "Aprueba la solicitud de crédito",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/CreditApplication"
            }
          }
        ],
        "responses": {
          "201": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/CreditApplication"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "description": "Un valor de entero único que identifique este Solicitud de Crédito.",
          "required": true,
          "type": "integer"
        }
      ]
    },
    "/api/cooperativa/credit-applications/{id}/disburse/": {
      "post": {
        "operationId": "api_cooperativa_credit-applications_disburse",
        "description": "Desembolsa el crédito aprobado",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/CreditApplication"
            }
          }
        ],
        "responses": {
          "201": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/CreditApplication"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "description": "Un valor de entero único que identifique este Solicitud de Crédito.",
          "required": true,
          "type": "integer"
        }
      ]
    },
    "/api/cooperativa/credit-applications/{id}/evaluar_riesgo/": {
      "post": {
        "operationId": "api_cooperativa_credit-applications_evaluar_riesgo",
        "description": "Califica la solicitud con la matriz de scoring parametrizable y guarda el resultado.\nPOST /api/cooperativa/credit-applications/{id}/evaluar_riesgo/\nBody opcional: { \"ingresos_mensuales\": 4500000, \"gastos_mensuales\": 1800000, \"datacredito_score\": 750 }\nSin ingresos informados se usa el salario del vínculo de nómina activo; si\ntampoco existe, la capacidad queda sin evaluar y la banda no pasa de revisión.",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/CreditApplication"
            }
          }
        ],
        "responses": {
          "201": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/CreditApplication"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "description": "Un valor de entero único que identifique este Solicitud de Crédito.",
          "required": true,
          "type": "integer"
        }
      ]
    },
    "/api/cooperativa/credit-applications/{id}/reject/": {
      "post": {
        "operationId": "api_cooperativa_credit-applications_reject",
        "description": "Rechaza la solicitud",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/CreditApplication"
            }
          }
        ],
        "responses": {
          "201": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/CreditApplication"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "description": "Un valor de entero único que identifique este Solicitud de Crédito.",
          "required": true,
          "type": "integer"
        }
      ]
    },
    "/api/cooperativa/credit-applications/{id}/review/": {
      "post": {
        "operationId": "api_cooperativa_credit-applications_review",
        "description": "Marca la solicitud como en revisión",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/CreditApplication"
            }
          }
        ],
        "responses": {
          "201": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/CreditApplication"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "description": "Un valor de entero único que identifique este Solicitud de Crédito.",
          "required": true,
          "type": "integer"
        }
      ]
    },
    "/api/cooperativa/credit-applications/{id}/submit/": {
      "post": {
        "operationId": "api_cooperativa_credit-applications_submit",
        "description": "Envía la solicitud para revisión",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/CreditApplication"
            }
          }
        ],
        "responses": {
          "201": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/CreditApplication"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "description": "Un valor de entero único que identifique este Solicitud de Crédito.",
          "required": true,
          "type": "integer"
        }
      ]
    },
    "/api/cooperativa/credit-lines/": {
      "get": {
        "operationId": "api_cooperativa_credit-lines_list",
        "description": "ViewSet para líneas de crédito.",
        "parameters": [
          {
            "name": "page",
            "in": "query",
            "description": "Un número de página dentro del conjunto de resultados paginado.",
            "required": false,
            "type": "integer"
          },
          {
            "name": "page_size",
            "in": "query",
            "description": "Número de resultados a devolver por página.",
            "required": false,
            "type": "integer"
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "required": [
                "count",
                "results"
              ],
              "type": "object",
              "properties": {
                "count": {
                  "type": "integer"
                },
                "next": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "previous": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "results": {
                  "type": "array",
                  "items": {
                    "$ref": "#/definitions/CreditLine"
                  }
                }
              }
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "post": {
        "operationId": "api_cooperativa_credit-lines_create",
        "description": "ViewSet para líneas de crédito.",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/CreditLine"
            }
          }
        ],
        "responses": {
          "201": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/CreditLine"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/cooperativa/credit-lines/simulate/": {
      "post": {
        "operationId": "api_cooperativa_credit-lines_simulate",
        "description": "Simula un crédito",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/CreditLine"
            }
          }
        ],
        "responses": {
          "201": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/CreditLine"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/cooperativa/credit-lines/{id}/": {
      "get": {
        "operationId": "api_cooperativa_credit-lines_read",
        "description": "ViewSet para líneas de crédito.",
        "parameters": [],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/CreditLine"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "put": {
        "operationId": "api_cooperativa_credit-lines_update",
        "description": "ViewSet para líneas de crédito.",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/CreditLine"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/CreditLine"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "patch": {
        "operationId": "api_cooperativa_credit-lines_partial_update",
        "description": "ViewSet para líneas de crédito.",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/CreditLine"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/CreditLine"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "delete": {
        "operationId": "api_cooperativa_credit-lines_delete",
        "description": "ViewSet para líneas de crédito.",
        "parameters": [],
        "responses": {
          "204": {
            "description": ""
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "description": "Un valor de entero único que identifique este Línea de Crédito.",
          "required": true,
          "type": "integer"
        }
      ]
    },
    "/api/cooperativa/employees/": {
      "get": {
        "operationId": "api_cooperativa_employees_list",
        "description": "ViewSet para vínculos empleado-empresa.",
        "parameters": [
          {
            "name": "page",
            "in": "query",
            "description": "Un número de página dentro del conjunto de resultados paginado.",
            "required": false,
            "type": "integer"
          },
          {
            "name": "page_size",
            "in": "query",
            "description": "Número de resultados a devolver por página.",
            "required": false,
            "type": "integer"
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "required": [
                "count",
                "results"
              ],
              "type": "object",
              "properties": {
                "count": {
                  "type": "integer"
                },
                "next": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "previous": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "results": {
                  "type": "array",
                  "items": {
                    "$ref": "#/definitions/EmployeeLink"
                  }
                }
              }
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "post": {
        "operationId": "api_cooperativa_employees_create",
        "description": "ViewSet para vínculos empleado-empresa.",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/EmployeeLink"
            }
          }
        ],
        "responses": {
          "201": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/EmployeeLink"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/cooperativa/employees/{id}/": {
      "get": {
        "operationId": "api_cooperativa_employees_read",
        "description": "ViewSet para vínculos empleado-empresa.",
        "parameters": [],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/EmployeeLink"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "put": {
        "operationId": "api_cooperativa_employees_update",
        "description": "ViewSet para vínculos empleado-empresa.",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/EmployeeLink"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/EmployeeLink"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "patch": {
        "operationId": "api_cooperativa_employees_partial_update",
        "description": "ViewSet para vínculos empleado-empresa.",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/EmployeeLink"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/EmployeeLink"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "delete": {
        "operationId": "api_cooperativa_employees_delete",
        "description": "ViewSet para vínculos empleado-empresa.",
        "parameters": [],
        "responses": {
          "204": {
            "description": ""
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "description": "Un valor de entero único que identifique este Empleado.",
          "required": true,
          "type": "integer"
        }
      ]
    },
    "/api/cooperativa/loan-payments/": {
      "get": {
        "operationId": "api_cooperativa_loan-payments_list",
        "description": "ViewSet de solo lectura para pagos de crédito.",
        "parameters": [
          {
            "name": "page",
            "in": "query",
            "description": "Un número de página dentro del conjunto de resultados paginado.",
            "required": false,
            "type": "integer"
          },
          {
            "name": "page_size",
            "in": "query",
            "description": "Número de resultados a devolver por página.",
            "required": false,
            "type": "integer"
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "required": [
                "count",
                "results"
              ],
              "type": "object",
              "properties": {
                "count": {
                  "type": "integer"
                },
                "next": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "previous": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "results": {
                  "type": "array",
                  "items": {
                    "$ref": "#/definitions/LoanPayment"
                  }
                }
              }
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/cooperativa/loan-payments/{id}/": {
      "get": {
        "operationId": "api_cooperativa_loan-payments_read",
        "description": "ViewSet de solo lectura para pagos de crédito.",
        "parameters": [],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/LoanPayment"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "description": "Un valor de entero único que identifique este Pago de Crédito.",
          "required": true,
          "type": "integer"
        }
      ]
    },
    "/api/cooperativa/loans/": {
      "get": {
        "operationId": "api_cooperativa_loans_list",
        "description": "ViewSet para créditos cooperativos.",
        "parameters": [
          {
            "name": "page",
            "in": "query",
            "description": "Un número de página dentro del conjunto de resultados paginado.",
            "required": false,
            "type": "integer"
          },
          {
            "name": "page_size",
            "in": "query",
            "description": "Número de resultados a devolver por página.",
            "required": false,
            "type": "integer"
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "required": [
                "count",
                "results"
              ],
              "type": "object",
              "properties": {
                "count": {
                  "type": "integer"
                },
                "next": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "previous": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "results": {
                  "type": "array",
                  "items": {
                    "$ref": "#/definitions/CooperativeLoan"
                  }
                }
              }
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "post": {
        "operationId": "api_cooperativa_loans_create",
        "description": "ViewSet para créditos cooperativos.",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/CooperativeLoan"
            }
          }
        ],
        "responses": {
          "201": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/CooperativeLoan"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/cooperativa/loans/stats/": {
      "get": {
        "operationId": "api_cooperativa_loans_stats",
        "description": "Estadísticas de créditos",
        "parameters": [
          {
            "name": "page",
            "in": "query",
            "description": "Un número de página dentro del conjunto de resultados paginado.",
            "required": false,
            "type": "integer"
          },
          {
            "name": "page_size",
            "in": "query",
            "description": "Número de resultados a devolver por página.",
            "required": false,
            "type": "integer"
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "required": [
                "count",
                "results"
              ],
              "type": "object",
              "properties": {
                "count": {
                  "type": "integer"
                },
                "next": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "previous": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "results": {
                  "type": "array",
                  "items": {
                    "$ref": "#/definitions/CooperativeLoan"
                  }
                }
              }
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/cooperativa/loans/{id}/": {
      "get": {
        "operationId": "api_cooperativa_loans_read",
        "description": "ViewSet para créditos cooperativos.",
        "parameters": [],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/CooperativeLoanDetail"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "put": {
        "operationId": "api_cooperativa_loans_update",
        "description": "ViewSet para créditos cooperativos.",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/CooperativeLoan"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/CooperativeLoan"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "patch": {
        "operationId": "api_cooperativa_loans_partial_update",
        "description": "ViewSet para créditos cooperativos.",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/CooperativeLoan"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/CooperativeLoan"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "delete": {
        "operationId": "api_cooperativa_loans_delete",
        "description": "ViewSet para créditos cooperativos.",
        "parameters": [],
        "responses": {
          "204": {
            "description": ""
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "description": "Un valor de entero único que identifique este Crédito Cooperativo.",
          "required": true,
          "type": "integer"
        }
      ]
    },
    "/api/cooperativa/loans/{id}/amortization/": {
      "get": {
        "operationId": "api_cooperativa_loans_amortization",
        "description": "Genera tabla de amortización",
        "parameters": [],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/CooperativeLoan"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "description": "Un valor de entero único que identifique este Crédito Cooperativo.",
          "required": true,
          "type": "integer"
        }
      ]
    },
    "/api/cooperativa/loans/{id}/make_payment/": {
      "post": {
        "operationId": "api_cooperativa_loans_make_payment",
        "description": "Registra un pago al crédito",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/CooperativeLoan"
            }
          }
        ],
        "responses": {
          "201": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/CooperativeLoan"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "description": "Un valor de entero único que identifique este Crédito Cooperativo.",
          "required": true,
          "type": "integer"
        }
      ]
    },
    "/api/cooperativa/loans/{id}/payments/": {
      "get": {
        "operationId": "api_cooperativa_loans_payments",
        "description": "Lista pagos del crédito",
        "parameters": [],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/CooperativeLoan"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "description": "Un valor de entero único que identifique este Crédito Cooperativo.",
          "required": true,
          "type": "integer"
        }
      ]
    },
    "/api/cooperativa/members/": {
      "get": {
        "operationId": "api_cooperativa_members_list",
        "description": "ViewSet para gestión de asociados de la cooperativa.",
        "parameters": [
          {
            "name": "page",
            "in": "query",
            "description": "Un número de página dentro del conjunto de resultados paginado.",
            "required": false,
            "type": "integer"
          },
          {
            "name": "page_size",
            "in": "query",
            "description": "Número de resultados a devolver por página.",
            "required": false,
            "type": "integer"
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "required": [
                "count",
                "results"
              ],
              "type": "object",
              "properties": {
                "count": {
                  "type": "integer"
                },
                "next": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "previous": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "results": {
                  "type": "array",
                  "items": {
                    "$ref": "#/definitions/MemberList"
                  }
                }
              }
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "post": {
        "operationId": "api_cooperativa_members_create",
        "description": "ViewSet para gestión de asociados de la cooperativa.",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/MemberCreate"
            }
          }
        ],
        "responses": {
          "201": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/MemberCreate"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/cooperativa/members/stats/": {
      "get": {
        "operationId": "api_cooperativa_members_stats",
        "description": "Estadísticas generales de asociados",
        "parameters": [
          {
            "name": "page",
            "in": "query",
            "description": "Un número de página dentro del conjunto de resultados paginado.",
            "required": false,
            "type": "integer"
          },
          {
            "name": "page_size",
            "in": "query",
            "description": "Número de resultados a devolver por página.",
            "required": false,
            "type": "integer"
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "required": [
                "count",
                "results"
              ],
              "type": "object",
              "properties": {
                "count": {
                  "type": "integer"
                },
                "next": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "previous": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "results": {
                  "type": "array",
                  "items": {
                    "$ref": "#/definitions/Member"
                  }
                }
              }
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/cooperativa/members/{id}/": {
      "get": {
        "operationId": "api_cooperativa_members_read",
        "description": "ViewSet para gestión de asociados de la cooperativa.",
        "parameters": [],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/MemberDetail"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "put": {
        "operationId": "api_cooperativa_members_update",
        "description": "ViewSet para gestión de asociados de la cooperativa.",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/Member"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/Member"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "patch": {
        "operationId": "api_cooperativa_members_partial_update",
        "description": "ViewSet para gestión de asociados de la cooperativa.",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/Member"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/Member"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "delete": {
        "operationId": "api_cooperativa_members_delete",
        "description": "ViewSet para gestión de asociados de la cooperativa.",
        "parameters": [],
        "responses": {
          "204": {
            "description": ""
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "description": "Un valor de entero único que identifique este Asociado.",
          "required": true,
          "type": "integer"
        }
      ]
    },
    "/api/cooperativa/members/{id}/activate/": {
      "post": {
        "operationId": "api_cooperativa_members_activate",
        "description": "Activa un asociado",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/Member"
            }
          }
        ],
        "responses": {
          "201": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/Member"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "description": "Un valor de entero único que identifique este Asociado.",
          "required": true,
          "type": "integer"
        }
      ]
    },
    "/api/cooperativa/members/{id}/contributions/": {
      "get": {
        "operationId": "api_cooperativa_members_contributions",
        "description": "Obtiene los aportes de un asociado",
        "parameters": [],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/Member"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "description": "Un valor de entero único que identifique este Asociado.",
          "required": true,
          "type": "integer"
        }
      ]
    },
    "/api/cooperativa/members/{id}/generate_contribution/": {
      "post": {
        "operationId": "api_cooperativa_members_generate_contribution",
        "description": "Genera el aporte del mes actual para un asociado",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/Member"
            }
          }
        ],
        "responses": {
          "201": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/Member"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "description": "Un valor de entero único que identifique este Asociado.",
          "required": true,
          "type": "integer"
        }
      ]
    },
    "/api/cooperativa/members/{id}/suspend/": {
      "post": {
        "operationId": "api_cooperativa_members_suspend",
        "description": "Suspende un asociado",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/Member"
            }
          }
        ],
        "responses": {
          "201": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/Member"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "description": "Un valor de entero único que identifique este Asociado.",
          "required": true,
          "type": "integer"
        }
      ]
    },
    "/api/cooperativa/membership-history/": {
      "get": {
        "operationId": "api_cooperativa_membership-history_list",
        "description": "ViewSet de solo lectura para historial de membresía.",
        "parameters": [
          {
            "name": "page",
            "in": "query",
            "description": "Un número de página dentro del conjunto de resultados paginado.",
            "required": false,
            "type": "integer"
          },
          {
            "name": "page_size",
            "in": "query",
            "description": "Número de resultados a devolver por página.",
            "required": false,
            "type": "integer"
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "required": [
                "count",
                "results"
              ],
              "type": "object",
              "properties": {
                "count": {
                  "type": "integer"
                },
                "next": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "previous": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "results": {
                  "type": "array",
                  "items": {
                    "$ref": "#/definitions/MembershipHistory"
                  }
                }
              }
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/cooperativa/membership-history/{id}/": {
      "get": {
        "operationId": "api_cooperativa_membership-history_read",
        "description": "ViewSet de solo lectura para historial de membresía.",
        "parameters": [],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/MembershipHistory"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "description": "Un valor de entero único que identifique este Historial de Membresía.",
          "required": true,
          "type": "integer"
        }
      ]
    },
    "/api/cooperativa/migratable-contracts/": {
      "get": {
        "operationId": "api_cooperativa_migratable-contracts_list",
        "summary": "Lista contratos elegibles para migración a cooperativa.",
        "description": "GET /api/cooperativa/migratable-contracts/",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/cooperativa/migrate-contract/{contract_no}/": {
      "post": {
        "operationId": "api_cooperativa_migrate-contract_create",
        "summary": "Migra un contrato ECF a crédito cooperativo.",
        "description": "POST /api/cooperativa/migrate-contract/{contract_no}/",
        "parameters": [],
        "responses": {
          "201": {
            "description": ""
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": [
        {
          "name": "contract_no",
          "in": "path",
          "required": true,
          "type": "string"
        }
      ]
    },
    "/api/cooperativa/payroll-agreements/": {
      "get": {
        "operationId": "api_cooperativa_payroll-agreements_list",
        "description": "ViewSet para convenios de nómina.",
        "parameters": [
          {
            "name": "page",
            "in": "query",
            "description": "Un número de página dentro del conjunto de resultados paginado.",
            "required": false,
            "type": "integer"
          },
          {
            "name": "page_size",
            "in": "query",
            "description": "Número de resultados a devolver por página.",
            "required": false,
            "type": "integer"
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "required": [
                "count",
                "results"
              ],
              "type": "object",
              "properties": {
                "count": {
                  "type": "integer"
                },
                "next": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "previous": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "results": {
                  "type": "array",
                  "items": {
                    "$ref": "#/definitions/PayrollAgreement"
                  }
                }
              }
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "post": {
        "operationId": "api_cooperativa_payroll-agreements_create",
        "description": "ViewSet para convenios de nómina.",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/PayrollAgreement"
            }
          }
        ],
        "responses": {
          "201": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/PayrollAgreement"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/cooperativa/payroll-agreements/{id}/": {
      "get": {
        "operationId": "api_cooperativa_payroll-agreements_read",
        "description": "ViewSet para convenios de nómina.",
        "parameters": [],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/PayrollAgreement"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "put": {
        "operationId": "api_cooperativa_payroll-agreements_update",
        "description": "ViewSet para convenios de nómina.",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/PayrollAgreement"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/PayrollAgreement"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "patch": {
        "operationId": "api_cooperativa_payroll-agreements_partial_update",
        "description": "ViewSet para convenios de nómina.",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/PayrollAgreement"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/PayrollAgreement"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "delete": {
        "operationId": "api_cooperativa_payroll-agreements_delete",
        "description": "ViewSet para convenios de nómina.",
        "parameters": [],
        "responses": {
          "204": {
            "description": ""
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "description": "Un valor de entero único que identifique este Convenio de Nómina.",
          "required": true,
          "type": "integer"
        }
      ]
    },
    "/api/cooperativa/payroll-agreements/{id}/activate/": {
      "post": {
        "operationId": "api_cooperativa_payroll-agreements_activate",
        "description": "Activa un convenio",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/PayrollAgreement"
            }
          }
        ],
        "responses": {
          "201": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/PayrollAgreement"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "description": "Un valor de entero único que identifique este Convenio de Nómina.",
          "required": true,
          "type": "integer"
        }
      ]
    },
    "/api/cooperativa/payroll-deductions/": {
      "get": {
        "operationId": "api_cooperativa_payroll-deductions_list",
        "description": "ViewSet de solo lectura para deducciones de nómina.",
        "parameters": [
          {
            "name": "page",
            "in": "query",
            "description": "Un número de página dentro del conjunto de resultados paginado.",
            "required": false,
            "type": "integer"
          },
          {
            "name": "page_size",
            "in": "query",
            "description": "Número de resultados a devolver por página.",
            "required": false,
            "type": "integer"
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "required": [
                "count",
                "results"
              ],
              "type": "object",
              "properties": {
                "count": {
                  "type": "integer"
                },
                "next": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "previous": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "results": {
                  "type": "array",
                  "items": {
                    "$ref": "#/definitions/PayrollDeduction"
                  }
                }
              }
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/cooperativa/payroll-deductions/{id}/": {
      "get": {
        "operationId": "api_cooperativa_payroll-deductions_read",
        "description": "ViewSet de solo lectura para deducciones de nómina.",
        "parameters": [],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/PayrollDeduction"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "description": "Un valor de entero único que identifique este Deducción de Nómina.",
          "required": true,
          "type": "integer"
        }
      ]
    },
    "/api/cooperativa/payroll-files/": {
      "get": {
        "operationId": "api_cooperativa_payroll-files_list",
        "description": "ViewSet para archivos de nómina.",
        "parameters": [
          {
            "name": "page",
            "in": "query",
            "description": "Un número de página dentro del conjunto de resultados paginado.",
            "required": false,
            "type": "integer"
          },
          {
            "name": "page_size",
            "in": "query",
            "description": "Número de resultados a devolver por página.",
            "required": false,
            "type": "integer"
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "required": [
                "count",
                "results"
              ],
              "type": "object",
              "properties": {
                "count": {
                  "type": "integer"
                },
                "next": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "previous": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "results": {
                  "type": "array",
                  "items": {
                    "$ref": "#/definitions/PayrollFile"
                  }
                }
              }
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "post": {
        "operationId": "api_cooperativa_payroll-files_create",
        "description": "ViewSet para archivos de nómina.",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/PayrollFile"
            }
          }
        ],
        "responses": {
          "201": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/PayrollFile"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/cooperativa/payroll-files/{id}/": {
      "get": {
        "operationId": "api_cooperativa_payroll-files_read",
        "description": "ViewSet para archivos de nómina.",
        "parameters": [],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/PayrollFileDetail"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "put": {
        "operationId": "api_cooperativa_payroll-files_update",
        "description": "ViewSet para archivos de nómina.",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/PayrollFile"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/PayrollFile"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "patch": {
        "operationId": "api_cooperativa_payroll-files_partial_update",
        "description": "ViewSet para archivos de nómina.",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/PayrollFile"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/PayrollFile"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "delete": {
        "operationId": "api_cooperativa_payroll-files_delete",
        "description": "ViewSet para archivos de nómina.",
        "parameters": [],
        "responses": {
          "204": {
            "description": ""
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "description": "Un valor de entero único que identifique este Archivo de Nómina.",
          "required": true,
          "type": "integer"
        }
      ]
    },
    "/api/cooperativa/payroll-files/{id}/deductions/": {
      "get": {
        "operationId": "api_cooperativa_payroll-files_deductions",
        "description": "Lista deducciones del archivo",
        "parameters": [],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/PayrollFile"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "description": "Un valor de entero único que identifique este Archivo de Nómina.",
          "required": true,
          "type": "integer"
        }
      ]
    },
    "/api/cooperativa/payroll-files/{id}/process/": {
      "post": {
        "operationId": "api_cooperativa_payroll-files_process",
        "description": "Procesa el archivo de nómina aplicando las deducciones",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/PayrollFile"
            }
          }
        ],
        "responses": {
          "201": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/PayrollFile"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "description": "Un valor de entero único que identifique este Archivo de Nómina.",
          "required": true,
          "type": "integer"
        }
      ]
    },
    "/api/cooperativa/public/credit-lines/": {
      "get": {
        "operationId": "api_cooperativa_public_credit-lines_list",
        "description": "GET /api/cooperativa/public/credit-lines/ : líneas activas marcadas para la\nlanding ejecoop (p. ej. \"Mi Primer Crédito\"). Vacío hasta que se publiquen.",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/cooperativa/reports/contributions/": {
      "get": {
        "operationId": "api_cooperativa_reports_contributions_list",
        "description": "Genera reporte de recaudo de aportes.\nQuery params: year, month",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/cooperativa/reports/dashboard/": {
      "get": {
        "operationId": "api_cooperativa_reports_dashboard_list",
        "description": "Obtiene KPIs principales para el dashboard cooperativo.",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/cooperativa/reports/members/{member_id}/certificate/{year}/": {
      "get": {
        "operationId": "api_cooperativa_reports_members_certificate_read",
        "description": "Genera certificado de aportes para un año específico.",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": [
        {
          "name": "member_id",
          "in": "path",
          "required": true,
          "type": "string"
        },
        {
          "name": "year",
          "in": "path",
          "required": true,
          "type": "string"
        }
      ]
    },
    "/api/cooperativa/reports/members/{member_id}/statement/": {
      "get": {
        "operationId": "api_cooperativa_reports_members_statement_list",
        "description": "Genera estado de cuenta de un asociado.\nQuery params: start_date, end_date (formato YYYY-MM-DD)",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": [
        {
          "name": "member_id",
          "in": "path",
          "required": true,
          "type": "string"
        }
      ]
    },
    "/api/cooperativa/reports/portfolio/": {
      "get": {
        "operationId": "api_cooperativa_reports_portfolio_list",
        "description": "Genera reporte de cartera por edades.\nQuery params: as_of_date (formato YYYY-MM-DD)",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/cooperativa/reports/savings/": {
      "get": {
        "operationId": "api_cooperativa_reports_savings_list",
        "description": "Genera reporte de captaciones (ahorro).",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/cooperativa/savings-accounts/": {
      "get": {
        "operationId": "api_cooperativa_savings-accounts_list",
        "description": "ViewSet para gestión de cuentas de ahorro.",
        "parameters": [
          {
            "name": "page",
            "in": "query",
            "description": "Un número de página dentro del conjunto de resultados paginado.",
            "required": false,
            "type": "integer"
          },
          {
            "name": "page_size",
            "in": "query",
            "description": "Número de resultados a devolver por página.",
            "required": false,
            "type": "integer"
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "required": [
                "count",
                "results"
              ],
              "type": "object",
              "properties": {
                "count": {
                  "type": "integer"
                },
                "next": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "previous": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "results": {
                  "type": "array",
                  "items": {
                    "$ref": "#/definitions/SavingsAccount"
                  }
                }
              }
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "post": {
        "operationId": "api_cooperativa_savings-accounts_create",
        "description": "ViewSet para gestión de cuentas de ahorro.",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/SavingsAccountCreate"
            }
          }
        ],
        "responses": {
          "201": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/SavingsAccountCreate"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/cooperativa/savings-accounts/stats/": {
      "get": {
        "operationId": "api_cooperativa_savings-accounts_stats",
        "description": "Estadísticas de cuentas de ahorro",
        "parameters": [
          {
            "name": "page",
            "in": "query",
            "description": "Un número de página dentro del conjunto de resultados paginado.",
            "required": false,
            "type": "integer"
          },
          {
            "name": "page_size",
            "in": "query",
            "description": "Número de resultados a devolver por página.",
            "required": false,
            "type": "integer"
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "required": [
                "count",
                "results"
              ],
              "type": "object",
              "properties": {
                "count": {
                  "type": "integer"
                },
                "next": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "previous": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "results": {
                  "type": "array",
                  "items": {
                    "$ref": "#/definitions/SavingsAccount"
                  }
                }
              }
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/cooperativa/savings-accounts/{id}/": {
      "get": {
        "operationId": "api_cooperativa_savings-accounts_read",
        "description": "ViewSet para gestión de cuentas de ahorro.",
        "parameters": [],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/SavingsAccountDetail"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "put": {
        "operationId": "api_cooperativa_savings-accounts_update",
        "description": "ViewSet para gestión de cuentas de ahorro.",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/SavingsAccount"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/SavingsAccount"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "patch": {
        "operationId": "api_cooperativa_savings-accounts_partial_update",
        "description": "ViewSet para gestión de cuentas de ahorro.",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/SavingsAccount"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/SavingsAccount"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "delete": {
        "operationId": "api_cooperativa_savings-accounts_delete",
        "description": "ViewSet para gestión de cuentas de ahorro.",
        "parameters": [],
        "responses": {
          "204": {
            "description": ""
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "description": "Un valor de entero único que identifique este Cuenta de Ahorro.",
          "required": true,
          "type": "integer"
        }
      ]
    },
    "/api/cooperativa/savings-accounts/{id}/deposit/": {
      "post": {
        "operationId": "api_cooperativa_savings-accounts_deposit",
        "description": "Registra un depósito en la cuenta",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/SavingsAccount"
            }
          }
        ],
        "responses": {
          "201": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/SavingsAccount"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "description": "Un valor de entero único que identifique este Cuenta de Ahorro.",
          "required": true,
          "type": "integer"
        }
      ]
    },
    "/api/cooperativa/savings-accounts/{id}/transactions/": {
      "get": {
        "operationId": "api_cooperativa_savings-accounts_transactions",
        "description": "Lista transacciones de la cuenta",
        "parameters": [],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/SavingsAccount"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "description": "Un valor de entero único que identifique este Cuenta de Ahorro.",
          "required": true,
          "type": "integer"
        }
      ]
    },
    "/api/cooperativa/savings-accounts/{id}/withdraw/": {
      "post": {
        "operationId": "api_cooperativa_savings-accounts_withdraw",
        "description": "Registra un retiro de la cuenta",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/SavingsAccount"
            }
          }
        ],
        "responses": {
          "201": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/SavingsAccount"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "description": "Un valor de entero único que identifique este Cuenta de Ahorro.",
          "required": true,
          "type": "integer"
        }
      ]
    },
    "/api/cooperativa/savings-products/": {
      "get": {
        "operationId": "api_cooperativa_savings-products_list",
        "description": "ViewSet para gestión de productos de ahorro.",
        "parameters": [
          {
            "name": "page",
            "in": "query",
            "description": "Un número de página dentro del conjunto de resultados paginado.",
            "required": false,
            "type": "integer"
          },
          {
            "name": "page_size",
            "in": "query",
            "description": "Número de resultados a devolver por página.",
            "required": false,
            "type": "integer"
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "required": [
                "count",
                "results"
              ],
              "type": "object",
              "properties": {
                "count": {
                  "type": "integer"
                },
                "next": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "previous": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "results": {
                  "type": "array",
                  "items": {
                    "$ref": "#/definitions/SavingsProduct"
                  }
                }
              }
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "post": {
        "operationId": "api_cooperativa_savings-products_create",
        "description": "ViewSet para gestión de productos de ahorro.",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/SavingsProduct"
            }
          }
        ],
        "responses": {
          "201": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/SavingsProduct"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/cooperativa/savings-products/{id}/": {
      "get": {
        "operationId": "api_cooperativa_savings-products_read",
        "description": "ViewSet para gestión de productos de ahorro.",
        "parameters": [],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/SavingsProduct"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "put": {
        "operationId": "api_cooperativa_savings-products_update",
        "description": "ViewSet para gestión de productos de ahorro.",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/SavingsProduct"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/SavingsProduct"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "patch": {
        "operationId": "api_cooperativa_savings-products_partial_update",
        "description": "ViewSet para gestión de productos de ahorro.",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/SavingsProduct"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/SavingsProduct"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "delete": {
        "operationId": "api_cooperativa_savings-products_delete",
        "description": "ViewSet para gestión de productos de ahorro.",
        "parameters": [],
        "responses": {
          "204": {
            "description": ""
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "description": "Un valor de entero único que identifique este Producto de Ahorro.",
          "required": true,
          "type": "integer"
        }
      ]
    },
    "/api/cooperativa/savings-transactions/": {
      "get": {
        "operationId": "api_cooperativa_savings-transactions_list",
        "description": "ViewSet de solo lectura para transacciones de ahorro.",
        "parameters": [
          {
            "name": "page",
            "in": "query",
            "description": "Un número de página dentro del conjunto de resultados paginado.",
            "required": false,
            "type": "integer"
          },
          {
            "name": "page_size",
            "in": "query",
            "description": "Número de resultados a devolver por página.",
            "required": false,
            "type": "integer"
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "required": [
                "count",
                "results"
              ],
              "type": "object",
              "properties": {
                "count": {
                  "type": "integer"
                },
                "next": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "previous": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "results": {
                  "type": "array",
                  "items": {
                    "$ref": "#/definitions/SavingsTransaction"
                  }
                }
              }
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/cooperativa/savings-transactions/{id}/": {
      "get": {
        "operationId": "api_cooperativa_savings-transactions_read",
        "description": "ViewSet de solo lectura para transacciones de ahorro.",
        "parameters": [],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/SavingsTransaction"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "description": "Un valor de entero único que identifique este Transacción de Ahorro.",
          "required": true,
          "type": "integer"
        }
      ]
    },
    "/api/cooperativa/services/": {
      "get": {
        "operationId": "api_cooperativa_services_list",
        "description": "",
        "parameters": [
          {
            "name": "page",
            "in": "query",
            "description": "Un número de página dentro del conjunto de resultados paginado.",
            "required": false,
            "type": "integer"
          },
          {
            "name": "page_size",
            "in": "query",
            "description": "Número de resultados a devolver por página.",
            "required": false,
            "type": "integer"
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "required": [
                "count",
                "results"
              ],
              "type": "object",
              "properties": {
                "count": {
                  "type": "integer"
                },
                "next": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "previous": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "results": {
                  "type": "array",
                  "items": {
                    "$ref": "#/definitions/CooperativeService"
                  }
                }
              }
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "post": {
        "operationId": "api_cooperativa_services_create",
        "description": "",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/CooperativeService"
            }
          }
        ],
        "responses": {
          "201": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/CooperativeService"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/cooperativa/services/{id}/": {
      "get": {
        "operationId": "api_cooperativa_services_read",
        "description": "",
        "parameters": [],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/CooperativeService"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "put": {
        "operationId": "api_cooperativa_services_update",
        "description": "",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/CooperativeService"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/CooperativeService"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "patch": {
        "operationId": "api_cooperativa_services_partial_update",
        "description": "",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/CooperativeService"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/CooperativeService"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "delete": {
        "operationId": "api_cooperativa_services_delete",
        "description": "",
        "parameters": [],
        "responses": {
          "204": {
            "description": ""
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "description": "Un valor de entero único que identifique este Servicio Cooperativo.",
          "required": true,
          "type": "integer"
        }
      ]
    },
    "/api/copilot/ask/": {
      "post": {
        "operationId": "api_copilot_ask_create",
        "description": "POST /api/copilot/ask/",
        "parameters": [],
        "responses": {
          "201": {
            "description": ""
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/copilot/conversations/": {
      "get": {
        "operationId": "api_copilot_conversations_list",
        "description": "GET  /api/copilot/conversations/ : lista de conversaciones del usuario autenticado.\nPOST /api/copilot/conversations/ : crea una nueva conversación.",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "tags": [
          "api"
        ]
      },
      "post": {
        "operationId": "api_copilot_conversations_create",
        "description": "GET  /api/copilot/conversations/ : lista de conversaciones del usuario autenticado.\nPOST /api/copilot/conversations/ : crea una nueva conversación.",
        "parameters": [],
        "responses": {
          "201": {
            "description": ""
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/copilot/conversations/{id}/": {
      "get": {
        "operationId": "api_copilot_conversations_read",
        "description": "GET    /api/copilot/conversations/<id>/ : detalle con mensajes completos.\nPATCH  /api/copilot/conversations/<id>/ : actualizar título o archivar.\nDELETE /api/copilot/conversations/<id>/ : eliminar conversación.",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "tags": [
          "api"
        ]
      },
      "patch": {
        "operationId": "api_copilot_conversations_partial_update",
        "description": "GET    /api/copilot/conversations/<id>/ : detalle con mensajes completos.\nPATCH  /api/copilot/conversations/<id>/ : actualizar título o archivar.\nDELETE /api/copilot/conversations/<id>/ : eliminar conversación.",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "tags": [
          "api"
        ]
      },
      "delete": {
        "operationId": "api_copilot_conversations_delete",
        "description": "GET    /api/copilot/conversations/<id>/ : detalle con mensajes completos.\nPATCH  /api/copilot/conversations/<id>/ : actualizar título o archivar.\nDELETE /api/copilot/conversations/<id>/ : eliminar conversación.",
        "parameters": [],
        "responses": {
          "204": {
            "description": ""
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "required": true,
          "type": "string"
        }
      ]
    },
    "/api/copilot/draft_task/": {
      "post": {
        "operationId": "api_copilot_draft_task_create",
        "description": "POST /api/copilot/draft_task/",
        "parameters": [],
        "responses": {
          "201": {
            "description": ""
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/copilot/probe/": {
      "get": {
        "operationId": "api_copilot_probe_list",
        "description": "Diagnóstico rápido de latencia y disponibilidad por modelo.",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/copilot/status/": {
      "get": {
        "operationId": "api_copilot_status_list",
        "description": "GET /api/copilot/status/ : el frontend decide si muestra el copiloto.",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/copilot/usage/": {
      "get": {
        "operationId": "api_copilot_usage_list",
        "description": "GET /api/copilot/usage/ : gasto y uso del copiloto (solo administradores).",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/crm/activities/": {
      "get": {
        "operationId": "api_crm_activities_list",
        "description": "",
        "parameters": [
          {
            "name": "tipo",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "resultado",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "lead",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "opportunity",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "creado_por",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "search",
            "in": "query",
            "description": "Un término de búsqueda.",
            "required": false,
            "type": "string"
          },
          {
            "name": "ordering",
            "in": "query",
            "description": "Qué campo usar para ordenar los resultados.",
            "required": false,
            "type": "string"
          },
          {
            "name": "page",
            "in": "query",
            "description": "Un número de página dentro del conjunto de resultados paginado.",
            "required": false,
            "type": "integer"
          },
          {
            "name": "page_size",
            "in": "query",
            "description": "Número de resultados a devolver por página.",
            "required": false,
            "type": "integer"
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "required": [
                "count",
                "results"
              ],
              "type": "object",
              "properties": {
                "count": {
                  "type": "integer"
                },
                "next": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "previous": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "results": {
                  "type": "array",
                  "items": {
                    "$ref": "#/definitions/Activity"
                  }
                }
              }
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "post": {
        "operationId": "api_crm_activities_create",
        "description": "",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/ActivityCreate"
            }
          }
        ],
        "responses": {
          "201": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/ActivityCreate"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/crm/activities/{id}/": {
      "get": {
        "operationId": "api_crm_activities_read",
        "description": "",
        "parameters": [],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/Activity"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "put": {
        "operationId": "api_crm_activities_update",
        "description": "",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/ActivityCreate"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/ActivityCreate"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "patch": {
        "operationId": "api_crm_activities_partial_update",
        "description": "",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/ActivityCreate"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/ActivityCreate"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "delete": {
        "operationId": "api_crm_activities_delete",
        "description": "",
        "parameters": [],
        "responses": {
          "204": {
            "description": ""
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "description": "Un valor de entero único que identifique este activity.",
          "required": true,
          "type": "integer"
        }
      ]
    },
    "/api/crm/activity_types/": {
      "get": {
        "operationId": "api_crm_activity_types_list",
        "description": "GET /api/crm/activity_types/ — tipos permitidos para el usuario actual.",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/crm/campaigns/": {
      "get": {
        "operationId": "api_crm_campaigns_list",
        "description": "",
        "parameters": [
          {
            "name": "page",
            "in": "query",
            "description": "Un número de página dentro del conjunto de resultados paginado.",
            "required": false,
            "type": "integer"
          },
          {
            "name": "page_size",
            "in": "query",
            "description": "Número de resultados a devolver por página.",
            "required": false,
            "type": "integer"
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "required": [
                "count",
                "results"
              ],
              "type": "object",
              "properties": {
                "count": {
                  "type": "integer"
                },
                "next": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "previous": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "results": {
                  "type": "array",
                  "items": {
                    "$ref": "#/definitions/Campaign"
                  }
                }
              }
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "post": {
        "operationId": "api_crm_campaigns_create",
        "description": "",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/Campaign"
            }
          }
        ],
        "responses": {
          "201": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/Campaign"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/crm/campaigns/{id}/": {
      "get": {
        "operationId": "api_crm_campaigns_read",
        "description": "",
        "parameters": [],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/Campaign"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "put": {
        "operationId": "api_crm_campaigns_update",
        "description": "",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/Campaign"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/Campaign"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "patch": {
        "operationId": "api_crm_campaigns_partial_update",
        "description": "",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/Campaign"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/Campaign"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "delete": {
        "operationId": "api_crm_campaigns_delete",
        "description": "",
        "parameters": [],
        "responses": {
          "204": {
            "description": ""
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "description": "Un valor de entero único que identifique este campaign.",
          "required": true,
          "type": "integer"
        }
      ]
    },
    "/api/crm/campaigns/{id}/assign/": {
      "post": {
        "operationId": "api_crm_campaigns_assign",
        "description": "Reparte un lote de prospectos disponibles del segmento a un asesor.",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/Campaign"
            }
          }
        ],
        "responses": {
          "201": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/Campaign"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "description": "Un valor de entero único que identifique este campaign.",
          "required": true,
          "type": "integer"
        }
      ]
    },
    "/api/crm/checklist_items/": {
      "get": {
        "operationId": "api_crm_checklist_items_list",
        "description": "GET /api/crm/checklist_items/?tipo_interes=<v> — ítems del expediente.",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/crm/dashboard/": {
      "get": {
        "operationId": "api_crm_dashboard_list",
        "description": "",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/crm/dashboard/funnel/": {
      "get": {
        "operationId": "api_crm_dashboard_funnel",
        "description": "",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/crm/dashboard/performance/": {
      "get": {
        "operationId": "api_crm_dashboard_performance",
        "description": "",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/crm/dashboard/pipeline_value/": {
      "get": {
        "operationId": "api_crm_dashboard_pipeline_value",
        "description": "",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/crm/dashboard/stale_leads/": {
      "get": {
        "operationId": "api_crm_dashboard_stale_leads",
        "description": "",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/crm/document_queue/": {
      "get": {
        "operationId": "api_crm_document_queue_list",
        "description": "GET /api/crm/document_queue/ — cola de expedientes radicados sin\naprobación completa, los más antiguos primero, con semáforo SLA.",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/crm/leads/": {
      "get": {
        "operationId": "api_crm_leads_list",
        "description": "",
        "parameters": [
          {
            "name": "etapa",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "fuente",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "tipo_interes",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "linea_negocio",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "asignado_a",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "fecha_from",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "fecha_to",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "etapa__in",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "recontacto_hasta",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "recontacto_desde",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "search",
            "in": "query",
            "description": "Un término de búsqueda.",
            "required": false,
            "type": "string"
          },
          {
            "name": "ordering",
            "in": "query",
            "description": "Qué campo usar para ordenar los resultados.",
            "required": false,
            "type": "string"
          },
          {
            "name": "page",
            "in": "query",
            "description": "Un número de página dentro del conjunto de resultados paginado.",
            "required": false,
            "type": "integer"
          },
          {
            "name": "page_size",
            "in": "query",
            "description": "Número de resultados a devolver por página.",
            "required": false,
            "type": "integer"
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "required": [
                "count",
                "results"
              ],
              "type": "object",
              "properties": {
                "count": {
                  "type": "integer"
                },
                "next": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "previous": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "results": {
                  "type": "array",
                  "items": {
                    "$ref": "#/definitions/Lead"
                  }
                }
              }
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "post": {
        "operationId": "api_crm_leads_create",
        "description": "",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/LeadCreate"
            }
          }
        ],
        "responses": {
          "201": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/LeadCreate"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/crm/leads/my_day/": {
      "get": {
        "operationId": "api_crm_leads_my_day",
        "description": "GET /api/crm/leads/my_day/ — lo que el usuario tiene que atender hoy\n(plan_crm_flujo_2026-09, D3). Siempre acotado a sus propios leads,\nsea cual sea su rol: es la agenda personal, no una vista de supervision.",
        "parameters": [
          {
            "name": "etapa",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "fuente",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "tipo_interes",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "linea_negocio",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "asignado_a",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "fecha_from",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "fecha_to",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "etapa__in",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "recontacto_hasta",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "recontacto_desde",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "search",
            "in": "query",
            "description": "Un término de búsqueda.",
            "required": false,
            "type": "string"
          },
          {
            "name": "ordering",
            "in": "query",
            "description": "Qué campo usar para ordenar los resultados.",
            "required": false,
            "type": "string"
          },
          {
            "name": "page",
            "in": "query",
            "description": "Un número de página dentro del conjunto de resultados paginado.",
            "required": false,
            "type": "integer"
          },
          {
            "name": "page_size",
            "in": "query",
            "description": "Número de resultados a devolver por página.",
            "required": false,
            "type": "integer"
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "required": [
                "count",
                "results"
              ],
              "type": "object",
              "properties": {
                "count": {
                  "type": "integer"
                },
                "next": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "previous": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "results": {
                  "type": "array",
                  "items": {
                    "$ref": "#/definitions/LeadDetail"
                  }
                }
              }
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/crm/leads/{id}/": {
      "get": {
        "operationId": "api_crm_leads_read",
        "description": "",
        "parameters": [],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/LeadDetail"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "put": {
        "operationId": "api_crm_leads_update",
        "description": "",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/LeadCreate"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/LeadCreate"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "patch": {
        "operationId": "api_crm_leads_partial_update",
        "description": "",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/LeadCreate"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/LeadCreate"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "delete": {
        "operationId": "api_crm_leads_delete",
        "description": "",
        "parameters": [],
        "responses": {
          "204": {
            "description": ""
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "description": "Un valor de entero único que identifique este lead.",
          "required": true,
          "type": "integer"
        }
      ]
    },
    "/api/crm/leads/{id}/activities/": {
      "get": {
        "operationId": "api_crm_leads_activities",
        "description": "",
        "parameters": [],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/LeadDetail"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "description": "Un valor de entero único que identifique este lead.",
          "required": true,
          "type": "integer"
        }
      ]
    },
    "/api/crm/leads/{id}/add_activity/": {
      "post": {
        "operationId": "api_crm_leads_add_activity",
        "description": "",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/LeadDetail"
            }
          }
        ],
        "responses": {
          "201": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/LeadDetail"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "description": "Un valor de entero único que identifique este lead.",
          "required": true,
          "type": "integer"
        }
      ]
    },
    "/api/crm/leads/{id}/change_stage/": {
      "post": {
        "operationId": "api_crm_leads_change_stage",
        "description": "",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/LeadDetail"
            }
          }
        ],
        "responses": {
          "201": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/LeadDetail"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "description": "Un valor de entero único que identifique este lead.",
          "required": true,
          "type": "integer"
        }
      ]
    },
    "/api/crm/leads/{id}/checklist/": {
      "patch": {
        "operationId": "api_crm_leads_checklist",
        "description": "Transición de un ítem del checklist documental. Solo mesa de control\no admin. Cada decisión crea automáticamente la Activity trazable\n(REVISION_DOCUMENTAL / OBSERVACION_EXPEDIENTE) — sin doble captura.\nCuando el último ítem queda aprobado se registra APROBACION_DOC.",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/LeadDetail"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/LeadDetail"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "description": "Un valor de entero único que identifique este lead.",
          "required": true,
          "type": "integer"
        }
      ]
    },
    "/api/crm/leads/{id}/convert/": {
      "post": {
        "operationId": "api_crm_leads_convert",
        "description": "",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/LeadDetail"
            }
          }
        ],
        "responses": {
          "201": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/LeadDetail"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "description": "Un valor de entero único que identifique este lead.",
          "required": true,
          "type": "integer"
        }
      ]
    },
    "/api/crm/leads/{id}/quick_contact/": {
      "post": {
        "operationId": "api_crm_leads_quick_contact",
        "description": "Registra un contacto rápido (WhatsApp, llamada, etc.), actualiza fecha de recontacto\ny si el lead está en 'nuevo' y fue contactado/interesado, lo avanza automáticamente a 'contactado'.",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/LeadDetail"
            }
          }
        ],
        "responses": {
          "201": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/LeadDetail"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "description": "Un valor de entero único que identifique este lead.",
          "required": true,
          "type": "integer"
        }
      ]
    },
    "/api/crm/leads/{id}/radicar_documentos/": {
      "post": {
        "operationId": "api_crm_leads_radicar_documentos",
        "description": "El asesor comercial marca el expediente como radicado (documentos\ncompletos). Estampa fecha_radicacion_documentos, que ancla el SLA de\nmesa de control. Re-radicar tras una subsanación NO mueve la fecha\noriginal (el SLA histórico se conserva).",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/LeadDetail"
            }
          }
        ],
        "responses": {
          "201": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/LeadDetail"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "description": "Un valor de entero único que identifique este lead.",
          "required": true,
          "type": "integer"
        }
      ]
    },
    "/api/crm/opportunities/": {
      "get": {
        "operationId": "api_crm_opportunities_list",
        "description": "",
        "parameters": [
          {
            "name": "etapa",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "linea_negocio",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "asignado_a",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "fecha_from",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "fecha_to",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "search",
            "in": "query",
            "description": "Un término de búsqueda.",
            "required": false,
            "type": "string"
          },
          {
            "name": "ordering",
            "in": "query",
            "description": "Qué campo usar para ordenar los resultados.",
            "required": false,
            "type": "string"
          },
          {
            "name": "page",
            "in": "query",
            "description": "Un número de página dentro del conjunto de resultados paginado.",
            "required": false,
            "type": "integer"
          },
          {
            "name": "page_size",
            "in": "query",
            "description": "Número de resultados a devolver por página.",
            "required": false,
            "type": "integer"
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "required": [
                "count",
                "results"
              ],
              "type": "object",
              "properties": {
                "count": {
                  "type": "integer"
                },
                "next": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "previous": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "results": {
                  "type": "array",
                  "items": {
                    "$ref": "#/definitions/Opportunity"
                  }
                }
              }
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "post": {
        "operationId": "api_crm_opportunities_create",
        "description": "",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/Opportunity"
            }
          }
        ],
        "responses": {
          "201": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/Opportunity"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/crm/opportunities/{id}/": {
      "get": {
        "operationId": "api_crm_opportunities_read",
        "description": "",
        "parameters": [],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/Opportunity"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "put": {
        "operationId": "api_crm_opportunities_update",
        "description": "",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/Opportunity"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/Opportunity"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "patch": {
        "operationId": "api_crm_opportunities_partial_update",
        "description": "",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/Opportunity"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/Opportunity"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "delete": {
        "operationId": "api_crm_opportunities_delete",
        "description": "",
        "parameters": [],
        "responses": {
          "204": {
            "description": ""
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "description": "Un valor de entero único que identifique este opportunity.",
          "required": true,
          "type": "integer"
        }
      ]
    },
    "/api/crm/opportunities/{id}/close/": {
      "post": {
        "operationId": "api_crm_opportunities_close",
        "description": "",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/Opportunity"
            }
          }
        ],
        "responses": {
          "201": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/Opportunity"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "description": "Un valor de entero único que identifique este opportunity.",
          "required": true,
          "type": "integer"
        }
      ]
    },
    "/api/crm/prospects/": {
      "get": {
        "operationId": "api_crm_prospects_list",
        "description": "",
        "parameters": [
          {
            "name": "estado",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "campaign",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "asignado_a",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "entidad",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "ciudad",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "importacion",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "search",
            "in": "query",
            "description": "Un término de búsqueda.",
            "required": false,
            "type": "string"
          },
          {
            "name": "ordering",
            "in": "query",
            "description": "Qué campo usar para ordenar los resultados.",
            "required": false,
            "type": "string"
          },
          {
            "name": "page",
            "in": "query",
            "description": "Un número de página dentro del conjunto de resultados paginado.",
            "required": false,
            "type": "integer"
          },
          {
            "name": "page_size",
            "in": "query",
            "description": "Número de resultados a devolver por página.",
            "required": false,
            "type": "integer"
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "required": [
                "count",
                "results"
              ],
              "type": "object",
              "properties": {
                "count": {
                  "type": "integer"
                },
                "next": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "previous": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "results": {
                  "type": "array",
                  "items": {
                    "$ref": "#/definitions/Prospect"
                  }
                }
              }
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/crm/prospects/import/": {
      "get": {
        "operationId": "api_crm_prospects_import_list",
        "description": "POST /api/crm/prospects/import/ — multipart: file (.xlsx), nombre, entidad, ciudad.",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "consumes": [
          "multipart/form-data",
          "application/x-www-form-urlencoded"
        ],
        "tags": [
          "api"
        ]
      },
      "post": {
        "operationId": "api_crm_prospects_import_create",
        "description": "POST /api/crm/prospects/import/ — multipart: file (.xlsx), nombre, entidad, ciudad.",
        "parameters": [],
        "responses": {
          "201": {
            "description": ""
          }
        },
        "consumes": [
          "multipart/form-data",
          "application/x-www-form-urlencoded"
        ],
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/crm/prospects/my_today/": {
      "get": {
        "operationId": "api_crm_prospects_my_today",
        "description": "",
        "parameters": [
          {
            "name": "estado",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "campaign",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "asignado_a",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "entidad",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "ciudad",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "importacion",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "search",
            "in": "query",
            "description": "Un término de búsqueda.",
            "required": false,
            "type": "string"
          },
          {
            "name": "ordering",
            "in": "query",
            "description": "Qué campo usar para ordenar los resultados.",
            "required": false,
            "type": "string"
          },
          {
            "name": "page",
            "in": "query",
            "description": "Un número de página dentro del conjunto de resultados paginado.",
            "required": false,
            "type": "integer"
          },
          {
            "name": "page_size",
            "in": "query",
            "description": "Número de resultados a devolver por página.",
            "required": false,
            "type": "integer"
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "required": [
                "count",
                "results"
              ],
              "type": "object",
              "properties": {
                "count": {
                  "type": "integer"
                },
                "next": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "previous": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "results": {
                  "type": "array",
                  "items": {
                    "$ref": "#/definitions/Prospect"
                  }
                }
              }
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/crm/prospects/{id}/": {
      "get": {
        "operationId": "api_crm_prospects_read",
        "description": "",
        "parameters": [],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/Prospect"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "description": "Un valor de entero único que identifique este prospect.",
          "required": true,
          "type": "integer"
        }
      ]
    },
    "/api/crm/prospects/{id}/outcome/": {
      "post": {
        "operationId": "api_crm_prospects_outcome",
        "description": "Registra el resultado de un intento de contacto; 'interesado' crea el lead.",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/Prospect"
            }
          }
        ],
        "responses": {
          "201": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/Prospect"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "description": "Un valor de entero único que identifique este prospect.",
          "required": true,
          "type": "integer"
        }
      ]
    },
    "/api/data-policy/": {
      "get": {
        "operationId": "api_data-policy_list",
        "description": "GET /api/data-policy/ : parámetros públicos del consentimiento Habeas Data\n(URL y versión de la política, texto del checkbox y si es obligatorio).",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/discount-requests/": {
      "get": {
        "operationId": "api_discount-requests_list",
        "description": "ViewSet para gestionar solicitudes de aprobación de descuento enviadas por Cartera/Abogado.",
        "parameters": [
          {
            "name": "page",
            "in": "query",
            "description": "Un número de página dentro del conjunto de resultados paginado.",
            "required": false,
            "type": "integer"
          },
          {
            "name": "page_size",
            "in": "query",
            "description": "Número de resultados a devolver por página.",
            "required": false,
            "type": "integer"
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "required": [
                "count",
                "results"
              ],
              "type": "object",
              "properties": {
                "count": {
                  "type": "integer"
                },
                "next": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "previous": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "results": {
                  "type": "array",
                  "items": {
                    "$ref": "#/definitions/DiscountApprovalRequest"
                  }
                }
              }
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "post": {
        "operationId": "api_discount-requests_create",
        "description": "ViewSet para gestionar solicitudes de aprobación de descuento enviadas por Cartera/Abogado.",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/DiscountApprovalRequest"
            }
          }
        ],
        "responses": {
          "201": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/DiscountApprovalRequest"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/discount-requests/{id}/": {
      "get": {
        "operationId": "api_discount-requests_read",
        "description": "ViewSet para gestionar solicitudes de aprobación de descuento enviadas por Cartera/Abogado.",
        "parameters": [],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/DiscountApprovalRequest"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "put": {
        "operationId": "api_discount-requests_update",
        "description": "ViewSet para gestionar solicitudes de aprobación de descuento enviadas por Cartera/Abogado.",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/DiscountApprovalRequest"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/DiscountApprovalRequest"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "patch": {
        "operationId": "api_discount-requests_partial_update",
        "description": "ViewSet para gestionar solicitudes de aprobación de descuento enviadas por Cartera/Abogado.",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/DiscountApprovalRequest"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/DiscountApprovalRequest"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "delete": {
        "operationId": "api_discount-requests_delete",
        "description": "ViewSet para gestionar solicitudes de aprobación de descuento enviadas por Cartera/Abogado.",
        "parameters": [],
        "responses": {
          "204": {
            "description": ""
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "description": "Un valor de entero único que identifique este Solicitud de Aprobación de Descuento.",
          "required": true,
          "type": "integer"
        }
      ]
    },
    "/api/discount-requests/{id}/approve/": {
      "post": {
        "operationId": "api_discount-requests_approve",
        "description": "ViewSet para gestionar solicitudes de aprobación de descuento enviadas por Cartera/Abogado.",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/DiscountApprovalRequest"
            }
          }
        ],
        "responses": {
          "201": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/DiscountApprovalRequest"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "description": "Un valor de entero único que identifique este Solicitud de Aprobación de Descuento.",
          "required": true,
          "type": "integer"
        }
      ]
    },
    "/api/discount-requests/{id}/reject/": {
      "post": {
        "operationId": "api_discount-requests_reject",
        "description": "ViewSet para gestionar solicitudes de aprobación de descuento enviadas por Cartera/Abogado.",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/DiscountApprovalRequest"
            }
          }
        ],
        "responses": {
          "201": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/DiscountApprovalRequest"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "description": "Un valor de entero único que identifique este Solicitud de Aprobación de Descuento.",
          "required": true,
          "type": "integer"
        }
      ]
    },
    "/api/discount-scales/": {
      "get": {
        "operationId": "api_discount-scales_list",
        "description": "CRUD completo para que el Administrador gestione la matriz de escalas de descuento.",
        "parameters": [
          {
            "name": "page",
            "in": "query",
            "description": "Un número de página dentro del conjunto de resultados paginado.",
            "required": false,
            "type": "integer"
          },
          {
            "name": "page_size",
            "in": "query",
            "description": "Número de resultados a devolver por página.",
            "required": false,
            "type": "integer"
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "required": [
                "count",
                "results"
              ],
              "type": "object",
              "properties": {
                "count": {
                  "type": "integer"
                },
                "next": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "previous": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "results": {
                  "type": "array",
                  "items": {
                    "$ref": "#/definitions/DiscountScale"
                  }
                }
              }
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "post": {
        "operationId": "api_discount-scales_create",
        "description": "CRUD completo para que el Administrador gestione la matriz de escalas de descuento.",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/DiscountScale"
            }
          }
        ],
        "responses": {
          "201": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/DiscountScale"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/discount-scales/{id}/": {
      "get": {
        "operationId": "api_discount-scales_read",
        "description": "CRUD completo para que el Administrador gestione la matriz de escalas de descuento.",
        "parameters": [],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/DiscountScale"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "put": {
        "operationId": "api_discount-scales_update",
        "description": "CRUD completo para que el Administrador gestione la matriz de escalas de descuento.",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/DiscountScale"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/DiscountScale"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "patch": {
        "operationId": "api_discount-scales_partial_update",
        "description": "CRUD completo para que el Administrador gestione la matriz de escalas de descuento.",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/DiscountScale"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/DiscountScale"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "delete": {
        "operationId": "api_discount-scales_delete",
        "description": "CRUD completo para que el Administrador gestione la matriz de escalas de descuento.",
        "parameters": [],
        "responses": {
          "204": {
            "description": ""
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "description": "Un valor de entero único que identifique este Escala de Descuento.",
          "required": true,
          "type": "integer"
        }
      ]
    },
    "/api/executive-dashboard/": {
      "get": {
        "operationId": "api_executive-dashboard_list",
        "description": "Suite de Inteligencia Estratégica & BI Dashboard Unificado\nConsolida métricas gerenciales de AUM, Cartera Mora, CRM y Rendimiento Inmobiliario.\nGET /api/executive-dashboard/",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/feedback/": {
      "post": {
        "operationId": "api_feedback_create",
        "summary": "Burbuja de feedback (endpoint histórico, contrato compatible).",
        "description": "Recibe multipart `message`, `url`, `attachments[]` y, opcionalmente,\n`app`, `category`, `severity` y `capture` (JSON con contexto técnico).\nPersiste un `projects.FeedbackReport` y envía el correo de aviso a\nsettings.FEEDBACK_EMAIL_TO. Un fallo del correo no pierde el reporte.",
        "parameters": [],
        "responses": {
          "201": {
            "description": ""
          }
        },
        "consumes": [
          "multipart/form-data",
          "application/x-www-form-urlencoded"
        ],
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/forgot-password/": {
      "post": {
        "operationId": "api_forgot-password_create",
        "description": "Genera y envía una nueva contraseña al correo del usuario.",
        "parameters": [],
        "responses": {
          "201": {
            "description": ""
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/groups/": {
      "get": {
        "operationId": "api_groups_list",
        "summary": "ViewSet para grupos de Django",
        "description": "Permite gestionar grupos y sus permisos",
        "parameters": [
          {
            "name": "page",
            "in": "query",
            "description": "Un número de página dentro del conjunto de resultados paginado.",
            "required": false,
            "type": "integer"
          },
          {
            "name": "page_size",
            "in": "query",
            "description": "Número de resultados a devolver por página.",
            "required": false,
            "type": "integer"
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "required": [
                "count",
                "results"
              ],
              "type": "object",
              "properties": {
                "count": {
                  "type": "integer"
                },
                "next": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "previous": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "results": {
                  "type": "array",
                  "items": {
                    "$ref": "#/definitions/Group"
                  }
                }
              }
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "post": {
        "operationId": "api_groups_create",
        "summary": "ViewSet para grupos de Django",
        "description": "Permite gestionar grupos y sus permisos",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/Group"
            }
          }
        ],
        "responses": {
          "201": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/Group"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/groups/{id}/": {
      "get": {
        "operationId": "api_groups_read",
        "summary": "ViewSet para grupos de Django",
        "description": "Permite gestionar grupos y sus permisos",
        "parameters": [],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/Group"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "put": {
        "operationId": "api_groups_update",
        "summary": "ViewSet para grupos de Django",
        "description": "Permite gestionar grupos y sus permisos",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/Group"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/Group"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "patch": {
        "operationId": "api_groups_partial_update",
        "summary": "ViewSet para grupos de Django",
        "description": "Permite gestionar grupos y sus permisos",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/Group"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/Group"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "delete": {
        "operationId": "api_groups_delete",
        "summary": "ViewSet para grupos de Django",
        "description": "Permite gestionar grupos y sus permisos",
        "parameters": [],
        "responses": {
          "204": {
            "description": ""
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "description": "Un valor de entero único que identifique este grupo.",
          "required": true,
          "type": "integer"
        }
      ]
    },
    "/api/health/live/": {
      "get": {
        "operationId": "api_health_live_list",
        "description": "",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/health/ready/": {
      "get": {
        "operationId": "api_health_ready_list",
        "description": "",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/inquiries/": {
      "get": {
        "operationId": "api_inquiries_list",
        "description": "",
        "parameters": [
          {
            "name": "page",
            "in": "query",
            "description": "Un número de página dentro del conjunto de resultados paginado.",
            "required": false,
            "type": "integer"
          },
          {
            "name": "page_size",
            "in": "query",
            "description": "Número de resultados a devolver por página.",
            "required": false,
            "type": "integer"
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "required": [
                "count",
                "results"
              ],
              "type": "object",
              "properties": {
                "count": {
                  "type": "integer"
                },
                "next": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "previous": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "results": {
                  "type": "array",
                  "items": {
                    "$ref": "#/definitions/Inquiry"
                  }
                }
              }
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "post": {
        "operationId": "api_inquiries_create",
        "description": "",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/Inquiry"
            }
          }
        ],
        "responses": {
          "201": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/Inquiry"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/inquiries/{id}/": {
      "get": {
        "operationId": "api_inquiries_read",
        "description": "",
        "parameters": [],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/Inquiry"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "put": {
        "operationId": "api_inquiries_update",
        "description": "",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/Inquiry"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/Inquiry"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "patch": {
        "operationId": "api_inquiries_partial_update",
        "description": "",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/Inquiry"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/Inquiry"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "delete": {
        "operationId": "api_inquiries_delete",
        "description": "",
        "parameters": [],
        "responses": {
          "204": {
            "description": ""
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "description": "Un valor de entero único que identifique este Solicitud (Deprecado).",
          "required": true,
          "type": "integer"
        }
      ]
    },
    "/api/investors/": {
      "get": {
        "operationId": "api_investors_list",
        "description": "CRUD de inversionistas con permisos basados en perfil",
        "parameters": [
          {
            "name": "page",
            "in": "query",
            "description": "Un número de página dentro del conjunto de resultados paginado.",
            "required": false,
            "type": "integer"
          },
          {
            "name": "page_size",
            "in": "query",
            "description": "Número de resultados a devolver por página.",
            "required": false,
            "type": "integer"
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "required": [
                "count",
                "results"
              ],
              "type": "object",
              "properties": {
                "count": {
                  "type": "integer"
                },
                "next": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "previous": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "results": {
                  "type": "array",
                  "items": {
                    "$ref": "#/definitions/Investor"
                  }
                }
              }
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "post": {
        "operationId": "api_investors_create",
        "description": "CRUD de inversionistas con permisos basados en perfil",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/Investor"
            }
          }
        ],
        "responses": {
          "201": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/Investor"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/investors/churn_risk/": {
      "get": {
        "operationId": "api_investors_churn_risk",
        "description": "Análisis predictivo de riesgo de fuga de inversionistas.\nGET /api/investors/churn_risk/",
        "parameters": [
          {
            "name": "page",
            "in": "query",
            "description": "Un número de página dentro del conjunto de resultados paginado.",
            "required": false,
            "type": "integer"
          },
          {
            "name": "page_size",
            "in": "query",
            "description": "Número de resultados a devolver por página.",
            "required": false,
            "type": "integer"
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "required": [
                "count",
                "results"
              ],
              "type": "object",
              "properties": {
                "count": {
                  "type": "integer"
                },
                "next": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "previous": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "results": {
                  "type": "array",
                  "items": {
                    "$ref": "#/definitions/Investor"
                  }
                }
              }
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/investors/client_distribution/": {
      "get": {
        "operationId": "api_investors_client_distribution",
        "description": "Distribución de inversión por cliente (Top 6)\nPara gráfica de dona/pie en dashboard",
        "parameters": [
          {
            "name": "page",
            "in": "query",
            "description": "Un número de página dentro del conjunto de resultados paginado.",
            "required": false,
            "type": "integer"
          },
          {
            "name": "page_size",
            "in": "query",
            "description": "Número de resultados a devolver por página.",
            "required": false,
            "type": "integer"
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "required": [
                "count",
                "results"
              ],
              "type": "object",
              "properties": {
                "count": {
                  "type": "integer"
                },
                "next": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "previous": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "results": {
                  "type": "array",
                  "items": {
                    "$ref": "#/definitions/Investor"
                  }
                }
              }
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/investors/dashboard_stats/": {
      "get": {
        "operationId": "api_investors_dashboard_stats",
        "description": "Retorna estadísticas del dashboard para el inversionista autenticado.\nUsa Profile para identificar al inversionista en lugar de username.",
        "parameters": [
          {
            "name": "page",
            "in": "query",
            "description": "Un número de página dentro del conjunto de resultados paginado.",
            "required": false,
            "type": "integer"
          },
          {
            "name": "page_size",
            "in": "query",
            "description": "Número de resultados a devolver por página.",
            "required": false,
            "type": "integer"
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "required": [
                "count",
                "results"
              ],
              "type": "object",
              "properties": {
                "count": {
                  "type": "integer"
                },
                "next": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "previous": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "results": {
                  "type": "array",
                  "items": {
                    "$ref": "#/definitions/Investor"
                  }
                }
              }
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/investors/investment_evolution/": {
      "get": {
        "operationId": "api_investors_investment_evolution",
        "description": "Evolución mensual de inversiones últimos 12 meses\nPara gráfica de línea en dashboard",
        "parameters": [
          {
            "name": "page",
            "in": "query",
            "description": "Un número de página dentro del conjunto de resultados paginado.",
            "required": false,
            "type": "integer"
          },
          {
            "name": "page_size",
            "in": "query",
            "description": "Número de resultados a devolver por página.",
            "required": false,
            "type": "integer"
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "required": [
                "count",
                "results"
              ],
              "type": "object",
              "properties": {
                "count": {
                  "type": "integer"
                },
                "next": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "previous": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "results": {
                  "type": "array",
                  "items": {
                    "$ref": "#/definitions/Investor"
                  }
                }
              }
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/investors/liquidation_report/": {
      "get": {
        "operationId": "api_investors_liquidation_report",
        "summary": "Genera y descarga el reporte de liquidación de inversiones en Excel.",
        "description": "GET /api/investors/liquidation_report/\nQuery params:\n- inicio: Fecha de inicio (YYYY-MM-DD)\n- fin: Fecha de fin (YYYY-MM-DD)\n- periodo: 'semana' | 'mes' | 'custom' (default: semana actual)",
        "parameters": [
          {
            "name": "page",
            "in": "query",
            "description": "Un número de página dentro del conjunto de resultados paginado.",
            "required": false,
            "type": "integer"
          },
          {
            "name": "page_size",
            "in": "query",
            "description": "Número de resultados a devolver por página.",
            "required": false,
            "type": "integer"
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "required": [
                "count",
                "results"
              ],
              "type": "object",
              "properties": {
                "count": {
                  "type": "integer"
                },
                "next": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "previous": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "results": {
                  "type": "array",
                  "items": {
                    "$ref": "#/definitions/Investor"
                  }
                }
              }
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/investors/my_contract/{no_contrato}/": {
      "get": {
        "operationId": "api_investors_my_contract_detail",
        "description": "Retorna el detalle de un contrato específico SOLO si pertenece al inversionista autenticado.\nValidación de seguridad para prevenir acceso no autorizado.\n\nGET /api/investors/my_contract/{no_contrato}/",
        "parameters": [
          {
            "name": "page",
            "in": "query",
            "description": "Un número de página dentro del conjunto de resultados paginado.",
            "required": false,
            "type": "integer"
          },
          {
            "name": "page_size",
            "in": "query",
            "description": "Número de resultados a devolver por página.",
            "required": false,
            "type": "integer"
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "required": [
                "count",
                "results"
              ],
              "type": "object",
              "properties": {
                "count": {
                  "type": "integer"
                },
                "next": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "previous": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "results": {
                  "type": "array",
                  "items": {
                    "$ref": "#/definitions/Investor"
                  }
                }
              }
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": [
        {
          "name": "no_contrato",
          "in": "path",
          "required": true,
          "type": "string"
        }
      ]
    },
    "/api/investors/my_contracts/": {
      "get": {
        "operationId": "api_investors_my_contracts",
        "description": "Retorna los contratos donde participa el inversionista autenticado.\nNO muestra información del cliente.\nIncluye TRI, retornado, pendiente_retorno, transacciones.\n\nGET /api/investors/my_contracts/",
        "parameters": [
          {
            "name": "page",
            "in": "query",
            "description": "Un número de página dentro del conjunto de resultados paginado.",
            "required": false,
            "type": "integer"
          },
          {
            "name": "page_size",
            "in": "query",
            "description": "Número de resultados a devolver por página.",
            "required": false,
            "type": "integer"
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "required": [
                "count",
                "results"
              ],
              "type": "object",
              "properties": {
                "count": {
                  "type": "integer"
                },
                "next": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "previous": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "results": {
                  "type": "array",
                  "items": {
                    "$ref": "#/definitions/Investor"
                  }
                }
              }
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/investors/my_requests/": {
      "get": {
        "operationId": "api_investors_my_requests",
        "summary": "Retorna todas las solicitudes del inversionista (inversiones y retiros).\nIncluye paginación y filtros.",
        "description": "GET /api/investors/my_requests/\nQuery params:\n- page: número de página (default 1)\n- page_size: tamaño de página (default 20)\n- status: filtro por estado (new, pending, completed, cancelled)\n- request_type: filtro por tipo (withdrawal, investment)",
        "parameters": [
          {
            "name": "page",
            "in": "query",
            "description": "Un número de página dentro del conjunto de resultados paginado.",
            "required": false,
            "type": "integer"
          },
          {
            "name": "page_size",
            "in": "query",
            "description": "Número de resultados a devolver por página.",
            "required": false,
            "type": "integer"
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "required": [
                "count",
                "results"
              ],
              "type": "object",
              "properties": {
                "count": {
                  "type": "integer"
                },
                "next": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "previous": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "results": {
                  "type": "array",
                  "items": {
                    "$ref": "#/definitions/Investor"
                  }
                }
              }
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/investors/my_transactions/": {
      "get": {
        "operationId": "api_investors_my_transactions",
        "description": "Retorna las transacciones del inversionista autenticado.\nIncluye paginación y filtros.\nNO muestra información del cliente.\n\nGET /api/investors/my_transactions/\nQuery params:\n- page: número de página (default 1)\n- page_size: tamaño de página (default 20)\n- tipo: filtro por tipo (deposito, rendimiento, retiro, inversion)",
        "parameters": [
          {
            "name": "page",
            "in": "query",
            "description": "Un número de página dentro del conjunto de resultados paginado.",
            "required": false,
            "type": "integer"
          },
          {
            "name": "page_size",
            "in": "query",
            "description": "Número de resultados a devolver por página.",
            "required": false,
            "type": "integer"
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "required": [
                "count",
                "results"
              ],
              "type": "object",
              "properties": {
                "count": {
                  "type": "integer"
                },
                "next": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "previous": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "results": {
                  "type": "array",
                  "items": {
                    "$ref": "#/definitions/Investor"
                  }
                }
              }
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/investors/my_withdrawal_requests/": {
      "get": {
        "operationId": "api_investors_my_withdrawal_requests",
        "summary": "Retorna las solicitudes de retiro del inversionista.\nIncluye paginación y filtros.",
        "description": "GET /api/investors/my_withdrawal_requests/\nQuery params:\n- page: número de página (default 1)\n- page_size: tamaño de página (default 20)\n- status: filtro por estado (new, pending, completed, cancelled)",
        "parameters": [
          {
            "name": "page",
            "in": "query",
            "description": "Un número de página dentro del conjunto de resultados paginado.",
            "required": false,
            "type": "integer"
          },
          {
            "name": "page_size",
            "in": "query",
            "description": "Número de resultados a devolver por página.",
            "required": false,
            "type": "integer"
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "required": [
                "count",
                "results"
              ],
              "type": "object",
              "properties": {
                "count": {
                  "type": "integer"
                },
                "next": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "previous": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "results": {
                  "type": "array",
                  "items": {
                    "$ref": "#/definitions/Investor"
                  }
                }
              }
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/investors/profile/": {
      "get": {
        "operationId": "api_investors_profile_read",
        "description": "",
        "parameters": [
          {
            "name": "page",
            "in": "query",
            "description": "Un número de página dentro del conjunto de resultados paginado.",
            "required": false,
            "type": "integer"
          },
          {
            "name": "page_size",
            "in": "query",
            "description": "Número de resultados a devolver por página.",
            "required": false,
            "type": "integer"
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "required": [
                "count",
                "results"
              ],
              "type": "object",
              "properties": {
                "count": {
                  "type": "integer"
                },
                "next": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "previous": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "results": {
                  "type": "array",
                  "items": {
                    "$ref": "#/definitions/Investor"
                  }
                }
              }
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "patch": {
        "operationId": "api_investors_profile_partial_update",
        "description": "",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/Investor"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/Investor"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/investors/request_investment/": {
      "post": {
        "operationId": "api_investors_request_investment",
        "summary": "Solicita realizar una nueva inversión.\nCrea un ServiceRequest tipo 'investment'.",
        "description": "POST /api/investors/request_investment/",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/Investor"
            }
          }
        ],
        "responses": {
          "201": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/Investor"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/investors/request_withdrawal/": {
      "post": {
        "operationId": "api_investors_request_withdrawal",
        "summary": "Solicita un retiro de capital.\nValida que el monto no exceda el disponible.\nCrea un ServiceRequest tipo 'withdrawal'.",
        "description": "POST /api/investors/request_withdrawal/",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/Investor"
            }
          }
        ],
        "responses": {
          "201": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/Investor"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/investors/simulador/": {
      "post": {
        "operationId": "api_investors_simulador_inversion",
        "description": "Simulador de Inversión y Proyección de Rendimientos Compuestos.\nPOST /api/investors/simulador/",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/Investor"
            }
          }
        ],
        "responses": {
          "201": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/Investor"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/investors/{id_inversionista}/": {
      "get": {
        "operationId": "api_investors_read",
        "description": "CRUD de inversionistas con permisos basados en perfil",
        "parameters": [],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/Investor"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "put": {
        "operationId": "api_investors_update",
        "description": "CRUD de inversionistas con permisos basados en perfil",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/Investor"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/Investor"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "patch": {
        "operationId": "api_investors_partial_update",
        "description": "CRUD de inversionistas con permisos basados en perfil",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/Investor"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/Investor"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "delete": {
        "operationId": "api_investors_delete",
        "description": "CRUD de inversionistas con permisos basados en perfil",
        "parameters": [],
        "responses": {
          "204": {
            "description": ""
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": [
        {
          "name": "id_inversionista",
          "in": "path",
          "description": "Un valor único que identifique este investor.",
          "required": true,
          "type": "integer"
        }
      ]
    },
    "/api/investors/{id_inversionista}/certificado_tributario/": {
      "get": {
        "operationId": "api_investors_certificado_tributario",
        "description": "Descarga o genera el Certificado de Rendimientos Financieros y Retención en la Fuente.\nGET /api/investors/{id}/certificado_tributario/?year=2025",
        "parameters": [],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/Investor"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": [
        {
          "name": "id_inversionista",
          "in": "path",
          "description": "Un valor único que identifique este investor.",
          "required": true,
          "type": "integer"
        }
      ]
    },
    "/api/investors_detail/": {
      "get": {
        "operationId": "api_investors_detail_list",
        "description": "Vista detallada de inversionista con contratos y transacciones anidadas",
        "parameters": [
          {
            "name": "page",
            "in": "query",
            "description": "Un número de página dentro del conjunto de resultados paginado.",
            "required": false,
            "type": "integer"
          },
          {
            "name": "page_size",
            "in": "query",
            "description": "Número de resultados a devolver por página.",
            "required": false,
            "type": "integer"
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "required": [
                "count",
                "results"
              ],
              "type": "object",
              "properties": {
                "count": {
                  "type": "integer"
                },
                "next": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "previous": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "results": {
                  "type": "array",
                  "items": {
                    "$ref": "#/definitions/InvestorDetailSerializer"
                  }
                }
              }
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "post": {
        "operationId": "api_investors_detail_create",
        "description": "Vista detallada de inversionista con contratos y transacciones anidadas",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/InvestorDetailSerializer"
            }
          }
        ],
        "responses": {
          "201": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/InvestorDetailSerializer"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/investors_detail/{id_inversionista}/": {
      "get": {
        "operationId": "api_investors_detail_read",
        "description": "Vista detallada de inversionista con contratos y transacciones anidadas",
        "parameters": [],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/InvestorDetailSerializer"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "put": {
        "operationId": "api_investors_detail_update",
        "description": "Vista detallada de inversionista con contratos y transacciones anidadas",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/InvestorDetailSerializer"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/InvestorDetailSerializer"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "patch": {
        "operationId": "api_investors_detail_partial_update",
        "description": "Vista detallada de inversionista con contratos y transacciones anidadas",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/InvestorDetailSerializer"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/InvestorDetailSerializer"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "delete": {
        "operationId": "api_investors_detail_delete",
        "description": "Vista detallada de inversionista con contratos y transacciones anidadas",
        "parameters": [],
        "responses": {
          "204": {
            "description": ""
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": [
        {
          "name": "id_inversionista",
          "in": "path",
          "description": "Un valor único que identifique este investor.",
          "required": true,
          "type": "integer"
        }
      ]
    },
    "/api/legal/cases/": {
      "get": {
        "operationId": "api_legal_cases_list",
        "description": "API endpoint para gestión de Casos Jurídicos.\nImplementa Row-Level Security:\n- Admin: Ve todos los casos\n- Firma: Solo casos de su firma\n- Independiente: Solo casos asignados a él",
        "parameters": [
          {
            "name": "search",
            "in": "query",
            "description": "Un término de búsqueda.",
            "required": false,
            "type": "string"
          },
          {
            "name": "ordering",
            "in": "query",
            "description": "Qué campo usar para ordenar los resultados.",
            "required": false,
            "type": "string"
          },
          {
            "name": "page",
            "in": "query",
            "description": "Un número de página dentro del conjunto de resultados paginado.",
            "required": false,
            "type": "integer"
          },
          {
            "name": "page_size",
            "in": "query",
            "description": "Número de resultados a devolver por página.",
            "required": false,
            "type": "integer"
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "required": [
                "count",
                "results"
              ],
              "type": "object",
              "properties": {
                "count": {
                  "type": "integer"
                },
                "next": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "previous": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "results": {
                  "type": "array",
                  "items": {
                    "$ref": "#/definitions/LegalCaseList"
                  }
                }
              }
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "post": {
        "operationId": "api_legal_cases_create",
        "description": "API endpoint para gestión de Casos Jurídicos.\nImplementa Row-Level Security:\n- Admin: Ve todos los casos\n- Firma: Solo casos de su firma\n- Independiente: Solo casos asignados a él",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/LegalCaseCreate"
            }
          }
        ],
        "responses": {
          "201": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/LegalCaseCreate"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/legal/cases/bulk_assign/": {
      "post": {
        "operationId": "api_legal_cases_bulk_assign",
        "description": "Asigna múltiples casos a una firma o gestor.",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/LegalCaseDetail"
            }
          }
        ],
        "responses": {
          "201": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/LegalCaseDetail"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/legal/cases/dashboard_stats/": {
      "get": {
        "operationId": "api_legal_cases_dashboard_stats",
        "description": "Estadísticas para el dashboard de supervisión.",
        "parameters": [
          {
            "name": "search",
            "in": "query",
            "description": "Un término de búsqueda.",
            "required": false,
            "type": "string"
          },
          {
            "name": "ordering",
            "in": "query",
            "description": "Qué campo usar para ordenar los resultados.",
            "required": false,
            "type": "string"
          },
          {
            "name": "page",
            "in": "query",
            "description": "Un número de página dentro del conjunto de resultados paginado.",
            "required": false,
            "type": "integer"
          },
          {
            "name": "page_size",
            "in": "query",
            "description": "Número de resultados a devolver por página.",
            "required": false,
            "type": "integer"
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "required": [
                "count",
                "results"
              ],
              "type": "object",
              "properties": {
                "count": {
                  "type": "integer"
                },
                "next": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "previous": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "results": {
                  "type": "array",
                  "items": {
                    "$ref": "#/definitions/LegalCaseDetail"
                  }
                }
              }
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/legal/cases/export_xlsx/": {
      "get": {
        "operationId": "api_legal_cases_export_xlsx",
        "description": "Genera un archivo Excel (.xlsx) con todos los casos y su información asociada.\nRespeta Row-Level Security: cada usuario solo exporta los casos que puede ver.",
        "parameters": [
          {
            "name": "search",
            "in": "query",
            "description": "Un término de búsqueda.",
            "required": false,
            "type": "string"
          },
          {
            "name": "ordering",
            "in": "query",
            "description": "Qué campo usar para ordenar los resultados.",
            "required": false,
            "type": "string"
          },
          {
            "name": "page",
            "in": "query",
            "description": "Un número de página dentro del conjunto de resultados paginado.",
            "required": false,
            "type": "integer"
          },
          {
            "name": "page_size",
            "in": "query",
            "description": "Número de resultados a devolver por página.",
            "required": false,
            "type": "integer"
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "required": [
                "count",
                "results"
              ],
              "type": "object",
              "properties": {
                "count": {
                  "type": "integer"
                },
                "next": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "previous": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "results": {
                  "type": "array",
                  "items": {
                    "$ref": "#/definitions/LegalCaseDetail"
                  }
                }
              }
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/legal/cases/import/execute/": {
      "post": {
        "operationId": "api_legal_cases_import_import_execute",
        "description": "Ejecuta la importación de contratos legacy desde CSV.",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/LegalCaseDetail"
            }
          }
        ],
        "responses": {
          "201": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/LegalCaseDetail"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/legal/cases/import/template/": {
      "get": {
        "operationId": "api_legal_cases_import_import_template",
        "description": "Retorna un archivo Excel (.xlsx) template para importación de cartera.",
        "parameters": [
          {
            "name": "search",
            "in": "query",
            "description": "Un término de búsqueda.",
            "required": false,
            "type": "string"
          },
          {
            "name": "ordering",
            "in": "query",
            "description": "Qué campo usar para ordenar los resultados.",
            "required": false,
            "type": "string"
          },
          {
            "name": "page",
            "in": "query",
            "description": "Un número de página dentro del conjunto de resultados paginado.",
            "required": false,
            "type": "integer"
          },
          {
            "name": "page_size",
            "in": "query",
            "description": "Número de resultados a devolver por página.",
            "required": false,
            "type": "integer"
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "required": [
                "count",
                "results"
              ],
              "type": "object",
              "properties": {
                "count": {
                  "type": "integer"
                },
                "next": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "previous": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "results": {
                  "type": "array",
                  "items": {
                    "$ref": "#/definitions/LegalCaseDetail"
                  }
                }
              }
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/legal/cases/import/validate/": {
      "post": {
        "operationId": "api_legal_cases_import_import_validate",
        "description": "Valida un archivo CSV para importación de contratos legacy.\nRetorna filas válidas e inválidas sin ejecutar la importación.",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/LegalCaseDetail"
            }
          }
        ],
        "responses": {
          "201": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/LegalCaseDetail"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/legal/cases/notify/": {
      "post": {
        "operationId": "api_legal_cases_notify",
        "description": "Envía notificación manual a un usuario.",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/LegalCaseDetail"
            }
          }
        ],
        "responses": {
          "201": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/LegalCaseDetail"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/legal/cases/rebalancear_cartera/": {
      "post": {
        "operationId": "api_legal_cases_rebalancear_cartera",
        "description": "Rebalancea e iguala la distribución de casos sin firma asignada.\nPOST /api/legal/cases/rebalancear_cartera/",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/LegalCaseDetail"
            }
          }
        ],
        "responses": {
          "201": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/LegalCaseDetail"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/legal/cases/{id}/": {
      "get": {
        "operationId": "api_legal_cases_read",
        "description": "API endpoint para gestión de Casos Jurídicos.\nImplementa Row-Level Security:\n- Admin: Ve todos los casos\n- Firma: Solo casos de su firma\n- Independiente: Solo casos asignados a él",
        "parameters": [],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/LegalCaseDetail"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "put": {
        "operationId": "api_legal_cases_update",
        "description": "API endpoint para gestión de Casos Jurídicos.\nImplementa Row-Level Security:\n- Admin: Ve todos los casos\n- Firma: Solo casos de su firma\n- Independiente: Solo casos asignados a él",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/LegalCaseDetail"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/LegalCaseDetail"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "patch": {
        "operationId": "api_legal_cases_partial_update",
        "description": "API endpoint para gestión de Casos Jurídicos.\nImplementa Row-Level Security:\n- Admin: Ve todos los casos\n- Firma: Solo casos de su firma\n- Independiente: Solo casos asignados a él",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/LegalCaseDetail"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/LegalCaseDetail"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "delete": {
        "operationId": "api_legal_cases_delete",
        "description": "API endpoint para gestión de Casos Jurídicos.\nImplementa Row-Level Security:\n- Admin: Ve todos los casos\n- Firma: Solo casos de su firma\n- Independiente: Solo casos asignados a él",
        "parameters": [],
        "responses": {
          "204": {
            "description": ""
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "required": true,
          "type": "string"
        }
      ]
    },
    "/api/legal/cases/{id}/assign/": {
      "post": {
        "operationId": "api_legal_cases_assign",
        "description": "Asigna el caso a una firma o gestor.",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/LegalCaseDetail"
            }
          }
        ],
        "responses": {
          "201": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/LegalCaseDetail"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "required": true,
          "type": "string"
        }
      ]
    },
    "/api/legal/cases/{id}/change_stage/": {
      "post": {
        "operationId": "api_legal_cases_change_stage",
        "description": "Cambia la etapa procesal del caso.",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/LegalCaseDetail"
            }
          }
        ],
        "responses": {
          "201": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/LegalCaseDetail"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "required": true,
          "type": "string"
        }
      ]
    },
    "/api/legal/cases/{id}/iniciar_bot_cobranza/": {
      "post": {
        "operationId": "api_legal_cases_iniciar_bot_cobranza",
        "description": "Ejecuta el Agente IA Conversacional de Cobranza Persuasiva (WhatsApp Bot Engine).\nPOST /api/legal/cases/{id}/iniciar_bot_cobranza/",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/LegalCaseDetail"
            }
          }
        ],
        "responses": {
          "201": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/LegalCaseDetail"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "required": true,
          "type": "string"
        }
      ]
    },
    "/api/legal/cases/{id}/register_contact/": {
      "post": {
        "operationId": "api_legal_cases_register_contact",
        "description": "Registra una gestión persuasiva sobre un caso.\nCrea un registro de PersuasiveManagement y opcionalmente un comentario en bitácora.",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/LegalCaseDetail"
            }
          }
        ],
        "responses": {
          "201": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/LegalCaseDetail"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "required": true,
          "type": "string"
        }
      ]
    },
    "/api/legal/cases/{id}/revert_transfer/": {
      "post": {
        "operationId": "api_legal_cases_revert_transfer",
        "description": "Revierte un traslado a jurídico accidental.",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/LegalCaseDetail"
            }
          }
        ],
        "responses": {
          "201": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/LegalCaseDetail"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "required": true,
          "type": "string"
        }
      ]
    },
    "/api/legal/cases/{id}/schedule_meeting/": {
      "post": {
        "operationId": "api_legal_cases_schedule_meeting",
        "description": "Agenda una cita virtual en Google Calendar con Meet link para un caso jurídico.\nPOST /api/legal/cases/{id}/schedule_meeting/",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/LegalCaseDetail"
            }
          }
        ],
        "responses": {
          "201": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/LegalCaseDetail"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "required": true,
          "type": "string"
        }
      ]
    },
    "/api/legal/comments/": {
      "get": {
        "operationId": "api_legal_comments_list",
        "description": "API endpoint para comentarios/bitácora del caso.",
        "parameters": [
          {
            "name": "ordering",
            "in": "query",
            "description": "Qué campo usar para ordenar los resultados.",
            "required": false,
            "type": "string"
          },
          {
            "name": "page",
            "in": "query",
            "description": "Un número de página dentro del conjunto de resultados paginado.",
            "required": false,
            "type": "integer"
          },
          {
            "name": "page_size",
            "in": "query",
            "description": "Número de resultados a devolver por página.",
            "required": false,
            "type": "integer"
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "required": [
                "count",
                "results"
              ],
              "type": "object",
              "properties": {
                "count": {
                  "type": "integer"
                },
                "next": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "previous": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "results": {
                  "type": "array",
                  "items": {
                    "$ref": "#/definitions/LegalComment"
                  }
                }
              }
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "post": {
        "operationId": "api_legal_comments_create",
        "description": "API endpoint para comentarios/bitácora del caso.",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/LegalComment"
            }
          }
        ],
        "responses": {
          "201": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/LegalComment"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/legal/comments/{id}/": {
      "get": {
        "operationId": "api_legal_comments_read",
        "description": "API endpoint para comentarios/bitácora del caso.",
        "parameters": [],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/LegalComment"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "put": {
        "operationId": "api_legal_comments_update",
        "description": "API endpoint para comentarios/bitácora del caso.",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/LegalComment"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/LegalComment"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "patch": {
        "operationId": "api_legal_comments_partial_update",
        "description": "API endpoint para comentarios/bitácora del caso.",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/LegalComment"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/LegalComment"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "delete": {
        "operationId": "api_legal_comments_delete",
        "description": "API endpoint para comentarios/bitácora del caso.",
        "parameters": [],
        "responses": {
          "204": {
            "description": ""
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "required": true,
          "type": "string"
        }
      ]
    },
    "/api/legal/documents/": {
      "get": {
        "operationId": "api_legal_documents_list",
        "description": "API endpoint para documentos del expediente.",
        "parameters": [
          {
            "name": "page",
            "in": "query",
            "description": "Un número de página dentro del conjunto de resultados paginado.",
            "required": false,
            "type": "integer"
          },
          {
            "name": "page_size",
            "in": "query",
            "description": "Número de resultados a devolver por página.",
            "required": false,
            "type": "integer"
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "required": [
                "count",
                "results"
              ],
              "type": "object",
              "properties": {
                "count": {
                  "type": "integer"
                },
                "next": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "previous": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "results": {
                  "type": "array",
                  "items": {
                    "$ref": "#/definitions/LegalDocument"
                  }
                }
              }
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "post": {
        "operationId": "api_legal_documents_create",
        "description": "API endpoint para documentos del expediente.",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/LegalDocument"
            }
          }
        ],
        "responses": {
          "201": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/LegalDocument"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/legal/documents/{id}/": {
      "get": {
        "operationId": "api_legal_documents_read",
        "description": "API endpoint para documentos del expediente.",
        "parameters": [],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/LegalDocument"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "put": {
        "operationId": "api_legal_documents_update",
        "description": "API endpoint para documentos del expediente.",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/LegalDocument"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/LegalDocument"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "patch": {
        "operationId": "api_legal_documents_partial_update",
        "description": "API endpoint para documentos del expediente.",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/LegalDocument"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/LegalDocument"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "delete": {
        "operationId": "api_legal_documents_delete",
        "description": "API endpoint para documentos del expediente.",
        "parameters": [],
        "responses": {
          "204": {
            "description": ""
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "required": true,
          "type": "string"
        }
      ]
    },
    "/api/legal/firms/": {
      "get": {
        "operationId": "api_legal_firms_list",
        "description": "API endpoint para gestión de Firmas Jurídicas.\nSolo accesible por Administradores.",
        "parameters": [
          {
            "name": "search",
            "in": "query",
            "description": "Un término de búsqueda.",
            "required": false,
            "type": "string"
          },
          {
            "name": "ordering",
            "in": "query",
            "description": "Qué campo usar para ordenar los resultados.",
            "required": false,
            "type": "string"
          },
          {
            "name": "page",
            "in": "query",
            "description": "Un número de página dentro del conjunto de resultados paginado.",
            "required": false,
            "type": "integer"
          },
          {
            "name": "page_size",
            "in": "query",
            "description": "Número de resultados a devolver por página.",
            "required": false,
            "type": "integer"
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "required": [
                "count",
                "results"
              ],
              "type": "object",
              "properties": {
                "count": {
                  "type": "integer"
                },
                "next": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "previous": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "results": {
                  "type": "array",
                  "items": {
                    "$ref": "#/definitions/LegalFirm"
                  }
                }
              }
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "post": {
        "operationId": "api_legal_firms_create",
        "description": "API endpoint para gestión de Firmas Jurídicas.\nSolo accesible por Administradores.",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/LegalFirm"
            }
          }
        ],
        "responses": {
          "201": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/LegalFirm"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/legal/firms/dropdown/": {
      "get": {
        "operationId": "api_legal_firms_dropdown",
        "description": "Retorna lista mínima para dropdowns.",
        "parameters": [
          {
            "name": "search",
            "in": "query",
            "description": "Un término de búsqueda.",
            "required": false,
            "type": "string"
          },
          {
            "name": "ordering",
            "in": "query",
            "description": "Qué campo usar para ordenar los resultados.",
            "required": false,
            "type": "string"
          },
          {
            "name": "page",
            "in": "query",
            "description": "Un número de página dentro del conjunto de resultados paginado.",
            "required": false,
            "type": "integer"
          },
          {
            "name": "page_size",
            "in": "query",
            "description": "Número de resultados a devolver por página.",
            "required": false,
            "type": "integer"
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "required": [
                "count",
                "results"
              ],
              "type": "object",
              "properties": {
                "count": {
                  "type": "integer"
                },
                "next": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "previous": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "results": {
                  "type": "array",
                  "items": {
                    "$ref": "#/definitions/LegalFirm"
                  }
                }
              }
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/legal/firms/{id}/": {
      "get": {
        "operationId": "api_legal_firms_read",
        "description": "API endpoint para gestión de Firmas Jurídicas.\nSolo accesible por Administradores.",
        "parameters": [],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/LegalFirm"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "put": {
        "operationId": "api_legal_firms_update",
        "description": "API endpoint para gestión de Firmas Jurídicas.\nSolo accesible por Administradores.",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/LegalFirm"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/LegalFirm"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "patch": {
        "operationId": "api_legal_firms_partial_update",
        "description": "API endpoint para gestión de Firmas Jurídicas.\nSolo accesible por Administradores.",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/LegalFirm"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/LegalFirm"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "delete": {
        "operationId": "api_legal_firms_delete",
        "description": "API endpoint para gestión de Firmas Jurídicas.\nSolo accesible por Administradores.",
        "parameters": [],
        "responses": {
          "204": {
            "description": ""
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "description": "Un valor de entero único que identifique este Firma Jurídica.",
          "required": true,
          "type": "integer"
        }
      ]
    },
    "/api/legal/firms/{id}/liquidation_report/": {
      "get": {
        "operationId": "api_legal_firms_liquidation_report",
        "description": "Genera reporte de liquidación de comisiones.\nGET /api/legal/firms/{id}/liquidation_report/?start_date=YYYY-MM-DD&end_date=YYYY-MM-DD",
        "parameters": [],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/LegalFirm"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "description": "Un valor de entero único que identifique este Firma Jurídica.",
          "required": true,
          "type": "integer"
        }
      ]
    },
    "/api/legal/firms/{id}/users/": {
      "get": {
        "operationId": "api_legal_firms_users_read",
        "description": "Gestión de usuarios asociados a la firma.",
        "parameters": [],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/LegalFirm"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "post": {
        "operationId": "api_legal_firms_users_create",
        "description": "Gestión de usuarios asociados a la firma.",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/LegalFirm"
            }
          }
        ],
        "responses": {
          "201": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/LegalFirm"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "description": "Un valor de entero único que identifique este Firma Jurídica.",
          "required": true,
          "type": "integer"
        }
      ]
    },
    "/api/legal/persuasive/": {
      "get": {
        "operationId": "api_legal_persuasive_list",
        "description": "API endpoint para consulta de Gestiones Persuasivas.\nSoporta filtros por caso, categoría y estado.\nRead-only: los registros se crean a través de LegalCaseViewSet.register_contact",
        "parameters": [
          {
            "name": "ordering",
            "in": "query",
            "description": "Qué campo usar para ordenar los resultados.",
            "required": false,
            "type": "string"
          },
          {
            "name": "page",
            "in": "query",
            "description": "Un número de página dentro del conjunto de resultados paginado.",
            "required": false,
            "type": "integer"
          },
          {
            "name": "page_size",
            "in": "query",
            "description": "Número de resultados a devolver por página.",
            "required": false,
            "type": "integer"
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "required": [
                "count",
                "results"
              ],
              "type": "object",
              "properties": {
                "count": {
                  "type": "integer"
                },
                "next": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "previous": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "results": {
                  "type": "array",
                  "items": {
                    "$ref": "#/definitions/PersuasiveManagement"
                  }
                }
              }
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/legal/persuasive/{id}/": {
      "get": {
        "operationId": "api_legal_persuasive_read",
        "description": "API endpoint para consulta de Gestiones Persuasivas.\nSoporta filtros por caso, categoría y estado.\nRead-only: los registros se crean a través de LegalCaseViewSet.register_contact",
        "parameters": [],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/PersuasiveManagement"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "required": true,
          "type": "string"
        }
      ]
    },
    "/api/me/": {
      "get": {
        "operationId": "api_me_list",
        "description": "Retorna información del usuario autenticado.",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/movimientos/": {
      "get": {
        "operationId": "api_movimientos_list",
        "description": "ViewSet para movimientos con partida doble.",
        "parameters": [
          {
            "name": "page",
            "in": "query",
            "description": "Un número de página dentro del conjunto de resultados paginado.",
            "required": false,
            "type": "integer"
          },
          {
            "name": "page_size",
            "in": "query",
            "description": "Número de resultados a devolver por página.",
            "required": false,
            "type": "integer"
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "required": [
                "count",
                "results"
              ],
              "type": "object",
              "properties": {
                "count": {
                  "type": "integer"
                },
                "next": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "previous": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "results": {
                  "type": "array",
                  "items": {
                    "$ref": "#/definitions/MovimientoPartidaDoble"
                  }
                }
              }
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "post": {
        "operationId": "api_movimientos_create",
        "description": "ViewSet para movimientos con partida doble.",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/MovimientoPartidaDoble"
            }
          }
        ],
        "responses": {
          "201": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/MovimientoPartidaDoble"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/movimientos/abono/{contrato_id}/": {
      "post": {
        "operationId": "api_movimientos_abono",
        "summary": "Registra un abono del cliente (primero intereses, luego capital).\nEnvía notificación de confirmación al cliente.",
        "description": "POST /api/movimientos/abono/{contrato_id}/",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/MovimientoPartidaDoble"
            }
          }
        ],
        "responses": {
          "201": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/MovimientoPartidaDoble"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": [
        {
          "name": "contrato_id",
          "in": "path",
          "description": "Contrato relacionado (si aplica)",
          "required": true,
          "type": "string"
        }
      ]
    },
    "/api/movimientos/balance/": {
      "get": {
        "operationId": "api_movimientos_balance_global",
        "summary": "Obtiene el balance global del sistema (validación de partida doble).",
        "description": "GET /api/movimientos/balance/",
        "parameters": [
          {
            "name": "page",
            "in": "query",
            "description": "Un número de página dentro del conjunto de resultados paginado.",
            "required": false,
            "type": "integer"
          },
          {
            "name": "page_size",
            "in": "query",
            "description": "Número de resultados a devolver por página.",
            "required": false,
            "type": "integer"
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "required": [
                "count",
                "results"
              ],
              "type": "object",
              "properties": {
                "count": {
                  "type": "integer"
                },
                "next": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "previous": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "results": {
                  "type": "array",
                  "items": {
                    "$ref": "#/definitions/MovimientoPartidaDoble"
                  }
                }
              }
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/movimientos/cashflow_forecast/": {
      "get": {
        "operationId": "api_movimientos_cashflow_forecast",
        "description": "Inteligencia Financiera y Pronóstico de Flujo de Caja (Cashflow Forecast).\nGET /api/movimientos/cashflow_forecast/",
        "parameters": [
          {
            "name": "page",
            "in": "query",
            "description": "Un número de página dentro del conjunto de resultados paginado.",
            "required": false,
            "type": "integer"
          },
          {
            "name": "page_size",
            "in": "query",
            "description": "Número de resultados a devolver por página.",
            "required": false,
            "type": "integer"
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "required": [
                "count",
                "results"
              ],
              "type": "object",
              "properties": {
                "count": {
                  "type": "integer"
                },
                "next": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "previous": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "results": {
                  "type": "array",
                  "items": {
                    "$ref": "#/definitions/MovimientoPartidaDoble"
                  }
                }
              }
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/movimientos/cliente/{cliente_id}/": {
      "get": {
        "operationId": "api_movimientos_movimientos_cliente",
        "summary": "Obtiene los movimientos de un cliente.",
        "description": "GET /api/movimientos/cliente/{id}/",
        "parameters": [
          {
            "name": "page",
            "in": "query",
            "description": "Un número de página dentro del conjunto de resultados paginado.",
            "required": false,
            "type": "integer"
          },
          {
            "name": "page_size",
            "in": "query",
            "description": "Número de resultados a devolver por página.",
            "required": false,
            "type": "integer"
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "required": [
                "count",
                "results"
              ],
              "type": "object",
              "properties": {
                "count": {
                  "type": "integer"
                },
                "next": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "previous": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "results": {
                  "type": "array",
                  "items": {
                    "$ref": "#/definitions/MovimientoPartidaDoble"
                  }
                }
              }
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": [
        {
          "name": "cliente_id",
          "in": "path",
          "required": true,
          "type": "string"
        }
      ]
    },
    "/api/movimientos/conciliar_extracto/": {
      "post": {
        "operationId": "api_movimientos_conciliar_extracto",
        "description": "Conciliación Bancaria Automática para Extractos OFX/CSV.\n        POST /api/movimientos/conciliar_extracto/\n        Body: { \"csv_contenido\": \"fecha,referencia,nit_cedula,monto,descripcion\n2026-07-25,REF123,1098765432,150000,Abono cuota\" }",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/MovimientoPartidaDoble"
            }
          }
        ],
        "responses": {
          "201": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/MovimientoPartidaDoble"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/movimientos/deposito/": {
      "post": {
        "operationId": "api_movimientos_deposito",
        "summary": "Registra un depósito de inversionista (partida doble).",
        "description": "POST /api/movimientos/deposito/",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/MovimientoPartidaDoble"
            }
          }
        ],
        "responses": {
          "201": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/MovimientoPartidaDoble"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/movimientos/desembolso/{contrato_id}/": {
      "post": {
        "operationId": "api_movimientos_desembolso",
        "description": "Endpoint legacy deshabilitado. El desembolso debe confirmarse\npor el flujo seguro del contrato.",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/MovimientoPartidaDoble"
            }
          }
        ],
        "responses": {
          "201": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/MovimientoPartidaDoble"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": [
        {
          "name": "contrato_id",
          "in": "path",
          "description": "Contrato relacionado (si aplica)",
          "required": true,
          "type": "string"
        }
      ]
    },
    "/api/movimientos/iniciar_pago_pse/": {
      "post": {
        "operationId": "api_movimientos_iniciar_pago_pse",
        "description": "Genera un enlace de pago PSE en línea para abono a cuota de cliente.\nPOST /api/movimientos/iniciar_pago_pse/",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/MovimientoPartidaDoble"
            }
          }
        ],
        "responses": {
          "201": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/MovimientoPartidaDoble"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/movimientos/inversionista/{inversionista_id}/": {
      "get": {
        "operationId": "api_movimientos_movimientos_inversionista",
        "summary": "Obtiene los movimientos de un inversionista.",
        "description": "GET /api/movimientos/inversionista/{id}/",
        "parameters": [
          {
            "name": "page",
            "in": "query",
            "description": "Un número de página dentro del conjunto de resultados paginado.",
            "required": false,
            "type": "integer"
          },
          {
            "name": "page_size",
            "in": "query",
            "description": "Número de resultados a devolver por página.",
            "required": false,
            "type": "integer"
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "required": [
                "count",
                "results"
              ],
              "type": "object",
              "properties": {
                "count": {
                  "type": "integer"
                },
                "next": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "previous": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "results": {
                  "type": "array",
                  "items": {
                    "$ref": "#/definitions/MovimientoPartidaDoble"
                  }
                }
              }
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": [
        {
          "name": "inversionista_id",
          "in": "path",
          "required": true,
          "type": "string"
        }
      ]
    },
    "/api/movimientos/reporte_exogena_dian/": {
      "get": {
        "operationId": "api_movimientos_reporte_exogena_dian",
        "description": "Generador Autónomo de Informes Exógena DIAN (Formatos 1001, 1007, 1008, 1009).\nGET /api/movimientos/reporte_exogena_dian/?year=2025",
        "parameters": [
          {
            "name": "page",
            "in": "query",
            "description": "Un número de página dentro del conjunto de resultados paginado.",
            "required": false,
            "type": "integer"
          },
          {
            "name": "page_size",
            "in": "query",
            "description": "Número de resultados a devolver por página.",
            "required": false,
            "type": "integer"
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "required": [
                "count",
                "results"
              ],
              "type": "object",
              "properties": {
                "count": {
                  "type": "integer"
                },
                "next": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "previous": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "results": {
                  "type": "array",
                  "items": {
                    "$ref": "#/definitions/MovimientoPartidaDoble"
                  }
                }
              }
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/movimientos/retiro/": {
      "post": {
        "operationId": "api_movimientos_retiro",
        "summary": "Registra el retiro de capital de un inversionista (DEVOLUCION).\nSolo debe llamarse después de aprobar una solicitud.",
        "description": "POST /api/movimientos/retiro/",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/MovimientoPartidaDoble"
            }
          }
        ],
        "responses": {
          "201": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/MovimientoPartidaDoble"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/movimientos/webhook_pse/": {
      "post": {
        "operationId": "api_movimientos_webhook_pse",
        "description": "Webhook asincrónico para confirmación y conciliación de pago PSE.\nPOST /api/movimientos/webhook_pse/",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/MovimientoPartidaDoble"
            }
          }
        ],
        "responses": {
          "201": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/MovimientoPartidaDoble"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/movimientos/{id_movimiento}/": {
      "get": {
        "operationId": "api_movimientos_read",
        "description": "ViewSet para movimientos con partida doble.",
        "parameters": [],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/MovimientoPartidaDoble"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "put": {
        "operationId": "api_movimientos_update",
        "description": "ViewSet para movimientos con partida doble.",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/MovimientoPartidaDoble"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/MovimientoPartidaDoble"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "patch": {
        "operationId": "api_movimientos_partial_update",
        "description": "ViewSet para movimientos con partida doble.",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/MovimientoPartidaDoble"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/MovimientoPartidaDoble"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "delete": {
        "operationId": "api_movimientos_delete",
        "description": "ViewSet para movimientos con partida doble.",
        "parameters": [],
        "responses": {
          "204": {
            "description": ""
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": [
        {
          "name": "id_movimiento",
          "in": "path",
          "description": "Un valor de entero único que identifique este Movimiento.",
          "required": true,
          "type": "integer"
        }
      ]
    },
    "/api/next-number/": {
      "get": {
        "operationId": "api_next-number_list",
        "description": "Obtiene el siguiente número de contrato a partir del último registrado.\nSoporta formatos como:\n  - '000'\n  - '000I0'\n  - '875'\n  - '875I1'\n  - '1000'\n  - '1000I1'\nExtrae la parte numérica inicial de todos los contratos, encuentra el máximo\nnuméricamente (no alfabéticamente), lo incrementa y preserva el número de dígitos.",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/notification/automations/": {
      "get": {
        "operationId": "api_notification_automations_list",
        "description": "ViewSet para gestionar reglas de automatización",
        "parameters": [
          {
            "name": "page",
            "in": "query",
            "description": "Un número de página dentro del conjunto de resultados paginado.",
            "required": false,
            "type": "integer"
          },
          {
            "name": "page_size",
            "in": "query",
            "description": "Número de resultados a devolver por página.",
            "required": false,
            "type": "integer"
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "required": [
                "count",
                "results"
              ],
              "type": "object",
              "properties": {
                "count": {
                  "type": "integer"
                },
                "next": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "previous": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "results": {
                  "type": "array",
                  "items": {
                    "$ref": "#/definitions/AutomationRule"
                  }
                }
              }
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "post": {
        "operationId": "api_notification_automations_create",
        "description": "ViewSet para gestionar reglas de automatización",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/AutomationRule"
            }
          }
        ],
        "responses": {
          "201": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/AutomationRule"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/notification/automations/events/": {
      "get": {
        "operationId": "api_notification_automations_events",
        "description": "Obtiene la lista de eventos disponibles",
        "parameters": [
          {
            "name": "page",
            "in": "query",
            "description": "Un número de página dentro del conjunto de resultados paginado.",
            "required": false,
            "type": "integer"
          },
          {
            "name": "page_size",
            "in": "query",
            "description": "Número de resultados a devolver por página.",
            "required": false,
            "type": "integer"
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "required": [
                "count",
                "results"
              ],
              "type": "object",
              "properties": {
                "count": {
                  "type": "integer"
                },
                "next": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "previous": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "results": {
                  "type": "array",
                  "items": {
                    "$ref": "#/definitions/AutomationRule"
                  }
                }
              }
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/notification/automations/{id}/": {
      "get": {
        "operationId": "api_notification_automations_read",
        "description": "ViewSet para gestionar reglas de automatización",
        "parameters": [],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/AutomationRule"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "put": {
        "operationId": "api_notification_automations_update",
        "description": "ViewSet para gestionar reglas de automatización",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/AutomationRule"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/AutomationRule"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "patch": {
        "operationId": "api_notification_automations_partial_update",
        "description": "ViewSet para gestionar reglas de automatización",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/AutomationRule"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/AutomationRule"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "delete": {
        "operationId": "api_notification_automations_delete",
        "description": "ViewSet para gestionar reglas de automatización",
        "parameters": [],
        "responses": {
          "204": {
            "description": ""
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "description": "Un valor de entero único que identifique este Regla de Automatización.",
          "required": true,
          "type": "integer"
        }
      ]
    },
    "/api/notification/automations/{id}/toggle/": {
      "post": {
        "operationId": "api_notification_automations_toggle",
        "description": "Activa/desactiva una regla de automatización",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/AutomationRule"
            }
          }
        ],
        "responses": {
          "201": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/AutomationRule"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "description": "Un valor de entero único que identifique este Regla de Automatización.",
          "required": true,
          "type": "integer"
        }
      ]
    },
    "/api/notification/logs/": {
      "get": {
        "operationId": "api_notification_logs_list",
        "description": "ViewSet para ver logs de notificaciones",
        "parameters": [
          {
            "name": "page",
            "in": "query",
            "description": "Un número de página dentro del conjunto de resultados paginado.",
            "required": false,
            "type": "integer"
          },
          {
            "name": "page_size",
            "in": "query",
            "description": "Número de resultados a devolver por página.",
            "required": false,
            "type": "integer"
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "required": [
                "count",
                "results"
              ],
              "type": "object",
              "properties": {
                "count": {
                  "type": "integer"
                },
                "next": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "previous": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "results": {
                  "type": "array",
                  "items": {
                    "$ref": "#/definitions/NotificationLog"
                  }
                }
              }
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/notification/logs/stats/": {
      "get": {
        "operationId": "api_notification_logs_stats",
        "description": "Obtiene estadísticas de envío",
        "parameters": [
          {
            "name": "page",
            "in": "query",
            "description": "Un número de página dentro del conjunto de resultados paginado.",
            "required": false,
            "type": "integer"
          },
          {
            "name": "page_size",
            "in": "query",
            "description": "Número de resultados a devolver por página.",
            "required": false,
            "type": "integer"
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "required": [
                "count",
                "results"
              ],
              "type": "object",
              "properties": {
                "count": {
                  "type": "integer"
                },
                "next": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "previous": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "results": {
                  "type": "array",
                  "items": {
                    "$ref": "#/definitions/NotificationLog"
                  }
                }
              }
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/notification/logs/{id}/": {
      "get": {
        "operationId": "api_notification_logs_read",
        "description": "ViewSet para ver logs de notificaciones",
        "parameters": [],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/NotificationLog"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "delete": {
        "operationId": "api_notification_logs_delete",
        "description": "ViewSet para ver logs de notificaciones",
        "parameters": [],
        "responses": {
          "204": {
            "description": ""
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "description": "Un valor de entero único que identifique este Log de Notificación.",
          "required": true,
          "type": "integer"
        }
      ]
    },
    "/api/notification/notifications/": {
      "get": {
        "operationId": "api_notification_notifications_list",
        "description": "",
        "parameters": [
          {
            "name": "page",
            "in": "query",
            "description": "Un número de página dentro del conjunto de resultados paginado.",
            "required": false,
            "type": "integer"
          },
          {
            "name": "page_size",
            "in": "query",
            "description": "Número de resultados a devolver por página.",
            "required": false,
            "type": "integer"
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "required": [
                "count",
                "results"
              ],
              "type": "object",
              "properties": {
                "count": {
                  "type": "integer"
                },
                "next": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "previous": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "results": {
                  "type": "array",
                  "items": {
                    "$ref": "#/definitions/Notification"
                  }
                }
              }
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "post": {
        "operationId": "api_notification_notifications_create",
        "description": "",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/NotificationCreate"
            }
          }
        ],
        "responses": {
          "201": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/NotificationCreate"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/notification/notifications/mark_all_as_read/": {
      "post": {
        "operationId": "api_notification_notifications_mark_all_as_read",
        "description": "",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/Notification"
            }
          }
        ],
        "responses": {
          "201": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/Notification"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/notification/notifications/recent/": {
      "get": {
        "operationId": "api_notification_notifications_recent",
        "description": "Obtiene las notificaciones recientes (últimas 10)",
        "parameters": [
          {
            "name": "page",
            "in": "query",
            "description": "Un número de página dentro del conjunto de resultados paginado.",
            "required": false,
            "type": "integer"
          },
          {
            "name": "page_size",
            "in": "query",
            "description": "Número de resultados a devolver por página.",
            "required": false,
            "type": "integer"
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "required": [
                "count",
                "results"
              ],
              "type": "object",
              "properties": {
                "count": {
                  "type": "integer"
                },
                "next": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "previous": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "results": {
                  "type": "array",
                  "items": {
                    "$ref": "#/definitions/Notification"
                  }
                }
              }
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/notification/notifications/unread_count/": {
      "get": {
        "operationId": "api_notification_notifications_unread_count",
        "description": "",
        "parameters": [
          {
            "name": "page",
            "in": "query",
            "description": "Un número de página dentro del conjunto de resultados paginado.",
            "required": false,
            "type": "integer"
          },
          {
            "name": "page_size",
            "in": "query",
            "description": "Número de resultados a devolver por página.",
            "required": false,
            "type": "integer"
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "required": [
                "count",
                "results"
              ],
              "type": "object",
              "properties": {
                "count": {
                  "type": "integer"
                },
                "next": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "previous": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "results": {
                  "type": "array",
                  "items": {
                    "$ref": "#/definitions/Notification"
                  }
                }
              }
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/notification/notifications/{id}/": {
      "get": {
        "operationId": "api_notification_notifications_read",
        "description": "",
        "parameters": [],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/Notification"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "put": {
        "operationId": "api_notification_notifications_update",
        "description": "",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/Notification"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/Notification"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "patch": {
        "operationId": "api_notification_notifications_partial_update",
        "description": "",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/Notification"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/Notification"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "delete": {
        "operationId": "api_notification_notifications_delete",
        "description": "",
        "parameters": [],
        "responses": {
          "204": {
            "description": ""
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "required": true,
          "type": "string"
        }
      ]
    },
    "/api/notification/notifications/{id}/mark_as_read/": {
      "post": {
        "operationId": "api_notification_notifications_mark_as_read",
        "description": "",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/Notification"
            }
          }
        ],
        "responses": {
          "201": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/Notification"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "required": true,
          "type": "string"
        }
      ]
    },
    "/api/notification/send-email/": {
      "post": {
        "operationId": "api_notification_send-email_create",
        "description": "Envía un correo usando la configuración SMTP de settings.py.\nEspera JSON con:\n  - to:      correo destino (string)\n  - subject: asunto del correo (string)\n  - body:    cuerpo del mensaje (string, puede incluir HTML y variables)\n  - recipient_data: (opcional) datos del destinatario para reemplazar variables",
        "parameters": [],
        "responses": {
          "201": {
            "description": ""
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/notification/send-sms/": {
      "post": {
        "operationId": "api_notification_send-sms_create",
        "description": "Endpoint para enviar SMS usando Twilio.\nEspera JSON con:\n  - to: número destino en formato E.164 (p. ej. +573135654544)\n  - body: texto del mensaje",
        "parameters": [],
        "responses": {
          "201": {
            "description": ""
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/notification/stats/": {
      "get": {
        "operationId": "api_notification_stats_list",
        "description": "Endpoint para obtener estadísticas de notificaciones para el dashboard.",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/notification/templates/": {
      "get": {
        "operationId": "api_notification_templates_list",
        "description": "ViewSet para gestionar plantillas de notificación",
        "parameters": [
          {
            "name": "page",
            "in": "query",
            "description": "Un número de página dentro del conjunto de resultados paginado.",
            "required": false,
            "type": "integer"
          },
          {
            "name": "page_size",
            "in": "query",
            "description": "Número de resultados a devolver por página.",
            "required": false,
            "type": "integer"
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "required": [
                "count",
                "results"
              ],
              "type": "object",
              "properties": {
                "count": {
                  "type": "integer"
                },
                "next": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "previous": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "results": {
                  "type": "array",
                  "items": {
                    "$ref": "#/definitions/NotificationTemplate"
                  }
                }
              }
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "post": {
        "operationId": "api_notification_templates_create",
        "description": "ViewSet para gestionar plantillas de notificación",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/NotificationTemplate"
            }
          }
        ],
        "responses": {
          "201": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/NotificationTemplate"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/notification/templates/by_channel/": {
      "get": {
        "operationId": "api_notification_templates_by_channel",
        "description": "Obtiene plantillas agrupadas por canal",
        "parameters": [
          {
            "name": "page",
            "in": "query",
            "description": "Un número de página dentro del conjunto de resultados paginado.",
            "required": false,
            "type": "integer"
          },
          {
            "name": "page_size",
            "in": "query",
            "description": "Número de resultados a devolver por página.",
            "required": false,
            "type": "integer"
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "required": [
                "count",
                "results"
              ],
              "type": "object",
              "properties": {
                "count": {
                  "type": "integer"
                },
                "next": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "previous": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "results": {
                  "type": "array",
                  "items": {
                    "$ref": "#/definitions/NotificationTemplate"
                  }
                }
              }
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/notification/templates/{id}/": {
      "get": {
        "operationId": "api_notification_templates_read",
        "description": "ViewSet para gestionar plantillas de notificación",
        "parameters": [],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/NotificationTemplate"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "put": {
        "operationId": "api_notification_templates_update",
        "description": "ViewSet para gestionar plantillas de notificación",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/NotificationTemplate"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/NotificationTemplate"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "patch": {
        "operationId": "api_notification_templates_partial_update",
        "description": "ViewSet para gestionar plantillas de notificación",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/NotificationTemplate"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/NotificationTemplate"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "delete": {
        "operationId": "api_notification_templates_delete",
        "description": "ViewSet para gestionar plantillas de notificación",
        "parameters": [],
        "responses": {
          "204": {
            "description": ""
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "description": "Un valor de entero único que identifique este Plantilla de Notificación.",
          "required": true,
          "type": "integer"
        }
      ]
    },
    "/api/obligations/": {
      "get": {
        "operationId": "api_obligations_list",
        "description": "",
        "parameters": [
          {
            "name": "page",
            "in": "query",
            "description": "Un número de página dentro del conjunto de resultados paginado.",
            "required": false,
            "type": "integer"
          },
          {
            "name": "page_size",
            "in": "query",
            "description": "Número de resultados a devolver por página.",
            "required": false,
            "type": "integer"
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "required": [
                "count",
                "results"
              ],
              "type": "object",
              "properties": {
                "count": {
                  "type": "integer"
                },
                "next": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "previous": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "results": {
                  "type": "array",
                  "items": {
                    "$ref": "#/definitions/Obligation"
                  }
                }
              }
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "post": {
        "operationId": "api_obligations_create",
        "description": "",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/Obligation"
            }
          }
        ],
        "responses": {
          "201": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/Obligation"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/obligations/{id}/": {
      "get": {
        "operationId": "api_obligations_read",
        "description": "",
        "parameters": [],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/Obligation"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "put": {
        "operationId": "api_obligations_update",
        "description": "",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/Obligation"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/Obligation"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "patch": {
        "operationId": "api_obligations_partial_update",
        "description": "",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/Obligation"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/Obligation"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "delete": {
        "operationId": "api_obligations_delete",
        "description": "",
        "parameters": [],
        "responses": {
          "204": {
            "description": ""
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "description": "Un valor de entero único que identifique este obligation.",
          "required": true,
          "type": "integer"
        }
      ]
    },
    "/api/partners/partner-commissions/": {
      "get": {
        "operationId": "api_partners_partner-commissions_list",
        "description": "",
        "parameters": [
          {
            "name": "page",
            "in": "query",
            "description": "Un número de página dentro del conjunto de resultados paginado.",
            "required": false,
            "type": "integer"
          },
          {
            "name": "page_size",
            "in": "query",
            "description": "Número de resultados a devolver por página.",
            "required": false,
            "type": "integer"
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "required": [
                "count",
                "results"
              ],
              "type": "object",
              "properties": {
                "count": {
                  "type": "integer"
                },
                "next": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "previous": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "results": {
                  "type": "array",
                  "items": {
                    "$ref": "#/definitions/Commission"
                  }
                }
              }
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "post": {
        "operationId": "api_partners_partner-commissions_create",
        "description": "",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/Commission"
            }
          }
        ],
        "responses": {
          "201": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/Commission"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/partners/partner-commissions/{id}/": {
      "get": {
        "operationId": "api_partners_partner-commissions_read",
        "description": "",
        "parameters": [],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/Commission"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "put": {
        "operationId": "api_partners_partner-commissions_update",
        "description": "",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/CommissionWrite"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/CommissionWrite"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "patch": {
        "operationId": "api_partners_partner-commissions_partial_update",
        "description": "",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/CommissionWrite"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/CommissionWrite"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "delete": {
        "operationId": "api_partners_partner-commissions_delete",
        "description": "",
        "parameters": [],
        "responses": {
          "204": {
            "description": ""
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "description": "Un valor de entero único que identifique este commission.",
          "required": true,
          "type": "integer"
        }
      ]
    },
    "/api/partners/partner-referrals/": {
      "get": {
        "operationId": "api_partners_partner-referrals_list",
        "description": "",
        "parameters": [
          {
            "name": "page",
            "in": "query",
            "description": "Un número de página dentro del conjunto de resultados paginado.",
            "required": false,
            "type": "integer"
          },
          {
            "name": "page_size",
            "in": "query",
            "description": "Número de resultados a devolver por página.",
            "required": false,
            "type": "integer"
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "required": [
                "count",
                "results"
              ],
              "type": "object",
              "properties": {
                "count": {
                  "type": "integer"
                },
                "next": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "previous": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "results": {
                  "type": "array",
                  "items": {
                    "$ref": "#/definitions/Referral"
                  }
                }
              }
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "post": {
        "operationId": "api_partners_partner-referrals_create",
        "description": "",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/ReferralWrite"
            }
          }
        ],
        "responses": {
          "201": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/ReferralWrite"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/partners/partner-referrals/submit-public/": {
      "post": {
        "operationId": "api_partners_partner-referrals_submit_public",
        "description": "",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/ReferralPublicSubmit"
            }
          }
        ],
        "responses": {
          "201": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/ReferralPublicSubmit"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/partners/partner-referrals/submit/": {
      "post": {
        "operationId": "api_partners_partner-referrals_submit",
        "description": "",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/ReferralSubmit"
            }
          }
        ],
        "responses": {
          "201": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/ReferralSubmit"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/partners/partner-referrals/{id}/": {
      "get": {
        "operationId": "api_partners_partner-referrals_read",
        "description": "",
        "parameters": [],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/Referral"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "put": {
        "operationId": "api_partners_partner-referrals_update",
        "description": "",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/ReferralWrite"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/ReferralWrite"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "patch": {
        "operationId": "api_partners_partner-referrals_partial_update",
        "description": "",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/ReferralWrite"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/ReferralWrite"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "delete": {
        "operationId": "api_partners_partner-referrals_delete",
        "description": "",
        "parameters": [],
        "responses": {
          "204": {
            "description": ""
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "description": "Un valor de entero único que identifique este referral.",
          "required": true,
          "type": "integer"
        }
      ]
    },
    "/api/partners/partner-referrals/{id}/retry_sync/": {
      "post": {
        "operationId": "api_partners_partner-referrals_retry_sync",
        "description": "",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/Referral"
            }
          }
        ],
        "responses": {
          "201": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/Referral"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "description": "Un valor de entero único que identifique este referral.",
          "required": true,
          "type": "integer"
        }
      ]
    },
    "/api/partners/partners-dashboard/": {
      "get": {
        "operationId": "api_partners_partners-dashboard_list",
        "description": "",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/partners/partners-dashboard/partner_performance/": {
      "get": {
        "operationId": "api_partners_partners-dashboard_partner_performance",
        "description": "",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/partners/partners/": {
      "get": {
        "operationId": "api_partners_partners_list",
        "description": "",
        "parameters": [
          {
            "name": "page",
            "in": "query",
            "description": "Un número de página dentro del conjunto de resultados paginado.",
            "required": false,
            "type": "integer"
          },
          {
            "name": "page_size",
            "in": "query",
            "description": "Número de resultados a devolver por página.",
            "required": false,
            "type": "integer"
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "required": [
                "count",
                "results"
              ],
              "type": "object",
              "properties": {
                "count": {
                  "type": "integer"
                },
                "next": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "previous": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "results": {
                  "type": "array",
                  "items": {
                    "$ref": "#/definitions/Partner"
                  }
                }
              }
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "post": {
        "operationId": "api_partners_partners_create",
        "description": "",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/PartnerWrite"
            }
          }
        ],
        "responses": {
          "201": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/PartnerWrite"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/partners/partners/lookup/": {
      "get": {
        "operationId": "api_partners_partners_lookup",
        "description": "",
        "parameters": [
          {
            "name": "page",
            "in": "query",
            "description": "Un número de página dentro del conjunto de resultados paginado.",
            "required": false,
            "type": "integer"
          },
          {
            "name": "page_size",
            "in": "query",
            "description": "Número de resultados a devolver por página.",
            "required": false,
            "type": "integer"
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "required": [
                "count",
                "results"
              ],
              "type": "object",
              "properties": {
                "count": {
                  "type": "integer"
                },
                "next": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "previous": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "results": {
                  "type": "array",
                  "items": {
                    "$ref": "#/definitions/PartnerPublicLookup"
                  }
                }
              }
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/partners/partners/register/": {
      "post": {
        "operationId": "api_partners_partners_register",
        "description": "",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/PartnerPublicRegister"
            }
          }
        ],
        "responses": {
          "201": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/PartnerPublicRegister"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/partners/partners/{id}/": {
      "get": {
        "operationId": "api_partners_partners_read",
        "description": "",
        "parameters": [],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/Partner"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "put": {
        "operationId": "api_partners_partners_update",
        "description": "",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/PartnerWrite"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/PartnerWrite"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "patch": {
        "operationId": "api_partners_partners_partial_update",
        "description": "",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/PartnerWrite"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/PartnerWrite"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "delete": {
        "operationId": "api_partners_partners_delete",
        "description": "",
        "parameters": [],
        "responses": {
          "204": {
            "description": ""
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "description": "Un valor de entero único que identifique este partner.",
          "required": true,
          "type": "integer"
        }
      ]
    },
    "/api/partners/partners/{id}/rotate_key/": {
      "post": {
        "operationId": "api_partners_partners_rotate_key",
        "description": "",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/Partner"
            }
          }
        ],
        "responses": {
          "201": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/Partner"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "description": "Un valor de entero único que identifique este partner.",
          "required": true,
          "type": "integer"
        }
      ]
    },
    "/api/payment-agreements/": {
      "get": {
        "operationId": "api_payment-agreements_list",
        "description": "ViewSet para acuerdos de pago.",
        "parameters": [
          {
            "name": "page",
            "in": "query",
            "description": "Un número de página dentro del conjunto de resultados paginado.",
            "required": false,
            "type": "integer"
          },
          {
            "name": "page_size",
            "in": "query",
            "description": "Número de resultados a devolver por página.",
            "required": false,
            "type": "integer"
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "required": [
                "count",
                "results"
              ],
              "type": "object",
              "properties": {
                "count": {
                  "type": "integer"
                },
                "next": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "previous": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "results": {
                  "type": "array",
                  "items": {
                    "$ref": "#/definitions/PaymentAgreement"
                  }
                }
              }
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "post": {
        "operationId": "api_payment-agreements_create",
        "description": "ViewSet para acuerdos de pago.",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/PaymentAgreement"
            }
          }
        ],
        "responses": {
          "201": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/PaymentAgreement"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/payment-agreements/active/": {
      "get": {
        "operationId": "api_payment-agreements_active",
        "description": "Acuerdos de pago activos.\nGET /api/payment-agreements/active/",
        "parameters": [
          {
            "name": "page",
            "in": "query",
            "description": "Un número de página dentro del conjunto de resultados paginado.",
            "required": false,
            "type": "integer"
          },
          {
            "name": "page_size",
            "in": "query",
            "description": "Número de resultados a devolver por página.",
            "required": false,
            "type": "integer"
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "required": [
                "count",
                "results"
              ],
              "type": "object",
              "properties": {
                "count": {
                  "type": "integer"
                },
                "next": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "previous": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "results": {
                  "type": "array",
                  "items": {
                    "$ref": "#/definitions/PaymentAgreement"
                  }
                }
              }
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/payment-agreements/simulate/": {
      "post": {
        "operationId": "api_payment-agreements_simulate",
        "summary": "Simula una proyección de pagos basada en el acuerdo propuesto.",
        "description": "POST /api/payment-agreements/simulate/",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/PaymentAgreement"
            }
          }
        ],
        "responses": {
          "201": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/PaymentAgreement"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/payment-agreements/{id}/": {
      "get": {
        "operationId": "api_payment-agreements_read",
        "description": "ViewSet para acuerdos de pago.",
        "parameters": [],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/PaymentAgreement"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "put": {
        "operationId": "api_payment-agreements_update",
        "description": "ViewSet para acuerdos de pago.",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/PaymentAgreement"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/PaymentAgreement"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "patch": {
        "operationId": "api_payment-agreements_partial_update",
        "description": "ViewSet para acuerdos de pago.",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/PaymentAgreement"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/PaymentAgreement"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "delete": {
        "operationId": "api_payment-agreements_delete",
        "description": "ViewSet para acuerdos de pago.",
        "parameters": [],
        "responses": {
          "204": {
            "description": ""
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "description": "Un valor de entero único que identifique este Acuerdo de Pago.",
          "required": true,
          "type": "integer"
        }
      ]
    },
    "/api/payment-agreements/{id}/print/": {
      "get": {
        "operationId": "api_payment-agreements_print_list",
        "description": "Renderiza el acuerdo de pago para imprimir",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "required": true,
          "type": "string"
        }
      ]
    },
    "/api/permissions/": {
      "get": {
        "operationId": "api_permissions_list",
        "summary": "ViewSet para permisos de Django (solo lectura)",
        "description": "Lista todos los permisos disponibles en el sistema",
        "parameters": [
          {
            "name": "page",
            "in": "query",
            "description": "Un número de página dentro del conjunto de resultados paginado.",
            "required": false,
            "type": "integer"
          },
          {
            "name": "page_size",
            "in": "query",
            "description": "Número de resultados a devolver por página.",
            "required": false,
            "type": "integer"
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "required": [
                "count",
                "results"
              ],
              "type": "object",
              "properties": {
                "count": {
                  "type": "integer"
                },
                "next": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "previous": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "results": {
                  "type": "array",
                  "items": {
                    "$ref": "#/definitions/Permission"
                  }
                }
              }
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/permissions/{id}/": {
      "get": {
        "operationId": "api_permissions_read",
        "summary": "ViewSet para permisos de Django (solo lectura)",
        "description": "Lista todos los permisos disponibles en el sistema",
        "parameters": [],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/Permission"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "description": "Un valor de entero único que identifique este permiso.",
          "required": true,
          "type": "integer"
        }
      ]
    },
    "/api/persona/{identificacion}/": {
      "get": {
        "operationId": "api_persona_read",
        "description": "Consolidado 360° de una persona a través de todas las verticales.",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": [
        {
          "name": "identificacion",
          "in": "path",
          "required": true,
          "type": "string"
        }
      ]
    },
    "/api/portfolios/": {
      "get": {
        "operationId": "api_portfolios_list",
        "description": "ViewSet para gestión de cartera con acciones de resumen",
        "parameters": [
          {
            "name": "page",
            "in": "query",
            "description": "Un número de página dentro del conjunto de resultados paginado.",
            "required": false,
            "type": "integer"
          },
          {
            "name": "page_size",
            "in": "query",
            "description": "Número de resultados a devolver por página.",
            "required": false,
            "type": "integer"
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "required": [
                "count",
                "results"
              ],
              "type": "object",
              "properties": {
                "count": {
                  "type": "integer"
                },
                "next": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "previous": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "results": {
                  "type": "array",
                  "items": {
                    "$ref": "#/definitions/Portfolio"
                  }
                }
              }
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "post": {
        "operationId": "api_portfolios_create",
        "description": "ViewSet para gestión de cartera con acciones de resumen",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/Portfolio"
            }
          }
        ],
        "responses": {
          "201": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/Portfolio"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/portfolios/by_classification/": {
      "get": {
        "operationId": "api_portfolios_by_classification",
        "description": "Lista contratos filtrados por clasificación de cartera.\nGET /api/portfolios/by_classification/?type=early",
        "parameters": [
          {
            "name": "page",
            "in": "query",
            "description": "Un número de página dentro del conjunto de resultados paginado.",
            "required": false,
            "type": "integer"
          },
          {
            "name": "page_size",
            "in": "query",
            "description": "Número de resultados a devolver por página.",
            "required": false,
            "type": "integer"
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "required": [
                "count",
                "results"
              ],
              "type": "object",
              "properties": {
                "count": {
                  "type": "integer"
                },
                "next": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "previous": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "results": {
                  "type": "array",
                  "items": {
                    "$ref": "#/definitions/Portfolio"
                  }
                }
              }
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/portfolios/pending_follow_ups/": {
      "get": {
        "operationId": "api_portfolios_pending_follow_ups",
        "description": "Contratos con seguimiento pendiente (fecha <= hoy).\nGET /api/portfolios/pending_follow_ups/",
        "parameters": [
          {
            "name": "page",
            "in": "query",
            "description": "Un número de página dentro del conjunto de resultados paginado.",
            "required": false,
            "type": "integer"
          },
          {
            "name": "page_size",
            "in": "query",
            "description": "Número de resultados a devolver por página.",
            "required": false,
            "type": "integer"
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "required": [
                "count",
                "results"
              ],
              "type": "object",
              "properties": {
                "count": {
                  "type": "integer"
                },
                "next": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "previous": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "results": {
                  "type": "array",
                  "items": {
                    "$ref": "#/definitions/Portfolio"
                  }
                }
              }
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/portfolios/recovery_breakdown/": {
      "get": {
        "operationId": "api_portfolios_recovery_breakdown",
        "summary": "Desglose de cartera por clasificación.",
        "description": "GET /api/portfolios/recovery_breakdown/",
        "parameters": [
          {
            "name": "page",
            "in": "query",
            "description": "Un número de página dentro del conjunto de resultados paginado.",
            "required": false,
            "type": "integer"
          },
          {
            "name": "page_size",
            "in": "query",
            "description": "Número de resultados a devolver por página.",
            "required": false,
            "type": "integer"
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "required": [
                "count",
                "results"
              ],
              "type": "object",
              "properties": {
                "count": {
                  "type": "integer"
                },
                "next": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "previous": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "results": {
                  "type": "array",
                  "items": {
                    "$ref": "#/definitions/Portfolio"
                  }
                }
              }
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/portfolios/recovery_export/": {
      "get": {
        "operationId": "api_portfolios_recovery_export",
        "summary": "Exporta reporte de recuperación a Excel.",
        "description": "GET /api/portfolios/recovery_export/\nQuery params:\n- start: Fecha inicio (YYYY-MM-DD), default: hace 30 días\n- end: Fecha fin (YYYY-MM-DD), default: hoy\n- classification: Tipo de cartera (opcional)",
        "parameters": [
          {
            "name": "page",
            "in": "query",
            "description": "Un número de página dentro del conjunto de resultados paginado.",
            "required": false,
            "type": "integer"
          },
          {
            "name": "page_size",
            "in": "query",
            "description": "Número de resultados a devolver por página.",
            "required": false,
            "type": "integer"
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "required": [
                "count",
                "results"
              ],
              "type": "object",
              "properties": {
                "count": {
                  "type": "integer"
                },
                "next": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "previous": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "results": {
                  "type": "array",
                  "items": {
                    "$ref": "#/definitions/Portfolio"
                  }
                }
              }
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/portfolios/recovery_report/": {
      "get": {
        "operationId": "api_portfolios_recovery_report",
        "summary": "Reporte de recuperación de cartera.",
        "description": "GET /api/portfolios/recovery_report/\nQuery params:\n- start: Fecha inicio (YYYY-MM-DD), default: hace 30 días\n- end: Fecha fin (YYYY-MM-DD), default: hoy\n- classification: Tipo de cartera (normal, early, mid, late, prelegal, legal, all)",
        "parameters": [
          {
            "name": "page",
            "in": "query",
            "description": "Un número de página dentro del conjunto de resultados paginado.",
            "required": false,
            "type": "integer"
          },
          {
            "name": "page_size",
            "in": "query",
            "description": "Número de resultados a devolver por página.",
            "required": false,
            "type": "integer"
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "required": [
                "count",
                "results"
              ],
              "type": "object",
              "properties": {
                "count": {
                  "type": "integer"
                },
                "next": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "previous": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "results": {
                  "type": "array",
                  "items": {
                    "$ref": "#/definitions/Portfolio"
                  }
                }
              }
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/portfolios/summary/": {
      "get": {
        "operationId": "api_portfolios_summary",
        "description": "Resumen de cartera agrupado por clasificación.\nGET /api/portfolios/summary/",
        "parameters": [
          {
            "name": "page",
            "in": "query",
            "description": "Un número de página dentro del conjunto de resultados paginado.",
            "required": false,
            "type": "integer"
          },
          {
            "name": "page_size",
            "in": "query",
            "description": "Número de resultados a devolver por página.",
            "required": false,
            "type": "integer"
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "required": [
                "count",
                "results"
              ],
              "type": "object",
              "properties": {
                "count": {
                  "type": "integer"
                },
                "next": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "previous": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "results": {
                  "type": "array",
                  "items": {
                    "$ref": "#/definitions/Portfolio"
                  }
                }
              }
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/portfolios/{id}/": {
      "get": {
        "operationId": "api_portfolios_read",
        "description": "ViewSet para gestión de cartera con acciones de resumen",
        "parameters": [],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/Portfolio"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "put": {
        "operationId": "api_portfolios_update",
        "description": "ViewSet para gestión de cartera con acciones de resumen",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/Portfolio"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/Portfolio"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "patch": {
        "operationId": "api_portfolios_partial_update",
        "description": "ViewSet para gestión de cartera con acciones de resumen",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/Portfolio"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/Portfolio"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "delete": {
        "operationId": "api_portfolios_delete",
        "description": "ViewSet para gestión de cartera con acciones de resumen",
        "parameters": [],
        "responses": {
          "204": {
            "description": ""
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "description": "Un valor de entero único que identifique este Seguimiento de Cartera.",
          "required": true,
          "type": "integer"
        }
      ]
    },
    "/api/pricing/calcular_tasa/": {
      "post": {
        "operationId": "api_pricing_calcular_tasa_create",
        "description": "Fijación Dinámica de Tasas por Riesgo (Dynamic Risk-Based Pricing Engine).\nPOST /api/pricing/calcular_tasa/",
        "parameters": [],
        "responses": {
          "201": {
            "description": ""
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/profiles/": {
      "get": {
        "operationId": "api_profiles_list",
        "summary": "ViewSet para perfiles de usuario (solo lectura)",
        "description": "Los perfiles se crean automáticamente al crear usuarios",
        "parameters": [
          {
            "name": "page",
            "in": "query",
            "description": "Un número de página dentro del conjunto de resultados paginado.",
            "required": false,
            "type": "integer"
          },
          {
            "name": "page_size",
            "in": "query",
            "description": "Número de resultados a devolver por página.",
            "required": false,
            "type": "integer"
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "required": [
                "count",
                "results"
              ],
              "type": "object",
              "properties": {
                "count": {
                  "type": "integer"
                },
                "next": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "previous": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "results": {
                  "type": "array",
                  "items": {
                    "$ref": "#/definitions/Profile"
                  }
                }
              }
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/profiles/{id}/": {
      "get": {
        "operationId": "api_profiles_read",
        "summary": "ViewSet para perfiles de usuario (solo lectura)",
        "description": "Los perfiles se crean automáticamente al crear usuarios",
        "parameters": [],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/Profile"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "description": "Un valor de entero único que identifique este Perfil de Usuario.",
          "required": true,
          "type": "integer"
        }
      ]
    },
    "/api/projects/comments/": {
      "get": {
        "operationId": "api_projects_comments_list",
        "description": "",
        "parameters": [
          {
            "name": "page",
            "in": "query",
            "description": "Un número de página dentro del conjunto de resultados paginado.",
            "required": false,
            "type": "integer"
          },
          {
            "name": "page_size",
            "in": "query",
            "description": "Número de resultados a devolver por página.",
            "required": false,
            "type": "integer"
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "required": [
                "count",
                "results"
              ],
              "type": "object",
              "properties": {
                "count": {
                  "type": "integer"
                },
                "next": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "previous": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "results": {
                  "type": "array",
                  "items": {
                    "$ref": "#/definitions/TaskComment"
                  }
                }
              }
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "post": {
        "operationId": "api_projects_comments_create",
        "description": "",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/TaskComment"
            }
          }
        ],
        "responses": {
          "201": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/TaskComment"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/projects/comments/{id}/": {
      "get": {
        "operationId": "api_projects_comments_read",
        "description": "",
        "parameters": [],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/TaskComment"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "put": {
        "operationId": "api_projects_comments_update",
        "description": "",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/TaskComment"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/TaskComment"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "patch": {
        "operationId": "api_projects_comments_partial_update",
        "description": "",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/TaskComment"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/TaskComment"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "delete": {
        "operationId": "api_projects_comments_delete",
        "description": "",
        "parameters": [],
        "responses": {
          "204": {
            "description": ""
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "required": true,
          "type": "string"
        }
      ]
    },
    "/api/projects/edges/": {
      "get": {
        "operationId": "api_projects_edges_list",
        "description": "",
        "parameters": [
          {
            "name": "kind",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "from_node",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "to_node",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "workspace",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "workspace_slug",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "page",
            "in": "query",
            "description": "Un número de página dentro del conjunto de resultados paginado.",
            "required": false,
            "type": "integer"
          },
          {
            "name": "page_size",
            "in": "query",
            "description": "Número de resultados a devolver por página.",
            "required": false,
            "type": "integer"
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "required": [
                "count",
                "results"
              ],
              "type": "object",
              "properties": {
                "count": {
                  "type": "integer"
                },
                "next": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "previous": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "results": {
                  "type": "array",
                  "items": {
                    "$ref": "#/definitions/EcosystemEdge"
                  }
                }
              }
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "post": {
        "operationId": "api_projects_edges_create",
        "description": "",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/EcosystemEdge"
            }
          }
        ],
        "responses": {
          "201": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/EcosystemEdge"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/projects/edges/{id}/": {
      "get": {
        "operationId": "api_projects_edges_read",
        "description": "",
        "parameters": [],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/EcosystemEdge"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "put": {
        "operationId": "api_projects_edges_update",
        "description": "",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/EcosystemEdge"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/EcosystemEdge"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "patch": {
        "operationId": "api_projects_edges_partial_update",
        "description": "",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/EcosystemEdge"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/EcosystemEdge"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "delete": {
        "operationId": "api_projects_edges_delete",
        "description": "",
        "parameters": [],
        "responses": {
          "204": {
            "description": ""
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "required": true,
          "type": "string"
        }
      ]
    },
    "/api/projects/feedback-public/": {
      "post": {
        "operationId": "api_projects_feedback-public_create",
        "summary": "POST /api/projects/feedback-public/ — feedback anónimo de landings públicas.",
        "description": "Sin autenticación (las landings no tienen sesión) y protegido por:\n- throttle por IP con scope `feedback_public` (FEEDBACK_PUBLIC_THROTTLE_RATE);\n- honeypot `website`: si llega con contenido es un bot;\n- tiempo mínimo `elapsed_ms` >= FEEDBACK_PUBLIC_MIN_FILL_SECONDS;\n- captcha opcional: solo si FEEDBACK_CAPTCHA_SECRET está definido.\n\nHoneypot y tiempo mínimo responden 201 igual que un envío válido pero sin\npersistir nada, para no darle señal al bot. El reporte entra al mismo flujo\nde FeedbackReport (estado nuevo, reporter nulo, correo de aviso).",
        "parameters": [],
        "responses": {
          "201": {
            "description": ""
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/projects/feedback-reports/": {
      "get": {
        "operationId": "api_projects_feedback-reports_list",
        "description": "",
        "parameters": [
          {
            "name": "app",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "category",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "severity",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "assignee",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "reporter",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "created_from",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "created_to",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "status",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "linked_task",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "task",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "node",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "search",
            "in": "query",
            "description": "Un término de búsqueda.",
            "required": false,
            "type": "string"
          },
          {
            "name": "ordering",
            "in": "query",
            "description": "Qué campo usar para ordenar los resultados.",
            "required": false,
            "type": "string"
          },
          {
            "name": "page",
            "in": "query",
            "description": "Un número de página dentro del conjunto de resultados paginado.",
            "required": false,
            "type": "integer"
          },
          {
            "name": "page_size",
            "in": "query",
            "description": "Número de resultados a devolver por página.",
            "required": false,
            "type": "integer"
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "required": [
                "count",
                "results"
              ],
              "type": "object",
              "properties": {
                "count": {
                  "type": "integer"
                },
                "next": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "previous": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "results": {
                  "type": "array",
                  "items": {
                    "$ref": "#/definitions/FeedbackReport"
                  }
                }
              }
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "post": {
        "operationId": "api_projects_feedback-reports_create",
        "description": "",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/FeedbackReportCreate"
            }
          }
        ],
        "responses": {
          "201": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/FeedbackReportCreate"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/projects/feedback-reports/agent_queue/": {
      "get": {
        "operationId": "api_projects_feedback-reports_agent_queue",
        "description": "Reportes que el agente SDD puede tomar sin decisión humana previa (solo admin).",
        "parameters": [
          {
            "name": "app",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "category",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "severity",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "assignee",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "reporter",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "created_from",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "created_to",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "status",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "linked_task",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "task",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "node",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "search",
            "in": "query",
            "description": "Un término de búsqueda.",
            "required": false,
            "type": "string"
          },
          {
            "name": "ordering",
            "in": "query",
            "description": "Qué campo usar para ordenar los resultados.",
            "required": false,
            "type": "string"
          },
          {
            "name": "page",
            "in": "query",
            "description": "Un número de página dentro del conjunto de resultados paginado.",
            "required": false,
            "type": "integer"
          },
          {
            "name": "page_size",
            "in": "query",
            "description": "Número de resultados a devolver por página.",
            "required": false,
            "type": "integer"
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "required": [
                "count",
                "results"
              ],
              "type": "object",
              "properties": {
                "count": {
                  "type": "integer"
                },
                "next": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "previous": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "results": {
                  "type": "array",
                  "items": {
                    "$ref": "#/definitions/FeedbackReport"
                  }
                }
              }
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/projects/feedback-reports/mine/": {
      "get": {
        "operationId": "api_projects_feedback-reports_mine",
        "description": "",
        "parameters": [
          {
            "name": "app",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "category",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "severity",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "assignee",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "reporter",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "created_from",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "created_to",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "status",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "linked_task",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "task",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "node",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "search",
            "in": "query",
            "description": "Un término de búsqueda.",
            "required": false,
            "type": "string"
          },
          {
            "name": "ordering",
            "in": "query",
            "description": "Qué campo usar para ordenar los resultados.",
            "required": false,
            "type": "string"
          },
          {
            "name": "page",
            "in": "query",
            "description": "Un número de página dentro del conjunto de resultados paginado.",
            "required": false,
            "type": "integer"
          },
          {
            "name": "page_size",
            "in": "query",
            "description": "Número de resultados a devolver por página.",
            "required": false,
            "type": "integer"
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "required": [
                "count",
                "results"
              ],
              "type": "object",
              "properties": {
                "count": {
                  "type": "integer"
                },
                "next": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "previous": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "results": {
                  "type": "array",
                  "items": {
                    "$ref": "#/definitions/FeedbackReport"
                  }
                }
              }
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/projects/feedback-reports/{id}/": {
      "get": {
        "operationId": "api_projects_feedback-reports_read",
        "description": "",
        "parameters": [],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/FeedbackReport"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "patch": {
        "operationId": "api_projects_feedback-reports_partial_update",
        "description": "",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/FeedbackReport"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/FeedbackReport"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "delete": {
        "operationId": "api_projects_feedback-reports_delete",
        "description": "",
        "parameters": [],
        "responses": {
          "204": {
            "description": ""
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "required": true,
          "type": "string"
        }
      ]
    },
    "/api/projects/feedback-reports/{id}/assign/": {
      "post": {
        "operationId": "api_projects_feedback-reports_assign",
        "description": "",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/FeedbackReport"
            }
          }
        ],
        "responses": {
          "201": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/FeedbackReport"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "required": true,
          "type": "string"
        }
      ]
    },
    "/api/projects/feedback-reports/{id}/attachments/{attachment_id}/": {
      "get": {
        "operationId": "api_projects_feedback-reports_attachment",
        "description": "",
        "parameters": [],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/FeedbackReport"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "required": true,
          "type": "string"
        },
        {
          "name": "attachment_id",
          "in": "path",
          "required": true,
          "type": "string"
        }
      ]
    },
    "/api/projects/feedback-reports/{id}/change_status/": {
      "post": {
        "operationId": "api_projects_feedback-reports_change_status",
        "description": "",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/FeedbackReport"
            }
          }
        ],
        "responses": {
          "201": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/FeedbackReport"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "required": true,
          "type": "string"
        }
      ]
    },
    "/api/projects/feedback-reports/{id}/link_task/": {
      "post": {
        "operationId": "api_projects_feedback-reports_link_task",
        "description": "",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/FeedbackReport"
            }
          }
        ],
        "responses": {
          "201": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/FeedbackReport"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "required": true,
          "type": "string"
        }
      ]
    },
    "/api/projects/feedback-reports/{id}/timeline/": {
      "get": {
        "operationId": "api_projects_feedback-reports_timeline",
        "description": "Historia del reporte: auditoría, tarea, specs y ejecuciones del agente.",
        "parameters": [],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/FeedbackReport"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "required": true,
          "type": "string"
        }
      ]
    },
    "/api/projects/graph/": {
      "get": {
        "operationId": "api_projects_graph_list",
        "description": "GET /api/projects/graph/?workspace=<slug|id> → nodos, aristas, proyectos y conteos por nodo.",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/projects/members/": {
      "get": {
        "operationId": "api_projects_members_list",
        "description": "GET /api/projects/members/?workspace=<slug|id> → usuarios asignables (sin correos).",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/projects/memberships/": {
      "get": {
        "operationId": "api_projects_memberships_list",
        "description": "Membresías (solo staff gestiona; lectura para el módulo).",
        "parameters": [
          {
            "name": "user",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "role",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "workspace",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "workspace_slug",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "page",
            "in": "query",
            "description": "Un número de página dentro del conjunto de resultados paginado.",
            "required": false,
            "type": "integer"
          },
          {
            "name": "page_size",
            "in": "query",
            "description": "Número de resultados a devolver por página.",
            "required": false,
            "type": "integer"
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "required": [
                "count",
                "results"
              ],
              "type": "object",
              "properties": {
                "count": {
                  "type": "integer"
                },
                "next": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "previous": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "results": {
                  "type": "array",
                  "items": {
                    "$ref": "#/definitions/WorkspaceMember"
                  }
                }
              }
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "post": {
        "operationId": "api_projects_memberships_create",
        "description": "Membresías (solo staff gestiona; lectura para el módulo).",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/WorkspaceMember"
            }
          }
        ],
        "responses": {
          "201": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/WorkspaceMember"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/projects/memberships/{id}/": {
      "get": {
        "operationId": "api_projects_memberships_read",
        "description": "Membresías (solo staff gestiona; lectura para el módulo).",
        "parameters": [],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/WorkspaceMember"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "put": {
        "operationId": "api_projects_memberships_update",
        "description": "Membresías (solo staff gestiona; lectura para el módulo).",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/WorkspaceMember"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/WorkspaceMember"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "patch": {
        "operationId": "api_projects_memberships_partial_update",
        "description": "Membresías (solo staff gestiona; lectura para el módulo).",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/WorkspaceMember"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/WorkspaceMember"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "delete": {
        "operationId": "api_projects_memberships_delete",
        "description": "Membresías (solo staff gestiona; lectura para el módulo).",
        "parameters": [],
        "responses": {
          "204": {
            "description": ""
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "required": true,
          "type": "string"
        }
      ]
    },
    "/api/projects/nodes/": {
      "get": {
        "operationId": "api_projects_nodes_list",
        "description": "",
        "parameters": [
          {
            "name": "health",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "is_active",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "workspace",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "workspace_slug",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "search",
            "in": "query",
            "description": "Un término de búsqueda.",
            "required": false,
            "type": "string"
          },
          {
            "name": "ordering",
            "in": "query",
            "description": "Qué campo usar para ordenar los resultados.",
            "required": false,
            "type": "string"
          },
          {
            "name": "page",
            "in": "query",
            "description": "Un número de página dentro del conjunto de resultados paginado.",
            "required": false,
            "type": "integer"
          },
          {
            "name": "page_size",
            "in": "query",
            "description": "Número de resultados a devolver por página.",
            "required": false,
            "type": "integer"
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "required": [
                "count",
                "results"
              ],
              "type": "object",
              "properties": {
                "count": {
                  "type": "integer"
                },
                "next": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "previous": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "results": {
                  "type": "array",
                  "items": {
                    "$ref": "#/definitions/EcosystemNode"
                  }
                }
              }
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "post": {
        "operationId": "api_projects_nodes_create",
        "description": "",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/EcosystemNode"
            }
          }
        ],
        "responses": {
          "201": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/EcosystemNode"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/projects/nodes/{id}/": {
      "get": {
        "operationId": "api_projects_nodes_read",
        "description": "",
        "parameters": [],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/EcosystemNode"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "put": {
        "operationId": "api_projects_nodes_update",
        "description": "",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/EcosystemNode"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/EcosystemNode"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "patch": {
        "operationId": "api_projects_nodes_partial_update",
        "description": "",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/EcosystemNode"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/EcosystemNode"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "delete": {
        "operationId": "api_projects_nodes_delete",
        "description": "",
        "parameters": [],
        "responses": {
          "204": {
            "description": ""
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "required": true,
          "type": "string"
        }
      ]
    },
    "/api/projects/notifications/": {
      "get": {
        "operationId": "api_projects_notifications_list",
        "description": "",
        "parameters": [
          {
            "name": "ordering",
            "in": "query",
            "description": "Qué campo usar para ordenar los resultados.",
            "required": false,
            "type": "string"
          },
          {
            "name": "page",
            "in": "query",
            "description": "Un número de página dentro del conjunto de resultados paginado.",
            "required": false,
            "type": "integer"
          },
          {
            "name": "page_size",
            "in": "query",
            "description": "Número de resultados a devolver por página.",
            "required": false,
            "type": "integer"
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "required": [
                "count",
                "results"
              ],
              "type": "object",
              "properties": {
                "count": {
                  "type": "integer"
                },
                "next": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "previous": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "results": {
                  "type": "array",
                  "items": {
                    "$ref": "#/definitions/ProjectNotification"
                  }
                }
              }
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "post": {
        "operationId": "api_projects_notifications_create",
        "description": "",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/ProjectNotification"
            }
          }
        ],
        "responses": {
          "201": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/ProjectNotification"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/projects/notifications/mark_all_read/": {
      "post": {
        "operationId": "api_projects_notifications_mark_all_read",
        "description": "",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/ProjectNotification"
            }
          }
        ],
        "responses": {
          "201": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/ProjectNotification"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/projects/notifications/unread_count/": {
      "get": {
        "operationId": "api_projects_notifications_unread_count",
        "description": "",
        "parameters": [
          {
            "name": "ordering",
            "in": "query",
            "description": "Qué campo usar para ordenar los resultados.",
            "required": false,
            "type": "string"
          },
          {
            "name": "page",
            "in": "query",
            "description": "Un número de página dentro del conjunto de resultados paginado.",
            "required": false,
            "type": "integer"
          },
          {
            "name": "page_size",
            "in": "query",
            "description": "Número de resultados a devolver por página.",
            "required": false,
            "type": "integer"
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "required": [
                "count",
                "results"
              ],
              "type": "object",
              "properties": {
                "count": {
                  "type": "integer"
                },
                "next": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "previous": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "results": {
                  "type": "array",
                  "items": {
                    "$ref": "#/definitions/ProjectNotification"
                  }
                }
              }
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/projects/notifications/{id}/": {
      "get": {
        "operationId": "api_projects_notifications_read",
        "description": "",
        "parameters": [],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/ProjectNotification"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "put": {
        "operationId": "api_projects_notifications_update",
        "description": "",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/ProjectNotification"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/ProjectNotification"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "patch": {
        "operationId": "api_projects_notifications_partial_update",
        "description": "",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/ProjectNotification"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/ProjectNotification"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "delete": {
        "operationId": "api_projects_notifications_delete",
        "description": "",
        "parameters": [],
        "responses": {
          "204": {
            "description": ""
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "required": true,
          "type": "string"
        }
      ]
    },
    "/api/projects/notifications/{id}/mark_read/": {
      "post": {
        "operationId": "api_projects_notifications_mark_read",
        "description": "",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/ProjectNotification"
            }
          }
        ],
        "responses": {
          "201": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/ProjectNotification"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "required": true,
          "type": "string"
        }
      ]
    },
    "/api/projects/projects/": {
      "get": {
        "operationId": "api_projects_projects_list",
        "description": "",
        "parameters": [
          {
            "name": "priority",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "owner",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "workspace",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "workspace_slug",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "status",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "node",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "search",
            "in": "query",
            "description": "Un término de búsqueda.",
            "required": false,
            "type": "string"
          },
          {
            "name": "ordering",
            "in": "query",
            "description": "Qué campo usar para ordenar los resultados.",
            "required": false,
            "type": "string"
          },
          {
            "name": "page",
            "in": "query",
            "description": "Un número de página dentro del conjunto de resultados paginado.",
            "required": false,
            "type": "integer"
          },
          {
            "name": "page_size",
            "in": "query",
            "description": "Número de resultados a devolver por página.",
            "required": false,
            "type": "integer"
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "required": [
                "count",
                "results"
              ],
              "type": "object",
              "properties": {
                "count": {
                  "type": "integer"
                },
                "next": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "previous": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "results": {
                  "type": "array",
                  "items": {
                    "$ref": "#/definitions/Project"
                  }
                }
              }
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "post": {
        "operationId": "api_projects_projects_create",
        "description": "",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/Project"
            }
          }
        ],
        "responses": {
          "201": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/Project"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/projects/projects/{id}/": {
      "get": {
        "operationId": "api_projects_projects_read",
        "description": "",
        "parameters": [],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/Project"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "put": {
        "operationId": "api_projects_projects_update",
        "description": "",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/Project"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/Project"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "patch": {
        "operationId": "api_projects_projects_partial_update",
        "description": "",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/Project"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/Project"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "delete": {
        "operationId": "api_projects_projects_delete",
        "description": "",
        "parameters": [],
        "responses": {
          "204": {
            "description": ""
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "required": true,
          "type": "string"
        }
      ]
    },
    "/api/projects/sdd-runs/": {
      "get": {
        "operationId": "api_projects_sdd-runs_list",
        "description": "",
        "parameters": [
          {
            "name": "ordering",
            "in": "query",
            "description": "Qué campo usar para ordenar los resultados.",
            "required": false,
            "type": "string"
          },
          {
            "name": "page",
            "in": "query",
            "description": "Un número de página dentro del conjunto de resultados paginado.",
            "required": false,
            "type": "integer"
          },
          {
            "name": "page_size",
            "in": "query",
            "description": "Número de resultados a devolver por página.",
            "required": false,
            "type": "integer"
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "required": [
                "count",
                "results"
              ],
              "type": "object",
              "properties": {
                "count": {
                  "type": "integer"
                },
                "next": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "previous": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "results": {
                  "type": "array",
                  "items": {
                    "$ref": "#/definitions/SpecRun"
                  }
                }
              }
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/projects/sdd-runs/{id}/": {
      "get": {
        "operationId": "api_projects_sdd-runs_read",
        "description": "",
        "parameters": [],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/SpecRun"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "required": true,
          "type": "string"
        }
      ]
    },
    "/api/projects/sdd-runs/{id}/agent_payload/": {
      "get": {
        "operationId": "api_projects_sdd-runs_agent_payload",
        "description": "",
        "parameters": [],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/SpecRun"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "required": true,
          "type": "string"
        }
      ]
    },
    "/api/projects/sdd-runs/{id}/iterate/": {
      "post": {
        "operationId": "api_projects_sdd-runs_iterate",
        "description": "",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/SpecRun"
            }
          }
        ],
        "responses": {
          "201": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/SpecRun"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "required": true,
          "type": "string"
        }
      ]
    },
    "/api/projects/sdd-runs/{id}/merge_pr/": {
      "post": {
        "operationId": "api_projects_sdd-runs_merge_pr",
        "description": "",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/SpecRun"
            }
          }
        ],
        "responses": {
          "201": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/SpecRun"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "required": true,
          "type": "string"
        }
      ]
    },
    "/api/projects/sdd-runs/{id}/webhook/": {
      "post": {
        "operationId": "api_projects_sdd-runs_webhook",
        "description": "",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/SpecRun"
            }
          }
        ],
        "responses": {
          "201": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/SpecRun"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "required": true,
          "type": "string"
        }
      ]
    },
    "/api/projects/specs/": {
      "get": {
        "operationId": "api_projects_specs_list",
        "description": "",
        "parameters": [
          {
            "name": "ordering",
            "in": "query",
            "description": "Qué campo usar para ordenar los resultados.",
            "required": false,
            "type": "string"
          },
          {
            "name": "page",
            "in": "query",
            "description": "Un número de página dentro del conjunto de resultados paginado.",
            "required": false,
            "type": "integer"
          },
          {
            "name": "page_size",
            "in": "query",
            "description": "Número de resultados a devolver por página.",
            "required": false,
            "type": "integer"
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "required": [
                "count",
                "results"
              ],
              "type": "object",
              "properties": {
                "count": {
                  "type": "integer"
                },
                "next": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "previous": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "results": {
                  "type": "array",
                  "items": {
                    "$ref": "#/definitions/TaskSpec"
                  }
                }
              }
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "post": {
        "operationId": "api_projects_specs_create",
        "description": "",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/TaskSpec"
            }
          }
        ],
        "responses": {
          "201": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/TaskSpec"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/projects/specs/generate/": {
      "post": {
        "operationId": "api_projects_specs_generate",
        "description": "",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/TaskSpec"
            }
          }
        ],
        "responses": {
          "201": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/TaskSpec"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/projects/specs/{id}/": {
      "get": {
        "operationId": "api_projects_specs_read",
        "description": "",
        "parameters": [],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/TaskSpec"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "put": {
        "operationId": "api_projects_specs_update",
        "description": "",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/TaskSpec"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/TaskSpec"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "patch": {
        "operationId": "api_projects_specs_partial_update",
        "description": "",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/TaskSpec"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/TaskSpec"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "delete": {
        "operationId": "api_projects_specs_delete",
        "description": "",
        "parameters": [],
        "responses": {
          "204": {
            "description": ""
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "required": true,
          "type": "string"
        }
      ]
    },
    "/api/projects/specs/{id}/approve/": {
      "post": {
        "operationId": "api_projects_specs_approve",
        "description": "",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/TaskSpec"
            }
          }
        ],
        "responses": {
          "201": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/TaskSpec"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "required": true,
          "type": "string"
        }
      ]
    },
    "/api/projects/specs/{id}/execute/": {
      "post": {
        "operationId": "api_projects_specs_execute",
        "description": "",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/TaskSpec"
            }
          }
        ],
        "responses": {
          "201": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/TaskSpec"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "required": true,
          "type": "string"
        }
      ]
    },
    "/api/projects/specs/{id}/refine/": {
      "post": {
        "operationId": "api_projects_specs_refine",
        "description": "",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/TaskSpec"
            }
          }
        ],
        "responses": {
          "201": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/TaskSpec"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "required": true,
          "type": "string"
        }
      ]
    },
    "/api/projects/specs/{id}/resolve_question/": {
      "post": {
        "operationId": "api_projects_specs_resolve_question",
        "description": "",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/TaskSpec"
            }
          }
        ],
        "responses": {
          "201": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/TaskSpec"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "required": true,
          "type": "string"
        }
      ]
    },
    "/api/projects/summary/": {
      "get": {
        "operationId": "api_projects_summary_list",
        "description": "GET /api/projects/summary/?workspace=<slug|id> (opcional: sin param, todos los visibles).",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/projects/tasks/": {
      "get": {
        "operationId": "api_projects_tasks_list",
        "description": "",
        "parameters": [
          {
            "name": "project",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "priority",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "assignee",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "parent",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "origin",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "workspace",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "workspace_slug",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "status",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "node",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "node_key",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "due_before",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "due_after",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "overdue",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "root",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "unassigned",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "tag",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "search",
            "in": "query",
            "description": "Un término de búsqueda.",
            "required": false,
            "type": "string"
          },
          {
            "name": "ordering",
            "in": "query",
            "description": "Qué campo usar para ordenar los resultados.",
            "required": false,
            "type": "string"
          },
          {
            "name": "page",
            "in": "query",
            "description": "Un número de página dentro del conjunto de resultados paginado.",
            "required": false,
            "type": "integer"
          },
          {
            "name": "page_size",
            "in": "query",
            "description": "Número de resultados a devolver por página.",
            "required": false,
            "type": "integer"
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "required": [
                "count",
                "results"
              ],
              "type": "object",
              "properties": {
                "count": {
                  "type": "integer"
                },
                "next": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "previous": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "results": {
                  "type": "array",
                  "items": {
                    "$ref": "#/definitions/Task"
                  }
                }
              }
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "post": {
        "operationId": "api_projects_tasks_create",
        "description": "",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/Task"
            }
          }
        ],
        "responses": {
          "201": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/Task"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/projects/tasks/mine/": {
      "get": {
        "operationId": "api_projects_tasks_mine",
        "description": "",
        "parameters": [
          {
            "name": "project",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "priority",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "assignee",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "parent",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "origin",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "workspace",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "workspace_slug",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "status",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "node",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "node_key",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "due_before",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "due_after",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "overdue",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "root",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "unassigned",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "tag",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "search",
            "in": "query",
            "description": "Un término de búsqueda.",
            "required": false,
            "type": "string"
          },
          {
            "name": "ordering",
            "in": "query",
            "description": "Qué campo usar para ordenar los resultados.",
            "required": false,
            "type": "string"
          },
          {
            "name": "page",
            "in": "query",
            "description": "Un número de página dentro del conjunto de resultados paginado.",
            "required": false,
            "type": "integer"
          },
          {
            "name": "page_size",
            "in": "query",
            "description": "Número de resultados a devolver por página.",
            "required": false,
            "type": "integer"
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "required": [
                "count",
                "results"
              ],
              "type": "object",
              "properties": {
                "count": {
                  "type": "integer"
                },
                "next": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "previous": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "results": {
                  "type": "array",
                  "items": {
                    "$ref": "#/definitions/Task"
                  }
                }
              }
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/projects/tasks/{id}/": {
      "get": {
        "operationId": "api_projects_tasks_read",
        "description": "",
        "parameters": [],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/Task"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "put": {
        "operationId": "api_projects_tasks_update",
        "description": "",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/Task"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/Task"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "patch": {
        "operationId": "api_projects_tasks_partial_update",
        "description": "",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/Task"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/Task"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "delete": {
        "operationId": "api_projects_tasks_delete",
        "description": "",
        "parameters": [],
        "responses": {
          "204": {
            "description": ""
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "required": true,
          "type": "string"
        }
      ]
    },
    "/api/projects/tasks/{id}/assign/": {
      "post": {
        "operationId": "api_projects_tasks_assign",
        "description": "",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/Task"
            }
          }
        ],
        "responses": {
          "201": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/Task"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "required": true,
          "type": "string"
        }
      ]
    },
    "/api/projects/tasks/{id}/change_status/": {
      "post": {
        "operationId": "api_projects_tasks_change_status",
        "description": "",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/Task"
            }
          }
        ],
        "responses": {
          "201": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/Task"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "required": true,
          "type": "string"
        }
      ]
    },
    "/api/projects/tasks/{id}/history/": {
      "get": {
        "operationId": "api_projects_tasks_history",
        "description": "",
        "parameters": [],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/Task"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "required": true,
          "type": "string"
        }
      ]
    },
    "/api/projects/workspaces/": {
      "get": {
        "operationId": "api_projects_workspaces_list",
        "description": "",
        "parameters": [
          {
            "name": "search",
            "in": "query",
            "description": "Un término de búsqueda.",
            "required": false,
            "type": "string"
          },
          {
            "name": "ordering",
            "in": "query",
            "description": "Qué campo usar para ordenar los resultados.",
            "required": false,
            "type": "string"
          },
          {
            "name": "page",
            "in": "query",
            "description": "Un número de página dentro del conjunto de resultados paginado.",
            "required": false,
            "type": "integer"
          },
          {
            "name": "page_size",
            "in": "query",
            "description": "Número de resultados a devolver por página.",
            "required": false,
            "type": "integer"
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "required": [
                "count",
                "results"
              ],
              "type": "object",
              "properties": {
                "count": {
                  "type": "integer"
                },
                "next": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "previous": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "results": {
                  "type": "array",
                  "items": {
                    "$ref": "#/definitions/Workspace"
                  }
                }
              }
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "post": {
        "operationId": "api_projects_workspaces_create",
        "description": "",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/Workspace"
            }
          }
        ],
        "responses": {
          "201": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/Workspace"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/projects/workspaces/{id}/": {
      "get": {
        "operationId": "api_projects_workspaces_read",
        "description": "",
        "parameters": [],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/Workspace"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "put": {
        "operationId": "api_projects_workspaces_update",
        "description": "",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/Workspace"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/Workspace"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "patch": {
        "operationId": "api_projects_workspaces_partial_update",
        "description": "",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/Workspace"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/Workspace"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "delete": {
        "operationId": "api_projects_workspaces_delete",
        "description": "",
        "parameters": [],
        "responses": {
          "204": {
            "description": ""
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "required": true,
          "type": "string"
        }
      ]
    },
    "/api/properties/": {
      "get": {
        "operationId": "api_properties_list",
        "description": "API endpoint that allows properties to be viewed or edited.",
        "parameters": [
          {
            "name": "page",
            "in": "query",
            "description": "Un número de página dentro del conjunto de resultados paginado.",
            "required": false,
            "type": "integer"
          },
          {
            "name": "page_size",
            "in": "query",
            "description": "Número de resultados a devolver por página.",
            "required": false,
            "type": "integer"
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "required": [
                "count",
                "results"
              ],
              "type": "object",
              "properties": {
                "count": {
                  "type": "integer"
                },
                "next": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "previous": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "results": {
                  "type": "array",
                  "items": {
                    "$ref": "#/definitions/Property"
                  }
                }
              }
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "post": {
        "operationId": "api_properties_create",
        "description": "API endpoint that allows properties to be viewed or edited.",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/Property"
            }
          }
        ],
        "responses": {
          "201": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/Property"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/properties/comprar_tokens/": {
      "post": {
        "operationId": "api_properties_comprar_tokens",
        "description": "Procesa la compra de micro-inversiones en tokens inmobiliarios.\nPOST /api/properties/comprar_tokens/",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/Property"
            }
          }
        ],
        "responses": {
          "201": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/Property"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/properties/{id}/": {
      "get": {
        "operationId": "api_properties_read",
        "description": "API endpoint that allows properties to be viewed or edited.",
        "parameters": [],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/Property"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "put": {
        "operationId": "api_properties_update",
        "description": "API endpoint that allows properties to be viewed or edited.",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/Property"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/Property"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "patch": {
        "operationId": "api_properties_partial_update",
        "description": "API endpoint that allows properties to be viewed or edited.",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/Property"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/Property"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "delete": {
        "operationId": "api_properties_delete",
        "description": "API endpoint that allows properties to be viewed or edited.",
        "parameters": [],
        "responses": {
          "204": {
            "description": ""
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "description": "Un valor de entero único que identifique este property.",
          "required": true,
          "type": "integer"
        }
      ]
    },
    "/api/properties/{id}/remove_image/": {
      "post": {
        "operationId": "api_properties_remove_image",
        "description": "Quita una URL de `images` (no borra el archivo físico).",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/Property"
            }
          }
        ],
        "responses": {
          "201": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/Property"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "description": "Un valor de entero único que identifique este property.",
          "required": true,
          "type": "integer"
        }
      ]
    },
    "/api/properties/{id}/tokenizar/": {
      "post": {
        "operationId": "api_properties_tokenizar",
        "description": "Emite la colección de tokens fiduciarios digitales para un inmueble.\nPOST /api/properties/{id}/tokenizar/",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/Property"
            }
          }
        ],
        "responses": {
          "201": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/Property"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "description": "Un valor de entero único que identifique este property.",
          "required": true,
          "type": "integer"
        }
      ]
    },
    "/api/properties/{id}/upload_image/": {
      "post": {
        "operationId": "api_properties_upload_image",
        "summary": "Sube una imagen de la propiedad (Fase 5) y la agrega a `images`.",
        "description": "POST /api/properties/{id}/upload_image/  (multipart, campo `image`)\nValida tipo y tamaño; guarda en MEDIA/properties/{id}/ y devuelve la\nlista de URLs actualizada.",
        "parameters": [
          {
            "name": "reference_code",
            "in": "formData",
            "required": false,
            "type": "string",
            "maxLength": 50
          },
          {
            "name": "title",
            "in": "formData",
            "required": false,
            "type": "string",
            "maxLength": 160
          },
          {
            "name": "description",
            "in": "formData",
            "required": false,
            "type": "string"
          },
          {
            "name": "address",
            "in": "formData",
            "required": true,
            "type": "string",
            "maxLength": 255,
            "minLength": 1
          },
          {
            "name": "neighborhood",
            "in": "formData",
            "required": true,
            "type": "string",
            "maxLength": 100,
            "minLength": 1
          },
          {
            "name": "city",
            "in": "formData",
            "required": true,
            "type": "string",
            "maxLength": 100,
            "minLength": 1
          },
          {
            "name": "department",
            "in": "formData",
            "required": true,
            "type": "string",
            "maxLength": 100,
            "minLength": 1
          },
          {
            "name": "operation",
            "in": "formData",
            "required": false,
            "type": "string",
            "enum": [
              "venta",
              "alquiler"
            ]
          },
          {
            "name": "status",
            "in": "formData",
            "required": false,
            "type": "string",
            "enum": [
              "disponible",
              "remate",
              "nuevo",
              "reservada",
              "proceso",
              "vendida",
              "alquilada"
            ]
          },
          {
            "name": "price",
            "in": "formData",
            "required": false,
            "type": "string",
            "format": "decimal"
          },
          {
            "name": "area_m2",
            "in": "formData",
            "required": false,
            "type": "string",
            "format": "decimal"
          },
          {
            "name": "bedrooms",
            "in": "formData",
            "required": false,
            "type": "integer",
            "maximum": 4294967295,
            "minimum": 0
          },
          {
            "name": "bathrooms",
            "in": "formData",
            "required": false,
            "type": "integer",
            "maximum": 4294967295,
            "minimum": 0
          },
          {
            "name": "parking_spaces",
            "in": "formData",
            "required": false,
            "type": "integer",
            "maximum": 4294967295,
            "minimum": 0
          },
          {
            "name": "featured",
            "in": "formData",
            "required": false,
            "type": "boolean"
          },
          {
            "name": "latitude",
            "in": "formData",
            "required": false,
            "type": "string",
            "format": "decimal",
            "x-nullable": true
          },
          {
            "name": "longitude",
            "in": "formData",
            "required": false,
            "type": "string",
            "format": "decimal",
            "x-nullable": true
          },
          {
            "name": "images",
            "in": "formData",
            "required": false,
            "type": "string"
          },
          {
            "name": "property_type",
            "in": "formData",
            "required": true,
            "type": "integer"
          },
          {
            "name": "business_line",
            "in": "formData",
            "description": "Debe apuntar a BusinessLine.code = 'Inmo'",
            "required": true,
            "type": "string"
          }
        ],
        "responses": {
          "201": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/Property"
            }
          }
        },
        "consumes": [
          "multipart/form-data",
          "application/x-www-form-urlencoded"
        ],
        "tags": [
          "api"
        ]
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "description": "Un valor de entero único que identifique este property.",
          "required": true,
          "type": "integer"
        }
      ]
    },
    "/api/property-contracts/": {
      "get": {
        "operationId": "api_property-contracts_list",
        "description": "API endpoint that allows property contracts to be viewed or edited.",
        "parameters": [
          {
            "name": "page",
            "in": "query",
            "description": "Un número de página dentro del conjunto de resultados paginado.",
            "required": false,
            "type": "integer"
          },
          {
            "name": "page_size",
            "in": "query",
            "description": "Número de resultados a devolver por página.",
            "required": false,
            "type": "integer"
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "required": [
                "count",
                "results"
              ],
              "type": "object",
              "properties": {
                "count": {
                  "type": "integer"
                },
                "next": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "previous": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "results": {
                  "type": "array",
                  "items": {
                    "$ref": "#/definitions/PropertyContract"
                  }
                }
              }
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "post": {
        "operationId": "api_property-contracts_create",
        "description": "API endpoint that allows property contracts to be viewed or edited.",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/PropertyContract"
            }
          }
        ],
        "responses": {
          "201": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/PropertyContract"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/property-contracts/{contract}/": {
      "get": {
        "operationId": "api_property-contracts_read",
        "description": "API endpoint that allows property contracts to be viewed or edited.",
        "parameters": [],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/PropertyContract"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "put": {
        "operationId": "api_property-contracts_update",
        "description": "API endpoint that allows property contracts to be viewed or edited.",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/PropertyContract"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/PropertyContract"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "patch": {
        "operationId": "api_property-contracts_partial_update",
        "description": "API endpoint that allows property contracts to be viewed or edited.",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/PropertyContract"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/PropertyContract"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "delete": {
        "operationId": "api_property-contracts_delete",
        "description": "API endpoint that allows property contracts to be viewed or edited.",
        "parameters": [],
        "responses": {
          "204": {
            "description": ""
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": [
        {
          "name": "contract",
          "in": "path",
          "description": "Un valor único que identifique este property contract.",
          "required": true,
          "type": "string"
        }
      ]
    },
    "/api/property-inquiries/": {
      "get": {
        "operationId": "api_property-inquiries_list",
        "description": "",
        "parameters": [
          {
            "name": "page",
            "in": "query",
            "description": "Un número de página dentro del conjunto de resultados paginado.",
            "required": false,
            "type": "integer"
          },
          {
            "name": "page_size",
            "in": "query",
            "description": "Número de resultados a devolver por página.",
            "required": false,
            "type": "integer"
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "required": [
                "count",
                "results"
              ],
              "type": "object",
              "properties": {
                "count": {
                  "type": "integer"
                },
                "next": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "previous": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "results": {
                  "type": "array",
                  "items": {
                    "$ref": "#/definitions/PropertyInquiry"
                  }
                }
              }
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "post": {
        "operationId": "api_property-inquiries_create",
        "description": "",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/PropertyInquiry"
            }
          }
        ],
        "responses": {
          "201": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/PropertyInquiry"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/property-inquiries/{id}/": {
      "get": {
        "operationId": "api_property-inquiries_read",
        "description": "",
        "parameters": [],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/PropertyInquiry"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "put": {
        "operationId": "api_property-inquiries_update",
        "description": "",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/PropertyInquiry"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/PropertyInquiry"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "patch": {
        "operationId": "api_property-inquiries_partial_update",
        "description": "",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/PropertyInquiry"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/PropertyInquiry"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "delete": {
        "operationId": "api_property-inquiries_delete",
        "description": "",
        "parameters": [],
        "responses": {
          "204": {
            "description": ""
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "description": "Un valor de entero único que identifique este Interesado Inmobiliario.",
          "required": true,
          "type": "integer"
        }
      ]
    },
    "/api/property-types/": {
      "get": {
        "operationId": "api_property-types_list",
        "description": "",
        "parameters": [
          {
            "name": "page",
            "in": "query",
            "description": "Un número de página dentro del conjunto de resultados paginado.",
            "required": false,
            "type": "integer"
          },
          {
            "name": "page_size",
            "in": "query",
            "description": "Número de resultados a devolver por página.",
            "required": false,
            "type": "integer"
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "required": [
                "count",
                "results"
              ],
              "type": "object",
              "properties": {
                "count": {
                  "type": "integer"
                },
                "next": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "previous": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "results": {
                  "type": "array",
                  "items": {
                    "$ref": "#/definitions/PropertyType"
                  }
                }
              }
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "post": {
        "operationId": "api_property-types_create",
        "description": "",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/PropertyType"
            }
          }
        ],
        "responses": {
          "201": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/PropertyType"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/property-types/{id}/": {
      "get": {
        "operationId": "api_property-types_read",
        "description": "",
        "parameters": [],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/PropertyType"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "put": {
        "operationId": "api_property-types_update",
        "description": "",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/PropertyType"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/PropertyType"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "patch": {
        "operationId": "api_property-types_partial_update",
        "description": "",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/PropertyType"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/PropertyType"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "delete": {
        "operationId": "api_property-types_delete",
        "description": "",
        "parameters": [],
        "responses": {
          "204": {
            "description": ""
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "description": "Un valor de entero único que identifique este property type.",
          "required": true,
          "type": "integer"
        }
      ]
    },
    "/api/sagrilaft/validar/": {
      "post": {
        "operationId": "api_sagrilaft_validar_create",
        "description": "Validación SAGRILAFT / SIPLAFT contra listas restrictivas OFAC/ONU.\nPOST /api/sagrilaft/validar/",
        "parameters": [],
        "responses": {
          "201": {
            "description": ""
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/search/": {
      "get": {
        "operationId": "api_search_list",
        "description": "",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/service-request-audit/": {
      "get": {
        "operationId": "api_service-request-audit_list",
        "description": "ViewSet de solo lectura para consultar auditoría de ServiceRequest",
        "parameters": [
          {
            "name": "service_request",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "user",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "action",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "action__in",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "timestamp__date",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "timestamp__gte",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "timestamp__lte",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "search",
            "in": "query",
            "description": "Un término de búsqueda.",
            "required": false,
            "type": "string"
          },
          {
            "name": "ordering",
            "in": "query",
            "description": "Qué campo usar para ordenar los resultados.",
            "required": false,
            "type": "string"
          },
          {
            "name": "page",
            "in": "query",
            "description": "Un número de página dentro del conjunto de resultados paginado.",
            "required": false,
            "type": "integer"
          },
          {
            "name": "page_size",
            "in": "query",
            "description": "Número de resultados a devolver por página.",
            "required": false,
            "type": "integer"
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "required": [
                "count",
                "results"
              ],
              "type": "object",
              "properties": {
                "count": {
                  "type": "integer"
                },
                "next": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "previous": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "results": {
                  "type": "array",
                  "items": {
                    "$ref": "#/definitions/ServiceRequestAudit"
                  }
                }
              }
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/service-request-audit/{id}/": {
      "get": {
        "operationId": "api_service-request-audit_read",
        "description": "ViewSet de solo lectura para consultar auditoría de ServiceRequest",
        "parameters": [],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/ServiceRequestAudit"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "description": "Un valor de entero único que identifique este Auditoría de Solicitud.",
          "required": true,
          "type": "integer"
        }
      ]
    },
    "/api/service-request-notes/": {
      "get": {
        "operationId": "api_service-request-notes_list",
        "description": "CRUD para notas de solicitudes de servicio",
        "parameters": [
          {
            "name": "page",
            "in": "query",
            "description": "Un número de página dentro del conjunto de resultados paginado.",
            "required": false,
            "type": "integer"
          },
          {
            "name": "page_size",
            "in": "query",
            "description": "Número de resultados a devolver por página.",
            "required": false,
            "type": "integer"
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "required": [
                "count",
                "results"
              ],
              "type": "object",
              "properties": {
                "count": {
                  "type": "integer"
                },
                "next": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "previous": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "results": {
                  "type": "array",
                  "items": {
                    "$ref": "#/definitions/ServiceRequestNote"
                  }
                }
              }
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "post": {
        "operationId": "api_service-request-notes_create",
        "description": "CRUD para notas de solicitudes de servicio",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/ServiceRequestNote"
            }
          }
        ],
        "responses": {
          "201": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/ServiceRequestNote"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/service-request-notes/{id}/": {
      "get": {
        "operationId": "api_service-request-notes_read",
        "description": "CRUD para notas de solicitudes de servicio",
        "parameters": [],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/ServiceRequestNote"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "put": {
        "operationId": "api_service-request-notes_update",
        "description": "CRUD para notas de solicitudes de servicio",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/ServiceRequestNote"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/ServiceRequestNote"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "patch": {
        "operationId": "api_service-request-notes_partial_update",
        "description": "CRUD para notas de solicitudes de servicio",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/ServiceRequestNote"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/ServiceRequestNote"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "delete": {
        "operationId": "api_service-request-notes_delete",
        "description": "CRUD para notas de solicitudes de servicio",
        "parameters": [],
        "responses": {
          "204": {
            "description": ""
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "description": "Un valor de entero único que identifique este service request note.",
          "required": true,
          "type": "integer"
        }
      ]
    },
    "/api/service-requests/": {
      "get": {
        "operationId": "api_service-requests_list",
        "description": "ViewSet unificado para todas las solicitudes de servicio.",
        "parameters": [
          {
            "name": "status",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "status__in",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "request_type",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "request_type__in",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "source",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "source__in",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "priority",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "priority__in",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "created_at__date",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "created_at__gte",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "created_at__lte",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "closed_at__date",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "closed_at__gte",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "closed_at__lte",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "closed_at__isnull",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "search",
            "in": "query",
            "description": "Un término de búsqueda.",
            "required": false,
            "type": "string"
          },
          {
            "name": "ordering",
            "in": "query",
            "description": "Qué campo usar para ordenar los resultados.",
            "required": false,
            "type": "string"
          },
          {
            "name": "page",
            "in": "query",
            "description": "Un número de página dentro del conjunto de resultados paginado.",
            "required": false,
            "type": "integer"
          },
          {
            "name": "page_size",
            "in": "query",
            "description": "Número de resultados a devolver por página.",
            "required": false,
            "type": "integer"
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "required": [
                "count",
                "results"
              ],
              "type": "object",
              "properties": {
                "count": {
                  "type": "integer"
                },
                "next": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "previous": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "results": {
                  "type": "array",
                  "items": {
                    "$ref": "#/definitions/ServiceRequest"
                  }
                }
              }
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "post": {
        "operationId": "api_service-requests_create",
        "description": "Sobrescribir create para registrar auditoría y agendar cita si aplica",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/ServiceRequestCreate"
            }
          }
        ],
        "responses": {
          "201": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/ServiceRequestCreate"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/service-requests/audit_summary/": {
      "get": {
        "operationId": "api_service-requests_audit_summary",
        "description": "Resumen de auditoría para análisis de tiempos de respuesta",
        "parameters": [
          {
            "name": "status",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "status__in",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "request_type",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "request_type__in",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "source",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "source__in",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "priority",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "priority__in",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "created_at__date",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "created_at__gte",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "created_at__lte",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "closed_at__date",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "closed_at__gte",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "closed_at__lte",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "closed_at__isnull",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "search",
            "in": "query",
            "description": "Un término de búsqueda.",
            "required": false,
            "type": "string"
          },
          {
            "name": "ordering",
            "in": "query",
            "description": "Qué campo usar para ordenar los resultados.",
            "required": false,
            "type": "string"
          },
          {
            "name": "page",
            "in": "query",
            "description": "Un número de página dentro del conjunto de resultados paginado.",
            "required": false,
            "type": "integer"
          },
          {
            "name": "page_size",
            "in": "query",
            "description": "Número de resultados a devolver por página.",
            "required": false,
            "type": "integer"
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "required": [
                "count",
                "results"
              ],
              "type": "object",
              "properties": {
                "count": {
                  "type": "integer"
                },
                "next": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "previous": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "results": {
                  "type": "array",
                  "items": {
                    "$ref": "#/definitions/ServiceRequest"
                  }
                }
              }
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/service-requests/dashboard_stats/": {
      "get": {
        "operationId": "api_service-requests_dashboard_stats",
        "description": "Estadísticas para el dashboard",
        "parameters": [
          {
            "name": "status",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "status__in",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "request_type",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "request_type__in",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "source",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "source__in",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "priority",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "priority__in",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "created_at__date",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "created_at__gte",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "created_at__lte",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "closed_at__date",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "closed_at__gte",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "closed_at__lte",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "closed_at__isnull",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "search",
            "in": "query",
            "description": "Un término de búsqueda.",
            "required": false,
            "type": "string"
          },
          {
            "name": "ordering",
            "in": "query",
            "description": "Qué campo usar para ordenar los resultados.",
            "required": false,
            "type": "string"
          },
          {
            "name": "page",
            "in": "query",
            "description": "Un número de página dentro del conjunto de resultados paginado.",
            "required": false,
            "type": "integer"
          },
          {
            "name": "page_size",
            "in": "query",
            "description": "Número de resultados a devolver por página.",
            "required": false,
            "type": "integer"
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "required": [
                "count",
                "results"
              ],
              "type": "object",
              "properties": {
                "count": {
                  "type": "integer"
                },
                "next": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "previous": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "results": {
                  "type": "array",
                  "items": {
                    "$ref": "#/definitions/ServiceRequest"
                  }
                }
              }
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/service-requests/global_available_slots/": {
      "get": {
        "operationId": "api_service-requests_global_available_slots",
        "description": "Obtiene slots disponibles de 1 hora para una fecha sin requerir ID de solicitud.\nGET /api/service-requests/global_available_slots/?date=YYYY-MM-DD",
        "parameters": [
          {
            "name": "status",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "status__in",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "request_type",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "request_type__in",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "source",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "source__in",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "priority",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "priority__in",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "created_at__date",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "created_at__gte",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "created_at__lte",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "closed_at__date",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "closed_at__gte",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "closed_at__lte",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "closed_at__isnull",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "search",
            "in": "query",
            "description": "Un término de búsqueda.",
            "required": false,
            "type": "string"
          },
          {
            "name": "ordering",
            "in": "query",
            "description": "Qué campo usar para ordenar los resultados.",
            "required": false,
            "type": "string"
          },
          {
            "name": "page",
            "in": "query",
            "description": "Un número de página dentro del conjunto de resultados paginado.",
            "required": false,
            "type": "integer"
          },
          {
            "name": "page_size",
            "in": "query",
            "description": "Número de resultados a devolver por página.",
            "required": false,
            "type": "integer"
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "required": [
                "count",
                "results"
              ],
              "type": "object",
              "properties": {
                "count": {
                  "type": "integer"
                },
                "next": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "previous": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "results": {
                  "type": "array",
                  "items": {
                    "$ref": "#/definitions/ServiceRequest"
                  }
                }
              }
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/service-requests/my_assignments/": {
      "get": {
        "operationId": "api_service-requests_my_assignments",
        "description": "Solicitudes asignadas al usuario actual",
        "parameters": [
          {
            "name": "status",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "status__in",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "request_type",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "request_type__in",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "source",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "source__in",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "priority",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "priority__in",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "created_at__date",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "created_at__gte",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "created_at__lte",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "closed_at__date",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "closed_at__gte",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "closed_at__lte",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "closed_at__isnull",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "search",
            "in": "query",
            "description": "Un término de búsqueda.",
            "required": false,
            "type": "string"
          },
          {
            "name": "ordering",
            "in": "query",
            "description": "Qué campo usar para ordenar los resultados.",
            "required": false,
            "type": "string"
          },
          {
            "name": "page",
            "in": "query",
            "description": "Un número de página dentro del conjunto de resultados paginado.",
            "required": false,
            "type": "integer"
          },
          {
            "name": "page_size",
            "in": "query",
            "description": "Número de resultados a devolver por página.",
            "required": false,
            "type": "integer"
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "required": [
                "count",
                "results"
              ],
              "type": "object",
              "properties": {
                "count": {
                  "type": "integer"
                },
                "next": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "previous": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "results": {
                  "type": "array",
                  "items": {
                    "$ref": "#/definitions/ServiceRequest"
                  }
                }
              }
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/service-requests/my_credit_requests/": {
      "get": {
        "operationId": "api_service-requests_my_credit_requests",
        "summary": "Obtener solicitudes de crédito del cliente autenticado.",
        "description": "GET /api/inquiries/service-requests/my_credit_requests/",
        "parameters": [
          {
            "name": "status",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "status__in",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "request_type",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "request_type__in",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "source",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "source__in",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "priority",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "priority__in",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "created_at__date",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "created_at__gte",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "created_at__lte",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "closed_at__date",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "closed_at__gte",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "closed_at__lte",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "closed_at__isnull",
            "in": "query",
            "description": "",
            "required": false,
            "type": "string"
          },
          {
            "name": "search",
            "in": "query",
            "description": "Un término de búsqueda.",
            "required": false,
            "type": "string"
          },
          {
            "name": "ordering",
            "in": "query",
            "description": "Qué campo usar para ordenar los resultados.",
            "required": false,
            "type": "string"
          },
          {
            "name": "page",
            "in": "query",
            "description": "Un número de página dentro del conjunto de resultados paginado.",
            "required": false,
            "type": "integer"
          },
          {
            "name": "page_size",
            "in": "query",
            "description": "Número de resultados a devolver por página.",
            "required": false,
            "type": "integer"
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "required": [
                "count",
                "results"
              ],
              "type": "object",
              "properties": {
                "count": {
                  "type": "integer"
                },
                "next": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "previous": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "results": {
                  "type": "array",
                  "items": {
                    "$ref": "#/definitions/ServiceRequest"
                  }
                }
              }
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/service-requests/submit_credit_request/": {
      "post": {
        "operationId": "api_service-requests_submit_credit_request",
        "summary": "Endpoint para que clientes autenticados soliciten crédito.\nSolo accesible para usuarios con perfil de cliente.",
        "description": "POST /api/inquiries/service-requests/submit_credit_request/",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/ServiceRequest"
            }
          }
        ],
        "responses": {
          "201": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/ServiceRequest"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/service-requests/submit_web_form/": {
      "post": {
        "operationId": "api_service-requests_submit_web_form",
        "description": "Endpoint público para formularios web.",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/ServiceRequest"
            }
          }
        ],
        "responses": {
          "201": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/ServiceRequest"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/service-requests/{id}/": {
      "get": {
        "operationId": "api_service-requests_read",
        "description": "ViewSet unificado para todas las solicitudes de servicio.",
        "parameters": [],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/ServiceRequest"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "put": {
        "operationId": "api_service-requests_update",
        "description": "ViewSet unificado para todas las solicitudes de servicio.",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/ServiceRequestUpdate"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/ServiceRequestUpdate"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "patch": {
        "operationId": "api_service-requests_partial_update",
        "description": "ViewSet unificado para todas las solicitudes de servicio.",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/ServiceRequestUpdate"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/ServiceRequestUpdate"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "delete": {
        "operationId": "api_service-requests_delete",
        "description": "Sobrescribe el método destroy para registrar auditoría antes de la eliminación.",
        "parameters": [],
        "responses": {
          "204": {
            "description": ""
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "description": "Un valor de entero único que identifique este Solicitud de Servicio.",
          "required": true,
          "type": "integer"
        }
      ]
    },
    "/api/service-requests/{id}/add_note/": {
      "post": {
        "operationId": "api_service-requests_add_note",
        "description": "Agregar una nota a la solicitud",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/ServiceRequest"
            }
          }
        ],
        "responses": {
          "201": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/ServiceRequest"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "description": "Un valor de entero único que identifique este Solicitud de Servicio.",
          "required": true,
          "type": "integer"
        }
      ]
    },
    "/api/service-requests/{id}/approve_withdrawal/": {
      "post": {
        "operationId": "api_service-requests_approve_withdrawal",
        "summary": "Aprueba una solicitud de retiro de capital.\nCrea la transacción de retiro y cierra la solicitud.",
        "description": "POST /api/service-requests/{id}/approve_withdrawal/",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/ServiceRequest"
            }
          }
        ],
        "responses": {
          "201": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/ServiceRequest"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "description": "Un valor de entero único que identifique este Solicitud de Servicio.",
          "required": true,
          "type": "integer"
        }
      ]
    },
    "/api/service-requests/{id}/assign_to_me/": {
      "post": {
        "operationId": "api_service-requests_assign_to_me",
        "description": "Asignar la solicitud al usuario actual",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/ServiceRequest"
            }
          }
        ],
        "responses": {
          "201": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/ServiceRequest"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "description": "Un valor de entero único que identifique este Solicitud de Servicio.",
          "required": true,
          "type": "integer"
        }
      ]
    },
    "/api/service-requests/{id}/audit_logs/": {
      "get": {
        "operationId": "api_service-requests_audit_logs",
        "description": "Obtener historial de auditoría de una solicitud específica",
        "parameters": [],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/ServiceRequest"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "description": "Un valor de entero único que identifique este Solicitud de Servicio.",
          "required": true,
          "type": "integer"
        }
      ]
    },
    "/api/service-requests/{id}/available_slots/": {
      "get": {
        "operationId": "api_service-requests_available_slots",
        "description": "Obtiene slots disponibles de 1 hora para agendar citas en Google Calendar.\nGET /api/service-requests/{id}/available_slots/?date=YYYY-MM-DD",
        "parameters": [],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/ServiceRequest"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "description": "Un valor de entero único que identifique este Solicitud de Servicio.",
          "required": true,
          "type": "integer"
        }
      ]
    },
    "/api/service-requests/{id}/book_appointment/": {
      "post": {
        "operationId": "api_service-requests_book_appointment",
        "description": "Reserva una cita en Google Calendar y asocia la fecha en el detalle.\nPOST /api/service-requests/{id}/book_appointment/",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/ServiceRequest"
            }
          }
        ],
        "responses": {
          "201": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/ServiceRequest"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "description": "Un valor de entero único que identifique este Solicitud de Servicio.",
          "required": true,
          "type": "integer"
        }
      ]
    },
    "/api/service-requests/{id}/change_status/": {
      "post": {
        "operationId": "api_service-requests_change_status",
        "description": "Cambiar el estado de la solicitud",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/ServiceRequest"
            }
          }
        ],
        "responses": {
          "201": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/ServiceRequest"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "description": "Un valor de entero único que identifique este Solicitud de Servicio.",
          "required": true,
          "type": "integer"
        }
      ]
    },
    "/api/service-requests/{id}/crear_contrato/": {
      "post": {
        "operationId": "api_service-requests_crear_contrato",
        "summary": "Crea un contrato a partir de una solicitud de crédito aprobada.",
        "description": "FLUJO MEJORADO:\n1. Si no existe el cliente, lo crea automáticamente con los datos de la solicitud\n2. Vincula el cliente a la solicitud para trazabilidad\n3. Crea el contrato asociado\n\nPOST /api/service-requests/{id}/crear_contrato/",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/ServiceRequest"
            }
          }
        ],
        "responses": {
          "201": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/ServiceRequest"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "description": "Un valor de entero único que identifique este Solicitud de Servicio.",
          "required": true,
          "type": "integer"
        }
      ]
    },
    "/api/service-requests/{id}/reject_withdrawal/": {
      "post": {
        "operationId": "api_service-requests_reject_withdrawal",
        "summary": "Rechaza una solicitud de retiro de capital.",
        "description": "POST /api/service-requests/{id}/reject_withdrawal/",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/ServiceRequest"
            }
          }
        ],
        "responses": {
          "201": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/ServiceRequest"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "description": "Un valor de entero único que identifique este Solicitud de Servicio.",
          "required": true,
          "type": "integer"
        }
      ]
    },
    "/api/services/": {
      "get": {
        "operationId": "api_services_list",
        "description": "CRUD de servicios; expone `business_line_detail`.",
        "parameters": [
          {
            "name": "page",
            "in": "query",
            "description": "Un número de página dentro del conjunto de resultados paginado.",
            "required": false,
            "type": "integer"
          },
          {
            "name": "page_size",
            "in": "query",
            "description": "Número de resultados a devolver por página.",
            "required": false,
            "type": "integer"
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "required": [
                "count",
                "results"
              ],
              "type": "object",
              "properties": {
                "count": {
                  "type": "integer"
                },
                "next": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "previous": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "results": {
                  "type": "array",
                  "items": {
                    "$ref": "#/definitions/CoreServiceSerializer"
                  }
                }
              }
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "post": {
        "operationId": "api_services_create",
        "description": "CRUD de servicios; expone `business_line_detail`.",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/CoreServiceSerializer"
            }
          }
        ],
        "responses": {
          "201": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/CoreServiceSerializer"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/services/{code}/": {
      "get": {
        "operationId": "api_services_read",
        "description": "CRUD de servicios; expone `business_line_detail`.",
        "parameters": [],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/CoreServiceSerializer"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "put": {
        "operationId": "api_services_update",
        "description": "CRUD de servicios; expone `business_line_detail`.",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/CoreServiceSerializer"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/CoreServiceSerializer"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "patch": {
        "operationId": "api_services_partial_update",
        "description": "CRUD de servicios; expone `business_line_detail`.",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/CoreServiceSerializer"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/CoreServiceSerializer"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "delete": {
        "operationId": "api_services_delete",
        "description": "CRUD de servicios; expone `business_line_detail`.",
        "parameters": [],
        "responses": {
          "204": {
            "description": ""
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": [
        {
          "name": "code",
          "in": "path",
          "description": "Un valor único que identifique este service.",
          "required": true,
          "type": "string"
        }
      ]
    },
    "/api/standards/coverage/": {
      "get": {
        "operationId": "api_standards_coverage_list",
        "description": "GET /api/standards/coverage/ : quien ha leido que (solo administradores).",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/standards/learn_hub/pages/": {
      "get": {
        "operationId": "api_standards_learn_hub_pages_list",
        "summary": "GET /api/standards/learn_hub/pages/ : las páginas del sitio público, ya armadas.",
        "description": "Es público a propósito: devuelve exactamente lo que el sitio publica (solo\nversiones aprobadas de audiencia pública, cliente o inversionista), nada\nmás. Lo consume el workflow que construye el Learn Hub en GitHub, que no\ntiene acceso a la base de datos.",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/standards/learn_hub/publish/": {
      "post": {
        "operationId": "api_standards_learn_hub_publish_create",
        "summary": "POST /api/standards/learn_hub/publish/ : pide reconstruir el sitio ahora.",
        "description": "Lo mismo que ocurre solo al aprobar un documento público, pero a demanda:\ntras corregir varios documentos, o cuando el disparo automático falló.",
        "parameters": [],
        "responses": {
          "201": {
            "description": ""
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/standards/my_training/": {
      "get": {
        "operationId": "api_standards_my_training_list",
        "description": "GET /api/standards/my_training/ : lecturas pendientes y hechas del usuario.",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/standards/standards/": {
      "get": {
        "operationId": "api_standards_standards_list",
        "description": "",
        "parameters": [
          {
            "name": "search",
            "in": "query",
            "description": "Un término de búsqueda.",
            "required": false,
            "type": "string"
          },
          {
            "name": "ordering",
            "in": "query",
            "description": "Qué campo usar para ordenar los resultados.",
            "required": false,
            "type": "string"
          },
          {
            "name": "page",
            "in": "query",
            "description": "Un número de página dentro del conjunto de resultados paginado.",
            "required": false,
            "type": "integer"
          },
          {
            "name": "page_size",
            "in": "query",
            "description": "Número de resultados a devolver por página.",
            "required": false,
            "type": "integer"
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "required": [
                "count",
                "results"
              ],
              "type": "object",
              "properties": {
                "count": {
                  "type": "integer"
                },
                "next": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "previous": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "results": {
                  "type": "array",
                  "items": {
                    "$ref": "#/definitions/Standard"
                  }
                }
              }
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "post": {
        "operationId": "api_standards_standards_create",
        "description": "",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/StandardCreate"
            }
          }
        ],
        "responses": {
          "201": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/StandardCreate"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/standards/standards/catalog/": {
      "get": {
        "operationId": "api_standards_standards_catalog",
        "description": "Catalogos para los selectores del frontend.",
        "parameters": [
          {
            "name": "search",
            "in": "query",
            "description": "Un término de búsqueda.",
            "required": false,
            "type": "string"
          },
          {
            "name": "ordering",
            "in": "query",
            "description": "Qué campo usar para ordenar los resultados.",
            "required": false,
            "type": "string"
          },
          {
            "name": "page",
            "in": "query",
            "description": "Un número de página dentro del conjunto de resultados paginado.",
            "required": false,
            "type": "integer"
          },
          {
            "name": "page_size",
            "in": "query",
            "description": "Número de resultados a devolver por página.",
            "required": false,
            "type": "integer"
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "required": [
                "count",
                "results"
              ],
              "type": "object",
              "properties": {
                "count": {
                  "type": "integer"
                },
                "next": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "previous": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "results": {
                  "type": "array",
                  "items": {
                    "$ref": "#/definitions/Standard"
                  }
                }
              }
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/standards/standards/{id}/": {
      "get": {
        "operationId": "api_standards_standards_read",
        "description": "",
        "parameters": [],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/Standard"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "put": {
        "operationId": "api_standards_standards_update",
        "description": "",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/Standard"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/Standard"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "patch": {
        "operationId": "api_standards_standards_partial_update",
        "description": "",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/Standard"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/Standard"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "delete": {
        "operationId": "api_standards_standards_delete",
        "description": "",
        "parameters": [],
        "responses": {
          "204": {
            "description": ""
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "required": true,
          "type": "string"
        }
      ]
    },
    "/api/standards/standards/{id}/mark_read/": {
      "post": {
        "operationId": "api_standards_standards_mark_read",
        "description": "El usuario confirma que leyo la version vigente: flujo de capacitacion.",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/Standard"
            }
          }
        ],
        "responses": {
          "201": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/Standard"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "required": true,
          "type": "string"
        }
      ]
    },
    "/api/standards/standards/{id}/new_version/": {
      "post": {
        "operationId": "api_standards_standards_new_version",
        "description": "",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/Standard"
            }
          }
        ],
        "responses": {
          "201": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/Standard"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "required": true,
          "type": "string"
        }
      ]
    },
    "/api/standards/standards/{id}/versions/": {
      "get": {
        "operationId": "api_standards_standards_versions",
        "description": "",
        "parameters": [],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/Standard"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "required": true,
          "type": "string"
        }
      ]
    },
    "/api/standards/standards/{id}/versions/{number}/approve/": {
      "post": {
        "operationId": "api_standards_standards_versions_approve",
        "description": "",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/Standard"
            }
          }
        ],
        "responses": {
          "201": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/Standard"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "required": true,
          "type": "string"
        },
        {
          "name": "number",
          "in": "path",
          "required": true,
          "type": "string"
        }
      ]
    },
    "/api/standards/versions/": {
      "get": {
        "operationId": "api_standards_versions_list",
        "description": "",
        "parameters": [
          {
            "name": "page",
            "in": "query",
            "description": "Un número de página dentro del conjunto de resultados paginado.",
            "required": false,
            "type": "integer"
          },
          {
            "name": "page_size",
            "in": "query",
            "description": "Número de resultados a devolver por página.",
            "required": false,
            "type": "integer"
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "required": [
                "count",
                "results"
              ],
              "type": "object",
              "properties": {
                "count": {
                  "type": "integer"
                },
                "next": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "previous": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "results": {
                  "type": "array",
                  "items": {
                    "$ref": "#/definitions/DocumentVersion"
                  }
                }
              }
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/standards/versions/{id}/": {
      "get": {
        "operationId": "api_standards_versions_read",
        "description": "",
        "parameters": [],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/DocumentVersion"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "required": true,
          "type": "string"
        }
      ]
    },
    "/api/stress-test/simular/": {
      "get": {
        "operationId": "api_stress-test_simular_list",
        "description": "Pruebas de Estrés Financiero y Resiliencia de Cartera (Portfolio Stress Testing).\nGET /api/stress-test/simular/?npl_increase=5.0&yield_drop=10.0",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/surveys/public/{token}/": {
      "get": {
        "operationId": "api_surveys_public_read",
        "description": "",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": [
        {
          "name": "token",
          "in": "path",
          "required": true,
          "type": "string"
        }
      ]
    },
    "/api/surveys/public/{token}/responder/": {
      "post": {
        "operationId": "api_surveys_public_responder_create",
        "description": "",
        "parameters": [],
        "responses": {
          "201": {
            "description": ""
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": [
        {
          "name": "token",
          "in": "path",
          "required": true,
          "type": "string"
        }
      ]
    },
    "/api/system-parameters/": {
      "get": {
        "operationId": "api_system-parameters_list",
        "description": "CRUD de parámetros del sistema (SMLV, configuraciones).",
        "parameters": [
          {
            "name": "page",
            "in": "query",
            "description": "Un número de página dentro del conjunto de resultados paginado.",
            "required": false,
            "type": "integer"
          },
          {
            "name": "page_size",
            "in": "query",
            "description": "Número de resultados a devolver por página.",
            "required": false,
            "type": "integer"
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "required": [
                "count",
                "results"
              ],
              "type": "object",
              "properties": {
                "count": {
                  "type": "integer"
                },
                "next": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "previous": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "results": {
                  "type": "array",
                  "items": {
                    "$ref": "#/definitions/CoreSystemParameterSerializer"
                  }
                }
              }
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "post": {
        "operationId": "api_system-parameters_create",
        "description": "CRUD de parámetros del sistema (SMLV, configuraciones).",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/CoreSystemParameterSerializer"
            }
          }
        ],
        "responses": {
          "201": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/CoreSystemParameterSerializer"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/system-parameters/{key}/": {
      "get": {
        "operationId": "api_system-parameters_read",
        "description": "CRUD de parámetros del sistema (SMLV, configuraciones).",
        "parameters": [],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/CoreSystemParameterSerializer"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "put": {
        "operationId": "api_system-parameters_update",
        "description": "CRUD de parámetros del sistema (SMLV, configuraciones).",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/CoreSystemParameterSerializer"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/CoreSystemParameterSerializer"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "patch": {
        "operationId": "api_system-parameters_partial_update",
        "description": "CRUD de parámetros del sistema (SMLV, configuraciones).",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/CoreSystemParameterSerializer"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/CoreSystemParameterSerializer"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "delete": {
        "operationId": "api_system-parameters_delete",
        "description": "CRUD de parámetros del sistema (SMLV, configuraciones).",
        "parameters": [],
        "responses": {
          "204": {
            "description": ""
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": [
        {
          "name": "key",
          "in": "path",
          "description": "Clave única del parámetro (ej: SMLV_2024)",
          "required": true,
          "type": "string"
        }
      ]
    },
    "/api/token/": {
      "post": {
        "operationId": "api_token_create",
        "description": "Login estándar (drop-in en /api/token/): mismo body de respuesta\n{access, refresh}, más la cookie httpOnly de dominio padre.",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/TokenObtainPair"
            }
          }
        ],
        "responses": {
          "201": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/TokenObtainPair"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/token/refresh-cookie/": {
      "post": {
        "operationId": "api_token_refresh-cookie_create",
        "summary": "POST /api/token/refresh-cookie/ — refresca leyendo la cookie httpOnly.",
        "description": "Acepta también `refresh` en el body (mismo contrato que /api/token/refresh/),\ncon la cookie como fallback, así una sola vista sirve a ambos flujos. Con\nROTATE_REFRESH_TOKENS la respuesta trae un refresh nuevo: se re-emite la\ncookie. Si el refresh es inválido/expirado, se borra la cookie para no\ndejar al navegador en un bucle de reintentos.",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/TokenRefresh"
            }
          }
        ],
        "responses": {
          "201": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/TokenRefresh"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/token/refresh/": {
      "post": {
        "operationId": "api_token_refresh_create",
        "description": "Takes a refresh type JSON web token and returns an access type JSON web\ntoken if the refresh token is valid.",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/TokenRefresh"
            }
          }
        ],
        "responses": {
          "201": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/TokenRefresh"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/transactions/": {
      "get": {
        "operationId": "api_transactions_list",
        "description": "ViewSet para transacciones con endpoints adicionales\npara operaciones de negocio.",
        "parameters": [
          {
            "name": "page",
            "in": "query",
            "description": "Un número de página dentro del conjunto de resultados paginado.",
            "required": false,
            "type": "integer"
          },
          {
            "name": "page_size",
            "in": "query",
            "description": "Número de resultados a devolver por página.",
            "required": false,
            "type": "integer"
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "required": [
                "count",
                "results"
              ],
              "type": "object",
              "properties": {
                "count": {
                  "type": "integer"
                },
                "next": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "previous": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "results": {
                  "type": "array",
                  "items": {
                    "$ref": "#/definitions/GlobalTransaction"
                  }
                }
              }
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "post": {
        "operationId": "api_transactions_create",
        "description": "ViewSet para transacciones con endpoints adicionales\npara operaciones de negocio.",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/GlobalTransaction"
            }
          }
        ],
        "responses": {
          "201": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/GlobalTransaction"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/transactions/deposito-inversionista/": {
      "post": {
        "operationId": "api_transactions_deposito_inversionista",
        "summary": "Registra un depósito de un inversionista.",
        "description": "POST /api/transactions/deposito-inversionista/",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/GlobalTransaction"
            }
          }
        ],
        "responses": {
          "201": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/GlobalTransaction"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/transactions/disponible-inversionista/{inversionista_id}/": {
      "get": {
        "operationId": "api_transactions_disponible_inversionista",
        "summary": "Calcula el disponible actual de un inversionista.",
        "description": "GET /api/transactions/disponible-inversionista/{inversionista_id}/",
        "parameters": [
          {
            "name": "page",
            "in": "query",
            "description": "Un número de página dentro del conjunto de resultados paginado.",
            "required": false,
            "type": "integer"
          },
          {
            "name": "page_size",
            "in": "query",
            "description": "Número de resultados a devolver por página.",
            "required": false,
            "type": "integer"
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "required": [
                "count",
                "results"
              ],
              "type": "object",
              "properties": {
                "count": {
                  "type": "integer"
                },
                "next": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "previous": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "results": {
                  "type": "array",
                  "items": {
                    "$ref": "#/definitions/GlobalTransaction"
                  }
                }
              }
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": [
        {
          "name": "inversionista_id",
          "in": "path",
          "required": true,
          "type": "string"
        }
      ]
    },
    "/api/transactions/motives-catalog/": {
      "get": {
        "operationId": "api_transactions_motives_catalog",
        "description": "Catalogo consolidado para homologar motivos entre legacy y v3.",
        "parameters": [
          {
            "name": "page",
            "in": "query",
            "description": "Un número de página dentro del conjunto de resultados paginado.",
            "required": false,
            "type": "integer"
          },
          {
            "name": "page_size",
            "in": "query",
            "description": "Número de resultados a devolver por página.",
            "required": false,
            "type": "integer"
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "required": [
                "count",
                "results"
              ],
              "type": "object",
              "properties": {
                "count": {
                  "type": "integer"
                },
                "next": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "previous": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "results": {
                  "type": "array",
                  "items": {
                    "$ref": "#/definitions/GlobalTransaction"
                  }
                }
              }
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/transactions/reconciliation/": {
      "get": {
        "operationId": "api_transactions_reconciliation",
        "summary": "Reporte de conciliacion entre transacciones legacy y movimientos v3.",
        "description": "Filtros opcionales:\n- inversionista / inversionista_id\n- contrato / contrato_id\n- include_details=true para incluir filas con brecha TX-MOV",
        "parameters": [
          {
            "name": "page",
            "in": "query",
            "description": "Un número de página dentro del conjunto de resultados paginado.",
            "required": false,
            "type": "integer"
          },
          {
            "name": "page_size",
            "in": "query",
            "description": "Número de resultados a devolver por página.",
            "required": false,
            "type": "integer"
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "required": [
                "count",
                "results"
              ],
              "type": "object",
              "properties": {
                "count": {
                  "type": "integer"
                },
                "next": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "previous": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "results": {
                  "type": "array",
                  "items": {
                    "$ref": "#/definitions/GlobalTransaction"
                  }
                }
              }
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/transactions/{id_transaccion}/": {
      "get": {
        "operationId": "api_transactions_read",
        "description": "ViewSet para transacciones con endpoints adicionales\npara operaciones de negocio.",
        "parameters": [],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/GlobalTransaction"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "put": {
        "operationId": "api_transactions_update",
        "description": "ViewSet para transacciones con endpoints adicionales\npara operaciones de negocio.",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/GlobalTransaction"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/GlobalTransaction"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "patch": {
        "operationId": "api_transactions_partial_update",
        "description": "ViewSet para transacciones con endpoints adicionales\npara operaciones de negocio.",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/GlobalTransaction"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/GlobalTransaction"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "delete": {
        "operationId": "api_transactions_delete",
        "description": "ViewSet para transacciones con endpoints adicionales\npara operaciones de negocio.",
        "parameters": [],
        "responses": {
          "204": {
            "description": ""
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": [
        {
          "name": "id_transaccion",
          "in": "path",
          "description": "Un valor de entero único que identifique este Transacción.",
          "required": true,
          "type": "integer"
        }
      ]
    },
    "/api/users/": {
      "get": {
        "operationId": "api_users_list",
        "description": "ViewSet para gestión de usuarios",
        "parameters": [
          {
            "name": "page",
            "in": "query",
            "description": "Un número de página dentro del conjunto de resultados paginado.",
            "required": false,
            "type": "integer"
          },
          {
            "name": "page_size",
            "in": "query",
            "description": "Número de resultados a devolver por página.",
            "required": false,
            "type": "integer"
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "required": [
                "count",
                "results"
              ],
              "type": "object",
              "properties": {
                "count": {
                  "type": "integer"
                },
                "next": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "previous": {
                  "type": "string",
                  "format": "uri",
                  "x-nullable": true
                },
                "results": {
                  "type": "array",
                  "items": {
                    "$ref": "#/definitions/User"
                  }
                }
              }
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "post": {
        "operationId": "api_users_create",
        "description": "ViewSet para gestión de usuarios",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/UserCreate"
            }
          }
        ],
        "responses": {
          "201": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/UserCreate"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/users/create_client_user/": {
      "post": {
        "operationId": "api_users_create_client_user",
        "description": "Crear usuario vinculado a un cliente",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/ClientUserCreate"
            }
          }
        ],
        "responses": {
          "201": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/ClientUserCreate"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/users/create_investor_user/": {
      "post": {
        "operationId": "api_users_create_investor_user",
        "description": "Crear usuario vinculado a un inversionista",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/InvestorUserCreate"
            }
          }
        ],
        "responses": {
          "201": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/InvestorUserCreate"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": []
    },
    "/api/users/{id}/": {
      "get": {
        "operationId": "api_users_read",
        "description": "ViewSet para gestión de usuarios",
        "parameters": [],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/UserDetail"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "put": {
        "operationId": "api_users_update",
        "description": "Actualizar usuario (sin cambiar contraseña aquí)",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/UserUpdate"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/UserUpdate"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "patch": {
        "operationId": "api_users_partial_update",
        "description": "ViewSet para gestión de usuarios",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/UserUpdate"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/UserUpdate"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "delete": {
        "operationId": "api_users_delete",
        "description": "ViewSet para gestión de usuarios",
        "parameters": [],
        "responses": {
          "204": {
            "description": ""
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "description": "Un valor de entero único que identifique este usuario.",
          "required": true,
          "type": "integer"
        }
      ]
    },
    "/api/users/{id}/set_password/": {
      "post": {
        "operationId": "api_users_set_password",
        "description": "Cambiar contraseña de un usuario",
        "parameters": [
          {
            "name": "data",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/PasswordChange"
            }
          }
        ],
        "responses": {
          "201": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/PasswordChange"
            }
          }
        },
        "tags": [
          "api"
        ]
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "description": "Un valor de entero único que identifique este usuario.",
          "required": true,
          "type": "integer"
        }
      ]
    },
    "/contrato_intermediacion/{id}/data/": {
      "get": {
        "operationId": "contrato_intermediacion_data_list",
        "description": "Devuelve en formato JSON la información del contrato.",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "tags": [
          "contrato_intermediacion"
        ]
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "required": true,
          "type": "string"
        }
      ]
    }
  },
  "definitions": {
    "AdvisorGoal": {
      "required": [
        "user",
        "period",
        "metric",
        "target_value"
      ],
      "type": "object",
      "properties": {
        "id": {
          "title": "ID",
          "type": "integer",
          "readOnly": true
        },
        "user": {
          "title": "User",
          "type": "integer"
        },
        "username": {
          "title": "Username",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        },
        "period": {
          "title": "Period",
          "description": "Formato YYYY-MM",
          "type": "string",
          "maxLength": 7,
          "minLength": 1
        },
        "metric": {
          "title": "Metric",
          "type": "string",
          "enum": [
            "active_hours",
            "activities",
            "leads_converted",
            "files_reviewed",
            "posts_published",
            "collections_amount",
            "satisfaccion"
          ]
        },
        "metric_display": {
          "title": "Metric display",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        },
        "target_value": {
          "title": "Target value",
          "type": "string",
          "format": "decimal"
        },
        "created_at": {
          "title": "Created at",
          "type": "string",
          "format": "date-time",
          "readOnly": true
        },
        "updated_at": {
          "title": "Updated at",
          "type": "string",
          "format": "date-time",
          "readOnly": true
        }
      }
    },
    "ContractStatus": {
      "required": [
        "code",
        "name"
      ],
      "type": "object",
      "properties": {
        "code": {
          "title": "Code",
          "type": "integer",
          "maximum": 2147483647,
          "minimum": -2147483648
        },
        "name": {
          "title": "Name",
          "type": "string",
          "maxLength": 50,
          "minLength": 1
        },
        "description": {
          "title": "Description",
          "type": "string"
        }
      }
    },
    "Obligation": {
      "required": [
        "institution",
        "obligation_name",
        "amount",
        "status"
      ],
      "type": "object",
      "properties": {
        "id": {
          "title": "ID",
          "type": "integer",
          "readOnly": true
        },
        "institution": {
          "title": "Institution",
          "type": "string",
          "maxLength": 255,
          "minLength": 1
        },
        "obligation_name": {
          "title": "Obligation name",
          "type": "string",
          "maxLength": 255,
          "minLength": 1
        },
        "amount": {
          "title": "Amount",
          "type": "string",
          "format": "decimal"
        },
        "status": {
          "title": "Status",
          "type": "string",
          "maxLength": 100,
          "minLength": 1
        }
      }
    },
    "Portfolio": {
      "required": [
        "contract",
        "follow_up_date"
      ],
      "type": "object",
      "properties": {
        "id": {
          "title": "ID",
          "type": "integer",
          "readOnly": true
        },
        "contract": {
          "title": "Contract",
          "type": "string"
        },
        "contract_no": {
          "title": "Contract no",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        },
        "client_name": {
          "title": "Client name",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        },
        "client_id": {
          "title": "Client id",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        },
        "contract_status": {
          "title": "Contract status",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        },
        "follow_up_date": {
          "title": "Follow up date",
          "type": "string",
          "format": "date"
        },
        "notes": {
          "title": "Notes",
          "type": "string"
        },
        "portfolio_type": {
          "title": "Portfolio type",
          "type": "string",
          "enum": [
            "normal",
            "early",
            "mid",
            "late",
            "prelegal",
            "legal"
          ]
        },
        "portfolio_type_display": {
          "title": "Portfolio type display",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        },
        "priority": {
          "title": "Priority",
          "type": "integer",
          "enum": [
            1,
            2,
            3,
            4,
            5
          ]
        },
        "priority_display": {
          "title": "Priority display",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        },
        "next_action": {
          "title": "Next action",
          "type": "string",
          "maxLength": 200
        },
        "assigned_to": {
          "title": "Assigned to",
          "type": "integer",
          "x-nullable": true
        },
        "assigned_to_username": {
          "title": "Assigned to username",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        },
        "days_overdue": {
          "title": "Days overdue",
          "type": "integer",
          "readOnly": true
        },
        "total_debt": {
          "title": "Total debt",
          "type": "string",
          "format": "decimal"
        },
        "last_payment_date": {
          "title": "Last payment date",
          "type": "string",
          "format": "date",
          "x-nullable": true
        },
        "last_contact_date": {
          "title": "Last contact date",
          "type": "string",
          "format": "date",
          "x-nullable": true
        },
        "contact_attempts": {
          "title": "Contact attempts",
          "type": "integer",
          "maximum": 2147483647,
          "minimum": -2147483648
        },
        "is_active": {
          "title": "Is active",
          "type": "boolean"
        },
        "created_at": {
          "title": "Created at",
          "type": "string",
          "format": "date-time",
          "readOnly": true
        },
        "updated_at": {
          "title": "Updated at",
          "type": "string",
          "format": "date-time",
          "readOnly": true
        }
      }
    },
    "Contract": {
      "required": [
        "no_contrato",
        "monto",
        "valor_proyectado",
        "honorarios",
        "tasa"
      ],
      "type": "object",
      "properties": {
        "no_contrato": {
          "title": "Número de Contrato",
          "description": "Identificador único del contrato",
          "type": "string",
          "maxLength": 255,
          "minLength": 1
        },
        "fecha_desembolso": {
          "title": "Fecha de Desembolso",
          "type": "string",
          "format": "date",
          "x-nullable": true
        },
        "terminacion": {
          "title": "Fecha de Terminación",
          "type": "string",
          "format": "date",
          "x-nullable": true
        },
        "monto": {
          "title": "Monto Principal",
          "type": "string",
          "format": "decimal"
        },
        "valor_proyectado": {
          "title": "Valor Proyectado",
          "type": "string",
          "format": "decimal"
        },
        "valor_texto": {
          "title": "Monto en Texto",
          "description": "Representación textual del monto principal (ej. Cien mil pesos)",
          "type": "string"
        },
        "honorarios": {
          "title": "Honorarios",
          "type": "string",
          "format": "decimal"
        },
        "honorarios_sin_costo_fijo": {
          "title": "Honorarios sin Costo Fijo",
          "description": "Honorarios calculados sin incluir el costo fijo",
          "type": "string",
          "format": "decimal"
        },
        "costo_fijo": {
          "title": "Costo Fijo (SMLV)",
          "description": "Costo fijo basado en el Salario Mínimo Legal Vigente",
          "type": "string",
          "format": "decimal"
        },
        "tasa": {
          "title": "Tasa (%)",
          "description": "Tasa de interés o similar (ej. 12.50 para 12.50%)",
          "type": "string",
          "format": "decimal"
        },
        "aplica_juridico": {
          "title": "Aplica Jurídico",
          "description": "Indica si el contrato pasó a un proceso jurídico",
          "type": "boolean",
          "x-nullable": true
        },
        "aplica_codeudor": {
          "title": "Aplica Codeudor",
          "description": "Indica si el contrato tiene un codeudor asociado",
          "type": "boolean",
          "x-nullable": true
        },
        "parent_contract": {
          "title": "Contrato Principal",
          "description": "Contrato al que está asociado este contrato como auxiliar, si aplica",
          "type": "string",
          "x-nullable": true
        },
        "codigo_estado_contrato": {
          "title": "Codigo estado contrato",
          "type": "integer",
          "x-nullable": true
        },
        "codigo_estado_contrato_detalle": {
          "$ref": "#/definitions/ContractStatus"
        },
        "created_by": {
          "title": "Creado por",
          "type": "integer",
          "readOnly": true,
          "x-nullable": true
        },
        "id_cliente": {
          "title": "Cliente",
          "type": "string",
          "x-nullable": true
        },
        "id_inversionista": {
          "title": "Inversionista",
          "type": "integer",
          "x-nullable": true
        },
        "linea_credito": {
          "title": "Línea de Negocio/Crédito",
          "type": "string"
        },
        "service": {
          "title": "Service",
          "type": "string",
          "x-nullable": true
        },
        "service_request": {
          "title": "Service request",
          "type": "integer",
          "x-nullable": true
        },
        "id_codeudor": {
          "title": "Codeudor",
          "type": "string",
          "x-nullable": true
        },
        "tipo_contrato": {
          "title": "Tipo de contrato",
          "type": "string",
          "enum": [
            "cliente",
            "inversionista",
            "auxiliar"
          ]
        },
        "obligations": {
          "type": "array",
          "items": {
            "$ref": "#/definitions/Obligation"
          },
          "readOnly": true
        },
        "portfolios": {
          "type": "array",
          "items": {
            "$ref": "#/definitions/Portfolio"
          },
          "readOnly": true
        },
        "dias_mora": {
          "title": "Dias mora",
          "type": "integer",
          "readOnly": true
        },
        "dias_mora_real": {
          "title": "Dias mora real",
          "type": "integer",
          "readOnly": true
        },
        "fecha_ultimo_abono": {
          "title": "Fecha ultimo abono",
          "type": "string",
          "format": "date",
          "readOnly": true
        }
      }
    },
    "EditorialEntry": {
      "required": [
        "kind",
        "title",
        "planned_date"
      ],
      "type": "object",
      "properties": {
        "id": {
          "title": "ID",
          "type": "integer",
          "readOnly": true
        },
        "kind": {
          "title": "Tipo",
          "type": "string",
          "enum": [
            "post",
            "podcast",
            "material",
            "campana"
          ]
        },
        "kind_display": {
          "title": "Kind display",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        },
        "title": {
          "title": "Título tentativo",
          "type": "string",
          "maxLength": 255,
          "minLength": 1
        },
        "planned_date": {
          "title": "Fecha objetivo",
          "type": "string",
          "format": "date"
        },
        "responsible": {
          "title": "Responsable",
          "type": "integer",
          "x-nullable": true
        },
        "responsible_name": {
          "title": "Responsible name",
          "type": "string",
          "readOnly": true
        },
        "status": {
          "title": "Estado",
          "type": "string",
          "enum": [
            "planeado",
            "en_curso",
            "publicado",
            "cancelado"
          ]
        },
        "status_display": {
          "title": "Status display",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        },
        "blog_post": {
          "title": "Artículo vinculado",
          "type": "integer",
          "x-nullable": true
        },
        "blog_post_title": {
          "title": "Blog post title",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        },
        "podcast_episode": {
          "title": "Episodio vinculado",
          "type": "integer",
          "x-nullable": true
        },
        "podcast_episode_title": {
          "title": "Podcast episode title",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        },
        "notes": {
          "title": "Notas",
          "type": "string"
        },
        "created_at": {
          "title": "Created at",
          "type": "string",
          "format": "date-time",
          "readOnly": true
        },
        "updated_at": {
          "title": "Updated at",
          "type": "string",
          "format": "date-time",
          "readOnly": true
        }
      }
    },
    "PodcastEpisodeList": {
      "required": [
        "title",
        "description",
        "episode_number"
      ],
      "type": "object",
      "properties": {
        "id": {
          "title": "ID",
          "type": "integer",
          "readOnly": true
        },
        "title": {
          "title": "Título",
          "type": "string",
          "maxLength": 200,
          "minLength": 1
        },
        "description": {
          "title": "Descripción",
          "type": "string",
          "minLength": 1
        },
        "audio_file": {
          "title": "Archivo de audio",
          "description": "Formatos aceptados: .mp3, .wav, .m4a",
          "type": "string",
          "readOnly": true,
          "format": "uri"
        },
        "cover_image": {
          "title": "Imagen de portada",
          "type": "string",
          "readOnly": true,
          "x-nullable": true,
          "format": "uri"
        },
        "duration": {
          "title": "Duración",
          "description": "Formato \"MM:SS\"",
          "type": "string",
          "maxLength": 10,
          "minLength": 1
        },
        "episode_number": {
          "title": "Número de episodio",
          "type": "integer",
          "maximum": 4294967295,
          "minimum": 0
        },
        "is_published": {
          "title": "Publicado",
          "type": "boolean"
        },
        "published_at": {
          "title": "Fecha de publicación",
          "type": "string",
          "format": "date-time",
          "x-nullable": true
        },
        "created_at": {
          "title": "Creado",
          "type": "string",
          "format": "date-time",
          "readOnly": true
        }
      }
    },
    "PodcastEpisodeWrite": {
      "required": [
        "title",
        "description",
        "episode_number"
      ],
      "type": "object",
      "properties": {
        "id": {
          "title": "ID",
          "type": "integer",
          "readOnly": true
        },
        "title": {
          "title": "Título",
          "type": "string",
          "maxLength": 200,
          "minLength": 1
        },
        "description": {
          "title": "Descripción",
          "type": "string",
          "minLength": 1
        },
        "audio_file": {
          "title": "Archivo de audio",
          "description": "Formatos aceptados: .mp3, .wav, .m4a",
          "type": "string",
          "readOnly": true,
          "format": "uri"
        },
        "cover_image": {
          "title": "Imagen de portada",
          "type": "string",
          "readOnly": true,
          "x-nullable": true,
          "format": "uri"
        },
        "duration": {
          "title": "Duración",
          "description": "Formato \"MM:SS\"",
          "type": "string",
          "maxLength": 10,
          "minLength": 1
        },
        "episode_number": {
          "title": "Número de episodio",
          "type": "integer",
          "maximum": 4294967295,
          "minimum": 0
        },
        "is_published": {
          "title": "Publicado",
          "type": "boolean"
        },
        "published_at": {
          "title": "Fecha de publicación",
          "type": "string",
          "format": "date-time",
          "x-nullable": true
        }
      }
    },
    "BlogPostList": {
      "required": [
        "title",
        "excerpt"
      ],
      "type": "object",
      "properties": {
        "id": {
          "title": "ID",
          "type": "integer",
          "readOnly": true
        },
        "title": {
          "title": "Título",
          "type": "string",
          "maxLength": 200,
          "minLength": 1
        },
        "slug": {
          "title": "Slug (URL)",
          "description": "Se genera automáticamente desde el título",
          "type": "string",
          "format": "slug",
          "pattern": "^[-a-zA-Z0-9_]+$",
          "maxLength": 250
        },
        "excerpt": {
          "title": "Resumen",
          "description": "Resumen corto para tarjetas (máx 300 caracteres)",
          "type": "string",
          "maxLength": 300,
          "minLength": 1
        },
        "cover_image": {
          "title": "Imagen de portada",
          "type": "string",
          "readOnly": true,
          "x-nullable": true,
          "format": "uri"
        },
        "tags": {
          "title": "Tags",
          "description": "Tags separados por coma (ej: inversiones, crédito)",
          "type": "string",
          "maxLength": 200
        },
        "author_name": {
          "title": "Author name",
          "type": "string",
          "readOnly": true
        },
        "is_published": {
          "title": "Publicado",
          "type": "boolean"
        },
        "published_at": {
          "title": "Fecha de publicación",
          "type": "string",
          "format": "date-time",
          "x-nullable": true
        },
        "created_at": {
          "title": "Creado",
          "type": "string",
          "format": "date-time",
          "readOnly": true
        }
      }
    },
    "BlogPostWrite": {
      "required": [
        "title",
        "excerpt",
        "content"
      ],
      "type": "object",
      "properties": {
        "id": {
          "title": "ID",
          "type": "integer",
          "readOnly": true
        },
        "title": {
          "title": "Título",
          "type": "string",
          "maxLength": 200,
          "minLength": 1
        },
        "excerpt": {
          "title": "Resumen",
          "description": "Resumen corto para tarjetas (máx 300 caracteres)",
          "type": "string",
          "maxLength": 300,
          "minLength": 1
        },
        "content": {
          "title": "Contenido",
          "description": "Contenido del artículo en Markdown",
          "type": "string",
          "minLength": 1
        },
        "cover_image": {
          "title": "Imagen de portada",
          "type": "string",
          "readOnly": true,
          "x-nullable": true,
          "format": "uri"
        },
        "tags": {
          "title": "Tags",
          "description": "Tags separados por coma (ej: inversiones, crédito)",
          "type": "string",
          "maxLength": 200
        },
        "is_published": {
          "title": "Publicado",
          "type": "boolean"
        },
        "published_at": {
          "title": "Fecha de publicación",
          "type": "string",
          "format": "date-time",
          "x-nullable": true
        }
      }
    },
    "BlogPostDetail": {
      "required": [
        "title",
        "excerpt",
        "content"
      ],
      "type": "object",
      "properties": {
        "id": {
          "title": "ID",
          "type": "integer",
          "readOnly": true
        },
        "title": {
          "title": "Título",
          "type": "string",
          "maxLength": 200,
          "minLength": 1
        },
        "slug": {
          "title": "Slug (URL)",
          "description": "Se genera automáticamente desde el título",
          "type": "string",
          "format": "slug",
          "pattern": "^[-a-zA-Z0-9_]+$",
          "maxLength": 250
        },
        "excerpt": {
          "title": "Resumen",
          "description": "Resumen corto para tarjetas (máx 300 caracteres)",
          "type": "string",
          "maxLength": 300,
          "minLength": 1
        },
        "content": {
          "title": "Contenido",
          "description": "Contenido del artículo en Markdown",
          "type": "string",
          "minLength": 1
        },
        "cover_image": {
          "title": "Imagen de portada",
          "type": "string",
          "readOnly": true,
          "x-nullable": true,
          "format": "uri"
        },
        "tags": {
          "title": "Tags",
          "description": "Tags separados por coma (ej: inversiones, crédito)",
          "type": "string",
          "maxLength": 200
        },
        "author": {
          "title": "Autor",
          "type": "integer",
          "x-nullable": true
        },
        "author_name": {
          "title": "Author name",
          "type": "string",
          "readOnly": true
        },
        "is_published": {
          "title": "Publicado",
          "type": "boolean"
        },
        "published_at": {
          "title": "Fecha de publicación",
          "type": "string",
          "format": "date-time",
          "x-nullable": true
        },
        "created_at": {
          "title": "Creado",
          "type": "string",
          "format": "date-time",
          "readOnly": true
        },
        "updated_at": {
          "title": "Actualizado",
          "type": "string",
          "format": "date-time",
          "readOnly": true
        }
      }
    },
    "CoreServiceNestedSerializer": {
      "required": [
        "code",
        "name"
      ],
      "type": "object",
      "properties": {
        "code": {
          "title": "Code",
          "type": "string",
          "maxLength": 20,
          "minLength": 1
        },
        "name": {
          "title": "Name",
          "type": "string",
          "maxLength": 100,
          "minLength": 1
        },
        "description": {
          "title": "Description",
          "type": "string"
        }
      }
    },
    "CoreBusinessLineSerializer": {
      "required": [
        "code",
        "name"
      ],
      "type": "object",
      "properties": {
        "code": {
          "title": "Code",
          "type": "string",
          "maxLength": 20,
          "minLength": 1
        },
        "name": {
          "title": "Name",
          "type": "string",
          "maxLength": 100,
          "minLength": 1
        },
        "description": {
          "title": "Description",
          "type": "string"
        },
        "services": {
          "type": "array",
          "items": {
            "$ref": "#/definitions/CoreServiceNestedSerializer"
          },
          "readOnly": true
        }
      }
    },
    "ClientContractSerializer": {
      "required": [
        "no_contrato",
        "monto",
        "valor_proyectado",
        "honorarios",
        "tasa"
      ],
      "type": "object",
      "properties": {
        "no_contrato": {
          "title": "Número de Contrato",
          "description": "Identificador único del contrato",
          "type": "string",
          "maxLength": 255,
          "minLength": 1
        },
        "fecha_desembolso": {
          "title": "Fecha de Desembolso",
          "type": "string",
          "format": "date",
          "x-nullable": true
        },
        "terminacion": {
          "title": "Fecha de Terminación",
          "type": "string",
          "format": "date",
          "x-nullable": true
        },
        "monto": {
          "title": "Monto Principal",
          "type": "string",
          "format": "decimal"
        },
        "valor_proyectado": {
          "title": "Valor Proyectado",
          "type": "string",
          "format": "decimal"
        },
        "honorarios": {
          "title": "Honorarios",
          "type": "string",
          "format": "decimal"
        },
        "tasa": {
          "title": "Tasa (%)",
          "description": "Tasa de interés o similar (ej. 12.50 para 12.50%)",
          "type": "string",
          "format": "decimal"
        },
        "codigo_estado_contrato": {
          "title": "Estado del Contrato",
          "description": "Estado actual del contrato (relacionado con ContractStatus)",
          "type": "integer",
          "x-nullable": true
        },
        "estado": {
          "title": "Estado",
          "type": "string",
          "readOnly": true
        },
        "deuda_total": {
          "title": "Deuda total",
          "type": "string",
          "readOnly": true
        },
        "saldo_pendiente": {
          "title": "Saldo pendiente",
          "type": "string",
          "readOnly": true
        },
        "total_pagado": {
          "title": "Total pagado",
          "type": "string",
          "readOnly": true
        },
        "transacciones": {
          "title": "Transacciones",
          "type": "string",
          "readOnly": true
        }
      }
    },
    "ClientTransactionSerializer": {
      "required": [
        "fecha"
      ],
      "type": "object",
      "properties": {
        "id_transaccion": {
          "title": "Id transaccion",
          "type": "integer",
          "readOnly": true
        },
        "fecha": {
          "title": "Fecha",
          "type": "string",
          "format": "date-time"
        },
        "tipo": {
          "title": "Tipo",
          "type": "string",
          "readOnly": true
        },
        "monto_cliente": {
          "title": "Monto cliente",
          "type": "string",
          "readOnly": true
        },
        "descripcion": {
          "title": "Descripcion",
          "type": "string",
          "readOnly": true
        },
        "contrato_ref": {
          "title": "Contrato ref",
          "type": "string",
          "readOnly": true
        },
        "referencia": {
          "title": "Referencia",
          "type": "string",
          "maxLength": 255,
          "x-nullable": true
        },
        "motivo": {
          "title": "Motivo",
          "type": "string",
          "enum": [
            "deposito_inversionista",
            "salida_inversion",
            "devolucion",
            "desembolso",
            "desembolso_cliente",
            "abono_cliente",
            "abono_capital",
            "abono_intereses",
            "retorno_capital",
            "retorno_intereses",
            "entrega_rendimiento",
            "ganancia_empresa",
            "aporte_social",
            "ahorro_deposito",
            "ahorro_retiro",
            "credito_coop_desembolso",
            "credito_coop_pago",
            "ajuste",
            "otro"
          ]
        },
        "debito": {
          "title": "Debito",
          "type": "string",
          "format": "decimal",
          "x-nullable": true
        },
        "credito": {
          "title": "Credito",
          "type": "string",
          "format": "decimal",
          "x-nullable": true
        },
        "saldo": {
          "title": "Saldo",
          "type": "string",
          "format": "decimal",
          "x-nullable": true
        },
        "comentario": {
          "title": "Comentario",
          "type": "string",
          "x-nullable": true
        },
        "linea_negocio": {
          "title": "Línea de Negocio",
          "description": "Línea de negocio asociada a la transacción",
          "type": "string"
        }
      }
    },
    "ClientDetailSerializer": {
      "required": [
        "identificacion"
      ],
      "type": "object",
      "properties": {
        "nombre": {
          "title": "Nombre",
          "type": "string",
          "maxLength": 255
        },
        "nombres": {
          "title": "Nombres",
          "type": "string",
          "maxLength": 150
        },
        "apellidos": {
          "title": "Apellidos",
          "type": "string",
          "maxLength": 150
        },
        "identificacion": {
          "title": "Identificacion",
          "type": "string",
          "maxLength": 50,
          "minLength": 1
        },
        "expedicion": {
          "title": "Expedicion",
          "type": "string",
          "maxLength": 100,
          "x-nullable": true
        },
        "direccion": {
          "title": "Direccion",
          "type": "string",
          "maxLength": 255
        },
        "barrio": {
          "title": "Barrio",
          "type": "string",
          "maxLength": 100
        },
        "ciudad": {
          "title": "Ciudad",
          "type": "string",
          "maxLength": 100
        },
        "departamento": {
          "title": "Departamento",
          "type": "string",
          "maxLength": 100
        },
        "telefono": {
          "title": "Telefono",
          "type": "string",
          "maxLength": 50
        },
        "email": {
          "title": "Email",
          "type": "string",
          "format": "email",
          "maxLength": 254
        },
        "activo": {
          "title": "Activo",
          "type": "boolean"
        },
        "linea_negocio": {
          "title": "Linea negocio",
          "type": "string",
          "x-nullable": true
        },
        "contratos": {
          "type": "array",
          "items": {
            "$ref": "#/definitions/ClientContractSerializer"
          },
          "readOnly": true
        },
        "transacciones": {
          "type": "array",
          "items": {
            "$ref": "#/definitions/ClientTransactionSerializer"
          },
          "readOnly": true
        }
      }
    },
    "ClientListSerializer": {
      "required": [
        "identificacion",
        "nombre"
      ],
      "type": "object",
      "properties": {
        "identificacion": {
          "title": "Identificacion",
          "type": "string",
          "maxLength": 50,
          "minLength": 1
        },
        "nombre": {
          "title": "Nombre",
          "type": "string",
          "maxLength": 255,
          "minLength": 1
        },
        "nombres": {
          "title": "Nombres",
          "type": "string",
          "maxLength": 150
        },
        "apellidos": {
          "title": "Apellidos",
          "type": "string",
          "maxLength": 150
        },
        "expedicion": {
          "title": "Expedicion",
          "type": "string",
          "maxLength": 100,
          "x-nullable": true
        },
        "direccion": {
          "title": "Direccion",
          "type": "string",
          "maxLength": 255
        },
        "barrio": {
          "title": "Barrio",
          "type": "string",
          "maxLength": 100
        },
        "ciudad": {
          "title": "Ciudad",
          "type": "string",
          "maxLength": 100
        },
        "departamento": {
          "title": "Departamento",
          "type": "string",
          "maxLength": 100
        },
        "telefono": {
          "title": "Telefono",
          "type": "string",
          "maxLength": 50
        },
        "email": {
          "title": "Email",
          "type": "string",
          "format": "email",
          "maxLength": 254
        },
        "activo": {
          "title": "Activo",
          "type": "boolean"
        },
        "datos_actualizados_at": {
          "title": "Datos actualizados at",
          "description": "Última vez que el cliente actualizó o confirmó sus datos",
          "type": "string",
          "format": "date-time",
          "x-nullable": true
        },
        "actualizacion_solicitada_at": {
          "title": "Actualizacion solicitada at",
          "description": "Último aviso enviado pidiendo actualizar datos",
          "type": "string",
          "format": "date-time",
          "x-nullable": true
        },
        "linea_negocio": {
          "title": "Linea negocio",
          "type": "string",
          "x-nullable": true
        }
      }
    },
    "CollectionAction": {
      "required": [
        "contract",
        "action_type",
        "result"
      ],
      "type": "object",
      "properties": {
        "id": {
          "title": "ID",
          "type": "integer",
          "readOnly": true
        },
        "contract": {
          "title": "Contract",
          "type": "string"
        },
        "action_type": {
          "title": "Action type",
          "type": "string",
          "enum": [
            "call",
            "sms",
            "email",
            "visit",
            "whatsapp",
            "letter",
            "agreement",
            "payment_promise",
            "codeudor_contact",
            "legal_notice",
            "legal_transfer",
            "other"
          ]
        },
        "action_type_display": {
          "title": "Action type display",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        },
        "result": {
          "title": "Result",
          "type": "string",
          "enum": [
            "contacted",
            "no_answer",
            "wrong_number",
            "busy",
            "promise",
            "refused",
            "payment",
            "agreement",
            "sent",
            "other"
          ]
        },
        "result_display": {
          "title": "Result display",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        },
        "notes": {
          "title": "Notes",
          "type": "string"
        },
        "promise_date": {
          "title": "Promise date",
          "type": "string",
          "format": "date",
          "x-nullable": true
        },
        "promise_amount": {
          "title": "Promise amount",
          "type": "string",
          "format": "decimal",
          "x-nullable": true
        },
        "performed_by": {
          "title": "Performed by",
          "type": "integer",
          "readOnly": true
        },
        "performed_by_username": {
          "title": "Performed by username",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        },
        "performed_at": {
          "title": "Performed at",
          "type": "string",
          "format": "date-time",
          "readOnly": true
        },
        "is_automatic": {
          "title": "Is automatic",
          "type": "boolean",
          "readOnly": true
        },
        "notification_id": {
          "title": "Notification id",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        }
      }
    },
    "ContactMessage": {
      "required": [
        "nombre",
        "email",
        "mensaje"
      ],
      "type": "object",
      "properties": {
        "id": {
          "title": "ID",
          "type": "integer",
          "readOnly": true
        },
        "nombre": {
          "title": "Nombre",
          "type": "string",
          "maxLength": 100,
          "minLength": 1
        },
        "email": {
          "title": "Correo electrónico",
          "type": "string",
          "format": "email",
          "maxLength": 254,
          "minLength": 1
        },
        "mensaje": {
          "title": "Mensaje",
          "type": "string",
          "minLength": 1
        },
        "creado_en": {
          "title": "Fecha de envío",
          "type": "string",
          "format": "date-time",
          "readOnly": true
        }
      }
    },
    "ContractStateHistory": {
      "required": [
        "contract",
        "to_state",
        "reason"
      ],
      "type": "object",
      "properties": {
        "id": {
          "title": "ID",
          "type": "integer",
          "readOnly": true
        },
        "contract": {
          "title": "Contract",
          "type": "string"
        },
        "from_state": {
          "title": "From state",
          "type": "integer",
          "x-nullable": true
        },
        "from_state_name": {
          "title": "From state name",
          "type": "string",
          "readOnly": true,
          "minLength": 1,
          "x-nullable": true
        },
        "to_state": {
          "title": "To state",
          "type": "integer"
        },
        "to_state_name": {
          "title": "To state name",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        },
        "reason": {
          "title": "Reason",
          "type": "string",
          "maxLength": 200,
          "minLength": 1
        },
        "changed_by": {
          "title": "Changed by",
          "type": "integer",
          "x-nullable": true
        },
        "changed_by_username": {
          "title": "Changed by username",
          "type": "string",
          "readOnly": true,
          "minLength": 1,
          "x-nullable": true
        },
        "changed_at": {
          "title": "Changed at",
          "type": "string",
          "format": "date-time",
          "readOnly": true
        },
        "is_automatic": {
          "title": "Is automatic",
          "type": "boolean"
        }
      }
    },
    "ContractInmobiliario": {
      "required": [
        "contract",
        "property",
        "start_date",
        "business_line"
      ],
      "type": "object",
      "properties": {
        "contract": {
          "title": "Contract",
          "type": "string"
        },
        "property": {
          "title": "Property",
          "type": "integer"
        },
        "property_address": {
          "title": "Property address",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        },
        "property_city": {
          "title": "Property city",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        },
        "property_title": {
          "title": "Property title",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        },
        "start_date": {
          "title": "Start date",
          "type": "string",
          "format": "date"
        },
        "end_date": {
          "title": "End date",
          "type": "string",
          "format": "date",
          "x-nullable": true
        },
        "business_line": {
          "title": "Business line",
          "description": "Debe apuntar a BusinessLine.code = 'Inmo'",
          "type": "string"
        },
        "business_line_name": {
          "title": "Business line name",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        },
        "contract_status_name": {
          "title": "Contract status name",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        }
      }
    },
    "ContractList": {
      "required": [
        "no_contrato",
        "monto",
        "tasa",
        "valor_proyectado"
      ],
      "type": "object",
      "properties": {
        "no_contrato": {
          "title": "Número de Contrato",
          "description": "Identificador único del contrato",
          "type": "string",
          "maxLength": 255,
          "minLength": 1
        },
        "monto": {
          "title": "Monto Principal",
          "type": "string",
          "format": "decimal"
        },
        "tasa": {
          "title": "Tasa (%)",
          "description": "Tasa de interés o similar (ej. 12.50 para 12.50%)",
          "type": "string",
          "format": "decimal"
        },
        "codigo_estado_contrato": {
          "title": "Estado del Contrato",
          "description": "Estado actual del contrato (relacionado con ContractStatus)",
          "type": "integer",
          "x-nullable": true
        },
        "codigo_estado_contrato_detalle": {
          "$ref": "#/definitions/ContractStatus"
        },
        "id_cliente": {
          "title": "Cliente",
          "type": "string",
          "x-nullable": true
        },
        "cliente_nombre": {
          "title": "Cliente nombre",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        },
        "id_inversionista": {
          "title": "Inversionista",
          "type": "integer",
          "x-nullable": true
        },
        "inversionista_nombre": {
          "title": "Inversionista nombre",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        },
        "fecha_desembolso": {
          "title": "Fecha de Desembolso",
          "type": "string",
          "format": "date",
          "x-nullable": true
        },
        "terminacion": {
          "title": "Fecha de Terminación",
          "type": "string",
          "format": "date",
          "x-nullable": true
        },
        "valor_proyectado": {
          "title": "Valor Proyectado",
          "type": "string",
          "format": "decimal"
        },
        "parent_contract": {
          "title": "Contrato Principal",
          "description": "Contrato al que está asociado este contrato como auxiliar, si aplica",
          "type": "string",
          "x-nullable": true
        },
        "saldo_pendiente": {
          "title": "Saldo pendiente",
          "type": "string",
          "readOnly": true
        },
        "dias_mora_real": {
          "title": "Dias mora real",
          "type": "string",
          "readOnly": true
        },
        "fecha_ultimo_abono": {
          "title": "Fecha ultimo abono",
          "type": "string",
          "readOnly": true
        },
        "in_portfolio": {
          "title": "In portfolio",
          "type": "string",
          "readOnly": true
        },
        "portfolio_type": {
          "title": "Portfolio type",
          "type": "string",
          "readOnly": true
        },
        "portfolio_type_display": {
          "title": "Portfolio type display",
          "type": "string",
          "readOnly": true
        }
      }
    },
    "ContractClient": {
      "required": [
        "nombre",
        "identificacion"
      ],
      "type": "object",
      "properties": {
        "nombre": {
          "title": "Nombre",
          "type": "string",
          "maxLength": 255,
          "minLength": 1
        },
        "identificacion": {
          "title": "Identificacion",
          "type": "string",
          "maxLength": 50,
          "minLength": 1
        },
        "expedicion": {
          "title": "Expedicion",
          "type": "string",
          "maxLength": 100,
          "x-nullable": true
        },
        "direccion": {
          "title": "Direccion",
          "type": "string",
          "maxLength": 255
        },
        "barrio": {
          "title": "Barrio",
          "type": "string",
          "maxLength": 100
        },
        "ciudad": {
          "title": "Ciudad",
          "type": "string",
          "maxLength": 100
        },
        "departamento": {
          "title": "Departamento",
          "type": "string",
          "maxLength": 100
        },
        "telefono": {
          "title": "Telefono",
          "type": "string",
          "maxLength": 50
        },
        "email": {
          "title": "Email",
          "type": "string",
          "format": "email",
          "maxLength": 254
        }
      }
    },
    "ContractInvestor": {
      "required": [
        "id_inversionista",
        "nombre"
      ],
      "type": "object",
      "properties": {
        "id_inversionista": {
          "title": "Id inversionista",
          "type": "integer",
          "maximum": 2147483647,
          "minimum": -2147483648
        },
        "nombre": {
          "title": "Nombre",
          "type": "string",
          "maxLength": 255,
          "minLength": 1
        },
        "direccion": {
          "title": "Direccion",
          "type": "string",
          "maxLength": 255
        },
        "telefono": {
          "title": "Telefono",
          "type": "string",
          "maxLength": 50
        },
        "email": {
          "title": "Email",
          "type": "string",
          "format": "email",
          "maxLength": 254
        }
      }
    },
    "ContractTransaction": {
      "required": [
        "fecha"
      ],
      "type": "object",
      "properties": {
        "id_transaccion": {
          "title": "Id transaccion",
          "type": "integer",
          "readOnly": true
        },
        "fecha": {
          "title": "Fecha",
          "type": "string",
          "format": "date-time"
        },
        "debito": {
          "title": "Debito",
          "type": "string",
          "format": "decimal",
          "x-nullable": true
        },
        "credito": {
          "title": "Credito",
          "type": "string",
          "format": "decimal",
          "x-nullable": true
        },
        "saldo": {
          "title": "Saldo",
          "type": "string",
          "format": "decimal",
          "x-nullable": true
        },
        "referencia": {
          "title": "Referencia",
          "type": "string",
          "maxLength": 255,
          "x-nullable": true
        },
        "comentario": {
          "title": "Comentario",
          "type": "string",
          "x-nullable": true
        },
        "motivo": {
          "title": "Motivo",
          "type": "string",
          "enum": [
            "deposito_inversionista",
            "salida_inversion",
            "devolucion",
            "desembolso",
            "desembolso_cliente",
            "abono_cliente",
            "abono_capital",
            "abono_intereses",
            "retorno_capital",
            "retorno_intereses",
            "entrega_rendimiento",
            "ganancia_empresa",
            "aporte_social",
            "ahorro_deposito",
            "ahorro_retiro",
            "credito_coop_desembolso",
            "credito_coop_pago",
            "ajuste",
            "otro"
          ]
        },
        "cliente": {
          "title": "Cliente",
          "type": "string",
          "x-nullable": true
        },
        "inversionista": {
          "title": "Inversionista",
          "type": "integer",
          "x-nullable": true
        },
        "contrato": {
          "title": "Contrato",
          "type": "string",
          "x-nullable": true
        },
        "linea_negocio": {
          "title": "Línea de Negocio",
          "description": "Línea de negocio asociada a la transacción",
          "type": "string"
        }
      }
    },
    "DetailedContract": {
      "required": [
        "no_contrato",
        "monto",
        "valor_proyectado",
        "honorarios",
        "tasa"
      ],
      "type": "object",
      "properties": {
        "no_contrato": {
          "title": "Número de Contrato",
          "description": "Identificador único del contrato",
          "type": "string",
          "maxLength": 255,
          "minLength": 1
        },
        "fecha_desembolso": {
          "title": "Fecha de Desembolso",
          "type": "string",
          "format": "date",
          "x-nullable": true
        },
        "terminacion": {
          "title": "Fecha de Terminación",
          "type": "string",
          "format": "date",
          "x-nullable": true
        },
        "monto": {
          "title": "Monto Principal",
          "type": "string",
          "format": "decimal"
        },
        "valor_proyectado": {
          "title": "Valor Proyectado",
          "type": "string",
          "format": "decimal"
        },
        "valor_texto": {
          "title": "Monto en Texto",
          "description": "Representación textual del monto principal (ej. Cien mil pesos)",
          "type": "string"
        },
        "honorarios": {
          "title": "Honorarios",
          "type": "string",
          "format": "decimal"
        },
        "honorarios_sin_costo_fijo": {
          "title": "Honorarios sin Costo Fijo",
          "description": "Honorarios calculados sin incluir el costo fijo",
          "type": "string",
          "format": "decimal"
        },
        "costo_fijo": {
          "title": "Costo Fijo (SMLV)",
          "description": "Costo fijo basado en el Salario Mínimo Legal Vigente",
          "type": "string",
          "format": "decimal"
        },
        "tasa": {
          "title": "Tasa (%)",
          "description": "Tasa de interés o similar (ej. 12.50 para 12.50%)",
          "type": "string",
          "format": "decimal"
        },
        "aplica_juridico": {
          "title": "Aplica Jurídico",
          "description": "Indica si el contrato pasó a un proceso jurídico",
          "type": "boolean",
          "x-nullable": true
        },
        "aplica_codeudor": {
          "title": "Aplica Codeudor",
          "description": "Indica si el contrato tiene un codeudor asociado",
          "type": "boolean",
          "x-nullable": true
        },
        "parent_contract": {
          "title": "Contrato Principal",
          "description": "Contrato al que está asociado este contrato como auxiliar, si aplica",
          "type": "string",
          "x-nullable": true
        },
        "codigo_estado_contrato": {
          "title": "Codigo estado contrato",
          "type": "integer",
          "x-nullable": true
        },
        "codigo_estado_contrato_detalle": {
          "$ref": "#/definitions/ContractStatus"
        },
        "created_by": {
          "title": "Creado por",
          "type": "integer",
          "readOnly": true,
          "x-nullable": true
        },
        "id_cliente": {
          "title": "Cliente",
          "type": "string",
          "x-nullable": true
        },
        "id_inversionista": {
          "title": "Inversionista",
          "type": "integer",
          "x-nullable": true
        },
        "linea_credito": {
          "title": "Línea de Negocio/Crédito",
          "type": "string"
        },
        "service": {
          "title": "Service",
          "type": "string",
          "x-nullable": true
        },
        "service_request": {
          "title": "Service request",
          "type": "integer",
          "x-nullable": true
        },
        "id_codeudor": {
          "title": "Codeudor",
          "type": "string",
          "x-nullable": true
        },
        "tipo_contrato": {
          "title": "Tipo de contrato",
          "type": "string",
          "enum": [
            "cliente",
            "inversionista",
            "auxiliar"
          ]
        },
        "obligations": {
          "type": "array",
          "items": {
            "$ref": "#/definitions/Obligation"
          },
          "readOnly": true
        },
        "portfolios": {
          "type": "array",
          "items": {
            "$ref": "#/definitions/Portfolio"
          },
          "readOnly": true
        },
        "dias_mora": {
          "title": "Dias mora",
          "type": "integer",
          "readOnly": true
        },
        "dias_mora_real": {
          "title": "Dias mora real",
          "type": "integer",
          "readOnly": true
        },
        "fecha_ultimo_abono": {
          "title": "Fecha ultimo abono",
          "type": "string",
          "format": "date",
          "readOnly": true
        },
        "id_cliente_detalle": {
          "$ref": "#/definitions/ContractClient"
        },
        "id_inversionista_detalle": {
          "$ref": "#/definitions/ContractInvestor"
        },
        "transactions": {
          "type": "array",
          "items": {
            "$ref": "#/definitions/ContractTransaction"
          },
          "readOnly": true
        },
        "all_transactions": {
          "title": "All transactions",
          "type": "string",
          "readOnly": true
        },
        "all_movimientos": {
          "title": "All movimientos",
          "type": "string",
          "readOnly": true
        }
      }
    },
    "CooperativeAgreement": {
      "required": [
        "agreement_code",
        "partner",
        "valid_from",
        "valid_to",
        "contract",
        "business_line"
      ],
      "type": "object",
      "properties": {
        "id": {
          "title": "ID",
          "type": "integer",
          "readOnly": true
        },
        "agreement_code": {
          "title": "Agreement code",
          "type": "string",
          "maxLength": 100,
          "minLength": 1
        },
        "partner": {
          "title": "Partner",
          "type": "string",
          "maxLength": 255,
          "minLength": 1
        },
        "valid_from": {
          "title": "Valid from",
          "type": "string",
          "format": "date"
        },
        "valid_to": {
          "title": "Valid to",
          "type": "string",
          "format": "date"
        },
        "contract": {
          "title": "Contract",
          "type": "string"
        },
        "business_line": {
          "title": "Business line",
          "description": "Debe apuntar a BusinessLine.code = 'Ejecoom'",
          "type": "string"
        }
      }
    },
    "Company": {
      "required": [
        "nit",
        "name",
        "contact_name",
        "contact_email",
        "contact_phone"
      ],
      "type": "object",
      "properties": {
        "id": {
          "title": "ID",
          "type": "integer",
          "readOnly": true
        },
        "nit": {
          "title": "NIT",
          "type": "string",
          "maxLength": 20,
          "minLength": 1
        },
        "name": {
          "title": "Razón Social",
          "type": "string",
          "maxLength": 200,
          "minLength": 1
        },
        "trade_name": {
          "title": "Nombre Comercial",
          "type": "string",
          "maxLength": 200
        },
        "contact_name": {
          "title": "Contacto Principal",
          "type": "string",
          "maxLength": 200,
          "minLength": 1
        },
        "contact_email": {
          "title": "Email Contacto",
          "type": "string",
          "format": "email",
          "maxLength": 254,
          "minLength": 1
        },
        "contact_phone": {
          "title": "Teléfono Contacto",
          "type": "string",
          "maxLength": 20,
          "minLength": 1
        },
        "address": {
          "title": "Dirección",
          "type": "string",
          "maxLength": 300
        },
        "status": {
          "title": "Estado",
          "type": "string",
          "enum": [
            "ACTIVE",
            "INACTIVE",
            "SUSPENDED"
          ]
        },
        "status_display": {
          "title": "Status display",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        },
        "payroll_cutoff_day": {
          "title": "Día de Corte",
          "description": "Día del mes para corte de nómina",
          "type": "integer",
          "maximum": 2147483647,
          "minimum": -2147483648
        },
        "active_employees_count": {
          "title": "Active employees count",
          "type": "integer",
          "readOnly": true
        },
        "created_at": {
          "title": "Created at",
          "type": "string",
          "format": "date-time",
          "readOnly": true
        }
      }
    },
    "ContractCooperativa": {
      "required": [
        "contract",
        "service",
        "business_line"
      ],
      "type": "object",
      "properties": {
        "contract": {
          "title": "Contract",
          "type": "string"
        },
        "service": {
          "title": "Service",
          "type": "integer"
        },
        "business_line": {
          "title": "Business line",
          "description": "Debe apuntar a BusinessLine.code = 'Ejecoom'",
          "type": "string"
        }
      }
    },
    "SocialContribution": {
      "required": [
        "member",
        "period",
        "amount"
      ],
      "type": "object",
      "properties": {
        "id": {
          "title": "ID",
          "type": "integer",
          "readOnly": true
        },
        "member": {
          "title": "Asociado",
          "type": "integer"
        },
        "member_name": {
          "title": "Member name",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        },
        "member_number": {
          "title": "Member number",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        },
        "period": {
          "title": "Período",
          "description": "Primer día del mes del aporte",
          "type": "string",
          "format": "date"
        },
        "amount": {
          "title": "Monto",
          "type": "string",
          "format": "decimal"
        },
        "payment_method": {
          "title": "Método de Pago",
          "type": "string",
          "enum": [
            "NOMINA",
            "TRANSFERENCIA",
            "EFECTIVO",
            "PSE",
            "TARJETA"
          ]
        },
        "payment_method_display": {
          "title": "Payment method display",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        },
        "status": {
          "title": "Estado",
          "type": "string",
          "enum": [
            "PENDING",
            "PAID",
            "OVERDUE",
            "CANCELLED"
          ]
        },
        "status_display": {
          "title": "Status display",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        },
        "payment_date": {
          "title": "Fecha de Pago",
          "type": "string",
          "format": "date",
          "x-nullable": true
        },
        "payment_reference": {
          "title": "Referencia de Pago",
          "type": "string",
          "maxLength": 100
        },
        "notes": {
          "title": "Notas",
          "type": "string"
        },
        "created_at": {
          "title": "Created at",
          "type": "string",
          "format": "date-time",
          "readOnly": true
        }
      }
    },
    "SocialContributionCreate": {
      "required": [
        "member",
        "period",
        "amount"
      ],
      "type": "object",
      "properties": {
        "member": {
          "title": "Asociado",
          "type": "integer"
        },
        "period": {
          "title": "Período",
          "description": "Primer día del mes del aporte",
          "type": "string",
          "format": "date"
        },
        "amount": {
          "title": "Monto",
          "type": "string",
          "format": "decimal"
        },
        "payment_method": {
          "title": "Método de Pago",
          "type": "string",
          "enum": [
            "NOMINA",
            "TRANSFERENCIA",
            "EFECTIVO",
            "PSE",
            "TARJETA"
          ]
        },
        "notes": {
          "title": "Notas",
          "type": "string"
        }
      }
    },
    "CreditApplication": {
      "required": [
        "member",
        "credit_line",
        "requested_amount",
        "requested_term_months",
        "purpose"
      ],
      "type": "object",
      "properties": {
        "id": {
          "title": "ID",
          "type": "integer",
          "readOnly": true
        },
        "application_number": {
          "title": "Número de Solicitud",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        },
        "member": {
          "title": "Asociado",
          "type": "integer"
        },
        "member_name": {
          "title": "Member name",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        },
        "credit_line": {
          "title": "Línea de Crédito",
          "type": "integer"
        },
        "credit_line_name": {
          "title": "Credit line name",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        },
        "requested_amount": {
          "title": "Monto Solicitado",
          "type": "string",
          "format": "decimal"
        },
        "approved_amount": {
          "title": "Monto Aprobado",
          "type": "string",
          "format": "decimal",
          "readOnly": true,
          "x-nullable": true
        },
        "requested_term_months": {
          "title": "Plazo Solicitado (meses)",
          "type": "integer",
          "maximum": 2147483647,
          "minimum": -2147483648
        },
        "approved_term_months": {
          "title": "Plazo Aprobado",
          "type": "integer",
          "readOnly": true,
          "x-nullable": true
        },
        "purpose": {
          "title": "Propósito del Crédito",
          "type": "string",
          "minLength": 1
        },
        "status": {
          "title": "Estado",
          "type": "string",
          "enum": [
            "DRAFT",
            "SUBMITTED",
            "UNDER_REVIEW",
            "APPROVED",
            "REJECTED",
            "DISBURSED",
            "CANCELLED"
          ]
        },
        "status_display": {
          "title": "Status display",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        },
        "rejection_reason": {
          "title": "Motivo de Rechazo",
          "type": "string"
        },
        "guarantor_name": {
          "title": "Nombre Codeudor",
          "type": "string",
          "maxLength": 200
        },
        "guarantor_id": {
          "title": "ID Codeudor",
          "type": "string",
          "maxLength": 20
        },
        "guarantor_phone": {
          "title": "Teléfono Codeudor",
          "type": "string",
          "maxLength": 20
        },
        "risk_score": {
          "title": "Puntaje de riesgo (0-100)",
          "type": "integer",
          "readOnly": true,
          "x-nullable": true
        },
        "risk_band": {
          "title": "Banda de riesgo",
          "type": "string",
          "enum": [
            "APROBAR",
            "REVISION",
            "RECHAZAR"
          ],
          "readOnly": true
        },
        "risk_breakdown": {
          "title": "Detalle del scoring",
          "type": "object",
          "readOnly": true
        },
        "risk_scored_at": {
          "title": "Risk scored at",
          "type": "string",
          "format": "date-time",
          "readOnly": true,
          "x-nullable": true
        },
        "submitted_at": {
          "title": "Submitted at",
          "type": "string",
          "format": "date-time",
          "readOnly": true,
          "x-nullable": true
        },
        "approved_at": {
          "title": "Approved at",
          "type": "string",
          "format": "date-time",
          "readOnly": true,
          "x-nullable": true
        },
        "created_at": {
          "title": "Created at",
          "type": "string",
          "format": "date-time",
          "readOnly": true
        }
      }
    },
    "CreditApplicationCreate": {
      "required": [
        "member",
        "credit_line",
        "requested_amount",
        "requested_term_months",
        "purpose"
      ],
      "type": "object",
      "properties": {
        "id": {
          "title": "ID",
          "type": "integer",
          "readOnly": true
        },
        "member": {
          "title": "Asociado",
          "type": "integer"
        },
        "credit_line": {
          "title": "Línea de Crédito",
          "type": "integer"
        },
        "requested_amount": {
          "title": "Monto Solicitado",
          "type": "string",
          "format": "decimal"
        },
        "requested_term_months": {
          "title": "Plazo Solicitado (meses)",
          "type": "integer",
          "maximum": 2147483647,
          "minimum": -2147483648
        },
        "purpose": {
          "title": "Propósito del Crédito",
          "type": "string",
          "minLength": 1
        },
        "guarantor_name": {
          "title": "Nombre Codeudor",
          "type": "string",
          "maxLength": 200
        },
        "guarantor_id": {
          "title": "ID Codeudor",
          "type": "string",
          "maxLength": 20
        },
        "guarantor_phone": {
          "title": "Teléfono Codeudor",
          "type": "string",
          "maxLength": 20
        }
      }
    },
    "CreditLine": {
      "required": [
        "code",
        "name",
        "annual_rate"
      ],
      "type": "object",
      "properties": {
        "id": {
          "title": "ID",
          "type": "integer",
          "readOnly": true
        },
        "code": {
          "title": "Código",
          "type": "string",
          "maxLength": 20,
          "minLength": 1
        },
        "name": {
          "title": "Nombre",
          "type": "string",
          "maxLength": 100,
          "minLength": 1
        },
        "description": {
          "title": "Descripción",
          "type": "string"
        },
        "credit_type": {
          "title": "Tipo de Crédito",
          "type": "string",
          "enum": [
            "LIBRE_INVERSION",
            "EDUCATIVO",
            "VIVIENDA",
            "VEHICULO",
            "EMERGENCIA",
            "CALAMIDAD"
          ]
        },
        "credit_type_display": {
          "title": "Credit type display",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        },
        "annual_rate": {
          "title": "Tasa EA (%)",
          "description": "Tasa efectiva anual",
          "type": "string",
          "format": "decimal"
        },
        "monthly_rate": {
          "title": "Monthly rate",
          "type": "string",
          "format": "decimal",
          "readOnly": true
        },
        "minimum_amount": {
          "title": "Monto Mínimo",
          "type": "string",
          "format": "decimal"
        },
        "maximum_amount": {
          "title": "Monto Máximo",
          "type": "string",
          "format": "decimal"
        },
        "minimum_term_months": {
          "title": "Plazo Mínimo (meses)",
          "type": "integer",
          "maximum": 2147483647,
          "minimum": -2147483648
        },
        "maximum_term_months": {
          "title": "Plazo Máximo (meses)",
          "type": "integer",
          "maximum": 2147483647,
          "minimum": -2147483648
        },
        "minimum_membership_months": {
          "title": "Antigüedad Mínima (meses)",
          "description": "Meses como asociado para aplicar",
          "type": "integer",
          "maximum": 2147483647,
          "minimum": -2147483648
        },
        "contribution_multiplier": {
          "title": "Multiplicador de Aportes",
          "description": "Monto máximo = aportes × multiplicador",
          "type": "string",
          "format": "decimal"
        },
        "requires_guarantor": {
          "title": "Requiere Codeudor",
          "type": "boolean"
        },
        "minimum_age": {
          "title": "Edad Mínima",
          "type": "integer",
          "maximum": 65535,
          "minimum": 0,
          "x-nullable": true
        },
        "maximum_age": {
          "title": "Edad Máxima",
          "type": "integer",
          "maximum": 65535,
          "minimum": 0,
          "x-nullable": true
        },
        "is_public": {
          "title": "Publicar en landing",
          "description": "Requiere tasa aprobada (mayor a 0) y la línea activa",
          "type": "boolean"
        },
        "is_active": {
          "title": "Activo",
          "type": "boolean"
        }
      }
    },
    "EmployeeLink": {
      "required": [
        "member",
        "company",
        "employee_id",
        "base_salary",
        "hire_date"
      ],
      "type": "object",
      "properties": {
        "id": {
          "title": "ID",
          "type": "integer",
          "readOnly": true
        },
        "member": {
          "title": "Asociado",
          "type": "integer"
        },
        "member_name": {
          "title": "Member name",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        },
        "member_number": {
          "title": "Member number",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        },
        "company": {
          "title": "Empresa",
          "type": "integer"
        },
        "company_name": {
          "title": "Company name",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        },
        "employee_id": {
          "title": "ID Empleado",
          "description": "Código interno del empleado en la empresa",
          "type": "string",
          "maxLength": 50,
          "minLength": 1
        },
        "base_salary": {
          "title": "Salario Base",
          "type": "string",
          "format": "decimal"
        },
        "hire_date": {
          "title": "Fecha Ingreso",
          "type": "string",
          "format": "date"
        },
        "termination_date": {
          "title": "Fecha Retiro",
          "type": "string",
          "format": "date",
          "x-nullable": true
        },
        "is_active": {
          "title": "Activo",
          "type": "boolean"
        },
        "max_deductible": {
          "title": "Max deductible",
          "type": "string",
          "format": "decimal",
          "readOnly": true
        },
        "created_at": {
          "title": "Created at",
          "type": "string",
          "format": "date-time",
          "readOnly": true
        }
      }
    },
    "LoanPayment": {
      "type": "object",
      "properties": {
        "id": {
          "title": "ID",
          "type": "integer",
          "readOnly": true
        },
        "loan": {
          "title": "Crédito",
          "type": "integer",
          "readOnly": true
        },
        "payment_number": {
          "title": "Número de Pago",
          "type": "integer",
          "readOnly": true
        },
        "amount": {
          "title": "Monto Total",
          "type": "string",
          "format": "decimal",
          "readOnly": true
        },
        "principal_amount": {
          "title": "Abono a Capital",
          "type": "string",
          "format": "decimal",
          "readOnly": true
        },
        "interest_amount": {
          "title": "Intereses",
          "type": "string",
          "format": "decimal",
          "readOnly": true
        },
        "penalty_amount": {
          "title": "Intereses de Mora",
          "type": "string",
          "format": "decimal",
          "readOnly": true
        },
        "balance_after": {
          "title": "Saldo Después",
          "type": "string",
          "format": "decimal",
          "readOnly": true
        },
        "payment_method": {
          "title": "Método de Pago",
          "type": "string",
          "enum": [
            "NOMINA",
            "TRANSFERENCIA",
            "EFECTIVO",
            "PSE",
            "DEBITO_CUENTA"
          ],
          "readOnly": true
        },
        "payment_method_display": {
          "title": "Payment method display",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        },
        "payment_date": {
          "title": "Fecha de Pago",
          "type": "string",
          "format": "date",
          "readOnly": true
        },
        "reference": {
          "title": "Referencia",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        },
        "notes": {
          "title": "Notas",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        },
        "created_at": {
          "title": "Created at",
          "type": "string",
          "format": "date-time",
          "readOnly": true
        }
      }
    },
    "CooperativeLoan": {
      "required": [
        "member",
        "credit_line",
        "principal",
        "annual_rate",
        "term_months",
        "monthly_payment",
        "disbursement_date",
        "first_payment_date",
        "maturity_date"
      ],
      "type": "object",
      "properties": {
        "id": {
          "title": "ID",
          "type": "integer",
          "readOnly": true
        },
        "loan_number": {
          "title": "Número de Crédito",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        },
        "member": {
          "title": "Asociado",
          "type": "integer"
        },
        "member_name": {
          "title": "Member name",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        },
        "member_number": {
          "title": "Member number",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        },
        "credit_line": {
          "title": "Línea de Crédito",
          "type": "integer"
        },
        "credit_line_name": {
          "title": "Credit line name",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        },
        "principal": {
          "title": "Capital",
          "type": "string",
          "format": "decimal"
        },
        "current_balance": {
          "title": "Saldo Actual",
          "type": "string",
          "format": "decimal",
          "readOnly": true
        },
        "total_interest": {
          "title": "Intereses Totales",
          "type": "string",
          "format": "decimal",
          "readOnly": true
        },
        "annual_rate": {
          "title": "Tasa EA (%)",
          "type": "string",
          "format": "decimal"
        },
        "term_months": {
          "title": "Plazo (meses)",
          "type": "integer",
          "maximum": 2147483647,
          "minimum": -2147483648
        },
        "monthly_payment": {
          "title": "Cuota Mensual",
          "type": "string",
          "format": "decimal"
        },
        "status": {
          "title": "Estado",
          "type": "string",
          "enum": [
            "ACTIVE",
            "CURRENT",
            "OVERDUE",
            "LEGAL",
            "PAID",
            "WRITTEN_OFF"
          ]
        },
        "status_display": {
          "title": "Status display",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        },
        "disbursement_date": {
          "title": "Fecha Desembolso",
          "type": "string",
          "format": "date"
        },
        "first_payment_date": {
          "title": "Fecha Primer Pago",
          "type": "string",
          "format": "date"
        },
        "maturity_date": {
          "title": "Fecha Vencimiento",
          "type": "string",
          "format": "date"
        },
        "last_payment_date": {
          "title": "Último Pago",
          "type": "string",
          "format": "date",
          "x-nullable": true
        },
        "days_overdue": {
          "title": "Días en Mora",
          "type": "integer",
          "readOnly": true
        },
        "overdue_amount": {
          "title": "Monto en Mora",
          "type": "string",
          "format": "decimal",
          "readOnly": true
        },
        "is_migrated": {
          "title": "Is migrated",
          "type": "boolean",
          "readOnly": true
        },
        "paid_amount": {
          "title": "Paid amount",
          "type": "string",
          "format": "decimal",
          "readOnly": true
        },
        "progress_percentage": {
          "title": "Progress percentage",
          "type": "string",
          "format": "decimal",
          "readOnly": true
        },
        "application": {
          "title": "Solicitud Origen",
          "description": "Nulo si es migrado desde ECF",
          "type": "integer",
          "x-nullable": true
        },
        "original_contract": {
          "title": "Contrato ECF Original",
          "description": "Solo para créditos migrados desde ECF",
          "type": "string",
          "x-nullable": true
        },
        "created_at": {
          "title": "Created at",
          "type": "string",
          "format": "date-time",
          "readOnly": true
        }
      }
    },
    "CooperativeLoanDetail": {
      "required": [
        "member",
        "principal",
        "annual_rate",
        "term_months",
        "monthly_payment",
        "disbursement_date",
        "first_payment_date",
        "maturity_date"
      ],
      "type": "object",
      "properties": {
        "id": {
          "title": "ID",
          "type": "integer",
          "readOnly": true
        },
        "loan_number": {
          "title": "Número de Crédito",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        },
        "member": {
          "title": "Asociado",
          "type": "integer"
        },
        "member_name": {
          "title": "Member name",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        },
        "member_number": {
          "title": "Member number",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        },
        "credit_line": {
          "$ref": "#/definitions/CreditLine"
        },
        "credit_line_name": {
          "title": "Credit line name",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        },
        "principal": {
          "title": "Capital",
          "type": "string",
          "format": "decimal"
        },
        "current_balance": {
          "title": "Saldo Actual",
          "type": "string",
          "format": "decimal",
          "readOnly": true
        },
        "total_interest": {
          "title": "Intereses Totales",
          "type": "string",
          "format": "decimal",
          "readOnly": true
        },
        "annual_rate": {
          "title": "Tasa EA (%)",
          "type": "string",
          "format": "decimal"
        },
        "term_months": {
          "title": "Plazo (meses)",
          "type": "integer",
          "maximum": 2147483647,
          "minimum": -2147483648
        },
        "monthly_payment": {
          "title": "Cuota Mensual",
          "type": "string",
          "format": "decimal"
        },
        "status": {
          "title": "Estado",
          "type": "string",
          "enum": [
            "ACTIVE",
            "CURRENT",
            "OVERDUE",
            "LEGAL",
            "PAID",
            "WRITTEN_OFF"
          ]
        },
        "status_display": {
          "title": "Status display",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        },
        "disbursement_date": {
          "title": "Fecha Desembolso",
          "type": "string",
          "format": "date"
        },
        "first_payment_date": {
          "title": "Fecha Primer Pago",
          "type": "string",
          "format": "date"
        },
        "maturity_date": {
          "title": "Fecha Vencimiento",
          "type": "string",
          "format": "date"
        },
        "last_payment_date": {
          "title": "Último Pago",
          "type": "string",
          "format": "date",
          "x-nullable": true
        },
        "days_overdue": {
          "title": "Días en Mora",
          "type": "integer",
          "readOnly": true
        },
        "overdue_amount": {
          "title": "Monto en Mora",
          "type": "string",
          "format": "decimal",
          "readOnly": true
        },
        "is_migrated": {
          "title": "Is migrated",
          "type": "boolean",
          "readOnly": true
        },
        "paid_amount": {
          "title": "Paid amount",
          "type": "string",
          "format": "decimal",
          "readOnly": true
        },
        "progress_percentage": {
          "title": "Progress percentage",
          "type": "string",
          "format": "decimal",
          "readOnly": true
        },
        "application": {
          "title": "Solicitud Origen",
          "description": "Nulo si es migrado desde ECF",
          "type": "integer",
          "x-nullable": true
        },
        "original_contract": {
          "title": "Contrato ECF Original",
          "description": "Solo para créditos migrados desde ECF",
          "type": "string",
          "x-nullable": true
        },
        "created_at": {
          "title": "Created at",
          "type": "string",
          "format": "date-time",
          "readOnly": true
        },
        "payments": {
          "type": "array",
          "items": {
            "$ref": "#/definitions/LoanPayment"
          },
          "readOnly": true
        }
      }
    },
    "MemberList": {
      "required": [
        "membership_number",
        "nombre",
        "identificacion"
      ],
      "type": "object",
      "properties": {
        "id": {
          "title": "ID",
          "type": "integer",
          "readOnly": true
        },
        "membership_number": {
          "title": "Número de Asociado",
          "type": "string",
          "maxLength": 20,
          "minLength": 1
        },
        "nombre": {
          "title": "Nombre Completo",
          "type": "string",
          "maxLength": 200,
          "minLength": 1
        },
        "identificacion": {
          "title": "Número de Identificación",
          "type": "string",
          "maxLength": 20,
          "minLength": 1
        },
        "status": {
          "title": "Estado",
          "type": "string",
          "enum": [
            "ACTIVE",
            "INACTIVE",
            "SUSPENDED",
            "RETIRED"
          ]
        },
        "status_display": {
          "title": "Status display",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        },
        "total_contributions": {
          "title": "Total Aportes Acumulados",
          "type": "string",
          "format": "decimal"
        },
        "contributions_count": {
          "title": "Contributions count",
          "type": "integer",
          "readOnly": true
        },
        "membership_date": {
          "title": "Fecha de Vinculación",
          "type": "string",
          "format": "date",
          "readOnly": true
        }
      }
    },
    "MemberCreate": {
      "required": [
        "identificacion",
        "nombre"
      ],
      "type": "object",
      "properties": {
        "identificacion": {
          "title": "Número de Identificación",
          "type": "string",
          "maxLength": 20,
          "minLength": 1
        },
        "nombre": {
          "title": "Nombre Completo",
          "type": "string",
          "maxLength": 200,
          "minLength": 1
        },
        "email": {
          "title": "Correo Electrónico",
          "type": "string",
          "format": "email",
          "maxLength": 254
        },
        "telefono": {
          "title": "Teléfono",
          "type": "string",
          "maxLength": 20
        },
        "direccion": {
          "title": "Dirección",
          "type": "string"
        },
        "fecha_nacimiento": {
          "title": "Fecha de Nacimiento",
          "type": "string",
          "format": "date",
          "x-nullable": true
        },
        "origin": {
          "title": "Origen",
          "type": "string",
          "enum": [
            "VOLUNTARY",
            "ECF_MIGRATION",
            "PAYROLL"
          ]
        },
        "minimum_contribution": {
          "title": "Aporte Mínimo Mensual",
          "description": "Valor por defecto: $30,000 COP (configurable en SystemParameter)",
          "type": "string",
          "format": "decimal"
        },
        "client": {
          "title": "Client",
          "description": "Cliente ECF vinculado (opcional)",
          "type": "string",
          "x-nullable": true
        }
      }
    },
    "Member": {
      "required": [
        "identificacion",
        "nombre"
      ],
      "type": "object",
      "properties": {
        "id": {
          "title": "ID",
          "type": "integer",
          "readOnly": true
        },
        "membership_number": {
          "title": "Número de Asociado",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        },
        "identificacion": {
          "title": "Número de Identificación",
          "type": "string",
          "maxLength": 20,
          "minLength": 1
        },
        "nombre": {
          "title": "Nombre Completo",
          "type": "string",
          "maxLength": 200,
          "minLength": 1
        },
        "email": {
          "title": "Correo Electrónico",
          "type": "string",
          "format": "email",
          "maxLength": 254
        },
        "telefono": {
          "title": "Teléfono",
          "type": "string",
          "maxLength": 20
        },
        "direccion": {
          "title": "Dirección",
          "type": "string"
        },
        "fecha_nacimiento": {
          "title": "Fecha de Nacimiento",
          "type": "string",
          "format": "date",
          "x-nullable": true
        },
        "status": {
          "title": "Estado",
          "type": "string",
          "enum": [
            "ACTIVE",
            "INACTIVE",
            "SUSPENDED",
            "RETIRED"
          ]
        },
        "status_display": {
          "title": "Status display",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        },
        "origin": {
          "title": "Origen",
          "type": "string",
          "enum": [
            "VOLUNTARY",
            "ECF_MIGRATION",
            "PAYROLL"
          ]
        },
        "origin_display": {
          "title": "Origin display",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        },
        "minimum_contribution": {
          "title": "Aporte Mínimo Mensual",
          "description": "Valor por defecto: $30,000 COP (configurable en SystemParameter)",
          "type": "string",
          "format": "decimal"
        },
        "total_contributions": {
          "title": "Total Aportes Acumulados",
          "type": "string",
          "format": "decimal",
          "readOnly": true
        },
        "contributions_count": {
          "title": "Contributions count",
          "type": "integer",
          "readOnly": true
        },
        "membership_date": {
          "title": "Fecha de Vinculación",
          "type": "string",
          "format": "date",
          "readOnly": true
        },
        "client": {
          "title": "Client",
          "description": "Cliente ECF vinculado (opcional)",
          "type": "string",
          "x-nullable": true
        },
        "client_name": {
          "title": "Client name",
          "type": "string",
          "readOnly": true,
          "minLength": 1,
          "x-nullable": true
        },
        "created_at": {
          "title": "Created at",
          "type": "string",
          "format": "date-time",
          "readOnly": true
        },
        "updated_at": {
          "title": "Updated at",
          "type": "string",
          "format": "date-time",
          "readOnly": true
        }
      }
    },
    "MembershipHistory": {
      "type": "object",
      "properties": {
        "id": {
          "title": "ID",
          "type": "integer",
          "readOnly": true
        },
        "member": {
          "title": "Asociado",
          "type": "integer",
          "readOnly": true
        },
        "previous_status": {
          "title": "Estado Anterior",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        },
        "new_status": {
          "title": "Nuevo Estado",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        },
        "reason": {
          "title": "Razón del Cambio",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        },
        "changed_by": {
          "title": "Modificado por",
          "type": "integer",
          "readOnly": true,
          "x-nullable": true
        },
        "changed_by_name": {
          "title": "Changed by name",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        },
        "changed_at": {
          "title": "Fecha",
          "type": "string",
          "format": "date-time",
          "readOnly": true
        }
      }
    },
    "MemberDetail": {
      "required": [
        "membership_number",
        "identificacion",
        "nombre"
      ],
      "type": "object",
      "properties": {
        "id": {
          "title": "ID",
          "type": "integer",
          "readOnly": true
        },
        "membership_number": {
          "title": "Número de Asociado",
          "type": "string",
          "maxLength": 20,
          "minLength": 1
        },
        "identificacion": {
          "title": "Número de Identificación",
          "type": "string",
          "maxLength": 20,
          "minLength": 1
        },
        "nombre": {
          "title": "Nombre Completo",
          "type": "string",
          "maxLength": 200,
          "minLength": 1
        },
        "email": {
          "title": "Correo Electrónico",
          "type": "string",
          "format": "email",
          "maxLength": 254
        },
        "telefono": {
          "title": "Teléfono",
          "type": "string",
          "maxLength": 20
        },
        "direccion": {
          "title": "Dirección",
          "type": "string"
        },
        "status": {
          "title": "Estado",
          "type": "string",
          "enum": [
            "ACTIVE",
            "INACTIVE",
            "SUSPENDED",
            "RETIRED"
          ]
        },
        "status_display": {
          "title": "Status display",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        },
        "origin": {
          "title": "Origen",
          "type": "string",
          "enum": [
            "VOLUNTARY",
            "ECF_MIGRATION",
            "PAYROLL"
          ]
        },
        "origin_display": {
          "title": "Origin display",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        },
        "minimum_contribution": {
          "title": "Aporte Mínimo Mensual",
          "description": "Valor por defecto: $30,000 COP (configurable en SystemParameter)",
          "type": "string",
          "format": "decimal"
        },
        "total_contributions": {
          "title": "Total Aportes Acumulados",
          "type": "string",
          "format": "decimal"
        },
        "contributions_count": {
          "title": "Contributions count",
          "type": "integer",
          "readOnly": true
        },
        "membership_date": {
          "title": "Fecha de Vinculación",
          "type": "string",
          "format": "date",
          "readOnly": true
        },
        "client": {
          "title": "Client",
          "description": "Cliente ECF vinculado (opcional)",
          "type": "string",
          "x-nullable": true
        },
        "client_name": {
          "title": "Client name",
          "type": "string",
          "readOnly": true,
          "minLength": 1,
          "x-nullable": true
        },
        "contributions": {
          "type": "array",
          "items": {
            "$ref": "#/definitions/SocialContribution"
          },
          "readOnly": true
        },
        "history": {
          "type": "array",
          "items": {
            "$ref": "#/definitions/MembershipHistory"
          },
          "readOnly": true
        },
        "pending_contributions": {
          "title": "Pending contributions",
          "type": "string",
          "readOnly": true
        },
        "created_at": {
          "title": "Created at",
          "type": "string",
          "format": "date-time",
          "readOnly": true
        },
        "updated_at": {
          "title": "Updated at",
          "type": "string",
          "format": "date-time",
          "readOnly": true
        }
      }
    },
    "PayrollAgreement": {
      "required": [
        "company",
        "start_date"
      ],
      "type": "object",
      "properties": {
        "id": {
          "title": "ID",
          "type": "integer",
          "readOnly": true
        },
        "agreement_number": {
          "title": "Número de Convenio",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        },
        "company": {
          "title": "Empresa",
          "type": "integer"
        },
        "company_name": {
          "title": "Company name",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        },
        "max_deduction_percentage": {
          "title": "% Máximo Deducción",
          "description": "Porcentaje máximo del salario que se puede descontar",
          "type": "string",
          "format": "decimal"
        },
        "start_date": {
          "title": "Fecha Inicio",
          "type": "string",
          "format": "date"
        },
        "end_date": {
          "title": "Fecha Fin",
          "type": "string",
          "format": "date",
          "x-nullable": true
        },
        "status": {
          "title": "Estado",
          "type": "string",
          "enum": [
            "DRAFT",
            "ACTIVE",
            "EXPIRED",
            "TERMINATED"
          ]
        },
        "status_display": {
          "title": "Status display",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        },
        "is_active": {
          "title": "Is active",
          "type": "boolean",
          "readOnly": true
        },
        "notes": {
          "title": "Notas",
          "type": "string"
        },
        "created_at": {
          "title": "Created at",
          "type": "string",
          "format": "date-time",
          "readOnly": true
        }
      }
    },
    "PayrollDeduction": {
      "type": "object",
      "properties": {
        "id": {
          "title": "ID",
          "type": "integer",
          "readOnly": true
        },
        "payroll_file": {
          "title": "Archivo",
          "type": "integer",
          "readOnly": true
        },
        "employee": {
          "title": "Empleado",
          "type": "integer",
          "readOnly": true
        },
        "employee_name": {
          "title": "Employee name",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        },
        "contribution_amount": {
          "title": "Aporte Social",
          "type": "string",
          "format": "decimal",
          "readOnly": true
        },
        "savings_amount": {
          "title": "Ahorro",
          "type": "string",
          "format": "decimal",
          "readOnly": true
        },
        "loan_amount": {
          "title": "Cuota Crédito",
          "type": "string",
          "format": "decimal",
          "readOnly": true
        },
        "other_amount": {
          "title": "Otros",
          "type": "string",
          "format": "decimal",
          "readOnly": true
        },
        "total_amount": {
          "title": "Total Deducción",
          "type": "string",
          "format": "decimal",
          "readOnly": true
        },
        "loan": {
          "title": "Crédito",
          "type": "integer",
          "readOnly": true,
          "x-nullable": true
        },
        "savings_account": {
          "title": "Cuenta Ahorro",
          "type": "integer",
          "readOnly": true,
          "x-nullable": true
        },
        "status": {
          "title": "Estado",
          "type": "string",
          "enum": [
            "PENDING",
            "APPLIED",
            "REJECTED",
            "ERROR"
          ],
          "readOnly": true
        },
        "status_display": {
          "title": "Status display",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        },
        "error_message": {
          "title": "Mensaje Error",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        },
        "applied_at": {
          "title": "Applied at",
          "type": "string",
          "format": "date-time",
          "readOnly": true,
          "x-nullable": true
        }
      }
    },
    "PayrollFile": {
      "required": [
        "company",
        "period",
        "file_name"
      ],
      "type": "object",
      "properties": {
        "id": {
          "title": "ID",
          "type": "integer",
          "readOnly": true
        },
        "company": {
          "title": "Empresa",
          "type": "integer"
        },
        "company_name": {
          "title": "Company name",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        },
        "period": {
          "title": "Período",
          "description": "Primer día del mes del período de nómina",
          "type": "string",
          "format": "date"
        },
        "file_name": {
          "title": "Nombre Archivo",
          "type": "string",
          "maxLength": 255,
          "minLength": 1
        },
        "file_path": {
          "title": "Archivo",
          "type": "string",
          "readOnly": true,
          "format": "uri"
        },
        "status": {
          "title": "Estado",
          "type": "string",
          "enum": [
            "PENDING",
            "PROCESSING",
            "PROCESSED",
            "ERROR"
          ]
        },
        "status_display": {
          "title": "Status display",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        },
        "total_employees": {
          "title": "Total Empleados",
          "type": "integer",
          "readOnly": true
        },
        "total_deductions": {
          "title": "Total Descuentos",
          "type": "string",
          "format": "decimal",
          "readOnly": true
        },
        "processed_count": {
          "title": "Procesados",
          "type": "integer",
          "readOnly": true
        },
        "error_count": {
          "title": "Errores",
          "type": "integer",
          "readOnly": true
        },
        "processing_notes": {
          "title": "Notas de Procesamiento",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        },
        "uploaded_at": {
          "title": "Uploaded at",
          "type": "string",
          "format": "date-time",
          "readOnly": true
        },
        "processed_at": {
          "title": "Processed at",
          "type": "string",
          "format": "date-time",
          "readOnly": true,
          "x-nullable": true
        }
      }
    },
    "PayrollFileDetail": {
      "required": [
        "company",
        "period",
        "file_name"
      ],
      "type": "object",
      "properties": {
        "id": {
          "title": "ID",
          "type": "integer",
          "readOnly": true
        },
        "company": {
          "title": "Empresa",
          "type": "integer"
        },
        "company_name": {
          "title": "Company name",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        },
        "period": {
          "title": "Período",
          "description": "Primer día del mes del período de nómina",
          "type": "string",
          "format": "date"
        },
        "file_name": {
          "title": "Nombre Archivo",
          "type": "string",
          "maxLength": 255,
          "minLength": 1
        },
        "file_path": {
          "title": "Archivo",
          "type": "string",
          "readOnly": true,
          "format": "uri"
        },
        "status": {
          "title": "Estado",
          "type": "string",
          "enum": [
            "PENDING",
            "PROCESSING",
            "PROCESSED",
            "ERROR"
          ]
        },
        "status_display": {
          "title": "Status display",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        },
        "total_employees": {
          "title": "Total Empleados",
          "type": "integer",
          "readOnly": true
        },
        "total_deductions": {
          "title": "Total Descuentos",
          "type": "string",
          "format": "decimal",
          "readOnly": true
        },
        "processed_count": {
          "title": "Procesados",
          "type": "integer",
          "readOnly": true
        },
        "error_count": {
          "title": "Errores",
          "type": "integer",
          "readOnly": true
        },
        "processing_notes": {
          "title": "Notas de Procesamiento",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        },
        "uploaded_at": {
          "title": "Uploaded at",
          "type": "string",
          "format": "date-time",
          "readOnly": true
        },
        "processed_at": {
          "title": "Processed at",
          "type": "string",
          "format": "date-time",
          "readOnly": true,
          "x-nullable": true
        },
        "deductions": {
          "type": "array",
          "items": {
            "$ref": "#/definitions/PayrollDeduction"
          },
          "readOnly": true
        }
      }
    },
    "SavingsAccount": {
      "required": [
        "member",
        "product"
      ],
      "type": "object",
      "properties": {
        "id": {
          "title": "ID",
          "type": "integer",
          "readOnly": true
        },
        "account_number": {
          "title": "Número de Cuenta",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        },
        "member": {
          "title": "Asociado",
          "type": "integer"
        },
        "member_name": {
          "title": "Member name",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        },
        "member_number": {
          "title": "Member number",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        },
        "product": {
          "title": "Producto",
          "type": "integer"
        },
        "product_name": {
          "title": "Product name",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        },
        "product_type": {
          "title": "Product type",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        },
        "balance": {
          "title": "Saldo Disponible",
          "type": "string",
          "format": "decimal",
          "readOnly": true
        },
        "accrued_interest": {
          "title": "Intereses Causados",
          "type": "string",
          "format": "decimal",
          "readOnly": true
        },
        "total_balance": {
          "title": "Total balance",
          "type": "string",
          "format": "decimal",
          "readOnly": true
        },
        "status": {
          "title": "Estado",
          "type": "string",
          "enum": [
            "ACTIVE",
            "BLOCKED",
            "CLOSED"
          ]
        },
        "status_display": {
          "title": "Status display",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        },
        "maturity_date": {
          "title": "Fecha de Vencimiento",
          "description": "Solo aplica para CDT",
          "type": "string",
          "format": "date",
          "x-nullable": true
        },
        "auto_renew": {
          "title": "Renovación Automática",
          "type": "boolean"
        },
        "days_to_maturity": {
          "title": "Days to maturity",
          "type": "integer",
          "readOnly": true
        },
        "monthly_target": {
          "title": "Meta Mensual",
          "description": "Solo aplica para ahorro programado",
          "type": "string",
          "format": "decimal"
        },
        "opened_at": {
          "title": "Fecha Apertura",
          "type": "string",
          "format": "date-time",
          "readOnly": true
        },
        "closed_at": {
          "title": "Fecha Cierre",
          "type": "string",
          "format": "date-time",
          "readOnly": true,
          "x-nullable": true
        }
      }
    },
    "SavingsAccountCreate": {
      "required": [
        "member",
        "product"
      ],
      "type": "object",
      "properties": {
        "member": {
          "title": "Asociado",
          "type": "integer"
        },
        "product": {
          "title": "Producto",
          "type": "integer"
        },
        "maturity_date": {
          "title": "Fecha de Vencimiento",
          "description": "Solo aplica para CDT",
          "type": "string",
          "format": "date",
          "x-nullable": true
        },
        "auto_renew": {
          "title": "Renovación Automática",
          "type": "boolean"
        },
        "monthly_target": {
          "title": "Meta Mensual",
          "description": "Solo aplica para ahorro programado",
          "type": "string",
          "format": "decimal"
        },
        "initial_deposit": {
          "title": "Initial deposit",
          "description": "Depósito inicial opcional",
          "type": "string",
          "format": "decimal"
        }
      }
    },
    "SavingsProduct": {
      "required": [
        "code",
        "name",
        "product_type",
        "annual_rate"
      ],
      "type": "object",
      "properties": {
        "id": {
          "title": "ID",
          "type": "integer",
          "readOnly": true
        },
        "code": {
          "title": "Código",
          "type": "string",
          "maxLength": 20,
          "minLength": 1
        },
        "name": {
          "title": "Nombre",
          "type": "string",
          "maxLength": 100,
          "minLength": 1
        },
        "description": {
          "title": "Descripción",
          "type": "string"
        },
        "product_type": {
          "title": "Tipo de Producto",
          "type": "string",
          "enum": [
            "VISTA",
            "PROGRAMADO",
            "CDT"
          ]
        },
        "product_type_display": {
          "title": "Product type display",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        },
        "annual_rate": {
          "title": "Tasa EA (%)",
          "description": "Tasa efectiva anual de rendimiento",
          "type": "string",
          "format": "decimal"
        },
        "monthly_rate": {
          "title": "Monthly rate",
          "type": "string",
          "format": "decimal",
          "readOnly": true
        },
        "minimum_balance": {
          "title": "Saldo Mínimo",
          "type": "string",
          "format": "decimal"
        },
        "minimum_opening": {
          "title": "Monto Mínimo Apertura",
          "type": "string",
          "format": "decimal"
        },
        "minimum_term_days": {
          "title": "Plazo Mínimo (días)",
          "description": "Solo aplica para CDT",
          "type": "integer",
          "maximum": 2147483647,
          "minimum": -2147483648
        },
        "withdrawal_fee": {
          "title": "Comisión por Retiro",
          "type": "string",
          "format": "decimal"
        },
        "early_withdrawal_penalty": {
          "title": "Penalización por Retiro Anticipado (%)",
          "description": "Porcentaje para CDT",
          "type": "string",
          "format": "decimal"
        },
        "is_active": {
          "title": "Activo",
          "type": "boolean"
        }
      }
    },
    "SavingsTransaction": {
      "type": "object",
      "properties": {
        "id": {
          "title": "ID",
          "type": "integer",
          "readOnly": true
        },
        "account": {
          "title": "Cuenta",
          "type": "integer",
          "readOnly": true
        },
        "transaction_type": {
          "title": "Tipo",
          "type": "string",
          "enum": [
            "DEPOSIT",
            "WITHDRAWAL",
            "INTEREST",
            "FEE",
            "TRANSFER_IN",
            "TRANSFER_OUT",
            "OPENING",
            "CLOSING"
          ],
          "readOnly": true
        },
        "transaction_type_display": {
          "title": "Transaction type display",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        },
        "amount": {
          "title": "Monto",
          "description": "Positivo para entrada, negativo para salida",
          "type": "string",
          "format": "decimal",
          "readOnly": true
        },
        "balance_after": {
          "title": "Saldo Después",
          "type": "string",
          "format": "decimal",
          "readOnly": true
        },
        "description": {
          "title": "Descripción",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        },
        "reference": {
          "title": "Referencia",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        },
        "transaction_date": {
          "title": "Fecha",
          "type": "string",
          "format": "date",
          "readOnly": true
        },
        "created_at": {
          "title": "Created at",
          "type": "string",
          "format": "date-time",
          "readOnly": true
        }
      }
    },
    "SavingsAccountDetail": {
      "required": [
        "member"
      ],
      "type": "object",
      "properties": {
        "id": {
          "title": "ID",
          "type": "integer",
          "readOnly": true
        },
        "account_number": {
          "title": "Número de Cuenta",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        },
        "member": {
          "title": "Asociado",
          "type": "integer"
        },
        "member_name": {
          "title": "Member name",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        },
        "member_number": {
          "title": "Member number",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        },
        "product": {
          "$ref": "#/definitions/SavingsProduct"
        },
        "product_name": {
          "title": "Product name",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        },
        "product_type": {
          "title": "Product type",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        },
        "balance": {
          "title": "Saldo Disponible",
          "type": "string",
          "format": "decimal",
          "readOnly": true
        },
        "accrued_interest": {
          "title": "Intereses Causados",
          "type": "string",
          "format": "decimal",
          "readOnly": true
        },
        "total_balance": {
          "title": "Total balance",
          "type": "string",
          "format": "decimal",
          "readOnly": true
        },
        "status": {
          "title": "Estado",
          "type": "string",
          "enum": [
            "ACTIVE",
            "BLOCKED",
            "CLOSED"
          ]
        },
        "status_display": {
          "title": "Status display",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        },
        "maturity_date": {
          "title": "Fecha de Vencimiento",
          "description": "Solo aplica para CDT",
          "type": "string",
          "format": "date",
          "x-nullable": true
        },
        "auto_renew": {
          "title": "Renovación Automática",
          "type": "boolean"
        },
        "days_to_maturity": {
          "title": "Days to maturity",
          "type": "integer",
          "readOnly": true
        },
        "monthly_target": {
          "title": "Meta Mensual",
          "description": "Solo aplica para ahorro programado",
          "type": "string",
          "format": "decimal"
        },
        "opened_at": {
          "title": "Fecha Apertura",
          "type": "string",
          "format": "date-time",
          "readOnly": true
        },
        "closed_at": {
          "title": "Fecha Cierre",
          "type": "string",
          "format": "date-time",
          "readOnly": true,
          "x-nullable": true
        },
        "transactions": {
          "type": "array",
          "items": {
            "$ref": "#/definitions/SavingsTransaction"
          },
          "readOnly": true
        }
      }
    },
    "CooperativeService": {
      "required": [
        "code",
        "name",
        "business_line"
      ],
      "type": "object",
      "properties": {
        "id": {
          "title": "ID",
          "type": "integer",
          "readOnly": true
        },
        "code": {
          "title": "Code",
          "type": "string",
          "maxLength": 20,
          "minLength": 1
        },
        "name": {
          "title": "Name",
          "type": "string",
          "maxLength": 100,
          "minLength": 1
        },
        "description": {
          "title": "Description",
          "type": "string"
        },
        "business_line": {
          "title": "Business line",
          "description": "Debe apuntar a BusinessLine.code = 'Ejecoom'",
          "type": "string"
        }
      }
    },
    "Activity": {
      "required": [
        "tipo",
        "descripcion"
      ],
      "type": "object",
      "properties": {
        "id": {
          "title": "ID",
          "type": "integer",
          "readOnly": true
        },
        "lead": {
          "title": "Lead",
          "type": "integer",
          "x-nullable": true
        },
        "opportunity": {
          "title": "Opportunity",
          "type": "integer",
          "x-nullable": true
        },
        "tipo": {
          "title": "Tipo",
          "type": "string",
          "enum": [
            "LLAMADA",
            "WHATSAPP",
            "EMAIL",
            "REUNION",
            "VISITA",
            "NOTA",
            "PROPUESTA",
            "SEGUIMIENTO",
            "REVISION_DOCUMENTAL",
            "VALIDACION_IDENTIDAD",
            "OBSERVACION_EXPEDIENTE",
            "APROBACION_DOC",
            "PUBLICACION_POST",
            "PUBLICACION_PODCAST",
            "CREACION_MATERIAL",
            "CAMPANA",
            "COBRO_TELEFONICO",
            "ACUERDO_PAGO",
            "VISITA_COBRO"
          ]
        },
        "descripcion": {
          "title": "Descripcion",
          "type": "string",
          "minLength": 1
        },
        "resultado": {
          "title": "Resultado",
          "type": "string",
          "enum": [
            "contactado",
            "no_contesta",
            "interesado",
            "agenda_cita",
            "rechaza",
            "sin_resultado"
          ]
        },
        "motivo_descarte": {
          "title": "Motivo descarte",
          "type": "string",
          "enum": [
            "precio",
            "competencia",
            "no_califica",
            "no_responde",
            "otro"
          ]
        },
        "fecha": {
          "title": "Fecha",
          "type": "string",
          "format": "date-time"
        },
        "proxima_accion": {
          "title": "Proxima accion",
          "type": "string",
          "format": "date-time",
          "x-nullable": true
        },
        "duracion_segundos": {
          "title": "Duracion segundos",
          "type": "integer",
          "maximum": 4294967295,
          "minimum": 0,
          "x-nullable": true
        },
        "checklist_item": {
          "title": "Checklist item",
          "type": "string",
          "maxLength": 50
        },
        "creado_por": {
          "title": "Creado por",
          "type": "integer",
          "x-nullable": true
        },
        "creado_por_nombre": {
          "title": "Creado por nombre",
          "type": "string",
          "readOnly": true
        },
        "created_at": {
          "title": "Created at",
          "type": "string",
          "format": "date-time",
          "readOnly": true
        }
      }
    },
    "ActivityCreate": {
      "required": [
        "tipo",
        "descripcion"
      ],
      "type": "object",
      "properties": {
        "lead": {
          "title": "Lead",
          "type": "integer",
          "x-nullable": true
        },
        "opportunity": {
          "title": "Opportunity",
          "type": "integer",
          "x-nullable": true
        },
        "tipo": {
          "title": "Tipo",
          "type": "string",
          "enum": [
            "LLAMADA",
            "WHATSAPP",
            "EMAIL",
            "REUNION",
            "VISITA",
            "NOTA",
            "PROPUESTA",
            "SEGUIMIENTO",
            "REVISION_DOCUMENTAL",
            "VALIDACION_IDENTIDAD",
            "OBSERVACION_EXPEDIENTE",
            "APROBACION_DOC",
            "PUBLICACION_POST",
            "PUBLICACION_PODCAST",
            "CREACION_MATERIAL",
            "CAMPANA",
            "COBRO_TELEFONICO",
            "ACUERDO_PAGO",
            "VISITA_COBRO"
          ]
        },
        "descripcion": {
          "title": "Descripcion",
          "type": "string",
          "minLength": 1
        },
        "resultado": {
          "title": "Resultado",
          "type": "string",
          "enum": [
            "contactado",
            "no_contesta",
            "interesado",
            "agenda_cita",
            "rechaza",
            "sin_resultado"
          ]
        },
        "motivo_descarte": {
          "title": "Motivo descarte",
          "type": "string",
          "enum": [
            "precio",
            "competencia",
            "no_califica",
            "no_responde",
            "otro"
          ]
        },
        "fecha": {
          "title": "Fecha",
          "type": "string",
          "format": "date-time"
        },
        "proxima_accion": {
          "title": "Proxima accion",
          "type": "string",
          "format": "date-time",
          "x-nullable": true
        },
        "duracion_segundos": {
          "title": "Duracion segundos",
          "type": "integer",
          "maximum": 4294967295,
          "minimum": 0,
          "x-nullable": true
        },
        "checklist_item": {
          "title": "Checklist item",
          "type": "string",
          "maxLength": 50
        }
      }
    },
    "Campaign": {
      "required": [
        "nombre"
      ],
      "type": "object",
      "properties": {
        "id": {
          "title": "ID",
          "type": "integer",
          "readOnly": true
        },
        "nombre": {
          "title": "Nombre",
          "type": "string",
          "maxLength": 160,
          "minLength": 1
        },
        "descripcion": {
          "title": "Descripcion",
          "type": "string"
        },
        "linea_negocio": {
          "title": "Linea negocio",
          "type": "string",
          "x-nullable": true
        },
        "linea_negocio_nombre": {
          "title": "Linea negocio nombre",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        },
        "servicio": {
          "title": "Servicio",
          "type": "string",
          "x-nullable": true
        },
        "servicio_nombre": {
          "title": "Servicio nombre",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        },
        "tipo_interes": {
          "title": "Tipo interes",
          "type": "string",
          "enum": [
            "credito",
            "inversion",
            "inmobiliario",
            "cooperativa",
            "accntant",
            "juridico",
            "otro"
          ]
        },
        "entidad": {
          "title": "Entidad",
          "type": "string",
          "maxLength": 160
        },
        "ciudad": {
          "title": "Ciudad",
          "type": "string",
          "maxLength": 100
        },
        "cupo_diario": {
          "title": "Cupo diario",
          "description": "Prospectos por asesor y día al repartir",
          "type": "integer",
          "maximum": 65535,
          "minimum": 0
        },
        "estado": {
          "title": "Estado",
          "type": "string",
          "enum": [
            "activa",
            "pausada",
            "cerrada"
          ]
        },
        "creado_por": {
          "title": "Creado por",
          "type": "integer",
          "readOnly": true,
          "x-nullable": true
        },
        "created_at": {
          "title": "Created at",
          "type": "string",
          "format": "date-time",
          "readOnly": true
        },
        "updated_at": {
          "title": "Updated at",
          "type": "string",
          "format": "date-time",
          "readOnly": true
        },
        "stats": {
          "title": "Stats",
          "type": "string",
          "readOnly": true
        }
      }
    },
    "Lead": {
      "required": [
        "nombre",
        "email",
        "telefono"
      ],
      "type": "object",
      "properties": {
        "id": {
          "title": "ID",
          "type": "integer",
          "readOnly": true
        },
        "nombre": {
          "title": "Nombre",
          "type": "string",
          "maxLength": 255,
          "minLength": 1
        },
        "identificacion": {
          "title": "Identificacion",
          "type": "string",
          "maxLength": 50
        },
        "email": {
          "title": "Email",
          "type": "string",
          "format": "email",
          "maxLength": 254,
          "minLength": 1
        },
        "telefono": {
          "title": "Telefono",
          "type": "string",
          "maxLength": 50,
          "minLength": 1
        },
        "ciudad": {
          "title": "Ciudad",
          "type": "string",
          "maxLength": 100
        },
        "fuente": {
          "title": "Fuente",
          "type": "string",
          "enum": [
            "landing",
            "whatsapp",
            "telefono",
            "referido",
            "walk_in",
            "social_media",
            "blog",
            "feria",
            "cartera_interna",
            "cooperativa",
            "base_datos"
          ]
        },
        "tipo_interes": {
          "title": "Tipo interes",
          "type": "string",
          "enum": [
            "credito",
            "inversion",
            "inmobiliario",
            "cooperativa",
            "accntant",
            "juridico",
            "otro"
          ]
        },
        "etapa": {
          "title": "Etapa",
          "type": "string",
          "enum": [
            "nuevo",
            "contactado",
            "calificado",
            "propuesta",
            "negociacion",
            "ganado",
            "perdido",
            "reactivar"
          ]
        },
        "nombre_etapa": {
          "title": "Nombre etapa",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        },
        "calificacion": {
          "title": "Calificacion",
          "type": "integer",
          "maximum": 5,
          "minimum": 1
        },
        "monto_estimado": {
          "title": "Monto estimado",
          "type": "string",
          "format": "decimal"
        },
        "linea_negocio": {
          "title": "Linea negocio",
          "type": "string",
          "x-nullable": true
        },
        "linea_negocio_nombre": {
          "title": "Linea negocio nombre",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        },
        "servicio": {
          "title": "Servicio",
          "type": "string",
          "x-nullable": true
        },
        "servicio_nombre": {
          "title": "Servicio nombre",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        },
        "asignado_a": {
          "title": "Asignado a",
          "type": "integer",
          "x-nullable": true
        },
        "asignado_a_nombre": {
          "title": "Asignado a nombre",
          "type": "string",
          "readOnly": true
        },
        "dias_en_etapa": {
          "title": "Dias en etapa",
          "type": "integer",
          "readOnly": true
        },
        "is_stale": {
          "title": "Is stale",
          "type": "string",
          "readOnly": true
        },
        "fecha_recontacto": {
          "title": "Fecha recontacto",
          "type": "string",
          "format": "date",
          "x-nullable": true
        },
        "motivo_perdida": {
          "title": "Motivo perdida",
          "type": "string",
          "enum": [
            "precio",
            "competencia",
            "no_califica",
            "no_responde",
            "otro"
          ]
        },
        "created_at": {
          "title": "Created at",
          "type": "string",
          "format": "date-time",
          "readOnly": true
        },
        "updated_at": {
          "title": "Updated at",
          "type": "string",
          "format": "date-time",
          "readOnly": true
        }
      }
    },
    "LeadCreate": {
      "required": [
        "nombre",
        "email",
        "telefono"
      ],
      "type": "object",
      "properties": {
        "nombre": {
          "title": "Nombre",
          "type": "string",
          "maxLength": 255,
          "minLength": 1
        },
        "identificacion": {
          "title": "Identificacion",
          "type": "string",
          "maxLength": 50
        },
        "email": {
          "title": "Email",
          "type": "string",
          "format": "email",
          "maxLength": 254,
          "minLength": 1
        },
        "telefono": {
          "title": "Telefono",
          "type": "string",
          "maxLength": 50,
          "minLength": 1
        },
        "ciudad": {
          "title": "Ciudad",
          "type": "string",
          "maxLength": 100
        },
        "fuente": {
          "title": "Fuente",
          "type": "string",
          "enum": [
            "landing",
            "whatsapp",
            "telefono",
            "referido",
            "walk_in",
            "social_media",
            "blog",
            "feria",
            "cartera_interna",
            "cooperativa",
            "base_datos"
          ]
        },
        "tipo_interes": {
          "title": "Tipo interes",
          "type": "string",
          "enum": [
            "credito",
            "inversion",
            "inmobiliario",
            "cooperativa",
            "accntant",
            "juridico",
            "otro"
          ]
        },
        "etapa": {
          "title": "Etapa",
          "type": "string",
          "enum": [
            "nuevo",
            "contactado",
            "calificado",
            "propuesta",
            "negociacion",
            "ganado",
            "perdido",
            "reactivar"
          ]
        },
        "calificacion": {
          "title": "Calificacion",
          "type": "integer",
          "maximum": 5,
          "minimum": 1
        },
        "monto_estimado": {
          "title": "Monto estimado",
          "type": "string",
          "format": "decimal"
        },
        "linea_negocio": {
          "title": "Linea negocio",
          "type": "string",
          "x-nullable": true
        },
        "servicio": {
          "title": "Servicio",
          "type": "string",
          "x-nullable": true
        },
        "service_request": {
          "title": "Service request",
          "type": "integer",
          "x-nullable": true
        },
        "asignado_a": {
          "title": "Asignado a",
          "type": "integer",
          "x-nullable": true
        },
        "notas": {
          "title": "Notas",
          "type": "string"
        },
        "motivo_perdida": {
          "title": "Motivo perdida",
          "type": "string",
          "enum": [
            "precio",
            "competencia",
            "no_califica",
            "no_responde",
            "otro"
          ]
        },
        "fecha_recontacto": {
          "title": "Fecha recontacto",
          "type": "string",
          "format": "date",
          "x-nullable": true
        },
        "marketing_attribution": {
          "title": "Marketing attribution",
          "type": "object"
        }
      }
    },
    "LeadDetail": {
      "required": [
        "nombre",
        "email",
        "telefono"
      ],
      "type": "object",
      "properties": {
        "id": {
          "title": "ID",
          "type": "integer",
          "readOnly": true
        },
        "activities": {
          "title": "Activities",
          "type": "string",
          "readOnly": true
        },
        "opportunity": {
          "title": "Opportunity",
          "type": "string",
          "readOnly": true
        },
        "service_request_info": {
          "title": "Service request info",
          "type": "string",
          "readOnly": true
        },
        "client_info": {
          "title": "Client info",
          "type": "string",
          "readOnly": true
        },
        "investor_info": {
          "title": "Investor info",
          "type": "string",
          "readOnly": true
        },
        "asignado_a_nombre": {
          "title": "Asignado a nombre",
          "type": "string",
          "readOnly": true
        },
        "linea_negocio_nombre": {
          "title": "Linea negocio nombre",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        },
        "servicio_nombre": {
          "title": "Servicio nombre",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        },
        "dias_en_etapa": {
          "title": "Dias en etapa",
          "type": "integer",
          "readOnly": true
        },
        "is_stale": {
          "title": "Is stale",
          "type": "string",
          "readOnly": true
        },
        "nombre": {
          "title": "Nombre",
          "type": "string",
          "maxLength": 255,
          "minLength": 1
        },
        "identificacion": {
          "title": "Identificacion",
          "type": "string",
          "maxLength": 50
        },
        "email": {
          "title": "Email",
          "type": "string",
          "format": "email",
          "maxLength": 254,
          "minLength": 1
        },
        "telefono": {
          "title": "Telefono",
          "type": "string",
          "maxLength": 50,
          "minLength": 1
        },
        "ciudad": {
          "title": "Ciudad",
          "type": "string",
          "maxLength": 100
        },
        "fuente": {
          "title": "Fuente",
          "type": "string",
          "enum": [
            "landing",
            "whatsapp",
            "telefono",
            "referido",
            "walk_in",
            "social_media",
            "blog",
            "feria",
            "cartera_interna",
            "cooperativa",
            "base_datos"
          ]
        },
        "tipo_interes": {
          "title": "Tipo interes",
          "type": "string",
          "enum": [
            "credito",
            "inversion",
            "inmobiliario",
            "cooperativa",
            "accntant",
            "juridico",
            "otro"
          ]
        },
        "etapa": {
          "title": "Etapa",
          "type": "string",
          "enum": [
            "nuevo",
            "contactado",
            "calificado",
            "propuesta",
            "negociacion",
            "ganado",
            "perdido",
            "reactivar"
          ]
        },
        "motivo_perdida": {
          "title": "Motivo perdida",
          "type": "string",
          "enum": [
            "precio",
            "competencia",
            "no_califica",
            "no_responde",
            "otro"
          ]
        },
        "calificacion": {
          "title": "Calificacion",
          "type": "integer",
          "maximum": 5,
          "minimum": 1
        },
        "monto_estimado": {
          "title": "Monto estimado",
          "type": "string",
          "format": "decimal"
        },
        "partner_referido_id": {
          "title": "Partner referido id",
          "type": "integer",
          "maximum": 4294967295,
          "minimum": 0,
          "x-nullable": true
        },
        "fecha_recontacto": {
          "title": "Fecha recontacto",
          "type": "string",
          "format": "date",
          "x-nullable": true
        },
        "fecha_ganado": {
          "title": "Fecha ganado",
          "type": "string",
          "format": "date-time",
          "x-nullable": true
        },
        "stage_updated_at": {
          "title": "Stage updated at",
          "type": "string",
          "format": "date-time"
        },
        "notas": {
          "title": "Notas",
          "type": "string"
        },
        "checklist_documental": {
          "title": "Checklist documental",
          "type": "object"
        },
        "fecha_radicacion_documentos": {
          "title": "Fecha radicacion documentos",
          "type": "string",
          "format": "date-time",
          "x-nullable": true
        },
        "marketing_attribution": {
          "title": "Marketing attribution",
          "type": "object"
        },
        "created_at": {
          "title": "Created at",
          "type": "string",
          "format": "date-time",
          "readOnly": true
        },
        "updated_at": {
          "title": "Updated at",
          "type": "string",
          "format": "date-time",
          "readOnly": true
        },
        "linea_negocio": {
          "title": "Linea negocio",
          "type": "string",
          "x-nullable": true
        },
        "servicio": {
          "title": "Servicio",
          "type": "string",
          "x-nullable": true
        },
        "service_request": {
          "title": "Service request",
          "type": "integer",
          "x-nullable": true
        },
        "client": {
          "title": "Client",
          "type": "string",
          "x-nullable": true
        },
        "investor": {
          "title": "Investor",
          "type": "integer",
          "x-nullable": true
        },
        "asignado_a": {
          "title": "Asignado a",
          "type": "integer",
          "x-nullable": true
        },
        "creado_por": {
          "title": "Creado por",
          "type": "integer",
          "x-nullable": true
        }
      }
    },
    "Opportunity": {
      "required": [
        "lead",
        "titulo"
      ],
      "type": "object",
      "properties": {
        "id": {
          "title": "ID",
          "type": "integer",
          "readOnly": true
        },
        "lead": {
          "title": "Lead",
          "type": "integer"
        },
        "lead_nombre": {
          "title": "Lead nombre",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        },
        "titulo": {
          "title": "Titulo",
          "type": "string",
          "maxLength": 200,
          "minLength": 1
        },
        "linea_negocio": {
          "title": "Linea negocio",
          "type": "string",
          "x-nullable": true
        },
        "servicio": {
          "title": "Servicio",
          "type": "string",
          "x-nullable": true
        },
        "monto_estimado": {
          "title": "Monto estimado",
          "type": "string",
          "format": "decimal"
        },
        "probabilidad": {
          "title": "Probabilidad",
          "type": "integer",
          "maximum": 100,
          "minimum": 0
        },
        "weighted_value": {
          "title": "Weighted value",
          "type": "string",
          "format": "decimal",
          "readOnly": true
        },
        "etapa": {
          "title": "Etapa",
          "type": "string",
          "enum": [
            "propuesta",
            "negociacion",
            "ganado",
            "perdido"
          ]
        },
        "fecha_cierre_esperada": {
          "title": "Fecha cierre esperada",
          "type": "string",
          "format": "date",
          "x-nullable": true
        },
        "asignado_a": {
          "title": "Asignado a",
          "type": "integer",
          "x-nullable": true
        },
        "asignado_a_nombre": {
          "title": "Asignado a nombre",
          "type": "string",
          "readOnly": true
        },
        "contrato_generado": {
          "title": "Contrato generado",
          "type": "string",
          "x-nullable": true
        },
        "contrato_info": {
          "title": "Contrato info",
          "type": "string",
          "readOnly": true
        },
        "motivo_perdida": {
          "title": "Motivo perdida",
          "type": "string",
          "enum": [
            "precio",
            "competencia",
            "no_califica",
            "no_responde",
            "otro"
          ]
        },
        "notas": {
          "title": "Notas",
          "type": "string"
        },
        "created_at": {
          "title": "Created at",
          "type": "string",
          "format": "date-time",
          "readOnly": true
        },
        "updated_at": {
          "title": "Updated at",
          "type": "string",
          "format": "date-time",
          "readOnly": true
        }
      }
    },
    "Prospect": {
      "required": [
        "importacion",
        "numero_documento"
      ],
      "type": "object",
      "properties": {
        "id": {
          "title": "ID",
          "type": "integer",
          "readOnly": true
        },
        "importacion": {
          "title": "Importacion",
          "type": "integer"
        },
        "campaign": {
          "title": "Campaign",
          "type": "integer",
          "x-nullable": true
        },
        "campaign_nombre": {
          "title": "Campaign nombre",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        },
        "campaign_tipo_interes": {
          "title": "Campaign tipo interes",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        },
        "tipo_documento": {
          "title": "Tipo documento",
          "type": "string",
          "maxLength": 10
        },
        "numero_documento": {
          "title": "Numero documento",
          "type": "string",
          "maxLength": 50,
          "minLength": 1
        },
        "nombres": {
          "title": "Nombres",
          "type": "string",
          "maxLength": 120
        },
        "apellidos": {
          "title": "Apellidos",
          "type": "string",
          "maxLength": 120
        },
        "nombre_completo": {
          "title": "Nombre completo",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        },
        "telefono_celular": {
          "title": "Telefono celular",
          "type": "string",
          "maxLength": 20
        },
        "telefono_fijo": {
          "title": "Telefono fijo",
          "type": "string",
          "maxLength": 20
        },
        "ciudad": {
          "title": "Ciudad",
          "type": "string",
          "maxLength": 100
        },
        "entidad": {
          "title": "Entidad",
          "type": "string",
          "maxLength": 160
        },
        "cargo": {
          "title": "Cargo",
          "type": "string",
          "maxLength": 120
        },
        "tipo_vinculacion": {
          "title": "Tipo vinculacion",
          "type": "string",
          "maxLength": 60
        },
        "estado": {
          "title": "Estado",
          "type": "string",
          "enum": [
            "disponible",
            "asignado",
            "convertido",
            "descartado",
            "opt_out"
          ]
        },
        "asignado_a": {
          "title": "Asignado a",
          "type": "integer",
          "x-nullable": true
        },
        "asignado_a_nombre": {
          "title": "Asignado a nombre",
          "type": "string",
          "readOnly": true
        },
        "fecha_asignacion": {
          "title": "Fecha asignacion",
          "type": "string",
          "format": "date",
          "x-nullable": true
        },
        "proximo_intento": {
          "title": "Proximo intento",
          "type": "string",
          "format": "date",
          "x-nullable": true
        },
        "intentos": {
          "title": "Intentos",
          "type": "integer",
          "maximum": 65535,
          "minimum": 0
        },
        "ultimo_resultado": {
          "title": "Ultimo resultado",
          "type": "string",
          "enum": [
            "no_contesta",
            "volver_a_llamar",
            "numero_errado",
            "no_interesa",
            "interesado",
            "opt_out"
          ]
        },
        "nota_resultado": {
          "title": "Nota resultado",
          "type": "string",
          "maxLength": 500
        },
        "ultimo_contacto": {
          "title": "Ultimo contacto",
          "type": "string",
          "format": "date-time",
          "x-nullable": true
        },
        "lead": {
          "title": "Lead",
          "type": "integer",
          "x-nullable": true
        },
        "created_at": {
          "title": "Created at",
          "type": "string",
          "format": "date-time",
          "readOnly": true
        }
      }
    },
    "DiscountScale": {
      "required": [
        "nombre_escala",
        "porcentaje_descuento_max"
      ],
      "type": "object",
      "properties": {
        "id": {
          "title": "ID",
          "type": "integer",
          "readOnly": true
        },
        "componente_aplica_display": {
          "title": "Componente aplica display",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        },
        "nombre_escala": {
          "title": "Nombre de la Escala",
          "type": "string",
          "maxLength": 150,
          "minLength": 1
        },
        "monto_minimo": {
          "title": "Monto Mínimo ($)",
          "type": "string",
          "format": "decimal"
        },
        "monto_maximo": {
          "title": "Monto Máximo ($)",
          "description": "Dejar en blanco para sin límite superior",
          "type": "string",
          "format": "decimal",
          "x-nullable": true
        },
        "dias_mora_minimo": {
          "title": "Días de Mora Mínimos",
          "type": "integer",
          "maximum": 2147483647,
          "minimum": -2147483648
        },
        "dias_mora_maximo": {
          "title": "Días de Mora Máximos",
          "description": "Dejar en blanco para sin límite de días",
          "type": "integer",
          "maximum": 2147483647,
          "minimum": -2147483648,
          "x-nullable": true
        },
        "componente_aplica": {
          "title": "Componente Afectable",
          "type": "string",
          "enum": [
            "INTERESES",
            "HONORARIOS",
            "CAPITAL",
            "TOTAL"
          ]
        },
        "porcentaje_descuento_max": {
          "title": "Porcentaje Máximo Descuento (%)",
          "description": "Ej. 15.00 para 15%",
          "type": "string",
          "format": "decimal"
        },
        "referencia_normativa": {
          "title": "Referencia Normativa / Política",
          "type": "string",
          "maxLength": 255
        },
        "requiere_aprobacion_si_supera": {
          "title": "Requiere Aprobación si Supera Escala",
          "type": "boolean"
        },
        "activo": {
          "title": "Activo",
          "type": "boolean"
        },
        "created_at": {
          "title": "Created at",
          "type": "string",
          "format": "date-time",
          "readOnly": true
        },
        "updated_at": {
          "title": "Updated at",
          "type": "string",
          "format": "date-time",
          "readOnly": true
        }
      }
    },
    "DiscountApprovalRequest": {
      "required": [
        "deuda_original",
        "porcentaje_solicitado",
        "monto_descuento_solicitado",
        "deuda_final_con_descuento",
        "motivo_justificacion",
        "contrato"
      ],
      "type": "object",
      "properties": {
        "id": {
          "title": "ID",
          "type": "integer",
          "readOnly": true
        },
        "solicitante_nombre": {
          "title": "Solicitante nombre",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        },
        "solicitante_username": {
          "title": "Solicitante username",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        },
        "aprobado_por_username": {
          "title": "Aprobado por username",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        },
        "cliente_nombre": {
          "title": "Cliente nombre",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        },
        "contrato_no": {
          "title": "Contrato no",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        },
        "estado_display": {
          "title": "Estado display",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        },
        "escala_sugerida_detalle": {
          "$ref": "#/definitions/DiscountScale"
        },
        "deuda_original": {
          "title": "Deuda Original",
          "type": "string",
          "format": "decimal"
        },
        "porcentaje_solicitado": {
          "title": "Porcentaje Solicitado (%)",
          "type": "string",
          "format": "decimal"
        },
        "monto_descuento_solicitado": {
          "title": "Monto Descuento Solicitado",
          "type": "string",
          "format": "decimal"
        },
        "deuda_final_con_descuento": {
          "title": "Deuda Final con Descuento",
          "type": "string",
          "format": "decimal"
        },
        "componente_afectado": {
          "title": "Componente Afectado",
          "type": "string",
          "maxLength": 20,
          "minLength": 1
        },
        "motivo_justificacion": {
          "title": "Motivo / Justificación de la Negociación",
          "type": "string",
          "minLength": 1
        },
        "estado": {
          "title": "Estado",
          "type": "string",
          "enum": [
            "PENDIENTE",
            "APROBADO",
            "RECHAZADO"
          ],
          "readOnly": true
        },
        "respuesta_admin": {
          "title": "Respuesta / Notas del Administrador",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        },
        "fecha_solicitud": {
          "title": "Fecha Solicitud",
          "type": "string",
          "format": "date-time",
          "readOnly": true
        },
        "fecha_respuesta": {
          "title": "Fecha Respuesta",
          "type": "string",
          "format": "date-time",
          "readOnly": true,
          "x-nullable": true
        },
        "contrato": {
          "title": "Contrato",
          "type": "string"
        },
        "solicitante": {
          "title": "Solicitante",
          "type": "integer",
          "readOnly": true
        },
        "escala_sugerida": {
          "title": "Escala Sugerida",
          "type": "integer",
          "x-nullable": true
        },
        "aprobado_por": {
          "title": "Aprobado/Rechazado por",
          "type": "integer",
          "readOnly": true,
          "x-nullable": true
        }
      }
    },
    "Group": {
      "required": [
        "name"
      ],
      "type": "object",
      "properties": {
        "id": {
          "title": "ID",
          "type": "integer",
          "readOnly": true
        },
        "name": {
          "title": "Nombre",
          "type": "string",
          "maxLength": 150,
          "minLength": 1
        },
        "permissions": {
          "title": "Permissions",
          "type": "string",
          "readOnly": true
        },
        "app_labels": {
          "title": "App labels",
          "type": "string",
          "readOnly": true
        },
        "permission_ids": {
          "type": "array",
          "items": {
            "type": "integer"
          },
          "uniqueItems": true
        }
      }
    },
    "Inquiry": {
      "required": [
        "name",
        "email"
      ],
      "type": "object",
      "properties": {
        "id": {
          "title": "ID",
          "type": "integer",
          "readOnly": true
        },
        "name": {
          "title": "Nombre",
          "type": "string",
          "maxLength": 255,
          "minLength": 1
        },
        "email": {
          "title": "Correo",
          "type": "string",
          "format": "email",
          "maxLength": 254,
          "minLength": 1
        },
        "phone": {
          "title": "Teléfono",
          "type": "string",
          "maxLength": 50
        },
        "business_line": {
          "title": "Línea de negocio",
          "type": "string",
          "x-nullable": true
        },
        "service_type": {
          "title": "Tipo de solicitud",
          "type": "string",
          "enum": [
            "contact",
            "credit",
            "other"
          ]
        },
        "message": {
          "title": "Mensaje / Descripción",
          "type": "string"
        },
        "created_at": {
          "title": "Fecha de envío",
          "type": "string",
          "format": "date-time",
          "readOnly": true
        },
        "status": {
          "title": "Estado",
          "type": "string",
          "enum": [
            "new",
            "in_progress",
            "closed"
          ]
        },
        "assigned_to": {
          "title": "Asignado a",
          "type": "integer",
          "x-nullable": true
        }
      }
    },
    "Investor": {
      "required": [
        "id_inversionista",
        "nombre"
      ],
      "type": "object",
      "properties": {
        "id_inversionista": {
          "title": "Id inversionista",
          "type": "integer",
          "maximum": 2147483647,
          "minimum": -2147483648
        },
        "nombre": {
          "title": "Nombre",
          "type": "string",
          "maxLength": 255,
          "minLength": 1
        },
        "direccion": {
          "title": "Direccion",
          "type": "string",
          "maxLength": 255
        },
        "telefono": {
          "title": "Telefono",
          "type": "string",
          "maxLength": 50
        },
        "email": {
          "title": "Email",
          "type": "string",
          "format": "email",
          "maxLength": 254
        },
        "tasa_interes_default": {
          "title": "Tasa interes default",
          "description": "Tasa de interés por defecto para contratos (TRI), como fracción: 0.035 = 3.5%",
          "type": "string",
          "format": "decimal"
        },
        "activo": {
          "title": "Activo",
          "description": "Indica si el inversionista está activo (False para soft-delete)",
          "type": "boolean"
        },
        "disponible_legacy": {
          "title": "Disponible legacy",
          "type": "string",
          "readOnly": true
        },
        "disponible_v3": {
          "title": "Disponible v3",
          "type": "string",
          "readOnly": true
        },
        "disponible_pd": {
          "title": "Disponible pd",
          "type": "string",
          "readOnly": true
        }
      }
    },
    "Contract2InvestorSerializer": {
      "required": [
        "no_contrato",
        "monto"
      ],
      "type": "object",
      "properties": {
        "no_contrato": {
          "title": "Número de Contrato",
          "description": "Identificador único del contrato",
          "type": "string",
          "maxLength": 255,
          "minLength": 1
        },
        "fecha_desembolso": {
          "title": "Fecha de Desembolso",
          "type": "string",
          "format": "date",
          "x-nullable": true
        },
        "monto": {
          "title": "Monto Principal",
          "type": "string",
          "format": "decimal"
        },
        "estado": {
          "title": "Estado",
          "type": "string",
          "readOnly": true
        }
      }
    },
    "InvestorDetailSerializer": {
      "required": [
        "id_inversionista",
        "nombre"
      ],
      "type": "object",
      "properties": {
        "id_inversionista": {
          "title": "Id inversionista",
          "type": "integer",
          "maximum": 2147483647,
          "minimum": -2147483648
        },
        "contratos": {
          "type": "array",
          "items": {
            "$ref": "#/definitions/Contract2InvestorSerializer"
          },
          "readOnly": true
        },
        "transacciones": {
          "title": "Transacciones",
          "type": "string",
          "readOnly": true
        },
        "disponible_legacy": {
          "title": "Disponible legacy",
          "type": "string",
          "readOnly": true
        },
        "disponible_v3": {
          "title": "Disponible v3",
          "type": "string",
          "readOnly": true
        },
        "disponible_pd": {
          "title": "Disponible pd",
          "type": "string",
          "readOnly": true
        },
        "identificacion": {
          "title": "Identificacion",
          "description": "Documento de identidad; enlaza al inversionista con Client/Member/Lead",
          "type": "string",
          "maxLength": 20,
          "x-nullable": true
        },
        "nombre": {
          "title": "Nombre",
          "type": "string",
          "maxLength": 255,
          "minLength": 1
        },
        "direccion": {
          "title": "Direccion",
          "type": "string",
          "maxLength": 255
        },
        "telefono": {
          "title": "Telefono",
          "type": "string",
          "maxLength": 50
        },
        "email": {
          "title": "Email",
          "type": "string",
          "format": "email",
          "maxLength": 254
        },
        "tasa_interes_default": {
          "title": "Tasa interes default",
          "description": "Tasa de interés por defecto para contratos (TRI), como fracción: 0.035 = 3.5%",
          "type": "string",
          "format": "decimal"
        },
        "activo": {
          "title": "Activo",
          "description": "Indica si el inversionista está activo (False para soft-delete)",
          "type": "boolean"
        }
      }
    },
    "LegalCaseList": {
      "required": [
        "contract"
      ],
      "type": "object",
      "properties": {
        "id": {
          "title": "ID",
          "type": "integer",
          "readOnly": true
        },
        "contract": {
          "title": "Contrato",
          "type": "string"
        },
        "contract_number": {
          "title": "Contract number",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        },
        "client_name": {
          "title": "Client name",
          "type": "string",
          "readOnly": true
        },
        "client_id": {
          "title": "Client id",
          "type": "string",
          "readOnly": true
        },
        "total_debt": {
          "title": "Total debt",
          "type": "string",
          "readOnly": true
        },
        "dias_mora": {
          "title": "Dias mora",
          "type": "string",
          "readOnly": true
        },
        "legal_firm": {
          "title": "Firma Asignada",
          "type": "integer",
          "x-nullable": true
        },
        "legal_firm_name": {
          "title": "Legal firm name",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        },
        "assigned_to": {
          "title": "Gestor Asignado",
          "description": "Abogado responsable dentro de la firma",
          "type": "integer",
          "x-nullable": true
        },
        "assigned_to_name": {
          "title": "Assigned to name",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        },
        "etapa_procesal": {
          "title": "Etapa Procesal",
          "type": "string",
          "enum": [
            "PREJURIDICO",
            "DEMANDA_PREPARACION",
            "DEMANDA_RADICADA",
            "ADMISION",
            "MANDAMIENTO_PAGO",
            "NOTIFICACION",
            "EXCEPCIONES",
            "EMBARGO",
            "EMBARGO_PRACTICADO",
            "SECUESTRO",
            "VALUACION",
            "LIQUIDACION",
            "REMATE",
            "ADJUDICACION",
            "ACUERDO_PAGO",
            "TERMINADO",
            "CASTIGADA"
          ]
        },
        "etapa_display": {
          "title": "Etapa display",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        },
        "etapa_fecha": {
          "title": "Fecha Cambio de Etapa",
          "type": "string",
          "format": "date"
        },
        "dias_en_etapa": {
          "title": "Dias en etapa",
          "type": "string",
          "readOnly": true
        },
        "numero_radicado": {
          "title": "Número de Radicación",
          "description": "Código de 23 dígitos de la Rama Judicial",
          "type": "string",
          "maxLength": 30
        },
        "is_legacy": {
          "title": "Es Legado",
          "description": "Indica si fue importado desde sistema externo",
          "type": "boolean"
        },
        "latest_persuasive_status": {
          "title": "Latest persuasive status",
          "type": "string",
          "readOnly": true
        }
      }
    },
    "LegalCaseCreate": {
      "required": [
        "contract"
      ],
      "type": "object",
      "properties": {
        "contract": {
          "title": "Contrato",
          "type": "string"
        },
        "legal_firm": {
          "title": "Firma Asignada",
          "type": "integer",
          "x-nullable": true
        },
        "assigned_to": {
          "title": "Gestor Asignado",
          "description": "Abogado responsable dentro de la firma",
          "type": "integer",
          "x-nullable": true
        },
        "etapa_procesal": {
          "title": "Etapa Procesal",
          "type": "string",
          "enum": [
            "PREJURIDICO",
            "DEMANDA_PREPARACION",
            "DEMANDA_RADICADA",
            "ADMISION",
            "MANDAMIENTO_PAGO",
            "NOTIFICACION",
            "EXCEPCIONES",
            "EMBARGO",
            "EMBARGO_PRACTICADO",
            "SECUESTRO",
            "VALUACION",
            "LIQUIDACION",
            "REMATE",
            "ADJUDICACION",
            "ACUERDO_PAGO",
            "TERMINADO",
            "CASTIGADA"
          ]
        },
        "numero_radicado": {
          "title": "Número de Radicación",
          "description": "Código de 23 dígitos de la Rama Judicial",
          "type": "string",
          "maxLength": 30
        },
        "juzgado": {
          "title": "Juzgado",
          "type": "string",
          "maxLength": 150
        },
        "ciudad_juzgado": {
          "title": "Ciudad del Juzgado",
          "type": "string",
          "maxLength": 100
        },
        "valor_pretensiones": {
          "title": "Valor Pretensiones",
          "description": "Monto total demandado",
          "type": "string",
          "format": "decimal",
          "x-nullable": true
        }
      }
    },
    "LegalDocument": {
      "required": [
        "legal_case"
      ],
      "type": "object",
      "properties": {
        "id": {
          "title": "ID",
          "type": "integer",
          "readOnly": true
        },
        "legal_case": {
          "title": "Caso",
          "type": "integer"
        },
        "file": {
          "title": "Archivo",
          "type": "string",
          "readOnly": true,
          "format": "uri"
        },
        "file_url": {
          "title": "File url",
          "type": "string",
          "readOnly": true
        },
        "category": {
          "title": "Categoría",
          "type": "string",
          "enum": [
            "DEMANDA",
            "AUTO_ADMISORIO",
            "MANDAMIENTO",
            "NOTIFICACION",
            "OFICIO_EMBARGO",
            "ACTA_SECUESTRO",
            "LIQUIDACION",
            "SENTENCIA",
            "TITULO_EJECUTIVO",
            "PODER",
            "PAGARE",
            "OTRO"
          ]
        },
        "category_display": {
          "title": "Category display",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        },
        "description": {
          "title": "Descripción",
          "type": "string",
          "maxLength": 255
        },
        "uploaded_by": {
          "title": "Uploaded by",
          "type": "integer",
          "readOnly": true,
          "x-nullable": true
        },
        "uploaded_by_name": {
          "title": "Uploaded by name",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        },
        "uploaded_at": {
          "title": "Uploaded at",
          "type": "string",
          "format": "date-time",
          "readOnly": true
        }
      }
    },
    "LegalCaseDetail": {
      "required": [
        "contract"
      ],
      "type": "object",
      "properties": {
        "id": {
          "title": "ID",
          "type": "integer",
          "readOnly": true
        },
        "contract": {
          "title": "Contrato",
          "type": "string"
        },
        "contract_number": {
          "title": "Contract number",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        },
        "original_amount": {
          "title": "Original amount",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        },
        "client_name": {
          "title": "Client name",
          "type": "string",
          "readOnly": true
        },
        "client_id": {
          "title": "Client id",
          "type": "string",
          "readOnly": true
        },
        "client_phone": {
          "title": "Client phone",
          "type": "string",
          "readOnly": true
        },
        "client_email": {
          "title": "Client email",
          "type": "string",
          "readOnly": true
        },
        "client_address": {
          "title": "Client address",
          "type": "string",
          "readOnly": true
        },
        "client_barrio": {
          "title": "Client barrio",
          "type": "string",
          "readOnly": true
        },
        "client_city": {
          "title": "Client city",
          "type": "string",
          "readOnly": true
        },
        "client_department": {
          "title": "Client department",
          "type": "string",
          "readOnly": true
        },
        "total_debt": {
          "title": "Total debt",
          "type": "string",
          "readOnly": true
        },
        "dias_mora": {
          "title": "Dias mora",
          "type": "string",
          "readOnly": true
        },
        "legal_firm": {
          "title": "Firma Asignada",
          "type": "integer",
          "x-nullable": true
        },
        "legal_firm_name": {
          "title": "Legal firm name",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        },
        "assigned_to": {
          "title": "Gestor Asignado",
          "description": "Abogado responsable dentro de la firma",
          "type": "integer",
          "x-nullable": true
        },
        "assigned_to_name": {
          "title": "Assigned to name",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        },
        "etapa_procesal": {
          "title": "Etapa Procesal",
          "type": "string",
          "enum": [
            "PREJURIDICO",
            "DEMANDA_PREPARACION",
            "DEMANDA_RADICADA",
            "ADMISION",
            "MANDAMIENTO_PAGO",
            "NOTIFICACION",
            "EXCEPCIONES",
            "EMBARGO",
            "EMBARGO_PRACTICADO",
            "SECUESTRO",
            "VALUACION",
            "LIQUIDACION",
            "REMATE",
            "ADJUDICACION",
            "ACUERDO_PAGO",
            "TERMINADO",
            "CASTIGADA"
          ]
        },
        "etapa_display": {
          "title": "Etapa display",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        },
        "etapa_fecha": {
          "title": "Fecha Cambio de Etapa",
          "type": "string",
          "format": "date"
        },
        "dias_en_etapa": {
          "title": "Dias en etapa",
          "type": "string",
          "readOnly": true
        },
        "numero_radicado": {
          "title": "Número de Radicación",
          "description": "Código de 23 dígitos de la Rama Judicial",
          "type": "string",
          "maxLength": 30
        },
        "juzgado": {
          "title": "Juzgado",
          "type": "string",
          "maxLength": 150
        },
        "ciudad_juzgado": {
          "title": "Ciudad del Juzgado",
          "type": "string",
          "maxLength": 100
        },
        "juez": {
          "title": "Nombre del Juez",
          "type": "string",
          "maxLength": 100
        },
        "link_rama_judicial": {
          "title": "Link Tyba/Rama Judicial",
          "description": "URL directa al proceso en el sistema judicial",
          "type": "string",
          "format": "uri",
          "maxLength": 200
        },
        "valor_pretensiones": {
          "title": "Valor Pretensiones",
          "description": "Monto total demandado",
          "type": "string",
          "format": "decimal",
          "x-nullable": true
        },
        "costas_judiciales": {
          "title": "Costas Judiciales",
          "type": "string",
          "format": "decimal",
          "x-nullable": true
        },
        "is_legacy": {
          "title": "Es Legado",
          "description": "Indica si fue importado desde sistema externo",
          "type": "boolean"
        },
        "legacy_notes": {
          "title": "Notas de Importación",
          "type": "string"
        },
        "documents": {
          "type": "array",
          "items": {
            "$ref": "#/definitions/LegalDocument"
          },
          "readOnly": true
        },
        "recent_comments": {
          "title": "Recent comments",
          "type": "string",
          "readOnly": true
        },
        "latest_persuasive_status": {
          "title": "Latest persuasive status",
          "type": "string",
          "readOnly": true
        },
        "created_at": {
          "title": "Created at",
          "type": "string",
          "format": "date-time",
          "readOnly": true
        },
        "updated_at": {
          "title": "Updated at",
          "type": "string",
          "format": "date-time",
          "readOnly": true
        }
      }
    },
    "LegalComment": {
      "required": [
        "legal_case",
        "content"
      ],
      "type": "object",
      "properties": {
        "id": {
          "title": "ID",
          "type": "integer",
          "readOnly": true
        },
        "legal_case": {
          "title": "Caso",
          "type": "integer"
        },
        "author": {
          "title": "Author",
          "type": "integer",
          "readOnly": true,
          "x-nullable": true
        },
        "author_name": {
          "title": "Author name",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        },
        "author_firm": {
          "title": "Author firm",
          "type": "string",
          "readOnly": true
        },
        "content": {
          "title": "Contenido",
          "type": "string",
          "minLength": 1
        },
        "is_stage_change": {
          "title": "Es Cambio de Etapa",
          "description": "Indica si es un comentario automático de workflow",
          "type": "boolean",
          "readOnly": true
        },
        "is_internal": {
          "title": "Solo Visible Admin",
          "description": "Si está marcado, solo admins pueden ver este comentario",
          "type": "boolean"
        },
        "notify_admin": {
          "title": "Notificar Administrador",
          "description": "Enviar email al administrador sobre este comentario",
          "type": "boolean"
        },
        "created_at": {
          "title": "Created at",
          "type": "string",
          "format": "date-time",
          "readOnly": true
        }
      }
    },
    "LegalFirm": {
      "required": [
        "name"
      ],
      "type": "object",
      "properties": {
        "id": {
          "title": "ID",
          "type": "integer",
          "readOnly": true
        },
        "name": {
          "title": "Nombre de la Firma",
          "type": "string",
          "maxLength": 150,
          "minLength": 1
        },
        "nit": {
          "title": "NIT",
          "description": "Número de Identificación Tributaria",
          "type": "string",
          "maxLength": 20
        },
        "contact_person": {
          "title": "Persona de Contacto",
          "type": "string",
          "maxLength": 100
        },
        "email": {
          "title": "Email de Contacto",
          "description": "Para notificaciones automáticas",
          "type": "string",
          "format": "email",
          "maxLength": 254
        },
        "phone": {
          "title": "Teléfono",
          "type": "string",
          "maxLength": 20
        },
        "address": {
          "title": "Dirección",
          "type": "string"
        },
        "is_active": {
          "title": "Activa",
          "type": "boolean"
        },
        "is_independent": {
          "title": "Es Independiente",
          "description": "Indica si es un abogado independiente (no firma constituida)",
          "type": "boolean"
        },
        "active_cases_count": {
          "title": "Active cases count",
          "type": "string",
          "readOnly": true
        },
        "commission_on_capital": {
          "title": "Comisión sobre Capital (%)",
          "description": "Porcentaje (0-100) que gana la firma sobre el capital recuperado",
          "type": "string",
          "format": "decimal"
        },
        "commission_on_interest": {
          "title": "Comisión sobre Intereses (%)",
          "description": "Porcentaje (0-100) que gana la firma sobre intereses recuperados",
          "type": "string",
          "format": "decimal"
        },
        "commission_legal_fees": {
          "title": "Comisión de Honorarios (%)",
          "description": "Porcentaje de los honorarios cobrados al cliente que van a la firma",
          "type": "string",
          "format": "decimal"
        },
        "fixed_fee_per_case": {
          "title": "Tarifa Fija por Caso",
          "description": "Costo fijo que cobra la firma por caso asignado (independiente del éxito)",
          "type": "string",
          "format": "decimal"
        },
        "members_count": {
          "title": "Members count",
          "type": "string",
          "readOnly": true
        },
        "created_at": {
          "title": "Created at",
          "type": "string",
          "format": "date-time",
          "readOnly": true
        },
        "updated_at": {
          "title": "Updated at",
          "type": "string",
          "format": "date-time",
          "readOnly": true
        }
      }
    },
    "PersuasiveManagement": {
      "required": [
        "legal_case",
        "contact_status"
      ],
      "type": "object",
      "properties": {
        "id": {
          "title": "ID",
          "type": "integer",
          "readOnly": true
        },
        "legal_case": {
          "title": "Caso Jurídico",
          "type": "integer"
        },
        "contact_category": {
          "title": "Categoría de Contacto",
          "description": "Se auto-calcula a partir del estado de contacto",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        },
        "contact_category_display": {
          "title": "Contact category display",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        },
        "contact_status": {
          "title": "Estado de Contacto",
          "type": "string",
          "enum": [
            "SIN_COMPROMISO",
            "POSIBLE_ACUERDO",
            "ACUERDO_ABONO",
            "ACUERDO_CANCELACION",
            "PAGO_TOTAL",
            "INCUMPLIO",
            "PAGO_POR_VALIDAR",
            "RENUENTE",
            "RECLAMACION_TRAMITE",
            "FALLECIDO",
            "MENSAJE_TERCERO",
            "SIN_CONTACTAR",
            "SIN_GESTION",
            "VISITAR"
          ]
        },
        "contact_status_display": {
          "title": "Contact status display",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        },
        "notes": {
          "title": "Observaciones",
          "description": "Detalles del contacto o gestión realizada",
          "type": "string"
        },
        "next_action_date": {
          "title": "Fecha Próxima Gestión",
          "description": "Fecha programada para el próximo intento de contacto",
          "type": "string",
          "format": "date",
          "x-nullable": true
        },
        "managed_by": {
          "title": "Gestionado por",
          "type": "integer",
          "readOnly": true,
          "x-nullable": true
        },
        "managed_by_name": {
          "title": "Managed by name",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        },
        "created_at": {
          "title": "Created at",
          "type": "string",
          "format": "date-time",
          "readOnly": true
        }
      }
    },
    "MovimientoPartidaDoble": {
      "required": [
        "monto",
        "cuenta_origen",
        "cuenta_destino",
        "motivo"
      ],
      "type": "object",
      "properties": {
        "id_movimiento": {
          "title": "Id movimiento",
          "type": "integer",
          "readOnly": true
        },
        "fecha": {
          "title": "Fecha",
          "description": "Fecha y hora del movimiento",
          "type": "string",
          "format": "date-time",
          "readOnly": true
        },
        "monto": {
          "title": "Monto",
          "description": "Monto del movimiento (siempre positivo)",
          "type": "string",
          "format": "decimal"
        },
        "cuenta_origen": {
          "title": "Cuenta origen",
          "description": "Cuenta de donde sale el dinero",
          "type": "string"
        },
        "cuenta_origen_codigo": {
          "title": "Cuenta origen codigo",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        },
        "cuenta_origen_nombre": {
          "title": "Cuenta origen nombre",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        },
        "cuenta_destino": {
          "title": "Cuenta destino",
          "description": "Cuenta a donde llega el dinero",
          "type": "string"
        },
        "cuenta_destino_codigo": {
          "title": "Cuenta destino codigo",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        },
        "cuenta_destino_nombre": {
          "title": "Cuenta destino nombre",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        },
        "contrato": {
          "title": "Contrato",
          "description": "Contrato relacionado (si aplica)",
          "type": "string",
          "x-nullable": true
        },
        "contrato_no": {
          "title": "Contrato no",
          "type": "string",
          "readOnly": true,
          "minLength": 1,
          "x-nullable": true
        },
        "motivo": {
          "title": "Motivo",
          "description": "Motivo/Tipo del movimiento",
          "type": "string",
          "enum": [
            "deposito_inversionista",
            "DEVOLUCION",
            "desembolso",
            "abono_intereses",
            "abono_capital",
            "retorno_capital",
            "retorno_intereses",
            "entrega_rendimiento",
            "ganancia_empresa",
            "ajuste",
            "otro"
          ]
        },
        "referencia": {
          "title": "Referencia",
          "description": "Referencia del movimiento (ej: número de recibo)",
          "type": "string",
          "maxLength": 100,
          "x-nullable": true
        },
        "comentario": {
          "title": "Comentario",
          "description": "Comentario o descripción adicional",
          "type": "string",
          "x-nullable": true
        }
      }
    },
    "AutomationRule": {
      "required": [
        "name",
        "event",
        "channel"
      ],
      "type": "object",
      "properties": {
        "id": {
          "title": "ID",
          "type": "integer",
          "readOnly": true
        },
        "name": {
          "title": "Nombre",
          "type": "string",
          "maxLength": 100,
          "minLength": 1
        },
        "description": {
          "title": "Descripción",
          "type": "string"
        },
        "event": {
          "title": "Evento disparador",
          "type": "string",
          "enum": [
            "client_created",
            "investor_created",
            "contract_created",
            "contract_approved",
            "contract_disbursed",
            "payment_registered",
            "payment_reminder",
            "overdue_day1",
            "overdue_recurring",
            "overdue_alert",
            "codeudor_alert",
            "withdrawal_approved",
            "withdrawal_rejected",
            "investor_deposit"
          ]
        },
        "event_display": {
          "title": "Event display",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        },
        "channel": {
          "title": "Canal",
          "type": "string",
          "enum": [
            "email",
            "sms",
            "both"
          ]
        },
        "channel_display": {
          "title": "Channel display",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        },
        "email_template": {
          "title": "Plantilla Email",
          "type": "integer",
          "x-nullable": true
        },
        "email_template_name": {
          "title": "Email template name",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        },
        "sms_template": {
          "title": "Plantilla SMS",
          "type": "integer",
          "x-nullable": true
        },
        "sms_template_name": {
          "title": "Sms template name",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        },
        "is_active": {
          "title": "Activa",
          "type": "boolean"
        },
        "created_at": {
          "title": "Created at",
          "type": "string",
          "format": "date-time",
          "readOnly": true
        },
        "updated_at": {
          "title": "Updated at",
          "type": "string",
          "format": "date-time",
          "readOnly": true
        }
      }
    },
    "NotificationLog": {
      "required": [
        "channel",
        "recipient",
        "template_name",
        "status"
      ],
      "type": "object",
      "properties": {
        "id": {
          "title": "ID",
          "type": "integer",
          "readOnly": true
        },
        "channel": {
          "title": "Canal",
          "type": "string",
          "maxLength": 10,
          "minLength": 1
        },
        "recipient": {
          "title": "Destinatario",
          "type": "string",
          "maxLength": 200,
          "minLength": 1
        },
        "template_name": {
          "title": "Plantilla",
          "type": "string",
          "maxLength": 100,
          "minLength": 1
        },
        "status": {
          "title": "Estado",
          "type": "string",
          "enum": [
            "sent",
            "failed",
            "pending"
          ]
        },
        "status_display": {
          "title": "Status display",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        },
        "details": {
          "title": "Detalles",
          "type": "string"
        },
        "sent_at": {
          "title": "Fecha de envío",
          "type": "string",
          "format": "date-time",
          "readOnly": true
        }
      }
    },
    "Notification": {
      "required": [
        "title",
        "message",
        "type",
        "recipient_id",
        "recipient_type"
      ],
      "type": "object",
      "properties": {
        "id": {
          "title": "ID",
          "type": "integer",
          "readOnly": true
        },
        "title": {
          "title": "Title",
          "type": "string",
          "maxLength": 200,
          "minLength": 1
        },
        "message": {
          "title": "Message",
          "type": "string",
          "minLength": 1
        },
        "type": {
          "title": "Type",
          "type": "string",
          "enum": [
            "email",
            "sms"
          ]
        },
        "recipient_id": {
          "title": "Recipient id",
          "description": "ID del destinatario (cliente, inversionista o personalizado)",
          "type": "string",
          "maxLength": 100,
          "minLength": 1
        },
        "recipient_type": {
          "title": "Recipient type",
          "type": "string",
          "enum": [
            "clients",
            "investors",
            "custom"
          ]
        },
        "recipient_name": {
          "title": "Recipient name",
          "type": "string",
          "readOnly": true
        },
        "is_read": {
          "title": "Is read",
          "type": "boolean"
        },
        "read_at": {
          "title": "Read at",
          "type": "string",
          "format": "date-time",
          "readOnly": true,
          "x-nullable": true
        },
        "created_at": {
          "title": "Created at",
          "type": "string",
          "format": "date-time",
          "readOnly": true
        },
        "updated_at": {
          "title": "Updated at",
          "type": "string",
          "format": "date-time",
          "readOnly": true
        }
      }
    },
    "NotificationCreate": {
      "required": [
        "title",
        "message",
        "type",
        "recipient_id",
        "recipient_type"
      ],
      "type": "object",
      "properties": {
        "title": {
          "title": "Title",
          "type": "string",
          "maxLength": 200,
          "minLength": 1
        },
        "message": {
          "title": "Message",
          "type": "string",
          "minLength": 1
        },
        "type": {
          "title": "Type",
          "type": "string",
          "enum": [
            "email",
            "sms"
          ]
        },
        "recipient_id": {
          "title": "Recipient id",
          "description": "ID del destinatario (cliente, inversionista o personalizado)",
          "type": "string",
          "maxLength": 100,
          "minLength": 1
        },
        "recipient_type": {
          "title": "Recipient type",
          "type": "string",
          "enum": [
            "clients",
            "investors",
            "custom"
          ]
        }
      }
    },
    "NotificationTemplate": {
      "required": [
        "name",
        "display_name",
        "channel",
        "body"
      ],
      "type": "object",
      "properties": {
        "id": {
          "title": "ID",
          "type": "integer",
          "readOnly": true
        },
        "name": {
          "title": "Nombre",
          "type": "string",
          "maxLength": 100,
          "minLength": 1
        },
        "display_name": {
          "title": "Nombre para mostrar",
          "type": "string",
          "maxLength": 200,
          "minLength": 1
        },
        "channel": {
          "title": "Canal",
          "type": "string",
          "enum": [
            "email",
            "sms"
          ]
        },
        "channel_display": {
          "title": "Channel display",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        },
        "subject": {
          "title": "Asunto (solo email)",
          "type": "string",
          "maxLength": 200
        },
        "body": {
          "title": "Contenido",
          "type": "string",
          "minLength": 1
        },
        "variables": {
          "title": "Variables disponibles",
          "description": "Variables separadas por coma: nombre, monto, fecha, contrato",
          "type": "string"
        },
        "is_active": {
          "title": "Activa",
          "type": "boolean"
        },
        "created_at": {
          "title": "Created at",
          "type": "string",
          "format": "date-time",
          "readOnly": true
        },
        "updated_at": {
          "title": "Updated at",
          "type": "string",
          "format": "date-time",
          "readOnly": true
        }
      }
    },
    "Commission": {
      "required": [
        "partner",
        "referral"
      ],
      "type": "object",
      "properties": {
        "id": {
          "title": "ID",
          "type": "integer",
          "readOnly": true
        },
        "partner": {
          "title": "Partner",
          "type": "integer"
        },
        "partner_name": {
          "title": "Partner name",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        },
        "referral": {
          "title": "Referral",
          "type": "integer"
        },
        "referral_name": {
          "title": "Referral name",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        },
        "amount": {
          "title": "Amount",
          "type": "string",
          "format": "decimal"
        },
        "rate": {
          "title": "Rate",
          "type": "string",
          "format": "decimal"
        },
        "status": {
          "title": "Status",
          "type": "string",
          "enum": [
            "pending",
            "approved",
            "paid",
            "rejected"
          ]
        },
        "approved_at": {
          "title": "Approved at",
          "type": "string",
          "format": "date-time",
          "x-nullable": true
        },
        "paid_at": {
          "title": "Paid at",
          "type": "string",
          "format": "date-time",
          "x-nullable": true
        },
        "notes": {
          "title": "Notes",
          "type": "string"
        },
        "created_at": {
          "title": "Created at",
          "type": "string",
          "format": "date-time",
          "readOnly": true
        },
        "updated_at": {
          "title": "Updated at",
          "type": "string",
          "format": "date-time",
          "readOnly": true
        }
      }
    },
    "CommissionWrite": {
      "type": "object",
      "properties": {
        "status": {
          "title": "Status",
          "type": "string",
          "enum": [
            "pending",
            "approved",
            "paid",
            "rejected"
          ]
        },
        "notes": {
          "title": "Notes",
          "type": "string"
        }
      }
    },
    "Referral": {
      "required": [
        "partner",
        "external_ref",
        "full_name"
      ],
      "type": "object",
      "properties": {
        "id": {
          "title": "ID",
          "type": "integer",
          "readOnly": true
        },
        "partner": {
          "title": "Partner",
          "type": "integer"
        },
        "partner_name": {
          "title": "Partner name",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        },
        "external_ref": {
          "title": "External ref",
          "type": "string",
          "maxLength": 80
        },
        "full_name": {
          "title": "Full name",
          "type": "string",
          "maxLength": 255,
          "minLength": 1
        },
        "email": {
          "title": "Email",
          "type": "string",
          "format": "email",
          "maxLength": 254
        },
        "phone": {
          "title": "Phone",
          "type": "string",
          "maxLength": 50
        },
        "company": {
          "title": "Company",
          "type": "string",
          "maxLength": 255
        },
        "interest_type": {
          "title": "Interest type",
          "type": "string",
          "maxLength": 30,
          "minLength": 1
        },
        "business_line": {
          "title": "Business line",
          "type": "string",
          "x-nullable": true
        },
        "service": {
          "title": "Service",
          "type": "string",
          "x-nullable": true
        },
        "estimated_value": {
          "title": "Estimated value",
          "type": "string",
          "format": "decimal"
        },
        "status": {
          "title": "Status",
          "type": "string",
          "enum": [
            "received",
            "synced",
            "duplicate",
            "error",
            "converted"
          ]
        },
        "payload": {
          "title": "Payload",
          "type": "object",
          "readOnly": true
        },
        "source_url": {
          "title": "Source url",
          "type": "string",
          "format": "uri",
          "maxLength": 200
        },
        "notes": {
          "title": "Notes",
          "type": "string"
        },
        "submitted_by": {
          "title": "Submitted by",
          "type": "integer",
          "readOnly": true,
          "x-nullable": true
        },
        "crm_lead": {
          "title": "Crm lead",
          "type": "integer",
          "readOnly": true,
          "x-nullable": true
        },
        "crm_lead_stage": {
          "title": "Crm lead stage",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        },
        "sync_error": {
          "title": "Sync error",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        },
        "converted_at": {
          "title": "Converted at",
          "type": "string",
          "format": "date-time",
          "readOnly": true,
          "x-nullable": true
        },
        "commission_amount": {
          "title": "Commission amount",
          "type": "string",
          "format": "decimal",
          "readOnly": true
        },
        "created_at": {
          "title": "Created at",
          "type": "string",
          "format": "date-time",
          "readOnly": true
        },
        "updated_at": {
          "title": "Updated at",
          "type": "string",
          "format": "date-time",
          "readOnly": true
        }
      }
    },
    "ReferralWrite": {
      "required": [
        "partner",
        "external_ref",
        "full_name"
      ],
      "type": "object",
      "properties": {
        "partner": {
          "title": "Partner",
          "type": "integer"
        },
        "external_ref": {
          "title": "External ref",
          "type": "string",
          "maxLength": 80
        },
        "full_name": {
          "title": "Full name",
          "type": "string",
          "maxLength": 255,
          "minLength": 1
        },
        "email": {
          "title": "Email",
          "type": "string",
          "format": "email",
          "maxLength": 254
        },
        "phone": {
          "title": "Phone",
          "type": "string",
          "maxLength": 50
        },
        "company": {
          "title": "Company",
          "type": "string",
          "maxLength": 255
        },
        "interest_type": {
          "title": "Interest type",
          "type": "string",
          "maxLength": 30,
          "minLength": 1
        },
        "business_line": {
          "title": "Business line",
          "type": "string",
          "x-nullable": true
        },
        "service": {
          "title": "Service",
          "type": "string",
          "x-nullable": true
        },
        "estimated_value": {
          "title": "Estimated value",
          "type": "string",
          "format": "decimal"
        },
        "source_url": {
          "title": "Source url",
          "type": "string",
          "format": "uri",
          "maxLength": 200
        },
        "notes": {
          "title": "Notes",
          "type": "string"
        }
      }
    },
    "ReferralPublicSubmit": {
      "required": [
        "partner_slug",
        "full_name"
      ],
      "type": "object",
      "properties": {
        "partner_slug": {
          "title": "Partner slug",
          "type": "string",
          "minLength": 1
        },
        "external_ref": {
          "title": "External ref",
          "type": "string",
          "maxLength": 80
        },
        "full_name": {
          "title": "Full name",
          "type": "string",
          "maxLength": 255,
          "minLength": 1
        },
        "email": {
          "title": "Email",
          "type": "string",
          "format": "email",
          "maxLength": 254
        },
        "phone": {
          "title": "Phone",
          "type": "string",
          "maxLength": 50
        },
        "company": {
          "title": "Company",
          "type": "string",
          "maxLength": 255
        },
        "interest_type": {
          "title": "Interest type",
          "type": "string",
          "maxLength": 30,
          "minLength": 1
        },
        "business_line": {
          "title": "Business line",
          "type": "string",
          "x-nullable": true
        },
        "service": {
          "title": "Service",
          "type": "string",
          "x-nullable": true
        },
        "estimated_value": {
          "title": "Estimated value",
          "type": "string",
          "format": "decimal"
        },
        "source_url": {
          "title": "Source url",
          "type": "string",
          "format": "uri",
          "maxLength": 200
        },
        "notes": {
          "title": "Notes",
          "type": "string"
        }
      }
    },
    "ReferralSubmit": {
      "required": [
        "partner_code",
        "full_name"
      ],
      "type": "object",
      "properties": {
        "partner_code": {
          "title": "Partner code",
          "type": "string",
          "minLength": 1
        },
        "api_key": {
          "title": "Api key",
          "type": "string"
        },
        "external_ref": {
          "title": "External ref",
          "type": "string",
          "maxLength": 80
        },
        "full_name": {
          "title": "Full name",
          "type": "string",
          "maxLength": 255,
          "minLength": 1
        },
        "email": {
          "title": "Email",
          "type": "string",
          "format": "email",
          "maxLength": 254
        },
        "phone": {
          "title": "Phone",
          "type": "string",
          "maxLength": 50
        },
        "company": {
          "title": "Company",
          "type": "string",
          "maxLength": 255
        },
        "interest_type": {
          "title": "Interest type",
          "type": "string",
          "maxLength": 30,
          "minLength": 1
        },
        "business_line": {
          "title": "Business line",
          "type": "string",
          "x-nullable": true
        },
        "service": {
          "title": "Service",
          "type": "string",
          "x-nullable": true
        },
        "estimated_value": {
          "title": "Estimated value",
          "type": "string",
          "format": "decimal"
        },
        "source_url": {
          "title": "Source url",
          "type": "string",
          "format": "uri",
          "maxLength": 200
        },
        "notes": {
          "title": "Notes",
          "type": "string"
        }
      }
    },
    "Partner": {
      "required": [
        "code",
        "name"
      ],
      "type": "object",
      "properties": {
        "id": {
          "title": "ID",
          "type": "integer",
          "readOnly": true
        },
        "code": {
          "title": "Code",
          "type": "string",
          "maxLength": 40,
          "minLength": 1
        },
        "name": {
          "title": "Name",
          "type": "string",
          "maxLength": 255,
          "minLength": 1
        },
        "company": {
          "title": "Company",
          "type": "string",
          "maxLength": 255
        },
        "email": {
          "title": "Email",
          "type": "string",
          "format": "email",
          "maxLength": 254
        },
        "phone": {
          "title": "Phone",
          "type": "string",
          "maxLength": 50
        },
        "partner_type": {
          "title": "Partner type",
          "type": "string",
          "enum": [
            "accountant",
            "lawyer",
            "advisor",
            "real_estate",
            "generic"
          ]
        },
        "status": {
          "title": "Status",
          "type": "string",
          "enum": [
            "pending",
            "active",
            "suspended",
            "inactive"
          ]
        },
        "referral_slug": {
          "title": "Referral slug",
          "type": "string",
          "format": "slug",
          "pattern": "^[-a-zA-Z0-9_]+$",
          "readOnly": true,
          "minLength": 1
        },
        "commission_rate": {
          "title": "Commission rate",
          "type": "string",
          "format": "decimal"
        },
        "api_key_prefix": {
          "title": "Api key prefix",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        },
        "default_owner": {
          "title": "Default owner",
          "type": "integer",
          "x-nullable": true
        },
        "default_owner_name": {
          "title": "Default owner name",
          "type": "string",
          "readOnly": true
        },
        "metadata": {
          "title": "Metadata",
          "type": "object"
        },
        "notes": {
          "title": "Notes",
          "type": "string"
        },
        "referrals_count": {
          "title": "Referrals count",
          "type": "integer",
          "readOnly": true
        },
        "converted_count": {
          "title": "Converted count",
          "type": "string",
          "readOnly": true
        },
        "commissions_total": {
          "title": "Commissions total",
          "type": "string",
          "readOnly": true
        },
        "created_at": {
          "title": "Created at",
          "type": "string",
          "format": "date-time",
          "readOnly": true
        },
        "updated_at": {
          "title": "Updated at",
          "type": "string",
          "format": "date-time",
          "readOnly": true
        }
      }
    },
    "PartnerWrite": {
      "required": [
        "code",
        "name"
      ],
      "type": "object",
      "properties": {
        "code": {
          "title": "Code",
          "type": "string",
          "maxLength": 40,
          "minLength": 1
        },
        "name": {
          "title": "Name",
          "type": "string",
          "maxLength": 255,
          "minLength": 1
        },
        "company": {
          "title": "Company",
          "type": "string",
          "maxLength": 255
        },
        "email": {
          "title": "Email",
          "type": "string",
          "format": "email",
          "maxLength": 254
        },
        "phone": {
          "title": "Phone",
          "type": "string",
          "maxLength": 50
        },
        "partner_type": {
          "title": "Partner type",
          "type": "string",
          "enum": [
            "accountant",
            "lawyer",
            "advisor",
            "real_estate",
            "generic"
          ]
        },
        "status": {
          "title": "Status",
          "type": "string",
          "enum": [
            "pending",
            "active",
            "suspended",
            "inactive"
          ]
        },
        "commission_rate": {
          "title": "Commission rate",
          "type": "string",
          "format": "decimal"
        },
        "default_owner": {
          "title": "Default owner",
          "type": "integer",
          "x-nullable": true
        },
        "metadata": {
          "title": "Metadata",
          "type": "object"
        },
        "notes": {
          "title": "Notes",
          "type": "string"
        }
      }
    },
    "PartnerPublicLookup": {
      "required": [
        "name"
      ],
      "type": "object",
      "properties": {
        "id": {
          "title": "ID",
          "type": "integer",
          "readOnly": true
        },
        "name": {
          "title": "Name",
          "type": "string",
          "maxLength": 255,
          "minLength": 1
        },
        "company": {
          "title": "Company",
          "type": "string",
          "maxLength": 255
        },
        "partner_type": {
          "title": "Partner type",
          "type": "string",
          "enum": [
            "accountant",
            "lawyer",
            "advisor",
            "real_estate",
            "generic"
          ]
        },
        "status": {
          "title": "Status",
          "type": "string",
          "enum": [
            "pending",
            "active",
            "suspended",
            "inactive"
          ]
        },
        "referral_slug": {
          "title": "Referral slug",
          "type": "string",
          "format": "slug",
          "pattern": "^[-a-zA-Z0-9_]+$",
          "maxLength": 120
        }
      }
    },
    "PartnerPublicRegister": {
      "required": [
        "name"
      ],
      "type": "object",
      "properties": {
        "name": {
          "title": "Name",
          "type": "string",
          "maxLength": 255,
          "minLength": 1
        },
        "company": {
          "title": "Company",
          "type": "string",
          "maxLength": 255
        },
        "email": {
          "title": "Email",
          "type": "string",
          "format": "email",
          "maxLength": 254
        },
        "phone": {
          "title": "Phone",
          "type": "string",
          "maxLength": 50
        },
        "partner_type": {
          "title": "Partner type",
          "type": "string",
          "enum": [
            "accountant",
            "lawyer",
            "advisor",
            "real_estate",
            "generic"
          ]
        },
        "notes": {
          "title": "Notes",
          "type": "string"
        }
      }
    },
    "PaymentAgreement": {
      "required": [
        "contract",
        "original_debt",
        "agreed_amount",
        "installment_amount",
        "first_payment_date"
      ],
      "type": "object",
      "properties": {
        "id": {
          "title": "ID",
          "type": "integer",
          "readOnly": true
        },
        "contract": {
          "title": "Contract",
          "type": "string"
        },
        "original_debt": {
          "title": "Original debt",
          "type": "string",
          "format": "decimal"
        },
        "agreed_amount": {
          "title": "Agreed amount",
          "type": "string",
          "format": "decimal"
        },
        "discount_percent": {
          "title": "Discount percent",
          "type": "string",
          "format": "decimal"
        },
        "down_payment": {
          "title": "Cuota Inicial",
          "description": "Monto pagado al firmar el acuerdo",
          "type": "string",
          "format": "decimal"
        },
        "legal_fees_value": {
          "title": "Honorarios Pactados",
          "description": "Valor de honorarios incluidos en el acuerdo",
          "type": "string",
          "format": "decimal"
        },
        "renegotiated_interest_rate": {
          "title": "Tasa Renegociada (%)",
          "description": "Nueva tasa de interés mensual (si aplica)",
          "type": "string",
          "format": "decimal",
          "x-nullable": true
        },
        "support_document": {
          "title": "Documento de Soporte",
          "description": "PDF del acuerdo firmado",
          "type": "string",
          "readOnly": true,
          "x-nullable": true,
          "format": "uri"
        },
        "installments": {
          "title": "Installments",
          "type": "integer",
          "maximum": 2147483647,
          "minimum": -2147483648
        },
        "installment_amount": {
          "title": "Installment amount",
          "type": "string",
          "format": "decimal"
        },
        "first_payment_date": {
          "title": "First payment date",
          "type": "string",
          "format": "date"
        },
        "installment_schedule": {
          "title": "Installment schedule",
          "description": "Detalle personalizado de cuotas: numero, fecha y valor",
          "type": "object"
        },
        "status": {
          "title": "Status",
          "type": "string",
          "enum": [
            "active",
            "completed",
            "broken",
            "cancelled"
          ]
        },
        "status_display": {
          "title": "Status display",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        },
        "notes": {
          "title": "Notes",
          "type": "string"
        },
        "created_by": {
          "title": "Created by",
          "type": "integer",
          "readOnly": true
        },
        "created_by_username": {
          "title": "Created by username",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        },
        "created_at": {
          "title": "Created at",
          "type": "string",
          "format": "date-time",
          "readOnly": true
        },
        "updated_at": {
          "title": "Updated at",
          "type": "string",
          "format": "date-time",
          "readOnly": true
        }
      }
    },
    "Permission": {
      "required": [
        "name",
        "codename",
        "content_type"
      ],
      "type": "object",
      "properties": {
        "id": {
          "title": "ID",
          "type": "integer",
          "readOnly": true
        },
        "name": {
          "title": "Nombre",
          "type": "string",
          "maxLength": 255,
          "minLength": 1
        },
        "codename": {
          "title": "Nombre en código",
          "type": "string",
          "maxLength": 100,
          "minLength": 1
        },
        "content_type": {
          "title": "Tipo de contenido",
          "type": "integer"
        },
        "content_type_name": {
          "title": "Content type name",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        }
      }
    },
    "Profile": {
      "type": "object",
      "properties": {
        "id": {
          "title": "ID",
          "type": "integer",
          "readOnly": true
        },
        "username": {
          "title": "Username",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        },
        "email": {
          "title": "Email",
          "type": "string",
          "format": "email",
          "readOnly": true,
          "minLength": 1
        },
        "user_type": {
          "title": "User type",
          "description": "Tipo de usuario en el sistema",
          "type": "string",
          "enum": [
            "admin",
            "advisor",
            "investor",
            "client",
            "legal_manager",
            "collaborator"
          ]
        },
        "advisor_role": {
          "title": "Advisor role",
          "description": "Rol operativo del asesor; deriva los grupos de permisos",
          "type": "string",
          "enum": [
            "sales",
            "collection",
            "marketing",
            "documental",
            "legal",
            "real_estate",
            "cooperative"
          ],
          "readOnly": true
        },
        "advisor_role_display": {
          "title": "Advisor role display",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        },
        "entity_name": {
          "title": "Entity name",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        },
        "cliente_id": {
          "title": "Cliente id",
          "type": "string",
          "readOnly": true,
          "minLength": 1,
          "x-nullable": true
        },
        "investor_id": {
          "title": "Investor id",
          "type": "string",
          "readOnly": true,
          "minLength": 1,
          "x-nullable": true
        },
        "legal_firm_id": {
          "title": "Legal firm id",
          "type": "string",
          "readOnly": true,
          "minLength": 1,
          "x-nullable": true
        }
      }
    },
    "UserBrief": {
      "required": [
        "username"
      ],
      "type": "object",
      "properties": {
        "id": {
          "title": "ID",
          "type": "integer",
          "readOnly": true
        },
        "username": {
          "title": "Nombre de usuario",
          "description": "Requerido. 150 carácteres como máximo. Únicamente letras, dígitos y @/./+/-/_ ",
          "type": "string",
          "pattern": "^[\\w.@+-]+$",
          "maxLength": 150,
          "minLength": 1
        },
        "full_name": {
          "title": "Full name",
          "type": "string",
          "readOnly": true
        },
        "is_staff": {
          "title": "Es staff",
          "description": "Indica si el usuario puede entrar en este sitio de administración.",
          "type": "boolean"
        }
      }
    },
    "TaskComment": {
      "required": [
        "task",
        "body"
      ],
      "type": "object",
      "properties": {
        "id": {
          "title": "ID",
          "type": "integer",
          "readOnly": true
        },
        "task": {
          "title": "Task",
          "type": "integer"
        },
        "author": {
          "title": "Author",
          "type": "integer",
          "readOnly": true,
          "x-nullable": true
        },
        "author_detail": {
          "$ref": "#/definitions/UserBrief"
        },
        "body": {
          "title": "Body",
          "type": "string",
          "minLength": 1
        },
        "created_at": {
          "title": "Created at",
          "type": "string",
          "format": "date-time",
          "readOnly": true
        }
      }
    },
    "EcosystemEdge": {
      "required": [
        "from_node",
        "to_node",
        "label"
      ],
      "type": "object",
      "properties": {
        "id": {
          "title": "ID",
          "type": "integer",
          "readOnly": true
        },
        "workspace": {
          "title": "Workspace",
          "type": "integer"
        },
        "from_node": {
          "title": "From node",
          "type": "integer"
        },
        "from_key": {
          "title": "From key",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        },
        "to_node": {
          "title": "To node",
          "type": "integer"
        },
        "to_key": {
          "title": "To key",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        },
        "label": {
          "title": "Label",
          "type": "string",
          "maxLength": 120
        },
        "kind": {
          "title": "Kind",
          "type": "string",
          "enum": [
            "ok",
            "gap",
            "test"
          ]
        },
        "faint": {
          "title": "Faint",
          "description": "Arista secundaria: se dibuja atenuada.",
          "type": "boolean"
        },
        "layout": {
          "title": "Layout",
          "description": "Pistas de dibujo: dy, labelDy, side.",
          "type": "object"
        },
        "order": {
          "title": "Order",
          "type": "integer",
          "maximum": 65535,
          "minimum": 0
        }
      }
    },
    "FeedbackAttachment": {
      "type": "object",
      "properties": {
        "id": {
          "title": "ID",
          "type": "integer",
          "readOnly": true
        },
        "original_name": {
          "title": "Original name",
          "type": "string",
          "maxLength": 255
        },
        "content_type": {
          "title": "Content type",
          "type": "string",
          "maxLength": 100
        },
        "size": {
          "title": "Size",
          "type": "integer",
          "maximum": 4294967295,
          "minimum": 0
        },
        "created_at": {
          "title": "Created at",
          "type": "string",
          "format": "date-time",
          "readOnly": true
        },
        "download_url": {
          "title": "Download url",
          "type": "string",
          "readOnly": true
        }
      }
    },
    "FeedbackReport": {
      "type": "object",
      "properties": {
        "id": {
          "title": "ID",
          "type": "integer",
          "readOnly": true
        },
        "reporter": {
          "title": "Reporter",
          "type": "integer",
          "readOnly": true,
          "x-nullable": true
        },
        "reporter_detail": {
          "$ref": "#/definitions/UserBrief"
        },
        "app": {
          "title": "App",
          "type": "string",
          "enum": [
            "admin",
            "crm",
            "coop",
            "inmo",
            "legal",
            "clients",
            "investors",
            "partners",
            "projects",
            "landing_corp",
            "landing_coop",
            "landing_inmo"
          ]
        },
        "app_display": {
          "title": "App display",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        },
        "url": {
          "title": "Url",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        },
        "message": {
          "title": "Message",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        },
        "category": {
          "title": "Category",
          "type": "string",
          "enum": [
            "bug",
            "mejora",
            "pregunta"
          ]
        },
        "category_display": {
          "title": "Category display",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        },
        "severity": {
          "title": "Severity",
          "type": "string",
          "enum": [
            "baja",
            "media",
            "alta",
            "critica"
          ]
        },
        "severity_display": {
          "title": "Severity display",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        },
        "status": {
          "title": "Status",
          "type": "string",
          "enum": [
            "nuevo",
            "triage",
            "en_analisis",
            "asignado",
            "en_curso",
            "resuelto",
            "descartado"
          ]
        },
        "status_display": {
          "title": "Status display",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        },
        "assignee": {
          "title": "Assignee",
          "type": "integer",
          "x-nullable": true
        },
        "assignee_detail": {
          "$ref": "#/definitions/UserBrief"
        },
        "capture": {
          "title": "Capture",
          "description": "Contexto técnico capturado por la burbuja (saneado).",
          "type": "object",
          "readOnly": true
        },
        "linked_task": {
          "title": "Linked task",
          "type": "integer",
          "x-nullable": true
        },
        "linked_task_title": {
          "title": "Linked task title",
          "type": "string",
          "readOnly": true,
          "default": "",
          "minLength": 1
        },
        "attachments": {
          "type": "array",
          "items": {
            "$ref": "#/definitions/FeedbackAttachment"
          },
          "readOnly": true
        },
        "email_sent": {
          "title": "Email sent",
          "type": "boolean",
          "readOnly": true
        },
        "email_error": {
          "title": "Email error",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        },
        "resolved_at": {
          "title": "Resolved at",
          "type": "string",
          "format": "date-time",
          "readOnly": true,
          "x-nullable": true
        },
        "suggested_node_key": {
          "title": "Suggested node key",
          "type": "string",
          "readOnly": true
        },
        "latest_spec": {
          "title": "Latest spec",
          "type": "string",
          "readOnly": true
        },
        "sdd_eligibility": {
          "title": "Sdd eligibility",
          "type": "string",
          "readOnly": true
        },
        "created_at": {
          "title": "Created at",
          "type": "string",
          "format": "date-time",
          "readOnly": true
        },
        "updated_at": {
          "title": "Updated at",
          "type": "string",
          "format": "date-time",
          "readOnly": true
        }
      }
    },
    "FeedbackReportCreate": {
      "required": [
        "message"
      ],
      "type": "object",
      "properties": {
        "message": {
          "title": "Message",
          "type": "string",
          "minLength": 1
        },
        "url": {
          "title": "Url",
          "type": "string",
          "default": ""
        },
        "app": {
          "title": "App",
          "type": "string",
          "enum": [
            "admin",
            "crm",
            "coop",
            "inmo",
            "legal",
            "clients",
            "investors",
            "partners",
            "projects",
            "landing_corp",
            "landing_coop",
            "landing_inmo"
          ],
          "default": "legal"
        },
        "category": {
          "title": "Category",
          "type": "string",
          "enum": [
            "bug",
            "mejora",
            "pregunta"
          ],
          "default": "bug"
        },
        "severity": {
          "title": "Severity",
          "type": "string",
          "enum": [
            "baja",
            "media",
            "alta",
            "critica"
          ],
          "default": "media"
        },
        "capture": {
          "title": "Capture",
          "type": "object"
        }
      }
    },
    "WorkspaceMember": {
      "required": [
        "workspace",
        "user"
      ],
      "type": "object",
      "properties": {
        "id": {
          "title": "ID",
          "type": "integer",
          "readOnly": true
        },
        "workspace": {
          "title": "Workspace",
          "type": "integer"
        },
        "workspace_slug": {
          "title": "Workspace slug",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        },
        "user": {
          "title": "User",
          "type": "integer"
        },
        "username": {
          "title": "Username",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        },
        "full_name": {
          "title": "Full name",
          "type": "string",
          "readOnly": true
        },
        "role": {
          "title": "Role",
          "type": "string",
          "enum": [
            "owner",
            "editor",
            "viewer"
          ]
        },
        "created_at": {
          "title": "Created at",
          "type": "string",
          "format": "date-time",
          "readOnly": true
        }
      }
    },
    "EcosystemNode": {
      "required": [
        "workspace",
        "key",
        "name"
      ],
      "type": "object",
      "properties": {
        "id": {
          "title": "ID",
          "type": "integer",
          "readOnly": true
        },
        "workspace": {
          "title": "Workspace",
          "type": "integer"
        },
        "workspace_slug": {
          "title": "Workspace slug",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        },
        "key": {
          "title": "Key",
          "description": "Identificador estable dentro del workspace (usado por el seed).",
          "type": "string",
          "format": "slug",
          "pattern": "^[-a-zA-Z0-9_]+$",
          "maxLength": 60,
          "minLength": 1
        },
        "name": {
          "title": "Name",
          "type": "string",
          "maxLength": 120,
          "minLength": 1
        },
        "layer": {
          "title": "Layer",
          "description": "Capa o columna lógica: Captación, Venta, Operación...",
          "type": "string",
          "maxLength": 60
        },
        "description": {
          "title": "Description",
          "type": "string"
        },
        "health": {
          "title": "Health",
          "type": "string",
          "enum": [
            "prod",
            "test",
            "placeholder"
          ]
        },
        "health_display": {
          "title": "Health display",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        },
        "facts": {
          "title": "Facts",
          "description": "Pares etiqueta → valor mostrados en el panel.",
          "type": "object"
        },
        "col": {
          "title": "Col",
          "description": "Columna del layout.",
          "type": "integer",
          "maximum": 65535,
          "minimum": 0
        },
        "y": {
          "title": "Y",
          "description": "Posición vertical del layout (px del viewBox).",
          "type": "integer",
          "maximum": 2147483647,
          "minimum": -2147483648
        },
        "order": {
          "title": "Order",
          "type": "integer",
          "maximum": 65535,
          "minimum": 0
        },
        "is_active": {
          "title": "Is active",
          "type": "boolean"
        },
        "created_at": {
          "title": "Created at",
          "type": "string",
          "format": "date-time",
          "readOnly": true
        },
        "updated_at": {
          "title": "Updated at",
          "type": "string",
          "format": "date-time",
          "readOnly": true
        }
      }
    },
    "ProjectNotification": {
      "type": "object",
      "properties": {
        "id": {
          "title": "ID",
          "type": "integer",
          "readOnly": true
        },
        "title": {
          "title": "Título",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        },
        "message": {
          "title": "Mensaje",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        },
        "notification_type": {
          "title": "Tipo",
          "type": "string",
          "enum": [
            "payment",
            "contract",
            "alert",
            "info",
            "warning"
          ],
          "readOnly": true
        },
        "read": {
          "title": "Leída",
          "type": "boolean"
        },
        "link": {
          "title": "Enlace",
          "type": "string",
          "readOnly": true,
          "minLength": 1,
          "x-nullable": true
        },
        "created_at": {
          "title": "Fecha de creación",
          "type": "string",
          "format": "date-time",
          "readOnly": true
        }
      }
    },
    "Project": {
      "required": [
        "workspace",
        "name"
      ],
      "type": "object",
      "properties": {
        "id": {
          "title": "ID",
          "type": "integer",
          "readOnly": true
        },
        "workspace": {
          "title": "Workspace",
          "type": "integer"
        },
        "workspace_slug": {
          "title": "Workspace slug",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        },
        "name": {
          "title": "Name",
          "type": "string",
          "maxLength": 200,
          "minLength": 1
        },
        "status": {
          "title": "Status",
          "type": "string",
          "enum": [
            "planeando",
            "backlog",
            "en_curso",
            "pausado",
            "bloqueado",
            "completado"
          ]
        },
        "status_display": {
          "title": "Status display",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        },
        "priority": {
          "title": "Priority",
          "type": "string",
          "enum": [
            "alta",
            "media",
            "baja"
          ]
        },
        "priority_display": {
          "title": "Priority display",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        },
        "owner": {
          "title": "Owner",
          "type": "integer",
          "x-nullable": true
        },
        "owner_detail": {
          "$ref": "#/definitions/UserBrief"
        },
        "created_by": {
          "title": "Created by",
          "type": "integer",
          "readOnly": true,
          "x-nullable": true
        },
        "start_date": {
          "title": "Start date",
          "type": "string",
          "format": "date",
          "x-nullable": true
        },
        "end_date": {
          "title": "End date",
          "type": "string",
          "format": "date",
          "x-nullable": true
        },
        "summary": {
          "title": "Summary",
          "type": "string"
        },
        "blocked_by": {
          "type": "array",
          "items": {
            "type": "integer"
          },
          "uniqueItems": true
        },
        "nodes": {
          "type": "array",
          "items": {
            "type": "integer"
          },
          "uniqueItems": true
        },
        "node_keys": {
          "title": "Node keys",
          "type": "string",
          "readOnly": true
        },
        "order": {
          "title": "Order",
          "type": "integer",
          "maximum": 4294967295,
          "minimum": 0
        },
        "tasks_total": {
          "title": "Tasks total",
          "type": "integer",
          "readOnly": true
        },
        "tasks_open": {
          "title": "Tasks open",
          "type": "integer",
          "readOnly": true
        },
        "tasks_done": {
          "title": "Tasks done",
          "type": "integer",
          "readOnly": true
        },
        "tasks_overdue": {
          "title": "Tasks overdue",
          "type": "integer",
          "readOnly": true
        },
        "created_at": {
          "title": "Created at",
          "type": "string",
          "format": "date-time",
          "readOnly": true
        },
        "updated_at": {
          "title": "Updated at",
          "type": "string",
          "format": "date-time",
          "readOnly": true
        }
      }
    },
    "SpecRunEvent": {
      "required": [
        "status"
      ],
      "type": "object",
      "properties": {
        "id": {
          "title": "ID",
          "type": "integer",
          "readOnly": true
        },
        "status": {
          "title": "Status",
          "type": "string",
          "enum": [
            "queued",
            "running",
            "pr_open",
            "merged",
            "failed",
            "cancelled"
          ]
        },
        "status_display": {
          "title": "Status display",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        },
        "stage": {
          "title": "Stage",
          "type": "string",
          "maxLength": 160
        },
        "detail": {
          "title": "Detail",
          "type": "string"
        },
        "at": {
          "title": "At",
          "type": "string",
          "format": "date-time",
          "readOnly": true
        }
      }
    },
    "SpecRun": {
      "required": [
        "spec"
      ],
      "type": "object",
      "properties": {
        "id": {
          "title": "ID",
          "type": "integer",
          "readOnly": true
        },
        "spec": {
          "title": "Spec",
          "type": "integer"
        },
        "spec_title": {
          "title": "Spec title",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        },
        "triggered_by": {
          "title": "Triggered by",
          "type": "integer",
          "x-nullable": true
        },
        "triggered_by_detail": {
          "$ref": "#/definitions/UserBrief"
        },
        "status": {
          "title": "Status",
          "type": "string",
          "enum": [
            "queued",
            "running",
            "pr_open",
            "merged",
            "failed",
            "cancelled"
          ]
        },
        "status_display": {
          "title": "Status display",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        },
        "mode": {
          "title": "Mode",
          "type": "string",
          "maxLength": 20,
          "minLength": 1
        },
        "stage": {
          "title": "Stage",
          "type": "string",
          "maxLength": 160
        },
        "repo": {
          "title": "Repo",
          "type": "string",
          "maxLength": 140
        },
        "base_branch": {
          "title": "Base branch",
          "type": "string",
          "maxLength": 60
        },
        "work_branch": {
          "title": "Work branch",
          "type": "string",
          "maxLength": 120
        },
        "workflow_dispatched": {
          "title": "Workflow dispatched",
          "type": "boolean"
        },
        "pr_number": {
          "title": "Pr number",
          "type": "integer",
          "maximum": 4294967295,
          "minimum": 0,
          "x-nullable": true
        },
        "pr_url": {
          "title": "Pr url",
          "type": "string",
          "maxLength": 500
        },
        "commit_sha": {
          "title": "Commit sha",
          "type": "string",
          "maxLength": 64
        },
        "files_changed": {
          "title": "Files changed",
          "type": "object"
        },
        "test_summary": {
          "title": "Test summary",
          "type": "string"
        },
        "logs_tail": {
          "title": "Logs tail",
          "type": "string"
        },
        "bitacora_path": {
          "title": "Bitacora path",
          "type": "string",
          "maxLength": 255
        },
        "iteration_note": {
          "title": "Iteration note",
          "type": "string"
        },
        "error_message": {
          "title": "Error message",
          "type": "string"
        },
        "actions_url": {
          "title": "Actions url",
          "type": "string",
          "format": "uri",
          "maxLength": 500
        },
        "spec_status": {
          "title": "Spec status",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        },
        "task_id": {
          "title": "Task id",
          "type": "integer",
          "readOnly": true
        },
        "task_title": {
          "title": "Task title",
          "type": "string",
          "readOnly": true,
          "default": "",
          "minLength": 1
        },
        "report_id": {
          "title": "Report id",
          "type": "integer",
          "readOnly": true
        },
        "workspace_slug": {
          "title": "Workspace slug",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        },
        "events": {
          "type": "array",
          "items": {
            "$ref": "#/definitions/SpecRunEvent"
          },
          "readOnly": true
        },
        "started_at": {
          "title": "Started at",
          "type": "string",
          "format": "date-time",
          "readOnly": true
        },
        "finished_at": {
          "title": "Finished at",
          "type": "string",
          "format": "date-time",
          "readOnly": true,
          "x-nullable": true
        },
        "updated_at": {
          "title": "Updated at",
          "type": "string",
          "format": "date-time",
          "readOnly": true
        }
      }
    },
    "TaskSpec": {
      "required": [
        "workspace",
        "title"
      ],
      "type": "object",
      "properties": {
        "id": {
          "title": "ID",
          "type": "integer",
          "readOnly": true
        },
        "workspace": {
          "title": "Workspace",
          "type": "integer"
        },
        "workspace_slug": {
          "title": "Workspace slug",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        },
        "task": {
          "title": "Task",
          "type": "integer",
          "x-nullable": true
        },
        "task_title": {
          "title": "Task title",
          "type": "string",
          "readOnly": true,
          "default": "",
          "minLength": 1
        },
        "report": {
          "title": "Report",
          "type": "integer",
          "x-nullable": true
        },
        "report_summary": {
          "title": "Report summary",
          "type": "string",
          "readOnly": true
        },
        "kind": {
          "title": "Kind",
          "type": "string",
          "enum": [
            "feature",
            "bugfix",
            "question"
          ]
        },
        "kind_display": {
          "title": "Kind display",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        },
        "status": {
          "title": "Status",
          "type": "string",
          "enum": [
            "borrador",
            "en_revision",
            "aprobado",
            "ejecutando",
            "pr_abierto",
            "completado",
            "fallido"
          ]
        },
        "status_display": {
          "title": "Status display",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        },
        "title": {
          "title": "Title",
          "type": "string",
          "maxLength": 200,
          "minLength": 1
        },
        "summary": {
          "title": "Summary",
          "type": "string"
        },
        "problem_diagnosis": {
          "title": "Problem diagnosis",
          "type": "string"
        },
        "proposed_solution": {
          "title": "Proposed solution",
          "type": "string"
        },
        "markdown_body": {
          "title": "Markdown body",
          "type": "string"
        },
        "target_files": {
          "title": "Target files",
          "type": "object"
        },
        "acceptance_criteria": {
          "title": "Acceptance criteria",
          "type": "object"
        },
        "verification_plan": {
          "title": "Verification plan",
          "type": "object"
        },
        "subtasks_proposal": {
          "title": "Subtasks proposal",
          "type": "object"
        },
        "open_questions": {
          "title": "Open questions",
          "type": "object"
        },
        "citations": {
          "title": "Citations",
          "type": "object"
        },
        "answer_draft": {
          "title": "Answer draft",
          "type": "string"
        },
        "generated_by": {
          "title": "Generated by",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        },
        "target_repo": {
          "title": "Target repo",
          "type": "string",
          "maxLength": 140
        },
        "target_branch": {
          "title": "Target branch",
          "type": "string",
          "maxLength": 60
        },
        "auto_execute": {
          "title": "Auto execute",
          "type": "boolean"
        },
        "created_by": {
          "title": "Created by",
          "type": "integer",
          "x-nullable": true
        },
        "created_by_detail": {
          "$ref": "#/definitions/UserBrief"
        },
        "approved_by": {
          "title": "Approved by",
          "type": "integer",
          "x-nullable": true
        },
        "approved_by_detail": {
          "$ref": "#/definitions/UserBrief"
        },
        "approved_at": {
          "title": "Approved at",
          "type": "string",
          "format": "date-time",
          "x-nullable": true
        },
        "runs": {
          "type": "array",
          "items": {
            "$ref": "#/definitions/SpecRun"
          },
          "readOnly": true
        },
        "agy_command": {
          "title": "Agy command",
          "type": "string",
          "readOnly": true
        },
        "created_at": {
          "title": "Created at",
          "type": "string",
          "format": "date-time",
          "readOnly": true
        },
        "updated_at": {
          "title": "Updated at",
          "type": "string",
          "format": "date-time",
          "readOnly": true
        }
      }
    },
    "Task": {
      "required": [
        "title"
      ],
      "type": "object",
      "properties": {
        "id": {
          "title": "ID",
          "type": "integer",
          "readOnly": true
        },
        "workspace": {
          "title": "Workspace",
          "type": "integer"
        },
        "workspace_slug": {
          "title": "Workspace slug",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        },
        "project": {
          "title": "Project",
          "type": "integer",
          "x-nullable": true
        },
        "project_name": {
          "title": "Project name",
          "type": "string",
          "readOnly": true,
          "default": "",
          "minLength": 1
        },
        "parent": {
          "title": "Parent",
          "type": "integer",
          "x-nullable": true
        },
        "nodes": {
          "type": "array",
          "items": {
            "type": "integer"
          },
          "uniqueItems": true
        },
        "node_keys": {
          "title": "Node keys",
          "type": "string",
          "readOnly": true
        },
        "node_names": {
          "title": "Node names",
          "type": "string",
          "readOnly": true
        },
        "title": {
          "title": "Title",
          "type": "string",
          "maxLength": 200,
          "minLength": 1
        },
        "detail": {
          "title": "Detail",
          "type": "string"
        },
        "assignee": {
          "title": "Assignee",
          "type": "integer",
          "x-nullable": true
        },
        "assignee_detail": {
          "$ref": "#/definitions/UserBrief"
        },
        "created_by": {
          "title": "Created by",
          "type": "integer",
          "readOnly": true,
          "x-nullable": true
        },
        "created_by_detail": {
          "$ref": "#/definitions/UserBrief"
        },
        "status": {
          "title": "Status",
          "type": "string",
          "enum": [
            "pendiente",
            "en_curso",
            "bloqueado",
            "hecho"
          ]
        },
        "status_display": {
          "title": "Status display",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        },
        "priority": {
          "title": "Priority",
          "type": "string",
          "enum": [
            "alta",
            "media",
            "baja"
          ]
        },
        "priority_display": {
          "title": "Priority display",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        },
        "due_date": {
          "title": "Due date",
          "type": "string",
          "format": "date",
          "x-nullable": true
        },
        "completed_at": {
          "title": "Completed at",
          "type": "string",
          "format": "date-time",
          "readOnly": true,
          "x-nullable": true
        },
        "is_overdue": {
          "title": "Is overdue",
          "type": "boolean",
          "readOnly": true
        },
        "order": {
          "title": "Order",
          "type": "integer",
          "maximum": 4294967295,
          "minimum": 0
        },
        "origin": {
          "title": "Origin",
          "description": "Procedencia: \"Análisis 2026-09-05\", \"Reporte #12\"...",
          "type": "string",
          "maxLength": 120
        },
        "tags": {
          "title": "Tags",
          "type": "object"
        },
        "subtasks_count": {
          "title": "Subtasks count",
          "type": "integer",
          "readOnly": true
        },
        "comments_count": {
          "title": "Comments count",
          "type": "integer",
          "readOnly": true
        },
        "linked_reports": {
          "title": "Linked reports",
          "type": "string",
          "readOnly": true
        },
        "latest_spec": {
          "title": "Latest spec",
          "type": "string",
          "readOnly": true
        },
        "created_at": {
          "title": "Created at",
          "type": "string",
          "format": "date-time",
          "readOnly": true
        },
        "updated_at": {
          "title": "Updated at",
          "type": "string",
          "format": "date-time",
          "readOnly": true
        }
      }
    },
    "Workspace": {
      "required": [
        "slug",
        "name"
      ],
      "type": "object",
      "properties": {
        "id": {
          "title": "ID",
          "type": "integer",
          "readOnly": true
        },
        "slug": {
          "title": "Slug",
          "type": "string",
          "format": "slug",
          "pattern": "^[-a-zA-Z0-9_]+$",
          "maxLength": 40,
          "minLength": 1
        },
        "name": {
          "title": "Name",
          "type": "string",
          "maxLength": 100,
          "minLength": 1
        },
        "description": {
          "title": "Description",
          "type": "string"
        },
        "color": {
          "title": "Color",
          "description": "Acento opcional para la UI (hex).",
          "type": "string",
          "maxLength": 20
        },
        "order": {
          "title": "Order",
          "type": "integer",
          "maximum": 65535,
          "minimum": 0
        },
        "is_active": {
          "title": "Is active",
          "type": "boolean"
        },
        "projects_count": {
          "title": "Projects count",
          "type": "integer",
          "readOnly": true
        },
        "nodes_count": {
          "title": "Nodes count",
          "type": "integer",
          "readOnly": true
        },
        "created_at": {
          "title": "Created at",
          "type": "string",
          "format": "date-time",
          "readOnly": true
        },
        "updated_at": {
          "title": "Updated at",
          "type": "string",
          "format": "date-time",
          "readOnly": true
        }
      }
    },
    "Property": {
      "required": [
        "address",
        "neighborhood",
        "city",
        "department",
        "property_type",
        "business_line"
      ],
      "type": "object",
      "properties": {
        "id": {
          "title": "ID",
          "type": "integer",
          "readOnly": true
        },
        "reference_code": {
          "title": "Reference code",
          "type": "string",
          "maxLength": 50
        },
        "title": {
          "title": "Title",
          "type": "string",
          "maxLength": 160
        },
        "description": {
          "title": "Description",
          "type": "string"
        },
        "address": {
          "title": "Address",
          "type": "string",
          "maxLength": 255,
          "minLength": 1
        },
        "neighborhood": {
          "title": "Neighborhood",
          "type": "string",
          "maxLength": 100,
          "minLength": 1
        },
        "city": {
          "title": "City",
          "type": "string",
          "maxLength": 100,
          "minLength": 1
        },
        "department": {
          "title": "Department",
          "type": "string",
          "maxLength": 100,
          "minLength": 1
        },
        "operation": {
          "title": "Operation",
          "type": "string",
          "enum": [
            "venta",
            "alquiler"
          ]
        },
        "status": {
          "title": "Status",
          "type": "string",
          "enum": [
            "disponible",
            "remate",
            "nuevo",
            "reservada",
            "proceso",
            "vendida",
            "alquilada"
          ]
        },
        "price": {
          "title": "Price",
          "type": "string",
          "format": "decimal"
        },
        "area_m2": {
          "title": "Area m2",
          "type": "string",
          "format": "decimal"
        },
        "bedrooms": {
          "title": "Bedrooms",
          "type": "integer",
          "maximum": 4294967295,
          "minimum": 0
        },
        "bathrooms": {
          "title": "Bathrooms",
          "type": "integer",
          "maximum": 4294967295,
          "minimum": 0
        },
        "parking_spaces": {
          "title": "Parking spaces",
          "type": "integer",
          "maximum": 4294967295,
          "minimum": 0
        },
        "featured": {
          "title": "Featured",
          "type": "boolean"
        },
        "latitude": {
          "title": "Latitude",
          "type": "string",
          "format": "decimal",
          "x-nullable": true
        },
        "longitude": {
          "title": "Longitude",
          "type": "string",
          "format": "decimal",
          "x-nullable": true
        },
        "images": {
          "title": "Images",
          "type": "object"
        },
        "property_type": {
          "title": "Property type",
          "type": "integer"
        },
        "property_type_name": {
          "title": "Property type name",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        },
        "property_type_code": {
          "title": "Property type code",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        },
        "business_line": {
          "title": "Business line",
          "description": "Debe apuntar a BusinessLine.code = 'Inmo'",
          "type": "string"
        },
        "business_line_name": {
          "title": "Business line name",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        },
        "business_line_code": {
          "title": "Business line code",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        },
        "created_at": {
          "title": "Created at",
          "type": "string",
          "format": "date-time",
          "readOnly": true
        },
        "updated_at": {
          "title": "Updated at",
          "type": "string",
          "format": "date-time",
          "readOnly": true
        }
      }
    },
    "PropertyContract": {
      "required": [
        "contract",
        "property_id"
      ],
      "type": "object",
      "properties": {
        "contract": {
          "title": "Contract",
          "type": "string"
        },
        "property": {
          "$ref": "#/definitions/Property"
        },
        "property_id": {
          "title": "Property id",
          "type": "integer"
        },
        "property_address": {
          "title": "Property address",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        },
        "property_city": {
          "title": "Property city",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        },
        "property_title": {
          "title": "Property title",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        }
      }
    },
    "PropertyInquiry": {
      "required": [
        "full_name",
        "email"
      ],
      "type": "object",
      "properties": {
        "id": {
          "title": "ID",
          "type": "integer",
          "readOnly": true
        },
        "property": {
          "title": "Property",
          "type": "integer",
          "x-nullable": true
        },
        "property_address": {
          "title": "Property address",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        },
        "property_city": {
          "title": "Property city",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        },
        "property_title": {
          "title": "Property title",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        },
        "full_name": {
          "title": "Full name",
          "type": "string",
          "maxLength": 200,
          "minLength": 1
        },
        "email": {
          "title": "Email",
          "type": "string",
          "format": "email",
          "maxLength": 254,
          "minLength": 1
        },
        "phone": {
          "title": "Phone",
          "type": "string",
          "maxLength": 30
        },
        "document_number": {
          "title": "Document number",
          "type": "string",
          "maxLength": 20
        },
        "client": {
          "title": "Client",
          "description": "Cliente existente vinculado por documento (auto, best-effort)",
          "type": "string",
          "readOnly": true,
          "x-nullable": true
        },
        "message": {
          "title": "Message",
          "type": "string"
        },
        "status": {
          "title": "Status",
          "type": "string",
          "enum": [
            "NEW",
            "CONTACTED",
            "VISIT",
            "NEGOTIATION",
            "CLOSED"
          ]
        },
        "source_url": {
          "title": "Source url",
          "type": "string",
          "format": "uri",
          "maxLength": 200
        },
        "utm_source": {
          "title": "Utm source",
          "type": "string",
          "maxLength": 150
        },
        "utm_medium": {
          "title": "Utm medium",
          "type": "string",
          "maxLength": 150
        },
        "utm_campaign": {
          "title": "Utm campaign",
          "type": "string",
          "maxLength": 150
        },
        "utm_term": {
          "title": "Utm term",
          "type": "string",
          "maxLength": 150
        },
        "utm_content": {
          "title": "Utm content",
          "type": "string",
          "maxLength": 150
        },
        "marketing_attribution": {
          "title": "Marketing attribution",
          "type": "object"
        },
        "habeas_data_accepted": {
          "title": "Habeas data accepted",
          "type": "boolean"
        },
        "habeas_data_accepted_at": {
          "title": "Habeas data accepted at",
          "type": "string",
          "format": "date-time",
          "readOnly": true,
          "x-nullable": true
        },
        "habeas_data_ip": {
          "title": "Habeas data ip",
          "type": "string",
          "readOnly": true,
          "minLength": 1,
          "x-nullable": true
        },
        "habeas_data_policy_version": {
          "title": "Habeas data policy version",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        },
        "created_at": {
          "title": "Created at",
          "type": "string",
          "format": "date-time",
          "readOnly": true
        },
        "updated_at": {
          "title": "Updated at",
          "type": "string",
          "format": "date-time",
          "readOnly": true
        }
      }
    },
    "PropertyType": {
      "required": [
        "code",
        "name",
        "business_line"
      ],
      "type": "object",
      "properties": {
        "id": {
          "title": "ID",
          "type": "integer",
          "readOnly": true
        },
        "code": {
          "title": "Code",
          "type": "string",
          "maxLength": 20,
          "minLength": 1
        },
        "name": {
          "title": "Name",
          "type": "string",
          "maxLength": 100,
          "minLength": 1
        },
        "business_line": {
          "title": "Business line",
          "description": "Debe apuntar a BusinessLine.code = 'Inmo'",
          "type": "string"
        },
        "business_line_name": {
          "title": "Business line name",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        }
      }
    },
    "ServiceRequestAudit": {
      "required": [
        "service_request",
        "action"
      ],
      "type": "object",
      "properties": {
        "id": {
          "title": "ID",
          "type": "integer",
          "readOnly": true
        },
        "service_request": {
          "title": "Solicitud de Servicio",
          "type": "integer"
        },
        "service_request_id": {
          "title": "Service request id",
          "type": "integer",
          "readOnly": true
        },
        "user": {
          "title": "Usuario",
          "type": "integer",
          "x-nullable": true
        },
        "user_name": {
          "title": "User name",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        },
        "user_full_name": {
          "title": "User full name",
          "type": "string",
          "readOnly": true
        },
        "action": {
          "title": "Acción",
          "type": "string",
          "enum": [
            "created",
            "updated",
            "status_changed",
            "assigned",
            "unassigned",
            "note_added",
            "priority_changed",
            "closed",
            "reopened",
            "deleted"
          ]
        },
        "action_display": {
          "title": "Action display",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        },
        "timestamp": {
          "title": "Fecha y Hora",
          "type": "string",
          "format": "date-time",
          "readOnly": true
        },
        "details": {
          "title": "Detalles",
          "description": "Información adicional sobre la acción (valores anteriores, nuevos valores, etc.)",
          "type": "object"
        },
        "description": {
          "title": "Descripción",
          "description": "Descripción legible de lo que ocurrió",
          "type": "string"
        },
        "ip_address": {
          "title": "Dirección IP",
          "type": "string",
          "minLength": 1,
          "x-nullable": true
        },
        "user_agent": {
          "title": "User Agent",
          "type": "string"
        }
      }
    },
    "ServiceRequestNote": {
      "required": [
        "service_request",
        "note"
      ],
      "type": "object",
      "properties": {
        "id": {
          "title": "ID",
          "type": "integer",
          "readOnly": true
        },
        "service_request": {
          "title": "Service request",
          "type": "integer"
        },
        "user": {
          "title": "User",
          "type": "integer",
          "readOnly": true
        },
        "user_name": {
          "title": "User name",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        },
        "note": {
          "title": "Nota",
          "type": "string",
          "minLength": 1
        },
        "is_internal": {
          "title": "Nota interna",
          "description": "Solo visible para el personal",
          "type": "boolean"
        },
        "created_at": {
          "title": "Fecha",
          "type": "string",
          "format": "date-time",
          "readOnly": true
        }
      }
    },
    "ServiceRequestCreditDetail": {
      "required": [
        "monto_solicitado",
        "plazo_meses",
        "convenio_id"
      ],
      "type": "object",
      "properties": {
        "id": {
          "title": "ID",
          "type": "integer",
          "readOnly": true
        },
        "monto_solicitado": {
          "title": "Monto solicitado",
          "type": "string",
          "format": "decimal"
        },
        "plazo_meses": {
          "title": "Plazo (meses)",
          "type": "integer",
          "maximum": 2147483647,
          "minimum": -2147483648
        },
        "convenio_id": {
          "title": "ID de Convenio",
          "type": "string",
          "maxLength": 50,
          "minLength": 1
        },
        "cedula_pdf": {
          "title": "Cédula PDF",
          "type": "string",
          "readOnly": true,
          "x-nullable": true,
          "format": "uri"
        },
        "desprendible_pdf": {
          "title": "Desprendible nómina PDF",
          "type": "string",
          "readOnly": true,
          "x-nullable": true,
          "format": "uri"
        }
      }
    },
    "ServiceRequestNormalizationDetail": {
      "required": [
        "valor_total_deudas",
        "numero_acreedores",
        "capacidad_pago_mes"
      ],
      "type": "object",
      "properties": {
        "id": {
          "title": "ID",
          "type": "integer",
          "readOnly": true
        },
        "valor_total_deudas": {
          "title": "Valor total deudas",
          "type": "string",
          "format": "decimal"
        },
        "numero_acreedores": {
          "title": "Número de acreedores",
          "type": "integer",
          "maximum": 2147483647,
          "minimum": -2147483648
        },
        "capacidad_pago_mes": {
          "title": "Capacidad pago mensual",
          "type": "string",
          "format": "decimal"
        },
        "datacredito_pdf": {
          "title": "Reporte Datacrédito PDF",
          "type": "string",
          "readOnly": true,
          "format": "uri"
        }
      }
    },
    "ServiceRequestInsolvencyDetail": {
      "required": [
        "dias_mora_promedio"
      ],
      "type": "object",
      "properties": {
        "id": {
          "title": "ID",
          "type": "integer",
          "readOnly": true
        },
        "tiene_demandas_curso": {
          "title": "Tiene demandas en curso",
          "type": "boolean"
        },
        "tiene_bienes_nombre": {
          "title": "Tiene bienes a su nombre",
          "type": "boolean"
        },
        "dias_mora_promedio": {
          "title": "Días mora promedio",
          "type": "integer",
          "maximum": 2147483647,
          "minimum": -2147483648
        },
        "fecha_cita_abogado": {
          "title": "Fecha cita abogado",
          "type": "string",
          "format": "date-time",
          "x-nullable": true
        }
      }
    },
    "ServiceRequest": {
      "type": "object",
      "properties": {
        "id": {
          "title": "ID",
          "type": "integer",
          "readOnly": true
        },
        "name": {
          "title": "Nombre",
          "type": "string",
          "maxLength": 255
        },
        "email": {
          "title": "Correo electrónico",
          "type": "string",
          "format": "email",
          "maxLength": 254
        },
        "phone": {
          "title": "Teléfono",
          "type": "string",
          "maxLength": 50
        },
        "message": {
          "title": "Mensaje/Descripción",
          "type": "string"
        },
        "document_type": {
          "title": "Tipo de documento",
          "type": "string",
          "enum": [
            "CC",
            "CE"
          ]
        },
        "document_number": {
          "title": "Número de documento",
          "type": "string",
          "maxLength": 30
        },
        "vinculation_type": {
          "title": "Tipo de vinculación",
          "type": "string",
          "maxLength": 50
        },
        "habeas_data_accepted": {
          "title": "Autoriza Habeas Data",
          "type": "boolean"
        },
        "habeas_data_accepted_at": {
          "title": "Fecha de autorización Habeas Data",
          "type": "string",
          "format": "date-time",
          "readOnly": true,
          "x-nullable": true
        },
        "habeas_data_ip": {
          "title": "IP de autorización Habeas Data",
          "type": "string",
          "readOnly": true,
          "minLength": 1,
          "x-nullable": true
        },
        "habeas_data_policy_version": {
          "title": "Versión de la política aceptada",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        },
        "source": {
          "title": "Origen",
          "type": "string",
          "enum": [
            "web_form",
            "phone",
            "email",
            "walk_in",
            "referral",
            "internal"
          ]
        },
        "request_type": {
          "title": "Tipo de solicitud",
          "type": "string",
          "enum": [
            "contact",
            "credit",
            "investment",
            "real_estate",
            "alliance",
            "withdrawal",
            "normalization",
            "insolvency",
            "other"
          ]
        },
        "business_line": {
          "title": "Línea de negocio",
          "type": "string",
          "x-nullable": true
        },
        "business_line_name": {
          "title": "Business line name",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        },
        "service": {
          "title": "Servicio específico",
          "type": "string",
          "x-nullable": true
        },
        "service_name": {
          "title": "Service name",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        },
        "client": {
          "title": "Cliente",
          "type": "string",
          "x-nullable": true
        },
        "client_name": {
          "title": "Client name",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        },
        "investor": {
          "title": "Inversionista",
          "type": "integer",
          "x-nullable": true
        },
        "investor_name": {
          "title": "Investor name",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        },
        "status": {
          "title": "Estado",
          "type": "string",
          "enum": [
            "new",
            "pending",
            "on_hold",
            "under_review",
            "open",
            "in_progress",
            "approved",
            "rejected",
            "completed",
            "closed",
            "cancelled"
          ]
        },
        "priority": {
          "title": "Prioridad",
          "type": "string",
          "enum": [
            "low",
            "medium",
            "high",
            "urgent"
          ]
        },
        "assigned_to": {
          "title": "Asignado a",
          "type": "integer",
          "x-nullable": true
        },
        "assigned_to_name": {
          "title": "Assigned to name",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        },
        "created_by": {
          "title": "Creado por",
          "type": "integer",
          "readOnly": true,
          "x-nullable": true
        },
        "created_by_name": {
          "title": "Created by name",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        },
        "created_at": {
          "title": "Fecha de creación",
          "type": "string",
          "format": "date-time",
          "readOnly": true
        },
        "updated_at": {
          "title": "Fecha de actualización",
          "type": "string",
          "format": "date-time",
          "readOnly": true
        },
        "closed_at": {
          "title": "Fecha de cierre",
          "type": "string",
          "format": "date-time",
          "x-nullable": true
        },
        "estimated_completion": {
          "title": "Fecha estimada de finalización",
          "type": "string",
          "format": "date",
          "x-nullable": true
        },
        "tags": {
          "title": "Etiquetas",
          "description": "Etiquetas separadas por comas",
          "type": "string",
          "maxLength": 500
        },
        "days_open": {
          "title": "Days open",
          "type": "string",
          "readOnly": true
        },
        "is_closed": {
          "title": "Is closed",
          "type": "string",
          "readOnly": true
        },
        "withdrawal_amount": {
          "title": "Monto de retiro",
          "description": "Monto solicitado para retiro (solo para tipo withdrawal)",
          "type": "string",
          "format": "decimal",
          "x-nullable": true
        },
        "credit_detail": {
          "$ref": "#/definitions/ServiceRequestCreditDetail"
        },
        "normalization_detail": {
          "$ref": "#/definitions/ServiceRequestNormalizationDetail"
        },
        "insolvency_detail": {
          "$ref": "#/definitions/ServiceRequestInsolvencyDetail"
        },
        "business_line_options": {
          "title": "Business line options",
          "type": "string",
          "readOnly": true
        },
        "service_options": {
          "title": "Service options",
          "type": "string",
          "readOnly": true
        },
        "client_options": {
          "title": "Client options",
          "type": "string",
          "readOnly": true
        },
        "investor_options": {
          "title": "Investor options",
          "type": "string",
          "readOnly": true
        },
        "user_options": {
          "title": "User options",
          "type": "string",
          "readOnly": true
        }
      }
    },
    "ServiceRequestCreate": {
      "type": "object",
      "properties": {
        "id": {
          "title": "ID",
          "type": "integer",
          "readOnly": true
        },
        "name": {
          "title": "Nombre",
          "type": "string",
          "maxLength": 255
        },
        "email": {
          "title": "Correo electrónico",
          "type": "string",
          "format": "email",
          "maxLength": 254
        },
        "phone": {
          "title": "Teléfono",
          "type": "string",
          "maxLength": 50
        },
        "message": {
          "title": "Mensaje/Descripción",
          "type": "string"
        },
        "document_type": {
          "title": "Tipo de documento",
          "type": "string",
          "enum": [
            "CC",
            "CE"
          ]
        },
        "document_number": {
          "title": "Número de documento",
          "type": "string",
          "maxLength": 30
        },
        "vinculation_type": {
          "title": "Tipo de vinculación",
          "type": "string",
          "maxLength": 50
        },
        "habeas_data_accepted": {
          "title": "Autoriza Habeas Data",
          "type": "boolean"
        },
        "source": {
          "title": "Origen",
          "type": "string",
          "enum": [
            "web_form",
            "phone",
            "email",
            "walk_in",
            "referral",
            "internal"
          ]
        },
        "request_type": {
          "title": "Tipo de solicitud",
          "type": "string",
          "enum": [
            "contact",
            "credit",
            "investment",
            "real_estate",
            "alliance",
            "withdrawal",
            "normalization",
            "insolvency",
            "other"
          ]
        },
        "business_line": {
          "title": "Línea de negocio",
          "type": "string",
          "x-nullable": true
        },
        "monto_solicitado": {
          "title": "Monto solicitado",
          "type": "string",
          "format": "decimal"
        },
        "plazo_meses": {
          "title": "Plazo meses",
          "type": "integer"
        },
        "convenio_id": {
          "title": "Convenio id",
          "type": "string",
          "maxLength": 50,
          "minLength": 1
        },
        "cedula_pdf": {
          "title": "Cedula pdf",
          "type": "string",
          "readOnly": true,
          "format": "uri"
        },
        "desprendible_pdf": {
          "title": "Desprendible pdf",
          "type": "string",
          "readOnly": true,
          "format": "uri"
        },
        "valor_total_deudas": {
          "title": "Valor total deudas",
          "type": "string",
          "format": "decimal"
        },
        "numero_acreedores": {
          "title": "Numero acreedores",
          "type": "integer"
        },
        "capacidad_pago_mes": {
          "title": "Capacidad pago mes",
          "type": "string",
          "format": "decimal"
        },
        "datacredito_pdf": {
          "title": "Datacredito pdf",
          "type": "string",
          "readOnly": true,
          "format": "uri"
        },
        "tiene_demandas_curso": {
          "title": "Tiene demandas curso",
          "type": "boolean",
          "default": false
        },
        "tiene_bienes_nombre": {
          "title": "Tiene bienes nombre",
          "type": "boolean",
          "default": false
        },
        "dias_mora_promedio": {
          "title": "Dias mora promedio",
          "type": "integer"
        },
        "fecha_cita_abogado": {
          "title": "Fecha cita abogado",
          "type": "string",
          "format": "date-time"
        },
        "utm_source": {
          "title": "Utm source",
          "type": "string",
          "maxLength": 150
        },
        "utm_medium": {
          "title": "Utm medium",
          "type": "string",
          "maxLength": 150
        },
        "utm_campaign": {
          "title": "Utm campaign",
          "type": "string",
          "maxLength": 150
        },
        "utm_term": {
          "title": "Utm term",
          "type": "string",
          "maxLength": 150
        },
        "utm_content": {
          "title": "Utm content",
          "type": "string",
          "maxLength": 150
        },
        "landing": {
          "title": "Landing",
          "type": "string",
          "maxLength": 100
        },
        "post_id": {
          "title": "Post id",
          "type": "integer",
          "x-nullable": true
        },
        "marketing_attribution": {
          "title": "Marketing attribution",
          "type": "object"
        }
      }
    },
    "ServiceRequestUpdate": {
      "type": "object",
      "properties": {
        "name": {
          "title": "Nombre",
          "type": "string",
          "maxLength": 255
        },
        "email": {
          "title": "Correo electrónico",
          "type": "string",
          "format": "email",
          "maxLength": 254
        },
        "phone": {
          "title": "Teléfono",
          "type": "string",
          "maxLength": 50
        },
        "message": {
          "title": "Mensaje/Descripción",
          "type": "string"
        },
        "source": {
          "title": "Origen",
          "type": "string",
          "enum": [
            "web_form",
            "phone",
            "email",
            "walk_in",
            "referral",
            "internal"
          ]
        },
        "request_type": {
          "title": "Tipo de solicitud",
          "type": "string",
          "enum": [
            "contact",
            "credit",
            "investment",
            "real_estate",
            "alliance",
            "withdrawal",
            "normalization",
            "insolvency",
            "other"
          ]
        },
        "business_line": {
          "title": "Línea de negocio",
          "type": "string",
          "x-nullable": true
        },
        "service": {
          "title": "Servicio específico",
          "type": "string",
          "x-nullable": true
        },
        "client": {
          "title": "Cliente",
          "type": "string",
          "x-nullable": true
        },
        "investor": {
          "title": "Inversionista",
          "type": "integer",
          "x-nullable": true
        },
        "status": {
          "title": "Estado",
          "type": "string",
          "enum": [
            "new",
            "pending",
            "on_hold",
            "under_review",
            "open",
            "in_progress",
            "approved",
            "rejected",
            "completed",
            "closed",
            "cancelled"
          ]
        },
        "priority": {
          "title": "Prioridad",
          "type": "string",
          "enum": [
            "low",
            "medium",
            "high",
            "urgent"
          ]
        },
        "assigned_to": {
          "title": "Asignado a",
          "type": "integer",
          "x-nullable": true
        },
        "estimated_completion": {
          "title": "Fecha estimada de finalización",
          "type": "string",
          "format": "date",
          "x-nullable": true
        },
        "tags": {
          "title": "Etiquetas",
          "description": "Etiquetas separadas por comas",
          "type": "string",
          "maxLength": 500
        }
      }
    },
    "CoreBusinessLineNestedSerializer": {
      "required": [
        "code",
        "name"
      ],
      "type": "object",
      "properties": {
        "code": {
          "title": "Code",
          "type": "string",
          "maxLength": 20,
          "minLength": 1
        },
        "name": {
          "title": "Name",
          "type": "string",
          "maxLength": 100,
          "minLength": 1
        }
      }
    },
    "CoreServiceSerializer": {
      "required": [
        "code",
        "name",
        "business_line"
      ],
      "type": "object",
      "properties": {
        "code": {
          "title": "Code",
          "type": "string",
          "maxLength": 20,
          "minLength": 1
        },
        "name": {
          "title": "Name",
          "type": "string",
          "maxLength": 100,
          "minLength": 1
        },
        "description": {
          "title": "Description",
          "type": "string"
        },
        "default_rate": {
          "title": "Default rate",
          "description": "Tasa de interés por defecto para este servicio (ej: 0.12 = 12%)",
          "type": "string",
          "format": "decimal",
          "x-nullable": true
        },
        "business_line": {
          "title": "Business line",
          "type": "string"
        },
        "business_line_detail": {
          "$ref": "#/definitions/CoreBusinessLineNestedSerializer"
        },
        "category": {
          "title": "Category",
          "type": "string",
          "enum": [
            "credito",
            "normalizacion",
            "asesoria",
            "cooperativa",
            "inmobiliario"
          ]
        },
        "segment": {
          "title": "Segment",
          "description": "Segmento objetivo (ej: Empleado Público, Pensionado)",
          "type": "string",
          "maxLength": 150
        },
        "notion_ref": {
          "title": "Notion ref",
          "description": "Código del servicio en el portafolio de Notion (ej: CR-001)",
          "type": "string",
          "maxLength": 20
        },
        "is_active": {
          "title": "Is active",
          "type": "boolean"
        }
      }
    },
    "Standard": {
      "required": [
        "slug",
        "title"
      ],
      "type": "object",
      "properties": {
        "id": {
          "title": "ID",
          "type": "integer",
          "readOnly": true
        },
        "slug": {
          "title": "Slug",
          "type": "string",
          "format": "slug",
          "pattern": "^[-a-zA-Z0-9_]+$",
          "maxLength": 80,
          "minLength": 1
        },
        "title": {
          "title": "Title",
          "type": "string",
          "maxLength": 200,
          "minLength": 1
        },
        "kind": {
          "title": "Kind",
          "type": "string",
          "enum": [
            "proceso",
            "producto",
            "sop",
            "soporte",
            "politica",
            "academia"
          ]
        },
        "kind_display": {
          "title": "Kind display",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        },
        "audience": {
          "title": "Audience",
          "type": "string",
          "enum": [
            "interno",
            "asesor",
            "cliente",
            "inversionista",
            "publico"
          ]
        },
        "audience_display": {
          "title": "Audience display",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        },
        "summary": {
          "title": "Summary",
          "description": "Una o dos frases: qué resuelve este documento.",
          "type": "string"
        },
        "status": {
          "title": "Status",
          "type": "string",
          "enum": [
            "borrador",
            "revision",
            "aprobado",
            "archivado"
          ]
        },
        "status_display": {
          "title": "Status display",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        },
        "business_line": {
          "title": "Business line",
          "type": "string",
          "x-nullable": true
        },
        "service": {
          "title": "Service",
          "description": "Para hojas de vida de producto: el servicio del catálogo.",
          "type": "string",
          "x-nullable": true
        },
        "advisor_role": {
          "title": "Advisor role",
          "description": "Rol operativo al que aplica el procedimiento (core.AdvisorRole).",
          "type": "string",
          "maxLength": 20
        },
        "owner": {
          "title": "Owner",
          "type": "integer",
          "x-nullable": true
        },
        "owner_username": {
          "title": "Owner username",
          "type": "string",
          "readOnly": true,
          "default": "",
          "minLength": 1
        },
        "current_version": {
          "title": "Current version",
          "description": "Última versión aprobada; es la que se publica y la que cita el copiloto.",
          "type": "integer",
          "readOnly": true,
          "x-nullable": true
        },
        "current_version_number": {
          "title": "Current version number",
          "type": "integer",
          "readOnly": true
        },
        "versions_count": {
          "title": "Versions count",
          "type": "integer",
          "readOnly": true
        },
        "requires_read": {
          "title": "Requires read",
          "description": "Exige lectura confirmada por los roles a los que aplica.",
          "type": "boolean"
        },
        "tags": {
          "title": "Tags",
          "type": "object"
        },
        "notion_ref": {
          "title": "Notion ref",
          "description": "Archivo o página de origen en Notion.",
          "type": "string",
          "maxLength": 120
        },
        "order": {
          "title": "Order",
          "type": "integer",
          "maximum": 65535,
          "minimum": 0
        },
        "learn_path": {
          "title": "Learn path",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        },
        "body": {
          "title": "Body",
          "type": "string",
          "readOnly": true
        },
        "created_at": {
          "title": "Created at",
          "type": "string",
          "format": "date-time",
          "readOnly": true
        },
        "updated_at": {
          "title": "Updated at",
          "type": "string",
          "format": "date-time",
          "readOnly": true
        }
      }
    },
    "StandardCreate": {
      "required": [
        "slug",
        "title"
      ],
      "type": "object",
      "properties": {
        "id": {
          "title": "ID",
          "type": "integer",
          "readOnly": true
        },
        "slug": {
          "title": "Slug",
          "type": "string",
          "format": "slug",
          "pattern": "^[-a-zA-Z0-9_]+$",
          "maxLength": 80,
          "minLength": 1
        },
        "title": {
          "title": "Title",
          "type": "string",
          "maxLength": 200,
          "minLength": 1
        },
        "kind": {
          "title": "Kind",
          "type": "string",
          "enum": [
            "proceso",
            "producto",
            "sop",
            "soporte",
            "politica",
            "academia"
          ]
        },
        "kind_display": {
          "title": "Kind display",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        },
        "audience": {
          "title": "Audience",
          "type": "string",
          "enum": [
            "interno",
            "asesor",
            "cliente",
            "inversionista",
            "publico"
          ]
        },
        "audience_display": {
          "title": "Audience display",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        },
        "summary": {
          "title": "Summary",
          "description": "Una o dos frases: qué resuelve este documento.",
          "type": "string"
        },
        "status": {
          "title": "Status",
          "type": "string",
          "enum": [
            "borrador",
            "revision",
            "aprobado",
            "archivado"
          ]
        },
        "status_display": {
          "title": "Status display",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        },
        "business_line": {
          "title": "Business line",
          "type": "string",
          "x-nullable": true
        },
        "service": {
          "title": "Service",
          "description": "Para hojas de vida de producto: el servicio del catálogo.",
          "type": "string",
          "x-nullable": true
        },
        "advisor_role": {
          "title": "Advisor role",
          "description": "Rol operativo al que aplica el procedimiento (core.AdvisorRole).",
          "type": "string",
          "maxLength": 20
        },
        "owner": {
          "title": "Owner",
          "type": "integer",
          "x-nullable": true
        },
        "owner_username": {
          "title": "Owner username",
          "type": "string",
          "readOnly": true,
          "default": "",
          "minLength": 1
        },
        "current_version": {
          "title": "Current version",
          "description": "Última versión aprobada; es la que se publica y la que cita el copiloto.",
          "type": "integer",
          "readOnly": true,
          "x-nullable": true
        },
        "current_version_number": {
          "title": "Current version number",
          "type": "integer",
          "readOnly": true
        },
        "versions_count": {
          "title": "Versions count",
          "type": "integer",
          "readOnly": true
        },
        "requires_read": {
          "title": "Requires read",
          "description": "Exige lectura confirmada por los roles a los que aplica.",
          "type": "boolean"
        },
        "tags": {
          "title": "Tags",
          "type": "object"
        },
        "notion_ref": {
          "title": "Notion ref",
          "description": "Archivo o página de origen en Notion.",
          "type": "string",
          "maxLength": 120
        },
        "order": {
          "title": "Order",
          "type": "integer",
          "maximum": 65535,
          "minimum": 0
        },
        "learn_path": {
          "title": "Learn path",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        },
        "body": {
          "title": "Body",
          "type": "string"
        },
        "created_at": {
          "title": "Created at",
          "type": "string",
          "format": "date-time",
          "readOnly": true
        },
        "updated_at": {
          "title": "Updated at",
          "type": "string",
          "format": "date-time",
          "readOnly": true
        }
      }
    },
    "DocumentVersion": {
      "required": [
        "standard",
        "body"
      ],
      "type": "object",
      "properties": {
        "id": {
          "title": "ID",
          "type": "integer",
          "readOnly": true
        },
        "standard": {
          "title": "Standard",
          "type": "integer"
        },
        "number": {
          "title": "Number",
          "type": "integer",
          "readOnly": true
        },
        "body": {
          "title": "Body",
          "description": "Contenido en Markdown.",
          "type": "string",
          "minLength": 1
        },
        "change_note": {
          "title": "Change note",
          "description": "Qué cambió respecto a la versión anterior.",
          "type": "string",
          "maxLength": 300
        },
        "author": {
          "title": "Author",
          "type": "integer",
          "readOnly": true,
          "x-nullable": true
        },
        "author_username": {
          "title": "Author username",
          "type": "string",
          "readOnly": true,
          "default": "",
          "minLength": 1
        },
        "approved_by": {
          "title": "Approved by",
          "type": "integer",
          "readOnly": true,
          "x-nullable": true
        },
        "approved_by_username": {
          "title": "Approved by username",
          "type": "string",
          "readOnly": true,
          "default": "",
          "minLength": 1
        },
        "approved_at": {
          "title": "Approved at",
          "type": "string",
          "format": "date-time",
          "readOnly": true,
          "x-nullable": true
        },
        "is_approved": {
          "title": "Is approved",
          "type": "boolean",
          "readOnly": true
        },
        "reads_count": {
          "title": "Reads count",
          "type": "integer",
          "readOnly": true
        },
        "created_at": {
          "title": "Created at",
          "type": "string",
          "format": "date-time",
          "readOnly": true
        }
      }
    },
    "CoreSystemParameterSerializer": {
      "required": [
        "key",
        "name",
        "value"
      ],
      "type": "object",
      "properties": {
        "key": {
          "title": "Key",
          "description": "Clave única del parámetro (ej: SMLV_2024)",
          "type": "string",
          "maxLength": 50,
          "minLength": 1
        },
        "name": {
          "title": "Name",
          "description": "Nombre descriptivo del parámetro",
          "type": "string",
          "maxLength": 100,
          "minLength": 1
        },
        "value": {
          "title": "Value",
          "description": "Valor del parámetro (puede ser número, texto, o lista separada por comas)",
          "type": "string",
          "maxLength": 500,
          "minLength": 1
        },
        "description": {
          "title": "Description",
          "description": "Descripción detallada del parámetro",
          "type": "string"
        },
        "is_active": {
          "title": "Is active",
          "description": "Indica si el parámetro está activo",
          "type": "boolean"
        },
        "created_at": {
          "title": "Created at",
          "type": "string",
          "format": "date-time",
          "readOnly": true
        },
        "updated_at": {
          "title": "Updated at",
          "type": "string",
          "format": "date-time",
          "readOnly": true
        }
      }
    },
    "TokenObtainPair": {
      "required": [
        "username",
        "password"
      ],
      "type": "object",
      "properties": {
        "username": {
          "title": "Username",
          "type": "string",
          "minLength": 1
        },
        "password": {
          "title": "Password",
          "type": "string",
          "minLength": 1
        }
      }
    },
    "TokenRefresh": {
      "required": [
        "refresh"
      ],
      "type": "object",
      "properties": {
        "refresh": {
          "title": "Refresh",
          "type": "string",
          "minLength": 1
        },
        "access": {
          "title": "Access",
          "type": "string",
          "readOnly": true,
          "minLength": 1
        }
      }
    },
    "GlobalTransaction": {
      "required": [
        "fecha"
      ],
      "type": "object",
      "properties": {
        "id_transaccion": {
          "title": "Id transaccion",
          "type": "integer",
          "readOnly": true
        },
        "fecha": {
          "title": "Fecha",
          "type": "string",
          "format": "date-time"
        },
        "debito": {
          "title": "Debito",
          "type": "string",
          "format": "decimal",
          "x-nullable": true
        },
        "credito": {
          "title": "Credito",
          "type": "string",
          "format": "decimal",
          "x-nullable": true
        },
        "saldo": {
          "title": "Saldo",
          "type": "string",
          "format": "decimal",
          "x-nullable": true
        },
        "referencia": {
          "title": "Referencia",
          "type": "string",
          "maxLength": 255,
          "x-nullable": true
        },
        "comentario": {
          "title": "Comentario",
          "type": "string",
          "x-nullable": true
        },
        "motivo": {
          "title": "Motivo",
          "type": "string"
        },
        "cliente": {
          "title": "Cliente",
          "type": "string",
          "x-nullable": true
        },
        "inversionista": {
          "title": "Inversionista",
          "type": "integer",
          "x-nullable": true
        },
        "contrato": {
          "title": "Contrato",
          "type": "string",
          "x-nullable": true
        },
        "linea_negocio": {
          "title": "Línea de Negocio",
          "description": "Línea de negocio asociada a la transacción",
          "type": "string"
        },
        "is_internal": {
          "title": "Es movimiento interno",
          "description": "True si es causación/redistribución interna, False si es dinero físico",
          "type": "boolean"
        },
        "is_processed": {
          "title": "Procesada",
          "description": "True si esta transacción ya fue clasificada como movimiento de partida doble",
          "type": "boolean",
          "readOnly": true
        },
        "processed_at": {
          "title": "Fecha de procesamiento",
          "description": "Timestamp de cuándo se procesó la transacción",
          "type": "string",
          "format": "date-time",
          "readOnly": true,
          "x-nullable": true
        },
        "processed_movimiento": {
          "title": "Movimiento generado",
          "description": "Movimiento de partida doble creado al clasificar esta transacción",
          "type": "integer",
          "readOnly": true,
          "x-nullable": true
        },
        "processed_movimiento_monto": {
          "title": "Processed movimiento monto",
          "type": "string",
          "format": "decimal",
          "readOnly": true,
          "x-nullable": true
        },
        "processed_movimiento_motivo": {
          "title": "Processed movimiento motivo",
          "type": "string",
          "readOnly": true,
          "minLength": 1,
          "x-nullable": true
        },
        "processed_movimiento_fecha": {
          "title": "Processed movimiento fecha",
          "type": "string",
          "format": "date-time",
          "readOnly": true,
          "x-nullable": true
        },
        "processed_by": {
          "title": "Procesado por",
          "description": "Usuario que clasificó la transacción",
          "type": "integer",
          "readOnly": true,
          "x-nullable": true
        },
        "processed_by_username": {
          "title": "Processed by username",
          "type": "string",
          "readOnly": true,
          "minLength": 1,
          "x-nullable": true
        },
        "processing_status": {
          "title": "Processing status",
          "type": "string",
          "readOnly": true
        },
        "origen_consolidado": {
          "title": "Origen consolidado",
          "type": "string",
          "readOnly": true
        },
        "origen_consolidado_label": {
          "title": "Origen consolidado label",
          "type": "string",
          "readOnly": true
        },
        "motivo_canonico": {
          "title": "Motivo canonico",
          "type": "string",
          "readOnly": true
        },
        "idempotency_key": {
          "title": "Clave de idempotencia",
          "description": "Identificador único de la operación de negocio que originó esta transacción; previene duplicados a nivel de base de datos",
          "type": "string",
          "readOnly": true,
          "minLength": 1,
          "x-nullable": true
        }
      }
    },
    "User": {
      "required": [
        "username"
      ],
      "type": "object",
      "properties": {
        "id": {
          "title": "ID",
          "type": "integer",
          "readOnly": true
        },
        "username": {
          "title": "Nombre de usuario",
          "description": "Requerido. 150 carácteres como máximo. Únicamente letras, dígitos y @/./+/-/_ ",
          "type": "string",
          "pattern": "^[\\w.@+-]+$",
          "maxLength": 150,
          "minLength": 1
        },
        "email": {
          "title": "Dirección de correo electrónico",
          "type": "string",
          "format": "email",
          "maxLength": 254
        },
        "first_name": {
          "title": "Nombre",
          "type": "string",
          "maxLength": 150
        },
        "last_name": {
          "title": "Apellidos",
          "type": "string",
          "maxLength": 150
        },
        "is_active": {
          "title": "Activo",
          "description": "Indica si el usuario debe ser tratado como activo. Desmarque esta opción en lugar de borrar la cuenta.",
          "type": "boolean"
        },
        "is_staff": {
          "title": "Es staff",
          "description": "Indica si el usuario puede entrar en este sitio de administración.",
          "type": "boolean"
        },
        "is_superuser": {
          "title": "Es superusuario",
          "description": "Indica que este usuario tiene todos los permisos sin asignárselos explícitamente.",
          "type": "boolean"
        },
        "date_joined": {
          "title": "Fecha de alta",
          "type": "string",
          "format": "date-time",
          "readOnly": true
        },
        "last_login": {
          "title": "Último inicio de sesión",
          "type": "string",
          "format": "date-time",
          "readOnly": true,
          "x-nullable": true
        },
        "profile": {
          "$ref": "#/definitions/Profile"
        },
        "groups": {
          "type": "array",
          "items": {
            "$ref": "#/definitions/Group"
          },
          "readOnly": true
        }
      }
    },
    "UserCreate": {
      "required": [
        "username",
        "password",
        "user_type"
      ],
      "type": "object",
      "properties": {
        "username": {
          "title": "Nombre de usuario",
          "description": "Requerido. 150 carácteres como máximo. Únicamente letras, dígitos y @/./+/-/_ ",
          "type": "string",
          "pattern": "^[\\w.@+-]+$",
          "maxLength": 150,
          "minLength": 1
        },
        "email": {
          "title": "Dirección de correo electrónico",
          "type": "string",
          "format": "email",
          "maxLength": 254
        },
        "password": {
          "title": "Password",
          "type": "string",
          "minLength": 1
        },
        "password_confirm": {
          "title": "Password confirm",
          "type": "string",
          "minLength": 1
        },
        "first_name": {
          "title": "Nombre",
          "type": "string",
          "maxLength": 150
        },
        "last_name": {
          "title": "Apellidos",
          "type": "string",
          "maxLength": 150
        },
        "is_active": {
          "title": "Activo",
          "description": "Indica si el usuario debe ser tratado como activo. Desmarque esta opción en lugar de borrar la cuenta.",
          "type": "boolean"
        },
        "user_type": {
          "title": "User type",
          "description": "Tipo de usuario interno (clientes e inversionistas tienen su propio endpoint)",
          "type": "string",
          "enum": [
            "admin",
            "advisor",
            "legal_manager",
            "collaborator"
          ]
        },
        "advisor_role": {
          "title": "Advisor role",
          "description": "Rol operativo (M1); sincroniza grupos vía matriz declarativa",
          "type": "string"
        },
        "group_ids": {
          "type": "array",
          "items": {
            "type": "integer"
          },
          "uniqueItems": true
        }
      }
    },
    "ClientUserCreate": {
      "required": [
        "username",
        "email",
        "password",
        "cliente_id"
      ],
      "type": "object",
      "properties": {
        "username": {
          "title": "Username",
          "type": "string",
          "minLength": 1
        },
        "email": {
          "title": "Email",
          "type": "string",
          "format": "email",
          "minLength": 1
        },
        "password": {
          "title": "Password",
          "type": "string",
          "minLength": 1
        },
        "password_confirm": {
          "title": "Password confirm",
          "type": "string",
          "minLength": 1
        },
        "first_name": {
          "title": "First name",
          "type": "string"
        },
        "last_name": {
          "title": "Last name",
          "type": "string"
        },
        "cliente_id": {
          "title": "Cliente id",
          "description": "Identificación del cliente",
          "type": "string",
          "minLength": 1
        },
        "is_active": {
          "title": "Is active",
          "type": "boolean",
          "default": true
        }
      }
    },
    "InvestorUserCreate": {
      "required": [
        "username",
        "email",
        "password",
        "investor_id"
      ],
      "type": "object",
      "properties": {
        "username": {
          "title": "Username",
          "type": "string",
          "minLength": 1
        },
        "email": {
          "title": "Email",
          "type": "string",
          "format": "email",
          "minLength": 1
        },
        "password": {
          "title": "Password",
          "type": "string",
          "minLength": 1
        },
        "password_confirm": {
          "title": "Password confirm",
          "type": "string",
          "minLength": 1
        },
        "first_name": {
          "title": "First name",
          "type": "string"
        },
        "last_name": {
          "title": "Last name",
          "type": "string"
        },
        "investor_id": {
          "title": "Investor id",
          "description": "ID del inversionista",
          "type": "string",
          "minLength": 1
        },
        "is_active": {
          "title": "Is active",
          "type": "boolean",
          "default": true
        }
      }
    },
    "UserDetail": {
      "required": [
        "username"
      ],
      "type": "object",
      "properties": {
        "id": {
          "title": "ID",
          "type": "integer",
          "readOnly": true
        },
        "username": {
          "title": "Nombre de usuario",
          "description": "Requerido. 150 carácteres como máximo. Únicamente letras, dígitos y @/./+/-/_ ",
          "type": "string",
          "pattern": "^[\\w.@+-]+$",
          "maxLength": 150,
          "minLength": 1
        },
        "email": {
          "title": "Dirección de correo electrónico",
          "type": "string",
          "format": "email",
          "maxLength": 254
        },
        "first_name": {
          "title": "Nombre",
          "type": "string",
          "maxLength": 150
        },
        "last_name": {
          "title": "Apellidos",
          "type": "string",
          "maxLength": 150
        },
        "is_active": {
          "title": "Activo",
          "description": "Indica si el usuario debe ser tratado como activo. Desmarque esta opción en lugar de borrar la cuenta.",
          "type": "boolean"
        },
        "is_staff": {
          "title": "Es staff",
          "description": "Indica si el usuario puede entrar en este sitio de administración.",
          "type": "boolean"
        },
        "is_superuser": {
          "title": "Es superusuario",
          "description": "Indica que este usuario tiene todos los permisos sin asignárselos explícitamente.",
          "type": "boolean"
        },
        "date_joined": {
          "title": "Fecha de alta",
          "type": "string",
          "format": "date-time",
          "readOnly": true
        },
        "last_login": {
          "title": "Último inicio de sesión",
          "type": "string",
          "format": "date-time",
          "readOnly": true,
          "x-nullable": true
        },
        "profile": {
          "$ref": "#/definitions/Profile"
        },
        "groups": {
          "type": "array",
          "items": {
            "$ref": "#/definitions/Group"
          },
          "readOnly": true
        },
        "user_permissions": {
          "type": "array",
          "items": {
            "$ref": "#/definitions/Permission"
          },
          "readOnly": true
        }
      }
    },
    "UserUpdate": {
      "required": [
        "username"
      ],
      "type": "object",
      "properties": {
        "id": {
          "title": "ID",
          "type": "integer",
          "readOnly": true
        },
        "username": {
          "title": "Nombre de usuario",
          "description": "Requerido. 150 carácteres como máximo. Únicamente letras, dígitos y @/./+/-/_ ",
          "type": "string",
          "pattern": "^[\\w.@+-]+$",
          "maxLength": 150,
          "minLength": 1
        },
        "email": {
          "title": "Dirección de correo electrónico",
          "type": "string",
          "format": "email",
          "maxLength": 254
        },
        "first_name": {
          "title": "Nombre",
          "type": "string",
          "maxLength": 150
        },
        "last_name": {
          "title": "Apellidos",
          "type": "string",
          "maxLength": 150
        },
        "is_active": {
          "title": "Activo",
          "description": "Indica si el usuario debe ser tratado como activo. Desmarque esta opción en lugar de borrar la cuenta.",
          "type": "boolean"
        },
        "is_staff": {
          "title": "Es staff",
          "description": "Indica si el usuario puede entrar en este sitio de administración.",
          "type": "boolean"
        },
        "is_superuser": {
          "title": "Es superusuario",
          "description": "Indica que este usuario tiene todos los permisos sin asignárselos explícitamente.",
          "type": "boolean"
        },
        "date_joined": {
          "title": "Fecha de alta",
          "type": "string",
          "format": "date-time",
          "readOnly": true
        },
        "last_login": {
          "title": "Último inicio de sesión",
          "type": "string",
          "format": "date-time",
          "readOnly": true,
          "x-nullable": true
        },
        "profile": {
          "$ref": "#/definitions/Profile"
        },
        "groups": {
          "type": "array",
          "items": {
            "$ref": "#/definitions/Group"
          },
          "readOnly": true
        },
        "group_ids": {
          "type": "array",
          "items": {
            "type": "integer"
          },
          "uniqueItems": true
        },
        "user_type": {
          "title": "User type",
          "type": "string",
          "enum": [
            "admin",
            "advisor",
            "investor",
            "client",
            "legal_manager",
            "collaborator"
          ]
        },
        "advisor_role": {
          "title": "Advisor role",
          "type": "string"
        },
        "cliente_id": {
          "title": "Cliente id",
          "type": "string"
        },
        "investor_id": {
          "title": "Investor id",
          "type": "string"
        },
        "legal_firm_id": {
          "title": "Legal firm id",
          "type": "integer",
          "x-nullable": true
        }
      }
    },
    "PasswordChange": {
      "required": [
        "new_password",
        "new_password_confirm"
      ],
      "type": "object",
      "properties": {
        "new_password": {
          "title": "New password",
          "type": "string",
          "minLength": 1
        },
        "new_password_confirm": {
          "title": "New password confirm",
          "type": "string",
          "minLength": 1
        }
      }
    }
  }
}