GOBI integration user interface


AuthorAndrei Makaranka
JIRA task

UXPROD-3681 - Getting issue details... STATUS

Business Requirements
Architects Review

DONE

PO review

DONE

Revision History

VersionDateOwnerDescriptionReason
v1.006.17.2022Initial version
v1.106.20.2022Updates for schemas added
v1.206.21.2022Andrei Makaranka Work break down structure ready
v1.306.24.2022Solution finalized
v 2.007.07.2022Andrei Makaranka New schema "OrderMappingsView" addedNeed to identify Default or Custom mapping 

Overview

Problems

It is difficult and time consuming to retrieve the data points required to connect the FOLIO and GOBI APIs for an instance of FOLIO.

It is also difficult (requires significant technical knowledge) to update the custom mapping options for this integration

In scope

  • Provide an interface that is only available to users with specific permissions that displays the custom field mappings for each order type
  • Allow users to edit the mappings for GOBI Localdata fields 1 - 4
  • Allow users to edit the Default values for existing field mappings
  • Allow users to Add or remove field mappings (Depending on effort required this may need to be delivered in a separate feature)

Constraints

Assumptions, dependencies

Out of Scope

  • Provide an interface that is only available to users with specific permissions that displays the information need to connect FOLIO and GOBI APIs (Eg. URL, API Key)

Investigate : FOLIO secrets management

  • Dennis Bridges In the first iteration will be not supportable updating mapping where following configs exist :  "fromOtherField", "defaultMapping", "combinator", "translateDefault".

There are a small number of mappings that use several of these default mappings ("fromOtherField", "defaultMapping", "combinator", "translateDefault" ) in their configuration by default.   

Architecturally Significant Requirements

  • Custom configuration will be stored in the mod-configuration

Solution Design

Data Model

Update mapping schema → mapping.json

1.Insert new field in the "dataSource" element. 

"dataSourceFieldName" - will be used by UI to show mapping as "GOBI field name"

GOBI field name
...... 
 "dataSource": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
  		"dataSourceFieldName": {
      		"type": "string",
      		"description": "GOBI field name"
    	}, 
        "from": {
          "type": "string",
          "description": "XPath to the data for the field to map"
        }, 
	......  
 }
......

2. Replace simple definition of the "dataSource.translation

Note : 

  • Replace "<<Please put clear description about logic of translator>>" with details about logic and input and output of translator method.
  • Field "title" from "javaEnums" must be the same as translator method name from "enum". This makes it easier to build a list of translators for the new API and improve documentation.

Specification : https://github.com/joelittlejohn/jsonschema2pojo/wiki/Reference#javaenumnames

