Operational Dashboard - Cambios y Soluciones

Esta página cubre los cambios y correcciones proporcionados a Operational Dashboard para la versión 2025.4.0 de IPF

Cambios Importantes

Reestructuración del Módulo

Elimine todas las rutas IPF existentes, excluyendo [source,hocon]

date-types = [
  "CREATED_AT",
  "INSTRUCTION_RECEIVED_AT",
  "EXECUTION_STARTED_AT",
  "SETTLEMENT_COMPLETED_AT",
  "ACCEPTANCE_DATE_TIME",
  "INTERBANK_SETTLEMENT_DATE",
  "REQUESTED_EXECUTION_DATE"
]
processing-settings, asegurándose de mantener cualquiera de sus propias rutas definidas:

e.g:(PAY-14560)

Configuración Antigua

import { Route } from '@angular/router';
import {
    AppHomeComponent,
    HomeComponent,
    LoginComponent,
    ProcessingEntityGuard,
    RoleGuard
} from '@iconsolutions/common';

export const appRoutes: Route[] = [
    { path: '', redirectTo: 'app', pathMatch: 'full' },
    { path: 'login', component: LoginComponent },
    {
        path: 'app',
        canActivate: [ProcessingEntityGuard],
        component: AppHomeComponent
    },
    {
        path: 'app/:processingEntityId',
        canActivate: [ProcessingEntityGuard],
        children: [
            {
                path: 'home',
                component: HomeComponent
            },
            {
                path: 'ods',
                data: { roles: ['ROLE_PAYMENT'] },
                canActivate: [RoleGuard],
                loadChildren: () => import('@iconsolutions/ods').then((m) => m.OdsModule)
            },
            {
                path: 'version-info',
                loadChildren: () => import('@iconsolutions/version-info').then((m) => m.VersionInfoModule)
            },
            {
                path: 'cluster-health',
                loadChildren: () => import('@iconsolutions/cluster-health').then((m) => m.ClusterHealthModule)
            },
            {
                path: 'processing-settings',
                loadChildren: () => import('@iconsolutions/processing-settings').then((m) => m.ProcessingSettingsModule)
            },
            {
                path: 'audit',
                canActivate: [RoleGuard],
                data: { roles: ['ROLE_AUDIT'] },
                loadChildren: () => import('@iconsolutions/audit').then((m) => m.AuditModule)
            },
            {
                path: 'metrics',
                canActivate: [RoleGuard],
                data: { roles: ['ROLE_METRICS'] },
                loadChildren: () => import('@iconsolutions/metrics').then((m) => m.MetricsModule)
            },
            {
                path: 'permissions',
                loadComponent: () => import('@iconsolutions/permissions').then((m) => m.PermissionsComponent)
            },
            {
                path: 'htm',
                loadChildren: () => import('@iconsolutions/htm').then((m) => m.HtmModule)
            }
        ]
    }
];

Nueva Configuración (de esta versión)

import { Route } from '@angular/router';
import { ProcessingEntityGuard } from '@iconsolutions/common';

export const appRoutes: Route[] = [
    {
        path: 'app/:processingEntityId',
        canActivate: [ProcessingEntityGuard],
        children: [
            {
                path: 'processing-settings',
                loadChildren: () => import('@iconsolutions/processing-settings').then((m) => m.ProcessingSettingsModule)
            }
        ]
    }
];

Añadir IpfOperationalDashboardModule y IpfOperationsModule a sus importaciones del módulo principal (lo más probable app.module.ts).

Elimine las siguientes dependencias de npm:

    "@iconsolutions/audit": "189.3.3",
    "@iconsolutions/cluster-health": "189.3.3",
    "@iconsolutions/htm": "189.3.3",
    "@iconsolutions/metrics": "189.3.3",
    "@iconsolutions/ods": "189.3.3",
    "@iconsolutions/permissions": "189.3.3",
    "@iconsolutions/version-info": "189.3.3",

Luego instale las siguientes dependencias de npm:

npm i @iconsolutions/ipf-operational-dashboard
npm i @iconsolutions/ipf-operations

ODS Consolidación de Configuración por Tipo de Viaje

Esta versión introduce un cambio drástico a la ODS estructura de configuración del módulo. La configuración ha sido reestructurada para organizar las propiedades por tipo de viaje, proporcionando mejor flexibilidad y mantenibilidad.(PAY-14230)

