Servidor MCP
Conecta herramientas de IA a Flowtly a través del Model Context Protocol en mcp.flowtly.eu.
Conectar
claude mcp add --transport http flowtly https://mcp.flowtly.eu/mcp
En esta página
Agreements_get
Herramientas
| agreements_get | Obtiene un acuerdo laboral por id — type, variant, la ventana dateFrom/dateTo, hoursPerWeek, y los derivados `calculable`, `active` y `status`. agreements_list proporciona el id. Requiere ROLE_AGREEMENTS_MANAGER o ROLE_MEETING_MANAGER. Solo lectura. |
Agreements_list
Herramientas
| agreements_list | Lista los acuerdos laborales — filtra por employee (IRI), isActive, type o variant. LA forma de responder "por qué people_list dice que esta persona está inactiva": cada fila lleva `calculable` y `active`, y una persona está activa exactamente cuando tiene un acuerdo que sea ambos. También es el lugar donde leer los códigos `type` de acuerdo que esta organización realmente usa antes de llamar a agreements_create, ya que una organización puede añadir los suyos propios. Requiere ROLE_AGREEMENTS_MANAGER o ROLE_MEETING_MANAGER. Solo lectura. |
Agreement Types_get
Herramientas
| agreementTypes_get | Obtiene un tipo de contrato por id — su name o translationKey, `calculable`, `isActive`, `position` y `builtIn`. El id ES el código, así que esto lee de vuelta un tipo mediante la misma cadena que un acuerdo almacena en `type`. Úsalo para confirmar que un tipo persistió tras agreementTypes_create, y para comprobar `calculable` antes de asignárselo a alguien. Requiere ROLE_USER. Solo lectura. |
Agreement Types_list
Herramientas
| agreementTypes_list | Lista los tipos de contrato que ESTA organización puede asignar a un acuerdo — los valores detrás de `Ludzie > <person> > Umowy > Edytuj umowę`. Léelo antes de agreements_create o agreements_import, porque la lista es por tenant: se incluyen cinco tipos integrados ("agreement", "annex", "termination", "list-of-intent", "work-experience") y una organización puede añadir los suyos, así que un `type` válido en una organización da 422 en otra. EL ID ES EL CÓDIGO — el `id` de cada fila es exactamente la cadena que `agreements_create` espera en `type`, no una clave numérica que buscar. `calculable` es el campo que decide si tener este tipo hace que alguien esté ACTIVO y lo cuenta en el banco de recursos, la acumulación de vacaciones y la base de costes; un tipo no calculable lo deja inactivo sin ningún error en ninguna parte, lo cual es intencional para un tipo como "list-of-intent" y un fallo silencioso si lo elegiste por accidente. Las filas `builtIn` llevan un translationKey y un name nulo; las filas personalizadas llevan un name mostrado tal cual y un translationKey nulo. Requiere ROLE_USER. Solo lectura. |
Asignaciones_get
Herramientas
| allocations_get | Una asignación por id: la reserva de una sola persona en un proyecto, con sus fechas y porcentaje. allocations_list encuentra el id; este lee el registro completo. Una asignación sin empleado es un rol ABIERTO (demanda sin cubrir), no una reserva. Requiere el módulo de asignación de recursos. Solo lectura. |
Asignaciones_list
Herramientas
| allocations_list | Lista las asignaciones de recursos: asignaciones con rango de fechas de una posición en un proyecto a un empleado (o a nadie todavía, un rol abierto). Sin filtros; pagine con cursor. Cada elemento incluye employeeId/employeeName y projectId/projectName ya resueltos (employeeId nulo significa un rol abierto); positionId viene sin resolver: obtenga su nombre mediante positions_list. source distingue las filas importadas de una hoja de las creadas directamente en Flowtly. Úselo para conciliar la importación de una hoja de asignación de recursos: lea lo que quedó registrado y compárelo con lo que se envió. |
Asset Bookings_get
Herramientas
| assetBookings_get | Obtiene una reserva de activo por id — el activo, su titular, las fechas, y si ha sido cancelada. Solo lectura. |
Asset Bookings_list
Herramientas
| assetBookings_list | Lista reservas de activos — quién o qué tiene actualmente cada activo, que es la asignación que muestra la pantalla de Activos y el único lugar donde realmente vive un vínculo activo-persona. Cada fila lleva el activo, el titular (`relationName` employee | project más `relationId`), las fechas de inicio/fin y, una vez liberado, `cancelReason` y `cancelledAt`. Filtra por `property` para ver el historial de un activo, o por `employee` para ver todo lo que tiene una persona — esta segunda opción es la que hay que ejecutar antes de que alguien se vaya. Ten en cuenta que `employee` aquí es el id NUMÉRICO, no el IRI /people que toma assetBookings_create. Añade `exists.cancelledAt: false` para ver solo lo que sigue en posesión; sin eso, la lista incluye también las reservas liberadas. Solo lectura. |
Asset Meter Readings_get
Herramientas
| assetMeterReadings_get | Obtiene una lectura de contador por id — su meter, date y value. Solo lectura. |
Asset Meter Readings_list
Herramientas
| assetMeterReadings_list | Lista lecturas de contador — los valores fechados registrados contra un contador de activo, los datos en bruto que lee el reparto de facturación por consumo. Cada fila lleva meter, date y value. Úsalo para leer el historial de un contador: un valor que nunca cambia entre periodos (un contador atascado o compartido) factura cero, y un contador sin filas recientes es uno que nadie está leyendo. Solo lectura. |
Asset Meters_get
Herramientas
| assetMeters_get | Obtiene un contador de activo por id — el activo al que pertenece, el tipo de suministro, la unidad y el identificador externo/QR, junto con sus lecturas. Solo lectura. |
Asset Meters_list
Herramientas
| assetMeters_list | Lista los contadores de activos de la organización — los contadores de suministros/medios adjuntos a activos (electricidad, agua, gas, calefacción). Cada uno lleva el activo al que pertenece, su tipo de suministro y unidad, y sus lecturas. Filtra por `property` (el activo al que pertenece) y `utilityType`. Úsalo para resolver el id de contador que necesitan las lecturas, y para detectar contadores que marcan cero, están atascados en un valor, o son un contador compartido/colectivo. Solo lectura. |
Assets_get
Herramientas
| assets_get | Obtiene un activo por id — name, status, categoría (attributeSet), parent, assetCode, número de serie, fechas de compra y garantía, ubicación y ajustes de reserva. Solo lectura. |
Assets_list
Herramientas
| assets_list | Lista los activos de la organización — el registro de cosas físicas que posee o vende, desde portátiles y escritorios hasta apartamentos, plazas de aparcamiento y trasteros. Filtra por status (in-stock | damaged | sold), attributeSet (la categoría por la que agrupa la lista de Activos), bookingAllowed, o un name o serialNumber parcial; ordena por name, status, serialNumber, boughtAt o warrantyTo. NO PAGINADO — todo el conjunto vuelve en una sola respuesta, así que un registro grande es una carga única en lugar de una primera página. Úsalo para resolver el id de activo que necesitan las reservas de activos y los documentos de activos. Solo lectura. |
Attribute Entity Values_list
Herramientas
| attributeEntityValues_list | Lista VALORES de atributo — lo que un activo, proyecto, presupuesto o cliente concreto tiene realmente para un atributo vinculado. Cada fila lleva el attribute, el value, y `relationId` que nombra la entidad a la que pertenece. Solo lectura. |
Attributes_get
Herramientas
| attributes_get | Obtiene una definición de atributo por id — name, type, si es required o multiple, el valor por defecto y el patrón de formato. Solo lectura. |
Attributes_list
Herramientas
| attributes_list | Lista DEFINICIONES de atributo — los campos con nombre (área, planta, precio) que las categorías vinculan y para los que los activos llevan valores. Cada uno tiene un type: number | string | date | state | period. Solo lectura. |
Attribute Set Attributes_list
Herramientas
| attributeSetAttributes_list | Lista los vínculos entre categorías y definiciones de atributo — qué campos aparecen en qué categoría. Solo lectura. |
Attribute Sets_get
Herramientas
| attributeSets_get | Obtiene un conjunto de atributos por id — su name, relationName, icon, y los atributos vinculados a él. Solo lectura. |
Attribute Sets_list
Herramientas
| attributeSets_list | Lista los conjuntos de atributos de la organización — las CATEGORÍAS bajo las que se archiva un activo, proyecto, presupuesto o cliente. Filtra por relationName: "property" para categorías de activos (lo que la UI llama Typ zasobu y por lo que agrupa la lista de Activos), además de "project", "budget" y "client". Recurre a esto antes de crear una: una categoría duplicada por ortografía o mayúsculas divide silenciosamente la lista que agrupa, y nada en la UI explica por qué. Solo lectura. |
Cuentas Bancarias_get
Herramientas
| bankAccounts_get | Obtén una cuenta bancaria por id — nombre, moneda, banco y el formato en que se importan sus extractos. |
Cuentas Bancarias_list
Herramientas
| bankAccounts_list | Lista las cuentas bancarias de la organización. Filtre por banco, o establezca hidden para incluir las archivadas. Úselo para obtener el id de bankAccount por el que filtra transactions_list. |
Banks_get
Herramientas
| banks_get | Obtiene un banco por id — la institución, no una cuenta mantenida en ella. Usa bankAccounts_get para la cuenta. |
Banks_list
Herramientas
| banks_list | Lista los bancos donde se mantienen las cuentas de la organización. Los bancos ocultos se INCLUYEN por defecto — pasa hidden=false para la vista de los selectores, o hidden=true para encontrar los retirados. Úsalo para resolver el id de banco por el que filtra bankAccounts_list y que necesita bankAccounts_create. |
Budgets_employee Pnl
Herramientas
| budgets_employeePnl | P&L por empleado para un presupuesto — lo que el tiempo de cada persona generó frente a lo que costó. Necesita ROLE_BUDGETS_VIEWER. Solo lectura. |
Budgets_get
Herramientas
| budgets_get | Obtiene un presupuesto por id — su period, scope y ajustes. Necesita ROLE_BUDGETS_VIEWER. Solo lectura. |
Budgets_list
Herramientas
| budgets_list | Lista los presupuestos de la organización — los periodos frente a los que se planifican y comparan ingresos y costes. Úsalo para resolver el id de presupuesto que toma cada herramienta pnl. Necesita ROLE_BUDGETS_VIEWER. Solo lectura. |
Clientes_get
Herramientas
| clients_get | Obtén un cliente por id — nombre, país, moneda, NIF y estado. |
Clientes_list
Herramientas
| clients_list | Lista los clientes (los clientes de la organización). Filtre por status, o por externalPaymentCustomerId para encontrar el cliente detrás de un id de proveedor de pagos. Úselo para obtener el id de cliente por el que filtran invoices_list, deals_list, projects_list y contracts_list. |
Claves de Configuración_catalog
Herramientas
| configKeys_catalog | Lista todas las claves de configuración de la organización que reconoce el backend, con su tipo y valores permitidos. Este es el catálogo de lo que es configurable: léalo antes de configs_get o configs_update en lugar de adivinar el nombre de una clave. El backend aplica permisos por clave, así que una clave que aparezca aquí no garantiza que el usuario conectado pueda escribirla. |
Configuraciones_get
Herramientas
| configs_get | Lee un valor de configuración de la organización por id, donde el id es una clave de configKeys_catalog (p. ej. organization-logo-url, organization-icon-url). |
Contratos_get
Herramientas
| contracts_get | Obtén un contrato por id — partes, dirección, valor, condiciones cíclicas y fechas. |
Contratos_list
Herramientas
| contracts_list | Lista contratos. Filtra por direction — los valores almacenados son "out" (vendemos / emitimos) e "in" (compramos / recibimos), más "unknown" — un estado real y filtrable, no un error. Un contrato creado subiendo un documento empieza como "unknown" y se queda así hasta que la extracción o una persona lo resuelve, así que omite el filtro para obtener los tres: "in" y "out" consultados por separado NO suman el conjunto completo (flowtly-mcp#130). NO "outgoing"/"incoming": esos no coinciden con nada y devuelven una lista vacía en lugar de un error. También filtra por counterparty, project, cyclic, name o tags. Úsalo para resolver el id de contrato que lee contracts_paymentScheduleLines y al que deals_win puede vincular un deal ganado. |
Contratos_Líneas de Calendario de Pago
Herramientas
| contracts_paymentScheduleLines | Lista el calendario de pagos de un contrato — las cuotas en las que se espera que se facture o pague. Pasa contractId de contracts_list. Esto es el plan, no lo realmente ejecutado: compáralo con transactions_list para ver lo que realmente se ha pagado. El importe de cada línea está en UNIDADES MENORES — grosze, no złote: "530000" son 5 300,00, así que divide entre 100 antes de reportar una cifra a nadie. |
Grupos de Costos_list
Herramientas
| costGroups_list | Lista los grupos de costos / centros de costos: las categorías bajo las que se archivan costos, proveedores y facturas entrantes. Úselo para obtener el id de costGroup que requiere suppliers_create y que proponen las sugerencias de facturas entrantes. |
Contrapartes_get
Herramientas
| counterparties_get | Obtén una contraparte por id. |
Contrapartes_list
Herramientas
| counterparties_list | Lista las contrapartes — todas las partes con las que transacciona la organización. Los indicadores supplier y client indican qué papel(es) desempeña una contraparte, y un registro puede ser ambos a la vez. Esta es la parte que figura en una transacción bancaria, así que es contra lo que se cotejan las facturas entrantes y las transacciones. Filtra por type, supplier, client, cyclic o budgetNeutral. |
Notas de CRM_get
Herramientas
| crmNotes_get | Obtén una nota de CRM por id. |
Notas de CRM_list
Herramientas
| crmNotes_list | Lista las notas escritas en leads y negocios. Filtra por lead o deal para leer el hilo de comentarios de un registro concreto. |
Motivos de Pérdida de Trato_get
Herramientas
| dealLostReasons_get | Obtén un motivo de negocio perdido por id. |
Motivos de Pérdida de Trato_list
Herramientas
| dealLostReasons_list | Lista los motivos por los que un trato puede marcarse como perdido, en orden. deals_lose requiere un lostReasonId de aquí. |
Tratos_get
Herramientas
| deals_get | Obtén un negocio por id — título, cliente, etapa, importe, propietario, contacto, y fechas de cierre prevista y real. |
Tratos_list
Herramientas
| deals_list | Lista negocios/oportunidades — el pipeline de ventas. Filtra por status (open / won / lost), stage, owner, client, lead, o por rangos de expectedCloseDate / closedAt. Los importes están en unidades menores con una moneda explícita; no asumas la moneda por defecto de la organización. |
Historial de Etapas de Trato_get
Herramientas
| dealStageHistories_get | Obtén un registro de cambio de etapa de negocio por id. |
Historial de Etapas de Trato_list
Herramientas
| dealStageHistories_list | Lista las transiciones de etapa de un trato, las más recientes primero. Filtre por deal. Cada deals_update que mueve la etapa se registra aquí automáticamente, así que esta es la forma de reconstruir cuánto tiempo estuvo un trato en cada etapa: el trato en sí solo conserva la etapa actual. |
Departments_list
Herramientas
| departments_list | Los departamentos de la organización, con el id numérico por el que se referencia cada uno. LEE ESTO ANTES de people_create o people_update: ambos aceptan un IRI `department` y no hay otra forma de descubrir uno válido. La colección no está paginada y está ordenada por name, así que una sola llamada devuelve todos los departamentos de la organización. Filtra por `name` (coincidencia parcial) o `code` (exacto). Las filas llevan id, name y code; `manager` es una relación y no se incluye en las filas de la lista — léelo con people_list desde el otro lado si lo necesitas. Requiere ROLE_EMPLOYEES_VIEWER. Solo lectura. |
Holiday Days Limits_get
Herramientas
| holidayDaysLimits_get | Una fila de derecho a vacaciones por id — el amount, el type, la variante de contrato y la fecha en que entra en vigor. holidayDaysLimits_list encuentra el id. Los importes están en SEGUNDOS (#3763). Solo lectura. |
Holiday Days Limits_list
Herramientas
| holidayDaysLimits_list | Cuántas vacaciones tiene DERECHO cada persona, por tipo — no cuántas ha tomado, que es holidays_list. Filtra por employee. Una persona puede tener varias filas para un mismo tipo a lo largo del tiempo, porque un saldo se recarga o se corrige: la fila EN VIGOR es la que tiene el dateFrom más reciente que ya ha llegado, y las filas con fecha futura se ignoran deliberadamente hasta entonces. Los importes están en SEGUNDOS (#3763) — un día de vacaciones de 8h son 28800. Requiere ROLE_HOLIDAYS_MANAGER. Solo lectura. |
Solicitudes de Vacaciones_list
Herramientas
| holidayRequests_list | SOLICITUDES de ausencia y su estado: pendiente, aprobada, rechazada. Distinto de holidays_list, que es la ausencia ya reservada: una solicitud que aún espera una decisión todavía no es una ausencia, así que planifique con holidays_list y use este para ver qué está pendiente de alguien. Proporciona el holidayRequestId que usan holidays_approve y holidays_bulkApprove. Solo lectura. |
Vacaciones_active
Herramientas
| holidays_active | Quién está de baja AHORA MISMO: toda ausencia actualmente en curso, en toda la organización, para todos. Esta es la herramienta para 'quién está fuera hoy', y la que hay que verificar antes de tratar el freePercent de resourcingBench_get como disponibilidad, porque el banco de recursos no resta las ausencias. A diferencia de holidays_list, no aplica alcance por proyecto y no requiere más permiso que haber iniciado sesión, así que su respuesta cubre toda la organización. Devuelve cada ausencia con su tipo y fechas. Solo lectura. |
Vacaciones_get
Herramientas
| holidays_get | Un registro de ausencia por id, con su tipo, fechas y duración. Obtenga el id de holidays_list o holidays_active. Solo lectura. |
Vacaciones_list
Herramientas
| holidays_list | Ausencias reservadas en un período: la vista de planificación, mientras que holidays_active solo responde sobre hoy. Filtre por employee, por rango de fechas, o por project. LO QUE VE DEPENDE DE SUS PERMISOS, y una lista corta no es prueba de que nadie esté de baja: un gestor de vacaciones o un visor de contabilidad obtiene la organización completa, mientras que un líder o visor de proyecto DEBE pasar un filtro de proyecto (o consultar sobre sí mismo) y se le rechaza directamente sin uno; ese rechazo es un límite de permisos, no un calendario vacío. Solo lectura. |
Holiday Types_list
Herramientas
| holidayTypes_list | Los tipos de vacaciones que usa esta organización, con el id por el que se referencia cada uno. Léelo antes de holidayDaysLimits_create/update, que necesitan un IRI holidayType y de lo contrario se adivinará. El que no es una vacación en el sentido habitual es `pick-up-day` — tiempo libre debido por horas extra ya trabajadas (en polaco *odbior nadgodzin*), que es un saldo CONCEDIDO en lugar de un derecho anual. Solo lectura. |
Facturas Entrantes_get
Herramientas
| incomingInvoices_get | Obtén una factura entrante (de proveedor) o documento justificativo por id, con sus campos extraídos por OCR y su estado de conciliación actual. |
Facturas Entrantes_list
Herramientas
| incomingInvoices_list | Lista las facturas entrantes (de proveedor) y los documentos de respaldo: la bandeja de entrada de contabilidad. Una factura entrante ES un documento adjunto a una transacción bancaria, así que exists.transaction=false es la forma de encontrar documentos que aún no están conciliados con un pago. Filtre también por status, relatedMonth, counterparty, project, tags, o hasDetectedProblems. Cada documento se identifica con la huella externalId 'upload_sha256:<sha256 de los bytes>': calcule el hash de un archivo y busque ese externalId aquí ANTES de incomingInvoices_create, o archivará un duplicado. |
Facturas Entrantes_Candidatos de Coincidencia
Herramientas
| incomingInvoices_matchCandidates | Lista las transacciones bancarias que podrían ser el pago de esta factura entrante, clasificadas por el propio comparador del backend. Recurre a esto cuando un documento no tiene ninguna transacción adjunta y necesitas elegir una; prefiere estos candidatos antes que adivinar tú mismo a partir de los importes. |
Facturas Entrantes_suggestions
Herramientas
| incomingInvoices_suggestions | Lee las propias propuestas de Flowtly para una factura entrante: coincidencia de proveedor, grupo de costos, transacción bancaria coincidente, advertencia de duplicado. Estas son exactamente las propuestas que ve una persona en la aplicación. Léalas primero y luego aplique una por id con incomingInvoices_applySuggestion, o acéptelas todas con acceptAllSuggestions. Pase refresh para recalcular en lugar de servir el conjunto en caché. |
Facturas Entrantes_Depuración de Sugerencias
Herramientas
| incomingInvoices_suggestionsDebug | Explica POR QUÉ salieron así las sugerencias de una factura entrante: la puntuación del emparejador, para diagnosticar una sugerencia faltante o incorrecta. Solo diagnóstico; use incomingInvoices_suggestions para el trabajo normal. |
Initial Budget Items_list
Herramientas
| initialBudgetItems_list | Lista las líneas del presupuesto inicial — los importes planificados, por etiqueta, contra los que responde contractComparison. Necesita ROLE_BUDGETS_VIEWER. Solo lectura. |
Initial Budgets_contract Comparison
Herramientas
| initialBudgets_contractComparison | PLANIFICADO frente a CONTRATADO, por etiqueta — los importes planificados del presupuesto inicial frente a la suma de los valores de contrato realmente firmados para ese proyecto. Esta es la pregunta de "hemos comprometido más de lo presupuestado, y dónde", y se lee directamente de los contratos ya presentes en la organización, así que importar contratos la hace respondible sin trabajo adicional. Los importes están en grosze; un proyecto con divisas mixtas produce un aviso en lugar de un total silenciosamente incorrecto. Necesita ROLE_BUDGETS_VIEWER. Solo lectura. |
Initial Budgets_get
Herramientas
| initialBudgets_get | Obtiene un presupuesto inicial por id, con sus items. Necesita ROLE_BUDGETS_VIEWER. Solo lectura. |
Initial Budgets_list
Herramientas
| initialBudgets_list | Lista los presupuestos iniciales — el plan ORIGINAL de un proyecto o inversión, en contraste con el presupuesto en vivo frente al que se mide. Necesita ROLE_BUDGETS_VIEWER. Solo lectura. |
Facturas_get
Herramientas
| invoices_get | Obtén una factura saliente (de venta) por id — cliente, líneas, totales, fecha de venta y de emisión, estado. |
Facturas_list
Herramientas
| invoices_list | Lista las facturas salientes (de venta). Filtre por client, tags, search, o un rango de saleDate. Tenga en cuenta que saleDate, no la fecha de emisión ni la fecha de creación, es el campo por el que filtra invoices_export, así que use el mismo aquí al conciliar una exportación. |
Actividades de Prospecto_get
Herramientas
| leadActivities_get | Obtiene una actividad de prospecto (contacto de captación) por id. |
Actividades de Prospecto_list
Herramientas
| leadActivities_list | Lista los contactos de captación de un prospecto: su cronología de actividad (invitación enviada, respuestas, llamadas, seguimientos). Filtre por lead para leer el historial de un prospecto. Este es el equivalente estructurado de crmNotes_list: las actividades son el registro de contactos tipado y fechado; las notas son comentarios libres. |
Contactos de Prospecto_get
Herramientas
| leadContacts_get | Obtén un contacto de lead por id. |
Contactos de Prospecto_list
Herramientas
| leadContacts_list | Lista las personas de contacto asociadas a los leads. Filtra por lead para leer los contactos de un prospecto, o por email para averiguar de qué lead vino un mensaje. |
Membresías de Lista de Prospectos_get
Herramientas
| leadListMemberships_get | Obtiene una pertenencia lead-a-lista por id. Su status y lastContactedAt son una instantánea escrita por quien llama, no un estado en vivo — ver leadListMemberships_list. |
Membresías de Lista de Prospectos_list
Herramientas
| leadListMemberships_list | Lista qué leads están en qué listas de prospección saliente. Filtra por list, lead o status. PRECAUCIÓN: status y lastContactedAt son una INSTANTÁNEA escrita por quien haya importado o actualizado la pertenencia por última vez. No se derivan, y nada los avanza cuando se registra una actividad — registrar una tanda de 529 seguimientos no mueve ninguno de los dos campos — así que pueden quedar arbitrariamente desfasados. Para responder "cuándo tocamos por última vez a este prospecto", lee en cambio el registro de actividad: leadActivities_list para un lead, leadActivities_byList para toda una campaña. leadListMemberships_syncFromActivities reporta la diferencia y puede cerrarla. |
Listas de Prospectos_get
Herramientas
| leadLists_get | Obtén una lista de prospección saliente por id. |
Listas de Prospectos_list
Herramientas
| leadLists_list | Lista las listas de prospección saliente. Úselo para obtener el id de lista que toma leadListMemberships_create. |
Motivos de Pérdida de Prospecto_get
Herramientas
| leadLostReasons_get | Obtén un motivo de lead perdido por id. |
Motivos de Pérdida de Prospecto_list
Herramientas
| leadLostReasons_list | Lista, en orden, los motivos por los que un lead puede marcarse como perdido. |
Prospectos_Verificación de Duplicados
Herramientas
| leads_dedupeCheck | Comprueba si un prospecto ya está en el CRM, usando los mismos filtros que leads_list (companyName, source, owner, …). Llame a esto ANTES de leads_create: un prospecto duplicado divide el historial de contactos en dos registros, y nada más adelante los fusionará por usted. |
Prospectos_get
Herramientas
| leads_get | Obtén un lead por id — empresa, sitio web, origen, estado, propietario y el cliente al que se convirtió, si lo hay. |
Prospectos_list
Herramientas
| leads_list | Lista los prospectos: objetivos de prospección, antes de la cualificación. Filtre por status, source, owner, client, companyName, o rangos de createdAt/closedAt. Un prospecto cualificado se convierte en un Cliente más un Trato abierto mediante leads_convert; hasta entonces solo existe aquí, no en clients_list. |
Etapas de Prospecto_get
Herramientas
| leadStages_get | Obtén una etapa de lead por id. |
Etapas de Prospecto_list
Herramientas
| leadStages_list | Lista las etapas por las que pasa un prospecto, en orden. Los prospectos tienen su propio conjunto de etapas: los tratos usan stages_list, que es algo distinto. |
Locations_get
Herramientas
| locations_get | Obtiene una ubicación por id — su name y horario de oficina. Solo lectura. |
Locations_list
Herramientas
| locations_list | Lista las ubicaciones de la organización — los lugares físicos donde están los activos, mostrados en la UI como Lokalizacja. Necesita ROLE_LOCATIONS_MANAGER, que inusualmente controla tanto la LECTURA como la escritura. Solo lectura. |
Organization Addresses_get
Herramientas
| organizationAddresses_get | Obtiene un registro de dirección de suscripción por id — name, street, city, postCode, country, y los campos fiscales. `street` lleva el número de edificio cuando se introdujo a mano, y no lo lleva cuando procede de la consulta NIP/GUS. Solo lectura. |
Organization Addresses_list
Herramientas
| organizationAddresses_list | Lista los registros de dirección de suscripción de la organización — la dirección asociada a la suscripción de Flowtly, y la fuente desde la que se renderiza el pie de correo {{organizationAddress}}. Normalmente es exactamente una fila. Esta NO es la dirección de vendedor de la factura, que vive en las claves de configuración organization-billing-* (configs_get) y es lo que leen las facturas y el KSeF; ambas se mantienen por separado y habitualmente no coinciden. Lee las dos antes de concluir cuál editó realmente un cliente. Solo lectura. |
Organizaciones_get
Herramientas
| organizations_get | Obtiene una organización por id. ADVERTENCIA: esto NO le indica a qué organización está conectado. Una conexión OAuth está fijada a exactamente una organización (vinculada al token), pero este endpoint devuelve cualquier organización de la que el USUARIO conectado sea miembro, así que una lectura exitosa aquí puede parecer confirmación de que está trabajando en esa organización cuando quizás no sea así. Para verificar el tenant en el que realmente está operando, lea datos con alcance de tenant en su lugar, como people_list o clients_list, y nunca inicie una escritura masiva basándose únicamente en esta llamada. |
Personas_get
Herramientas
| people_get | Obtén un registro de persona/empleado por id — nombres, correos, teléfono, responsable, y si está activo. |
Personas_list
Herramientas
| people_list | Lista personas/empleados. Filtra por isActive, reportsTo (el id de un responsable), projectMembers.project, o search; pagina con cursor. Personas y empleados comparten el mismo id, así que esta es la forma de resolver el id de employee que esperan las herramientas de horas trabajadas, responsabilidades, pertenencia a proyecto y permisos. |
Grupos de Permisos_get
Herramientas
| permissionGroups_get | Obtén un grupo de permisos por id, incluidas las cadenas ROLE_* que otorga. |
Grupos de Permisos_list
Herramientas
| permissionGroups_list | Lista los grupos de permisos de la organización y los roles que otorga cada uno; p. ej., el grupo "Business Owner" otorga ROLE_ADMIN. Lea esto antes de people_setPermissionGroups: los roles en la respuesta son la autoridad sobre lo que realmente permite un grupo, así que nunca tiene que adivinar por su nombre. |
Pipelines_get
Herramientas
| pipelines_get | Obtén un pipeline de ventas por id. |
Pipelines_list
Herramientas
| pipelines_list | Lista los pipelines de ventas. Un pipeline tiene un conjunto ordenado de etapas: léalas con stages_list filtrado por pipeline. |
Posiciones_list
Herramientas
| positions_list | Lista las posiciones: los roles con nombre (p. ej. "Backend Engineer") que cubre una asignación de proyecto. Sin filtros; Position tiene la paginación desactivada, así que esto siempre devuelve el catálogo completo de roles de la organización en una sola llamada. Cada elemento es {id, name, roles}. Úselo para obtener el nombre de posición detrás del positionId de una fila de allocations_list, y para encontrar el id de posición con el que debe coincidir una importación de asignación de recursos. |
Project Members_get
Herramientas
| projectMembers_get | Obtiene una pertenencia a proyecto por id — su employee, project y position. Los ids vienen de projectMembers_list o del array projectMembers de projects_get. |
Project Members_list
Herramientas
| projectMembers_list | Lista las pertenencias a proyecto — QUIÉN PUEDE VER QUÉ PROYECTO. Filtra por project (`/projects/{id}`) para leer el listado de un proyecto, o por employee para leer todos los proyectos a los que una persona puede acceder; cada fila lleva su propio id, el employee, el project y la position (employee|tech-lead|account-manager|viewer). Recurre a esto primero cuando alguien reporte que un proyecto falta en su lista de Proyectos o no puede registrar tiempo contra él: un listado vacío, o un listado sin esa persona, ES la explicación — la visibilidad es la pertenencia. También es la fuente de id para projectMembers_update y projectMembers_delete. Ten en cuenta que la misma persona puede aparecer varias veces en un proyecto, una por cada position. |
Projects_cost Allocations
Herramientas
| projects_costAllocations | Cómo se repartieron los costes SOBRE este proyecto — qué transacciones y líneas de factura se le atribuyeron, y en qué proporción. Úsalo para explicar una cifra de rentabilidad en lugar de solo citarla: aquí es donde un resultado inesperado se rastrea hasta el documento que lo causó. Requiere ROLE_TRANSACTIONS_MANAGER. Solo lectura. |
Projects_folder Counts
Herramientas
| projects_folderCounts | Cuántos proyectos hay en cada CARPETA de proyectos, como folderId + total + active. El folderId es un id de tagDefinition — resuelve los nombres con tagDefinitions_list y averigua qué grupos son grupos de carpetas con tagGroups_list (allowedRelations contiene "project"). Un folderId nulo es el grupo sin categorizar. Cuenta solo los proyectos raíz, ya que las carpetas agrupan raíces y las fases siguen a su padre. Solo lectura. |
Proyectos_get
Herramientas
| projects_get | Obtén un proyecto por id — nombre, tipo, cliente, fechas, descripción y precio. |
Proyectos_list
Herramientas
| projects_list | Lista proyectos. Filtra por type (fixed-price | time-and-material | non-billable | internal), client.name, employee, name, o rangos de dateFrom/dateTo. Úsalo para resolver el id de project que requieren las tareas, el registro de horas trabajadas, los presupuestos y los contratos. |
Projects_profitability
Herramientas
| projects_profitability | EL RESULTADO POR PROYECTO — lo que un proyecto generó frente a lo que costó. Este es el número que un negocio de servicios o desarrollo suele querer ver, y el que alimenta a todas las demás herramientas de proyecto. Pasa el id de proyecto de projects_list. Requiere ROLE_ACCOUNT_MANAGER. Solo lectura. |
Project Templates_get
Herramientas
| projectTemplates_get | Obtiene una plantilla de proyecto por id, incluyendo su documento structure completo. projectTemplates_list encuentra el id. Lee esto antes de projectTemplates_update — la structure se escribe COMPLETA, así que una actualización debe enviar el documento entero, no un fragmento. Solo lectura. |
Project Templates_list
Herramientas
| projectTemplates_list | Lista las plantillas de proyecto de la organización — planos reutilizables de un proyecto, sus fases, sus listas de tareas y sus tareas. Recurre a esto ANTES de projects_create cuando se configura repetidamente la misma forma de proyecto (un tipo de encargo, una auditoría, una incorporación): instanciar una plantilla construye todo el árbol en una llamada, mientras que projects_create crea un proyecto vacío que luego hay que rellenar a mano. La fila marcada isDefault es la plantilla integrada de la organización, aplicada a un proyecto creado sin elegir plantilla. Solo lectura. |
Candidatos de Solicitud de Recursos_get
Herramientas
| resourceRequestCandidates_get | Un candidato de contratación por id. El id proviene de resourceRequestCandidates_list. Requiere ROLE_HR_MANAGER. Solo lectura. |
Candidatos de Solicitud de Recursos_list
Herramientas
| resourceRequestCandidates_list | Los candidatos propuestos para las solicitudes de contratación: personas en un pipeline de contratación, no empleados disponibles para asignación. Filtre por el id de solicitud de resourceRequests_list. Requiere ROLE_HR_MANAGER. Solo lectura. |
Solicitudes de Recursos_get
Herramientas
| resourceRequests_get | Una solicitud de contratación por id, con su posición y estado. Obtenga el id de resourceRequests_list. Es RR. HH./contratación, no asignación de recursos. Requiere ROLE_HR_MANAGER. Solo lectura. |
Solicitudes de Recursos_list
Herramientas
| resourceRequests_list | Solicitudes de contratación abiertas: una solicitud para reclutar para una posición, en el dominio de RR. HH. A pesar del nombre, esto NO es demanda de asignación de recursos: es contratación. Devuelve la colección; resourceRequests_get lee una, y resourceRequestCandidates_list da las personas propuestas para ella. Requiere ROLE_HR_MANAGER. Solo lectura. |
Solicitudes de Asignación_list
Herramientas
| resourcingRequests_list | Solicitudes de asignación de recursos abiertas: alguien pidiendo que se asigne una persona a un proyecto, que es el lado de la demanda en la asignación de recursos. Este es el flujo que renderiza la vista de Solicitudes de la interfaz de Asignación de Recursos. NO lo confunda con resourceRequests_list: ese es CONTRATACIÓN de RR. HH. (contratar para una posición). Combínelo con resourcingRequestsHistory_list para lo que ya se ha decidido, y con resourcingBench_get para quién podría satisfacer una solicitud. Requiere el módulo de asignación de recursos y ROLE_RESOURCING_MANAGER. Solo lectura. |
Historial de Solicitudes de Asignación_list
Herramientas
| resourcingRequestsHistory_list | Lo que ya ha ocurrido con las solicitudes de asignación de recursos: el rastro de decisiones (confirmada, rechazada, modificada) detrás de las solicitudes abiertas en resourcingRequests_list. Recurra a esto para responder '¿ya se pidió esto y se rechazó?' antes de proponer de nuevo la misma asignación. Requiere el módulo de asignación de recursos y ROLE_RESOURCING_MANAGER. Solo lectura. |
Responsabilidades_get
Herramientas
| responsibilities_get | Obtén una responsabilidad por id. |
Responsabilidades_list
Herramientas
| responsibilities_list | Lista las responsabilidades dentro de un grupo RACI. Filtra por responsibilityGroup. Las responsabilidades pueden anidarse mediante parent; las personas se asignan a ellas a través de responsibilityEmployees, no directamente. |
Empleados de Responsabilidad_get
Herramientas
| responsibilityEmployees_get | Obtén una asignación de responsabilidad por id. |
Empleados de Responsabilidad_list
Herramientas
| responsibilityEmployees_list | Lista quién está asignado a qué responsabilidad, y en qué porcentaje. Filtra por employee para leer toda la carga RACI de una persona en todos los grupos. |
Grupos de Responsabilidad_get
Herramientas
| responsibilityGroups_get | Obtén un grupo de responsabilidad por id. |
Grupos de Responsabilidad_list
Herramientas
| responsibilityGroups_list | Lista los grupos de responsabilidad / áreas RACI — los elementos de nivel superior "Odpowiedzialności", cada uno con una persona responsable (accountable). Las responsabilidades individuales cuelgan de ellos. |
Empleados de Calendario_get
Herramientas
| scheduleEmployees_get | Una asignación de calendario a empleado por id. El id proviene de scheduleEmployees_list. Requiere ROLE_SCHEDULES_MANAGER. Solo lectura. |
Empleados de Calendario_list
Herramientas
| scheduleEmployees_list | Qué empleados están asignados a qué calendarios de horario laboral. Úselo para ir de un calendario (schedules_list) a sus personas, o para encontrar el calendario que sigue un empleado determinado. Requiere ROLE_SCHEDULES_MANAGER. Solo lectura. |
Plan de Calendario_list
Herramientas
| schedulePlan_list | Los calendarios vigentes en UNA fecha determinada: pase la fecha en la ruta. Recurra a esto para responder 'quién está trabajando hoy / en esta fecha' sin tener que leer cada calendario y resolver sus rangos usted mismo. A diferencia de las demás lecturas de calendario, esta solo requiere ROLE_USER, así que es la que está disponible para un empleado común. Solo lectura. |
Rangos de Calendario_get
Herramientas
| scheduleRanges_get | Un rango horario de calendario por id. El id proviene de scheduleRanges_list. Requiere ROLE_SCHEDULES_MANAGER. Solo lectura. |
Rangos de Calendario_list
Herramientas
| scheduleRanges_list | Los rangos horarios que componen los calendarios de horario laboral: las horas reales que cubre un calendario. Lea primero el padre con schedules_get; esto expande sus rangos. Requiere ROLE_SCHEDULES_MANAGER. Solo lectura. |
Calendarios_get
Herramientas
| schedules_get | Un calendario de horario laboral por id, con sus rangos y empleados asignados. El id proviene de schedules_list; scheduleRanges_list y scheduleEmployees_list leen sus partes. Requiere ROLE_SCHEDULES_MANAGER. Solo lectura. |
Calendarios_list
Herramientas
| schedules_list | Calendarios de horario laboral: los patrones de turnos/trabajo que define una organización, NO la asignación a proyectos. Use resourcingSchedule_get para saber quién está reservado en qué; use este para los patrones de trabajo en sí. schedules_get lee uno por id. Requiere ROLE_SCHEDULES_MANAGER. Solo lectura. |
Etapas_get
Herramientas
| stages_get | Obtén una etapa de negocio por id. |
Etapas_list
Herramientas
| stages_list | Lista las etapas de trato, en orden. Filtre por pipeline. deals_create requiere un id de etapa de aquí, y mover un trato entre etapas es lo que registra dealStageHistories. |
Proveedores_list
Herramientas
| suppliers_list | Lista proveedores/contratistas — se sirve desde /contractors, así que "supplier" y "contractor" son el mismo registro. Filtra por cyclic para proveedores recurrentes. Úsalo para resolver el supplier contra el que se archiva un coste, un contrato o una factura entrante. |
Definiciones de Etiquetas_list
Herramientas
| tagDefinitions_list | Lista las definiciones de etiquetas: las etiquetas que se pueden adjuntar a registros, cada una dentro de un grupo de etiquetas. tags_create toma un id de tagDefinition de aquí más el registro al que adjuntarla. |
Grupos de Etiquetas_list
Herramientas
| tagGroups_list | Lista los grupos de etiquetas — los contenedores que organizan las definiciones de etiqueta. |
Comentarios de Tarea_list
Herramientas
| taskComments_list | Lista los comentarios en tareas de proyecto, de la más antigua a la más reciente. Filtra por task para leer la discusión de una tarea. |
Listas de Tareas_list
Herramientas
| taskLists_list | Lista las listas de tareas: las columnas/secciones del tablero en las que se archivan las tareas. Filtre por project. tasks_create toma un id de lista de aquí. |
Tareas_get
Herramientas
| tasks_get | Obtén una tarea de proyecto por id — título, proyecto, estado, lista, asignados, fechas y recurrencia. |
Tareas_list
Herramientas
| tasks_list | Lista las tareas de proyecto. Filtre por project, list, status, assignees, isTemplate, o rangos de startAt/dueAt. Las tareas recurrentes exponen recurrenceParent y recurrenceRule, de modo que una ocurrencia generada se puede rastrear hasta la regla que la produjo. Para decidir si una tarea está TERMINADA, compare su status con taskStatuses_list (isClosed) en lugar de comparar por el nombre del estado. |
Estados de Tarea_list
Herramientas
| taskStatuses_list | Lista los estados de tarea de proyecto, en el orden del tablero. isClosed marca los estados de finalización e isDefault el estado que recibe una tarea nueva. Lee esto antes de interpretar el estado de una tarea — los nombres son configurables por la organización, así que "Done" no es una cadena fiable con la que comparar. |
Grupos de Impuestos_list
Herramientas
| taxGroups_list | Lista los grupos de impuestos. Úselo para obtener el id de taxGroup por el que filtra taxRules_list y que llevan las líneas de factura. |
Reglas de Impuestos_list
Herramientas
| taxRules_list | Lista las reglas fiscales — los tipos y los períodos a los que se aplican. Filtra por taxGroup. |
Transacciones_list
Herramientas
| transactions_list | Lista las transacciones bancarias — el feed bancario contra el que se concilian las facturas entrantes. Filtra por bankAccount, counterpartyRole, cost, ignored, hasDetectedProblems, un rango de orderDate/execDate, o amount.between. Ten en cuenta que orderDate y execDate son distintos: un pago se puede ordenar en un mes y ejecutarse en el siguiente. |
Transacciones_suggestions
Herramientas
| transactions_suggestions | Lee las propuestas de Flowtly para una transacción bancaria: contra qué contraparte, grupo de costos o documento debería archivarse. La imagen especular de incomingInvoices_suggestions, desde el lado del dinero. |
Tiempos de Trabajo_get
Herramientas
| workTimes_get | Obtén una entrada de horas trabajadas por id — fecha, minutos, proyecto, notas y el empleado al que pertenece. |
Tiempos de Trabajo_list
Herramientas
| workTimes_list | Lista las entradas de horas trabajadas (horas registradas). Filtra por rango de fechas (date.after / date.before, YYYY-MM-DD) y opcionalmente por employee o project; pagina con cursor. Cada fila lleva employeeId/employeeName y projectId/projectName, así que esta es la forma de exportar todas las horas registradas de un período. IMPORTANTE: los resultados a nivel de organización requieren ROLE_WORKING_HOURS_VIEWER. Sin ese rol, el backend NO da error — devuelve silenciosamente solo las entradas propias del usuario conectado, así que una exportación de "horas de todos" puede volver conteniendo a una sola persona y parecer perfectamente correcta. Si todas las filas pertenecen a un mismo empleado y no filtraste por employee, la respuesta lleva un scopeWarning que lo indica — muéstraselo al usuario en lugar de presentar el resultado como si fuera de toda la organización. |
Agreements_create
Herramientas
| agreements_create | Crea un acuerdo laboral para una persona. ESTE ES EL PASO QUE HACE QUE ALGUIEN ESTÉ ACTIVO: people_create solo crea el registro, y una persona sin acuerdo reporta isActive false para siempre — una importación masiva por tanto llega 100% inactiva hasta que esto se ejecute para cada una. DOS COSAS TIENEN QUE SER CIERTAS a la vez o se quedan inactivas sin ningún error: el `type` debe ser CALCULABLE (los integrados "agreement", "annex", "termination" lo son; "list-of-intent" y "work-experience" no), y la ventana dateFrom/dateTo debe cubrir hoy (pasa dateTo null para un contrato en curso en lugar de una fecha muy lejana). `employee` es un IRI — /people/<id> de people_list. Los tipos son extensibles por organización, así que ejecuta agreements_list sobre alguien ya activo para ver los códigos que esta organización realmente usa. Requiere ROLE_AGREEMENTS_MANAGER. Escritura. |
Agreements_update
Herramientas
| agreements_update | Modifica un acuerdo laboral existente — la forma en que un acuerdo se TERMINA, porque el backend no expone ningún delete sobre este recurso: pon `dateTo` en el último día que cubre y la persona deja de estar activa a partir de entonces, con el registro y su historial intactos. Ese es el movimiento correcto para una fila cercana a la nómina; no hay forma de hacer que una desaparezca y no debería haberla. También es la forma de corregir un `type`, `variant` o `positionName` erróneo en el sitio en lugar de apilar un segundo acuerdo sobre la persona — DOS acuerdos no se cancelan entre sí, el calculable la mantiene activa, así que "añadir uno correcto al lado" deja silenciosamente el erróneo en vigor. `amount`, `amountType` y `billingType` se aceptan pero la API nunca los devuelve, así que no puedes releer lo que escribiste. Requiere ROLE_AGREEMENTS_MANAGER. Escritura. |
Agreement Types_create
Herramientas
| agreementTypes_create | Añade un tipo de contrato a la lista de ESTA organización, para poder registrar un acuerdo contra algo que los cinco integrados no cubren — "Umowa zlecenie", "Kontrakt B2B", "Użytkownik funkcyjny". Esto es configuración, no un cambio de código: la lista es una tabla por tenant, y un tipo personalizado no necesita entrada de traducción porque su `name` se muestra tal cual en los siete locales. NO ENVÍES `id`: el código se genera como slug a partir del nombre en el servidor plegando los diacríticos ("Użytkownik funkcyjny" se convierte en "uzytkownik-funkcyjny"), y pasar un id se rechaza con 422 "Update is not allowed for this operation". Publica el name y lee el código asignado en la respuesta. `calculable` TIENE POR DEFECTO FALSE Y ES SILENCIOSO: decide quién cuenta como empleado — el banco de recursos, la acumulación de vacaciones, la base de costes y presupuesto — así que un tipo pensado para personas que NO deben acumular vacaciones ni ocupar un FTE es correcto en false, y un tipo pensado para empleo real DEBE ponerlo en true o todos los que lo tengan reportarán inactivo sin ningún error. Nada te dirá cuál obtuviste. `position` ordena el desplegable; `isActive` es true por defecto. No hay update ni delete por MCP a propósito — `agreement.type` almacena el id de esta fila como una cadena simple con… |
Attribute Sets_create
Herramientas
| attributeSets_create | Crea una categoría (name + relationName obligatorios; relationName es uno de property | project | budget | client, y para una categoría de activo es la cadena simple "property" — NO un IRI). icon opcional de una lista fija (room, parking, building, office, local, desk, monitor, etc.) que la UI muestra junto a la categoría. LISTA PRIMERO: los nombres no son únicos, así que un segundo "Mieszkanie" se acepta y divide silenciosamente la lista de Activos en dos. Requiere ROLE_ATTRIBUTES_MANAGER. Escritura. |
Attribute Sets_update
Herramientas
| attributeSets_update | Renombra una categoría, cambia su icon, o la mueve a otro relationName. Así es como una categoría creada con un error tipográfico se corrige en lugar de duplicarse. Requiere ROLE_ATTRIBUTES_MANAGER. Escritura. |
Attributes_create
Herramientas
| attributes_create | Crea una definición de atributo (name + type obligatorios; type es number | string | date | state | period). EL TYPE ES LA DECISIÓN: lo comparte cada entidad que lleve este atributo, así que un campo creado como `string` no podrá después sumarse ni ordenarse como número sin reescribir todos los valores existentes. Decídelo según los valores que realmente tienes, no el primero que veas. Una definición por sí sola no hace nada — vincúlala a una categoría con attributeSetAttributes_create, o nunca aparecerá en ningún sitio. Requiere ROLE_ATTRIBUTES_MANAGER. Escritura. |
Attributes_update
Herramientas
| attributes_update | Actualiza una definición de atributo — name, type, required, multiple, default o format. Cambiar `type` en una definición que ya tiene valores es la operación arriesgada: los valores existentes no se convierten. Requiere ROLE_ATTRIBUTES_MANAGER. Escritura. |
Attribute Set Attributes_create
Herramientas
| attributeSetAttributes_create | Vincula una definición de atributo a una categoría (attributeSet + attribute, ambos IRIs). ESTO ES LO QUE HACE QUE UN ATRIBUTO APAREZCA: sin el vínculo, un valor puede escribirse correctamente contra una entidad y nunca se mostrará en la UI — un fallo sin ningún síntoma. Requiere ROLE_ATTRIBUTES_MANAGER. Escritura. |
Attribute Set Attributes_delete
Herramientas
| attributeSetAttributes_delete | Desvincula un atributo de una categoría. La definición y cualquier valor sobreviven; simplemente dejan de mostrarse para esa categoría, lo que hace que esto parezca pérdida de datos cuando no lo es. Requiere ROLE_ATTRIBUTES_MANAGER. Escritura. |
Attribute Entity Values_create
Herramientas
| attributeEntityValues_create | Establece un valor de atributo en una entidad (attribute + value obligatorios). `relation` ES UN IRI — "/properties/7", no la palabra "property": el backend lo resuelve y deriva el nombre de la relación a partir de la clase del recurso, así que pasar un nombre simple lanza un error. (`relationId` acepta un id simple y sigue funcionando, pero está obsoleto en favor del IRI.) El atributo ya debe estar VINCULADO a la categoría de esa entidad o el valor se almacena y nunca se muestra. Requiere ROLE_ATTRIBUTES_MANAGER. Escritura. |
Attribute Entity Values_update
Herramientas
| attributeEntityValues_update | Cambia un valor de atributo en el sitio, por su id. Usa esto en lugar de crear un segundo valor para el mismo par (entidad, atributo) — nada impone unicidad, así que un duplicado se acepta y la UI muestra uno de ellos. Requiere ROLE_ATTRIBUTES_MANAGER. Escritura. |
Attribute Entity Values_delete
Herramientas
| attributeEntityValues_delete | Elimina un valor de atributo de una entidad. La definición y el vínculo sobreviven; solo desaparece el valor de esta entidad. Requiere ROLE_ATTRIBUTES_MANAGER. Escritura. |
Departments_create
Herramientas
| departments_create | Añade un departamento, para que las personas puedan archivarse bajo él. `name` es obligatorio (hasta 128 caracteres) y es ÚNICO en toda la organización; `code` es opcional (hasta 64) y TAMBIÉN es único — la forma corta que una organización ya usa en sus propias hojas de cálculo (CEO, TECH, PROC). `manager` es un IRI de empleado opcional de people_list. LISTA PRIMERO Y ESPERA COLISIONES: como tanto name como code son únicos, volver a publicar un departamento que ya existe FALLA en lugar de ser idempotente, así que una importación que asuma create-por-fila se detendrá la primera vez que encuentre un departamento que la organización ya tiene — normalmente uno que quedó de una prueba. Concilia esa fila con departments_update en lugar de crear alrededor de ella. NO HAY DELETE: el backend no expone ningún delete sobre un departamento, así que un name o code erróneo se corrige en el sitio con departments_update y nunca se elimina. Requiere ROLE_EMPLOYEES_MANAGER. Escritura. |
Departments_update
Herramientas
| departments_update | Renombra un departamento, dale un code, o establece su manager. Esta es la herramienta que hace posible una importación de departamentos, no solo conveniente: `name` y `code` son ambos únicos, así que un departamento que la organización ya tiene — la única fila "HR" que suele dejar una prueba de concepto — no puede crearse de nuevo, y la lista real se alcanza CORRIGIENDO esa fila en lugar de chocar con ella. Solo cambian los campos que envías, así que pasar solo `code` deja el name intacto. `id` es el id numérico de departments_list; `manager` es un IRI de empleado de people_list. NO HAY DELETE, lo que convierte esto en toda la historia de reparación: un departamento creado con un error tipográfico se corrige aquí, y uno que no debería existir solo puede renombrarse, no eliminarse. Requiere ROLE_EMPLOYEES_MANAGER. Escritura. |
Locations_create
Herramientas
| locations_create | Crea una ubicación (name obligatorio; officeOpenHour/officeCloseHour opcionales como segundos tras medianoche). Usa la dirección real en lugar de un nombre de proyecto o inversión — esto es lo que necesita alguien de pie frente al activo, y el nombre del proyecto ya se lleva en otro sitio. Requiere ROLE_LOCATIONS_MANAGER. Escritura. |
Locations_update
Herramientas
| locations_update | Renombra una ubicación o cambia su horario de oficina. Requiere ROLE_LOCATIONS_MANAGER. Escritura. |
Clients_import
Herramientas
| clients_import | Carga MUCHOS clientes en una llamada, indexados por `externalRef` — la herramienta para traer una lista de clientes o compradores desde otro sistema, donde clients_create supondría un viaje de ida y vuelta por persona. Las filas se concilian contra la organización: un externalRef desconocido crea, uno conocido actualiza en el sitio, una fila coincidente se omite, así que volver a ejecutarlo no cambia nada. La referencia se almacena como `externalPaymentCustomerId`, la única columna de referencia externa que tiene un cliente, y `clients_list` filtra por ella. NO relaciones clientes por nombre en su lugar — una lista de compradores está llena de apellidos compartidos y compras conjuntas. Cada resultado lleva `counterpartyId`, que es lo que necesitan contracts_import y contracts_create. Dos trampas que el esquema no puede expresar: un `tin` se RECHAZA sin un `tinCountry`, y una fila de contacto necesita un correo electrónico, así que un número de teléfono por sí solo no puede crear una. PASA dryRun:true PRIMERO en una carga real de incorporación. Máximo 500 filas. Requiere ROLE_CLIENTS_MANAGER. Escritura. |
Contracts_import
Herramientas
| contracts_import | Carga MUCHOS contratos en una llamada, indexados por `name` — el número de acuerdo. A diferencia de un cliente o un activo, un contrato NO tiene columna de referencia externa, así que el name ES la clave de idempotencia; un lote que contiene el mismo name dos veces se RECHAZA ENTERO en lugar de actualizar un contrato dos veces, porque un número duplicado significa que la fuente está mal. `counterpartyExternalRef` resuelve al comprador mediante la misma referencia que se le dio a clients_import, así que las dos se combinan: importa los clientes, luego los contratos, sin manejar nunca un id numérico de counterparty — una referencia que no coincide con ningún cliente falla esa fila en lugar de crear un contrato sin parte. `direction` es "out" (vendemos) o "in" (compramos); la columna no tiene restricción en el servidor, así que una palabra incorrecta se almacena y el contrato entonces no coincide con ningún filtro en ningún sitio. PASA dryRun:true PRIMERO. Máximo 500 filas. Requiere ROLE_CONTRACTS_MANAGER. Escritura. |
Assets_import
Herramientas
| assets_import | Carga MUCHOS activos en una llamada, indexados por `assetCode` — la herramienta para traer un inventario desde otro sistema, donde assets_create supondría un viaje de ida y vuelta por registro. Las filas se concilian contra la organización: un assetCode desconocido crea, uno conocido actualiza en el sitio, una fila coincidente se omite, así que volver a ejecutarlo no cambia nada y una ejecución a medio terminar es segura de repetir. `parentAssetCode` anida una fila bajo otra POR SU CÓDIGO, resuelto contra la organización y contra filas anteriores del mismo lote; un padre que nunca se resuelve falla esa fila en lugar de dejarla huérfana silenciosamente. TRES CAMPOS HACEN EL REGISTRO LEGIBLE en lugar de un nombre desnudo: `attributeSetName` es la categoría que la UI muestra como Typ zasobu y por la que agrupa la lista, `locationName` es dónde está físicamente la cosa, y `attributes` es un mapa {name: value} para área, planta, precio y cualquier otra cosa que lleve la fuente. Los tres se resuelven POR NOMBRE — la categoría, la ubicación, las definiciones de atributo y sus vínculos se encuentran o se crean por ti, así que quien llama nunca maneja uno de esos IRIs, y los nombres se comparan sin distinguir mayúsculas/minúsculas para que "Mieszkanie" y "mieszkanie " no puedan dividir la lista en dos. `attributes` necesita una categoría de la que colgar,… |
Assets_create
Herramientas
| assets_create | Crea un activo (name + status + bookingType obligatorios; status = in-stock | damaged | sold, bookingType = minutes | days | single-days | permanently). bookingType es obligatorio incluso cuando el activo nunca se reserva — pasa "permanently" para algo que no se presta, y deja bookingAllowed en false. Dos campos llevan la estructura: `parent` anida un activo bajo otro (una unidad bajo un edificio, un monitor bajo un escritorio), y `attributeSet` fija la categoría por la que agrupa la lista de Activos, que también es donde viven atributos personalizados como área o planta. `assetCode` es un identificador único entre sistemas — úsalo para guardar el id que tiene este activo en el sistema de origen del que se importó, así una reimportación actualiza en lugar de duplicar. Requiere ROLE_PROPERTIES_MANAGER. Escritura. |
Assets_update
Herramientas
| assets_update | Actualiza un activo por id — name, status, categoría, parent, assetCode, número de serie, fechas, ubicación o ajustes de reserva. Así es como un activo pasa de in-stock a sold. Ten en cuenta que el vocabulario de status es in-stock | damaged | sold y NO tiene estado reserved, así que una retención hay que modelarla de otra forma. Requiere ROLE_PROPERTIES_MANAGER. Escritura. |
Asset Meters_update
Herramientas
| assetMeters_update | Actualiza un contador de activo — su label, tipo de suministro, unidad, o estado active. Úsalo para retirar un contador de la medición (por ejemplo, un suministro que ahora se factura directamente desde la factura) sin eliminar su historial de lecturas. Requiere ROLE_PROPERTIES_MANAGER. Escritura. |
Asset Bookings_create
Herramientas
| assetBookings_create | Asigna un activo a una persona o a un proyecto. `property` es el IRI del activo (/assets/{id}) y es obligatorio. Nombra al titular de UNA de tres formas: `relation` con un único IRI (/people/{id} para una persona, /projects/{id} para un proyecto), o `relationName` (employee | project) más `relationId`, o el campo IRI `employee` / `project` directamente. Debe resolverse exactamente un titular — no nombrar a ninguno se rechaza con "Employee or Project must be set." y nombrar a ambos con "Employee and Project cannot be set at the same time." DOS COSAS QUE NO ESTÁN EN EL ESQUEMA Y TE DARÁN 422: el activo ya debe ser reservable (`bookingAllowed: true` — fíjalo con assets_update), una regla de negocio impuesta para TODO el que llama, incluido un manager, rechazada con "This asset is not reservable."; y el propio `bookingType` del activo (minutes | days | single-days | permanently) es lo que da sentido a `duration` / `endDate` — un espacio dedicado a una persona indefinidamente es `permanently` con un `startDate` y sin fin. Las reservas concurrentes sobre un activo se serializan en el servidor, así que un solape se rechaza en lugar de reservarse dos veces. Requiere ROLE_PROPERTY_BOOKINGS_MANAGER para reservar en nombre de otra persona. Escritura. |
Asset Bookings_update
Herramientas
| assetBookings_update | Actualiza una reserva de activo existente — sus fechas, duration, importe/moneda de facturación, o su parte de consumo medido. `relationName` y `relationId` son obligatorios en el payload, así que envía el titular que ya tiene la reserva salvo que la estés moviendo deliberadamente. Para terminar una asignación usa assetBookings_cancel, no un endDate en el pasado. Requiere ROLE_PROPERTY_BOOKINGS_MANAGER. Escritura. |
Asset Bookings_cancel
Herramientas
| assetBookings_cancel | Libera un activo — la forma en que termina una asignación, y lo más parecido a un delete que tiene este recurso (no hay operación de delete). Toma el id de la reserva y un `cancelReason` de 3 a 255 caracteres; la reserva se conserva y se marca con `cancelledAt` para que el historial sobreviva, y el activo queda libre para el siguiente titular. Esta es la llamada a hacer cuando un empleado se va: assetBookings_list filtrado por `employee` encuentra lo que tiene, y esto libera cada uno. Requiere ROLE_PROPERTY_BOOKINGS_MANAGER. Escritura. |
Tiempos de Trabajo_log
Herramientas
| workTimes_log | Registra una entrada de tiempo de trabajo para el usuario de Flowtly conectado (date, durationMinutes, project, notes). LA NOTA DEBE SUPERAR LA COMPROBACIÓN DE DESCRIPCIÓN POBRE del servidor, que una carga retroactiva por lotes encuentra repetidamente: necesita O BIEN unos 32 caracteres (el mínimo exacto es un ajuste por organización, y una organización puede ponerlo en 0 para desactivar la comprobación) O BIEN una referencia de ticket "#" O BIEN un enlace http(s) — cualquiera de los tres basta. "Flowtly – Scallier" se rechaza; "Flowtly – Scallier #FLOW-123" no. El 422 nombra el propertyPath `description`, que es el nombre en el servidor para el campo que esta herramienta llama `notes`. Escritura. |
Tareas_create
Herramientas
| tasks_create | Crea una tarea de proyecto (title + project obligatorios; status, list, assignees, dueAt, priority opcionales). Escritura. |
Tareas_update
Herramientas
| tasks_update | Actualiza una tarea de proyecto por id — cambia status (incl. marcar como hecha), assignees, dueAt, title, etc., o MUEVE la tarea a otro proyecto pasando `project` (reasignación de padre; la lista de tareas se limpia salvo que también nombres una `list` en el proyecto de destino, porque una lista pertenece a un solo proyecto). Escritura. |
Comentarios de Tarea_create
Herramientas
| taskComments_create | Añade un comentario a una tarea de proyecto (id de task + content). Escritura. |
Proveedores_create
Herramientas
| suppliers_create | Crea un nuevo registro de proveedor/contratista (name, tinType, costGroup obligatorios). Escritura. |
Proveedores_update
Herramientas
| suppliers_update | Actualiza los datos de un proveedor/contratista (name, NIF, condiciones de pago, etc.) por id. Escritura. |
Personas_create
Herramientas
| people_create | Crea un registro de persona/empleado (firstname + lastname obligatorios; companyEmail, contactEmail, contactPhone opcionales). Escritura. |
Personas_update
Herramientas
| people_update | Actualiza un registro de persona/empleado por id (name, companyEmail, contactEmail, contactPhone, etc.). Escritura. |
Personas_delete
Herramientas
| people_delete | Elimina un registro de empleado/persona por id (por ejemplo, para quitar un empleado de marcador de posición/ficticio). Requiere ROLE_EMPLOYEES_MANAGER; el backend ejecuta un procesador de borrado que también desvincula los registros relacionados. Alto impacto, irreversible. Escritura. |
Grupos de Costos_create
Herramientas
| costGroups_create | Crea un grupo de costes / centro de coste (name + type obligatorios). Escritura. |
Grupos de Costos_update
Herramientas
| costGroups_update | Actualiza el nombre o el tipo de un grupo de costes / centro de coste por id. Escritura. |
Grupos de Etiquetas_create
Herramientas
| tagGroups_create | Crea un grupo de etiquetas (nombre obligatorio) para organizar definiciones de etiquetas relacionadas. También es así como se crea un contenedor de CARPETA DE PROYECTOS: pasa allowedRelations: ["project"] y las definiciones del grupo se convierten en carpetas en la lista de proyectos. Un grupo con allowedRelations vacío es universal y NO se trata como carpeta. Escritura. |
Definiciones de Etiquetas_create
Herramientas
| tagDefinitions_create | Crea una definición de etiqueta (name, level, tagGroup obligatorios) dentro de un grupo de etiquetas. Cuando el allowedRelations del grupo contiene "project", cada definición aquí ES una carpeta de proyectos — esta es la herramienta que la crea. Escritura. |
Clientes_create
Herramientas
| clients_create | Crea un nuevo registro de cliente (name, country, currency, status, tinType obligatorios). Escritura. |
Clientes_update
Herramientas
| clients_update | Actualiza un registro de cliente por id. Escritura. |
Contactos de Cliente_create
Herramientas
| clientContacts_create | Crea una persona de contacto para un cliente (client, type, name, email obligatorios). Escritura. |
Cuentas Bancarias_create
Herramientas
| bankAccounts_create | Crea una cuenta bancaria (type, name, currency, defaultImportFormat obligatorios). Escritura. |
Cuentas Bancarias_update
Herramientas
| bankAccounts_update | Actualiza una cuenta bancaria por id. Escritura. |
Banks_create
Herramientas
| banks_create | Crea un banco — la institución a la que pertenece una cuenta bancaria, no la cuenta en sí (eso es bankAccounts_create). Escritura. |
Banks_update
Herramientas
| banks_update | Actualiza un banco por id. Así es también como se oculta y se muestra de nuevo un banco: pon `hidden` en true para retirarlo de los selectores sin eliminarlo, en false para recuperarlo. No hay una herramienta de archivo separada porque la API no tiene ninguna acción de archivo para un banco — el flag es el mecanismo. Escritura. |
Cuentas Bancarias de Contraparte_create
Herramientas
| counterpartyBankAccounts_create | Adjunta una cuenta bancaria a una contraparte (counterparty + accountNumber). Escritura. |
Contratos_create
Herramientas
| contracts_create | Crea un contrato. Escritura. |
Contratos_update
Herramientas
| contracts_update | Actualiza un contrato por id. Escritura. |
Contratos_delete
Herramientas
| contracts_delete | Elimina un contrato por id. Escritura. |
Grupos de Impuestos_create
Herramientas
| taxGroups_create | Crea un grupo fiscal (name + type obligatorios). Escritura. |
Grupos de Impuestos_update
Herramientas
| taxGroups_update | Actualiza el nombre o el tipo de un grupo fiscal por id. Escritura. |
Reglas de Impuestos_create
Herramientas
| taxRules_create | Crea una regla fiscal. Escritura. |
Reglas de Impuestos_update
Herramientas
| taxRules_update | Actualiza una regla fiscal por id. Escritura. |
Configuraciones_update
Herramientas
| configs_update | Actualiza un valor de configuración de la organización por id (type + name obligatorios; el backend aplica los permisos por clave de configuración). Escritura. |
Organization Addresses_update
Herramientas
| organizationAddresses_update | Actualiza el registro de dirección de SUSCRIPCIÓN de la organización (id obligatorio; envía solo los campos que estás cambiando). ESTE ES EL REGISTRO DESDE EL QUE SE RENDERIZA EL PIE DE CORREO: el {{organizationAddress}} del pie se compone como "street, postCode city" a partir de aquí, NO de las claves de configuración organization-billing-* que usan las facturas y el KSeF como dirección del vendedor. Los dos almacenes se desincronizan, y que el pie lea este es un defecto conocido — así que cuando una firma muestra una dirección que el cliente jura haber corregido, corrigió las claves de facturación y este es el registro que todavía tiene el valor antiguo. `street` es una única columna de texto libre que también debe llevar el número de edificio: la consulta NIP/GUS solo rellena el nombre de la calle y descarta silenciosamente el número de edificio y de piso, por eso las direcciones aquí se leen como "ul. Example" sin número. Escribe el "ul. Example 8/12" completo para repararlo. LEE PRIMERO con organizationAddresses_list y compara contra configs_get en organization-billing-street antes de escribir, para copiar el valor que el propio cliente mantiene en lugar de inventar uno. Requiere ROLE_BILLINGS_MANAGER. Escritura. |
Grupos de Permisos_create
Herramientas
| permissionGroups_create | Crea un grupo de permisos (name obligatorio; roles = lista de cadenas ROLE_* que otorga). Escritura. |
Grupos de Permisos_update
Herramientas
| permissionGroups_update | Actualiza el nombre, la descripción o los roles otorgados de un grupo de permisos por id. Escritura. |
People_invite
Herramientas
| people_invite | Da a una persona existente un LOGIN: crea una invitación de organización pendiente y se la envía por correo, en el idioma de UI configurado en la organización. Este es el paso que people_create y people_setPermissionGroups NO hacen — una persona con grupos de permisos aún no puede iniciar sesión hasta que se le invita y acepta. Requiere el email de la persona; falla si ya tiene un login. Orden de incorporación: people_create (registro) -> people_invite (login) -> people_setPermissionGroups (derechos). Escritura. |
Personas_Establecer Grupos de Permisos
Herramientas
| people_setPermissionGroups | Establece (reemplaza) el conjunto COMPLETO de grupos de permisos de una persona mediante ids numéricos de grupo (ver permissionGroups_list — p. ej. el grupo "Business Owner" concede ROLE_ADMIN): pasa cada grupo con el que debe terminar, y [] los elimina todos. Concede acceso; NO crea un login ni envía correo a la persona — eso es people_invite. LA TRAMPA: darle a alguien su PRIMER grupo lo mueve al modelo calculado, donde los roles vienen de grupos y de overrides por persona, y un rol concedido a mano fuera de ese modelo desaparece en la misma llamada — un ROLE_ADMIN entregado a una persona es exactamente el tipo que esto elimina. También funciona al revés: quitarle su último grupo la saca de nuevo de ese modelo y hace reaparecer esos roles antiguos. Las listas overridesAdded/overridesRemoved no dicen nada de todo esto; describen overrides y permanecen vacías mientras cambia el acceso efectivo. Así que la respuesta reporta la diferencia entre los roles que tenía la persona antes de esta llamada y después de ella, como rolesLost y rolesGained — ese es el par a leer una vez vuelve la llamada. rolesLost null (no []) significa que la instantánea tomada antes de la escritura no pudo leerse y el delta es DESCONOCIDO, con la razón en roleDeltaUnavailable: el… |
People_set Role Overrides
Herramientas
| people_setRoleOverrides | Establece (reemplaza) los roles que UNA persona obtiene por encima de — o le son quitados de — sus grupos de permisos. Recurre primero a un grupo (people_setPermissionGroups): los grupos son la abstracción prevista y escalan a más de una persona, así que usa un override solo donde una persona concreta difiere genuinamente de todos los grupos. REEMPLAZA ambas listas por completo, así que lee primero people_getPermissions y devuelve cada override que deba conservar; omitir una lista la vacía. Los roles son constantes ROLE_ — permissionGroups_list muestra las que esta organización ya usa. Un rol presente tanto en added como en removed se rechaza en lugar de adivinarse. Devuelve la misma instantánea resuelta que people_getPermissions, así que puedes confirmar el resultado sin una segunda llamada. NO crea un login — ver people_invite. Requiere ROLE_ROLES_MANAGER. Escritura. |
Holiday Days Limits_create
Herramientas
| holidayDaysLimits_create | Concede a una persona una asignación de un tipo de vacaciones, con efecto desde una fecha. `seconds`, NO días (#3763): un día de 8h son 28800, así que 21 días son 604800 y un saldo de horas extra de 2h30 son 9000 — una cifra que no tenía cabida mientras esto se almacenaba en días enteros. `employee` y `holidayType` son IRIs (los proporcionan people_list y holidayTypes_list); `variant` es el tipo de contrato al que pertenece la asignación (uop, b2b, uz, uod). Para CORREGIR un saldo existente, añade una fila con un dateFrom posterior en lugar de editar la antigua — la fila en vigor es la más reciente cuyo dateFrom ya ha llegado, así que el historial se mantiene intacto y una corrección puede introducirse antes de que entre en vigor. (employee, holidayType, variant, dateFrom) es único, así que volver a publicar el mismo día no reemplaza nada y falla. Requiere ROLE_HOLIDAYS_MANAGER. Escritura. |
Holiday Days Limits_update
Herramientas
| holidayDaysLimits_update | Corrige una fila que se introdujo mal — un error tipográfico en el amount, el variant equivocado. Los importes están en SEGUNDOS (#3763). Esto NO es la forma de registrar un saldo que CAMBIA con el tiempo: para eso, crea con holidayDaysLimits_create una fila nueva con un dateFrom posterior, lo que conserva cuál era el saldo anterior y cuándo. Editar en el sitio reescribe el historial y hace irrecuperable la cifra antigua. holidayDaysLimits_list encuentra el id. Requiere ROLE_HOLIDAYS_MANAGER. Escritura. |
Holiday Requests_cancel
Herramientas
| holidayRequests_cancel | Cancela una solicitud de vacaciones — úsalo para eliminar una solicitud que nunca debería tramitarse, como una fila dejada por una prueba, un test, o alguien que se ha ido. DOS COSAS QUE SORPRENDEN A LA GENTE. (1) NO ELIMINA LA FILA: el backend pone status en `canceled` en lugar de eliminar la fila. PERO UNA SOLICITUD CANCELADA DESAPARECE DE holidayRequests_list — verificado en producción: después ni la lista sin filtrar ni status=canceled la devuelven. Así que no puedes releer lo que cancelaste y no hay deshacer a través del MCP; asegúrate del id antes de llamar. (2) NO ES LO MISMO QUE RECHAZAR. Rechazar registra una decisión — escribe una entrada en el registro de aprobaciones que te nombra a ti y ENVÍA UN CORREO AL EMPLEADO diciendo que se le denegó la vacación — mientras que cancelar solo notifica a RR. HH., y solo cuando `notify-hr-managers-of-leave-activity` está activado para la organización. Para una fila que nunca fue una solicitud genuina, cancelar es la opción más honesta y discreta. SOLO FUNCIONA EN UNA SOLICITUD PENDIENTE (`requested`) cuando no eres su propietario: una solicitud aceptada ya ha producido un Holiday que esto no elimina, así que cancelar una dejaría una ausencia reservada detrás de una solicitud que lee `canceled`. Requiere ROLE_HOLIDAYS_MANAGER para alguien… |
Holidays_create
Herramientas
| holidays_create | Registra vacaciones que una persona realmente está tomando — la ausencia reservada en sí, no el derecho (holidayDaysLimits_create) ni una solicitud pendiente (las solicitudes de vacaciones, que todavía necesitan aprobación). Lo que esto escribe es tiempo libre ya acordado, así que aparece en holidays_list de inmediato y no necesita ningún paso de aprobación. `employee` es un IRI de people_list; `type` es un id de holidayTypes_list. `dateFrom`/`dateTo` inclusivos, y una llamada cubre un rango entero en lugar de una fila por día. Dos cosas muerden: un tipo cuyo `descriptionRequired` es true (lee primero holidayTypes_list — `vacations` habitualmente lo es) RECHAZA una creación sin `description`; y `pick-up-day` es tiempo ya debido, así que NO consume la asignación anual como sí hace `vacations` — registrar un día devuelto por un festivo en sábado como `vacations` se come silenciosamente un día del derecho de alguien. Comprueba holidays_list para la misma persona y fechas antes de crear: este endpoint registrará con gusto la misma ausencia dos veces. CADA CREACIÓN ENVÍA UN CORREO AL EMPLEADO, a su propia dirección de empresa, para decir que se añadió la ausencia — así que cargar un año de historial que alguien ya vivió le llega a su bandeja de entrada fila por fila, y para el personal que… |
Holidays_delete
Herramientas
| holidays_delete | Elimina directamente una ausencia reservada — la fila se borra, a diferencia de holidayRequests_cancel, que solo cambia el status de una solicitud. Úsalo para eliminar ausencias que nunca deberían haber contado: filas de demo o de prueba dejadas por un ensayo, o filas huérfanas cuando su empleado fue eliminado (people_delete desvincula las ausencias en lugar de eliminarlas, así que sobreviven con un nombre de empleado vacío). ESTO MUEVE NÚMEROS REALES: una ausencia reservada es `payrollEligible` y consume el derecho de la persona, así que eliminar una cambia su saldo de vacaciones — lo correcto al limpiar datos de prueba, y un fallo de pérdida de datos cuando la fila era real. Sin deshacer, sin notificación. Lee primero holidays_list y asegúrate de que la fila no es historial real: una description en el idioma propio de la organización, o fechas que coinciden con una ausencia real, normalmente significa que lo es. Requiere ROLE_HOLIDAYS_MANAGER. Escritura. |
Holiday Types_create
Herramientas
| holidayTypes_create | Añade un tipo de vacaciones que la organización aún no ofrece — un año sabático, cuidado infantil no remunerado, un día de formación — para que puedan reservarse ausencias contra él con holidays_create y concederse una asignación con holidayDaysLimits_create. `name` (3–64 caracteres) es lo que la gente elige al reservar; `color` e `icon` son cómo se lee en el calendario; `reducesWorkingTime` en false marca tiempo libre que NO reduce las horas esperadas del mes; y `descriptionRequired` en true hace que el tipo exija una razón, que holidays_create luego impone — ver esa herramienta para lo que rechaza. `status` es `active` por defecto, así que un tipo creado sin pensarlo se ofrece a todo el mundo de inmediato. LEE holidayTypes_list PRIMERO: los tipos son de toda la organización, y NO HAY DELETE — un name duplicado o mal escrito solo puede volver a ocultarse poniendo status en inactive con holidayTypes_update, y mientras tanto conserva cada ausencia reservada contra él. Requiere ROLE_HOLIDAYS_MANAGER. Escritura. |
Holiday Types_update
Herramientas
| holidayTypes_update | Cambia un tipo de vacaciones, y sobre todo REACTIVA UNO. `status` alterna entre `active` e `inactive`, y un tipo inactive es rechazado por holidays_create — así que registrar vacaciones históricas contra un tipo que la organización ha retirado desde entonces empieza aquí, y esto es lo que desbloquea una importación de historial de vacaciones en lugar de enviar a alguien a la UI de la app. DESACTIVAR NO ES ELIMINAR, y no hay delete: las ausencias ya reservadas mantienen un tipo inactive y se siguen leyendo con él en holidays_list, así que inactive solo significa "no ofrecido para nuevas reservas". LA TRAMPA QUE SE DERIVA DE ESTO: reactivar `vacations` para cargar las ausencias del año pasado, olvidarse de volver a ponerlo en `inactive`, y no solo has terminado una importación — has cambiado lo que la organización ofrece hoy, porque cada empleado que reserve vacaciones ahora vuelve a ver ese tipo en la lista. Vuelve a ponerlo en la misma sesión en la que importaste. `descriptionRequired` también alcanza a holidays_create, que rechaza una reserva sin description una vez activado; activarlo deja intactas las ausencias ya registradas. `id` es el id de cadena de holidayTypes_list (`vacations`, `not-paid`), y solo cambian los campos que envías. Requiere ROLE_HOLIDAYS_MANAGER. Escritura. |
Proyectos_create
Herramientas
| projects_create | Crea un proyecto (name + type obligatorios; type = fixed-price|time-and-material|non-billable|internal; dateFrom/dateTo, client, publicDescription, notes, priceNet opcionales). Escritura. |
Proyectos_update
Herramientas
| projects_update | Actualiza un proyecto por id (name, type, fechas, descripción, etc.). Escritura. |
Project Members_create
Herramientas
| projectMembers_create | Pone a una persona EN un proyecto (employee + project IRIs obligatorios, p. ej. "/people/204" y "/projects/243"; position opcional = employee|tech-lead|account-manager|viewer, por defecto employee). ESTO ES EL CONTROL DE ACCESO, no una etiqueta: una persona que no es miembro no ve el proyecto en absoluto — falta en su lista de Proyectos y no puede registrar tiempo contra él — así que esta es la herramienta que restaura a alguien bloqueado fuera de un proyecto. POSITION NO ES COSMÉTICO: un usuario que tiene un rol con alcance de proyecto solo ve los proyectos donde su position de membresía coincide con él — ROLE_PROJECTS_LEAD coincide con tech-lead, ROLE_PROJECTS_VIEWER coincide con viewer — así que darle a un jefe de proyecto una fila `employee` lo deja tan ciego como no tener ninguna fila. La membresía NO se propaga en cascada: poner a alguien en una carpeta padre no le da nada en los proyectos de debajo, así que un árbol de carpetas necesita una llamada por proyecto. La clave única es (employee, project, position), lo que significa que las positions se apilan en lugar de reemplazarse — una persona puede tener employee Y tech-lead en el mismo proyecto como dos filas separadas, y añadir tech-lead a alguien que ya es employee ahí no elimina ni mejora la fila employee (usa… |
Project Members_update
Herramientas
| projectMembers_update | Cambia la position de una membresía existente por id (employee|tech-lead|account-manager|viewer) — obtén el id de projectMembers_list o del array projectMembers de projects_get. Usa esto para ascender o descender EN EL SITIO; usa projectMembers_create para añadir una segunda position adicional junto a la que ya se tiene. Cambiar una position puede REVOCAR la visibilidad del proyecto a alguien cuyo rol tiene alcance de proyecto (un ROLE_PROJECTS_LEAD degradado de tech-lead a employee deja de verlo). No puede mover una membresía a otra persona o proyecto — para eso, elimina y vuelve a crear. Requiere ROLE_PROJECTS_MANAGER. Escritura. |
Project Members_delete
Herramientas
| projectMembers_delete | Saca a una persona DE un proyecto por id de membresía — encuéntralo con projectMembers_list o en el array projectMembers de projects_get. Esto REVOCA EL ACCESO: una vez que desaparece la última fila de membresía de esa persona en ese proyecto, el proyecto desaparece de su vista y ya no puede registrar tiempo contra él, que es exactamente cómo un proyecto desaparece silenciosamente para alguien. Las horas ya registradas NO se eliminan y permanecen en el proyecto; la persona simplemente ya no puede verlas ni añadir a ellas. Eliminar una position deja intacta cualquier otra position que la misma persona tenga en el mismo proyecto. Requiere ROLE_PROJECTS_MANAGER. Irreversible (recrear crea una fila nueva y vuelve a notificar), de alto impacto. Escritura. |
Project Templates_create
Herramientas
| projectTemplates_create | Crea un plano de proyecto reutilizable a partir de un documento structure (version, project, phases, y sus lists/tasks). Los desplazamientos dentro de él son RELATIVOS — startOffsetDays y durationDays se cuentan en días desde el startDate dado en el momento de instanciar, así que una plantilla sirve para cada inicio futuro. El project.name en la structure es un marcador de posición; sobrescríbelo por cliente al instanciar. La structure se valida en el servidor contra el esquema de su version declarada, y una infracción nombra el JSON pointer responsable. Escritura. |
Project Templates_update
Herramientas
| projectTemplates_update | Actualiza una plantilla de proyecto por id. La columna structure se almacena y se reemplaza COMPLETA, nunca se combina — envía el documento entero o las partes que omitas desaparecen. Lee primero la actual con projectTemplates_get. Cambiar una plantilla NO afecta a los proyectos ya instanciados a partir de ella; no hay propagación hacia atrás. Escritura. |
Project Templates_delete
Herramientas
| projectTemplates_delete | Elimina una plantilla de proyecto por id. Eliminación suave (soft delete), y NO afecta a los proyectos ya creados a partir de la plantilla — esos son proyectos normales y siguen existiendo. Escritura. |
Project Templates_instantiate
Herramientas
| projectTemplates_instantiate | Construye un proyecto real a partir de una plantilla — el proyecto, sus fases, sus listas de tareas y cada tarea, en UNA llamada atómica. startDate es obligatorio y es el ancla contra la que se resuelve cada startOffsetDays de la plantilla. Pasa name para sobrescribir el nombre de proyecto marcador de posición de la plantilla, y client para asociar el nuevo proyecto a un cliente: instanciar dos veces contra el MISMO cliente es cómo un cliente acaba teniendo varios encargos, cada uno su propio proyecto. Devuelve el proyecto creado. Escritura. |
Projects_archive
Herramientas
| projects_archive | Archiva un proyecto por id — la forma de retirar un proyecto que no se puede eliminar porque tiene tiempo registrado, facturas o presupuestos asociados. Reversible con projects_unarchive. Preferible a retrasar dateTo, que solo hace que el proyecto parezca terminado. Escritura. |
Projects_unarchive
Herramientas
| projects_unarchive | Restaura un proyecto archivado por id, deshaciendo projects_archive. Escritura. |
Grupos de Responsabilidad_create
Herramientas
| responsibilityGroups_create | Crea un grupo de responsabilidades / área RACI (name obligatorio; description y responsibleEmployee opcionales = la persona responsable, indicada como un id de empleado simple como 6 (de people_list) o el IRI /people/6). Este es el elemento de nivel superior 'Odpowiedzialności'. Añada responsabilidades individuales debajo mediante responsibilities_create. Escritura. |
Grupos de Responsabilidad_update
Herramientas
| responsibilityGroups_update | Actualiza un grupo de responsabilidad por id (name, description, responsibleEmployee = id de empleado o IRI). Escritura. |
Responsabilidades_create
Herramientas
| responsibilities_create | Crea una responsabilidad dentro de un grupo (responsibilityGroup = id o IRI del grupo, + name, obligatorios; description opcional; parent opcional = el IRI de otra responsabilidad para anidar). Asigne personas mediante responsibilityEmployees_create. Escritura. |
Responsabilidades_update
Herramientas
| responsibilities_update | Actualiza una responsabilidad por id (name, description, parent, responsibilityGroup = id de grupo o IRI). Escritura. |
Empleados de Responsabilidad_create
Herramientas
| responsibilityEmployees_create | Asigna un empleado a una responsabilidad (responsibility = id de responsabilidad o IRI, employee = id de empleado o IRI, percentage 0-100, todos obligatorios; targets y description opcionales). Escritura. |
Empleados de Responsabilidad_update
Herramientas
| responsibilityEmployees_update | Actualiza una asignación de responsabilidad por id (percentage, targets, description). Escritura. |
Empleados de Responsabilidad_delete
Herramientas
| responsibilityEmployees_delete | Elimina la asignación de un empleado a una responsabilidad por id. Escritura. |
Prospectos_create
Herramientas
| leads_create | Crea un lead (objetivo de prospección saliente/entrante; companyName, source, owner, linked client opcionales). Un lead nuevo siempre tiene status=open — status no se puede fijar aquí, y solo se mueve mediante leads_convert, leads_lose y leads_reopen. Escritura. |
Prospectos_update
Herramientas
| leads_update | Actualiza un lead por id (company, website, source, owner, linked client, stage, doNotContact). NO status ni lostReason: esos son rechazados por la entidad y silenciosamente ignorados por este endpoint, así que cerrar un lead necesita leads_lose (con un lostReasonId) y deshacerlo necesita leads_reopen. Mover `stage` avanza por el embudo; no cierra el lead. Escritura. |
Prospectos_delete
Herramientas
| leads_delete | Elimina un lead por id (borrado lógico). Escritura. |
Prospectos_convert
Herramientas
| leads_convert | Convierte un lead cualificado en un Client + un contacto por cada lead-contact + un Deal abierto. Requiere un cliente existente (el client del lead o un clientId en el cuerpo). Escritura. |
Leads_lose
Herramientas
| leads_lose | Cierra un lead como PERDIDO — pone status=lost y marca closedAt. REQUIERE lostReasonId, el `id` de una entrada de leadLostReasons (ejecuta primero leadLostReasons_list; es una lista de selección, así que el texto libre se rechaza con 422). Esta es la ÚNICA forma de registrar un lead como perdido: leads_update ignora status, y doNotContact significa "no contactar nunca más", que es una afirmación distinta y mucho más fuerte que "no ganamos este". NO mueve el stage del lead — LeadStage no tiene flag terminal, así que el lead conserva su posición en el embudo y leads_reopen puede restaurarlo exactamente. Escritura. |
Leads_reopen
Herramientas
| leads_reopen | Deshace leads_lose — vuelve a poner status en open y limpia closedAt y el lost reason. El stage no se toca, así que el lead retoma exactamente donde estaba. Recurre a esto cuando un lead se cerró contra el registro equivocado o el prospecto volvió. Escritura. |
Actividades de Prospecto_create
Herramientas
| leadActivities_create | Registra UN contacto de captación en un prospecto: una invitación enviada, una invitación aceptada, un mensaje, una respuesta, una llamada, un seguimiento (lead + type + occurredAt obligatorios; channel, contact, body opcionales). AQUÍ es donde pertenece el historial de contactos de un prospecto: un crmNote es un comentario libre, una activity es el registro de contactos estructurado y filtrable que renderiza la cronología de la cola de prospección. NO narre contactos dentro de una nota. type: invite_sent | invite_accepted | message_sent | reply_received | call | meeting | follow_up | …; channel: linkedin | email | phone | …. Escritura. |
Actividades de Prospecto_update
Herramientas
| leadActivities_update | Actualiza una actividad de captación registrada por id (type, channel, occurredAt, body). Escritura. |
Actividades de Prospecto_delete
Herramientas
| leadActivities_delete | Elimina una actividad de captación registrada por id. Escritura. |
Contactos de Prospecto_create
Herramientas
| leadContacts_create | Añade una persona de contacto a un prospecto (lead + name obligatorios; email, phone, role, linkedinUrl, isPrimary opcionales). La URL de LinkedIn de un contacto pertenece a linkedinUrl, NO a un crmNote. Escritura. |
Contactos de Prospecto_update
Herramientas
| leadContacts_update | Actualiza un contacto de prospecto por id, p. ej. establezca linkedinUrl / email / phone una vez que los encuentre. Escritura. |
Contactos de Prospecto_delete
Herramientas
| leadContacts_delete | Elimina un contacto de lead por id. Escritura. |
Tratos_create
Herramientas
| deals_create | Crea un deal/oportunidad. Obligatorio: title, stage (de stages_list), y un ANCLA — al menos uno de client o lead. Un deal sin ninguno se rechaza con 422 "A deal must reference a client or a lead.", así que ancla un prospecto del que no tienes registro de cliente a su lead (`/leads/<id>` de leads_list) en lugar de inventar un cliente; pasa client (`/clients/<id>` de clients_list) cuando ya exista uno. Se permite fijar ambos. Opcional: amountMinor, currency, expectedCloseDate, owner, contact. Crear directamente en un stage ganado requiere además client — un deal solo con lead no puede ganarse. Escritura. |
Tratos_update
Herramientas
| deals_update | Actualiza un deal por id (title, stage, amountMinor, currency, expectedCloseDate, owner, contact, client, lead). Mover el stage se registra automáticamente. La regla de ancla de deals_create sigue aplicándose al resultado, así que no puedes vaciar el único client o lead que tiene un deal — primero cambia por otro. Mover un deal a un stage ganado requiere client: asocia aquí al cliente (o ejecuta leads_convert) antes de ganar un deal solo con lead. Escritura. |
Tratos_delete
Herramientas
| deals_delete | Elimina un negocio por id (borrado lógico). Escritura. |
Tratos_win
Herramientas
| deals_win | Marca un deal como ganado — lo mueve a un stage ganado y lo marca como cerrado; contractId opcional vincula un contrato existente. CARGA RETROACTIVA DE UNA VICTORIA HISTÓRICA: pasa closedAt opcional (ISO-8601, p. ej. "2026-05-07" o una marca de tiempo completa) para registrar la fecha en que REALMENTE se cerró. Omítelo y el servidor marca ahora, lo que mete un deal antiguo en la cifra de "ganados este mes" de este mes — así que fíjalo siempre que estés introduciendo un deal que se cerró antes de hoy. No puede estar en el futuro (422), y SÍ puede ser anterior al propio createdAt del deal: un deal creado hoy y cerrado en mayo es la forma normal de una carga retroactiva correcta, no un error. El deal YA debe referenciar a un client: ganar un deal solo con lead se rechaza con 422 "Attach a customer before marking this deal Won.", porque no hay cliente al que facturar. Convierte el lead en uno con leads_convert, o fija client con deals_update, y luego gana. Escritura. |
Tratos_lose
Herramientas
| deals_lose | Marca un deal como perdido — requiere lostReasonId (de dealLostReasons_list); lostReasonNote opcional. CARGA RETROACTIVA DE UNA PÉRDIDA HISTÓRICA: pasa closedAt opcional (ISO-8601) para registrar la fecha en que REALMENTE se cerró, exactamente igual que deals_win. Omítelo y el servidor marca ahora. No puede estar en el futuro (422), y puede ser anterior al createdAt del deal. Escritura. |
Tratos_reopen
Herramientas
| deals_reopen | Reabre un negocio ganado/perdido y lo vuelve a dejar abierto. Escritura. |
Listas de Prospectos_create
Herramientas
| leadLists_create | Crea una lista de prospección saliente (name obligatorio). Escritura. |
Listas de Prospectos_update
Herramientas
| leadLists_update | Actualiza una lista saliente por id. Escritura. |
Listas de Prospectos_delete
Herramientas
| leadLists_delete | Elimina una lista saliente por id. Escritura. |
Membresías de Lista de Prospectos_create
Herramientas
| leadListMemberships_create | Añade un lead a una lista saliente (list + lead obligatorios; status opcional). Cualquier lastContactedAt que pases es una instantánea que nada avanzará después — registra también el contacto como una actividad de lead, o quedará imposible de consultar. Escritura. |
Membresías de Lista de Prospectos_update
Herramientas
| leadListMemberships_update | Actualiza la membresía de un lead en una lista — p. ej. fija el status de contacto (contacted/replied/bounced). status y lastContactedAt los mantiene quien llama: lo que escribes permanece hasta que alguien vuelva a escribir, y registrar actividades de lead NO los actualiza. Escritura. |
Membresías de Lista de Prospectos_delete
Herramientas
| leadListMemberships_delete | Elimina un lead de una lista saliente. Escritura. |
Work Times_update
Herramientas
| workTimes_update | Corrige una entrada de tiempo de trabajo registrada por id — su date, minutes, project o description. Así es como una entrada mal archivada se MUEVE entre proyectos: workTimes_log solo crea, así que sin esto un project equivocado o un error tipográfico en la description es permanente. Lee primero la entrada con workTimes_get. Se aplica la misma comprobación de descripción pobre que en workTimes_log: aproximadamente 32 caracteres — el mínimo es un ajuste por organización y puede ser 0, lo que la desactiva — O BIEN una referencia de ticket "#" O BIEN un enlace http(s), cualquiera de los tres. Escritura. |
Work Times_delete
Herramientas
| workTimes_delete | Elimina una entrada de tiempo de trabajo registrada por id. Para un duplicado o una entrada registrada contra trabajo que nunca ocurrió — prefiere workTimes_update cuando la entrada es real pero incorrecta, para que las horas permanezcan en el registro en lugar de desaparecer de él. Las horas registradas alimentan las finanzas y la utilización del proyecto, así que un delete cambia silenciosamente los números reportados de un periodo pasado. Escritura. |
Payment Schedule Lines_import
Herramientas
| paymentScheduleLines_import | Carga el plan de cuotas completo de un contrato en una llamada, en lugar de un viaje de ida y vuelta por línea. Construido para contratos de promotor, que se pagan en tramos de construcción — una sola venta son de seis a doce cuotas, y un registro de ellas son cientos. Cada fila nombra su contrato POR NOMBRE (para un contrato de promotor importado, su número de acuerdo), una fecha de vencimiento, y un importe en UNIDADES MENORES — grosze, así que 5 300,00 es "530000" y "5300" registra silenciosamente 53,00. Las filas se concilian contra las líneas ya presentes por contract+date+amount+note, así que una línea desconocida se crea, una idéntica se omite, y volver a ejecutar el mismo lote no cambia nada; PaymentScheduleLine no tiene columna de referencia externa, así que esa clave natural es la clave de conciliación. Una fila cuyo nombre de contrato no coincide con nada, o coincide con MÁS de un contrato, se reporta como fallida en lugar de asociarse a una suposición — poner una cuota en el contrato equivocado falsea dos flujos de caja a la vez. Pasa dryRun:true primero en una carga real. Máximo 1000 filas. Escritura. |
Payment Schedule Lines_create
Herramientas
| paymentScheduleLines_create | Añade una cuota al calendario de pagos de un contrato — el plan de lo que se espera facturar o pagar, y cuándo. Pasa el IRI del contrato, una fecha y un importe. Esto es lo que resuelve el problema de calendario de pagos ausente que reporta contracts_get en un contrato no cíclico: una tarifa única también tiene un calendario, simplemente es una única línea por el importe entero en el día en que vence. En los contratos cíclicos no se comprueba, porque el sistema no genera líneas automáticamente a partir de una cadencia. EL IMPORTE ESTÁ EN UNIDADES MENORES — grosze, no złote: 5 300,00 es "530000", y "5300" registra silenciosamente una línea de 53,00. La API las devuelve de la misma forma, así que relee una con contracts_paymentScheduleLines si no estás seguro de la escala. Relee el resultado con contracts_paymentScheduleLines. Escritura. |
Payment Schedule Lines_update
Herramientas
| paymentScheduleLines_update | Cambia una línea del calendario de pagos por id — su date, amount o note. Úsalo cuando una cuota se retrasa o se renegocia, en lugar de eliminar y recrear, para que la línea conserve cualquier factura ya asociada a ella. EL IMPORTE ESTÁ EN UNIDADES MENORES — grosze, no złote: 5 300,00 es "530000", y "5300" registra silenciosamente una línea de 53,00. La API las devuelve de la misma forma, así que relee una con contracts_paymentScheduleLines si no estás seguro de la escala. Escritura. |
Payment Schedule Lines_delete
Herramientas
| paymentScheduleLines_delete | Elimina una línea del calendario de pagos por id. Elimina el PLAN, no el dinero: una factura o transacción ya asociada a la línea no se ve afectada, pero deja de conciliarse contra nada. Prefiere paymentScheduleLines_update para una cuota que se ha movido. Escritura. |
Notas de CRM_create
Herramientas
| crmNotes_create | Añade una nota a un lead o a un negocio (body + exactamente uno de lead/deal). El autor es el usuario conectado. Escritura. |
Notas de CRM_update
Herramientas
| crmNotes_update | Actualiza el contenido de una nota de CRM por id. Escritura. |
Notas de CRM_delete
Herramientas
| crmNotes_delete | Elimina una nota de CRM por id. Escritura. |
Logo de la Organización_upload
Herramientas
| organizationLogo_upload | Sube/reemplaza el logo de la organización (imagen en base64 + contentType + filename). Lea el actual mediante configs_get organization-logo-url. Escritura. |
Icono de la Organización_upload
Herramientas
| organizationIcon_upload | Sube/reemplaza el icono/favicon de la organización (imagen en base64 + contentType + filename). Lea el actual mediante configs_get organization-icon-url. Escritura. |
Storage_upload
Herramientas
| storage_upload | Adjunta un archivo a cualquier registro que acepte el almacenamiento genérico de Flowtly — un ACTIVO (relationName "property"), un proyecto, una tarea, un cliente, una ubicación, un contratista, una factura, un registro de RR. HH. Esta es la única ruta hacia una FOTO de activo: subir con relationName "property" fija la imagen que la app muestra para ese activo (servida como `file` en el payload del activo). Property no tiene columna de imagen -- la foto se deriva de esta tabla en tiempo de lectura, por eso nada en la entidad sugiere que existe. Es UN único slot y gana la subida más reciente, así que una segunda imagen reemplaza a la primera en lugar de añadirse a una galería; ambas filas siguen listadas bajo /assets/{id}/documents. Lo mismo aplica a location, invoices y transaction-attachments; clients, agreements y candidates en cambio acumulan cada subida bajo `files`; el resto solo aparecen en su ruta /documents. `file` se omite de las respuestas de LIST salvo que la petición pase ?include=file, así que relee un registro para confirmar que la foto llegó. Pasa relationName + relationId (el id de la herramienta de lista de ese registro; se acepta y se reduce un IRI /assets/7) más los bytes en base64 con un contentType y un filename. LÍMITE DE TAMAÑO: los bytes viajan como base64 dentro… |
Storage_create Upload Ticket
Herramientas
| storage_createUploadTicket | Genera un ticket de un solo uso y corta duración para adjuntar un archivo GRANDE a cualquier registro — la forma en que realmente entran las FOTOS de activo, ya que una imagen siempre supera el techo de base64. En property/location/invoices/transaction-attachments, la subida más reciente se convierte en la imagen visible del registro, reemplazando a la anterior; en clients/agreements/candidates las subidas se acumulan. Usa esto en lugar de storage_upload siempre que el archivo tenga más de unas pocas decenas de KB: esa herramienta lleva los bytes como base64, que quien llama tiene que emitir como texto, y un JPEG de 400 KB se convierte en ~533 K caracteres base64, muy por encima de lo que cabe en una respuesta. Pasa relationName + relationId más un filename; obtienes a cambio un uploadUrl y un curl listo para ejecutar. Luego envía los BYTES EN BRUTO del archivo a esa URL (curl --data-binary @photo.jpg) — no base64, no multipart — y la respuesta lleva el registro Storage creado. El ticket expira en 15 minutos, funciona una vez, y solo puede archivar contra el único registro que nombra. Escritura. |
Contract Attachments_create
Herramientas
| contractAttachments_create | Adjunta un documento a un contrato — normalmente el PDF ejecutado, o un anexo (DPA, SLA, anexo de precios) archivado junto a él. Pasa los bytes en base64 con un fileName y el id de contrato de contracts_list; `contractId` aquí es un id simple, a diferencia de los IRIs que toma contracts_update para counterparty y project, aunque se acepta y se recorta un IRI /contracts/<id> completo. LÍMITE DE TAMAÑO: los bytes viajan como base64 dentro de esta llamada, así que todo el documento tiene que caber en una respuesta del modelo — mantenlo por debajo de aproximadamente 150 KB, y para cualquier cosa mayor usa en su lugar contractAttachments_createUploadTicket, que está construido exactamente para esto y no tiene ese techo. Un contrato ejecutado con una tarjeta de firma suele superar eso ampliamente (673.617 bytes se convierten en 898.156 caracteres base64, varias veces lo que puede llevar una respuesta), y no vuelve ningún error cuando no cabe, porque la llamada no puede emitirse en absoluto — la petición nunca llega al servidor, así que comprueba el tamaño del archivo ANTES de empezar en lugar de descubrirlo al fallar. Esto es lo que resuelve el problema de documento ausente que reporta contracts_get, así que un contrato mantenido a través de la API deja de quedarse en la cola de pendientes de la app. Un documento firmado puede respaldar… |
Contract Attachments_create Upload Ticket
Herramientas
| contractAttachments_createUploadTicket | Genera un ticket de un solo uso y corta duración para adjuntar un documento GRANDE a un contrato — el PDF ejecutado, o un anexo. Usa esto en lugar de contractAttachments_create siempre que el archivo tenga más de unas pocas decenas de KB: esa herramienta lleva los bytes como base64, que quien llama tiene que emitir como texto, y un contrato firmado real (~700 KB, ~900 K caracteres base64) está muy por encima de lo que cabe en una respuesta. Pasa el id de contrato de contracts_list más un fileName; obtienes a cambio un uploadUrl y un curl listo para ejecutar. Luego envía los BYTES EN BRUTO del archivo a esa URL (curl --data-binary @file.pdf) — no base64, no multipart — y la respuesta es el adjunto creado. El ticket expira en 15 minutos, funciona una vez, y solo puede adjuntarse al único contrato que nombra. Esto es lo que resuelve el problema de documento ausente que reporta contracts_get. Escritura. |
Facturas Entrantes_create
Herramientas
| incomingInvoices_create | Archiva una factura entrante (de proveedor) o un documento de respaldo en contabilidad: pase los bytes en base64 con un fileName y receivedAt. Flowtly le aplica OCR y sugiere un proveedor y una transacción bancaria coincidente. El archivo se identifica con la huella externalId 'upload_sha256:<sha256 de los bytes>': para evitar un duplicado, calcule el hash de los bytes y compruebe incomingInvoices_list en busca de ese externalId ANTES de subirlo. Escritura. |
Facturas_export
Herramientas
| invoices_export | Inicia una exportación en zip de las facturas EMITIDAS de un período (from/to, ambos AAAA-MM-DD, inclusive) filtrado por FECHA DE VENTA, no la fecha de emisión ni de creación. Solo se incluyen las facturas EMITIDAS; los borradores y las facturas no enviadas se excluyen, pero las correcciones SÍ se incluyen. El parámetro opcional client restringe a un solo cliente (id o IRI de clients_list). Máximo 200 facturas por exportación; si el período tiene más, redúzcalo (p. ej. exporte un mes a la vez); un período con 0 facturas emitidas también se rechaza. Esta llamada solo pone la tarea en cola (renderizar un mes puede tardar minutos): NO devuelve un enlace de descarga. Consulte invoices_exportStatus con el exportId devuelto hasta que indique "ready". Escritura. |
Facturas_Estado de Exportación
Herramientas
| invoices_exportStatus | Consulta el estado de una exportación en zip iniciada por invoices_export, mediante exportId. Cuando status es "ready", la respuesta incluye downloadUrl (un enlace firmado de corta duración; expira en 1 hora, vea expiresAt), filename, y byteSize; los bytes del archivo nunca se devuelven a través de esta herramienta. Si status es "failed", failureReason explica por qué. |
Facturas_import
Herramientas
| invoices_import | Registra en la organización una factura de venta (saliente) YA EMITIDA — para traer el historial de facturas al hacer la incorporación. El número de factura externo que pasas se conserva tal cual, el comprador se resuelve por su identificación fiscal (se crea si no existe), y la factura llega como emitida SIN renderizar un PDF, enviar correo al cliente, ni presentarla al KSeF. Importar un número que ya existe es una operación sin efecto que reporta la factura existente, así que una importación masiva es segura de volver a ejecutar — pero esa garantía solo vale para llamadas secuenciales; dos importaciones genuinamente concurrentes del mismo número pueden ambas llegar a completarse. Pasa expectedGrossTotal (el bruto impreso en el documento de origen) y la importación se rechaza si no coincide con el total calculado a partir de las filas. buyer.tin es obligatorio — el comprador nunca se relaciona por nombre. Usa invoices_create, no esta, para emitir una factura nueva genuina. Escritura. Pasa dryRun:true para PREVISUALIZAR sin escribir — reporta would-create / would-skip y no crea ninguna factura ni ningún cliente; ejecuta primero en seco una carga retroactiva histórica y comprueba los recuentos antes de ejecutarla de verdad. |
Transacciones de Factura_create
Herramientas
| invoiceTransactions_create | Registra un pago contra una factura saliente (de venta). `invoice` es un IRI de factura de invoices_list; `date` es la fecha en que se considera realizado el pago. `transaction` es opcional: omítalo para registrar la liquidación sin línea bancaria, que es lo que se desea para facturas históricas cuyo extracto bancario nunca se importó. `amount` es opcional y por defecto toma el importe pendiente de la factura. Registrar un pago es lo que evita que una factura emitida y vencida se trate como impagada, y por lo tanto también evita que se pongan en cola recordatorios de pago para ella. Nada impide registrar dos pagos contra una misma factura, así que lea invoices_get primero si no está seguro de si ya está liquidada. Escritura. |
Transacciones de Factura_update
Herramientas
| invoiceTransactions_update | Actualiza un registro de pago de factura existente por id (del invoiceTransactions de invoices_get, o paginando invoiceTransactions). El uso más común: apuntar un pago registrado sin línea bancaria a una transacción que acaba de importar mediante transactions_importStatement, estableciendo `transaction` en un IRI/id de transacción de transactions_list. LA TRAMPA: esto es un PATCH, pero el backend sigue requiriendo `invoice` y `date` en cada llamada; NO fusiona los valores existentes por usted. Lea primero el registro (o ya téngalo de la llamada de creación) y reenvíe su `invoice` y `date` sin cambios junto con lo que realmente quiera modificar, o la actualización se rechaza. `transaction` acepta null para desvincular un pago de una línea bancaria. `amount` es opcional. Escritura. |
Invoice Transactions_delete
Herramientas
| invoiceTransactions_delete | Elimina un registro de pago de una factura por id — los ids se leen en invoiceTransactions de invoices_get. Esto quita EL REGISTRO DE QUE UNA FACTURA FUE PAGADA, no una transacción bancaria: úsalo cuando una factura arrastra un pago que nunca debió existir, siendo el caso habitual el mismo pago contabilizado dos veces — una a mano y otra por la importación del extracto que luego lo concilió. Consulta primero invoices_get y elimina el registro cuya `transaction` es la equivocada (conserva el que apunta a la línea bancaria importada real); eliminar el último pago que queda deja la factura de nuevo impagada, lo que vuelve a activar sus recordatorios de pago. Requiere ROLE_INVOICES_MANAGER. Irreversible, de alto impacto. Escritura. |
Invoices_create
Herramientas
| invoices_create | Emite una NUEVA factura de venta (saliente) — la herramienta para facturar a un cliente por primera vez. No la confundas con sus dos vecinas: invoices_import archiva retroactivamente una factura que YA se emitió en otro sitio (historial de incorporación), e incomingInvoices_create registra el documento de COSTE de un proveedor. La factura llega SIN ENVIAR: status se deriva de las filas de registro de la factura y una factura recién creada no tiene ninguna, así que nada se renderiza, se envía por correo, ni se presenta al KSeF con esta llamada — trata el resultado como un borrador a revisar antes de emitir. `name` es el número de factura y lo eliges tú (máximo 32 caracteres) — lee primero invoices_list y sigue la serie existente de la organización en lugar de inventar una, porque nada aquí te asigna el siguiente número. Obligatorio: name, type ("invoice"), tinType, issueDate, saleDate, dueDate. Pasa `client` (IRI de clients_list) y, para una reserva que se concilie más tarde, `contract` (IRI de contracts_list) para que la factura aparezca bajo ese contrato. Las líneas van en `invoiceRows` — precio unitario neto, cantidad y un tipo de impuesto por fila; los totales se calculan a partir de las filas, no se pasan directamente. `bankAccount` (de bankAccounts_list) elige la cuenta impresa en el documento, y `currency`… |
Invoices_update
Herramientas
| invoices_update | Corrige una factura de venta (saliente) por id, antes o después de emitirla. El uso habitual es arreglar un borrador creado por invoices_create — una fecha equivocada, una fila equivocada, un enlace de contrato ausente — en lugar de eliminarlo y volver a crearlo, lo que quemaría un número de factura. Lee primero invoices_get: esto es un PATCH sobre un documento cuyos totales se derivan de sus filas, así que reemplazar `invoiceRows` reemplaza el conjunto entero, y una factura que ya se ha enviado no se "desenviará" sola porque la hayas editado. Escritura. |
Facturas Entrantes_Aplicar Sugerencia
Herramientas
| incomingInvoices_applySuggestion | Acepta una de las propias sugerencias de Flowtly sobre una factura entrante: las mismas propuestas que ve una persona en la aplicación (coincidencia de proveedor, grupo de costos, transacción bancaria coincidente, advertencia de duplicado). Léalas primero con incomingInvoices_suggestions, luego aplique una por su id. Prefiera esto en lugar de adivinar: el emparejador de Flowtly, no el agente, decide qué es plausible. Escritura. |
Facturas Entrantes_Aceptar Todas las Sugerencias
Herramientas
| incomingInvoices_acceptAllSuggestions | Acepta todas las sugerencias pendientes de una factura entrante en una sola llamada — lo mismo que hace una persona con el botón "aceptar todo" de la aplicación. El servidor aplica, reconstruye, y vuelve a aplicar hasta que no aparece nada nuevo: la coincidencia de transacción NO existe hasta que se aplican el proveedor y el importe, así que un solo pase dejaría el documento sin adjuntar. Devuelve un informe (qué se aplicó, qué se rechazó y por qué, y la transacción contra la que terminó archivado). Pasa dryRun para previsualizar sin escribir. Nunca acepta supplier_create ni un aviso de duplicado. Escritura. |
Facturas Entrantes_Verificar Facturas Electrónicas
Herramientas
| incomingInvoices_checkEInvoices | Trae a la organización cualquier factura electrónica nueva de KSeF: lo mismo que hace el botón "Sprawdź e-faktury" de la aplicación. Llame a esto antes de concluir que falta la factura de un proveedor: sin ello no puede distinguir "el proveedor nunca la envió" de "nuestra sincronización aún no se ha ejecutado". Devuelve el resultado en cuanto la obtención queda en cola; vuelva a leer incomingInvoices_list después para ver qué llegó. Escritura. |
Asignación de Recursos_Importar Cronograma
Herramientas
| resourcing_importTimeline | Importa una hoja de cronograma de asignación de recursos (obténgala mediante el MCP de Drive, pase su CSV literalmente). Esto es un espejo de REEMPLAZO COMPLETO de las filas de Allocation de la organización para `year`: las filas de la hoja se crean/actualizan, y cualquier fila existente de ese año ausente en la hoja se ELIMINA; no es una fusión. SIMULACIÓN POR DEFECTO: un dryRun omitido previsualiza y no escribe nada; pase dryRun:false para aplicar. El informe da `created` / `replaced` más `unmatchedPeople` / `unmatchedProjects`. DOS COSAS SON FÁCILES DE PASAR POR ALTO: una fila de la hoja cuyo proyecto no se resuelve se OMITE mientras la llamada sigue informando éxito, así que un resultado en verde puede ocultar una importación parcial; y un código de rol que el catálogo de posiciones no tiene todavía se CREA como una posición nueva en lugar de rechazarse; vea `createdPositions`. Ambos casos se señalan en `warnings` cuando ocurren; comunique eso al usuario en lugar de informar solo `created`. Una hoja que se analiza a cero filas se rechaza (se parece exactamente a una mala lectura a punto de borrar todo el cronograma) a menos que pase force:true. Lea allocations_list después para ver qué quedó registrado. Alto impacto. Escritura. |
Transacciones_Importar Extracto
Herramientas
| transactions_importStatement | Importa un archivo de extracto bancario (p. ej. un archivo .sta de MT940): pase el contenido de texto sin procesar de cada archivo literalmente (NO en base64) con un filename. NO HAY parámetro bankAccount: el backend enruta un archivo eliminando todos los caracteres no numéricos de los números de las cuentas bancarias y de los bytes del archivo, e importa en cada cuenta cuyos dígitos aparezcan en cualquier parte del archivo, así que un archivo puede llegar a varias cuentas, y un extracto de una cuenta que no está configurada en Flowtly (o cuyo número está registrado de forma distinta a como lo escribe el banco) no se importa en ninguna, fallando con un error que explica exactamente por qué: lea ese mensaje, es el único diagnóstico que da este endpoint. En caso de éxito la respuesta es `{ imported, matching }`: `matching: "in_progress"` significa que la conciliación de contraparte/adjunto para las filas nuevas todavía se está ejecutando después de que esta llamada devuelva, así que un transactions_list inmediato puede mostrar filas aún sin conciliar; vuelva a leer un poco más tarde para el estado final. Volver a importar el mismo extracto no crea filas duplicadas; el importador reconoce las transacciones que ya ha visto. Una vez que un extracto está registrado, apunte un pago existente sin línea bancaria a una de sus filas con… |
Transactions_delete
Herramientas
| transactions_delete | Elimina una transacción bancaria por id — encuéntrala con transactions_list. Recurre a esto SOLO para deshacer un error contable que no se pueda corregir de otro modo: un extracto importado en la cuenta bancaria equivocada, o filas introducidas a mano antes de que llegara el extracto real y ahora duplicadas por él. Una transacción es el registro de lo que hizo el banco, así que eliminar una en una cuenta importada hace que el libro mayor deje de concordar con el banco; el backend solo lo permite a ROLE_ADMIN (un gestor de transacciones únicamente puede eliminar en cuentas de caja y manuales). ANTES de eliminar un supuesto duplicado, demuestra el par: haz coincidir la fila importada por importe Y número de factura Y contraparte, no solo por importe — un cobro que llegó después de la fecha de fin del extracto no tiene contrapartida, y eliminarlo destruye el único registro de ese ingreso. El backend DESVINCULA en lugar de eliminar lo que cuelga de ella: los pagos de facturas sobreviven con su línea bancaria vaciada (reasígnalos con invoiceTransactions_update), los adjuntos y los inmuebles se desvinculan, mientras que las filas de transacción de proyecto y de empleado se eliminan con ella. Irreversible, de alto impacto. Escritura. |
Organización_whoami
Herramientas
| organization_whoami | Devuelve la organización a la que está vinculada esta conexión MCP: { orgId, name, slug, userId }. Llámelo para confirmar en QUÉ tenant está a punto de escribir antes de cualquier create/update: la conexión está fijada a exactamente una organización por el token, y escribir prospectos/registros en la organización equivocada es un incidente real. Solo lectura. |
Datos Reales de Asignación_get
Herramientas
| resourcingActuals_get | Horas reportadas frente al plan, por persona y por semana, en una ventana from/to: la pregunta '¿el equipo realmente sigue el plan?', que NINGUNA otra herramienta de asignación de recursos responde: las asignaciones indican lo PLANIFICADO, esta indica lo ENTREGADO. Devuelve columnas de semana más una fila por persona (porcentaje planificado, porcentaje reportado, varianza, totales, y un desglose por proyecto). reportedPercent nulo significa 'sin contrato esa semana' y 0 significa 'existía un contrato y no se reportó nada'; NO confunda ambos. Pase financials para obtener ingresos/costo/margen, que se omiten en caso contrario. Requiere el módulo de asignación de recursos y ROLE_RESOURCING_MANAGER. Solo lectura. |
Banco de Recursos_get
Herramientas
| resourcingBench_get | Quién NO tiene carga de trabajo en una ventana from/to: el banco de recursos. Recurra a esto cuando le pregunten a quién asignar a un proyecto nuevo o dónde hay capacidad sin usar; resourcingActuals_get indica cuán cargadas están las personas, este indica quién no tiene carga en absoluto. NO SABE NADA DE AUSENCIAS: freePercent es 100 menos las asignaciones confirmadas, nada más, así que alguien con tres semanas de vacaciones aprobadas aparece como 100% libre y ningún campo de la respuesta indica lo contrario. Responder 'quién está disponible' basándose solo en esto pondrá a personas en proyectos mientras están de baja: verifique con holidays_active o holidays_list. Requiere el módulo de asignación de recursos. Solo lectura. |
Calendario de Asignación_get
Herramientas
| resourcingSchedule_get | El calendario de asignación de recursos planificado en una ventana from/to: la cronología de asignaciones tal como la muestra el planificador. Úselo para lo que está RESERVADO de cara al futuro; use resourcingActuals_get para lo que realmente se reportó frente a ello. Requiere el módulo de asignación de recursos y ROLE_RESOURCING_MANAGER. Solo lectura. |
People_get Permissions
Herramientas
| people_getPermissions | Lo que una persona puede hacer realmente, resuelto: sus grupos de permisos (cada uno con los roles que concede), sus overrides por persona, y los effectiveRoles en los que se combinan ambos. LA forma de comprobar si un cambio de acceso surtió efecto — people_list muestra un campo roles, pero esta es la herramienta que explica POR QUÉ tiene esos roles y qué palanca mover para cambiarlo. Recurre a ella antes de cada llamada a people_setRoleOverrides, porque esa herramienta reemplaza las listas de overrides por completo y aquí es donde lees las actuales. staleOverrides son overrides eliminados que ya no coinciden con ningún rol concedido por grupo, así que actualmente no hacen nada. people_list proporciona el id. Requiere ROLE_ROLES_MANAGER para ver a cualquiera que no seas tú mismo. Solo lectura. |
Prospectos_Importación Masiva
Herramientas
| leads_bulkImport | Importa muchos prospectos en UNA sola llamada, cada uno con sus contactos, membresía de lista y actividades de captación anidadas: el servidor crea el prospecto y luego enlaza su id en los elementos hijos, así que nunca tiene que manejar IRIs intermedios. Idempotente por claves naturales (companyName / email / (list,lead) / (type,occurredAt,contact)): es seguro repetir la ejecución y dividir en lotes (≤100 prospectos por llamada). Esta es la vía masiva que debe usar una importación de campaña en lugar de N llamadas a leads_create. Escritura. |
Lead Activities_by List
Herramientas
| leadActivities_byList | Toda la actividad de leads de una CAMPAÑA (una lista de leads), en una llamada — pasa el id, IRI, o nombre exacto de la lista. leadActivities_list filtra por un único lead, así que el reporte a nivel de campaña costaría de otro modo una llamada por miembro (302 para una lista como PZFD); esto en cambio resuelve los miembros de la lista y lee sus actividades en lotes acotados. Combínalo con type y occurredAt.after/.before para obtener los recuentos que la gente realmente pide: tasa de respuesta (type=reply_received), tasa de rebote (type=bounced), cobertura de envío (type=message_sent). Devuelve listId, listName, leadCount, y las actividades combinadas ordenadas por occurredAt. Una lista desconocida es un ERROR, no un resultado vacío — así que un nombre mal escrito no puede leerse como "esta campaña no tuvo actividad". Los ids vienen de leadLists_list. Solo lectura. |
Lead Activities_bulk Import
Herramientas
| leadActivities_bulkImport | Registra una tanda saliente completa — cada mensaje que realmente enviaste — en UNA llamada, en lugar de un leadActivities_create por mensaje. Pasa un array; cada fila nombra su lead (leadCompanyName, comparado contra un lead EXISTENTE, o un IRI de lead) más type y occurredAt. Da a cada fila un externalId — el id estable por mensaje, p. ej. el id de mensaje de Gmail — y la importación es idempotente: volver a ejecutarla, o volver a ejecutar una tanda que solo se importó parcialmente, reporta duplicados en lugar de crearlos. Las filas sin externalId se deduplican por (lead, type, occurredAt, contact), la misma clave natural que usa leads_bulkImport, así que una tanda que llegó primero por esa herramienta no se duplica aquí. Cada fila obtiene su propio resultado (created | duplicate | error), así que una fila malformada no descarta el resto del lote. NO crea leads — usa leads_bulkImport para eso. ≤ 1000 filas/llamada. Escritura. |