Detailed translation
       "translation": {
          "enum": [
            "lookupContributorNameTypeId",
            "lookupExpenseClassId",
            "lookupAcquisitionMethodIds",
            "lookupAcquisitionUnitDefaultAcqUnitName",
            "lookupLocationId",
            "lookupMaterialTypeId",
            "lookupFundId",
            "lookupMock",
            "lookupOrganization",
            "lookupProductIdType",
            "lookupBillTo",
            "lookupShipTo",
            "lookupSuffix",
            "lookupPrefix",
            "lookupLinkedPackage",
            "lookupConfigAddress",
            "separateISBNQualifier",
            "truncateISBNQualifier",
            "toBoolean",
            "toDate",
            "toDouble",
            "toInteger"
          ],
          "javaEnums": [
            {
              "name": "LOOKUP_CONTRIBUTOR_NAME_TYPE_ID",
              "title": "lookupContributorNameTypeId",
              "description": " <<Please put clear description about logic of translator>>"
            },
            {
              "name": "LOOKUP_EXPENSE_CLASS_ID",
              "title": "lookupExpenseClassId",
              "description": " <<Please put clear description about logic of translator>>"
            },
            {
              "name": "LOOKUP_ACQUISITION_METHOD_IDS",
              "title": "lookupAcquisitionMethodIds",
              "description": " <<Please put clear description about logic of translator>>"
            },
            {
              "name": "LOOKUP_ACQUISITION_UNIT_DEFAULT_ACQ_UNIT_NAME",
              "title": "lookupAcquisitionUnitDefaultAcqUnitName",
              "description": " <<Please put clear description about logic of translator>>"
            },
            {
              "name": "LOOKUP_LOCATION_ID",
              "title": "lookupLocationId",
              "description": " <<Please put clear description about logic of translator>>"
            },
            {
              "name": "LOOKUP_MATERIAL_TYPE_ID",
              "title": "lookupMaterialTypeId",
              "description": " <<Please put clear description about logic of translator>>"
            },
            {
              "name": "LOOKUP_FUND_ID",
              "title": "lookupFundId",
              "description": " <<Please put clear description about logic of translator>>"
            },
            {
              "name": "LOOKUP_MOCK",
              "title": "lookupMock",
              "description": " <<Please put clear description about logic of translator>>"
            },

            {
              "name": "LOOKUP_ORGANIZATION",
              "title": "lookupOrganization",
              "description": " <<Please put clear description about logic of translator>>"
            },
            {
              "name": "LOOKUP_PRODUCT_ID_TYPE",
              "title": "lookupProductIdType",
              "description": " <<Please put clear description about logic of translator>>"
            },
            {
              "name": "LOOKUP_BILL_TO",
              "title": "lookupConfigAddress",
              "description": " <<Please put clear description about logic of translator>>"
            },
            {
              "name": "LOOKUP_SHIP_TO",
              "title": "lookupConfigAddress",
              "description": " <<Please put clear description about logic of translator>>"
            },

            {
              "name": "LOOKUP_SUFFIX",
              "title": "lookupSuffix",
              "description": " <<Please put clear description about logic of translator>>"
            },
            {
              "name": "LOOKUP_PREFIX",
              "title": "lookupPrefix",
              "description": " <<Please put clear description about logic of translator>>"
            },
            {
              "name": "LOOKUP_LINKED_PACKAGE",
              "title": "lookupLinkedPackage",
              "description": " <<Please put clear description about logic of translator>>"
            },
            {
              "name": "LOOKUP_CONFIG_ADDRESS",
              "title": "lookupConfigAddress",
              "description": " <<Please put clear description about logic of translator>>"
            },

            {
              "name": "SEPARATE_ISBN_QUALIFIER",
              "title": "separateISBNQualifier",
              "description": " <<Please put clear description about logic of translator>>"
            },
            {
              "name": "TRUNCATE_ISBN_QUALIFIER",
              "title": "truncateISBNQualifier",
              "description": " <<Please put clear description about logic of translator>>"
            },
            {
              "name": "TO_BOOLEAN",
              "title": "toBoolean",
              "description": " <<Please put clear description about logic of translator>>"
            },
            {
              "name": "TO_DATE",
              "title": "toDate",
              "description": " <<Please put clear description about logic of translator>>"
            },
            {
              "name": "TO_DOUBLE",
              "title": "toDouble",
              "description": " <<Please put clear description about logic of translator>>"
            },
            {
              "name": "TO_INTEGER",
              "title": "toInteger",
              "description": " <<Please put clear description about logic of translator>>"
            }
          ],
          "description": "Method to translate the specified type"
        }

3. Replace simple definition of the "dataSource.field

Note : 

  • Replace "<<Description for FOLIO field>>" with details about FOLIO field.
  • Field "title" from "javaEnums" must be the same as path to FOLIO field in the JSON from "enum". This makes it easier to build a list of fields for the new API and improve documentation.

Specification : https://github.com/joelittlejohn/jsonschema2pojo/wiki/Reference#javaenumnames

