Переніс логіки PQ бота до ЦБД

В цьому розділі описана логіка відмови від PQ бота і переносу валідацій з боту в ЦБД під час активації тендеру.

Створення тендеру

Створення тендеру залишається незмінним для PQ. Створюється тендер так само як і раніше в статусі draft:

POST /api/2.5/tenders?opt_pretty=1 HTTP/1.0
Authorization: Bearer broker
Content-Length: 4542
Content-Type: application/json
Host: lb-api-sandbox.prozorro.gov.ua

{
  "data": {
    "title": "Комп’ютерне обладнання",
    "mainProcurementCategory": "goods",
    "procuringEntity": {
      "name": "Державне управління справами",
      "identifier": {
        "scheme": "UA-EDR",
        "id": "00037256",
        "uri": "http://www.dus.gov.ua/"
      },
      "address": {
        "countryName": "Україна",
        "postalCode": "01220",
        "region": "м. Київ",
        "locality": "м. Київ",
        "streetAddress": "вул. Банкова, 11, корпус 1"
      },
      "contactPoint": {
        "name": "Державне управління справами",
        "telephone": "+0440000000"
      },
      "kind": "general"
    },
    "value": {
      "amount": 22000,
      "currency": "UAH"
    },
    "tenderPeriod": {
      "endDate": "2023-10-04T01:00:00+03:00"
    },
    "procurementMethodType": "priceQuotation",
    "procurementMethod": "selective",
    "items": [
      {
        "description": "Комп’ютерне обладнання",
        "quantity": 5,
        "deliveryDate": {
          "startDate": "2023-09-22T01:00:00+03:00",
          "endDate": "2023-09-25T01:00:00+03:00"
        },
        "unit": {
          "name": "кг",
          "code": "KGM",
          "value": {
            "amount": 6
          }
        },
        "deliveryAddress": {
          "countryName": "Україна",
          "postalCode": "79000",
          "region": "м. Київ",
          "locality": "м. Київ",
          "streetAddress": "вул. Банкова 1"
        },
        "classification": {
          "scheme": "ДК021",
          "id": "44617100-9",
          "description": "Cartons"
        },
        "profile": "655360-30230000-889652-40000777",
        "additionalClassifications": [
          {
            "scheme": "INN",
            "id": "17.21.1",
            "description": "папір і картон гофровані, паперова й картонна тара"
          }
        ]
      }
    ],
    "agreement": {
      "id": "2e14a78a2074952d5a2d256c3c004dda"
    },
    "criteria": [...]
  },
  "config": {
    "hasAuction": false,
    "hasAwardingOrder": true,
    "hasValueRestriction": true,
    "valueCurrencyEquality": true,
    "hasPrequalification": false,
    "minBidsNumber": 1,
    "hasPreSelectionAgreement": true
  }
}


HTTP/1.0 201 Created
Content-Type: application/json
Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/bb8949e735294cbaa864bd3bc68a1e5f

{
  "data": {
    "mainProcurementCategory": "goods",
    "procurementMethod": "selective",
    "title": "Комп’ютерне обладнання",
    "procurementMethodType": "priceQuotation",
    "awardCriteria": "lowestCost",
    "status": "draft",
    "agreement": {
      "id": "2e14a78a2074952d5a2d256c3c004dda"
    },
    "value": {
      "amount": 22000.0,
      "currency": "UAH",
      "valueAddedTaxIncluded": true
    },
    "tenderPeriod": {
      "endDate": "2023-10-04T01:00:00+03:00",
      "startDate": "2023-09-20T01:00:00+03:00"
    },
    "procuringEntity": {
      "name": "Державне управління справами",
      "identifier": {
        "scheme": "UA-EDR",
        "id": "00037256",
        "uri": "http://www.dus.gov.ua/"
      },
      "address": {
        "streetAddress": "вул. Банкова, 11, корпус 1",
        "locality": "м. Київ",
        "region": "м. Київ",
        "postalCode": "01220",
        "countryName": "Україна"
      },
      "contactPoint": {
        "telephone": "+0440000000",
        "name": "Державне управління справами"
      },
      "kind": "general"
    },
    "items": [
      {
        "id": "6d463cf854bc4c0eb04915ba7c172bea",
        "description": "Комп’ютерне обладнання",
        "classification": {
          "description": "Cartons",
          "scheme": "ДК021",
          "id": "44617100-9"
        },
        "quantity": 5.0,
        "deliveryDate": {
          "startDate": "2023-09-22T01:00:00+03:00",
          "endDate": "2023-09-25T01:00:00+03:00"
        },
        "deliveryAddress": {
          "streetAddress": "вул. Банкова 1",
          "locality": "м. Київ",
          "region": "м. Київ",
          "postalCode": "79000",
          "countryName": "Україна"
        },
        "additionalClassifications": [
          {
            "scheme": "INN",
            "id": "17.21.1",
            "description": "папір і картон гофровані, паперова й картонна тара"
          }
        ],
        "unit": {
          "name": "кг",
          "value": {
            "amount": 6.0,
            "currency": "UAH",
            "valueAddedTaxIncluded": true
          },
          "code": "KGM"
        },
        "profile": "655360-30230000-889652-40000777"
      }
    ],
    "criteria": [...],
    "tenderID": "UA-2023-09-20-000001-a",
    "owner": "broker",
    "date": "2023-09-20T01:00:00+03:00",
    "dateCreated": "2023-09-20T01:00:00+03:00",
    "dateModified": "2023-09-20T01:00:00+03:00",
    "id": "bb8949e735294cbaa864bd3bc68a1e5f"
  },
  "config": {
    "hasAuction": false,
    "hasAwardingOrder": true,
    "hasValueRestriction": true,
    "valueCurrencyEquality": true,
    "hasPrequalification": false,
    "minBidsNumber": 1,
    "hasPreSelectionAgreement": true
  },
  "access": {
    "token": "d3c6750ff65148df856b59e65feba396",
    "transfer": "310d898a127548d195e67ab4293aaa05"
  }
}