Resumen de Cambios

  1. Las propiedades ahora están organizadas por tipo de viaje: Las siguientes propiedades ahora están estructuradas como mapas indexados por tipo de viaje:

    • Formularios de búsqueda (search-form)

    • Columnas de la tabla (table-columns)

    • Estados globales (global-statuses)

    • Tipos de fecha (date-types)

    • Tipos de cantidad (amount-types)

    • Identificadores alternativos (alternative-identifiers)

    • Tipos de transacción (transaction-types)

    • Detalles predeterminados (details-defaults)

  2. Se eliminaron las opciones predeterminadas: El default Las listas de tipos de cantidad y tipos de fecha han sido eliminadas. Cada tipo de viaje debe ahora definir todas las propiedades requeridas de manera explícita. No hay valores predeterminados de respaldo.

Pasos de Migración

Ejemplo de Configuración Completo

Aquí tiene un ejemplo completo que muestra la nueva estructura actualizada:

ipf.business-operations.payment-search {
  # Top-level property
  ods-page-results {
    size = 1000
  }

  # Top-level shared property
  system-event-names = [
    "ActionInvoked",
    "ActionRetriesExhausted",
    "ActionTimeout",
    # ... (full list)
  ]

  journeys {
    payment {
      alternative-identifiers = [
        {
          searchBy: "CLIENT_REQUEST_ID",
          displayName: "Client Request ID"
        }
      ]

      transaction-types = ["Credit", "Debit"]

      details-defaults {
        showGraphs = true
        flows {
          opened = "latest"
          sort = "asc"
        }
        events {
          opened = "all"
          sort = "asc"
        }
      }

      search-form {
        searchType: "payment"
        formSections: [
          # ... form sections
        ]
      }

      table-columns = [
        # ... column definitions
      ]

      global-statuses = [
        {
          name: "PENDING",
          category: "PENDING"
        },
        # ... more statuses
      ]

      date-types = [
        "CREATED_AT",
        "INSTRUCTION_RECEIVED_AT",
        "EXECUTION_STARTED_AT",
        "SETTLEMENT_COMPLETED_AT",
        "ACCEPTANCE_DATE_TIME",
        "INTERBANK_SETTLEMENT_DATE",
        "REQUESTED_EXECUTION_DATE"
      ]

      amount-types = [
        "INSTRUCTED",
        "TRANSACTION",
        "CREDIT",
        "DEBIT",
        "CONVERTED"
      ]
    }

    # Repeat for recall, bulk, batch...
  }
}
Paso 1: Mantenga las propiedades compartidas en el nivel superior

Mantener ods-page-results y system-event-names en la parte superior de su configuración, fuera de la journeys objeto. Estas son propiedades compartidas que se aplican a todos los tipos de viaje.

ipf.business-operations.payment-search {
  ods-page-results {
    size = 1000
  }

  system-event-names = [
    "ActionInvoked",
    "ActionRetriesExhausted",
    # ... (full list)
  ]

  journeys {
    # Journey-specific configuration goes here
  }
}
Paso 2: Cree la estructura del objeto journeys

Añada un journeys objeto a su configuración, y cree un objeto para cada tipo de viaje (por ejemplo,payment,recall,bulk,batch) dentro del journeys objeto.

ipf.business-operations.payment-search {
  journeys {
    payment {
      # Journey-specific configuration goes here
    }
    recall {
      # Journey-specific configuration goes here
    }
    bulk {
      # Journey-specific configuration goes here
    }
    batch {
      # Journey-specific configuration goes here
    }
  }
}
Paso 3: Elimine cualquier lista predeterminada que pueda tener para tipos de monto o tipos de fecha, y agregue estas listas para cada uno de los tipos de viaje
Paso 4: Agregue Propiedades Específicas del Viaje a Cada Tipo de Viaje

Agregue las siguientes propiedades a cada tipo de viaje:

Formulario de Búsqueda
search-form {
  searchType: "payment"
  formSections: [
    {
      sectionName: "Basic Search"
      fields: [
        {
          fieldName: "paymentId"
          displayName: "Payment ID"
          fieldType: "text"
        }
      ]
    }
  ]
}
Columnas de la Tabla
table-columns = [
  {
    columnName: "paymentId"
    displayName: "Payment ID"
    sortable: true
  },
  {
    columnName: "status"
    displayName: "Status"
    sortable: true
  }
]
Estados Globales
global-statuses = [
  {
    name: "PENDING"
    category: "PENDING"
  },
  {
    name: "COMPLETED"
    category: "COMPLETED"
  },
  {
    name: "FAILED"
    category: "FAILED"
  }
]
Tipos de Fecha
date-types = [
  "CREATED_AT",
  "INSTRUCTION_RECEIVED_AT",
  "EXECUTION_STARTED_AT",
  "SETTLEMENT_COMPLETED_AT",
  "ACCEPTANCE_DATE_TIME",
  "INTERBANK_SETTLEMENT_DATE",
  "REQUESTED_EXECUTION_DATE"
]
Tipos de Cantidad
amount-types = [
  "INSTRUCTED",
  "TRANSACTION",
  "CREDIT",
  "DEBIT",
  "CONVERTED"
]
Alternative Identifiers
alternative-identifiers = [
  {
    searchBy: "CLIENT_REQUEST_ID",
    displayName: "Client Request ID"
  }
]
Tipos de Transacción
transaction-types = ["Credit", "Debit"]
Detalles Predeterminados
details-defaults {
  showGraphs = true
  flows {
    opened = "latest"
    sort = "asc"
  }
  events {
    opened = "all"
    sort = "asc"
  }
}