Folio fields
    "field": {
      "type": "string",
      "description": "Field name of the mapping",
      "enum": [
        "poLine.eresource.accessProvider",
        "poLine.acquisitionMethod",
        "po.acqUnitIds",
          ...
        "poLine.cost.quantityElectronic",
        "poLine.cost.quantityPhysical",
        ...
      ],
      "javaEnums": [
        {
          "name": "ACCESS_PROVIDER",
          "title": "poLine.eresource.accessProvider",
          "description": "<<Description for FOLIO field>>"
        },
        {
          "name": "ACQUISITION_METHOD",
          "title": "poLine.acquisitionMethod",
          "description": " <<Description for FOLIO field>>"
        },
        {
          "name": "LOOKUP_ACQUISITION_UNIT_DEFAULT_ACQ_UNIT_NAME",
          "title": "po.acqUnitIds",
          "description": "<<Description for FOLIO field>>"
        },
        ....,
        {
          "name": "QUANTITY_ELECTRONIC",
          "title": "poLine.cost.quantityElectronic",
          "description": " <<Description for FOLIO field>>"
        },
        {
          "name": "QUANTITY_PHYSICAL",
          "title": "poLine.cost.quantityPhysical",
          "description": "<<Description for FOLIO field>>"
        }
        ...
      ]
    }

Create new schemas for retrieving list of Fields and Translators

Schemas and samples should be placed in the acq-models module

  1. Create new directory in "mod-gobi"
  2. Create schema and sample (fields.sample) for fields (field.json +folio_order_fields.json) collection


field.json
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "description": "Field description",
  "type": "object",
  "properties": {
    "name": {
      "description": "Name of the field",
      "type": "string"
    },
    "path": {
      "description": "Path to field",
      "type": "string"
    },
    "description": {
      "description": "Description of the field",
      "type": "string"
    }
  }
}

folio_order_fields.json
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "description": "Collection of pairs field name and path in the JSON",
  "type": "object",
  "properties": {
    "fields": {
      "description": "An array of pairs field name and path in the JSON",
      "id": "fields",
      "type": "array",
      "items": {
        "type": "object",
        "$ref": "field.json"
      }
    },
    "totalRecords": {
      "description": "total number of records in the array",
      "type": "integer"
    }
  },
  "required": [
    "fields",
    "totalRecords"
  ]
}


folio_order_fields.sample
{
  "fields": [
    {
      "name": "PREFIX",
      "path": "po.poNumberPrefix",
      "description": "Purchase order prefix"
    },
    {
      "name": "QUANTITY_ELECTRONIC",
      "path": "poLine.cost.quantityElectronic",
      "description": "Purchase order line electronic quantity"
    }
  ],
  "totalRecords": 1
}
 

3. Create schema and sample for translators collection


translator.json
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "description": "Translator description",
  "type": "object",
  "properties": {
    "name": {
      "description": "Name of the translator",
      "type": "string"
    },
    "translator": {
      "description": "Path to field",
      "type": "string"
    },
    "description": {
      "description": "Description of the translator",
      "type": "string"
    }
  }
}

folio_order_translators.json
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "description": "Collection of pairs translator Java method name and name of translator",
  "type": "object",
  "properties": {
    "translators": {
      "description": "An array of pairs translator Java method name and name of translator",
      "id": "translators",
      "type": "array",
      "items": {
        "type": "object",
        "$ref": "translator.json"
      }
    },
    "totalRecords": {
      "description": "total number of records in the array",
      "type": "integer"
    }
  },
  "required": [
    "translators",
    "totalRecords"
  ]
}
  


folio_order_translators.sample
{
  "translators": [
    {
      "name": "LOOKUP_LINKED_PACKAGE",
      "translator": "lookupLinkedPackage",
      "description": "Lookup purchase order line UUID by order line number"
    },
    {
      "name": "LOOKUP_SUFFIX",
      "translator": "lookupSuffix",
      "description": "Lookup suffix UUID for purchase order number"
    }
  ],
  "totalRecords": 1
}
  

4. Create new schema OrderMappingsView.json for showing Mapping on UI


OrderMappingsView
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
          "mappingType": {
            "type": "string",
			"readonly": true,
            "description": "The type of the GOBI mapping",
            "enum": [
              "Default",
              "Custom"
            ],
      		"default": "Default"
          },
          "mapping": {
            "type": "object",
			"readonly": true,
       		"description": "Gobi mapping",
      		"$ref": "mapping.json"
          }        
  },
  "additionalProperties": false,
  "required": [
          "mappingType",
          "mapping"
        ]
}