Редагування тендеру

Замовник може редагувати закупівлю перед активацією. В попередньому флоу з використанням PQ бота був такий самий етап перед публікацією (до зміни статусу на draft.publishing).

Активація тендеру

В попередньому флоу після створення Замовник публікував процедуру, змінивши статус на draft.publishing, де робот priceQuotationBot запускав перевірку процедури та доповнював процедуру додатковими даними, отриманими з бази даних електронних каталогів ProZorro, включаючи shortListedFirms.

Після успішної валідації priceQuotationBot переводив процедуру в статус: active.tendering чи draft.unsuccessful у разі, якщо процедура не проходила перевірку через недійсні параметри.

Тепер ми переносимо всю логіку валідації до ЦБД і перевіряємо це на моменті, коли замовник змінює статус процедури на active.tendering через PATCH тендеру.

Валідації бота PQ:

  • Наявність профілю товару в каталозі

  • Наявність відповідного договору

  • Перевірка, що угода в профілі та пов’язана угода в тендері однакові

  • Угода не повинна бути розірвана (статус terminated)

  • Угода має кваліфікованих постачальників (suppliers)

Можливі помилки

Якщо Замовник спробує активувати процедуру PQ з неіснуючим профілем у каталозі, ми побачимо помилку:

PATCH /api/2.5/tenders/bb8949e735294cbaa864bd3bc68a1e5f?acc_token=d3c6750ff65148df856b59e65feba396 HTTP/1.0
Authorization: Bearer broker
Content-Length: 40
Content-Type: application/json
Host: lb-api-sandbox.prozorro.gov.ua

{
  "data": {
    "status": "active.tendering"
  }
}


HTTP/1.0 422 Unprocessable Entity
Content-Type: application/json

{
  "status": "error",
  "errors": [
    {
      "location": "body",
      "name": "items.profile",
      "description": "Profile 655360-30230000-889652-40000777 not found in catalogue."
    }
  ]
}

Якщо Замовник спробує активувати процедуру PQ з неіснуючим договором, буде згенеровано наступну помилку:

PATCH /api/2.5/tenders/bb8949e735294cbaa864bd3bc68a1e5f?acc_token=d3c6750ff65148df856b59e65feba396 HTTP/1.0
Authorization: Bearer broker
Content-Length: 40
Content-Type: application/json
Host: lb-api-sandbox.prozorro.gov.ua

{
  "data": {
    "status": "active.tendering"
  }
}


HTTP/1.0 422 Unprocessable Entity
Content-Type: application/json

{
  "status": "error",
  "errors": [
    {
      "location": "body",
      "name": "agreement",
      "description": "Agreement not found"
    }
  ]
}

Якщо угода (agreement) в профілі та угода в тендері не однакові, буде згенеровано наступну помилку:

PATCH /api/2.5/tenders/bb8949e735294cbaa864bd3bc68a1e5f?acc_token=d3c6750ff65148df856b59e65feba396 HTTP/1.0
Authorization: Bearer broker
Content-Length: 40
Content-Type: application/json
Host: lb-api-sandbox.prozorro.gov.ua

{
  "data": {
    "status": "active.tendering"
  }
}


HTTP/1.0 422 Unprocessable Entity
Content-Type: application/json

{
  "status": "error",
  "errors": [
    {
      "location": "body",
      "name": "agreement",
      "description": "Tender agreement doesn't match profile agreement"
    }
  ]
}

Якщо угода розірвана:

PATCH /api/2.5/tenders/bb8949e735294cbaa864bd3bc68a1e5f?acc_token=d3c6750ff65148df856b59e65feba396 HTTP/1.0
Authorization: Bearer broker
Content-Length: 40
Content-Type: application/json
Host: lb-api-sandbox.prozorro.gov.ua

{
  "data": {
    "status": "active.tendering"
  }
}


HTTP/1.0 422 Unprocessable Entity
Content-Type: application/json