Por lo tanto, su configuración para un tipo de viaje debe verse así:

ipf.business-operations.payment-search {
  ods-page-results {
    size = 1000
  }

  system-event-names = [
    "ActionInvoked",
    "ActionRetriesExhausted",
    "ActionTimeout",
    # ... (full list)
  ]

  journeys {
    payment {
      alternative-identifiers = [
        {
          searchBy: "CLIENT_REQUEST_ID",
          displayName: "Client Request ID"
        }
      ]

      transaction-types = ["Credit", "Debit"]

      details-defaults {
        showGraphs = true
        flows {
          opened = "latest"
          sort = "asc"
        }
        events {
          opened = "all"
          sort = "asc"
        }
      }

      search-form {
        searchType: "payment"
        formSections: [
          # ... form sections
        ]
      }

      table-columns = [
        # ... column definitions
      ]

      global-statuses = [
        {
          name: "PENDING",
          category: "PENDING"
        },
        # ... more statuses
      ]

      date-types = [
        "CREATED_AT",
        "INSTRUCTION_RECEIVED_AT",
        "EXECUTION_STARTED_AT",
        "SETTLEMENT_COMPLETED_AT",
        "ACCEPTANCE_DATE_TIME",
        "INTERBANK_SETTLEMENT_DATE",
        "REQUESTED_EXECUTION_DATE"
      ]

      amount-types = [
        "INSTRUCTED",
        "TRANSACTION",
        "CREDIT",
        "DEBIT",
        "CONVERTED"
      ]
    }

    # Repeat for recall, bulk, batch...
  }
}

Tipos de Viaje Personalizados

La nueva estructura admite completamente custom tipos de viaje. Para añadir un custom tipo de viaje agregar una nueva entrada a la journeys mapa con todas las propiedades requeridas:

ipf.business-operations.payment-search {
    ods-page-results {
        size = 1000
    }

  system-event-names = [...]

  journeys {
    payment { ... }
    recall { ... }
    bulk { ... }
    batch { ... }

    # Custom journey type
    sepa-instant {
      alternative-identifiers = [...]
      transaction-types = [...]
      details-defaults {...}
      search-form {...}
      table-columns = [...]
      global-statuses = [...]
      date-types = [...]
      amount-types = [...]
    }
  }
}

Configuración de la columna de la tabla

Si tiene alguna configuración para payment-columns,recall-columns,bulk-columns or batch-columns entonces debe actualizar su configuración. Deberá configurar los parámetros del viaje para ser parte de table-columns dentro de cada tipo de viaje, cambie columnName to name y proporcione un type.

Para obtener detalles completos de configuración, consulte IPF Operational Dashboard ODS module.

Configuración Antiguo: Un arreglo de objetos en el nivel superior:

payment-columns = [
  {
    columnName: "createdAt"
  },
  {
    columnName: "transactionType"
  },
  {
    columnName: "debtor"
  },
  {
    columnName: "amount"
  }
]

Nueva Configuración: Las columnas de la tabla ahora se definen dentro de cada tipo de viaje con requisitos name y type propiedades:

journeys {
  payment {
    table-columns = [
      {
        name: "createdAt",
        type: "DATETIME"
      },
      {
        name: "transactionType",
        type: "STRING"
      },
      {
        name: "debtor",
        type: "STRING",
        paths: ["debtorName", "debtorAccount", "debtorBic", "debtorAgentBic"]
      },
      {
        name: "amount",
        type: "PRE_DEFINED"
      }
    ]
  }

  recall {
    table-columns = [
      {
        name: "createdAt",
        type: "DATETIME"
      },
      {
        name: "agentDetails",
        type: "PRE_DEFINED"
      },
      {
        name: "reasonCode",
        type: "STRING"
      }
    ]
  }

  newJourney {
    table-columns = [
      {
        name: "createdAt",
        type: "DATETIME"
      },
      {
        name: "unitOfWorkdId",
        type: "STRING"
      }
    ]
  }
}

Todos los objetos de columna deben proporcionar un name y type.paths es opcional; si no se proporciona, el name se utiliza por defecto.

Además, si no se proporciona un valor para las columnas de la tabla de un viaje, se utilizará el siguiente valor predeterminado:

