Concept doc: BRD-NAV-integration

Navision PIM integration

Для ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΠΈ PIM ΠΈ NAV прСдлагаСтся ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ GraphQL API. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ NAV смоТСт сам Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ ΠΊΠ°ΠΊΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Π΅, Π·Π° ΠΊΠ°ΠΊΠΎΠΉ ΠΏΠ΅Ρ€ΠΈΠΎΠ΄ ΠΈ ΠΊΠΎΠ³Π΄Π° Π΅ΠΌΡƒ Π½ΡƒΠΆΠ½Ρ‹.

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΎΠ΄Π΅ΠΌΠΎΠ½ΡΡ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρƒ Π½Π° стСйдТС собрано нСбольшоС Π΄Π²Π° Π½Π΅Π±ΠΎΠ»ΡŒΡˆΠΈΡ… Π΄Π΅ΠΌΠΎ запроса:

Π Π°Π±ΠΎΡ‚Π° с ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚Π°ΠΌΠΈ

ВСкст запроса Π½Π° ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ Π³Ρ€ΡƒΠΏΠΏΡ‹ ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚ΠΎΠ²

Консоль для Π²Π²ΠΎΠ΄Π° запросов

query { # это запрос Π½Π° ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Ρ…, ΠΌΠΎΠΆΠ½ΠΎ Ρ‚Π°ΠΊ ΠΆΠ΅ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ запрос Π½Π° ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Ρ…
  getProductListing(
    # Π² Ρ€Π°ΠΌΠΊΠ°Ρ… запроса ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ язык для Π»ΠΎΠΊΠ°Π»Π·ΠΈΠ·ΡƒΠ΅ΠΌΡ‹Ρ… ΠΏΠΎΠ»Π΅ΠΉ
    defaultLanguage: "ru", 
    # ΠΌΠΎΠΆΠ½ΠΎ Π΄Π΅Π»Π°Ρ‚ΡŒ ΠΏΠ°Π³ΠΈΠ½Π°Ρ†ΠΈΡŽ, ΠΊ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρƒ Ρ‚ΡƒΡ‚ ΠΌΡ‹ пропускаСм ΠΏΠ΅Ρ€Π²Ρ‹Π΅ 5 ΠΈ Π±Π΅Ρ€Π΅ΠΌ 10 Π΅Π»Π΅ΠΌΠ΅Π½Ρ‚ΠΎΠ²
    first: 10, 
    after: 5, 
    # ΠΌΠΎΠΆΠ½ΠΎ Π·Π°Π΄Π°Ρ‚ΡŒ сортировку, ΠΊ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΏΠΎ Π΄Π°Ρ‚Π΅ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ Π² ΡƒΠ±Ρ‹Π²Π°ΡŽΡ‰Π΅ΠΌ порядкС
    sortBy: "o_modificationDate",
    sortOrder: "DESC",
    # самоС Π’ΠΠ–ΠΠžΠ•! Π€ΠΈΠ»ΡŒΡ‚Ρ€Π°, ΠΊ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρƒ ΠΏΠΎ Π΄Π°Ρ‚Π΅ измСнСния     
    filter: "{\"o_modificationDate\": {\"$gt\" :\"1573745345\"}}" ) {
    # сколько всСго записСй ΠΏΠΎΠΏΠ°Π΄Π°Π΅Ρ‚ Π² Π²Ρ‹Π±ΠΎΡ€ΠΊΡƒ     
    totalCount,
    edges {
    # список ΠΏΠΎΠ»Π΅ΠΉ для Π²Ρ‹Π±ΠΎΡ€ΠΊΠΈ
      node {
        id, # PIMCore ID, прСдполагаСмая Π·Π°ΠΌΠ΅Π½Π° Tetra ID
        article_no, # Π°Ρ€Ρ‚ΠΈΠΊΡƒΠ»
        barcode, # ΡˆΡ‚Ρ€ΠΈΡ…ΠΊΠΎΠ΄
        barcodeVariants, # Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹ ΡˆΡ‚Ρ€ΠΈΡ…ΠΊΠΎΠ΄ΠΎΠ²
        base_price, # базовая Ρ†Π΅Π½Π°
        # связь ΠΎΠ΄ΠΈΠ½ ΠΊΠΎ ΠΌΠ½ΠΎΠ³ΠΈΠΌ, катСгория это справочник
        category: category {
          ... on object_category {
            id, # Ρƒ ΠΏΠΎΠ»Π΅ΠΉ справочника Ρ‚ΠΎΠΆΠ΅ Π΅ΡΡ‚ΡŒ PIMCore ID
            fullpath, # пояснСниС ΠΊΠ°ΠΊ выглядит ΠΏΠΎΠ»Π½Ρ‹ΠΉ ΠΏΡƒΡ‚ΡŒ ΠΊ ΠΎΠ±ΡŒΠ΅ΠΊΡ‚Ρƒ
            classname, # класс ΠΎΠ±ΡŒΠ΅ΠΊΡ‚Π°, это ΠΈ ΠΏΡƒΡ‚ΡŒ Π²Ρ‹Π²Π΅Π΄Π΅Π½Π½Ρ‹ для ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°
          }
        },
        classname, # класс Π΅Π»Π΅ΠΌΠ΅Π½Ρ‚Π°
        code_tetra, # ΠΊΠΎΠ΄ Ρ‚Π΅Ρ‚Ρ€Ρ‹
        commercial_conditions, # это вычисляСмоС ΠΏΠΎΠ»Π΅, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ расчитываСтся ΠΏΠΎ Ρ„ΠΎΡ€ΠΌΡƒΠ»Π΅
        creationDate, # Π΄Π°Ρ‚Π° создания Π΅Π»Π΅ΠΌΠ΅Π½Ρ‚Π° Π² PIMCore
        modificationDate, # Π΄Π°Ρ‚Π° внСсСния измСния Π² позиция
        # Π’ΠΈΠΏ ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚Π° это Ρ‚ΠΎΠΆΠ΅ справочник         
        product_type: product_type {
          ... on object_productType {
            name, # Ρƒ нас ΠΈΠΌΠ΅Π½Π° ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚ΠΎΠ² Π±ΡƒΠ΄ΡƒΡ‚ Π½Π° русском, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΌΡ‹ ΡƒΠΊΠ°Π·Π°Π»ΠΈ
            # defaultLanguage: "ru" Π² Π½Π°Ρ‡Π°Π»Π΅ запроса, ΠΈ всС Π»ΠΎΠΊΠ°Π»ΠΈΠ·ΡƒΠ΅ΠΌΡ‹Π΅ поля ΠΏΠ΅Ρ€Π΅Π²Π΅Π»ΠΈΡΡŒ
            # Π² Π·Π°Π΄Π°Π½Π½Ρ‹ΠΉ язык Π»ΠΈΠ±ΠΎ Π²Π΅Ρ€Π½ΡƒΠ»ΠΈ falback ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄
            id, # ΠΈ Ρƒ Ρ‚ΠΈΠΏΠΎΠ² ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚ΠΎΠ² Ρ‚ΠΎΠΆΠ΅ Сст PIMCore ID
            modificationDate # ΠΈ Π΄Π°Ρ‚Π° внСсСния ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ
          }
        }
        # Ρƒ ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚Π° ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΎΡ‡Π΅Π½ΡŒ ΠΌΠ½ΠΎΠ³ΠΎ Π²ΠΈΠ΄ΠΎΠ² связСй с Ρ€Π°Π·Π½Ρ‹ΠΌΠΈ справочкниками
        surface: surface {
          ... on object_productSurface {
            name,
            id,
            fullpath,
            
          }
        }
      }
    }
  } 
}