{
  "status": "error",
  "errors": [
    {
      "location": "body",
      "name": "agreement",
      "description": "Agreement status is not active"
    }
  ]
}

Якщо є проблема з підключенням до електронних каталогів ProZorro, ми побачимо помилку:

PATCH /api/2.5/tenders/bb8949e735294cbaa864bd3bc68a1e5f?acc_token=d3c6750ff65148df856b59e65feba396 HTTP/1.0
Authorization: Bearer broker
Content-Length: 40
Content-Type: application/json
Host: lb-api-sandbox.prozorro.gov.ua

{
  "data": {
    "status": "active.tendering"
  }
}


HTTP/1.0 409 Conflict
Content-Type: application/json

{
  "status": "error",
  "errors": [
    {
      "location": "body",
      "name": "data",
      "description": "Error while getting data from ProZorro e-Catalogues: Connection closed. Try again later"
    }
  ]
}

Успішний сценарій

Якщо процедура PQ відповідає всім вимогам, вона буде переведена в статус active.tendering:

GET /api/2.5/tenders/511ad32c232540d693bcdda2dd603406 HTTP/1.0
Authorization: Bearer broker
Host: public-api-sandbox.prozorro.gov.ua


HTTP/1.0 200 OK
Content-Type: application/json

{
  "data": {
    "date": "2023-09-20T01:00:00+03:00",
    "dateModified": "2023-09-20T01:00:00+03:00",
    "dateCreated": "2023-09-20T01:00:00+03:00",
    "tenderID": "UA-2023-09-20-000001-a",
    "owner": "broker",
    "title": "Комп’ютерне обладнання",
    "mainProcurementCategory": "goods",
    "procurementMethod": "selective",
    "procurementMethodType": "priceQuotation",
    "awardCriteria": "lowestCost",
    "status": "active.tendering",
    "agreement": {
      "id": "2e14a78a2074952d5a2d256c3c004dda"
    },
    "value": {
      "amount": 22000.0,
      "currency": "UAH",
      "valueAddedTaxIncluded": true
    },
    "tenderPeriod": {
      "startDate": "2023-09-20T01:00:00+03:00",
      "endDate": "2023-10-04T01:00:00+03:00"
    },
    "procuringEntity": {
      "name": "Державне управління справами",
      "identifier": {
        "scheme": "UA-EDR",
        "id": "00037256",
        "uri": "http://www.dus.gov.ua/"
      },
      "address": {
        "streetAddress": "вул. Банкова, 11, корпус 1",
        "locality": "м. Київ",
        "region": "м. Київ",
        "postalCode": "01220",
        "countryName": "Україна"
      },
      "contactPoint": {
        "telephone": "+0440000000",
        "name": "Державне управління справами"
      },
      "kind": "general"
    },
    "noticePublicationDate": "2023-09-20T01:00:00+03:00",
    "items": [
      {
        "id": "1624a28ab11b43cabcaef9018c023a16",
        "description": "Комп’ютерне обладнання",
        "classification": {
          "description": "Cartons",
          "scheme": "ДК021",
          "id": "44617100-9"
        },
        "quantity": 5.0,
        "deliveryDate": {
          "startDate": "2023-09-22T01:00:00+03:00",
          "endDate": "2023-09-25T01:00:00+03:00"
        },
        "deliveryAddress": {
          "streetAddress": "вул. Банкова 1",
          "locality": "м. Київ",
          "region": "м. Київ",
          "postalCode": "79000",
          "countryName": "Україна"
        },
        "additionalClassifications": [
          {
            "scheme": "INN",
            "id": "17.21.1",
            "description": "папір і картон гофровані, паперова й картонна тара"
          }
        ],
        "unit": {
          "name": "кг",
          "value": {
            "amount": 6.0,
            "currency": "UAH",
            "valueAddedTaxIncluded": true
          },
          "code": "KGM"
        },
        "profile": "655360-30230000-889652-40000777"
      }
    ],
    "criteria": [...],
    "contractTemplateName": "00000000-0.0001.01",
    "next_check": "2023-10-04T01:00:00+03:00",
    "id": "bb8949e735294cbaa864bd3bc68a1e5f"
  },
  "config": {
    "hasAuction": false,
    "hasAwardingOrder": true,
    "hasValueRestriction": true,
    "valueCurrencyEquality": true,
    "hasPrequalification": false,
    "minBidsNumber": 1,
    "hasPreSelectionAgreement": true
  }
}

В процедурі більше не буде поля shortlistedFirms. Під час подання/активації біда буде працювати валідація, що bid.tenderers має бути вказаний в договорі як кваліфікований постачальник.

Висновки

Процедура PQ більше не матиме статусів draft.publishing, draft.unsuccessful.

Якщо процедура PQ не відповідає всім вимогам, її не буде переведено в active.tendering, доки не буде виконано всі вимоги.

Логіка створення та редагування процедури PQ не буде змінена.

Подальші дії після статусу active.tendering залишаються незмінними.