{
  name: "unitOfWorkdId",
  type: "STRING"
}
Nombre

El name el valor debe ser un nombre único que se correlacionará con la hoja de traducción para proporcionar un encabezado de columna para el frontend. También se utiliza como un valor de reserva si paths no está definido para esa columna.

Rutas

El paths el atributo acepta un array de cadenas, donde el valor se correlaciona con la ruta dentro del objeto que se espera. Si la ruta no se proporciona, el name se utilizará como predeterminado.

e.j. para un objeto como el siguiente:

{
  "createdAt": "01/01/2025",
  "field1": "value1",
  "field2": "value2",
  "object1": {
    "field3": "value3"
  }
}

La propiedad paths:

paths: ["createdAt"]

Obtendrá el valor ["01/01/2025"]

Y la propiedad paths:

paths: ["field1", "object1.field3"]

Obtendrá el valor ["value1", "value3"]. Cada uno de los valores de cadena estará separado por un salto de línea en la tabla.

Tipo

Hay seis tipos de los que puede elegir:

CADENA

Un valor de texto estándar

NÚMERO

Un valor numérico estándar

MONEDA

Un valor que será formateado a un valor monetario.

FECHA

Un valor que se formateará como fecha y mostrará solo la fecha.

FECHA Y HORA

Un valor que será formateado a fecha e incluirá hora.

PRE_DEFINIDO

Una definición de columna incorporada que manejará columnas más complicadas (consulte las definiciones)

Para el PRE_DEFINED columnas, puede utilizarlas proporcionando tanto el tipo como el nombre apropiado.

Nombre

Descripción

Notas

cantidad

Esto se mostrará transactionAmount,instructedAmount,convertedTransactionAmount or originalInterbankSettlementAmount,returnedInterbankSettlementAmount,convertedTransactionAmount dependiendo del tipo de viaje

También mostrará un tooltip apropiado.

bankingAccount

Esto se mostrará debitAccount y creditAccount con prefijos

totalInterbankSettlementAmount

Esto se mostrará totalInterbankSettlementAmount con totalInterbankSettlementAmountCurrency para la moneda

agentDetails

Esto se mostrará instructingAgent y instructedAgent

También se mostrará con un prefijo de 'Instruyendo' e 'Instruido'

Configuración del Estado Global

También hemos realizado algunos cambios en la forma en que se define la configuración del estado global. Los estados globales ahora se definen dentro de cada tipo de recorrido en el journeys objeto. Esto significa que usted puede añadir custom estados globales para cada uno de los diferentes tipos de viaje de manera independiente.

Antes: Un único arreglo en el nivel superior:

global-statuses = [
  {
    name: "Pending",
    category: "PENDING"
  },
  {
    name: "Accepted",
    category: "ACCEPTED"
  },
  {
    name: "Completed",
    category: "ACCEPTED"
  },
  {
    name: "Rejected",
    category: "REJECTED"
  },
  {
    name: "Manual Action Required",
    category: "MANUAL_ACTION_REQUIRED"
  },
  {
    name: "Scheduled",
    category: "SCHEDULED"
  },
  {
    name: "Cancelled",
    category: "CANCELLED"
  }
]

Después: Los estados globales se definen dentro de cada tipo de viaje:

journeys {
  payment {
    global-statuses = [
      {
        name: "Pending",
        category: "PENDING"
      },
      {
        name: "Accepted",
        category: "ACCEPTED"
      },
      {
        name: "Completed",
        category: "ACCEPTED"
      }
    ]

    # ... other payment configuration
  }

  recall {
    global-statuses = [
      {
        name: "Pending",
        category: "PENDING"
      },
      {
        name: "Accepted",
        category: "ACCEPTED"
      },
      {
        name: "Scheduled",
        category: "SCHEDULED"
      },
      {
        name: "Cancelled",
        category: "CANCELLED"
      }
    ]

    # ... other recall configuration
  }

  bulk {
    global-statuses = [
      {
        name: "Rejected",
        category: "REJECTED"
      },
      {
        name: "Manual Action Required",
        category: "MANUAL_ACTION_REQUIRED"
      },
      {
        name: "Scheduled",
        category: "SCHEDULED"
      },
      {
        name: "Cancelled",
        category: "CANCELLED"
      }
    ]

    # ... other bulk configuration
  }

  batch {
    global-statuses = [
      {
        name: "Pending",
        category: "PENDING"
      },
      {
        name: "Accepted",
        category: "ACCEPTED"
      },
      {
        name: "Completed",
        category: "ACCEPTED"
      },
      {
        name: "Rejected",
        category: "REJECTED"
      },
      {
        name: "Cancelled",
        category: "CANCELLED"
      }
    ]

    # ... other batch configuration
  }
}