5. Create new schema OrderMappingsViewCollection.json for showing Mapping on UI

OrderMappingsViewCollection
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "description": "Collection of the order mapping view",
  "type": "object",
  "properties": {
    "orderMappingsViews": {
      "description": "Collection of the order mapping view",
      "type": "array",
      "id": "orderMappingsViews",
      "items": {
        "type": "object",
        "$ref": "OrderMappingsView.json"
      }
    },
    "totalRecords": {
      "description": "The number of objects contained in this collection",
      "type": "integer"
    }
  },
  "additionalProperties": false,
  "required": [
    "orderMappingsViews",
    "totalRecords"
  ]
}


APIs

Retrieve Fields and Translators and mapping Types

Create new RAML file mod-gobi\ramls\gobi-mappings.raml(if not created) and add endpoints

Method

Path

Request

Response

Description

Interface

Notes

GET

/gobi/orders/mappings/fields

NA

folio_order_fields

Return list of FOLIO fields

gobi.mappinngs.fields

Status : 200

Permission: gobi.mappinngs.fields.collection.get

GET

/gobi/orders/mappings/translators

NA

folio_order_translators

Return list of FOLIO translators

gobi.mappinngs.translators

Status : 200

Permission: gobi.mappinngs.translators.collection.get

GET/gobi/orders/mappings/typesNA

Collection of ENUMfrom OrderMappings.json: /gobi/orders/mappings/types 

"orderType": { "type": "string", "description": "The type of the GOBI order", "enum": [ "ListedElectronicMonograph", "ListedElectronicSerial", "ListedPrintMonograph", "ListedPrintSerial", "UnlistedPrintMonograph", "UnlistedPrintSerial" ] }

Return list of mapping types
gobi.mappinngs.types

Status : 200

Permission: gobi.mappinngs.types.collection.get

Fields and Translator APIs
#%RAML 1.0
title: GOBI® (Global Online Bibliographic Information) Integration
............
types:
  mapping-fields: !include acq-models/mod-gobi/schemas/folio_order_fields.json
  mapping-translators: !include acq-models/mod-gobi/schemas/folio_order_translators.json

/gobi:
  ..........
  /orders:
........
    /mappings:
      /fields:
        displayName: Folio fields allowable for mapping
        description: Folio fields allowable for mapping
        get:
          description: Get list of Folio fields
          responses:
            200:
              description: "Returns a list of fields"
              body:
                application/json:
                  type: mapping-fields
                  example:
                    strict: false
                    value: !include acq-models/mod-gobi/examples/folio_order_fields.sample
      /translators:
        displayName: Gobi fields to Folio fields translators
        description: Gobi fields to Folio fields translators
        get:
          description: Get list of Gobi fields to Folio fields translators
          responses:
            200:
              description: "Returns a list of translators"
              body:
                application/json:
                  type: mapping-translators
                  example:
                    strict: false
                    value: !include acq-models/mod-gobi/examples/folio_order_translators.sample

GOBI mapping

Create new RAML file mod-gobi\ramls\gobi-mappings.raml(if not created) and add endpoints

1. Define API for retrieving GOBI mapping
1.1 Add new schema OrderMappingsCollection.json which is collection of mod-gobi\src\main\resources\OrderMappings.json
1.2 Create new endpoint "/mappings" in the mod-gobi\ramls\gobi-mappings.raml.


Method

Path

Request

Response

Description

Interface

Notes

GET

/gobi/orders/custom-mappings

NAOrderMappingsViewCollection.jsonReturn list of GOBI mapping collection

gobi.mappings

Status : 200

Permission: gobi.custom-mappings.collection.get

GET

/gobi/orders/custom-mappings/<orderType>

NAOrderMappingsView.jsonReturn item of GOBI mapping specified type OrderMappings.json: /gobi/orders/mappings/types

gobi.mappings

Status : 200

Permission: gobi.custom-mappings.item.get

POST

/gobi/orders/custom-mappings

OrderMappings.jsonOrderMappingsView.jsonCreate custom GOBI mapping for specific type from OrderMappings.json: /gobi/orders/mappings/types

gobi.mappings