Выглядит это Π²ΠΎΡ‚ Ρ‚Π°ΠΊ ΠŸΡ€ΠΈΠΌΠ΅Ρ€ запроса Π½Π° ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ Ρ‚ΠΎΠ²Π°Ρ€ΠΎΠ²

Π Π°Π±ΠΎΡ‚Π° со справочниками

ВСкст запроса Π½Π° ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ справочника

query { # это запрос Π½Π° ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ справочника
 getProductSurfaceListing(
  defaultLanguage: "ru" # Π»ΠΎΠΊΠ°Π·ΠΈΠΎΠ²Π°Π½Π½Ρ‹Π΅ поля ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ Π½Π° русском ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ
) {
  totalCount, # количСство Π΅Π»Π΅ΠΌΠ΅Π½Ρ‚ΠΎΠ² Π² справочникС
  edges {
    node {
      name, # имя Π΅Π»Π΅ΠΌΠ΅Π½Ρ‚Π° справочника Π½Π° русском
      id, # PIMCore ID Π΅Π»Π΅ΠΌΠ΅Π½Ρ‚Π° справочника
      modificationDate, # Π΄Π°Ρ‚Π° измСнСния
      classname # имя класса
    }
 }
 }
}

# Π’Π°ΠΆΠ½ΠΎ ΠΏΠΎΠ½ΠΈΠΌΠ°Ρ‚ΡŒ Ρ‡Ρ‚ΠΎ доступныС поля ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π΅Π³ΡƒΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ потрСбитСля Π΄Π°Π½Π½Ρ‹Ρ…
# Ρ‚Π°ΠΊΠΆΠ΅ Π½ΡƒΠΆΠ½ΠΎ ΠΏΠΎΠ½ΠΈΠΌΠ°Ρ‚ΡŒ Ρ‡Ρ‚ΠΎ для ΠΊΡ€ΡƒΠΏΠ½Ρ‹Ρ… справочников стоит Π²Ρ‹Π³Ρ€ΡƒΠΆΠ°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅
# каТдая систСма ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ свою Ρ‚ΠΎΡ‡ΠΊΡƒ Π°ΠΊΡ‚ΡƒΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π°ΠΊΡ‚ΡƒΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅
# для Π½Π΅Π΅ обновлСния ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ modificationDate - общСсистСмный Π°Ρ‚Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π΅ΡΡ‚ΡŒ Ρƒ всСх
# ΠΎΠ±ΡŒΠ΅ΠΊΡ‚ΠΎΠ² систСмы, Ρ‚Π°ΠΊ ΠΆΠ΅ ΠΊΠ°ΠΊ ΠΈ PIMCore ID.

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ выплолнСния запроса Π½Π° ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ справочника Бсылка Π½Π° консоль с Π²Π²Π΅Π΄Π΅Π½Π½Ρ‹ΠΌ запросом

