Transfer logic from PQ bot to CBD

This section describes the logic of refusal of the priceQuotationBot and transferring validations from the bot to the CBD during tender activation.

Creating tender

Tender creation remains unchanged for PQ. A tender is created in the same way as before in the status 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"
  }
}

Modifying tender

Procuring Entity can modify tender before activating. In previous flow with PQ bot there was the same stage before publishing (before changing status to draft.publishing).

Activating tender

In previous flow after creation Procuring Entity published procedure by changing status to draft.publishing where priceQuotationBot robot ran validation of the procedure and supplemented procedure with additional data taken from ProZorro e-Catalogues database including shortListedFirms.

After successful validation priceQuotationBot transmitted procedure to status: active.tendering or draft.unsuccessful in case if procedure did not pass validation due to invalid options.

Now we transfer all robot’s validation logic to CBD and check it while Procuring Entity is changing status to active.tendering by patching tender.

PQ robot validations:

  • Existence of item profile in catalogue

  • Existence of related agreement

  • Equality of profile agreement and related agreement in tender

  • Agreement should not be in terminated status

  • Agreement has qualified suppliers

Possible errors

If Procuring Entity will try to activate PQ procedure with non-existed profile in catalogue, we will see error:

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."
    }
  ]
}

If Procuring Entity will try to activate PQ procedure with non-existed agreement, the next error will be generated:

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"
    }
  ]
}

In case profile agreement and related agreement in tender aren’t equal, the next error will be generated:

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"
    }
  ]
}

If agreement is in terminated status:

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"
    }
  ]
}

If there is problem with connection to ProZorro e-Catalogues, we will see error:

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"
    }
  ]
}

Successful scenario

If PQ procedure matches all requirements, it will be switched to 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
  }
}

There will not be shortlistedFirms field in procedure anymore. During bid creation/activation there will be validation that bid.tenderers is a member of agreement.

Conclusion

PQ procedure will not have statuses draft.publishing, draft.unsuccessful anymore.

If PQ procedure doesn’t match all requirements, it won’t be switched to active.tendering until all requirements is met.

Logic of creation and modification of PQ procedure won’t be changed.

Next steps after active.tendering status stays the same.