Explore Release Notes

Release Version 4.26.0 (December 24, 2024)

24. 12. 2024

Pre-deployment steps

To be done before deployment

Verify configuration changes and define new variables if needed.

Verify API changes and implement the required updates to use the changed API.

Post-deployment steps

To be done after deployment

The implementation of the reporting module includes a migration step to add old data to the reporting database. This migration may fail if there is inconsistent data in MongoDB. In such a case, follow these steps to complete the deployment:

  1. Set reports.enabled to false.

  2. Perform the deployment.

After the deployment (at any time):

  1. Check the migration errors.

  2. Update the data in MongoDB to resolve inconsistencies.

  3. Set reports.enabled to true.

  4. Redeploy the instance.

New functionality

Feature Description Benefits
The ability for service users to send messages to the list of clients (broadcast message) Service users can choose the required clients and send them in-system messages that will be visible on the mobile application. It allows clients to receive important updates directly in the mobile application.
Note: The ability for the service users to see chats in the Client profile on UI will be implemented in future versions.
To view communication with the Client the following APIs can be used (check API swagger description for more details):
POST ​/conversations​/view
POST ​/conversations​/{conversationId}​/messages​/view
The ability for service users to initiate a simple chat with a business user or a chat linked to a specific operation This ability is implemented using API s It improves communication by enabling direct messaging with clients within the system
POST ​/conversations​/create-system-broadcasts and
POST /tickets/transaction and will be added on UI in further versions
The ability for service users to initiate an investigation for the specified operation, view investigations and manage investigation status This ability is implemented using APIs It enables effective tracking and resolution of suspicious transactions, improving risk management and ensuring regulatory compliance.
POST /investigation
POST /investigation/view
GET /investigation/{investigationId}
PATCH /investigation/{investigationId}
and will be added to UI in further versions

Improvements

Feature Description
Deleted legacy sections from UI Deleted the following legacy sections from UI:
· Users
· Currencies
· Identification
Ability to create new currency/change the existing currency or set trusted domain on UI can be enabled/disabled using configuration Added two environment variables:
VUE_APP_CREATE_OR_EDIT_CURRENCY_NOT_ALLOWED=true VUE_APP_CREATE_OR_EDIT_TRUSTED_DOMAINS_NOT_ALLOWED=true
If the variables are not set or false, there are no restrictions on creating, editing, or deleting currencies and trusted domains.
The old environment variable VUE_APP_CREATE_CURRENCY_NOT_ALLOWED was deleted.
New technical_transit wallet at the gate_provider level is used for external operations accounting. Adding the new technical_transit wallet at the gate_provider level improves performance, eliminates database locking, enhances system scalability and reliability, and optimizes resource utilization in high-load environments.
Single valid OTP with timeout before resend and automatic invalidation on resend The previously issued OTP is automatically invalidated if the user requests a resend. Additionally, a timeout is enforced before each subsequent resend request, preventing brute-force attacks and reducing system misuse.
Timeout is set as 1 minute by default and can be changed in the configuration using variable: users.confirmation-code.resend-delay

API changes