Консоль

Π’ ΠΏΡ€Π°Π²ΠΎΠΉ части консоли запросов Π΅ΡΡ‚ΡŒ ΠΊΠ½ΠΎΠΏΠΊΠ° DOCS Кнопка DOCS ΠšΠΎΡ‚ΠΎΡ€Π°Ρ ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°Π΅Ρ‚ список доступных сущностСй ΠΈ ΠΏΠΎΠ»Π΅ΠΉ для ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ запросов Π² GraphQL, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Π΅Π΅ ΠΌΠΎΠΆΠ½ΠΎ Π»Π΅Π³ΠΊΠΎ ΠΏΠΎΠ½ΡΡ‚ΡŒ ΠΊΠ°ΠΊΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Π΅ Π² ΠΊΠ°ΠΊΠΎΠΌ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ приходят

Π¦Π΅Π»ΠΎΡΡ‚Π½ΠΎΡΡ‚ΡŒ Π΄Π°Π½Π½Ρ‹Ρ…

Для сохранСния цСлостности ΠΈ возмоТности ΠΈΠ½ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ обновлСния стоит ΠΎΠΏΠΈΡ€Π°Ρ‚ΡŒΡΡ Π½Π° ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ PIMCore ID ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ Ρƒ любого ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, ΠΊΠ°ΠΊ Ρƒ справочника, Ρ‚Π°ΠΊ ΠΈ Ρƒ Ρ‚ΠΎΠ²Π°Ρ€Π°.