Status : 201

Permission: gobi.custom-mappings.item.post

PUT 

/gobi/orders/custom-mappings/<orderType>

OrderMappings.jsonNAUpdate GOBI mapping for specific type from OrderMappings.json: /gobi/orders/mappings/types

gobi.mappings

Status : 204

Permission: gobi.custom-mappings.item.put

DELETE

/gobi/orders/custom-mappings/<orderType>

NANADelete GOBI mapping by specified type from OrderMappings.json: /gobi/orders/mappings/types

gobi.mappings

Status : 204

Permission: gobi.custom-mappings.item.delete

Design

Implement APIs for retrieving Fields, Translators and mapping Types 

  1. Create business service
  2. Read and parse file mapping.json and this should only happen once
Code Example
    java.net.URL mappingJson = ClassLoader.getSystemClassLoader().getResource("../mapping.json");
    String jsonString = new String(mappingJson.openStream().readAllBytes(), StandardCharsets.UTF_8);
    JsonObject jsonObject = new JsonObject(jsonString);

Path to Translators : new JsonObject(jsonString).getJsonObject("properties").getJsonObject("dataSource").getJsonObject("properties").getJsonObject("translation").getJsonArray("javaEnums")

Path to Fields : new JsonObject(jsonString).getJsonObject("properties").getJsonObject("field").getJsonArray("javaEnums")

3. Map Fields to folio_order_fields.json ( Create news schemas for retrieving list of Fields and Translators)

4. Map Translators to folio_order_translators.json  ( Create news schemas for retrieving list of Fields and Translators)

Implement API for retrieving GOBI mapping configs

Configs now are stored in the mod-configuration and should be stored in the mod-configuration
Example for ListedPrintMonograph