Updated
POST /registration/resend-otp
POST​ /authorization​/resend-otp
POST ​​/merchant-payments​/{identifier}​/resend-otp
POST ​/password​/recovery​/resend-otp
POST​ ​/profiles​/my​/contact​/resend-otp
In case the OTP cannot be resent because the timeout period for resend has not yet expired, the following error is returned:
The confirmation code is not yet available for the resend. Try again in N seconds
Timeout is configured in the variable: users.confirmation-code.resend-delay
POST /api/v1/cash-desks/view
New optional properties were added to request body
Request:
{  
   "coinSerial": "052622562174",  
   "coordinate": {  
     "latitude": "11.33839",  
     "longitude": "18.876011"  
   },  
   "filter": {  
     "address": "City OM 13",  
     "cashDeskName": " SDK"  
   } 
}
POST /conversations/view
Added new filter by businessProcessId in the request
Added new filter includeRelatedToTransactions (true, false) in the request
Added new filters participantId and participantType
Added businessProcessId in the response
Request:
{ 
   "pageNumber": 0, 
   "pageSize": 1, 
   "filter": { 
     "includeRelatedToTransactions": true, 
     "businessProcessId": "0193d98b-43f4-7f78-8a69-2a1dfa3f0cb0", 
     "participantId": "61b065de-58ef-4959-ab5e-4a2d75ab6564", 
     "participantType": "ORGANIZATION" 
   }, 
   "sort": { 
     "createdAt": "desc" 
   } 
}
Response:
{ 
   "pageNumber": 0, 
   "pageSize": 1, 
   "totalPages": 1, 
   "totalRecords": 1, 
   "records": [ 
      { 
        "id": "0193d98c-666d-74a4-9b8a-848afbaf813b", 
        "name": "Individual topup 9999", 
        "broadcast": false, 
        "unread": false, 
        "createdAt": "2024-12-18T11:34:37.149Z", 
        "lastMessageCreatedAt": "2024-12-18T11:40:49.272Z", 
        "initiator": { 
           "id": "0193d98c-666d-7940-8be7-47d4c0f31424", 
           "type": "USER", 
           "entityId": "55d7c0fe-2608-44e5-bd7f-3b0d2a47e1e3", 
           "name": "Admin Default", 
           "email": "administrator@sdkfinance.tech" 
       }, 
"participants": [ 
           { 
              "id": "0193d98c-666d-7715-8a6f-c9107356b3c7", 
              "type": "ORGANIZATION", 
              "entityId": "61b065de-58ef-4959-ab5e-4a2d75ab6564", 
              "name": "Alex Dot", 
              "phoneNumber": "380631111111", 
              "email": "individual@sdkfinance.tech", 
              "organizationType": "individual", 
              "tariffPlan": "base" 
          }, 
          { 
              "id": "0193d98c-666d-7940-8be7-47d4c0f31424", 
              "type": "USER", 
              "entityId": "55d7c0fe-2608-44e5-bd7f-3b0d2a47e1e3", 
              "name": "Admin Default", 
              "email": "administrator@sdkfinance.tech" 
           } 
           ], 
           "businessProcessId": "0193d98b-43f4-7f78-8a69-2a1dfa3f0cb0" 
        } 
     ] 
  }