Π€Π»ΠΎΡƒ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΎΠΌ ΠΈ справочниками

ΠœΠ΅Ρ‚ΠΎΠ΄ для обновлСния NavLoadedStatus Π² PIM

ΠœΠ΅Ρ‚ΠΎΠ΄ для обновлСния [loaded status] Π±Π΅Π· измСнСния [modification date] ΠœΠ΅Ρ‚ΠΎΠ΄ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ, Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ·ΠΎΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ влияниС установки статусов ΠΈΠΌΠΏΠΎΡ€Ρ‚Π° со стороны NAV Π½Π° ΡΠΈΠ½Ρ…Ρ€ΠΎΠ½ΠΈΠ·Π°Ρ†ΠΈΡŽ. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ установка статуса повлияСт Π½Π° Π΄ΠΎΡΡ‚ΡƒΠΏΠ½ΠΎΡΡ‚ΡŒ Ρ‚ΠΎΠ²Π°Ρ€Π°\справочника Π΄Ρ€ΡƒΠ³ΠΈΠΌ интСграциям, Π½ΠΎ ΠΏΡ€ΠΈ этом ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π° Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΈΠΌΠΏΠΎΡ€Ρ‚ всСх Ρ‚ΠΎΠ²Π°Ρ€ΠΎΠ² Π² NAV.

ΠœΠ΅Ρ‚ΠΎΠ΄ ΠΎΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Ρ‚ΡŒ ΠΊ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρƒ ΠΏΠΎ url: /api/nav/loadedstatus Π’ΠΈΠΏ запроса: PUT Payload:

{
    objects: [
    {
        id: 12321324 // PIMCore Object ID
        timestamp: 23314324234 // Linux Timestamp
    },
    {
        id: 32321324 // PIMCore Object ID
        timestamp: 23314324234 // Linux Timestamp
    },
    
    ],
    secret: "xxxxxxxxxx"
}

Π’ ΠΏΠΈΠΌ пСрСдаСтся список ΠΈΠ΄ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ NAVLoaded, ΠΈ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ timestamp для установки. Для минимальной бСзопасности вмСстС с Π½Π°Π±ΠΎΡ€ΠΎΠΌ для обновлСния Π½ΡƒΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ Π΅Ρ‰Π΅ ΠΈ сСкрСт. Π‘Π΅ΠΊΡ€Π΅Ρ‚ Π±ΡƒΠ΄Π΅Ρ‚ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒΡΡ Π² настройках ΠΏΠΈΠΌΠ°. ВсС запросы Π±Π΅Π· сСкрСта ΠΈΠ»ΠΈ с Π½Π΅ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½Ρ‹ΠΌ сСкрСтом Π±ΡƒΠ΄ΡƒΡ‚ ΠΎΡ‚ΠΊΠ»ΠΎΠ½Π΅Π½Ρ‹.

Responce:

{
    objects: [12321324, 32321324]
}

Π’ ΠΎΡ‚Π²Π΅Ρ‚ PIM Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ список ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ NAVLoaded для ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π±Ρ‹Π»ΠΎ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΎ.

test

curl:

curl --location --request PUT 'https://pim-stage.brocard.ua/api/nav/loadedstatus' \
--header 'Content-Type: application/json' \
--data-raw '{"objects":[{"id":25095,"timestamp":23314324234},{"id":25096,"timestamp":23314324234}],"secret":"xxxxxxxxxx"}'

powershell:

$headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]"
$headers.Add("Content-Type", "application/json")

$body = "{`"objects`":[{`"id`":25095,`"timestamp`":23314324234},{`"id`":25096,`"timestamp`":23314324234}],`"secret`":`"xxxxxxxxxx`"}"

$response = Invoke-RestMethod 'https://pim-stage.brocard.ua/api/nav/loadedstatus' -Method 'PUT' -Headers $headers -Body $body
$response | ConvertTo-Json