Example for ListedPrintMonograph
{
  "module": "GOBI",
  "configName": "orderMappings",
  "code": "gobi.order.ListedPrintMonograph",
  "description": "GOBI order mappings",
  "enabled": true,
  "value": "{\n  \"orderType\": \"ListedPrintMonograph\",\n  \"mappings\": [\n    {\n      \"field\": \"ACQUISITION_METHOD\",\n      \"dataSource\": {\n        \"default\": \"Purchase At Vendor System\"\n      }\n    },\n    {\n      \"field\": \"APPROVED\",\n      \"dataSource\": {\n        \"default\": \"true\",\n        \"translation\": \"toBoolean\",\n        \"translateDefault\": true\n      }\n    },\n    {\n      \"field\": \"CLAIMED\",\n      \"dataSource\": {\n        \"default\": \"true\",\n        \"translation\": \"toBoolean\",\n        \"translateDefault\": true\n      }\n    },\n    {\n      \"field\": \"COLLECTION\",\n      \"dataSource\": {\n        \"default\": \"false\",\n        \"translation\": \"toBoolean\",\n        \"translateDefault\": true\n      }\n    },\n    {\n      \"field\": \"CONTRIBUTOR\",\n      \"dataSource\": {\n        \"from\": \"//datafield[@tag='100']/*\",\n        \"combinator\": \"concat\"\n      }\n    },\n    {\n      \"field\": \"CONTRIBUTOR_NAME_TYPE\",\n      \"dataSource\": {\n        \"default\": \"Personal name\",\n        \"translation\": \"lookupContributorNameTypeId\",\n        \"translateDefault\": true\n      }\n    },\n    {\n      \"field\": \"CURRENCY\",\n      \"dataSource\": {\n        \"from\": \"//ListPrice/Currency\",\n        \"default\": \"USD\"\n      }\n    },\n    {\n      \"field\": \"DATE_ORDERED\",\n      \"dataSource\": {\n        \"from\": \"//OrderPlaced\",\n        \"translation\": \"toDate\"\n      }\n    },\n    {\n      \"field\": \"FUND_ID\",\n      \"dataSource\": {\n        \"from\": \"//FundCode\",\n        \"translation\": \"lookupFundId\"\n      }\n    },\n    {\n      \"field\": \"FUND_CODE\",\n      \"dataSource\": {\n        \"from\": \"//FundCode\"\n      }\n    },\n    {\n      \"field\": \"FUND_PERCENTAGE\",\n      \"dataSource\": {\n        \"default\": \"100\",\n        \"translation\": \"toDouble\",\n        \"translateDefault\": true\n      }\n    },\n    {\n      \"field\": \"VENDOR_INSTRUCTIONS\",\n      \"dataSource\": {\n        \"from\": \"//OrderNotes\",\n        \"default\": \"N/A\"\n      }\n    },\n    {\n      \"field\": \"LIST_UNIT_PRICE\",\n      \"dataSource\": {\n        \"from\": \"//ListPrice/Amount\",\n        \"default\": \"0\",\n        \"translation\": \"toDouble\",\n        \"translateDefault\": true\n      }\n    },\n    {\n      \"field\": \"LOCATION\",\n      \"dataSource\": {\n        \"from\": \"//Location\",\n        \"default\": \"*\",\n        \"translation\": \"lookupLocationId\",\n        \"translateDefault\": true\n      }\n    },\n    {\n      \"field\": \"MANUAL_PO\",\n      \"dataSource\": {\n        \"default\": \"false\",\n        \"translation\": \"toBoolean\",\n        \"translateDefault\": true\n      }\n    },\n    {\n      \"field\": \"ORDER_TYPE\",\n      \"dataSource\": {\n        \"default\": \"One-Time\"\n      }\n    },\n    {\n      \"field\": \"PO_LINE_ORDER_FORMAT\",\n      \"dataSource\": {\n        \"default\": \"Physical Resource\"\n      }\n    },\n    {\n      \"field\": \"PO_LINE_PAYMENT_STATUS\",\n      \"dataSource\": {\n        \"default\": \"Awaiting Payment\"\n      }\n    },\n    {\n      \"field\": \"PO_LINE_RECEIPT_STATUS\",\n      \"dataSource\": {\n        \"default\": \"Awaiting Receipt\"\n      }\n    },\n    {\n      \"field\": \"PRODUCT_ID\",\n      \"dataSource\": {\n        \"from\": \"//datafield[@tag='020']/subfield[@code='a']\",\n        \"translation\": \"truncateISBNQualifier\"\n      }\n    },\n    {\n      \"field\": \"PRODUCT_ID_TYPE\",\n      \"dataSource\": {\n        \"default\": \"ISBN\",\n        \"translation\": \"lookupProductIdType\",\n        \"translateDefault\": true\n      }\n    },\n    {\n      \"field\": \"PRODUCT_QUALIFIER\",\n      \"dataSource\": {\n        \"from\": \"//datafield[@tag='020']/subfield[@code='q']\",\n        \"defaultMapping\": {\n          \"dataSource\": {\n            \"from\": \"//datafield[@tag='020']/subfield[@code='a']\",\n            \"translation\": \"separateISBNQualifier\"\n          }\n        }\n      }\n    },\n    {\n      \"field\": \"PUBLICATION_DATE\",\n      \"dataSource\": {\n        \"from\": \"//datafield[@tag='260']/subfield[@code='c']\"\n      }\n    },\n    {\n      \"field\": \"PUBLISHER\",\n      \"dataSource\": {\n        \"from\": \"//datafield[@tag='260']/subfield[@code='b']\"\n      }\n    },\n    {\n      \"field\": \"QUANTITY_PHYSICAL\",\n      \"dataSource\": {\n        \"from\": \"//Quantity\",\n        \"default\": \"1\",\n        \"translation\": \"toInteger\"\n      }\n    },\n    {\n      \"field\": \"SOURCE\",\n      \"dataSource\": {\n        \"default\": \"API\"\n      }\n    },\n    {\n      \"field\": \"TITLE\",\n      \"dataSource\": {\n        \"from\": \"//datafield[@tag='245']/*\",\n        \"combinator\": \"concat\"\n      }\n    },\n    {\n      \"field\": \"VENDOR\",\n      \"dataSource\": {\n        \"default\": \"GOBI\",\n        \"translation\": \"lookupOrganization\",\n        \"translateDefault\": true\n      }\n    },\n    {\n      \"field\": \"MATERIAL_SUPPLIER\",\n      \"dataSource\": {\n        \"default\": \"GOBI\",\n        \"translation\": \"lookupOrganization\",\n        \"translateDefault\": true\n      }\n    },\n    {\n      \"field\": \"VENDOR_ACCOUNT\",\n      \"dataSource\": {\n        \"from\": \"//SubAccount\",\n        \"default\": \"0\"\n      }\n    },\n    {\n      \"field\": \"VENDOR_REF_NO\",\n      \"dataSource\": {\n        \"from\": \"//YBPOrderKey\"\n      }\n    },\n    {\n      \"field\": \"VENDOR_REF_NO_TYPE\",\n      \"dataSource\": {\n        \"default\": \"Vendor order reference number\"\n      }\n    },\n    {\n      \"field\": \"WORKFLOW_STATUS\",\n      \"dataSource\": {\n        \"default\": \"Open\"\n      }\n    },\n    {\n      \"field\": \"MATERIAL_TYPE\",\n      \"dataSource\": {\n        \"from\": \"//LocalData[Description='LocalData1']/Value\",\n        \"default\": \"unspecified\",\n        \"translation\": \"lookupMaterialTypeId\",\n        \"translateDefault\": true\n      }\n    },\n    {\n      \"field\": \"LINKED_PACKAGE\",\n      \"dataSource\": {\n        \"from\": \"//LocalData[Description='LocalData2']/Value\",\n        \"translation\": \"lookupLinkedPackage\"\n      }\n    },\n    {\n      \"field\": \"SHIP_TO\",\n      \"dataSource\": {\n        \"from\": \"//LocalData[Description='LocalData3']/Value\",\n        \"translation\": \"lookupConfigAddress\"\n      }\n    },\n    {\n      \"field\": \"PREFIX\",\n      \"dataSource\": {\n        \"from\": \"//LocalData[Description='LocalData4']/Value\",\n        \"translation\": \"lookupPrefix\"\n      }\n    }\n  ]\n}"
}