PUT ​/management​/organization-settings​/service-roles​/{roleCode}
added userManagementAllowed (true/false)
Request:
{ 
   "permissions": [ 
     "string" 
   ], 
   "removePermissions": [ 
      "string" 
   ], 
   "supervisingRoles": [ 
     { 
     "roleCode": "CFO", 
     "managementOperation": [ 
        "CREATE" 
      ] 
    } 
  ], 
  "removeSupervisingRoles": [ 
    { 
      "roleCode": "CFO", 
      "managementOperation": [ 
        "CREATE" 
      ] 
    } 
  ], 
  "manageableRoles": [ 
    { 
      "roleCode": "CFO", 
      "managementOperation": [ 
       "CREATE" 
      ] 
    } 
  ], 
  "removeManageableRoles": [ 
   { 
     "roleCode": "CFO", 
     "managementOperation": [ 
     "CREATE" 
     ] 
   } 
  ], 
  "userManagementAllowed": true 
}
Added
GET /users/{userId}
Permissions: USER_VIEWER, USER_MANAGER
Response:
{ 
   "user": { 
      "id": "0193ce27-3c76-7055-b25f-cbc830fa0287", 
      "name": "Individual Default", 
      "createdAt": "2024-12-16T06:28:18.166Z", 
      "active": true, 
      "frozen": false, 
      "banned": false, 
      "defaultUser": true, 
      "contact": { 
          "phoneVerified": false,  
          "additionalPhoneVerified": false, 
          "email": "individual@sdkfinance.tech", 
          "emailVerified": true, 
          "countryCode": "UA" 
      }, 
      "members": [ 
          { 
              "id": "0193ce27-3c76-71dc-8cf3-c625ce9e6781", 
              "role": "individual", 
              "organization": { 
                   "id": "0193ce27-37ce-7ed8-a13c-7409482aaafc", 
                   "type": "individual", 
                   "name": "Individual Default", 
                   "organizationStatus": "approved", 
                   "contract_info": { 
                       "id": "0193ce27-2520-7c6d-a356-aef4a20e8f0d", 
                       "personType": "base", 
                       "name": "base contract for org individual" 
                   } 
               } 
          } 
     ], 
     "cohort": "0W", 
     "profileStatus": "active", 
     "lastLogin": "2024-12-16T06:30:02.505Z", 
     "lastTransaction": "2024-12-16T06:28:18.069Z", 
     "systemLanguage": "en" 
   } 
}
POST: /api/v1/templates/withdrawal/operation/{{bankBusinessProcessId}}
Permission: TEMPLATES_OWNER
Request:
{ 
    "amount": 100.0, 
    "description": "string", 
    "name": "individual withdrawal template", 
    "reusable": true 
}
Response:
{ 
    "id": "01936e64-1781-7947-b465-15082e7591b1", 
    "name": "individual withdrawal template", 
    "senderCoin": { 
        "serial": "306042148255", 
        "name": "TEST coin", 
        "amount": 100.0000, 
        "availableAmount": 100.0000, 
        "futureAmount": 0.0000, 
        "heldAmount": 0.0000, 
        "creditLimit": 0.0000, 
        "currency": { 
            "id": "01936e50-b9dd-7242-a9ba-451418dea893", 
            "sn": "ozi", 
            "code": "ozi", 
            "symbol": "ozi", 
            "type": "FIAT" 
         }, 
         "active": true, 
         "type": "client", 
         "main": true, 
         "accounting": false, 
         "smartCards": [] 
      }, 
     "amount": 100.0000, 
     "description": "string", 
     "bankDetails": { 
         "iban": "AT022050302101023600", 
         "recipientFullName": "Test", 
         "bankDto": { 
             "address": "Maidan Nezalezhnosti, 1", 
             "bankId": "01936e50-a58e-7dbe-b4d5-7fe2ed08b6a3", 
             "bic": "ABNACEE2RFA", 
             "city": "Toronto", 
             "countryCode": "DE", 
             "name": "Privatbank", 
             "swift": "ABNACEE2RFA", 
             "zipCode": "12345" 
          } 
     } 
}
POST /tickets/transaction
Permissions: TRANSACTION_TICKET_MANAGER, SYSTEM_BROADCAST_CREATION_EXECUTOR
Request:
{ 
   "businessUserOrganizationId": "61b065de-58ef-4959-ab5e-4a2d75ab6564", 
   "businessProcessId": "0193d98b-43f4-7f78-8a69-2a1dfa3f0cb0", 
   "topic": "Individual topup 9999", 
   "message": "Discussion of the Individual topup 9999" 
}
Response:
{ 
   "ticket": { 
      "id": "0193d98c-666d-752b-8b1f-c9d9cc3e6bd1", 
      "category": "PAYMENT", 
      "conversation": { 
          "id": "0193d98c-666d-74a4-9b8a-848afbaf813b", 
          "name": "Individual topup 9999", 
          "createdAt": "2024-12-18T11:34:37.149Z", 
          "initiator": { 
               "id": "0193d98c-666d-7940-8be7-47d4c0f31424", 
               "type": "USER", 
               "entityId": "55d7c0fe-2608-44e5-bd7f-3b0d2a47e1e3", 
               "name": "Admin Default", 
               "email": "administrator@sdkfinance.tech" 
           } 
       }, 
       "businessProcessId": "0193d98b-43f4-7f78-8a69-2a1dfa3f0cb0" 
   } 
}
PATCH /v1/transactions/{transactionId}
Permission: TRANSACTIONS_UPDATER
Path parameters:
- transactionId - transaction ID (business process ID)
Request:
{ 
   "categoryId": "20930a95-26cf-4e61-911d-1c361f4d2f92", 
   "note": "my note" 
}
POST /investigation
Permission: INVESTIGATION_MANAGER
Request:
{ 
   "transactions": [ 
      "string" 
    ], 
   "reason": "FRAUD" 
}
Response:
{ 
   "id": "string", 
   "transactions": [ 
     { 
       "transactionId": "string", 
       "transactionAmount": 0, 
       "transactionCreatedAt": "2024-12-19T14:23:02.506Z" 
     } 
  ], 
  "investigatorId": "string", 
  "investigatorName": "string", 
  "notes": "string", 
  "investigationReason": "FRAUD", 
  "investigationConclusion": "FRAUD", 
  "investigationStatus": "COMPLETED", 
  "openedAt": "2024-12-19T14:23:02.506Z", 
  "completedAt": "2024-12-19T14:23:02.506Z", 
  "deadlineAt": "2024-12-19T14:23:02.506Z" 
}
POST /investigation/view
Permission: INVESTIGATION_MANAGER, INVESTIGATION_VIEWER
Response:
{ 
   "id": "string", 
   "transactions": [ 
    { 
       "transactionId": "string", 
       "transactionAmount": 0, 
       "transactionCreatedAt": "2024-12-19T14:23:02.506Z" 
    } 
  ], 
  "investigatorId": "string", 
  "investigatorName": "string", 
  "notes": "string", 
  "investigationReason": "FRAUD", 
  "investigationConclusion": "FRAUD", 
  "investigationStatus": "COMPLETED", 
  "openedAt": "2024-12-19T14:23:02.506Z", 
  "completedAt": "2024-12-19T14:23:02.506Z", 
  "deadlineAt": "2024-12-19T14:23:02.506Z" 
} 
GET /investigation/{investigationId}
Permission: INVESTIGATION_MANAGER, INVESTIGATION_VIEWER
Response:
{ 
   "id": "string", 
   "transactions": [ 
     { 
       "transactionId": "string", 
       "transactionAmount": 0, 
       "transactionCreatedAt": "2024-12-19T14:24:19.408Z" 
     } 
   ], 
   "investigatorId": "string", 
   "investigatorName": "string", 
   "notes": "string", 
   "investigationReason": "FRAUD", 
   "investigationConclusion": "FRAUD", 
   "investigationStatus": "COMPLETED", 
   "openedAt": "2024-12-19T14:24:19.408Z", 
   "completedAt": "2024-12-19T14:24:19.408Z", 
   "deadlineAt": "2024-12-19T14:24:19.408Z" 
}
PATCH /investigation/{investigationId}
Permission: INVESTIGATION_MANAGER
Request:
{ 
   "updateReason": "COMPLETE", 
   "investigationConclusion": { 
      "conclusion": "FRAUD", 
      "notes": "string" 
    }, 
    "transactions": [ 
      "string" 
   ] 
}
Response:
{ 
   "id": "string", 
   "transactions": [ 
      { 
        "transactionId": "string", 
        "transactionAmount": 0, 
        "transactionCreatedAt": "2024-12-19T14:24:36.796Z" 
      } 
    ], 
    "investigatorId": "string", 
    "investigatorName": "string", 
    "notes": "string", 
    "investigationReason": "FRAUD", 
    "investigationConclusion": "FRAUD", 
    "investigationStatus": "COMPLETED", 
    "openedAt": "2024-12-19T14:24:36.796Z", 
    "completedAt": "2024-12-19T14:24:36.796Z", 
    "deadlineAt": "2024-12-19T14:24:36.796Z" 
}
DELETE /v1/templates/withdrawal/{id}
Permission: TEMPLATES_OWNER
Deprecated/Deleted

Configuration changes

Added two environment variables:

VUE_APP_CREATE_OR_EDIT_CURRENCY_NOT_ALLOWED=true
VUE_APP_CREATE_OR_EDIT_TRUSTED_DOMAINS_NOT_ALLOWED=true

The old environment variable VUE_APP_CREATE_CURRENCY_NOT_ALLOWED was deleted.

Timeout before resending OTP is configurable through

users.confirmation-code.resend-delay

Investigation deadline configuration:

investigations:
  # deadline configuration. Value in days till the investigation must be completed
  deadline: 7

Introduced a new configuration property, reports.enabled, with a boolean value (true/false) that provides enhanced flexibility for managing core report functionality. This property allows for the selective enabling or disabling of the initialization of key reporting components, including:

  • Kafka-based transaction writing.

  • MongoDB-related report storage.

  • Migration processes for reporting data.

Default value: true