Título
La API de carga de financiamiento de proyecto (V3) se utiliza para crear entradas masivas de elementos de financiamiento de proyecto.
Descripción
La API de financiamiento de proyecto permite la carga programática y la gestión de registros de financiamiento de proyecto en Fluid. Admite la carga masiva de entradas de financiamiento de proyecto mediante una API JSON RESTful.
Los elementos de financiamiento de proyecto representan el presupuesto asignado a un proyecto, desglosado opcionalmente por año fiscal y categoría de gasto. Cada registro almacena el monto de financiamiento en moneda local, moneda predeterminada (convertida) y moneda reexpresada (si está configurada). Cuando se omite el año fiscal, el registro se trata como una entrada de financiamiento Life-to-Date (proyecto completo).
Permiso requerido
Se requieren las siguientes funciones de Fluid para usar esta API:
|
Rol |
Descripción |
|---|---|
|
Administrador financiero (o App Admin) |
Necesario para crear o actualizar el financiamiento de proyecto. La función |
|
Usuario |
Rol base requerido para todo acceso a la API. |
Endpoints
|
Método |
URL |
Content-Type |
|---|---|---|
|
POST |
|
|
Cuerpo de la solicitud
Cada solicitud se trata como la instantánea completa de financiamiento para todos los proyectos que contiene. Al enviarla, las filas existentes para esos proyectos se reemplazan por las filas del payload.
Para obtener resultados precisos y predecibles:
-
Envíe el financiamiento completo de cada proyecto en una sola solicitud — incluya todos los años fiscales, categorías de gasto y la entrada del proyecto completo (Life-to-Date). Todo lo que se omita será eliminado.
-
Use el endpoint bulk (
POST /rest/api/projectfunding/bulk) — está dimensionado para contener el historial completo de financiamiento de un proyecto en una sola llamada. -
Combine varios proyectos en una sola solicitud cuando sea conveniente. Cada proyecto se procesa de forma independiente, por lo que los proyectos no relacionados no se ven afectados.
Consejo: Trate cada llamada como "este es el panorama completo de financiamiento del proyecto X", no como "agregar estas filas al proyecto X".
Ejemplo
Solicitud bulk única que contiene el conjunto completo de financiamiento para MM1000 (tres filas de año fiscal + una fila Life-to-Date):
[
{
"fields": {
"projectRef": "MM1000",
"fiscalYear": 2024,
"expenseCategory": "Resource Cost",
"amount": 50000
}
},
{
"fields": {
"projectRef": "MM1000",
"fiscalYear": 2024,
"expenseCategory": "Non-resource Cost",
"amount": 20000
}
},
{
"fields": {
"projectRef": "MM1000",
"fiscalYear": 2025,
"expenseCategory": "Resource Cost",
"amount": 70000
}
},
{
"fields": {
"projectRef": "MM1000",
"expenseCategory": "Resource Cost",
"amount": 120000
}
}
]
Si MM1000 se divide entre dos llamadas, el payload de la segunda llamada se convierte en el nuevo estado de MM1000 — las filas enviadas en la primera llamada ya no se conservan.
Tipo
Arreglo JSON para creación masiva.
Referencia completa de campos
|
Campo |
Tipo |
¿Requerido? |
Descripción |
|---|---|---|---|
|
|
string |
Condicional |
Referencia externa del proyecto (por ejemplo, |
|
|
integer |
Condicional |
ID principal entero del proyecto. Se requiere al menos uno de |
|
|
string |
Condicional |
GUID del proyecto (por ejemplo, |
|
|
integer |
No |
El año fiscal de esta entrada de financiamiento (por ejemplo, |
|
|
string |
No |
La categoría de gasto del financiamiento (por ejemplo, |
|
|
string |
No |
Código de moneda ISO para la moneda local (por ejemplo, |
|
|
decimal |
Sí |
El monto total de financiamiento en moneda local. Un valor de |
|
|
decimal |
No |
Porción de gasto de capital del financiamiento en moneda local. Si tanto |
|
|
decimal |
No |
Porción de gasto operativo del financiamiento en moneda local. Si tanto |
Propiedades personalizadas
NOTA: Las propiedades personalizadas actualmente no están soportadas para registros de financiamiento de proyecto mediante esta API.
Solicitudes de ejemplo
Solicitud de creación masiva
POST {rooturl}/rest/api/projectfunding/bulk
Content-Type: application/json
[
{
"Fields": {
"ProjectRef": "MM1000",
"FiscalYear": 2024,
"ExpenseCategory": "Non-resource Cost",
"Amount": 50000.00
}
},
{
"Fields": {
"ProjectRef": "MM1000",
"FiscalYear": 2025,
"ExpenseCategory": "Non-resource Cost",
"Amount": 60000.00
}
},
{
"Fields": {
"ProjectRef": "HD1000",
"FiscalYear": 2024,
"ExpenseCategory": "Resource Cost",
"Amount": 80000.00,
"Capex": 20000.00,
"Opex": 60000.00
}
}
]
Respuesta
Respuesta de creación masiva
Devuelve un BulkProjectFundingResponseModel con:
|
Campo |
Tipo |
Descripción |
|---|---|---|
|
|
string |
Estado general: |
|
|
integer |
Número total de registros enviados. |
|
|
integer |
Número de registros procesados correctamente. |
|
|
integer |
Número de registros que fallaron la validación o el procesamiento. |
|
|
string |
ID de correlación único para el seguimiento de esta solicitud. |
|
|
array |
Resultados por fila, ordenados por |
Ejemplo de respuesta masiva (éxito parcial)
{
"Status": "partial",
"TotalCount": 3,
"ValidCount": 2,
"InvalidCount": 1,
"CorrelationId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"Results": [
{
"Fields": {
"IsValid": true,
"Status": "valid",
"RowIndex": 1,
"ValidationMessages": []
}
},
{
"Fields": {
"IsValid": true,
"Status": "valid",
"RowIndex": 2,
"ValidationMessages": []
}
},
{
"Fields": {
"IsValid": false,
"Status": "invalid",
"RowIndex": 3,
"ValidationMessages": [
"This row was skipped as no projects could be found with ProjectRef specified in the file."
]
}
}
]
}
Reglas de validación
-
Identificador de proyecto: Se debe proporcionar al menos uno de
ProjectRef,ProjectIdoProjectGuid. El proyecto debe existir en la base de datos de Fluid. -
Monto: El campo
Amountes obligatorio. Un valor de0eliminará el registro de financiamiento del año fiscal existente para esa combinación de proyecto y categoría de gasto. -
ExpenseCategory: Opcional. El cargador original de carga por Excel trataba este campo como opcional, y la API V3 conserva ese comportamiento por paridad.
-
Código de moneda: Opcional. El código de moneda se establece de forma predeterminada en la moneda del sistema cuando no se proporciona, y se ignora cuando no hay una moneda secundaria definida en el sistema Fluid.
-
FiscalYear: Opcional. Si se omite o es
null, el registro se trata como una entrada de financiamiento Life-to-Date / proyecto completo. -
Capex y Opex: Ambos opcionales. Si no se proporciona ninguno (o ambos son
0), elAmountcompleto se aplica aOpex. -
Manejo de duplicados: Si ya existe un registro para el mismo proyecto, año fiscal y categoría de gasto, se actualizará (de lo contrario, se creará un registro nuevo). El conjunto completo de registros para una combinación dada de proyecto + año fiscal se reemplaza en cada carga.
-
Generación automática de año completo: Si existen registros de año fiscal pero no se proporciona ningún registro Life-to-Date explícito, se genera automáticamente un registro de resumen de año completo sumando todos los registros de año fiscal por proyecto y categoría de gasto.
Códigos de estado HTTP
|
Código |
Descripción |
|---|---|
|
200 OK |
Solicitud procesada. Verifique |
|
400 Bad Request |
El cuerpo de la solicitud está mal formado o le faltan campos obligatorios. |
|
401 Unauthorized |
El emisor de la llamada no está autenticado. |
|
403 Forbidden |
La función |
|
429 Too Many Requests |
Se superó el límite de tasa. Consulte los encabezados de respuesta |
|
500 Internal Server Error |
Ocurrió un error inesperado durante el procesamiento. |
Límites de tasa
|
Endpoint |
Solicitudes |
Ventana |
|---|---|---|
|
|
100 |
10 segundos |