Work Breakdown Structure


WorkCommentsStory~ Estimate
1

1.1 Create schemas for fields and translators mapping → Create news schemas for retrieving list of Fields and Translators

1.2 Update mapping schema → Update schema mapping.json

acq-models, mod-gobi


MODGOBI-160 - Getting issue details... STATUS


1
2

2.1 Define new APIs for retrieving Fields, Translators and mapping Types → Retrieve Fields and Translators and mapping Types

2.2 Implement created APIs → Implement APIs for retrieving Fields, Translators and mapping Types

mod-gobi

MODGOBI-161 - Getting issue details... STATUS

3
3

3.1 Define API GOBI integration default or custom mappings based on order type → APIs GOBI mapping

3.2 Implement API GOBI integration default or custom mappings based on order type → Implement API for retrieving GOBI mapping configs

mod-gobi

MODGOBI-157 - Getting issue details... STATUS

3

Open Items

QuestionAnswerStory
  • Provide an interface that is only available to users with specific permissions that displays the information need to connect FOLIO and GOBI APIs (Eg. URL, API Key)

Raman Auramau Could you please help with design API Key showing?

Investigate : FOLIO secrets management

(Raman A) The mod-inn-reach by Volaris team can be used as an example of implementing very similar functionality. The logic there is as follows - when interacting with an external system, API Keys are used. When setting up such a interaction, an administrator can click the Generate keys button on the UI, and a pair of keys (API key & secret key) will be generated and saved. The keys are simply stored in the database. On the UI, one can then see these keys (access by permissions!)
Here are the entity classes:
https://github.com/folio-org/mod-inn-reach/blob/master/src/main/java/org/folio/innreach/domain/entity/LocalServerCredentials.java
https://github.com/folio-org/mod-inn-reach/blob/master/src/main/java/org/folio/innreach/domain/entity/CentralServerCredentials.java
So, I suggest that someone from the Thunderjet team take a look at this example in mod-inn-reach / ui-inn-reach modules, and use the approach.
Andrei Makaranka - did this information help? Let me know if there will be any concerns.