diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index e2663579df..a3675eb935 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -5,6 +5,7 @@ stages: - docs - test - test_before_2020_04_19 + - test_before_ecriteria - repos - cleanup @@ -182,7 +183,7 @@ docs: - python setup.py test --addopts="docs/tests --color=yes" - (set -e; [[ $(git diff) ]] && { git diff; exit 1; } || exit 0) when: manual - allow_failure: false + allow_failure: true needs: - build variables: @@ -232,6 +233,16 @@ docs: --tx=popen//id=sand//env:DB_NAME=test_sandbox//env:SANDBOX_MODE=1//env:SINGLE_APP=1//env:DEFAULT_RELEASE_2020_04_19=2030-01-01 --tx=popen//id=prod//env:DB_NAME=test_prod//env:SANDBOX_MODE=//env:SINGLE_APP=1//env:DEFAULT_RELEASE_2020_04_19=2030-01-01 +.test_before_ecriteria: + extends: .test_base + stage: test_before_ecriteria + script: + - cd /app + - py.test $TESTS_PATH --cov=$COV_PATH --cov-config=$COV_FILE -v --color=yes --dist=each + --tx=popen//id=sand//env:DB_NAME=test_sandbox//env:SANDBOX_MODE=1//env:SINGLE_APP=1//env:DEFAULT_ECRITERIA_ARTICLE_17=2030-01-01 + --tx=popen//id=prod//env:DB_NAME=test_prod//env:SANDBOX_MODE=//env:SINGLE_APP=1//env:DEFAULT_ECRITERIA_ARTICLE_17=2030-01-01 + + .test_relocation_api: variables: TESTS_PATH: src/openprocurement/relocation/api/tests @@ -250,6 +261,11 @@ test_relocation_api_before_2020_04_19: - .test_before_2020_04_19 - .test_relocation_api +test_relocation_api_ecriteria: + extends: + - .test_before_ecriteria + - .test_relocation_api + .test_tender_esco: variables: TESTS_PATH: src/openprocurement/tender/esco/tests @@ -257,7 +273,6 @@ test_relocation_api_before_2020_04_19: COV_FILE: .coveragerc KUBERNETES_MEMORY_REQUEST: 1500Mi - test_tender_esco: extends: - .test @@ -268,6 +283,11 @@ test_tender_esco_before_2020_04_19: - .test_before_2020_04_19 - .test_tender_esco +test_tender_esco_ecriteria: + extends: + - .test_before_ecriteria + - .test_tender_openeu + .test_tender_openeu: variables: TESTS_PATH: src/openprocurement/tender/openeu/tests @@ -280,11 +300,16 @@ test_tender_openeu: - .test - .test_tender_openeu -test_tender_openeu_before_2020_04_19: +test_tender_openeu_2020_04_19: extends: - .test_before_2020_04_19 - .test_tender_openeu +test_tender_openeu_ecriteria: + extends: + - .test_before_ecriteria + - .test_tender_openeu + .test_tender_cfaua: variables: TESTS_PATH: src/openprocurement/tender/cfaua/tests @@ -302,6 +327,11 @@ test_tender_cfaua_before_2020_04_19: - .test_before_2020_04_19 - .test_tender_cfaua +test_tender_cfaua_ecriteria: + extends: + - .test_before_ecriteria + - .test_tender_cfaua + .test_tender_comp_stage2: variables: TESTS_PATH: src/openprocurement/tender/competitivedialogue/tests/stage2 @@ -319,6 +349,11 @@ test_tender_comp_stage2_before_2020_04_19: - .test_before_2020_04_19 - .test_tender_comp_stage2 +test_tender_comp_stage2_ecriteria: + extends: + - .test_before_ecriteria + - .test_tender_comp_stage2 + .test_tender_core: variables: TESTS_PATH: src/openprocurement/tender/core/tests @@ -335,6 +370,11 @@ test_tender_core_before_2020_04_19: - .test_before_2020_04_19 - .test_tender_core +test_tender_core_ecriteria: + extends: + - .test_before_ecriteria + - .test_tender_core + .test_api: variables: TESTS_PATH: src/openprocurement/api/tests @@ -353,6 +393,11 @@ test_api_before_2020_04_19: - .test_before_2020_04_19 - .test_api +test_api_ecriteria: + extends: + - .test_before_ecriteria + - .test_api + .test_agreement_core: variables: TESTS_PATH: src/openprocurement/agreement/core/tests @@ -369,6 +414,11 @@ test_agreement_core_before_2020_04_19: - .test_before_2020_04_19 - .test_agreement_core +test_agreement_core_ecriteria: + extends: + - .test_before_ecriteria + - .test_agreement_core + .test_agreement_cfaua: variables: TESTS_PATH: src/openprocurement/agreement/cfaua/tests @@ -386,6 +436,11 @@ test_agreement_cfaua_before_2020_04_19: - .test_before_2020_04_19 - .test_agreement_cfaua +test_agreement_cfaua_ecriteria: + extends: + - .test_before_ecriteria + - .test_agreement_cfaua + .test_contracting_api: variables: TESTS_PATH: src/openprocurement/contracting/api/tests @@ -405,6 +460,11 @@ test_contracting_api_before_2020_04_19: - .test_before_2020_04_19 - .test_contracting_api +test_contracting_api_ecriteria: + extends: + - .test_before_ecriteria + - .test_contracting_api + .test_planning_api: variables: TESTS_PATH: src/openprocurement/planning/api/tests @@ -423,6 +483,11 @@ test_planning_api_before_2020_04_19: - .test_before_2020_04_19 - .test_planning_api +test_planning_api_ecriteria: + extends: + - .test_before_ecriteria + - .test_planning_api + .test_historical_core: variables: TESTS_PATH: src/openprocurement/historical/core/tests @@ -441,6 +506,11 @@ test_historical_core_before_2020_04_19: - .test_before_2020_04_19 - .test_historical_core +test_historical_core_ecriteria: + extends: + - .test_before_ecriteria + - .test_historical_core + .test_historical_tender: variables: TESTS_PATH: src/openprocurement/historical/tender/tests @@ -459,6 +529,11 @@ test_historical_tender_before_2020_04_19: - .test_before_2020_04_19 - .test_historical_tender +test_historical_tender_ecriteria: + extends: + - .test_before_ecriteria + - .test_historical_tender + .test_tender_comp_stage1: variables: TESTS_PATH: src/openprocurement/tender/competitivedialogue/tests/stage1 @@ -478,6 +553,11 @@ test_tender_comp_stage1_before_2020_04_19: - .test_before_2020_04_19 - .test_tender_comp_stage1 +test_tender_comp_stage1_ecriteria: + extends: + - .test_before_ecriteria + - .test_tender_comp_stage1 + .test_tender_limited: variables: TESTS_PATH: src/openprocurement/tender/limited/tests @@ -495,6 +575,11 @@ test_tender_limited_before_2020_04_19: - .test_before_2020_04_19 - .test_tender_limited +test_tender_limited_ecriteria: + extends: + - .test_before_ecriteria + - .test_tender_limited + .test_tender_openua: variables: TESTS_PATH: src/openprocurement/tender/openua/tests @@ -512,6 +597,11 @@ test_tender_openua_2020_04_19: - .test_before_2020_04_19 - .test_tender_openua +test_tender_openua_ecriteria: + extends: + - .test_before_ecriteria + - .test_tender_openua + .test_tender_belowthreshold: variables: TESTS_PATH: src/openprocurement/tender/belowthreshold/tests @@ -529,6 +619,11 @@ test_tender_belowthreshold_2020_04_19: - .test_before_2020_04_19 - .test_tender_belowthreshold +test_tender_belowthreshold_ecriteria: + extends: + - .test_before_ecriteria + - .test_tender_belowthreshold + .test_tender_openuadefense: variables: TESTS_PATH: src/openprocurement/tender/openuadefense/tests @@ -546,6 +641,11 @@ test_tender_openuadefense_2020_04_19: - .test_before_2020_04_19 - .test_tender_openuadefense +test_tender_openuadefense_ecriteria: + extends: + - .test_before_ecriteria + - .test_tender_openuadefense + .test_tender_cfaselectionua: variables: TESTS_PATH: src/openprocurement/tender/cfaselectionua/tests @@ -563,3 +663,15 @@ test_tender_cfaselectionua_2020_04_19: extends: - .test_before_2020_04_19 - .test_tender_cfaselectionua + +test_tender_cfaselectionua_ecriteria: + extends: + - .test_before_ecriteria + - .test_tender_cfaselectionua + +test_tender_pricequotation: + extends: .test + variables: + TESTS_PATH: src/openprocurement/tender/pricequotation/tests + COV_PATH: src/openprocurement/tender/pricequotation + COV_FILE: .coveragerc diff --git a/docker-compose.yml b/docker-compose.yml index 035616adc6..cae796e02e 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -25,8 +25,8 @@ services: - "./docs:/app/docs:delegated" couchdb: image: "couchdb:1.6" + ports: + - "5984:5984" environment: COUCHDB_USER: op COUCHDB_PASSWORD: op - ports: - - "5984:5984" \ No newline at end of file diff --git a/docs/source/agreementcfaua/tutorial/add-agreement-change-modification.http b/docs/source/agreementcfaua/tutorial/add-agreement-change-modification.http index 39211d9672..8d93b506fa 100644 --- a/docs/source/agreementcfaua/tutorial/add-agreement-change-modification.http +++ b/docs/source/agreementcfaua/tutorial/add-agreement-change-modification.http @@ -1,4 +1,4 @@ -PATCH /api/2.5/agreements/eb35d61e7cde4a008003f5cd17ddb0c7/changes/563cc544379744ed9b023a88ff6e415b?acc_token=76b0c07026994e7089d5f9716acfc3e7 HTTP/1.0 +PATCH /api/2.5/agreements/eb35d61e7cde4a008003f5cd17ddb0c7/changes/5937223446a044e689f16dc9912fed8b?acc_token=76b0c07026994e7089d5f9716acfc3e7 HTTP/1.0 Authorization: Bearer broker Content-Length: 95 Content-Type: application/json @@ -8,7 +8,7 @@ DATA: "data": { "modifications": [ { - "itemId": "caa9e0207afd49d48ca553e562787699", + "itemId": "54eee06ff6d24b12b8e84dfe65d1b6b7", "factor": 0.1605 } ] @@ -22,7 +22,7 @@ Content-Type: application/json; charset=UTF-8 "status": "pending", "modifications": [ { - "itemId": "caa9e0207afd49d48ca553e562787699", + "itemId": "54eee06ff6d24b12b8e84dfe65d1b6b7", "factor": 0.1605 } ], @@ -30,7 +30,7 @@ Content-Type: application/json; charset=UTF-8 "rationale_en": "Agreement change cause", "rationale": "Друга і третя поставка має бути розфасована", "date": "2020-05-15T01:00:00+03:00", - "id": "563cc544379744ed9b023a88ff6e415b" + "id": "5937223446a044e689f16dc9912fed8b" } } diff --git a/docs/source/agreementcfaua/tutorial/add-agreement-change.http b/docs/source/agreementcfaua/tutorial/add-agreement-change.http index b5bb853f95..b523df8b1c 100644 --- a/docs/source/agreementcfaua/tutorial/add-agreement-change.http +++ b/docs/source/agreementcfaua/tutorial/add-agreement-change.http @@ -21,7 +21,7 @@ Content-Type: application/json; charset=UTF-8 "rationale_en": "Agreement change cause", "rationale": "Опис причини змін егріменту", "date": "2020-05-15T01:00:00+03:00", - "id": "563cc544379744ed9b023a88ff6e415b" + "id": "5937223446a044e689f16dc9912fed8b" } } diff --git a/docs/source/agreementcfaua/tutorial/agreement-credentials.http b/docs/source/agreementcfaua/tutorial/agreement-credentials.http index a7bdd75003..71aa11e08a 100644 --- a/docs/source/agreementcfaua/tutorial/agreement-credentials.http +++ b/docs/source/agreementcfaua/tutorial/agreement-credentials.http @@ -24,7 +24,7 @@ Content-Type: application/json; charset=UTF-8 "amount": 93, "valueAddedTaxIncluded": true }, - "relatedItem": "caa9e0207afd49d48ca553e562787699" + "relatedItem": "54eee06ff6d24b12b8e84dfe65d1b6b7" } ], "suppliers": [ @@ -66,7 +66,7 @@ Content-Type: application/json; charset=UTF-8 "amount": 93, "valueAddedTaxIncluded": true }, - "relatedItem": "caa9e0207afd49d48ca553e562787699" + "relatedItem": "54eee06ff6d24b12b8e84dfe65d1b6b7" } ], "suppliers": [ @@ -108,7 +108,7 @@ Content-Type: application/json; charset=UTF-8 "amount": 93, "valueAddedTaxIncluded": true }, - "relatedItem": "caa9e0207afd49d48ca553e562787699" + "relatedItem": "54eee06ff6d24b12b8e84dfe65d1b6b7" } ], "suppliers": [ @@ -170,7 +170,7 @@ Content-Type: application/json; charset=UTF-8 "startDate": "2018-06-27T13:39:09.362837+03:00", "endDate": "2018-06-30T13:39:09.362837+03:00" }, - "id": "caa9e0207afd49d48ca553e562787699", + "id": "54eee06ff6d24b12b8e84dfe65d1b6b7", "unit": { "code": "44617100-9", "name": "item" diff --git a/docs/source/agreementcfaua/tutorial/agreement-documents.http b/docs/source/agreementcfaua/tutorial/agreement-documents.http index ae26bf65ba..c4004384bb 100644 --- a/docs/source/agreementcfaua/tutorial/agreement-documents.http +++ b/docs/source/agreementcfaua/tutorial/agreement-documents.http @@ -24,7 +24,7 @@ Content-Type: application/json; charset=UTF-8 "documentOf": "change", "datePublished": "2020-05-15T01:00:00+03:00", "id": "b8f02cdfc2cc43c2a6a5f014d524afc6", - "relatedItem": "563cc544379744ed9b023a88ff6e415b", + "relatedItem": "5937223446a044e689f16dc9912fed8b", "dateModified": "2020-05-15T01:00:00+03:00" } ] diff --git a/docs/source/agreementcfaua/tutorial/agreement-termination.http b/docs/source/agreementcfaua/tutorial/agreement-termination.http index 2875b7c6cc..f099a6d040 100644 --- a/docs/source/agreementcfaua/tutorial/agreement-termination.http +++ b/docs/source/agreementcfaua/tutorial/agreement-termination.http @@ -25,7 +25,7 @@ Content-Type: application/json; charset=UTF-8 "documentOf": "change", "datePublished": "2020-05-15T01:00:00+03:00", "id": "b8f02cdfc2cc43c2a6a5f014d524afc6", - "relatedItem": "563cc544379744ed9b023a88ff6e415b", + "relatedItem": "5937223446a044e689f16dc9912fed8b", "dateModified": "2020-05-15T01:00:00+03:00" }, { @@ -69,7 +69,7 @@ Content-Type: application/json; charset=UTF-8 "amount": 14.93, "valueAddedTaxIncluded": true }, - "relatedItem": "caa9e0207afd49d48ca553e562787699" + "relatedItem": "54eee06ff6d24b12b8e84dfe65d1b6b7" } ], "suppliers": [ @@ -111,7 +111,7 @@ Content-Type: application/json; charset=UTF-8 "amount": 14.93, "valueAddedTaxIncluded": true }, - "relatedItem": "caa9e0207afd49d48ca553e562787699" + "relatedItem": "54eee06ff6d24b12b8e84dfe65d1b6b7" } ], "suppliers": [ @@ -153,7 +153,7 @@ Content-Type: application/json; charset=UTF-8 "amount": 14.93, "valueAddedTaxIncluded": true }, - "relatedItem": "caa9e0207afd49d48ca553e562787699" + "relatedItem": "54eee06ff6d24b12b8e84dfe65d1b6b7" } ], "suppliers": [ @@ -215,7 +215,7 @@ Content-Type: application/json; charset=UTF-8 "startDate": "2018-06-27T13:39:09.362837+03:00", "endDate": "2018-06-30T13:39:09.362837+03:00" }, - "id": "caa9e0207afd49d48ca553e562787699", + "id": "54eee06ff6d24b12b8e84dfe65d1b6b7", "unit": { "code": "44617100-9", "name": "item" @@ -255,7 +255,7 @@ Content-Type: application/json; charset=UTF-8 "status": "active", "modifications": [ { - "itemId": "caa9e0207afd49d48ca553e562787699", + "itemId": "54eee06ff6d24b12b8e84dfe65d1b6b7", "factor": 0.1605 } ], @@ -264,7 +264,7 @@ Content-Type: application/json; charset=UTF-8 "dateSigned": "2020-05-15T01:00:00+03:00", "rationale": "Друга і третя поставка має бути розфасована", "date": "2020-05-15T01:00:00+03:00", - "id": "563cc544379744ed9b023a88ff6e415b" + "id": "5937223446a044e689f16dc9912fed8b" } ], "dateModified": "2020-05-15T01:00:00+03:00", diff --git a/docs/source/agreementcfaua/tutorial/agreement-view.http b/docs/source/agreementcfaua/tutorial/agreement-view.http index bfcb6f9e4e..b3c3e67406 100644 --- a/docs/source/agreementcfaua/tutorial/agreement-view.http +++ b/docs/source/agreementcfaua/tutorial/agreement-view.http @@ -17,7 +17,7 @@ Content-Type: application/json; charset=UTF-8 "amount": 93, "valueAddedTaxIncluded": true }, - "relatedItem": "caa9e0207afd49d48ca553e562787699" + "relatedItem": "54eee06ff6d24b12b8e84dfe65d1b6b7" } ], "suppliers": [ @@ -59,7 +59,7 @@ Content-Type: application/json; charset=UTF-8 "amount": 93, "valueAddedTaxIncluded": true }, - "relatedItem": "caa9e0207afd49d48ca553e562787699" + "relatedItem": "54eee06ff6d24b12b8e84dfe65d1b6b7" } ], "suppliers": [ @@ -101,7 +101,7 @@ Content-Type: application/json; charset=UTF-8 "amount": 93, "valueAddedTaxIncluded": true }, - "relatedItem": "caa9e0207afd49d48ca553e562787699" + "relatedItem": "54eee06ff6d24b12b8e84dfe65d1b6b7" } ], "suppliers": [ @@ -163,7 +163,7 @@ Content-Type: application/json; charset=UTF-8 "startDate": "2018-06-27T13:39:09.362837+03:00", "endDate": "2018-06-30T13:39:09.362837+03:00" }, - "id": "caa9e0207afd49d48ca553e562787699", + "id": "54eee06ff6d24b12b8e84dfe65d1b6b7", "unit": { "code": "44617100-9", "name": "item" diff --git a/docs/source/agreementcfaua/tutorial/agreement_preview.http b/docs/source/agreementcfaua/tutorial/agreement_preview.http index 91c19ec9ea..418c2743ff 100644 --- a/docs/source/agreementcfaua/tutorial/agreement_preview.http +++ b/docs/source/agreementcfaua/tutorial/agreement_preview.http @@ -17,7 +17,7 @@ Content-Type: application/json; charset=UTF-8 "documentOf": "change", "datePublished": "2020-05-15T01:00:00+03:00", "id": "b8f02cdfc2cc43c2a6a5f014d524afc6", - "relatedItem": "563cc544379744ed9b023a88ff6e415b", + "relatedItem": "5937223446a044e689f16dc9912fed8b", "dateModified": "2020-05-15T01:00:00+03:00" } ], @@ -31,7 +31,7 @@ Content-Type: application/json; charset=UTF-8 "amount": 14.93, "valueAddedTaxIncluded": true }, - "relatedItem": "caa9e0207afd49d48ca553e562787699" + "relatedItem": "54eee06ff6d24b12b8e84dfe65d1b6b7" } ], "suppliers": [ @@ -73,7 +73,7 @@ Content-Type: application/json; charset=UTF-8 "amount": 14.93, "valueAddedTaxIncluded": true }, - "relatedItem": "caa9e0207afd49d48ca553e562787699" + "relatedItem": "54eee06ff6d24b12b8e84dfe65d1b6b7" } ], "suppliers": [ @@ -115,7 +115,7 @@ Content-Type: application/json; charset=UTF-8 "amount": 14.93, "valueAddedTaxIncluded": true }, - "relatedItem": "caa9e0207afd49d48ca553e562787699" + "relatedItem": "54eee06ff6d24b12b8e84dfe65d1b6b7" } ], "suppliers": [ @@ -177,7 +177,7 @@ Content-Type: application/json; charset=UTF-8 "startDate": "2018-06-27T13:39:09.362837+03:00", "endDate": "2018-06-30T13:39:09.362837+03:00" }, - "id": "caa9e0207afd49d48ca553e562787699", + "id": "54eee06ff6d24b12b8e84dfe65d1b6b7", "unit": { "code": "44617100-9", "name": "item" @@ -217,7 +217,7 @@ Content-Type: application/json; charset=UTF-8 "status": "pending", "modifications": [ { - "itemId": "caa9e0207afd49d48ca553e562787699", + "itemId": "54eee06ff6d24b12b8e84dfe65d1b6b7", "factor": 0.1605 } ], @@ -225,7 +225,7 @@ Content-Type: application/json; charset=UTF-8 "rationale_en": "Agreement change cause", "rationale": "Друга і третя поставка має бути розфасована", "date": "2020-05-15T01:00:00+03:00", - "id": "563cc544379744ed9b023a88ff6e415b" + "id": "5937223446a044e689f16dc9912fed8b" } ], "dateModified": "2020-05-15T01:00:00+03:00", diff --git a/docs/source/agreementcfaua/tutorial/apply-agreement-change.http b/docs/source/agreementcfaua/tutorial/apply-agreement-change.http index e110b45746..a86efdaa41 100644 --- a/docs/source/agreementcfaua/tutorial/apply-agreement-change.http +++ b/docs/source/agreementcfaua/tutorial/apply-agreement-change.http @@ -1,4 +1,4 @@ -PATCH /api/2.5/agreements/eb35d61e7cde4a008003f5cd17ddb0c7/changes/563cc544379744ed9b023a88ff6e415b?acc_token=76b0c07026994e7089d5f9716acfc3e7 HTTP/1.0 +PATCH /api/2.5/agreements/eb35d61e7cde4a008003f5cd17ddb0c7/changes/5937223446a044e689f16dc9912fed8b?acc_token=76b0c07026994e7089d5f9716acfc3e7 HTTP/1.0 Authorization: Bearer broker Content-Length: 73 Content-Type: application/json @@ -18,7 +18,7 @@ Content-Type: application/json; charset=UTF-8 "status": "active", "modifications": [ { - "itemId": "caa9e0207afd49d48ca553e562787699", + "itemId": "54eee06ff6d24b12b8e84dfe65d1b6b7", "factor": 0.1605 } ], @@ -27,7 +27,7 @@ Content-Type: application/json; charset=UTF-8 "dateSigned": "2020-05-15T01:00:00+03:00", "rationale": "Друга і третя поставка має бути розфасована", "date": "2020-05-15T01:00:00+03:00", - "id": "563cc544379744ed9b023a88ff6e415b" + "id": "5937223446a044e689f16dc9912fed8b" } } diff --git a/docs/source/agreementcfaua/tutorial/example_agreement.http b/docs/source/agreementcfaua/tutorial/example_agreement.http index 98a98eb795..3a3da19e2d 100644 --- a/docs/source/agreementcfaua/tutorial/example_agreement.http +++ b/docs/source/agreementcfaua/tutorial/example_agreement.http @@ -18,7 +18,7 @@ Content-Type: application/json; charset=UTF-8 "amount": 93, "valueAddedTaxIncluded": true }, - "relatedItem": "caa9e0207afd49d48ca553e562787699" + "relatedItem": "54eee06ff6d24b12b8e84dfe65d1b6b7" } ], "suppliers": [ @@ -60,7 +60,7 @@ Content-Type: application/json; charset=UTF-8 "amount": 93, "valueAddedTaxIncluded": true }, - "relatedItem": "caa9e0207afd49d48ca553e562787699" + "relatedItem": "54eee06ff6d24b12b8e84dfe65d1b6b7" } ], "suppliers": [ @@ -102,7 +102,7 @@ Content-Type: application/json; charset=UTF-8 "amount": 93, "valueAddedTaxIncluded": true }, - "relatedItem": "caa9e0207afd49d48ca553e562787699" + "relatedItem": "54eee06ff6d24b12b8e84dfe65d1b6b7" } ], "suppliers": [ @@ -164,7 +164,7 @@ Content-Type: application/json; charset=UTF-8 "startDate": "2018-06-27T13:39:09.362837+03:00", "endDate": "2018-06-30T13:39:09.362837+03:00" }, - "id": "caa9e0207afd49d48ca553e562787699", + "id": "54eee06ff6d24b12b8e84dfe65d1b6b7", "unit": { "code": "44617100-9", "name": "item" diff --git a/docs/source/agreementcfaua/tutorial/example_tender.http b/docs/source/agreementcfaua/tutorial/example_tender.http index 843d8462eb..84237e2b68 100644 --- a/docs/source/agreementcfaua/tutorial/example_tender.http +++ b/docs/source/agreementcfaua/tutorial/example_tender.http @@ -19,8 +19,8 @@ Content-Type: application/json; charset=UTF-8 }, "enquiryPeriod": { "startDate": "2020-03-18T01:00:00+03:00", - "clarificationsUntil": "2020-04-14T00:00:00+03:00", - "endDate": "2020-04-08T01:00:00+03:00" + "clarificationsUntil": "2020-04-11T00:00:00+03:00", + "endDate": "2020-04-08T00:00:00+03:00" }, "submissionMethod": "electronicAuction", "procurementMethodType": "closeFrameworkAgreementUA", @@ -63,7 +63,7 @@ Content-Type: application/json; charset=UTF-8 "title": "lot title", "minimalStep": { "currency": "UAH", - "amount": 35.0, + "amount": 15.0, "valueAddedTaxIncluded": true }, "auctionPeriod": { @@ -98,7 +98,7 @@ Content-Type: application/json; charset=UTF-8 "amount": 93, "valueAddedTaxIncluded": true }, - "relatedItem": "caa9e0207afd49d48ca553e562787699" + "relatedItem": "54eee06ff6d24b12b8e84dfe65d1b6b7" } ], "suppliers": [ @@ -140,7 +140,7 @@ Content-Type: application/json; charset=UTF-8 "amount": 93, "valueAddedTaxIncluded": true }, - "relatedItem": "caa9e0207afd49d48ca553e562787699" + "relatedItem": "54eee06ff6d24b12b8e84dfe65d1b6b7" } ], "suppliers": [ @@ -182,7 +182,7 @@ Content-Type: application/json; charset=UTF-8 "amount": 93, "valueAddedTaxIncluded": true }, - "relatedItem": "caa9e0207afd49d48ca553e562787699" + "relatedItem": "54eee06ff6d24b12b8e84dfe65d1b6b7" } ], "suppliers": [ @@ -244,7 +244,7 @@ Content-Type: application/json; charset=UTF-8 "startDate": "2018-06-27T13:39:09.362837+03:00", "endDate": "2018-06-30T13:39:09.362837+03:00" }, - "id": "caa9e0207afd49d48ca553e562787699", + "id": "54eee06ff6d24b12b8e84dfe65d1b6b7", "unit": { "code": "44617100-9", "name": "item" @@ -440,7 +440,7 @@ Content-Type: application/json; charset=UTF-8 ], "minimalStep": { "currency": "UAH", - "amount": 35, + "amount": 15, "valueAddedTaxIncluded": true }, "items": [ @@ -471,7 +471,7 @@ Content-Type: application/json; charset=UTF-8 "startDate": "2018-06-27T13:39:09.362837+03:00", "endDate": "2018-06-30T13:39:09.362837+03:00" }, - "id": "caa9e0207afd49d48ca553e562787699", + "id": "54eee06ff6d24b12b8e84dfe65d1b6b7", "unit": { "code": "44617100-9", "name": "item" @@ -482,7 +482,6 @@ Content-Type: application/json; charset=UTF-8 "bids": [ { "status": "active", - "selfEligible": true, "lotValues": [ { "relatedLot": "2b33a80c73cb4c39957170a963adfe52", @@ -495,7 +494,7 @@ Content-Type: application/json; charset=UTF-8 } } ], - "selfQualified": true, + "id": "f875346eda7843a3b3b9fefc28f5662c", "tenderers": [ { "scale": "micro", @@ -522,11 +521,10 @@ Content-Type: application/json; charset=UTF-8 } ], "date": "2020-03-18T01:00:01+03:00", - "id": "f875346eda7843a3b3b9fefc28f5662c" + "selfQualified": true }, { "status": "active", - "selfEligible": true, "lotValues": [ { "relatedLot": "2b33a80c73cb4c39957170a963adfe52", @@ -539,7 +537,7 @@ Content-Type: application/json; charset=UTF-8 } } ], - "selfQualified": true, + "id": "f552af0c653d4d6a9ece8b678225ca20", "tenderers": [ { "scale": "micro", @@ -566,11 +564,10 @@ Content-Type: application/json; charset=UTF-8 } ], "date": "2020-03-18T01:00:02+03:00", - "id": "f552af0c653d4d6a9ece8b678225ca20" + "selfQualified": true }, { "status": "active", - "selfEligible": true, "lotValues": [ { "relatedLot": "2b33a80c73cb4c39957170a963adfe52", @@ -583,7 +580,7 @@ Content-Type: application/json; charset=UTF-8 } } ], - "selfQualified": true, + "id": "8f15d54cd54a4ea2a61c9d56f0c444da", "tenderers": [ { "scale": "micro", @@ -610,7 +607,7 @@ Content-Type: application/json; charset=UTF-8 } ], "date": "2020-03-18T01:00:03+03:00", - "id": "8f15d54cd54a4ea2a61c9d56f0c444da" + "selfQualified": true } ], "value": { diff --git a/docs/source/agreementcfaua/tutorial/patch-agreement-change.http b/docs/source/agreementcfaua/tutorial/patch-agreement-change.http index a766b2266b..b6dd6431e8 100644 --- a/docs/source/agreementcfaua/tutorial/patch-agreement-change.http +++ b/docs/source/agreementcfaua/tutorial/patch-agreement-change.http @@ -1,4 +1,4 @@ -PATCH /api/2.5/agreements/eb35d61e7cde4a008003f5cd17ddb0c7/changes/563cc544379744ed9b023a88ff6e415b?acc_token=76b0c07026994e7089d5f9716acfc3e7 HTTP/1.0 +PATCH /api/2.5/agreements/eb35d61e7cde4a008003f5cd17ddb0c7/changes/5937223446a044e689f16dc9912fed8b?acc_token=76b0c07026994e7089d5f9716acfc3e7 HTTP/1.0 Authorization: Bearer broker Content-Length: 255 Content-Type: application/json @@ -19,7 +19,7 @@ Content-Type: application/json; charset=UTF-8 "rationale_en": "Agreement change cause", "rationale": "Друга і третя поставка має бути розфасована", "date": "2020-05-15T01:00:00+03:00", - "id": "563cc544379744ed9b023a88ff6e415b" + "id": "5937223446a044e689f16dc9912fed8b" } } diff --git a/docs/source/agreementcfaua/tutorial/set-document-of-change.http b/docs/source/agreementcfaua/tutorial/set-document-of-change.http index 4b4ac92688..c675d8768d 100644 --- a/docs/source/agreementcfaua/tutorial/set-document-of-change.http +++ b/docs/source/agreementcfaua/tutorial/set-document-of-change.http @@ -7,7 +7,7 @@ DATA: { "data": { "documentOf": "change", - "relatedItem": "563cc544379744ed9b023a88ff6e415b" + "relatedItem": "5937223446a044e689f16dc9912fed8b" } } @@ -22,7 +22,7 @@ Content-Type: application/json; charset=UTF-8 "documentOf": "change", "datePublished": "2020-05-15T01:00:00+03:00", "id": "b8f02cdfc2cc43c2a6a5f014d524afc6", - "relatedItem": "563cc544379744ed9b023a88ff6e415b", + "relatedItem": "5937223446a044e689f16dc9912fed8b", "dateModified": "2020-05-15T01:00:00+03:00" } } diff --git a/docs/source/agreementcfaua/tutorial/view-agreement-change.http b/docs/source/agreementcfaua/tutorial/view-agreement-change.http index e9af80ebfe..90ca47d0ae 100644 --- a/docs/source/agreementcfaua/tutorial/view-agreement-change.http +++ b/docs/source/agreementcfaua/tutorial/view-agreement-change.http @@ -1,4 +1,4 @@ -GET /api/2.5/agreements/eb35d61e7cde4a008003f5cd17ddb0c7/changes/563cc544379744ed9b023a88ff6e415b HTTP/1.0 +GET /api/2.5/agreements/eb35d61e7cde4a008003f5cd17ddb0c7/changes/5937223446a044e689f16dc9912fed8b HTTP/1.0 Authorization: Bearer broker Host: lb-api-sandbox.prozorro.gov.ua @@ -11,7 +11,7 @@ Content-Type: application/json; charset=UTF-8 "rationale_en": "Agreement change cause", "rationale": "Опис причини змін егріменту", "date": "2020-05-15T01:00:00+03:00", - "id": "563cc544379744ed9b023a88ff6e415b" + "id": "5937223446a044e689f16dc9912fed8b" } } diff --git a/docs/source/agreementcfaua/tutorial/view-agreement.http b/docs/source/agreementcfaua/tutorial/view-agreement.http index ddb3a93850..73e6d3d8da 100644 --- a/docs/source/agreementcfaua/tutorial/view-agreement.http +++ b/docs/source/agreementcfaua/tutorial/view-agreement.http @@ -17,7 +17,7 @@ Content-Type: application/json; charset=UTF-8 "documentOf": "change", "datePublished": "2020-05-15T01:00:00+03:00", "id": "b8f02cdfc2cc43c2a6a5f014d524afc6", - "relatedItem": "563cc544379744ed9b023a88ff6e415b", + "relatedItem": "5937223446a044e689f16dc9912fed8b", "dateModified": "2020-05-15T01:00:00+03:00" } ], @@ -31,7 +31,7 @@ Content-Type: application/json; charset=UTF-8 "amount": 14.93, "valueAddedTaxIncluded": true }, - "relatedItem": "caa9e0207afd49d48ca553e562787699" + "relatedItem": "54eee06ff6d24b12b8e84dfe65d1b6b7" } ], "suppliers": [ @@ -73,7 +73,7 @@ Content-Type: application/json; charset=UTF-8 "amount": 14.93, "valueAddedTaxIncluded": true }, - "relatedItem": "caa9e0207afd49d48ca553e562787699" + "relatedItem": "54eee06ff6d24b12b8e84dfe65d1b6b7" } ], "suppliers": [ @@ -115,7 +115,7 @@ Content-Type: application/json; charset=UTF-8 "amount": 14.93, "valueAddedTaxIncluded": true }, - "relatedItem": "caa9e0207afd49d48ca553e562787699" + "relatedItem": "54eee06ff6d24b12b8e84dfe65d1b6b7" } ], "suppliers": [ @@ -177,7 +177,7 @@ Content-Type: application/json; charset=UTF-8 "startDate": "2018-06-27T13:39:09.362837+03:00", "endDate": "2018-06-30T13:39:09.362837+03:00" }, - "id": "caa9e0207afd49d48ca553e562787699", + "id": "54eee06ff6d24b12b8e84dfe65d1b6b7", "unit": { "code": "44617100-9", "name": "item" @@ -217,7 +217,7 @@ Content-Type: application/json; charset=UTF-8 "status": "active", "modifications": [ { - "itemId": "caa9e0207afd49d48ca553e562787699", + "itemId": "54eee06ff6d24b12b8e84dfe65d1b6b7", "factor": 0.1605 } ], @@ -226,7 +226,7 @@ Content-Type: application/json; charset=UTF-8 "dateSigned": "2020-05-15T01:00:00+03:00", "rationale": "Друга і третя поставка має бути розфасована", "date": "2020-05-15T01:00:00+03:00", - "id": "563cc544379744ed9b023a88ff6e415b" + "id": "5937223446a044e689f16dc9912fed8b" } ], "dateModified": "2020-05-15T01:00:00+03:00", diff --git a/docs/source/agreementcfaua/tutorial/view-all-agreement-changes.http b/docs/source/agreementcfaua/tutorial/view-all-agreement-changes.http index 31c5e02546..0ee5a9f51a 100644 --- a/docs/source/agreementcfaua/tutorial/view-all-agreement-changes.http +++ b/docs/source/agreementcfaua/tutorial/view-all-agreement-changes.http @@ -10,7 +10,7 @@ Content-Type: application/json; charset=UTF-8 "status": "active", "modifications": [ { - "itemId": "caa9e0207afd49d48ca553e562787699", + "itemId": "54eee06ff6d24b12b8e84dfe65d1b6b7", "factor": 0.1605 } ], @@ -19,7 +19,7 @@ Content-Type: application/json; charset=UTF-8 "dateSigned": "2020-05-15T01:00:00+03:00", "rationale": "Друга і третя поставка має бути розфасована", "date": "2020-05-15T01:00:00+03:00", - "id": "563cc544379744ed9b023a88ff6e415b" + "id": "5937223446a044e689f16dc9912fed8b" } ] } diff --git a/docs/source/centralized-procurements/http/create-plan.http b/docs/source/centralized-procurements/http/create-plan.http index 9ee3ddf03f..b8628328f0 100644 --- a/docs/source/centralized-procurements/http/create-plan.http +++ b/docs/source/centralized-procurements/http/create-plan.http @@ -140,7 +140,7 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/plans/77cf582ab7284fb1a0 "deliveryDate": { "endDate": "2019-11-09T01:00:00+03:00" }, - "id": "f7271f852efe465c876aba44613ab929", + "id": "20af24c61dc7451a9205eca2dac56d65", "unit": { "code": "KGM", "name": "кг" @@ -158,7 +158,7 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/plans/77cf582ab7284fb1a0 "currency": "UAH", "amount": 1500.0 }, - "id": "d2eea74930724e5ea1f91acf90177772" + "id": "f0d2c36b24ed47169ca75a7803897a2d" } ], "amountNet": 12222.0, diff --git a/docs/source/centralized-procurements/http/create-tender.http b/docs/source/centralized-procurements/http/create-tender.http index 9ded93cf72..a9b070ff75 100644 --- a/docs/source/centralized-procurements/http/create-tender.http +++ b/docs/source/centralized-procurements/http/create-tender.http @@ -50,7 +50,7 @@ DATA: "title": "футляри до державних нагород", "minimalStep": { "currency": "UAH", - "amount": 35 + "amount": 15 }, "enquiryPeriod": { "startDate": "2019-10-01T01:00:00+03:00", @@ -153,7 +153,7 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/a40454d58b7b4e1e }, "percentage": 54.45, "type": "financing", - "id": "b2587d4a2cd547b5af3468d740da3131" + "id": "442dc8681e8844d38f672de6d5380e61" } ], "mainProcurementCategory": "goods", @@ -164,7 +164,7 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/a40454d58b7b4e1e "title": "футляри до державних нагород", "minimalStep": { "currency": "UAH", - "amount": 35.0, + "amount": 15.0, "valueAddedTaxIncluded": true }, "items": [ @@ -185,7 +185,7 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/a40454d58b7b4e1e "deliveryDate": { "endDate": "2019-11-09T01:00:00+03:00" }, - "id": "f504abadba414a5ea3b148a8323a19c4", + "id": "5361183669984f2e81cf72c95081f037", "unit": { "code": "KGM", "name": "кг" diff --git a/docs/source/centralized-procurements/http/patch-plan-milestone.http b/docs/source/centralized-procurements/http/patch-plan-milestone.http index e6032f887e..062575204f 100644 --- a/docs/source/centralized-procurements/http/patch-plan-milestone.http +++ b/docs/source/centralized-procurements/http/patch-plan-milestone.http @@ -1,4 +1,4 @@ -PATCH /api/2.5/plans/77cf582ab7284fb1a0e748ea7fe9033f/milestones/e00a9a2282f647598f1688ad83fd9070?acc_token=6e455ae5f2a8451b9732a2e3c32260c3 HTTP/1.0 +PATCH /api/2.5/plans/77cf582ab7284fb1a0e748ea7fe9033f/milestones/65ddb2f1dc114a3d9dbed945573ec4e7?acc_token=6e455ae5f2a8451b9732a2e3c32260c3 HTTP/1.0 Authorization: Bearer broker Content-Length: 233 Content-Type: application/json @@ -32,7 +32,7 @@ Content-Type: application/json; charset=UTF-8 "owner": "broker", "dateMet": "2019-05-02T06:00:00+03:00", "type": "approval", - "id": "e00a9a2282f647598f1688ad83fd9070" + "id": "65ddb2f1dc114a3d9dbed945573ec4e7" } } diff --git a/docs/source/centralized-procurements/http/patch-plan-status-scheduled.http b/docs/source/centralized-procurements/http/patch-plan-status-scheduled.http index ca8766e8a0..a961be3110 100644 --- a/docs/source/centralized-procurements/http/patch-plan-status-scheduled.http +++ b/docs/source/centralized-procurements/http/patch-plan-status-scheduled.http @@ -48,7 +48,7 @@ Content-Type: application/json; charset=UTF-8 "deliveryDate": { "endDate": "2019-11-09T01:00:00+03:00" }, - "id": "f7271f852efe465c876aba44613ab929", + "id": "20af24c61dc7451a9205eca2dac56d65", "unit": { "code": "KGM", "name": "кг" @@ -66,7 +66,7 @@ Content-Type: application/json; charset=UTF-8 "currency": "UAH", "amount": 1500.0 }, - "id": "d2eea74930724e5ea1f91acf90177772" + "id": "f0d2c36b24ed47169ca75a7803897a2d" } ], "amountNet": 12222.0, diff --git a/docs/source/centralized-procurements/http/plan-complete.http b/docs/source/centralized-procurements/http/plan-complete.http index f9839d7a75..d463594b61 100644 --- a/docs/source/centralized-procurements/http/plan-complete.http +++ b/docs/source/centralized-procurements/http/plan-complete.http @@ -27,7 +27,7 @@ Content-Type: application/json; charset=UTF-8 "url": "http://public-docs-sandbox.prozorro.gov.ua/get/d890dc3d64cf4f178fb9db75ba5af9ba?KeyID=a8968c46&Signature=l9Wow2YLingYU5xYfD1kzPUP0kjqpX8Ly4roCF5sxfCs0HdBfUMon7%2FN%252BpsAIJEt%2FROpe%252B6w9Bt1rGK0dgCIAw%253D%253D", "format": "application/pdf", "datePublished": "2019-05-02T06:00:00+03:00", - "id": "a89815d701b947879ebda169b524e54c", + "id": "e3fa77b8dce5482ebb27c1cbe9752896", "dateModified": "2019-05-02T06:00:00+03:00" } ], @@ -46,7 +46,7 @@ Content-Type: application/json; charset=UTF-8 "owner": "broker", "dateMet": "2019-05-02T06:00:00+03:00", "type": "approval", - "id": "e00a9a2282f647598f1688ad83fd9070" + "id": "65ddb2f1dc114a3d9dbed945573ec4e7" } ], "classification": { @@ -72,7 +72,7 @@ Content-Type: application/json; charset=UTF-8 "deliveryDate": { "endDate": "2019-11-09T01:00:00+03:00" }, - "id": "f7271f852efe465c876aba44613ab929", + "id": "20af24c61dc7451a9205eca2dac56d65", "unit": { "code": "KGM", "name": "кг" @@ -90,7 +90,7 @@ Content-Type: application/json; charset=UTF-8 "currency": "UAH", "amount": 1500.0 }, - "id": "d2eea74930724e5ea1f91acf90177772" + "id": "f0d2c36b24ed47169ca75a7803897a2d" } ], "amountNet": 12222.0, diff --git a/docs/source/centralized-procurements/http/post-plan-milestone-document.http b/docs/source/centralized-procurements/http/post-plan-milestone-document.http index eca8559520..76962064e8 100644 --- a/docs/source/centralized-procurements/http/post-plan-milestone-document.http +++ b/docs/source/centralized-procurements/http/post-plan-milestone-document.http @@ -1,4 +1,4 @@ -POST /api/2.5/plans/77cf582ab7284fb1a0e748ea7fe9033f/milestones/e00a9a2282f647598f1688ad83fd9070/documents?acc_token=6e455ae5f2a8451b9732a2e3c32260c3 HTTP/1.0 +POST /api/2.5/plans/77cf582ab7284fb1a0e748ea7fe9033f/milestones/65ddb2f1dc114a3d9dbed945573ec4e7/documents?acc_token=6e455ae5f2a8451b9732a2e3c32260c3 HTTP/1.0 Authorization: Bearer broker Content-Length: 320 Content-Type: application/json @@ -15,7 +15,7 @@ DATA: Response: 201 Created Content-Type: application/json; charset=UTF-8 -Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/plans/77cf582ab7284fb1a0e748ea7fe9033f/milestones/e00a9a2282f647598f1688ad83fd9070/documents/a89815d701b947879ebda169b524e54c +Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/plans/77cf582ab7284fb1a0e748ea7fe9033f/milestones/65ddb2f1dc114a3d9dbed945573ec4e7/documents/e3fa77b8dce5482ebb27c1cbe9752896 { "data": { "hash": "md5:00000000000000000000000000000000", @@ -23,7 +23,7 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/plans/77cf582ab7284fb1a0 "url": "http://public-docs-sandbox.prozorro.gov.ua/get/d890dc3d64cf4f178fb9db75ba5af9ba?KeyID=a8968c46&Signature=l9Wow2YLingYU5xYfD1kzPUP0kjqpX8Ly4roCF5sxfCs0HdBfUMon7%2FN%252BpsAIJEt%2FROpe%252B6w9Bt1rGK0dgCIAw%253D%253D", "format": "application/pdf", "datePublished": "2019-05-02T06:00:00+03:00", - "id": "a89815d701b947879ebda169b524e54c", + "id": "e3fa77b8dce5482ebb27c1cbe9752896", "dateModified": "2019-05-02T06:00:00+03:00" } } diff --git a/docs/source/centralized-procurements/http/post-plan-milestone.http b/docs/source/centralized-procurements/http/post-plan-milestone.http index c508907e1a..b4fd15eda8 100644 --- a/docs/source/centralized-procurements/http/post-plan-milestone.http +++ b/docs/source/centralized-procurements/http/post-plan-milestone.http @@ -23,7 +23,7 @@ DATA: Response: 201 Created Content-Type: application/json; charset=UTF-8 -Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/plans/77cf582ab7284fb1a0e748ea7fe9033f/milestones/e00a9a2282f647598f1688ad83fd9070 +Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/plans/77cf582ab7284fb1a0e748ea7fe9033f/milestones/65ddb2f1dc114a3d9dbed945573ec4e7 { "access": { "token": "6e455ae5f2a8451b9732a2e3c32260c3" @@ -44,7 +44,7 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/plans/77cf582ab7284fb1a0 "dateModified": "2019-05-02T05:00:00+03:00", "owner": "broker", "type": "approval", - "id": "e00a9a2282f647598f1688ad83fd9070" + "id": "65ddb2f1dc114a3d9dbed945573ec4e7" } } diff --git a/docs/source/centralized-procurements/http/tender-get.http b/docs/source/centralized-procurements/http/tender-get.http index 33d0992810..b9623d409c 100644 --- a/docs/source/centralized-procurements/http/tender-get.http +++ b/docs/source/centralized-procurements/http/tender-get.http @@ -41,7 +41,7 @@ Content-Type: application/json; charset=UTF-8 }, "percentage": 54.45, "type": "financing", - "id": "b2587d4a2cd547b5af3468d740da3131" + "id": "442dc8681e8844d38f672de6d5380e61" } ], "mainProcurementCategory": "goods", @@ -53,7 +53,7 @@ Content-Type: application/json; charset=UTF-8 "title": "футляри до державних нагород", "minimalStep": { "currency": "UAH", - "amount": 35.0, + "amount": 15.0, "valueAddedTaxIncluded": true }, "items": [ @@ -74,7 +74,7 @@ Content-Type: application/json; charset=UTF-8 "deliveryDate": { "endDate": "2019-11-09T01:00:00+03:00" }, - "id": "f504abadba414a5ea3b148a8323a19c4", + "id": "5361183669984f2e81cf72c95081f037", "unit": { "code": "KGM", "name": "кг" diff --git a/docs/source/contracting/http/add-contract-change.http b/docs/source/contracting/http/add-contract-change.http index 9ff473dc87..2b42a57659 100644 --- a/docs/source/contracting/http/add-contract-change.http +++ b/docs/source/contracting/http/add-contract-change.http @@ -27,7 +27,7 @@ Content-Type: application/json; charset=UTF-8 "rationale_en": "Contract change cause", "rationale": "Опис причини змін контракту", "date": "2020-05-15T01:00:01+03:00", - "id": "f3fe39d5213d4a029212ff4f1151cf40" + "id": "81250fd3a7ee4df6b89ed94e5b3996ce" } } diff --git a/docs/source/contracting/http/apply-contract-change.http b/docs/source/contracting/http/apply-contract-change.http index 543ea3a4d4..2d109d34c5 100644 --- a/docs/source/contracting/http/apply-contract-change.http +++ b/docs/source/contracting/http/apply-contract-change.http @@ -1,4 +1,4 @@ -PATCH /api/2.5/contracts/05870adde49c424db6a2dba280ea90ab/changes/f3fe39d5213d4a029212ff4f1151cf40?acc_token=9e4e9f4da0514309b6c79bbafb5b59c3 HTTP/1.0 +PATCH /api/2.5/contracts/05870adde49c424db6a2dba280ea90ab/changes/81250fd3a7ee4df6b89ed94e5b3996ce?acc_token=9e4e9f4da0514309b6c79bbafb5b59c3 HTTP/1.0 Authorization: Bearer broker Content-Length: 73 Content-Type: application/json @@ -24,7 +24,7 @@ Content-Type: application/json; charset=UTF-8 "dateSigned": "2020-05-15T01:00:01+03:00", "rationale": "Друга і третя поставка має бути розфасована", "date": "2020-05-15T01:00:01+03:00", - "id": "f3fe39d5213d4a029212ff4f1151cf40" + "id": "81250fd3a7ee4df6b89ed94e5b3996ce" } } diff --git a/docs/source/contracting/http/contract-credentials.http b/docs/source/contracting/http/contract-credentials.http index 7e067e3479..df52ee83b1 100644 --- a/docs/source/contracting/http/contract-credentials.http +++ b/docs/source/contracting/http/contract-credentials.http @@ -39,7 +39,7 @@ Content-Type: application/json; charset=UTF-8 "startDate": "2020-05-17T01:00:00+03:00", "endDate": "2020-05-20T01:00:00+03:00" }, - "id": "f9297f1a5b7148afa736fdb77d9a7d98", + "id": "5aa33ced861b46229ef867cdad804781", "unit": { "code": "44617100-9", "name": "item" @@ -71,7 +71,7 @@ Content-Type: application/json; charset=UTF-8 "startDate": "2020-05-17T01:00:00+03:00", "endDate": "2020-05-20T01:00:00+03:00" }, - "id": "5266f95b8c684790890c7d2923546a9d", + "id": "6c7f176182554740ad5aa5757c9d1f4e", "unit": { "code": "44617100-9", "name": "item" diff --git a/docs/source/contracting/http/contract-documents.http b/docs/source/contracting/http/contract-documents.http index 95fbfe0e5a..5776544a23 100644 --- a/docs/source/contracting/http/contract-documents.http +++ b/docs/source/contracting/http/contract-documents.http @@ -22,7 +22,7 @@ Content-Type: application/json; charset=UTF-8 "documentOf": "change", "datePublished": "2020-05-15T01:00:01+03:00", "id": "de3004e5b9844707bb35405277043c7c", - "relatedItem": "f3fe39d5213d4a029212ff4f1151cf40", + "relatedItem": "81250fd3a7ee4df6b89ed94e5b3996ce", "dateModified": "2020-05-15T01:00:01+03:00" } ] diff --git a/docs/source/contracting/http/contract-termination.http b/docs/source/contracting/http/contract-termination.http index 9b0c9e5418..aa2703abb1 100644 --- a/docs/source/contracting/http/contract-termination.http +++ b/docs/source/contracting/http/contract-termination.http @@ -30,7 +30,7 @@ Content-Type: application/json; charset=UTF-8 "dateSigned": "2020-05-15T01:00:01+03:00", "rationale": "Друга і третя поставка має бути розфасована", "date": "2020-05-15T01:00:01+03:00", - "id": "f3fe39d5213d4a029212ff4f1151cf40" + "id": "81250fd3a7ee4df6b89ed94e5b3996ce" } ], "documents": [ @@ -41,7 +41,7 @@ Content-Type: application/json; charset=UTF-8 "documentOf": "change", "datePublished": "2020-05-15T01:00:01+03:00", "id": "de3004e5b9844707bb35405277043c7c", - "relatedItem": "f3fe39d5213d4a029212ff4f1151cf40", + "relatedItem": "81250fd3a7ee4df6b89ed94e5b3996ce", "dateModified": "2020-05-15T01:00:01+03:00" }, { @@ -98,7 +98,7 @@ Content-Type: application/json; charset=UTF-8 "startDate": "2020-05-17T01:00:00+03:00", "endDate": "2020-05-20T01:00:00+03:00" }, - "id": "f9297f1a5b7148afa736fdb77d9a7d98", + "id": "5aa33ced861b46229ef867cdad804781", "unit": { "code": "44617100-9", "name": "item" diff --git a/docs/source/contracting/http/contract-view.http b/docs/source/contracting/http/contract-view.http index 85ed496775..397a40314c 100644 --- a/docs/source/contracting/http/contract-view.http +++ b/docs/source/contracting/http/contract-view.http @@ -32,7 +32,7 @@ Content-Type: application/json; charset=UTF-8 "startDate": "2020-05-17T01:00:00+03:00", "endDate": "2020-05-20T01:00:00+03:00" }, - "id": "f9297f1a5b7148afa736fdb77d9a7d98", + "id": "5aa33ced861b46229ef867cdad804781", "unit": { "code": "44617100-9", "name": "item" @@ -64,7 +64,7 @@ Content-Type: application/json; charset=UTF-8 "startDate": "2020-05-17T01:00:00+03:00", "endDate": "2020-05-20T01:00:00+03:00" }, - "id": "5266f95b8c684790890c7d2923546a9d", + "id": "6c7f176182554740ad5aa5757c9d1f4e", "unit": { "code": "44617100-9", "name": "item" diff --git a/docs/source/contracting/http/contracts-patch.http b/docs/source/contracting/http/contracts-patch.http index 9a2b7b71bc..f05dc1a0a2 100644 --- a/docs/source/contracting/http/contracts-patch.http +++ b/docs/source/contracting/http/contracts-patch.http @@ -30,7 +30,7 @@ Content-Type: application/json; charset=UTF-8 "documentOf": "change", "datePublished": "2020-05-15T01:00:01+03:00", "id": "de3004e5b9844707bb35405277043c7c", - "relatedItem": "f3fe39d5213d4a029212ff4f1151cf40", + "relatedItem": "81250fd3a7ee4df6b89ed94e5b3996ce", "dateModified": "2020-05-15T01:00:01+03:00" } ], @@ -60,7 +60,7 @@ Content-Type: application/json; charset=UTF-8 "startDate": "2020-05-17T01:00:00+03:00", "endDate": "2020-05-20T01:00:00+03:00" }, - "id": "f9297f1a5b7148afa736fdb77d9a7d98", + "id": "5aa33ced861b46229ef867cdad804781", "unit": { "code": "44617100-9", "name": "item" @@ -92,7 +92,7 @@ Content-Type: application/json; charset=UTF-8 "startDate": "2020-05-17T01:00:00+03:00", "endDate": "2020-05-20T01:00:00+03:00" }, - "id": "5266f95b8c684790890c7d2923546a9d", + "id": "6c7f176182554740ad5aa5757c9d1f4e", "unit": { "code": "44617100-9", "name": "item" @@ -169,7 +169,7 @@ Content-Type: application/json; charset=UTF-8 "rationale_en": "Contract change cause", "rationale": "Друга і третя поставка має бути розфасована", "date": "2020-05-15T01:00:01+03:00", - "id": "f3fe39d5213d4a029212ff4f1151cf40" + "id": "81250fd3a7ee4df6b89ed94e5b3996ce" } ], "id": "05870adde49c424db6a2dba280ea90ab", diff --git a/docs/source/contracting/http/delete-contract-item.http b/docs/source/contracting/http/delete-contract-item.http index 3900e5eccd..f9e21f4f5e 100644 --- a/docs/source/contracting/http/delete-contract-item.http +++ b/docs/source/contracting/http/delete-contract-item.http @@ -32,7 +32,7 @@ DATA: "startDate": "2020-05-17T01:00:00+03:00", "endDate": "2020-05-20T01:00:00+03:00" }, - "id": "f9297f1a5b7148afa736fdb77d9a7d98", + "id": "5aa33ced861b46229ef867cdad804781", "unit": { "code": "44617100-9", "name": "item" @@ -56,7 +56,7 @@ Content-Type: application/json; charset=UTF-8 "documentOf": "change", "datePublished": "2020-05-15T01:00:01+03:00", "id": "de3004e5b9844707bb35405277043c7c", - "relatedItem": "f3fe39d5213d4a029212ff4f1151cf40", + "relatedItem": "81250fd3a7ee4df6b89ed94e5b3996ce", "dateModified": "2020-05-15T01:00:01+03:00" } ], @@ -86,7 +86,7 @@ Content-Type: application/json; charset=UTF-8 "startDate": "2020-05-17T01:00:00+03:00", "endDate": "2020-05-20T01:00:00+03:00" }, - "id": "f9297f1a5b7148afa736fdb77d9a7d98", + "id": "5aa33ced861b46229ef867cdad804781", "unit": { "code": "44617100-9", "name": "item" @@ -163,7 +163,7 @@ Content-Type: application/json; charset=UTF-8 "rationale_en": "Contract change cause", "rationale": "Друга і третя поставка має бути розфасована", "date": "2020-05-15T01:00:01+03:00", - "id": "f3fe39d5213d4a029212ff4f1151cf40" + "id": "81250fd3a7ee4df6b89ed94e5b3996ce" } ], "id": "05870adde49c424db6a2dba280ea90ab", diff --git a/docs/source/contracting/http/example_contract.http b/docs/source/contracting/http/example_contract.http index 9e90746d48..2d81cad202 100644 --- a/docs/source/contracting/http/example_contract.http +++ b/docs/source/contracting/http/example_contract.http @@ -33,7 +33,7 @@ Content-Type: application/json; charset=UTF-8 "startDate": "2020-05-17T01:00:00+03:00", "endDate": "2020-05-20T01:00:00+03:00" }, - "id": "f9297f1a5b7148afa736fdb77d9a7d98", + "id": "5aa33ced861b46229ef867cdad804781", "unit": { "code": "44617100-9", "name": "item" @@ -65,7 +65,7 @@ Content-Type: application/json; charset=UTF-8 "startDate": "2020-05-17T01:00:00+03:00", "endDate": "2020-05-20T01:00:00+03:00" }, - "id": "5266f95b8c684790890c7d2923546a9d", + "id": "6c7f176182554740ad5aa5757c9d1f4e", "unit": { "code": "44617100-9", "name": "item" diff --git a/docs/source/contracting/http/example_tender.http b/docs/source/contracting/http/example_tender.http index 3d037b36f7..83e882d517 100644 --- a/docs/source/contracting/http/example_tender.http +++ b/docs/source/contracting/http/example_tender.http @@ -78,7 +78,7 @@ Content-Type: application/json; charset=UTF-8 "startDate": "2020-05-17T01:00:00+03:00", "endDate": "2020-05-20T01:00:00+03:00" }, - "id": "f9297f1a5b7148afa736fdb77d9a7d98", + "id": "5aa33ced861b46229ef867cdad804781", "unit": { "code": "44617100-9", "name": "item" @@ -110,7 +110,7 @@ Content-Type: application/json; charset=UTF-8 "startDate": "2020-05-17T01:00:00+03:00", "endDate": "2020-05-20T01:00:00+03:00" }, - "id": "5266f95b8c684790890c7d2923546a9d", + "id": "6c7f176182554740ad5aa5757c9d1f4e", "unit": { "code": "44617100-9", "name": "item" @@ -189,7 +189,7 @@ Content-Type: application/json; charset=UTF-8 } } ], - "bid_id": "3d16be5bb3704544abcd23f64a7f0dfa", + "bid_id": "52e4c58721f44de7b6960352cda9c813", "value": { "currency": "UAH", "amount": 500.0, @@ -223,12 +223,12 @@ Content-Type: application/json; charset=UTF-8 }, "percentage": 54.45, "type": "financing", - "id": "cccd68a5b0e641a6a44bdb763be5b411" + "id": "7165d3511d90406eae24f15c7dc77128" } ], "minimalStep": { "currency": "UAH", - "amount": 35.0, + "amount": 15.0, "valueAddedTaxIncluded": true }, "items": [ @@ -257,7 +257,7 @@ Content-Type: application/json; charset=UTF-8 "startDate": "2020-05-17T01:00:00+03:00", "endDate": "2020-05-20T01:00:00+03:00" }, - "id": "f9297f1a5b7148afa736fdb77d9a7d98", + "id": "5aa33ced861b46229ef867cdad804781", "unit": { "code": "44617100-9", "name": "item" @@ -289,7 +289,7 @@ Content-Type: application/json; charset=UTF-8 "startDate": "2020-05-17T01:00:00+03:00", "endDate": "2020-05-20T01:00:00+03:00" }, - "id": "5266f95b8c684790890c7d2923546a9d", + "id": "6c7f176182554740ad5aa5757c9d1f4e", "unit": { "code": "44617100-9", "name": "item" @@ -301,7 +301,7 @@ Content-Type: application/json; charset=UTF-8 { "date": "2020-05-15T01:00:00+03:00", "status": "active", - "id": "3d16be5bb3704544abcd23f64a7f0dfa", + "id": "52e4c58721f44de7b6960352cda9c813", "value": { "currency": "UAH", "amount": 500.0, diff --git a/docs/source/contracting/http/patch-contract-change.http b/docs/source/contracting/http/patch-contract-change.http index bf4858c920..6e0f4b3b94 100644 --- a/docs/source/contracting/http/patch-contract-change.http +++ b/docs/source/contracting/http/patch-contract-change.http @@ -1,4 +1,4 @@ -PATCH /api/2.5/contracts/05870adde49c424db6a2dba280ea90ab/changes/f3fe39d5213d4a029212ff4f1151cf40?acc_token=9e4e9f4da0514309b6c79bbafb5b59c3 HTTP/1.0 +PATCH /api/2.5/contracts/05870adde49c424db6a2dba280ea90ab/changes/81250fd3a7ee4df6b89ed94e5b3996ce?acc_token=9e4e9f4da0514309b6c79bbafb5b59c3 HTTP/1.0 Authorization: Bearer broker Content-Length: 255 Content-Type: application/json @@ -22,7 +22,7 @@ Content-Type: application/json; charset=UTF-8 "rationale_en": "Contract change cause", "rationale": "Друга і третя поставка має бути розфасована", "date": "2020-05-15T01:00:01+03:00", - "id": "f3fe39d5213d4a029212ff4f1151cf40" + "id": "81250fd3a7ee4df6b89ed94e5b3996ce" } } diff --git a/docs/source/contracting/http/set-document-of-change.http b/docs/source/contracting/http/set-document-of-change.http index b8c0145294..d581db70ab 100644 --- a/docs/source/contracting/http/set-document-of-change.http +++ b/docs/source/contracting/http/set-document-of-change.http @@ -7,7 +7,7 @@ DATA: { "data": { "documentOf": "change", - "relatedItem": "f3fe39d5213d4a029212ff4f1151cf40" + "relatedItem": "81250fd3a7ee4df6b89ed94e5b3996ce" } } @@ -21,7 +21,7 @@ Content-Type: application/json; charset=UTF-8 "documentOf": "change", "datePublished": "2020-05-15T01:00:01+03:00", "id": "de3004e5b9844707bb35405277043c7c", - "relatedItem": "f3fe39d5213d4a029212ff4f1151cf40", + "relatedItem": "81250fd3a7ee4df6b89ed94e5b3996ce", "dateModified": "2020-05-15T01:00:01+03:00" } } diff --git a/docs/source/contracting/http/update-contract-item.http b/docs/source/contracting/http/update-contract-item.http index 55650e427e..30b98a1acf 100644 --- a/docs/source/contracting/http/update-contract-item.http +++ b/docs/source/contracting/http/update-contract-item.http @@ -28,7 +28,7 @@ Content-Type: application/json; charset=UTF-8 "documentOf": "change", "datePublished": "2020-05-15T01:00:01+03:00", "id": "de3004e5b9844707bb35405277043c7c", - "relatedItem": "f3fe39d5213d4a029212ff4f1151cf40", + "relatedItem": "81250fd3a7ee4df6b89ed94e5b3996ce", "dateModified": "2020-05-15T01:00:01+03:00" } ], @@ -58,7 +58,7 @@ Content-Type: application/json; charset=UTF-8 "startDate": "2020-05-17T01:00:00+03:00", "endDate": "2020-05-20T01:00:00+03:00" }, - "id": "f9297f1a5b7148afa736fdb77d9a7d98", + "id": "5aa33ced861b46229ef867cdad804781", "unit": { "code": "44617100-9", "name": "item" @@ -90,7 +90,7 @@ Content-Type: application/json; charset=UTF-8 "startDate": "2020-05-17T01:00:00+03:00", "endDate": "2020-05-20T01:00:00+03:00" }, - "id": "5266f95b8c684790890c7d2923546a9d", + "id": "6c7f176182554740ad5aa5757c9d1f4e", "unit": { "code": "44617100-9", "name": "item" @@ -167,7 +167,7 @@ Content-Type: application/json; charset=UTF-8 "rationale_en": "Contract change cause", "rationale": "Друга і третя поставка має бути розфасована", "date": "2020-05-15T01:00:01+03:00", - "id": "f3fe39d5213d4a029212ff4f1151cf40" + "id": "81250fd3a7ee4df6b89ed94e5b3996ce" } ], "id": "05870adde49c424db6a2dba280ea90ab", diff --git a/docs/source/contracting/http/view-all-contract-changes.http b/docs/source/contracting/http/view-all-contract-changes.http index c17cc803dd..1f4615523b 100644 --- a/docs/source/contracting/http/view-all-contract-changes.http +++ b/docs/source/contracting/http/view-all-contract-changes.http @@ -16,7 +16,7 @@ Content-Type: application/json; charset=UTF-8 "dateSigned": "2020-05-15T01:00:01+03:00", "rationale": "Друга і третя поставка має бути розфасована", "date": "2020-05-15T01:00:01+03:00", - "id": "f3fe39d5213d4a029212ff4f1151cf40" + "id": "81250fd3a7ee4df6b89ed94e5b3996ce" } ] } diff --git a/docs/source/contracting/http/view-contract-change.http b/docs/source/contracting/http/view-contract-change.http index 380b763c82..dbcdbbc0ab 100644 --- a/docs/source/contracting/http/view-contract-change.http +++ b/docs/source/contracting/http/view-contract-change.http @@ -1,4 +1,4 @@ -GET /api/2.5/contracts/05870adde49c424db6a2dba280ea90ab/changes/f3fe39d5213d4a029212ff4f1151cf40 HTTP/1.0 +GET /api/2.5/contracts/05870adde49c424db6a2dba280ea90ab/changes/81250fd3a7ee4df6b89ed94e5b3996ce HTTP/1.0 Authorization: Bearer broker Host: lb-api-sandbox.prozorro.gov.ua @@ -14,7 +14,7 @@ Content-Type: application/json; charset=UTF-8 "rationale_en": "Contract change cause", "rationale": "Опис причини змін контракту", "date": "2020-05-15T01:00:01+03:00", - "id": "f3fe39d5213d4a029212ff4f1151cf40" + "id": "81250fd3a7ee4df6b89ed94e5b3996ce" } } diff --git a/docs/source/contracting/http/view-contract.http b/docs/source/contracting/http/view-contract.http index fb56ab51f0..e57ee3d602 100644 --- a/docs/source/contracting/http/view-contract.http +++ b/docs/source/contracting/http/view-contract.http @@ -15,7 +15,7 @@ Content-Type: application/json; charset=UTF-8 "documentOf": "change", "datePublished": "2020-05-15T01:00:01+03:00", "id": "de3004e5b9844707bb35405277043c7c", - "relatedItem": "f3fe39d5213d4a029212ff4f1151cf40", + "relatedItem": "81250fd3a7ee4df6b89ed94e5b3996ce", "dateModified": "2020-05-15T01:00:01+03:00" } ], @@ -45,7 +45,7 @@ Content-Type: application/json; charset=UTF-8 "startDate": "2020-05-17T01:00:00+03:00", "endDate": "2020-05-20T01:00:00+03:00" }, - "id": "f9297f1a5b7148afa736fdb77d9a7d98", + "id": "5aa33ced861b46229ef867cdad804781", "unit": { "code": "44617100-9", "name": "item" @@ -123,7 +123,7 @@ Content-Type: application/json; charset=UTF-8 "dateSigned": "2020-05-15T01:00:01+03:00", "rationale": "Друга і третя поставка має бути розфасована", "date": "2020-05-15T01:00:01+03:00", - "id": "f3fe39d5213d4a029212ff4f1151cf40" + "id": "81250fd3a7ee4df6b89ed94e5b3996ce" } ], "id": "05870adde49c424db6a2dba280ea90ab", diff --git a/docs/source/locale/uk/LC_MESSAGES/standard/award.po b/docs/source/locale/uk/LC_MESSAGES/standard/award.po index 908844a701..eac4f7be47 100644 --- a/docs/source/locale/uk/LC_MESSAGES/standard/award.po +++ b/docs/source/locale/uk/LC_MESSAGES/standard/award.po @@ -3,7 +3,7 @@ msgid "" msgstr "" "Project-Id-Version: openprocurement.api 0.3\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-05-10 13:47+0300\n" +"POT-Creation-Date: 2020-08-26 16:27+0300\n" "PO-Revision-Date: 2018-08-17 14:42+0300\n" "Last-Translator: Zoriana Zaiats \n" "Language-Team: Ukrainian \n" @@ -12,290 +12,192 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Generated-By: Babel 1.3\n" -#: ../../source/standard/award.rst:8 msgid "Award" msgstr "Award" -#: ../../source/standard/award.rst:11 msgid "Schema" msgstr "Схема" -#: ../../source/standard/award.rst:0 msgid "id" msgstr "" -#: ../../source/standard/award.rst:14 ../../source/standard/award.rst:20 msgid "string, auto-generated, read-only" msgstr "рядок, генерується автоматично, лише для читання" -#: ../../source/standard/award.rst:16 msgid "|ocdsDescription| The identifier for this award." msgstr "|ocdsDescription| Ідентифікатор цього рішення." -#: ../../source/standard/award.rst:0 msgid "bid_id" msgstr "" -#: ../../source/standard/award.rst:22 msgid "The Id of a bid that the award relates to." msgstr "ID пропозиції, що виграла закупівлю." -#: ../../source/standard/award.rst:24 msgid "absent in :ref:`limited`:" msgstr "відсутній у :ref:`limited`:" -#: ../../source/standard/award.rst:0 msgid "title" msgstr "" -#: ../../source/standard/award.rst:27 ../../source/standard/award.rst:33 msgid "string, multilingual" msgstr "рядок, багатомовний" -#: ../../source/standard/award.rst:29 msgid "|ocdsDescription| Award title." msgstr "|ocdsDescription| Назва рішення." -#: ../../source/standard/award.rst:0 msgid "description" msgstr "" -#: ../../source/standard/award.rst:35 msgid "|ocdsDescription| Award description." msgstr "|ocdsDescription| Опис рішення." -#: ../../source/standard/award.rst:0 msgid "status" msgstr "" -#: ../../source/standard/award.rst:39 ../../source/standard/award.rst:98 -#: ../../source/standard/award.rst:123 msgid "string" msgstr "рядок" -#: ../../source/standard/award.rst:41 -msgid "" -"|ocdsDescription| The current status of the award drawn from the " -"`awardStatus` codelist." -msgstr "" -"|ocdsDescription| Поточний статус рішення, взятий зі списку кодів " -"`awardStatus`." +msgid "|ocdsDescription| The current status of the award drawn from the `awardStatus` codelist." +msgstr "|ocdsDescription| Поточний статус рішення, взятий зі списку кодів `awardStatus`." -#: ../../source/standard/award.rst:44 msgid "Possible values are:" msgstr "Можливі значення:" -#: ../../source/standard/award.rst:46 msgid "`pending` - the award is under review of qualification committee" msgstr "`pending` - переможець розглядається кваліфікаційною комісією" -#: ../../source/standard/award.rst:47 msgid "`unsuccessful` - the award has been rejected by qualification committee" msgstr "`unsuccessful` - кваліфікаційна комісія відмовила переможцю" -#: ../../source/standard/award.rst:48 msgid "`active` - the tender is awarded to the bidder from the `bid_id`" msgstr "`active` - закупівлю виграв учасник з пропозицією `bid_id`" -#: ../../source/standard/award.rst:49 msgid "`cancelled` - the award has been cancelled by complaint review body" msgstr "`cancelled` - орган, що розглядає скарги, відмінив результати закупівлі" -#: ../../source/standard/award.rst:0 msgid "date" msgstr "" -#: ../../source/standard/award.rst:52 msgid "string, :ref:`Date`, auto-generated, read-only" msgstr "рядок, :ref:`Date`, генерується автоматично, лише для читання" -#: ../../source/standard/award.rst:54 msgid "|ocdsDescription| The date of the contract award." msgstr "|ocdsDescription| Дата рішення про підписання договору." -#: ../../source/standard/award.rst:0 msgid "value" msgstr "" -#: ../../source/standard/award.rst:58 msgid ":ref:`Value` object, auto-generated, read-only" msgstr "Об’єкт :ref:`Value`, генерується автоматично, лише для читання" -#: ../../source/standard/award.rst:60 msgid "|ocdsDescription| The total value of this award." msgstr "|ocdsDescription| Загальна вартість згідно цього рішення." -#: ../../source/standard/award.rst:63 -msgid "" -"Differences in :ref:`defense`, :ref:`esco`, :ref:`openua` and " -":ref:`openeu`:" -msgstr "Відмінності :ref:`defense`, :ref:`esco`, :ref:`openua` та " -":ref:`openeu`:" +msgid "Differences in :ref:`defense`, :ref:`esco`, :ref:`openua` and :ref:`openeu`:" +msgstr "Відмінності :ref:`defense`, :ref:`esco`, :ref:`openua` та :ref:`openeu`:" -#: ../../source/standard/award.rst:65 msgid "List of :ref:`Value` objects, auto-generated, read-only" msgstr "Список :ref:`Value` об’єктів, генерується автоматично, лише для читання" -#: ../../source/standard/award.rst:67 ../../source/standard/award.rst:102 msgid "Differences in :ref:`limited`:" msgstr "Відмінності у :ref:`limited`:" -#: ../../source/standard/award.rst:69 msgid "`Value` object" msgstr "Об'єкт `Value`" -#: ../../source/standard/award.rst:0 msgid "suppliers" msgstr "" -#: ../../source/standard/award.rst:72 msgid "List of :ref:`BusinessOrganization` objects, auto-generated, read-only" -msgstr "" -"Список об’єктів :ref:`BusinessOrganization`, генерується автоматично, лише для " -"читання" +msgstr "Список об’єктів :ref:`BusinessOrganization`, генерується автоматично, лише для читання" -#: ../../source/standard/award.rst:74 msgid "|ocdsDescription| The suppliers awarded with this award." -msgstr "" -"|ocdsDescription| Постачальники, що були визнані переможцями згідно цього" -" рішення." +msgstr "|ocdsDescription| Постачальники, що були визнані переможцями згідно цього рішення." -#: ../../source/standard/award.rst:0 msgid "items" msgstr "" -#: ../../source/standard/award.rst:78 msgid "List of :ref:`Item` objects, auto-generated, read-only" msgstr "Список об’єктів :ref:`Item`, генерується автоматично, лише для читання" -#: ../../source/standard/award.rst:80 -msgid "" -"|ocdsDescription| The goods and services awarded in this award, broken " -"into line items wherever possible. Items should not be duplicated, but " -"the quantity specified instead." -msgstr "" -"|ocdsDescription| Товари та послуги, що розглядались цим рішенням, " -"поділені на окремі рядки, де це можливо. Елементи не повинні бути " -"продубльовані, а повинні мати вказану кількість." +msgid "|ocdsDescription| The goods and services awarded in this award, broken into line items wherever possible. Items should not be duplicated, but the quantity specified instead." +msgstr "|ocdsDescription| Товари та послуги, що розглядались цим рішенням, поділені на окремі рядки, де це можливо. Елементи не повинні бути продубльовані, а повинні мати вказану кількість." -#: ../../source/standard/award.rst:0 msgid "documents" msgstr "" -#: ../../source/standard/award.rst:84 msgid "List of :ref:`Document` objects" msgstr "Список об’єктів :ref:`Document`" -#: ../../source/standard/award.rst:86 -msgid "" -"|ocdsDescription| All documents and attachments related to the award, " -"including any notices." -msgstr "" -"|ocdsDescription| Усі документи та додатки пов’язані з рішенням, включно " -"з будь-якими повідомленнями." +msgid "|ocdsDescription| All documents and attachments related to the award, including any notices." +msgstr "|ocdsDescription| Усі документи та додатки пов’язані з рішенням, включно з будь-якими повідомленнями." -#: ../../source/standard/award.rst:0 msgid "complaints" msgstr "" -#: ../../source/standard/award.rst:90 msgid "List of :ref:`Complaint` objects" msgstr "Список об’єктів :ref:`Complaint`" -#: ../../source/standard/award.rst:0 msgid "complaintPeriod" msgstr "" -#: ../../source/standard/award.rst:93 msgid ":ref:`period`" msgstr ":ref:`period`" -#: ../../source/standard/award.rst:95 msgid "The timeframe when complaints can be submitted." msgstr "Період, під час якого можна подавати скарги." -#: ../../source/standard/award.rst:0 msgid "lotID" msgstr "" -#: ../../source/standard/award.rst:100 msgid "Id of related :ref:`lot`." msgstr "ID пов’язаного :ref:`lot`." -#: ../../source/standard/award.rst:104 -msgid "" -"Id of related :ref:`lot`. Only if `tender.procurementMethodType` is " -"`negotiation` or `negotiation.quick`." -msgstr "" -"" +msgid "Id of related :ref:`lot`. Only if `tender.procurementMethodType` is `negotiation` or `negotiation.quick`." +msgstr "Id пов'язаного :ref:`lot`. Тільки для процуде з `tender.procurementMethodType`: `negotiation` чи `negotiation.quick`." -#: ../../source/standard/award.rst:107 -msgid "" -"Additionally in :ref:`defense`, :ref:`esco`, :ref:`openua` and " -":ref:`openeu`:" -msgstr "Додатково у :ref:`defense`, :ref:`esco`, :ref:`openua` та " -":ref:`openeu`:" +msgid "Additionally in :ref:`defense`, :ref:`esco`, :ref:`openua` and :ref:`openeu`:" +msgstr "Додатково у :ref:`defense`, :ref:`esco`, :ref:`openua` та :ref:`openeu`:" -#: ../../source/standard/award.rst:0 msgid "eligible" msgstr "" -#: ../../source/standard/award.rst:110 ../../source/standard/award.rst:115 -#: ../../source/standard/award.rst:128 msgid "bool" msgstr "bool" -#: ../../source/standard/award.rst:112 -msgid "" -"Confirms compliance of eligibility criteria set by the procuring entity " -"in the tendering documents." -msgstr "" -"Підтверджує відповідність критеріям прийнятності, встановлених замовником" -" в тендерній документації." +msgid "Confirms compliance of eligibility criteria set by the procuring entity in the tendering documents." +msgstr "Підтверджує відповідність критеріям прийнятності, встановлених замовником в тендерній документації." -#: ../../source/standard/award.rst:0 msgid "qualified" msgstr "" -#: ../../source/standard/award.rst:117 -msgid "" -"Confirms the absence of grounds for refusal to participate in accordance " -"with Article 17 of the Law of Ukraine \"On Public Procurement\"." -msgstr "" -"Підтверджує відсутність підстав для відмови від участі відповідно до " -"статті 17 Закону України ”Про державні закупівлі”." +msgid "Confirms the absence of grounds for refusal to participate in accordance with Article 17 of the Law of Ukraine \"On Public Procurement\"." +msgstr "Підтверджує відсутність підстав для відмови від участі відповідно до статті 17 Закону України ”Про державні закупівлі”." -#: ../../source/standard/award.rst:120 msgid "Additionally in :ref:`limited`:" msgstr "Додатково :ref:`limited`:" -#: ../../source/standard/award.rst:0 msgid "subcontractingDetails" msgstr "" -#: ../../source/standard/award.rst:125 -msgid "" -"The text field of any length that contains information about " -"subcontractor." +msgid "The text field of any length that contains information about subcontractor." msgstr "Текстове поле будь-якої довжини, що містить інформацію про субпідрядника." -#: ../../source/standard/award.rst:130 -msgid "" -"Confirms that Procuring entity has no grounds to reject a participant in " -"accordance with Article 17 of the Law of Ukraine \"On Public " -"Procurement\"." +msgid "Confirms that Procuring entity has no grounds to reject a participant in accordance with Article 17 of the Law of Ukraine \"On Public Procurement\"." +msgstr "Підтверджує відсутність підстав для відмови від участі відповідно до статті 17 Закону України ”Про державні закупівлі”." + +msgid "requirementResponses" msgstr "" -"Підтверджує відсутність підстав для відмови від участі відповідно до " -"статті 17 Закону України ”Про державні закупівлі”." -#: ../../source/standard/award.rst:134 +msgid "List of :ref:`RequirementResponse` objects." +msgstr "Список об’єктів :ref:`RequirementResponse`" + msgid "Award workflow in :ref:`limited`:" msgstr "Робочий процес нагороди в :ref:`limited`:" -#: ../../source/standard/award.rst:148 ../../source/standard/award.rst:167 msgid "\\* marks initial state" msgstr "\\* marks initial state" -#: ../../source/standard/award.rst:152 msgid "Workflow in :ref:`openeu` and :ref:`esco`:" msgstr "Робочий процес у :ref:`openeu` та :ref:`esco`:" + diff --git a/docs/source/locale/uk/LC_MESSAGES/standard/bid.po b/docs/source/locale/uk/LC_MESSAGES/standard/bid.po index 31f106acdc..fef7ef7783 100644 --- a/docs/source/locale/uk/LC_MESSAGES/standard/bid.po +++ b/docs/source/locale/uk/LC_MESSAGES/standard/bid.po @@ -3,7 +3,7 @@ msgid "" msgstr "" "Project-Id-Version: openprocurement.api 0.3\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-12-19 15:11+0200\n" +"POT-Creation-Date: 2020-08-26 16:27+0300\n" "PO-Revision-Date: 2019-12-19 15:14+0200\n" "Last-Translator: Zoriana Zaiats \n" "Language-Team: Ukrainian \n" @@ -11,8 +11,6 @@ msgstr "" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "Generated-By: Babel 1.3\n" -"Language: uk\n" -"X-Generator: Poedit 2.2.3\n" msgid "Bid" msgstr "Bid" @@ -170,6 +168,12 @@ msgstr "" msgid "List of :ref:`ConfidentialDocument` objects. This envelope is revealed at post-qualification." msgstr "Список об’єктів :ref:`ConfidentialDocument`. Розкривається на посткваліфікації." +msgid "requirementResponses" +msgstr "" + +msgid "List of :ref:`RequirementResponse` objects." +msgstr "Список об’єктів :ref:`RequirementResponse`" + msgid "Parameter" msgstr "Parameter" @@ -214,3 +218,4 @@ msgstr "" msgid "\\* marks initial state" msgstr "" + diff --git a/docs/source/locale/uk/LC_MESSAGES/standard/contract.po b/docs/source/locale/uk/LC_MESSAGES/standard/contract.po index 8e5bcdea01..f6c6e22167 100644 --- a/docs/source/locale/uk/LC_MESSAGES/standard/contract.po +++ b/docs/source/locale/uk/LC_MESSAGES/standard/contract.po @@ -3,7 +3,7 @@ msgid "" msgstr "" "Project-Id-Version: openprocurement.api 0.5\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-05-10 13:47+0300\n" +"POT-Creation-Date: 2020-05-26 16:55+0300\n" "PO-Revision-Date: 2018-08-17 15:13+0300\n" "Last-Translator: Zoriana Zaiats \n" "Language-Team: Ukrainian \n" @@ -12,392 +12,264 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Generated-By: Babel 1.3\n" -#: ../../source/standard/contract.rst:8 msgid "Contract" msgstr "Contract" -#: ../../source/standard/contract.rst:11 ../../source/standard/contract.rst:200 msgid "Schema" msgstr "Схема" -#: ../../source/standard/contract.rst:0 msgid "id" msgstr "" -#: ../../source/standard/contract.rst:14 msgid "uid, auto-generated" msgstr "uid, генерується автоматично" -#: ../../source/standard/contract.rst:16 msgid "|ocdsDescription| The identifier for this contract." msgstr "|ocdsDescription| Ідентифікатор цього договору." -#: ../../source/standard/contract.rst:0 msgid "awardID" msgstr "" -#: ../../source/standard/contract.rst:20 ../../source/standard/contract.rst:32 -#: ../../source/standard/contract.rst:44 ../../source/standard/contract.rst:215 msgid "string, required" msgstr "рядок, обов’язковий" -#: ../../source/standard/contract.rst:22 -msgid "" -"|ocdsDescription| The `Award.id` against which this contract is being " -"issued." -msgstr "" -"|ocdsDescription| `Award.id` вказує на рішення, згідно якого видається " -"договір." +msgid "|ocdsDescription| The `Award.id` against which this contract is being issued." +msgstr "|ocdsDescription| `Award.id` вказує на рішення, згідно якого видається договір." -#: ../../source/standard/contract.rst:0 msgid "contractID" msgstr "" -#: ../../source/standard/contract.rst:26 ../../source/standard/contract.rst:206 -#: ../../source/standard/contract.rst:228 msgid "string, auto-generated, read-only" msgstr "рядок, генерується автоматично, лише для читання" -#: ../../source/standard/contract.rst:0 msgid "contractNumber" msgstr "" -#: ../../source/standard/contract.rst:29 ../../source/standard/contract.rst:38 msgid "string" msgstr "рядок" -#: ../../source/standard/contract.rst:0 msgid "title" msgstr "" -#: ../../source/standard/contract.rst:34 msgid "|ocdsDescription| Contract title" msgstr "|ocdsDescription| Назва договору" -#: ../../source/standard/contract.rst:0 msgid "description" msgstr "" -#: ../../source/standard/contract.rst:40 msgid "|ocdsDescription| Contract description" msgstr "|ocdsDescription| Опис договору" -#: ../../source/standard/contract.rst:0 msgid "status" msgstr "" -#: ../../source/standard/contract.rst:46 msgid "|ocdsDescription| The current status of the contract." msgstr "|ocdsDescription| Поточний статус договору." -#: ../../source/standard/contract.rst:49 ../../source/standard/contract.rst:217 msgid "Possible values are:" msgstr "Можливі значення:" -#: ../../source/standard/contract.rst:51 -msgid "" -"`pending` - this contract has been proposed, but is not yet in force. It " -"may be awaiting signature." -msgstr "" -"`pending` - цей договір запропоновано, але він ще не діє. Можливо " -"очікується його підписання." +msgid "`pending` - this contract has been proposed, but is not yet in force. It may be awaiting signature." +msgstr "`pending` - цей договір запропоновано, але він ще не діє. Можливо очікується його підписання." -#: ../../source/standard/contract.rst:53 ../../source/standard/contract.rst:59 -msgid "" -"`active` - this contract has been signed by all the parties, and is now " -"legally in force." -msgstr "" -"`active` - цей договір підписаний всіма учасниками, і зараз діє на " -"законних підставах." +msgid "`active` - this contract has been signed by all the parties, and is now legally in force." +msgstr "`active` - цей договір підписаний всіма учасниками, і зараз діє на законних підставах." -#: ../../source/standard/contract.rst:55 msgid "`cancelled` - this contract has been cancelled prior to being signed." msgstr "`cancelled` - цей договір було скасовано до підписання." -#: ../../source/standard/contract.rst:57 msgid "Possible values for :ref:`contracting`:" msgstr "Можливі значення для :ref:`contracting`:" -#: ../../source/standard/contract.rst:61 -msgid "" -"`terminated` - this contract was signed and in force, and has now come to" -" a close. This may be due to a successful completion of the contract, or" -" may be early termination due to some non-completion issue." -msgstr "" -"`terminated` - договір був підписаний та діяв, але вже завершився. Це " -"може бути пов'язано з виконанням договору, або з достроковим припиненням " -"через якусь незавершеність." +msgid "`terminated` - this contract was signed and in force, and has now come to a close. This may be due to a successful completion of the contract, or may be early termination due to some non-completion issue." +msgstr "`terminated` - договір був підписаний та діяв, але вже завершився. Це може бути пов'язано з виконанням договору, або з достроковим припиненням через якусь незавершеність." -#: ../../source/standard/contract.rst:0 msgid "period" msgstr "" -#: ../../source/standard/contract.rst:66 msgid ":ref:`Period`" msgstr ":ref:`Period`" -#: ../../source/standard/contract.rst:68 msgid "|ocdsDescription| The start and end date for the contract." msgstr "|ocdsDescription| Дата початку та завершення договору." -#: ../../source/standard/contract.rst:0 msgid "items" msgstr "" -#: ../../source/standard/contract.rst:72 msgid "List of :ref:`Item` objects, auto-generated, read-only" msgstr "Список об’єктів :ref:`Item`, генерується автоматично, лише для читання" -#: ../../source/standard/contract.rst:74 -msgid "" -"|ocdsDescription| The goods, services, and any intangible outcomes in " -"this contract. Note: If the items are the same as the award do not " -"repeat." -msgstr "" -"|ocdsDescription| Товари, послуги та інші нематеріальні результати у цій " -"угоді. Зверніть увагу: Якщо список співпадає з визначенням переможця " -"`award`, то його не потрібно повторювати." +msgid "|ocdsDescription| The goods, services, and any intangible outcomes in this contract. Note: If the items are the same as the award do not repeat." +msgstr "|ocdsDescription| Товари, послуги та інші нематеріальні результати у цій угоді. Зверніть увагу: Якщо список співпадає з визначенням переможця `award`, то його не потрібно повторювати." -#: ../../source/standard/contract.rst:0 msgid "suppliers" msgstr "" -#: ../../source/standard/contract.rst:78 ../../source/standard/contract.rst:212 msgid "List of :ref:`BusinessOrganization` objects, auto-generated, read-only" -msgstr "" -"Список об’єктів :ref:`BusinessOrganization`, генерується автоматично, лише для " -"читання" +msgstr "Список об’єктів :ref:`BusinessOrganization`, генерується автоматично, лише для читання" -#: ../../source/standard/contract.rst:0 msgid "value" msgstr "" -#: ../../source/standard/contract.rst:81 msgid ":ref:`ContractValue` object, auto-generated" msgstr "Об’єкт :ref:`ContractValue`, генерується автоматично, лише для читання" -#: ../../source/standard/contract.rst:83 msgid "|ocdsDescription| The total value of this contract." msgstr "|ocdsDescription| Загальна вартість договору." -#: ../../source/standard/contract.rst:86 msgid "Check \":ref:`SettingContractValue`\" tutorial section for more info" msgstr "" -#: ../../source/standard/contract.rst:0 msgid "dateSigned" msgstr "" -#: ../../source/standard/contract.rst:89 ../../source/standard/contract.rst:114 -#: ../../source/standard/contract.rst:223 msgid "string, :ref:`date`" msgstr "рядок, :ref:`date`" -#: ../../source/standard/contract.rst:91 -msgid "" -"|ocdsDescription| The date when the contract was signed. In the case of " -"multiple signatures, the date of the last signature." -msgstr "" -"|ocdsDescription| Дата підписання договору. Якщо було декілька підписань," -" то береться дата останнього підписання." +msgid "|ocdsDescription| The date when the contract was signed. In the case of multiple signatures, the date of the last signature." +msgstr "|ocdsDescription| Дата підписання договору. Якщо було декілька підписань, то береться дата останнього підписання." -#: ../../source/standard/contract.rst:94 msgid "Differences in :ref:`defense`, :ref:`openua` and :ref:`openeu`:" msgstr "" -#: ../../source/standard/contract.rst:96 msgid "string, :ref:`date`, auto-generated" msgstr "рядок, :ref:`date`, генерується автоматично" -#: ../../source/standard/contract.rst:98 msgid "Time frame for `dateSigned`in :ref:`defense`:" msgstr "Діапазон значень для поля `dateSigned`:" -#: ../../source/standard/contract.rst:101 msgid "reporting procedure:" msgstr "для процедури звітування про укладений договір:" -#: ../../source/standard/contract.rst:101 msgid "[24 hours ago - now]" msgstr "[24 години назад - тепер]" -#: ../../source/standard/contract.rst:104 msgid "negotiation/negotiation.quick procedure:" msgstr "для переговорної процедури / переговорної процедури за нагальною потребою:" -#: ../../source/standard/contract.rst:104 msgid "[complaint period end - now]" msgstr "[закінчення періоду оскаржень - тепер]" -#: ../../source/standard/contract.rst:0 msgid "documents" msgstr "" -#: ../../source/standard/contract.rst:107 msgid "List of :ref:`Document` objects" msgstr "Список об’єктів :ref:`Document`" -#: ../../source/standard/contract.rst:109 -msgid "" -"|ocdsDescription| All documents and attachments related to the contract, " -"including any notices." -msgstr "" -"|ocdsDescription| Усі документи та додатки пов’язані з договором, включно" -" з будь-якими повідомленнями." +msgid "|ocdsDescription| All documents and attachments related to the contract, including any notices." +msgstr "|ocdsDescription| Усі документи та додатки пов’язані з договором, включно з будь-якими повідомленнями." -#: ../../source/standard/contract.rst:0 msgid "date" msgstr "" -#: ../../source/standard/contract.rst:116 -#: ../../source/standard/contract.rst:225 msgid "The date when the contract was changed or activated." msgstr "Дата, коли договір був змінений або активований." -#: ../../source/standard/contract.rst:118 msgid "This field is not in :ref:`contracting`" msgstr "Поля немає в :ref:`contracting`" -#: ../../source/standard/contract.rst:120 msgid "Additional fields for :ref:`contracting`:" msgstr "Додаткові поля для: :ref:`contracting`:" -#: ../../source/standard/contract.rst:0 msgid "procuringEntity" msgstr "" -#: ../../source/standard/contract.rst:124 msgid ":ref:`ProcuringEntity`" msgstr ":ref:`ProcuringEntity`" -#: ../../source/standard/contract.rst:126 -msgid "" -"|ocdsDescription| The entity managing the procurement, which may be " -"different from the buyer who is paying / using the items being procured." -msgstr "" -"|ocdsDescription| Об’єкт, що управляє закупівлею. Він не обов’язково є " -"покупцем, який платить / використовує закуплені елементи." +msgid "|ocdsDescription| The entity managing the procurement, which may be different from the buyer who is paying / using the items being procured." +msgstr "|ocdsDescription| Об’єкт, що управляє закупівлею. Він не обов’язково є покупцем, який платить / використовує закуплені елементи." -#: ../../source/standard/contract.rst:0 msgid "changes" msgstr "" -#: ../../source/standard/contract.rst:131 msgid "List of :ref:`Change` objects." msgstr "Список пов’язаних об’єктів :ref:`Change`." -#: ../../source/standard/contract.rst:0 msgid "amountPaid" msgstr "" -#: ../../source/standard/contract.rst:0 msgid "amount" msgstr "" -#: ../../source/standard/contract.rst:135 msgid "float, required" msgstr "число з рухомою комою, обов’язкове" -#: ../../source/standard/contract.rst:0 msgid "currency" msgstr "" -#: ../../source/standard/contract.rst:136 msgid "string, required, auto-generated" msgstr "рядок, обов’язковий, генерується автоматично" -#: ../../source/standard/contract.rst:0 msgid "valueAddedTaxIncluded" msgstr "" -#: ../../source/standard/contract.rst:137 msgid "bool, required , auto-generated" msgstr "логічний (булевий) тип даних, обов’язковий, генерується автоматично" -#: ../../source/standard/contract.rst:139 msgid "Amount of money actually paid." msgstr "Дійсно оплачена сума." -#: ../../source/standard/contract.rst:0 +msgid "implementation" +msgstr "" + +msgid ":ref:`Implementation`" +msgstr "" + msgid "terminationDetails" msgstr "" -#: ../../source/standard/contract.rst:142 msgid "string, required for unsuccessful contract" msgstr "рядок, обов’язковий для неуспішних договорів" -#: ../../source/standard/contract.rst:144 -msgid "" -"Reasons for contract termination. Presence of this field indicates that " -"contract is unsuccessful." -msgstr "" -"Причина припинення договору. Наявність цього поля вказує, що договір є " -"неуспішним." +msgid "Reasons for contract termination. Presence of this field indicates that contract is unsuccessful." +msgstr "Причина припинення договору. Наявність цього поля вказує, що договір є неуспішним." -#: ../../source/standard/contract.rst:148 msgid "Workflow in :ref:`contracting`" msgstr "Робочий процес в :ref:`contracting`" -#: ../../source/standard/contract.rst:158 -#: ../../source/standard/contract.rst:174 -#: ../../source/standard/contract.rst:193 -#: ../../source/standard/contract.rst:251 msgid "\\* marks initial state" msgstr "\\* позначає початковий стан" -#: ../../source/standard/contract.rst:162 msgid "Contract workflow in :ref:`limited`" msgstr "" -#: ../../source/standard/contract.rst:178 msgid "Workflow in :ref:`openeu`" msgstr "Робочий процес в :ref:`openeu`" -#: ../../source/standard/contract.rst:197 msgid "Contract in :ref:`cfaua`" msgstr "" -#: ../../source/standard/contract.rst:203 msgid "uid, auto-generated, read-only" msgstr "uid, генерується автоматично, лише для читання" -#: ../../source/standard/contract.rst:0 msgid "parameters" msgstr "" -#: ../../source/standard/contract.rst:209 msgid "List of :ref:`Parameter` objects, auto-generated, read-only" msgstr "Список об’єктів :ref:`Parameter` генерується автоматично, лише для читання" -#: ../../source/standard/contract.rst:219 msgid "`active` - participant signed the agreement" msgstr "" -#: ../../source/standard/contract.rst:220 msgid "`unsuccessful` - participant refused to sign the agreement" msgstr "" -#: ../../source/standard/contract.rst:0 msgid "bidID" msgstr "" -#: ../../source/standard/contract.rst:230 msgid "Contract related :ref:`Bid`" msgstr "" -#: ../../source/standard/contract.rst:0 msgid "unitPrices" msgstr "" -#: ../../source/standard/contract.rst:234 msgid "List of :ref:`UnitPrice`" msgstr "" -#: ../../source/standard/contract.rst:236 msgid "Contract prices per :ref:`Item`" msgstr "" -#: ../../source/standard/contract.rst:240 msgid "Workflow in :ref:`cfaua`" msgstr "Робочий процес в :ref:`cfaua`" diff --git a/docs/source/locale/uk/LC_MESSAGES/standard/criterion.po b/docs/source/locale/uk/LC_MESSAGES/standard/criterion.po new file mode 100644 index 0000000000..c723eb1a81 --- /dev/null +++ b/docs/source/locale/uk/LC_MESSAGES/standard/criterion.po @@ -0,0 +1,162 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) +# This file is distributed under the same license as the openprocurement.api package. +# FIRST AUTHOR , 2020. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: openprocurement.api 2.5\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2020-08-26 17:34+0300\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 1.3\n" + +msgid "Criterion" +msgstr "Criterion" + +msgid "Schema" +msgstr "Схема" + +msgid "id" +msgstr "" + +msgid "uid, auto-generated" +msgstr "uid, генерується автоматично" + +msgid "title" +msgstr "" + +msgid "string, multilingual, required" +msgstr "рядок, багатомовний, обов’язковий" + +msgid "|ocdsDescription| Criterion title." +msgstr "" + +msgid "description" +msgstr "" + +msgid "string, multilingual" +msgstr "рядок, багатомовний" + +msgid "|ocdsDescription| Criterion description." +msgstr "|ocdsDescription| Опис критерію." + +msgid "source" +msgstr "" + +msgid "string" +msgstr "рядок" + +msgid "|ocdsDescription| Source of response to the requirements specified in the criterion. For example, responses might be submitted by tenderers or by an assessment committee at the procuringEntity." +msgstr "|ocdsDescription| Джерело відповіді на вимоги, зазначені в критерії. Наприклад, відповіді можуть бути подані учасниками тендеру або замовником." + +msgid "Possible values are:" +msgstr "Можливі значення:" + +msgid "`tenderer`" +msgstr "" + +msgid "Default. The response is provided by the tenderer." +msgstr "За умовчуванням. Відповідь надається учасником." + +msgid "`buyer`" +msgstr "" + +msgid "The response is provided by the buyer." +msgstr "Відповідь надається замовником." + +msgid "`procuringEntity`" +msgstr "" + +msgid "The response is provided by the procuring entity." +msgstr "Відповідь надається замовнком." + +msgid "`ssrBot`" +msgstr "" + +msgid "The response is provided by the bot." +msgstr "Відповідь надається ботом." + +msgid "`winner`" +msgstr "" + +msgid "The response is provided by the winner." +msgstr "Відповідь надається переможцем." + +msgid "relatesTo" +msgstr "" + +msgid "|ocdsDescription| The schema element that the criterion judges, evaluates or assesses. For example, the criterion might be defined against items or against bidders." +msgstr "|ocdsDescription| Елемент схеми, який критерій оцінює. Наприклад, критерій може бути визначений щодо позицій або проти учасників торгів." + +msgid "Default. The criterion evaluates or assesses a tenderer." +msgstr "За умовчуванням. Критерій відноситься до учасника." + +msgid "`item`" +msgstr "" + +msgid "The criterion evaluates or assesses a item." +msgstr "Критерій відноситься до предмету." + +msgid "`lot`" +msgstr "" + +msgid "The criterion evaluates or assesses a lot." +msgstr "Критерій відноситься до лоту." + +msgid "relatedItem" +msgstr "" + +msgid "`if relatesTo == tender`" +msgstr "якщо relatesTo == tender" + +msgid "Should be None." +msgstr "Поле повинно бути пустим." + +msgid "`if relatesTo == item`" +msgstr "якщо relatesTo == item" + +msgid "Id of related :ref:`item`." +msgstr "Id пов'язанного :ref:`item`" + +msgid "`if relatesTo == lot`" +msgstr "якщо relatesTo == lot`" + +msgid "Id of related :ref:`lot`." +msgstr "Id пов'язанного :ref:`lot`" + +msgid "classification" +msgstr "" + +msgid ":ref:`Classification`" +msgstr "" + +msgid "|ocdsDescription| The primary classification for the item." +msgstr "|ocdsDescription| Основна класифікація елемента" + +msgid "additionalClassifications" +msgstr "" + +msgid "List of :ref:`Classification` objects" +msgstr "Список об'єктів :ref:`Classification`." + +msgid "|ocdsDescription| An array of additional classifications for the item." +msgstr "|ocdsDescription| Массив додаткових класифікацій елмента." + +msgid "legislation" +msgstr "" + +msgid "List of :ref:`LegislationItem` objects." +msgstr "Список об'єктів :ref:`LegislationItem`." + +msgid "requirementGroups" +msgstr "" + +msgid "List of :ref:`RequirementGroup` objects." +msgstr "Список об'єктів :ref:`RequirementGroup`." \ No newline at end of file diff --git a/docs/source/locale/uk/LC_MESSAGES/standard/eligibleevidence.po b/docs/source/locale/uk/LC_MESSAGES/standard/eligibleevidence.po new file mode 100644 index 0000000000..b1e579a977 --- /dev/null +++ b/docs/source/locale/uk/LC_MESSAGES/standard/eligibleevidence.po @@ -0,0 +1,73 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) +# This file is distributed under the same license as the openprocurement.api package. +# FIRST AUTHOR , 2020. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: openprocurement.api 2.5\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2020-08-26 16:27+0300\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 1.3\n" + +msgid "EligibleEvidence" +msgstr "" + +msgid "Schema" +msgstr "Схема" + +msgid "id" +msgstr "" + +msgid "uid, auto-generated" +msgstr "uid, генерується автоматично" + +msgid "title" +msgstr "" + +msgid "string, multilingual, required" +msgstr "рядок, багатомовний, обов’язковий" + +msgid "|ocdsDescription| EligibleEvidence title." +msgstr "|ocdsDescription| Назва відпвідного доказу." + +msgid "description" +msgstr "" + +msgid "string, multilingual" +msgstr "рядок, багатомовний" + +msgid "|ocdsDescription| EligibleEvidence description." +msgstr "|ocdsDescription| Опис відпвідного доказу." + +msgid "type" +msgstr "" + +msgid "string" +msgstr "" + +msgid "|ocdsDescription| the form in which the buyer wants to obtain evidence." +msgstr "|ocdsDescription| форма, в якій замовник хоче отримати докази." + +msgid "Possible values are:" +msgstr "Можливі значення:" + +msgid "`document`" +msgstr "" + +msgid "An internal document stored in Prozorro system" +msgstr "Внутрішній документ, що зберігається в системі Prozorro" + +msgid "`statement`" +msgstr "" + +msgid "A machine-readable confirmation by a requested Party" +msgstr "Машиночитане підтвердження запитуваною cтороною" + diff --git a/docs/source/locale/uk/LC_MESSAGES/standard/evidence.po b/docs/source/locale/uk/LC_MESSAGES/standard/evidence.po new file mode 100644 index 0000000000..89219a3a57 --- /dev/null +++ b/docs/source/locale/uk/LC_MESSAGES/standard/evidence.po @@ -0,0 +1,81 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) +# This file is distributed under the same license as the openprocurement.api package. +# FIRST AUTHOR , 2020. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: openprocurement.api 2.5\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2020-09-02 13:51+0300\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 1.3\n" + +msgid "Evidence" +msgstr "" + +msgid "Schema" +msgstr "Схема" + +msgid "id" +msgstr "" + +msgid "uid, auto-generated" +msgstr "uid, генерується автоматично" + +msgid "title" +msgstr "" + +msgid "string, multilingual, required" +msgstr "рядок, багатомовний, обов’язковий" + +msgid "|ocdsDescription| Evidence title." +msgstr "|ocdsDescription| Назва доказу." + +msgid "description" +msgstr "" + +msgid "string, multilingual" +msgstr "рядок, багатомовний" + +msgid "|ocdsDescription| Evidence description." +msgstr "|ocdsDescription| Опис доказу." + +msgid "type" +msgstr "" + +msgid "string" +msgstr "" + +msgid "|ocdsDescription| the form in which the bidder give evidence." +msgstr "|ocdsDescription| форма, в якій відповідач надає доказ." + +msgid "Possible values are:" +msgstr "Можливі значення:" + +msgid "`document`" +msgstr "" + +msgid "An internal document stored in Prozorro system" +msgstr "Внутрішній документ, що зберігається в системі Prozorro" + +msgid "`statement`" +msgstr "" + +msgid "A machine-readable confirmation by a requested Party" +msgstr "Машиночитане підтвердження запитуваною cтороною" + +msgid "relatedDocument" +msgstr "" + +msgid ":ref:`Reference`" +msgstr "" + +msgid "|ocdsDescription| The reference for bid/award document." +msgstr "|ocdsDescription| Id пов'язоного документу з bid/award" diff --git a/docs/source/locale/uk/LC_MESSAGES/standard/implementation.po b/docs/source/locale/uk/LC_MESSAGES/standard/implementation.po new file mode 100644 index 0000000000..b5c6231b99 --- /dev/null +++ b/docs/source/locale/uk/LC_MESSAGES/standard/implementation.po @@ -0,0 +1,34 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) +# This file is distributed under the same license as the openprocurement.api package. +# FIRST AUTHOR , 2020. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: openprocurement.api 2.5\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2020-05-26 16:55+0300\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 1.3\n" + +msgid "Implementation" +msgstr "Implementation" + +msgid "Schema" +msgstr "Схема" + +msgid "transactions" +msgstr "transactions" + +msgid "List of :ref:`Transaction` objects" +msgstr "список з :ref:`Transaction` об'єктів" + +msgid "A list of the spending transactions made against this contract" +msgstr "Перелік витрат, здійснених за цим контрактом" + diff --git a/docs/source/locale/uk/LC_MESSAGES/standard/qualificationmilestone.po b/docs/source/locale/uk/LC_MESSAGES/standard/qualificationmilestone.po index 70c233b7f2..ffb3663ee4 100644 --- a/docs/source/locale/uk/LC_MESSAGES/standard/qualificationmilestone.po +++ b/docs/source/locale/uk/LC_MESSAGES/standard/qualificationmilestone.po @@ -7,8 +7,8 @@ msgid "" msgstr "" "Project-Id-Version: openprocurement.api 2.5\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-05-10 17:53+0300\n" -"PO-Revision-Date: 2020-05-10 18:04+0300\n" +"POT-Creation-Date: 2020-06-01 12:43+0300\n" +"PO-Revision-Date: 2020-04-23 11:11+0300\n" "Last-Translator: \n" "Language: uk_UA\n" "Language-Team: \n" @@ -63,3 +63,4 @@ msgstr "рядок, :ref:`date`, генерується автоматично" msgid "date" msgstr "" + diff --git a/docs/source/locale/uk/LC_MESSAGES/standard/requirement.po b/docs/source/locale/uk/LC_MESSAGES/standard/requirement.po new file mode 100644 index 0000000000..4c680001c3 --- /dev/null +++ b/docs/source/locale/uk/LC_MESSAGES/standard/requirement.po @@ -0,0 +1,124 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) +# This file is distributed under the same license as the openprocurement.api package. +# FIRST AUTHOR , 2020. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: openprocurement.api 2.5\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2020-08-26 22:36+0300\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 1.3\n" + +msgid "Requirement" +msgstr "" + +msgid "Schema" +msgstr "Схема" + +msgid "id" +msgstr "" + +msgid "uid, auto-generated" +msgstr "uid, генерується автоматично" + +msgid "title" +msgstr "" + +msgid "string, multilingual, required" +msgstr "рядок, багатомовний, обов’язковий" + +msgid "|ocdsDescription| Requirement title." +msgstr "|ocdsDescription| Назва вимоги." + +msgid "description" +msgstr "" + +msgid "string, multilingual" +msgstr "рядок, багатомовний" + +msgid "|ocdsDescription| Requirement description." +msgstr "|ocdsDescription| Опис вимоги." + +msgid "dataType" +msgstr "" + +msgid "string, required" +msgstr "рядок, обов'язковий" + +msgid "|ocdsDescription| Determines the type of response." +msgstr "|ocdsDescription| Визначає тип відповіді." + +msgid "Possible values are:" +msgstr "Можливі значення:" + +msgid "`string`" +msgstr "" + +msgid "The requirement response must be of type string" +msgstr "Відповідь на вимогу має бути надана у строковому форматі" + +msgid "`number`" +msgstr "" + +msgid "The requirement response must be of type number" +msgstr "Відповідь на вимогу має бути надана у форматі числа" + +msgid "`integer`" +msgstr "" + +msgid "The requirement response must be of type integer" +msgstr "Відповідь на вимогу має бути надана у форматі цілого числа" + +msgid "`boolean`" +msgstr "" + +msgid "The requirement response must be of type boolean" +msgstr "Відповідь на вимогу має бути надана у булевуму форматі" + +msgid "minValue" +msgstr "" + +msgid "string" +msgstr "" + +msgid "|ocdsDescription| Used to state the lower bound of the requirement when the response must be within a certain range." +msgstr "|ocdsDescription| Використовується для визначення нижньої межі вимоги, коли відповідь повинна знаходитися в певному діапазоні." + +msgid "maxValue" +msgstr "" + +msgid "|ocdsDescription| Used to state the higher bound of the requirement when the response must be within a certain range." +msgstr "|ocdsDescription| Використовується для визначення вищої межі вимоги, коли відповідь повинна знаходитися в певному діапазоні." + +msgid "expectedValue" +msgstr "" + +msgid "|ocdsDescription| Used to state the requirement when the response must be particular value." +msgstr "|ocdsDescription| Використовується коли відповідь на вимогу має мати визначене значення." + +msgid "period" +msgstr "" + +msgid ":ref:`extendPeriod`" +msgstr "" + +msgid "relatedFeature" +msgstr "" + +msgid "Id of related :ref:`Feature`." +msgstr "Id пов'язанного :ref:`Feature`." + +msgid "eligibleEvidences" +msgstr "" + +msgid "List of :ref:`EligibleEvidence` objects." +msgstr "Список об'єктів :ref:`EligibleEvidence`" + diff --git a/docs/source/locale/uk/LC_MESSAGES/standard/requirementgroup.po b/docs/source/locale/uk/LC_MESSAGES/standard/requirementgroup.po new file mode 100644 index 0000000000..4fa4487c32 --- /dev/null +++ b/docs/source/locale/uk/LC_MESSAGES/standard/requirementgroup.po @@ -0,0 +1,46 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) +# This file is distributed under the same license as the openprocurement.api package. +# FIRST AUTHOR , 2020. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: openprocurement.api 2.5\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2020-08-26 16:27+0300\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 1.3\n" + +msgid "RequirementGroup" +msgstr "" + +msgid "Schema" +msgstr "Схема" + +msgid "id" +msgstr "" + +msgid "uid, auto-generated" +msgstr "uid, генерується автоматично" + +msgid "description" +msgstr "" + +msgid "stringtring, multilingual" +msgstr "рядок, багатомовний" + +msgid "|ocdsDescription| RequirementGroup description." +msgstr "|ocdsDescription| Опис групи вимог." + +msgid "requirements" +msgstr "" + +msgid "List of :ref:`Requirement`" +msgstr "Список об'єктів :ref:`Requirement`" + diff --git a/docs/source/locale/uk/LC_MESSAGES/standard/requirementresponse.po b/docs/source/locale/uk/LC_MESSAGES/standard/requirementresponse.po new file mode 100644 index 0000000000..9e87b65e93 --- /dev/null +++ b/docs/source/locale/uk/LC_MESSAGES/standard/requirementresponse.po @@ -0,0 +1,91 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) +# This file is distributed under the same license as the openprocurement.api package. +# FIRST AUTHOR , 2020. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: openprocurement.api 2.5\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2020-08-26 16:27+0300\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 1.3\n" + +msgid "RequirementResponse" +msgstr "" + +msgid "Schema" +msgstr "Схема" + +msgid "id" +msgstr "" + +msgid "uid, auto-generated" +msgstr "uid, генерується автоматично" + +msgid "title" +msgstr "" + +msgid "string, multilingual, required" +msgstr "рядок, багатомовний, обов’язковий" + +msgid "|ocdsDescription| RequirementResponse title." +msgstr "|ocdsDescription| Назва відповіді на вимогу." + +msgid "description" +msgstr "" + +msgid "string, multilingual" +msgstr "рядок, багатомовний" + +msgid "|ocdsDescription| RequirementResponse description." +msgstr "|ocdsDescription| Опис відповіді на вимогу." + +msgid "period" +msgstr "" + +msgid ":ref:`extendPeriod`" +msgstr "" + +msgid "requirement" +msgstr "" + +msgid ":ref:`Reference`" +msgstr "" + +msgid "|ocdsDescription| The reference for tender requirement." +msgstr "|ocdsDescription| Посилання на вимогу." + +msgid "relatedTenderer" +msgstr "" + +msgid "|ocdsDescription| The reference for organization." +msgstr "|ocdsDescription| Посилання на організацію." + +msgid "relatedItem" +msgstr "" + +msgid "string" +msgstr "" + +msgid "Id of related :ref:`item`." +msgstr "Id пов'язанного об'єкту :ref:`item`." + +msgid "evidences" +msgstr "" + +msgid "List of :ref:`Evidence` objects" +msgstr "Список об'єктів :ref:`Evidence`" + +msgid "value" +msgstr "" + +msgid "The value of this requirement response. The value must be of the type defined in the requirement.dataType field." +msgstr "Значення відповіді на цю вимогу. Значення має бути типом, визначеним у полі requirement.dataType." + diff --git a/docs/source/locale/uk/LC_MESSAGES/standard/tender.po b/docs/source/locale/uk/LC_MESSAGES/standard/tender.po index 527731b31e..d75a6c3da4 100644 --- a/docs/source/locale/uk/LC_MESSAGES/standard/tender.po +++ b/docs/source/locale/uk/LC_MESSAGES/standard/tender.po @@ -3,7 +3,7 @@ msgid "" msgstr "" "Project-Id-Version: openprocurement.api 0.10\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-06-03 21:47+0300\n" +"POT-Creation-Date: 2020-08-13 14:20+0300\n" "PO-Revision-Date: 2020-06-03 00:11+0300\n" "Last-Translator: Zoriana Zaiats \n" "Language-Team: Ukrainian \n" @@ -273,8 +273,8 @@ msgstr "" msgid "The minimal step of auction (reduction). Validation rules:" msgstr "Мінімальний крок аукціону (редукціону). Правила валідації:" -msgid "`amount` should be less then `Tender.value.amount`" -msgstr "Значення `amount` повинно бути меншим за `Tender.value.amount`" +msgid "`amount` should be less then `Tender.value.amount` and between 0.5% and 3% of `Tender.value.amount`" +msgstr "Значення `amount` повинно бути меншим за `Tender.value.amount` та в межах 0.5%-3% від `Tender.value.amount`" msgid "`currency` should either be absent or match `Tender.value.currency`" msgstr "Значення `currency` повинно бути або відсутнім, або співпадати з `Tender.value.currency`" diff --git a/docs/source/locale/uk/LC_MESSAGES/standard/transaction.po b/docs/source/locale/uk/LC_MESSAGES/standard/transaction.po new file mode 100644 index 0000000000..472c0f5718 --- /dev/null +++ b/docs/source/locale/uk/LC_MESSAGES/standard/transaction.po @@ -0,0 +1,88 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) +# This file is distributed under the same license as the openprocurement.api package. +# FIRST AUTHOR , 2020. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: openprocurement.api 2.5\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2020-08-26 16:27+0300\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 1.3\n" + +msgid "Transaction" +msgstr "" + +msgid "Schema" +msgstr "Схема" + +msgid "id" +msgstr "" + +msgid "string, required" +msgstr "рядок, обов'язково" + +msgid "A unique identifier for this transaction." +msgstr "Унікальний ідентифікатор транзакції" + +msgid "documents" +msgstr "" + +msgid "List of :ref:`Document` objects" +msgstr "" + +msgid "Used to point either to a corresponding Fiscal Data Package, IATI file, or machine or human-readable source" +msgstr "Використовується для вказівки або на відповідний пакет Fiscal Data Package, або на файл IATI, або на машинне чи людське джерело" + +msgid "date" +msgstr "" + +msgid "string, :ref:`date`, required" +msgstr "рядок, :ref:`date`, обов'язково" + +msgid "The date of the transaction." +msgstr "Дата транзакції" + +msgid "value" +msgstr "" + +msgid ":ref:`Guarantee`, required" +msgstr ":ref:`Guarantee`, обов'язково" + +msgid "The value of the transaction." +msgstr "Значення транзакції" + +msgid "payer" +msgstr "" + +msgid ":ref:`OrganizationReference`, required" +msgstr ":ref:`OrganizationReference`, обов'язково" + +msgid "An organization reference for the organization from which the funds in this transaction originate." +msgstr "Довідка організації про організацію, з якої походять кошти в цій транзакції." + +msgid "payee" +msgstr "" + +msgid "An organization reference for the organization which receives the funds in this transaction." +msgstr "Довідка організації про організацію, яка отримує кошти за цією транзакцією." + +msgid "status" +msgstr "" + +msgid "The current status of transaction." +msgstr "Поточний стан транзакції." + +#~ msgid "date, required" +#~ msgstr "" + +#~ msgid "value, required" +#~ msgstr "" + diff --git a/docs/source/locale/uk/LC_MESSAGES/standard/util.po b/docs/source/locale/uk/LC_MESSAGES/standard/util.po index 9fe2512c64..277ec94a7a 100644 --- a/docs/source/locale/uk/LC_MESSAGES/standard/util.po +++ b/docs/source/locale/uk/LC_MESSAGES/standard/util.po @@ -3,7 +3,7 @@ msgid "" msgstr "" "Project-Id-Version: openprocurement.api 0.3\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-05-10 13:47+0300\n" +"POT-Creation-Date: 2020-08-26 16:27+0300\n" "PO-Revision-Date: 2018-09-12 16:36+0300\n" "Last-Translator: Zoriana Zaiats \n" "Language-Team: Ukrainian \n" @@ -12,471 +12,363 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Generated-By: Babel 1.3\n" -#: ../../source/standard/util.rst:8 msgid "Period" msgstr "Period" -#: ../../source/standard/util.rst:11 ../../source/standard/util.rst:41 -#: ../../source/standard/util.rst:75 ../../source/standard/util.rst:136 -#: ../../source/standard/util.rst:155 ../../source/standard/util.rst:172 -#: ../../source/standard/util.rst:195 msgid "Schema" msgstr "Схема" -#: ../../source/standard/util.rst:0 msgid "startDate" msgstr "" -#: ../../source/standard/util.rst:14 ../../source/standard/util.rst:20 -#: ../../source/standard/util.rst:158 ../../source/standard/util.rst:254 msgid "string, :ref:`date`" msgstr "рядок, :ref:`date`" -#: ../../source/standard/util.rst:16 msgid "|ocdsDescription| The start date for the period." msgstr "|ocdsDescription| Початкова дата періоду." -#: ../../source/standard/util.rst:0 msgid "endDate" msgstr "" -#: ../../source/standard/util.rst:22 msgid "|ocdsDescription| The end date for the period." msgstr "|ocdsDescription| Кінцева дата періоду." -#: ../../source/standard/util.rst:25 msgid "`startDate` should always precede `endDate`." msgstr "Значення `startDate` завжди повинно йти перед `endDate`." -#: ../../source/standard/util.rst:30 +msgid "ExtendPeriod" +msgstr "" + +msgid "Scheme" +msgstr "Схема" + +msgid "maxExtendDate" +msgstr "" + +msgid "|ocdsDescription| The period cannot be extended beyond this date." +msgstr "|ocdsDescription| Період не можна продовжувати після цієї дати." + +msgid "durationInDays" +msgstr "" + +msgid "integer" +msgstr "" + +msgid "|ocdsDescription| The maximum duration of this period in days. Where a start and end date are given, this field is optional, and should reflect the difference between those two days." +msgstr "|ocdsDescription| Максимальна тривалість цього періоду в днях. Якщо вказані дата початку та закінчення, це поле є необов’язковим і повинно відображати різницю між цими двома днями." + +msgid "duration" +msgstr "" + +msgid "|ocdsDescription| The duration of the period reflected in ISO format." +msgstr "|ocdsDescription| Тривалість періоду відображена у форматі ISO." + msgid "Date" msgstr "Date" -#: ../../source/standard/util.rst:32 msgid "Date/time in :ref:`date-format`." msgstr "Дата/час у :ref:`date-format`." -#: ../../source/standard/util.rst:38 msgid "ContractValue" msgstr "" -#: ../../source/standard/util.rst:0 msgid "amount" msgstr "" -#: ../../source/standard/util.rst:44 ../../source/standard/util.rst:78 -#: ../../source/standard/util.rst:104 ../../source/standard/util.rst:175 msgid "float, required" msgstr "float, обов’язково" -#: ../../source/standard/util.rst:46 ../../source/standard/util.rst:54 -#: ../../source/standard/util.rst:80 ../../source/standard/util.rst:177 msgid "|ocdsDescription| Amount as a number." msgstr "|ocdsDescription| Кількість як число." -#: ../../source/standard/util.rst:49 ../../source/standard/util.rst:57 -#: ../../source/standard/util.rst:83 ../../source/standard/util.rst:180 msgid "Should be positive." msgstr "Повинно бути додатнім." -#: ../../source/standard/util.rst:0 msgid "amountNet" msgstr "" -#: ../../source/standard/util.rst:52 msgid "float" msgstr "" -#: ../../source/standard/util.rst:0 msgid "currency" msgstr "" -#: ../../source/standard/util.rst:60 ../../source/standard/util.rst:88 -#: ../../source/standard/util.rst:260 msgid "string, required" msgstr "рядок, обов’язковий" -#: ../../source/standard/util.rst:62 ../../source/standard/util.rst:90 -#: ../../source/standard/util.rst:185 msgid "|ocdsDescription| The currency in 3-letter ISO 4217 format." msgstr "|ocdsDescription| Валюта у трибуквенному форматі ISO 4217." -#: ../../source/standard/util.rst:0 msgid "valueAddedTaxIncluded" msgstr "" -#: ../../source/standard/util.rst:66 ../../source/standard/util.rst:94 msgid "bool, required" msgstr "bool, обов’язково" -#: ../../source/standard/util.rst:72 msgid "Value" msgstr "Value" -#: ../../source/standard/util.rst:85 msgid "Absent in :ref:`esco`" msgstr "Відсутня в :ref:`esco`" -#: ../../source/standard/util.rst:96 msgid "Additionally in :ref:`esco`:" msgstr "Додатково у :ref:`esco`:" -#: ../../source/standard/util.rst:0 msgid "annualCostsReduction" msgstr "" -#: ../../source/standard/util.rst:99 msgid "21-element list of Floats, required." msgstr "21-елементний список float, обов’язковий." -#: ../../source/standard/util.rst:101 -msgid "" -"Buyer’s annual costs reduction. A 21-element array where the 1st element " -"indicates cost reduction starting from the period of tender notice " -"publication date till the end of the year. Value can be changed only " -"during active tendering period (active.tendering)." +msgid "Buyer’s annual costs reduction. A 21-element array where the 1st element indicates cost reduction starting from the period of tender notice publication date till the end of the year. Value can be changed only during active tendering period (active.tendering)." msgstr "" -#: ../../source/standard/util.rst:0 msgid "yearlyPaymentsPercentage" msgstr "" -#: ../../source/standard/util.rst:106 msgid "The percentage of annual payments in favor of Bidder." msgstr "" -#: ../../source/standard/util.rst:108 msgid "Possible values:" msgstr "Можливі значення:" -#: ../../source/standard/util.rst:110 #, python-format msgid "from 0.8 to 1 (from 80% to 100% respectively) if fundingKind:other." msgstr "" -#: ../../source/standard/util.rst:111 #, python-format -msgid "" -"from 0 to x, where x can vary from 0 to 0.8 (from 0% to x% respectively) " -"if fundingKind:budget." +msgid "from 0 to x, where x can vary from 0 to 0.8 (from 0% to x% respectively) if fundingKind:budget." msgstr "" -#: ../../source/standard/util.rst:113 msgid "Input precision - 3 digits after comma." msgstr "" -#: ../../source/standard/util.rst:0 msgid "amountPerformance" msgstr "" -#: ../../source/standard/util.rst:116 ../../source/standard/util.rst:121 msgid "float, autogenerated" msgstr "float, генерується автоматично" -#: ../../source/standard/util.rst:118 -msgid "" -"Calculated energy service contract performance indicator. Calculated by " -"the energy service contract performance indicator energy service contract" -" performance indicator formula." +msgid "Calculated energy service contract performance indicator. Calculated by the energy service contract performance indicator energy service contract performance indicator formula." msgstr "" -#: ../../source/standard/util.rst:123 -msgid "" -"Calculated energy service contract value. Calculated by the energy " -"service contract value formula." +msgid "Calculated energy service contract value. Calculated by the energy service contract value formula." msgstr "" -#: ../../source/standard/util.rst:0 msgid "contractDuration" msgstr "" -#: ../../source/standard/util.rst:127 msgid ":ref:`ContractDuration `, required." msgstr "" -#: ../../source/standard/util.rst:133 msgid "ContractDuration" msgstr "" -#: ../../source/standard/util.rst:0 msgid "years" msgstr "" -#: ../../source/standard/util.rst:138 msgid "integer, required" msgstr "integer, обов’язковий" -#: ../../source/standard/util.rst:140 msgid "Possible values: 0-15" msgstr "Можливі значення: 0-15" -#: ../../source/standard/util.rst:0 msgid "days" msgstr "" -#: ../../source/standard/util.rst:142 msgid "integer, not required" msgstr "integer, не обов’язковий" -#: ../../source/standard/util.rst:144 msgid "Possible values: 0-364" msgstr "Можливі значення: 0-364" -#: ../../source/standard/util.rst:146 msgid "Default value: 0" msgstr "" -#: ../../source/standard/util.rst:152 msgid "Revision" msgstr "Revision" -#: ../../source/standard/util.rst:0 msgid "date" msgstr "" -#: ../../source/standard/util.rst:160 msgid "Date when changes were recorded." msgstr "Дата, коли зміни були записані." -#: ../../source/standard/util.rst:0 msgid "changes" msgstr "" -#: ../../source/standard/util.rst:163 msgid "List of `Change` objects" msgstr "Список об’єктів `Change`" -#: ../../source/standard/util.rst:169 msgid "Guarantee" msgstr "Guarantee" -#: ../../source/standard/util.rst:183 msgid "string, required, default = `UAH`" msgstr "рядок, обов’язковий, за замовчуванням = `UAH`" -#: ../../source/standard/util.rst:192 -msgid "Change" +msgid "OrganizationReference" msgstr "" -#: ../../source/standard/util.rst:0 msgid "id" msgstr "" -#: ../../source/standard/util.rst:198 +msgid "An id used to cross-reference the entry in the parties section that contains full information on this organization or entity;" +msgstr "Ідентифікатор, що використовується для перехресного посилання на запис у розділі сторін, який містить повну інформацію про цю організацію чи сутність" + +msgid "name" +msgstr "" + +msgid "A name field that repeats the name given in the parties section, provided for the convenience of users viewing the data, and to support detection of mistakes in cross-referencing." +msgstr "Поле імені, яке повторює ім'я, вказане в розділі сторін, передбачене для зручності перегляду даних і для підтримки виявлення помилок при перехресних посиланнях." + +msgid "Reference" +msgstr "" + +msgid "An id used to cross-reference the entry in the parties section that contains full information on entity;" +msgstr "Ідентифікатор, що використовується для перехресного посилання на запис у розділі сторін, який містить повну інформацію про цю організацію чи сутність." + +msgid "title" +msgstr "" + +msgid "A title field that repeats the title given in the parties section, provided for the convenience of users viewing the data, and to support detection of mistakes in cross-referencing." +msgstr "Поле імені, яке повторює ім'я, вказане в розділі сторін, передбачене для зручності перегляду даних і для підтримки виявлення помилок при перехресних посиланнях." + +msgid "LegislationItem" +msgstr "" + +msgid "version" +msgstr "" + +msgid "string" +msgstr "рядок" + +msgid "identifier" +msgstr "" + +msgid ":ref:`Identifier`" +msgstr "" + +msgid "type" +msgstr "" + +msgid "Possible values are:" +msgstr "Можливі значення:" + +msgid "`NATIONAL_LEGISLATION`" +msgstr "" + +msgid "article" +msgstr "" + +msgid "Change" +msgstr "" + msgid "uid, auto-generated" msgstr "uid, генерується автоматично" -#: ../../source/standard/util.rst:200 msgid "The identifier for this Change." msgstr "Ідентифікатор для цієї зміни." -#: ../../source/standard/util.rst:0 msgid "rationale" msgstr "" -#: ../../source/standard/util.rst:203 msgid "string, multilingual, required" msgstr "рядок, багатомовний, обов’язковий" -#: ../../source/standard/util.rst:205 msgid "Reason for contract change" msgstr "Причина зміни контракту" -#: ../../source/standard/util.rst:0 msgid "rationaleTypes" msgstr "" -#: ../../source/standard/util.rst:208 msgid "List of strings, required" msgstr "Список рядків, обов’язковий" -#: ../../source/standard/util.rst:210 msgid "Type of the rationale behind contract change" msgstr "Тип причини додання змін до договору" -#: ../../source/standard/util.rst:212 -msgid "" -"Changes to the contract can be made in cases described in the 4th part of" -" Article 36 of the Law “On the Public Procurement”." -msgstr "" -"Внесення змін до істотних умов договору можливі у випадках, описаних " -"частиною четвертою статті 36 Закону України “Про публічні закупівлі”." +msgid "Changes to the contract can be made in cases described in the 4th part of Article 36 of the Law “On the Public Procurement”." +msgstr "Внесення змін до істотних умов договору можливі у випадках, описаних частиною четвертою статті 36 Закону України “Про публічні закупівлі”." -#: ../../source/standard/util.rst:214 msgid "Possible string values are:" msgstr "Можливі значення:" -#: ../../source/standard/util.rst:216 msgid "`volumeCuts` - Reduction of the procurement’s volume" msgstr "`volumeCuts` - Зменшення обсягів закупівлі" -#: ../../source/standard/util.rst:218 -msgid "" -"reduction of the procurement’s volume, particularly taking into account " -"the actual expenditures of the procuring entity;" -msgstr "" -"зменшення обсягів закупівлі, зокрема з урахуванням фактичного обсягу " -"видатків замовника;" +msgid "reduction of the procurement’s volume, particularly taking into account the actual expenditures of the procuring entity;" +msgstr "зменшення обсягів закупівлі, зокрема з урахуванням фактичного обсягу видатків замовника;" -#: ../../source/standard/util.rst:220 msgid "`itemPriceVariation` - Change in the unit’s price" msgstr "`itemPriceVariation` - Зміна ціни за одиницю товару" -#: ../../source/standard/util.rst:222 -msgid "" -"change in the unit’s price (no more than 10%) due to product’s price " -"fluctuations on the market, provided that the said change will not " -"increase the sum of money specified in the contract;" -msgstr "" -"зміна ціни за одиницю товару не більше ніж на 10 відсотків у разі " -"коливання ціни такого товару на ринку, за умови, що зазначена зміна не " -"призведе до збільшення суми, визначеної в договорі;" +msgid "change in the unit’s price (no more than 10%) due to product’s price fluctuations on the market, provided that the said change will not increase the sum of money specified in the contract;" +msgstr "зміна ціни за одиницю товару не більше ніж на 10 відсотків у разі коливання ціни такого товару на ринку, за умови, що зазначена зміна не призведе до збільшення суми, визначеної в договорі;" -#: ../../source/standard/util.rst:224 msgid "`qualityImprovement` - Improvement of the procurement item’s quality" msgstr "`qualityImprovement` - Покращення якості предмета закупівлі" -#: ../../source/standard/util.rst:226 -msgid "" -"improvement of the item's quality, provided that such improvement will " -"not increase the sum of money specified in the contract;" -msgstr "" -"покращення якості предмета закупівлі за умови, що таке покращення не " -"призведе до збільшення суми, визначеної в договорі;" +msgid "improvement of the item's quality, provided that such improvement will not increase the sum of money specified in the contract;" +msgstr "покращення якості предмета закупівлі за умови, що таке покращення не призведе до збільшення суми, визначеної в договорі;" -#: ../../source/standard/util.rst:228 -msgid "" -"`durationExtension` - Extension of the period of the contract duration " -"(due to documented objective circumstances)" -msgstr "" -"`durationExtension` - Продовження строку дії договору (через " -"документально підтверджені об’єктивні обставини)" +msgid "`durationExtension` - Extension of the period of the contract duration (due to documented objective circumstances)" +msgstr "`durationExtension` - Продовження строку дії договору (через документально підтверджені об’єктивні обставини)" + +msgid "extension of the period of the contract duration and obligations fulfilment regarding the transfer of goods, implementation of works and provision of services in case of documented objective circumstances that led to such extension, including force majeure, delays in funding of procuring entity’s expenditures, provided that such changes will not increase the sum of money specified in the contract;" +msgstr "продовження строку дії договору та виконання зобов’язань щодо передання товару, виконання робіт, надання послуг у разі виникнення документально підтверджених об’єктивних обставин, що спричинили таке продовження, у тому числі непереборної сили, затримки фінансування витрат замовника, за умови, що такі зміни не призведуть до збільшення суми, визначеної в договорі;" -#: ../../source/standard/util.rst:230 -msgid "" -"extension of the period of the contract duration and obligations " -"fulfilment regarding the transfer of goods, implementation of works and " -"provision of services in case of documented objective circumstances that " -"led to such extension, including force majeure, delays in funding of " -"procuring entity’s expenditures, provided that such changes will not " -"increase the sum of money specified in the contract;" -msgstr "" -"продовження строку дії договору та виконання зобов’язань щодо передання " -"товару, виконання робіт, надання послуг у разі виникнення документально " -"підтверджених об’єктивних обставин, що спричинили таке продовження, у " -"тому числі непереборної сили, затримки фінансування витрат замовника, за " -"умови, що такі зміни не призведуть до збільшення суми, визначеної в " -"договорі;" - -#: ../../source/standard/util.rst:232 msgid "`priceReduction` - Coordinated price reduction" msgstr "`priceReduction` - Узгоджене зменшення ціни" -#: ../../source/standard/util.rst:234 -msgid "" -"coordinated downward price change (without changing the quantity (volume)" -" and quality of goods, works, and services);" -msgstr "" -"узгоджена зміна ціни в бік зменшення (без зміни кількості (обсягу) та " -"якості товарів, робіт і послуг);" +msgid "coordinated downward price change (without changing the quantity (volume) and quality of goods, works, and services);" +msgstr "узгоджена зміна ціни в бік зменшення (без зміни кількості (обсягу) та якості товарів, робіт і послуг);" -#: ../../source/standard/util.rst:236 msgid "`taxRate` - Price changes due to changes in tax rates and fees" msgstr "`taxRate` - Зміна ціни у зв’язку із зміною ставок податків і зборів" -#: ../../source/standard/util.rst:238 -msgid "" -"price changes due to changes in tax rates and fees in proportion to " -"changes of those rates;" -msgstr "" -"зміна ціни у зв’язку із зміною ставок податків і зборів пропорційно до " -"змін таких ставок;" +msgid "price changes due to changes in tax rates and fees in proportion to changes of those rates;" +msgstr "зміна ціни у зв’язку із зміною ставок податків і зборів пропорційно до змін таких ставок;" -#: ../../source/standard/util.rst:240 msgid "`thirdParty` - Change of the third-party indicators (rate, indices...)" msgstr "`thirdParty` - Зміна сторонніх показників (курсу, тарифів…)" -#: ../../source/standard/util.rst:242 -msgid "" -"changes of established under the law by the State Statistics Service " -"consumer price index, changes in foreign currency, changes in stock " -"prices or Platts indices, regulated prices (rates) and standards that are" -" used in the procurement contract if the price change order is specified " -"in the procurement contract;" -msgstr "" -"зміна встановленого згідно із законодавством органами державної " -"статистики індексу споживчих цін, зміни курсу іноземної валюти, зміни " -"біржових котирувань або показників Platts, регульованих цін (тарифів) і " -"нормативів, які застосовуються в договорі про закупівлю, у разі " -"встановлення в договорі про закупівлю порядку зміни ціни;" - -#: ../../source/standard/util.rst:244 -msgid "" -"`fiscalYearExtension` - Extension of the period of the contract duration " -"to the next year" +msgid "changes of established under the law by the State Statistics Service consumer price index, changes in foreign currency, changes in stock prices or Platts indices, regulated prices (rates) and standards that are used in the procurement contract if the price change order is specified in the procurement contract;" +msgstr "зміна встановленого згідно із законодавством органами державної статистики індексу споживчих цін, зміни курсу іноземної валюти, зміни біржових котирувань або показників Platts, регульованих цін (тарифів) і нормативів, які застосовуються в договорі про закупівлю, у разі встановлення в договорі про закупівлю порядку зміни ціни;" + +msgid "`fiscalYearExtension` - Extension of the period of the contract duration to the next year" msgstr "`fiscalYearExtension` - Продовження строку дії договору на наступний рік" -#: ../../source/standard/util.rst:246 -msgid "" -"changes in contract terms according to the provisions of part 5 of " -"Article 36." +msgid "changes in contract terms according to the provisions of part 5 of Article 36." msgstr "зміна умов у зв’язку із застосуванням положень частини п’ятої статті 36." -#: ../../source/standard/util.rst:248 #, python-format -msgid "" -"Article 36 Part 5. Effect of the procurement contract may be continued " -"for a period sufficient for conduction of the procurement procedure at " -"the beginning of the next year in volume that does not exceed 20% of the " -"sum specified in the contract concluded in the previous year, if " -"expenditures for this purpose are approved in the prescribed manner." -msgstr "" -"Стаття 36 Частина 5: Дія договору про закупівлю може продовжуватися на " -"строк, достатній для проведення процедури закупівлі на початку наступного" -" року, в обсязі, що не перевищує 20 відсотків суми, визначеної в " -"договорі, укладеному в попередньому році, якщо видатки на цю мету " -"затверджено в установленому порядку." - -#: ../../source/standard/util.rst:251 +msgid "Article 36 Part 5. Effect of the procurement contract may be continued for a period sufficient for conduction of the procurement procedure at the beginning of the next year in volume that does not exceed 20% of the sum specified in the contract concluded in the previous year, if expenditures for this purpose are approved in the prescribed manner." +msgstr "Стаття 36 Частина 5: Дія договору про закупівлю може продовжуватися на строк, достатній для проведення процедури закупівлі на початку наступного року, в обсязі, що не перевищує 20 відсотків суми, визначеної в договорі, укладеному в попередньому році, якщо видатки на цю мету затверджено в установленому порядку." + msgid "string, :ref:`date`, auto-generated" msgstr "рядок, :ref:`date`, генерується автоматично" -#: ../../source/standard/util.rst:0 msgid "dateSigned" msgstr "" -#: ../../source/standard/util.rst:0 msgid "contractNumber" msgstr "" -#: ../../source/standard/util.rst:257 -msgid "string" -msgstr "рядок" - -#: ../../source/standard/util.rst:0 msgid "status" msgstr "" -#: ../../source/standard/util.rst:262 msgid "The current status of the change." msgstr "Поточний стан зміни." -#: ../../source/standard/util.rst:264 -msgid "Possible values are:" -msgstr "Можливі значення:" - -#: ../../source/standard/util.rst:266 msgid "`pending` - this change has been added." msgstr "`очікування` - ця зміна була додана." -#: ../../source/standard/util.rst:268 msgid "`active` - this change has been confirmed." msgstr "`активний` - ця зміна підтверджена." -#: ../../source/standard/util.rst:271 msgid "Workflow" msgstr "Робочий процес" -#: ../../source/standard/util.rst:281 msgid "\\* marks initial state" msgstr "\\* позначає початковий стан" + diff --git a/docs/source/locale/uk/LC_MESSAGES/tendering/basic-actions/bid-requirement-response.po b/docs/source/locale/uk/LC_MESSAGES/tendering/basic-actions/bid-requirement-response.po new file mode 100644 index 0000000000..a26f7ec56e --- /dev/null +++ b/docs/source/locale/uk/LC_MESSAGES/tendering/basic-actions/bid-requirement-response.po @@ -0,0 +1,73 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) +# This file is distributed under the same license as the openprocurement.api package. +# FIRST AUTHOR , 2020. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: openprocurement.api 2.5\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2020-09-10 15:51+0300\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 1.3\n" + +msgid "Bid Requirement response" +msgstr "Відповідь на вимогу на умови пропозиції" + +msgid "Bid requirement response - an object that shows that the user meets the tender owner requirements, and can participate in the procurement." +msgstr "Відповідь на вимогу - об'єкт який показує що користувач відповідає вимогам замовника, та може приймати участь у закупівлі." + +msgid "Any action on the requirement response in the bid can be performed only by the bid owner." +msgstr "Будь-які дії на відповіддю на вимогу в пропозиції може виконувати лише власник пропозиції." + +msgid "Requirement response basic operation" +msgstr "Базові операції на відповіді вимог" + +msgid "Requirement response data :ref:`scheme`" +msgstr "Схема даних :ref:`відповіді на вимогу`" + +msgid "Create Bid Requirement Response" +msgstr "Створення відповіді на вимогу" + +msgid "You can create few requirement responses in one request with complete set of data." +msgstr "Можливо створити декілька відповідей на вимогу за один запит з повним набором даних." + +msgid "Update Bid Requirement Response" +msgstr "Оновлення відповіді на вимогу" + +msgid "Get Bid Requirement Response" +msgstr "Отримання інформації по відповіді на вимогу" + +msgid "Delete Requirement Response" +msgstr "Видалення відповіді на вимогу" + +msgid "Evidence basic operation" +msgstr "Базові операції над доказами" + +msgid "Evidence data :ref:`scheme`" +msgstr "Схема даних :ref:`доказу`" + +msgid "Create Requirement Response Evidence" +msgstr "Створення Доказу" + +msgid "Update Requirement Response Evidence" +msgstr "Оновлення доказу" + +msgid "Get Requirement Response Evidence" +msgstr "Отримання інформації по доказу" + +msgid "Delete Requirement Response Evidence" +msgstr "Видалення доказу" + +msgid "Workflow Requirement Response" +msgstr "Схема работі відповідей на вимогу" + +msgid "Workflow of requirement response you could see here: :ref:`Criteria Workflow `" +msgstr "Схему роботу ви можете побачити тут: :ref:`Схема роботи `" + diff --git a/docs/source/locale/uk/LC_MESSAGES/tendering/basic-actions/criteria.po b/docs/source/locale/uk/LC_MESSAGES/tendering/basic-actions/criteria.po new file mode 100644 index 0000000000..8d168616f2 --- /dev/null +++ b/docs/source/locale/uk/LC_MESSAGES/tendering/basic-actions/criteria.po @@ -0,0 +1,112 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) +# This file is distributed under the same license as the openprocurement.api package. +# FIRST AUTHOR , 2020. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: openprocurement.api 2.5\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2020-09-10 15:51+0300\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 1.3\n" + +msgid "Tender Criteria" +msgstr "Критерії закупівлі" + +msgid "Criteria Basic Operation" +msgstr "Критерії базові операції" + +msgid "Criteria data :ref:`schema`" +msgstr "Схема даних :ref:`критеріїв`" + +msgid "Criteria is part of tender documentation, so all operation with criteria make tender owner." +msgstr "Критерії це частина тенедрної документації, тому всі дії над критеріями може виконувати лише власник тендеру." + +msgid "Create Tender Criteria" +msgstr "Створення критеріїв закупівлі" + +msgid "Criteria exist in procedures: belowThreshold, aboveThresholdUA, aboveThresholdEU, competitiveDialogueUA, competitiveDialogueEU, competitiveDialogueUA.stage2, competitiveDialogueEU.stage2, esco, closeFrameworkAgreementUA, closeFrameworkAgreementSelectionUA" +msgstr "Критіерії існуть в даних процедурах: belowThreshold, aboveThresholdUA, aboveThresholdEU, competitiveDialogueUA, competitiveDialogueEU, competitiveDialogueUA.stage2, competitiveDialogueEU.stage2, esco, closeFrameworkAgreementUA, closeFrameworkAgreementSelectionUA" + +msgid "You can create few criteria in one request with complete set of data." +msgstr "Можна створити одразу декілька критеріїв за один запит з повним набором даних." + +msgid "Update Tender Criteria" +msgstr "Оновлення критерію закупівлі" + +msgid "Get Tender Criteria" +msgstr "Отримання інформації по критерію закупівлі" + +msgid "Requirement Group basic operation" +msgstr "Базові операції над групами вимог" + +msgid "Requirement group :ref:`schema`" +msgstr "Схема даних :ref:`групи вимог`" + +msgid "Create Criteria Requirement Group" +msgstr "Створення групи вимог" + +msgid "Update Criteria Requirement Group" +msgstr "Оновлення групи вимог" + +msgid "Get Criteria Requirement Group" +msgstr "Отпимання інформації по групам вимог" + +msgid "Requirement basic operation" +msgstr "Базові інформації над вимогами" + +msgid "Requirement model :ref:`schema`" +msgstr "Схема даних :ref:`вимог`" + +msgid "Create Requirement" +msgstr "Створення вимоиг" + +msgid "Update Requirement" +msgstr "Оновлення вимоги" + +msgid "Get Requirement" +msgstr "Отримання інформації по вимогам" + +msgid "Eligible Evidence basic operation" +msgstr "Базові операції на прийнятними доказами" + +msgid "Eligible Evidence model :ref:`schema`" +msgstr "Схема даних :ref:`прийнятних доказів`" + +msgid "Create Eligible Evidence" +msgstr "Створення прийнятного доказу" + +msgid "Update Eligible Evidence" +msgstr "Оновлення інформації прияйнятного доказу" + +msgid "Delete Eligible Evidence" +msgstr "Видалення прийнятного доказу" + +msgid "Retrieve Eligible Evidence" +msgstr "Отримання інформації по прийнятних доказах" + +msgid "Exclusion criteria" +msgstr "Виключні критерії" + +msgid "Exclusion criteria available only on: aboveThresholdUA, aboveThresholdEU, competitiveDialogueUA, competitiveDialogueEU, competitiveDialogueUA.stage2, competitiveDialogueEU.stage2, esco, closeFrameworkAgreementUA" +msgstr "Виключні критерії доступні лише в: aboveThresholdUA, aboveThresholdEU, competitiveDialogueUA, competitiveDialogueEU, competitiveDialogueUA.stage2, competitiveDialogueEU.stage2, esco, closeFrameworkAgreementUA" + +msgid "Standard data, you could get `here `__" +msgstr "Стандарт, можна отримати `тут `__" + +msgid "You can't update tender to status `active.tendering` without 9 EXCLUSION criteria:" +msgstr "Неможливо перевести тендер у статус `active.tendering` без 9-ти вийнятнхових критеріїв:" + +msgid "EXCLUSION criteria and all criteria objects are not updated:" +msgstr "Вийняткові критерії та всі дочірні об'єкти є незміннми:" + +msgid "Exclusion criteria workflow" +msgstr "Схема роботи вийняткових критеріїв" + diff --git a/docs/source/locale/uk/LC_MESSAGES/tendering/pricequotation/index.po b/docs/source/locale/uk/LC_MESSAGES/tendering/pricequotation/index.po new file mode 100644 index 0000000000..6f633813a9 --- /dev/null +++ b/docs/source/locale/uk/LC_MESSAGES/tendering/pricequotation/index.po @@ -0,0 +1,28 @@ +# Copyright (C) +# This file is distributed under the same license as the openprocurement.api package. +# +# FIRST AUTHOR , 2020. +# Oleh Helesh , 2020. +msgid "" +msgstr "" +"Project-Id-Version: openprocurement.api 2.5\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2020-06-01 12:43+0300\n" +"PO-Revision-Date: 2020-06-01 12:47+0200\n" +"Last-Translator: Oleh Helesh \n" +"Language-Team: English \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.8.0\n" +"Language: en_US\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Generator: Lokalize 2.0\n" + +msgid "Price Quotation procedure" +msgstr "Процедура Запиту Цінових Пропозицій (`Price Quotation`)" + +msgid "Contents:" +msgstr "Зміст:" + + diff --git a/docs/source/locale/uk/LC_MESSAGES/tendering/pricequotation/overview.po b/docs/source/locale/uk/LC_MESSAGES/tendering/pricequotation/overview.po new file mode 100644 index 0000000000..6efc7e0b4f --- /dev/null +++ b/docs/source/locale/uk/LC_MESSAGES/tendering/pricequotation/overview.po @@ -0,0 +1,131 @@ +# Copyright (C) +# This file is distributed under the same license as the openprocurement.api package. +# +# FIRST AUTHOR , 2020. +# Oleh Helesh , 2020. +msgid "" +msgstr "" +"Project-Id-Version: openprocurement.api 2.5\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2020-06-01 12:43+0300\n" +"PO-Revision-Date: 2020-06-11 17:26+0200\n" +"Last-Translator: Oleh Helesh \n" +"Language-Team: Ukrainian \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.8.0\n" +"Language: uk\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<" +"=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" +"X-Generator: Lokalize 2.0\n" + +msgid "Overview" +msgstr "Огляд" + +msgid "" +"The Open Procurement `Price Quotation` procedure is plugin to `Open" +" Procurement API` software." +msgstr "" +"The Open Procurement `Price Quotation` процедура - це плагін до `Open" +" Procurement API`." + +msgid "" +"REST-ful interface to plugin is in line with core software design principles." +msgstr "" +"REST-ful інтерфейс для плагіна відповідає основним принципам дизайну" +" програмного забезпечення." + +msgid "Main responsibilities" +msgstr "Основні задачі" + +msgid "" +"Price Quotation procedure is dedicated to Open Tender procedure for Ukrainian" +" below threshold procurements. The code for that type of procedure is" +" `priceQuotation`." +msgstr "" +"Процедура Запиту цінових пропозицій що описана в цій документації, стосується" +" допорогових закупівель від 50 тис. грн. до 200 тис. грн. Код процедури" +" такого типу: ``priceQuotation``" + +msgid "Business logic" +msgstr "Бізнес логіка" + +msgid "Publication of the Price Quotation" +msgstr "Публікація Запиту цінових пропозицій" + +msgid "" +"Business process begins when the Procuring Entity creates a Price Quotation" +" procedure using parameters from the e-Catalogues Profile database." +msgstr "" +"Бізнес процес починається при створенні процедури Запиту цінових пропозицій" +" Замовником, використовуючи параметри з бази даних електронних каталогів." + +msgid "" +"After Procuring Entity supplements the procedure with quantity of items and" +" delivery details and publishes the tender by sending a request for Price" +" Quotation to ProZorro Business Process Engine the process starts." +msgstr "" +"Після цього Замовник доповнює процедуру кількістю товарів та реквізитами" +" доставки та опобліковує процедуру закупівлю, шляхом надсилання запиту до" +" Business Process Engine Прозорро." + +msgid "" +"At this moment Business Process Engine receives and validates the Price" +" Quotation request. Given the validation is passed the system automatically" +" informs shortlisted (qualified to specific eCatalogue Profile) suppliers" +" about the request." +msgstr "" +"В цей момент Business Process Engine отримує та проводить перевірку Запиту" +" цінових пропозицій. Після успішного проходження перевірки система" +" автоматично повідомляє усіх shortlisted `(кваліфікованих до конкретного" +" профілю у каталогах)` постачальників про запит." + +msgid "Tendering" +msgstr "Тендерний процес" + +msgid "" +"Receiving a Price Quotation request, supplier decides if they are able to" +" offer the requested product. In case of rejection supplier declines" +" participation in procedure. Until the end of tender period (minimal two" +" working days) suppliers would be able to submit a bid, while BPE will" +" collect and register quotations." +msgstr "" +"Отримуючи Запит цінової пропозиції, постачальник приймає рішення про" +" готовність запропонувати запитуваний товар. У випадку відмови від запиту" +" постачальник відмовляється приймати участь у закупівлі. " +"До кінця тендерного періоду `(мінімально два робочих дні)` постачальник має" +" надати свою пропозиції, які буде приймати та реєструвати Business Process" +" Engine Прозорро." + +msgid "Awarding, Qualification" +msgstr "Процес визначення переможця" + +msgid "" +"After the deadline system will publish received bids, awarding suppleir with" +" most economically advantageous bid allowing to confirm award within two" +" business days. In case if award was not confirmed system will automatically" +" award next supplier providing same confirmation period. In case of no" +" suppliers left system will transfer procedure to status `unsuccessful`." +msgstr "" +"Після закінчення тендерного періоду система опоблікує отримані пропозиції," +" нагороджуючи постачальника з найбільш економічно вигідною пропозицією," +" надаючи два робочих дні на підтвердження нагороди. У випадку якщо нагорода" +" не була підтверджена, система автоматично нагороджує наступного" +" постачальника, надаючи рівноцінний час на підтвердження. У випадку" +" відсутності наступних пропозицій постачальників система переведе процедуру у" +" стан `unsuccesful`." + +msgid "Contracting" +msgstr "Укладання контракту" + +msgid "" +"Selecting a winner will lead both Procuring Entity and supplier to the" +" contracting process, where the contract is signed, published and taken to" +" execution." +msgstr "" +"Підтвердження нагороди приведе Замовника і Постачальника до процесу укладення" +" контракту, в якому контракт підписується, опубліковується та береться у" +" виконання." + + diff --git a/docs/source/locale/uk/LC_MESSAGES/tendering/pricequotation/tutorial.po b/docs/source/locale/uk/LC_MESSAGES/tendering/pricequotation/tutorial.po new file mode 100644 index 0000000000..094419eb48 --- /dev/null +++ b/docs/source/locale/uk/LC_MESSAGES/tendering/pricequotation/tutorial.po @@ -0,0 +1,262 @@ +# Copyright (C) +# This file is distributed under the same license as the openprocurement.api package. +# +# FIRST AUTHOR , 2020. +# Oleh Helesh , 2020. +msgid "" +msgstr "" +"Project-Id-Version: openprocurement.api 2.5\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2020-08-26 16:27+0300\n" +"PO-Revision-Date: 2020-06-03 12:39+0200\n" +"Last-Translator: Oleh Helesh \n" +"Language-Team: English \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 1.3\n" + +msgid "Tutorial" +msgstr "Туторіал" + +msgid "Exploring basic rules" +msgstr "Базові правила" + +msgid "Let's try exploring the `/tenders` endpoint:" +msgstr "Подивимось як працює точка входу `/tenders`:" + +msgid "Just invoking it reveals empty set." +msgstr "При виклику видає пустий набір." + +msgid "Now let's attempt creating some tender:" +msgstr "Спробуймо створити нову закупівлю:" + +msgid "Error states that the only accepted Content-Type is `application/json`." +msgstr "Помилка вказує, що єдиний прийнятний тип вмісту це `application/json`." + +msgid "Let's satisfy the Content-type requirement:" +msgstr "Задовільнимо вимогу типу вмісту:" + +msgid "Error states that no `data` has been found in JSON body." +msgstr "Помилка вказує, що `data` не знайдено у тілі JSON." + +msgid "Creating tender" +msgstr "Створення закупівлі" + +msgid "Let's provide the data attribute in the submitted body :" +msgstr "Введемо data атрибут у поданому тілі:" + +msgid "Success! Now we can see that new object was created. Response code is `201` and `Location` response header reports the location of the created object. The body of response reveals the information about the created tender: its internal `id` (that matches the `Location` segment), its official `tenderID` and `dateModified` datestamp stating the moment in time when tender was last modified. Note that tender is created with `draft` status." +msgstr "Успіх! Тепер ми бачимо, що новий об’єкт було створено. Код відповіді `201` та заголовок відповіді `Location` вказує місцерозташування створеного об’єкта. Тіло відповіді показує інформацію про створену закупівлю, її внутрішнє `id` (яке співпадає з сегментом `Location`), її офіційне `tenderID` та `dateModified` дату, що показує час, коли закупівля востаннє модифікувалась. Зверніть увагу, що закупівля створюється зі статусом `draft`." + +msgid "**! Note:** User receives `access`: `token`: ``\"151a30932ee245e989771be867bc8235\"`` with which operations as a `Procuring Entity` role are accessible." +msgstr "**! Примітка:** Користувач отримує `access`: `token`: ``\"151a30932ee245e989771be867bc8235\"`` з яким доступні операції ролі Замовника." + +msgid "Price Quotation procedure has ``procurementMethodType``: ``priceQuotation`` and ``procurementMethod``: ``selective``." +msgstr "Процедура Запиту цінових пропозицій має ``procurementMethodType``: ``priceQuotation`` та ``procurementMethod``: ``selective``." + +msgid "Let's access the URL of the created object (the `Location` header of the response):" +msgstr "Використаємо URL створеного об’єкта (заголовок відповіді `Location`):" + +msgid "We can see the same response we got after creating tender." +msgstr "Ми бачимо ту ж відповідь, що і після створення закупівлі." + +msgid "Modifying tender" +msgstr "Модифікація закупівлі" + +msgid "Procuring Entity can modify tender before publishing. Let's update tender by supplementing it with all other essential properties:" +msgstr "Замовник може відредагувати закупівлю перед публікацією. Давайте оновимо закупівлю, доповнюючи її усіма іншими необхідними властивостями:" + +msgid "We see the added properties have merged with existing tender data. Additionally, the `dateModified` property was updated to reflect the last modification datestamp." +msgstr "Ми бачимо, що додаткові властивості об’єднані з існуючими даними закупівлі. Додатково оновлена властивість `dateModified`, щоб відображати останню дату модифікації." + +msgid "Checking the listing again reflects the new modification date:" +msgstr "Ще одна перевірка списку відображає нову дату модифікації:" + +msgid "Publishing tender" +msgstr "Публікація закупівлі" + +msgid "After creation Procuring Entity publishes procedure by changing status to `draft.publishing` where **priceQuotationBot** robot runs validation of the procedure and supplement procedure with additional data taken from ProZorro e-Catalogues database including `shortListedFirms`." +msgstr "Після створення Замовник публікує процедуру, змінивши статус на `draft.publishing`, де робот **priceQuotationBot** запускає перевірку процедури та доповнює процедуру додатковими даними, отриманими з бази даних електронних каталогів ProZorro, включаючи `shortListedFirms`." + +msgid "After successful validation priceQuotationBot transmit procedure to status: `active.tendering`" +msgstr "Після успішної валідації priceQuotationBot переводить процедуру в статус: `active.tendering`" + +#, fuzzy +msgid "In case if procedure do not pass validation due to invalid options, it will be switched to status: `draft.unsuccessful` by the **priceQuotationBot**." +msgstr "У разі, якщо процедура не пройде перевірку через недійсні параметри, вона буде переведена в статус: `draft.unsuccessful` за допомогою priceQuotationBot." + +msgid "Bid submission" +msgstr "Подача пропозицій" + +msgid "Registering bid" +msgstr "Реєстрація пропозиції" + +msgid "Tender status ``active.tendering`` allows registration of bids." +msgstr "Статус закупівлі ``active.tendering`` дозволяє подання пропозицій." + +msgid "Bidder can register a bid with ``draft`` status:" +msgstr "Учасник може зареєструвати пропозицію зі статусом ``draft`` (чернетка):" + +msgid "**! Note:** User receives `access`: `token`: ``\"00e173e5f31f4decbb811cc01e10c1bf\"`` with which operations as a `Supplier` role are accessible." +msgstr "**! Примітка:** Користувач отримує `access`: `token`: ``\"151a30932ee245e989771be867bc8235\"`` з яким доступні операції ролі Постачальника." + +msgid "And activate a bid:" +msgstr "Та активувати пропозицію:" + +msgid "Modifying bid" +msgstr "Модифікація пропозиції" + +msgid "Bid can be updated until the end of tender period." +msgstr "Пропозиція може бути оновленою до закінчення тендерного періоду." + +msgid "Proposal Uploading" +msgstr "Завантаження пропозиції" + +msgid "Then bidder should upload proposal document(s):" +msgstr "Потім учасник повинен завантажити документ(и) пропозиції:" + +msgid "It is possible to check the uploaded documents:" +msgstr "Можна перевірити завантажені документи:" + +msgid "Awarding process" +msgstr "Процес визначення переможця" + +msgid "After the tender period end date, system automatically creates `award` in `pending` status for the bid with the most economically advantageous price." +msgstr "Після закінчення тендерного періоду, система автоматично створює ``award`` у статусі ``pending`` для пропозиції з найбільш економічно вигідною ціною." + +msgid "The Supplier-winner can accept `award` by transferring it to status: `active`. The system is waiting for acceptance from the supplier-winner within `two working days`." +msgstr "Постачальник-переможець може підтвердити `award` змінивши його статус на `active`. Система очікуватиме підтвердження від постачальника-переможця в межах `двох робочих днів`." + +msgid "Procuring Entity can cancel `award` after acceptance by changing `award` status to `cancelled` in case if supplier-winner declines to sign contract." +msgstr "Замовник може відмінити `award` після підтвердження змінивши його статус на `cancelled` у випадку якщо постачальник-переможець відмовляється підписувати контракт." + +msgid "After canceling `award` system creates `second` `award` for the same bid in status: `pending` with access for Procuring Entity only. By the decision of Procuring Entity `second` `award` can be either changed for `active` or to `unsuccessful` with ability to upload supplementary documents." +msgstr "Після відміни `award`, система створює `другий` `award` для цієї пропозиції у статусі `pending` з доступом лише Замовника. За рішенням Замовника `другий` `award` може бути змінений на `active` або `unsuccessful` з можливістю завантажити супровідну документацію." + +msgid "The Supplier-winner can decline `award` by transferring it to status: `unsuccessful`." +msgstr "Постачальник-переможець може відмовитись від `award` змінивши його статус на `unsuccessful`." + +msgid "`Award` will be granted to the next bid with most economically advantageous price, for the following cases:" +msgstr "`Award` буде наданий до наступної пропозиції з найбільш економічно вигідною ціною, у наступних випадках:" + +msgid "Supplier-winner didn't accept `award` within two working days." +msgstr "Постачальник-переможець не підтвердив `award` в межах двох робочих днів. " + +msgid "Supplier-winner declined `award`." +msgstr "Постачальник-переможець відмовився від `award`." + +msgid "Supplier-winner refused to sign contract and `award` was canceled by Procuring Entity." +msgstr "Постачальник-переможець відмовився підписувати контракт і `award` був скасований Замовником." + +msgid "**Note !** In the case of `award` being transferred to `unsuccessful` status for the last bid, procedure will inherit termination status: **`unsuccessful`**." +msgstr "**! Примітка:** У випадку переходу `award` останньої пропозиції у статус `unsuccessful` процедура набуде кінцевий статус: **`unsuccessful`**." + +msgid "Setting contract" +msgstr "Налаштування угоди" + +msgid "Setting contract value" +msgstr "Встановлення вартості угоди" + +msgid "By default contract value is set based on the award, but there is a possibility to set custom contract value." +msgstr "За замовчуванням вартість угоди встановлюється на основі рішення про визначення переможця, але є можливість змінити це значення. " + +msgid "If you want to **lower contract value**, you can insert new one into the `amount` field." +msgstr "Якщо ви хочете **знизити вартість угоди**, ви можете встановити нове значення для поля `amount`." + +msgid "`200 OK` response was returned. The value was modified successfully." +msgstr "Було повернуто код відповіді `200 OK`. Значення змінено успішно." + +msgid "Setting contract signature date" +msgstr "Встановлення дати підписання угоди" + +msgid "There is a possibility to set custom contract signature date. You can insert appropriate date into the `dateSigned` field." +msgstr "Є можливість встановити дату підписання угоди. Для цього вставте відповідну дату в поле `dateSigned`." + +msgid "If this date is not set, it will be auto-generated on the date of contract registration." +msgstr "Якщо ви не встановите дату підписання, то вона буде згенерована автоматично під час реєстрації угоди." + +msgid "Setting contract validity period" +msgstr "Встановлення терміну дії угоди" + +msgid "Setting contract validity period is optional, but if it is needed, you can set appropriate `startDate` and `endDate`." +msgstr "Встановлення терміну дії угоди необов’язкове, але, якщо є необхідність, ви можете встановити відповідну дату початку `startDate` та кінця `endDate` терміну дії." + +msgid "Uploading contract documentation" +msgstr "Завантаження документації по угоді" + +msgid "You can upload contract documents for the Price Quotation procedure." +msgstr "Ви можете завантажити документи угоди для процедури Запиту цінових пропозицій." + +msgid "Let's upload contract document:" +msgstr "Завантажимо документ угоди:" + +msgid "`201 Created` response code and `Location` header confirm that this document was added." +msgstr "`201` Використаємо URL створеного об’єкта (заголовок відповіді `Location`)." + +msgid "Let's view the uploaded contract document:" +msgstr "Подивимось на список документів пов’язаних з угодою:" + +msgid "Cancelling tender" +msgstr "Відміна закупівлі" + +msgid "Tender creator can cancel tender anytime (except when tender in terminal status e.g. `draft.unsuccessful`, `unsuccessful`, `cancelled`, `complete`)." +msgstr "Замовник може скасувати закупівлю у будь-який момент (крім закупівель у кінцевому стані, наприклад, `unsuccessful`, `cancelled`, `complete`)." + +msgid "The following steps should be applied:" +msgstr "Для цього потрібно виконати наступні кроки:" + +msgid "Prepare cancellation request." +msgstr "Приготуйте запит на скасування." + +msgid "Fill it with the protocol describing the cancellation reasons." +msgstr "Наповніть його протоколом про причини скасування." + +msgid "Cancel the tender with the prepared reasons." +msgstr "Скасуйте закупівлю через подані причини." + +msgid "Only the request that has been activated (3rd step above) has power to cancel tender. I.e. you have to not only prepare cancellation request but to activate it as well." +msgstr "Запит на скасування, який не пройшов активації (3-й крок), не матиме сили, тобто, для скасування закупівлі буде обов’язковим не тільки створити заявку, але і активувати її." + +msgid "For cancelled cancellation you need to update cancellation status to `unsuccessful` from `draft` or `pending`." +msgstr "Для відміни скасування закупівлі, вам потрібно оновити статус скасування до `unsuccessful` з `draft` чи `pending`" + +msgid "See :ref:`cancellation` data structure for details." +msgstr "Дивіться структуру запиту :ref:`cancellation` для більш детальної інформації." + +msgid "Preparing the cancellation request" +msgstr "Формування запиту на скасування" + +msgid "You should pass `reason` and `reasonType`, `status` defaults to `draft`." +msgstr "Ви повинні передати змінні `reason` та `reasonType`, `status` у стані `draft`." + +msgid "There are four possible types of cancellation reason - tender was `noDemand`, `unFixable`, `forceMajeure` and `expensesCut`." +msgstr "При скасуванні, замовник має визначити один з чотирьох типів reasonType: `noDemand`, `unFixable`, `forceMajeure` aбо `expensesCut`." + +msgid "`id` is autogenerated and passed in the `Location` header of response." +msgstr "`id` генерується автоматично і повертається у додатковому заголовку відповіді `Location`:" + +msgid "You can change ``reasonType`` value to any of the above." +msgstr "Ви можете виправити тип на будь-який що вказаний вище." + +msgid "Filling cancellation with protocol and supplementary documentation" +msgstr "Наповнення протоколом та іншою супровідною документацією" + +msgid "This step is required. Without documents you can't update tender status." +msgstr "Цей крок обов'язковий. Без документів ви не можете оновити статус закупівлі." + +msgid "Upload the file contents" +msgstr "Завантажити вміст файлу" + +msgid "Change the document description and other properties" +msgstr "Зміна опису документа та інших властивостей" + +msgid "Upload new version of the document" +msgstr "Завантажити нову версію документа" + +msgid "Activating the request and cancelling tender" +msgstr "Активація запиту на відміну закупівлі" + +#~ msgid "Procuring entity can set bid guarantee:" +#~ msgstr "Замовник може встановити забезпечення тендерної пропозиції:" + diff --git a/docs/source/planning/tutorial/complete-plan-manually.http b/docs/source/planning/tutorial/complete-plan-manually.http index 5d94b5e1d1..f8c3f3a476 100644 --- a/docs/source/planning/tutorial/complete-plan-manually.http +++ b/docs/source/planning/tutorial/complete-plan-manually.http @@ -56,7 +56,7 @@ Content-Type: application/json; charset=UTF-8 "deliveryDate": { "endDate": "2020-05-30T01:00:00+03:00" }, - "id": "1dfca65a899940a9ac0c5b36088653f6", + "id": "4eda329bf7f448b8a6079ef67fa59574", "unit": { "code": "KGM", "name": "кг" @@ -80,7 +80,7 @@ Content-Type: application/json; charset=UTF-8 "deliveryDate": { "endDate": "2020-05-31T01:00:00+03:00" }, - "id": "fe700fceb62b4e16a9bd88b82cb2ad1a", + "id": "795342d7820543d4b1f69cf2acd00cdf", "unit": { "code": "KGM", "name": "кг" @@ -104,7 +104,7 @@ Content-Type: application/json; charset=UTF-8 "deliveryDate": { "endDate": "2020-06-01T01:00:00+03:00" }, - "id": "9adb3975435743598621b1e8d3c6ceb6", + "id": "7c8012eb2b19489fa8a704dbe996344f", "unit": { "code": "KGM", "name": "кг" diff --git a/docs/source/planning/tutorial/create-plan.http b/docs/source/planning/tutorial/create-plan.http index 5963f05b94..a31e97ac06 100644 --- a/docs/source/planning/tutorial/create-plan.http +++ b/docs/source/planning/tutorial/create-plan.http @@ -200,7 +200,7 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/plans/f580aa1bdcf8419499 "deliveryDate": { "endDate": "2020-05-30T01:00:00+03:00" }, - "id": "000422af516c49e8a1ed22db4aa37b90", + "id": "c83eb7ab3fa440958a4a0c18ae70dcb3", "unit": { "code": "KGM", "name": "кг" @@ -224,7 +224,7 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/plans/f580aa1bdcf8419499 "deliveryDate": { "endDate": "2020-05-31T01:00:00+03:00" }, - "id": "1226cf717eb84d9e8e5460ba47c31c03", + "id": "ed7a8d82d9814016b3c57cf5174a71dd", "unit": { "code": "KGM", "name": "кг" @@ -248,7 +248,7 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/plans/f580aa1bdcf8419499 "deliveryDate": { "endDate": "2020-06-01T01:00:00+03:00" }, - "id": "3e49b373a6984ec69010d1264c5c7aa8", + "id": "ab1a34aca8e64ee693e8915fa971d20a", "unit": { "code": "KGM", "name": "кг" diff --git a/docs/source/planning/tutorial/get-complete-plan.http b/docs/source/planning/tutorial/get-complete-plan.http index e67244c88f..19276b97e0 100644 --- a/docs/source/planning/tutorial/get-complete-plan.http +++ b/docs/source/planning/tutorial/get-complete-plan.http @@ -48,7 +48,7 @@ Content-Type: application/json; charset=UTF-8 "deliveryDate": { "endDate": "2016-06-01T23:06:30.023018+03:00" }, - "id": "000422af516c49e8a1ed22db4aa37b90", + "id": "c83eb7ab3fa440958a4a0c18ae70dcb3", "unit": { "code": "KGM", "name": "кг" @@ -66,7 +66,7 @@ Content-Type: application/json; charset=UTF-8 "currency": "UAH", "amount": 1500.0 }, - "id": "e519afb9b6a34a769f6d49dc45922bc1" + "id": "9e9302b002f943278d76a5610e0e3bac" } ], "amountNet": 12222.0, diff --git a/docs/source/planning/tutorial/patch-plan-breakdown.http b/docs/source/planning/tutorial/patch-plan-breakdown.http index dcf066d508..da85753243 100644 --- a/docs/source/planning/tutorial/patch-plan-breakdown.http +++ b/docs/source/planning/tutorial/patch-plan-breakdown.http @@ -67,7 +67,7 @@ Content-Type: application/json; charset=UTF-8 "deliveryDate": { "endDate": "2016-06-01T23:06:30.023018+03:00" }, - "id": "000422af516c49e8a1ed22db4aa37b90", + "id": "c83eb7ab3fa440958a4a0c18ae70dcb3", "unit": { "code": "KGM", "name": "кг" @@ -85,7 +85,7 @@ Content-Type: application/json; charset=UTF-8 "currency": "UAH", "amount": 1500.0 }, - "id": "e519afb9b6a34a769f6d49dc45922bc1" + "id": "9e9302b002f943278d76a5610e0e3bac" } ], "amountNet": 12222.0, diff --git a/docs/source/planning/tutorial/patch-plan-procuringEntity-name.http b/docs/source/planning/tutorial/patch-plan-procuringEntity-name.http index b0e9a06a83..2d73cfb648 100644 --- a/docs/source/planning/tutorial/patch-plan-procuringEntity-name.http +++ b/docs/source/planning/tutorial/patch-plan-procuringEntity-name.http @@ -80,7 +80,7 @@ Content-Type: application/json; charset=UTF-8 "deliveryDate": { "endDate": "2016-06-01T23:06:30.023018+03:00" }, - "id": "000422af516c49e8a1ed22db4aa37b90", + "id": "c83eb7ab3fa440958a4a0c18ae70dcb3", "unit": { "code": "KGM", "name": "кг" diff --git a/docs/source/planning/tutorial/patch-plan-status-scheduled.http b/docs/source/planning/tutorial/patch-plan-status-scheduled.http index 77bc63c006..1f59116f78 100644 --- a/docs/source/planning/tutorial/patch-plan-status-scheduled.http +++ b/docs/source/planning/tutorial/patch-plan-status-scheduled.http @@ -56,7 +56,7 @@ Content-Type: application/json; charset=UTF-8 "deliveryDate": { "endDate": "2020-05-30T01:00:00+03:00" }, - "id": "000422af516c49e8a1ed22db4aa37b90", + "id": "c83eb7ab3fa440958a4a0c18ae70dcb3", "unit": { "code": "KGM", "name": "кг" @@ -80,7 +80,7 @@ Content-Type: application/json; charset=UTF-8 "deliveryDate": { "endDate": "2020-05-31T01:00:00+03:00" }, - "id": "1226cf717eb84d9e8e5460ba47c31c03", + "id": "ed7a8d82d9814016b3c57cf5174a71dd", "unit": { "code": "KGM", "name": "кг" @@ -104,7 +104,7 @@ Content-Type: application/json; charset=UTF-8 "deliveryDate": { "endDate": "2020-06-01T01:00:00+03:00" }, - "id": "3e49b373a6984ec69010d1264c5c7aa8", + "id": "ab1a34aca8e64ee693e8915fa971d20a", "unit": { "code": "KGM", "name": "кг" diff --git a/docs/source/planning/tutorial/plan-cancellation-activation.http b/docs/source/planning/tutorial/plan-cancellation-activation.http index a862e14c5a..73aa79da88 100644 --- a/docs/source/planning/tutorial/plan-cancellation-activation.http +++ b/docs/source/planning/tutorial/plan-cancellation-activation.http @@ -65,7 +65,7 @@ Content-Type: application/json; charset=UTF-8 "deliveryDate": { "endDate": "2020-05-30T01:00:00+03:00" }, - "id": "412564af110644e3949048b2056dcc18", + "id": "db625f93faef43e4ba2e05a892e01822", "unit": { "code": "KGM", "name": "кг" @@ -89,7 +89,7 @@ Content-Type: application/json; charset=UTF-8 "deliveryDate": { "endDate": "2020-05-31T01:00:00+03:00" }, - "id": "c81232e1b2444c14b9f8020014952cc9", + "id": "b5dc327654764d098563e95836fc6416", "unit": { "code": "KGM", "name": "кг" @@ -113,7 +113,7 @@ Content-Type: application/json; charset=UTF-8 "deliveryDate": { "endDate": "2020-06-01T01:00:00+03:00" }, - "id": "58d7324d089a457f8549f41ac09596c3", + "id": "ca0860a5660643c5b5966626a3de9a3c", "unit": { "code": "KGM", "name": "кг" diff --git a/docs/source/planning/tutorial/plan-cancellation.http b/docs/source/planning/tutorial/plan-cancellation.http index 7e17f80f0a..42046a4f82 100644 --- a/docs/source/planning/tutorial/plan-cancellation.http +++ b/docs/source/planning/tutorial/plan-cancellation.http @@ -66,7 +66,7 @@ Content-Type: application/json; charset=UTF-8 "deliveryDate": { "endDate": "2020-05-30T01:00:00+03:00" }, - "id": "412564af110644e3949048b2056dcc18", + "id": "db625f93faef43e4ba2e05a892e01822", "unit": { "code": "KGM", "name": "кг" @@ -90,7 +90,7 @@ Content-Type: application/json; charset=UTF-8 "deliveryDate": { "endDate": "2020-05-31T01:00:00+03:00" }, - "id": "c81232e1b2444c14b9f8020014952cc9", + "id": "b5dc327654764d098563e95836fc6416", "unit": { "code": "KGM", "name": "кг" @@ -114,7 +114,7 @@ Content-Type: application/json; charset=UTF-8 "deliveryDate": { "endDate": "2020-06-01T01:00:00+03:00" }, - "id": "58d7324d089a457f8549f41ac09596c3", + "id": "ca0860a5660643c5b5966626a3de9a3c", "unit": { "code": "KGM", "name": "кг" diff --git a/docs/source/planning/tutorial/tender-from-plan-breakdown.http b/docs/source/planning/tutorial/tender-from-plan-breakdown.http index bc2420e52a..282bba4aa9 100644 --- a/docs/source/planning/tutorial/tender-from-plan-breakdown.http +++ b/docs/source/planning/tutorial/tender-from-plan-breakdown.http @@ -39,7 +39,7 @@ DATA: "title": "Насіння", "minimalStep": { "currency": "UAH", - "amount": 35 + "amount": 15 }, "enquiryPeriod": { "endDate": "2020-05-29T01:00:00+03:00" diff --git a/docs/source/planning/tutorial/tender-from-plan.http b/docs/source/planning/tutorial/tender-from-plan.http index 29b67517e1..bef59a88ec 100644 --- a/docs/source/planning/tutorial/tender-from-plan.http +++ b/docs/source/planning/tutorial/tender-from-plan.http @@ -39,7 +39,7 @@ DATA: "title": "Насіння", "minimalStep": { "currency": "UAH", - "amount": 35 + "amount": 15 }, "enquiryPeriod": { "endDate": "2020-05-29T01:00:00+03:00" @@ -177,7 +177,7 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/821592d97e83442c }, "percentage": 54.45, "type": "financing", - "id": "704e42f915594cc2af3a6c6e9f923443" + "id": "10bc97f3d7d842e79ec67890aa152d92" } ], "mainProcurementCategory": "goods", @@ -188,7 +188,7 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/821592d97e83442c "title": "Насіння", "minimalStep": { "currency": "UAH", - "amount": 35.0, + "amount": 15.0, "valueAddedTaxIncluded": true }, "items": [ @@ -209,7 +209,7 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/821592d97e83442c "deliveryDate": { "endDate": "2020-05-30T01:00:00+03:00" }, - "id": "e6d836830ced4eca9bbaa3c3116cb408", + "id": "16055704c1d645788f69e15e2de1e163", "unit": { "code": "KGM", "name": "кг" @@ -233,7 +233,7 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/821592d97e83442c "deliveryDate": { "endDate": "2020-05-31T01:00:00+03:00" }, - "id": "ced73ebf85cc415cb0c130e539f0fe6d", + "id": "780f097c6daf4c919259a08babc0a36f", "unit": { "code": "KGM", "name": "кг" @@ -257,7 +257,7 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/821592d97e83442c "deliveryDate": { "endDate": "2020-06-01T01:00:00+03:00" }, - "id": "2b33000b59b54af7aef0cf2f9c91481a", + "id": "5117c7514a494959afc386f26535883c", "unit": { "code": "KGM", "name": "кг" diff --git a/docs/source/relocation/tutorial/change-plan-ownership.http b/docs/source/relocation/tutorial/change-plan-ownership.http index 71c8182622..1434290dc7 100644 --- a/docs/source/relocation/tutorial/change-plan-ownership.http +++ b/docs/source/relocation/tutorial/change-plan-ownership.http @@ -58,7 +58,7 @@ Content-Type: application/json; charset=UTF-8 "startDate": "2020-05-17T01:00:00+03:00", "endDate": "2020-05-20T01:00:00+03:00" }, - "id": "099cdfc7ed9842c6b300e3c804d97b77", + "id": "3b769e31f1b34febb698f583d5e264cd", "unit": { "code": "KGM", "name": "кг" @@ -83,7 +83,7 @@ Content-Type: application/json; charset=UTF-8 "startDate": "2020-05-17T01:00:00+03:00", "endDate": "2020-05-20T01:00:00+03:00" }, - "id": "d08aa9cd1ae342039affd26af6a622bb", + "id": "88433532a143404988f063275f2a32a2", "unit": { "code": "KGM", "name": "кг" @@ -108,7 +108,7 @@ Content-Type: application/json; charset=UTF-8 "startDate": "2020-05-17T01:00:00+03:00", "endDate": "2020-05-20T01:00:00+03:00" }, - "id": "775067ef9cd74cfcb3e2b07ba7f3237c", + "id": "70f99b652a404d8e861f7c06543dd125", "unit": { "code": "KGM", "name": "кг" @@ -126,7 +126,7 @@ Content-Type: application/json; charset=UTF-8 "currency": "UAH", "amount": 1500.0 }, - "id": "6b9885866d3f4488b4aac2dbd7d8ca89" + "id": "73d48f06e2124fbdbffe23cb37a0c417" } ], "amountNet": 12222.0, diff --git a/docs/source/relocation/tutorial/change-tender-ownership.http b/docs/source/relocation/tutorial/change-tender-ownership.http index 929f364b62..2c89ddbe74 100644 --- a/docs/source/relocation/tutorial/change-tender-ownership.http +++ b/docs/source/relocation/tutorial/change-tender-ownership.http @@ -40,7 +40,7 @@ Content-Type: application/json; charset=UTF-8 }, "percentage": 54.45, "type": "financing", - "id": "9def55a6f8ab46229b7e039925ca4c85" + "id": "1dea6d7264d549eb823127db9f4c7cd7" } ], "mainProcurementCategory": "goods", @@ -51,7 +51,7 @@ Content-Type: application/json; charset=UTF-8 "title": "футляри до державних нагород", "minimalStep": { "currency": "UAH", - "amount": 35.0, + "amount": 15.0, "valueAddedTaxIncluded": true }, "items": [ @@ -80,7 +80,7 @@ Content-Type: application/json; charset=UTF-8 "startDate": "2020-05-17T01:00:00+03:00", "endDate": "2020-05-20T01:00:00+03:00" }, - "id": "8443e4c9b1a2491f863bb2d017cb816c", + "id": "dab469f0dc0e4430856f690929bbd14c", "unit": { "code": "44617100-9", "name": "item" diff --git a/docs/source/relocation/tutorial/create-agreement-transfer.http b/docs/source/relocation/tutorial/create-agreement-transfer.http index b5edfd17b9..e5fd453bd5 100644 --- a/docs/source/relocation/tutorial/create-agreement-transfer.http +++ b/docs/source/relocation/tutorial/create-agreement-transfer.http @@ -12,8 +12,8 @@ Response: 201 Created Content-Type: application/json; charset=UTF-8 { "access": { - "transfer": "0ec61677f28746f0af757f537f541b4a", - "token": "575f3322f20549bcba96cb63f59a96c3" + "transfer": "8dc38bd93c2d46d2b5920fb034830ff8", + "token": "8f09214cf01c4a27a7403459607d4a6c" }, "data": { "date": "2020-05-15T01:00:00+03:00", diff --git a/docs/source/relocation/tutorial/create-contract-transfer.http b/docs/source/relocation/tutorial/create-contract-transfer.http index 566a81caae..d44d7c6632 100644 --- a/docs/source/relocation/tutorial/create-contract-transfer.http +++ b/docs/source/relocation/tutorial/create-contract-transfer.http @@ -12,8 +12,8 @@ Response: 201 Created Content-Type: application/json; charset=UTF-8 { "access": { - "transfer": "069f65d2ef164b538ee94b68f3583275", - "token": "dfb44b90693542e39191ed53473b8cb5" + "transfer": "9315b8e8f9d34a7bab23be72ac789734", + "token": "259e5e2fd1aa40749d3f1e285299ad66" }, "data": { "date": "2020-05-15T01:00:00+03:00", diff --git a/docs/source/relocation/tutorial/create-plan-transfer.http b/docs/source/relocation/tutorial/create-plan-transfer.http index fe5cdfde09..da35e41dc5 100644 --- a/docs/source/relocation/tutorial/create-plan-transfer.http +++ b/docs/source/relocation/tutorial/create-plan-transfer.http @@ -12,8 +12,8 @@ Response: 201 Created Content-Type: application/json; charset=UTF-8 { "access": { - "transfer": "953e65ee7aff40008cdcaab6ea01947d", - "token": "b4f7426efb264f118eb96434dd7f4177" + "transfer": "6109ccb1b9d44715876fcef5701b3260", + "token": "6827cd0ece6f4891a00cf118b33268e3" }, "data": { "date": "2020-05-15T01:00:00+03:00", diff --git a/docs/source/relocation/tutorial/create-plan.http b/docs/source/relocation/tutorial/create-plan.http index 011f42fd1f..8cbab920f3 100644 --- a/docs/source/relocation/tutorial/create-plan.http +++ b/docs/source/relocation/tutorial/create-plan.http @@ -213,7 +213,7 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/plans/f0b2403cba3040acaa "startDate": "2020-05-17T01:00:00+03:00", "endDate": "2020-05-20T01:00:00+03:00" }, - "id": "099cdfc7ed9842c6b300e3c804d97b77", + "id": "3b769e31f1b34febb698f583d5e264cd", "unit": { "code": "KGM", "name": "кг" @@ -238,7 +238,7 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/plans/f0b2403cba3040acaa "startDate": "2020-05-17T01:00:00+03:00", "endDate": "2020-05-20T01:00:00+03:00" }, - "id": "d08aa9cd1ae342039affd26af6a622bb", + "id": "88433532a143404988f063275f2a32a2", "unit": { "code": "KGM", "name": "кг" @@ -263,7 +263,7 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/plans/f0b2403cba3040acaa "startDate": "2020-05-17T01:00:00+03:00", "endDate": "2020-05-20T01:00:00+03:00" }, - "id": "775067ef9cd74cfcb3e2b07ba7f3237c", + "id": "70f99b652a404d8e861f7c06543dd125", "unit": { "code": "KGM", "name": "кг" @@ -281,7 +281,7 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/plans/f0b2403cba3040acaa "currency": "UAH", "amount": 1500.0 }, - "id": "6b9885866d3f4488b4aac2dbd7d8ca89" + "id": "73d48f06e2124fbdbffe23cb37a0c417" } ], "amountNet": 12222.0, diff --git a/docs/source/relocation/tutorial/create-tender-transfer.http b/docs/source/relocation/tutorial/create-tender-transfer.http index 9201a5069f..bc03139c73 100644 --- a/docs/source/relocation/tutorial/create-tender-transfer.http +++ b/docs/source/relocation/tutorial/create-tender-transfer.http @@ -12,8 +12,8 @@ Response: 201 Created Content-Type: application/json; charset=UTF-8 { "access": { - "transfer": "36897dc151aa4ea0a7126cf60ee201ee", - "token": "c3eb5cb106484a8ba13f0ad8408942d6" + "transfer": "86fc7fcbd11a419f8be51ea488a09168", + "token": "98bf8ed159a0433086a43401ed8958fd" }, "data": { "date": "2020-05-15T01:00:00+03:00", diff --git a/docs/source/relocation/tutorial/create-tender.http b/docs/source/relocation/tutorial/create-tender.http index bb3f1a1538..d0be44aabd 100644 --- a/docs/source/relocation/tutorial/create-tender.http +++ b/docs/source/relocation/tutorial/create-tender.http @@ -38,7 +38,7 @@ DATA: "title": "футляри до державних нагород", "minimalStep": { "currency": "UAH", - "amount": 35 + "amount": 15 }, "enquiryPeriod": { "endDate": "2020-05-22T01:00:00+03:00" @@ -139,7 +139,7 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/dd4f0a6132c645c6 }, "percentage": 54.45, "type": "financing", - "id": "9def55a6f8ab46229b7e039925ca4c85" + "id": "1dea6d7264d549eb823127db9f4c7cd7" } ], "mainProcurementCategory": "goods", @@ -150,7 +150,7 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/dd4f0a6132c645c6 "title": "футляри до державних нагород", "minimalStep": { "currency": "UAH", - "amount": 35.0, + "amount": 15.0, "valueAddedTaxIncluded": true }, "items": [ @@ -179,7 +179,7 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/dd4f0a6132c645c6 "startDate": "2020-05-17T01:00:00+03:00", "endDate": "2020-05-20T01:00:00+03:00" }, - "id": "8443e4c9b1a2491f863bb2d017cb816c", + "id": "dab469f0dc0e4430856f690929bbd14c", "unit": { "code": "44617100-9", "name": "item" diff --git a/docs/source/relocation/tutorial/modify-agreement.http b/docs/source/relocation/tutorial/modify-agreement.http index 8be89e0bfa..fd5e1596d9 100644 --- a/docs/source/relocation/tutorial/modify-agreement.http +++ b/docs/source/relocation/tutorial/modify-agreement.http @@ -1,4 +1,4 @@ -PATCH /api/2.5/agreements/35990a4bc5c748a68bd8970a17f938de?acc_token=575f3322f20549bcba96cb63f59a96c3 HTTP/1.0 +PATCH /api/2.5/agreements/35990a4bc5c748a68bd8970a17f938de?acc_token=8f09214cf01c4a27a7403459607d4a6c HTTP/1.0 Authorization: Bearer broker3 Content-Length: 71 Content-Type: application/json diff --git a/docs/source/relocation/tutorial/modify-contract.http b/docs/source/relocation/tutorial/modify-contract.http index 9eb075e844..9b38fac23d 100644 --- a/docs/source/relocation/tutorial/modify-contract.http +++ b/docs/source/relocation/tutorial/modify-contract.http @@ -1,4 +1,4 @@ -PATCH /api/2.5/contracts/223251091c99415eb820553413b6aa9e?acc_token=dfb44b90693542e39191ed53473b8cb5 HTTP/1.0 +PATCH /api/2.5/contracts/223251091c99415eb820553413b6aa9e?acc_token=259e5e2fd1aa40749d3f1e285299ad66 HTTP/1.0 Authorization: Bearer broker3 Content-Length: 64 Content-Type: application/json diff --git a/docs/source/relocation/tutorial/modify-plan.http b/docs/source/relocation/tutorial/modify-plan.http index cd4adef125..ca10a53e34 100644 --- a/docs/source/relocation/tutorial/modify-plan.http +++ b/docs/source/relocation/tutorial/modify-plan.http @@ -1,4 +1,4 @@ -PATCH /api/2.5/plans/f0b2403cba3040acaaf3d6d45dc953be?acc_token=b4f7426efb264f118eb96434dd7f4177 HTTP/1.0 +PATCH /api/2.5/plans/f0b2403cba3040acaaf3d6d45dc953be?acc_token=6827cd0ece6f4891a00cf118b33268e3 HTTP/1.0 Authorization: Bearer broker1 Content-Length: 72 Content-Type: application/json @@ -59,7 +59,7 @@ Content-Type: application/json; charset=UTF-8 "startDate": "2020-05-17T01:00:00+03:00", "endDate": "2020-05-20T01:00:00+03:00" }, - "id": "099cdfc7ed9842c6b300e3c804d97b77", + "id": "3b769e31f1b34febb698f583d5e264cd", "unit": { "code": "KGM", "name": "кг" @@ -84,7 +84,7 @@ Content-Type: application/json; charset=UTF-8 "startDate": "2020-05-17T01:00:00+03:00", "endDate": "2020-05-20T01:00:00+03:00" }, - "id": "d08aa9cd1ae342039affd26af6a622bb", + "id": "88433532a143404988f063275f2a32a2", "unit": { "code": "KGM", "name": "кг" @@ -109,7 +109,7 @@ Content-Type: application/json; charset=UTF-8 "startDate": "2020-05-17T01:00:00+03:00", "endDate": "2020-05-20T01:00:00+03:00" }, - "id": "775067ef9cd74cfcb3e2b07ba7f3237c", + "id": "70f99b652a404d8e861f7c06543dd125", "unit": { "code": "KGM", "name": "кг" @@ -127,7 +127,7 @@ Content-Type: application/json; charset=UTF-8 "currency": "UAH", "amount": 1500.0 }, - "id": "6b9885866d3f4488b4aac2dbd7d8ca89" + "id": "73d48f06e2124fbdbffe23cb37a0c417" } ], "amountNet": 12222.0, diff --git a/docs/source/relocation/tutorial/modify-tender.http b/docs/source/relocation/tutorial/modify-tender.http index 86d806de2a..faad432c52 100644 --- a/docs/source/relocation/tutorial/modify-tender.http +++ b/docs/source/relocation/tutorial/modify-tender.http @@ -1,4 +1,4 @@ -PATCH /api/2.5/tenders/dd4f0a6132c645c69b311877d0646847?acc_token=c3eb5cb106484a8ba13f0ad8408942d6 HTTP/1.0 +PATCH /api/2.5/tenders/dd4f0a6132c645c69b311877d0646847?acc_token=98bf8ed159a0433086a43401ed8958fd HTTP/1.0 Authorization: Bearer broker1 Content-Length: 62 Content-Type: application/json @@ -39,7 +39,7 @@ Content-Type: application/json; charset=UTF-8 }, "percentage": 54.45, "type": "financing", - "id": "9def55a6f8ab46229b7e039925ca4c85" + "id": "1dea6d7264d549eb823127db9f4c7cd7" } ], "mainProcurementCategory": "goods", @@ -50,7 +50,7 @@ Content-Type: application/json; charset=UTF-8 "title": "футляри до державних нагород", "minimalStep": { "currency": "UAH", - "amount": 35.0, + "amount": 15.0, "valueAddedTaxIncluded": true }, "items": [ @@ -79,7 +79,7 @@ Content-Type: application/json; charset=UTF-8 "startDate": "2020-05-17T01:00:00+03:00", "endDate": "2020-05-20T01:00:00+03:00" }, - "id": "8443e4c9b1a2491f863bb2d017cb816c", + "id": "dab469f0dc0e4430856f690929bbd14c", "unit": { "code": "44617100-9", "name": "item" diff --git a/docs/source/standard/award.rst b/docs/source/standard/award.rst index 7fab0978ec..9d8d84fc8f 100644 --- a/docs/source/standard/award.rst +++ b/docs/source/standard/award.rst @@ -129,6 +129,8 @@ Additionally in :ref:`limited`: Confirms that Procuring entity has no grounds to reject a participant in accordance with Article 17 of the Law of Ukraine "On Public Procurement". +:requirementResponses: + List of :ref:`RequirementResponse` objects. Award workflow in :ref:`limited`: --------------------------------- diff --git a/docs/source/standard/bid.rst b/docs/source/standard/bid.rst index 9219a29940..d1566613b3 100644 --- a/docs/source/standard/bid.rst +++ b/docs/source/standard/bid.rst @@ -107,6 +107,8 @@ There are additional `envelopes` - document containers that manage time when the :qualificationDocuments: List of :ref:`ConfidentialDocument` objects. This envelope is revealed at post-qualification. + :requirementResponses: + List of :ref:`RequirementResponse` objects. .. _Parameter: diff --git a/docs/source/standard/contract.rst b/docs/source/standard/contract.rst index 1c43456899..d92559557a 100644 --- a/docs/source/standard/contract.rst +++ b/docs/source/standard/contract.rst @@ -138,6 +138,9 @@ Additional fields for :ref:`contracting`: Amount of money actually paid. +:implementation: + :ref:`Implementation` + :terminationDetails: string, required for unsuccessful contract diff --git a/docs/source/standard/criterion.rst b/docs/source/standard/criterion.rst new file mode 100644 index 0000000000..0297ee5074 --- /dev/null +++ b/docs/source/standard/criterion.rst @@ -0,0 +1,86 @@ + +.. include:: defs.hrst + +.. index:: Criterion +.. _criterion: + +Criterion +========= + +Schema +------ + +:id: + uid, auto-generated + +:title: + string, multilingual, required + + |ocdsDescription| + Criterion title. + +:description: + string, multilingual + + |ocdsDescription| + Criterion description. + +:source: + string + + |ocdsDescription| + Source of response to the requirements specified in the criterion. For example, responses might be submitted by tenderers or by an assessment committee at the procuringEntity. + + Possible values are: + :`tenderer`: + Default. The response is provided by the tenderer. + :`buyer`: + The response is provided by the buyer. + :`procuringEntity`: + The response is provided by the procuring entity. + :`ssrBot`: + The response is provided by the bot. + :`winner`: + The response is provided by the winner. + +:relatesTo: + string + + |ocdsDescription| + The schema element that the criterion judges, evaluates or assesses. For example, the criterion might be defined against items or against bidders. + + Possible values are: + :`tenderer`: + Default. The criterion evaluates or assesses a tenderer. + :`item`: + The criterion evaluates or assesses a item. + :`lot`: + The criterion evaluates or assesses a lot. + +:relatedItem: + string + + :`if relatesTo == tender`: + Should be None. + :`if relatesTo == item`: + Id of related :ref:`item`. + :`if relatesTo == lot`: + Id of related :ref:`lot`. + +:classification: + :ref:`Classification` + + |ocdsDescription| + The primary classification for the item. + +:additionalClassifications: + List of :ref:`Classification` objects + + |ocdsDescription| + An array of additional classifications for the item. + +:legislation: + List of :ref:`LegislationItem` objects. + +:requirementGroups: + List of :ref:`RequirementGroup` objects. diff --git a/docs/source/standard/eligibleevidence.rst b/docs/source/standard/eligibleevidence.rst new file mode 100644 index 0000000000..ef1313d2bc --- /dev/null +++ b/docs/source/standard/eligibleevidence.rst @@ -0,0 +1,38 @@ + +.. include:: defs.hrst + +.. index:: EligibleEvidence +.. _EligibleEvidence: + +EligibleEvidence +================ + +Schema +------ + +:id: + uid, auto-generated + +:title: + string, multilingual, required + + |ocdsDescription| + EligibleEvidence title. + +:description: + string, multilingual + + |ocdsDescription| + EligibleEvidence description. + +:type: + string + + |ocdsDescription| + the form in which the buyer wants to obtain evidence. + + Possible values are: + :`document`: + An internal document stored in Prozorro system + :`statement`: + A machine-readable confirmation by a requested Party diff --git a/docs/source/standard/evidence.rst b/docs/source/standard/evidence.rst new file mode 100644 index 0000000000..4ff428d97b --- /dev/null +++ b/docs/source/standard/evidence.rst @@ -0,0 +1,44 @@ + +.. include:: defs.hrst + +.. index:: Evidence +.. _evidence: + +Evidence +======== + +Schema +------ + +:id: + uid, auto-generated + +:title: + string, multilingual, required + + |ocdsDescription| + Evidence title. + +:description: + string, multilingual + + |ocdsDescription| + Evidence description. + +:type: + string + + |ocdsDescription| + the form in which the bidder give evidence. + + Possible values are: + :`document`: + An internal document stored in Prozorro system + :`statement`: + A machine-readable confirmation by a requested Party + +:relatedDocument: + :ref:`Reference` + + |ocdsDescription| + The reference for bid/award document. diff --git a/docs/source/standard/implementation.rst b/docs/source/standard/implementation.rst new file mode 100644 index 0000000000..c1d6545811 --- /dev/null +++ b/docs/source/standard/implementation.rst @@ -0,0 +1,16 @@ +.. include:: defs.hrst + +.. index:: Implementation +.. _Implementation: + +Implementation +============== + +Schema +------ + + +:transactions: + List of :ref:`Transaction` objects + + A list of the spending transactions made against this contract \ No newline at end of file diff --git a/docs/source/standard/index.rst b/docs/source/standard/index.rst index dd2e6588ca..1eb77673b2 100644 --- a/docs/source/standard/index.rst +++ b/docs/source/standard/index.rst @@ -19,7 +19,10 @@ areas that were not covered by it. complaintpost confidentialdocument contract + criterion document + eligibleevidence + evidence feature firm qualificationmilestone @@ -33,9 +36,15 @@ areas that were not covered by it. planmilestone planrelation planorganization + requirement + requirementgroup + requirementresponse qualification question tender unitPrice util transfer + implementation + transaction + diff --git a/docs/source/standard/requirement.rst b/docs/source/standard/requirement.rst new file mode 100644 index 0000000000..9970a92b8b --- /dev/null +++ b/docs/source/standard/requirement.rst @@ -0,0 +1,71 @@ + +.. include:: defs.hrst + +.. index:: Requirement +.. _requirement: + +Requirement +=========== + +Schema +------ + +:id: + uid, auto-generated + +:title: + string, multilingual, required + + |ocdsDescription| + Requirement title. + +:description: + string, multilingual + + |ocdsDescription| + Requirement description. + +:dataType: + string, required + + |ocdsDescription| + Determines the type of response. + + Possible values are: + :`string`: + The requirement response must be of type string + :`number`: + The requirement response must be of type number + :`integer`: + The requirement response must be of type integer + :`boolean`: + The requirement response must be of type boolean + +:minValue: + string + + |ocdsDescription| + Used to state the lower bound of the requirement when the response must be within a certain range. + +:maxValue: + string + + |ocdsDescription| + Used to state the higher bound of the requirement when the response must be within a certain range. + +:expectedValue: + string + + |ocdsDescription| + Used to state the requirement when the response must be particular value. + +:period: + :ref:`extendPeriod` + +:relatedFeature: + string + + Id of related :ref:`Feature`. + +:eligibleEvidences: + List of :ref:`EligibleEvidence` objects. \ No newline at end of file diff --git a/docs/source/standard/requirementgroup.rst b/docs/source/standard/requirementgroup.rst new file mode 100644 index 0000000000..98e7954fae --- /dev/null +++ b/docs/source/standard/requirementgroup.rst @@ -0,0 +1,24 @@ + +.. include:: defs.hrst + +.. index:: RequirementGroup +.. _RequirementGroup: + +RequirementGroup +================ + +Schema +------ + +:id: + uid, auto-generated + +:description: + stringtring, multilingual + + |ocdsDescription| + RequirementGroup description. + +:requirements: + List of :ref:`Requirement` + diff --git a/docs/source/standard/requirementresponse.rst b/docs/source/standard/requirementresponse.rst new file mode 100644 index 0000000000..d4fbc9c4f5 --- /dev/null +++ b/docs/source/standard/requirementresponse.rst @@ -0,0 +1,54 @@ + +.. include:: defs.hrst + +.. index:: RequirementResponse +.. _RequirementResponse: + +RequirementResponse +=================== + +Schema +------ + +:id: + uid, auto-generated + +:title: + string, multilingual, required + + |ocdsDescription| + RequirementResponse title. + +:description: + string, multilingual + + |ocdsDescription| + RequirementResponse description. + +:period: + :ref:`extendPeriod` + +:requirement: + :ref:`Reference` + + |ocdsDescription| + The reference for tender requirement. + +:relatedTenderer: + :ref:`Reference` + + |ocdsDescription| + The reference for organization. + +:relatedItem: + string + + Id of related :ref:`item`. + +:evidences: + List of :ref:`Evidence` objects + +:value: + string + + The value of this requirement response. The value must be of the type defined in the requirement.dataType field. diff --git a/docs/source/standard/tender.rst b/docs/source/standard/tender.rst index ddfb7b8300..216ba12530 100644 --- a/docs/source/standard/tender.rst +++ b/docs/source/standard/tender.rst @@ -164,7 +164,7 @@ Schema The minimal step of auction (reduction). Validation rules: - * `amount` should be less then `Tender.value.amount` + * `amount` should be less then `Tender.value.amount` and between 0.5% and 3% of `Tender.value.amount` * `currency` should either be absent or match `Tender.value.currency` * `valueAddedTaxIncluded` should either be absent or match `Tender.value.valueAddedTaxIncluded` diff --git a/docs/source/standard/transaction.rst b/docs/source/standard/transaction.rst new file mode 100644 index 0000000000..60e9f95243 --- /dev/null +++ b/docs/source/standard/transaction.rst @@ -0,0 +1,47 @@ + +.. include:: defs.hrst + +.. index:: Transaction + +.. _Transaction: + +Transaction +=========== + +Schema +------ + +:id: + string, required + + A unique identifier for this transaction. + +:documents: + List of :ref:`Document` objects + + Used to point either to a corresponding Fiscal Data Package, IATI file, or machine or human-readable source + +:date: + string, :ref:`date`, required + + The date of the transaction. + +:value: + :ref:`Guarantee`, required + + The value of the transaction. + +:payer: + :ref:`OrganizationReference`, required + + An organization reference for the organization from which the funds in this transaction originate. + +:payee: + :ref:`OrganizationReference`, required + + An organization reference for the organization which receives the funds in this transaction. + +:status: + string, required + + The current status of transaction. diff --git a/docs/source/standard/util.rst b/docs/source/standard/util.rst index 18735ead51..4f7c024434 100644 --- a/docs/source/standard/util.rst +++ b/docs/source/standard/util.rst @@ -24,6 +24,48 @@ Schema `startDate` should always precede `endDate`. + +.. _ExtendPeriod: + +ExtendPeriod +============ + +Scheme +------ + +:startDate: + string, :ref:`date` + + |ocdsDescription| + The start date for the period. + +:endDate: + string, :ref:`date` + + |ocdsDescription| + The end date for the period. + +:maxExtendDate: + string, :ref:`date` + + |ocdsDescription| + The period cannot be extended beyond this date. + +:durationInDays: + integer + + |ocdsDescription| + The maximum duration of this period in days. Where a start and end date are given, this field is optional, and should reflect the difference between those two days. + +:duration: + string, :ref:`date` + + |ocdsDescription| + The duration of the period reflected in ISO format. + +`startDate` should always precede `endDate`. + + .. _Date: Date @@ -185,6 +227,68 @@ Schema |ocdsDescription| The currency in 3-letter ISO 4217 format. +.. _OrganizationReference: + +OrganizationReference +===================== + +Schema +------ + +:id: + string, required + + An id used to cross-reference the entry in the parties section that contains full information on this organization or entity; + +:name: + string, required + + A name field that repeats the name given in the parties section, provided for the convenience of users viewing the data, and to support detection of mistakes in cross-referencing. + + +.. _Reference: + +Reference +========= + +Schema +------ + +:id: + string, required + + An id used to cross-reference the entry in the parties section that contains full information on entity; + +:title: + string, required + + A title field that repeats the title given in the parties section, provided for the convenience of users viewing the data, and to support detection of mistakes in cross-referencing. + + +.. _LegislationItem: + +LegislationItem +=============== + +Schema +------ + +:version: + string + +:identifier: + :ref:`Identifier` + +:type: + string + + Possible values are: + * `NATIONAL_LEGISLATION` + +:article: + string + + .. _Change: diff --git a/docs/source/tendering/basic-actions/bid-requirement-response.rst b/docs/source/tendering/basic-actions/bid-requirement-response.rst new file mode 100644 index 0000000000..bd3bd32153 --- /dev/null +++ b/docs/source/tendering/basic-actions/bid-requirement-response.rst @@ -0,0 +1,86 @@ + +.. _bid_requirement_response_operation: + +Bid Requirement response +======================== + +Bid requirement response - an object that shows that the user meets the tender owner requirements, and can participate in the procurement. + +Any action on the requirement response in the bid can be performed only by the bid owner. + +Requirement response basic operation +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Requirement response data :ref:`scheme` + +Create Bid Requirement Response +""""""""""""""""""""""""""""""" + +You can create few requirement responses in one request with complete set of data. + +.. include:: ../http/criteria/create-requirement-response.http + :code: + + +Update Bid Requirement Response +""""""""""""""""""""""""""""""" + +.. include:: ../http/criteria/update-requirement-response.http + :code: + + +Get Bid Requirement Response +"""""""""""""""""""""""""""" + +.. include:: ../http/criteria/requirement-response-list.http + :code: + +.. include:: ../http/criteria/requirement-response.http + :code: + + +Delete Requirement Response +""""""""""""""""""""""""""" + +.. include:: ../http/criteria/delete-requirement-response.http + :code: + + +Evidence basic operation +~~~~~~~~~~~~~~~~~~~~~~~~ + +Evidence data :ref:`scheme` + +Create Requirement Response Evidence +"""""""""""""""""""""""""""""""""""" + +.. include:: ../http/criteria/create-requirement-response-evidence.http + :code: + + +Update Requirement Response Evidence +"""""""""""""""""""""""""""""""""""" + +.. include:: ../http/criteria/update-requirement-response-evidence.http + :code: + +Get Requirement Response Evidence +""""""""""""""""""""""""""""""""" + +.. include:: ../http/criteria/requirement-response-evidence-list.http + :code: + +.. include:: ../http/criteria/requirement-response-evidence.http + :code: + +Delete Requirement Response Evidence +"""""""""""""""""""""""""""""""""""" + +.. include:: ../http/criteria/delete-requirement-response-evidence.http + :code: + + +Workflow Requirement Response +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Workflow of requirement response you could see here: :ref:`Criteria Workflow ` \ No newline at end of file diff --git a/docs/source/tendering/basic-actions/criteria.rst b/docs/source/tendering/basic-actions/criteria.rst new file mode 100644 index 0000000000..5783f96cd1 --- /dev/null +++ b/docs/source/tendering/basic-actions/criteria.rst @@ -0,0 +1,292 @@ + +.. _criteria_operation: + +Tender Criteria +=============== + +Criteria Basic Operation +~~~~~~~~~~~~~~~~~~~~~~~~ + +Criteria data :ref:`schema` + +Criteria is part of tender documentation, so all operation with criteria make tender owner. + +Create Tender Criteria +"""""""""""""""""""""" + +Criteria exist in procedures: belowThreshold, aboveThresholdUA, aboveThresholdEU, +competitiveDialogueUA, competitiveDialogueEU, competitiveDialogueUA.stage2, +competitiveDialogueEU.stage2, esco, closeFrameworkAgreementUA, closeFrameworkAgreementSelectionUA + +You can create few criteria in one request with complete set of data. + + +.. include:: ../http/criteria/bulk-create-criteria.http + :code: + + +Update Tender Criteria +"""""""""""""""""""""" + +.. include:: ../http/criteria/patch-criteria.http + :code: + + +Get Tender Criteria +""""""""""""""""""" + +.. include:: ../http/criteria/criteria-list.http + :code: + +.. include:: ../http/criteria/criteria.http + :code: + + +Requirement Group basic operation +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Requirement group :ref:`schema` + +Create Criteria Requirement Group +""""""""""""""""""""""""""""""""" + +.. include:: ../http/criteria/add-criteria-requirement-group.http + :code: + + +Update Criteria Requirement Group +""""""""""""""""""""""""""""""""" + +.. include:: ../http/criteria/patch-criteria-requirement-group.http + :code: + +Get Criteria Requirement Group +"""""""""""""""""""""""""""""" + +.. include:: ../http/criteria/criteria-requirement-group-list.http + :code: + +.. include:: ../http/criteria/criteria-requirement-group.http + :code: + + +Requirement basic operation +~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Requirement model :ref:`schema` + +Create Requirement +"""""""""""""""""" + +.. include:: ../http/criteria/add-criteria-requirement.http + :code: + + +Update Requirement +"""""""""""""""""" + +.. include:: ../http/criteria/criteria-requirement-list.http + :code: + +.. include:: ../http/criteria/criteria-requirement.http + :code: + +Get Requirement +""""""""""""""" + +.. include:: ../http/criteria/criteria-requirement.http + :code: + +Eligible Evidence basic operation +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Eligible Evidence model :ref:`schema` + +Create Eligible Evidence +"""""""""""""""""""""""" + +.. include:: ../http/criteria/add-requirement-evidence.http + :code: + +Update Eligible Evidence +"""""""""""""""""""""""" + +.. include:: ../http/criteria/patch-requirement-evidence.http + :code: + +Delete Eligible Evidence +"""""""""""""""""""""""" + +.. include:: ../http/criteria/delete-requirement-evidence.http + :code: + + +Retrieve Eligible Evidence +"""""""""""""""""""""""""" + + .. include:: ../http/criteria/requirement-evidences-list.http + :code: + +.. include:: ../http/criteria/requirement-evidence.http + :code: + + +Exclusion criteria +~~~~~~~~~~~~~~~~~~ + +Exclusion criteria available only on: aboveThresholdUA, aboveThresholdEU, competitiveDialogueUA, +competitiveDialogueEU, competitiveDialogueUA.stage2, competitiveDialogueEU.stage2, esco, closeFrameworkAgreementUA + +Standard data, you could get `here `__ + +You can't update tender to status `active.tendering` without 9 EXCLUSION criteria: + +.. include:: ../http/criteria/update-tender-status-without-criteria.http + :code: + +EXCLUSION criteria and all criteria objects are not updated: + +.. include:: ../http/criteria/patch-exclusion-criteria.http + :code: + +.. include:: ../http/criteria/add-exclusion-criteria-requirement-group.http + :code: + +.. include:: ../http/criteria/patch-exclusion-criteria-requirement-group.http + :code: + +.. include:: ../http/criteria/add-exclusion-criteria-requirement.http + :code: + +.. include:: ../http/criteria/patch-exclusion-criteria-requirement.http + :code: + + +.. _criteria_workflow: + +Exclusion criteria workflow +~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +.. graphviz:: + + digraph G { + rankdir = LR + + + tender_draft [ + label = "draft*" + shape = circle + fixedsize = true + width = .9 + ] + + tender_active_tendering [ + label = "active.\ntendering" + shape = circle + fixedsize = true + width = .9 + ] + + bid_draft [ + label = "draft" + shape = circle + fixedsize = true + width = .9 + ] + + bid_active [ + label = "active" + shape = circle + fixedsize = true + width = .9 + ] + + tender_draft -> tender_active_tendering; + bid_draft -> bid_active; + bid_active -> create_bid_object; + + create_requirement_response_object [ + label = "Create requirement \nresponses" + shape = rect + style = filled + fillcolor = plum + fixedsize = true + height = .5 + width = 2 + ] + create_bid_object [ + label = "Create bid" + shape = rect + style = filled + fillcolor = moccasin + fixedsize = true + height = .25 + width = 2 + ] + create_criteria_object [ + label = "Create Criteria\n(9 Exclusion criteria \nare required for \nsome procedures)" + shape = rect + style = filled + fillcolor = lightsalmon + fixedsize = true + height = 1 + width = 2 + ] + add_eligible_evidences_object [ + label = "Can be added \neligible evidences" + shape = rect + style = filled + fillcolor = moccasin + fixedsize = true + height = .5 + width = 2 + ] + + block_patch_requirement_response_object [ + label = "Can't add or \nupdate requirement \nresponses and evidence" + shape = rect + style = filled + fillcolor = moccasin + fixedsize = true + height = .75 + width = 2 + ] + + subgraph cluster_tender { + label = "Tender" + + subgraph cluster_draft { + label = "" + style = filled + color = plum + tender_draft + create_criteria_object + } + subgraph cluster_active { + label = "" + style = filled + color = pink + tender_active_tendering + create_bid_object + add_eligible_evidences_object + } + } + subgraph cluster_bid { + label = "Bid" + + subgraph cluster_draft { + label = "" + style = filled + color = moccasin + bid_draft + create_requirement_response_object + } + subgraph cluster_active { + label = "" + style = filled + color = mediumaquamarine + bid_active + block_patch_requirement_response_object + } + } + } \ No newline at end of file diff --git a/docs/source/tendering/basic-actions/http/24hours/award-milestone-post.http b/docs/source/tendering/basic-actions/http/24hours/award-milestone-post.http index 9583bc8841..299ab144de 100644 --- a/docs/source/tendering/basic-actions/http/24hours/award-milestone-post.http +++ b/docs/source/tendering/basic-actions/http/24hours/award-milestone-post.http @@ -1,4 +1,4 @@ -POST /api/2.5/tenders/28f1e5d8fcb146b68b6691df9238a223/awards/82c3267caa474c97a8e72cf7dc46eaca/milestones?acc_token=6a0860af78ac41ef88613c1cd87de340 HTTP/1.0 +POST /api/2.5/tenders/28f1e5d8fcb146b68b6691df9238a223/awards/9c8ec5e773864278b9a34f9b86cc92cb/milestones?acc_token=6a0860af78ac41ef88613c1cd87de340 HTTP/1.0 Authorization: Bearer broker Content-Length: 100 Content-Type: application/json @@ -13,14 +13,14 @@ DATA: Response: 201 Created Content-Type: application/json; charset=UTF-8 -Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/28f1e5d8fcb146b68b6691df9238a223/awards/82c3267caa474c97a8e72cf7dc46eaca/milestones/4d88534ea4d948bca4014193f4dd61b7 +Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/28f1e5d8fcb146b68b6691df9238a223/awards/9c8ec5e773864278b9a34f9b86cc92cb/milestones/6b2785bb2809443ba6053b0fd5a72333 { "data": { "date": "2020-05-02T05:00:00+03:00", "dueDate": "2020-05-03T05:00:00+03:00", "code": "24h", "description": "One ring to bring them all and in the darkness bind them", - "id": "4d88534ea4d948bca4014193f4dd61b7" + "id": "6b2785bb2809443ba6053b0fd5a72333" } } diff --git a/docs/source/tendering/basic-actions/http/24hours/award-patch.http b/docs/source/tendering/basic-actions/http/24hours/award-patch.http index 32d79fbc64..5daa4dfb3c 100644 --- a/docs/source/tendering/basic-actions/http/24hours/award-patch.http +++ b/docs/source/tendering/basic-actions/http/24hours/award-patch.http @@ -1,4 +1,4 @@ -PATCH /api/2.5/tenders/28f1e5d8fcb146b68b6691df9238a223/awards/82c3267caa474c97a8e72cf7dc46eaca?acc_token=6a0860af78ac41ef88613c1cd87de340 HTTP/1.0 +PATCH /api/2.5/tenders/28f1e5d8fcb146b68b6691df9238a223/awards/9c8ec5e773864278b9a34f9b86cc92cb?acc_token=6a0860af78ac41ef88613c1cd87de340 HTTP/1.0 Authorization: Bearer broker Content-Length: 67 Content-Type: application/json diff --git a/docs/source/tendering/basic-actions/http/24hours/post-doc.http b/docs/source/tendering/basic-actions/http/24hours/post-doc.http index 4c27bfee42..719ae1cc71 100644 --- a/docs/source/tendering/basic-actions/http/24hours/post-doc.http +++ b/docs/source/tendering/basic-actions/http/24hours/post-doc.http @@ -1,4 +1,4 @@ -POST /api/2.5/tenders/28f1e5d8fcb146b68b6691df9238a223/bids/ffd6c83ecc214bc585dfa1cafa4b7ec2/documents?acc_token=696e0d5bfd7640a888fa8e6af1eebb3b HTTP/1.0 +POST /api/2.5/tenders/28f1e5d8fcb146b68b6691df9238a223/bids/dc155a4012b64c0d81cef6ef9d0cace4/documents?acc_token=696e0d5bfd7640a888fa8e6af1eebb3b HTTP/1.0 Authorization: Bearer broker Content-Length: 333 Content-Type: application/json @@ -15,7 +15,7 @@ DATA: Response: 201 Created Content-Type: application/json; charset=UTF-8 -Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/28f1e5d8fcb146b68b6691df9238a223/bids/ffd6c83ecc214bc585dfa1cafa4b7ec2/documents/2a733a823c4c4f84b07fdf19a0705fc7 +Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/28f1e5d8fcb146b68b6691df9238a223/bids/dc155a4012b64c0d81cef6ef9d0cace4/documents/5fadba4eb81c4288bf714cecd7349916 { "data": { "hash": "md5:00000000000000000000000000000000", @@ -24,7 +24,7 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/28f1e5d8fcb146b6 "format": "application/msword", "documentOf": "tender", "datePublished": "2020-05-02T05:00:01+03:00", - "id": "2a733a823c4c4f84b07fdf19a0705fc7", + "id": "5fadba4eb81c4288bf714cecd7349916", "dateModified": "2020-05-02T05:00:01+03:00" } } diff --git a/docs/source/tendering/basic-actions/http/24hours/put-doc.http b/docs/source/tendering/basic-actions/http/24hours/put-doc.http index 590f900c9c..c670eb5b96 100644 --- a/docs/source/tendering/basic-actions/http/24hours/put-doc.http +++ b/docs/source/tendering/basic-actions/http/24hours/put-doc.http @@ -1,4 +1,4 @@ -PUT /api/2.5/tenders/28f1e5d8fcb146b68b6691df9238a223/bids/ffd6c83ecc214bc585dfa1cafa4b7ec2/documents/2a733a823c4c4f84b07fdf19a0705fc7?acc_token=696e0d5bfd7640a888fa8e6af1eebb3b HTTP/1.0 +PUT /api/2.5/tenders/28f1e5d8fcb146b68b6691df9238a223/bids/dc155a4012b64c0d81cef6ef9d0cace4/documents/5fadba4eb81c4288bf714cecd7349916?acc_token=696e0d5bfd7640a888fa8e6af1eebb3b HTTP/1.0 Authorization: Bearer broker Content-Length: 345 Content-Type: application/json @@ -23,7 +23,7 @@ Content-Type: application/json; charset=UTF-8 "format": "application/msword", "documentOf": "tender", "datePublished": "2020-05-02T05:00:01+03:00", - "id": "2a733a823c4c4f84b07fdf19a0705fc7", + "id": "5fadba4eb81c4288bf714cecd7349916", "dateModified": "2020-05-02T05:00:01+03:00" } } diff --git a/docs/source/tendering/basic-actions/http/24hours/qualification-milestone-post.http b/docs/source/tendering/basic-actions/http/24hours/qualification-milestone-post.http index e9fcd780de..6e0f3958a2 100644 --- a/docs/source/tendering/basic-actions/http/24hours/qualification-milestone-post.http +++ b/docs/source/tendering/basic-actions/http/24hours/qualification-milestone-post.http @@ -13,14 +13,14 @@ DATA: Response: 201 Created Content-Type: application/json; charset=UTF-8 -Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/28f1e5d8fcb146b68b6691df9238a223/qualifications/12341234123412341234123412341234/milestones/462a4a42b53947719f4468392e1992d0 +Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/28f1e5d8fcb146b68b6691df9238a223/qualifications/12341234123412341234123412341234/milestones/d3d80f8b862f4e8a92152c0047971f62 { "data": { "date": "2020-05-02T05:00:20+03:00", "dueDate": "2020-05-03T05:00:20+03:00", "code": "24h", "description": "One ring to bring them all and in the darkness bind them", - "id": "462a4a42b53947719f4468392e1992d0" + "id": "d3d80f8b862f4e8a92152c0047971f62" } } diff --git a/docs/source/tendering/basic-actions/http/complaints-value/complaint-creation.http b/docs/source/tendering/basic-actions/http/complaints-value/complaint-creation.http index d1f6b63052..d73b622ab1 100644 --- a/docs/source/tendering/basic-actions/http/complaints-value/complaint-creation.http +++ b/docs/source/tendering/basic-actions/http/complaints-value/complaint-creation.http @@ -36,7 +36,7 @@ DATA: Response: 201 Created Content-Type: application/json; charset=UTF-8 -Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/725322d7e66c43b2a1f3470fcbbb4a1a/complaints/ffbeaeabd81e45e6b02465423fd31996 +Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/725322d7e66c43b2a1f3470fcbbb4a1a/complaints/3af7fafeb0344bcf9bbd8fb486f1951b { "access": { "transfer": "a30922858bd24fd886c18d448145363e", @@ -74,7 +74,7 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/725322d7e66c43b2 "complaintID": "UA-2020-05-15-000001.1", "date": "2020-05-15T01:00:00+03:00", "type": "complaint", - "id": "ffbeaeabd81e45e6b02465423fd31996" + "id": "3af7fafeb0344bcf9bbd8fb486f1951b" } } diff --git a/docs/source/tendering/basic-actions/http/confidential-documents/create-document.http b/docs/source/tendering/basic-actions/http/confidential-documents/create-document.http index b4790879e8..19ed9487e3 100644 --- a/docs/source/tendering/basic-actions/http/confidential-documents/create-document.http +++ b/docs/source/tendering/basic-actions/http/confidential-documents/create-document.http @@ -1,4 +1,4 @@ -POST /api/2.5/tenders/7898ec9992af47ccbc9b8bf1b8539660/bids/bc8deddfb8244a33a878ccdd7ce24616/documents?acc_token=dd8db01099664827aa1826260c296fa8 HTTP/1.0 +POST /api/2.5/tenders/7898ec9992af47ccbc9b8bf1b8539660/bids/930c04e6be2946bfa41898d03dec400e/documents?acc_token=dd8db01099664827aa1826260c296fa8 HTTP/1.0 Authorization: Bearer broker Content-Length: 462 Content-Type: application/json @@ -17,18 +17,18 @@ DATA: Response: 201 Created Content-Type: application/json; charset=UTF-8 -Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/7898ec9992af47ccbc9b8bf1b8539660/bids/bc8deddfb8244a33a878ccdd7ce24616/documents/307e274695ab4ae787ae6125f08956dc +Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/7898ec9992af47ccbc9b8bf1b8539660/bids/930c04e6be2946bfa41898d03dec400e/documents/dbabb976fd0f4592b76f90ee9ec281a3 { "data": { "hash": "md5:00000000000000000000000000000000", "confidentiality": "buyerOnly", "title": "private.doc", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/7898ec9992af47ccbc9b8bf1b8539660/bids/bc8deddfb8244a33a878ccdd7ce24616/documents/307e274695ab4ae787ae6125f08956dc?download=a80b88c2517343558b6e061f834130a6", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/7898ec9992af47ccbc9b8bf1b8539660/bids/930c04e6be2946bfa41898d03dec400e/documents/dbabb976fd0f4592b76f90ee9ec281a3?download=a80b88c2517343558b6e061f834130a6", "confidentialityRationale": "This document contains some secret data that shouldn't be public", "format": "application/msword", "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", - "id": "307e274695ab4ae787ae6125f08956dc", + "id": "dbabb976fd0f4592b76f90ee9ec281a3", "dateModified": "2020-05-15T01:00:00+03:00" } } diff --git a/docs/source/tendering/basic-actions/http/confidential-documents/document-list-private.http b/docs/source/tendering/basic-actions/http/confidential-documents/document-list-private.http index 0f7b289105..cb487ab817 100644 --- a/docs/source/tendering/basic-actions/http/confidential-documents/document-list-private.http +++ b/docs/source/tendering/basic-actions/http/confidential-documents/document-list-private.http @@ -1,4 +1,4 @@ -GET /api/2.5/tenders/7898ec9992af47ccbc9b8bf1b8539660/bids/bc8deddfb8244a33a878ccdd7ce24616/documents?acc_token=62607c36ce4a4d64961ecc0d0a21540e HTTP/1.0 +GET /api/2.5/tenders/7898ec9992af47ccbc9b8bf1b8539660/bids/930c04e6be2946bfa41898d03dec400e/documents?acc_token=62607c36ce4a4d64961ecc0d0a21540e HTTP/1.0 Authorization: Bearer broker Host: lb-api-sandbox.prozorro.gov.ua @@ -9,35 +9,35 @@ Content-Type: application/json; charset=UTF-8 { "hash": "md5:00000000000000000000000000000000", "confidentiality": "buyerOnly", - "title": "private.doc", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/7898ec9992af47ccbc9b8bf1b8539660/bids/bc8deddfb8244a33a878ccdd7ce24616/documents/307e274695ab4ae787ae6125f08956dc?download=a80b88c2517343558b6e061f834130a6", - "confidentialityRationale": "This document contains some secret data that shouldn't be public", + "title": "public-to-private.doc", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/7898ec9992af47ccbc9b8bf1b8539660/bids/930c04e6be2946bfa41898d03dec400e/documents/facc91ddd3184f379736baed56674c62?download=284617724bff4ff6bd1023f665da3b47", + "confidentialityRationale": "Lol, this document contains some secret data that shouldn't be public, I'm changing it's confidentiality", "format": "application/msword", "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", - "id": "307e274695ab4ae787ae6125f08956dc", + "id": "facc91ddd3184f379736baed56674c62", "dateModified": "2020-05-15T01:00:00+03:00" }, { "hash": "md5:00000000000000000000000000000000", - "confidentiality": "buyerOnly", - "title": "public-to-private.doc", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/7898ec9992af47ccbc9b8bf1b8539660/bids/bc8deddfb8244a33a878ccdd7ce24616/documents/dbd45ebd0e9d4f6fa53efaff96a144c1?download=284617724bff4ff6bd1023f665da3b47", - "confidentialityRationale": "Lol, this document contains some secret data that shouldn't be public, I'm changing it's confidentiality", + "title": "public.doc", + "url": "http://public-docs-sandbox.prozorro.gov.ua/get/aef3d5621c2b4f80ba8bad34c4e234be?KeyID=a8968c46&Signature=ecMxMkHmJGMdBO%2FRF%2FheD0B4yPa%252B5rAxpglLW5ZBltgJNrGY%2F3Zko8oL117%252BQ95Eossv5LcWOR1mC%252BDBEcBQDg%253D%253D", "format": "application/msword", "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", - "id": "dbd45ebd0e9d4f6fa53efaff96a144c1", + "id": "09145e1e417b4ebb9188580fda24600b", "dateModified": "2020-05-15T01:00:00+03:00" }, { "hash": "md5:00000000000000000000000000000000", - "title": "public.doc", - "url": "http://public-docs-sandbox.prozorro.gov.ua/get/aef3d5621c2b4f80ba8bad34c4e234be?KeyID=a8968c46&Signature=ecMxMkHmJGMdBO%2FRF%2FheD0B4yPa%252B5rAxpglLW5ZBltgJNrGY%2F3Zko8oL117%252BQ95Eossv5LcWOR1mC%252BDBEcBQDg%253D%253D", + "confidentiality": "buyerOnly", + "title": "private.doc", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/7898ec9992af47ccbc9b8bf1b8539660/bids/930c04e6be2946bfa41898d03dec400e/documents/dbabb976fd0f4592b76f90ee9ec281a3?download=a80b88c2517343558b6e061f834130a6", + "confidentialityRationale": "This document contains some secret data that shouldn't be public", "format": "application/msword", "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", - "id": "abce1a8622a04fcb98e1483f9ab0b898", + "id": "dbabb976fd0f4592b76f90ee9ec281a3", "dateModified": "2020-05-15T01:00:00+03:00" } ] diff --git a/docs/source/tendering/basic-actions/http/confidential-documents/document-list-public.http b/docs/source/tendering/basic-actions/http/confidential-documents/document-list-public.http index a435e26b8a..340c24b9de 100644 --- a/docs/source/tendering/basic-actions/http/confidential-documents/document-list-public.http +++ b/docs/source/tendering/basic-actions/http/confidential-documents/document-list-public.http @@ -1,4 +1,4 @@ -GET /api/2.5/tenders/7898ec9992af47ccbc9b8bf1b8539660/bids/bc8deddfb8244a33a878ccdd7ce24616/documents HTTP/1.0 +GET /api/2.5/tenders/7898ec9992af47ccbc9b8bf1b8539660/bids/930c04e6be2946bfa41898d03dec400e/documents HTTP/1.0 Authorization: Bearer broker Host: lb-api-sandbox.prozorro.gov.ua @@ -9,34 +9,34 @@ Content-Type: application/json; charset=UTF-8 { "hash": "md5:00000000000000000000000000000000", "confidentiality": "buyerOnly", - "title": "private.doc", - "confidentialityRationale": "This document contains some secret data that shouldn't be public", + "title": "public-to-private.doc", + "confidentialityRationale": "Lol, this document contains some secret data that shouldn't be public, I'm changing it's confidentiality", "format": "application/msword", "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", "dateModified": "2020-05-15T01:00:00+03:00", - "id": "307e274695ab4ae787ae6125f08956dc" + "id": "facc91ddd3184f379736baed56674c62" }, { "hash": "md5:00000000000000000000000000000000", - "confidentiality": "buyerOnly", - "title": "public-to-private.doc", - "confidentialityRationale": "Lol, this document contains some secret data that shouldn't be public, I'm changing it's confidentiality", + "title": "public.doc", + "url": "http://public-docs-sandbox.prozorro.gov.ua/get/aef3d5621c2b4f80ba8bad34c4e234be?KeyID=a8968c46&Signature=ecMxMkHmJGMdBO%2FRF%2FheD0B4yPa%252B5rAxpglLW5ZBltgJNrGY%2F3Zko8oL117%252BQ95Eossv5LcWOR1mC%252BDBEcBQDg%253D%253D", "format": "application/msword", "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", - "dateModified": "2020-05-15T01:00:00+03:00", - "id": "dbd45ebd0e9d4f6fa53efaff96a144c1" + "id": "09145e1e417b4ebb9188580fda24600b", + "dateModified": "2020-05-15T01:00:00+03:00" }, { "hash": "md5:00000000000000000000000000000000", - "title": "public.doc", - "url": "http://public-docs-sandbox.prozorro.gov.ua/get/aef3d5621c2b4f80ba8bad34c4e234be?KeyID=a8968c46&Signature=ecMxMkHmJGMdBO%2FRF%2FheD0B4yPa%252B5rAxpglLW5ZBltgJNrGY%2F3Zko8oL117%252BQ95Eossv5LcWOR1mC%252BDBEcBQDg%253D%253D", + "confidentiality": "buyerOnly", + "title": "private.doc", + "confidentialityRationale": "This document contains some secret data that shouldn't be public", "format": "application/msword", "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", - "id": "abce1a8622a04fcb98e1483f9ab0b898", - "dateModified": "2020-05-15T01:00:00+03:00" + "dateModified": "2020-05-15T01:00:00+03:00", + "id": "dbabb976fd0f4592b76f90ee9ec281a3" } ] } diff --git a/docs/source/tendering/basic-actions/http/confidential-documents/patch-public-document.http b/docs/source/tendering/basic-actions/http/confidential-documents/patch-public-document.http index 2d1c267fef..21070d4180 100644 --- a/docs/source/tendering/basic-actions/http/confidential-documents/patch-public-document.http +++ b/docs/source/tendering/basic-actions/http/confidential-documents/patch-public-document.http @@ -1,4 +1,4 @@ -PATCH /api/2.5/tenders/7898ec9992af47ccbc9b8bf1b8539660/bids/bc8deddfb8244a33a878ccdd7ce24616/documents/dbd45ebd0e9d4f6fa53efaff96a144c1?acc_token=dd8db01099664827aa1826260c296fa8 HTTP/1.0 +PATCH /api/2.5/tenders/7898ec9992af47ccbc9b8bf1b8539660/bids/930c04e6be2946bfa41898d03dec400e/documents/facc91ddd3184f379736baed56674c62?acc_token=dd8db01099664827aa1826260c296fa8 HTTP/1.0 Authorization: Bearer broker Content-Length: 178 Content-Type: application/json @@ -18,12 +18,12 @@ Content-Type: application/json; charset=UTF-8 "hash": "md5:00000000000000000000000000000000", "confidentiality": "buyerOnly", "title": "public-to-private.doc", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/7898ec9992af47ccbc9b8bf1b8539660/bids/bc8deddfb8244a33a878ccdd7ce24616/documents/dbd45ebd0e9d4f6fa53efaff96a144c1?download=284617724bff4ff6bd1023f665da3b47", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/7898ec9992af47ccbc9b8bf1b8539660/bids/930c04e6be2946bfa41898d03dec400e/documents/facc91ddd3184f379736baed56674c62?download=284617724bff4ff6bd1023f665da3b47", "confidentialityRationale": "Lol, this document contains some secret data that shouldn't be public, I'm changing it's confidentiality", "format": "application/msword", "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", - "id": "dbd45ebd0e9d4f6fa53efaff96a144c1", + "id": "facc91ddd3184f379736baed56674c62", "dateModified": "2020-05-15T01:00:00+03:00" } } diff --git a/docs/source/tendering/basic-actions/index.rst b/docs/source/tendering/basic-actions/index.rst index 601ed7344f..10ebf55f8e 100644 --- a/docs/source/tendering/basic-actions/index.rst +++ b/docs/source/tendering/basic-actions/index.rst @@ -15,6 +15,8 @@ Contents: qualifications complaints complaint-payments + criteria + bid-requirement-response procuring lots bidding diff --git a/docs/source/tendering/cfaselectionua/tutorial/activate-bidder.http b/docs/source/tendering/cfaselectionua/tutorial/activate-bidder.http index 5b67d38757..bf2861f9c6 100644 --- a/docs/source/tendering/cfaselectionua/tutorial/activate-bidder.http +++ b/docs/source/tendering/cfaselectionua/tutorial/activate-bidder.http @@ -1,4 +1,4 @@ -PATCH /api/2.5/tenders/6ccc95c340c94e32bcf0b8c2183e62f7/bids/cc8919c6d27b47e89829b7c64b3a7878?acc_token=ebff7d432d3d4d0a8756f67f9bb07ef5 HTTP/1.0 +PATCH /api/2.5/tenders/6ccc95c340c94e32bcf0b8c2183e62f7/bids/436a89f5f496498fa9134f3caedb168d?acc_token=ebff7d432d3d4d0a8756f67f9bb07ef5 HTTP/1.0 Authorization: Bearer broker Content-Length: 30 Content-Type: application/json @@ -59,7 +59,7 @@ Content-Type: application/json; charset=UTF-8 } ], "date": "2020-05-15T01:00:00+03:00", - "id": "cc8919c6d27b47e89829b7c64b3a7878" + "id": "436a89f5f496498fa9134f3caedb168d" } } diff --git a/docs/source/tendering/cfaselectionua/tutorial/active-cancellation.http b/docs/source/tendering/cfaselectionua/tutorial/active-cancellation.http index 216b20dd10..988ec64a13 100644 --- a/docs/source/tendering/cfaselectionua/tutorial/active-cancellation.http +++ b/docs/source/tendering/cfaselectionua/tutorial/active-cancellation.http @@ -1,4 +1,4 @@ -PATCH /api/2.5/tenders/6ccc95c340c94e32bcf0b8c2183e62f7/cancellations/d27961bfbbcc4d648393fddd7a24df81?acc_token=794fefa6abd34c81a289161fadb1feb4 HTTP/1.0 +PATCH /api/2.5/tenders/6ccc95c340c94e32bcf0b8c2183e62f7/cancellations/be7b1bfcbe9a4d6abca8dd39e5e1caf3?acc_token=794fefa6abd34c81a289161fadb1feb4 HTTP/1.0 Authorization: Bearer broker Content-Length: 30 Content-Type: application/json @@ -24,7 +24,7 @@ Content-Type: application/json; charset=UTF-8 "format": "application/pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", - "id": "706eee2233914342baaa25ffce3d32db", + "id": "e0a0e3e67b6243db85c6a4800eacc365", "dateModified": "2020-05-15T01:00:00+03:00" }, { @@ -35,7 +35,7 @@ Content-Type: application/json; charset=UTF-8 "format": "application/pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", - "id": "706eee2233914342baaa25ffce3d32db", + "id": "e0a0e3e67b6243db85c6a4800eacc365", "dateModified": "2020-05-15T01:00:00+03:00" } ], @@ -43,7 +43,7 @@ Content-Type: application/json; charset=UTF-8 "reasonType": "noDemand", "date": "2020-05-15T01:00:00+03:00", "cancellationOf": "tender", - "id": "d27961bfbbcc4d648393fddd7a24df81" + "id": "be7b1bfcbe9a4d6abca8dd39e5e1caf3" } } diff --git a/docs/source/tendering/cfaselectionua/tutorial/auction-url.http b/docs/source/tendering/cfaselectionua/tutorial/auction-url.http index 8e6dd23176..0a7af78013 100644 --- a/docs/source/tendering/cfaselectionua/tutorial/auction-url.http +++ b/docs/source/tendering/cfaselectionua/tutorial/auction-url.http @@ -49,8 +49,8 @@ Content-Type: application/json; charset=UTF-8 } ], "enquiryPeriod": { - "startDate": "2020-05-11T01:00:00+03:00", - "endDate": "2020-05-12T01:00:00+03:00" + "startDate": "2020-05-09T01:00:00+03:00", + "endDate": "2020-05-11T01:00:00+03:00" }, "submissionMethod": "electronicAuction", "next_check": "2020-05-15T01:42:00+03:00", @@ -99,7 +99,7 @@ Content-Type: application/json; charset=UTF-8 "datePublished": "2020-05-15T01:00:00+03:00", "author": "tender_owner", "documentType": "technicalSpecifications", - "id": "45b3da2674bc4cabaacf6eae668ba321", + "id": "e1361638f83e4a6ab2b160639b5264c8", "dateModified": "2020-05-15T01:00:00+03:00" }, { @@ -110,7 +110,7 @@ Content-Type: application/json; charset=UTF-8 "format": "application/pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", - "id": "c3be39b3c6954dcba33d6a72709ae9fa", + "id": "d44dae4e682c4fb6ad546dc2f164f2c4", "dateModified": "2020-05-15T01:00:00+03:00" }, { @@ -121,7 +121,7 @@ Content-Type: application/json; charset=UTF-8 "format": "application/pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", - "id": "c3be39b3c6954dcba33d6a72709ae9fa", + "id": "d44dae4e682c4fb6ad546dc2f164f2c4", "dateModified": "2020-05-15T01:00:00+03:00" } ], @@ -499,9 +499,12 @@ Content-Type: application/json; charset=UTF-8 ], "status": "active.auction", "tenderPeriod": { - "startDate": "2020-05-12T01:00:00+03:00", + "startDate": "2020-05-11T01:00:00+03:00", "endDate": "2020-05-15T01:00:00+03:00" }, + "auctionPeriod": { + "startDate": "2020-05-15T01:00:00+03:00" + }, "procurementMethodType": "closeFrameworkAgreementSelectionUA", "date": "2020-05-15T01:00:00+03:00", "minimalStep": { diff --git a/docs/source/tendering/cfaselectionua/tutorial/award-qualification-active.http b/docs/source/tendering/cfaselectionua/tutorial/award-qualification-active.http index ceb92d130e..121c87e99f 100644 --- a/docs/source/tendering/cfaselectionua/tutorial/award-qualification-active.http +++ b/docs/source/tendering/cfaselectionua/tutorial/award-qualification-active.http @@ -38,7 +38,7 @@ Content-Type: application/json; charset=UTF-8 } } ], - "bid_id": "d3401f691dc94a84ba7daa8eb8e0c4f0", + "bid_id": "d3232808966140b4817970455ae7c99e", "value": { "currency": "UAH", "amount": 499.0, diff --git a/docs/source/tendering/cfaselectionua/tutorial/award-qualification-cancelled.http b/docs/source/tendering/cfaselectionua/tutorial/award-qualification-cancelled.http index 8cd8ee312a..edbd6e4928 100644 --- a/docs/source/tendering/cfaselectionua/tutorial/award-qualification-cancelled.http +++ b/docs/source/tendering/cfaselectionua/tutorial/award-qualification-cancelled.http @@ -39,7 +39,7 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/6ccc95c340c94e32 } } ], - "bid_id": "d3401f691dc94a84ba7daa8eb8e0c4f0", + "bid_id": "d3232808966140b4817970455ae7c99e", "value": { "currency": "UAH", "amount": 499.0, diff --git a/docs/source/tendering/cfaselectionua/tutorial/award-qualification-unsuccessful1.http b/docs/source/tendering/cfaselectionua/tutorial/award-qualification-unsuccessful1.http index a18e66c704..8434a42668 100644 --- a/docs/source/tendering/cfaselectionua/tutorial/award-qualification-unsuccessful1.http +++ b/docs/source/tendering/cfaselectionua/tutorial/award-qualification-unsuccessful1.http @@ -39,7 +39,7 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/6ccc95c340c94e32 } } ], - "bid_id": "d3401f691dc94a84ba7daa8eb8e0c4f0", + "bid_id": "d3232808966140b4817970455ae7c99e", "value": { "currency": "UAH", "amount": 499.0, diff --git a/docs/source/tendering/cfaselectionua/tutorial/award-qualification-unsuccessful1_document.http b/docs/source/tendering/cfaselectionua/tutorial/award-qualification-unsuccessful1_document.http index 3dc0225848..5d27bd190a 100644 --- a/docs/source/tendering/cfaselectionua/tutorial/award-qualification-unsuccessful1_document.http +++ b/docs/source/tendering/cfaselectionua/tutorial/award-qualification-unsuccessful1_document.http @@ -15,7 +15,7 @@ DATA: Response: 201 Created Content-Type: application/json; charset=UTF-8 -Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/6ccc95c340c94e32bcf0b8c2183e62f7/awards/19ec6d107424404daa2b35ae7a2d2c17/documents/39f011b798b048c7af4b67542940dbcb +Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/6ccc95c340c94e32bcf0b8c2183e62f7/awards/19ec6d107424404daa2b35ae7a2d2c17/documents/c439f494fdd44059b2688d79f9d32a04 { "data": { "hash": "md5:00000000000000000000000000000000", @@ -25,7 +25,7 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/6ccc95c340c94e32 "format": "application/pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", - "id": "39f011b798b048c7af4b67542940dbcb", + "id": "c439f494fdd44059b2688d79f9d32a04", "dateModified": "2020-05-15T01:00:00+03:00" } } diff --git a/docs/source/tendering/cfaselectionua/tutorial/awards-get.http b/docs/source/tendering/cfaselectionua/tutorial/awards-get.http index 2cd3497590..0668276131 100644 --- a/docs/source/tendering/cfaselectionua/tutorial/awards-get.http +++ b/docs/source/tendering/cfaselectionua/tutorial/awards-get.http @@ -31,7 +31,7 @@ Content-Type: application/json; charset=UTF-8 } } ], - "bid_id": "d3401f691dc94a84ba7daa8eb8e0c4f0", + "bid_id": "d3232808966140b4817970455ae7c99e", "value": { "currency": "UAH", "amount": 499.0, diff --git a/docs/source/tendering/cfaselectionua/tutorial/bidder-documents.http b/docs/source/tendering/cfaselectionua/tutorial/bidder-documents.http index f3a3f3d5dc..bf400549b3 100644 --- a/docs/source/tendering/cfaselectionua/tutorial/bidder-documents.http +++ b/docs/source/tendering/cfaselectionua/tutorial/bidder-documents.http @@ -1,4 +1,4 @@ -GET /api/2.5/tenders/6ccc95c340c94e32bcf0b8c2183e62f7/bids/cc8919c6d27b47e89829b7c64b3a7878/documents?acc_token=ebff7d432d3d4d0a8756f67f9bb07ef5 HTTP/1.0 +GET /api/2.5/tenders/6ccc95c340c94e32bcf0b8c2183e62f7/bids/436a89f5f496498fa9134f3caedb168d/documents?acc_token=ebff7d432d3d4d0a8756f67f9bb07ef5 HTTP/1.0 Authorization: Bearer broker Host: lb-api-sandbox.prozorro.gov.ua @@ -9,11 +9,11 @@ Content-Type: application/json; charset=UTF-8 { "hash": "md5:00000000000000000000000000000000", "title": "Proposal.pdf", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/6ccc95c340c94e32bcf0b8c2183e62f7/bids/cc8919c6d27b47e89829b7c64b3a7878/documents/b84352b9f54c4f14bf296d9b79f48ebc?download=396c2bbf6e0c4ea1aa1292ff2f195d11", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/6ccc95c340c94e32bcf0b8c2183e62f7/bids/436a89f5f496498fa9134f3caedb168d/documents/ec90a6e35c674a8eafa7fe0958a50a8c?download=396c2bbf6e0c4ea1aa1292ff2f195d11", "format": "application/pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", - "id": "b84352b9f54c4f14bf296d9b79f48ebc", + "id": "ec90a6e35c674a8eafa7fe0958a50a8c", "dateModified": "2020-05-15T01:00:00+03:00" } ] diff --git a/docs/source/tendering/cfaselectionua/tutorial/bidder-participation-url.http b/docs/source/tendering/cfaselectionua/tutorial/bidder-participation-url.http index dd0f748235..432f051b2e 100644 --- a/docs/source/tendering/cfaselectionua/tutorial/bidder-participation-url.http +++ b/docs/source/tendering/cfaselectionua/tutorial/bidder-participation-url.http @@ -1,4 +1,4 @@ -GET /api/2.5/tenders/6ccc95c340c94e32bcf0b8c2183e62f7/bids/cc8919c6d27b47e89829b7c64b3a7878?acc_token=ebff7d432d3d4d0a8756f67f9bb07ef5 HTTP/1.0 +GET /api/2.5/tenders/6ccc95c340c94e32bcf0b8c2183e62f7/bids/436a89f5f496498fa9134f3caedb168d?acc_token=ebff7d432d3d4d0a8756f67f9bb07ef5 HTTP/1.0 Authorization: Bearer broker Host: lb-api-sandbox.prozorro.gov.ua @@ -11,11 +11,11 @@ Content-Type: application/json; charset=UTF-8 { "hash": "md5:00000000000000000000000000000000", "title": "Proposal.pdf", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/6ccc95c340c94e32bcf0b8c2183e62f7/bids/cc8919c6d27b47e89829b7c64b3a7878/documents/b84352b9f54c4f14bf296d9b79f48ebc?download=396c2bbf6e0c4ea1aa1292ff2f195d11", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/6ccc95c340c94e32bcf0b8c2183e62f7/bids/436a89f5f496498fa9134f3caedb168d/documents/ec90a6e35c674a8eafa7fe0958a50a8c?download=396c2bbf6e0c4ea1aa1292ff2f195d11", "format": "application/pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", - "id": "b84352b9f54c4f14bf296d9b79f48ebc", + "id": "ec90a6e35c674a8eafa7fe0958a50a8c", "dateModified": "2020-05-15T01:00:00+03:00" } ], @@ -38,7 +38,7 @@ Content-Type: application/json; charset=UTF-8 "amount": 500.0, "valueAddedTaxIncluded": true }, - "participationUrl": "http://auction-sandbox.prozorro.gov.ua/tenders/6ccc95c340c94e32bcf0b8c2183e62f7_1b75c06ee58f4909a4201255b4ba5831?key_for_bid=cc8919c6d27b47e89829b7c64b3a7878" + "participationUrl": "http://auction-sandbox.prozorro.gov.ua/tenders/6ccc95c340c94e32bcf0b8c2183e62f7_1b75c06ee58f4909a4201255b4ba5831?key_for_bid=436a89f5f496498fa9134f3caedb168d" } ], "tenderers": [ @@ -64,7 +64,7 @@ Content-Type: application/json; charset=UTF-8 } ], "date": "2020-05-15T01:00:00+03:00", - "id": "cc8919c6d27b47e89829b7c64b3a7878" + "id": "436a89f5f496498fa9134f3caedb168d" } } diff --git a/docs/source/tendering/cfaselectionua/tutorial/bidder2-participation-url.http b/docs/source/tendering/cfaselectionua/tutorial/bidder2-participation-url.http index 3645e03ead..f47a592943 100644 --- a/docs/source/tendering/cfaselectionua/tutorial/bidder2-participation-url.http +++ b/docs/source/tendering/cfaselectionua/tutorial/bidder2-participation-url.http @@ -1,4 +1,4 @@ -GET /api/2.5/tenders/6ccc95c340c94e32bcf0b8c2183e62f7/bids/d3401f691dc94a84ba7daa8eb8e0c4f0?acc_token=8c1be9249ea8445480b4c4e3ec6ee974 HTTP/1.0 +GET /api/2.5/tenders/6ccc95c340c94e32bcf0b8c2183e62f7/bids/d3232808966140b4817970455ae7c99e?acc_token=8c1be9249ea8445480b4c4e3ec6ee974 HTTP/1.0 Authorization: Bearer broker Host: lb-api-sandbox.prozorro.gov.ua @@ -11,21 +11,21 @@ Content-Type: application/json; charset=UTF-8 { "hash": "md5:00000000000000000000000000000000", "title": "Proposal_part1.pdf", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/6ccc95c340c94e32bcf0b8c2183e62f7/bids/d3401f691dc94a84ba7daa8eb8e0c4f0/documents/c5f17f5d6bd94560afb4e4276f410310?download=f4853348bbbc4a6faa08d0e2891ea2e8", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/6ccc95c340c94e32bcf0b8c2183e62f7/bids/d3232808966140b4817970455ae7c99e/documents/62d42fd055ad4447b9025faab11e1af1?download=f4853348bbbc4a6faa08d0e2891ea2e8", "format": "application/pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", - "id": "c5f17f5d6bd94560afb4e4276f410310", + "id": "62d42fd055ad4447b9025faab11e1af1", "dateModified": "2020-05-15T01:00:00+03:00" }, { "hash": "md5:00000000000000000000000000000000", "title": "Proposal_part2.pdf", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/6ccc95c340c94e32bcf0b8c2183e62f7/bids/d3401f691dc94a84ba7daa8eb8e0c4f0/documents/39a5a8f376d04e31b0dff87300913f99?download=e8f2a6a130ba44bb8e93f4056a8dbab7", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/6ccc95c340c94e32bcf0b8c2183e62f7/bids/d3232808966140b4817970455ae7c99e/documents/a88535d579b44921bd723845d97bdb5c?download=e8f2a6a130ba44bb8e93f4056a8dbab7", "format": "application/pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", - "id": "39a5a8f376d04e31b0dff87300913f99", + "id": "a88535d579b44921bd723845d97bdb5c", "dateModified": "2020-05-15T01:00:00+03:00" } ], @@ -48,7 +48,7 @@ Content-Type: application/json; charset=UTF-8 "amount": 499.0, "valueAddedTaxIncluded": true }, - "participationUrl": "http://auction-sandbox.prozorro.gov.ua/tenders/6ccc95c340c94e32bcf0b8c2183e62f7_1b75c06ee58f4909a4201255b4ba5831?key_for_bid=d3401f691dc94a84ba7daa8eb8e0c4f0" + "participationUrl": "http://auction-sandbox.prozorro.gov.ua/tenders/6ccc95c340c94e32bcf0b8c2183e62f7_1b75c06ee58f4909a4201255b4ba5831?key_for_bid=d3232808966140b4817970455ae7c99e" } ], "tenderers": [ @@ -74,7 +74,7 @@ Content-Type: application/json; charset=UTF-8 } ], "date": "2020-05-15T01:00:00+03:00", - "id": "d3401f691dc94a84ba7daa8eb8e0c4f0" + "id": "d3232808966140b4817970455ae7c99e" } } diff --git a/docs/source/tendering/cfaselectionua/tutorial/confirm-qualification.http b/docs/source/tendering/cfaselectionua/tutorial/confirm-qualification.http index 18e585858e..c084e62f69 100644 --- a/docs/source/tendering/cfaselectionua/tutorial/confirm-qualification.http +++ b/docs/source/tendering/cfaselectionua/tutorial/confirm-qualification.http @@ -38,7 +38,7 @@ Content-Type: application/json; charset=UTF-8 } } ], - "bid_id": "c3628384efdd45669ec7a27a34d989db", + "bid_id": "8b1da1dc1b524064a338596d48503f66", "value": { "currency": "UAH", "amount": 499.0, diff --git a/docs/source/tendering/cfaselectionua/tutorial/patch-cancellation.http b/docs/source/tendering/cfaselectionua/tutorial/patch-cancellation.http index bb795e4676..4d71a03767 100644 --- a/docs/source/tendering/cfaselectionua/tutorial/patch-cancellation.http +++ b/docs/source/tendering/cfaselectionua/tutorial/patch-cancellation.http @@ -1,4 +1,4 @@ -PATCH /api/2.5/tenders/6ccc95c340c94e32bcf0b8c2183e62f7/cancellations/d27961bfbbcc4d648393fddd7a24df81/documents/706eee2233914342baaa25ffce3d32db?acc_token=794fefa6abd34c81a289161fadb1feb4 HTTP/1.0 +PATCH /api/2.5/tenders/6ccc95c340c94e32bcf0b8c2183e62f7/cancellations/be7b1bfcbe9a4d6abca8dd39e5e1caf3/documents/e0a0e3e67b6243db85c6a4800eacc365?acc_token=794fefa6abd34c81a289161fadb1feb4 HTTP/1.0 Authorization: Bearer broker Content-Length: 48 Content-Type: application/json @@ -21,7 +21,7 @@ Content-Type: application/json; charset=UTF-8 "format": "application/pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", - "id": "706eee2233914342baaa25ffce3d32db", + "id": "e0a0e3e67b6243db85c6a4800eacc365", "dateModified": "2020-05-15T01:00:00+03:00" } } diff --git a/docs/source/tendering/cfaselectionua/tutorial/patch-items-value-periods.http b/docs/source/tendering/cfaselectionua/tutorial/patch-items-value-periods.http index c7ec720aff..7e037e07f1 100644 --- a/docs/source/tendering/cfaselectionua/tutorial/patch-items-value-periods.http +++ b/docs/source/tendering/cfaselectionua/tutorial/patch-items-value-periods.http @@ -25,7 +25,7 @@ Content-Type: application/json; charset=UTF-8 "procurementMethod": "selective", "tenderID": "UA-2020-05-15-000004", "tenderPeriod": { - "startDate": "2020-05-16T01:00:00+03:00", + "startDate": "2020-05-17T00:00:00+03:00", "endDate": "2020-05-30T01:00:10+03:00" }, "title": "футляри до державних нагород", @@ -98,7 +98,7 @@ Content-Type: application/json; charset=UTF-8 "valueAddedTaxIncluded": true }, "dateModified": "2020-05-15T01:00:00+03:00", - "next_check": "2020-05-16T01:00:00+03:00", + "next_check": "2020-05-17T00:00:00+03:00", "procuringEntity": { "kind": "general", "name": "Державне управління справами", @@ -130,7 +130,7 @@ Content-Type: application/json; charset=UTF-8 "awardCriteria": "lowestCost", "enquiryPeriod": { "startDate": "2020-05-15T01:00:00+03:00", - "endDate": "2020-05-16T01:00:00+03:00" + "endDate": "2020-05-17T00:00:00+03:00" }, "owner": "broker", "agreements": [ diff --git a/docs/source/tendering/cfaselectionua/tutorial/prepare-cancellation.http b/docs/source/tendering/cfaselectionua/tutorial/prepare-cancellation.http index 346129c8fe..dc637e1f64 100644 --- a/docs/source/tendering/cfaselectionua/tutorial/prepare-cancellation.http +++ b/docs/source/tendering/cfaselectionua/tutorial/prepare-cancellation.http @@ -13,7 +13,7 @@ DATA: Response: 201 Created Content-Type: application/json; charset=UTF-8 -Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/6ccc95c340c94e32bcf0b8c2183e62f7/cancellations/d27961bfbbcc4d648393fddd7a24df81 +Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/6ccc95c340c94e32bcf0b8c2183e62f7/cancellations/be7b1bfcbe9a4d6abca8dd39e5e1caf3 { "data": { "status": "draft", @@ -21,7 +21,7 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/6ccc95c340c94e32 "reasonType": "noDemand", "date": "2020-05-15T01:00:00+03:00", "cancellationOf": "tender", - "id": "d27961bfbbcc4d648393fddd7a24df81" + "id": "be7b1bfcbe9a4d6abca8dd39e5e1caf3" } } diff --git a/docs/source/tendering/cfaselectionua/tutorial/register-2nd-bidder.http b/docs/source/tendering/cfaselectionua/tutorial/register-2nd-bidder.http index a56e537252..df4be1cf42 100644 --- a/docs/source/tendering/cfaselectionua/tutorial/register-2nd-bidder.http +++ b/docs/source/tendering/cfaselectionua/tutorial/register-2nd-bidder.http @@ -65,7 +65,7 @@ DATA: Response: 201 Created Content-Type: application/json; charset=UTF-8 -Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/6ccc95c340c94e32bcf0b8c2183e62f7/bids/d3401f691dc94a84ba7daa8eb8e0c4f0 +Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/6ccc95c340c94e32bcf0b8c2183e62f7/bids/d3232808966140b4817970455ae7c99e { "access": { "transfer": "9ae4e56edcfb4eb69c010689a3f89041", @@ -77,21 +77,21 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/6ccc95c340c94e32 { "hash": "md5:00000000000000000000000000000000", "title": "Proposal_part1.pdf", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/6ccc95c340c94e32bcf0b8c2183e62f7/bids/d3401f691dc94a84ba7daa8eb8e0c4f0/documents/c5f17f5d6bd94560afb4e4276f410310?download=f4853348bbbc4a6faa08d0e2891ea2e8", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/6ccc95c340c94e32bcf0b8c2183e62f7/bids/d3232808966140b4817970455ae7c99e/documents/62d42fd055ad4447b9025faab11e1af1?download=f4853348bbbc4a6faa08d0e2891ea2e8", "format": "application/pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", - "id": "c5f17f5d6bd94560afb4e4276f410310", + "id": "62d42fd055ad4447b9025faab11e1af1", "dateModified": "2020-05-15T01:00:00+03:00" }, { "hash": "md5:00000000000000000000000000000000", "title": "Proposal_part2.pdf", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/6ccc95c340c94e32bcf0b8c2183e62f7/bids/d3401f691dc94a84ba7daa8eb8e0c4f0/documents/39a5a8f376d04e31b0dff87300913f99?download=e8f2a6a130ba44bb8e93f4056a8dbab7", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/6ccc95c340c94e32bcf0b8c2183e62f7/bids/d3232808966140b4817970455ae7c99e/documents/a88535d579b44921bd723845d97bdb5c?download=e8f2a6a130ba44bb8e93f4056a8dbab7", "format": "application/pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", - "id": "39a5a8f376d04e31b0dff87300913f99", + "id": "a88535d579b44921bd723845d97bdb5c", "dateModified": "2020-05-15T01:00:00+03:00" } ], @@ -139,7 +139,7 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/6ccc95c340c94e32 } ], "date": "2020-05-15T01:00:00+03:00", - "id": "d3401f691dc94a84ba7daa8eb8e0c4f0" + "id": "d3232808966140b4817970455ae7c99e" } } diff --git a/docs/source/tendering/cfaselectionua/tutorial/register-bidder.http b/docs/source/tendering/cfaselectionua/tutorial/register-bidder.http index 44a9fd245b..75d8c6cf7f 100644 --- a/docs/source/tendering/cfaselectionua/tutorial/register-bidder.http +++ b/docs/source/tendering/cfaselectionua/tutorial/register-bidder.http @@ -52,7 +52,7 @@ DATA: Response: 201 Created Content-Type: application/json; charset=UTF-8 -Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/6ccc95c340c94e32bcf0b8c2183e62f7/bids/cc8919c6d27b47e89829b7c64b3a7878 +Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/6ccc95c340c94e32bcf0b8c2183e62f7/bids/436a89f5f496498fa9134f3caedb168d { "access": { "transfer": "65bb6d881aa348afa3de97420545b5a3", @@ -104,7 +104,7 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/6ccc95c340c94e32 } ], "date": "2020-05-15T01:00:00+03:00", - "id": "cc8919c6d27b47e89829b7c64b3a7878" + "id": "436a89f5f496498fa9134f3caedb168d" } } diff --git a/docs/source/tendering/cfaselectionua/tutorial/tender-contract-get-documents-again.http b/docs/source/tendering/cfaselectionua/tutorial/tender-contract-get-documents-again.http index 283ffc9d29..7e1293a918 100644 --- a/docs/source/tendering/cfaselectionua/tutorial/tender-contract-get-documents-again.http +++ b/docs/source/tendering/cfaselectionua/tutorial/tender-contract-get-documents-again.http @@ -8,20 +8,20 @@ Content-Type: application/json; charset=UTF-8 "data": [ { "hash": "md5:00000000000000000000000000000000", - "title": "contract_first_document.doc", - "url": "http://public-docs-sandbox.prozorro.gov.ua/get/0f746bb86abe44069b70422d6460b960?KeyID=a8968c46&Signature=pSYFHP3nW5EEk%2FIRb2QtEpFxYLsjj6qRelcysPR0of3o%2Fw7RiugEvP0mQ0%252BTwF%2FI9tUIUc6MDtRrLGReXyaRCw%253D%253D", + "title": "contract_second_document.doc", + "url": "http://public-docs-sandbox.prozorro.gov.ua/get/99561094e8ff41baa176155995a9e23c?KeyID=a8968c46&Signature=ecUmeR1kbP138C3RdAt76nq%2FPC6qYvVU9Kei5DuhrS72l%252BFJQh4GqCxMJAslC1VhN391Az%2FifrpGFIfPIgJmAQ%253D%253D", "format": "application/msword", "datePublished": "2020-05-15T01:00:00+03:00", - "id": "d06c0f6b9a9f4064bbd32fd6c64cf5da", + "id": "8dc5f3262f44446b969c08dcd70d64d7", "dateModified": "2020-05-15T01:00:00+03:00" }, { "hash": "md5:00000000000000000000000000000000", - "title": "contract_second_document.doc", - "url": "http://public-docs-sandbox.prozorro.gov.ua/get/99561094e8ff41baa176155995a9e23c?KeyID=a8968c46&Signature=ecUmeR1kbP138C3RdAt76nq%2FPC6qYvVU9Kei5DuhrS72l%252BFJQh4GqCxMJAslC1VhN391Az%2FifrpGFIfPIgJmAQ%253D%253D", + "title": "contract_first_document.doc", + "url": "http://public-docs-sandbox.prozorro.gov.ua/get/0f746bb86abe44069b70422d6460b960?KeyID=a8968c46&Signature=pSYFHP3nW5EEk%2FIRb2QtEpFxYLsjj6qRelcysPR0of3o%2Fw7RiugEvP0mQ0%252BTwF%2FI9tUIUc6MDtRrLGReXyaRCw%253D%253D", "format": "application/msword", "datePublished": "2020-05-15T01:00:00+03:00", - "id": "eb61c2895813420ea67c7baa86c980b9", + "id": "9902e5df539b4e97a6da5707e6a3d77f", "dateModified": "2020-05-15T01:00:00+03:00" } ] diff --git a/docs/source/tendering/cfaselectionua/tutorial/tender-contract-get-documents.http b/docs/source/tendering/cfaselectionua/tutorial/tender-contract-get-documents.http index f3729afc5f..4604e29c1f 100644 --- a/docs/source/tendering/cfaselectionua/tutorial/tender-contract-get-documents.http +++ b/docs/source/tendering/cfaselectionua/tutorial/tender-contract-get-documents.http @@ -12,7 +12,7 @@ Content-Type: application/json; charset=UTF-8 "url": "http://public-docs-sandbox.prozorro.gov.ua/get/0f746bb86abe44069b70422d6460b960?KeyID=a8968c46&Signature=pSYFHP3nW5EEk%2FIRb2QtEpFxYLsjj6qRelcysPR0of3o%2Fw7RiugEvP0mQ0%252BTwF%2FI9tUIUc6MDtRrLGReXyaRCw%253D%253D", "format": "application/msword", "datePublished": "2020-05-15T01:00:00+03:00", - "id": "d06c0f6b9a9f4064bbd32fd6c64cf5da", + "id": "9902e5df539b4e97a6da5707e6a3d77f", "dateModified": "2020-05-15T01:00:00+03:00" } ] diff --git a/docs/source/tendering/cfaselectionua/tutorial/tender-contract-sign.http b/docs/source/tendering/cfaselectionua/tutorial/tender-contract-sign.http index 6d88900cbd..4c3c16cec1 100644 --- a/docs/source/tendering/cfaselectionua/tutorial/tender-contract-sign.http +++ b/docs/source/tendering/cfaselectionua/tutorial/tender-contract-sign.http @@ -22,7 +22,7 @@ Content-Type: application/json; charset=UTF-8 "url": "http://public-docs-sandbox.prozorro.gov.ua/get/0f746bb86abe44069b70422d6460b960?KeyID=a8968c46&Signature=pSYFHP3nW5EEk%2FIRb2QtEpFxYLsjj6qRelcysPR0of3o%2Fw7RiugEvP0mQ0%252BTwF%2FI9tUIUc6MDtRrLGReXyaRCw%253D%253D", "format": "application/msword", "datePublished": "2020-05-15T01:00:00+03:00", - "id": "d06c0f6b9a9f4064bbd32fd6c64cf5da", + "id": "9902e5df539b4e97a6da5707e6a3d77f", "dateModified": "2020-05-15T01:00:00+03:00" }, { @@ -31,7 +31,7 @@ Content-Type: application/json; charset=UTF-8 "url": "http://public-docs-sandbox.prozorro.gov.ua/get/99561094e8ff41baa176155995a9e23c?KeyID=a8968c46&Signature=ecUmeR1kbP138C3RdAt76nq%2FPC6qYvVU9Kei5DuhrS72l%252BFJQh4GqCxMJAslC1VhN391Az%2FifrpGFIfPIgJmAQ%253D%253D", "format": "application/msword", "datePublished": "2020-05-15T01:00:00+03:00", - "id": "eb61c2895813420ea67c7baa86c980b9", + "id": "8dc5f3262f44446b969c08dcd70d64d7", "dateModified": "2020-05-15T01:00:00+03:00" } ], diff --git a/docs/source/tendering/cfaselectionua/tutorial/tender-contract-upload-document.http b/docs/source/tendering/cfaselectionua/tutorial/tender-contract-upload-document.http index df92bcbff7..00466dfc6b 100644 --- a/docs/source/tendering/cfaselectionua/tutorial/tender-contract-upload-document.http +++ b/docs/source/tendering/cfaselectionua/tutorial/tender-contract-upload-document.http @@ -15,7 +15,7 @@ DATA: Response: 201 Created Content-Type: application/json; charset=UTF-8 -Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/6ccc95c340c94e32bcf0b8c2183e62f7/contracts/632f182366214a9aa18a7cbe72724559/documents/d06c0f6b9a9f4064bbd32fd6c64cf5da +Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/6ccc95c340c94e32bcf0b8c2183e62f7/contracts/632f182366214a9aa18a7cbe72724559/documents/9902e5df539b4e97a6da5707e6a3d77f { "data": { "hash": "md5:00000000000000000000000000000000", @@ -23,7 +23,7 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/6ccc95c340c94e32 "url": "http://public-docs-sandbox.prozorro.gov.ua/get/0f746bb86abe44069b70422d6460b960?KeyID=a8968c46&Signature=pSYFHP3nW5EEk%2FIRb2QtEpFxYLsjj6qRelcysPR0of3o%2Fw7RiugEvP0mQ0%252BTwF%2FI9tUIUc6MDtRrLGReXyaRCw%253D%253D", "format": "application/msword", "datePublished": "2020-05-15T01:00:00+03:00", - "id": "d06c0f6b9a9f4064bbd32fd6c64cf5da", + "id": "9902e5df539b4e97a6da5707e6a3d77f", "dateModified": "2020-05-15T01:00:00+03:00" } } diff --git a/docs/source/tendering/cfaselectionua/tutorial/tender-contract-upload-second-document.http b/docs/source/tendering/cfaselectionua/tutorial/tender-contract-upload-second-document.http index 3c279b93fe..0ebfd7fed9 100644 --- a/docs/source/tendering/cfaselectionua/tutorial/tender-contract-upload-second-document.http +++ b/docs/source/tendering/cfaselectionua/tutorial/tender-contract-upload-second-document.http @@ -15,7 +15,7 @@ DATA: Response: 201 Created Content-Type: application/json; charset=UTF-8 -Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/6ccc95c340c94e32bcf0b8c2183e62f7/contracts/632f182366214a9aa18a7cbe72724559/documents/eb61c2895813420ea67c7baa86c980b9 +Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/6ccc95c340c94e32bcf0b8c2183e62f7/contracts/632f182366214a9aa18a7cbe72724559/documents/8dc5f3262f44446b969c08dcd70d64d7 { "data": { "hash": "md5:00000000000000000000000000000000", @@ -23,7 +23,7 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/6ccc95c340c94e32 "url": "http://public-docs-sandbox.prozorro.gov.ua/get/99561094e8ff41baa176155995a9e23c?KeyID=a8968c46&Signature=ecUmeR1kbP138C3RdAt76nq%2FPC6qYvVU9Kei5DuhrS72l%252BFJQh4GqCxMJAslC1VhN391Az%2FifrpGFIfPIgJmAQ%253D%253D", "format": "application/msword", "datePublished": "2020-05-15T01:00:00+03:00", - "id": "eb61c2895813420ea67c7baa86c980b9", + "id": "8dc5f3262f44446b969c08dcd70d64d7", "dateModified": "2020-05-15T01:00:00+03:00" } } diff --git a/docs/source/tendering/cfaselectionua/tutorial/tender-document-add-documentType.http b/docs/source/tendering/cfaselectionua/tutorial/tender-document-add-documentType.http index 2ce4f7d8ca..cd2e0c01fe 100644 --- a/docs/source/tendering/cfaselectionua/tutorial/tender-document-add-documentType.http +++ b/docs/source/tendering/cfaselectionua/tutorial/tender-document-add-documentType.http @@ -1,4 +1,4 @@ -PATCH /api/2.5/tenders/6ccc95c340c94e32bcf0b8c2183e62f7/documents/45b3da2674bc4cabaacf6eae668ba321?acc_token=794fefa6abd34c81a289161fadb1feb4 HTTP/1.0 +PATCH /api/2.5/tenders/6ccc95c340c94e32bcf0b8c2183e62f7/documents/e1361638f83e4a6ab2b160639b5264c8?acc_token=794fefa6abd34c81a289161fadb1feb4 HTTP/1.0 Authorization: Bearer broker Content-Length: 53 Content-Type: application/json @@ -22,7 +22,7 @@ Content-Type: application/json; charset=UTF-8 "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", "documentType": "technicalSpecifications", - "id": "45b3da2674bc4cabaacf6eae668ba321", + "id": "e1361638f83e4a6ab2b160639b5264c8", "dateModified": "2020-05-15T01:00:00+03:00" } } diff --git a/docs/source/tendering/cfaselectionua/tutorial/tender-document-edit-docType-desc.http b/docs/source/tendering/cfaselectionua/tutorial/tender-document-edit-docType-desc.http index 883f5752be..d3aa639881 100644 --- a/docs/source/tendering/cfaselectionua/tutorial/tender-document-edit-docType-desc.http +++ b/docs/source/tendering/cfaselectionua/tutorial/tender-document-edit-docType-desc.http @@ -1,4 +1,4 @@ -PATCH /api/2.5/tenders/6ccc95c340c94e32bcf0b8c2183e62f7/documents/45b3da2674bc4cabaacf6eae668ba321?acc_token=794fefa6abd34c81a289161fadb1feb4 HTTP/1.0 +PATCH /api/2.5/tenders/6ccc95c340c94e32bcf0b8c2183e62f7/documents/e1361638f83e4a6ab2b160639b5264c8?acc_token=794fefa6abd34c81a289161fadb1feb4 HTTP/1.0 Authorization: Bearer broker Content-Length: 58 Content-Type: application/json @@ -23,7 +23,7 @@ Content-Type: application/json; charset=UTF-8 "datePublished": "2020-05-15T01:00:00+03:00", "author": "tender_owner", "documentType": "technicalSpecifications", - "id": "45b3da2674bc4cabaacf6eae668ba321", + "id": "e1361638f83e4a6ab2b160639b5264c8", "dateModified": "2020-05-15T01:00:00+03:00" } } diff --git a/docs/source/tendering/cfaselectionua/tutorial/tender-documents-2.http b/docs/source/tendering/cfaselectionua/tutorial/tender-documents-2.http index 8a8daef4c0..f885c18785 100644 --- a/docs/source/tendering/cfaselectionua/tutorial/tender-documents-2.http +++ b/docs/source/tendering/cfaselectionua/tutorial/tender-documents-2.http @@ -16,7 +16,7 @@ Content-Type: application/json; charset=UTF-8 "datePublished": "2020-05-15T01:00:00+03:00", "author": "tender_owner", "documentType": "technicalSpecifications", - "id": "45b3da2674bc4cabaacf6eae668ba321", + "id": "e1361638f83e4a6ab2b160639b5264c8", "dateModified": "2020-05-15T01:00:00+03:00" }, { @@ -27,7 +27,7 @@ Content-Type: application/json; charset=UTF-8 "format": "application/pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", - "id": "c3be39b3c6954dcba33d6a72709ae9fa", + "id": "d44dae4e682c4fb6ad546dc2f164f2c4", "dateModified": "2020-05-15T01:00:00+03:00" } ] diff --git a/docs/source/tendering/cfaselectionua/tutorial/tender-documents-3.http b/docs/source/tendering/cfaselectionua/tutorial/tender-documents-3.http index ddfdfe6a98..162e6c6bd3 100644 --- a/docs/source/tendering/cfaselectionua/tutorial/tender-documents-3.http +++ b/docs/source/tendering/cfaselectionua/tutorial/tender-documents-3.http @@ -16,7 +16,7 @@ Content-Type: application/json; charset=UTF-8 "datePublished": "2020-05-15T01:00:00+03:00", "author": "tender_owner", "documentType": "technicalSpecifications", - "id": "45b3da2674bc4cabaacf6eae668ba321", + "id": "e1361638f83e4a6ab2b160639b5264c8", "dateModified": "2020-05-15T01:00:00+03:00" }, { @@ -27,7 +27,7 @@ Content-Type: application/json; charset=UTF-8 "format": "application/pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", - "id": "c3be39b3c6954dcba33d6a72709ae9fa", + "id": "d44dae4e682c4fb6ad546dc2f164f2c4", "dateModified": "2020-05-15T01:00:00+03:00" } ] diff --git a/docs/source/tendering/cfaselectionua/tutorial/tender-documents.http b/docs/source/tendering/cfaselectionua/tutorial/tender-documents.http index 418b2269a4..f0e289382f 100644 --- a/docs/source/tendering/cfaselectionua/tutorial/tender-documents.http +++ b/docs/source/tendering/cfaselectionua/tutorial/tender-documents.http @@ -1,4 +1,4 @@ -GET /api/2.5/tenders/6ccc95c340c94e32bcf0b8c2183e62f7/documents/45b3da2674bc4cabaacf6eae668ba321 HTTP/1.0 +GET /api/2.5/tenders/6ccc95c340c94e32bcf0b8c2183e62f7/documents/e1361638f83e4a6ab2b160639b5264c8 HTTP/1.0 Authorization: Bearer broker Host: lb-api-sandbox.prozorro.gov.ua @@ -14,7 +14,7 @@ Content-Type: application/json; charset=UTF-8 "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", "previousVersions": [], - "id": "45b3da2674bc4cabaacf6eae668ba321", + "id": "e1361638f83e4a6ab2b160639b5264c8", "dateModified": "2020-05-15T01:00:00+03:00" } } diff --git a/docs/source/tendering/cfaselectionua/tutorial/tender-in-active-enquiries.http b/docs/source/tendering/cfaselectionua/tutorial/tender-in-active-enquiries.http index 62aae4b830..cfa84e7946 100644 --- a/docs/source/tendering/cfaselectionua/tutorial/tender-in-active-enquiries.http +++ b/docs/source/tendering/cfaselectionua/tutorial/tender-in-active-enquiries.http @@ -10,8 +10,8 @@ Content-Type: application/json; charset=UTF-8 "procurementMethod": "selective", "tenderID": "UA-2020-05-15-000001", "tenderPeriod": { - "startDate": "2020-05-16T01:00:00+03:00", - "endDate": "2020-05-19T01:00:00+03:00" + "startDate": "2020-05-17T00:00:00+03:00", + "endDate": "2020-05-20T00:00:00+03:00" }, "title": "футляри до державних нагород", "lots": [ @@ -83,7 +83,7 @@ Content-Type: application/json; charset=UTF-8 "valueAddedTaxIncluded": true }, "dateModified": "2020-05-15T01:00:00+03:00", - "next_check": "2020-05-16T01:00:00+03:00", + "next_check": "2020-05-17T00:00:00+03:00", "procuringEntity": { "kind": "general", "name": "Державне управління справами", @@ -115,7 +115,7 @@ Content-Type: application/json; charset=UTF-8 "awardCriteria": "lowestCost", "enquiryPeriod": { "startDate": "2020-05-15T01:00:00+03:00", - "endDate": "2020-05-16T01:00:00+03:00" + "endDate": "2020-05-17T00:00:00+03:00" }, "owner": "broker", "agreements": [ diff --git a/docs/source/tendering/cfaselectionua/tutorial/update-award-criteria.http b/docs/source/tendering/cfaselectionua/tutorial/update-award-criteria.http index 81b6621258..14385df579 100644 --- a/docs/source/tendering/cfaselectionua/tutorial/update-award-criteria.http +++ b/docs/source/tendering/cfaselectionua/tutorial/update-award-criteria.http @@ -1,4 +1,4 @@ -PUT /api/2.5/tenders/6ccc95c340c94e32bcf0b8c2183e62f7/documents/c3be39b3c6954dcba33d6a72709ae9fa?acc_token=794fefa6abd34c81a289161fadb1feb4 HTTP/1.0 +PUT /api/2.5/tenders/6ccc95c340c94e32bcf0b8c2183e62f7/documents/d44dae4e682c4fb6ad546dc2f164f2c4?acc_token=794fefa6abd34c81a289161fadb1feb4 HTTP/1.0 Authorization: Bearer broker Content-Length: 335 Content-Type: application/json @@ -24,7 +24,7 @@ Content-Type: application/json; charset=UTF-8 "format": "application/pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", - "id": "c3be39b3c6954dcba33d6a72709ae9fa", + "id": "d44dae4e682c4fb6ad546dc2f164f2c4", "dateModified": "2020-05-15T01:00:00+03:00" } } diff --git a/docs/source/tendering/cfaselectionua/tutorial/update-cancellation-doc.http b/docs/source/tendering/cfaselectionua/tutorial/update-cancellation-doc.http index 070a87848b..fd9cb11515 100644 --- a/docs/source/tendering/cfaselectionua/tutorial/update-cancellation-doc.http +++ b/docs/source/tendering/cfaselectionua/tutorial/update-cancellation-doc.http @@ -1,4 +1,4 @@ -PUT /api/2.5/tenders/6ccc95c340c94e32bcf0b8c2183e62f7/cancellations/d27961bfbbcc4d648393fddd7a24df81/documents/706eee2233914342baaa25ffce3d32db?acc_token=794fefa6abd34c81a289161fadb1feb4 HTTP/1.0 +PUT /api/2.5/tenders/6ccc95c340c94e32bcf0b8c2183e62f7/cancellations/be7b1bfcbe9a4d6abca8dd39e5e1caf3/documents/e0a0e3e67b6243db85c6a4800eacc365?acc_token=794fefa6abd34c81a289161fadb1feb4 HTTP/1.0 Authorization: Bearer broker Content-Length: 320 Content-Type: application/json @@ -24,7 +24,7 @@ Content-Type: application/json; charset=UTF-8 "format": "application/pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", - "id": "706eee2233914342baaa25ffce3d32db", + "id": "e0a0e3e67b6243db85c6a4800eacc365", "dateModified": "2020-05-15T01:00:00+03:00" } } diff --git a/docs/source/tendering/cfaselectionua/tutorial/upload-award-criteria.http b/docs/source/tendering/cfaselectionua/tutorial/upload-award-criteria.http index 4945faf25f..f145198f71 100644 --- a/docs/source/tendering/cfaselectionua/tutorial/upload-award-criteria.http +++ b/docs/source/tendering/cfaselectionua/tutorial/upload-award-criteria.http @@ -15,7 +15,7 @@ DATA: Response: 201 Created Content-Type: application/json; charset=UTF-8 -Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/6ccc95c340c94e32bcf0b8c2183e62f7/documents/c3be39b3c6954dcba33d6a72709ae9fa +Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/6ccc95c340c94e32bcf0b8c2183e62f7/documents/d44dae4e682c4fb6ad546dc2f164f2c4 { "data": { "hash": "md5:00000000000000000000000000000000", @@ -25,7 +25,7 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/6ccc95c340c94e32 "format": "application/pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", - "id": "c3be39b3c6954dcba33d6a72709ae9fa", + "id": "d44dae4e682c4fb6ad546dc2f164f2c4", "dateModified": "2020-05-15T01:00:00+03:00" } } diff --git a/docs/source/tendering/cfaselectionua/tutorial/upload-bid-proposal.http b/docs/source/tendering/cfaselectionua/tutorial/upload-bid-proposal.http index 31afc7a8cb..a53a8625c7 100644 --- a/docs/source/tendering/cfaselectionua/tutorial/upload-bid-proposal.http +++ b/docs/source/tendering/cfaselectionua/tutorial/upload-bid-proposal.http @@ -1,4 +1,4 @@ -POST /api/2.5/tenders/6ccc95c340c94e32bcf0b8c2183e62f7/bids/cc8919c6d27b47e89829b7c64b3a7878/documents?acc_token=ebff7d432d3d4d0a8756f67f9bb07ef5 HTTP/1.0 +POST /api/2.5/tenders/6ccc95c340c94e32bcf0b8c2183e62f7/bids/436a89f5f496498fa9134f3caedb168d/documents?acc_token=ebff7d432d3d4d0a8756f67f9bb07ef5 HTTP/1.0 Authorization: Bearer broker Content-Length: 328 Content-Type: application/json @@ -15,16 +15,16 @@ DATA: Response: 201 Created Content-Type: application/json; charset=UTF-8 -Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/6ccc95c340c94e32bcf0b8c2183e62f7/bids/cc8919c6d27b47e89829b7c64b3a7878/documents/b84352b9f54c4f14bf296d9b79f48ebc +Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/6ccc95c340c94e32bcf0b8c2183e62f7/bids/436a89f5f496498fa9134f3caedb168d/documents/ec90a6e35c674a8eafa7fe0958a50a8c { "data": { "hash": "md5:00000000000000000000000000000000", "title": "Proposal.pdf", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/6ccc95c340c94e32bcf0b8c2183e62f7/bids/cc8919c6d27b47e89829b7c64b3a7878/documents/b84352b9f54c4f14bf296d9b79f48ebc?download=396c2bbf6e0c4ea1aa1292ff2f195d11", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/6ccc95c340c94e32bcf0b8c2183e62f7/bids/436a89f5f496498fa9134f3caedb168d/documents/ec90a6e35c674a8eafa7fe0958a50a8c?download=396c2bbf6e0c4ea1aa1292ff2f195d11", "format": "application/pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", - "id": "b84352b9f54c4f14bf296d9b79f48ebc", + "id": "ec90a6e35c674a8eafa7fe0958a50a8c", "dateModified": "2020-05-15T01:00:00+03:00" } } diff --git a/docs/source/tendering/cfaselectionua/tutorial/upload-cancellation-doc.http b/docs/source/tendering/cfaselectionua/tutorial/upload-cancellation-doc.http index 2ba97c9754..935324753d 100644 --- a/docs/source/tendering/cfaselectionua/tutorial/upload-cancellation-doc.http +++ b/docs/source/tendering/cfaselectionua/tutorial/upload-cancellation-doc.http @@ -1,4 +1,4 @@ -POST /api/2.5/tenders/6ccc95c340c94e32bcf0b8c2183e62f7/cancellations/d27961bfbbcc4d648393fddd7a24df81/documents?acc_token=794fefa6abd34c81a289161fadb1feb4 HTTP/1.0 +POST /api/2.5/tenders/6ccc95c340c94e32bcf0b8c2183e62f7/cancellations/be7b1bfcbe9a4d6abca8dd39e5e1caf3/documents?acc_token=794fefa6abd34c81a289161fadb1feb4 HTTP/1.0 Authorization: Bearer broker Content-Length: 324 Content-Type: application/json @@ -15,7 +15,7 @@ DATA: Response: 201 Created Content-Type: application/json; charset=UTF-8 -Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/6ccc95c340c94e32bcf0b8c2183e62f7/cancellations/d27961bfbbcc4d648393fddd7a24df81/documents/706eee2233914342baaa25ffce3d32db +Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/6ccc95c340c94e32bcf0b8c2183e62f7/cancellations/be7b1bfcbe9a4d6abca8dd39e5e1caf3/documents/e0a0e3e67b6243db85c6a4800eacc365 { "data": { "hash": "md5:00000000000000000000000000000000", @@ -24,7 +24,7 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/6ccc95c340c94e32 "format": "application/pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", - "id": "706eee2233914342baaa25ffce3d32db", + "id": "e0a0e3e67b6243db85c6a4800eacc365", "dateModified": "2020-05-15T01:00:00+03:00" } } diff --git a/docs/source/tendering/cfaselectionua/tutorial/upload-tender-notice.http b/docs/source/tendering/cfaselectionua/tutorial/upload-tender-notice.http index 3924da9011..2703e4701a 100644 --- a/docs/source/tendering/cfaselectionua/tutorial/upload-tender-notice.http +++ b/docs/source/tendering/cfaselectionua/tutorial/upload-tender-notice.http @@ -15,7 +15,7 @@ DATA: Response: 201 Created Content-Type: application/json; charset=UTF-8 -Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/6ccc95c340c94e32bcf0b8c2183e62f7/documents/45b3da2674bc4cabaacf6eae668ba321 +Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/6ccc95c340c94e32bcf0b8c2183e62f7/documents/e1361638f83e4a6ab2b160639b5264c8 { "data": { "hash": "md5:00000000000000000000000000000000", @@ -25,7 +25,7 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/6ccc95c340c94e32 "format": "application/pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", - "id": "45b3da2674bc4cabaacf6eae668ba321", + "id": "e1361638f83e4a6ab2b160639b5264c8", "dateModified": "2020-05-15T01:00:00+03:00" } } diff --git a/docs/source/tendering/cfaua/tutorial/activate-bidder.http b/docs/source/tendering/cfaua/tutorial/activate-bidder.http index 0b4cf658fd..caa8b96749 100644 --- a/docs/source/tendering/cfaua/tutorial/activate-bidder.http +++ b/docs/source/tendering/cfaua/tutorial/activate-bidder.http @@ -1,4 +1,4 @@ -PATCH /api/2.5/tenders/e5172ebc4c4c411f84f376ce6ede43b8/bids/410cb59a0945497eb61cc4461f661569?acc_token=7ba8d77208c04422b161882dc2c4b5c2 HTTP/1.0 +PATCH /api/2.5/tenders/e5172ebc4c4c411f84f376ce6ede43b8/bids/ccd5dc4ca3f84f9a8f9ec11010bd01ba?acc_token=7ba8d77208c04422b161882dc2c4b5c2 HTTP/1.0 Authorization: Bearer broker Content-Length: 31 Content-Type: application/json @@ -15,7 +15,6 @@ Content-Type: application/json; charset=UTF-8 { "data": { "status": "pending", - "selfEligible": true, "lotValues": [ { "relatedLot": "c7555f1bb878434d8815dea318304673", @@ -54,7 +53,7 @@ Content-Type: application/json; charset=UTF-8 } ], "date": "2020-05-15T01:00:00+03:00", - "id": "410cb59a0945497eb61cc4461f661569" + "id": "ccd5dc4ca3f84f9a8f9ec11010bd01ba" } } diff --git a/docs/source/tendering/cfaua/tutorial/active-cancellation.http b/docs/source/tendering/cfaua/tutorial/active-cancellation.http index 0a069b60a5..597a6034cd 100644 --- a/docs/source/tendering/cfaua/tutorial/active-cancellation.http +++ b/docs/source/tendering/cfaua/tutorial/active-cancellation.http @@ -1,4 +1,4 @@ -GET /api/2.5/tenders/e5172ebc4c4c411f84f376ce6ede43b8/cancellations/8d867a37ec004bee9d571231d313987b?acc_token=1e40f3cf3fd64b8ebca3076b70a86e71 HTTP/1.0 +GET /api/2.5/tenders/e5172ebc4c4c411f84f376ce6ede43b8/cancellations/f35b5fe67e064722b22ccf511efe711b?acc_token=1e40f3cf3fd64b8ebca3076b70a86e71 HTTP/1.0 Authorization: Bearer broker Host: lb-api-sandbox.prozorro.gov.ua @@ -41,7 +41,7 @@ Content-Type: application/json; charset=UTF-8 "reasonType": "unFixable", "date": "2020-05-26T01:00:02+03:00", "cancellationOf": "tender", - "id": "8d867a37ec004bee9d571231d313987b" + "id": "f35b5fe67e064722b22ccf511efe711b" } } diff --git a/docs/source/tendering/cfaua/tutorial/agreement-contract-unitprices1.http b/docs/source/tendering/cfaua/tutorial/agreement-contract-unitprices1.http index 1b293a5c48..493a3c8de6 100644 --- a/docs/source/tendering/cfaua/tutorial/agreement-contract-unitprices1.http +++ b/docs/source/tendering/cfaua/tutorial/agreement-contract-unitprices1.http @@ -11,13 +11,13 @@ DATA: "value": { "amount": 0.5 }, - "relatedItem": "c9f1001e9cf04ec9b6dba5517f0be455" + "relatedItem": "0054e405b9d64563bb0437ddf2a830f8" }, { "value": { "amount": 0.5 }, - "relatedItem": "d2921287716245e095f67d91b9ceafa6" + "relatedItem": "238443d82d0c43dab3543c1b3dd471b8" } ] } @@ -35,7 +35,7 @@ Content-Type: application/json; charset=UTF-8 "amount": 0.5, "valueAddedTaxIncluded": true }, - "relatedItem": "c9f1001e9cf04ec9b6dba5517f0be455" + "relatedItem": "0054e405b9d64563bb0437ddf2a830f8" }, { "value": { @@ -43,7 +43,7 @@ Content-Type: application/json; charset=UTF-8 "amount": 0.5, "valueAddedTaxIncluded": true }, - "relatedItem": "d2921287716245e095f67d91b9ceafa6" + "relatedItem": "238443d82d0c43dab3543c1b3dd471b8" } ], "suppliers": [ @@ -69,7 +69,7 @@ Content-Type: application/json; charset=UTF-8 } } ], - "bidID": "5a84740ed0bd4aa3830adfb56c49ed62", + "bidID": "e0d41b30b35a430fb164a63e2cd8792b", "date": "2020-05-15T01:00:00+03:00", "awardID": "58aa9c80eeb345e998dc764a75f940ee", "id": "2221451d71af4bfa803fd5b9382103ed" diff --git a/docs/source/tendering/cfaua/tutorial/agreement-contract-unitprices2.http b/docs/source/tendering/cfaua/tutorial/agreement-contract-unitprices2.http index 7f2d9b4e32..a100be6695 100644 --- a/docs/source/tendering/cfaua/tutorial/agreement-contract-unitprices2.http +++ b/docs/source/tendering/cfaua/tutorial/agreement-contract-unitprices2.http @@ -11,13 +11,13 @@ DATA: "value": { "amount": 0.5 }, - "relatedItem": "c9f1001e9cf04ec9b6dba5517f0be455" + "relatedItem": "0054e405b9d64563bb0437ddf2a830f8" }, { "value": { "amount": 0.5 }, - "relatedItem": "d2921287716245e095f67d91b9ceafa6" + "relatedItem": "238443d82d0c43dab3543c1b3dd471b8" } ] } @@ -35,7 +35,7 @@ Content-Type: application/json; charset=UTF-8 "amount": 0.5, "valueAddedTaxIncluded": true }, - "relatedItem": "c9f1001e9cf04ec9b6dba5517f0be455" + "relatedItem": "0054e405b9d64563bb0437ddf2a830f8" }, { "value": { @@ -43,7 +43,7 @@ Content-Type: application/json; charset=UTF-8 "amount": 0.5, "valueAddedTaxIncluded": true }, - "relatedItem": "d2921287716245e095f67d91b9ceafa6" + "relatedItem": "238443d82d0c43dab3543c1b3dd471b8" } ], "suppliers": [ @@ -69,7 +69,7 @@ Content-Type: application/json; charset=UTF-8 } } ], - "bidID": "e88e8fc3020640178a79c6e66d3dfd5f", + "bidID": "1c4a2dcee85343898ea5fbfd8ce2bd6e", "date": "2020-05-15T01:00:00+03:00", "awardID": "e39130af90ba485cacb7cdc36cdfc089", "id": "d5c9e2e28ee74a67a078c87bf9967a53" diff --git a/docs/source/tendering/cfaua/tutorial/agreement-contract-unitprices3.http b/docs/source/tendering/cfaua/tutorial/agreement-contract-unitprices3.http index a49a96a069..3c828868a7 100644 --- a/docs/source/tendering/cfaua/tutorial/agreement-contract-unitprices3.http +++ b/docs/source/tendering/cfaua/tutorial/agreement-contract-unitprices3.http @@ -11,13 +11,13 @@ DATA: "value": { "amount": 0.5 }, - "relatedItem": "c9f1001e9cf04ec9b6dba5517f0be455" + "relatedItem": "0054e405b9d64563bb0437ddf2a830f8" }, { "value": { "amount": 0.5 }, - "relatedItem": "d2921287716245e095f67d91b9ceafa6" + "relatedItem": "238443d82d0c43dab3543c1b3dd471b8" } ] } @@ -35,7 +35,7 @@ Content-Type: application/json; charset=UTF-8 "amount": 0.5, "valueAddedTaxIncluded": true }, - "relatedItem": "c9f1001e9cf04ec9b6dba5517f0be455" + "relatedItem": "0054e405b9d64563bb0437ddf2a830f8" }, { "value": { @@ -43,7 +43,7 @@ Content-Type: application/json; charset=UTF-8 "amount": 0.5, "valueAddedTaxIncluded": true }, - "relatedItem": "d2921287716245e095f67d91b9ceafa6" + "relatedItem": "238443d82d0c43dab3543c1b3dd471b8" } ], "suppliers": [ @@ -69,7 +69,7 @@ Content-Type: application/json; charset=UTF-8 } } ], - "bidID": "410cb59a0945497eb61cc4461f661569", + "bidID": "ccd5dc4ca3f84f9a8f9ec11010bd01ba", "date": "2020-05-15T01:00:00+03:00", "awardID": "fead43daad534c50b0dc2da8b64ccfbb", "id": "713faef521cf4366b30696f427b2f171" diff --git a/docs/source/tendering/cfaua/tutorial/agreement-contracts-list.http b/docs/source/tendering/cfaua/tutorial/agreement-contracts-list.http index 347628eabb..f7ef071877 100644 --- a/docs/source/tendering/cfaua/tutorial/agreement-contracts-list.http +++ b/docs/source/tendering/cfaua/tutorial/agreement-contracts-list.http @@ -14,14 +14,14 @@ Content-Type: application/json; charset=UTF-8 "currency": "UAH", "valueAddedTaxIncluded": true }, - "relatedItem": "c9f1001e9cf04ec9b6dba5517f0be455" + "relatedItem": "0054e405b9d64563bb0437ddf2a830f8" }, { "value": { "currency": "UAH", "valueAddedTaxIncluded": true }, - "relatedItem": "d2921287716245e095f67d91b9ceafa6" + "relatedItem": "238443d82d0c43dab3543c1b3dd471b8" } ], "suppliers": [ @@ -47,7 +47,7 @@ Content-Type: application/json; charset=UTF-8 } } ], - "bidID": "5a84740ed0bd4aa3830adfb56c49ed62", + "bidID": "e0d41b30b35a430fb164a63e2cd8792b", "date": "2020-05-15T01:00:00+03:00", "awardID": "58aa9c80eeb345e998dc764a75f940ee", "id": "2221451d71af4bfa803fd5b9382103ed" @@ -60,14 +60,14 @@ Content-Type: application/json; charset=UTF-8 "currency": "UAH", "valueAddedTaxIncluded": true }, - "relatedItem": "c9f1001e9cf04ec9b6dba5517f0be455" + "relatedItem": "0054e405b9d64563bb0437ddf2a830f8" }, { "value": { "currency": "UAH", "valueAddedTaxIncluded": true }, - "relatedItem": "d2921287716245e095f67d91b9ceafa6" + "relatedItem": "238443d82d0c43dab3543c1b3dd471b8" } ], "suppliers": [ @@ -93,7 +93,7 @@ Content-Type: application/json; charset=UTF-8 } } ], - "bidID": "e88e8fc3020640178a79c6e66d3dfd5f", + "bidID": "1c4a2dcee85343898ea5fbfd8ce2bd6e", "date": "2020-05-15T01:00:00+03:00", "awardID": "e39130af90ba485cacb7cdc36cdfc089", "id": "d5c9e2e28ee74a67a078c87bf9967a53" @@ -106,14 +106,14 @@ Content-Type: application/json; charset=UTF-8 "currency": "UAH", "valueAddedTaxIncluded": true }, - "relatedItem": "c9f1001e9cf04ec9b6dba5517f0be455" + "relatedItem": "0054e405b9d64563bb0437ddf2a830f8" }, { "value": { "currency": "UAH", "valueAddedTaxIncluded": true }, - "relatedItem": "d2921287716245e095f67d91b9ceafa6" + "relatedItem": "238443d82d0c43dab3543c1b3dd471b8" } ], "suppliers": [ @@ -139,7 +139,7 @@ Content-Type: application/json; charset=UTF-8 } } ], - "bidID": "410cb59a0945497eb61cc4461f661569", + "bidID": "ccd5dc4ca3f84f9a8f9ec11010bd01ba", "date": "2020-05-15T01:00:00+03:00", "awardID": "fead43daad534c50b0dc2da8b64ccfbb", "id": "713faef521cf4366b30696f427b2f171" diff --git a/docs/source/tendering/cfaua/tutorial/agreement-unsuccessful.http b/docs/source/tendering/cfaua/tutorial/agreement-unsuccessful.http index 51715fca2e..34d3e847b6 100644 --- a/docs/source/tendering/cfaua/tutorial/agreement-unsuccessful.http +++ b/docs/source/tendering/cfaua/tutorial/agreement-unsuccessful.http @@ -51,7 +51,7 @@ Content-Type: application/json; charset=UTF-8 "amount": 0.5, "valueAddedTaxIncluded": true }, - "relatedItem": "c9f1001e9cf04ec9b6dba5517f0be455" + "relatedItem": "0054e405b9d64563bb0437ddf2a830f8" }, { "value": { @@ -59,7 +59,7 @@ Content-Type: application/json; charset=UTF-8 "amount": 0.5, "valueAddedTaxIncluded": true }, - "relatedItem": "d2921287716245e095f67d91b9ceafa6" + "relatedItem": "238443d82d0c43dab3543c1b3dd471b8" } ], "suppliers": [ @@ -85,7 +85,7 @@ Content-Type: application/json; charset=UTF-8 } } ], - "bidID": "5a84740ed0bd4aa3830adfb56c49ed62", + "bidID": "e0d41b30b35a430fb164a63e2cd8792b", "date": "2020-05-15T01:00:00+03:00", "awardID": "58aa9c80eeb345e998dc764a75f940ee", "id": "2221451d71af4bfa803fd5b9382103ed" @@ -99,7 +99,7 @@ Content-Type: application/json; charset=UTF-8 "amount": 0.5, "valueAddedTaxIncluded": true }, - "relatedItem": "c9f1001e9cf04ec9b6dba5517f0be455" + "relatedItem": "0054e405b9d64563bb0437ddf2a830f8" }, { "value": { @@ -107,7 +107,7 @@ Content-Type: application/json; charset=UTF-8 "amount": 0.5, "valueAddedTaxIncluded": true }, - "relatedItem": "d2921287716245e095f67d91b9ceafa6" + "relatedItem": "238443d82d0c43dab3543c1b3dd471b8" } ], "suppliers": [ @@ -133,7 +133,7 @@ Content-Type: application/json; charset=UTF-8 } } ], - "bidID": "e88e8fc3020640178a79c6e66d3dfd5f", + "bidID": "1c4a2dcee85343898ea5fbfd8ce2bd6e", "date": "2020-05-15T01:00:00+03:00", "awardID": "e39130af90ba485cacb7cdc36cdfc089", "id": "d5c9e2e28ee74a67a078c87bf9967a53" @@ -147,7 +147,7 @@ Content-Type: application/json; charset=UTF-8 "amount": 0.5, "valueAddedTaxIncluded": true }, - "relatedItem": "c9f1001e9cf04ec9b6dba5517f0be455" + "relatedItem": "0054e405b9d64563bb0437ddf2a830f8" }, { "value": { @@ -155,7 +155,7 @@ Content-Type: application/json; charset=UTF-8 "amount": 0.5, "valueAddedTaxIncluded": true }, - "relatedItem": "d2921287716245e095f67d91b9ceafa6" + "relatedItem": "238443d82d0c43dab3543c1b3dd471b8" } ], "suppliers": [ @@ -181,7 +181,7 @@ Content-Type: application/json; charset=UTF-8 } } ], - "bidID": "410cb59a0945497eb61cc4461f661569", + "bidID": "ccd5dc4ca3f84f9a8f9ec11010bd01ba", "date": "2020-05-15T01:00:00+03:00", "awardID": "fead43daad534c50b0dc2da8b64ccfbb", "id": "713faef521cf4366b30696f427b2f171" @@ -215,7 +215,7 @@ Content-Type: application/json; charset=UTF-8 "startDate": "2018-06-27T13:39:09.362837+03:00", "endDate": "2018-06-30T13:39:09.362837+03:00" }, - "id": "c9f1001e9cf04ec9b6dba5517f0be455", + "id": "0054e405b9d64563bb0437ddf2a830f8", "unit": { "code": "44617100-9", "name": "item" @@ -249,7 +249,7 @@ Content-Type: application/json; charset=UTF-8 "startDate": "2018-06-27T13:39:09.362837+03:00", "endDate": "2018-06-30T13:39:09.362837+03:00" }, - "id": "d2921287716245e095f67d91b9ceafa6", + "id": "238443d82d0c43dab3543c1b3dd471b8", "unit": { "code": "44617100-8", "name": "item" diff --git a/docs/source/tendering/cfaua/tutorial/agreements-list.http b/docs/source/tendering/cfaua/tutorial/agreements-list.http index 5bb9050d14..66eccee86d 100644 --- a/docs/source/tendering/cfaua/tutorial/agreements-list.http +++ b/docs/source/tendering/cfaua/tutorial/agreements-list.http @@ -18,14 +18,14 @@ Content-Type: application/json; charset=UTF-8 "currency": "UAH", "valueAddedTaxIncluded": true }, - "relatedItem": "c9f1001e9cf04ec9b6dba5517f0be455" + "relatedItem": "0054e405b9d64563bb0437ddf2a830f8" }, { "value": { "currency": "UAH", "valueAddedTaxIncluded": true }, - "relatedItem": "d2921287716245e095f67d91b9ceafa6" + "relatedItem": "238443d82d0c43dab3543c1b3dd471b8" } ], "suppliers": [ @@ -51,7 +51,7 @@ Content-Type: application/json; charset=UTF-8 } } ], - "bidID": "5a84740ed0bd4aa3830adfb56c49ed62", + "bidID": "e0d41b30b35a430fb164a63e2cd8792b", "date": "2020-05-15T01:00:00+03:00", "awardID": "58aa9c80eeb345e998dc764a75f940ee", "id": "2221451d71af4bfa803fd5b9382103ed" @@ -64,14 +64,14 @@ Content-Type: application/json; charset=UTF-8 "currency": "UAH", "valueAddedTaxIncluded": true }, - "relatedItem": "c9f1001e9cf04ec9b6dba5517f0be455" + "relatedItem": "0054e405b9d64563bb0437ddf2a830f8" }, { "value": { "currency": "UAH", "valueAddedTaxIncluded": true }, - "relatedItem": "d2921287716245e095f67d91b9ceafa6" + "relatedItem": "238443d82d0c43dab3543c1b3dd471b8" } ], "suppliers": [ @@ -97,7 +97,7 @@ Content-Type: application/json; charset=UTF-8 } } ], - "bidID": "e88e8fc3020640178a79c6e66d3dfd5f", + "bidID": "1c4a2dcee85343898ea5fbfd8ce2bd6e", "date": "2020-05-15T01:00:00+03:00", "awardID": "e39130af90ba485cacb7cdc36cdfc089", "id": "d5c9e2e28ee74a67a078c87bf9967a53" @@ -110,14 +110,14 @@ Content-Type: application/json; charset=UTF-8 "currency": "UAH", "valueAddedTaxIncluded": true }, - "relatedItem": "c9f1001e9cf04ec9b6dba5517f0be455" + "relatedItem": "0054e405b9d64563bb0437ddf2a830f8" }, { "value": { "currency": "UAH", "valueAddedTaxIncluded": true }, - "relatedItem": "d2921287716245e095f67d91b9ceafa6" + "relatedItem": "238443d82d0c43dab3543c1b3dd471b8" } ], "suppliers": [ @@ -143,7 +143,7 @@ Content-Type: application/json; charset=UTF-8 } } ], - "bidID": "410cb59a0945497eb61cc4461f661569", + "bidID": "ccd5dc4ca3f84f9a8f9ec11010bd01ba", "date": "2020-05-15T01:00:00+03:00", "awardID": "fead43daad534c50b0dc2da8b64ccfbb", "id": "713faef521cf4366b30696f427b2f171" @@ -177,7 +177,7 @@ Content-Type: application/json; charset=UTF-8 "startDate": "2018-06-27T13:39:09.362837+03:00", "endDate": "2018-06-30T13:39:09.362837+03:00" }, - "id": "c9f1001e9cf04ec9b6dba5517f0be455", + "id": "0054e405b9d64563bb0437ddf2a830f8", "unit": { "code": "44617100-9", "name": "item" @@ -211,7 +211,7 @@ Content-Type: application/json; charset=UTF-8 "startDate": "2018-06-27T13:39:09.362837+03:00", "endDate": "2018-06-30T13:39:09.362837+03:00" }, - "id": "d2921287716245e095f67d91b9ceafa6", + "id": "238443d82d0c43dab3543c1b3dd471b8", "unit": { "code": "44617100-8", "name": "item" diff --git a/docs/source/tendering/cfaua/tutorial/answer-question.http b/docs/source/tendering/cfaua/tutorial/answer-question.http index 7b9d506912..703d128236 100644 --- a/docs/source/tendering/cfaua/tutorial/answer-question.http +++ b/docs/source/tendering/cfaua/tutorial/answer-question.http @@ -1,4 +1,4 @@ -PATCH /api/2.5/tenders/e5172ebc4c4c411f84f376ce6ede43b8/questions/efba5567d08848afae0ebb78272aed79?acc_token=1e40f3cf3fd64b8ebca3076b70a86e71 HTTP/1.0 +PATCH /api/2.5/tenders/e5172ebc4c4c411f84f376ce6ede43b8/questions/815205150bf34d0c88019bd165a1a986?acc_token=1e40f3cf3fd64b8ebca3076b70a86e71 HTTP/1.0 Authorization: Bearer broker Content-Length: 162 Content-Type: application/json @@ -19,7 +19,7 @@ Content-Type: application/json; charset=UTF-8 "title": "Калорійність", "date": "2020-05-15T01:00:00+03:00", "answer": "Таблицю додано в файлі \"Kalorijnist.xslx\"", - "id": "efba5567d08848afae0ebb78272aed79", + "id": "815205150bf34d0c88019bd165a1a986", "questionOf": "tender" } } diff --git a/docs/source/tendering/cfaua/tutorial/approve-qualification1.http b/docs/source/tendering/cfaua/tutorial/approve-qualification1.http index f63af46a2b..2189250408 100644 --- a/docs/source/tendering/cfaua/tutorial/approve-qualification1.http +++ b/docs/source/tendering/cfaua/tutorial/approve-qualification1.http @@ -20,7 +20,7 @@ Content-Type: application/json; charset=UTF-8 "lotID": "c7555f1bb878434d8815dea318304673", "eligible": true, "qualified": true, - "bidID": "410cb59a0945497eb61cc4461f661569", + "bidID": "ccd5dc4ca3f84f9a8f9ec11010bd01ba", "date": "2020-05-15T01:00:00+03:00", "id": "9eafb5e0a5ac4268a1f0821a11dae69d" } diff --git a/docs/source/tendering/cfaua/tutorial/approve-qualification2.http b/docs/source/tendering/cfaua/tutorial/approve-qualification2.http index 52ae5a9e90..9e2469e6e1 100644 --- a/docs/source/tendering/cfaua/tutorial/approve-qualification2.http +++ b/docs/source/tendering/cfaua/tutorial/approve-qualification2.http @@ -20,7 +20,7 @@ Content-Type: application/json; charset=UTF-8 "lotID": "c7555f1bb878434d8815dea318304673", "eligible": true, "qualified": true, - "bidID": "e88e8fc3020640178a79c6e66d3dfd5f", + "bidID": "1c4a2dcee85343898ea5fbfd8ce2bd6e", "date": "2020-05-15T01:00:00+03:00", "id": "86fd0e3cd41f48eab89c5ac406b8334d" } diff --git a/docs/source/tendering/cfaua/tutorial/approve-qualification4.http b/docs/source/tendering/cfaua/tutorial/approve-qualification4.http index 5b25a5bc1e..9c44a1beba 100644 --- a/docs/source/tendering/cfaua/tutorial/approve-qualification4.http +++ b/docs/source/tendering/cfaua/tutorial/approve-qualification4.http @@ -20,7 +20,7 @@ Content-Type: application/json; charset=UTF-8 "lotID": "c7555f1bb878434d8815dea318304673", "eligible": true, "qualified": true, - "bidID": "5a84740ed0bd4aa3830adfb56c49ed62", + "bidID": "e0d41b30b35a430fb164a63e2cd8792b", "date": "2020-05-15T01:00:00+03:00", "id": "cdc3670ed483448a8cd1ed6d1146da99" } diff --git a/docs/source/tendering/cfaua/tutorial/ask-question.http b/docs/source/tendering/cfaua/tutorial/ask-question.http index 02593d4c61..53dc1e7de4 100644 --- a/docs/source/tendering/cfaua/tutorial/ask-question.http +++ b/docs/source/tendering/cfaua/tutorial/ask-question.http @@ -33,7 +33,7 @@ DATA: Response: 201 Created Content-Type: application/json; charset=UTF-8 -Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/e5172ebc4c4c411f84f376ce6ede43b8/questions/efba5567d08848afae0ebb78272aed79 +Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/e5172ebc4c4c411f84f376ce6ede43b8/questions/815205150bf34d0c88019bd165a1a986 { "data": { "description": "Просимо додати таблицю потрібної калорійності харчування", @@ -59,7 +59,7 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/e5172ebc4c4c411f }, "title": "Калорійність", "date": "2020-05-15T01:00:00+03:00", - "id": "efba5567d08848afae0ebb78272aed79", + "id": "815205150bf34d0c88019bd165a1a986", "questionOf": "tender" } } diff --git a/docs/source/tendering/cfaua/tutorial/auction-url.http b/docs/source/tendering/cfaua/tutorial/auction-url.http index 4948aa4658..9f685036ff 100644 --- a/docs/source/tendering/cfaua/tutorial/auction-url.http +++ b/docs/source/tendering/cfaua/tutorial/auction-url.http @@ -16,7 +16,7 @@ Content-Type: application/json; charset=UTF-8 "enquiryPeriod": { "startDate": "2020-04-04T01:00:00+03:00", "clarificationsUntil": "2020-04-30T00:00:00+03:00", - "endDate": "2020-04-25T01:00:00+03:00", + "endDate": "2020-04-25T00:00:00+03:00", "invalidationDate": "2020-05-15T01:00:00+03:00" }, "submissionMethod": "electronicAuction", @@ -52,7 +52,7 @@ Content-Type: application/json; charset=UTF-8 "title": "Калорійність", "date": "2020-05-15T01:00:00+03:00", "answer": "Таблицю додано в файлі \"Kalorijnist.xslx\"", - "id": "efba5567d08848afae0ebb78272aed79", + "id": "815205150bf34d0c88019bd165a1a986", "questionOf": "tender" } ], @@ -150,7 +150,7 @@ Content-Type: application/json; charset=UTF-8 "lotID": "c7555f1bb878434d8815dea318304673", "eligible": true, "qualified": true, - "bidID": "410cb59a0945497eb61cc4461f661569", + "bidID": "ccd5dc4ca3f84f9a8f9ec11010bd01ba", "date": "2020-05-15T01:00:00+03:00", "id": "9eafb5e0a5ac4268a1f0821a11dae69d" }, @@ -159,7 +159,7 @@ Content-Type: application/json; charset=UTF-8 "lotID": "c7555f1bb878434d8815dea318304673", "eligible": true, "qualified": true, - "bidID": "e88e8fc3020640178a79c6e66d3dfd5f", + "bidID": "1c4a2dcee85343898ea5fbfd8ce2bd6e", "date": "2020-05-15T01:00:00+03:00", "id": "86fd0e3cd41f48eab89c5ac406b8334d" }, @@ -168,7 +168,7 @@ Content-Type: application/json; charset=UTF-8 "lotID": "c7555f1bb878434d8815dea318304673", "eligible": false, "qualified": false, - "bidID": "88c9f41eac914e1cb72d9a43fc03d702", + "bidID": "76ccebf7a163452886a6d2d8d39a564b", "date": "2020-05-15T01:00:00+03:00", "id": "cb68d0f3a8c4468d9b7c5595eb8f9001" }, @@ -177,7 +177,7 @@ Content-Type: application/json; charset=UTF-8 "lotID": "c7555f1bb878434d8815dea318304673", "eligible": true, "qualified": true, - "bidID": "5a84740ed0bd4aa3830adfb56c49ed62", + "bidID": "e0d41b30b35a430fb164a63e2cd8792b", "date": "2020-05-15T01:00:00+03:00", "id": "cdc3670ed483448a8cd1ed6d1146da99" } @@ -233,7 +233,7 @@ Content-Type: application/json; charset=UTF-8 "startDate": "2018-06-27T13:39:09.362837+03:00", "endDate": "2018-06-30T13:39:09.362837+03:00" }, - "id": "c9f1001e9cf04ec9b6dba5517f0be455", + "id": "0054e405b9d64563bb0437ddf2a830f8", "unit": { "code": "44617100-9", "name": "item" @@ -267,7 +267,7 @@ Content-Type: application/json; charset=UTF-8 "startDate": "2018-06-27T13:39:09.362837+03:00", "endDate": "2018-06-30T13:39:09.362837+03:00" }, - "id": "d2921287716245e095f67d91b9ceafa6", + "id": "238443d82d0c43dab3543c1b3dd471b8", "unit": { "code": "44617100-8", "name": "item" @@ -327,7 +327,7 @@ Content-Type: application/json; charset=UTF-8 } } ], - "id": "410cb59a0945497eb61cc4461f661569", + "id": "ccd5dc4ca3f84f9a8f9ec11010bd01ba", "eligibilityDocuments": [ { "hash": "md5:00000000000000000000000000000000", @@ -345,7 +345,7 @@ Content-Type: application/json; charset=UTF-8 }, { "status": "active", - "id": "e88e8fc3020640178a79c6e66d3dfd5f", + "id": "1c4a2dcee85343898ea5fbfd8ce2bd6e", "tenderers": [ { "contactPoint": { @@ -382,7 +382,7 @@ Content-Type: application/json; charset=UTF-8 "format": "application/pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", - "id": "5d9147ed06d348d69adf62875b7bd89b", + "id": "2461364d2bef400580101b81b63f6b18", "dateModified": "2020-05-15T01:00:00+03:00" }, { @@ -395,7 +395,7 @@ Content-Type: application/json; charset=UTF-8 "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", "dateModified": "2020-05-15T01:00:00+03:00", - "id": "3f355e7a0b8646389ad0af8eef0e241b" + "id": "eb48db1664f34859b5f5dbc8253dd747" } ], "eligibilityDocuments": [ @@ -408,12 +408,11 @@ Content-Type: application/json; charset=UTF-8 "format": "application/pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", - "id": "474da502332f48a0a117f28b44e21dde", + "id": "4bfdcd78d6c34992a2dd9e52cbcc4e25", "dateModified": "2020-05-15T01:00:00+03:00" } ], - "selfEligible": true, - "selfQualified": true, + "id": "76ccebf7a163452886a6d2d8d39a564b", "tenderers": [ { "contactPoint": { @@ -437,7 +436,7 @@ Content-Type: application/json; charset=UTF-8 } } ], - "id": "88c9f41eac914e1cb72d9a43fc03d702" + "selfQualified": true }, { "status": "active", @@ -451,7 +450,7 @@ Content-Type: application/json; charset=UTF-8 "format": "application/pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", - "id": "63630c59ee2e456bb92e2d0bd8c7a717", + "id": "76385a93b70747b9a07b493fd542e5cb", "dateModified": "2020-05-15T01:00:00+03:00" }, { @@ -464,7 +463,7 @@ Content-Type: application/json; charset=UTF-8 "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", "dateModified": "2020-05-15T01:00:00+03:00", - "id": "44ff1578915a4ba48350bc0a1054b65c" + "id": "80a0f2685fff4cca98aa482618a1deb0" } ], "tenderers": [ @@ -490,7 +489,7 @@ Content-Type: application/json; charset=UTF-8 } } ], - "id": "5a84740ed0bd4aa3830adfb56c49ed62", + "id": "e0d41b30b35a430fb164a63e2cd8792b", "eligibilityDocuments": [ { "hash": "md5:00000000000000000000000000000000", @@ -501,7 +500,7 @@ Content-Type: application/json; charset=UTF-8 "format": "application/pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", - "id": "28e17374e98c4f408038fb6c06f3dcc6", + "id": "1e4758fc996f43d482ccd4421009ed0a", "dateModified": "2020-05-15T01:00:00+03:00" } ] diff --git a/docs/source/tendering/cfaua/tutorial/bidder-activate-after-changing-tender.http b/docs/source/tendering/cfaua/tutorial/bidder-activate-after-changing-tender.http index d3eb2630a4..10b1bb2522 100644 --- a/docs/source/tendering/cfaua/tutorial/bidder-activate-after-changing-tender.http +++ b/docs/source/tendering/cfaua/tutorial/bidder-activate-after-changing-tender.http @@ -1,4 +1,4 @@ -PATCH /api/2.5/tenders/e5172ebc4c4c411f84f376ce6ede43b8/bids/410cb59a0945497eb61cc4461f661569?acc_token=7ba8d77208c04422b161882dc2c4b5c2 HTTP/1.0 +PATCH /api/2.5/tenders/e5172ebc4c4c411f84f376ce6ede43b8/bids/ccd5dc4ca3f84f9a8f9ec11010bd01ba?acc_token=7ba8d77208c04422b161882dc2c4b5c2 HTTP/1.0 Authorization: Bearer broker Content-Length: 31 Content-Type: application/json @@ -21,7 +21,7 @@ Content-Type: application/json; charset=UTF-8 "confidentiality": "public", "language": "uk", "title": "Proposal.pdf", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/e5172ebc4c4c411f84f376ce6ede43b8/bids/410cb59a0945497eb61cc4461f661569/documents/eb68a5d3295e47e2941c983ac17b2fb4?download=fe2f4bf832ea4f7fb2297473766f749b", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/e5172ebc4c4c411f84f376ce6ede43b8/bids/ccd5dc4ca3f84f9a8f9ec11010bd01ba/documents/eb68a5d3295e47e2941c983ac17b2fb4?download=fe2f4bf832ea4f7fb2297473766f749b", "format": "application/pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", @@ -33,7 +33,7 @@ Content-Type: application/json; charset=UTF-8 "confidentiality": "buyerOnly", "language": "uk", "format": "application/pdf", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/e5172ebc4c4c411f84f376ce6ede43b8/bids/410cb59a0945497eb61cc4461f661569/documents/181271c244124b6ba014c2833d0a8c9e?download=462ce1c4b3c14bc68e1aa30e4abc6560", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/e5172ebc4c4c411f84f376ce6ede43b8/bids/ccd5dc4ca3f84f9a8f9ec11010bd01ba/documents/181271c244124b6ba014c2833d0a8c9e?download=462ce1c4b3c14bc68e1aa30e4abc6560", "confidentialityRationale": "Only our company sells badgers with pink hair.", "title": "Proposal_top_secrets.pdf", "documentOf": "tender", @@ -48,7 +48,7 @@ Content-Type: application/json; charset=UTF-8 "confidentiality": "public", "language": "uk", "title": "eligibility_doc.pdf", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/e5172ebc4c4c411f84f376ce6ede43b8/bids/410cb59a0945497eb61cc4461f661569/eligibility_documents/dd2433e3b6734869b0297de6ee3e2df8?download=b4b5be95835a45cca55f81ad8479d8f5", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/e5172ebc4c4c411f84f376ce6ede43b8/bids/ccd5dc4ca3f84f9a8f9ec11010bd01ba/eligibility_documents/dd2433e3b6734869b0297de6ee3e2df8?download=b4b5be95835a45cca55f81ad8479d8f5", "format": "application/pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", @@ -56,8 +56,7 @@ Content-Type: application/json; charset=UTF-8 "dateModified": "2020-05-15T01:00:00+03:00" } ], - "selfEligible": true, - "id": "410cb59a0945497eb61cc4461f661569", + "id": "ccd5dc4ca3f84f9a8f9ec11010bd01ba", "lotValues": [ { "relatedLot": "c7555f1bb878434d8815dea318304673", @@ -70,14 +69,39 @@ Content-Type: application/json; charset=UTF-8 } } ], - "selfQualified": true, + "qualificationDocuments": [ + { + "hash": "md5:00000000000000000000000000000000", + "confidentiality": "public", + "language": "uk", + "title": "qualification_document.pdf", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/e5172ebc4c4c411f84f376ce6ede43b8/bids/ccd5dc4ca3f84f9a8f9ec11010bd01ba/qualification_documents/911a8244866f4ffdbd2b2a202d34043c?download=fc6b13177ef949699443525662a19388", + "format": "application/pdf", + "documentOf": "tender", + "datePublished": "2020-05-15T01:00:00+03:00", + "id": "911a8244866f4ffdbd2b2a202d34043c", + "dateModified": "2020-05-15T01:00:00+03:00" + }, + { + "hash": "md5:00000000000000000000000000000000", + "confidentiality": "public", + "language": "uk", + "title": "qualification_document2.pdf", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/e5172ebc4c4c411f84f376ce6ede43b8/bids/ccd5dc4ca3f84f9a8f9ec11010bd01ba/qualification_documents/911a8244866f4ffdbd2b2a202d34043c?download=03ec7a79367644d0b9d45ec78b8a35c2", + "format": "application/pdf", + "documentOf": "tender", + "datePublished": "2020-05-15T01:00:00+03:00", + "id": "911a8244866f4ffdbd2b2a202d34043c", + "dateModified": "2020-05-15T01:00:00+03:00" + } + ], "financialDocuments": [ { "hash": "md5:00000000000000000000000000000000", "confidentiality": "public", "language": "uk", "title": "financial_doc.pdf", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/e5172ebc4c4c411f84f376ce6ede43b8/bids/410cb59a0945497eb61cc4461f661569/financial_documents/7ee1271306dc4c19befc8c2f5868c34a?download=2f8852ebe331410c908fecb00de667a4", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/e5172ebc4c4c411f84f376ce6ede43b8/bids/ccd5dc4ca3f84f9a8f9ec11010bd01ba/financial_documents/7ee1271306dc4c19befc8c2f5868c34a?download=2f8852ebe331410c908fecb00de667a4", "format": "application/pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", @@ -89,7 +113,7 @@ Content-Type: application/json; charset=UTF-8 "confidentiality": "public", "language": "uk", "title": "financial_doc2.pdf", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/e5172ebc4c4c411f84f376ce6ede43b8/bids/410cb59a0945497eb61cc4461f661569/financial_documents/4566fae4373e41588527c5a6ea6c4408?download=d7f6eb2a77d04872b0778dd876645d75", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/e5172ebc4c4c411f84f376ce6ede43b8/bids/ccd5dc4ca3f84f9a8f9ec11010bd01ba/financial_documents/4566fae4373e41588527c5a6ea6c4408?download=d7f6eb2a77d04872b0778dd876645d75", "format": "application/pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", @@ -122,32 +146,7 @@ Content-Type: application/json; charset=UTF-8 ], "date": "2020-05-15T01:00:00+03:00", "subcontractingDetails": "ДКП «Орфей», Україна", - "qualificationDocuments": [ - { - "hash": "md5:00000000000000000000000000000000", - "confidentiality": "public", - "language": "uk", - "title": "qualification_document.pdf", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/e5172ebc4c4c411f84f376ce6ede43b8/bids/410cb59a0945497eb61cc4461f661569/qualification_documents/911a8244866f4ffdbd2b2a202d34043c?download=fc6b13177ef949699443525662a19388", - "format": "application/pdf", - "documentOf": "tender", - "datePublished": "2020-05-15T01:00:00+03:00", - "id": "911a8244866f4ffdbd2b2a202d34043c", - "dateModified": "2020-05-15T01:00:00+03:00" - }, - { - "hash": "md5:00000000000000000000000000000000", - "confidentiality": "public", - "language": "uk", - "title": "qualification_document2.pdf", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/e5172ebc4c4c411f84f376ce6ede43b8/bids/410cb59a0945497eb61cc4461f661569/qualification_documents/911a8244866f4ffdbd2b2a202d34043c?download=03ec7a79367644d0b9d45ec78b8a35c2", - "format": "application/pdf", - "documentOf": "tender", - "datePublished": "2020-05-15T01:00:00+03:00", - "id": "911a8244866f4ffdbd2b2a202d34043c", - "dateModified": "2020-05-15T01:00:00+03:00" - } - ] + "selfQualified": true } } diff --git a/docs/source/tendering/cfaua/tutorial/bidder-after-changing-tender.http b/docs/source/tendering/cfaua/tutorial/bidder-after-changing-tender.http index 8856f20600..e0cf617458 100644 --- a/docs/source/tendering/cfaua/tutorial/bidder-after-changing-tender.http +++ b/docs/source/tendering/cfaua/tutorial/bidder-after-changing-tender.http @@ -1,4 +1,4 @@ -GET /api/2.5/tenders/e5172ebc4c4c411f84f376ce6ede43b8/bids/410cb59a0945497eb61cc4461f661569?acc_token=7ba8d77208c04422b161882dc2c4b5c2 HTTP/1.0 +GET /api/2.5/tenders/e5172ebc4c4c411f84f376ce6ede43b8/bids/ccd5dc4ca3f84f9a8f9ec11010bd01ba?acc_token=7ba8d77208c04422b161882dc2c4b5c2 HTTP/1.0 Authorization: Bearer broker Host: lb-api-sandbox.prozorro.gov.ua @@ -7,7 +7,7 @@ Content-Type: application/json; charset=UTF-8 { "data": { "status": "invalid", - "id": "410cb59a0945497eb61cc4461f661569" + "id": "ccd5dc4ca3f84f9a8f9ec11010bd01ba" } } diff --git a/docs/source/tendering/cfaua/tutorial/bidder-documents.http b/docs/source/tendering/cfaua/tutorial/bidder-documents.http index 4046bd0b10..36872ceb2f 100644 --- a/docs/source/tendering/cfaua/tutorial/bidder-documents.http +++ b/docs/source/tendering/cfaua/tutorial/bidder-documents.http @@ -1,4 +1,4 @@ -GET /api/2.5/tenders/e5172ebc4c4c411f84f376ce6ede43b8/bids/410cb59a0945497eb61cc4461f661569/documents?acc_token=7ba8d77208c04422b161882dc2c4b5c2 HTTP/1.0 +GET /api/2.5/tenders/e5172ebc4c4c411f84f376ce6ede43b8/bids/ccd5dc4ca3f84f9a8f9ec11010bd01ba/documents?acc_token=7ba8d77208c04422b161882dc2c4b5c2 HTTP/1.0 Authorization: Bearer broker Host: lb-api-sandbox.prozorro.gov.ua @@ -11,7 +11,7 @@ Content-Type: application/json; charset=UTF-8 "confidentiality": "public", "language": "uk", "title": "Proposal.pdf", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/e5172ebc4c4c411f84f376ce6ede43b8/bids/410cb59a0945497eb61cc4461f661569/documents/eb68a5d3295e47e2941c983ac17b2fb4?download=fe2f4bf832ea4f7fb2297473766f749b", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/e5172ebc4c4c411f84f376ce6ede43b8/bids/ccd5dc4ca3f84f9a8f9ec11010bd01ba/documents/eb68a5d3295e47e2941c983ac17b2fb4?download=fe2f4bf832ea4f7fb2297473766f749b", "format": "application/pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", @@ -23,7 +23,7 @@ Content-Type: application/json; charset=UTF-8 "confidentiality": "buyerOnly", "language": "uk", "format": "application/pdf", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/e5172ebc4c4c411f84f376ce6ede43b8/bids/410cb59a0945497eb61cc4461f661569/documents/181271c244124b6ba014c2833d0a8c9e?download=462ce1c4b3c14bc68e1aa30e4abc6560", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/e5172ebc4c4c411f84f376ce6ede43b8/bids/ccd5dc4ca3f84f9a8f9ec11010bd01ba/documents/181271c244124b6ba014c2833d0a8c9e?download=462ce1c4b3c14bc68e1aa30e4abc6560", "confidentialityRationale": "Only our company sells badgers with pink hair.", "title": "Proposal_top_secrets.pdf", "documentOf": "tender", diff --git a/docs/source/tendering/cfaua/tutorial/bidder-financial-documents.http b/docs/source/tendering/cfaua/tutorial/bidder-financial-documents.http index e889613529..3969ba089b 100644 --- a/docs/source/tendering/cfaua/tutorial/bidder-financial-documents.http +++ b/docs/source/tendering/cfaua/tutorial/bidder-financial-documents.http @@ -1,4 +1,4 @@ -GET /api/2.5/tenders/e5172ebc4c4c411f84f376ce6ede43b8/bids/410cb59a0945497eb61cc4461f661569/financial_documents?acc_token=7ba8d77208c04422b161882dc2c4b5c2 HTTP/1.0 +GET /api/2.5/tenders/e5172ebc4c4c411f84f376ce6ede43b8/bids/ccd5dc4ca3f84f9a8f9ec11010bd01ba/financial_documents?acc_token=7ba8d77208c04422b161882dc2c4b5c2 HTTP/1.0 Authorization: Bearer broker Host: lb-api-sandbox.prozorro.gov.ua @@ -11,7 +11,7 @@ Content-Type: application/json; charset=UTF-8 "confidentiality": "public", "language": "uk", "title": "financial_doc.pdf", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/e5172ebc4c4c411f84f376ce6ede43b8/bids/410cb59a0945497eb61cc4461f661569/financial_documents/7ee1271306dc4c19befc8c2f5868c34a?download=2f8852ebe331410c908fecb00de667a4", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/e5172ebc4c4c411f84f376ce6ede43b8/bids/ccd5dc4ca3f84f9a8f9ec11010bd01ba/financial_documents/7ee1271306dc4c19befc8c2f5868c34a?download=2f8852ebe331410c908fecb00de667a4", "format": "application/pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", @@ -23,7 +23,7 @@ Content-Type: application/json; charset=UTF-8 "confidentiality": "public", "language": "uk", "title": "financial_doc2.pdf", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/e5172ebc4c4c411f84f376ce6ede43b8/bids/410cb59a0945497eb61cc4461f661569/financial_documents/4566fae4373e41588527c5a6ea6c4408?download=d7f6eb2a77d04872b0778dd876645d75", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/e5172ebc4c4c411f84f376ce6ede43b8/bids/ccd5dc4ca3f84f9a8f9ec11010bd01ba/financial_documents/4566fae4373e41588527c5a6ea6c4408?download=d7f6eb2a77d04872b0778dd876645d75", "format": "application/pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", diff --git a/docs/source/tendering/cfaua/tutorial/bidder-participation-url.http b/docs/source/tendering/cfaua/tutorial/bidder-participation-url.http index c5f3d37f56..9ebac9476f 100644 --- a/docs/source/tendering/cfaua/tutorial/bidder-participation-url.http +++ b/docs/source/tendering/cfaua/tutorial/bidder-participation-url.http @@ -1,4 +1,4 @@ -GET /api/2.5/tenders/e5172ebc4c4c411f84f376ce6ede43b8/bids/410cb59a0945497eb61cc4461f661569?acc_token=7ba8d77208c04422b161882dc2c4b5c2 HTTP/1.0 +GET /api/2.5/tenders/e5172ebc4c4c411f84f376ce6ede43b8/bids/ccd5dc4ca3f84f9a8f9ec11010bd01ba?acc_token=7ba8d77208c04422b161882dc2c4b5c2 HTTP/1.0 Authorization: Bearer broker Host: lb-api-sandbox.prozorro.gov.ua @@ -25,7 +25,7 @@ Content-Type: application/json; charset=UTF-8 "confidentiality": "buyerOnly", "language": "uk", "format": "application/pdf", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/e5172ebc4c4c411f84f376ce6ede43b8/bids/410cb59a0945497eb61cc4461f661569/documents/181271c244124b6ba014c2833d0a8c9e?download=462ce1c4b3c14bc68e1aa30e4abc6560", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/e5172ebc4c4c411f84f376ce6ede43b8/bids/ccd5dc4ca3f84f9a8f9ec11010bd01ba/documents/181271c244124b6ba014c2833d0a8c9e?download=462ce1c4b3c14bc68e1aa30e4abc6560", "confidentialityRationale": "Only our company sells badgers with pink hair.", "title": "Proposal_top_secrets.pdf", "documentOf": "tender", @@ -48,14 +48,13 @@ Content-Type: application/json; charset=UTF-8 "dateModified": "2020-05-15T01:00:00+03:00" } ], - "selfEligible": true, - "id": "410cb59a0945497eb61cc4461f661569", + "id": "ccd5dc4ca3f84f9a8f9ec11010bd01ba", "lotValues": [ { "relatedLot": "c7555f1bb878434d8815dea318304673", "date": "2020-05-15T01:00:00+03:00", "status": "active", - "participationUrl": "http://auction-sandbox.prozorro.gov.ua/tenders/e5172ebc4c4c411f84f376ce6ede43b8_c7555f1bb878434d8815dea318304673?key_for_bid=410cb59a0945497eb61cc4461f661569", + "participationUrl": "http://auction-sandbox.prozorro.gov.ua/tenders/e5172ebc4c4c411f84f376ce6ede43b8_c7555f1bb878434d8815dea318304673?key_for_bid=ccd5dc4ca3f84f9a8f9ec11010bd01ba", "value": { "currency": "UAH", "amount": 500.0, @@ -63,14 +62,39 @@ Content-Type: application/json; charset=UTF-8 } } ], - "selfQualified": true, + "qualificationDocuments": [ + { + "hash": "md5:00000000000000000000000000000000", + "confidentiality": "public", + "language": "uk", + "title": "qualification_document.pdf", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/e5172ebc4c4c411f84f376ce6ede43b8/bids/ccd5dc4ca3f84f9a8f9ec11010bd01ba/qualification_documents/911a8244866f4ffdbd2b2a202d34043c?download=fc6b13177ef949699443525662a19388", + "format": "application/pdf", + "documentOf": "tender", + "datePublished": "2020-05-15T01:00:00+03:00", + "id": "911a8244866f4ffdbd2b2a202d34043c", + "dateModified": "2020-05-15T01:00:00+03:00" + }, + { + "hash": "md5:00000000000000000000000000000000", + "confidentiality": "public", + "language": "uk", + "title": "qualification_document2.pdf", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/e5172ebc4c4c411f84f376ce6ede43b8/bids/ccd5dc4ca3f84f9a8f9ec11010bd01ba/qualification_documents/911a8244866f4ffdbd2b2a202d34043c?download=03ec7a79367644d0b9d45ec78b8a35c2", + "format": "application/pdf", + "documentOf": "tender", + "datePublished": "2020-05-15T01:00:00+03:00", + "id": "911a8244866f4ffdbd2b2a202d34043c", + "dateModified": "2020-05-15T01:00:00+03:00" + } + ], "financialDocuments": [ { "hash": "md5:00000000000000000000000000000000", "confidentiality": "public", "language": "uk", "title": "financial_doc.pdf", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/e5172ebc4c4c411f84f376ce6ede43b8/bids/410cb59a0945497eb61cc4461f661569/financial_documents/7ee1271306dc4c19befc8c2f5868c34a?download=2f8852ebe331410c908fecb00de667a4", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/e5172ebc4c4c411f84f376ce6ede43b8/bids/ccd5dc4ca3f84f9a8f9ec11010bd01ba/financial_documents/7ee1271306dc4c19befc8c2f5868c34a?download=2f8852ebe331410c908fecb00de667a4", "format": "application/pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", @@ -82,7 +106,7 @@ Content-Type: application/json; charset=UTF-8 "confidentiality": "public", "language": "uk", "title": "financial_doc2.pdf", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/e5172ebc4c4c411f84f376ce6ede43b8/bids/410cb59a0945497eb61cc4461f661569/financial_documents/4566fae4373e41588527c5a6ea6c4408?download=d7f6eb2a77d04872b0778dd876645d75", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/e5172ebc4c4c411f84f376ce6ede43b8/bids/ccd5dc4ca3f84f9a8f9ec11010bd01ba/financial_documents/4566fae4373e41588527c5a6ea6c4408?download=d7f6eb2a77d04872b0778dd876645d75", "format": "application/pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", @@ -115,32 +139,7 @@ Content-Type: application/json; charset=UTF-8 ], "date": "2020-05-15T01:00:00+03:00", "subcontractingDetails": "ДКП «Орфей», Україна", - "qualificationDocuments": [ - { - "hash": "md5:00000000000000000000000000000000", - "confidentiality": "public", - "language": "uk", - "title": "qualification_document.pdf", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/e5172ebc4c4c411f84f376ce6ede43b8/bids/410cb59a0945497eb61cc4461f661569/qualification_documents/911a8244866f4ffdbd2b2a202d34043c?download=fc6b13177ef949699443525662a19388", - "format": "application/pdf", - "documentOf": "tender", - "datePublished": "2020-05-15T01:00:00+03:00", - "id": "911a8244866f4ffdbd2b2a202d34043c", - "dateModified": "2020-05-15T01:00:00+03:00" - }, - { - "hash": "md5:00000000000000000000000000000000", - "confidentiality": "public", - "language": "uk", - "title": "qualification_document2.pdf", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/e5172ebc4c4c411f84f376ce6ede43b8/bids/410cb59a0945497eb61cc4461f661569/qualification_documents/911a8244866f4ffdbd2b2a202d34043c?download=03ec7a79367644d0b9d45ec78b8a35c2", - "format": "application/pdf", - "documentOf": "tender", - "datePublished": "2020-05-15T01:00:00+03:00", - "id": "911a8244866f4ffdbd2b2a202d34043c", - "dateModified": "2020-05-15T01:00:00+03:00" - } - ] + "selfQualified": true } } diff --git a/docs/source/tendering/cfaua/tutorial/bidder-view-financial-documents.http b/docs/source/tendering/cfaua/tutorial/bidder-view-financial-documents.http index 434f9c9ba8..9bb1624ec3 100644 --- a/docs/source/tendering/cfaua/tutorial/bidder-view-financial-documents.http +++ b/docs/source/tendering/cfaua/tutorial/bidder-view-financial-documents.http @@ -1,4 +1,4 @@ -GET /api/2.5/tenders/e5172ebc4c4c411f84f376ce6ede43b8/bids/410cb59a0945497eb61cc4461f661569?acc_token=7ba8d77208c04422b161882dc2c4b5c2 HTTP/1.0 +GET /api/2.5/tenders/e5172ebc4c4c411f84f376ce6ede43b8/bids/ccd5dc4ca3f84f9a8f9ec11010bd01ba?acc_token=7ba8d77208c04422b161882dc2c4b5c2 HTTP/1.0 Authorization: Bearer broker Host: lb-api-sandbox.prozorro.gov.ua @@ -13,7 +13,7 @@ Content-Type: application/json; charset=UTF-8 "confidentiality": "public", "language": "uk", "title": "Proposal.pdf", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/e5172ebc4c4c411f84f376ce6ede43b8/bids/410cb59a0945497eb61cc4461f661569/documents/eb68a5d3295e47e2941c983ac17b2fb4?download=fe2f4bf832ea4f7fb2297473766f749b", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/e5172ebc4c4c411f84f376ce6ede43b8/bids/ccd5dc4ca3f84f9a8f9ec11010bd01ba/documents/eb68a5d3295e47e2941c983ac17b2fb4?download=fe2f4bf832ea4f7fb2297473766f749b", "format": "application/pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", @@ -25,7 +25,7 @@ Content-Type: application/json; charset=UTF-8 "confidentiality": "buyerOnly", "language": "uk", "format": "application/pdf", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/e5172ebc4c4c411f84f376ce6ede43b8/bids/410cb59a0945497eb61cc4461f661569/documents/181271c244124b6ba014c2833d0a8c9e?download=462ce1c4b3c14bc68e1aa30e4abc6560", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/e5172ebc4c4c411f84f376ce6ede43b8/bids/ccd5dc4ca3f84f9a8f9ec11010bd01ba/documents/181271c244124b6ba014c2833d0a8c9e?download=462ce1c4b3c14bc68e1aa30e4abc6560", "confidentialityRationale": "Only our company sells badgers with pink hair.", "title": "Proposal_top_secrets.pdf", "documentOf": "tender", @@ -40,7 +40,7 @@ Content-Type: application/json; charset=UTF-8 "confidentiality": "public", "language": "uk", "title": "eligibility_doc.pdf", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/e5172ebc4c4c411f84f376ce6ede43b8/bids/410cb59a0945497eb61cc4461f661569/eligibility_documents/dd2433e3b6734869b0297de6ee3e2df8?download=b4b5be95835a45cca55f81ad8479d8f5", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/e5172ebc4c4c411f84f376ce6ede43b8/bids/ccd5dc4ca3f84f9a8f9ec11010bd01ba/eligibility_documents/dd2433e3b6734869b0297de6ee3e2df8?download=b4b5be95835a45cca55f81ad8479d8f5", "format": "application/pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", @@ -48,8 +48,7 @@ Content-Type: application/json; charset=UTF-8 "dateModified": "2020-05-15T01:00:00+03:00" } ], - "selfEligible": true, - "id": "410cb59a0945497eb61cc4461f661569", + "id": "ccd5dc4ca3f84f9a8f9ec11010bd01ba", "lotValues": [ { "relatedLot": "c7555f1bb878434d8815dea318304673", @@ -62,14 +61,39 @@ Content-Type: application/json; charset=UTF-8 } } ], - "selfQualified": true, + "qualificationDocuments": [ + { + "hash": "md5:00000000000000000000000000000000", + "confidentiality": "public", + "language": "uk", + "title": "qualification_document.pdf", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/e5172ebc4c4c411f84f376ce6ede43b8/bids/ccd5dc4ca3f84f9a8f9ec11010bd01ba/qualification_documents/911a8244866f4ffdbd2b2a202d34043c?download=fc6b13177ef949699443525662a19388", + "format": "application/pdf", + "documentOf": "tender", + "datePublished": "2020-05-15T01:00:00+03:00", + "id": "911a8244866f4ffdbd2b2a202d34043c", + "dateModified": "2020-05-15T01:00:00+03:00" + }, + { + "hash": "md5:00000000000000000000000000000000", + "confidentiality": "public", + "language": "uk", + "title": "qualification_document2.pdf", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/e5172ebc4c4c411f84f376ce6ede43b8/bids/ccd5dc4ca3f84f9a8f9ec11010bd01ba/qualification_documents/911a8244866f4ffdbd2b2a202d34043c?download=03ec7a79367644d0b9d45ec78b8a35c2", + "format": "application/pdf", + "documentOf": "tender", + "datePublished": "2020-05-15T01:00:00+03:00", + "id": "911a8244866f4ffdbd2b2a202d34043c", + "dateModified": "2020-05-15T01:00:00+03:00" + } + ], "financialDocuments": [ { "hash": "md5:00000000000000000000000000000000", "confidentiality": "public", "language": "uk", "title": "financial_doc.pdf", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/e5172ebc4c4c411f84f376ce6ede43b8/bids/410cb59a0945497eb61cc4461f661569/financial_documents/7ee1271306dc4c19befc8c2f5868c34a?download=2f8852ebe331410c908fecb00de667a4", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/e5172ebc4c4c411f84f376ce6ede43b8/bids/ccd5dc4ca3f84f9a8f9ec11010bd01ba/financial_documents/7ee1271306dc4c19befc8c2f5868c34a?download=2f8852ebe331410c908fecb00de667a4", "format": "application/pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", @@ -81,7 +105,7 @@ Content-Type: application/json; charset=UTF-8 "confidentiality": "public", "language": "uk", "title": "financial_doc2.pdf", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/e5172ebc4c4c411f84f376ce6ede43b8/bids/410cb59a0945497eb61cc4461f661569/financial_documents/4566fae4373e41588527c5a6ea6c4408?download=d7f6eb2a77d04872b0778dd876645d75", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/e5172ebc4c4c411f84f376ce6ede43b8/bids/ccd5dc4ca3f84f9a8f9ec11010bd01ba/financial_documents/4566fae4373e41588527c5a6ea6c4408?download=d7f6eb2a77d04872b0778dd876645d75", "format": "application/pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", @@ -114,32 +138,7 @@ Content-Type: application/json; charset=UTF-8 ], "date": "2020-05-15T01:00:00+03:00", "subcontractingDetails": "ДКП «Орфей», Україна", - "qualificationDocuments": [ - { - "hash": "md5:00000000000000000000000000000000", - "confidentiality": "public", - "language": "uk", - "title": "qualification_document.pdf", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/e5172ebc4c4c411f84f376ce6ede43b8/bids/410cb59a0945497eb61cc4461f661569/qualification_documents/911a8244866f4ffdbd2b2a202d34043c?download=fc6b13177ef949699443525662a19388", - "format": "application/pdf", - "documentOf": "tender", - "datePublished": "2020-05-15T01:00:00+03:00", - "id": "911a8244866f4ffdbd2b2a202d34043c", - "dateModified": "2020-05-15T01:00:00+03:00" - }, - { - "hash": "md5:00000000000000000000000000000000", - "confidentiality": "public", - "language": "uk", - "title": "qualification_document2.pdf", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/e5172ebc4c4c411f84f376ce6ede43b8/bids/410cb59a0945497eb61cc4461f661569/qualification_documents/911a8244866f4ffdbd2b2a202d34043c?download=03ec7a79367644d0b9d45ec78b8a35c2", - "format": "application/pdf", - "documentOf": "tender", - "datePublished": "2020-05-15T01:00:00+03:00", - "id": "911a8244866f4ffdbd2b2a202d34043c", - "dateModified": "2020-05-15T01:00:00+03:00" - } - ] + "selfQualified": true } } diff --git a/docs/source/tendering/cfaua/tutorial/bidder2-participation-url.http b/docs/source/tendering/cfaua/tutorial/bidder2-participation-url.http index fb80bec857..dfa39114bb 100644 --- a/docs/source/tendering/cfaua/tutorial/bidder2-participation-url.http +++ b/docs/source/tendering/cfaua/tutorial/bidder2-participation-url.http @@ -1,4 +1,4 @@ -GET /api/2.5/tenders/e5172ebc4c4c411f84f376ce6ede43b8/bids/e88e8fc3020640178a79c6e66d3dfd5f?acc_token=6efd2617b0c1409f9949bec517f22600 HTTP/1.0 +GET /api/2.5/tenders/e5172ebc4c4c411f84f376ce6ede43b8/bids/1c4a2dcee85343898ea5fbfd8ce2bd6e?acc_token=6efd2617b0c1409f9949bec517f22600 HTTP/1.0 Authorization: Bearer broker Host: lb-api-sandbox.prozorro.gov.ua @@ -7,13 +7,12 @@ Content-Type: application/json; charset=UTF-8 { "data": { "status": "active", - "selfEligible": true, "lotValues": [ { "relatedLot": "c7555f1bb878434d8815dea318304673", "date": "2020-05-15T01:00:00+03:00", "status": "active", - "participationUrl": "http://auction-sandbox.prozorro.gov.ua/tenders/e5172ebc4c4c411f84f376ce6ede43b8_c7555f1bb878434d8815dea318304673?key_for_bid=e88e8fc3020640178a79c6e66d3dfd5f", + "participationUrl": "http://auction-sandbox.prozorro.gov.ua/tenders/e5172ebc4c4c411f84f376ce6ede43b8_c7555f1bb878434d8815dea318304673?key_for_bid=1c4a2dcee85343898ea5fbfd8ce2bd6e", "value": { "currency": "UAH", "amount": 499, @@ -21,7 +20,7 @@ Content-Type: application/json; charset=UTF-8 } } ], - "selfQualified": true, + "id": "1c4a2dcee85343898ea5fbfd8ce2bd6e", "tenderers": [ { "contactPoint": { @@ -46,7 +45,7 @@ Content-Type: application/json; charset=UTF-8 } ], "date": "2020-05-15T01:00:00+03:00", - "id": "e88e8fc3020640178a79c6e66d3dfd5f" + "selfQualified": true } } diff --git a/docs/source/tendering/cfaua/tutorial/bidder4-participation-url.http b/docs/source/tendering/cfaua/tutorial/bidder4-participation-url.http index 0cec20d34c..4d52221c86 100644 --- a/docs/source/tendering/cfaua/tutorial/bidder4-participation-url.http +++ b/docs/source/tendering/cfaua/tutorial/bidder4-participation-url.http @@ -1,4 +1,4 @@ -GET /api/2.5/tenders/e5172ebc4c4c411f84f376ce6ede43b8/bids/5a84740ed0bd4aa3830adfb56c49ed62?acc_token=6982fa1b754343f4b49fb2b375a611f1 HTTP/1.0 +GET /api/2.5/tenders/e5172ebc4c4c411f84f376ce6ede43b8/bids/e0d41b30b35a430fb164a63e2cd8792b?acc_token=6982fa1b754343f4b49fb2b375a611f1 HTTP/1.0 Authorization: Bearer broker Host: lb-api-sandbox.prozorro.gov.ua @@ -17,7 +17,7 @@ Content-Type: application/json; charset=UTF-8 "format": "application/pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", - "id": "63630c59ee2e456bb92e2d0bd8c7a717", + "id": "76385a93b70747b9a07b493fd542e5cb", "dateModified": "2020-05-15T01:00:00+03:00" }, { @@ -25,12 +25,12 @@ Content-Type: application/json; charset=UTF-8 "confidentiality": "buyerOnly", "language": "uk", "format": "application/pdf", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/e5172ebc4c4c411f84f376ce6ede43b8/bids/5a84740ed0bd4aa3830adfb56c49ed62/documents/44ff1578915a4ba48350bc0a1054b65c?download=0de2a1c410ec4aa9a9b84705967be608", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/e5172ebc4c4c411f84f376ce6ede43b8/bids/e0d41b30b35a430fb164a63e2cd8792b/documents/80a0f2685fff4cca98aa482618a1deb0?download=0de2a1c410ec4aa9a9b84705967be608", "confidentialityRationale": "Only our company sells badgers with pink hair.", "title": "Proposal_part2.pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", - "id": "44ff1578915a4ba48350bc0a1054b65c", + "id": "80a0f2685fff4cca98aa482618a1deb0", "dateModified": "2020-05-15T01:00:00+03:00" } ], @@ -44,18 +44,17 @@ Content-Type: application/json; charset=UTF-8 "format": "application/pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", - "id": "28e17374e98c4f408038fb6c06f3dcc6", + "id": "1e4758fc996f43d482ccd4421009ed0a", "dateModified": "2020-05-15T01:00:00+03:00" } ], - "selfEligible": true, - "id": "5a84740ed0bd4aa3830adfb56c49ed62", + "id": "e0d41b30b35a430fb164a63e2cd8792b", "lotValues": [ { "relatedLot": "c7555f1bb878434d8815dea318304673", "date": "2020-05-15T01:00:00+03:00", "status": "active", - "participationUrl": "http://auction-sandbox.prozorro.gov.ua/tenders/e5172ebc4c4c411f84f376ce6ede43b8_c7555f1bb878434d8815dea318304673?key_for_bid=5a84740ed0bd4aa3830adfb56c49ed62", + "participationUrl": "http://auction-sandbox.prozorro.gov.ua/tenders/e5172ebc4c4c411f84f376ce6ede43b8_c7555f1bb878434d8815dea318304673?key_for_bid=e0d41b30b35a430fb164a63e2cd8792b", "value": { "currency": "UAH", "amount": 485, @@ -63,18 +62,31 @@ Content-Type: application/json; charset=UTF-8 } } ], - "selfQualified": true, + "qualificationDocuments": [ + { + "hash": "md5:00000000000000000000000000000000", + "confidentiality": "public", + "language": "uk", + "title": "qualification_document.pdf", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/e5172ebc4c4c411f84f376ce6ede43b8/bids/e0d41b30b35a430fb164a63e2cd8792b/qualification_documents/5ead0617d1c14c7d9fc2ed9ae8d490ef?download=141bde5b81904999acc2752de07b93cb", + "format": "application/pdf", + "documentOf": "tender", + "datePublished": "2020-05-15T01:00:00+03:00", + "id": "5ead0617d1c14c7d9fc2ed9ae8d490ef", + "dateModified": "2020-05-15T01:00:00+03:00" + } + ], "financialDocuments": [ { "hash": "md5:00000000000000000000000000000000", "confidentiality": "public", "language": "uk", "title": "financial_doc.pdf", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/e5172ebc4c4c411f84f376ce6ede43b8/bids/5a84740ed0bd4aa3830adfb56c49ed62/financial_documents/9ea2469f9ce448c2bba2acca54efbf6a?download=b4ed150c66e44f4bb8b86bb5285479f7", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/e5172ebc4c4c411f84f376ce6ede43b8/bids/e0d41b30b35a430fb164a63e2cd8792b/financial_documents/4ddd065a8215404b9f9e4d67b5283709?download=b4ed150c66e44f4bb8b86bb5285479f7", "format": "application/pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", - "id": "9ea2469f9ce448c2bba2acca54efbf6a", + "id": "4ddd065a8215404b9f9e4d67b5283709", "dateModified": "2020-05-15T01:00:00+03:00" } ], @@ -102,20 +114,7 @@ Content-Type: application/json; charset=UTF-8 } ], "date": "2020-05-15T01:00:00+03:00", - "qualificationDocuments": [ - { - "hash": "md5:00000000000000000000000000000000", - "confidentiality": "public", - "language": "uk", - "title": "qualification_document.pdf", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/e5172ebc4c4c411f84f376ce6ede43b8/bids/5a84740ed0bd4aa3830adfb56c49ed62/qualification_documents/6eaf563d3ca34c1e9ec07c39a4fe71ae?download=141bde5b81904999acc2752de07b93cb", - "format": "application/pdf", - "documentOf": "tender", - "datePublished": "2020-05-15T01:00:00+03:00", - "id": "6eaf563d3ca34c1e9ec07c39a4fe71ae", - "dateModified": "2020-05-15T01:00:00+03:00" - } - ] + "selfQualified": true } } diff --git a/docs/source/tendering/cfaua/tutorial/blank-tender-view.http b/docs/source/tendering/cfaua/tutorial/blank-tender-view.http index fbd2fcfa4f..ab4cb079e5 100644 --- a/docs/source/tendering/cfaua/tutorial/blank-tender-view.http +++ b/docs/source/tendering/cfaua/tutorial/blank-tender-view.http @@ -9,16 +9,16 @@ Content-Type: application/json; charset=UTF-8 "procurementMethod": "open", "mainProcurementCategory": "goods", "complaintPeriod": { - "startDate": "2020-05-15T01:00:00+03:00", - "endDate": "2020-06-11T00:00:00+03:00" + "startDate": "2020-04-20T01:00:00+03:00", + "endDate": "2020-05-17T00:00:00+03:00" }, "enquiryPeriod": { - "startDate": "2020-05-15T01:00:00+03:00", - "clarificationsUntil": "2020-06-12T00:00:00+03:00", - "endDate": "2020-06-05T01:00:00+03:00" + "startDate": "2020-04-20T01:00:00+03:00", + "clarificationsUntil": "2020-05-15T00:00:00+03:00", + "endDate": "2020-05-11T00:00:00+03:00" }, "submissionMethod": "electronicAuction", - "next_check": "2020-06-15T01:00:00+03:00", + "next_check": "2020-05-21T01:00:00+03:00", "procuringEntity": { "kind": "general", "name": "Державне управління справами", @@ -57,7 +57,7 @@ Content-Type: application/json; charset=UTF-8 "valueAddedTaxIncluded": true }, "auctionPeriod": { - "shouldStartAfter": "2020-07-21T00:00:00+03:00" + "shouldStartAfter": "2020-06-26T00:00:00+03:00" }, "value": { "currency": "UAH", @@ -73,8 +73,8 @@ Content-Type: application/json; charset=UTF-8 "dateModified": "2020-05-15T01:00:00+03:00", "status": "active.tendering", "tenderPeriod": { - "startDate": "2020-05-15T01:00:00+03:00", - "endDate": "2020-06-15T01:00:00+03:00" + "startDate": "2020-04-20T01:00:00+03:00", + "endDate": "2020-05-21T01:00:00+03:00" }, "title_en": "Cases for state awards", "procurementMethodType": "closeFrameworkAgreementUA", @@ -127,7 +127,7 @@ Content-Type: application/json; charset=UTF-8 "startDate": "2018-06-27T13:39:09.362837+03:00", "endDate": "2018-06-30T13:39:09.362837+03:00" }, - "id": "c9f1001e9cf04ec9b6dba5517f0be455", + "id": "0054e405b9d64563bb0437ddf2a830f8", "unit": { "code": "44617100-9", "name": "item" @@ -161,7 +161,7 @@ Content-Type: application/json; charset=UTF-8 "startDate": "2018-06-27T13:39:09.362837+03:00", "endDate": "2018-06-30T13:39:09.362837+03:00" }, - "id": "d2921287716245e095f67d91b9ceafa6", + "id": "238443d82d0c43dab3543c1b3dd471b8", "unit": { "code": "44617100-8", "name": "item" diff --git a/docs/source/tendering/cfaua/tutorial/confirm-qualification.http b/docs/source/tendering/cfaua/tutorial/confirm-qualification.http index cf3f7b26b5..7316c85651 100644 --- a/docs/source/tendering/cfaua/tutorial/confirm-qualification.http +++ b/docs/source/tendering/cfaua/tutorial/confirm-qualification.http @@ -42,7 +42,7 @@ Content-Type: application/json; charset=UTF-8 } } ], - "bid_id": "5a84740ed0bd4aa3830adfb56c49ed62", + "bid_id": "e0d41b30b35a430fb164a63e2cd8792b", "value": { "currency": "UAH", "amount": 485, diff --git a/docs/source/tendering/cfaua/tutorial/confirm-qualification2.http b/docs/source/tendering/cfaua/tutorial/confirm-qualification2.http index d395aadca8..0e615c72fa 100644 --- a/docs/source/tendering/cfaua/tutorial/confirm-qualification2.http +++ b/docs/source/tendering/cfaua/tutorial/confirm-qualification2.http @@ -42,7 +42,7 @@ Content-Type: application/json; charset=UTF-8 } } ], - "bid_id": "5a84740ed0bd4aa3830adfb56c49ed62", + "bid_id": "e0d41b30b35a430fb164a63e2cd8792b", "value": { "currency": "UAH", "amount": 485, diff --git a/docs/source/tendering/cfaua/tutorial/get-answer.http b/docs/source/tendering/cfaua/tutorial/get-answer.http index c05d8d54cd..573d7070ad 100644 --- a/docs/source/tendering/cfaua/tutorial/get-answer.http +++ b/docs/source/tendering/cfaua/tutorial/get-answer.http @@ -1,4 +1,4 @@ -GET /api/2.5/tenders/e5172ebc4c4c411f84f376ce6ede43b8/questions/efba5567d08848afae0ebb78272aed79 HTTP/1.0 +GET /api/2.5/tenders/e5172ebc4c4c411f84f376ce6ede43b8/questions/815205150bf34d0c88019bd165a1a986 HTTP/1.0 Authorization: Bearer broker Host: lb-api-sandbox.prozorro.gov.ua @@ -11,7 +11,7 @@ Content-Type: application/json; charset=UTF-8 "title": "Калорійність", "date": "2020-05-15T01:00:00+03:00", "answer": "Таблицю додано в файлі \"Kalorijnist.xslx\"", - "id": "efba5567d08848afae0ebb78272aed79", + "id": "815205150bf34d0c88019bd165a1a986", "questionOf": "tender" } } diff --git a/docs/source/tendering/cfaua/tutorial/list-question.http b/docs/source/tendering/cfaua/tutorial/list-question.http index 6f2a55b64e..c9bb73075b 100644 --- a/docs/source/tendering/cfaua/tutorial/list-question.http +++ b/docs/source/tendering/cfaua/tutorial/list-question.http @@ -12,7 +12,7 @@ Content-Type: application/json; charset=UTF-8 "title": "Калорійність", "date": "2020-05-15T01:00:00+03:00", "answer": "Таблицю додано в файлі \"Kalorijnist.xslx\"", - "id": "efba5567d08848afae0ebb78272aed79", + "id": "815205150bf34d0c88019bd165a1a986", "questionOf": "tender" } ] diff --git a/docs/source/tendering/cfaua/tutorial/mark-bid-doc-private.http b/docs/source/tendering/cfaua/tutorial/mark-bid-doc-private.http index 894a6b16ba..c08cbdbc48 100644 --- a/docs/source/tendering/cfaua/tutorial/mark-bid-doc-private.http +++ b/docs/source/tendering/cfaua/tutorial/mark-bid-doc-private.http @@ -1,4 +1,4 @@ -PATCH /api/2.5/tenders/e5172ebc4c4c411f84f376ce6ede43b8/bids/410cb59a0945497eb61cc4461f661569/documents/181271c244124b6ba014c2833d0a8c9e?acc_token=7ba8d77208c04422b161882dc2c4b5c2 HTTP/1.0 +PATCH /api/2.5/tenders/e5172ebc4c4c411f84f376ce6ede43b8/bids/ccd5dc4ca3f84f9a8f9ec11010bd01ba/documents/181271c244124b6ba014c2833d0a8c9e?acc_token=7ba8d77208c04422b161882dc2c4b5c2 HTTP/1.0 Authorization: Bearer broker Content-Length: 120 Content-Type: application/json @@ -19,7 +19,7 @@ Content-Type: application/json; charset=UTF-8 "confidentiality": "buyerOnly", "language": "uk", "format": "application/pdf", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/e5172ebc4c4c411f84f376ce6ede43b8/bids/410cb59a0945497eb61cc4461f661569/documents/181271c244124b6ba014c2833d0a8c9e?download=462ce1c4b3c14bc68e1aa30e4abc6560", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/e5172ebc4c4c411f84f376ce6ede43b8/bids/ccd5dc4ca3f84f9a8f9ec11010bd01ba/documents/181271c244124b6ba014c2833d0a8c9e?download=462ce1c4b3c14bc68e1aa30e4abc6560", "confidentialityRationale": "Only our company sells badgers with pink hair.", "title": "Proposal_top_secrets.pdf", "documentOf": "tender", diff --git a/docs/source/tendering/cfaua/tutorial/patch-award-cancelled.http b/docs/source/tendering/cfaua/tutorial/patch-award-cancelled.http index 2dba00f09a..f5d6b2c34f 100644 --- a/docs/source/tendering/cfaua/tutorial/patch-award-cancelled.http +++ b/docs/source/tendering/cfaua/tutorial/patch-award-cancelled.http @@ -40,7 +40,7 @@ Content-Type: application/json; charset=UTF-8 } } ], - "bid_id": "5a84740ed0bd4aa3830adfb56c49ed62", + "bid_id": "e0d41b30b35a430fb164a63e2cd8792b", "value": { "currency": "UAH", "amount": 485, diff --git a/docs/source/tendering/cfaua/tutorial/patch-award-unsuccessful-cancelled.http b/docs/source/tendering/cfaua/tutorial/patch-award-unsuccessful-cancelled.http index 756e7e3917..0636dc6188 100644 --- a/docs/source/tendering/cfaua/tutorial/patch-award-unsuccessful-cancelled.http +++ b/docs/source/tendering/cfaua/tutorial/patch-award-unsuccessful-cancelled.http @@ -42,7 +42,7 @@ Content-Type: application/json; charset=UTF-8 } } ], - "bid_id": "5a84740ed0bd4aa3830adfb56c49ed62", + "bid_id": "e0d41b30b35a430fb164a63e2cd8792b", "value": { "currency": "UAH", "amount": 485, diff --git a/docs/source/tendering/cfaua/tutorial/patch-award-unsuccessful.http b/docs/source/tendering/cfaua/tutorial/patch-award-unsuccessful.http index ae3f8d9c7b..febf96977d 100644 --- a/docs/source/tendering/cfaua/tutorial/patch-award-unsuccessful.http +++ b/docs/source/tendering/cfaua/tutorial/patch-award-unsuccessful.http @@ -42,7 +42,7 @@ Content-Type: application/json; charset=UTF-8 } } ], - "bid_id": "5a84740ed0bd4aa3830adfb56c49ed62", + "bid_id": "e0d41b30b35a430fb164a63e2cd8792b", "value": { "currency": "UAH", "amount": 485, diff --git a/docs/source/tendering/cfaua/tutorial/patch-cancellation.http b/docs/source/tendering/cfaua/tutorial/patch-cancellation.http index e64ade41ab..5f47cb1b73 100644 --- a/docs/source/tendering/cfaua/tutorial/patch-cancellation.http +++ b/docs/source/tendering/cfaua/tutorial/patch-cancellation.http @@ -1,4 +1,4 @@ -PATCH /api/2.5/tenders/e5172ebc4c4c411f84f376ce6ede43b8/cancellations/8d867a37ec004bee9d571231d313987b/documents/4a6e26bf559346d0b4ca0298bf8a61d0?acc_token=1e40f3cf3fd64b8ebca3076b70a86e71 HTTP/1.0 +PATCH /api/2.5/tenders/e5172ebc4c4c411f84f376ce6ede43b8/cancellations/f35b5fe67e064722b22ccf511efe711b/documents/4a6e26bf559346d0b4ca0298bf8a61d0?acc_token=1e40f3cf3fd64b8ebca3076b70a86e71 HTTP/1.0 Authorization: Bearer broker Content-Length: 48 Content-Type: application/json diff --git a/docs/source/tendering/cfaua/tutorial/patch-items-value-periods.http b/docs/source/tendering/cfaua/tutorial/patch-items-value-periods.http index 05fcbb6787..1996034981 100644 --- a/docs/source/tendering/cfaua/tutorial/patch-items-value-periods.http +++ b/docs/source/tendering/cfaua/tutorial/patch-items-value-periods.http @@ -19,13 +19,13 @@ Content-Type: application/json; charset=UTF-8 "procurementMethod": "open", "mainProcurementCategory": "goods", "complaintPeriod": { - "startDate": "2020-05-15T01:00:00+03:00", + "startDate": "2020-04-20T01:00:00+03:00", "endDate": "2020-06-10T00:00:00+03:00" }, "enquiryPeriod": { - "startDate": "2020-05-15T01:00:00+03:00", - "clarificationsUntil": "2020-06-11T00:00:00+03:00", - "endDate": "2020-06-04T01:00:10+03:00", + "startDate": "2020-04-20T01:00:00+03:00", + "clarificationsUntil": "2020-06-10T00:00:00+03:00", + "endDate": "2020-06-04T00:00:00+03:00", "invalidationDate": "2020-05-15T01:00:00+03:00" }, "submissionMethod": "electronicAuction", @@ -84,7 +84,7 @@ Content-Type: application/json; charset=UTF-8 "dateModified": "2020-05-15T01:00:00+03:00", "status": "active.tendering", "tenderPeriod": { - "startDate": "2020-05-15T01:00:00+03:00", + "startDate": "2020-04-20T01:00:00+03:00", "endDate": "2020-06-14T01:00:10+03:00" }, "title_en": "Cases for state awards", @@ -138,7 +138,7 @@ Content-Type: application/json; charset=UTF-8 "startDate": "2018-06-27T13:39:09.362837+03:00", "endDate": "2018-06-30T13:39:09.362837+03:00" }, - "id": "c9f1001e9cf04ec9b6dba5517f0be455", + "id": "0054e405b9d64563bb0437ddf2a830f8", "unit": { "code": "44617100-9", "name": "item" @@ -172,7 +172,7 @@ Content-Type: application/json; charset=UTF-8 "startDate": "2018-06-27T13:39:09.362837+03:00", "endDate": "2018-06-30T13:39:09.362837+03:00" }, - "id": "d2921287716245e095f67d91b9ceafa6", + "id": "238443d82d0c43dab3543c1b3dd471b8", "unit": { "code": "44617100-8", "name": "item" diff --git a/docs/source/tendering/cfaua/tutorial/pending-cancellation.http b/docs/source/tendering/cfaua/tutorial/pending-cancellation.http index 62b400bc59..3e3f0a4ea1 100644 --- a/docs/source/tendering/cfaua/tutorial/pending-cancellation.http +++ b/docs/source/tendering/cfaua/tutorial/pending-cancellation.http @@ -1,4 +1,4 @@ -PATCH /api/2.5/tenders/e5172ebc4c4c411f84f376ce6ede43b8/cancellations/8d867a37ec004bee9d571231d313987b?acc_token=1e40f3cf3fd64b8ebca3076b70a86e71 HTTP/1.0 +PATCH /api/2.5/tenders/e5172ebc4c4c411f84f376ce6ede43b8/cancellations/f35b5fe67e064722b22ccf511efe711b?acc_token=1e40f3cf3fd64b8ebca3076b70a86e71 HTTP/1.0 Authorization: Bearer broker Content-Length: 31 Content-Type: application/json @@ -49,7 +49,7 @@ Content-Type: application/json; charset=UTF-8 "reasonType": "unFixable", "date": "2020-05-15T01:00:01+03:00", "cancellationOf": "tender", - "id": "8d867a37ec004bee9d571231d313987b" + "id": "f35b5fe67e064722b22ccf511efe711b" } } diff --git a/docs/source/tendering/cfaua/tutorial/pre-qualification-confirmation.http b/docs/source/tendering/cfaua/tutorial/pre-qualification-confirmation.http index 8d6b308abc..c76b80371b 100644 --- a/docs/source/tendering/cfaua/tutorial/pre-qualification-confirmation.http +++ b/docs/source/tendering/cfaua/tutorial/pre-qualification-confirmation.http @@ -23,8 +23,8 @@ Content-Type: application/json; charset=UTF-8 }, "enquiryPeriod": { "startDate": "2020-04-14T01:00:00+03:00", - "clarificationsUntil": "2020-05-09T00:00:00+03:00", - "endDate": "2020-05-05T01:00:00+03:00", + "clarificationsUntil": "2020-05-08T00:00:00+03:00", + "endDate": "2020-05-05T00:00:00+03:00", "invalidationDate": "2020-05-15T01:00:00+03:00" }, "submissionMethod": "electronicAuction", @@ -60,7 +60,7 @@ Content-Type: application/json; charset=UTF-8 "title": "Калорійність", "date": "2020-05-15T01:00:00+03:00", "answer": "Таблицю додано в файлі \"Kalorijnist.xslx\"", - "id": "efba5567d08848afae0ebb78272aed79", + "id": "815205150bf34d0c88019bd165a1a986", "questionOf": "tender" } ], @@ -153,7 +153,7 @@ Content-Type: application/json; charset=UTF-8 "lotID": "c7555f1bb878434d8815dea318304673", "eligible": true, "qualified": true, - "bidID": "410cb59a0945497eb61cc4461f661569", + "bidID": "ccd5dc4ca3f84f9a8f9ec11010bd01ba", "date": "2020-05-15T01:00:00+03:00", "id": "9eafb5e0a5ac4268a1f0821a11dae69d" }, @@ -162,7 +162,7 @@ Content-Type: application/json; charset=UTF-8 "lotID": "c7555f1bb878434d8815dea318304673", "eligible": true, "qualified": true, - "bidID": "e88e8fc3020640178a79c6e66d3dfd5f", + "bidID": "1c4a2dcee85343898ea5fbfd8ce2bd6e", "date": "2020-05-15T01:00:00+03:00", "id": "86fd0e3cd41f48eab89c5ac406b8334d" }, @@ -171,7 +171,7 @@ Content-Type: application/json; charset=UTF-8 "lotID": "c7555f1bb878434d8815dea318304673", "eligible": false, "qualified": false, - "bidID": "88c9f41eac914e1cb72d9a43fc03d702", + "bidID": "76ccebf7a163452886a6d2d8d39a564b", "date": "2020-05-15T01:00:00+03:00", "id": "cb68d0f3a8c4468d9b7c5595eb8f9001" }, @@ -180,7 +180,7 @@ Content-Type: application/json; charset=UTF-8 "lotID": "c7555f1bb878434d8815dea318304673", "eligible": true, "qualified": true, - "bidID": "5a84740ed0bd4aa3830adfb56c49ed62", + "bidID": "e0d41b30b35a430fb164a63e2cd8792b", "date": "2020-05-15T01:00:00+03:00", "id": "cdc3670ed483448a8cd1ed6d1146da99" } @@ -236,7 +236,7 @@ Content-Type: application/json; charset=UTF-8 "startDate": "2018-06-27T13:39:09.362837+03:00", "endDate": "2018-06-30T13:39:09.362837+03:00" }, - "id": "c9f1001e9cf04ec9b6dba5517f0be455", + "id": "0054e405b9d64563bb0437ddf2a830f8", "unit": { "code": "44617100-9", "name": "item" @@ -270,7 +270,7 @@ Content-Type: application/json; charset=UTF-8 "startDate": "2018-06-27T13:39:09.362837+03:00", "endDate": "2018-06-30T13:39:09.362837+03:00" }, - "id": "d2921287716245e095f67d91b9ceafa6", + "id": "238443d82d0c43dab3543c1b3dd471b8", "unit": { "code": "44617100-8", "name": "item" @@ -299,7 +299,7 @@ Content-Type: application/json; charset=UTF-8 "confidentiality": "buyerOnly", "language": "uk", "format": "application/pdf", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/e5172ebc4c4c411f84f376ce6ede43b8/bids/410cb59a0945497eb61cc4461f661569/documents/181271c244124b6ba014c2833d0a8c9e?download=462ce1c4b3c14bc68e1aa30e4abc6560", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/e5172ebc4c4c411f84f376ce6ede43b8/bids/ccd5dc4ca3f84f9a8f9ec11010bd01ba/documents/181271c244124b6ba014c2833d0a8c9e?download=462ce1c4b3c14bc68e1aa30e4abc6560", "confidentialityRationale": "Only our company sells badgers with pink hair.", "title": "Proposal_top_secrets.pdf", "documentOf": "tender", @@ -331,7 +331,7 @@ Content-Type: application/json; charset=UTF-8 } } ], - "id": "410cb59a0945497eb61cc4461f661569", + "id": "ccd5dc4ca3f84f9a8f9ec11010bd01ba", "eligibilityDocuments": [ { "hash": "md5:00000000000000000000000000000000", @@ -349,7 +349,7 @@ Content-Type: application/json; charset=UTF-8 }, { "status": "active", - "id": "e88e8fc3020640178a79c6e66d3dfd5f", + "id": "1c4a2dcee85343898ea5fbfd8ce2bd6e", "tenderers": [ { "contactPoint": { @@ -386,7 +386,7 @@ Content-Type: application/json; charset=UTF-8 "format": "application/pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", - "id": "5d9147ed06d348d69adf62875b7bd89b", + "id": "2461364d2bef400580101b81b63f6b18", "dateModified": "2020-05-15T01:00:00+03:00" }, { @@ -394,12 +394,12 @@ Content-Type: application/json; charset=UTF-8 "confidentiality": "buyerOnly", "language": "uk", "format": "application/pdf", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/e5172ebc4c4c411f84f376ce6ede43b8/bids/88c9f41eac914e1cb72d9a43fc03d702/documents/3f355e7a0b8646389ad0af8eef0e241b?download=0de2a1c410ec4aa9a9b84705967be608", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/e5172ebc4c4c411f84f376ce6ede43b8/bids/76ccebf7a163452886a6d2d8d39a564b/documents/eb48db1664f34859b5f5dbc8253dd747?download=0de2a1c410ec4aa9a9b84705967be608", "confidentialityRationale": "Only our company sells badgers with pink hair.", "title": "Proposal_part2.pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", - "id": "3f355e7a0b8646389ad0af8eef0e241b", + "id": "eb48db1664f34859b5f5dbc8253dd747", "dateModified": "2020-05-15T01:00:00+03:00" } ], @@ -413,12 +413,11 @@ Content-Type: application/json; charset=UTF-8 "format": "application/pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", - "id": "474da502332f48a0a117f28b44e21dde", + "id": "4bfdcd78d6c34992a2dd9e52cbcc4e25", "dateModified": "2020-05-15T01:00:00+03:00" } ], - "selfEligible": true, - "selfQualified": true, + "id": "76ccebf7a163452886a6d2d8d39a564b", "tenderers": [ { "contactPoint": { @@ -442,7 +441,7 @@ Content-Type: application/json; charset=UTF-8 } } ], - "id": "88c9f41eac914e1cb72d9a43fc03d702" + "selfQualified": true }, { "status": "active", @@ -456,7 +455,7 @@ Content-Type: application/json; charset=UTF-8 "format": "application/pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", - "id": "63630c59ee2e456bb92e2d0bd8c7a717", + "id": "76385a93b70747b9a07b493fd542e5cb", "dateModified": "2020-05-15T01:00:00+03:00" }, { @@ -464,12 +463,12 @@ Content-Type: application/json; charset=UTF-8 "confidentiality": "buyerOnly", "language": "uk", "format": "application/pdf", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/e5172ebc4c4c411f84f376ce6ede43b8/bids/5a84740ed0bd4aa3830adfb56c49ed62/documents/44ff1578915a4ba48350bc0a1054b65c?download=0de2a1c410ec4aa9a9b84705967be608", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/e5172ebc4c4c411f84f376ce6ede43b8/bids/e0d41b30b35a430fb164a63e2cd8792b/documents/80a0f2685fff4cca98aa482618a1deb0?download=0de2a1c410ec4aa9a9b84705967be608", "confidentialityRationale": "Only our company sells badgers with pink hair.", "title": "Proposal_part2.pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", - "id": "44ff1578915a4ba48350bc0a1054b65c", + "id": "80a0f2685fff4cca98aa482618a1deb0", "dateModified": "2020-05-15T01:00:00+03:00" } ], @@ -496,7 +495,7 @@ Content-Type: application/json; charset=UTF-8 } } ], - "id": "5a84740ed0bd4aa3830adfb56c49ed62", + "id": "e0d41b30b35a430fb164a63e2cd8792b", "eligibilityDocuments": [ { "hash": "md5:00000000000000000000000000000000", @@ -507,7 +506,7 @@ Content-Type: application/json; charset=UTF-8 "format": "application/pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", - "id": "28e17374e98c4f408038fb6c06f3dcc6", + "id": "1e4758fc996f43d482ccd4421009ed0a", "dateModified": "2020-05-15T01:00:00+03:00" } ] diff --git a/docs/source/tendering/cfaua/tutorial/prepare-cancellation.http b/docs/source/tendering/cfaua/tutorial/prepare-cancellation.http index 7145ee03af..c35361fe06 100644 --- a/docs/source/tendering/cfaua/tutorial/prepare-cancellation.http +++ b/docs/source/tendering/cfaua/tutorial/prepare-cancellation.http @@ -13,7 +13,7 @@ DATA: Response: 201 Created Content-Type: application/json; charset=UTF-8 -Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/e5172ebc4c4c411f84f376ce6ede43b8/cancellations/8d867a37ec004bee9d571231d313987b +Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/e5172ebc4c4c411f84f376ce6ede43b8/cancellations/f35b5fe67e064722b22ccf511efe711b { "data": { "status": "draft", @@ -21,7 +21,7 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/e5172ebc4c4c411f "reasonType": "noDemand", "date": "2020-05-15T01:00:01+03:00", "cancellationOf": "tender", - "id": "8d867a37ec004bee9d571231d313987b" + "id": "f35b5fe67e064722b22ccf511efe711b" } } diff --git a/docs/source/tendering/cfaua/tutorial/qualificated-bids-view.http b/docs/source/tendering/cfaua/tutorial/qualificated-bids-view.http index bf9d6d4ede..9ab033ea0a 100644 --- a/docs/source/tendering/cfaua/tutorial/qualificated-bids-view.http +++ b/docs/source/tendering/cfaua/tutorial/qualificated-bids-view.http @@ -26,7 +26,7 @@ Content-Type: application/json; charset=UTF-8 "confidentiality": "buyerOnly", "language": "uk", "format": "application/pdf", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/e5172ebc4c4c411f84f376ce6ede43b8/bids/410cb59a0945497eb61cc4461f661569/documents/181271c244124b6ba014c2833d0a8c9e?download=462ce1c4b3c14bc68e1aa30e4abc6560", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/e5172ebc4c4c411f84f376ce6ede43b8/bids/ccd5dc4ca3f84f9a8f9ec11010bd01ba/documents/181271c244124b6ba014c2833d0a8c9e?download=462ce1c4b3c14bc68e1aa30e4abc6560", "confidentialityRationale": "Only our company sells badgers with pink hair.", "title": "Proposal_top_secrets.pdf", "documentOf": "tender", @@ -58,7 +58,7 @@ Content-Type: application/json; charset=UTF-8 } } ], - "id": "410cb59a0945497eb61cc4461f661569", + "id": "ccd5dc4ca3f84f9a8f9ec11010bd01ba", "eligibilityDocuments": [ { "hash": "md5:00000000000000000000000000000000", @@ -76,7 +76,7 @@ Content-Type: application/json; charset=UTF-8 }, { "status": "active", - "id": "e88e8fc3020640178a79c6e66d3dfd5f", + "id": "1c4a2dcee85343898ea5fbfd8ce2bd6e", "tenderers": [ { "contactPoint": { @@ -113,7 +113,7 @@ Content-Type: application/json; charset=UTF-8 "format": "application/pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", - "id": "5d9147ed06d348d69adf62875b7bd89b", + "id": "2461364d2bef400580101b81b63f6b18", "dateModified": "2020-05-15T01:00:00+03:00" }, { @@ -121,12 +121,12 @@ Content-Type: application/json; charset=UTF-8 "confidentiality": "buyerOnly", "language": "uk", "format": "application/pdf", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/e5172ebc4c4c411f84f376ce6ede43b8/bids/88c9f41eac914e1cb72d9a43fc03d702/documents/3f355e7a0b8646389ad0af8eef0e241b?download=0de2a1c410ec4aa9a9b84705967be608", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/e5172ebc4c4c411f84f376ce6ede43b8/bids/76ccebf7a163452886a6d2d8d39a564b/documents/eb48db1664f34859b5f5dbc8253dd747?download=0de2a1c410ec4aa9a9b84705967be608", "confidentialityRationale": "Only our company sells badgers with pink hair.", "title": "Proposal_part2.pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", - "id": "3f355e7a0b8646389ad0af8eef0e241b", + "id": "eb48db1664f34859b5f5dbc8253dd747", "dateModified": "2020-05-15T01:00:00+03:00" } ], @@ -140,12 +140,11 @@ Content-Type: application/json; charset=UTF-8 "format": "application/pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", - "id": "474da502332f48a0a117f28b44e21dde", + "id": "4bfdcd78d6c34992a2dd9e52cbcc4e25", "dateModified": "2020-05-15T01:00:00+03:00" } ], - "selfEligible": true, - "selfQualified": true, + "id": "76ccebf7a163452886a6d2d8d39a564b", "tenderers": [ { "contactPoint": { @@ -169,7 +168,7 @@ Content-Type: application/json; charset=UTF-8 } } ], - "id": "88c9f41eac914e1cb72d9a43fc03d702" + "selfQualified": true }, { "status": "active", @@ -183,7 +182,7 @@ Content-Type: application/json; charset=UTF-8 "format": "application/pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", - "id": "63630c59ee2e456bb92e2d0bd8c7a717", + "id": "76385a93b70747b9a07b493fd542e5cb", "dateModified": "2020-05-15T01:00:00+03:00" }, { @@ -191,12 +190,12 @@ Content-Type: application/json; charset=UTF-8 "confidentiality": "buyerOnly", "language": "uk", "format": "application/pdf", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/e5172ebc4c4c411f84f376ce6ede43b8/bids/5a84740ed0bd4aa3830adfb56c49ed62/documents/44ff1578915a4ba48350bc0a1054b65c?download=0de2a1c410ec4aa9a9b84705967be608", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/e5172ebc4c4c411f84f376ce6ede43b8/bids/e0d41b30b35a430fb164a63e2cd8792b/documents/80a0f2685fff4cca98aa482618a1deb0?download=0de2a1c410ec4aa9a9b84705967be608", "confidentialityRationale": "Only our company sells badgers with pink hair.", "title": "Proposal_part2.pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", - "id": "44ff1578915a4ba48350bc0a1054b65c", + "id": "80a0f2685fff4cca98aa482618a1deb0", "dateModified": "2020-05-15T01:00:00+03:00" } ], @@ -223,7 +222,7 @@ Content-Type: application/json; charset=UTF-8 } } ], - "id": "5a84740ed0bd4aa3830adfb56c49ed62", + "id": "e0d41b30b35a430fb164a63e2cd8792b", "eligibilityDocuments": [ { "hash": "md5:00000000000000000000000000000000", @@ -234,7 +233,7 @@ Content-Type: application/json; charset=UTF-8 "format": "application/pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", - "id": "28e17374e98c4f408038fb6c06f3dcc6", + "id": "1e4758fc996f43d482ccd4421009ed0a", "dateModified": "2020-05-15T01:00:00+03:00" } ] diff --git a/docs/source/tendering/cfaua/tutorial/qualifications-list.http b/docs/source/tendering/cfaua/tutorial/qualifications-list.http index 41e2931471..27f450532f 100644 --- a/docs/source/tendering/cfaua/tutorial/qualifications-list.http +++ b/docs/source/tendering/cfaua/tutorial/qualifications-list.http @@ -32,7 +32,7 @@ Content-Type: application/json; charset=UTF-8 } } ], - "bid_id": "5a84740ed0bd4aa3830adfb56c49ed62", + "bid_id": "e0d41b30b35a430fb164a63e2cd8792b", "value": { "currency": "UAH", "amount": 485, @@ -67,7 +67,7 @@ Content-Type: application/json; charset=UTF-8 } } ], - "bid_id": "e88e8fc3020640178a79c6e66d3dfd5f", + "bid_id": "1c4a2dcee85343898ea5fbfd8ce2bd6e", "value": { "currency": "UAH", "amount": 499, @@ -102,7 +102,7 @@ Content-Type: application/json; charset=UTF-8 } } ], - "bid_id": "410cb59a0945497eb61cc4461f661569", + "bid_id": "ccd5dc4ca3f84f9a8f9ec11010bd01ba", "value": { "currency": "UAH", "amount": 500.0, diff --git a/docs/source/tendering/cfaua/tutorial/qualifications-list2.http b/docs/source/tendering/cfaua/tutorial/qualifications-list2.http index d8db6f42a9..86c721324f 100644 --- a/docs/source/tendering/cfaua/tutorial/qualifications-list2.http +++ b/docs/source/tendering/cfaua/tutorial/qualifications-list2.http @@ -33,7 +33,7 @@ Content-Type: application/json; charset=UTF-8 } } ], - "bid_id": "5a84740ed0bd4aa3830adfb56c49ed62", + "bid_id": "e0d41b30b35a430fb164a63e2cd8792b", "value": { "currency": "UAH", "amount": 485, @@ -70,7 +70,7 @@ Content-Type: application/json; charset=UTF-8 } } ], - "bid_id": "e88e8fc3020640178a79c6e66d3dfd5f", + "bid_id": "1c4a2dcee85343898ea5fbfd8ce2bd6e", "value": { "currency": "UAH", "amount": 499, @@ -107,7 +107,7 @@ Content-Type: application/json; charset=UTF-8 } } ], - "bid_id": "410cb59a0945497eb61cc4461f661569", + "bid_id": "ccd5dc4ca3f84f9a8f9ec11010bd01ba", "value": { "currency": "UAH", "amount": 500.0, @@ -143,7 +143,7 @@ Content-Type: application/json; charset=UTF-8 } } ], - "bid_id": "5a84740ed0bd4aa3830adfb56c49ed62", + "bid_id": "e0d41b30b35a430fb164a63e2cd8792b", "value": { "currency": "UAH", "amount": 485, diff --git a/docs/source/tendering/cfaua/tutorial/qualifications-list3.http b/docs/source/tendering/cfaua/tutorial/qualifications-list3.http index a0a8ff2084..e385418509 100644 --- a/docs/source/tendering/cfaua/tutorial/qualifications-list3.http +++ b/docs/source/tendering/cfaua/tutorial/qualifications-list3.http @@ -33,7 +33,7 @@ Content-Type: application/json; charset=UTF-8 } } ], - "bid_id": "5a84740ed0bd4aa3830adfb56c49ed62", + "bid_id": "e0d41b30b35a430fb164a63e2cd8792b", "value": { "currency": "UAH", "amount": 485, @@ -70,7 +70,7 @@ Content-Type: application/json; charset=UTF-8 } } ], - "bid_id": "e88e8fc3020640178a79c6e66d3dfd5f", + "bid_id": "1c4a2dcee85343898ea5fbfd8ce2bd6e", "value": { "currency": "UAH", "amount": 499, @@ -107,7 +107,7 @@ Content-Type: application/json; charset=UTF-8 } } ], - "bid_id": "410cb59a0945497eb61cc4461f661569", + "bid_id": "ccd5dc4ca3f84f9a8f9ec11010bd01ba", "value": { "currency": "UAH", "amount": 500.0, @@ -146,7 +146,7 @@ Content-Type: application/json; charset=UTF-8 } } ], - "bid_id": "5a84740ed0bd4aa3830adfb56c49ed62", + "bid_id": "e0d41b30b35a430fb164a63e2cd8792b", "value": { "currency": "UAH", "amount": 485, @@ -181,7 +181,7 @@ Content-Type: application/json; charset=UTF-8 } } ], - "bid_id": "5a84740ed0bd4aa3830adfb56c49ed62", + "bid_id": "e0d41b30b35a430fb164a63e2cd8792b", "value": { "currency": "UAH", "amount": 485, @@ -216,7 +216,7 @@ Content-Type: application/json; charset=UTF-8 } } ], - "bid_id": "e88e8fc3020640178a79c6e66d3dfd5f", + "bid_id": "1c4a2dcee85343898ea5fbfd8ce2bd6e", "value": { "currency": "UAH", "amount": 499, @@ -251,7 +251,7 @@ Content-Type: application/json; charset=UTF-8 } } ], - "bid_id": "410cb59a0945497eb61cc4461f661569", + "bid_id": "ccd5dc4ca3f84f9a8f9ec11010bd01ba", "value": { "currency": "UAH", "amount": 500.0, diff --git a/docs/source/tendering/cfaua/tutorial/qualifications-listing.http b/docs/source/tendering/cfaua/tutorial/qualifications-listing.http index 79b9a807fe..0656f546dd 100644 --- a/docs/source/tendering/cfaua/tutorial/qualifications-listing.http +++ b/docs/source/tendering/cfaua/tutorial/qualifications-listing.http @@ -11,7 +11,7 @@ Content-Type: application/json; charset=UTF-8 "lotID": "c7555f1bb878434d8815dea318304673", "eligible": false, "qualified": false, - "bidID": "410cb59a0945497eb61cc4461f661569", + "bidID": "ccd5dc4ca3f84f9a8f9ec11010bd01ba", "date": "2020-05-15T01:00:00+03:00", "id": "9eafb5e0a5ac4268a1f0821a11dae69d" }, @@ -20,7 +20,7 @@ Content-Type: application/json; charset=UTF-8 "lotID": "c7555f1bb878434d8815dea318304673", "eligible": false, "qualified": false, - "bidID": "e88e8fc3020640178a79c6e66d3dfd5f", + "bidID": "1c4a2dcee85343898ea5fbfd8ce2bd6e", "date": "2020-05-15T01:00:00+03:00", "id": "86fd0e3cd41f48eab89c5ac406b8334d" }, @@ -29,7 +29,7 @@ Content-Type: application/json; charset=UTF-8 "lotID": "c7555f1bb878434d8815dea318304673", "eligible": false, "qualified": false, - "bidID": "88c9f41eac914e1cb72d9a43fc03d702", + "bidID": "76ccebf7a163452886a6d2d8d39a564b", "date": "2020-05-15T01:00:00+03:00", "id": "cb68d0f3a8c4468d9b7c5595eb8f9001" }, @@ -38,7 +38,7 @@ Content-Type: application/json; charset=UTF-8 "lotID": "c7555f1bb878434d8815dea318304673", "eligible": false, "qualified": false, - "bidID": "5a84740ed0bd4aa3830adfb56c49ed62", + "bidID": "e0d41b30b35a430fb164a63e2cd8792b", "date": "2020-05-15T01:00:00+03:00", "id": "cdc3670ed483448a8cd1ed6d1146da99" } diff --git a/docs/source/tendering/cfaua/tutorial/register-2nd-bidder.http b/docs/source/tendering/cfaua/tutorial/register-2nd-bidder.http index c0d44a5d75..f6dbc0f2b8 100644 --- a/docs/source/tendering/cfaua/tutorial/register-2nd-bidder.http +++ b/docs/source/tendering/cfaua/tutorial/register-2nd-bidder.http @@ -1,12 +1,11 @@ POST /api/2.5/tenders/e5172ebc4c4c411f84f376ce6ede43b8/bids HTTP/1.0 Authorization: Bearer broker -Content-Length: 891 +Content-Length: 869 Content-Type: application/json Host: lb-api-sandbox.prozorro.gov.ua DATA: { "data": { - "selfEligible": true, "selfQualified": true, "lotValues": [ { @@ -44,7 +43,7 @@ DATA: Response: 201 Created Content-Type: application/json; charset=UTF-8 -Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/e5172ebc4c4c411f84f376ce6ede43b8/bids/e88e8fc3020640178a79c6e66d3dfd5f +Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/e5172ebc4c4c411f84f376ce6ede43b8/bids/1c4a2dcee85343898ea5fbfd8ce2bd6e { "access": { "transfer": "ad22cf4f696a4ae581936d20f1070ef4", @@ -52,7 +51,6 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/e5172ebc4c4c411f }, "data": { "status": "pending", - "selfEligible": true, "lotValues": [ { "relatedLot": "c7555f1bb878434d8815dea318304673", @@ -65,7 +63,7 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/e5172ebc4c4c411f } } ], - "selfQualified": true, + "id": "1c4a2dcee85343898ea5fbfd8ce2bd6e", "tenderers": [ { "contactPoint": { @@ -90,7 +88,7 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/e5172ebc4c4c411f } ], "date": "2020-05-15T01:00:00+03:00", - "id": "e88e8fc3020640178a79c6e66d3dfd5f" + "selfQualified": true } } diff --git a/docs/source/tendering/cfaua/tutorial/register-3rd-bidder.http b/docs/source/tendering/cfaua/tutorial/register-3rd-bidder.http index c8440b3080..3381bff3dc 100644 --- a/docs/source/tendering/cfaua/tutorial/register-3rd-bidder.http +++ b/docs/source/tendering/cfaua/tutorial/register-3rd-bidder.http @@ -1,6 +1,6 @@ POST /api/2.5/tenders/e5172ebc4c4c411f84f376ce6ede43b8/bids HTTP/1.0 Authorization: Bearer broker -Content-Length: 2698 +Content-Length: 2676 Content-Type: application/json Host: lb-api-sandbox.prozorro.gov.ua DATA: @@ -30,7 +30,6 @@ DATA: "title": "eligibility_doc.pdf" } ], - "selfEligible": true, "lotValues": [ { "relatedLot": "c7555f1bb878434d8815dea318304673", @@ -84,7 +83,7 @@ DATA: Response: 201 Created Content-Type: application/json; charset=UTF-8 -Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/e5172ebc4c4c411f84f376ce6ede43b8/bids/88c9f41eac914e1cb72d9a43fc03d702 +Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/e5172ebc4c4c411f84f376ce6ede43b8/bids/76ccebf7a163452886a6d2d8d39a564b { "access": { "transfer": "6cde841ee2954195921f072347856fc6", @@ -98,11 +97,11 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/e5172ebc4c4c411f "confidentiality": "public", "language": "uk", "title": "Proposal_part1.pdf", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/e5172ebc4c4c411f84f376ce6ede43b8/bids/88c9f41eac914e1cb72d9a43fc03d702/documents/5d9147ed06d348d69adf62875b7bd89b?download=521c95e91644431cbbc1e5fcf8326faf", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/e5172ebc4c4c411f84f376ce6ede43b8/bids/76ccebf7a163452886a6d2d8d39a564b/documents/2461364d2bef400580101b81b63f6b18?download=521c95e91644431cbbc1e5fcf8326faf", "format": "application/pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", - "id": "5d9147ed06d348d69adf62875b7bd89b", + "id": "2461364d2bef400580101b81b63f6b18", "dateModified": "2020-05-15T01:00:00+03:00" }, { @@ -115,7 +114,7 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/e5172ebc4c4c411f "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", "dateModified": "2020-05-15T01:00:00+03:00", - "id": "3f355e7a0b8646389ad0af8eef0e241b" + "id": "eb48db1664f34859b5f5dbc8253dd747" } ], "eligibilityDocuments": [ @@ -124,16 +123,15 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/e5172ebc4c4c411f "confidentiality": "public", "language": "uk", "title": "eligibility_doc.pdf", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/e5172ebc4c4c411f84f376ce6ede43b8/bids/88c9f41eac914e1cb72d9a43fc03d702/eligibility_documents/474da502332f48a0a117f28b44e21dde?download=bdb8f478361c43a0ac9a66feb62f281a", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/e5172ebc4c4c411f84f376ce6ede43b8/bids/76ccebf7a163452886a6d2d8d39a564b/eligibility_documents/4bfdcd78d6c34992a2dd9e52cbcc4e25?download=bdb8f478361c43a0ac9a66feb62f281a", "format": "application/pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", - "id": "474da502332f48a0a117f28b44e21dde", + "id": "4bfdcd78d6c34992a2dd9e52cbcc4e25", "dateModified": "2020-05-15T01:00:00+03:00" } ], - "selfEligible": true, - "id": "88c9f41eac914e1cb72d9a43fc03d702", + "id": "76ccebf7a163452886a6d2d8d39a564b", "lotValues": [ { "relatedLot": "c7555f1bb878434d8815dea318304673", @@ -146,18 +144,31 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/e5172ebc4c4c411f } } ], - "selfQualified": true, + "qualificationDocuments": [ + { + "hash": "md5:00000000000000000000000000000000", + "confidentiality": "public", + "language": "uk", + "title": "qualification_document.pdf", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/e5172ebc4c4c411f84f376ce6ede43b8/bids/76ccebf7a163452886a6d2d8d39a564b/qualification_documents/334e19d83bdb49e993b2deb8abf73b74?download=141bde5b81904999acc2752de07b93cb", + "format": "application/pdf", + "documentOf": "tender", + "datePublished": "2020-05-15T01:00:00+03:00", + "id": "334e19d83bdb49e993b2deb8abf73b74", + "dateModified": "2020-05-15T01:00:00+03:00" + } + ], "financialDocuments": [ { "hash": "md5:00000000000000000000000000000000", "confidentiality": "public", "language": "uk", "title": "financial_doc.pdf", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/e5172ebc4c4c411f84f376ce6ede43b8/bids/88c9f41eac914e1cb72d9a43fc03d702/financial_documents/e659e8802f38444a9f6f130ed5b39370?download=b4ed150c66e44f4bb8b86bb5285479f7", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/e5172ebc4c4c411f84f376ce6ede43b8/bids/76ccebf7a163452886a6d2d8d39a564b/financial_documents/60829f4ac5c740839457a16950ddb22e?download=b4ed150c66e44f4bb8b86bb5285479f7", "format": "application/pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", - "id": "e659e8802f38444a9f6f130ed5b39370", + "id": "60829f4ac5c740839457a16950ddb22e", "dateModified": "2020-05-15T01:00:00+03:00" } ], @@ -185,20 +196,7 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/e5172ebc4c4c411f } ], "date": "2020-05-15T01:00:00+03:00", - "qualificationDocuments": [ - { - "hash": "md5:00000000000000000000000000000000", - "confidentiality": "public", - "language": "uk", - "title": "qualification_document.pdf", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/e5172ebc4c4c411f84f376ce6ede43b8/bids/88c9f41eac914e1cb72d9a43fc03d702/qualification_documents/7fe9f418924a4f158c03e64046ec1c36?download=141bde5b81904999acc2752de07b93cb", - "format": "application/pdf", - "documentOf": "tender", - "datePublished": "2020-05-15T01:00:00+03:00", - "id": "7fe9f418924a4f158c03e64046ec1c36", - "dateModified": "2020-05-15T01:00:00+03:00" - } - ] + "selfQualified": true } } diff --git a/docs/source/tendering/cfaua/tutorial/register-4rd-bidder.http b/docs/source/tendering/cfaua/tutorial/register-4rd-bidder.http index 7d10365b77..c0b51456ea 100644 --- a/docs/source/tendering/cfaua/tutorial/register-4rd-bidder.http +++ b/docs/source/tendering/cfaua/tutorial/register-4rd-bidder.http @@ -1,6 +1,6 @@ POST /api/2.5/tenders/e5172ebc4c4c411f84f376ce6ede43b8/bids HTTP/1.0 Authorization: Bearer broker -Content-Length: 2698 +Content-Length: 2676 Content-Type: application/json Host: lb-api-sandbox.prozorro.gov.ua DATA: @@ -30,7 +30,6 @@ DATA: "title": "eligibility_doc.pdf" } ], - "selfEligible": true, "lotValues": [ { "relatedLot": "c7555f1bb878434d8815dea318304673", @@ -84,7 +83,7 @@ DATA: Response: 201 Created Content-Type: application/json; charset=UTF-8 -Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/e5172ebc4c4c411f84f376ce6ede43b8/bids/5a84740ed0bd4aa3830adfb56c49ed62 +Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/e5172ebc4c4c411f84f376ce6ede43b8/bids/e0d41b30b35a430fb164a63e2cd8792b { "access": { "transfer": "e9683a96e13748b08eb47d619d970626", @@ -98,11 +97,11 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/e5172ebc4c4c411f "confidentiality": "public", "language": "uk", "title": "Proposal_part1.pdf", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/e5172ebc4c4c411f84f376ce6ede43b8/bids/5a84740ed0bd4aa3830adfb56c49ed62/documents/63630c59ee2e456bb92e2d0bd8c7a717?download=521c95e91644431cbbc1e5fcf8326faf", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/e5172ebc4c4c411f84f376ce6ede43b8/bids/e0d41b30b35a430fb164a63e2cd8792b/documents/76385a93b70747b9a07b493fd542e5cb?download=521c95e91644431cbbc1e5fcf8326faf", "format": "application/pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", - "id": "63630c59ee2e456bb92e2d0bd8c7a717", + "id": "76385a93b70747b9a07b493fd542e5cb", "dateModified": "2020-05-15T01:00:00+03:00" }, { @@ -115,7 +114,7 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/e5172ebc4c4c411f "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", "dateModified": "2020-05-15T01:00:00+03:00", - "id": "44ff1578915a4ba48350bc0a1054b65c" + "id": "80a0f2685fff4cca98aa482618a1deb0" } ], "eligibilityDocuments": [ @@ -124,16 +123,15 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/e5172ebc4c4c411f "confidentiality": "public", "language": "uk", "title": "eligibility_doc.pdf", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/e5172ebc4c4c411f84f376ce6ede43b8/bids/5a84740ed0bd4aa3830adfb56c49ed62/eligibility_documents/28e17374e98c4f408038fb6c06f3dcc6?download=bdb8f478361c43a0ac9a66feb62f281a", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/e5172ebc4c4c411f84f376ce6ede43b8/bids/e0d41b30b35a430fb164a63e2cd8792b/eligibility_documents/1e4758fc996f43d482ccd4421009ed0a?download=bdb8f478361c43a0ac9a66feb62f281a", "format": "application/pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", - "id": "28e17374e98c4f408038fb6c06f3dcc6", + "id": "1e4758fc996f43d482ccd4421009ed0a", "dateModified": "2020-05-15T01:00:00+03:00" } ], - "selfEligible": true, - "id": "5a84740ed0bd4aa3830adfb56c49ed62", + "id": "e0d41b30b35a430fb164a63e2cd8792b", "lotValues": [ { "relatedLot": "c7555f1bb878434d8815dea318304673", @@ -146,18 +144,31 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/e5172ebc4c4c411f } } ], - "selfQualified": true, + "qualificationDocuments": [ + { + "hash": "md5:00000000000000000000000000000000", + "confidentiality": "public", + "language": "uk", + "title": "qualification_document.pdf", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/e5172ebc4c4c411f84f376ce6ede43b8/bids/e0d41b30b35a430fb164a63e2cd8792b/qualification_documents/5ead0617d1c14c7d9fc2ed9ae8d490ef?download=141bde5b81904999acc2752de07b93cb", + "format": "application/pdf", + "documentOf": "tender", + "datePublished": "2020-05-15T01:00:00+03:00", + "id": "5ead0617d1c14c7d9fc2ed9ae8d490ef", + "dateModified": "2020-05-15T01:00:00+03:00" + } + ], "financialDocuments": [ { "hash": "md5:00000000000000000000000000000000", "confidentiality": "public", "language": "uk", "title": "financial_doc.pdf", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/e5172ebc4c4c411f84f376ce6ede43b8/bids/5a84740ed0bd4aa3830adfb56c49ed62/financial_documents/9ea2469f9ce448c2bba2acca54efbf6a?download=b4ed150c66e44f4bb8b86bb5285479f7", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/e5172ebc4c4c411f84f376ce6ede43b8/bids/e0d41b30b35a430fb164a63e2cd8792b/financial_documents/4ddd065a8215404b9f9e4d67b5283709?download=b4ed150c66e44f4bb8b86bb5285479f7", "format": "application/pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", - "id": "9ea2469f9ce448c2bba2acca54efbf6a", + "id": "4ddd065a8215404b9f9e4d67b5283709", "dateModified": "2020-05-15T01:00:00+03:00" } ], @@ -185,20 +196,7 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/e5172ebc4c4c411f } ], "date": "2020-05-15T01:00:00+03:00", - "qualificationDocuments": [ - { - "hash": "md5:00000000000000000000000000000000", - "confidentiality": "public", - "language": "uk", - "title": "qualification_document.pdf", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/e5172ebc4c4c411f84f376ce6ede43b8/bids/5a84740ed0bd4aa3830adfb56c49ed62/qualification_documents/6eaf563d3ca34c1e9ec07c39a4fe71ae?download=141bde5b81904999acc2752de07b93cb", - "format": "application/pdf", - "documentOf": "tender", - "datePublished": "2020-05-15T01:00:00+03:00", - "id": "6eaf563d3ca34c1e9ec07c39a4fe71ae", - "dateModified": "2020-05-15T01:00:00+03:00" - } - ] + "selfQualified": true } } diff --git a/docs/source/tendering/cfaua/tutorial/register-bidder.http b/docs/source/tendering/cfaua/tutorial/register-bidder.http index 2885074eb5..23b7b66e05 100644 --- a/docs/source/tendering/cfaua/tutorial/register-bidder.http +++ b/docs/source/tendering/cfaua/tutorial/register-bidder.http @@ -1,22 +1,12 @@ POST /api/2.5/tenders/e5172ebc4c4c411f84f376ce6ede43b8/bids HTTP/1.0 Authorization: Bearer broker -Content-Length: 1068 +Content-Length: 1046 Content-Type: application/json Host: lb-api-sandbox.prozorro.gov.ua DATA: { "data": { "status": "draft", - "selfEligible": true, - "lotValues": [ - { - "relatedLot": "c7555f1bb878434d8815dea318304673", - "value": { - "amount": 500 - } - } - ], - "subcontractingDetails": "ДКП «Орфей», Україна", "tenderers": [ { "contactPoint": { @@ -40,13 +30,22 @@ DATA: } } ], - "selfQualified": true + "selfQualified": true, + "lotValues": [ + { + "relatedLot": "c7555f1bb878434d8815dea318304673", + "value": { + "amount": 500 + } + } + ], + "subcontractingDetails": "ДКП «Орфей», Україна" } } Response: 201 Created Content-Type: application/json; charset=UTF-8 -Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/e5172ebc4c4c411f84f376ce6ede43b8/bids/410cb59a0945497eb61cc4461f661569 +Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/e5172ebc4c4c411f84f376ce6ede43b8/bids/ccd5dc4ca3f84f9a8f9ec11010bd01ba { "access": { "transfer": "9a2b45a149a9472ead546e5f4daec353", @@ -54,7 +53,6 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/e5172ebc4c4c411f }, "data": { "status": "draft", - "selfEligible": true, "lotValues": [ { "relatedLot": "c7555f1bb878434d8815dea318304673", @@ -93,7 +91,7 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/e5172ebc4c4c411f } ], "date": "2020-05-15T01:00:00+03:00", - "id": "410cb59a0945497eb61cc4461f661569" + "id": "ccd5dc4ca3f84f9a8f9ec11010bd01ba" } } diff --git a/docs/source/tendering/cfaua/tutorial/reject-qualification3.http b/docs/source/tendering/cfaua/tutorial/reject-qualification3.http index b331cc9729..cc1b1a9c38 100644 --- a/docs/source/tendering/cfaua/tutorial/reject-qualification3.http +++ b/docs/source/tendering/cfaua/tutorial/reject-qualification3.http @@ -18,7 +18,7 @@ Content-Type: application/json; charset=UTF-8 "lotID": "c7555f1bb878434d8815dea318304673", "eligible": false, "qualified": false, - "bidID": "88c9f41eac914e1cb72d9a43fc03d702", + "bidID": "76ccebf7a163452886a6d2d8d39a564b", "date": "2020-05-15T01:00:00+03:00", "id": "cb68d0f3a8c4468d9b7c5595eb8f9001" } diff --git a/docs/source/tendering/cfaua/tutorial/rejected-bid-view.http b/docs/source/tendering/cfaua/tutorial/rejected-bid-view.http index 0b4f34c43e..c5efac0985 100644 --- a/docs/source/tendering/cfaua/tutorial/rejected-bid-view.http +++ b/docs/source/tendering/cfaua/tutorial/rejected-bid-view.http @@ -1,4 +1,4 @@ -GET /api/2.5/tenders/e5172ebc4c4c411f84f376ce6ede43b8/bids/88c9f41eac914e1cb72d9a43fc03d702?acc_token=1e40f3cf3fd64b8ebca3076b70a86e71 HTTP/1.0 +GET /api/2.5/tenders/e5172ebc4c4c411f84f376ce6ede43b8/bids/76ccebf7a163452886a6d2d8d39a564b?acc_token=1e40f3cf3fd64b8ebca3076b70a86e71 HTTP/1.0 Authorization: Bearer broker Host: lb-api-sandbox.prozorro.gov.ua @@ -17,7 +17,7 @@ Content-Type: application/json; charset=UTF-8 "format": "application/pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", - "id": "5d9147ed06d348d69adf62875b7bd89b", + "id": "2461364d2bef400580101b81b63f6b18", "dateModified": "2020-05-15T01:00:00+03:00" }, { @@ -25,12 +25,12 @@ Content-Type: application/json; charset=UTF-8 "confidentiality": "buyerOnly", "language": "uk", "format": "application/pdf", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/e5172ebc4c4c411f84f376ce6ede43b8/bids/88c9f41eac914e1cb72d9a43fc03d702/documents/3f355e7a0b8646389ad0af8eef0e241b?download=0de2a1c410ec4aa9a9b84705967be608", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/e5172ebc4c4c411f84f376ce6ede43b8/bids/76ccebf7a163452886a6d2d8d39a564b/documents/eb48db1664f34859b5f5dbc8253dd747?download=0de2a1c410ec4aa9a9b84705967be608", "confidentialityRationale": "Only our company sells badgers with pink hair.", "title": "Proposal_part2.pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", - "id": "3f355e7a0b8646389ad0af8eef0e241b", + "id": "eb48db1664f34859b5f5dbc8253dd747", "dateModified": "2020-05-15T01:00:00+03:00" } ], @@ -44,12 +44,11 @@ Content-Type: application/json; charset=UTF-8 "format": "application/pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", - "id": "474da502332f48a0a117f28b44e21dde", + "id": "4bfdcd78d6c34992a2dd9e52cbcc4e25", "dateModified": "2020-05-15T01:00:00+03:00" } ], - "selfEligible": true, - "selfQualified": true, + "id": "76ccebf7a163452886a6d2d8d39a564b", "tenderers": [ { "contactPoint": { @@ -73,7 +72,7 @@ Content-Type: application/json; charset=UTF-8 } } ], - "id": "88c9f41eac914e1cb72d9a43fc03d702" + "selfQualified": true } } diff --git a/docs/source/tendering/cfaua/tutorial/tender-agreement-get.http b/docs/source/tendering/cfaua/tutorial/tender-agreement-get.http index 25ea610744..56f13f22c4 100644 --- a/docs/source/tendering/cfaua/tutorial/tender-agreement-get.http +++ b/docs/source/tendering/cfaua/tutorial/tender-agreement-get.http @@ -43,7 +43,7 @@ Content-Type: application/json; charset=UTF-8 "amount": 0.5, "valueAddedTaxIncluded": true }, - "relatedItem": "c9f1001e9cf04ec9b6dba5517f0be455" + "relatedItem": "0054e405b9d64563bb0437ddf2a830f8" }, { "value": { @@ -51,7 +51,7 @@ Content-Type: application/json; charset=UTF-8 "amount": 0.5, "valueAddedTaxIncluded": true }, - "relatedItem": "d2921287716245e095f67d91b9ceafa6" + "relatedItem": "238443d82d0c43dab3543c1b3dd471b8" } ], "suppliers": [ @@ -77,7 +77,7 @@ Content-Type: application/json; charset=UTF-8 } } ], - "bidID": "5a84740ed0bd4aa3830adfb56c49ed62", + "bidID": "e0d41b30b35a430fb164a63e2cd8792b", "date": "2020-05-15T01:00:00+03:00", "awardID": "58aa9c80eeb345e998dc764a75f940ee", "id": "2221451d71af4bfa803fd5b9382103ed" @@ -91,7 +91,7 @@ Content-Type: application/json; charset=UTF-8 "amount": 0.5, "valueAddedTaxIncluded": true }, - "relatedItem": "c9f1001e9cf04ec9b6dba5517f0be455" + "relatedItem": "0054e405b9d64563bb0437ddf2a830f8" }, { "value": { @@ -99,7 +99,7 @@ Content-Type: application/json; charset=UTF-8 "amount": 0.5, "valueAddedTaxIncluded": true }, - "relatedItem": "d2921287716245e095f67d91b9ceafa6" + "relatedItem": "238443d82d0c43dab3543c1b3dd471b8" } ], "suppliers": [ @@ -125,7 +125,7 @@ Content-Type: application/json; charset=UTF-8 } } ], - "bidID": "e88e8fc3020640178a79c6e66d3dfd5f", + "bidID": "1c4a2dcee85343898ea5fbfd8ce2bd6e", "date": "2020-05-15T01:00:00+03:00", "awardID": "e39130af90ba485cacb7cdc36cdfc089", "id": "d5c9e2e28ee74a67a078c87bf9967a53" @@ -139,7 +139,7 @@ Content-Type: application/json; charset=UTF-8 "amount": 0.5, "valueAddedTaxIncluded": true }, - "relatedItem": "c9f1001e9cf04ec9b6dba5517f0be455" + "relatedItem": "0054e405b9d64563bb0437ddf2a830f8" }, { "value": { @@ -147,7 +147,7 @@ Content-Type: application/json; charset=UTF-8 "amount": 0.5, "valueAddedTaxIncluded": true }, - "relatedItem": "d2921287716245e095f67d91b9ceafa6" + "relatedItem": "238443d82d0c43dab3543c1b3dd471b8" } ], "suppliers": [ @@ -173,7 +173,7 @@ Content-Type: application/json; charset=UTF-8 } } ], - "bidID": "410cb59a0945497eb61cc4461f661569", + "bidID": "ccd5dc4ca3f84f9a8f9ec11010bd01ba", "date": "2020-05-15T01:00:00+03:00", "awardID": "fead43daad534c50b0dc2da8b64ccfbb", "id": "713faef521cf4366b30696f427b2f171" @@ -207,7 +207,7 @@ Content-Type: application/json; charset=UTF-8 "startDate": "2018-06-27T13:39:09.362837+03:00", "endDate": "2018-06-30T13:39:09.362837+03:00" }, - "id": "c9f1001e9cf04ec9b6dba5517f0be455", + "id": "0054e405b9d64563bb0437ddf2a830f8", "unit": { "code": "44617100-9", "name": "item" @@ -241,7 +241,7 @@ Content-Type: application/json; charset=UTF-8 "startDate": "2018-06-27T13:39:09.362837+03:00", "endDate": "2018-06-30T13:39:09.362837+03:00" }, - "id": "d2921287716245e095f67d91b9ceafa6", + "id": "238443d82d0c43dab3543c1b3dd471b8", "unit": { "code": "44617100-8", "name": "item" diff --git a/docs/source/tendering/cfaua/tutorial/tender-agreement-sign-date.http b/docs/source/tendering/cfaua/tutorial/tender-agreement-sign-date.http index 9b2ccc8242..c6ac3131a3 100644 --- a/docs/source/tendering/cfaua/tutorial/tender-agreement-sign-date.http +++ b/docs/source/tendering/cfaua/tutorial/tender-agreement-sign-date.http @@ -51,7 +51,7 @@ Content-Type: application/json; charset=UTF-8 "amount": 0.5, "valueAddedTaxIncluded": true }, - "relatedItem": "c9f1001e9cf04ec9b6dba5517f0be455" + "relatedItem": "0054e405b9d64563bb0437ddf2a830f8" }, { "value": { @@ -59,7 +59,7 @@ Content-Type: application/json; charset=UTF-8 "amount": 0.5, "valueAddedTaxIncluded": true }, - "relatedItem": "d2921287716245e095f67d91b9ceafa6" + "relatedItem": "238443d82d0c43dab3543c1b3dd471b8" } ], "suppliers": [ @@ -85,7 +85,7 @@ Content-Type: application/json; charset=UTF-8 } } ], - "bidID": "5a84740ed0bd4aa3830adfb56c49ed62", + "bidID": "e0d41b30b35a430fb164a63e2cd8792b", "date": "2020-05-15T01:00:00+03:00", "awardID": "58aa9c80eeb345e998dc764a75f940ee", "id": "2221451d71af4bfa803fd5b9382103ed" @@ -99,7 +99,7 @@ Content-Type: application/json; charset=UTF-8 "amount": 0.5, "valueAddedTaxIncluded": true }, - "relatedItem": "c9f1001e9cf04ec9b6dba5517f0be455" + "relatedItem": "0054e405b9d64563bb0437ddf2a830f8" }, { "value": { @@ -107,7 +107,7 @@ Content-Type: application/json; charset=UTF-8 "amount": 0.5, "valueAddedTaxIncluded": true }, - "relatedItem": "d2921287716245e095f67d91b9ceafa6" + "relatedItem": "238443d82d0c43dab3543c1b3dd471b8" } ], "suppliers": [ @@ -133,7 +133,7 @@ Content-Type: application/json; charset=UTF-8 } } ], - "bidID": "e88e8fc3020640178a79c6e66d3dfd5f", + "bidID": "1c4a2dcee85343898ea5fbfd8ce2bd6e", "date": "2020-05-15T01:00:00+03:00", "awardID": "e39130af90ba485cacb7cdc36cdfc089", "id": "d5c9e2e28ee74a67a078c87bf9967a53" @@ -147,7 +147,7 @@ Content-Type: application/json; charset=UTF-8 "amount": 0.5, "valueAddedTaxIncluded": true }, - "relatedItem": "c9f1001e9cf04ec9b6dba5517f0be455" + "relatedItem": "0054e405b9d64563bb0437ddf2a830f8" }, { "value": { @@ -155,7 +155,7 @@ Content-Type: application/json; charset=UTF-8 "amount": 0.5, "valueAddedTaxIncluded": true }, - "relatedItem": "d2921287716245e095f67d91b9ceafa6" + "relatedItem": "238443d82d0c43dab3543c1b3dd471b8" } ], "suppliers": [ @@ -181,7 +181,7 @@ Content-Type: application/json; charset=UTF-8 } } ], - "bidID": "410cb59a0945497eb61cc4461f661569", + "bidID": "ccd5dc4ca3f84f9a8f9ec11010bd01ba", "date": "2020-05-15T01:00:00+03:00", "awardID": "fead43daad534c50b0dc2da8b64ccfbb", "id": "713faef521cf4366b30696f427b2f171" @@ -215,7 +215,7 @@ Content-Type: application/json; charset=UTF-8 "startDate": "2018-06-27T13:39:09.362837+03:00", "endDate": "2018-06-30T13:39:09.362837+03:00" }, - "id": "c9f1001e9cf04ec9b6dba5517f0be455", + "id": "0054e405b9d64563bb0437ddf2a830f8", "unit": { "code": "44617100-9", "name": "item" @@ -249,7 +249,7 @@ Content-Type: application/json; charset=UTF-8 "startDate": "2018-06-27T13:39:09.362837+03:00", "endDate": "2018-06-30T13:39:09.362837+03:00" }, - "id": "d2921287716245e095f67d91b9ceafa6", + "id": "238443d82d0c43dab3543c1b3dd471b8", "unit": { "code": "44617100-8", "name": "item" diff --git a/docs/source/tendering/cfaua/tutorial/tender-agreement-sign.http b/docs/source/tendering/cfaua/tutorial/tender-agreement-sign.http index 053743dc3e..e3b18d7c14 100644 --- a/docs/source/tendering/cfaua/tutorial/tender-agreement-sign.http +++ b/docs/source/tendering/cfaua/tutorial/tender-agreement-sign.http @@ -55,7 +55,7 @@ Content-Type: application/json; charset=UTF-8 "amount": 0.5, "valueAddedTaxIncluded": true }, - "relatedItem": "c9f1001e9cf04ec9b6dba5517f0be455" + "relatedItem": "0054e405b9d64563bb0437ddf2a830f8" }, { "value": { @@ -63,7 +63,7 @@ Content-Type: application/json; charset=UTF-8 "amount": 0.5, "valueAddedTaxIncluded": true }, - "relatedItem": "d2921287716245e095f67d91b9ceafa6" + "relatedItem": "238443d82d0c43dab3543c1b3dd471b8" } ], "suppliers": [ @@ -89,7 +89,7 @@ Content-Type: application/json; charset=UTF-8 } } ], - "bidID": "5a84740ed0bd4aa3830adfb56c49ed62", + "bidID": "e0d41b30b35a430fb164a63e2cd8792b", "date": "2020-05-15T01:00:00+03:00", "awardID": "58aa9c80eeb345e998dc764a75f940ee", "id": "2221451d71af4bfa803fd5b9382103ed" @@ -103,7 +103,7 @@ Content-Type: application/json; charset=UTF-8 "amount": 0.5, "valueAddedTaxIncluded": true }, - "relatedItem": "c9f1001e9cf04ec9b6dba5517f0be455" + "relatedItem": "0054e405b9d64563bb0437ddf2a830f8" }, { "value": { @@ -111,7 +111,7 @@ Content-Type: application/json; charset=UTF-8 "amount": 0.5, "valueAddedTaxIncluded": true }, - "relatedItem": "d2921287716245e095f67d91b9ceafa6" + "relatedItem": "238443d82d0c43dab3543c1b3dd471b8" } ], "suppliers": [ @@ -137,7 +137,7 @@ Content-Type: application/json; charset=UTF-8 } } ], - "bidID": "e88e8fc3020640178a79c6e66d3dfd5f", + "bidID": "1c4a2dcee85343898ea5fbfd8ce2bd6e", "date": "2020-05-15T01:00:00+03:00", "awardID": "e39130af90ba485cacb7cdc36cdfc089", "id": "d5c9e2e28ee74a67a078c87bf9967a53" @@ -151,7 +151,7 @@ Content-Type: application/json; charset=UTF-8 "amount": 0.5, "valueAddedTaxIncluded": true }, - "relatedItem": "c9f1001e9cf04ec9b6dba5517f0be455" + "relatedItem": "0054e405b9d64563bb0437ddf2a830f8" }, { "value": { @@ -159,7 +159,7 @@ Content-Type: application/json; charset=UTF-8 "amount": 0.5, "valueAddedTaxIncluded": true }, - "relatedItem": "d2921287716245e095f67d91b9ceafa6" + "relatedItem": "238443d82d0c43dab3543c1b3dd471b8" } ], "suppliers": [ @@ -185,7 +185,7 @@ Content-Type: application/json; charset=UTF-8 } } ], - "bidID": "410cb59a0945497eb61cc4461f661569", + "bidID": "ccd5dc4ca3f84f9a8f9ec11010bd01ba", "date": "2020-05-15T01:00:00+03:00", "awardID": "fead43daad534c50b0dc2da8b64ccfbb", "id": "713faef521cf4366b30696f427b2f171" @@ -219,7 +219,7 @@ Content-Type: application/json; charset=UTF-8 "startDate": "2018-06-27T13:39:09.362837+03:00", "endDate": "2018-06-30T13:39:09.362837+03:00" }, - "id": "c9f1001e9cf04ec9b6dba5517f0be455", + "id": "0054e405b9d64563bb0437ddf2a830f8", "unit": { "code": "44617100-9", "name": "item" @@ -253,7 +253,7 @@ Content-Type: application/json; charset=UTF-8 "startDate": "2018-06-27T13:39:09.362837+03:00", "endDate": "2018-06-30T13:39:09.362837+03:00" }, - "id": "d2921287716245e095f67d91b9ceafa6", + "id": "238443d82d0c43dab3543c1b3dd471b8", "unit": { "code": "44617100-8", "name": "item" diff --git a/docs/source/tendering/cfaua/tutorial/tender-completed.http b/docs/source/tendering/cfaua/tutorial/tender-completed.http index ad5ff1c369..bff35a3a22 100644 --- a/docs/source/tendering/cfaua/tutorial/tender-completed.http +++ b/docs/source/tendering/cfaua/tutorial/tender-completed.http @@ -19,8 +19,8 @@ Content-Type: application/json; charset=UTF-8 }, "enquiryPeriod": { "startDate": "2020-03-24T01:00:00+03:00", - "clarificationsUntil": "2020-04-18T00:00:00+03:00", - "endDate": "2020-04-14T01:00:00+03:00", + "clarificationsUntil": "2020-04-17T00:00:00+03:00", + "endDate": "2020-04-14T00:00:00+03:00", "invalidationDate": "2020-05-15T01:00:00+03:00" }, "submissionMethod": "electronicAuction", @@ -53,7 +53,7 @@ Content-Type: application/json; charset=UTF-8 "date": "2020-05-15T01:00:00+03:00", "answer": "Таблицю додано в файлі \"Kalorijnist.xslx\"", "dateAnswered": "2020-05-15T01:00:00+03:00", - "id": "efba5567d08848afae0ebb78272aed79", + "id": "815205150bf34d0c88019bd165a1a986", "questionOf": "tender" } ], @@ -175,7 +175,7 @@ Content-Type: application/json; charset=UTF-8 "amount": 0.5, "valueAddedTaxIncluded": true }, - "relatedItem": "c9f1001e9cf04ec9b6dba5517f0be455" + "relatedItem": "0054e405b9d64563bb0437ddf2a830f8" }, { "value": { @@ -183,7 +183,7 @@ Content-Type: application/json; charset=UTF-8 "amount": 0.5, "valueAddedTaxIncluded": true }, - "relatedItem": "d2921287716245e095f67d91b9ceafa6" + "relatedItem": "238443d82d0c43dab3543c1b3dd471b8" } ], "suppliers": [ @@ -209,7 +209,7 @@ Content-Type: application/json; charset=UTF-8 } } ], - "bidID": "5a84740ed0bd4aa3830adfb56c49ed62", + "bidID": "e0d41b30b35a430fb164a63e2cd8792b", "date": "2020-05-15T01:00:00+03:00", "awardID": "58aa9c80eeb345e998dc764a75f940ee", "id": "2221451d71af4bfa803fd5b9382103ed" @@ -223,7 +223,7 @@ Content-Type: application/json; charset=UTF-8 "amount": 0.5, "valueAddedTaxIncluded": true }, - "relatedItem": "c9f1001e9cf04ec9b6dba5517f0be455" + "relatedItem": "0054e405b9d64563bb0437ddf2a830f8" }, { "value": { @@ -231,7 +231,7 @@ Content-Type: application/json; charset=UTF-8 "amount": 0.5, "valueAddedTaxIncluded": true }, - "relatedItem": "d2921287716245e095f67d91b9ceafa6" + "relatedItem": "238443d82d0c43dab3543c1b3dd471b8" } ], "suppliers": [ @@ -257,7 +257,7 @@ Content-Type: application/json; charset=UTF-8 } } ], - "bidID": "e88e8fc3020640178a79c6e66d3dfd5f", + "bidID": "1c4a2dcee85343898ea5fbfd8ce2bd6e", "date": "2020-05-15T01:00:00+03:00", "awardID": "e39130af90ba485cacb7cdc36cdfc089", "id": "d5c9e2e28ee74a67a078c87bf9967a53" @@ -271,7 +271,7 @@ Content-Type: application/json; charset=UTF-8 "amount": 0.5, "valueAddedTaxIncluded": true }, - "relatedItem": "c9f1001e9cf04ec9b6dba5517f0be455" + "relatedItem": "0054e405b9d64563bb0437ddf2a830f8" }, { "value": { @@ -279,7 +279,7 @@ Content-Type: application/json; charset=UTF-8 "amount": 0.5, "valueAddedTaxIncluded": true }, - "relatedItem": "d2921287716245e095f67d91b9ceafa6" + "relatedItem": "238443d82d0c43dab3543c1b3dd471b8" } ], "suppliers": [ @@ -305,7 +305,7 @@ Content-Type: application/json; charset=UTF-8 } } ], - "bidID": "410cb59a0945497eb61cc4461f661569", + "bidID": "ccd5dc4ca3f84f9a8f9ec11010bd01ba", "date": "2020-05-15T01:00:00+03:00", "awardID": "fead43daad534c50b0dc2da8b64ccfbb", "id": "713faef521cf4366b30696f427b2f171" @@ -339,7 +339,7 @@ Content-Type: application/json; charset=UTF-8 "startDate": "2018-06-27T13:39:09.362837+03:00", "endDate": "2018-06-30T13:39:09.362837+03:00" }, - "id": "c9f1001e9cf04ec9b6dba5517f0be455", + "id": "0054e405b9d64563bb0437ddf2a830f8", "unit": { "code": "44617100-9", "name": "item" @@ -373,7 +373,7 @@ Content-Type: application/json; charset=UTF-8 "startDate": "2018-06-27T13:39:09.362837+03:00", "endDate": "2018-06-30T13:39:09.362837+03:00" }, - "id": "d2921287716245e095f67d91b9ceafa6", + "id": "238443d82d0c43dab3543c1b3dd471b8", "unit": { "code": "44617100-8", "name": "item" @@ -411,7 +411,7 @@ Content-Type: application/json; charset=UTF-8 "lotID": "c7555f1bb878434d8815dea318304673", "eligible": true, "qualified": true, - "bidID": "410cb59a0945497eb61cc4461f661569", + "bidID": "ccd5dc4ca3f84f9a8f9ec11010bd01ba", "date": "2020-05-15T01:00:00+03:00", "id": "9eafb5e0a5ac4268a1f0821a11dae69d" }, @@ -420,7 +420,7 @@ Content-Type: application/json; charset=UTF-8 "lotID": "c7555f1bb878434d8815dea318304673", "eligible": true, "qualified": true, - "bidID": "e88e8fc3020640178a79c6e66d3dfd5f", + "bidID": "1c4a2dcee85343898ea5fbfd8ce2bd6e", "date": "2020-05-15T01:00:00+03:00", "id": "86fd0e3cd41f48eab89c5ac406b8334d" }, @@ -429,7 +429,7 @@ Content-Type: application/json; charset=UTF-8 "lotID": "c7555f1bb878434d8815dea318304673", "eligible": false, "qualified": false, - "bidID": "88c9f41eac914e1cb72d9a43fc03d702", + "bidID": "76ccebf7a163452886a6d2d8d39a564b", "date": "2020-05-15T01:00:00+03:00", "id": "cb68d0f3a8c4468d9b7c5595eb8f9001" }, @@ -438,7 +438,7 @@ Content-Type: application/json; charset=UTF-8 "lotID": "c7555f1bb878434d8815dea318304673", "eligible": true, "qualified": true, - "bidID": "5a84740ed0bd4aa3830adfb56c49ed62", + "bidID": "e0d41b30b35a430fb164a63e2cd8792b", "date": "2020-05-15T01:00:00+03:00", "id": "cdc3670ed483448a8cd1ed6d1146da99" } @@ -473,7 +473,7 @@ Content-Type: application/json; charset=UTF-8 } } ], - "bid_id": "5a84740ed0bd4aa3830adfb56c49ed62", + "bid_id": "e0d41b30b35a430fb164a63e2cd8792b", "value": { "currency": "UAH", "amount": 485, @@ -510,7 +510,7 @@ Content-Type: application/json; charset=UTF-8 } } ], - "bid_id": "e88e8fc3020640178a79c6e66d3dfd5f", + "bid_id": "1c4a2dcee85343898ea5fbfd8ce2bd6e", "value": { "currency": "UAH", "amount": 499, @@ -547,7 +547,7 @@ Content-Type: application/json; charset=UTF-8 } } ], - "bid_id": "410cb59a0945497eb61cc4461f661569", + "bid_id": "ccd5dc4ca3f84f9a8f9ec11010bd01ba", "value": { "currency": "UAH", "amount": 500.0, @@ -586,7 +586,7 @@ Content-Type: application/json; charset=UTF-8 } } ], - "bid_id": "5a84740ed0bd4aa3830adfb56c49ed62", + "bid_id": "e0d41b30b35a430fb164a63e2cd8792b", "value": { "currency": "UAH", "amount": 485, @@ -626,7 +626,7 @@ Content-Type: application/json; charset=UTF-8 "startDate": "2020-05-05T01:00:00+03:00", "endDate": "2020-05-15T01:00:00+03:00" }, - "bid_id": "5a84740ed0bd4aa3830adfb56c49ed62", + "bid_id": "e0d41b30b35a430fb164a63e2cd8792b", "value": { "currency": "UAH", "amount": 485, @@ -667,7 +667,7 @@ Content-Type: application/json; charset=UTF-8 "startDate": "2020-05-05T01:00:00+03:00", "endDate": "2020-05-15T01:00:00+03:00" }, - "bid_id": "e88e8fc3020640178a79c6e66d3dfd5f", + "bid_id": "1c4a2dcee85343898ea5fbfd8ce2bd6e", "value": { "currency": "UAH", "amount": 499, @@ -708,7 +708,7 @@ Content-Type: application/json; charset=UTF-8 "startDate": "2020-05-05T01:00:00+03:00", "endDate": "2020-05-15T01:00:00+03:00" }, - "bid_id": "410cb59a0945497eb61cc4461f661569", + "bid_id": "ccd5dc4ca3f84f9a8f9ec11010bd01ba", "value": { "currency": "UAH", "amount": 500.0, @@ -767,7 +767,7 @@ Content-Type: application/json; charset=UTF-8 "startDate": "2018-06-27T13:39:09.362837+03:00", "endDate": "2018-06-30T13:39:09.362837+03:00" }, - "id": "c9f1001e9cf04ec9b6dba5517f0be455", + "id": "0054e405b9d64563bb0437ddf2a830f8", "unit": { "code": "44617100-9", "name": "item" @@ -801,7 +801,7 @@ Content-Type: application/json; charset=UTF-8 "startDate": "2018-06-27T13:39:09.362837+03:00", "endDate": "2018-06-30T13:39:09.362837+03:00" }, - "id": "d2921287716245e095f67d91b9ceafa6", + "id": "238443d82d0c43dab3543c1b3dd471b8", "unit": { "code": "44617100-8", "name": "item" @@ -852,14 +852,13 @@ Content-Type: application/json; charset=UTF-8 "dateModified": "2020-05-15T01:00:00+03:00" } ], - "selfEligible": true, - "id": "410cb59a0945497eb61cc4461f661569", + "id": "ccd5dc4ca3f84f9a8f9ec11010bd01ba", "lotValues": [ { "relatedLot": "c7555f1bb878434d8815dea318304673", "date": "2020-05-15T01:00:00+03:00", "status": "active", - "participationUrl": "http://auction-sandbox.prozorro.gov.ua/tenders/e5172ebc4c4c411f84f376ce6ede43b8_c7555f1bb878434d8815dea318304673?key_for_bid=410cb59a0945497eb61cc4461f661569", + "participationUrl": "http://auction-sandbox.prozorro.gov.ua/tenders/e5172ebc4c4c411f84f376ce6ede43b8_c7555f1bb878434d8815dea318304673?key_for_bid=ccd5dc4ca3f84f9a8f9ec11010bd01ba", "value": { "currency": "UAH", "amount": 500.0, @@ -867,7 +866,32 @@ Content-Type: application/json; charset=UTF-8 } } ], - "selfQualified": true, + "qualificationDocuments": [ + { + "hash": "md5:00000000000000000000000000000000", + "confidentiality": "public", + "language": "uk", + "title": "qualification_document.pdf", + "url": "http://public-docs-sandbox.prozorro.gov.ua/get/fc6b13177ef949699443525662a19388?KeyID=a8968c46&Signature=pYd%252BsN9CAWQNJw9z0%2FiWRpC5pkNVl5YTtpkXcPXfua6QIBLN9F53AjKgbQuaEctK91DK3WBmGIPjqZSH0TpjBg%253D%253D", + "format": "application/pdf", + "documentOf": "tender", + "datePublished": "2020-05-15T01:00:00+03:00", + "id": "911a8244866f4ffdbd2b2a202d34043c", + "dateModified": "2020-05-15T01:00:00+03:00" + }, + { + "hash": "md5:00000000000000000000000000000000", + "confidentiality": "public", + "language": "uk", + "title": "qualification_document2.pdf", + "url": "http://public-docs-sandbox.prozorro.gov.ua/get/03ec7a79367644d0b9d45ec78b8a35c2?KeyID=a8968c46&Signature=LvHcotXawGncqVZuX5z5Eg2s9uk%252BdTXahDYWx4VYTuv51lb8mtpzECd1efZKpF3nCyZ9PdY08rgLYfHSoh0lCQ%253D%253D", + "format": "application/pdf", + "documentOf": "tender", + "datePublished": "2020-05-15T01:00:00+03:00", + "id": "911a8244866f4ffdbd2b2a202d34043c", + "dateModified": "2020-05-15T01:00:00+03:00" + } + ], "financialDocuments": [ { "hash": "md5:00000000000000000000000000000000", @@ -931,42 +955,16 @@ Content-Type: application/json; charset=UTF-8 ], "date": "2020-05-15T01:00:00+03:00", "subcontractingDetails": "ДКП «Орфей», Україна", - "qualificationDocuments": [ - { - "hash": "md5:00000000000000000000000000000000", - "confidentiality": "public", - "language": "uk", - "title": "qualification_document.pdf", - "url": "http://public-docs-sandbox.prozorro.gov.ua/get/fc6b13177ef949699443525662a19388?KeyID=a8968c46&Signature=pYd%252BsN9CAWQNJw9z0%2FiWRpC5pkNVl5YTtpkXcPXfua6QIBLN9F53AjKgbQuaEctK91DK3WBmGIPjqZSH0TpjBg%253D%253D", - "format": "application/pdf", - "documentOf": "tender", - "datePublished": "2020-05-15T01:00:00+03:00", - "id": "911a8244866f4ffdbd2b2a202d34043c", - "dateModified": "2020-05-15T01:00:00+03:00" - }, - { - "hash": "md5:00000000000000000000000000000000", - "confidentiality": "public", - "language": "uk", - "title": "qualification_document2.pdf", - "url": "http://public-docs-sandbox.prozorro.gov.ua/get/03ec7a79367644d0b9d45ec78b8a35c2?KeyID=a8968c46&Signature=LvHcotXawGncqVZuX5z5Eg2s9uk%252BdTXahDYWx4VYTuv51lb8mtpzECd1efZKpF3nCyZ9PdY08rgLYfHSoh0lCQ%253D%253D", - "format": "application/pdf", - "documentOf": "tender", - "datePublished": "2020-05-15T01:00:00+03:00", - "id": "911a8244866f4ffdbd2b2a202d34043c", - "dateModified": "2020-05-15T01:00:00+03:00" - } - ] + "selfQualified": true }, { "status": "active", - "selfEligible": true, "lotValues": [ { "relatedLot": "c7555f1bb878434d8815dea318304673", "date": "2020-05-15T01:00:00+03:00", "status": "active", - "participationUrl": "http://auction-sandbox.prozorro.gov.ua/tenders/e5172ebc4c4c411f84f376ce6ede43b8_c7555f1bb878434d8815dea318304673?key_for_bid=e88e8fc3020640178a79c6e66d3dfd5f", + "participationUrl": "http://auction-sandbox.prozorro.gov.ua/tenders/e5172ebc4c4c411f84f376ce6ede43b8_c7555f1bb878434d8815dea318304673?key_for_bid=1c4a2dcee85343898ea5fbfd8ce2bd6e", "value": { "currency": "UAH", "amount": 499, @@ -974,7 +972,7 @@ Content-Type: application/json; charset=UTF-8 } } ], - "selfQualified": true, + "id": "1c4a2dcee85343898ea5fbfd8ce2bd6e", "tenderers": [ { "contactPoint": { @@ -999,7 +997,7 @@ Content-Type: application/json; charset=UTF-8 } ], "date": "2020-05-15T01:00:00+03:00", - "id": "e88e8fc3020640178a79c6e66d3dfd5f" + "selfQualified": true }, { "status": "unsuccessful", @@ -1013,7 +1011,7 @@ Content-Type: application/json; charset=UTF-8 "format": "application/pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", - "id": "5d9147ed06d348d69adf62875b7bd89b", + "id": "2461364d2bef400580101b81b63f6b18", "dateModified": "2020-05-15T01:00:00+03:00" }, { @@ -1026,7 +1024,7 @@ Content-Type: application/json; charset=UTF-8 "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", "dateModified": "2020-05-15T01:00:00+03:00", - "id": "3f355e7a0b8646389ad0af8eef0e241b" + "id": "eb48db1664f34859b5f5dbc8253dd747" } ], "eligibilityDocuments": [ @@ -1039,12 +1037,11 @@ Content-Type: application/json; charset=UTF-8 "format": "application/pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", - "id": "474da502332f48a0a117f28b44e21dde", + "id": "4bfdcd78d6c34992a2dd9e52cbcc4e25", "dateModified": "2020-05-15T01:00:00+03:00" } ], - "selfEligible": true, - "selfQualified": true, + "id": "76ccebf7a163452886a6d2d8d39a564b", "tenderers": [ { "contactPoint": { @@ -1068,7 +1065,7 @@ Content-Type: application/json; charset=UTF-8 } } ], - "id": "88c9f41eac914e1cb72d9a43fc03d702" + "selfQualified": true }, { "status": "active", @@ -1082,7 +1079,7 @@ Content-Type: application/json; charset=UTF-8 "format": "application/pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", - "id": "63630c59ee2e456bb92e2d0bd8c7a717", + "id": "76385a93b70747b9a07b493fd542e5cb", "dateModified": "2020-05-15T01:00:00+03:00" }, { @@ -1095,7 +1092,7 @@ Content-Type: application/json; charset=UTF-8 "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", "dateModified": "2020-05-15T01:00:00+03:00", - "id": "44ff1578915a4ba48350bc0a1054b65c" + "id": "80a0f2685fff4cca98aa482618a1deb0" } ], "eligibilityDocuments": [ @@ -1108,18 +1105,17 @@ Content-Type: application/json; charset=UTF-8 "format": "application/pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", - "id": "28e17374e98c4f408038fb6c06f3dcc6", + "id": "1e4758fc996f43d482ccd4421009ed0a", "dateModified": "2020-05-15T01:00:00+03:00" } ], - "selfEligible": true, - "id": "5a84740ed0bd4aa3830adfb56c49ed62", + "id": "e0d41b30b35a430fb164a63e2cd8792b", "lotValues": [ { "relatedLot": "c7555f1bb878434d8815dea318304673", "date": "2020-05-15T01:00:00+03:00", "status": "active", - "participationUrl": "http://auction-sandbox.prozorro.gov.ua/tenders/e5172ebc4c4c411f84f376ce6ede43b8_c7555f1bb878434d8815dea318304673?key_for_bid=5a84740ed0bd4aa3830adfb56c49ed62", + "participationUrl": "http://auction-sandbox.prozorro.gov.ua/tenders/e5172ebc4c4c411f84f376ce6ede43b8_c7555f1bb878434d8815dea318304673?key_for_bid=e0d41b30b35a430fb164a63e2cd8792b", "value": { "currency": "UAH", "amount": 485, @@ -1127,7 +1123,20 @@ Content-Type: application/json; charset=UTF-8 } } ], - "selfQualified": true, + "qualificationDocuments": [ + { + "hash": "md5:00000000000000000000000000000000", + "confidentiality": "public", + "language": "uk", + "title": "qualification_document.pdf", + "url": "http://public-docs-sandbox.prozorro.gov.ua/get/141bde5b81904999acc2752de07b93cb?KeyID=a8968c46&Signature=oExdL7A%252BNYUdd79P29TmuxGK5BaJGugoatMVNKfLh3yCPg%2Frwp18aHz8n6DTL5gBfSMN8bpT4Vh39fiM%2F%252BqNDw%253D%253D", + "format": "application/pdf", + "documentOf": "tender", + "datePublished": "2020-05-15T01:00:00+03:00", + "id": "5ead0617d1c14c7d9fc2ed9ae8d490ef", + "dateModified": "2020-05-15T01:00:00+03:00" + } + ], "financialDocuments": [ { "hash": "md5:00000000000000000000000000000000", @@ -1138,7 +1147,7 @@ Content-Type: application/json; charset=UTF-8 "format": "application/pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", - "id": "9ea2469f9ce448c2bba2acca54efbf6a", + "id": "4ddd065a8215404b9f9e4d67b5283709", "dateModified": "2020-05-15T01:00:00+03:00" } ], @@ -1166,20 +1175,7 @@ Content-Type: application/json; charset=UTF-8 } ], "date": "2020-05-15T01:00:00+03:00", - "qualificationDocuments": [ - { - "hash": "md5:00000000000000000000000000000000", - "confidentiality": "public", - "language": "uk", - "title": "qualification_document.pdf", - "url": "http://public-docs-sandbox.prozorro.gov.ua/get/141bde5b81904999acc2752de07b93cb?KeyID=a8968c46&Signature=oExdL7A%252BNYUdd79P29TmuxGK5BaJGugoatMVNKfLh3yCPg%2Frwp18aHz8n6DTL5gBfSMN8bpT4Vh39fiM%2F%252BqNDw%253D%253D", - "format": "application/pdf", - "documentOf": "tender", - "datePublished": "2020-05-15T01:00:00+03:00", - "id": "6eaf563d3ca34c1e9ec07c39a4fe71ae", - "dateModified": "2020-05-15T01:00:00+03:00" - } - ] + "selfQualified": true } ], "value": { diff --git a/docs/source/tendering/cfaua/tutorial/tender-post-attempt-json-data.http b/docs/source/tendering/cfaua/tutorial/tender-post-attempt-json-data.http index eda5240c0a..cf06dc7770 100644 --- a/docs/source/tendering/cfaua/tutorial/tender-post-attempt-json-data.http +++ b/docs/source/tendering/cfaua/tutorial/tender-post-attempt-json-data.http @@ -167,8 +167,8 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/e5172ebc4c4c411f }, "enquiryPeriod": { "startDate": "2020-05-15T01:00:00+03:00", - "clarificationsUntil": "2020-06-12T00:00:00+03:00", - "endDate": "2020-06-05T01:00:00+03:00" + "clarificationsUntil": "2020-06-11T00:00:00+03:00", + "endDate": "2020-06-05T00:00:00+03:00" }, "submissionMethod": "electronicAuction", "next_check": "2020-06-15T01:00:00+03:00", @@ -280,7 +280,7 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/e5172ebc4c4c411f "startDate": "2018-06-27T13:39:09.362837+03:00", "endDate": "2018-06-30T13:39:09.362837+03:00" }, - "id": "c9f1001e9cf04ec9b6dba5517f0be455", + "id": "0054e405b9d64563bb0437ddf2a830f8", "unit": { "code": "44617100-9", "name": "item" @@ -314,7 +314,7 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/e5172ebc4c4c411f "startDate": "2018-06-27T13:39:09.362837+03:00", "endDate": "2018-06-30T13:39:09.362837+03:00" }, - "id": "d2921287716245e095f67d91b9ceafa6", + "id": "238443d82d0c43dab3543c1b3dd471b8", "unit": { "code": "44617100-8", "name": "item" diff --git a/docs/source/tendering/cfaua/tutorial/tender-unsuccessful.http b/docs/source/tendering/cfaua/tutorial/tender-unsuccessful.http index ef85d5f9cc..f2277f5141 100644 --- a/docs/source/tendering/cfaua/tutorial/tender-unsuccessful.http +++ b/docs/source/tendering/cfaua/tutorial/tender-unsuccessful.http @@ -19,8 +19,8 @@ Content-Type: application/json; charset=UTF-8 }, "enquiryPeriod": { "startDate": "2020-03-24T01:00:00+03:00", - "clarificationsUntil": "2020-04-18T00:00:00+03:00", - "endDate": "2020-04-14T01:00:00+03:00", + "clarificationsUntil": "2020-04-17T00:00:00+03:00", + "endDate": "2020-04-14T00:00:00+03:00", "invalidationDate": "2020-05-15T01:00:00+03:00" }, "submissionMethod": "electronicAuction", @@ -53,7 +53,7 @@ Content-Type: application/json; charset=UTF-8 "date": "2020-05-15T01:00:00+03:00", "answer": "Таблицю додано в файлі \"Kalorijnist.xslx\"", "dateAnswered": "2020-05-15T01:00:00+03:00", - "id": "efba5567d08848afae0ebb78272aed79", + "id": "815205150bf34d0c88019bd165a1a986", "questionOf": "tender" } ], @@ -175,7 +175,7 @@ Content-Type: application/json; charset=UTF-8 "amount": 0.5, "valueAddedTaxIncluded": true }, - "relatedItem": "c9f1001e9cf04ec9b6dba5517f0be455" + "relatedItem": "0054e405b9d64563bb0437ddf2a830f8" }, { "value": { @@ -183,7 +183,7 @@ Content-Type: application/json; charset=UTF-8 "amount": 0.5, "valueAddedTaxIncluded": true }, - "relatedItem": "d2921287716245e095f67d91b9ceafa6" + "relatedItem": "238443d82d0c43dab3543c1b3dd471b8" } ], "suppliers": [ @@ -209,7 +209,7 @@ Content-Type: application/json; charset=UTF-8 } } ], - "bidID": "5a84740ed0bd4aa3830adfb56c49ed62", + "bidID": "e0d41b30b35a430fb164a63e2cd8792b", "date": "2020-05-15T01:00:00+03:00", "awardID": "58aa9c80eeb345e998dc764a75f940ee", "id": "2221451d71af4bfa803fd5b9382103ed" @@ -223,7 +223,7 @@ Content-Type: application/json; charset=UTF-8 "amount": 0.5, "valueAddedTaxIncluded": true }, - "relatedItem": "c9f1001e9cf04ec9b6dba5517f0be455" + "relatedItem": "0054e405b9d64563bb0437ddf2a830f8" }, { "value": { @@ -231,7 +231,7 @@ Content-Type: application/json; charset=UTF-8 "amount": 0.5, "valueAddedTaxIncluded": true }, - "relatedItem": "d2921287716245e095f67d91b9ceafa6" + "relatedItem": "238443d82d0c43dab3543c1b3dd471b8" } ], "suppliers": [ @@ -257,7 +257,7 @@ Content-Type: application/json; charset=UTF-8 } } ], - "bidID": "e88e8fc3020640178a79c6e66d3dfd5f", + "bidID": "1c4a2dcee85343898ea5fbfd8ce2bd6e", "date": "2020-05-15T01:00:00+03:00", "awardID": "e39130af90ba485cacb7cdc36cdfc089", "id": "d5c9e2e28ee74a67a078c87bf9967a53" @@ -271,7 +271,7 @@ Content-Type: application/json; charset=UTF-8 "amount": 0.5, "valueAddedTaxIncluded": true }, - "relatedItem": "c9f1001e9cf04ec9b6dba5517f0be455" + "relatedItem": "0054e405b9d64563bb0437ddf2a830f8" }, { "value": { @@ -279,7 +279,7 @@ Content-Type: application/json; charset=UTF-8 "amount": 0.5, "valueAddedTaxIncluded": true }, - "relatedItem": "d2921287716245e095f67d91b9ceafa6" + "relatedItem": "238443d82d0c43dab3543c1b3dd471b8" } ], "suppliers": [ @@ -305,7 +305,7 @@ Content-Type: application/json; charset=UTF-8 } } ], - "bidID": "410cb59a0945497eb61cc4461f661569", + "bidID": "ccd5dc4ca3f84f9a8f9ec11010bd01ba", "date": "2020-05-15T01:00:00+03:00", "awardID": "fead43daad534c50b0dc2da8b64ccfbb", "id": "713faef521cf4366b30696f427b2f171" @@ -339,7 +339,7 @@ Content-Type: application/json; charset=UTF-8 "startDate": "2018-06-27T13:39:09.362837+03:00", "endDate": "2018-06-30T13:39:09.362837+03:00" }, - "id": "c9f1001e9cf04ec9b6dba5517f0be455", + "id": "0054e405b9d64563bb0437ddf2a830f8", "unit": { "code": "44617100-9", "name": "item" @@ -373,7 +373,7 @@ Content-Type: application/json; charset=UTF-8 "startDate": "2018-06-27T13:39:09.362837+03:00", "endDate": "2018-06-30T13:39:09.362837+03:00" }, - "id": "d2921287716245e095f67d91b9ceafa6", + "id": "238443d82d0c43dab3543c1b3dd471b8", "unit": { "code": "44617100-8", "name": "item" @@ -411,7 +411,7 @@ Content-Type: application/json; charset=UTF-8 "lotID": "c7555f1bb878434d8815dea318304673", "eligible": true, "qualified": true, - "bidID": "410cb59a0945497eb61cc4461f661569", + "bidID": "ccd5dc4ca3f84f9a8f9ec11010bd01ba", "date": "2020-05-15T01:00:00+03:00", "id": "9eafb5e0a5ac4268a1f0821a11dae69d" }, @@ -420,7 +420,7 @@ Content-Type: application/json; charset=UTF-8 "lotID": "c7555f1bb878434d8815dea318304673", "eligible": true, "qualified": true, - "bidID": "e88e8fc3020640178a79c6e66d3dfd5f", + "bidID": "1c4a2dcee85343898ea5fbfd8ce2bd6e", "date": "2020-05-15T01:00:00+03:00", "id": "86fd0e3cd41f48eab89c5ac406b8334d" }, @@ -429,7 +429,7 @@ Content-Type: application/json; charset=UTF-8 "lotID": "c7555f1bb878434d8815dea318304673", "eligible": false, "qualified": false, - "bidID": "88c9f41eac914e1cb72d9a43fc03d702", + "bidID": "76ccebf7a163452886a6d2d8d39a564b", "date": "2020-05-15T01:00:00+03:00", "id": "cb68d0f3a8c4468d9b7c5595eb8f9001" }, @@ -438,7 +438,7 @@ Content-Type: application/json; charset=UTF-8 "lotID": "c7555f1bb878434d8815dea318304673", "eligible": true, "qualified": true, - "bidID": "5a84740ed0bd4aa3830adfb56c49ed62", + "bidID": "e0d41b30b35a430fb164a63e2cd8792b", "date": "2020-05-15T01:00:00+03:00", "id": "cdc3670ed483448a8cd1ed6d1146da99" } @@ -473,7 +473,7 @@ Content-Type: application/json; charset=UTF-8 } } ], - "bid_id": "5a84740ed0bd4aa3830adfb56c49ed62", + "bid_id": "e0d41b30b35a430fb164a63e2cd8792b", "value": { "currency": "UAH", "amount": 485, @@ -510,7 +510,7 @@ Content-Type: application/json; charset=UTF-8 } } ], - "bid_id": "e88e8fc3020640178a79c6e66d3dfd5f", + "bid_id": "1c4a2dcee85343898ea5fbfd8ce2bd6e", "value": { "currency": "UAH", "amount": 499, @@ -547,7 +547,7 @@ Content-Type: application/json; charset=UTF-8 } } ], - "bid_id": "410cb59a0945497eb61cc4461f661569", + "bid_id": "ccd5dc4ca3f84f9a8f9ec11010bd01ba", "value": { "currency": "UAH", "amount": 500.0, @@ -586,7 +586,7 @@ Content-Type: application/json; charset=UTF-8 } } ], - "bid_id": "5a84740ed0bd4aa3830adfb56c49ed62", + "bid_id": "e0d41b30b35a430fb164a63e2cd8792b", "value": { "currency": "UAH", "amount": 485, @@ -626,7 +626,7 @@ Content-Type: application/json; charset=UTF-8 "startDate": "2020-05-05T01:00:00+03:00", "endDate": "2020-05-15T01:00:00+03:00" }, - "bid_id": "5a84740ed0bd4aa3830adfb56c49ed62", + "bid_id": "e0d41b30b35a430fb164a63e2cd8792b", "value": { "currency": "UAH", "amount": 485, @@ -667,7 +667,7 @@ Content-Type: application/json; charset=UTF-8 "startDate": "2020-05-05T01:00:00+03:00", "endDate": "2020-05-15T01:00:00+03:00" }, - "bid_id": "e88e8fc3020640178a79c6e66d3dfd5f", + "bid_id": "1c4a2dcee85343898ea5fbfd8ce2bd6e", "value": { "currency": "UAH", "amount": 499, @@ -708,7 +708,7 @@ Content-Type: application/json; charset=UTF-8 "startDate": "2020-05-05T01:00:00+03:00", "endDate": "2020-05-15T01:00:00+03:00" }, - "bid_id": "410cb59a0945497eb61cc4461f661569", + "bid_id": "ccd5dc4ca3f84f9a8f9ec11010bd01ba", "value": { "currency": "UAH", "amount": 500.0, @@ -767,7 +767,7 @@ Content-Type: application/json; charset=UTF-8 "startDate": "2018-06-27T13:39:09.362837+03:00", "endDate": "2018-06-30T13:39:09.362837+03:00" }, - "id": "c9f1001e9cf04ec9b6dba5517f0be455", + "id": "0054e405b9d64563bb0437ddf2a830f8", "unit": { "code": "44617100-9", "name": "item" @@ -801,7 +801,7 @@ Content-Type: application/json; charset=UTF-8 "startDate": "2018-06-27T13:39:09.362837+03:00", "endDate": "2018-06-30T13:39:09.362837+03:00" }, - "id": "d2921287716245e095f67d91b9ceafa6", + "id": "238443d82d0c43dab3543c1b3dd471b8", "unit": { "code": "44617100-8", "name": "item" diff --git a/docs/source/tendering/cfaua/tutorial/update-cancellation-doc.http b/docs/source/tendering/cfaua/tutorial/update-cancellation-doc.http index f50fa2e66a..17f2c41118 100644 --- a/docs/source/tendering/cfaua/tutorial/update-cancellation-doc.http +++ b/docs/source/tendering/cfaua/tutorial/update-cancellation-doc.http @@ -1,4 +1,4 @@ -PUT /api/2.5/tenders/e5172ebc4c4c411f84f376ce6ede43b8/cancellations/8d867a37ec004bee9d571231d313987b/documents/4a6e26bf559346d0b4ca0298bf8a61d0?acc_token=1e40f3cf3fd64b8ebca3076b70a86e71 HTTP/1.0 +PUT /api/2.5/tenders/e5172ebc4c4c411f84f376ce6ede43b8/cancellations/f35b5fe67e064722b22ccf511efe711b/documents/4a6e26bf559346d0b4ca0298bf8a61d0?acc_token=1e40f3cf3fd64b8ebca3076b70a86e71 HTTP/1.0 Authorization: Bearer broker Content-Length: 145 Content-Type: multipart/form-data; boundary=---BOUNDARY diff --git a/docs/source/tendering/cfaua/tutorial/update-cancellation-reasonType.http b/docs/source/tendering/cfaua/tutorial/update-cancellation-reasonType.http index 17bc64c373..bfde5f7039 100644 --- a/docs/source/tendering/cfaua/tutorial/update-cancellation-reasonType.http +++ b/docs/source/tendering/cfaua/tutorial/update-cancellation-reasonType.http @@ -1,4 +1,4 @@ -PATCH /api/2.5/tenders/e5172ebc4c4c411f84f376ce6ede43b8/cancellations/8d867a37ec004bee9d571231d313987b?acc_token=1e40f3cf3fd64b8ebca3076b70a86e71 HTTP/1.0 +PATCH /api/2.5/tenders/e5172ebc4c4c411f84f376ce6ede43b8/cancellations/f35b5fe67e064722b22ccf511efe711b?acc_token=1e40f3cf3fd64b8ebca3076b70a86e71 HTTP/1.0 Authorization: Bearer broker Content-Length: 37 Content-Type: application/json @@ -19,7 +19,7 @@ Content-Type: application/json; charset=UTF-8 "reasonType": "unFixable", "date": "2020-05-15T01:00:01+03:00", "cancellationOf": "tender", - "id": "8d867a37ec004bee9d571231d313987b" + "id": "f35b5fe67e064722b22ccf511efe711b" } } diff --git a/docs/source/tendering/cfaua/tutorial/update-tender-after-enqiery-with-update-periods.http b/docs/source/tendering/cfaua/tutorial/update-tender-after-enqiery-with-update-periods.http index 5ab5e87f6a..d858029b0c 100644 --- a/docs/source/tendering/cfaua/tutorial/update-tender-after-enqiery-with-update-periods.http +++ b/docs/source/tendering/cfaua/tutorial/update-tender-after-enqiery-with-update-periods.http @@ -23,13 +23,13 @@ Content-Type: application/json; charset=UTF-8 "procurementMethod": "open", "mainProcurementCategory": "goods", "complaintPeriod": { - "startDate": "2020-04-17T01:00:00+03:00", + "startDate": "2020-04-20T01:00:00+03:00", "endDate": "2020-05-19T00:00:00+03:00" }, "enquiryPeriod": { - "startDate": "2020-04-17T01:00:00+03:00", - "clarificationsUntil": "2020-05-19T00:00:00+03:00", - "endDate": "2020-05-13T01:00:00+03:00", + "startDate": "2020-04-20T01:00:00+03:00", + "clarificationsUntil": "2020-05-16T00:00:00+03:00", + "endDate": "2020-05-13T00:00:00+03:00", "invalidationDate": "2020-05-15T01:00:00+03:00" }, "submissionMethod": "electronicAuction", @@ -65,7 +65,7 @@ Content-Type: application/json; charset=UTF-8 "title": "Калорійність", "date": "2020-05-15T01:00:00+03:00", "answer": "Таблицю додано в файлі \"Kalorijnist.xslx\"", - "id": "efba5567d08848afae0ebb78272aed79", + "id": "815205150bf34d0c88019bd165a1a986", "questionOf": "tender" } ], @@ -145,7 +145,7 @@ Content-Type: application/json; charset=UTF-8 "dateModified": "2020-05-15T01:00:00+03:00", "status": "active.tendering", "tenderPeriod": { - "startDate": "2020-04-17T01:00:00+03:00", + "startDate": "2020-04-20T01:00:00+03:00", "endDate": "2020-05-23T01:00:00+03:00" }, "title_en": "Cases for state awards", @@ -199,7 +199,7 @@ Content-Type: application/json; charset=UTF-8 "startDate": "2018-06-27T13:39:09.362837+03:00", "endDate": "2018-06-30T13:39:09.362837+03:00" }, - "id": "c9f1001e9cf04ec9b6dba5517f0be455", + "id": "0054e405b9d64563bb0437ddf2a830f8", "unit": { "code": "44617100-9", "name": "item" @@ -233,7 +233,7 @@ Content-Type: application/json; charset=UTF-8 "startDate": "2018-06-27T13:39:09.362837+03:00", "endDate": "2018-06-30T13:39:09.362837+03:00" }, - "id": "d2921287716245e095f67d91b9ceafa6", + "id": "238443d82d0c43dab3543c1b3dd471b8", "unit": { "code": "44617100-8", "name": "item" diff --git a/docs/source/tendering/cfaua/tutorial/upload-bid-eligibility-document-proposal.http b/docs/source/tendering/cfaua/tutorial/upload-bid-eligibility-document-proposal.http index 452224e1c2..cac1efd496 100644 --- a/docs/source/tendering/cfaua/tutorial/upload-bid-eligibility-document-proposal.http +++ b/docs/source/tendering/cfaua/tutorial/upload-bid-eligibility-document-proposal.http @@ -1,4 +1,4 @@ -POST /api/2.5/tenders/e5172ebc4c4c411f84f376ce6ede43b8/bids/410cb59a0945497eb61cc4461f661569/eligibility_documents?acc_token=7ba8d77208c04422b161882dc2c4b5c2 HTTP/1.0 +POST /api/2.5/tenders/e5172ebc4c4c411f84f376ce6ede43b8/bids/ccd5dc4ca3f84f9a8f9ec11010bd01ba/eligibility_documents?acc_token=7ba8d77208c04422b161882dc2c4b5c2 HTTP/1.0 Authorization: Bearer broker Content-Length: 151 Content-Type: multipart/form-data; boundary=---BOUNDARY @@ -14,14 +14,14 @@ content Response: 201 Created Content-Type: application/json; charset=UTF-8 -Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/e5172ebc4c4c411f84f376ce6ede43b8/bids/410cb59a0945497eb61cc4461f661569/eligibility_documents/dd2433e3b6734869b0297de6ee3e2df8 +Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/e5172ebc4c4c411f84f376ce6ede43b8/bids/ccd5dc4ca3f84f9a8f9ec11010bd01ba/eligibility_documents/dd2433e3b6734869b0297de6ee3e2df8 { "data": { "hash": "md5:00000000000000000000000000000000", "confidentiality": "public", "language": "uk", "title": "eligibility_doc.pdf", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/e5172ebc4c4c411f84f376ce6ede43b8/bids/410cb59a0945497eb61cc4461f661569/eligibility_documents/dd2433e3b6734869b0297de6ee3e2df8?download=b4b5be95835a45cca55f81ad8479d8f5", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/e5172ebc4c4c411f84f376ce6ede43b8/bids/ccd5dc4ca3f84f9a8f9ec11010bd01ba/eligibility_documents/dd2433e3b6734869b0297de6ee3e2df8?download=b4b5be95835a45cca55f81ad8479d8f5", "format": "application/pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", diff --git a/docs/source/tendering/cfaua/tutorial/upload-bid-financial-document-proposal.http b/docs/source/tendering/cfaua/tutorial/upload-bid-financial-document-proposal.http index 73807c9864..e075dcfd43 100644 --- a/docs/source/tendering/cfaua/tutorial/upload-bid-financial-document-proposal.http +++ b/docs/source/tendering/cfaua/tutorial/upload-bid-financial-document-proposal.http @@ -1,4 +1,4 @@ -POST /api/2.5/tenders/e5172ebc4c4c411f84f376ce6ede43b8/bids/410cb59a0945497eb61cc4461f661569/financial_documents?acc_token=7ba8d77208c04422b161882dc2c4b5c2 HTTP/1.0 +POST /api/2.5/tenders/e5172ebc4c4c411f84f376ce6ede43b8/bids/ccd5dc4ca3f84f9a8f9ec11010bd01ba/financial_documents?acc_token=7ba8d77208c04422b161882dc2c4b5c2 HTTP/1.0 Authorization: Bearer broker Content-Length: 147 Content-Type: multipart/form-data; boundary=---BOUNDARY @@ -14,14 +14,14 @@ Content-Type: application/pdf Response: 201 Created Content-Type: application/json; charset=UTF-8 -Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/e5172ebc4c4c411f84f376ce6ede43b8/bids/410cb59a0945497eb61cc4461f661569/financial_documents/7ee1271306dc4c19befc8c2f5868c34a +Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/e5172ebc4c4c411f84f376ce6ede43b8/bids/ccd5dc4ca3f84f9a8f9ec11010bd01ba/financial_documents/7ee1271306dc4c19befc8c2f5868c34a { "data": { "hash": "md5:00000000000000000000000000000000", "confidentiality": "public", "language": "uk", "title": "financial_doc.pdf", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/e5172ebc4c4c411f84f376ce6ede43b8/bids/410cb59a0945497eb61cc4461f661569/financial_documents/7ee1271306dc4c19befc8c2f5868c34a?download=2f8852ebe331410c908fecb00de667a4", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/e5172ebc4c4c411f84f376ce6ede43b8/bids/ccd5dc4ca3f84f9a8f9ec11010bd01ba/financial_documents/7ee1271306dc4c19befc8c2f5868c34a?download=2f8852ebe331410c908fecb00de667a4", "format": "application/pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", diff --git a/docs/source/tendering/cfaua/tutorial/upload-bid-private-proposal.http b/docs/source/tendering/cfaua/tutorial/upload-bid-private-proposal.http index 3b67b8b4cc..aca8bddb22 100644 --- a/docs/source/tendering/cfaua/tutorial/upload-bid-private-proposal.http +++ b/docs/source/tendering/cfaua/tutorial/upload-bid-private-proposal.http @@ -1,4 +1,4 @@ -POST /api/2.5/tenders/e5172ebc4c4c411f84f376ce6ede43b8/bids/410cb59a0945497eb61cc4461f661569/documents?acc_token=7ba8d77208c04422b161882dc2c4b5c2 HTTP/1.0 +POST /api/2.5/tenders/e5172ebc4c4c411f84f376ce6ede43b8/bids/ccd5dc4ca3f84f9a8f9ec11010bd01ba/documents?acc_token=7ba8d77208c04422b161882dc2c4b5c2 HTTP/1.0 Authorization: Bearer broker Content-Length: 156 Content-Type: multipart/form-data; boundary=---BOUNDARY @@ -14,14 +14,14 @@ content Response: 201 Created Content-Type: application/json; charset=UTF-8 -Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/e5172ebc4c4c411f84f376ce6ede43b8/bids/410cb59a0945497eb61cc4461f661569/documents/181271c244124b6ba014c2833d0a8c9e +Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/e5172ebc4c4c411f84f376ce6ede43b8/bids/ccd5dc4ca3f84f9a8f9ec11010bd01ba/documents/181271c244124b6ba014c2833d0a8c9e { "data": { "hash": "md5:00000000000000000000000000000000", "confidentiality": "public", "language": "uk", "title": "Proposal_top_secrets.pdf", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/e5172ebc4c4c411f84f376ce6ede43b8/bids/410cb59a0945497eb61cc4461f661569/documents/181271c244124b6ba014c2833d0a8c9e?download=462ce1c4b3c14bc68e1aa30e4abc6560", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/e5172ebc4c4c411f84f376ce6ede43b8/bids/ccd5dc4ca3f84f9a8f9ec11010bd01ba/documents/181271c244124b6ba014c2833d0a8c9e?download=462ce1c4b3c14bc68e1aa30e4abc6560", "format": "application/pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", diff --git a/docs/source/tendering/cfaua/tutorial/upload-bid-proposal.http b/docs/source/tendering/cfaua/tutorial/upload-bid-proposal.http index 317b3ba330..d44820bddf 100644 --- a/docs/source/tendering/cfaua/tutorial/upload-bid-proposal.http +++ b/docs/source/tendering/cfaua/tutorial/upload-bid-proposal.http @@ -1,4 +1,4 @@ -POST /api/2.5/tenders/e5172ebc4c4c411f84f376ce6ede43b8/bids/410cb59a0945497eb61cc4461f661569/documents?acc_token=7ba8d77208c04422b161882dc2c4b5c2 HTTP/1.0 +POST /api/2.5/tenders/e5172ebc4c4c411f84f376ce6ede43b8/bids/ccd5dc4ca3f84f9a8f9ec11010bd01ba/documents?acc_token=7ba8d77208c04422b161882dc2c4b5c2 HTTP/1.0 Authorization: Bearer broker Content-Length: 144 Content-Type: multipart/form-data; boundary=---BOUNDARY @@ -14,14 +14,14 @@ content Response: 201 Created Content-Type: application/json; charset=UTF-8 -Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/e5172ebc4c4c411f84f376ce6ede43b8/bids/410cb59a0945497eb61cc4461f661569/documents/eb68a5d3295e47e2941c983ac17b2fb4 +Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/e5172ebc4c4c411f84f376ce6ede43b8/bids/ccd5dc4ca3f84f9a8f9ec11010bd01ba/documents/eb68a5d3295e47e2941c983ac17b2fb4 { "data": { "hash": "md5:00000000000000000000000000000000", "confidentiality": "public", "language": "uk", "title": "Proposal.pdf", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/e5172ebc4c4c411f84f376ce6ede43b8/bids/410cb59a0945497eb61cc4461f661569/documents/eb68a5d3295e47e2941c983ac17b2fb4?download=fe2f4bf832ea4f7fb2297473766f749b", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/e5172ebc4c4c411f84f376ce6ede43b8/bids/ccd5dc4ca3f84f9a8f9ec11010bd01ba/documents/eb68a5d3295e47e2941c983ac17b2fb4?download=fe2f4bf832ea4f7fb2297473766f749b", "format": "application/pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", diff --git a/docs/source/tendering/cfaua/tutorial/upload-bid-qualification-document-proposal-updated.http b/docs/source/tendering/cfaua/tutorial/upload-bid-qualification-document-proposal-updated.http index 6e21d291ed..0993184ab2 100644 --- a/docs/source/tendering/cfaua/tutorial/upload-bid-qualification-document-proposal-updated.http +++ b/docs/source/tendering/cfaua/tutorial/upload-bid-qualification-document-proposal-updated.http @@ -1,4 +1,4 @@ -PUT /api/2.5/tenders/e5172ebc4c4c411f84f376ce6ede43b8/bids/410cb59a0945497eb61cc4461f661569/qualification_documents/911a8244866f4ffdbd2b2a202d34043c?acc_token=7ba8d77208c04422b161882dc2c4b5c2 HTTP/1.0 +PUT /api/2.5/tenders/e5172ebc4c4c411f84f376ce6ede43b8/bids/ccd5dc4ca3f84f9a8f9ec11010bd01ba/qualification_documents/911a8244866f4ffdbd2b2a202d34043c?acc_token=7ba8d77208c04422b161882dc2c4b5c2 HTTP/1.0 Authorization: Bearer broker Content-Length: 159 Content-Type: multipart/form-data; boundary=---BOUNDARY @@ -20,7 +20,7 @@ Content-Type: application/json; charset=UTF-8 "confidentiality": "public", "language": "uk", "title": "qualification_document2.pdf", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/e5172ebc4c4c411f84f376ce6ede43b8/bids/410cb59a0945497eb61cc4461f661569/qualification_documents/911a8244866f4ffdbd2b2a202d34043c?download=03ec7a79367644d0b9d45ec78b8a35c2", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/e5172ebc4c4c411f84f376ce6ede43b8/bids/ccd5dc4ca3f84f9a8f9ec11010bd01ba/qualification_documents/911a8244866f4ffdbd2b2a202d34043c?download=03ec7a79367644d0b9d45ec78b8a35c2", "format": "application/pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", diff --git a/docs/source/tendering/cfaua/tutorial/upload-bid-qualification-document-proposal.http b/docs/source/tendering/cfaua/tutorial/upload-bid-qualification-document-proposal.http index abe931548d..07fac922da 100644 --- a/docs/source/tendering/cfaua/tutorial/upload-bid-qualification-document-proposal.http +++ b/docs/source/tendering/cfaua/tutorial/upload-bid-qualification-document-proposal.http @@ -1,4 +1,4 @@ -POST /api/2.5/tenders/e5172ebc4c4c411f84f376ce6ede43b8/bids/410cb59a0945497eb61cc4461f661569/qualification_documents?acc_token=7ba8d77208c04422b161882dc2c4b5c2 HTTP/1.0 +POST /api/2.5/tenders/e5172ebc4c4c411f84f376ce6ede43b8/bids/ccd5dc4ca3f84f9a8f9ec11010bd01ba/qualification_documents?acc_token=7ba8d77208c04422b161882dc2c4b5c2 HTTP/1.0 Authorization: Bearer broker Content-Length: 158 Content-Type: multipart/form-data; boundary=---BOUNDARY @@ -14,14 +14,14 @@ content Response: 201 Created Content-Type: application/json; charset=UTF-8 -Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/e5172ebc4c4c411f84f376ce6ede43b8/bids/410cb59a0945497eb61cc4461f661569/qualification_documents/911a8244866f4ffdbd2b2a202d34043c +Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/e5172ebc4c4c411f84f376ce6ede43b8/bids/ccd5dc4ca3f84f9a8f9ec11010bd01ba/qualification_documents/911a8244866f4ffdbd2b2a202d34043c { "data": { "hash": "md5:00000000000000000000000000000000", "confidentiality": "public", "language": "uk", "title": "qualification_document.pdf", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/e5172ebc4c4c411f84f376ce6ede43b8/bids/410cb59a0945497eb61cc4461f661569/qualification_documents/911a8244866f4ffdbd2b2a202d34043c?download=fc6b13177ef949699443525662a19388", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/e5172ebc4c4c411f84f376ce6ede43b8/bids/ccd5dc4ca3f84f9a8f9ec11010bd01ba/qualification_documents/911a8244866f4ffdbd2b2a202d34043c?download=fc6b13177ef949699443525662a19388", "format": "application/pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", diff --git a/docs/source/tendering/cfaua/tutorial/upload-cancellation-doc.http b/docs/source/tendering/cfaua/tutorial/upload-cancellation-doc.http index d6f7d2821c..9f7ce58b15 100644 --- a/docs/source/tendering/cfaua/tutorial/upload-cancellation-doc.http +++ b/docs/source/tendering/cfaua/tutorial/upload-cancellation-doc.http @@ -1,4 +1,4 @@ -POST /api/2.5/tenders/e5172ebc4c4c411f84f376ce6ede43b8/cancellations/8d867a37ec004bee9d571231d313987b/documents?acc_token=1e40f3cf3fd64b8ebca3076b70a86e71 HTTP/1.0 +POST /api/2.5/tenders/e5172ebc4c4c411f84f376ce6ede43b8/cancellations/f35b5fe67e064722b22ccf511efe711b/documents?acc_token=1e40f3cf3fd64b8ebca3076b70a86e71 HTTP/1.0 Authorization: Bearer broker Content-Length: 142 Content-Type: multipart/form-data; boundary=---BOUNDARY @@ -14,7 +14,7 @@ content Response: 201 Created Content-Type: application/json; charset=UTF-8 -Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/e5172ebc4c4c411f84f376ce6ede43b8/cancellations/8d867a37ec004bee9d571231d313987b/documents/4a6e26bf559346d0b4ca0298bf8a61d0 +Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/e5172ebc4c4c411f84f376ce6ede43b8/cancellations/f35b5fe67e064722b22ccf511efe711b/documents/4a6e26bf559346d0b4ca0298bf8a61d0 { "data": { "hash": "md5:00000000000000000000000000000000", diff --git a/docs/source/tendering/cfaua/tutorial/upload-prices-document.http b/docs/source/tendering/cfaua/tutorial/upload-prices-document.http index fcdcada08c..22e620984f 100644 --- a/docs/source/tendering/cfaua/tutorial/upload-prices-document.http +++ b/docs/source/tendering/cfaua/tutorial/upload-prices-document.http @@ -1,4 +1,4 @@ -POST /api/2.5/tenders/e5172ebc4c4c411f84f376ce6ede43b8/bids/410cb59a0945497eb61cc4461f661569/financial_documents?acc_token=7ba8d77208c04422b161882dc2c4b5c2 HTTP/1.0 +POST /api/2.5/tenders/e5172ebc4c4c411f84f376ce6ede43b8/bids/ccd5dc4ca3f84f9a8f9ec11010bd01ba/financial_documents?acc_token=7ba8d77208c04422b161882dc2c4b5c2 HTTP/1.0 Authorization: Bearer broker Content-Length: 201 Content-Type: multipart/form-data; boundary=---BOUNDARY @@ -14,7 +14,7 @@ Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet Response: 201 Created Content-Type: application/json; charset=UTF-8 -Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/e5172ebc4c4c411f84f376ce6ede43b8/bids/410cb59a0945497eb61cc4461f661569/financial_documents/dd6f8798839349599db8e7fa493e9901 +Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/e5172ebc4c4c411f84f376ce6ede43b8/bids/ccd5dc4ca3f84f9a8f9ec11010bd01ba/financial_documents/dd6f8798839349599db8e7fa493e9901 { "data": { "hash": "md5:00000000000000000000000000000000", diff --git a/docs/source/tendering/competitivedialogue/multiple_lots_tutorial/bid-lot1-invalid-view.http b/docs/source/tendering/competitivedialogue/multiple_lots_tutorial/bid-lot1-invalid-view.http index cde181d987..bd671763d0 100644 --- a/docs/source/tendering/competitivedialogue/multiple_lots_tutorial/bid-lot1-invalid-view.http +++ b/docs/source/tendering/competitivedialogue/multiple_lots_tutorial/bid-lot1-invalid-view.http @@ -1,4 +1,4 @@ -GET /api/2.5/tenders/086edc68f12d4a248ded4f9cea52e69c/bids/5c57011a1a184851aa1a971e0f443b6c?acc_token=e1acbdb735954beda3c4b55d6dffc720 HTTP/1.0 +GET /api/2.5/tenders/086edc68f12d4a248ded4f9cea52e69c/bids/5c40c6901b9d438fad1d986bf48a3b2c?acc_token=e1acbdb735954beda3c4b55d6dffc720 HTTP/1.0 Authorization: Bearer broker Host: lb-api-sandbox.prozorro.gov.ua @@ -7,7 +7,7 @@ Content-Type: application/json; charset=UTF-8 { "data": { "status": "invalid", - "id": "5c57011a1a184851aa1a971e0f443b6c" + "id": "5c40c6901b9d438fad1d986bf48a3b2c" } } diff --git a/docs/source/tendering/competitivedialogue/multiple_lots_tutorial/bid-lot1-update-view.http b/docs/source/tendering/competitivedialogue/multiple_lots_tutorial/bid-lot1-update-view.http index f1897664bb..a4470ad2f6 100644 --- a/docs/source/tendering/competitivedialogue/multiple_lots_tutorial/bid-lot1-update-view.http +++ b/docs/source/tendering/competitivedialogue/multiple_lots_tutorial/bid-lot1-update-view.http @@ -1,4 +1,4 @@ -PATCH /api/2.5/tenders/086edc68f12d4a248ded4f9cea52e69c/bids/5c57011a1a184851aa1a971e0f443b6c?acc_token=e1acbdb735954beda3c4b55d6dffc720 HTTP/1.0 +PATCH /api/2.5/tenders/086edc68f12d4a248ded4f9cea52e69c/bids/5c40c6901b9d438fad1d986bf48a3b2c?acc_token=e1acbdb735954beda3c4b55d6dffc720 HTTP/1.0 Authorization: Bearer broker Content-Length: 188 Content-Type: application/json @@ -9,7 +9,7 @@ DATA: "status": "pending", "lotValues": [ { - "relatedLot": "e928726a47b7461a9d8a00258123cf3d", + "relatedLot": "827f341aa45e495f853f5493aee68c42", "subcontractingDetails": "ДКП «Орфей»" } ] @@ -21,16 +21,15 @@ Content-Type: application/json; charset=UTF-8 { "data": { "status": "pending", - "selfEligible": true, "lotValues": [ { - "relatedLot": "e928726a47b7461a9d8a00258123cf3d", + "relatedLot": "827f341aa45e495f853f5493aee68c42", "date": "2020-05-15T01:00:00+03:00", "status": "pending", "subcontractingDetails": "ДКП «Орфей»" } ], - "selfQualified": true, + "id": "5c40c6901b9d438fad1d986bf48a3b2c", "tenderers": [ { "contactPoint": { @@ -55,7 +54,7 @@ Content-Type: application/json; charset=UTF-8 } ], "date": "2020-05-15T01:00:00+03:00", - "id": "5c57011a1a184851aa1a971e0f443b6c" + "selfQualified": true } } diff --git a/docs/source/tendering/competitivedialogue/multiple_lots_tutorial/bid-lot1.http b/docs/source/tendering/competitivedialogue/multiple_lots_tutorial/bid-lot1.http index 54345985cf..69bff8c051 100644 --- a/docs/source/tendering/competitivedialogue/multiple_lots_tutorial/bid-lot1.http +++ b/docs/source/tendering/competitivedialogue/multiple_lots_tutorial/bid-lot1.http @@ -1,16 +1,15 @@ POST /api/2.5/tenders/086edc68f12d4a248ded4f9cea52e69c/bids HTTP/1.0 Authorization: Bearer broker -Content-Length: 1023 +Content-Length: 1001 Content-Type: application/json Host: lb-api-sandbox.prozorro.gov.ua DATA: { "data": { - "selfEligible": true, "selfQualified": true, "lotValues": [ { - "relatedLot": "e928726a47b7461a9d8a00258123cf3d", + "relatedLot": "827f341aa45e495f853f5493aee68c42", "subcontractingDetails": "ДКП «Орфей», Україна" } ], @@ -42,7 +41,7 @@ DATA: Response: 201 Created Content-Type: application/json; charset=UTF-8 -Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/086edc68f12d4a248ded4f9cea52e69c/bids/5c57011a1a184851aa1a971e0f443b6c +Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/086edc68f12d4a248ded4f9cea52e69c/bids/5c40c6901b9d438fad1d986bf48a3b2c { "access": { "transfer": "5b32e87f42ea440cbf41985fb8f42bcc", @@ -50,16 +49,15 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/086edc68f12d4a24 }, "data": { "status": "pending", - "selfEligible": true, "lotValues": [ { - "relatedLot": "e928726a47b7461a9d8a00258123cf3d", + "relatedLot": "827f341aa45e495f853f5493aee68c42", "date": "2020-05-15T01:00:00+03:00", "status": "pending", "subcontractingDetails": "ДКП «Орфей», Україна" } ], - "selfQualified": true, + "id": "5c40c6901b9d438fad1d986bf48a3b2c", "tenderers": [ { "contactPoint": { @@ -84,7 +82,7 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/086edc68f12d4a24 } ], "date": "2020-05-15T01:00:00+03:00", - "id": "5c57011a1a184851aa1a971e0f443b6c" + "selfQualified": true } } diff --git a/docs/source/tendering/competitivedialogue/multiple_lots_tutorial/bid-lot2-update-view.http b/docs/source/tendering/competitivedialogue/multiple_lots_tutorial/bid-lot2-update-view.http index 1351645de3..9f50ab9f42 100644 --- a/docs/source/tendering/competitivedialogue/multiple_lots_tutorial/bid-lot2-update-view.http +++ b/docs/source/tendering/competitivedialogue/multiple_lots_tutorial/bid-lot2-update-view.http @@ -1,4 +1,4 @@ -PATCH /api/2.5/tenders/086edc68f12d4a248ded4f9cea52e69c/bids/44e377d158fa42f3b8d4437c84bdda52?acc_token=ba937016906e447c8a960f506d237d20 HTTP/1.0 +PATCH /api/2.5/tenders/086edc68f12d4a248ded4f9cea52e69c/bids/572235daf46e42aab4f38d4ecfbf806e?acc_token=ba937016906e447c8a960f506d237d20 HTTP/1.0 Authorization: Bearer broker Content-Length: 98 Content-Type: application/json @@ -9,7 +9,7 @@ DATA: "status": "pending", "lotValues": [ { - "relatedLot": "e928726a47b7461a9d8a00258123cf3d" + "relatedLot": "827f341aa45e495f853f5493aee68c42" } ] } @@ -20,15 +20,14 @@ Content-Type: application/json; charset=UTF-8 { "data": { "status": "pending", - "selfEligible": true, "lotValues": [ { - "relatedLot": "e928726a47b7461a9d8a00258123cf3d", + "relatedLot": "827f341aa45e495f853f5493aee68c42", "date": "2020-05-15T01:00:00+03:00", "status": "pending" } ], - "selfQualified": true, + "id": "572235daf46e42aab4f38d4ecfbf806e", "tenderers": [ { "contactPoint": { @@ -53,7 +52,7 @@ Content-Type: application/json; charset=UTF-8 } ], "date": "2020-05-15T01:00:00+03:00", - "id": "44e377d158fa42f3b8d4437c84bdda52" + "selfQualified": true } } diff --git a/docs/source/tendering/competitivedialogue/multiple_lots_tutorial/bid-lot2.http b/docs/source/tendering/competitivedialogue/multiple_lots_tutorial/bid-lot2.http index 048e91afd3..314bd31893 100644 --- a/docs/source/tendering/competitivedialogue/multiple_lots_tutorial/bid-lot2.http +++ b/docs/source/tendering/competitivedialogue/multiple_lots_tutorial/bid-lot2.http @@ -1,19 +1,18 @@ POST /api/2.5/tenders/086edc68f12d4a248ded4f9cea52e69c/bids HTTP/1.0 Authorization: Bearer broker -Content-Length: 1050 +Content-Length: 1028 Content-Type: application/json Host: lb-api-sandbox.prozorro.gov.ua DATA: { "data": { - "selfEligible": true, "selfQualified": true, "lotValues": [ { - "relatedLot": "e928726a47b7461a9d8a00258123cf3d" + "relatedLot": "827f341aa45e495f853f5493aee68c42" }, { - "relatedLot": "8de1614007d74757970d83c1d60ebc76", + "relatedLot": "fadc6f1d86d045bc995c327e65c864fa", "subcontractingDetails": "ДКП «Укр Прінт», Україна" } ], @@ -45,7 +44,7 @@ DATA: Response: 201 Created Content-Type: application/json; charset=UTF-8 -Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/086edc68f12d4a248ded4f9cea52e69c/bids/eb8b16e4d30d4a81b046cae41632ed2d +Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/086edc68f12d4a248ded4f9cea52e69c/bids/602221490fe54ad4866e70ecd5f09fe1 { "access": { "transfer": "97c2523def9f4193a899bbe712c3d8d2", @@ -53,21 +52,20 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/086edc68f12d4a24 }, "data": { "status": "pending", - "selfEligible": true, "lotValues": [ { - "relatedLot": "e928726a47b7461a9d8a00258123cf3d", + "relatedLot": "827f341aa45e495f853f5493aee68c42", "date": "2020-05-15T01:00:00+03:00", "status": "pending" }, { - "relatedLot": "8de1614007d74757970d83c1d60ebc76", + "relatedLot": "fadc6f1d86d045bc995c327e65c864fa", "date": "2020-05-15T01:00:00+03:00", "status": "pending", "subcontractingDetails": "ДКП «Укр Прінт», Україна" } ], - "selfQualified": true, + "id": "602221490fe54ad4866e70ecd5f09fe1", "tenderers": [ { "contactPoint": { @@ -92,7 +90,7 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/086edc68f12d4a24 } ], "date": "2020-05-15T01:00:00+03:00", - "id": "eb8b16e4d30d4a81b046cae41632ed2d" + "selfQualified": true } } diff --git a/docs/source/tendering/competitivedialogue/multiple_lots_tutorial/bid-lot3-update-view.http b/docs/source/tendering/competitivedialogue/multiple_lots_tutorial/bid-lot3-update-view.http index db71a1144d..3dcaf37102 100644 --- a/docs/source/tendering/competitivedialogue/multiple_lots_tutorial/bid-lot3-update-view.http +++ b/docs/source/tendering/competitivedialogue/multiple_lots_tutorial/bid-lot3-update-view.http @@ -1,4 +1,4 @@ -PATCH /api/2.5/tenders/086edc68f12d4a248ded4f9cea52e69c/bids/eb8b16e4d30d4a81b046cae41632ed2d?acc_token=1be138ca4c9f4d4698c469fa4bdeb29d HTTP/1.0 +PATCH /api/2.5/tenders/086edc68f12d4a248ded4f9cea52e69c/bids/602221490fe54ad4866e70ecd5f09fe1?acc_token=1be138ca4c9f4d4698c469fa4bdeb29d HTTP/1.0 Authorization: Bearer broker Content-Length: 98 Content-Type: application/json @@ -9,7 +9,7 @@ DATA: "status": "pending", "lotValues": [ { - "relatedLot": "e928726a47b7461a9d8a00258123cf3d" + "relatedLot": "827f341aa45e495f853f5493aee68c42" } ] } @@ -20,15 +20,14 @@ Content-Type: application/json; charset=UTF-8 { "data": { "status": "pending", - "selfEligible": true, "lotValues": [ { - "relatedLot": "e928726a47b7461a9d8a00258123cf3d", + "relatedLot": "827f341aa45e495f853f5493aee68c42", "date": "2020-05-15T01:00:00+03:00", "status": "pending" } ], - "selfQualified": true, + "id": "602221490fe54ad4866e70ecd5f09fe1", "tenderers": [ { "contactPoint": { @@ -53,7 +52,7 @@ Content-Type: application/json; charset=UTF-8 } ], "date": "2020-05-15T01:00:00+03:00", - "id": "eb8b16e4d30d4a81b046cae41632ed2d" + "selfQualified": true } } diff --git a/docs/source/tendering/competitivedialogue/multiple_lots_tutorial/qualifications-view.http b/docs/source/tendering/competitivedialogue/multiple_lots_tutorial/qualifications-view.http index 78c8fe9605..2148898591 100644 --- a/docs/source/tendering/competitivedialogue/multiple_lots_tutorial/qualifications-view.http +++ b/docs/source/tendering/competitivedialogue/multiple_lots_tutorial/qualifications-view.http @@ -8,28 +8,28 @@ Content-Type: application/json; charset=UTF-8 "data": [ { "status": "pending", - "lotID": "e928726a47b7461a9d8a00258123cf3d", + "lotID": "827f341aa45e495f853f5493aee68c42", "eligible": false, "qualified": false, - "bidID": "5c57011a1a184851aa1a971e0f443b6c", + "bidID": "5c40c6901b9d438fad1d986bf48a3b2c", "date": "2020-05-15T01:00:00+03:00", "id": "173c2b5bb93248a78c84a3827af6cbaa" }, { "status": "pending", - "lotID": "e928726a47b7461a9d8a00258123cf3d", + "lotID": "827f341aa45e495f853f5493aee68c42", "eligible": false, "qualified": false, - "bidID": "44e377d158fa42f3b8d4437c84bdda52", + "bidID": "572235daf46e42aab4f38d4ecfbf806e", "date": "2020-05-15T01:00:00+03:00", "id": "9894e7b3dee74b7f978607f213fb8d37" }, { "status": "pending", - "lotID": "e928726a47b7461a9d8a00258123cf3d", + "lotID": "827f341aa45e495f853f5493aee68c42", "eligible": false, "qualified": false, - "bidID": "eb8b16e4d30d4a81b046cae41632ed2d", + "bidID": "602221490fe54ad4866e70ecd5f09fe1", "date": "2020-05-15T01:00:00+03:00", "id": "ced896f884304acd86eae26ec8efe5c8" } diff --git a/docs/source/tendering/competitivedialogue/multiple_lots_tutorial/register_bad_bid.http b/docs/source/tendering/competitivedialogue/multiple_lots_tutorial/register_bad_bid.http index f83c8ea142..6a8331c9c9 100644 --- a/docs/source/tendering/competitivedialogue/multiple_lots_tutorial/register_bad_bid.http +++ b/docs/source/tendering/competitivedialogue/multiple_lots_tutorial/register_bad_bid.http @@ -1,16 +1,15 @@ POST /api/2.5/tenders/d99c61237b1945578b8cde56d011dbef/bids HTTP/1.0 Authorization: Bearer broker -Content-Length: 994 +Content-Length: 972 Content-Type: application/json Host: lb-api-sandbox.prozorro.gov.ua DATA: { "data": { - "selfEligible": true, "selfQualified": true, "lotValues": [ { - "relatedLot": "e928726a47b7461a9d8a00258123cf3d", + "relatedLot": "827f341aa45e495f853f5493aee68c42", "value": { "amount": 500 }, diff --git a/docs/source/tendering/competitivedialogue/multiple_lots_tutorial/register_bad_not_allowed_lot.http b/docs/source/tendering/competitivedialogue/multiple_lots_tutorial/register_bad_not_allowed_lot.http index 823d0a8fe8..2410cbbc19 100644 --- a/docs/source/tendering/competitivedialogue/multiple_lots_tutorial/register_bad_not_allowed_lot.http +++ b/docs/source/tendering/competitivedialogue/multiple_lots_tutorial/register_bad_not_allowed_lot.http @@ -1,16 +1,15 @@ POST /api/2.5/tenders/d99c61237b1945578b8cde56d011dbef/bids HTTP/1.0 Authorization: Bearer broker -Content-Length: 1049 +Content-Length: 1027 Content-Type: application/json Host: lb-api-sandbox.prozorro.gov.ua DATA: { "data": { - "selfEligible": true, "selfQualified": true, "lotValues": [ { - "relatedLot": "8de1614007d74757970d83c1d60ebc76", + "relatedLot": "fadc6f1d86d045bc995c327e65c864fa", "value": { "amount": 300 }, diff --git a/docs/source/tendering/competitivedialogue/multiple_lots_tutorial/register_ok_bid.http b/docs/source/tendering/competitivedialogue/multiple_lots_tutorial/register_ok_bid.http index b3468ff2dd..037645cbc5 100644 --- a/docs/source/tendering/competitivedialogue/multiple_lots_tutorial/register_ok_bid.http +++ b/docs/source/tendering/competitivedialogue/multiple_lots_tutorial/register_ok_bid.http @@ -1,16 +1,15 @@ POST /api/2.5/tenders/d99c61237b1945578b8cde56d011dbef/bids HTTP/1.0 Authorization: Bearer broker -Content-Length: 1049 +Content-Length: 1027 Content-Type: application/json Host: lb-api-sandbox.prozorro.gov.ua DATA: { "data": { - "selfEligible": true, "selfQualified": true, "lotValues": [ { - "relatedLot": "e928726a47b7461a9d8a00258123cf3d", + "relatedLot": "827f341aa45e495f853f5493aee68c42", "value": { "amount": 500 }, @@ -45,7 +44,7 @@ DATA: Response: 201 Created Content-Type: application/json; charset=UTF-8 -Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/d99c61237b1945578b8cde56d011dbef/bids/ff16b7ecf51d40c7b0b1809e53ea3278 +Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/d99c61237b1945578b8cde56d011dbef/bids/27921103a2704670ae2a47f38fa67f97 { "access": { "transfer": "ea57ae49d8fe4779939bd0f01d5f89a6", @@ -53,10 +52,9 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/d99c61237b194557 }, "data": { "status": "pending", - "selfEligible": true, "lotValues": [ { - "relatedLot": "e928726a47b7461a9d8a00258123cf3d", + "relatedLot": "827f341aa45e495f853f5493aee68c42", "date": "2020-05-15T01:00:00+03:00", "status": "pending", "value": { @@ -67,7 +65,7 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/d99c61237b194557 "subcontractingDetails": "ДКП «Орфей», Україна" } ], - "selfQualified": true, + "id": "27921103a2704670ae2a47f38fa67f97", "tenderers": [ { "contactPoint": { @@ -92,7 +90,7 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/d99c61237b194557 } ], "date": "2020-05-15T01:00:00+03:00", - "id": "ff16b7ecf51d40c7b0b1809e53ea3278" + "selfQualified": true } } diff --git a/docs/source/tendering/competitivedialogue/multiple_lots_tutorial/show_stage2.http b/docs/source/tendering/competitivedialogue/multiple_lots_tutorial/show_stage2.http index e661d9ab49..2fd5000b5c 100644 --- a/docs/source/tendering/competitivedialogue/multiple_lots_tutorial/show_stage2.http +++ b/docs/source/tendering/competitivedialogue/multiple_lots_tutorial/show_stage2.http @@ -9,16 +9,16 @@ Content-Type: application/json; charset=UTF-8 "procurementMethod": "selective", "complaintPeriod": { "startDate": "2020-05-15T01:00:00+03:00", - "endDate": "2020-06-10T00:00:00+03:00" + "endDate": "2020-06-11T00:00:00+03:00" }, "enquiryPeriod": { "startDate": "2020-05-15T01:00:00+03:00", "clarificationsUntil": "2020-06-11T00:00:00+03:00", - "endDate": "2020-06-04T01:00:00+03:00", + "endDate": "2020-06-05T00:00:00+03:00", "invalidationDate": "2020-05-15T01:00:00+03:00" }, "submissionMethod": "electronicAuction", - "next_check": "2020-06-14T01:00:00+03:00", + "next_check": "2020-06-15T00:00:00+03:00", "awardCriteria": "lowestCost", "owner": "broker", "id": "d99c61237b1945578b8cde56d011dbef", @@ -42,7 +42,7 @@ Content-Type: application/json; charset=UTF-8 "valueAddedTaxIncluded": true }, "date": "2020-05-15T01:00:00+03:00", - "id": "e928726a47b7461a9d8a00258123cf3d" + "id": "827f341aa45e495f853f5493aee68c42" }, { "status": "active", @@ -62,14 +62,14 @@ Content-Type: application/json; charset=UTF-8 "valueAddedTaxIncluded": true }, "date": "2020-05-15T01:00:00+03:00", - "id": "8de1614007d74757970d83c1d60ebc76" + "id": "fadc6f1d86d045bc995c327e65c864fa" } ], "shortlistedFirms": [ { "lots": [ { - "id": "e928726a47b7461a9d8a00258123cf3d" + "id": "827f341aa45e495f853f5493aee68c42" } ], "identifier": { @@ -82,10 +82,10 @@ Content-Type: application/json; charset=UTF-8 { "lots": [ { - "id": "e928726a47b7461a9d8a00258123cf3d" + "id": "827f341aa45e495f853f5493aee68c42" }, { - "id": "8de1614007d74757970d83c1d60ebc76" + "id": "fadc6f1d86d045bc995c327e65c864fa" } ], "identifier": { @@ -98,10 +98,10 @@ Content-Type: application/json; charset=UTF-8 { "lots": [ { - "id": "e928726a47b7461a9d8a00258123cf3d" + "id": "827f341aa45e495f853f5493aee68c42" }, { - "id": "8de1614007d74757970d83c1d60ebc76" + "id": "fadc6f1d86d045bc995c327e65c864fa" } ], "identifier": { @@ -117,7 +117,7 @@ Content-Type: application/json; charset=UTF-8 "status": "active.tendering", "tenderPeriod": { "startDate": "2020-05-15T01:00:00+03:00", - "endDate": "2020-06-14T01:00:00+03:00" + "endDate": "2020-06-15T00:00:00+03:00" }, "title_en": "Services in school canteens", "procurementMethodType": "competitiveDialogueEU.stage2", @@ -129,7 +129,7 @@ Content-Type: application/json; charset=UTF-8 }, "items": [ { - "relatedLot": "e928726a47b7461a9d8a00258123cf3d", + "relatedLot": "827f341aa45e495f853f5493aee68c42", "description": "Послуги шкільних їдалень", "classification": { "scheme": "ДК021", @@ -155,7 +155,7 @@ Content-Type: application/json; charset=UTF-8 "startDate": "2020-06-04T00:00:00+02:00", "endDate": "2020-07-04T00:00:00+02:00" }, - "id": "1fdf54d459244216b4a62e51a06defa3", + "id": "50f583529d724487b9430dd0bbda9174", "unit": { "code": "44617100-9", "name": "item" @@ -163,7 +163,7 @@ Content-Type: application/json; charset=UTF-8 "quantity": 1.0 }, { - "relatedLot": "8de1614007d74757970d83c1d60ebc76", + "relatedLot": "fadc6f1d86d045bc995c327e65c864fa", "description": "Послуги шкільних їдалень", "classification": { "scheme": "ДК021", @@ -189,7 +189,7 @@ Content-Type: application/json; charset=UTF-8 "startDate": "2020-06-04T00:00:00+02:00", "endDate": "2020-07-04T00:00:00+02:00" }, - "id": "0bea2a0b522b4cf6ac785fcf2aff1bed", + "id": "91a14518464b4e81ae77ad46a8ef57ea", "unit": { "code": "44617100-9", "name": "item" diff --git a/docs/source/tendering/competitivedialogue/multiple_lots_tutorial/stage2-pending.http b/docs/source/tendering/competitivedialogue/multiple_lots_tutorial/stage2-pending.http index 624fa04f45..742b2af28b 100644 --- a/docs/source/tendering/competitivedialogue/multiple_lots_tutorial/stage2-pending.http +++ b/docs/source/tendering/competitivedialogue/multiple_lots_tutorial/stage2-pending.http @@ -16,7 +16,7 @@ Content-Type: application/json; charset=UTF-8 "enquiryPeriod": { "startDate": "2020-04-04T01:00:00+03:00", "clarificationsUntil": "2020-04-30T00:00:00+03:00", - "endDate": "2020-04-25T01:00:00+03:00", + "endDate": "2020-04-25T00:00:00+03:00", "invalidationDate": "2020-05-15T01:00:00+03:00" }, "submissionMethod": "electronicAuction", @@ -65,7 +65,7 @@ Content-Type: application/json; charset=UTF-8 "valueAddedTaxIncluded": true }, "date": "2020-05-15T01:00:00+03:00", - "id": "e928726a47b7461a9d8a00258123cf3d" + "id": "827f341aa45e495f853f5493aee68c42" }, { "status": "unsuccessful", @@ -82,7 +82,7 @@ Content-Type: application/json; charset=UTF-8 "valueAddedTaxIncluded": true }, "date": "2020-05-15T01:00:00+03:00", - "id": "8de1614007d74757970d83c1d60ebc76" + "id": "fadc6f1d86d045bc995c327e65c864fa" } ], "qualificationPeriod": { @@ -99,28 +99,28 @@ Content-Type: application/json; charset=UTF-8 "qualifications": [ { "status": "active", - "lotID": "e928726a47b7461a9d8a00258123cf3d", + "lotID": "827f341aa45e495f853f5493aee68c42", "eligible": true, "qualified": true, - "bidID": "5c57011a1a184851aa1a971e0f443b6c", + "bidID": "5c40c6901b9d438fad1d986bf48a3b2c", "date": "2020-05-15T01:00:00+03:00", "id": "173c2b5bb93248a78c84a3827af6cbaa" }, { "status": "active", - "lotID": "e928726a47b7461a9d8a00258123cf3d", + "lotID": "827f341aa45e495f853f5493aee68c42", "eligible": true, "qualified": true, - "bidID": "44e377d158fa42f3b8d4437c84bdda52", + "bidID": "572235daf46e42aab4f38d4ecfbf806e", "date": "2020-05-15T01:00:00+03:00", "id": "9894e7b3dee74b7f978607f213fb8d37" }, { "status": "active", - "lotID": "e928726a47b7461a9d8a00258123cf3d", + "lotID": "827f341aa45e495f853f5493aee68c42", "eligible": true, "qualified": true, - "bidID": "eb8b16e4d30d4a81b046cae41632ed2d", + "bidID": "602221490fe54ad4866e70ecd5f09fe1", "date": "2020-05-15T01:00:00+03:00", "id": "ced896f884304acd86eae26ec8efe5c8" } @@ -150,7 +150,7 @@ Content-Type: application/json; charset=UTF-8 }, "percentage": 54.45, "type": "financing", - "id": "cec109dca07b4fe49195bae18cc796f3" + "id": "dda301a766ca433e86943a674a61fcce" } ], "minimalStep": { @@ -160,7 +160,7 @@ Content-Type: application/json; charset=UTF-8 }, "items": [ { - "relatedLot": "e928726a47b7461a9d8a00258123cf3d", + "relatedLot": "827f341aa45e495f853f5493aee68c42", "description": "Послуги шкільних їдалень", "classification": { "scheme": "ДК021", @@ -186,7 +186,7 @@ Content-Type: application/json; charset=UTF-8 "startDate": "2020-06-04T00:00:00+02:00", "endDate": "2020-07-04T00:00:00+02:00" }, - "id": "1fdf54d459244216b4a62e51a06defa3", + "id": "50f583529d724487b9430dd0bbda9174", "unit": { "code": "44617100-9", "name": "item" @@ -194,7 +194,7 @@ Content-Type: application/json; charset=UTF-8 "quantity": 1.0 }, { - "relatedLot": "8de1614007d74757970d83c1d60ebc76", + "relatedLot": "fadc6f1d86d045bc995c327e65c864fa", "description": "Послуги шкільних їдалень", "classification": { "scheme": "ДК021", @@ -220,7 +220,7 @@ Content-Type: application/json; charset=UTF-8 "startDate": "2020-06-04T00:00:00+02:00", "endDate": "2020-07-04T00:00:00+02:00" }, - "id": "0bea2a0b522b4cf6ac785fcf2aff1bed", + "id": "91a14518464b4e81ae77ad46a8ef57ea", "unit": { "code": "44617100-9", "name": "item" @@ -231,7 +231,7 @@ Content-Type: application/json; charset=UTF-8 "bids": [ { "status": "active", - "id": "5c57011a1a184851aa1a971e0f443b6c", + "id": "5c40c6901b9d438fad1d986bf48a3b2c", "tenderers": [ { "contactPoint": { @@ -258,7 +258,7 @@ Content-Type: application/json; charset=UTF-8 }, { "status": "active", - "id": "44e377d158fa42f3b8d4437c84bdda52", + "id": "572235daf46e42aab4f38d4ecfbf806e", "tenderers": [ { "contactPoint": { @@ -285,7 +285,7 @@ Content-Type: application/json; charset=UTF-8 }, { "status": "active", - "id": "eb8b16e4d30d4a81b046cae41632ed2d", + "id": "602221490fe54ad4866e70ecd5f09fe1", "tenderers": [ { "contactPoint": { diff --git a/docs/source/tendering/competitivedialogue/multiple_lots_tutorial/stage2-waiting.http b/docs/source/tendering/competitivedialogue/multiple_lots_tutorial/stage2-waiting.http index 16af8972fc..3cbdae1ea0 100644 --- a/docs/source/tendering/competitivedialogue/multiple_lots_tutorial/stage2-waiting.http +++ b/docs/source/tendering/competitivedialogue/multiple_lots_tutorial/stage2-waiting.http @@ -24,7 +24,7 @@ Content-Type: application/json; charset=UTF-8 "enquiryPeriod": { "startDate": "2020-04-04T01:00:00+03:00", "clarificationsUntil": "2020-04-30T00:00:00+03:00", - "endDate": "2020-04-25T01:00:00+03:00", + "endDate": "2020-04-25T00:00:00+03:00", "invalidationDate": "2020-05-15T01:00:00+03:00" }, "submissionMethod": "electronicAuction", @@ -73,7 +73,7 @@ Content-Type: application/json; charset=UTF-8 "valueAddedTaxIncluded": true }, "date": "2020-05-15T01:00:00+03:00", - "id": "e928726a47b7461a9d8a00258123cf3d" + "id": "827f341aa45e495f853f5493aee68c42" }, { "status": "unsuccessful", @@ -90,7 +90,7 @@ Content-Type: application/json; charset=UTF-8 "valueAddedTaxIncluded": true }, "date": "2020-05-15T01:00:00+03:00", - "id": "8de1614007d74757970d83c1d60ebc76" + "id": "fadc6f1d86d045bc995c327e65c864fa" } ], "qualificationPeriod": { @@ -107,28 +107,28 @@ Content-Type: application/json; charset=UTF-8 "qualifications": [ { "status": "active", - "lotID": "e928726a47b7461a9d8a00258123cf3d", + "lotID": "827f341aa45e495f853f5493aee68c42", "eligible": true, "qualified": true, - "bidID": "5c57011a1a184851aa1a971e0f443b6c", + "bidID": "5c40c6901b9d438fad1d986bf48a3b2c", "date": "2020-05-15T01:00:00+03:00", "id": "173c2b5bb93248a78c84a3827af6cbaa" }, { "status": "active", - "lotID": "e928726a47b7461a9d8a00258123cf3d", + "lotID": "827f341aa45e495f853f5493aee68c42", "eligible": true, "qualified": true, - "bidID": "44e377d158fa42f3b8d4437c84bdda52", + "bidID": "572235daf46e42aab4f38d4ecfbf806e", "date": "2020-05-15T01:00:00+03:00", "id": "9894e7b3dee74b7f978607f213fb8d37" }, { "status": "active", - "lotID": "e928726a47b7461a9d8a00258123cf3d", + "lotID": "827f341aa45e495f853f5493aee68c42", "eligible": true, "qualified": true, - "bidID": "eb8b16e4d30d4a81b046cae41632ed2d", + "bidID": "602221490fe54ad4866e70ecd5f09fe1", "date": "2020-05-15T01:00:00+03:00", "id": "ced896f884304acd86eae26ec8efe5c8" } @@ -158,7 +158,7 @@ Content-Type: application/json; charset=UTF-8 }, "percentage": 54.45, "type": "financing", - "id": "cec109dca07b4fe49195bae18cc796f3" + "id": "dda301a766ca433e86943a674a61fcce" } ], "minimalStep": { @@ -168,7 +168,7 @@ Content-Type: application/json; charset=UTF-8 }, "items": [ { - "relatedLot": "e928726a47b7461a9d8a00258123cf3d", + "relatedLot": "827f341aa45e495f853f5493aee68c42", "description": "Послуги шкільних їдалень", "classification": { "scheme": "ДК021", @@ -194,7 +194,7 @@ Content-Type: application/json; charset=UTF-8 "startDate": "2020-06-04T00:00:00+02:00", "endDate": "2020-07-04T00:00:00+02:00" }, - "id": "1fdf54d459244216b4a62e51a06defa3", + "id": "50f583529d724487b9430dd0bbda9174", "unit": { "code": "44617100-9", "name": "item" @@ -202,7 +202,7 @@ Content-Type: application/json; charset=UTF-8 "quantity": 1.0 }, { - "relatedLot": "8de1614007d74757970d83c1d60ebc76", + "relatedLot": "fadc6f1d86d045bc995c327e65c864fa", "description": "Послуги шкільних їдалень", "classification": { "scheme": "ДК021", @@ -228,7 +228,7 @@ Content-Type: application/json; charset=UTF-8 "startDate": "2020-06-04T00:00:00+02:00", "endDate": "2020-07-04T00:00:00+02:00" }, - "id": "0bea2a0b522b4cf6ac785fcf2aff1bed", + "id": "91a14518464b4e81ae77ad46a8ef57ea", "unit": { "code": "44617100-9", "name": "item" @@ -239,7 +239,7 @@ Content-Type: application/json; charset=UTF-8 "bids": [ { "status": "active", - "id": "5c57011a1a184851aa1a971e0f443b6c", + "id": "5c40c6901b9d438fad1d986bf48a3b2c", "tenderers": [ { "contactPoint": { @@ -266,7 +266,7 @@ Content-Type: application/json; charset=UTF-8 }, { "status": "active", - "id": "44e377d158fa42f3b8d4437c84bdda52", + "id": "572235daf46e42aab4f38d4ecfbf806e", "tenderers": [ { "contactPoint": { @@ -293,7 +293,7 @@ Content-Type: application/json; charset=UTF-8 }, { "status": "active", - "id": "eb8b16e4d30d4a81b046cae41632ed2d", + "id": "602221490fe54ad4866e70ecd5f09fe1", "tenderers": [ { "contactPoint": { diff --git a/docs/source/tendering/competitivedialogue/multiple_lots_tutorial/tender-activate-qualifications.http b/docs/source/tendering/competitivedialogue/multiple_lots_tutorial/tender-activate-qualifications.http index 3305ca3557..fa5dca9982 100644 --- a/docs/source/tendering/competitivedialogue/multiple_lots_tutorial/tender-activate-qualifications.http +++ b/docs/source/tendering/competitivedialogue/multiple_lots_tutorial/tender-activate-qualifications.http @@ -17,10 +17,10 @@ Content-Type: application/json; charset=UTF-8 { "data": { "status": "active", - "lotID": "e928726a47b7461a9d8a00258123cf3d", + "lotID": "827f341aa45e495f853f5493aee68c42", "eligible": true, "qualified": true, - "bidID": "5c57011a1a184851aa1a971e0f443b6c", + "bidID": "5c40c6901b9d438fad1d986bf48a3b2c", "date": "2020-05-15T01:00:00+03:00", "id": "173c2b5bb93248a78c84a3827af6cbaa" } diff --git a/docs/source/tendering/competitivedialogue/multiple_lots_tutorial/tender-add-lot.http b/docs/source/tendering/competitivedialogue/multiple_lots_tutorial/tender-add-lot.http index 69eb30b75d..500e175c80 100644 --- a/docs/source/tendering/competitivedialogue/multiple_lots_tutorial/tender-add-lot.http +++ b/docs/source/tendering/competitivedialogue/multiple_lots_tutorial/tender-add-lot.http @@ -21,7 +21,7 @@ DATA: Response: 201 Created Content-Type: application/json; charset=UTF-8 -Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/086edc68f12d4a248ded4f9cea52e69c/lots/e928726a47b7461a9d8a00258123cf3d +Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/086edc68f12d4a248ded4f9cea52e69c/lots/827f341aa45e495f853f5493aee68c42 { "data": { "status": "active", @@ -38,7 +38,7 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/086edc68f12d4a24 "valueAddedTaxIncluded": true }, "date": "2020-05-15T01:00:00+03:00", - "id": "e928726a47b7461a9d8a00258123cf3d" + "id": "827f341aa45e495f853f5493aee68c42" } } diff --git a/docs/source/tendering/competitivedialogue/multiple_lots_tutorial/tender-add-relatedLot-to-item.http b/docs/source/tendering/competitivedialogue/multiple_lots_tutorial/tender-add-relatedLot-to-item.http index dafac67ae8..11929a4a3d 100644 --- a/docs/source/tendering/competitivedialogue/multiple_lots_tutorial/tender-add-relatedLot-to-item.http +++ b/docs/source/tendering/competitivedialogue/multiple_lots_tutorial/tender-add-relatedLot-to-item.http @@ -8,10 +8,10 @@ DATA: "data": { "items": [ { - "relatedLot": "e928726a47b7461a9d8a00258123cf3d" + "relatedLot": "827f341aa45e495f853f5493aee68c42" }, { - "relatedLot": "8de1614007d74757970d83c1d60ebc76" + "relatedLot": "fadc6f1d86d045bc995c327e65c864fa" } ] } @@ -29,8 +29,8 @@ Content-Type: application/json; charset=UTF-8 }, "enquiryPeriod": { "startDate": "2020-05-15T01:00:00+03:00", - "clarificationsUntil": "2020-06-12T00:00:00+03:00", - "endDate": "2020-06-05T01:00:00+03:00", + "clarificationsUntil": "2020-06-11T00:00:00+03:00", + "endDate": "2020-06-05T00:00:00+03:00", "invalidationDate": "2020-05-15T01:00:00+03:00" }, "submissionMethod": "electronicAuction", @@ -79,7 +79,7 @@ Content-Type: application/json; charset=UTF-8 "valueAddedTaxIncluded": true }, "date": "2020-05-15T01:00:00+03:00", - "id": "e928726a47b7461a9d8a00258123cf3d" + "id": "827f341aa45e495f853f5493aee68c42" }, { "status": "active", @@ -96,7 +96,7 @@ Content-Type: application/json; charset=UTF-8 "valueAddedTaxIncluded": true }, "date": "2020-05-15T01:00:00+03:00", - "id": "8de1614007d74757970d83c1d60ebc76" + "id": "fadc6f1d86d045bc995c327e65c864fa" } ], "tenderID": "UA-2020-05-15-000001", @@ -132,7 +132,7 @@ Content-Type: application/json; charset=UTF-8 }, "percentage": 54.45, "type": "financing", - "id": "cec109dca07b4fe49195bae18cc796f3" + "id": "dda301a766ca433e86943a674a61fcce" } ], "minimalStep": { @@ -142,7 +142,7 @@ Content-Type: application/json; charset=UTF-8 }, "items": [ { - "relatedLot": "e928726a47b7461a9d8a00258123cf3d", + "relatedLot": "827f341aa45e495f853f5493aee68c42", "description": "Послуги шкільних їдалень", "classification": { "scheme": "ДК021", @@ -168,7 +168,7 @@ Content-Type: application/json; charset=UTF-8 "startDate": "2020-06-04T00:00:00+02:00", "endDate": "2020-07-04T00:00:00+02:00" }, - "id": "1fdf54d459244216b4a62e51a06defa3", + "id": "50f583529d724487b9430dd0bbda9174", "unit": { "code": "44617100-9", "name": "item" @@ -176,7 +176,7 @@ Content-Type: application/json; charset=UTF-8 "quantity": 1.0 }, { - "relatedLot": "8de1614007d74757970d83c1d60ebc76", + "relatedLot": "fadc6f1d86d045bc995c327e65c864fa", "description": "Послуги шкільних їдалень", "classification": { "scheme": "ДК021", @@ -202,7 +202,7 @@ Content-Type: application/json; charset=UTF-8 "startDate": "2020-06-04T00:00:00+02:00", "endDate": "2020-07-04T00:00:00+02:00" }, - "id": "0bea2a0b522b4cf6ac785fcf2aff1bed", + "id": "91a14518464b4e81ae77ad46a8ef57ea", "unit": { "code": "44617100-9", "name": "item" diff --git a/docs/source/tendering/competitivedialogue/multiple_lots_tutorial/tender-invalid-all-bids.http b/docs/source/tendering/competitivedialogue/multiple_lots_tutorial/tender-invalid-all-bids.http index 133ac8a61f..830e5b0c1e 100644 --- a/docs/source/tendering/competitivedialogue/multiple_lots_tutorial/tender-invalid-all-bids.http +++ b/docs/source/tendering/competitivedialogue/multiple_lots_tutorial/tender-invalid-all-bids.http @@ -1,4 +1,4 @@ -PATCH /api/2.5/tenders/086edc68f12d4a248ded4f9cea52e69c/lots/8de1614007d74757970d83c1d60ebc76?acc_token=2d40003375644e37bcda2c4fc8319cd8 HTTP/1.0 +PATCH /api/2.5/tenders/086edc68f12d4a248ded4f9cea52e69c/lots/fadc6f1d86d045bc995c327e65c864fa?acc_token=2d40003375644e37bcda2c4fc8319cd8 HTTP/1.0 Authorization: Bearer broker Content-Length: 36 Content-Type: application/json @@ -30,7 +30,7 @@ Content-Type: application/json; charset=UTF-8 "valueAddedTaxIncluded": true }, "date": "2020-05-15T01:00:00+03:00", - "id": "8de1614007d74757970d83c1d60ebc76" + "id": "fadc6f1d86d045bc995c327e65c864fa" } } diff --git a/docs/source/tendering/competitivedialogue/multiple_lots_tutorial/tender-post-attempt-json-data.http b/docs/source/tendering/competitivedialogue/multiple_lots_tutorial/tender-post-attempt-json-data.http index 42cda2b2f2..b2ef287358 100644 --- a/docs/source/tendering/competitivedialogue/multiple_lots_tutorial/tender-post-attempt-json-data.http +++ b/docs/source/tendering/competitivedialogue/multiple_lots_tutorial/tender-post-attempt-json-data.http @@ -157,8 +157,8 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/086edc68f12d4a24 }, "enquiryPeriod": { "startDate": "2020-05-15T01:00:00+03:00", - "clarificationsUntil": "2020-06-12T00:00:00+03:00", - "endDate": "2020-06-05T01:00:00+03:00" + "clarificationsUntil": "2020-06-11T00:00:00+03:00", + "endDate": "2020-06-05T00:00:00+03:00" }, "submissionMethod": "electronicAuction", "next_check": "2020-06-15T01:00:00+03:00", @@ -223,7 +223,7 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/086edc68f12d4a24 }, "percentage": 54.45, "type": "financing", - "id": "cec109dca07b4fe49195bae18cc796f3" + "id": "dda301a766ca433e86943a674a61fcce" } ], "minimalStep": { @@ -258,7 +258,7 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/086edc68f12d4a24 "startDate": "2020-06-04T00:00:00+02:00", "endDate": "2020-07-04T00:00:00+02:00" }, - "id": "1fdf54d459244216b4a62e51a06defa3", + "id": "50f583529d724487b9430dd0bbda9174", "unit": { "code": "44617100-9", "name": "item" @@ -291,7 +291,7 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/086edc68f12d4a24 "startDate": "2020-06-04T00:00:00+02:00", "endDate": "2020-07-04T00:00:00+02:00" }, - "id": "0bea2a0b522b4cf6ac785fcf2aff1bed", + "id": "91a14518464b4e81ae77ad46a8ef57ea", "unit": { "code": "44617100-9", "name": "item" diff --git a/docs/source/tendering/competitivedialogue/multiple_lots_tutorial/tender-view-pre-qualification-stand-still.http b/docs/source/tendering/competitivedialogue/multiple_lots_tutorial/tender-view-pre-qualification-stand-still.http index d3612444cd..1e52d65a95 100644 --- a/docs/source/tendering/competitivedialogue/multiple_lots_tutorial/tender-view-pre-qualification-stand-still.http +++ b/docs/source/tendering/competitivedialogue/multiple_lots_tutorial/tender-view-pre-qualification-stand-still.http @@ -18,17 +18,17 @@ Content-Type: application/json; charset=UTF-8 "status": "active.pre-qualification.stand-still", "mainProcurementCategory": "services", "complaintPeriod": { - "startDate": "2020-04-15T01:00:00+03:00", + "startDate": "2020-04-14T01:00:00+03:00", "endDate": "2020-05-11T00:00:00+03:00" }, "enquiryPeriod": { - "startDate": "2020-04-15T01:00:00+03:00", - "clarificationsUntil": "2020-05-09T00:00:00+03:00", - "endDate": "2020-05-05T01:00:00+03:00", + "startDate": "2020-04-14T01:00:00+03:00", + "clarificationsUntil": "2020-05-08T00:00:00+03:00", + "endDate": "2020-05-05T00:00:00+03:00", "invalidationDate": "2020-05-15T01:00:00+03:00" }, "submissionMethod": "electronicAuction", - "next_check": "2020-05-20T01:00:00+03:00", + "next_check": "2020-05-21T00:00:00+03:00", "procuringEntity": { "kind": "general", "name": "ЗОСШ #10 м.Вінниці", @@ -74,7 +74,7 @@ Content-Type: application/json; charset=UTF-8 "valueAddedTaxIncluded": true }, "date": "2020-05-15T01:00:00+03:00", - "id": "e928726a47b7461a9d8a00258123cf3d" + "id": "827f341aa45e495f853f5493aee68c42" }, { "status": "unsuccessful", @@ -91,45 +91,45 @@ Content-Type: application/json; charset=UTF-8 "valueAddedTaxIncluded": true }, "date": "2020-05-15T01:00:00+03:00", - "id": "8de1614007d74757970d83c1d60ebc76" + "id": "fadc6f1d86d045bc995c327e65c864fa" } ], "qualificationPeriod": { "startDate": "2020-05-15T01:00:00+03:00", - "endDate": "2020-05-20T01:00:00+03:00" + "endDate": "2020-05-21T00:00:00+03:00" }, "tenderID": "UA-2020-05-15-000001", "dateModified": "2020-05-15T01:00:00+03:00", "numberOfBids": 3, "tenderPeriod": { - "startDate": "2020-04-15T01:00:00+03:00", + "startDate": "2020-04-14T01:00:00+03:00", "endDate": "2020-05-15T01:00:00+03:00" }, "qualifications": [ { "status": "active", - "lotID": "e928726a47b7461a9d8a00258123cf3d", + "lotID": "827f341aa45e495f853f5493aee68c42", "eligible": true, "qualified": true, - "bidID": "5c57011a1a184851aa1a971e0f443b6c", + "bidID": "5c40c6901b9d438fad1d986bf48a3b2c", "date": "2020-05-15T01:00:00+03:00", "id": "173c2b5bb93248a78c84a3827af6cbaa" }, { "status": "active", - "lotID": "e928726a47b7461a9d8a00258123cf3d", + "lotID": "827f341aa45e495f853f5493aee68c42", "eligible": true, "qualified": true, - "bidID": "44e377d158fa42f3b8d4437c84bdda52", + "bidID": "572235daf46e42aab4f38d4ecfbf806e", "date": "2020-05-15T01:00:00+03:00", "id": "9894e7b3dee74b7f978607f213fb8d37" }, { "status": "active", - "lotID": "e928726a47b7461a9d8a00258123cf3d", + "lotID": "827f341aa45e495f853f5493aee68c42", "eligible": true, "qualified": true, - "bidID": "eb8b16e4d30d4a81b046cae41632ed2d", + "bidID": "602221490fe54ad4866e70ecd5f09fe1", "date": "2020-05-15T01:00:00+03:00", "id": "ced896f884304acd86eae26ec8efe5c8" } @@ -159,7 +159,7 @@ Content-Type: application/json; charset=UTF-8 }, "percentage": 54.45, "type": "financing", - "id": "cec109dca07b4fe49195bae18cc796f3" + "id": "dda301a766ca433e86943a674a61fcce" } ], "minimalStep": { @@ -169,7 +169,7 @@ Content-Type: application/json; charset=UTF-8 }, "items": [ { - "relatedLot": "e928726a47b7461a9d8a00258123cf3d", + "relatedLot": "827f341aa45e495f853f5493aee68c42", "description": "Послуги шкільних їдалень", "classification": { "scheme": "ДК021", @@ -195,7 +195,7 @@ Content-Type: application/json; charset=UTF-8 "startDate": "2020-06-04T00:00:00+02:00", "endDate": "2020-07-04T00:00:00+02:00" }, - "id": "1fdf54d459244216b4a62e51a06defa3", + "id": "50f583529d724487b9430dd0bbda9174", "unit": { "code": "44617100-9", "name": "item" @@ -203,7 +203,7 @@ Content-Type: application/json; charset=UTF-8 "quantity": 1.0 }, { - "relatedLot": "8de1614007d74757970d83c1d60ebc76", + "relatedLot": "fadc6f1d86d045bc995c327e65c864fa", "description": "Послуги шкільних їдалень", "classification": { "scheme": "ДК021", @@ -229,7 +229,7 @@ Content-Type: application/json; charset=UTF-8 "startDate": "2020-06-04T00:00:00+02:00", "endDate": "2020-07-04T00:00:00+02:00" }, - "id": "0bea2a0b522b4cf6ac785fcf2aff1bed", + "id": "91a14518464b4e81ae77ad46a8ef57ea", "unit": { "code": "44617100-9", "name": "item" @@ -240,7 +240,7 @@ Content-Type: application/json; charset=UTF-8 "bids": [ { "status": "active", - "id": "5c57011a1a184851aa1a971e0f443b6c", + "id": "5c40c6901b9d438fad1d986bf48a3b2c", "tenderers": [ { "contactPoint": { @@ -267,7 +267,7 @@ Content-Type: application/json; charset=UTF-8 }, { "status": "active", - "id": "44e377d158fa42f3b8d4437c84bdda52", + "id": "572235daf46e42aab4f38d4ecfbf806e", "tenderers": [ { "contactPoint": { @@ -294,7 +294,7 @@ Content-Type: application/json; charset=UTF-8 }, { "status": "active", - "id": "eb8b16e4d30d4a81b046cae41632ed2d", + "id": "602221490fe54ad4866e70ecd5f09fe1", "tenderers": [ { "contactPoint": { diff --git a/docs/source/tendering/competitivedialogue/multiple_lots_tutorial/tender-view-pre-qualification.http b/docs/source/tendering/competitivedialogue/multiple_lots_tutorial/tender-view-pre-qualification.http index 0d817745c8..2aa5d3a376 100644 --- a/docs/source/tendering/competitivedialogue/multiple_lots_tutorial/tender-view-pre-qualification.http +++ b/docs/source/tendering/competitivedialogue/multiple_lots_tutorial/tender-view-pre-qualification.http @@ -10,13 +10,13 @@ Content-Type: application/json; charset=UTF-8 "status": "active.pre-qualification", "mainProcurementCategory": "services", "complaintPeriod": { - "startDate": "2020-04-15T01:00:00+03:00", + "startDate": "2020-04-14T01:00:00+03:00", "endDate": "2020-05-11T00:00:00+03:00" }, "enquiryPeriod": { - "startDate": "2020-04-15T01:00:00+03:00", - "clarificationsUntil": "2020-05-09T00:00:00+03:00", - "endDate": "2020-05-05T01:00:00+03:00", + "startDate": "2020-04-14T01:00:00+03:00", + "clarificationsUntil": "2020-05-08T00:00:00+03:00", + "endDate": "2020-05-05T00:00:00+03:00", "invalidationDate": "2020-05-15T01:00:00+03:00" }, "submissionMethod": "electronicAuction", @@ -65,7 +65,7 @@ Content-Type: application/json; charset=UTF-8 "valueAddedTaxIncluded": true }, "date": "2020-05-15T01:00:00+03:00", - "id": "e928726a47b7461a9d8a00258123cf3d" + "id": "827f341aa45e495f853f5493aee68c42" }, { "status": "unsuccessful", @@ -82,7 +82,7 @@ Content-Type: application/json; charset=UTF-8 "valueAddedTaxIncluded": true }, "date": "2020-05-15T01:00:00+03:00", - "id": "8de1614007d74757970d83c1d60ebc76" + "id": "fadc6f1d86d045bc995c327e65c864fa" } ], "qualificationPeriod": { @@ -92,34 +92,34 @@ Content-Type: application/json; charset=UTF-8 "dateModified": "2020-05-15T01:00:00+03:00", "numberOfBids": 3, "tenderPeriod": { - "startDate": "2020-04-15T01:00:00+03:00", + "startDate": "2020-04-14T01:00:00+03:00", "endDate": "2020-05-15T01:00:00+03:00" }, "qualifications": [ { "status": "pending", - "lotID": "e928726a47b7461a9d8a00258123cf3d", + "lotID": "827f341aa45e495f853f5493aee68c42", "eligible": false, "qualified": false, - "bidID": "5c57011a1a184851aa1a971e0f443b6c", + "bidID": "5c40c6901b9d438fad1d986bf48a3b2c", "date": "2020-05-15T01:00:00+03:00", "id": "173c2b5bb93248a78c84a3827af6cbaa" }, { "status": "pending", - "lotID": "e928726a47b7461a9d8a00258123cf3d", + "lotID": "827f341aa45e495f853f5493aee68c42", "eligible": false, "qualified": false, - "bidID": "44e377d158fa42f3b8d4437c84bdda52", + "bidID": "572235daf46e42aab4f38d4ecfbf806e", "date": "2020-05-15T01:00:00+03:00", "id": "9894e7b3dee74b7f978607f213fb8d37" }, { "status": "pending", - "lotID": "e928726a47b7461a9d8a00258123cf3d", + "lotID": "827f341aa45e495f853f5493aee68c42", "eligible": false, "qualified": false, - "bidID": "eb8b16e4d30d4a81b046cae41632ed2d", + "bidID": "602221490fe54ad4866e70ecd5f09fe1", "date": "2020-05-15T01:00:00+03:00", "id": "ced896f884304acd86eae26ec8efe5c8" } @@ -149,7 +149,7 @@ Content-Type: application/json; charset=UTF-8 }, "percentage": 54.45, "type": "financing", - "id": "cec109dca07b4fe49195bae18cc796f3" + "id": "dda301a766ca433e86943a674a61fcce" } ], "minimalStep": { @@ -159,7 +159,7 @@ Content-Type: application/json; charset=UTF-8 }, "items": [ { - "relatedLot": "e928726a47b7461a9d8a00258123cf3d", + "relatedLot": "827f341aa45e495f853f5493aee68c42", "description": "Послуги шкільних їдалень", "classification": { "scheme": "ДК021", @@ -185,7 +185,7 @@ Content-Type: application/json; charset=UTF-8 "startDate": "2020-06-04T00:00:00+02:00", "endDate": "2020-07-04T00:00:00+02:00" }, - "id": "1fdf54d459244216b4a62e51a06defa3", + "id": "50f583529d724487b9430dd0bbda9174", "unit": { "code": "44617100-9", "name": "item" @@ -193,7 +193,7 @@ Content-Type: application/json; charset=UTF-8 "quantity": 1.0 }, { - "relatedLot": "8de1614007d74757970d83c1d60ebc76", + "relatedLot": "fadc6f1d86d045bc995c327e65c864fa", "description": "Послуги шкільних їдалень", "classification": { "scheme": "ДК021", @@ -219,7 +219,7 @@ Content-Type: application/json; charset=UTF-8 "startDate": "2020-06-04T00:00:00+02:00", "endDate": "2020-07-04T00:00:00+02:00" }, - "id": "0bea2a0b522b4cf6ac785fcf2aff1bed", + "id": "91a14518464b4e81ae77ad46a8ef57ea", "unit": { "code": "44617100-9", "name": "item" @@ -230,7 +230,7 @@ Content-Type: application/json; charset=UTF-8 "bids": [ { "status": "pending", - "id": "5c57011a1a184851aa1a971e0f443b6c", + "id": "5c40c6901b9d438fad1d986bf48a3b2c", "tenderers": [ { "contactPoint": { @@ -257,7 +257,7 @@ Content-Type: application/json; charset=UTF-8 }, { "status": "pending", - "id": "44e377d158fa42f3b8d4437c84bdda52", + "id": "572235daf46e42aab4f38d4ecfbf806e", "tenderers": [ { "contactPoint": { @@ -284,7 +284,7 @@ Content-Type: application/json; charset=UTF-8 }, { "status": "pending", - "id": "eb8b16e4d30d4a81b046cae41632ed2d", + "id": "602221490fe54ad4866e70ecd5f09fe1", "tenderers": [ { "contactPoint": { diff --git a/docs/source/tendering/competitivedialogue/multiple_lots_tutorial/tender-view.http b/docs/source/tendering/competitivedialogue/multiple_lots_tutorial/tender-view.http index b83585de1c..aabdbb9d51 100644 --- a/docs/source/tendering/competitivedialogue/multiple_lots_tutorial/tender-view.http +++ b/docs/source/tendering/competitivedialogue/multiple_lots_tutorial/tender-view.http @@ -13,8 +13,8 @@ Content-Type: application/json; charset=UTF-8 }, "enquiryPeriod": { "startDate": "2020-05-15T01:00:00+03:00", - "clarificationsUntil": "2020-06-12T00:00:00+03:00", - "endDate": "2020-06-05T01:00:00+03:00", + "clarificationsUntil": "2020-06-11T00:00:00+03:00", + "endDate": "2020-06-05T00:00:00+03:00", "invalidationDate": "2020-05-15T01:00:00+03:00" }, "submissionMethod": "electronicAuction", @@ -63,7 +63,7 @@ Content-Type: application/json; charset=UTF-8 "valueAddedTaxIncluded": true }, "date": "2020-05-15T01:00:00+03:00", - "id": "e928726a47b7461a9d8a00258123cf3d" + "id": "827f341aa45e495f853f5493aee68c42" }, { "status": "active", @@ -80,7 +80,7 @@ Content-Type: application/json; charset=UTF-8 "valueAddedTaxIncluded": true }, "date": "2020-05-15T01:00:00+03:00", - "id": "8de1614007d74757970d83c1d60ebc76" + "id": "fadc6f1d86d045bc995c327e65c864fa" } ], "tenderID": "UA-2020-05-15-000001", @@ -116,7 +116,7 @@ Content-Type: application/json; charset=UTF-8 }, "percentage": 54.45, "type": "financing", - "id": "cec109dca07b4fe49195bae18cc796f3" + "id": "dda301a766ca433e86943a674a61fcce" } ], "minimalStep": { @@ -126,7 +126,7 @@ Content-Type: application/json; charset=UTF-8 }, "items": [ { - "relatedLot": "e928726a47b7461a9d8a00258123cf3d", + "relatedLot": "827f341aa45e495f853f5493aee68c42", "description": "Послуги шкільних їдалень", "classification": { "scheme": "ДК021", @@ -152,7 +152,7 @@ Content-Type: application/json; charset=UTF-8 "startDate": "2020-06-04T00:00:00+02:00", "endDate": "2020-07-04T00:00:00+02:00" }, - "id": "1fdf54d459244216b4a62e51a06defa3", + "id": "50f583529d724487b9430dd0bbda9174", "unit": { "code": "44617100-9", "name": "item" @@ -160,7 +160,7 @@ Content-Type: application/json; charset=UTF-8 "quantity": 1.0 }, { - "relatedLot": "8de1614007d74757970d83c1d60ebc76", + "relatedLot": "fadc6f1d86d045bc995c327e65c864fa", "description": "Послуги шкільних їдалень", "classification": { "scheme": "ДК021", @@ -186,7 +186,7 @@ Content-Type: application/json; charset=UTF-8 "startDate": "2020-06-04T00:00:00+02:00", "endDate": "2020-07-04T00:00:00+02:00" }, - "id": "0bea2a0b522b4cf6ac785fcf2aff1bed", + "id": "91a14518464b4e81ae77ad46a8ef57ea", "unit": { "code": "44617100-9", "name": "item" diff --git a/docs/source/tendering/competitivedialogue/multiple_lots_tutorial/tender_stage1_complete.http b/docs/source/tendering/competitivedialogue/multiple_lots_tutorial/tender_stage1_complete.http index cb1f07add7..e643402f41 100644 --- a/docs/source/tendering/competitivedialogue/multiple_lots_tutorial/tender_stage1_complete.http +++ b/docs/source/tendering/competitivedialogue/multiple_lots_tutorial/tender_stage1_complete.http @@ -16,7 +16,7 @@ Content-Type: application/json; charset=UTF-8 "enquiryPeriod": { "startDate": "2020-04-04T01:00:00+03:00", "clarificationsUntil": "2020-04-30T00:00:00+03:00", - "endDate": "2020-04-25T01:00:00+03:00", + "endDate": "2020-04-25T00:00:00+03:00", "invalidationDate": "2020-05-15T01:00:00+03:00" }, "submissionMethod": "electronicAuction", @@ -65,7 +65,7 @@ Content-Type: application/json; charset=UTF-8 "valueAddedTaxIncluded": true }, "date": "2020-05-15T01:00:00+03:00", - "id": "e928726a47b7461a9d8a00258123cf3d" + "id": "827f341aa45e495f853f5493aee68c42" }, { "status": "unsuccessful", @@ -82,7 +82,7 @@ Content-Type: application/json; charset=UTF-8 "valueAddedTaxIncluded": true }, "date": "2020-05-15T01:00:00+03:00", - "id": "8de1614007d74757970d83c1d60ebc76" + "id": "fadc6f1d86d045bc995c327e65c864fa" } ], "qualificationPeriod": { @@ -100,28 +100,28 @@ Content-Type: application/json; charset=UTF-8 "qualifications": [ { "status": "active", - "lotID": "e928726a47b7461a9d8a00258123cf3d", + "lotID": "827f341aa45e495f853f5493aee68c42", "eligible": true, "qualified": true, - "bidID": "5c57011a1a184851aa1a971e0f443b6c", + "bidID": "5c40c6901b9d438fad1d986bf48a3b2c", "date": "2020-05-15T01:00:00+03:00", "id": "173c2b5bb93248a78c84a3827af6cbaa" }, { "status": "active", - "lotID": "e928726a47b7461a9d8a00258123cf3d", + "lotID": "827f341aa45e495f853f5493aee68c42", "eligible": true, "qualified": true, - "bidID": "44e377d158fa42f3b8d4437c84bdda52", + "bidID": "572235daf46e42aab4f38d4ecfbf806e", "date": "2020-05-15T01:00:00+03:00", "id": "9894e7b3dee74b7f978607f213fb8d37" }, { "status": "active", - "lotID": "e928726a47b7461a9d8a00258123cf3d", + "lotID": "827f341aa45e495f853f5493aee68c42", "eligible": true, "qualified": true, - "bidID": "eb8b16e4d30d4a81b046cae41632ed2d", + "bidID": "602221490fe54ad4866e70ecd5f09fe1", "date": "2020-05-15T01:00:00+03:00", "id": "ced896f884304acd86eae26ec8efe5c8" } @@ -151,7 +151,7 @@ Content-Type: application/json; charset=UTF-8 }, "percentage": 54.45, "type": "financing", - "id": "cec109dca07b4fe49195bae18cc796f3" + "id": "dda301a766ca433e86943a674a61fcce" } ], "minimalStep": { @@ -161,7 +161,7 @@ Content-Type: application/json; charset=UTF-8 }, "items": [ { - "relatedLot": "e928726a47b7461a9d8a00258123cf3d", + "relatedLot": "827f341aa45e495f853f5493aee68c42", "description": "Послуги шкільних їдалень", "classification": { "scheme": "ДК021", @@ -187,7 +187,7 @@ Content-Type: application/json; charset=UTF-8 "startDate": "2020-06-04T00:00:00+02:00", "endDate": "2020-07-04T00:00:00+02:00" }, - "id": "1fdf54d459244216b4a62e51a06defa3", + "id": "50f583529d724487b9430dd0bbda9174", "unit": { "code": "44617100-9", "name": "item" @@ -195,7 +195,7 @@ Content-Type: application/json; charset=UTF-8 "quantity": 1.0 }, { - "relatedLot": "8de1614007d74757970d83c1d60ebc76", + "relatedLot": "fadc6f1d86d045bc995c327e65c864fa", "description": "Послуги шкільних їдалень", "classification": { "scheme": "ДК021", @@ -221,7 +221,7 @@ Content-Type: application/json; charset=UTF-8 "startDate": "2020-06-04T00:00:00+02:00", "endDate": "2020-07-04T00:00:00+02:00" }, - "id": "0bea2a0b522b4cf6ac785fcf2aff1bed", + "id": "91a14518464b4e81ae77ad46a8ef57ea", "unit": { "code": "44617100-9", "name": "item" @@ -232,16 +232,15 @@ Content-Type: application/json; charset=UTF-8 "bids": [ { "status": "active", - "selfEligible": true, "lotValues": [ { - "relatedLot": "e928726a47b7461a9d8a00258123cf3d", + "relatedLot": "827f341aa45e495f853f5493aee68c42", "date": "2020-05-15T01:00:00+03:00", "status": "active", "subcontractingDetails": "ДКП «Орфей»" } ], - "selfQualified": true, + "id": "5c40c6901b9d438fad1d986bf48a3b2c", "tenderers": [ { "contactPoint": { @@ -266,19 +265,18 @@ Content-Type: application/json; charset=UTF-8 } ], "date": "2020-05-15T01:00:00+03:00", - "id": "5c57011a1a184851aa1a971e0f443b6c" + "selfQualified": true }, { "status": "active", - "selfEligible": true, "lotValues": [ { - "relatedLot": "e928726a47b7461a9d8a00258123cf3d", + "relatedLot": "827f341aa45e495f853f5493aee68c42", "date": "2020-05-15T01:00:00+03:00", "status": "active" } ], - "selfQualified": true, + "id": "572235daf46e42aab4f38d4ecfbf806e", "tenderers": [ { "contactPoint": { @@ -303,19 +301,18 @@ Content-Type: application/json; charset=UTF-8 } ], "date": "2020-05-15T01:00:00+03:00", - "id": "44e377d158fa42f3b8d4437c84bdda52" + "selfQualified": true }, { "status": "active", - "selfEligible": true, "lotValues": [ { - "relatedLot": "e928726a47b7461a9d8a00258123cf3d", + "relatedLot": "827f341aa45e495f853f5493aee68c42", "date": "2020-05-15T01:00:00+03:00", "status": "active" } ], - "selfQualified": true, + "id": "602221490fe54ad4866e70ecd5f09fe1", "tenderers": [ { "contactPoint": { @@ -340,7 +337,7 @@ Content-Type: application/json; charset=UTF-8 } ], "date": "2020-05-15T01:00:00+03:00", - "id": "eb8b16e4d30d4a81b046cae41632ed2d" + "selfQualified": true } ], "value": { diff --git a/docs/source/tendering/competitivedialogue/multiple_lots_tutorial/tender_stage2_modify_status.http b/docs/source/tendering/competitivedialogue/multiple_lots_tutorial/tender_stage2_modify_status.http index 2531e246d5..859a89ea99 100644 --- a/docs/source/tendering/competitivedialogue/multiple_lots_tutorial/tender_stage2_modify_status.http +++ b/docs/source/tendering/competitivedialogue/multiple_lots_tutorial/tender_stage2_modify_status.http @@ -17,16 +17,16 @@ Content-Type: application/json; charset=UTF-8 "procurementMethod": "selective", "complaintPeriod": { "startDate": "2020-05-15T01:00:00+03:00", - "endDate": "2020-06-10T00:00:00+03:00" + "endDate": "2020-06-11T00:00:00+03:00" }, "enquiryPeriod": { "startDate": "2020-05-15T01:00:00+03:00", "clarificationsUntil": "2020-06-11T00:00:00+03:00", - "endDate": "2020-06-04T01:00:00+03:00", + "endDate": "2020-06-05T00:00:00+03:00", "invalidationDate": "2020-05-15T01:00:00+03:00" }, "submissionMethod": "electronicAuction", - "next_check": "2020-06-14T01:00:00+03:00", + "next_check": "2020-06-15T00:00:00+03:00", "awardCriteria": "lowestCost", "owner": "broker", "id": "d99c61237b1945578b8cde56d011dbef", @@ -50,7 +50,7 @@ Content-Type: application/json; charset=UTF-8 "valueAddedTaxIncluded": true }, "date": "2020-05-15T01:00:00+03:00", - "id": "e928726a47b7461a9d8a00258123cf3d" + "id": "827f341aa45e495f853f5493aee68c42" }, { "status": "active", @@ -70,14 +70,14 @@ Content-Type: application/json; charset=UTF-8 "valueAddedTaxIncluded": true }, "date": "2020-05-15T01:00:00+03:00", - "id": "8de1614007d74757970d83c1d60ebc76" + "id": "fadc6f1d86d045bc995c327e65c864fa" } ], "shortlistedFirms": [ { "lots": [ { - "id": "e928726a47b7461a9d8a00258123cf3d" + "id": "827f341aa45e495f853f5493aee68c42" } ], "identifier": { @@ -90,10 +90,10 @@ Content-Type: application/json; charset=UTF-8 { "lots": [ { - "id": "e928726a47b7461a9d8a00258123cf3d" + "id": "827f341aa45e495f853f5493aee68c42" }, { - "id": "8de1614007d74757970d83c1d60ebc76" + "id": "fadc6f1d86d045bc995c327e65c864fa" } ], "identifier": { @@ -106,10 +106,10 @@ Content-Type: application/json; charset=UTF-8 { "lots": [ { - "id": "e928726a47b7461a9d8a00258123cf3d" + "id": "827f341aa45e495f853f5493aee68c42" }, { - "id": "8de1614007d74757970d83c1d60ebc76" + "id": "fadc6f1d86d045bc995c327e65c864fa" } ], "identifier": { @@ -125,7 +125,7 @@ Content-Type: application/json; charset=UTF-8 "status": "active.tendering", "tenderPeriod": { "startDate": "2020-05-15T01:00:00+03:00", - "endDate": "2020-06-14T01:00:00+03:00" + "endDate": "2020-06-15T00:00:00+03:00" }, "title_en": "Services in school canteens", "procurementMethodType": "competitiveDialogueEU.stage2", @@ -137,7 +137,7 @@ Content-Type: application/json; charset=UTF-8 }, "items": [ { - "relatedLot": "e928726a47b7461a9d8a00258123cf3d", + "relatedLot": "827f341aa45e495f853f5493aee68c42", "description": "Послуги шкільних їдалень", "classification": { "scheme": "ДК021", @@ -163,7 +163,7 @@ Content-Type: application/json; charset=UTF-8 "startDate": "2020-06-04T00:00:00+02:00", "endDate": "2020-07-04T00:00:00+02:00" }, - "id": "1fdf54d459244216b4a62e51a06defa3", + "id": "50f583529d724487b9430dd0bbda9174", "unit": { "code": "44617100-9", "name": "item" @@ -171,7 +171,7 @@ Content-Type: application/json; charset=UTF-8 "quantity": 1.0 }, { - "relatedLot": "8de1614007d74757970d83c1d60ebc76", + "relatedLot": "fadc6f1d86d045bc995c327e65c864fa", "description": "Послуги шкільних їдалень", "classification": { "scheme": "ДК021", @@ -197,7 +197,7 @@ Content-Type: application/json; charset=UTF-8 "startDate": "2020-06-04T00:00:00+02:00", "endDate": "2020-07-04T00:00:00+02:00" }, - "id": "0bea2a0b522b4cf6ac785fcf2aff1bed", + "id": "91a14518464b4e81ae77ad46a8ef57ea", "unit": { "code": "44617100-9", "name": "item" diff --git a/docs/source/tendering/competitivedialogue/tutorial/activate-bidder.http b/docs/source/tendering/competitivedialogue/tutorial/activate-bidder.http index 9f2be1c408..a409442a89 100644 --- a/docs/source/tendering/competitivedialogue/tutorial/activate-bidder.http +++ b/docs/source/tendering/competitivedialogue/tutorial/activate-bidder.http @@ -1,4 +1,4 @@ -PATCH /api/2.5/tenders/35f93e8dd5484abb8b90687952c82010/bids/9161500fb17744ce90346052ddf8479c?acc_token=3779418188014a5197c514e6dd1908a2 HTTP/1.0 +PATCH /api/2.5/tenders/35f93e8dd5484abb8b90687952c82010/bids/799d983fc3ca4f18a3d22ead02ec7826?acc_token=3779418188014a5197c514e6dd1908a2 HTTP/1.0 Authorization: Bearer broker Content-Length: 31 Content-Type: application/json @@ -15,8 +15,6 @@ Content-Type: application/json; charset=UTF-8 { "data": { "status": "pending", - "selfEligible": true, - "subcontractingDetails": "ДКП «Орфей», Україна", "selfQualified": true, "tenderers": [ { @@ -42,7 +40,8 @@ Content-Type: application/json; charset=UTF-8 } ], "date": "2020-05-15T01:00:00+03:00", - "id": "9161500fb17744ce90346052ddf8479c" + "subcontractingDetails": "ДКП «Орфей», Україна", + "id": "799d983fc3ca4f18a3d22ead02ec7826" } } diff --git a/docs/source/tendering/competitivedialogue/tutorial/active-cancellation.http b/docs/source/tendering/competitivedialogue/tutorial/active-cancellation.http index 0939b5aa2d..201bc345d4 100644 --- a/docs/source/tendering/competitivedialogue/tutorial/active-cancellation.http +++ b/docs/source/tendering/competitivedialogue/tutorial/active-cancellation.http @@ -1,4 +1,4 @@ -GET /api/2.5/tenders/c4eafa4139e24f1d84c1ce5ccbb4560d/cancellations/d42fd4b9cc384f5280a5b4edcf883629?acc_token=ce9ee5fc97484fc3b51e3f4dcea722d4 HTTP/1.0 +GET /api/2.5/tenders/c4eafa4139e24f1d84c1ce5ccbb4560d/cancellations/778f01babc364fba9ec0a685ec81d2f1?acc_token=ce9ee5fc97484fc3b51e3f4dcea722d4 HTTP/1.0 Authorization: Bearer broker Host: lb-api-sandbox.prozorro.gov.ua @@ -39,7 +39,7 @@ Content-Type: application/json; charset=UTF-8 "reasonType": "unFixable", "date": "2020-05-26T01:00:05+03:00", "cancellationOf": "tender", - "id": "d42fd4b9cc384f5280a5b4edcf883629" + "id": "778f01babc364fba9ec0a685ec81d2f1" } } diff --git a/docs/source/tendering/competitivedialogue/tutorial/answer-question.http b/docs/source/tendering/competitivedialogue/tutorial/answer-question.http index 3116965905..faebc29c0d 100644 --- a/docs/source/tendering/competitivedialogue/tutorial/answer-question.http +++ b/docs/source/tendering/competitivedialogue/tutorial/answer-question.http @@ -1,4 +1,4 @@ -PATCH /api/2.5/tenders/35f93e8dd5484abb8b90687952c82010/questions/f74db777262d460099620965f673a415?acc_token=67e88a4fa34541c2bbdd1b66c8b11b71 HTTP/1.0 +PATCH /api/2.5/tenders/35f93e8dd5484abb8b90687952c82010/questions/0541cf2833f347a7a46d919f60289a54?acc_token=67e88a4fa34541c2bbdd1b66c8b11b71 HTTP/1.0 Authorization: Bearer broker Content-Length: 162 Content-Type: application/json @@ -19,7 +19,7 @@ Content-Type: application/json; charset=UTF-8 "title": "Калорійність", "date": "2020-05-15T01:00:00+03:00", "answer": "Таблицю додано в файлі \"Kalorijnist.xslx\"", - "id": "f74db777262d460099620965f673a415", + "id": "0541cf2833f347a7a46d919f60289a54", "questionOf": "tender" } } diff --git a/docs/source/tendering/competitivedialogue/tutorial/approve-qualification1.http b/docs/source/tendering/competitivedialogue/tutorial/approve-qualification1.http index 71036faa54..c5ce98b6f4 100644 --- a/docs/source/tendering/competitivedialogue/tutorial/approve-qualification1.http +++ b/docs/source/tendering/competitivedialogue/tutorial/approve-qualification1.http @@ -19,7 +19,7 @@ Content-Type: application/json; charset=UTF-8 "status": "active", "eligible": true, "qualified": true, - "bidID": "9161500fb17744ce90346052ddf8479c", + "bidID": "799d983fc3ca4f18a3d22ead02ec7826", "date": "2020-05-15T01:00:00+03:00", "id": "688adb9bb70e4d4fbcaf4ba1025e7e1a" } diff --git a/docs/source/tendering/competitivedialogue/tutorial/approve-qualification2.http b/docs/source/tendering/competitivedialogue/tutorial/approve-qualification2.http index 556018145b..1561af80f0 100644 --- a/docs/source/tendering/competitivedialogue/tutorial/approve-qualification2.http +++ b/docs/source/tendering/competitivedialogue/tutorial/approve-qualification2.http @@ -19,7 +19,7 @@ Content-Type: application/json; charset=UTF-8 "status": "active", "eligible": true, "qualified": true, - "bidID": "253a8b6e43504db9a3d4ec839dc7e5ce", + "bidID": "5c14615bc32a4efea822c166a6fa4023", "date": "2020-05-15T01:00:00+03:00", "id": "be53976fae27403594b3de9b7bdfba6a" } diff --git a/docs/source/tendering/competitivedialogue/tutorial/approve-qualification4.http b/docs/source/tendering/competitivedialogue/tutorial/approve-qualification4.http index 97c4ff2fd5..32d241742f 100644 --- a/docs/source/tendering/competitivedialogue/tutorial/approve-qualification4.http +++ b/docs/source/tendering/competitivedialogue/tutorial/approve-qualification4.http @@ -19,7 +19,7 @@ Content-Type: application/json; charset=UTF-8 "status": "active", "eligible": true, "qualified": true, - "bidID": "8fe55741897d438581a0af90c21cc42d", + "bidID": "80b8867552f446eebf0fbc93b10fbdf5", "date": "2020-05-15T01:00:00+03:00", "id": "21a68f5b2e664a23827a19a669007d33" } diff --git a/docs/source/tendering/competitivedialogue/tutorial/ask-question.http b/docs/source/tendering/competitivedialogue/tutorial/ask-question.http index 5136f3a0db..46b2003865 100644 --- a/docs/source/tendering/competitivedialogue/tutorial/ask-question.http +++ b/docs/source/tendering/competitivedialogue/tutorial/ask-question.http @@ -33,7 +33,7 @@ DATA: Response: 201 Created Content-Type: application/json; charset=UTF-8 -Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/35f93e8dd5484abb8b90687952c82010/questions/f74db777262d460099620965f673a415 +Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/35f93e8dd5484abb8b90687952c82010/questions/0541cf2833f347a7a46d919f60289a54 { "data": { "description": "Просимо додати таблицю потрібної калорійності харчування", @@ -59,7 +59,7 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/35f93e8dd5484abb }, "title": "Калорійність", "date": "2020-05-15T01:00:00+03:00", - "id": "f74db777262d460099620965f673a415", + "id": "0541cf2833f347a7a46d919f60289a54", "questionOf": "tender" } } diff --git a/docs/source/tendering/competitivedialogue/tutorial/bidder-activate-after-changing-tender.http b/docs/source/tendering/competitivedialogue/tutorial/bidder-activate-after-changing-tender.http index d75fa9fe5c..edb86594fd 100644 --- a/docs/source/tendering/competitivedialogue/tutorial/bidder-activate-after-changing-tender.http +++ b/docs/source/tendering/competitivedialogue/tutorial/bidder-activate-after-changing-tender.http @@ -1,4 +1,4 @@ -PATCH /api/2.5/tenders/35f93e8dd5484abb8b90687952c82010/bids/9161500fb17744ce90346052ddf8479c?acc_token=3779418188014a5197c514e6dd1908a2 HTTP/1.0 +PATCH /api/2.5/tenders/35f93e8dd5484abb8b90687952c82010/bids/799d983fc3ca4f18a3d22ead02ec7826?acc_token=3779418188014a5197c514e6dd1908a2 HTTP/1.0 Authorization: Bearer broker Content-Length: 31 Content-Type: application/json @@ -21,7 +21,7 @@ Content-Type: application/json; charset=UTF-8 "confidentiality": "public", "language": "uk", "title": "Proposal.pdf", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/35f93e8dd5484abb8b90687952c82010/bids/9161500fb17744ce90346052ddf8479c/documents/bdf03760f26641e6b662ddd1eb2e1e1f?download=752bdc92fce4442596aec7342e050667", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/35f93e8dd5484abb8b90687952c82010/bids/799d983fc3ca4f18a3d22ead02ec7826/documents/bdf03760f26641e6b662ddd1eb2e1e1f?download=752bdc92fce4442596aec7342e050667", "format": "application/pdf", "isDescriptionDecision": false, "documentOf": "tender", @@ -34,7 +34,7 @@ Content-Type: application/json; charset=UTF-8 "confidentiality": "buyerOnly", "language": "uk", "title": "DescriptiveProposal.pdf", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/35f93e8dd5484abb8b90687952c82010/bids/9161500fb17744ce90346052ddf8479c/documents/b3ba98a293ec412b966a9cb2c035020a?download=ec4c001ffaee4fb494eaa38e6bfe7bd7", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/35f93e8dd5484abb8b90687952c82010/bids/799d983fc3ca4f18a3d22ead02ec7826/documents/b3ba98a293ec412b966a9cb2c035020a?download=ec4c001ffaee4fb494eaa38e6bfe7bd7", "format": "application/pdf", "isDescriptionDecision": true, "documentOf": "tender", @@ -47,7 +47,7 @@ Content-Type: application/json; charset=UTF-8 "confidentiality": "buyerOnly", "language": "uk", "format": "application/pdf", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/35f93e8dd5484abb8b90687952c82010/bids/9161500fb17744ce90346052ddf8479c/documents/c1b944c8854543e58b0d043843de553c?download=f47657026ea64bf6b5a840519258f836", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/35f93e8dd5484abb8b90687952c82010/bids/799d983fc3ca4f18a3d22ead02ec7826/documents/c1b944c8854543e58b0d043843de553c?download=f47657026ea64bf6b5a840519258f836", "confidentialityRationale": "Only our company sells badgers with pink hair.", "title": "Proposal_top_secrets.pdf", "isDescriptionDecision": false, @@ -57,7 +57,6 @@ Content-Type: application/json; charset=UTF-8 "dateModified": "2020-05-15T01:00:00+03:00" } ], - "selfEligible": true, "subcontractingDetails": "ДКП «Орфей», Україна", "selfQualified": true, "tenderers": [ @@ -84,7 +83,7 @@ Content-Type: application/json; charset=UTF-8 } ], "date": "2020-05-15T01:00:00+03:00", - "id": "9161500fb17744ce90346052ddf8479c" + "id": "799d983fc3ca4f18a3d22ead02ec7826" } } diff --git a/docs/source/tendering/competitivedialogue/tutorial/bidder-after-changing-tender.http b/docs/source/tendering/competitivedialogue/tutorial/bidder-after-changing-tender.http index b0d193fe35..114b8ad86c 100644 --- a/docs/source/tendering/competitivedialogue/tutorial/bidder-after-changing-tender.http +++ b/docs/source/tendering/competitivedialogue/tutorial/bidder-after-changing-tender.http @@ -1,4 +1,4 @@ -GET /api/2.5/tenders/35f93e8dd5484abb8b90687952c82010/bids/9161500fb17744ce90346052ddf8479c?acc_token=3779418188014a5197c514e6dd1908a2 HTTP/1.0 +GET /api/2.5/tenders/35f93e8dd5484abb8b90687952c82010/bids/799d983fc3ca4f18a3d22ead02ec7826?acc_token=3779418188014a5197c514e6dd1908a2 HTTP/1.0 Authorization: Bearer broker Host: lb-api-sandbox.prozorro.gov.ua @@ -7,7 +7,7 @@ Content-Type: application/json; charset=UTF-8 { "data": { "status": "invalid", - "id": "9161500fb17744ce90346052ddf8479c" + "id": "799d983fc3ca4f18a3d22ead02ec7826" } } diff --git a/docs/source/tendering/competitivedialogue/tutorial/bidder-documents.http b/docs/source/tendering/competitivedialogue/tutorial/bidder-documents.http index c3c5c65e45..ee9e262e78 100644 --- a/docs/source/tendering/competitivedialogue/tutorial/bidder-documents.http +++ b/docs/source/tendering/competitivedialogue/tutorial/bidder-documents.http @@ -1,4 +1,4 @@ -GET /api/2.5/tenders/35f93e8dd5484abb8b90687952c82010/bids/9161500fb17744ce90346052ddf8479c/documents?acc_token=3779418188014a5197c514e6dd1908a2 HTTP/1.0 +GET /api/2.5/tenders/35f93e8dd5484abb8b90687952c82010/bids/799d983fc3ca4f18a3d22ead02ec7826/documents?acc_token=3779418188014a5197c514e6dd1908a2 HTTP/1.0 Authorization: Bearer broker Host: lb-api-sandbox.prozorro.gov.ua @@ -11,7 +11,7 @@ Content-Type: application/json; charset=UTF-8 "confidentiality": "public", "language": "uk", "title": "Proposal.pdf", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/35f93e8dd5484abb8b90687952c82010/bids/9161500fb17744ce90346052ddf8479c/documents/bdf03760f26641e6b662ddd1eb2e1e1f?download=752bdc92fce4442596aec7342e050667", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/35f93e8dd5484abb8b90687952c82010/bids/799d983fc3ca4f18a3d22ead02ec7826/documents/bdf03760f26641e6b662ddd1eb2e1e1f?download=752bdc92fce4442596aec7342e050667", "format": "application/pdf", "isDescriptionDecision": false, "documentOf": "tender", @@ -24,7 +24,7 @@ Content-Type: application/json; charset=UTF-8 "confidentiality": "buyerOnly", "language": "uk", "title": "DescriptiveProposal.pdf", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/35f93e8dd5484abb8b90687952c82010/bids/9161500fb17744ce90346052ddf8479c/documents/b3ba98a293ec412b966a9cb2c035020a?download=ec4c001ffaee4fb494eaa38e6bfe7bd7", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/35f93e8dd5484abb8b90687952c82010/bids/799d983fc3ca4f18a3d22ead02ec7826/documents/b3ba98a293ec412b966a9cb2c035020a?download=ec4c001ffaee4fb494eaa38e6bfe7bd7", "format": "application/pdf", "isDescriptionDecision": true, "documentOf": "tender", @@ -37,7 +37,7 @@ Content-Type: application/json; charset=UTF-8 "confidentiality": "buyerOnly", "language": "uk", "format": "application/pdf", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/35f93e8dd5484abb8b90687952c82010/bids/9161500fb17744ce90346052ddf8479c/documents/c1b944c8854543e58b0d043843de553c?download=f47657026ea64bf6b5a840519258f836", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/35f93e8dd5484abb8b90687952c82010/bids/799d983fc3ca4f18a3d22ead02ec7826/documents/c1b944c8854543e58b0d043843de553c?download=f47657026ea64bf6b5a840519258f836", "confidentialityRationale": "Only our company sells badgers with pink hair.", "title": "Proposal_top_secrets.pdf", "isDescriptionDecision": false, diff --git a/docs/source/tendering/competitivedialogue/tutorial/blank-tender-view.http b/docs/source/tendering/competitivedialogue/tutorial/blank-tender-view.http index e2ff83ebcd..c97c57c981 100644 --- a/docs/source/tendering/competitivedialogue/tutorial/blank-tender-view.http +++ b/docs/source/tendering/competitivedialogue/tutorial/blank-tender-view.http @@ -14,8 +14,8 @@ Content-Type: application/json; charset=UTF-8 }, "enquiryPeriod": { "startDate": "2020-05-15T01:00:00+03:00", - "clarificationsUntil": "2020-06-12T00:00:00+03:00", - "endDate": "2020-06-05T01:00:00+03:00" + "clarificationsUntil": "2020-06-11T00:00:00+03:00", + "endDate": "2020-06-05T00:00:00+03:00" }, "submissionMethod": "electronicAuction", "next_check": "2020-06-15T01:00:00+03:00", @@ -80,7 +80,7 @@ Content-Type: application/json; charset=UTF-8 }, "percentage": 54.45, "type": "financing", - "id": "e355df7685f14016b48e45d3b6ba7f0f" + "id": "69a5415ca5f7457ebe20137639f410e0" } ], "minimalStep": { @@ -115,7 +115,7 @@ Content-Type: application/json; charset=UTF-8 "startDate": "2020-06-04T00:00:00+02:00", "endDate": "2020-07-04T00:00:00+02:00" }, - "id": "95b041402a794b48aa9200874907a06a", + "id": "8bc8ded5746c4badb496d3297fce132c", "unit": { "code": "44617100-9", "name": "item" @@ -148,7 +148,7 @@ Content-Type: application/json; charset=UTF-8 "startDate": "2020-06-04T00:00:00+02:00", "endDate": "2020-07-04T00:00:00+02:00" }, - "id": "8673d15afe1147e3b19e6aa7ee6fe462", + "id": "cbb964e3acb24801b28a9a27ea7efb14", "unit": { "code": "44617100-9", "name": "item" diff --git a/docs/source/tendering/competitivedialogue/tutorial/get-answer.http b/docs/source/tendering/competitivedialogue/tutorial/get-answer.http index 89ca3f54ad..b7a3084b03 100644 --- a/docs/source/tendering/competitivedialogue/tutorial/get-answer.http +++ b/docs/source/tendering/competitivedialogue/tutorial/get-answer.http @@ -1,4 +1,4 @@ -GET /api/2.5/tenders/35f93e8dd5484abb8b90687952c82010/questions/f74db777262d460099620965f673a415 HTTP/1.0 +GET /api/2.5/tenders/35f93e8dd5484abb8b90687952c82010/questions/0541cf2833f347a7a46d919f60289a54 HTTP/1.0 Authorization: Bearer broker Host: lb-api-sandbox.prozorro.gov.ua @@ -11,7 +11,7 @@ Content-Type: application/json; charset=UTF-8 "title": "Калорійність", "date": "2020-05-15T01:00:00+03:00", "answer": "Таблицю додано в файлі \"Kalorijnist.xslx\"", - "id": "f74db777262d460099620965f673a415", + "id": "0541cf2833f347a7a46d919f60289a54", "questionOf": "tender" } } diff --git a/docs/source/tendering/competitivedialogue/tutorial/list-question.http b/docs/source/tendering/competitivedialogue/tutorial/list-question.http index a3f50f9ff2..0a2d85a6e4 100644 --- a/docs/source/tendering/competitivedialogue/tutorial/list-question.http +++ b/docs/source/tendering/competitivedialogue/tutorial/list-question.http @@ -12,7 +12,7 @@ Content-Type: application/json; charset=UTF-8 "title": "Калорійність", "date": "2020-05-15T01:00:00+03:00", "answer": "Таблицю додано в файлі \"Kalorijnist.xslx\"", - "id": "f74db777262d460099620965f673a415", + "id": "0541cf2833f347a7a46d919f60289a54", "questionOf": "tender" } ] diff --git a/docs/source/tendering/competitivedialogue/tutorial/mark-bid-doc-decision-private.http b/docs/source/tendering/competitivedialogue/tutorial/mark-bid-doc-decision-private.http index b51632a2d9..1bd624ce84 100644 --- a/docs/source/tendering/competitivedialogue/tutorial/mark-bid-doc-decision-private.http +++ b/docs/source/tendering/competitivedialogue/tutorial/mark-bid-doc-decision-private.http @@ -1,4 +1,4 @@ -PATCH /api/2.5/tenders/35f93e8dd5484abb8b90687952c82010/bids/9161500fb17744ce90346052ddf8479c/documents/b3ba98a293ec412b966a9cb2c035020a?acc_token=3779418188014a5197c514e6dd1908a2 HTTP/1.0 +PATCH /api/2.5/tenders/35f93e8dd5484abb8b90687952c82010/bids/799d983fc3ca4f18a3d22ead02ec7826/documents/b3ba98a293ec412b966a9cb2c035020a?acc_token=3779418188014a5197c514e6dd1908a2 HTTP/1.0 Authorization: Bearer broker Content-Length: 42 Content-Type: application/json @@ -18,7 +18,7 @@ Content-Type: application/json; charset=UTF-8 "confidentiality": "buyerOnly", "language": "uk", "title": "DescriptiveProposal.pdf", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/35f93e8dd5484abb8b90687952c82010/bids/9161500fb17744ce90346052ddf8479c/documents/b3ba98a293ec412b966a9cb2c035020a?download=ec4c001ffaee4fb494eaa38e6bfe7bd7", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/35f93e8dd5484abb8b90687952c82010/bids/799d983fc3ca4f18a3d22ead02ec7826/documents/b3ba98a293ec412b966a9cb2c035020a?download=ec4c001ffaee4fb494eaa38e6bfe7bd7", "format": "application/pdf", "isDescriptionDecision": true, "documentOf": "tender", diff --git a/docs/source/tendering/competitivedialogue/tutorial/mark-bid-doc-decision-proposal.http b/docs/source/tendering/competitivedialogue/tutorial/mark-bid-doc-decision-proposal.http index 7a06dfc78c..8ad449c739 100644 --- a/docs/source/tendering/competitivedialogue/tutorial/mark-bid-doc-decision-proposal.http +++ b/docs/source/tendering/competitivedialogue/tutorial/mark-bid-doc-decision-proposal.http @@ -1,4 +1,4 @@ -PATCH /api/2.5/tenders/35f93e8dd5484abb8b90687952c82010/bids/9161500fb17744ce90346052ddf8479c/documents/b3ba98a293ec412b966a9cb2c035020a?acc_token=3779418188014a5197c514e6dd1908a2 HTTP/1.0 +PATCH /api/2.5/tenders/35f93e8dd5484abb8b90687952c82010/bids/799d983fc3ca4f18a3d22ead02ec7826/documents/b3ba98a293ec412b966a9cb2c035020a?acc_token=3779418188014a5197c514e6dd1908a2 HTTP/1.0 Authorization: Bearer broker Content-Length: 41 Content-Type: application/json @@ -18,7 +18,7 @@ Content-Type: application/json; charset=UTF-8 "confidentiality": "public", "language": "uk", "title": "DescriptiveProposal.pdf", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/35f93e8dd5484abb8b90687952c82010/bids/9161500fb17744ce90346052ddf8479c/documents/b3ba98a293ec412b966a9cb2c035020a?download=ec4c001ffaee4fb494eaa38e6bfe7bd7", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/35f93e8dd5484abb8b90687952c82010/bids/799d983fc3ca4f18a3d22ead02ec7826/documents/b3ba98a293ec412b966a9cb2c035020a?download=ec4c001ffaee4fb494eaa38e6bfe7bd7", "format": "application/pdf", "isDescriptionDecision": true, "documentOf": "tender", diff --git a/docs/source/tendering/competitivedialogue/tutorial/mark-bid-doc-private.http b/docs/source/tendering/competitivedialogue/tutorial/mark-bid-doc-private.http index abf252cc23..35a2ed0aba 100644 --- a/docs/source/tendering/competitivedialogue/tutorial/mark-bid-doc-private.http +++ b/docs/source/tendering/competitivedialogue/tutorial/mark-bid-doc-private.http @@ -1,4 +1,4 @@ -PATCH /api/2.5/tenders/35f93e8dd5484abb8b90687952c82010/bids/9161500fb17744ce90346052ddf8479c/documents/c1b944c8854543e58b0d043843de553c?acc_token=3779418188014a5197c514e6dd1908a2 HTTP/1.0 +PATCH /api/2.5/tenders/35f93e8dd5484abb8b90687952c82010/bids/799d983fc3ca4f18a3d22ead02ec7826/documents/c1b944c8854543e58b0d043843de553c?acc_token=3779418188014a5197c514e6dd1908a2 HTTP/1.0 Authorization: Bearer broker Content-Length: 120 Content-Type: application/json @@ -19,7 +19,7 @@ Content-Type: application/json; charset=UTF-8 "confidentiality": "buyerOnly", "language": "uk", "format": "application/pdf", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/35f93e8dd5484abb8b90687952c82010/bids/9161500fb17744ce90346052ddf8479c/documents/c1b944c8854543e58b0d043843de553c?download=f47657026ea64bf6b5a840519258f836", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/35f93e8dd5484abb8b90687952c82010/bids/799d983fc3ca4f18a3d22ead02ec7826/documents/c1b944c8854543e58b0d043843de553c?download=f47657026ea64bf6b5a840519258f836", "confidentialityRationale": "Only our company sells badgers with pink hair.", "title": "Proposal_top_secrets.pdf", "isDescriptionDecision": false, diff --git a/docs/source/tendering/competitivedialogue/tutorial/patch-items-value-periods.http b/docs/source/tendering/competitivedialogue/tutorial/patch-items-value-periods.http index d4e938a2c1..e140c2711b 100644 --- a/docs/source/tendering/competitivedialogue/tutorial/patch-items-value-periods.http +++ b/docs/source/tendering/competitivedialogue/tutorial/patch-items-value-periods.http @@ -7,7 +7,7 @@ DATA: { "data": { "tenderPeriod": { - "endDate": "2020-06-14T01:00:10+03:00" + "endDate": "2020-06-15T01:00:00+03:00" } } } @@ -20,16 +20,16 @@ Content-Type: application/json; charset=UTF-8 "mainProcurementCategory": "services", "complaintPeriod": { "startDate": "2020-05-15T01:00:00+03:00", - "endDate": "2020-06-10T00:00:00+03:00" + "endDate": "2020-06-11T00:00:00+03:00" }, "enquiryPeriod": { "startDate": "2020-05-15T01:00:00+03:00", "clarificationsUntil": "2020-06-11T00:00:00+03:00", - "endDate": "2020-06-04T01:00:10+03:00", + "endDate": "2020-06-05T00:00:00+03:00", "invalidationDate": "2020-05-15T01:00:00+03:00" }, "submissionMethod": "electronicAuction", - "next_check": "2020-06-14T01:00:10+03:00", + "next_check": "2020-06-15T01:00:00+03:00", "procuringEntity": { "kind": "general", "name": "ЗОСШ #10 м.Вінниці", @@ -63,7 +63,7 @@ Content-Type: application/json; charset=UTF-8 "status": "active.tendering", "tenderPeriod": { "startDate": "2020-05-15T01:00:00+03:00", - "endDate": "2020-06-14T01:00:10+03:00" + "endDate": "2020-06-15T01:00:00+03:00" }, "title_en": "Services in school canteens", "procurementMethodType": "competitiveDialogueEU", @@ -91,7 +91,7 @@ Content-Type: application/json; charset=UTF-8 }, "percentage": 54.45, "type": "financing", - "id": "e355df7685f14016b48e45d3b6ba7f0f" + "id": "69a5415ca5f7457ebe20137639f410e0" } ], "minimalStep": { @@ -126,7 +126,7 @@ Content-Type: application/json; charset=UTF-8 "startDate": "2020-06-04T00:00:00+02:00", "endDate": "2020-07-04T00:00:00+02:00" }, - "id": "95b041402a794b48aa9200874907a06a", + "id": "8bc8ded5746c4badb496d3297fce132c", "unit": { "code": "44617100-9", "name": "item" @@ -159,7 +159,7 @@ Content-Type: application/json; charset=UTF-8 "startDate": "2020-06-04T00:00:00+02:00", "endDate": "2020-07-04T00:00:00+02:00" }, - "id": "8673d15afe1147e3b19e6aa7ee6fe462", + "id": "cbb964e3acb24801b28a9a27ea7efb14", "unit": { "code": "44617100-9", "name": "item" diff --git a/docs/source/tendering/competitivedialogue/tutorial/pending-cancellation.http b/docs/source/tendering/competitivedialogue/tutorial/pending-cancellation.http index 9e9a67e9b6..6d707d8f81 100644 --- a/docs/source/tendering/competitivedialogue/tutorial/pending-cancellation.http +++ b/docs/source/tendering/competitivedialogue/tutorial/pending-cancellation.http @@ -1,4 +1,4 @@ -PATCH /api/2.5/tenders/c4eafa4139e24f1d84c1ce5ccbb4560d/cancellations/d42fd4b9cc384f5280a5b4edcf883629?acc_token=ce9ee5fc97484fc3b51e3f4dcea722d4 HTTP/1.0 +PATCH /api/2.5/tenders/c4eafa4139e24f1d84c1ce5ccbb4560d/cancellations/778f01babc364fba9ec0a685ec81d2f1?acc_token=ce9ee5fc97484fc3b51e3f4dcea722d4 HTTP/1.0 Authorization: Bearer broker Content-Length: 31 Content-Type: application/json @@ -47,7 +47,7 @@ Content-Type: application/json; charset=UTF-8 "reasonType": "unFixable", "date": "2020-05-15T01:00:03+03:00", "cancellationOf": "tender", - "id": "d42fd4b9cc384f5280a5b4edcf883629" + "id": "778f01babc364fba9ec0a685ec81d2f1" } } diff --git a/docs/source/tendering/competitivedialogue/tutorial/pre-qualification-confirmation.http b/docs/source/tendering/competitivedialogue/tutorial/pre-qualification-confirmation.http index af01a7556e..325a1a0648 100644 --- a/docs/source/tendering/competitivedialogue/tutorial/pre-qualification-confirmation.http +++ b/docs/source/tendering/competitivedialogue/tutorial/pre-qualification-confirmation.http @@ -23,12 +23,12 @@ Content-Type: application/json; charset=UTF-8 }, "enquiryPeriod": { "startDate": "2020-04-14T01:00:00+03:00", - "clarificationsUntil": "2020-05-09T00:00:00+03:00", - "endDate": "2020-05-05T01:00:00+03:00", + "clarificationsUntil": "2020-05-08T00:00:00+03:00", + "endDate": "2020-05-05T00:00:00+03:00", "invalidationDate": "2020-05-15T01:00:00+03:00" }, "submissionMethod": "electronicAuction", - "next_check": "2020-05-20T01:00:00+03:00", + "next_check": "2020-05-21T00:00:00+03:00", "procuringEntity": { "kind": "general", "name": "ЗОСШ #10 м.Вінниці", @@ -61,7 +61,7 @@ Content-Type: application/json; charset=UTF-8 "title": "Калорійність", "date": "2020-05-15T01:00:00+03:00", "answer": "Таблицю додано в файлі \"Kalorijnist.xslx\"", - "id": "f74db777262d460099620965f673a415", + "id": "0541cf2833f347a7a46d919f60289a54", "questionOf": "tender" } ], @@ -113,7 +113,7 @@ Content-Type: application/json; charset=UTF-8 "title": "Послуги шкільних їдалень", "qualificationPeriod": { "startDate": "2020-05-15T01:00:00+03:00", - "endDate": "2020-05-20T01:00:00+03:00" + "endDate": "2020-05-21T00:00:00+03:00" }, "tenderID": "UA-2020-05-15-000001", "dateModified": "2020-05-15T01:00:00+03:00", @@ -127,7 +127,7 @@ Content-Type: application/json; charset=UTF-8 "status": "active", "eligible": true, "qualified": true, - "bidID": "9161500fb17744ce90346052ddf8479c", + "bidID": "799d983fc3ca4f18a3d22ead02ec7826", "date": "2020-05-15T01:00:00+03:00", "id": "688adb9bb70e4d4fbcaf4ba1025e7e1a" }, @@ -135,7 +135,7 @@ Content-Type: application/json; charset=UTF-8 "status": "active", "eligible": true, "qualified": true, - "bidID": "253a8b6e43504db9a3d4ec839dc7e5ce", + "bidID": "5c14615bc32a4efea822c166a6fa4023", "date": "2020-05-15T01:00:00+03:00", "id": "be53976fae27403594b3de9b7bdfba6a" }, @@ -143,7 +143,7 @@ Content-Type: application/json; charset=UTF-8 "status": "unsuccessful", "eligible": false, "qualified": false, - "bidID": "d2423013b43642f98ce4b78bc3c99d66", + "bidID": "d3aa2f675e1e4ba28b29163a5e247111", "date": "2020-05-15T01:00:00+03:00", "id": "5ffc4b1c851848199fd66861aa118688" }, @@ -151,7 +151,7 @@ Content-Type: application/json; charset=UTF-8 "status": "active", "eligible": true, "qualified": true, - "bidID": "8fe55741897d438581a0af90c21cc42d", + "bidID": "80b8867552f446eebf0fbc93b10fbdf5", "date": "2020-05-15T01:00:00+03:00", "id": "21a68f5b2e664a23827a19a669007d33" } @@ -181,7 +181,7 @@ Content-Type: application/json; charset=UTF-8 }, "percentage": 54.45, "type": "financing", - "id": "e355df7685f14016b48e45d3b6ba7f0f" + "id": "69a5415ca5f7457ebe20137639f410e0" } ], "minimalStep": { @@ -216,7 +216,7 @@ Content-Type: application/json; charset=UTF-8 "startDate": "2020-06-04T00:00:00+02:00", "endDate": "2020-07-04T00:00:00+02:00" }, - "id": "95b041402a794b48aa9200874907a06a", + "id": "8bc8ded5746c4badb496d3297fce132c", "unit": { "code": "44617100-9", "name": "item" @@ -249,7 +249,7 @@ Content-Type: application/json; charset=UTF-8 "startDate": "2020-06-04T00:00:00+02:00", "endDate": "2020-07-04T00:00:00+02:00" }, - "id": "8673d15afe1147e3b19e6aa7ee6fe462", + "id": "cbb964e3acb24801b28a9a27ea7efb14", "unit": { "code": "44617100-9", "name": "item" @@ -279,7 +279,7 @@ Content-Type: application/json; charset=UTF-8 "confidentiality": "buyerOnly", "language": "uk", "title": "DescriptiveProposal.pdf", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/35f93e8dd5484abb8b90687952c82010/bids/9161500fb17744ce90346052ddf8479c/documents/b3ba98a293ec412b966a9cb2c035020a?download=ec4c001ffaee4fb494eaa38e6bfe7bd7", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/35f93e8dd5484abb8b90687952c82010/bids/799d983fc3ca4f18a3d22ead02ec7826/documents/b3ba98a293ec412b966a9cb2c035020a?download=ec4c001ffaee4fb494eaa38e6bfe7bd7", "format": "application/pdf", "isDescriptionDecision": true, "documentOf": "tender", @@ -292,7 +292,7 @@ Content-Type: application/json; charset=UTF-8 "confidentiality": "buyerOnly", "language": "uk", "format": "application/pdf", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/35f93e8dd5484abb8b90687952c82010/bids/9161500fb17744ce90346052ddf8479c/documents/c1b944c8854543e58b0d043843de553c?download=f47657026ea64bf6b5a840519258f836", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/35f93e8dd5484abb8b90687952c82010/bids/799d983fc3ca4f18a3d22ead02ec7826/documents/c1b944c8854543e58b0d043843de553c?download=f47657026ea64bf6b5a840519258f836", "confidentialityRationale": "Only our company sells badgers with pink hair.", "title": "Proposal_top_secrets.pdf", "isDescriptionDecision": false, @@ -302,7 +302,7 @@ Content-Type: application/json; charset=UTF-8 "dateModified": "2020-05-15T01:00:00+03:00" } ], - "id": "9161500fb17744ce90346052ddf8479c", + "id": "799d983fc3ca4f18a3d22ead02ec7826", "tenderers": [ { "contactPoint": { @@ -329,7 +329,7 @@ Content-Type: application/json; charset=UTF-8 }, { "status": "active", - "id": "253a8b6e43504db9a3d4ec839dc7e5ce", + "id": "5c14615bc32a4efea822c166a6fa4023", "tenderers": [ { "contactPoint": { @@ -356,7 +356,7 @@ Content-Type: application/json; charset=UTF-8 }, { "status": "unsuccessful", - "id": "d2423013b43642f98ce4b78bc3c99d66", + "id": "d3aa2f675e1e4ba28b29163a5e247111", "tenderers": [ { "contactPoint": { @@ -394,7 +394,7 @@ Content-Type: application/json; charset=UTF-8 "isDescriptionDecision": false, "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", - "id": "e92a237d2cc241d1ae1047f4599874c7", + "id": "4ad15f4646fc4d29a4b63cb9bd25ac01", "dateModified": "2020-05-15T01:00:00+03:00" }, { @@ -402,17 +402,17 @@ Content-Type: application/json; charset=UTF-8 "confidentiality": "buyerOnly", "language": "uk", "format": "application/pdf", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/35f93e8dd5484abb8b90687952c82010/bids/8fe55741897d438581a0af90c21cc42d/documents/3ee0045cc6314ac78ba7a67aa8c90a52?download=9256c48555a442f9991381bf30f8f2c2", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/35f93e8dd5484abb8b90687952c82010/bids/80b8867552f446eebf0fbc93b10fbdf5/documents/b8516bf8ea92481a8be558849bb81b11?download=9256c48555a442f9991381bf30f8f2c2", "confidentialityRationale": "Only our company sells badgers with pink hair.", "title": "Proposal_part2.pdf", "isDescriptionDecision": false, "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", - "id": "3ee0045cc6314ac78ba7a67aa8c90a52", + "id": "b8516bf8ea92481a8be558849bb81b11", "dateModified": "2020-05-15T01:00:00+03:00" } ], - "id": "8fe55741897d438581a0af90c21cc42d", + "id": "80b8867552f446eebf0fbc93b10fbdf5", "tenderers": [ { "contactPoint": { diff --git a/docs/source/tendering/competitivedialogue/tutorial/qualificated-bids-view.http b/docs/source/tendering/competitivedialogue/tutorial/qualificated-bids-view.http index b89db6d547..bbe0230696 100644 --- a/docs/source/tendering/competitivedialogue/tutorial/qualificated-bids-view.http +++ b/docs/source/tendering/competitivedialogue/tutorial/qualificated-bids-view.http @@ -27,7 +27,7 @@ Content-Type: application/json; charset=UTF-8 "confidentiality": "buyerOnly", "language": "uk", "title": "DescriptiveProposal.pdf", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/35f93e8dd5484abb8b90687952c82010/bids/9161500fb17744ce90346052ddf8479c/documents/b3ba98a293ec412b966a9cb2c035020a?download=ec4c001ffaee4fb494eaa38e6bfe7bd7", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/35f93e8dd5484abb8b90687952c82010/bids/799d983fc3ca4f18a3d22ead02ec7826/documents/b3ba98a293ec412b966a9cb2c035020a?download=ec4c001ffaee4fb494eaa38e6bfe7bd7", "format": "application/pdf", "isDescriptionDecision": true, "documentOf": "tender", @@ -40,7 +40,7 @@ Content-Type: application/json; charset=UTF-8 "confidentiality": "buyerOnly", "language": "uk", "format": "application/pdf", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/35f93e8dd5484abb8b90687952c82010/bids/9161500fb17744ce90346052ddf8479c/documents/c1b944c8854543e58b0d043843de553c?download=f47657026ea64bf6b5a840519258f836", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/35f93e8dd5484abb8b90687952c82010/bids/799d983fc3ca4f18a3d22ead02ec7826/documents/c1b944c8854543e58b0d043843de553c?download=f47657026ea64bf6b5a840519258f836", "confidentialityRationale": "Only our company sells badgers with pink hair.", "title": "Proposal_top_secrets.pdf", "isDescriptionDecision": false, @@ -50,7 +50,7 @@ Content-Type: application/json; charset=UTF-8 "dateModified": "2020-05-15T01:00:00+03:00" } ], - "id": "9161500fb17744ce90346052ddf8479c", + "id": "799d983fc3ca4f18a3d22ead02ec7826", "tenderers": [ { "contactPoint": { @@ -77,7 +77,7 @@ Content-Type: application/json; charset=UTF-8 }, { "status": "active", - "id": "253a8b6e43504db9a3d4ec839dc7e5ce", + "id": "5c14615bc32a4efea822c166a6fa4023", "tenderers": [ { "contactPoint": { @@ -104,7 +104,6 @@ Content-Type: application/json; charset=UTF-8 }, { "status": "unsuccessful", - "selfEligible": true, "tenderers": [ { "contactPoint": { @@ -129,7 +128,7 @@ Content-Type: application/json; charset=UTF-8 } ], "selfQualified": true, - "id": "d2423013b43642f98ce4b78bc3c99d66" + "id": "d3aa2f675e1e4ba28b29163a5e247111" }, { "status": "active", @@ -144,7 +143,7 @@ Content-Type: application/json; charset=UTF-8 "isDescriptionDecision": false, "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", - "id": "e92a237d2cc241d1ae1047f4599874c7", + "id": "4ad15f4646fc4d29a4b63cb9bd25ac01", "dateModified": "2020-05-15T01:00:00+03:00" }, { @@ -152,17 +151,17 @@ Content-Type: application/json; charset=UTF-8 "confidentiality": "buyerOnly", "language": "uk", "format": "application/pdf", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/35f93e8dd5484abb8b90687952c82010/bids/8fe55741897d438581a0af90c21cc42d/documents/3ee0045cc6314ac78ba7a67aa8c90a52?download=9256c48555a442f9991381bf30f8f2c2", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/35f93e8dd5484abb8b90687952c82010/bids/80b8867552f446eebf0fbc93b10fbdf5/documents/b8516bf8ea92481a8be558849bb81b11?download=9256c48555a442f9991381bf30f8f2c2", "confidentialityRationale": "Only our company sells badgers with pink hair.", "title": "Proposal_part2.pdf", "isDescriptionDecision": false, "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", - "id": "3ee0045cc6314ac78ba7a67aa8c90a52", + "id": "b8516bf8ea92481a8be558849bb81b11", "dateModified": "2020-05-15T01:00:00+03:00" } ], - "id": "8fe55741897d438581a0af90c21cc42d", + "id": "80b8867552f446eebf0fbc93b10fbdf5", "tenderers": [ { "contactPoint": { diff --git a/docs/source/tendering/competitivedialogue/tutorial/qualifications-listing.http b/docs/source/tendering/competitivedialogue/tutorial/qualifications-listing.http index c6946fb3de..dac74411a7 100644 --- a/docs/source/tendering/competitivedialogue/tutorial/qualifications-listing.http +++ b/docs/source/tendering/competitivedialogue/tutorial/qualifications-listing.http @@ -10,7 +10,7 @@ Content-Type: application/json; charset=UTF-8 "status": "pending", "eligible": false, "qualified": false, - "bidID": "9161500fb17744ce90346052ddf8479c", + "bidID": "799d983fc3ca4f18a3d22ead02ec7826", "date": "2020-05-15T01:00:00+03:00", "id": "688adb9bb70e4d4fbcaf4ba1025e7e1a" }, @@ -18,7 +18,7 @@ Content-Type: application/json; charset=UTF-8 "status": "pending", "eligible": false, "qualified": false, - "bidID": "253a8b6e43504db9a3d4ec839dc7e5ce", + "bidID": "5c14615bc32a4efea822c166a6fa4023", "date": "2020-05-15T01:00:00+03:00", "id": "be53976fae27403594b3de9b7bdfba6a" }, @@ -26,7 +26,7 @@ Content-Type: application/json; charset=UTF-8 "status": "pending", "eligible": false, "qualified": false, - "bidID": "d2423013b43642f98ce4b78bc3c99d66", + "bidID": "d3aa2f675e1e4ba28b29163a5e247111", "date": "2020-05-15T01:00:00+03:00", "id": "5ffc4b1c851848199fd66861aa118688" }, @@ -34,7 +34,7 @@ Content-Type: application/json; charset=UTF-8 "status": "pending", "eligible": false, "qualified": false, - "bidID": "8fe55741897d438581a0af90c21cc42d", + "bidID": "80b8867552f446eebf0fbc93b10fbdf5", "date": "2020-05-15T01:00:00+03:00", "id": "21a68f5b2e664a23827a19a669007d33" } diff --git a/docs/source/tendering/competitivedialogue/tutorial/register-2nd-bidder.http b/docs/source/tendering/competitivedialogue/tutorial/register-2nd-bidder.http index 3e30e78b54..88186e4c5e 100644 --- a/docs/source/tendering/competitivedialogue/tutorial/register-2nd-bidder.http +++ b/docs/source/tendering/competitivedialogue/tutorial/register-2nd-bidder.http @@ -1,12 +1,11 @@ POST /api/2.5/tenders/35f93e8dd5484abb8b90687952c82010/bids HTTP/1.0 Authorization: Bearer broker -Content-Length: 824 +Content-Length: 802 Content-Type: application/json Host: lb-api-sandbox.prozorro.gov.ua DATA: { "data": { - "selfEligible": true, "selfQualified": true, "value": { "amount": 499 @@ -39,16 +38,15 @@ DATA: Response: 201 Created Content-Type: application/json; charset=UTF-8 -Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/35f93e8dd5484abb8b90687952c82010/bids/253a8b6e43504db9a3d4ec839dc7e5ce +Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/35f93e8dd5484abb8b90687952c82010/bids/5c14615bc32a4efea822c166a6fa4023 { "access": { "transfer": "ba23f3b16ee24741bb13d14b9433db00", "token": "cd63d2f076eb412c9ab423ff0a83ba89" }, "data": { + "date": "2020-05-15T01:00:00+03:00", "status": "pending", - "selfEligible": true, - "selfQualified": true, "tenderers": [ { "contactPoint": { @@ -72,8 +70,8 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/35f93e8dd5484abb } } ], - "date": "2020-05-15T01:00:00+03:00", - "id": "253a8b6e43504db9a3d4ec839dc7e5ce" + "selfQualified": true, + "id": "5c14615bc32a4efea822c166a6fa4023" } } diff --git a/docs/source/tendering/competitivedialogue/tutorial/register-3rd-bidder.http b/docs/source/tendering/competitivedialogue/tutorial/register-3rd-bidder.http index 221407c328..c3e2106a03 100644 --- a/docs/source/tendering/competitivedialogue/tutorial/register-3rd-bidder.http +++ b/docs/source/tendering/competitivedialogue/tutorial/register-3rd-bidder.http @@ -1,12 +1,11 @@ POST /api/2.5/tenders/35f93e8dd5484abb8b90687952c82010/bids HTTP/1.0 Authorization: Bearer broker -Content-Length: 802 +Content-Length: 780 Content-Type: application/json Host: lb-api-sandbox.prozorro.gov.ua DATA: { "data": { - "selfEligible": true, "selfQualified": true, "value": { "amount": 5 @@ -39,16 +38,15 @@ DATA: Response: 201 Created Content-Type: application/json; charset=UTF-8 -Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/35f93e8dd5484abb8b90687952c82010/bids/d2423013b43642f98ce4b78bc3c99d66 +Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/35f93e8dd5484abb8b90687952c82010/bids/d3aa2f675e1e4ba28b29163a5e247111 { "access": { "transfer": "b443c2e5a1484d049dc1c3fc2694e9a8", "token": "bd8c8ff401304ac4939e7ecf9e5d3a0e" }, "data": { + "date": "2020-05-15T01:00:00+03:00", "status": "pending", - "selfEligible": true, - "selfQualified": true, "tenderers": [ { "contactPoint": { @@ -72,8 +70,8 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/35f93e8dd5484abb } } ], - "date": "2020-05-15T01:00:00+03:00", - "id": "d2423013b43642f98ce4b78bc3c99d66" + "selfQualified": true, + "id": "d3aa2f675e1e4ba28b29163a5e247111" } } diff --git a/docs/source/tendering/competitivedialogue/tutorial/register-4rd-bidder.http b/docs/source/tendering/competitivedialogue/tutorial/register-4rd-bidder.http index 4f581b82d7..f75894f822 100644 --- a/docs/source/tendering/competitivedialogue/tutorial/register-4rd-bidder.http +++ b/docs/source/tendering/competitivedialogue/tutorial/register-4rd-bidder.http @@ -1,12 +1,11 @@ POST /api/2.5/tenders/35f93e8dd5484abb8b90687952c82010/bids HTTP/1.0 Authorization: Bearer broker -Content-Length: 1613 +Content-Length: 1591 Content-Type: application/json Host: lb-api-sandbox.prozorro.gov.ua DATA: { "data": { - "selfEligible": true, "documents": [ { "url": "http://public-docs-sandbox.prozorro.gov.ua/get/19d7c62da8e144799eb146bcd5501b48?KeyID=a8968c46&Signature=s3TNC0Q8b7cxRiK4GvQwM2WwQxWYg9e%2Bo5PE1s416Ot%2FEcvKnkY%2Bi%2Bqq%2FBTbnh6tNirCVMVo4nUl654as0JaAA%3D%3D", @@ -55,7 +54,7 @@ DATA: Response: 201 Created Content-Type: application/json; charset=UTF-8 -Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/35f93e8dd5484abb8b90687952c82010/bids/8fe55741897d438581a0af90c21cc42d +Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/35f93e8dd5484abb8b90687952c82010/bids/80b8867552f446eebf0fbc93b10fbdf5 { "access": { "transfer": "e1084e14db254a5eaacd772014cc79e0", @@ -69,30 +68,28 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/35f93e8dd5484abb "confidentiality": "public", "language": "uk", "title": "Proposal_part1.pdf", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/35f93e8dd5484abb8b90687952c82010/bids/8fe55741897d438581a0af90c21cc42d/documents/e92a237d2cc241d1ae1047f4599874c7?download=19d7c62da8e144799eb146bcd5501b48", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/35f93e8dd5484abb8b90687952c82010/bids/80b8867552f446eebf0fbc93b10fbdf5/documents/4ad15f4646fc4d29a4b63cb9bd25ac01?download=19d7c62da8e144799eb146bcd5501b48", "format": "application/pdf", "isDescriptionDecision": false, "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", - "id": "e92a237d2cc241d1ae1047f4599874c7", + "id": "4ad15f4646fc4d29a4b63cb9bd25ac01", "dateModified": "2020-05-15T01:00:00+03:00" }, { "hash": "md5:00000000000000000000000000000000", "confidentiality": "buyerOnly", "language": "uk", - "format": "application/pdf", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/35f93e8dd5484abb8b90687952c82010/bids/8fe55741897d438581a0af90c21cc42d/documents/3ee0045cc6314ac78ba7a67aa8c90a52?download=9256c48555a442f9991381bf30f8f2c2", - "confidentialityRationale": "Only our company sells badgers with pink hair.", "title": "Proposal_part2.pdf", + "confidentialityRationale": "Only our company sells badgers with pink hair.", + "format": "application/pdf", "isDescriptionDecision": false, "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", - "id": "3ee0045cc6314ac78ba7a67aa8c90a52", - "dateModified": "2020-05-15T01:00:00+03:00" + "dateModified": "2020-05-15T01:00:00+03:00", + "id": "b8516bf8ea92481a8be558849bb81b11" } ], - "selfEligible": true, "selfQualified": true, "tenderers": [ { @@ -118,7 +115,7 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/35f93e8dd5484abb } ], "date": "2020-05-15T01:00:00+03:00", - "id": "8fe55741897d438581a0af90c21cc42d" + "id": "80b8867552f446eebf0fbc93b10fbdf5" } } diff --git a/docs/source/tendering/competitivedialogue/tutorial/register-bidder.http b/docs/source/tendering/competitivedialogue/tutorial/register-bidder.http index 5bec777300..21c65e2c76 100644 --- a/docs/source/tendering/competitivedialogue/tutorial/register-bidder.http +++ b/docs/source/tendering/competitivedialogue/tutorial/register-bidder.http @@ -1,15 +1,12 @@ POST /api/2.5/tenders/35f93e8dd5484abb8b90687952c82010/bids HTTP/1.0 Authorization: Bearer broker -Content-Length: 975 +Content-Length: 953 Content-Type: application/json Host: lb-api-sandbox.prozorro.gov.ua DATA: { "data": { "status": "draft", - "selfEligible": true, - "subcontractingDetails": "ДКП «Орфей», Україна", - "selfQualified": true, "tenderers": [ { "contactPoint": { @@ -32,13 +29,15 @@ DATA: "locality": "м. Вінниця" } } - ] + ], + "selfQualified": true, + "subcontractingDetails": "ДКП «Орфей», Україна" } } Response: 201 Created Content-Type: application/json; charset=UTF-8 -Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/35f93e8dd5484abb8b90687952c82010/bids/9161500fb17744ce90346052ddf8479c +Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/35f93e8dd5484abb8b90687952c82010/bids/799d983fc3ca4f18a3d22ead02ec7826 { "access": { "transfer": "cbe8219212264f088149330cce760248", @@ -46,8 +45,6 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/35f93e8dd5484abb }, "data": { "status": "draft", - "selfEligible": true, - "subcontractingDetails": "ДКП «Орфей», Україна", "selfQualified": true, "tenderers": [ { @@ -73,7 +70,8 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/35f93e8dd5484abb } ], "date": "2020-05-15T01:00:00+03:00", - "id": "9161500fb17744ce90346052ddf8479c" + "subcontractingDetails": "ДКП «Орфей», Україна", + "id": "799d983fc3ca4f18a3d22ead02ec7826" } } diff --git a/docs/source/tendering/competitivedialogue/tutorial/reject-qualification3.http b/docs/source/tendering/competitivedialogue/tutorial/reject-qualification3.http index effd6eff3e..ee46795a8a 100644 --- a/docs/source/tendering/competitivedialogue/tutorial/reject-qualification3.http +++ b/docs/source/tendering/competitivedialogue/tutorial/reject-qualification3.http @@ -17,7 +17,7 @@ Content-Type: application/json; charset=UTF-8 "status": "unsuccessful", "eligible": false, "qualified": false, - "bidID": "d2423013b43642f98ce4b78bc3c99d66", + "bidID": "d3aa2f675e1e4ba28b29163a5e247111", "date": "2020-05-15T01:00:00+03:00", "id": "5ffc4b1c851848199fd66861aa118688" } diff --git a/docs/source/tendering/competitivedialogue/tutorial/rejected-bid-view.http b/docs/source/tendering/competitivedialogue/tutorial/rejected-bid-view.http index 2d2fc26e7e..4367877dcd 100644 --- a/docs/source/tendering/competitivedialogue/tutorial/rejected-bid-view.http +++ b/docs/source/tendering/competitivedialogue/tutorial/rejected-bid-view.http @@ -1,4 +1,4 @@ -GET /api/2.5/tenders/35f93e8dd5484abb8b90687952c82010/bids/d2423013b43642f98ce4b78bc3c99d66?acc_token=67e88a4fa34541c2bbdd1b66c8b11b71 HTTP/1.0 +GET /api/2.5/tenders/35f93e8dd5484abb8b90687952c82010/bids/d3aa2f675e1e4ba28b29163a5e247111?acc_token=67e88a4fa34541c2bbdd1b66c8b11b71 HTTP/1.0 Authorization: Bearer broker Host: lb-api-sandbox.prozorro.gov.ua @@ -7,7 +7,6 @@ Content-Type: application/json; charset=UTF-8 { "data": { "status": "unsuccessful", - "selfEligible": true, "tenderers": [ { "contactPoint": { @@ -32,7 +31,7 @@ Content-Type: application/json; charset=UTF-8 } ], "selfQualified": true, - "id": "d2423013b43642f98ce4b78bc3c99d66" + "id": "d3aa2f675e1e4ba28b29163a5e247111" } } diff --git a/docs/source/tendering/competitivedialogue/tutorial/set-bid-guarantee.http b/docs/source/tendering/competitivedialogue/tutorial/set-bid-guarantee.http index 0e43166088..5f701db96c 100644 --- a/docs/source/tendering/competitivedialogue/tutorial/set-bid-guarantee.http +++ b/docs/source/tendering/competitivedialogue/tutorial/set-bid-guarantee.http @@ -21,16 +21,16 @@ Content-Type: application/json; charset=UTF-8 "mainProcurementCategory": "services", "complaintPeriod": { "startDate": "2020-05-15T01:00:00+03:00", - "endDate": "2020-06-10T00:00:00+03:00" + "endDate": "2020-06-11T00:00:00+03:00" }, "enquiryPeriod": { "startDate": "2020-05-15T01:00:00+03:00", "clarificationsUntil": "2020-06-11T00:00:00+03:00", - "endDate": "2020-06-04T01:00:10+03:00", + "endDate": "2020-06-05T00:00:00+03:00", "invalidationDate": "2020-05-15T01:00:00+03:00" }, "submissionMethod": "electronicAuction", - "next_check": "2020-06-14T01:00:10+03:00", + "next_check": "2020-06-15T01:00:00+03:00", "procuringEntity": { "kind": "general", "name": "ЗОСШ #10 м.Вінниці", @@ -68,7 +68,7 @@ Content-Type: application/json; charset=UTF-8 "status": "active.tendering", "tenderPeriod": { "startDate": "2020-05-15T01:00:00+03:00", - "endDate": "2020-06-14T01:00:10+03:00" + "endDate": "2020-06-15T01:00:00+03:00" }, "title_en": "Services in school canteens", "procurementMethodType": "competitiveDialogueEU", @@ -96,7 +96,7 @@ Content-Type: application/json; charset=UTF-8 }, "percentage": 54.45, "type": "financing", - "id": "e355df7685f14016b48e45d3b6ba7f0f" + "id": "69a5415ca5f7457ebe20137639f410e0" } ], "minimalStep": { @@ -131,7 +131,7 @@ Content-Type: application/json; charset=UTF-8 "startDate": "2020-06-04T00:00:00+02:00", "endDate": "2020-07-04T00:00:00+02:00" }, - "id": "95b041402a794b48aa9200874907a06a", + "id": "8bc8ded5746c4badb496d3297fce132c", "unit": { "code": "44617100-9", "name": "item" @@ -164,7 +164,7 @@ Content-Type: application/json; charset=UTF-8 "startDate": "2020-06-04T00:00:00+02:00", "endDate": "2020-07-04T00:00:00+02:00" }, - "id": "8673d15afe1147e3b19e6aa7ee6fe462", + "id": "cbb964e3acb24801b28a9a27ea7efb14", "unit": { "code": "44617100-9", "name": "item" diff --git a/docs/source/tendering/competitivedialogue/tutorial/stage2-pending.http b/docs/source/tendering/competitivedialogue/tutorial/stage2-pending.http index 076c1b7484..021ab28d35 100644 --- a/docs/source/tendering/competitivedialogue/tutorial/stage2-pending.http +++ b/docs/source/tendering/competitivedialogue/tutorial/stage2-pending.http @@ -16,7 +16,7 @@ Content-Type: application/json; charset=UTF-8 "enquiryPeriod": { "startDate": "2020-04-04T01:00:00+03:00", "clarificationsUntil": "2020-04-30T00:00:00+03:00", - "endDate": "2020-04-25T01:00:00+03:00", + "endDate": "2020-04-25T00:00:00+03:00", "invalidationDate": "2020-05-15T01:00:00+03:00" }, "submissionMethod": "electronicAuction", @@ -72,7 +72,7 @@ Content-Type: application/json; charset=UTF-8 "date": "2020-05-15T01:00:00+03:00", "answer": "Таблицю додано в файлі \"Kalorijnist.xslx\"", "dateAnswered": "2020-05-15T01:00:00+03:00", - "id": "f74db777262d460099620965f673a415", + "id": "0541cf2833f347a7a46d919f60289a54", "questionOf": "tender" } ], @@ -138,7 +138,7 @@ Content-Type: application/json; charset=UTF-8 "status": "active", "eligible": true, "qualified": true, - "bidID": "9161500fb17744ce90346052ddf8479c", + "bidID": "799d983fc3ca4f18a3d22ead02ec7826", "date": "2020-05-15T01:00:00+03:00", "id": "688adb9bb70e4d4fbcaf4ba1025e7e1a" }, @@ -146,7 +146,7 @@ Content-Type: application/json; charset=UTF-8 "status": "active", "eligible": true, "qualified": true, - "bidID": "253a8b6e43504db9a3d4ec839dc7e5ce", + "bidID": "5c14615bc32a4efea822c166a6fa4023", "date": "2020-05-15T01:00:00+03:00", "id": "be53976fae27403594b3de9b7bdfba6a" }, @@ -154,7 +154,7 @@ Content-Type: application/json; charset=UTF-8 "status": "unsuccessful", "eligible": false, "qualified": false, - "bidID": "d2423013b43642f98ce4b78bc3c99d66", + "bidID": "d3aa2f675e1e4ba28b29163a5e247111", "date": "2020-05-15T01:00:00+03:00", "id": "5ffc4b1c851848199fd66861aa118688" }, @@ -162,7 +162,7 @@ Content-Type: application/json; charset=UTF-8 "status": "active", "eligible": true, "qualified": true, - "bidID": "8fe55741897d438581a0af90c21cc42d", + "bidID": "80b8867552f446eebf0fbc93b10fbdf5", "date": "2020-05-15T01:00:00+03:00", "id": "21a68f5b2e664a23827a19a669007d33" } @@ -192,7 +192,7 @@ Content-Type: application/json; charset=UTF-8 }, "percentage": 54.45, "type": "financing", - "id": "e355df7685f14016b48e45d3b6ba7f0f" + "id": "69a5415ca5f7457ebe20137639f410e0" } ], "minimalStep": { @@ -227,7 +227,7 @@ Content-Type: application/json; charset=UTF-8 "startDate": "2020-06-04T00:00:00+02:00", "endDate": "2020-07-04T00:00:00+02:00" }, - "id": "95b041402a794b48aa9200874907a06a", + "id": "8bc8ded5746c4badb496d3297fce132c", "unit": { "code": "44617100-9", "name": "item" @@ -260,7 +260,7 @@ Content-Type: application/json; charset=UTF-8 "startDate": "2020-06-04T00:00:00+02:00", "endDate": "2020-07-04T00:00:00+02:00" }, - "id": "8673d15afe1147e3b19e6aa7ee6fe462", + "id": "cbb964e3acb24801b28a9a27ea7efb14", "unit": { "code": "44617100-9", "name": "item" @@ -290,7 +290,7 @@ Content-Type: application/json; charset=UTF-8 "confidentiality": "buyerOnly", "language": "uk", "title": "DescriptiveProposal.pdf", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/35f93e8dd5484abb8b90687952c82010/bids/9161500fb17744ce90346052ddf8479c/documents/b3ba98a293ec412b966a9cb2c035020a?download=ec4c001ffaee4fb494eaa38e6bfe7bd7", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/35f93e8dd5484abb8b90687952c82010/bids/799d983fc3ca4f18a3d22ead02ec7826/documents/b3ba98a293ec412b966a9cb2c035020a?download=ec4c001ffaee4fb494eaa38e6bfe7bd7", "format": "application/pdf", "isDescriptionDecision": true, "documentOf": "tender", @@ -303,7 +303,7 @@ Content-Type: application/json; charset=UTF-8 "confidentiality": "buyerOnly", "language": "uk", "format": "application/pdf", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/35f93e8dd5484abb8b90687952c82010/bids/9161500fb17744ce90346052ddf8479c/documents/c1b944c8854543e58b0d043843de553c?download=f47657026ea64bf6b5a840519258f836", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/35f93e8dd5484abb8b90687952c82010/bids/799d983fc3ca4f18a3d22ead02ec7826/documents/c1b944c8854543e58b0d043843de553c?download=f47657026ea64bf6b5a840519258f836", "confidentialityRationale": "Only our company sells badgers with pink hair.", "title": "Proposal_top_secrets.pdf", "isDescriptionDecision": false, @@ -313,7 +313,7 @@ Content-Type: application/json; charset=UTF-8 "dateModified": "2020-05-15T01:00:00+03:00" } ], - "id": "9161500fb17744ce90346052ddf8479c", + "id": "799d983fc3ca4f18a3d22ead02ec7826", "tenderers": [ { "contactPoint": { @@ -340,7 +340,7 @@ Content-Type: application/json; charset=UTF-8 }, { "status": "active", - "id": "253a8b6e43504db9a3d4ec839dc7e5ce", + "id": "5c14615bc32a4efea822c166a6fa4023", "tenderers": [ { "contactPoint": { @@ -367,7 +367,7 @@ Content-Type: application/json; charset=UTF-8 }, { "status": "unsuccessful", - "id": "d2423013b43642f98ce4b78bc3c99d66", + "id": "d3aa2f675e1e4ba28b29163a5e247111", "tenderers": [ { "contactPoint": { @@ -405,7 +405,7 @@ Content-Type: application/json; charset=UTF-8 "isDescriptionDecision": false, "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", - "id": "e92a237d2cc241d1ae1047f4599874c7", + "id": "4ad15f4646fc4d29a4b63cb9bd25ac01", "dateModified": "2020-05-15T01:00:00+03:00" }, { @@ -413,17 +413,17 @@ Content-Type: application/json; charset=UTF-8 "confidentiality": "buyerOnly", "language": "uk", "format": "application/pdf", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/35f93e8dd5484abb8b90687952c82010/bids/8fe55741897d438581a0af90c21cc42d/documents/3ee0045cc6314ac78ba7a67aa8c90a52?download=9256c48555a442f9991381bf30f8f2c2", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/35f93e8dd5484abb8b90687952c82010/bids/80b8867552f446eebf0fbc93b10fbdf5/documents/b8516bf8ea92481a8be558849bb81b11?download=9256c48555a442f9991381bf30f8f2c2", "confidentialityRationale": "Only our company sells badgers with pink hair.", "title": "Proposal_part2.pdf", "isDescriptionDecision": false, "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", - "id": "3ee0045cc6314ac78ba7a67aa8c90a52", + "id": "b8516bf8ea92481a8be558849bb81b11", "dateModified": "2020-05-15T01:00:00+03:00" } ], - "id": "8fe55741897d438581a0af90c21cc42d", + "id": "80b8867552f446eebf0fbc93b10fbdf5", "tenderers": [ { "contactPoint": { diff --git a/docs/source/tendering/competitivedialogue/tutorial/stage2-waiting.http b/docs/source/tendering/competitivedialogue/tutorial/stage2-waiting.http index 674ad6f70d..e98a6559d5 100644 --- a/docs/source/tendering/competitivedialogue/tutorial/stage2-waiting.http +++ b/docs/source/tendering/competitivedialogue/tutorial/stage2-waiting.http @@ -24,7 +24,7 @@ Content-Type: application/json; charset=UTF-8 "enquiryPeriod": { "startDate": "2020-04-04T01:00:00+03:00", "clarificationsUntil": "2020-04-30T00:00:00+03:00", - "endDate": "2020-04-25T01:00:00+03:00", + "endDate": "2020-04-25T00:00:00+03:00", "invalidationDate": "2020-05-15T01:00:00+03:00" }, "submissionMethod": "electronicAuction", @@ -80,7 +80,7 @@ Content-Type: application/json; charset=UTF-8 "date": "2020-05-15T01:00:00+03:00", "answer": "Таблицю додано в файлі \"Kalorijnist.xslx\"", "dateAnswered": "2020-05-15T01:00:00+03:00", - "id": "f74db777262d460099620965f673a415", + "id": "0541cf2833f347a7a46d919f60289a54", "questionOf": "tender" } ], @@ -146,7 +146,7 @@ Content-Type: application/json; charset=UTF-8 "status": "active", "eligible": true, "qualified": true, - "bidID": "9161500fb17744ce90346052ddf8479c", + "bidID": "799d983fc3ca4f18a3d22ead02ec7826", "date": "2020-05-15T01:00:00+03:00", "id": "688adb9bb70e4d4fbcaf4ba1025e7e1a" }, @@ -154,7 +154,7 @@ Content-Type: application/json; charset=UTF-8 "status": "active", "eligible": true, "qualified": true, - "bidID": "253a8b6e43504db9a3d4ec839dc7e5ce", + "bidID": "5c14615bc32a4efea822c166a6fa4023", "date": "2020-05-15T01:00:00+03:00", "id": "be53976fae27403594b3de9b7bdfba6a" }, @@ -162,7 +162,7 @@ Content-Type: application/json; charset=UTF-8 "status": "unsuccessful", "eligible": false, "qualified": false, - "bidID": "d2423013b43642f98ce4b78bc3c99d66", + "bidID": "d3aa2f675e1e4ba28b29163a5e247111", "date": "2020-05-15T01:00:00+03:00", "id": "5ffc4b1c851848199fd66861aa118688" }, @@ -170,7 +170,7 @@ Content-Type: application/json; charset=UTF-8 "status": "active", "eligible": true, "qualified": true, - "bidID": "8fe55741897d438581a0af90c21cc42d", + "bidID": "80b8867552f446eebf0fbc93b10fbdf5", "date": "2020-05-15T01:00:00+03:00", "id": "21a68f5b2e664a23827a19a669007d33" } @@ -200,7 +200,7 @@ Content-Type: application/json; charset=UTF-8 }, "percentage": 54.45, "type": "financing", - "id": "e355df7685f14016b48e45d3b6ba7f0f" + "id": "69a5415ca5f7457ebe20137639f410e0" } ], "minimalStep": { @@ -235,7 +235,7 @@ Content-Type: application/json; charset=UTF-8 "startDate": "2020-06-04T00:00:00+02:00", "endDate": "2020-07-04T00:00:00+02:00" }, - "id": "95b041402a794b48aa9200874907a06a", + "id": "8bc8ded5746c4badb496d3297fce132c", "unit": { "code": "44617100-9", "name": "item" @@ -268,7 +268,7 @@ Content-Type: application/json; charset=UTF-8 "startDate": "2020-06-04T00:00:00+02:00", "endDate": "2020-07-04T00:00:00+02:00" }, - "id": "8673d15afe1147e3b19e6aa7ee6fe462", + "id": "cbb964e3acb24801b28a9a27ea7efb14", "unit": { "code": "44617100-9", "name": "item" @@ -298,7 +298,7 @@ Content-Type: application/json; charset=UTF-8 "confidentiality": "buyerOnly", "language": "uk", "title": "DescriptiveProposal.pdf", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/35f93e8dd5484abb8b90687952c82010/bids/9161500fb17744ce90346052ddf8479c/documents/b3ba98a293ec412b966a9cb2c035020a?download=ec4c001ffaee4fb494eaa38e6bfe7bd7", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/35f93e8dd5484abb8b90687952c82010/bids/799d983fc3ca4f18a3d22ead02ec7826/documents/b3ba98a293ec412b966a9cb2c035020a?download=ec4c001ffaee4fb494eaa38e6bfe7bd7", "format": "application/pdf", "isDescriptionDecision": true, "documentOf": "tender", @@ -311,7 +311,7 @@ Content-Type: application/json; charset=UTF-8 "confidentiality": "buyerOnly", "language": "uk", "format": "application/pdf", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/35f93e8dd5484abb8b90687952c82010/bids/9161500fb17744ce90346052ddf8479c/documents/c1b944c8854543e58b0d043843de553c?download=f47657026ea64bf6b5a840519258f836", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/35f93e8dd5484abb8b90687952c82010/bids/799d983fc3ca4f18a3d22ead02ec7826/documents/c1b944c8854543e58b0d043843de553c?download=f47657026ea64bf6b5a840519258f836", "confidentialityRationale": "Only our company sells badgers with pink hair.", "title": "Proposal_top_secrets.pdf", "isDescriptionDecision": false, @@ -321,7 +321,7 @@ Content-Type: application/json; charset=UTF-8 "dateModified": "2020-05-15T01:00:00+03:00" } ], - "id": "9161500fb17744ce90346052ddf8479c", + "id": "799d983fc3ca4f18a3d22ead02ec7826", "tenderers": [ { "contactPoint": { @@ -348,7 +348,7 @@ Content-Type: application/json; charset=UTF-8 }, { "status": "active", - "id": "253a8b6e43504db9a3d4ec839dc7e5ce", + "id": "5c14615bc32a4efea822c166a6fa4023", "tenderers": [ { "contactPoint": { @@ -375,7 +375,7 @@ Content-Type: application/json; charset=UTF-8 }, { "status": "unsuccessful", - "id": "d2423013b43642f98ce4b78bc3c99d66", + "id": "d3aa2f675e1e4ba28b29163a5e247111", "tenderers": [ { "contactPoint": { @@ -413,7 +413,7 @@ Content-Type: application/json; charset=UTF-8 "isDescriptionDecision": false, "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", - "id": "e92a237d2cc241d1ae1047f4599874c7", + "id": "4ad15f4646fc4d29a4b63cb9bd25ac01", "dateModified": "2020-05-15T01:00:00+03:00" }, { @@ -421,17 +421,17 @@ Content-Type: application/json; charset=UTF-8 "confidentiality": "buyerOnly", "language": "uk", "format": "application/pdf", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/35f93e8dd5484abb8b90687952c82010/bids/8fe55741897d438581a0af90c21cc42d/documents/3ee0045cc6314ac78ba7a67aa8c90a52?download=9256c48555a442f9991381bf30f8f2c2", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/35f93e8dd5484abb8b90687952c82010/bids/80b8867552f446eebf0fbc93b10fbdf5/documents/b8516bf8ea92481a8be558849bb81b11?download=9256c48555a442f9991381bf30f8f2c2", "confidentialityRationale": "Only our company sells badgers with pink hair.", "title": "Proposal_part2.pdf", "isDescriptionDecision": false, "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", - "id": "3ee0045cc6314ac78ba7a67aa8c90a52", + "id": "b8516bf8ea92481a8be558849bb81b11", "dateModified": "2020-05-15T01:00:00+03:00" } ], - "id": "8fe55741897d438581a0af90c21cc42d", + "id": "80b8867552f446eebf0fbc93b10fbdf5", "tenderers": [ { "contactPoint": { diff --git a/docs/source/tendering/competitivedialogue/tutorial/stage2/EU/activate-bidder.http b/docs/source/tendering/competitivedialogue/tutorial/stage2/EU/activate-bidder.http index 372a7ceef5..4e389c6b92 100644 --- a/docs/source/tendering/competitivedialogue/tutorial/stage2/EU/activate-bidder.http +++ b/docs/source/tendering/competitivedialogue/tutorial/stage2/EU/activate-bidder.http @@ -1,4 +1,4 @@ -PATCH /api/2.5/tenders/50c82523038349969f53f3e238932c46/bids/dc595a39267248abbf3e85d759d6c1ab?acc_token=4983fc47c71047729730599c7b0329ae HTTP/1.0 +PATCH /api/2.5/tenders/50c82523038349969f53f3e238932c46/bids/529f4dbc517942dc8dd3f040cd17ddc4?acc_token=4983fc47c71047729730599c7b0329ae HTTP/1.0 Authorization: Bearer broker Content-Length: 31 Content-Type: application/json @@ -15,7 +15,6 @@ Content-Type: application/json; charset=UTF-8 { "data": { "status": "pending", - "selfEligible": true, "value": { "currency": "UAH", "amount": 500.0, @@ -47,7 +46,7 @@ Content-Type: application/json; charset=UTF-8 } ], "date": "2020-05-15T01:00:00+03:00", - "id": "dc595a39267248abbf3e85d759d6c1ab" + "id": "529f4dbc517942dc8dd3f040cd17ddc4" } } diff --git a/docs/source/tendering/competitivedialogue/tutorial/stage2/EU/active-cancellation.http b/docs/source/tendering/competitivedialogue/tutorial/stage2/EU/active-cancellation.http index 6ba1b24a7a..b11d912abd 100644 --- a/docs/source/tendering/competitivedialogue/tutorial/stage2/EU/active-cancellation.http +++ b/docs/source/tendering/competitivedialogue/tutorial/stage2/EU/active-cancellation.http @@ -1,4 +1,4 @@ -GET /api/2.5/tenders/50c82523038349969f53f3e238932c46/cancellations/3751f4fe25534d0e88b2f836338e014c?acc_token=90e5c1d7c0414b99a392234aee8cd1dc HTTP/1.0 +GET /api/2.5/tenders/50c82523038349969f53f3e238932c46/cancellations/f532a92b50f04c6eb0f8efa928f32ca2?acc_token=90e5c1d7c0414b99a392234aee8cd1dc HTTP/1.0 Authorization: Bearer broker Host: lb-api-sandbox.prozorro.gov.ua @@ -41,7 +41,7 @@ Content-Type: application/json; charset=UTF-8 "reasonType": "unFixable", "date": "2020-05-26T01:00:02+03:00", "cancellationOf": "tender", - "id": "3751f4fe25534d0e88b2f836338e014c" + "id": "f532a92b50f04c6eb0f8efa928f32ca2" } } diff --git a/docs/source/tendering/competitivedialogue/tutorial/stage2/EU/answer-question.http b/docs/source/tendering/competitivedialogue/tutorial/stage2/EU/answer-question.http index 089911f8ba..4e763be929 100644 --- a/docs/source/tendering/competitivedialogue/tutorial/stage2/EU/answer-question.http +++ b/docs/source/tendering/competitivedialogue/tutorial/stage2/EU/answer-question.http @@ -1,4 +1,4 @@ -PATCH /api/2.5/tenders/50c82523038349969f53f3e238932c46/questions/d307480a47364bc5850a03e4643ca2fd?acc_token=90e5c1d7c0414b99a392234aee8cd1dc HTTP/1.0 +PATCH /api/2.5/tenders/50c82523038349969f53f3e238932c46/questions/e928a5ef19284c6b8261f1f7c51fd561?acc_token=90e5c1d7c0414b99a392234aee8cd1dc HTTP/1.0 Authorization: Bearer broker Content-Length: 162 Content-Type: application/json @@ -19,7 +19,7 @@ Content-Type: application/json; charset=UTF-8 "title": "Калорійність", "date": "2020-05-15T01:00:00+03:00", "answer": "Таблицю додано в файлі \"Kalorijnist.xslx\"", - "id": "d307480a47364bc5850a03e4643ca2fd", + "id": "e928a5ef19284c6b8261f1f7c51fd561", "questionOf": "tender" } } diff --git a/docs/source/tendering/competitivedialogue/tutorial/stage2/EU/approve-qualification1.http b/docs/source/tendering/competitivedialogue/tutorial/stage2/EU/approve-qualification1.http index 296c7c6419..ad349ad1bc 100644 --- a/docs/source/tendering/competitivedialogue/tutorial/stage2/EU/approve-qualification1.http +++ b/docs/source/tendering/competitivedialogue/tutorial/stage2/EU/approve-qualification1.http @@ -19,7 +19,7 @@ Content-Type: application/json; charset=UTF-8 "status": "active", "eligible": true, "qualified": true, - "bidID": "dc595a39267248abbf3e85d759d6c1ab", + "bidID": "529f4dbc517942dc8dd3f040cd17ddc4", "date": "2020-05-15T01:00:00+03:00", "id": "bf3b21221bc845f5bb0ff5238b948c33" } diff --git a/docs/source/tendering/competitivedialogue/tutorial/stage2/EU/approve-qualification2.http b/docs/source/tendering/competitivedialogue/tutorial/stage2/EU/approve-qualification2.http index 5113017c1f..68ce29f60e 100644 --- a/docs/source/tendering/competitivedialogue/tutorial/stage2/EU/approve-qualification2.http +++ b/docs/source/tendering/competitivedialogue/tutorial/stage2/EU/approve-qualification2.http @@ -19,7 +19,7 @@ Content-Type: application/json; charset=UTF-8 "status": "active", "eligible": true, "qualified": true, - "bidID": "e394381791b6444989e422262ffb9c7d", + "bidID": "3d111b9b1a824d5b8162ee4da5d4f4f5", "date": "2020-05-15T01:00:00+03:00", "id": "d1dbb4fd0c354036b58e20727254e549" } diff --git a/docs/source/tendering/competitivedialogue/tutorial/stage2/EU/ask-question.http b/docs/source/tendering/competitivedialogue/tutorial/stage2/EU/ask-question.http index ac2ae99d15..8630997636 100644 --- a/docs/source/tendering/competitivedialogue/tutorial/stage2/EU/ask-question.http +++ b/docs/source/tendering/competitivedialogue/tutorial/stage2/EU/ask-question.http @@ -33,7 +33,7 @@ DATA: Response: 201 Created Content-Type: application/json; charset=UTF-8 -Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/50c82523038349969f53f3e238932c46/questions/d307480a47364bc5850a03e4643ca2fd +Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/50c82523038349969f53f3e238932c46/questions/e928a5ef19284c6b8261f1f7c51fd561 { "data": { "description": "Просимо додати таблицю потрібної калорійності харчування", @@ -59,7 +59,7 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/50c8252303834996 }, "title": "Калорійність", "date": "2020-05-15T01:00:00+03:00", - "id": "d307480a47364bc5850a03e4643ca2fd", + "id": "e928a5ef19284c6b8261f1f7c51fd561", "questionOf": "tender" } } diff --git a/docs/source/tendering/competitivedialogue/tutorial/stage2/EU/auction-url.http b/docs/source/tendering/competitivedialogue/tutorial/stage2/EU/auction-url.http index 021e688cf4..18b60a3cd5 100644 --- a/docs/source/tendering/competitivedialogue/tutorial/stage2/EU/auction-url.http +++ b/docs/source/tendering/competitivedialogue/tutorial/stage2/EU/auction-url.http @@ -16,7 +16,7 @@ Content-Type: application/json; charset=UTF-8 "enquiryPeriod": { "startDate": "2020-04-04T01:00:00+03:00", "clarificationsUntil": "2020-04-30T00:00:00+03:00", - "endDate": "2020-04-25T01:00:00+03:00", + "endDate": "2020-04-25T00:00:00+03:00", "invalidationDate": "2020-05-15T01:00:00+03:00" }, "submissionMethod": "electronicAuction", @@ -53,7 +53,7 @@ Content-Type: application/json; charset=UTF-8 "title": "Калорійність", "date": "2020-05-15T01:00:00+03:00", "answer": "Таблицю додано в файлі \"Kalorijnist.xslx\"", - "id": "d307480a47364bc5850a03e4643ca2fd", + "id": "e928a5ef19284c6b8261f1f7c51fd561", "questionOf": "tender" } ], @@ -145,7 +145,7 @@ Content-Type: application/json; charset=UTF-8 "status": "active", "eligible": true, "qualified": true, - "bidID": "dc595a39267248abbf3e85d759d6c1ab", + "bidID": "529f4dbc517942dc8dd3f040cd17ddc4", "date": "2020-05-15T01:00:00+03:00", "id": "bf3b21221bc845f5bb0ff5238b948c33" }, @@ -153,7 +153,7 @@ Content-Type: application/json; charset=UTF-8 "status": "active", "eligible": true, "qualified": true, - "bidID": "e394381791b6444989e422262ffb9c7d", + "bidID": "3d111b9b1a824d5b8162ee4da5d4f4f5", "date": "2020-05-15T01:00:00+03:00", "id": "d1dbb4fd0c354036b58e20727254e549" }, @@ -161,7 +161,7 @@ Content-Type: application/json; charset=UTF-8 "status": "unsuccessful", "eligible": false, "qualified": false, - "bidID": "0ee0193aeac246e791c6601952452387", + "bidID": "e60107f58b494544803467b4a2dc9362", "date": "2020-05-15T01:00:00+03:00", "id": "52aa76f0b6d34ec8bdcfaec20e6eaa4c" } @@ -197,9 +197,9 @@ Content-Type: application/json; charset=UTF-8 }, "deliveryDate": { "startDate": "2020-06-04T01:00:00+03:00", - "endDate": "2020-06-14T01:00:10+03:00" + "endDate": "2020-06-15T01:00:00+03:00" }, - "id": "52ba02bed7a347fa9f8119661caf0ed2", + "id": "c9279535363848ec981dbe0480847b88", "unit": { "code": "44617100-9", "name": "item" @@ -236,7 +236,7 @@ Content-Type: application/json; charset=UTF-8 "id": "ee89213792d8452b93c9ad66e68f8af9" } ], - "id": "dc595a39267248abbf3e85d759d6c1ab", + "id": "529f4dbc517942dc8dd3f040cd17ddc4", "tenderers": [ { "contactPoint": { @@ -263,7 +263,7 @@ Content-Type: application/json; charset=UTF-8 }, { "status": "active", - "id": "e394381791b6444989e422262ffb9c7d", + "id": "3d111b9b1a824d5b8162ee4da5d4f4f5", "tenderers": [ { "contactPoint": { @@ -300,7 +300,7 @@ Content-Type: application/json; charset=UTF-8 "format": "application/pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", - "id": "a38bd81182d84d43bef52d2698f89d98", + "id": "54c20d16be604b31b972dbb5adf700f7", "dateModified": "2020-05-15T01:00:00+03:00" }, { @@ -313,7 +313,7 @@ Content-Type: application/json; charset=UTF-8 "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", "dateModified": "2020-05-15T01:00:00+03:00", - "id": "f896df38ec1e41cc89e6e463e54e81e8" + "id": "63d72e684d714ba395b241868803c3d0" } ], "eligibilityDocuments": [ @@ -326,12 +326,11 @@ Content-Type: application/json; charset=UTF-8 "format": "application/pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", - "id": "5a466b5c43144a0e80632960a297cd18", + "id": "a36f5356998846b7903c4043484842b3", "dateModified": "2020-05-15T01:00:00+03:00" } ], - "selfEligible": true, - "selfQualified": true, + "id": "e60107f58b494544803467b4a2dc9362", "tenderers": [ { "contactPoint": { @@ -355,7 +354,7 @@ Content-Type: application/json; charset=UTF-8 } } ], - "id": "0ee0193aeac246e791c6601952452387" + "selfQualified": true } ], "value": { diff --git a/docs/source/tendering/competitivedialogue/tutorial/stage2/EU/bidder-activate-after-changing-tender.http b/docs/source/tendering/competitivedialogue/tutorial/stage2/EU/bidder-activate-after-changing-tender.http index fba528fdbd..bd35beca78 100644 --- a/docs/source/tendering/competitivedialogue/tutorial/stage2/EU/bidder-activate-after-changing-tender.http +++ b/docs/source/tendering/competitivedialogue/tutorial/stage2/EU/bidder-activate-after-changing-tender.http @@ -1,4 +1,4 @@ -PATCH /api/2.5/tenders/50c82523038349969f53f3e238932c46/bids/dc595a39267248abbf3e85d759d6c1ab?acc_token=4983fc47c71047729730599c7b0329ae HTTP/1.0 +PATCH /api/2.5/tenders/50c82523038349969f53f3e238932c46/bids/529f4dbc517942dc8dd3f040cd17ddc4?acc_token=4983fc47c71047729730599c7b0329ae HTTP/1.0 Authorization: Bearer broker Content-Length: 31 Content-Type: application/json @@ -21,7 +21,7 @@ Content-Type: application/json; charset=UTF-8 "confidentiality": "public", "language": "uk", "title": "Proposal.pdf", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/50c82523038349969f53f3e238932c46/bids/dc595a39267248abbf3e85d759d6c1ab/documents/fcbf9cf830724596a73d37bb33f23efc?download=a5827d34135f49799050b334263efc67", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/50c82523038349969f53f3e238932c46/bids/529f4dbc517942dc8dd3f040cd17ddc4/documents/fcbf9cf830724596a73d37bb33f23efc?download=a5827d34135f49799050b334263efc67", "format": "application/pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", @@ -33,7 +33,7 @@ Content-Type: application/json; charset=UTF-8 "confidentiality": "buyerOnly", "language": "uk", "format": "application/pdf", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/50c82523038349969f53f3e238932c46/bids/dc595a39267248abbf3e85d759d6c1ab/documents/ee89213792d8452b93c9ad66e68f8af9?download=b23e32bbc16940349bc7370b7cdb1c1a", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/50c82523038349969f53f3e238932c46/bids/529f4dbc517942dc8dd3f040cd17ddc4/documents/ee89213792d8452b93c9ad66e68f8af9?download=b23e32bbc16940349bc7370b7cdb1c1a", "confidentialityRationale": "Only our company sells badgers with pink hair.", "title": "Proposal_top_secrets.pdf", "documentOf": "tender", @@ -42,8 +42,7 @@ Content-Type: application/json; charset=UTF-8 "dateModified": "2020-05-15T01:00:00+03:00" } ], - "selfEligible": true, - "id": "dc595a39267248abbf3e85d759d6c1ab", + "id": "529f4dbc517942dc8dd3f040cd17ddc4", "value": { "currency": "UAH", "amount": 500.0, @@ -56,7 +55,7 @@ Content-Type: application/json; charset=UTF-8 "confidentiality": "public", "language": "uk", "title": "financial_doc.pdf", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/50c82523038349969f53f3e238932c46/bids/dc595a39267248abbf3e85d759d6c1ab/financial_documents/7e9bdb022cf444ceaaea927f369b6d7a?download=ce50614ba5444be68502c4e715f58cb0", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/50c82523038349969f53f3e238932c46/bids/529f4dbc517942dc8dd3f040cd17ddc4/financial_documents/7e9bdb022cf444ceaaea927f369b6d7a?download=ce50614ba5444be68502c4e715f58cb0", "format": "application/pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", @@ -68,7 +67,7 @@ Content-Type: application/json; charset=UTF-8 "confidentiality": "public", "language": "uk", "title": "financial_doc2.pdf", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/50c82523038349969f53f3e238932c46/bids/dc595a39267248abbf3e85d759d6c1ab/financial_documents/fedb3ddbd14c4708a26c11916ee4c92b?download=924e16380a9c4504b9d553d2e19429cc", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/50c82523038349969f53f3e238932c46/bids/529f4dbc517942dc8dd3f040cd17ddc4/financial_documents/fedb3ddbd14c4708a26c11916ee4c92b?download=924e16380a9c4504b9d553d2e19429cc", "format": "application/pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", @@ -107,7 +106,7 @@ Content-Type: application/json; charset=UTF-8 "confidentiality": "public", "language": "uk", "title": "qualification_document.pdf", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/50c82523038349969f53f3e238932c46/bids/dc595a39267248abbf3e85d759d6c1ab/qualification_documents/5cb9689ea24e443c91962f32c5c14862?download=dbef167764e444479481858591e64dd8", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/50c82523038349969f53f3e238932c46/bids/529f4dbc517942dc8dd3f040cd17ddc4/qualification_documents/5cb9689ea24e443c91962f32c5c14862?download=dbef167764e444479481858591e64dd8", "format": "application/pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", diff --git a/docs/source/tendering/competitivedialogue/tutorial/stage2/EU/bidder-after-changing-tender.http b/docs/source/tendering/competitivedialogue/tutorial/stage2/EU/bidder-after-changing-tender.http index 4caae1b3e4..c1cfbef817 100644 --- a/docs/source/tendering/competitivedialogue/tutorial/stage2/EU/bidder-after-changing-tender.http +++ b/docs/source/tendering/competitivedialogue/tutorial/stage2/EU/bidder-after-changing-tender.http @@ -1,4 +1,4 @@ -GET /api/2.5/tenders/50c82523038349969f53f3e238932c46/bids/dc595a39267248abbf3e85d759d6c1ab?acc_token=4983fc47c71047729730599c7b0329ae HTTP/1.0 +GET /api/2.5/tenders/50c82523038349969f53f3e238932c46/bids/529f4dbc517942dc8dd3f040cd17ddc4?acc_token=4983fc47c71047729730599c7b0329ae HTTP/1.0 Authorization: Bearer broker Host: lb-api-sandbox.prozorro.gov.ua @@ -7,7 +7,7 @@ Content-Type: application/json; charset=UTF-8 { "data": { "status": "invalid", - "id": "dc595a39267248abbf3e85d759d6c1ab" + "id": "529f4dbc517942dc8dd3f040cd17ddc4" } } diff --git a/docs/source/tendering/competitivedialogue/tutorial/stage2/EU/bidder-documents.http b/docs/source/tendering/competitivedialogue/tutorial/stage2/EU/bidder-documents.http index 45850784a9..51571c77c4 100644 --- a/docs/source/tendering/competitivedialogue/tutorial/stage2/EU/bidder-documents.http +++ b/docs/source/tendering/competitivedialogue/tutorial/stage2/EU/bidder-documents.http @@ -1,4 +1,4 @@ -GET /api/2.5/tenders/50c82523038349969f53f3e238932c46/bids/dc595a39267248abbf3e85d759d6c1ab/documents?acc_token=4983fc47c71047729730599c7b0329ae HTTP/1.0 +GET /api/2.5/tenders/50c82523038349969f53f3e238932c46/bids/529f4dbc517942dc8dd3f040cd17ddc4/documents?acc_token=4983fc47c71047729730599c7b0329ae HTTP/1.0 Authorization: Bearer broker Host: lb-api-sandbox.prozorro.gov.ua @@ -11,7 +11,7 @@ Content-Type: application/json; charset=UTF-8 "confidentiality": "public", "language": "uk", "title": "Proposal.pdf", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/50c82523038349969f53f3e238932c46/bids/dc595a39267248abbf3e85d759d6c1ab/documents/fcbf9cf830724596a73d37bb33f23efc?download=a5827d34135f49799050b334263efc67", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/50c82523038349969f53f3e238932c46/bids/529f4dbc517942dc8dd3f040cd17ddc4/documents/fcbf9cf830724596a73d37bb33f23efc?download=a5827d34135f49799050b334263efc67", "format": "application/pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", @@ -23,7 +23,7 @@ Content-Type: application/json; charset=UTF-8 "confidentiality": "buyerOnly", "language": "uk", "format": "application/pdf", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/50c82523038349969f53f3e238932c46/bids/dc595a39267248abbf3e85d759d6c1ab/documents/ee89213792d8452b93c9ad66e68f8af9?download=b23e32bbc16940349bc7370b7cdb1c1a", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/50c82523038349969f53f3e238932c46/bids/529f4dbc517942dc8dd3f040cd17ddc4/documents/ee89213792d8452b93c9ad66e68f8af9?download=b23e32bbc16940349bc7370b7cdb1c1a", "confidentialityRationale": "Only our company sells badgers with pink hair.", "title": "Proposal_top_secrets.pdf", "documentOf": "tender", diff --git a/docs/source/tendering/competitivedialogue/tutorial/stage2/EU/bidder-financial-documents.http b/docs/source/tendering/competitivedialogue/tutorial/stage2/EU/bidder-financial-documents.http index 4aba981432..bf3cac940c 100644 --- a/docs/source/tendering/competitivedialogue/tutorial/stage2/EU/bidder-financial-documents.http +++ b/docs/source/tendering/competitivedialogue/tutorial/stage2/EU/bidder-financial-documents.http @@ -1,4 +1,4 @@ -GET /api/2.5/tenders/50c82523038349969f53f3e238932c46/bids/dc595a39267248abbf3e85d759d6c1ab/financial_documents?acc_token=4983fc47c71047729730599c7b0329ae HTTP/1.0 +GET /api/2.5/tenders/50c82523038349969f53f3e238932c46/bids/529f4dbc517942dc8dd3f040cd17ddc4/financial_documents?acc_token=4983fc47c71047729730599c7b0329ae HTTP/1.0 Authorization: Bearer broker Host: lb-api-sandbox.prozorro.gov.ua @@ -11,7 +11,7 @@ Content-Type: application/json; charset=UTF-8 "confidentiality": "public", "language": "uk", "title": "financial_doc2.pdf", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/50c82523038349969f53f3e238932c46/bids/dc595a39267248abbf3e85d759d6c1ab/financial_documents/fedb3ddbd14c4708a26c11916ee4c92b?download=924e16380a9c4504b9d553d2e19429cc", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/50c82523038349969f53f3e238932c46/bids/529f4dbc517942dc8dd3f040cd17ddc4/financial_documents/fedb3ddbd14c4708a26c11916ee4c92b?download=924e16380a9c4504b9d553d2e19429cc", "format": "application/pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", @@ -23,7 +23,7 @@ Content-Type: application/json; charset=UTF-8 "confidentiality": "public", "language": "uk", "title": "financial_doc.pdf", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/50c82523038349969f53f3e238932c46/bids/dc595a39267248abbf3e85d759d6c1ab/financial_documents/7e9bdb022cf444ceaaea927f369b6d7a?download=ce50614ba5444be68502c4e715f58cb0", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/50c82523038349969f53f3e238932c46/bids/529f4dbc517942dc8dd3f040cd17ddc4/financial_documents/7e9bdb022cf444ceaaea927f369b6d7a?download=ce50614ba5444be68502c4e715f58cb0", "format": "application/pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", diff --git a/docs/source/tendering/competitivedialogue/tutorial/stage2/EU/bidder-participation-url.http b/docs/source/tendering/competitivedialogue/tutorial/stage2/EU/bidder-participation-url.http index eedc461460..018268719a 100644 --- a/docs/source/tendering/competitivedialogue/tutorial/stage2/EU/bidder-participation-url.http +++ b/docs/source/tendering/competitivedialogue/tutorial/stage2/EU/bidder-participation-url.http @@ -1,4 +1,4 @@ -GET /api/2.5/tenders/50c82523038349969f53f3e238932c46/bids/dc595a39267248abbf3e85d759d6c1ab?acc_token=4983fc47c71047729730599c7b0329ae HTTP/1.0 +GET /api/2.5/tenders/50c82523038349969f53f3e238932c46/bids/529f4dbc517942dc8dd3f040cd17ddc4?acc_token=4983fc47c71047729730599c7b0329ae HTTP/1.0 Authorization: Bearer broker Host: lb-api-sandbox.prozorro.gov.ua @@ -25,7 +25,7 @@ Content-Type: application/json; charset=UTF-8 "confidentiality": "buyerOnly", "language": "uk", "format": "application/pdf", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/50c82523038349969f53f3e238932c46/bids/dc595a39267248abbf3e85d759d6c1ab/documents/ee89213792d8452b93c9ad66e68f8af9?download=b23e32bbc16940349bc7370b7cdb1c1a", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/50c82523038349969f53f3e238932c46/bids/529f4dbc517942dc8dd3f040cd17ddc4/documents/ee89213792d8452b93c9ad66e68f8af9?download=b23e32bbc16940349bc7370b7cdb1c1a", "confidentialityRationale": "Only our company sells badgers with pink hair.", "title": "Proposal_top_secrets.pdf", "documentOf": "tender", @@ -34,8 +34,7 @@ Content-Type: application/json; charset=UTF-8 "dateModified": "2020-05-15T01:00:00+03:00" } ], - "selfEligible": true, - "id": "dc595a39267248abbf3e85d759d6c1ab", + "id": "529f4dbc517942dc8dd3f040cd17ddc4", "value": { "currency": "UAH", "amount": 500.0, @@ -48,7 +47,7 @@ Content-Type: application/json; charset=UTF-8 "confidentiality": "public", "language": "uk", "title": "financial_doc.pdf", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/50c82523038349969f53f3e238932c46/bids/dc595a39267248abbf3e85d759d6c1ab/financial_documents/7e9bdb022cf444ceaaea927f369b6d7a?download=ce50614ba5444be68502c4e715f58cb0", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/50c82523038349969f53f3e238932c46/bids/529f4dbc517942dc8dd3f040cd17ddc4/financial_documents/7e9bdb022cf444ceaaea927f369b6d7a?download=ce50614ba5444be68502c4e715f58cb0", "format": "application/pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", @@ -60,7 +59,7 @@ Content-Type: application/json; charset=UTF-8 "confidentiality": "public", "language": "uk", "title": "financial_doc2.pdf", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/50c82523038349969f53f3e238932c46/bids/dc595a39267248abbf3e85d759d6c1ab/financial_documents/fedb3ddbd14c4708a26c11916ee4c92b?download=924e16380a9c4504b9d553d2e19429cc", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/50c82523038349969f53f3e238932c46/bids/529f4dbc517942dc8dd3f040cd17ddc4/financial_documents/fedb3ddbd14c4708a26c11916ee4c92b?download=924e16380a9c4504b9d553d2e19429cc", "format": "application/pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", @@ -99,7 +98,7 @@ Content-Type: application/json; charset=UTF-8 "confidentiality": "public", "language": "uk", "title": "qualification_document.pdf", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/50c82523038349969f53f3e238932c46/bids/dc595a39267248abbf3e85d759d6c1ab/qualification_documents/5cb9689ea24e443c91962f32c5c14862?download=dbef167764e444479481858591e64dd8", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/50c82523038349969f53f3e238932c46/bids/529f4dbc517942dc8dd3f040cd17ddc4/qualification_documents/5cb9689ea24e443c91962f32c5c14862?download=dbef167764e444479481858591e64dd8", "format": "application/pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", @@ -107,7 +106,7 @@ Content-Type: application/json; charset=UTF-8 "dateModified": "2020-05-15T01:00:00+03:00" } ], - "participationUrl": "http://auction-sandbox.prozorro.gov.ua/tenders/50c82523038349969f53f3e238932c46?key_for_bid=dc595a39267248abbf3e85d759d6c1ab" + "participationUrl": "http://auction-sandbox.prozorro.gov.ua/tenders/50c82523038349969f53f3e238932c46?key_for_bid=529f4dbc517942dc8dd3f040cd17ddc4" } } diff --git a/docs/source/tendering/competitivedialogue/tutorial/stage2/EU/bidder-view-financial-documents.http b/docs/source/tendering/competitivedialogue/tutorial/stage2/EU/bidder-view-financial-documents.http index c9be116384..d56a3fa360 100644 --- a/docs/source/tendering/competitivedialogue/tutorial/stage2/EU/bidder-view-financial-documents.http +++ b/docs/source/tendering/competitivedialogue/tutorial/stage2/EU/bidder-view-financial-documents.http @@ -1,4 +1,4 @@ -GET /api/2.5/tenders/50c82523038349969f53f3e238932c46/bids/dc595a39267248abbf3e85d759d6c1ab?acc_token=4983fc47c71047729730599c7b0329ae HTTP/1.0 +GET /api/2.5/tenders/50c82523038349969f53f3e238932c46/bids/529f4dbc517942dc8dd3f040cd17ddc4?acc_token=4983fc47c71047729730599c7b0329ae HTTP/1.0 Authorization: Bearer broker Host: lb-api-sandbox.prozorro.gov.ua @@ -13,7 +13,7 @@ Content-Type: application/json; charset=UTF-8 "confidentiality": "public", "language": "uk", "title": "Proposal.pdf", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/50c82523038349969f53f3e238932c46/bids/dc595a39267248abbf3e85d759d6c1ab/documents/fcbf9cf830724596a73d37bb33f23efc?download=a5827d34135f49799050b334263efc67", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/50c82523038349969f53f3e238932c46/bids/529f4dbc517942dc8dd3f040cd17ddc4/documents/fcbf9cf830724596a73d37bb33f23efc?download=a5827d34135f49799050b334263efc67", "format": "application/pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", @@ -25,7 +25,7 @@ Content-Type: application/json; charset=UTF-8 "confidentiality": "buyerOnly", "language": "uk", "format": "application/pdf", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/50c82523038349969f53f3e238932c46/bids/dc595a39267248abbf3e85d759d6c1ab/documents/ee89213792d8452b93c9ad66e68f8af9?download=b23e32bbc16940349bc7370b7cdb1c1a", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/50c82523038349969f53f3e238932c46/bids/529f4dbc517942dc8dd3f040cd17ddc4/documents/ee89213792d8452b93c9ad66e68f8af9?download=b23e32bbc16940349bc7370b7cdb1c1a", "confidentialityRationale": "Only our company sells badgers with pink hair.", "title": "Proposal_top_secrets.pdf", "documentOf": "tender", @@ -34,8 +34,7 @@ Content-Type: application/json; charset=UTF-8 "dateModified": "2020-05-15T01:00:00+03:00" } ], - "selfEligible": true, - "id": "dc595a39267248abbf3e85d759d6c1ab", + "id": "529f4dbc517942dc8dd3f040cd17ddc4", "value": { "currency": "UAH", "amount": 500.0, @@ -48,7 +47,7 @@ Content-Type: application/json; charset=UTF-8 "confidentiality": "public", "language": "uk", "title": "financial_doc.pdf", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/50c82523038349969f53f3e238932c46/bids/dc595a39267248abbf3e85d759d6c1ab/financial_documents/7e9bdb022cf444ceaaea927f369b6d7a?download=ce50614ba5444be68502c4e715f58cb0", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/50c82523038349969f53f3e238932c46/bids/529f4dbc517942dc8dd3f040cd17ddc4/financial_documents/7e9bdb022cf444ceaaea927f369b6d7a?download=ce50614ba5444be68502c4e715f58cb0", "format": "application/pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", @@ -60,7 +59,7 @@ Content-Type: application/json; charset=UTF-8 "confidentiality": "public", "language": "uk", "title": "financial_doc2.pdf", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/50c82523038349969f53f3e238932c46/bids/dc595a39267248abbf3e85d759d6c1ab/financial_documents/fedb3ddbd14c4708a26c11916ee4c92b?download=924e16380a9c4504b9d553d2e19429cc", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/50c82523038349969f53f3e238932c46/bids/529f4dbc517942dc8dd3f040cd17ddc4/financial_documents/fedb3ddbd14c4708a26c11916ee4c92b?download=924e16380a9c4504b9d553d2e19429cc", "format": "application/pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", @@ -99,7 +98,7 @@ Content-Type: application/json; charset=UTF-8 "confidentiality": "public", "language": "uk", "title": "qualification_document.pdf", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/50c82523038349969f53f3e238932c46/bids/dc595a39267248abbf3e85d759d6c1ab/qualification_documents/5cb9689ea24e443c91962f32c5c14862?download=dbef167764e444479481858591e64dd8", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/50c82523038349969f53f3e238932c46/bids/529f4dbc517942dc8dd3f040cd17ddc4/qualification_documents/5cb9689ea24e443c91962f32c5c14862?download=dbef167764e444479481858591e64dd8", "format": "application/pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", diff --git a/docs/source/tendering/competitivedialogue/tutorial/stage2/EU/bidder2-participation-url.http b/docs/source/tendering/competitivedialogue/tutorial/stage2/EU/bidder2-participation-url.http index eae044f9b3..989cd8b934 100644 --- a/docs/source/tendering/competitivedialogue/tutorial/stage2/EU/bidder2-participation-url.http +++ b/docs/source/tendering/competitivedialogue/tutorial/stage2/EU/bidder2-participation-url.http @@ -1,4 +1,4 @@ -GET /api/2.5/tenders/50c82523038349969f53f3e238932c46/bids/e394381791b6444989e422262ffb9c7d?acc_token=de2d86e647f74a1981622cabe57f792b HTTP/1.0 +GET /api/2.5/tenders/50c82523038349969f53f3e238932c46/bids/3d111b9b1a824d5b8162ee4da5d4f4f5?acc_token=de2d86e647f74a1981622cabe57f792b HTTP/1.0 Authorization: Bearer broker Host: lb-api-sandbox.prozorro.gov.ua @@ -7,13 +7,12 @@ Content-Type: application/json; charset=UTF-8 { "data": { "status": "active", - "selfEligible": true, "value": { "currency": "UAH", "amount": 499.0, "valueAddedTaxIncluded": true }, - "selfQualified": true, + "id": "3d111b9b1a824d5b8162ee4da5d4f4f5", "tenderers": [ { "contactPoint": { @@ -38,8 +37,8 @@ Content-Type: application/json; charset=UTF-8 } ], "date": "2020-05-15T01:00:00+03:00", - "id": "e394381791b6444989e422262ffb9c7d", - "participationUrl": "http://auction-sandbox.prozorro.gov.ua/tenders/50c82523038349969f53f3e238932c46?key_for_bid=e394381791b6444989e422262ffb9c7d" + "selfQualified": true, + "participationUrl": "http://auction-sandbox.prozorro.gov.ua/tenders/50c82523038349969f53f3e238932c46?key_for_bid=3d111b9b1a824d5b8162ee4da5d4f4f5" } } diff --git a/docs/source/tendering/competitivedialogue/tutorial/stage2/EU/confirm-qualification.http b/docs/source/tendering/competitivedialogue/tutorial/stage2/EU/confirm-qualification.http index 813f9a6585..2420c1a386 100644 --- a/docs/source/tendering/competitivedialogue/tutorial/stage2/EU/confirm-qualification.http +++ b/docs/source/tendering/competitivedialogue/tutorial/stage2/EU/confirm-qualification.http @@ -45,7 +45,7 @@ Content-Type: application/json; charset=UTF-8 "startDate": "2020-05-15T01:00:00+03:00", "endDate": "2020-05-26T00:00:00+03:00" }, - "bid_id": "e394381791b6444989e422262ffb9c7d", + "bid_id": "3d111b9b1a824d5b8162ee4da5d4f4f5", "value": { "currency": "UAH", "amount": 499.0, diff --git a/docs/source/tendering/competitivedialogue/tutorial/stage2/EU/get-answer.http b/docs/source/tendering/competitivedialogue/tutorial/stage2/EU/get-answer.http index 512fe38957..2e7f0cc847 100644 --- a/docs/source/tendering/competitivedialogue/tutorial/stage2/EU/get-answer.http +++ b/docs/source/tendering/competitivedialogue/tutorial/stage2/EU/get-answer.http @@ -1,4 +1,4 @@ -GET /api/2.5/tenders/50c82523038349969f53f3e238932c46/questions/d307480a47364bc5850a03e4643ca2fd HTTP/1.0 +GET /api/2.5/tenders/50c82523038349969f53f3e238932c46/questions/e928a5ef19284c6b8261f1f7c51fd561 HTTP/1.0 Authorization: Bearer broker Host: lb-api-sandbox.prozorro.gov.ua @@ -11,7 +11,7 @@ Content-Type: application/json; charset=UTF-8 "title": "Калорійність", "date": "2020-05-15T01:00:00+03:00", "answer": "Таблицю додано в файлі \"Kalorijnist.xslx\"", - "id": "d307480a47364bc5850a03e4643ca2fd", + "id": "e928a5ef19284c6b8261f1f7c51fd561", "questionOf": "tender" } } diff --git a/docs/source/tendering/competitivedialogue/tutorial/stage2/EU/list-question.http b/docs/source/tendering/competitivedialogue/tutorial/stage2/EU/list-question.http index ba02c5657d..73b80af8c9 100644 --- a/docs/source/tendering/competitivedialogue/tutorial/stage2/EU/list-question.http +++ b/docs/source/tendering/competitivedialogue/tutorial/stage2/EU/list-question.http @@ -12,7 +12,7 @@ Content-Type: application/json; charset=UTF-8 "title": "Калорійність", "date": "2020-05-15T01:00:00+03:00", "answer": "Таблицю додано в файлі \"Kalorijnist.xslx\"", - "id": "d307480a47364bc5850a03e4643ca2fd", + "id": "e928a5ef19284c6b8261f1f7c51fd561", "questionOf": "tender" } ] diff --git a/docs/source/tendering/competitivedialogue/tutorial/stage2/EU/mark-bid-doc-private.http b/docs/source/tendering/competitivedialogue/tutorial/stage2/EU/mark-bid-doc-private.http index 1612e18074..b5db72e1f6 100644 --- a/docs/source/tendering/competitivedialogue/tutorial/stage2/EU/mark-bid-doc-private.http +++ b/docs/source/tendering/competitivedialogue/tutorial/stage2/EU/mark-bid-doc-private.http @@ -1,4 +1,4 @@ -PATCH /api/2.5/tenders/50c82523038349969f53f3e238932c46/bids/dc595a39267248abbf3e85d759d6c1ab/documents/ee89213792d8452b93c9ad66e68f8af9?acc_token=4983fc47c71047729730599c7b0329ae HTTP/1.0 +PATCH /api/2.5/tenders/50c82523038349969f53f3e238932c46/bids/529f4dbc517942dc8dd3f040cd17ddc4/documents/ee89213792d8452b93c9ad66e68f8af9?acc_token=4983fc47c71047729730599c7b0329ae HTTP/1.0 Authorization: Bearer broker Content-Length: 120 Content-Type: application/json @@ -19,7 +19,7 @@ Content-Type: application/json; charset=UTF-8 "confidentiality": "buyerOnly", "language": "uk", "format": "application/pdf", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/50c82523038349969f53f3e238932c46/bids/dc595a39267248abbf3e85d759d6c1ab/documents/ee89213792d8452b93c9ad66e68f8af9?download=b23e32bbc16940349bc7370b7cdb1c1a", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/50c82523038349969f53f3e238932c46/bids/529f4dbc517942dc8dd3f040cd17ddc4/documents/ee89213792d8452b93c9ad66e68f8af9?download=b23e32bbc16940349bc7370b7cdb1c1a", "confidentialityRationale": "Only our company sells badgers with pink hair.", "title": "Proposal_top_secrets.pdf", "documentOf": "tender", diff --git a/docs/source/tendering/competitivedialogue/tutorial/stage2/EU/patch-cancellation.http b/docs/source/tendering/competitivedialogue/tutorial/stage2/EU/patch-cancellation.http index de49ae14f0..b89dafe633 100644 --- a/docs/source/tendering/competitivedialogue/tutorial/stage2/EU/patch-cancellation.http +++ b/docs/source/tendering/competitivedialogue/tutorial/stage2/EU/patch-cancellation.http @@ -1,4 +1,4 @@ -PATCH /api/2.5/tenders/50c82523038349969f53f3e238932c46/cancellations/3751f4fe25534d0e88b2f836338e014c/documents/4da4669b202e4d2a99386ef3218c9586?acc_token=90e5c1d7c0414b99a392234aee8cd1dc HTTP/1.0 +PATCH /api/2.5/tenders/50c82523038349969f53f3e238932c46/cancellations/f532a92b50f04c6eb0f8efa928f32ca2/documents/4da4669b202e4d2a99386ef3218c9586?acc_token=90e5c1d7c0414b99a392234aee8cd1dc HTTP/1.0 Authorization: Bearer broker Content-Length: 48 Content-Type: application/json diff --git a/docs/source/tendering/competitivedialogue/tutorial/stage2/EU/patch-tender-periods.http b/docs/source/tendering/competitivedialogue/tutorial/stage2/EU/patch-tender-periods.http index 5fa96f898b..3a995d4891 100644 --- a/docs/source/tendering/competitivedialogue/tutorial/stage2/EU/patch-tender-periods.http +++ b/docs/source/tendering/competitivedialogue/tutorial/stage2/EU/patch-tender-periods.http @@ -7,7 +7,7 @@ DATA: { "data": { "tenderPeriod": { - "endDate": "2020-06-14T01:00:10+03:00" + "endDate": "2020-06-15T01:00:00+03:00" } } } @@ -21,7 +21,7 @@ Content-Type: application/json; charset=UTF-8 "awardCriteria": "lowestCost", "tenderPeriod": { "startDate": "2020-05-15T01:00:00+03:00", - "endDate": "2020-06-14T01:00:10+03:00" + "endDate": "2020-06-15T01:00:00+03:00" }, "title": "Послуги шкільних їдалень", "minimalStep": { @@ -32,11 +32,11 @@ Content-Type: application/json; charset=UTF-8 "enquiryPeriod": { "startDate": "2020-05-15T01:00:00+03:00", "clarificationsUntil": "2020-06-11T00:00:00+03:00", - "endDate": "2020-06-04T01:00:10+03:00" + "endDate": "2020-06-05T00:00:00+03:00" }, "complaintPeriod": { "startDate": "2020-05-15T01:00:00+03:00", - "endDate": "2020-06-10T00:00:00+03:00" + "endDate": "2020-06-11T00:00:00+03:00" }, "title_en": "Services in school canteens", "value": { @@ -125,7 +125,7 @@ Content-Type: application/json; charset=UTF-8 "startDate": "2020-06-04T00:00:00+02:00", "endDate": "2020-07-04T00:00:00+02:00" }, - "id": "52ba02bed7a347fa9f8119661caf0ed2", + "id": "c9279535363848ec981dbe0480847b88", "unit": { "code": "44617100-9", "name": "item" @@ -158,7 +158,7 @@ Content-Type: application/json; charset=UTF-8 "startDate": "2020-06-04T00:00:00+02:00", "endDate": "2020-07-04T00:00:00+02:00" }, - "id": "50f37ac382a444ecbc996d07df1e15ed", + "id": "822b768f5a104187ad91523b930af57d", "unit": { "code": "44617100-9", "name": "item" diff --git a/docs/source/tendering/competitivedialogue/tutorial/stage2/EU/pre-qualification-confirmation.http b/docs/source/tendering/competitivedialogue/tutorial/stage2/EU/pre-qualification-confirmation.http index 9671df19ac..aa20cf19fc 100644 --- a/docs/source/tendering/competitivedialogue/tutorial/stage2/EU/pre-qualification-confirmation.http +++ b/docs/source/tendering/competitivedialogue/tutorial/stage2/EU/pre-qualification-confirmation.http @@ -22,8 +22,8 @@ Content-Type: application/json; charset=UTF-8 }, "enquiryPeriod": { "startDate": "2020-04-14T01:00:00+03:00", - "clarificationsUntil": "2020-05-09T00:00:00+03:00", - "endDate": "2020-05-05T01:00:00+03:00", + "clarificationsUntil": "2020-05-08T00:00:00+03:00", + "endDate": "2020-05-05T00:00:00+03:00", "invalidationDate": "2020-05-15T01:00:00+03:00" }, "submissionMethod": "electronicAuction", @@ -60,7 +60,7 @@ Content-Type: application/json; charset=UTF-8 "title": "Калорійність", "date": "2020-05-15T01:00:00+03:00", "answer": "Таблицю додано в файлі \"Kalorijnist.xslx\"", - "id": "d307480a47364bc5850a03e4643ca2fd", + "id": "e928a5ef19284c6b8261f1f7c51fd561", "questionOf": "tender" } ], @@ -108,7 +108,7 @@ Content-Type: application/json; charset=UTF-8 "title": "Послуги шкільних їдалень", "qualificationPeriod": { "startDate": "2020-05-15T01:00:00+03:00", - "endDate": "2020-05-20T01:00:00+03:00" + "endDate": "2020-05-21T00:00:00+03:00" }, "shortlistedFirms": [ { @@ -151,7 +151,7 @@ Content-Type: application/json; charset=UTF-8 "status": "active", "eligible": true, "qualified": true, - "bidID": "dc595a39267248abbf3e85d759d6c1ab", + "bidID": "529f4dbc517942dc8dd3f040cd17ddc4", "date": "2020-05-15T01:00:00+03:00", "id": "bf3b21221bc845f5bb0ff5238b948c33" }, @@ -159,7 +159,7 @@ Content-Type: application/json; charset=UTF-8 "status": "active", "eligible": true, "qualified": true, - "bidID": "e394381791b6444989e422262ffb9c7d", + "bidID": "3d111b9b1a824d5b8162ee4da5d4f4f5", "date": "2020-05-15T01:00:00+03:00", "id": "d1dbb4fd0c354036b58e20727254e549" }, @@ -167,7 +167,7 @@ Content-Type: application/json; charset=UTF-8 "status": "unsuccessful", "eligible": false, "qualified": false, - "bidID": "0ee0193aeac246e791c6601952452387", + "bidID": "e60107f58b494544803467b4a2dc9362", "date": "2020-05-15T01:00:00+03:00", "id": "52aa76f0b6d34ec8bdcfaec20e6eaa4c" } @@ -203,9 +203,9 @@ Content-Type: application/json; charset=UTF-8 }, "deliveryDate": { "startDate": "2020-06-04T01:00:00+03:00", - "endDate": "2020-06-14T01:00:10+03:00" + "endDate": "2020-06-15T01:00:00+03:00" }, - "id": "52ba02bed7a347fa9f8119661caf0ed2", + "id": "c9279535363848ec981dbe0480847b88", "unit": { "code": "44617100-9", "name": "item" @@ -234,7 +234,7 @@ Content-Type: application/json; charset=UTF-8 "confidentiality": "buyerOnly", "language": "uk", "format": "application/pdf", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/50c82523038349969f53f3e238932c46/bids/dc595a39267248abbf3e85d759d6c1ab/documents/ee89213792d8452b93c9ad66e68f8af9?download=b23e32bbc16940349bc7370b7cdb1c1a", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/50c82523038349969f53f3e238932c46/bids/529f4dbc517942dc8dd3f040cd17ddc4/documents/ee89213792d8452b93c9ad66e68f8af9?download=b23e32bbc16940349bc7370b7cdb1c1a", "confidentialityRationale": "Only our company sells badgers with pink hair.", "title": "Proposal_top_secrets.pdf", "documentOf": "tender", @@ -243,7 +243,7 @@ Content-Type: application/json; charset=UTF-8 "dateModified": "2020-05-15T01:00:00+03:00" } ], - "id": "dc595a39267248abbf3e85d759d6c1ab", + "id": "529f4dbc517942dc8dd3f040cd17ddc4", "tenderers": [ { "contactPoint": { @@ -270,7 +270,7 @@ Content-Type: application/json; charset=UTF-8 }, { "status": "active", - "id": "e394381791b6444989e422262ffb9c7d", + "id": "3d111b9b1a824d5b8162ee4da5d4f4f5", "tenderers": [ { "contactPoint": { @@ -307,7 +307,7 @@ Content-Type: application/json; charset=UTF-8 "format": "application/pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", - "id": "a38bd81182d84d43bef52d2698f89d98", + "id": "54c20d16be604b31b972dbb5adf700f7", "dateModified": "2020-05-15T01:00:00+03:00" }, { @@ -315,12 +315,12 @@ Content-Type: application/json; charset=UTF-8 "confidentiality": "buyerOnly", "language": "uk", "format": "application/pdf", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/50c82523038349969f53f3e238932c46/bids/0ee0193aeac246e791c6601952452387/documents/f896df38ec1e41cc89e6e463e54e81e8?download=924d1313531d40a6b8e6b83f0ec24b05", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/50c82523038349969f53f3e238932c46/bids/e60107f58b494544803467b4a2dc9362/documents/63d72e684d714ba395b241868803c3d0?download=924d1313531d40a6b8e6b83f0ec24b05", "confidentialityRationale": "Only our company sells badgers with pink hair.", "title": "Proposal_part2.pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", - "id": "f896df38ec1e41cc89e6e463e54e81e8", + "id": "63d72e684d714ba395b241868803c3d0", "dateModified": "2020-05-15T01:00:00+03:00" } ], @@ -334,12 +334,11 @@ Content-Type: application/json; charset=UTF-8 "format": "application/pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", - "id": "5a466b5c43144a0e80632960a297cd18", + "id": "a36f5356998846b7903c4043484842b3", "dateModified": "2020-05-15T01:00:00+03:00" } ], - "selfEligible": true, - "selfQualified": true, + "id": "e60107f58b494544803467b4a2dc9362", "tenderers": [ { "contactPoint": { @@ -363,7 +362,7 @@ Content-Type: application/json; charset=UTF-8 } } ], - "id": "0ee0193aeac246e791c6601952452387" + "selfQualified": true } ], "value": { @@ -371,7 +370,7 @@ Content-Type: application/json; charset=UTF-8 "amount": 500.0, "valueAddedTaxIncluded": true }, - "next_check": "2020-05-20T01:00:00+03:00", + "next_check": "2020-05-21T00:00:00+03:00", "awardCriteria": "lowestCost" } } diff --git a/docs/source/tendering/competitivedialogue/tutorial/stage2/EU/prepare-cancellation.http b/docs/source/tendering/competitivedialogue/tutorial/stage2/EU/prepare-cancellation.http index 570c089163..8eacc0b3ab 100644 --- a/docs/source/tendering/competitivedialogue/tutorial/stage2/EU/prepare-cancellation.http +++ b/docs/source/tendering/competitivedialogue/tutorial/stage2/EU/prepare-cancellation.http @@ -13,7 +13,7 @@ DATA: Response: 201 Created Content-Type: application/json; charset=UTF-8 -Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/50c82523038349969f53f3e238932c46/cancellations/3751f4fe25534d0e88b2f836338e014c +Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/50c82523038349969f53f3e238932c46/cancellations/f532a92b50f04c6eb0f8efa928f32ca2 { "data": { "status": "draft", @@ -21,7 +21,7 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/50c8252303834996 "reasonType": "noDemand", "date": "2020-05-15T01:00:01+03:00", "cancellationOf": "tender", - "id": "3751f4fe25534d0e88b2f836338e014c" + "id": "f532a92b50f04c6eb0f8efa928f32ca2" } } diff --git a/docs/source/tendering/competitivedialogue/tutorial/stage2/EU/qualificated-bids-view.http b/docs/source/tendering/competitivedialogue/tutorial/stage2/EU/qualificated-bids-view.http index 77214c6bfe..6a51d775c8 100644 --- a/docs/source/tendering/competitivedialogue/tutorial/stage2/EU/qualificated-bids-view.http +++ b/docs/source/tendering/competitivedialogue/tutorial/stage2/EU/qualificated-bids-view.http @@ -26,7 +26,7 @@ Content-Type: application/json; charset=UTF-8 "confidentiality": "buyerOnly", "language": "uk", "format": "application/pdf", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/50c82523038349969f53f3e238932c46/bids/dc595a39267248abbf3e85d759d6c1ab/documents/ee89213792d8452b93c9ad66e68f8af9?download=b23e32bbc16940349bc7370b7cdb1c1a", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/50c82523038349969f53f3e238932c46/bids/529f4dbc517942dc8dd3f040cd17ddc4/documents/ee89213792d8452b93c9ad66e68f8af9?download=b23e32bbc16940349bc7370b7cdb1c1a", "confidentialityRationale": "Only our company sells badgers with pink hair.", "title": "Proposal_top_secrets.pdf", "documentOf": "tender", @@ -35,7 +35,7 @@ Content-Type: application/json; charset=UTF-8 "dateModified": "2020-05-15T01:00:00+03:00" } ], - "id": "dc595a39267248abbf3e85d759d6c1ab", + "id": "529f4dbc517942dc8dd3f040cd17ddc4", "tenderers": [ { "contactPoint": { @@ -62,7 +62,7 @@ Content-Type: application/json; charset=UTF-8 }, { "status": "active", - "id": "e394381791b6444989e422262ffb9c7d", + "id": "3d111b9b1a824d5b8162ee4da5d4f4f5", "tenderers": [ { "contactPoint": { @@ -99,7 +99,7 @@ Content-Type: application/json; charset=UTF-8 "format": "application/pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", - "id": "a38bd81182d84d43bef52d2698f89d98", + "id": "54c20d16be604b31b972dbb5adf700f7", "dateModified": "2020-05-15T01:00:00+03:00" }, { @@ -107,12 +107,12 @@ Content-Type: application/json; charset=UTF-8 "confidentiality": "buyerOnly", "language": "uk", "format": "application/pdf", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/50c82523038349969f53f3e238932c46/bids/0ee0193aeac246e791c6601952452387/documents/f896df38ec1e41cc89e6e463e54e81e8?download=924d1313531d40a6b8e6b83f0ec24b05", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/50c82523038349969f53f3e238932c46/bids/e60107f58b494544803467b4a2dc9362/documents/63d72e684d714ba395b241868803c3d0?download=924d1313531d40a6b8e6b83f0ec24b05", "confidentialityRationale": "Only our company sells badgers with pink hair.", "title": "Proposal_part2.pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", - "id": "f896df38ec1e41cc89e6e463e54e81e8", + "id": "63d72e684d714ba395b241868803c3d0", "dateModified": "2020-05-15T01:00:00+03:00" } ], @@ -126,12 +126,11 @@ Content-Type: application/json; charset=UTF-8 "format": "application/pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", - "id": "5a466b5c43144a0e80632960a297cd18", + "id": "a36f5356998846b7903c4043484842b3", "dateModified": "2020-05-15T01:00:00+03:00" } ], - "selfEligible": true, - "selfQualified": true, + "id": "e60107f58b494544803467b4a2dc9362", "tenderers": [ { "contactPoint": { @@ -155,7 +154,7 @@ Content-Type: application/json; charset=UTF-8 } } ], - "id": "0ee0193aeac246e791c6601952452387" + "selfQualified": true } ] } diff --git a/docs/source/tendering/competitivedialogue/tutorial/stage2/EU/qualifications-listing.http b/docs/source/tendering/competitivedialogue/tutorial/stage2/EU/qualifications-listing.http index 7a40085ae1..92aa115674 100644 --- a/docs/source/tendering/competitivedialogue/tutorial/stage2/EU/qualifications-listing.http +++ b/docs/source/tendering/competitivedialogue/tutorial/stage2/EU/qualifications-listing.http @@ -14,8 +14,8 @@ Content-Type: application/json; charset=UTF-8 }, "enquiryPeriod": { "startDate": "2020-04-14T01:00:00+03:00", - "clarificationsUntil": "2020-05-09T00:00:00+03:00", - "endDate": "2020-05-05T01:00:00+03:00", + "clarificationsUntil": "2020-05-08T00:00:00+03:00", + "endDate": "2020-05-05T00:00:00+03:00", "invalidationDate": "2020-05-15T01:00:00+03:00" }, "submissionMethod": "electronicAuction", @@ -51,7 +51,7 @@ Content-Type: application/json; charset=UTF-8 "title": "Калорійність", "date": "2020-05-15T01:00:00+03:00", "answer": "Таблицю додано в файлі \"Kalorijnist.xslx\"", - "id": "d307480a47364bc5850a03e4643ca2fd", + "id": "e928a5ef19284c6b8261f1f7c51fd561", "questionOf": "tender" } ], @@ -138,7 +138,7 @@ Content-Type: application/json; charset=UTF-8 "status": "pending", "eligible": false, "qualified": false, - "bidID": "dc595a39267248abbf3e85d759d6c1ab", + "bidID": "529f4dbc517942dc8dd3f040cd17ddc4", "date": "2020-05-15T01:00:00+03:00", "id": "bf3b21221bc845f5bb0ff5238b948c33" }, @@ -146,7 +146,7 @@ Content-Type: application/json; charset=UTF-8 "status": "pending", "eligible": false, "qualified": false, - "bidID": "e394381791b6444989e422262ffb9c7d", + "bidID": "3d111b9b1a824d5b8162ee4da5d4f4f5", "date": "2020-05-15T01:00:00+03:00", "id": "d1dbb4fd0c354036b58e20727254e549" }, @@ -154,7 +154,7 @@ Content-Type: application/json; charset=UTF-8 "status": "pending", "eligible": false, "qualified": false, - "bidID": "0ee0193aeac246e791c6601952452387", + "bidID": "e60107f58b494544803467b4a2dc9362", "date": "2020-05-15T01:00:00+03:00", "id": "52aa76f0b6d34ec8bdcfaec20e6eaa4c" } @@ -191,9 +191,9 @@ Content-Type: application/json; charset=UTF-8 }, "deliveryDate": { "startDate": "2020-06-04T01:00:00+03:00", - "endDate": "2020-06-14T01:00:10+03:00" + "endDate": "2020-06-15T01:00:00+03:00" }, - "id": "52ba02bed7a347fa9f8119661caf0ed2", + "id": "c9279535363848ec981dbe0480847b88", "unit": { "code": "44617100-9", "name": "item" @@ -230,7 +230,7 @@ Content-Type: application/json; charset=UTF-8 "id": "ee89213792d8452b93c9ad66e68f8af9" } ], - "id": "dc595a39267248abbf3e85d759d6c1ab", + "id": "529f4dbc517942dc8dd3f040cd17ddc4", "tenderers": [ { "contactPoint": { @@ -257,7 +257,7 @@ Content-Type: application/json; charset=UTF-8 }, { "status": "pending", - "id": "e394381791b6444989e422262ffb9c7d", + "id": "3d111b9b1a824d5b8162ee4da5d4f4f5", "tenderers": [ { "contactPoint": { @@ -294,7 +294,7 @@ Content-Type: application/json; charset=UTF-8 "format": "application/pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", - "id": "a38bd81182d84d43bef52d2698f89d98", + "id": "54c20d16be604b31b972dbb5adf700f7", "dateModified": "2020-05-15T01:00:00+03:00" }, { @@ -307,7 +307,7 @@ Content-Type: application/json; charset=UTF-8 "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", "dateModified": "2020-05-15T01:00:00+03:00", - "id": "f896df38ec1e41cc89e6e463e54e81e8" + "id": "63d72e684d714ba395b241868803c3d0" } ], "tenderers": [ @@ -333,7 +333,7 @@ Content-Type: application/json; charset=UTF-8 } } ], - "id": "0ee0193aeac246e791c6601952452387", + "id": "e60107f58b494544803467b4a2dc9362", "eligibilityDocuments": [ { "hash": "md5:00000000000000000000000000000000", @@ -344,7 +344,7 @@ Content-Type: application/json; charset=UTF-8 "format": "application/pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", - "id": "5a466b5c43144a0e80632960a297cd18", + "id": "a36f5356998846b7903c4043484842b3", "dateModified": "2020-05-15T01:00:00+03:00" } ] diff --git a/docs/source/tendering/competitivedialogue/tutorial/stage2/EU/register-2nd-bidder.http b/docs/source/tendering/competitivedialogue/tutorial/stage2/EU/register-2nd-bidder.http index 0a9c111a3e..1364b28ce1 100644 --- a/docs/source/tendering/competitivedialogue/tutorial/stage2/EU/register-2nd-bidder.http +++ b/docs/source/tendering/competitivedialogue/tutorial/stage2/EU/register-2nd-bidder.http @@ -1,12 +1,11 @@ POST /api/2.5/tenders/50c82523038349969f53f3e238932c46/bids HTTP/1.0 Authorization: Bearer broker -Content-Length: 824 +Content-Length: 802 Content-Type: application/json Host: lb-api-sandbox.prozorro.gov.ua DATA: { "data": { - "selfEligible": true, "selfQualified": true, "value": { "amount": 499 @@ -39,7 +38,7 @@ DATA: Response: 201 Created Content-Type: application/json; charset=UTF-8 -Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/50c82523038349969f53f3e238932c46/bids/e394381791b6444989e422262ffb9c7d +Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/50c82523038349969f53f3e238932c46/bids/3d111b9b1a824d5b8162ee4da5d4f4f5 { "access": { "transfer": "2421a944d51647b9821e47ed4e107ddd", @@ -47,13 +46,12 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/50c8252303834996 }, "data": { "status": "pending", - "selfEligible": true, "value": { "currency": "UAH", "amount": 499.0, "valueAddedTaxIncluded": true }, - "selfQualified": true, + "id": "3d111b9b1a824d5b8162ee4da5d4f4f5", "tenderers": [ { "contactPoint": { @@ -78,7 +76,7 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/50c8252303834996 } ], "date": "2020-05-15T01:00:00+03:00", - "id": "e394381791b6444989e422262ffb9c7d" + "selfQualified": true } } diff --git a/docs/source/tendering/competitivedialogue/tutorial/stage2/EU/register-3rd-bidder.http b/docs/source/tendering/competitivedialogue/tutorial/stage2/EU/register-3rd-bidder.http index ceede9a6a7..941d0246a8 100644 --- a/docs/source/tendering/competitivedialogue/tutorial/stage2/EU/register-3rd-bidder.http +++ b/docs/source/tendering/competitivedialogue/tutorial/stage2/EU/register-3rd-bidder.http @@ -1,6 +1,6 @@ POST /api/2.5/tenders/50c82523038349969f53f3e238932c46/bids HTTP/1.0 Authorization: Bearer broker -Content-Length: 2673 +Content-Length: 2651 Content-Type: application/json Host: lb-api-sandbox.prozorro.gov.ua DATA: @@ -30,7 +30,6 @@ DATA: "format": "application/pdf" } ], - "selfEligible": true, "value": { "amount": 5 }, @@ -79,7 +78,7 @@ DATA: Response: 201 Created Content-Type: application/json; charset=UTF-8 -Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/50c82523038349969f53f3e238932c46/bids/0ee0193aeac246e791c6601952452387 +Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/50c82523038349969f53f3e238932c46/bids/e60107f58b494544803467b4a2dc9362 { "access": { "transfer": "7ab7ce9f09694dfdbf82a47df9122e0e", @@ -93,11 +92,11 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/50c8252303834996 "confidentiality": "public", "language": "uk", "title": "Proposal_part1.pdf", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/50c82523038349969f53f3e238932c46/bids/0ee0193aeac246e791c6601952452387/documents/a38bd81182d84d43bef52d2698f89d98?download=f9c5aeb5ae15458ea9076b15b028e187", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/50c82523038349969f53f3e238932c46/bids/e60107f58b494544803467b4a2dc9362/documents/54c20d16be604b31b972dbb5adf700f7?download=f9c5aeb5ae15458ea9076b15b028e187", "format": "application/pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", - "id": "a38bd81182d84d43bef52d2698f89d98", + "id": "54c20d16be604b31b972dbb5adf700f7", "dateModified": "2020-05-15T01:00:00+03:00" }, { @@ -110,7 +109,7 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/50c8252303834996 "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", "dateModified": "2020-05-15T01:00:00+03:00", - "id": "f896df38ec1e41cc89e6e463e54e81e8" + "id": "63d72e684d714ba395b241868803c3d0" } ], "eligibilityDocuments": [ @@ -119,33 +118,45 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/50c8252303834996 "confidentiality": "public", "language": "uk", "title": "eligibility_doc.pdf", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/50c82523038349969f53f3e238932c46/bids/0ee0193aeac246e791c6601952452387/eligibility_documents/5a466b5c43144a0e80632960a297cd18?download=5721f90fa3184d109b317342fc4daac2", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/50c82523038349969f53f3e238932c46/bids/e60107f58b494544803467b4a2dc9362/eligibility_documents/a36f5356998846b7903c4043484842b3?download=5721f90fa3184d109b317342fc4daac2", "format": "application/pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", - "id": "5a466b5c43144a0e80632960a297cd18", + "id": "a36f5356998846b7903c4043484842b3", "dateModified": "2020-05-15T01:00:00+03:00" } ], - "selfEligible": true, - "id": "0ee0193aeac246e791c6601952452387", + "id": "e60107f58b494544803467b4a2dc9362", "value": { "currency": "UAH", "amount": 5.0, "valueAddedTaxIncluded": true }, - "selfQualified": true, + "qualificationDocuments": [ + { + "hash": "md5:00000000000000000000000000000000", + "confidentiality": "public", + "language": "uk", + "title": "qualification_document.pdf", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/50c82523038349969f53f3e238932c46/bids/e60107f58b494544803467b4a2dc9362/qualification_documents/336739e9542b45d1a52d1e90e1aad4a9?download=cde0cdb5e4fc4ce6a944169797c08132", + "format": "application/pdf", + "documentOf": "tender", + "datePublished": "2020-05-15T01:00:00+03:00", + "id": "336739e9542b45d1a52d1e90e1aad4a9", + "dateModified": "2020-05-15T01:00:00+03:00" + } + ], "financialDocuments": [ { "hash": "md5:00000000000000000000000000000000", "confidentiality": "public", "language": "uk", "title": "financial_doc.pdf", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/50c82523038349969f53f3e238932c46/bids/0ee0193aeac246e791c6601952452387/financial_documents/def75f418a554f5c973caf58aba7a8ce?download=508df1e3e9fa44d59bfab6ef28cc2b14", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/50c82523038349969f53f3e238932c46/bids/e60107f58b494544803467b4a2dc9362/financial_documents/8f6c71b4f98d468f8129e223917db84c?download=508df1e3e9fa44d59bfab6ef28cc2b14", "format": "application/pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", - "id": "def75f418a554f5c973caf58aba7a8ce", + "id": "8f6c71b4f98d468f8129e223917db84c", "dateModified": "2020-05-15T01:00:00+03:00" } ], @@ -173,20 +184,7 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/50c8252303834996 } ], "date": "2020-05-15T01:00:00+03:00", - "qualificationDocuments": [ - { - "hash": "md5:00000000000000000000000000000000", - "confidentiality": "public", - "language": "uk", - "title": "qualification_document.pdf", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/50c82523038349969f53f3e238932c46/bids/0ee0193aeac246e791c6601952452387/qualification_documents/328a71c371a54914898f0935a61c5c9d?download=cde0cdb5e4fc4ce6a944169797c08132", - "format": "application/pdf", - "documentOf": "tender", - "datePublished": "2020-05-15T01:00:00+03:00", - "id": "328a71c371a54914898f0935a61c5c9d", - "dateModified": "2020-05-15T01:00:00+03:00" - } - ] + "selfQualified": true } } diff --git a/docs/source/tendering/competitivedialogue/tutorial/stage2/EU/register-bidder.http b/docs/source/tendering/competitivedialogue/tutorial/stage2/EU/register-bidder.http index 5ef757dd4f..6a20c8e503 100644 --- a/docs/source/tendering/competitivedialogue/tutorial/stage2/EU/register-bidder.http +++ b/docs/source/tendering/competitivedialogue/tutorial/stage2/EU/register-bidder.http @@ -1,17 +1,12 @@ POST /api/2.5/tenders/50c82523038349969f53f3e238932c46/bids HTTP/1.0 Authorization: Bearer broker -Content-Length: 1001 +Content-Length: 979 Content-Type: application/json Host: lb-api-sandbox.prozorro.gov.ua DATA: { "data": { "status": "draft", - "selfEligible": true, - "value": { - "amount": 500 - }, - "subcontractingDetails": "ДКП «Орфей», Україна", "tenderers": [ { "contactPoint": { @@ -35,13 +30,17 @@ DATA: } } ], - "selfQualified": true + "selfQualified": true, + "value": { + "amount": 500 + }, + "subcontractingDetails": "ДКП «Орфей», Україна" } } Response: 201 Created Content-Type: application/json; charset=UTF-8 -Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/50c82523038349969f53f3e238932c46/bids/dc595a39267248abbf3e85d759d6c1ab +Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/50c82523038349969f53f3e238932c46/bids/529f4dbc517942dc8dd3f040cd17ddc4 { "access": { "transfer": "e9a41687b7454052ab9746da0e0a3540", @@ -49,7 +48,6 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/50c8252303834996 }, "data": { "status": "draft", - "selfEligible": true, "value": { "currency": "UAH", "amount": 500.0, @@ -81,7 +79,7 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/50c8252303834996 } ], "date": "2020-05-15T01:00:00+03:00", - "id": "dc595a39267248abbf3e85d759d6c1ab" + "id": "529f4dbc517942dc8dd3f040cd17ddc4" } } diff --git a/docs/source/tendering/competitivedialogue/tutorial/stage2/EU/reject-qualification3.http b/docs/source/tendering/competitivedialogue/tutorial/stage2/EU/reject-qualification3.http index c86dd0d891..5938d0a81a 100644 --- a/docs/source/tendering/competitivedialogue/tutorial/stage2/EU/reject-qualification3.http +++ b/docs/source/tendering/competitivedialogue/tutorial/stage2/EU/reject-qualification3.http @@ -17,7 +17,7 @@ Content-Type: application/json; charset=UTF-8 "status": "unsuccessful", "eligible": false, "qualified": false, - "bidID": "0ee0193aeac246e791c6601952452387", + "bidID": "e60107f58b494544803467b4a2dc9362", "date": "2020-05-15T01:00:00+03:00", "id": "52aa76f0b6d34ec8bdcfaec20e6eaa4c" } diff --git a/docs/source/tendering/competitivedialogue/tutorial/stage2/EU/rejected-bid-view.http b/docs/source/tendering/competitivedialogue/tutorial/stage2/EU/rejected-bid-view.http index 8bb09ce520..2ac76ed508 100644 --- a/docs/source/tendering/competitivedialogue/tutorial/stage2/EU/rejected-bid-view.http +++ b/docs/source/tendering/competitivedialogue/tutorial/stage2/EU/rejected-bid-view.http @@ -1,4 +1,4 @@ -GET /api/2.5/tenders/50c82523038349969f53f3e238932c46/bids/0ee0193aeac246e791c6601952452387?acc_token=90e5c1d7c0414b99a392234aee8cd1dc HTTP/1.0 +GET /api/2.5/tenders/50c82523038349969f53f3e238932c46/bids/e60107f58b494544803467b4a2dc9362?acc_token=90e5c1d7c0414b99a392234aee8cd1dc HTTP/1.0 Authorization: Bearer broker Host: lb-api-sandbox.prozorro.gov.ua @@ -17,7 +17,7 @@ Content-Type: application/json; charset=UTF-8 "format": "application/pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", - "id": "a38bd81182d84d43bef52d2698f89d98", + "id": "54c20d16be604b31b972dbb5adf700f7", "dateModified": "2020-05-15T01:00:00+03:00" }, { @@ -25,12 +25,12 @@ Content-Type: application/json; charset=UTF-8 "confidentiality": "buyerOnly", "language": "uk", "format": "application/pdf", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/50c82523038349969f53f3e238932c46/bids/0ee0193aeac246e791c6601952452387/documents/f896df38ec1e41cc89e6e463e54e81e8?download=924d1313531d40a6b8e6b83f0ec24b05", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/50c82523038349969f53f3e238932c46/bids/e60107f58b494544803467b4a2dc9362/documents/63d72e684d714ba395b241868803c3d0?download=924d1313531d40a6b8e6b83f0ec24b05", "confidentialityRationale": "Only our company sells badgers with pink hair.", "title": "Proposal_part2.pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", - "id": "f896df38ec1e41cc89e6e463e54e81e8", + "id": "63d72e684d714ba395b241868803c3d0", "dateModified": "2020-05-15T01:00:00+03:00" } ], @@ -44,12 +44,11 @@ Content-Type: application/json; charset=UTF-8 "format": "application/pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", - "id": "5a466b5c43144a0e80632960a297cd18", + "id": "a36f5356998846b7903c4043484842b3", "dateModified": "2020-05-15T01:00:00+03:00" } ], - "selfEligible": true, - "selfQualified": true, + "id": "e60107f58b494544803467b4a2dc9362", "tenderers": [ { "contactPoint": { @@ -73,7 +72,7 @@ Content-Type: application/json; charset=UTF-8 } } ], - "id": "0ee0193aeac246e791c6601952452387" + "selfQualified": true } } diff --git a/docs/source/tendering/competitivedialogue/tutorial/stage2/EU/tender-activate.http b/docs/source/tendering/competitivedialogue/tutorial/stage2/EU/tender-activate.http index 227c9af68b..96807dfa34 100644 --- a/docs/source/tendering/competitivedialogue/tutorial/stage2/EU/tender-activate.http +++ b/docs/source/tendering/competitivedialogue/tutorial/stage2/EU/tender-activate.http @@ -17,16 +17,16 @@ Content-Type: application/json; charset=UTF-8 "procurementMethod": "selective", "complaintPeriod": { "startDate": "2020-05-15T01:00:00+03:00", - "endDate": "2020-06-10T00:00:00+03:00" + "endDate": "2020-06-11T00:00:00+03:00" }, "enquiryPeriod": { "startDate": "2020-05-15T01:00:00+03:00", "clarificationsUntil": "2020-06-11T00:00:00+03:00", - "endDate": "2020-06-04T01:00:10+03:00", + "endDate": "2020-06-05T00:00:00+03:00", "invalidationDate": "2020-05-15T01:00:00+03:00" }, "submissionMethod": "electronicAuction", - "next_check": "2020-06-14T01:00:10+03:00", + "next_check": "2020-06-15T01:00:00+03:00", "awardCriteria": "lowestCost", "owner": "broker", "title_en": "Services in school canteens", @@ -63,10 +63,10 @@ Content-Type: application/json; charset=UTF-8 "status": "active.tendering", "tenderPeriod": { "startDate": "2020-05-15T01:00:00+03:00", - "endDate": "2020-06-14T01:00:10+03:00" + "endDate": "2020-06-15T01:00:00+03:00" }, "auctionPeriod": { - "shouldStartAfter": "2020-07-20T00:00:00+03:00" + "shouldStartAfter": "2020-07-21T00:00:00+03:00" }, "procurementMethodType": "competitiveDialogueEU.stage2", "date": "2020-05-15T01:00:00+03:00", @@ -102,7 +102,7 @@ Content-Type: application/json; charset=UTF-8 "startDate": "2020-06-04T00:00:00+02:00", "endDate": "2020-07-04T00:00:00+02:00" }, - "id": "52ba02bed7a347fa9f8119661caf0ed2", + "id": "c9279535363848ec981dbe0480847b88", "unit": { "code": "44617100-9", "name": "item" @@ -135,7 +135,7 @@ Content-Type: application/json; charset=UTF-8 "startDate": "2020-06-04T00:00:00+02:00", "endDate": "2020-07-04T00:00:00+02:00" }, - "id": "50f37ac382a444ecbc996d07df1e15ed", + "id": "822b768f5a104187ad91523b930af57d", "unit": { "code": "44617100-9", "name": "item" diff --git a/docs/source/tendering/competitivedialogue/tutorial/stage2/EU/tender-contract-get.http b/docs/source/tendering/competitivedialogue/tutorial/stage2/EU/tender-contract-get.http index 0cb42cf318..2aebcbbf4e 100644 --- a/docs/source/tendering/competitivedialogue/tutorial/stage2/EU/tender-contract-get.http +++ b/docs/source/tendering/competitivedialogue/tutorial/stage2/EU/tender-contract-get.http @@ -58,9 +58,9 @@ Content-Type: application/json; charset=UTF-8 }, "deliveryDate": { "startDate": "2020-06-04T01:00:00+03:00", - "endDate": "2020-06-14T01:00:10+03:00" + "endDate": "2020-06-15T01:00:00+03:00" }, - "id": "52ba02bed7a347fa9f8119661caf0ed2", + "id": "c9279535363848ec981dbe0480847b88", "unit": { "code": "44617100-9", "name": "item" diff --git a/docs/source/tendering/competitivedialogue/tutorial/stage2/EU/tender-contract-period.http b/docs/source/tendering/competitivedialogue/tutorial/stage2/EU/tender-contract-period.http index 0834e0ea61..93fb9e6e82 100644 --- a/docs/source/tendering/competitivedialogue/tutorial/stage2/EU/tender-contract-period.http +++ b/docs/source/tendering/competitivedialogue/tutorial/stage2/EU/tender-contract-period.http @@ -43,9 +43,9 @@ Content-Type: application/json; charset=UTF-8 }, "deliveryDate": { "startDate": "2020-06-04T01:00:00+03:00", - "endDate": "2020-06-14T01:00:10+03:00" + "endDate": "2020-06-15T01:00:00+03:00" }, - "id": "52ba02bed7a347fa9f8119661caf0ed2", + "id": "c9279535363848ec981dbe0480847b88", "unit": { "code": "44617100-9", "name": "item" diff --git a/docs/source/tendering/competitivedialogue/tutorial/stage2/EU/tender-contract-set-contract-value.http b/docs/source/tendering/competitivedialogue/tutorial/stage2/EU/tender-contract-set-contract-value.http index 498f400630..0117f41988 100644 --- a/docs/source/tendering/competitivedialogue/tutorial/stage2/EU/tender-contract-set-contract-value.http +++ b/docs/source/tendering/competitivedialogue/tutorial/stage2/EU/tender-contract-set-contract-value.http @@ -44,9 +44,9 @@ Content-Type: application/json; charset=UTF-8 }, "deliveryDate": { "startDate": "2020-06-04T01:00:00+03:00", - "endDate": "2020-06-14T01:00:10+03:00" + "endDate": "2020-06-15T01:00:00+03:00" }, - "id": "52ba02bed7a347fa9f8119661caf0ed2", + "id": "c9279535363848ec981dbe0480847b88", "unit": { "code": "44617100-9", "name": "item" diff --git a/docs/source/tendering/competitivedialogue/tutorial/stage2/EU/tender-contract-sign-date.http b/docs/source/tendering/competitivedialogue/tutorial/stage2/EU/tender-contract-sign-date.http index fdfd6e2377..4e967ca38e 100644 --- a/docs/source/tendering/competitivedialogue/tutorial/stage2/EU/tender-contract-sign-date.http +++ b/docs/source/tendering/competitivedialogue/tutorial/stage2/EU/tender-contract-sign-date.http @@ -40,9 +40,9 @@ Content-Type: application/json; charset=UTF-8 }, "deliveryDate": { "startDate": "2020-06-04T01:00:00+03:00", - "endDate": "2020-06-14T01:00:10+03:00" + "endDate": "2020-06-15T01:00:00+03:00" }, - "id": "52ba02bed7a347fa9f8119661caf0ed2", + "id": "c9279535363848ec981dbe0480847b88", "unit": { "code": "44617100-9", "name": "item" diff --git a/docs/source/tendering/competitivedialogue/tutorial/stage2/EU/try-register-bidder.http b/docs/source/tendering/competitivedialogue/tutorial/stage2/EU/try-register-bidder.http index 02775796e3..5bfe0c0bc6 100644 --- a/docs/source/tendering/competitivedialogue/tutorial/stage2/EU/try-register-bidder.http +++ b/docs/source/tendering/competitivedialogue/tutorial/stage2/EU/try-register-bidder.http @@ -1,17 +1,12 @@ POST /api/2.5/tenders/50c82523038349969f53f3e238932c46/bids HTTP/1.0 Authorization: Bearer broker -Content-Length: 946 +Content-Length: 924 Content-Type: application/json Host: lb-api-sandbox.prozorro.gov.ua DATA: { "data": { "status": "draft", - "selfEligible": true, - "value": { - "amount": 500 - }, - "subcontractingDetails": "ДКП «Орфей», Україна", "tenderers": [ { "contactPoint": { @@ -36,7 +31,11 @@ DATA: } } ], - "selfQualified": true + "selfQualified": true, + "value": { + "amount": 500 + }, + "subcontractingDetails": "ДКП «Орфей», Україна" } } diff --git a/docs/source/tendering/competitivedialogue/tutorial/stage2/EU/update-cancellation-doc.http b/docs/source/tendering/competitivedialogue/tutorial/stage2/EU/update-cancellation-doc.http index 9c75e27d22..6e7b966b94 100644 --- a/docs/source/tendering/competitivedialogue/tutorial/stage2/EU/update-cancellation-doc.http +++ b/docs/source/tendering/competitivedialogue/tutorial/stage2/EU/update-cancellation-doc.http @@ -1,4 +1,4 @@ -PUT /api/2.5/tenders/50c82523038349969f53f3e238932c46/cancellations/3751f4fe25534d0e88b2f836338e014c/documents/4da4669b202e4d2a99386ef3218c9586?acc_token=90e5c1d7c0414b99a392234aee8cd1dc HTTP/1.0 +PUT /api/2.5/tenders/50c82523038349969f53f3e238932c46/cancellations/f532a92b50f04c6eb0f8efa928f32ca2/documents/4da4669b202e4d2a99386ef3218c9586?acc_token=90e5c1d7c0414b99a392234aee8cd1dc HTTP/1.0 Authorization: Bearer broker Content-Length: 145 Content-Type: multipart/form-data; boundary=---BOUNDARY diff --git a/docs/source/tendering/competitivedialogue/tutorial/stage2/EU/update-cancellation-reasonType.http b/docs/source/tendering/competitivedialogue/tutorial/stage2/EU/update-cancellation-reasonType.http index 0c1cbeb952..14cf46fb4a 100644 --- a/docs/source/tendering/competitivedialogue/tutorial/stage2/EU/update-cancellation-reasonType.http +++ b/docs/source/tendering/competitivedialogue/tutorial/stage2/EU/update-cancellation-reasonType.http @@ -1,4 +1,4 @@ -PATCH /api/2.5/tenders/50c82523038349969f53f3e238932c46/cancellations/3751f4fe25534d0e88b2f836338e014c?acc_token=90e5c1d7c0414b99a392234aee8cd1dc HTTP/1.0 +PATCH /api/2.5/tenders/50c82523038349969f53f3e238932c46/cancellations/f532a92b50f04c6eb0f8efa928f32ca2?acc_token=90e5c1d7c0414b99a392234aee8cd1dc HTTP/1.0 Authorization: Bearer broker Content-Length: 37 Content-Type: application/json @@ -19,7 +19,7 @@ Content-Type: application/json; charset=UTF-8 "reasonType": "unFixable", "date": "2020-05-15T01:00:01+03:00", "cancellationOf": "tender", - "id": "3751f4fe25534d0e88b2f836338e014c" + "id": "f532a92b50f04c6eb0f8efa928f32ca2" } } diff --git a/docs/source/tendering/competitivedialogue/tutorial/stage2/EU/update-tender-after-enqiery-with-update-periods.http b/docs/source/tendering/competitivedialogue/tutorial/stage2/EU/update-tender-after-enqiery-with-update-periods.http index 8d55e0f9dd..85ec7936d2 100644 --- a/docs/source/tendering/competitivedialogue/tutorial/stage2/EU/update-tender-after-enqiery-with-update-periods.http +++ b/docs/source/tendering/competitivedialogue/tutorial/stage2/EU/update-tender-after-enqiery-with-update-periods.http @@ -9,7 +9,7 @@ DATA: "items": [ { "deliveryDate": { - "endDate": "2020-06-14T01:00:10+03:00" + "endDate": "2020-06-15T01:00:00+03:00" } } ], @@ -25,13 +25,13 @@ Content-Type: application/json; charset=UTF-8 "data": { "procurementMethod": "selective", "complaintPeriod": { - "startDate": "2020-04-17T01:00:00+03:00", + "startDate": "2020-04-16T01:00:00+03:00", "endDate": "2020-05-19T00:00:00+03:00" }, "enquiryPeriod": { - "startDate": "2020-04-17T01:00:00+03:00", - "clarificationsUntil": "2020-05-19T00:00:00+03:00", - "endDate": "2020-05-13T01:00:00+03:00", + "startDate": "2020-04-16T01:00:00+03:00", + "clarificationsUntil": "2020-05-16T00:00:00+03:00", + "endDate": "2020-05-13T00:00:00+03:00", "invalidationDate": "2020-05-15T01:00:00+03:00" }, "submissionMethod": "electronicAuction", @@ -68,7 +68,7 @@ Content-Type: application/json; charset=UTF-8 "title": "Калорійність", "date": "2020-05-15T01:00:00+03:00", "answer": "Таблицю додано в файлі \"Kalorijnist.xslx\"", - "id": "d307480a47364bc5850a03e4643ca2fd", + "id": "e928a5ef19284c6b8261f1f7c51fd561", "questionOf": "tender" } ], @@ -144,7 +144,7 @@ Content-Type: application/json; charset=UTF-8 "dateModified": "2020-05-15T01:00:00+03:00", "status": "active.tendering", "tenderPeriod": { - "startDate": "2020-04-17T01:00:00+03:00", + "startDate": "2020-04-16T01:00:00+03:00", "endDate": "2020-05-23T01:00:00+03:00" }, "auctionPeriod": { @@ -182,9 +182,9 @@ Content-Type: application/json; charset=UTF-8 }, "deliveryDate": { "startDate": "2020-06-04T01:00:00+03:00", - "endDate": "2020-06-14T01:00:10+03:00" + "endDate": "2020-06-15T01:00:00+03:00" }, - "id": "52ba02bed7a347fa9f8119661caf0ed2", + "id": "c9279535363848ec981dbe0480847b88", "unit": { "code": "44617100-9", "name": "item" diff --git a/docs/source/tendering/competitivedialogue/tutorial/stage2/EU/update-tender-after-enqiery.http b/docs/source/tendering/competitivedialogue/tutorial/stage2/EU/update-tender-after-enqiery.http index 42c3e59c39..bd8fff6fbd 100644 --- a/docs/source/tendering/competitivedialogue/tutorial/stage2/EU/update-tender-after-enqiery.http +++ b/docs/source/tendering/competitivedialogue/tutorial/stage2/EU/update-tender-after-enqiery.http @@ -9,7 +9,7 @@ DATA: "items": [ { "deliveryDate": { - "endDate": "2020-06-14T01:00:10+03:00" + "endDate": "2020-06-15T01:00:00+03:00" } } ] diff --git a/docs/source/tendering/competitivedialogue/tutorial/stage2/EU/upload-bid-financial-document-proposal.http b/docs/source/tendering/competitivedialogue/tutorial/stage2/EU/upload-bid-financial-document-proposal.http index a44e1bf154..a00d75e75b 100644 --- a/docs/source/tendering/competitivedialogue/tutorial/stage2/EU/upload-bid-financial-document-proposal.http +++ b/docs/source/tendering/competitivedialogue/tutorial/stage2/EU/upload-bid-financial-document-proposal.http @@ -1,4 +1,4 @@ -POST /api/2.5/tenders/50c82523038349969f53f3e238932c46/bids/dc595a39267248abbf3e85d759d6c1ab/financial_documents?acc_token=4983fc47c71047729730599c7b0329ae HTTP/1.0 +POST /api/2.5/tenders/50c82523038349969f53f3e238932c46/bids/529f4dbc517942dc8dd3f040cd17ddc4/financial_documents?acc_token=4983fc47c71047729730599c7b0329ae HTTP/1.0 Authorization: Bearer broker Content-Length: 147 Content-Type: multipart/form-data; boundary=---BOUNDARY @@ -14,14 +14,14 @@ Content-Type: application/pdf Response: 201 Created Content-Type: application/json; charset=UTF-8 -Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/50c82523038349969f53f3e238932c46/bids/dc595a39267248abbf3e85d759d6c1ab/financial_documents/7e9bdb022cf444ceaaea927f369b6d7a +Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/50c82523038349969f53f3e238932c46/bids/529f4dbc517942dc8dd3f040cd17ddc4/financial_documents/7e9bdb022cf444ceaaea927f369b6d7a { "data": { "hash": "md5:00000000000000000000000000000000", "confidentiality": "public", "language": "uk", "title": "financial_doc.pdf", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/50c82523038349969f53f3e238932c46/bids/dc595a39267248abbf3e85d759d6c1ab/financial_documents/7e9bdb022cf444ceaaea927f369b6d7a?download=ce50614ba5444be68502c4e715f58cb0", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/50c82523038349969f53f3e238932c46/bids/529f4dbc517942dc8dd3f040cd17ddc4/financial_documents/7e9bdb022cf444ceaaea927f369b6d7a?download=ce50614ba5444be68502c4e715f58cb0", "format": "application/pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", diff --git a/docs/source/tendering/competitivedialogue/tutorial/stage2/EU/upload-bid-private-proposal.http b/docs/source/tendering/competitivedialogue/tutorial/stage2/EU/upload-bid-private-proposal.http index 5481a9d615..660a91779b 100644 --- a/docs/source/tendering/competitivedialogue/tutorial/stage2/EU/upload-bid-private-proposal.http +++ b/docs/source/tendering/competitivedialogue/tutorial/stage2/EU/upload-bid-private-proposal.http @@ -1,4 +1,4 @@ -POST /api/2.5/tenders/50c82523038349969f53f3e238932c46/bids/dc595a39267248abbf3e85d759d6c1ab/documents?acc_token=4983fc47c71047729730599c7b0329ae HTTP/1.0 +POST /api/2.5/tenders/50c82523038349969f53f3e238932c46/bids/529f4dbc517942dc8dd3f040cd17ddc4/documents?acc_token=4983fc47c71047729730599c7b0329ae HTTP/1.0 Authorization: Bearer broker Content-Length: 156 Content-Type: multipart/form-data; boundary=---BOUNDARY @@ -14,14 +14,14 @@ content Response: 201 Created Content-Type: application/json; charset=UTF-8 -Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/50c82523038349969f53f3e238932c46/bids/dc595a39267248abbf3e85d759d6c1ab/documents/ee89213792d8452b93c9ad66e68f8af9 +Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/50c82523038349969f53f3e238932c46/bids/529f4dbc517942dc8dd3f040cd17ddc4/documents/ee89213792d8452b93c9ad66e68f8af9 { "data": { "hash": "md5:00000000000000000000000000000000", "confidentiality": "public", "language": "uk", "title": "Proposal_top_secrets.pdf", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/50c82523038349969f53f3e238932c46/bids/dc595a39267248abbf3e85d759d6c1ab/documents/ee89213792d8452b93c9ad66e68f8af9?download=b23e32bbc16940349bc7370b7cdb1c1a", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/50c82523038349969f53f3e238932c46/bids/529f4dbc517942dc8dd3f040cd17ddc4/documents/ee89213792d8452b93c9ad66e68f8af9?download=b23e32bbc16940349bc7370b7cdb1c1a", "format": "application/pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", diff --git a/docs/source/tendering/competitivedialogue/tutorial/stage2/EU/upload-bid-proposal.http b/docs/source/tendering/competitivedialogue/tutorial/stage2/EU/upload-bid-proposal.http index b52196e566..ed4d73c3a5 100644 --- a/docs/source/tendering/competitivedialogue/tutorial/stage2/EU/upload-bid-proposal.http +++ b/docs/source/tendering/competitivedialogue/tutorial/stage2/EU/upload-bid-proposal.http @@ -1,4 +1,4 @@ -POST /api/2.5/tenders/50c82523038349969f53f3e238932c46/bids/dc595a39267248abbf3e85d759d6c1ab/documents?acc_token=4983fc47c71047729730599c7b0329ae HTTP/1.0 +POST /api/2.5/tenders/50c82523038349969f53f3e238932c46/bids/529f4dbc517942dc8dd3f040cd17ddc4/documents?acc_token=4983fc47c71047729730599c7b0329ae HTTP/1.0 Authorization: Bearer broker Content-Length: 144 Content-Type: multipart/form-data; boundary=---BOUNDARY @@ -14,14 +14,14 @@ content Response: 201 Created Content-Type: application/json; charset=UTF-8 -Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/50c82523038349969f53f3e238932c46/bids/dc595a39267248abbf3e85d759d6c1ab/documents/fcbf9cf830724596a73d37bb33f23efc +Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/50c82523038349969f53f3e238932c46/bids/529f4dbc517942dc8dd3f040cd17ddc4/documents/fcbf9cf830724596a73d37bb33f23efc { "data": { "hash": "md5:00000000000000000000000000000000", "confidentiality": "public", "language": "uk", "title": "Proposal.pdf", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/50c82523038349969f53f3e238932c46/bids/dc595a39267248abbf3e85d759d6c1ab/documents/fcbf9cf830724596a73d37bb33f23efc?download=a5827d34135f49799050b334263efc67", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/50c82523038349969f53f3e238932c46/bids/529f4dbc517942dc8dd3f040cd17ddc4/documents/fcbf9cf830724596a73d37bb33f23efc?download=a5827d34135f49799050b334263efc67", "format": "application/pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", diff --git a/docs/source/tendering/competitivedialogue/tutorial/stage2/EU/upload-bid-qualification-document-proposal.http b/docs/source/tendering/competitivedialogue/tutorial/stage2/EU/upload-bid-qualification-document-proposal.http index 573c8f342d..4746605af5 100644 --- a/docs/source/tendering/competitivedialogue/tutorial/stage2/EU/upload-bid-qualification-document-proposal.http +++ b/docs/source/tendering/competitivedialogue/tutorial/stage2/EU/upload-bid-qualification-document-proposal.http @@ -1,4 +1,4 @@ -POST /api/2.5/tenders/50c82523038349969f53f3e238932c46/bids/dc595a39267248abbf3e85d759d6c1ab/qualification_documents?acc_token=4983fc47c71047729730599c7b0329ae HTTP/1.0 +POST /api/2.5/tenders/50c82523038349969f53f3e238932c46/bids/529f4dbc517942dc8dd3f040cd17ddc4/qualification_documents?acc_token=4983fc47c71047729730599c7b0329ae HTTP/1.0 Authorization: Bearer broker Content-Length: 158 Content-Type: multipart/form-data; boundary=---BOUNDARY @@ -14,14 +14,14 @@ content Response: 201 Created Content-Type: application/json; charset=UTF-8 -Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/50c82523038349969f53f3e238932c46/bids/dc595a39267248abbf3e85d759d6c1ab/qualification_documents/5cb9689ea24e443c91962f32c5c14862 +Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/50c82523038349969f53f3e238932c46/bids/529f4dbc517942dc8dd3f040cd17ddc4/qualification_documents/5cb9689ea24e443c91962f32c5c14862 { "data": { "hash": "md5:00000000000000000000000000000000", "confidentiality": "public", "language": "uk", "title": "qualification_document.pdf", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/50c82523038349969f53f3e238932c46/bids/dc595a39267248abbf3e85d759d6c1ab/qualification_documents/5cb9689ea24e443c91962f32c5c14862?download=dbef167764e444479481858591e64dd8", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/50c82523038349969f53f3e238932c46/bids/529f4dbc517942dc8dd3f040cd17ddc4/qualification_documents/5cb9689ea24e443c91962f32c5c14862?download=dbef167764e444479481858591e64dd8", "format": "application/pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", diff --git a/docs/source/tendering/competitivedialogue/tutorial/stage2/EU/upload-cancellation-doc.http b/docs/source/tendering/competitivedialogue/tutorial/stage2/EU/upload-cancellation-doc.http index 6dfc9d199f..0f476366a8 100644 --- a/docs/source/tendering/competitivedialogue/tutorial/stage2/EU/upload-cancellation-doc.http +++ b/docs/source/tendering/competitivedialogue/tutorial/stage2/EU/upload-cancellation-doc.http @@ -1,4 +1,4 @@ -POST /api/2.5/tenders/50c82523038349969f53f3e238932c46/cancellations/3751f4fe25534d0e88b2f836338e014c/documents?acc_token=90e5c1d7c0414b99a392234aee8cd1dc HTTP/1.0 +POST /api/2.5/tenders/50c82523038349969f53f3e238932c46/cancellations/f532a92b50f04c6eb0f8efa928f32ca2/documents?acc_token=90e5c1d7c0414b99a392234aee8cd1dc HTTP/1.0 Authorization: Bearer broker Content-Length: 142 Content-Type: multipart/form-data; boundary=---BOUNDARY @@ -14,7 +14,7 @@ content Response: 201 Created Content-Type: application/json; charset=UTF-8 -Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/50c82523038349969f53f3e238932c46/cancellations/3751f4fe25534d0e88b2f836338e014c/documents/4da4669b202e4d2a99386ef3218c9586 +Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/50c82523038349969f53f3e238932c46/cancellations/f532a92b50f04c6eb0f8efa928f32ca2/documents/4da4669b202e4d2a99386ef3218c9586 { "data": { "hash": "md5:00000000000000000000000000000000", diff --git a/docs/source/tendering/competitivedialogue/tutorial/stage2/UA/activate-bidder.http b/docs/source/tendering/competitivedialogue/tutorial/stage2/UA/activate-bidder.http index 146a5d2915..d8da72a53d 100644 --- a/docs/source/tendering/competitivedialogue/tutorial/stage2/UA/activate-bidder.http +++ b/docs/source/tendering/competitivedialogue/tutorial/stage2/UA/activate-bidder.http @@ -1,4 +1,4 @@ -PATCH /api/2.5/tenders/c4eafa4139e24f1d84c1ce5ccbb4560d/bids/4e7e80c7beff4410a7871440df169e6d?acc_token=1796bfdc0c804563a47cc56d748e68bb HTTP/1.0 +PATCH /api/2.5/tenders/c4eafa4139e24f1d84c1ce5ccbb4560d/bids/8af8c92723ea4eeda7235d301955eebc?acc_token=1796bfdc0c804563a47cc56d748e68bb HTTP/1.0 Authorization: Bearer broker Content-Length: 30 Content-Type: application/json @@ -15,8 +15,7 @@ Content-Type: application/json; charset=UTF-8 { "data": { "status": "active", - "selfEligible": true, - "id": "4e7e80c7beff4410a7871440df169e6d", + "id": "8af8c92723ea4eeda7235d301955eebc", "value": { "currency": "UAH", "amount": 500.0, diff --git a/docs/source/tendering/competitivedialogue/tutorial/stage2/UA/answer-question.http b/docs/source/tendering/competitivedialogue/tutorial/stage2/UA/answer-question.http index eb621be866..82615288ab 100644 --- a/docs/source/tendering/competitivedialogue/tutorial/stage2/UA/answer-question.http +++ b/docs/source/tendering/competitivedialogue/tutorial/stage2/UA/answer-question.http @@ -1,4 +1,4 @@ -PATCH /api/2.5/tenders/c4eafa4139e24f1d84c1ce5ccbb4560d/questions/05c7bfd35abc4e7381eea2e2ac857e2e?acc_token=ce9ee5fc97484fc3b51e3f4dcea722d4 HTTP/1.0 +PATCH /api/2.5/tenders/c4eafa4139e24f1d84c1ce5ccbb4560d/questions/54c507eed6eb49158dc7d6a7e2230e1c?acc_token=ce9ee5fc97484fc3b51e3f4dcea722d4 HTTP/1.0 Authorization: Bearer broker Content-Length: 162 Content-Type: application/json @@ -19,7 +19,7 @@ Content-Type: application/json; charset=UTF-8 "title": "Калорійність", "date": "2020-05-15T01:00:00+03:00", "answer": "Таблицю додано в файлі \"Kalorijnist.xslx\"", - "id": "05c7bfd35abc4e7381eea2e2ac857e2e", + "id": "54c507eed6eb49158dc7d6a7e2230e1c", "questionOf": "tender" } } diff --git a/docs/source/tendering/competitivedialogue/tutorial/stage2/UA/ask-question.http b/docs/source/tendering/competitivedialogue/tutorial/stage2/UA/ask-question.http index e666f24eb8..7d6924d3c4 100644 --- a/docs/source/tendering/competitivedialogue/tutorial/stage2/UA/ask-question.http +++ b/docs/source/tendering/competitivedialogue/tutorial/stage2/UA/ask-question.http @@ -33,7 +33,7 @@ DATA: Response: 201 Created Content-Type: application/json; charset=UTF-8 -Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/c4eafa4139e24f1d84c1ce5ccbb4560d/questions/05c7bfd35abc4e7381eea2e2ac857e2e +Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/c4eafa4139e24f1d84c1ce5ccbb4560d/questions/54c507eed6eb49158dc7d6a7e2230e1c { "data": { "description": "Просимо додати таблицю потрібної калорійності харчування", @@ -59,7 +59,7 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/c4eafa4139e24f1d }, "title": "Калорійність", "date": "2020-05-15T01:00:00+03:00", - "id": "05c7bfd35abc4e7381eea2e2ac857e2e", + "id": "54c507eed6eb49158dc7d6a7e2230e1c", "questionOf": "tender" } } diff --git a/docs/source/tendering/competitivedialogue/tutorial/stage2/UA/auction-url.http b/docs/source/tendering/competitivedialogue/tutorial/stage2/UA/auction-url.http index 6e55f89aec..1b3ca24ae6 100644 --- a/docs/source/tendering/competitivedialogue/tutorial/stage2/UA/auction-url.http +++ b/docs/source/tendering/competitivedialogue/tutorial/stage2/UA/auction-url.http @@ -15,8 +15,8 @@ Content-Type: application/json; charset=UTF-8 "auctionUrl": "http://auction-sandbox.prozorro.gov.ua/tenders/c4eafa4139e24f1d84c1ce5ccbb4560d", "enquiryPeriod": { "startDate": "2020-04-29T01:00:00+03:00", - "clarificationsUntil": "2020-05-09T00:00:00+03:00", - "endDate": "2020-05-05T01:00:00+03:00", + "clarificationsUntil": "2020-05-08T00:00:00+03:00", + "endDate": "2020-05-05T00:00:00+03:00", "invalidationDate": "2020-05-15T01:00:00+03:00" }, "submissionMethod": "electronicAuction", @@ -49,7 +49,7 @@ Content-Type: application/json; charset=UTF-8 "title": "Калорійність", "date": "2020-05-15T01:00:00+03:00", "answer": "Таблицю додано в файлі \"Kalorijnist.xslx\"", - "id": "05c7bfd35abc4e7381eea2e2ac857e2e", + "id": "54c507eed6eb49158dc7d6a7e2230e1c", "questionOf": "tender" } ], @@ -159,9 +159,9 @@ Content-Type: application/json; charset=UTF-8 }, "deliveryDate": { "startDate": "2020-06-04T00:00:00+02:00", - "endDate": "2020-06-14T01:00:10+03:00" + "endDate": "2020-06-15T01:00:00+03:00" }, - "id": "1aa0d7b2b84645d1977951fbdf466b16", + "id": "c75446f797964947a5f40d98f68fe93b", "unit": { "code": "44617100-9", "name": "item" diff --git a/docs/source/tendering/competitivedialogue/tutorial/stage2/UA/bidder-activate-after-changing-tender.http b/docs/source/tendering/competitivedialogue/tutorial/stage2/UA/bidder-activate-after-changing-tender.http index 67f4949103..28e8b12515 100644 --- a/docs/source/tendering/competitivedialogue/tutorial/stage2/UA/bidder-activate-after-changing-tender.http +++ b/docs/source/tendering/competitivedialogue/tutorial/stage2/UA/bidder-activate-after-changing-tender.http @@ -1,4 +1,4 @@ -PATCH /api/2.5/tenders/c4eafa4139e24f1d84c1ce5ccbb4560d/bids/4e7e80c7beff4410a7871440df169e6d?acc_token=1796bfdc0c804563a47cc56d748e68bb HTTP/1.0 +PATCH /api/2.5/tenders/c4eafa4139e24f1d84c1ce5ccbb4560d/bids/8af8c92723ea4eeda7235d301955eebc?acc_token=1796bfdc0c804563a47cc56d748e68bb HTTP/1.0 Authorization: Bearer broker Content-Length: 30 Content-Type: application/json @@ -19,7 +19,7 @@ Content-Type: application/json; charset=UTF-8 { "hash": "md5:00000000000000000000000000000000", "title": "Proposal.pdf", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/c4eafa4139e24f1d84c1ce5ccbb4560d/bids/4e7e80c7beff4410a7871440df169e6d/documents/1fa410ce0ac3417692601818c8bcb33f?download=fdb6c36e36e64099a4f22f00826a6df8", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/c4eafa4139e24f1d84c1ce5ccbb4560d/bids/8af8c92723ea4eeda7235d301955eebc/documents/1fa410ce0ac3417692601818c8bcb33f?download=fdb6c36e36e64099a4f22f00826a6df8", "format": "application/pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", @@ -27,8 +27,7 @@ Content-Type: application/json; charset=UTF-8 "dateModified": "2020-05-15T01:00:00+03:00" } ], - "selfEligible": true, - "id": "4e7e80c7beff4410a7871440df169e6d", + "id": "8af8c92723ea4eeda7235d301955eebc", "value": { "currency": "UAH", "amount": 500.0, diff --git a/docs/source/tendering/competitivedialogue/tutorial/stage2/UA/bidder-after-changing-tender.http b/docs/source/tendering/competitivedialogue/tutorial/stage2/UA/bidder-after-changing-tender.http index 1838d69e30..1333a0299b 100644 --- a/docs/source/tendering/competitivedialogue/tutorial/stage2/UA/bidder-after-changing-tender.http +++ b/docs/source/tendering/competitivedialogue/tutorial/stage2/UA/bidder-after-changing-tender.http @@ -1,4 +1,4 @@ -GET /api/2.5/tenders/c4eafa4139e24f1d84c1ce5ccbb4560d/bids/4e7e80c7beff4410a7871440df169e6d?acc_token=1796bfdc0c804563a47cc56d748e68bb HTTP/1.0 +GET /api/2.5/tenders/c4eafa4139e24f1d84c1ce5ccbb4560d/bids/8af8c92723ea4eeda7235d301955eebc?acc_token=1796bfdc0c804563a47cc56d748e68bb HTTP/1.0 Authorization: Bearer broker Host: lb-api-sandbox.prozorro.gov.ua @@ -7,7 +7,7 @@ Content-Type: application/json; charset=UTF-8 { "data": { "status": "invalid", - "id": "4e7e80c7beff4410a7871440df169e6d" + "id": "8af8c92723ea4eeda7235d301955eebc" } } diff --git a/docs/source/tendering/competitivedialogue/tutorial/stage2/UA/bidder-documents.http b/docs/source/tendering/competitivedialogue/tutorial/stage2/UA/bidder-documents.http index e814c469cf..03aad61da6 100644 --- a/docs/source/tendering/competitivedialogue/tutorial/stage2/UA/bidder-documents.http +++ b/docs/source/tendering/competitivedialogue/tutorial/stage2/UA/bidder-documents.http @@ -1,4 +1,4 @@ -GET /api/2.5/tenders/c4eafa4139e24f1d84c1ce5ccbb4560d/bids/4e7e80c7beff4410a7871440df169e6d/documents?acc_token=1796bfdc0c804563a47cc56d748e68bb HTTP/1.0 +GET /api/2.5/tenders/c4eafa4139e24f1d84c1ce5ccbb4560d/bids/8af8c92723ea4eeda7235d301955eebc/documents?acc_token=1796bfdc0c804563a47cc56d748e68bb HTTP/1.0 Authorization: Bearer broker Host: lb-api-sandbox.prozorro.gov.ua @@ -9,7 +9,7 @@ Content-Type: application/json; charset=UTF-8 { "hash": "md5:00000000000000000000000000000000", "title": "Proposal.pdf", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/c4eafa4139e24f1d84c1ce5ccbb4560d/bids/4e7e80c7beff4410a7871440df169e6d/documents/1fa410ce0ac3417692601818c8bcb33f?download=fdb6c36e36e64099a4f22f00826a6df8", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/c4eafa4139e24f1d84c1ce5ccbb4560d/bids/8af8c92723ea4eeda7235d301955eebc/documents/1fa410ce0ac3417692601818c8bcb33f?download=fdb6c36e36e64099a4f22f00826a6df8", "format": "application/pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", diff --git a/docs/source/tendering/competitivedialogue/tutorial/stage2/UA/bidder-participation-url.http b/docs/source/tendering/competitivedialogue/tutorial/stage2/UA/bidder-participation-url.http index a743d2f9d9..484e085d54 100644 --- a/docs/source/tendering/competitivedialogue/tutorial/stage2/UA/bidder-participation-url.http +++ b/docs/source/tendering/competitivedialogue/tutorial/stage2/UA/bidder-participation-url.http @@ -1,4 +1,4 @@ -GET /api/2.5/tenders/c4eafa4139e24f1d84c1ce5ccbb4560d/bids/4e7e80c7beff4410a7871440df169e6d?acc_token=1796bfdc0c804563a47cc56d748e68bb HTTP/1.0 +GET /api/2.5/tenders/c4eafa4139e24f1d84c1ce5ccbb4560d/bids/8af8c92723ea4eeda7235d301955eebc?acc_token=1796bfdc0c804563a47cc56d748e68bb HTTP/1.0 Authorization: Bearer broker Host: lb-api-sandbox.prozorro.gov.ua @@ -11,7 +11,7 @@ Content-Type: application/json; charset=UTF-8 { "hash": "md5:00000000000000000000000000000000", "title": "Proposal.pdf", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/c4eafa4139e24f1d84c1ce5ccbb4560d/bids/4e7e80c7beff4410a7871440df169e6d/documents/1fa410ce0ac3417692601818c8bcb33f?download=fdb6c36e36e64099a4f22f00826a6df8", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/c4eafa4139e24f1d84c1ce5ccbb4560d/bids/8af8c92723ea4eeda7235d301955eebc/documents/1fa410ce0ac3417692601818c8bcb33f?download=fdb6c36e36e64099a4f22f00826a6df8", "format": "application/pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", @@ -19,8 +19,7 @@ Content-Type: application/json; charset=UTF-8 "dateModified": "2020-05-15T01:00:00+03:00" } ], - "selfEligible": true, - "id": "4e7e80c7beff4410a7871440df169e6d", + "id": "8af8c92723ea4eeda7235d301955eebc", "value": { "currency": "UAH", "amount": 500.0, @@ -52,7 +51,7 @@ Content-Type: application/json; charset=UTF-8 ], "date": "2020-05-15T01:00:00+03:00", "selfQualified": true, - "participationUrl": "http://auction-sandbox.prozorro.gov.ua/tenders/c4eafa4139e24f1d84c1ce5ccbb4560d?key_for_bid=4e7e80c7beff4410a7871440df169e6d" + "participationUrl": "http://auction-sandbox.prozorro.gov.ua/tenders/c4eafa4139e24f1d84c1ce5ccbb4560d?key_for_bid=8af8c92723ea4eeda7235d301955eebc" } } diff --git a/docs/source/tendering/competitivedialogue/tutorial/stage2/UA/bidder2-participation-url.http b/docs/source/tendering/competitivedialogue/tutorial/stage2/UA/bidder2-participation-url.http index 720a587e87..aa5072d457 100644 --- a/docs/source/tendering/competitivedialogue/tutorial/stage2/UA/bidder2-participation-url.http +++ b/docs/source/tendering/competitivedialogue/tutorial/stage2/UA/bidder2-participation-url.http @@ -1,4 +1,4 @@ -GET /api/2.5/tenders/c4eafa4139e24f1d84c1ce5ccbb4560d/bids/955d1e01f0604f458f923f2ce7cacf3a?acc_token=c631e154db144d01824af380c6d83247 HTTP/1.0 +GET /api/2.5/tenders/c4eafa4139e24f1d84c1ce5ccbb4560d/bids/09c4b1e3c23e4f6cb647e58c5a1f55b6?acc_token=c631e154db144d01824af380c6d83247 HTTP/1.0 Authorization: Bearer broker Host: lb-api-sandbox.prozorro.gov.ua @@ -11,21 +11,20 @@ Content-Type: application/json; charset=UTF-8 { "hash": "md5:00000000000000000000000000000000", "title": "Proposal_part1.pdf", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/c4eafa4139e24f1d84c1ce5ccbb4560d/bids/955d1e01f0604f458f923f2ce7cacf3a/documents/8832c635d2004c048134be52dd6d6115?download=6ce04e80464b4567830a30ffc7c1bb62", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/c4eafa4139e24f1d84c1ce5ccbb4560d/bids/09c4b1e3c23e4f6cb647e58c5a1f55b6/documents/61adf5465a82489bb4f746b75688805c?download=6ce04e80464b4567830a30ffc7c1bb62", "format": "application/pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", - "id": "8832c635d2004c048134be52dd6d6115", + "id": "61adf5465a82489bb4f746b75688805c", "dateModified": "2020-05-15T01:00:00+03:00" } ], - "selfEligible": true, "value": { "currency": "UAH", "amount": 499.0, "valueAddedTaxIncluded": true }, - "id": "955d1e01f0604f458f923f2ce7cacf3a", + "id": "09c4b1e3c23e4f6cb647e58c5a1f55b6", "tenderers": [ { "contactPoint": { @@ -51,7 +50,7 @@ Content-Type: application/json; charset=UTF-8 ], "date": "2020-05-15T01:00:00+03:00", "selfQualified": true, - "participationUrl": "http://auction-sandbox.prozorro.gov.ua/tenders/c4eafa4139e24f1d84c1ce5ccbb4560d?key_for_bid=955d1e01f0604f458f923f2ce7cacf3a" + "participationUrl": "http://auction-sandbox.prozorro.gov.ua/tenders/c4eafa4139e24f1d84c1ce5ccbb4560d?key_for_bid=09c4b1e3c23e4f6cb647e58c5a1f55b6" } } diff --git a/docs/source/tendering/competitivedialogue/tutorial/stage2/UA/confirm-qualification.http b/docs/source/tendering/competitivedialogue/tutorial/stage2/UA/confirm-qualification.http index 3848be57ec..264686c961 100644 --- a/docs/source/tendering/competitivedialogue/tutorial/stage2/UA/confirm-qualification.http +++ b/docs/source/tendering/competitivedialogue/tutorial/stage2/UA/confirm-qualification.http @@ -45,7 +45,7 @@ Content-Type: application/json; charset=UTF-8 "startDate": "2020-05-15T01:00:01+03:00", "endDate": "2020-05-26T00:00:00+03:00" }, - "bid_id": "955d1e01f0604f458f923f2ce7cacf3a", + "bid_id": "09c4b1e3c23e4f6cb647e58c5a1f55b6", "value": { "currency": "UAH", "amount": 499.0, diff --git a/docs/source/tendering/competitivedialogue/tutorial/stage2/UA/get-answer.http b/docs/source/tendering/competitivedialogue/tutorial/stage2/UA/get-answer.http index d1a4599e1d..0e25694cb4 100644 --- a/docs/source/tendering/competitivedialogue/tutorial/stage2/UA/get-answer.http +++ b/docs/source/tendering/competitivedialogue/tutorial/stage2/UA/get-answer.http @@ -1,4 +1,4 @@ -GET /api/2.5/tenders/c4eafa4139e24f1d84c1ce5ccbb4560d/questions/05c7bfd35abc4e7381eea2e2ac857e2e HTTP/1.0 +GET /api/2.5/tenders/c4eafa4139e24f1d84c1ce5ccbb4560d/questions/54c507eed6eb49158dc7d6a7e2230e1c HTTP/1.0 Authorization: Bearer broker Host: lb-api-sandbox.prozorro.gov.ua @@ -11,7 +11,7 @@ Content-Type: application/json; charset=UTF-8 "title": "Калорійність", "date": "2020-05-15T01:00:00+03:00", "answer": "Таблицю додано в файлі \"Kalorijnist.xslx\"", - "id": "05c7bfd35abc4e7381eea2e2ac857e2e", + "id": "54c507eed6eb49158dc7d6a7e2230e1c", "questionOf": "tender" } } diff --git a/docs/source/tendering/competitivedialogue/tutorial/stage2/UA/list-question.http b/docs/source/tendering/competitivedialogue/tutorial/stage2/UA/list-question.http index 4bdc6da9c6..81420c248f 100644 --- a/docs/source/tendering/competitivedialogue/tutorial/stage2/UA/list-question.http +++ b/docs/source/tendering/competitivedialogue/tutorial/stage2/UA/list-question.http @@ -12,7 +12,7 @@ Content-Type: application/json; charset=UTF-8 "title": "Калорійність", "date": "2020-05-15T01:00:00+03:00", "answer": "Таблицю додано в файлі \"Kalorijnist.xslx\"", - "id": "05c7bfd35abc4e7381eea2e2ac857e2e", + "id": "54c507eed6eb49158dc7d6a7e2230e1c", "questionOf": "tender" } ] diff --git a/docs/source/tendering/competitivedialogue/tutorial/stage2/UA/patch-cancellation.http b/docs/source/tendering/competitivedialogue/tutorial/stage2/UA/patch-cancellation.http index a82d9117b3..6ddfecc578 100644 --- a/docs/source/tendering/competitivedialogue/tutorial/stage2/UA/patch-cancellation.http +++ b/docs/source/tendering/competitivedialogue/tutorial/stage2/UA/patch-cancellation.http @@ -1,4 +1,4 @@ -PATCH /api/2.5/tenders/c4eafa4139e24f1d84c1ce5ccbb4560d/cancellations/d42fd4b9cc384f5280a5b4edcf883629/documents/b660c69f66784b979da3b1cf1fff9e76?acc_token=ce9ee5fc97484fc3b51e3f4dcea722d4 HTTP/1.0 +PATCH /api/2.5/tenders/c4eafa4139e24f1d84c1ce5ccbb4560d/cancellations/778f01babc364fba9ec0a685ec81d2f1/documents/b660c69f66784b979da3b1cf1fff9e76?acc_token=ce9ee5fc97484fc3b51e3f4dcea722d4 HTTP/1.0 Authorization: Bearer broker Content-Length: 48 Content-Type: application/json diff --git a/docs/source/tendering/competitivedialogue/tutorial/stage2/UA/patch-tender-periods.http b/docs/source/tendering/competitivedialogue/tutorial/stage2/UA/patch-tender-periods.http index 898c28162b..cf7e5c5754 100644 --- a/docs/source/tendering/competitivedialogue/tutorial/stage2/UA/patch-tender-periods.http +++ b/docs/source/tendering/competitivedialogue/tutorial/stage2/UA/patch-tender-periods.http @@ -7,7 +7,7 @@ DATA: { "data": { "tenderPeriod": { - "endDate": "2020-06-14T01:00:10+03:00" + "endDate": "2020-06-15T01:00:00+03:00" } } } @@ -21,7 +21,7 @@ Content-Type: application/json; charset=UTF-8 "awardCriteria": "lowestCost", "tenderPeriod": { "startDate": "2020-05-15T01:00:00+03:00", - "endDate": "2020-06-14T01:00:10+03:00" + "endDate": "2020-06-15T01:00:00+03:00" }, "title": "футляри до державних нагород", "minimalStep": { @@ -32,11 +32,11 @@ Content-Type: application/json; charset=UTF-8 "enquiryPeriod": { "startDate": "2020-05-15T01:00:00+03:00", "clarificationsUntil": "2020-06-11T00:00:00+03:00", - "endDate": "2020-06-04T01:00:10+03:00" + "endDate": "2020-06-05T00:00:00+03:00" }, "complaintPeriod": { "startDate": "2020-05-15T01:00:00+03:00", - "endDate": "2020-06-10T00:00:00+03:00" + "endDate": "2020-06-11T00:00:00+03:00" }, "procurementMethodType": "competitiveDialogueUA.stage2", "value": { @@ -119,7 +119,7 @@ Content-Type: application/json; charset=UTF-8 "startDate": "2020-06-04T00:00:00+02:00", "endDate": "2020-07-04T00:00:00+02:00" }, - "id": "1aa0d7b2b84645d1977951fbdf466b16", + "id": "c75446f797964947a5f40d98f68fe93b", "unit": { "code": "44617100-9", "name": "item" diff --git a/docs/source/tendering/competitivedialogue/tutorial/stage2/UA/prepare-cancellation.http b/docs/source/tendering/competitivedialogue/tutorial/stage2/UA/prepare-cancellation.http index f8616e768d..a39aba68e3 100644 --- a/docs/source/tendering/competitivedialogue/tutorial/stage2/UA/prepare-cancellation.http +++ b/docs/source/tendering/competitivedialogue/tutorial/stage2/UA/prepare-cancellation.http @@ -13,7 +13,7 @@ DATA: Response: 201 Created Content-Type: application/json; charset=UTF-8 -Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/c4eafa4139e24f1d84c1ce5ccbb4560d/cancellations/d42fd4b9cc384f5280a5b4edcf883629 +Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/c4eafa4139e24f1d84c1ce5ccbb4560d/cancellations/778f01babc364fba9ec0a685ec81d2f1 { "data": { "status": "draft", @@ -21,7 +21,7 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/c4eafa4139e24f1d "reasonType": "noDemand", "date": "2020-05-15T01:00:03+03:00", "cancellationOf": "tender", - "id": "d42fd4b9cc384f5280a5b4edcf883629" + "id": "778f01babc364fba9ec0a685ec81d2f1" } } diff --git a/docs/source/tendering/competitivedialogue/tutorial/stage2/UA/register-2nd-bidder.http b/docs/source/tendering/competitivedialogue/tutorial/stage2/UA/register-2nd-bidder.http index 6d6e973cf9..71b9e81956 100644 --- a/docs/source/tendering/competitivedialogue/tutorial/stage2/UA/register-2nd-bidder.http +++ b/docs/source/tendering/competitivedialogue/tutorial/stage2/UA/register-2nd-bidder.http @@ -1,12 +1,11 @@ POST /api/2.5/tenders/c4eafa4139e24f1d84c1ce5ccbb4560d/bids HTTP/1.0 Authorization: Bearer broker -Content-Length: 1163 +Content-Length: 1141 Content-Type: application/json Host: lb-api-sandbox.prozorro.gov.ua DATA: { "data": { - "selfEligible": true, "documents": [ { "url": "http://public-docs-sandbox.prozorro.gov.ua/get/6ce04e80464b4567830a30ffc7c1bb62?KeyID=a8968c46&Signature=pdjIfuseyC2eyZO%2FhbxhUqzXc4p4JuSiVqAiKSRsyFq%2B5DhMFQoZIIe4OE4eB5%2BRrSSJvQjkECo3WOwLbW8UAQ%3D%3D", @@ -47,7 +46,7 @@ DATA: Response: 201 Created Content-Type: application/json; charset=UTF-8 -Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/c4eafa4139e24f1d84c1ce5ccbb4560d/bids/955d1e01f0604f458f923f2ce7cacf3a +Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/c4eafa4139e24f1d84c1ce5ccbb4560d/bids/09c4b1e3c23e4f6cb647e58c5a1f55b6 { "access": { "transfer": "599945bbdf574a34816e226cf92a06fe", @@ -59,15 +58,14 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/c4eafa4139e24f1d { "hash": "md5:00000000000000000000000000000000", "title": "Proposal_part1.pdf", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/c4eafa4139e24f1d84c1ce5ccbb4560d/bids/955d1e01f0604f458f923f2ce7cacf3a/documents/8832c635d2004c048134be52dd6d6115?download=6ce04e80464b4567830a30ffc7c1bb62", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/c4eafa4139e24f1d84c1ce5ccbb4560d/bids/09c4b1e3c23e4f6cb647e58c5a1f55b6/documents/61adf5465a82489bb4f746b75688805c?download=6ce04e80464b4567830a30ffc7c1bb62", "format": "application/pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", - "id": "8832c635d2004c048134be52dd6d6115", + "id": "61adf5465a82489bb4f746b75688805c", "dateModified": "2020-05-15T01:00:00+03:00" } ], - "selfEligible": true, "value": { "currency": "UAH", "amount": 499.0, @@ -98,7 +96,7 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/c4eafa4139e24f1d } ], "date": "2020-05-15T01:00:00+03:00", - "id": "955d1e01f0604f458f923f2ce7cacf3a" + "id": "09c4b1e3c23e4f6cb647e58c5a1f55b6" } } diff --git a/docs/source/tendering/competitivedialogue/tutorial/stage2/UA/register-bidder.http b/docs/source/tendering/competitivedialogue/tutorial/stage2/UA/register-bidder.http index 47319aa1a6..9ae06c80a0 100644 --- a/docs/source/tendering/competitivedialogue/tutorial/stage2/UA/register-bidder.http +++ b/docs/source/tendering/competitivedialogue/tutorial/stage2/UA/register-bidder.http @@ -1,17 +1,12 @@ POST /api/2.5/tenders/c4eafa4139e24f1d84c1ce5ccbb4560d/bids HTTP/1.0 Authorization: Bearer broker -Content-Length: 1001 +Content-Length: 979 Content-Type: application/json Host: lb-api-sandbox.prozorro.gov.ua DATA: { "data": { "status": "draft", - "selfEligible": true, - "value": { - "amount": 500 - }, - "subcontractingDetails": "ДКП «Орфей», Україна", "tenderers": [ { "contactPoint": { @@ -35,13 +30,17 @@ DATA: } } ], - "selfQualified": true + "selfQualified": true, + "value": { + "amount": 500 + }, + "subcontractingDetails": "ДКП «Орфей», Україна" } } Response: 201 Created Content-Type: application/json; charset=UTF-8 -Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/c4eafa4139e24f1d84c1ce5ccbb4560d/bids/4e7e80c7beff4410a7871440df169e6d +Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/c4eafa4139e24f1d84c1ce5ccbb4560d/bids/8af8c92723ea4eeda7235d301955eebc { "access": { "transfer": "c13126b3db0c4fb0a45bdcb9ccf96913", @@ -49,8 +48,7 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/c4eafa4139e24f1d }, "data": { "status": "draft", - "selfEligible": true, - "id": "4e7e80c7beff4410a7871440df169e6d", + "id": "8af8c92723ea4eeda7235d301955eebc", "value": { "currency": "UAH", "amount": 500.0, diff --git a/docs/source/tendering/competitivedialogue/tutorial/stage2/UA/tender-activate.http b/docs/source/tendering/competitivedialogue/tutorial/stage2/UA/tender-activate.http index 7be5bda53f..2acc091037 100644 --- a/docs/source/tendering/competitivedialogue/tutorial/stage2/UA/tender-activate.http +++ b/docs/source/tendering/competitivedialogue/tutorial/stage2/UA/tender-activate.http @@ -19,7 +19,7 @@ Content-Type: application/json; charset=UTF-8 "awardCriteria": "lowestCost", "tenderPeriod": { "startDate": "2020-05-15T01:00:00+03:00", - "endDate": "2020-06-14T01:00:10+03:00" + "endDate": "2020-06-15T01:00:00+03:00" }, "title": "футляри до державних нагород", "minimalStep": { @@ -30,12 +30,12 @@ Content-Type: application/json; charset=UTF-8 "enquiryPeriod": { "startDate": "2020-05-15T01:00:00+03:00", "clarificationsUntil": "2020-06-11T00:00:00+03:00", - "endDate": "2020-06-04T01:00:10+03:00", + "endDate": "2020-06-05T00:00:00+03:00", "invalidationDate": "2020-05-15T01:00:00+03:00" }, "complaintPeriod": { "startDate": "2020-05-15T01:00:00+03:00", - "endDate": "2020-06-10T00:00:00+03:00" + "endDate": "2020-06-11T00:00:00+03:00" }, "procurementMethodType": "competitiveDialogueUA.stage2", "value": { @@ -71,7 +71,7 @@ Content-Type: application/json; charset=UTF-8 } ], "date": "2020-05-15T01:00:00+03:00", - "next_check": "2020-06-14T01:00:10+03:00", + "next_check": "2020-06-15T01:00:00+03:00", "procuringEntity": { "contactPoint": { "url": "http://sch10.edu.vn.ua/", @@ -94,7 +94,7 @@ Content-Type: application/json; charset=UTF-8 } }, "auctionPeriod": { - "shouldStartAfter": "2020-06-15T00:00:00+03:00" + "shouldStartAfter": "2020-06-16T00:00:00+03:00" }, "owner": "broker", "dateModified": "2020-05-15T01:00:00+03:00", @@ -124,7 +124,7 @@ Content-Type: application/json; charset=UTF-8 "startDate": "2020-06-04T00:00:00+02:00", "endDate": "2020-07-04T00:00:00+02:00" }, - "id": "1aa0d7b2b84645d1977951fbdf466b16", + "id": "c75446f797964947a5f40d98f68fe93b", "unit": { "code": "44617100-9", "name": "item" diff --git a/docs/source/tendering/competitivedialogue/tutorial/stage2/UA/tender-contract-get.http b/docs/source/tendering/competitivedialogue/tutorial/stage2/UA/tender-contract-get.http index 073a5edac9..73260d7c82 100644 --- a/docs/source/tendering/competitivedialogue/tutorial/stage2/UA/tender-contract-get.http +++ b/docs/source/tendering/competitivedialogue/tutorial/stage2/UA/tender-contract-get.http @@ -43,9 +43,9 @@ Content-Type: application/json; charset=UTF-8 }, "deliveryDate": { "startDate": "2020-06-04T00:00:00+02:00", - "endDate": "2020-06-14T01:00:10+03:00" + "endDate": "2020-06-15T01:00:00+03:00" }, - "id": "1aa0d7b2b84645d1977951fbdf466b16", + "id": "c75446f797964947a5f40d98f68fe93b", "unit": { "code": "44617100-9", "name": "item" diff --git a/docs/source/tendering/competitivedialogue/tutorial/stage2/UA/tender-contract-period.http b/docs/source/tendering/competitivedialogue/tutorial/stage2/UA/tender-contract-period.http index 549486a87c..6c74f82cd5 100644 --- a/docs/source/tendering/competitivedialogue/tutorial/stage2/UA/tender-contract-period.http +++ b/docs/source/tendering/competitivedialogue/tutorial/stage2/UA/tender-contract-period.http @@ -42,9 +42,9 @@ Content-Type: application/json; charset=UTF-8 }, "deliveryDate": { "startDate": "2020-06-04T00:00:00+02:00", - "endDate": "2020-06-14T01:00:10+03:00" + "endDate": "2020-06-15T01:00:00+03:00" }, - "id": "1aa0d7b2b84645d1977951fbdf466b16", + "id": "c75446f797964947a5f40d98f68fe93b", "unit": { "code": "44617100-9", "name": "item" diff --git a/docs/source/tendering/competitivedialogue/tutorial/stage2/UA/tender-contract-set-contract-value.http b/docs/source/tendering/competitivedialogue/tutorial/stage2/UA/tender-contract-set-contract-value.http index 20dea5b8d5..24a77c0d1a 100644 --- a/docs/source/tendering/competitivedialogue/tutorial/stage2/UA/tender-contract-set-contract-value.http +++ b/docs/source/tendering/competitivedialogue/tutorial/stage2/UA/tender-contract-set-contract-value.http @@ -42,9 +42,9 @@ Content-Type: application/json; charset=UTF-8 }, "deliveryDate": { "startDate": "2020-06-04T00:00:00+02:00", - "endDate": "2020-06-14T01:00:10+03:00" + "endDate": "2020-06-15T01:00:00+03:00" }, - "id": "1aa0d7b2b84645d1977951fbdf466b16", + "id": "c75446f797964947a5f40d98f68fe93b", "unit": { "code": "44617100-9", "name": "item" diff --git a/docs/source/tendering/competitivedialogue/tutorial/stage2/UA/tender-contract-sign-date.http b/docs/source/tendering/competitivedialogue/tutorial/stage2/UA/tender-contract-sign-date.http index 31e4937a09..ecfb283618 100644 --- a/docs/source/tendering/competitivedialogue/tutorial/stage2/UA/tender-contract-sign-date.http +++ b/docs/source/tendering/competitivedialogue/tutorial/stage2/UA/tender-contract-sign-date.http @@ -39,9 +39,9 @@ Content-Type: application/json; charset=UTF-8 }, "deliveryDate": { "startDate": "2020-06-04T00:00:00+02:00", - "endDate": "2020-06-14T01:00:10+03:00" + "endDate": "2020-06-15T01:00:00+03:00" }, - "id": "1aa0d7b2b84645d1977951fbdf466b16", + "id": "c75446f797964947a5f40d98f68fe93b", "unit": { "code": "44617100-9", "name": "item" diff --git a/docs/source/tendering/competitivedialogue/tutorial/stage2/UA/try-register-bidder.http b/docs/source/tendering/competitivedialogue/tutorial/stage2/UA/try-register-bidder.http index 4af7891977..71fc6a32dd 100644 --- a/docs/source/tendering/competitivedialogue/tutorial/stage2/UA/try-register-bidder.http +++ b/docs/source/tendering/competitivedialogue/tutorial/stage2/UA/try-register-bidder.http @@ -1,17 +1,12 @@ POST /api/2.5/tenders/c4eafa4139e24f1d84c1ce5ccbb4560d/bids HTTP/1.0 Authorization: Bearer broker -Content-Length: 946 +Content-Length: 924 Content-Type: application/json Host: lb-api-sandbox.prozorro.gov.ua DATA: { "data": { "status": "draft", - "selfEligible": true, - "value": { - "amount": 500 - }, - "subcontractingDetails": "ДКП «Орфей», Україна", "tenderers": [ { "contactPoint": { @@ -36,7 +31,11 @@ DATA: } } ], - "selfQualified": true + "selfQualified": true, + "value": { + "amount": 500 + }, + "subcontractingDetails": "ДКП «Орфей», Україна" } } diff --git a/docs/source/tendering/competitivedialogue/tutorial/stage2/UA/update-cancellation-doc.http b/docs/source/tendering/competitivedialogue/tutorial/stage2/UA/update-cancellation-doc.http index d411768ae3..10f7594ff6 100644 --- a/docs/source/tendering/competitivedialogue/tutorial/stage2/UA/update-cancellation-doc.http +++ b/docs/source/tendering/competitivedialogue/tutorial/stage2/UA/update-cancellation-doc.http @@ -1,4 +1,4 @@ -PUT /api/2.5/tenders/c4eafa4139e24f1d84c1ce5ccbb4560d/cancellations/d42fd4b9cc384f5280a5b4edcf883629/documents/b660c69f66784b979da3b1cf1fff9e76?acc_token=ce9ee5fc97484fc3b51e3f4dcea722d4 HTTP/1.0 +PUT /api/2.5/tenders/c4eafa4139e24f1d84c1ce5ccbb4560d/cancellations/778f01babc364fba9ec0a685ec81d2f1/documents/b660c69f66784b979da3b1cf1fff9e76?acc_token=ce9ee5fc97484fc3b51e3f4dcea722d4 HTTP/1.0 Authorization: Bearer broker Content-Length: 145 Content-Type: multipart/form-data; boundary=---BOUNDARY diff --git a/docs/source/tendering/competitivedialogue/tutorial/stage2/UA/update-cancellation-reasonType.http b/docs/source/tendering/competitivedialogue/tutorial/stage2/UA/update-cancellation-reasonType.http index cc17e6183c..79d82f9765 100644 --- a/docs/source/tendering/competitivedialogue/tutorial/stage2/UA/update-cancellation-reasonType.http +++ b/docs/source/tendering/competitivedialogue/tutorial/stage2/UA/update-cancellation-reasonType.http @@ -1,4 +1,4 @@ -PATCH /api/2.5/tenders/c4eafa4139e24f1d84c1ce5ccbb4560d/cancellations/d42fd4b9cc384f5280a5b4edcf883629?acc_token=ce9ee5fc97484fc3b51e3f4dcea722d4 HTTP/1.0 +PATCH /api/2.5/tenders/c4eafa4139e24f1d84c1ce5ccbb4560d/cancellations/778f01babc364fba9ec0a685ec81d2f1?acc_token=ce9ee5fc97484fc3b51e3f4dcea722d4 HTTP/1.0 Authorization: Bearer broker Content-Length: 37 Content-Type: application/json @@ -19,7 +19,7 @@ Content-Type: application/json; charset=UTF-8 "reasonType": "unFixable", "date": "2020-05-15T01:00:03+03:00", "cancellationOf": "tender", - "id": "d42fd4b9cc384f5280a5b4edcf883629" + "id": "778f01babc364fba9ec0a685ec81d2f1" } } diff --git a/docs/source/tendering/competitivedialogue/tutorial/stage2/UA/update-tender-after-enqiery-with-update-periods.http b/docs/source/tendering/competitivedialogue/tutorial/stage2/UA/update-tender-after-enqiery-with-update-periods.http index c01d5561c8..6b5ac445a8 100644 --- a/docs/source/tendering/competitivedialogue/tutorial/stage2/UA/update-tender-after-enqiery-with-update-periods.http +++ b/docs/source/tendering/competitivedialogue/tutorial/stage2/UA/update-tender-after-enqiery-with-update-periods.http @@ -9,7 +9,7 @@ DATA: "items": [ { "deliveryDate": { - "endDate": "2020-06-14T01:00:10+03:00" + "endDate": "2020-06-15T01:00:00+03:00" } } ], @@ -30,8 +30,8 @@ Content-Type: application/json; charset=UTF-8 }, "enquiryPeriod": { "startDate": "2020-04-17T01:00:00+03:00", - "clarificationsUntil": "2020-05-19T00:00:00+03:00", - "endDate": "2020-05-13T01:00:00+03:00", + "clarificationsUntil": "2020-05-16T00:00:00+03:00", + "endDate": "2020-05-13T00:00:00+03:00", "invalidationDate": "2020-05-15T01:00:00+03:00" }, "submissionMethod": "electronicAuction", @@ -64,7 +64,7 @@ Content-Type: application/json; charset=UTF-8 "title": "Калорійність", "date": "2020-05-15T01:00:00+03:00", "answer": "Таблицю додано в файлі \"Kalorijnist.xslx\"", - "id": "05c7bfd35abc4e7381eea2e2ac857e2e", + "id": "54c507eed6eb49158dc7d6a7e2230e1c", "questionOf": "tender" } ], @@ -173,9 +173,9 @@ Content-Type: application/json; charset=UTF-8 }, "deliveryDate": { "startDate": "2020-06-04T00:00:00+02:00", - "endDate": "2020-06-14T01:00:10+03:00" + "endDate": "2020-06-15T01:00:00+03:00" }, - "id": "1aa0d7b2b84645d1977951fbdf466b16", + "id": "c75446f797964947a5f40d98f68fe93b", "unit": { "code": "44617100-9", "name": "item" diff --git a/docs/source/tendering/competitivedialogue/tutorial/stage2/UA/update-tender-after-enqiery.http b/docs/source/tendering/competitivedialogue/tutorial/stage2/UA/update-tender-after-enqiery.http index 13313ddc0b..98e431e004 100644 --- a/docs/source/tendering/competitivedialogue/tutorial/stage2/UA/update-tender-after-enqiery.http +++ b/docs/source/tendering/competitivedialogue/tutorial/stage2/UA/update-tender-after-enqiery.http @@ -9,7 +9,7 @@ DATA: "items": [ { "deliveryDate": { - "endDate": "2020-06-14T01:00:10+03:00" + "endDate": "2020-06-15T01:00:00+03:00" } } ] diff --git a/docs/source/tendering/competitivedialogue/tutorial/stage2/UA/upload-bid-proposal.http b/docs/source/tendering/competitivedialogue/tutorial/stage2/UA/upload-bid-proposal.http index 88a890b57a..004d79f818 100644 --- a/docs/source/tendering/competitivedialogue/tutorial/stage2/UA/upload-bid-proposal.http +++ b/docs/source/tendering/competitivedialogue/tutorial/stage2/UA/upload-bid-proposal.http @@ -1,4 +1,4 @@ -POST /api/2.5/tenders/c4eafa4139e24f1d84c1ce5ccbb4560d/bids/4e7e80c7beff4410a7871440df169e6d/documents?acc_token=1796bfdc0c804563a47cc56d748e68bb HTTP/1.0 +POST /api/2.5/tenders/c4eafa4139e24f1d84c1ce5ccbb4560d/bids/8af8c92723ea4eeda7235d301955eebc/documents?acc_token=1796bfdc0c804563a47cc56d748e68bb HTTP/1.0 Authorization: Bearer broker Content-Length: 144 Content-Type: multipart/form-data; boundary=---BOUNDARY @@ -14,12 +14,12 @@ content Response: 201 Created Content-Type: application/json; charset=UTF-8 -Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/c4eafa4139e24f1d84c1ce5ccbb4560d/bids/4e7e80c7beff4410a7871440df169e6d/documents/1fa410ce0ac3417692601818c8bcb33f +Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/c4eafa4139e24f1d84c1ce5ccbb4560d/bids/8af8c92723ea4eeda7235d301955eebc/documents/1fa410ce0ac3417692601818c8bcb33f { "data": { "hash": "md5:00000000000000000000000000000000", "title": "Proposal.pdf", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/c4eafa4139e24f1d84c1ce5ccbb4560d/bids/4e7e80c7beff4410a7871440df169e6d/documents/1fa410ce0ac3417692601818c8bcb33f?download=fdb6c36e36e64099a4f22f00826a6df8", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/c4eafa4139e24f1d84c1ce5ccbb4560d/bids/8af8c92723ea4eeda7235d301955eebc/documents/1fa410ce0ac3417692601818c8bcb33f?download=fdb6c36e36e64099a4f22f00826a6df8", "format": "application/pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", diff --git a/docs/source/tendering/competitivedialogue/tutorial/stage2/UA/upload-cancellation-doc.http b/docs/source/tendering/competitivedialogue/tutorial/stage2/UA/upload-cancellation-doc.http index ce70117d7d..03a240ef42 100644 --- a/docs/source/tendering/competitivedialogue/tutorial/stage2/UA/upload-cancellation-doc.http +++ b/docs/source/tendering/competitivedialogue/tutorial/stage2/UA/upload-cancellation-doc.http @@ -1,4 +1,4 @@ -POST /api/2.5/tenders/c4eafa4139e24f1d84c1ce5ccbb4560d/cancellations/d42fd4b9cc384f5280a5b4edcf883629/documents?acc_token=ce9ee5fc97484fc3b51e3f4dcea722d4 HTTP/1.0 +POST /api/2.5/tenders/c4eafa4139e24f1d84c1ce5ccbb4560d/cancellations/778f01babc364fba9ec0a685ec81d2f1/documents?acc_token=ce9ee5fc97484fc3b51e3f4dcea722d4 HTTP/1.0 Authorization: Bearer broker Content-Length: 142 Content-Type: multipart/form-data; boundary=---BOUNDARY @@ -14,7 +14,7 @@ content Response: 201 Created Content-Type: application/json; charset=UTF-8 -Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/c4eafa4139e24f1d84c1ce5ccbb4560d/cancellations/d42fd4b9cc384f5280a5b4edcf883629/documents/b660c69f66784b979da3b1cf1fff9e76 +Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/c4eafa4139e24f1d84c1ce5ccbb4560d/cancellations/778f01babc364fba9ec0a685ec81d2f1/documents/b660c69f66784b979da3b1cf1fff9e76 { "data": { "hash": "md5:00000000000000000000000000000000", diff --git a/docs/source/tendering/competitivedialogue/tutorial/tender-post-attempt-json-data.http b/docs/source/tendering/competitivedialogue/tutorial/tender-post-attempt-json-data.http index 74cd87e2d6..53ae8d1cfc 100644 --- a/docs/source/tendering/competitivedialogue/tutorial/tender-post-attempt-json-data.http +++ b/docs/source/tendering/competitivedialogue/tutorial/tender-post-attempt-json-data.http @@ -157,8 +157,8 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/35f93e8dd5484abb }, "enquiryPeriod": { "startDate": "2020-05-15T01:00:00+03:00", - "clarificationsUntil": "2020-06-12T00:00:00+03:00", - "endDate": "2020-06-05T01:00:00+03:00" + "clarificationsUntil": "2020-06-11T00:00:00+03:00", + "endDate": "2020-06-05T00:00:00+03:00" }, "submissionMethod": "electronicAuction", "next_check": "2020-06-15T01:00:00+03:00", @@ -223,7 +223,7 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/35f93e8dd5484abb }, "percentage": 54.45, "type": "financing", - "id": "e355df7685f14016b48e45d3b6ba7f0f" + "id": "69a5415ca5f7457ebe20137639f410e0" } ], "minimalStep": { @@ -258,7 +258,7 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/35f93e8dd5484abb "startDate": "2020-06-04T00:00:00+02:00", "endDate": "2020-07-04T00:00:00+02:00" }, - "id": "95b041402a794b48aa9200874907a06a", + "id": "8bc8ded5746c4badb496d3297fce132c", "unit": { "code": "44617100-9", "name": "item" @@ -291,7 +291,7 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/35f93e8dd5484abb "startDate": "2020-06-04T00:00:00+02:00", "endDate": "2020-07-04T00:00:00+02:00" }, - "id": "8673d15afe1147e3b19e6aa7ee6fe462", + "id": "cbb964e3acb24801b28a9a27ea7efb14", "unit": { "code": "44617100-9", "name": "item" diff --git a/docs/source/tendering/competitivedialogue/tutorial/tender_stage1_complete.http b/docs/source/tendering/competitivedialogue/tutorial/tender_stage1_complete.http index 170d16668e..d10b072216 100644 --- a/docs/source/tendering/competitivedialogue/tutorial/tender_stage1_complete.http +++ b/docs/source/tendering/competitivedialogue/tutorial/tender_stage1_complete.http @@ -16,7 +16,7 @@ Content-Type: application/json; charset=UTF-8 "enquiryPeriod": { "startDate": "2020-04-04T01:00:00+03:00", "clarificationsUntil": "2020-04-30T00:00:00+03:00", - "endDate": "2020-04-25T01:00:00+03:00", + "endDate": "2020-04-25T00:00:00+03:00", "invalidationDate": "2020-05-15T01:00:00+03:00" }, "submissionMethod": "electronicAuction", @@ -72,7 +72,7 @@ Content-Type: application/json; charset=UTF-8 "date": "2020-05-15T01:00:00+03:00", "answer": "Таблицю додано в файлі \"Kalorijnist.xslx\"", "dateAnswered": "2020-05-15T01:00:00+03:00", - "id": "f74db777262d460099620965f673a415", + "id": "0541cf2833f347a7a46d919f60289a54", "questionOf": "tender" } ], @@ -139,7 +139,7 @@ Content-Type: application/json; charset=UTF-8 "status": "active", "eligible": true, "qualified": true, - "bidID": "9161500fb17744ce90346052ddf8479c", + "bidID": "799d983fc3ca4f18a3d22ead02ec7826", "date": "2020-05-15T01:00:00+03:00", "id": "688adb9bb70e4d4fbcaf4ba1025e7e1a" }, @@ -147,7 +147,7 @@ Content-Type: application/json; charset=UTF-8 "status": "active", "eligible": true, "qualified": true, - "bidID": "253a8b6e43504db9a3d4ec839dc7e5ce", + "bidID": "5c14615bc32a4efea822c166a6fa4023", "date": "2020-05-15T01:00:00+03:00", "id": "be53976fae27403594b3de9b7bdfba6a" }, @@ -155,7 +155,7 @@ Content-Type: application/json; charset=UTF-8 "status": "unsuccessful", "eligible": false, "qualified": false, - "bidID": "d2423013b43642f98ce4b78bc3c99d66", + "bidID": "d3aa2f675e1e4ba28b29163a5e247111", "date": "2020-05-15T01:00:00+03:00", "id": "5ffc4b1c851848199fd66861aa118688" }, @@ -163,7 +163,7 @@ Content-Type: application/json; charset=UTF-8 "status": "active", "eligible": true, "qualified": true, - "bidID": "8fe55741897d438581a0af90c21cc42d", + "bidID": "80b8867552f446eebf0fbc93b10fbdf5", "date": "2020-05-15T01:00:00+03:00", "id": "21a68f5b2e664a23827a19a669007d33" } @@ -193,7 +193,7 @@ Content-Type: application/json; charset=UTF-8 }, "percentage": 54.45, "type": "financing", - "id": "e355df7685f14016b48e45d3b6ba7f0f" + "id": "69a5415ca5f7457ebe20137639f410e0" } ], "minimalStep": { @@ -228,7 +228,7 @@ Content-Type: application/json; charset=UTF-8 "startDate": "2020-06-04T00:00:00+02:00", "endDate": "2020-07-04T00:00:00+02:00" }, - "id": "95b041402a794b48aa9200874907a06a", + "id": "8bc8ded5746c4badb496d3297fce132c", "unit": { "code": "44617100-9", "name": "item" @@ -261,7 +261,7 @@ Content-Type: application/json; charset=UTF-8 "startDate": "2020-06-04T00:00:00+02:00", "endDate": "2020-07-04T00:00:00+02:00" }, - "id": "8673d15afe1147e3b19e6aa7ee6fe462", + "id": "cbb964e3acb24801b28a9a27ea7efb14", "unit": { "code": "44617100-9", "name": "item" @@ -291,7 +291,7 @@ Content-Type: application/json; charset=UTF-8 "confidentiality": "buyerOnly", "language": "uk", "title": "DescriptiveProposal.pdf", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/35f93e8dd5484abb8b90687952c82010/bids/9161500fb17744ce90346052ddf8479c/documents/b3ba98a293ec412b966a9cb2c035020a?download=ec4c001ffaee4fb494eaa38e6bfe7bd7", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/35f93e8dd5484abb8b90687952c82010/bids/799d983fc3ca4f18a3d22ead02ec7826/documents/b3ba98a293ec412b966a9cb2c035020a?download=ec4c001ffaee4fb494eaa38e6bfe7bd7", "format": "application/pdf", "isDescriptionDecision": true, "documentOf": "tender", @@ -304,7 +304,7 @@ Content-Type: application/json; charset=UTF-8 "confidentiality": "buyerOnly", "language": "uk", "format": "application/pdf", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/35f93e8dd5484abb8b90687952c82010/bids/9161500fb17744ce90346052ddf8479c/documents/c1b944c8854543e58b0d043843de553c?download=f47657026ea64bf6b5a840519258f836", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/35f93e8dd5484abb8b90687952c82010/bids/799d983fc3ca4f18a3d22ead02ec7826/documents/c1b944c8854543e58b0d043843de553c?download=f47657026ea64bf6b5a840519258f836", "confidentialityRationale": "Only our company sells badgers with pink hair.", "title": "Proposal_top_secrets.pdf", "isDescriptionDecision": false, @@ -314,7 +314,6 @@ Content-Type: application/json; charset=UTF-8 "dateModified": "2020-05-15T01:00:00+03:00" } ], - "selfEligible": true, "subcontractingDetails": "ДКП «Орфей», Україна", "selfQualified": true, "tenderers": [ @@ -341,12 +340,11 @@ Content-Type: application/json; charset=UTF-8 } ], "date": "2020-05-15T01:00:00+03:00", - "id": "9161500fb17744ce90346052ddf8479c" + "id": "799d983fc3ca4f18a3d22ead02ec7826" }, { + "date": "2020-05-15T01:00:00+03:00", "status": "active", - "selfEligible": true, - "selfQualified": true, "tenderers": [ { "contactPoint": { @@ -370,13 +368,12 @@ Content-Type: application/json; charset=UTF-8 } } ], - "date": "2020-05-15T01:00:00+03:00", - "id": "253a8b6e43504db9a3d4ec839dc7e5ce" + "selfQualified": true, + "id": "5c14615bc32a4efea822c166a6fa4023" }, { + "date": "2020-05-15T01:00:00+03:00", "status": "unsuccessful", - "selfEligible": true, - "selfQualified": true, "tenderers": [ { "contactPoint": { @@ -400,8 +397,8 @@ Content-Type: application/json; charset=UTF-8 } } ], - "date": "2020-05-15T01:00:00+03:00", - "id": "d2423013b43642f98ce4b78bc3c99d66" + "selfQualified": true, + "id": "d3aa2f675e1e4ba28b29163a5e247111" }, { "status": "active", @@ -416,7 +413,7 @@ Content-Type: application/json; charset=UTF-8 "isDescriptionDecision": false, "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", - "id": "e92a237d2cc241d1ae1047f4599874c7", + "id": "4ad15f4646fc4d29a4b63cb9bd25ac01", "dateModified": "2020-05-15T01:00:00+03:00" }, { @@ -424,17 +421,16 @@ Content-Type: application/json; charset=UTF-8 "confidentiality": "buyerOnly", "language": "uk", "format": "application/pdf", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/35f93e8dd5484abb8b90687952c82010/bids/8fe55741897d438581a0af90c21cc42d/documents/3ee0045cc6314ac78ba7a67aa8c90a52?download=9256c48555a442f9991381bf30f8f2c2", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/35f93e8dd5484abb8b90687952c82010/bids/80b8867552f446eebf0fbc93b10fbdf5/documents/b8516bf8ea92481a8be558849bb81b11?download=9256c48555a442f9991381bf30f8f2c2", "confidentialityRationale": "Only our company sells badgers with pink hair.", "title": "Proposal_part2.pdf", "isDescriptionDecision": false, "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", - "id": "3ee0045cc6314ac78ba7a67aa8c90a52", + "id": "b8516bf8ea92481a8be558849bb81b11", "dateModified": "2020-05-15T01:00:00+03:00" } ], - "selfEligible": true, "selfQualified": true, "tenderers": [ { @@ -460,7 +456,7 @@ Content-Type: application/json; charset=UTF-8 } ], "date": "2020-05-15T01:00:00+03:00", - "id": "8fe55741897d438581a0af90c21cc42d" + "id": "80b8867552f446eebf0fbc93b10fbdf5" } ], "value": { diff --git a/docs/source/tendering/competitivedialogue/tutorial/tender_stage2_get_token.http b/docs/source/tendering/competitivedialogue/tutorial/tender_stage2_get_token.http index a455f746b0..a7ab6a1c3c 100644 --- a/docs/source/tendering/competitivedialogue/tutorial/tender_stage2_get_token.http +++ b/docs/source/tendering/competitivedialogue/tutorial/tender_stage2_get_token.http @@ -19,7 +19,7 @@ Content-Type: application/json; charset=UTF-8 "awardCriteria": "lowestCost", "tenderPeriod": { "startDate": "2020-05-15T01:00:00+03:00", - "endDate": "2020-06-14T01:00:00+03:00" + "endDate": "2020-06-15T00:00:00+03:00" }, "title": "Послуги шкільних їдалень", "minimalStep": { @@ -30,11 +30,11 @@ Content-Type: application/json; charset=UTF-8 "enquiryPeriod": { "startDate": "2020-05-15T01:00:00+03:00", "clarificationsUntil": "2020-06-11T00:00:00+03:00", - "endDate": "2020-06-04T01:00:00+03:00" + "endDate": "2020-06-05T00:00:00+03:00" }, "complaintPeriod": { "startDate": "2020-05-15T01:00:00+03:00", - "endDate": "2020-06-10T00:00:00+03:00" + "endDate": "2020-06-11T00:00:00+03:00" }, "title_en": "Services in school canteens", "value": { @@ -123,7 +123,7 @@ Content-Type: application/json; charset=UTF-8 "startDate": "2020-06-04T00:00:00+02:00", "endDate": "2020-07-04T00:00:00+02:00" }, - "id": "7b511293045e49b8a328224196e04d55", + "id": "6c6189b104254d6b9857a84c2174dcfd", "unit": { "code": "44617100-9", "name": "item" @@ -156,7 +156,7 @@ Content-Type: application/json; charset=UTF-8 "startDate": "2020-06-04T00:00:00+02:00", "endDate": "2020-07-04T00:00:00+02:00" }, - "id": "1ad12baa812349259ed30e5b5f014a52", + "id": "dba29819bc7d49d3b8650d799bacdc98", "unit": { "code": "44617100-9", "name": "item" diff --git a/docs/source/tendering/competitivedialogue/tutorial/tender_stage2_modify_status.http b/docs/source/tendering/competitivedialogue/tutorial/tender_stage2_modify_status.http index aa786f9599..18702d27f9 100644 --- a/docs/source/tendering/competitivedialogue/tutorial/tender_stage2_modify_status.http +++ b/docs/source/tendering/competitivedialogue/tutorial/tender_stage2_modify_status.http @@ -17,16 +17,16 @@ Content-Type: application/json; charset=UTF-8 "procurementMethod": "selective", "complaintPeriod": { "startDate": "2020-05-15T01:00:00+03:00", - "endDate": "2020-06-10T00:00:00+03:00" + "endDate": "2020-06-11T00:00:00+03:00" }, "enquiryPeriod": { "startDate": "2020-05-15T01:00:00+03:00", "clarificationsUntil": "2020-06-11T00:00:00+03:00", - "endDate": "2020-06-04T01:00:00+03:00", + "endDate": "2020-06-05T00:00:00+03:00", "invalidationDate": "2020-05-15T01:00:00+03:00" }, "submissionMethod": "electronicAuction", - "next_check": "2020-06-14T01:00:00+03:00", + "next_check": "2020-06-15T00:00:00+03:00", "awardCriteria": "lowestCost", "owner": "broker", "title_en": "Services in school canteens", @@ -63,7 +63,7 @@ Content-Type: application/json; charset=UTF-8 "status": "active.tendering", "tenderPeriod": { "startDate": "2020-05-15T01:00:00+03:00", - "endDate": "2020-06-14T01:00:00+03:00" + "endDate": "2020-06-15T00:00:00+03:00" }, "auctionPeriod": { "shouldStartAfter": "2020-07-20T00:00:00+03:00" @@ -102,7 +102,7 @@ Content-Type: application/json; charset=UTF-8 "startDate": "2020-06-04T00:00:00+02:00", "endDate": "2020-07-04T00:00:00+02:00" }, - "id": "7b511293045e49b8a328224196e04d55", + "id": "6c6189b104254d6b9857a84c2174dcfd", "unit": { "code": "44617100-9", "name": "item" @@ -135,7 +135,7 @@ Content-Type: application/json; charset=UTF-8 "startDate": "2020-06-04T00:00:00+02:00", "endDate": "2020-07-04T00:00:00+02:00" }, - "id": "1ad12baa812349259ed30e5b5f014a52", + "id": "dba29819bc7d49d3b8650d799bacdc98", "unit": { "code": "44617100-9", "name": "item" diff --git a/docs/source/tendering/competitivedialogue/tutorial/update-tender-after-enqiery-with-update-periods.http b/docs/source/tendering/competitivedialogue/tutorial/update-tender-after-enqiery-with-update-periods.http index ccaf0bf795..da17249a93 100644 --- a/docs/source/tendering/competitivedialogue/tutorial/update-tender-after-enqiery-with-update-periods.http +++ b/docs/source/tendering/competitivedialogue/tutorial/update-tender-after-enqiery-with-update-periods.http @@ -23,13 +23,13 @@ Content-Type: application/json; charset=UTF-8 "procurementMethod": "open", "mainProcurementCategory": "services", "complaintPeriod": { - "startDate": "2020-04-17T01:00:00+03:00", + "startDate": "2020-04-16T01:00:00+03:00", "endDate": "2020-05-19T00:00:00+03:00" }, "enquiryPeriod": { - "startDate": "2020-04-17T01:00:00+03:00", - "clarificationsUntil": "2020-05-19T00:00:00+03:00", - "endDate": "2020-05-13T01:00:00+03:00", + "startDate": "2020-04-16T01:00:00+03:00", + "clarificationsUntil": "2020-05-16T00:00:00+03:00", + "endDate": "2020-05-13T00:00:00+03:00", "invalidationDate": "2020-05-15T01:00:00+03:00" }, "submissionMethod": "electronicAuction", @@ -66,7 +66,7 @@ Content-Type: application/json; charset=UTF-8 "title": "Калорійність", "date": "2020-05-15T01:00:00+03:00", "answer": "Таблицю додано в файлі \"Kalorijnist.xslx\"", - "id": "f74db777262d460099620965f673a415", + "id": "0541cf2833f347a7a46d919f60289a54", "questionOf": "tender" } ], @@ -119,7 +119,7 @@ Content-Type: application/json; charset=UTF-8 "dateModified": "2020-05-15T01:00:00+03:00", "status": "active.tendering", "tenderPeriod": { - "startDate": "2020-04-17T01:00:00+03:00", + "startDate": "2020-04-16T01:00:00+03:00", "endDate": "2020-05-23T01:00:00+03:00" }, "title_en": "Services in school canteens", @@ -148,7 +148,7 @@ Content-Type: application/json; charset=UTF-8 }, "percentage": 54.45, "type": "financing", - "id": "e355df7685f14016b48e45d3b6ba7f0f" + "id": "69a5415ca5f7457ebe20137639f410e0" } ], "minimalStep": { @@ -183,7 +183,7 @@ Content-Type: application/json; charset=UTF-8 "startDate": "2020-06-04T00:00:00+02:00", "endDate": "2020-07-04T00:00:00+02:00" }, - "id": "95b041402a794b48aa9200874907a06a", + "id": "8bc8ded5746c4badb496d3297fce132c", "unit": { "code": "44617100-9", "name": "item" @@ -216,7 +216,7 @@ Content-Type: application/json; charset=UTF-8 "startDate": "2020-06-04T00:00:00+02:00", "endDate": "2020-07-04T00:00:00+02:00" }, - "id": "8673d15afe1147e3b19e6aa7ee6fe462", + "id": "cbb964e3acb24801b28a9a27ea7efb14", "unit": { "code": "44617100-9", "name": "item" diff --git a/docs/source/tendering/competitivedialogue/tutorial/update-tender-after-enqiery.http b/docs/source/tendering/competitivedialogue/tutorial/update-tender-after-enqiery.http index 7a2fd6a010..6bec91f9ee 100644 --- a/docs/source/tendering/competitivedialogue/tutorial/update-tender-after-enqiery.http +++ b/docs/source/tendering/competitivedialogue/tutorial/update-tender-after-enqiery.http @@ -9,13 +9,13 @@ Content-Type: application/json; charset=UTF-8 "procurementMethod": "open", "mainProcurementCategory": "services", "complaintPeriod": { - "startDate": "2020-04-17T01:00:00+03:00", + "startDate": "2020-04-16T01:00:00+03:00", "endDate": "2020-05-13T00:00:00+03:00" }, "enquiryPeriod": { - "startDate": "2020-04-17T01:00:00+03:00", - "clarificationsUntil": "2020-05-14T00:00:00+03:00", - "endDate": "2020-05-07T01:00:00+03:00", + "startDate": "2020-04-16T01:00:00+03:00", + "clarificationsUntil": "2020-05-13T00:00:00+03:00", + "endDate": "2020-05-07T00:00:00+03:00", "invalidationDate": "2020-05-15T01:00:00+03:00" }, "submissionMethod": "electronicAuction", @@ -52,7 +52,7 @@ Content-Type: application/json; charset=UTF-8 "title": "Калорійність", "date": "2020-05-15T01:00:00+03:00", "answer": "Таблицю додано в файлі \"Kalorijnist.xslx\"", - "id": "f74db777262d460099620965f673a415", + "id": "0541cf2833f347a7a46d919f60289a54", "questionOf": "tender" } ], @@ -105,7 +105,7 @@ Content-Type: application/json; charset=UTF-8 "dateModified": "2020-05-15T01:00:00+03:00", "status": "active.tendering", "tenderPeriod": { - "startDate": "2020-04-17T01:00:00+03:00", + "startDate": "2020-04-16T01:00:00+03:00", "endDate": "2020-05-17T01:00:00+03:00" }, "title_en": "Services in school canteens", @@ -134,7 +134,7 @@ Content-Type: application/json; charset=UTF-8 }, "percentage": 54.45, "type": "financing", - "id": "e355df7685f14016b48e45d3b6ba7f0f" + "id": "69a5415ca5f7457ebe20137639f410e0" } ], "minimalStep": { @@ -169,7 +169,7 @@ Content-Type: application/json; charset=UTF-8 "startDate": "2020-06-04T00:00:00+02:00", "endDate": "2020-07-04T00:00:00+02:00" }, - "id": "95b041402a794b48aa9200874907a06a", + "id": "8bc8ded5746c4badb496d3297fce132c", "unit": { "code": "44617100-9", "name": "item" @@ -202,7 +202,7 @@ Content-Type: application/json; charset=UTF-8 "startDate": "2020-06-04T00:00:00+02:00", "endDate": "2020-07-04T00:00:00+02:00" }, - "id": "8673d15afe1147e3b19e6aa7ee6fe462", + "id": "cbb964e3acb24801b28a9a27ea7efb14", "unit": { "code": "44617100-9", "name": "item" diff --git a/docs/source/tendering/competitivedialogue/tutorial/upload-bid-descriptive-decision-proposal.http b/docs/source/tendering/competitivedialogue/tutorial/upload-bid-descriptive-decision-proposal.http index 7be1d51c8d..130b81545f 100644 --- a/docs/source/tendering/competitivedialogue/tutorial/upload-bid-descriptive-decision-proposal.http +++ b/docs/source/tendering/competitivedialogue/tutorial/upload-bid-descriptive-decision-proposal.http @@ -1,4 +1,4 @@ -POST /api/2.5/tenders/35f93e8dd5484abb8b90687952c82010/bids/9161500fb17744ce90346052ddf8479c/documents?acc_token=3779418188014a5197c514e6dd1908a2 HTTP/1.0 +POST /api/2.5/tenders/35f93e8dd5484abb8b90687952c82010/bids/799d983fc3ca4f18a3d22ead02ec7826/documents?acc_token=3779418188014a5197c514e6dd1908a2 HTTP/1.0 Authorization: Bearer broker Content-Length: 155 Content-Type: multipart/form-data; boundary=---BOUNDARY @@ -14,14 +14,14 @@ content Response: 201 Created Content-Type: application/json; charset=UTF-8 -Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/35f93e8dd5484abb8b90687952c82010/bids/9161500fb17744ce90346052ddf8479c/documents/b3ba98a293ec412b966a9cb2c035020a +Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/35f93e8dd5484abb8b90687952c82010/bids/799d983fc3ca4f18a3d22ead02ec7826/documents/b3ba98a293ec412b966a9cb2c035020a { "data": { "hash": "md5:00000000000000000000000000000000", "confidentiality": "public", "language": "uk", "title": "DescriptiveProposal.pdf", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/35f93e8dd5484abb8b90687952c82010/bids/9161500fb17744ce90346052ddf8479c/documents/b3ba98a293ec412b966a9cb2c035020a?download=ec4c001ffaee4fb494eaa38e6bfe7bd7", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/35f93e8dd5484abb8b90687952c82010/bids/799d983fc3ca4f18a3d22ead02ec7826/documents/b3ba98a293ec412b966a9cb2c035020a?download=ec4c001ffaee4fb494eaa38e6bfe7bd7", "format": "application/pdf", "isDescriptionDecision": false, "documentOf": "tender", diff --git a/docs/source/tendering/competitivedialogue/tutorial/upload-bid-private-proposal.http b/docs/source/tendering/competitivedialogue/tutorial/upload-bid-private-proposal.http index 16db567bfa..3ab91dbcbf 100644 --- a/docs/source/tendering/competitivedialogue/tutorial/upload-bid-private-proposal.http +++ b/docs/source/tendering/competitivedialogue/tutorial/upload-bid-private-proposal.http @@ -1,4 +1,4 @@ -POST /api/2.5/tenders/35f93e8dd5484abb8b90687952c82010/bids/9161500fb17744ce90346052ddf8479c/documents?acc_token=3779418188014a5197c514e6dd1908a2 HTTP/1.0 +POST /api/2.5/tenders/35f93e8dd5484abb8b90687952c82010/bids/799d983fc3ca4f18a3d22ead02ec7826/documents?acc_token=3779418188014a5197c514e6dd1908a2 HTTP/1.0 Authorization: Bearer broker Content-Length: 156 Content-Type: multipart/form-data; boundary=---BOUNDARY @@ -14,14 +14,14 @@ content Response: 201 Created Content-Type: application/json; charset=UTF-8 -Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/35f93e8dd5484abb8b90687952c82010/bids/9161500fb17744ce90346052ddf8479c/documents/c1b944c8854543e58b0d043843de553c +Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/35f93e8dd5484abb8b90687952c82010/bids/799d983fc3ca4f18a3d22ead02ec7826/documents/c1b944c8854543e58b0d043843de553c { "data": { "hash": "md5:00000000000000000000000000000000", "confidentiality": "public", "language": "uk", "title": "Proposal_top_secrets.pdf", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/35f93e8dd5484abb8b90687952c82010/bids/9161500fb17744ce90346052ddf8479c/documents/c1b944c8854543e58b0d043843de553c?download=f47657026ea64bf6b5a840519258f836", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/35f93e8dd5484abb8b90687952c82010/bids/799d983fc3ca4f18a3d22ead02ec7826/documents/c1b944c8854543e58b0d043843de553c?download=f47657026ea64bf6b5a840519258f836", "format": "application/pdf", "isDescriptionDecision": false, "documentOf": "tender", diff --git a/docs/source/tendering/competitivedialogue/tutorial/upload-bid-proposal.http b/docs/source/tendering/competitivedialogue/tutorial/upload-bid-proposal.http index 2fd4a8eba8..09cb0c2029 100644 --- a/docs/source/tendering/competitivedialogue/tutorial/upload-bid-proposal.http +++ b/docs/source/tendering/competitivedialogue/tutorial/upload-bid-proposal.http @@ -1,4 +1,4 @@ -POST /api/2.5/tenders/35f93e8dd5484abb8b90687952c82010/bids/9161500fb17744ce90346052ddf8479c/documents?acc_token=3779418188014a5197c514e6dd1908a2 HTTP/1.0 +POST /api/2.5/tenders/35f93e8dd5484abb8b90687952c82010/bids/799d983fc3ca4f18a3d22ead02ec7826/documents?acc_token=3779418188014a5197c514e6dd1908a2 HTTP/1.0 Authorization: Bearer broker Content-Length: 144 Content-Type: multipart/form-data; boundary=---BOUNDARY @@ -14,14 +14,14 @@ content Response: 201 Created Content-Type: application/json; charset=UTF-8 -Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/35f93e8dd5484abb8b90687952c82010/bids/9161500fb17744ce90346052ddf8479c/documents/bdf03760f26641e6b662ddd1eb2e1e1f +Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/35f93e8dd5484abb8b90687952c82010/bids/799d983fc3ca4f18a3d22ead02ec7826/documents/bdf03760f26641e6b662ddd1eb2e1e1f { "data": { "hash": "md5:00000000000000000000000000000000", "confidentiality": "public", "language": "uk", "title": "Proposal.pdf", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/35f93e8dd5484abb8b90687952c82010/bids/9161500fb17744ce90346052ddf8479c/documents/bdf03760f26641e6b662ddd1eb2e1e1f?download=752bdc92fce4442596aec7342e050667", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/35f93e8dd5484abb8b90687952c82010/bids/799d983fc3ca4f18a3d22ead02ec7826/documents/bdf03760f26641e6b662ddd1eb2e1e1f?download=752bdc92fce4442596aec7342e050667", "format": "application/pdf", "isDescriptionDecision": false, "documentOf": "tender", diff --git a/docs/source/tendering/defense/http/active-cancellation.http b/docs/source/tendering/defense/http/active-cancellation.http index 7953dea8d8..48c251a507 100644 --- a/docs/source/tendering/defense/http/active-cancellation.http +++ b/docs/source/tendering/defense/http/active-cancellation.http @@ -1,4 +1,4 @@ -GET /api/2.5/tenders/127bd59fdd464def8d1189b954eefcbb/cancellations/08bc3af3063c4663afce27bd29226488?acc_token=78250e99c9974266933e656d51b30048 HTTP/1.0 +GET /api/2.5/tenders/127bd59fdd464def8d1189b954eefcbb/cancellations/104ab67eaa9e4bd1a1af508433066884?acc_token=78250e99c9974266933e656d51b30048 HTTP/1.0 Authorization: Bearer broker Host: lb-api-sandbox.prozorro.gov.ua @@ -39,7 +39,7 @@ Content-Type: application/json; charset=UTF-8 "reasonType": "unFixable", "date": "2020-05-26T01:00:05+03:00", "cancellationOf": "tender", - "id": "08bc3af3063c4663afce27bd29226488" + "id": "104ab67eaa9e4bd1a1af508433066884" } } diff --git a/docs/source/tendering/defense/http/answer-question.http b/docs/source/tendering/defense/http/answer-question.http index b2315dbc17..764bcc2388 100644 --- a/docs/source/tendering/defense/http/answer-question.http +++ b/docs/source/tendering/defense/http/answer-question.http @@ -1,4 +1,4 @@ -PATCH /api/2.5/tenders/127bd59fdd464def8d1189b954eefcbb/questions/d3803d4479ee43cc9ed13e8d5f59d394?acc_token=78250e99c9974266933e656d51b30048 HTTP/1.0 +PATCH /api/2.5/tenders/127bd59fdd464def8d1189b954eefcbb/questions/997d92880fb34795ab24da25cdd60c8a?acc_token=78250e99c9974266933e656d51b30048 HTTP/1.0 Authorization: Bearer broker Content-Length: 162 Content-Type: application/json @@ -19,7 +19,7 @@ Content-Type: application/json; charset=UTF-8 "title": "Калорійність", "date": "2020-05-15T01:00:00+03:00", "answer": "Таблицю додано в файлі \"Kalorijnist.xslx\"", - "id": "d3803d4479ee43cc9ed13e8d5f59d394", + "id": "997d92880fb34795ab24da25cdd60c8a", "questionOf": "tender" } } diff --git a/docs/source/tendering/defense/http/ask-question.http b/docs/source/tendering/defense/http/ask-question.http index a8a7ef24c8..8ac1145445 100644 --- a/docs/source/tendering/defense/http/ask-question.http +++ b/docs/source/tendering/defense/http/ask-question.http @@ -33,7 +33,7 @@ DATA: Response: 201 Created Content-Type: application/json; charset=UTF-8 -Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/127bd59fdd464def8d1189b954eefcbb/questions/d3803d4479ee43cc9ed13e8d5f59d394 +Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/127bd59fdd464def8d1189b954eefcbb/questions/997d92880fb34795ab24da25cdd60c8a { "data": { "description": "Просимо додати таблицю потрібної калорійності харчування", @@ -59,7 +59,7 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/127bd59fdd464def }, "title": "Калорійність", "date": "2020-05-15T01:00:00+03:00", - "id": "d3803d4479ee43cc9ed13e8d5f59d394", + "id": "997d92880fb34795ab24da25cdd60c8a", "questionOf": "tender" } } diff --git a/docs/source/tendering/defense/http/auction-url.http b/docs/source/tendering/defense/http/auction-url.http index a8eb3c7d03..8c9e24d3ac 100644 --- a/docs/source/tendering/defense/http/auction-url.http +++ b/docs/source/tendering/defense/http/auction-url.http @@ -15,8 +15,8 @@ Content-Type: application/json; charset=UTF-8 "auctionUrl": "http://auction-sandbox.prozorro.gov.ua/tenders/127bd59fdd464def8d1189b954eefcbb", "enquiryPeriod": { "startDate": "2020-04-29T01:00:01+03:00", - "clarificationsUntil": "2020-05-15T00:00:00+03:00", - "endDate": "2020-05-12T01:00:01+03:00", + "clarificationsUntil": "2020-05-14T00:00:00+03:00", + "endDate": "2020-05-12T00:00:00+03:00", "invalidationDate": "2020-05-15T01:00:01+03:00" }, "submissionMethod": "electronicAuction", @@ -49,7 +49,7 @@ Content-Type: application/json; charset=UTF-8 "title": "Калорійність", "date": "2020-05-15T01:00:00+03:00", "answer": "Таблицю додано в файлі \"Kalorijnist.xslx\"", - "id": "d3803d4479ee43cc9ed13e8d5f59d394", + "id": "997d92880fb34795ab24da25cdd60c8a", "questionOf": "tender" } ], @@ -131,7 +131,7 @@ Content-Type: application/json; charset=UTF-8 }, "percentage": 54.45, "type": "financing", - "id": "3f86a6cd00524bf9b6a2ceb1654234a2" + "id": "ca388d7e9a7b43b1857dd01b677e64be" } ], "minimalStep": { @@ -165,7 +165,7 @@ Content-Type: application/json; charset=UTF-8 "startDate": "2020-06-04T00:00:00+02:00", "endDate": "2020-07-04T00:00:00+02:00" }, - "id": "576b1d3783f148f9a65c2664ef759400", + "id": "c44dbd3e52ea497088ba82bff063bed9", "quantity": 1.0 } ], diff --git a/docs/source/tendering/defense/http/bidder-activate-after-changing-tender.http b/docs/source/tendering/defense/http/bidder-activate-after-changing-tender.http index 33972512ef..05558ea47c 100644 --- a/docs/source/tendering/defense/http/bidder-activate-after-changing-tender.http +++ b/docs/source/tendering/defense/http/bidder-activate-after-changing-tender.http @@ -1,4 +1,4 @@ -PATCH /api/2.5/tenders/127bd59fdd464def8d1189b954eefcbb/bids/0fa7c814dd0e42e3b1f8b4f2623ab07d?acc_token=d2f6e6c8a7a54d2cb138ef2ef5de765a HTTP/1.0 +PATCH /api/2.5/tenders/127bd59fdd464def8d1189b954eefcbb/bids/a97583e039614cc4b45231194304b231?acc_token=d2f6e6c8a7a54d2cb138ef2ef5de765a HTTP/1.0 Authorization: Bearer broker Content-Length: 30 Content-Type: application/json @@ -19,7 +19,7 @@ Content-Type: application/json; charset=UTF-8 { "hash": "md5:00000000000000000000000000000000", "title": "Proposal.pdf", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/127bd59fdd464def8d1189b954eefcbb/bids/0fa7c814dd0e42e3b1f8b4f2623ab07d/documents/c6096921d1ff45269d9b15a2b6013423?download=e57e684075ba45b286a6d9239862fef5", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/127bd59fdd464def8d1189b954eefcbb/bids/a97583e039614cc4b45231194304b231/documents/c6096921d1ff45269d9b15a2b6013423?download=e57e684075ba45b286a6d9239862fef5", "format": "application/pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:01+03:00", @@ -28,7 +28,7 @@ Content-Type: application/json; charset=UTF-8 } ], "selfEligible": true, - "id": "0fa7c814dd0e42e3b1f8b4f2623ab07d", + "id": "a97583e039614cc4b45231194304b231", "value": { "currency": "UAH", "amount": 500.0, diff --git a/docs/source/tendering/defense/http/bidder-after-changing-tender.http b/docs/source/tendering/defense/http/bidder-after-changing-tender.http index cfef1fc0e5..e67a2f7659 100644 --- a/docs/source/tendering/defense/http/bidder-after-changing-tender.http +++ b/docs/source/tendering/defense/http/bidder-after-changing-tender.http @@ -1,4 +1,4 @@ -GET /api/2.5/tenders/127bd59fdd464def8d1189b954eefcbb/bids/0fa7c814dd0e42e3b1f8b4f2623ab07d?acc_token=d2f6e6c8a7a54d2cb138ef2ef5de765a HTTP/1.0 +GET /api/2.5/tenders/127bd59fdd464def8d1189b954eefcbb/bids/a97583e039614cc4b45231194304b231?acc_token=d2f6e6c8a7a54d2cb138ef2ef5de765a HTTP/1.0 Authorization: Bearer broker Host: lb-api-sandbox.prozorro.gov.ua @@ -7,7 +7,7 @@ Content-Type: application/json; charset=UTF-8 { "data": { "status": "invalid", - "id": "0fa7c814dd0e42e3b1f8b4f2623ab07d" + "id": "a97583e039614cc4b45231194304b231" } } diff --git a/docs/source/tendering/defense/http/bidder-documents.http b/docs/source/tendering/defense/http/bidder-documents.http index 268f62b770..9579dc852c 100644 --- a/docs/source/tendering/defense/http/bidder-documents.http +++ b/docs/source/tendering/defense/http/bidder-documents.http @@ -1,4 +1,4 @@ -GET /api/2.5/tenders/127bd59fdd464def8d1189b954eefcbb/bids/0fa7c814dd0e42e3b1f8b4f2623ab07d/documents?acc_token=d2f6e6c8a7a54d2cb138ef2ef5de765a HTTP/1.0 +GET /api/2.5/tenders/127bd59fdd464def8d1189b954eefcbb/bids/a97583e039614cc4b45231194304b231/documents?acc_token=d2f6e6c8a7a54d2cb138ef2ef5de765a HTTP/1.0 Authorization: Bearer broker Host: lb-api-sandbox.prozorro.gov.ua @@ -9,7 +9,7 @@ Content-Type: application/json; charset=UTF-8 { "hash": "md5:00000000000000000000000000000000", "title": "Proposal.pdf", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/127bd59fdd464def8d1189b954eefcbb/bids/0fa7c814dd0e42e3b1f8b4f2623ab07d/documents/c6096921d1ff45269d9b15a2b6013423?download=e57e684075ba45b286a6d9239862fef5", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/127bd59fdd464def8d1189b954eefcbb/bids/a97583e039614cc4b45231194304b231/documents/c6096921d1ff45269d9b15a2b6013423?download=e57e684075ba45b286a6d9239862fef5", "format": "application/pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:01+03:00", diff --git a/docs/source/tendering/defense/http/bidder-participation-url.http b/docs/source/tendering/defense/http/bidder-participation-url.http index 33c9ca8dba..fc839dbdd3 100644 --- a/docs/source/tendering/defense/http/bidder-participation-url.http +++ b/docs/source/tendering/defense/http/bidder-participation-url.http @@ -1,4 +1,4 @@ -GET /api/2.5/tenders/127bd59fdd464def8d1189b954eefcbb/bids/0fa7c814dd0e42e3b1f8b4f2623ab07d?acc_token=d2f6e6c8a7a54d2cb138ef2ef5de765a HTTP/1.0 +GET /api/2.5/tenders/127bd59fdd464def8d1189b954eefcbb/bids/a97583e039614cc4b45231194304b231?acc_token=d2f6e6c8a7a54d2cb138ef2ef5de765a HTTP/1.0 Authorization: Bearer broker Host: lb-api-sandbox.prozorro.gov.ua @@ -11,7 +11,7 @@ Content-Type: application/json; charset=UTF-8 { "hash": "md5:00000000000000000000000000000000", "title": "Proposal.pdf", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/127bd59fdd464def8d1189b954eefcbb/bids/0fa7c814dd0e42e3b1f8b4f2623ab07d/documents/c6096921d1ff45269d9b15a2b6013423?download=e57e684075ba45b286a6d9239862fef5", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/127bd59fdd464def8d1189b954eefcbb/bids/a97583e039614cc4b45231194304b231/documents/c6096921d1ff45269d9b15a2b6013423?download=e57e684075ba45b286a6d9239862fef5", "format": "application/pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:01+03:00", @@ -20,7 +20,7 @@ Content-Type: application/json; charset=UTF-8 } ], "selfEligible": true, - "id": "0fa7c814dd0e42e3b1f8b4f2623ab07d", + "id": "a97583e039614cc4b45231194304b231", "value": { "currency": "UAH", "amount": 500.0, @@ -52,7 +52,7 @@ Content-Type: application/json; charset=UTF-8 ], "date": "2020-05-15T01:00:01+03:00", "selfQualified": true, - "participationUrl": "http://auction-sandbox.prozorro.gov.ua/tenders/127bd59fdd464def8d1189b954eefcbb?key_for_bid=0fa7c814dd0e42e3b1f8b4f2623ab07d" + "participationUrl": "http://auction-sandbox.prozorro.gov.ua/tenders/127bd59fdd464def8d1189b954eefcbb?key_for_bid=a97583e039614cc4b45231194304b231" } } diff --git a/docs/source/tendering/defense/http/bidder2-participation-url.http b/docs/source/tendering/defense/http/bidder2-participation-url.http index 8f1eff8c38..005adb1a2a 100644 --- a/docs/source/tendering/defense/http/bidder2-participation-url.http +++ b/docs/source/tendering/defense/http/bidder2-participation-url.http @@ -1,4 +1,4 @@ -GET /api/2.5/tenders/127bd59fdd464def8d1189b954eefcbb/bids/7e335c57715e407da04305d26eb0bb90?acc_token=bbf4baf749f54990802f4c33f55e7fae HTTP/1.0 +GET /api/2.5/tenders/127bd59fdd464def8d1189b954eefcbb/bids/844a8e0cf0f14d1bb310d7046066f966?acc_token=bbf4baf749f54990802f4c33f55e7fae HTTP/1.0 Authorization: Bearer broker Host: lb-api-sandbox.prozorro.gov.ua @@ -13,7 +13,7 @@ Content-Type: application/json; charset=UTF-8 "amount": 499.0, "valueAddedTaxIncluded": true }, - "id": "7e335c57715e407da04305d26eb0bb90", + "id": "844a8e0cf0f14d1bb310d7046066f966", "tenderers": [ { "contactPoint": { @@ -39,7 +39,7 @@ Content-Type: application/json; charset=UTF-8 ], "date": "2020-05-15T01:00:01+03:00", "selfQualified": true, - "participationUrl": "http://auction-sandbox.prozorro.gov.ua/tenders/127bd59fdd464def8d1189b954eefcbb?key_for_bid=7e335c57715e407da04305d26eb0bb90" + "participationUrl": "http://auction-sandbox.prozorro.gov.ua/tenders/127bd59fdd464def8d1189b954eefcbb?key_for_bid=844a8e0cf0f14d1bb310d7046066f966" } } diff --git a/docs/source/tendering/defense/http/blank-tender-view.http b/docs/source/tendering/defense/http/blank-tender-view.http index 06084f7ec9..0eadf5ead3 100644 --- a/docs/source/tendering/defense/http/blank-tender-view.http +++ b/docs/source/tendering/defense/http/blank-tender-view.http @@ -10,7 +10,7 @@ Content-Type: application/json; charset=UTF-8 "mainProcurementCategory": "services", "complaintPeriod": { "startDate": "2020-05-15T01:00:00+03:00", - "endDate": "2020-06-08T00:00:00+02:00" + "endDate": "2020-06-05T00:00:00+02:00" }, "enquiryPeriod": { "startDate": "2020-05-15T01:00:00+03:00", @@ -78,7 +78,7 @@ Content-Type: application/json; charset=UTF-8 }, "percentage": 54.45, "type": "financing", - "id": "3f86a6cd00524bf9b6a2ceb1654234a2" + "id": "ca388d7e9a7b43b1857dd01b677e64be" } ], "minimalStep": { @@ -112,7 +112,7 @@ Content-Type: application/json; charset=UTF-8 "startDate": "2020-06-04T00:00:00+02:00", "endDate": "2020-07-04T00:00:00+02:00" }, - "id": "576b1d3783f148f9a65c2664ef759400", + "id": "c44dbd3e52ea497088ba82bff063bed9", "quantity": 1.0 } ], diff --git a/docs/source/tendering/defense/http/confirm-qualification.http b/docs/source/tendering/defense/http/confirm-qualification.http index 6c3b2f9df1..b87fa5ecde 100644 --- a/docs/source/tendering/defense/http/confirm-qualification.http +++ b/docs/source/tendering/defense/http/confirm-qualification.http @@ -45,7 +45,7 @@ Content-Type: application/json; charset=UTF-8 "startDate": "2020-05-15T01:00:01+03:00", "endDate": "2020-05-22T00:00:00+03:00" }, - "bid_id": "7e335c57715e407da04305d26eb0bb90", + "bid_id": "844a8e0cf0f14d1bb310d7046066f966", "value": { "currency": "UAH", "amount": 499.0, diff --git a/docs/source/tendering/defense/http/get-answer.http b/docs/source/tendering/defense/http/get-answer.http index dc2b52653c..cb18d37bf6 100644 --- a/docs/source/tendering/defense/http/get-answer.http +++ b/docs/source/tendering/defense/http/get-answer.http @@ -1,4 +1,4 @@ -GET /api/2.5/tenders/127bd59fdd464def8d1189b954eefcbb/questions/d3803d4479ee43cc9ed13e8d5f59d394 HTTP/1.0 +GET /api/2.5/tenders/127bd59fdd464def8d1189b954eefcbb/questions/997d92880fb34795ab24da25cdd60c8a HTTP/1.0 Authorization: Bearer broker Host: lb-api-sandbox.prozorro.gov.ua @@ -11,7 +11,7 @@ Content-Type: application/json; charset=UTF-8 "title": "Калорійність", "date": "2020-05-15T01:00:00+03:00", "answer": "Таблицю додано в файлі \"Kalorijnist.xslx\"", - "id": "d3803d4479ee43cc9ed13e8d5f59d394", + "id": "997d92880fb34795ab24da25cdd60c8a", "questionOf": "tender" } } diff --git a/docs/source/tendering/defense/http/list-question.http b/docs/source/tendering/defense/http/list-question.http index c0c260b57b..1a1d9ab772 100644 --- a/docs/source/tendering/defense/http/list-question.http +++ b/docs/source/tendering/defense/http/list-question.http @@ -12,7 +12,7 @@ Content-Type: application/json; charset=UTF-8 "title": "Калорійність", "date": "2020-05-15T01:00:00+03:00", "answer": "Таблицю додано в файлі \"Kalorijnist.xslx\"", - "id": "d3803d4479ee43cc9ed13e8d5f59d394", + "id": "997d92880fb34795ab24da25cdd60c8a", "questionOf": "tender" } ] diff --git a/docs/source/tendering/defense/http/patch-cancellation.http b/docs/source/tendering/defense/http/patch-cancellation.http index b83b516969..d49791c04f 100644 --- a/docs/source/tendering/defense/http/patch-cancellation.http +++ b/docs/source/tendering/defense/http/patch-cancellation.http @@ -1,4 +1,4 @@ -PATCH /api/2.5/tenders/127bd59fdd464def8d1189b954eefcbb/cancellations/08bc3af3063c4663afce27bd29226488/documents/a07c11ed15064e1bad53c031eaad847c?acc_token=78250e99c9974266933e656d51b30048 HTTP/1.0 +PATCH /api/2.5/tenders/127bd59fdd464def8d1189b954eefcbb/cancellations/104ab67eaa9e4bd1a1af508433066884/documents/a07c11ed15064e1bad53c031eaad847c?acc_token=78250e99c9974266933e656d51b30048 HTTP/1.0 Authorization: Bearer broker Content-Length: 48 Content-Type: application/json diff --git a/docs/source/tendering/defense/http/patch-items-value-periods.http b/docs/source/tendering/defense/http/patch-items-value-periods.http index fcd30c142c..bb8cae62f8 100644 --- a/docs/source/tendering/defense/http/patch-items-value-periods.http +++ b/docs/source/tendering/defense/http/patch-items-value-periods.http @@ -7,7 +7,7 @@ DATA: { "data": { "tenderPeriod": { - "endDate": "2020-05-30T01:00:10+03:00" + "endDate": "2020-05-31T01:00:00+03:00" } } } @@ -29,7 +29,7 @@ Content-Type: application/json; charset=UTF-8 "invalidationDate": "2020-05-15T01:00:00+03:00" }, "submissionMethod": "electronicAuction", - "next_check": "2020-05-30T01:00:10+03:00", + "next_check": "2020-05-31T01:00:00+03:00", "procuringEntity": { "contactPoint": { "url": "http://sch10.edu.vn.ua/", @@ -59,10 +59,10 @@ Content-Type: application/json; charset=UTF-8 "status": "active.tendering", "tenderPeriod": { "startDate": "2020-05-15T01:00:00+03:00", - "endDate": "2020-05-30T01:00:10+03:00" + "endDate": "2020-05-31T01:00:00+03:00" }, "auctionPeriod": { - "shouldStartAfter": "2020-05-31T00:00:00+03:00" + "shouldStartAfter": "2020-06-01T00:00:00+03:00" }, "procurementMethodType": "aboveThresholdUA.defense", "date": "2020-05-15T01:00:00+03:00", @@ -89,7 +89,7 @@ Content-Type: application/json; charset=UTF-8 }, "percentage": 54.45, "type": "financing", - "id": "3f86a6cd00524bf9b6a2ceb1654234a2" + "id": "ca388d7e9a7b43b1857dd01b677e64be" } ], "minimalStep": { @@ -123,7 +123,7 @@ Content-Type: application/json; charset=UTF-8 "startDate": "2020-06-04T00:00:00+02:00", "endDate": "2020-07-04T00:00:00+02:00" }, - "id": "576b1d3783f148f9a65c2664ef759400", + "id": "c44dbd3e52ea497088ba82bff063bed9", "quantity": 1.0 } ], diff --git a/docs/source/tendering/defense/http/pending-cancellation.http b/docs/source/tendering/defense/http/pending-cancellation.http index 0cb8afeb2e..591ec4bcc5 100644 --- a/docs/source/tendering/defense/http/pending-cancellation.http +++ b/docs/source/tendering/defense/http/pending-cancellation.http @@ -1,4 +1,4 @@ -PATCH /api/2.5/tenders/127bd59fdd464def8d1189b954eefcbb/cancellations/08bc3af3063c4663afce27bd29226488?acc_token=78250e99c9974266933e656d51b30048 HTTP/1.0 +PATCH /api/2.5/tenders/127bd59fdd464def8d1189b954eefcbb/cancellations/104ab67eaa9e4bd1a1af508433066884?acc_token=78250e99c9974266933e656d51b30048 HTTP/1.0 Authorization: Bearer broker Content-Length: 31 Content-Type: application/json @@ -47,7 +47,7 @@ Content-Type: application/json; charset=UTF-8 "reasonType": "unFixable", "date": "2020-05-15T01:00:03+03:00", "cancellationOf": "tender", - "id": "08bc3af3063c4663afce27bd29226488" + "id": "104ab67eaa9e4bd1a1af508433066884" } } diff --git a/docs/source/tendering/defense/http/prepare-cancellation.http b/docs/source/tendering/defense/http/prepare-cancellation.http index 33b5fa02de..59347dd586 100644 --- a/docs/source/tendering/defense/http/prepare-cancellation.http +++ b/docs/source/tendering/defense/http/prepare-cancellation.http @@ -13,7 +13,7 @@ DATA: Response: 201 Created Content-Type: application/json; charset=UTF-8 -Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/127bd59fdd464def8d1189b954eefcbb/cancellations/08bc3af3063c4663afce27bd29226488 +Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/127bd59fdd464def8d1189b954eefcbb/cancellations/104ab67eaa9e4bd1a1af508433066884 { "data": { "status": "draft", @@ -21,7 +21,7 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/127bd59fdd464def "reasonType": "noDemand", "date": "2020-05-15T01:00:03+03:00", "cancellationOf": "tender", - "id": "08bc3af3063c4663afce27bd29226488" + "id": "104ab67eaa9e4bd1a1af508433066884" } } diff --git a/docs/source/tendering/defense/http/register-2nd-bidder.http b/docs/source/tendering/defense/http/register-2nd-bidder.http index 110da2feaf..821ea6a575 100644 --- a/docs/source/tendering/defense/http/register-2nd-bidder.http +++ b/docs/source/tendering/defense/http/register-2nd-bidder.http @@ -39,7 +39,7 @@ DATA: Response: 201 Created Content-Type: application/json; charset=UTF-8 -Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/127bd59fdd464def8d1189b954eefcbb/bids/7e335c57715e407da04305d26eb0bb90 +Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/127bd59fdd464def8d1189b954eefcbb/bids/844a8e0cf0f14d1bb310d7046066f966 { "access": { "transfer": "f349d3fec1284796be806de9b698acd6", @@ -78,7 +78,7 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/127bd59fdd464def } ], "date": "2020-05-15T01:00:01+03:00", - "id": "7e335c57715e407da04305d26eb0bb90" + "id": "844a8e0cf0f14d1bb310d7046066f966" } } diff --git a/docs/source/tendering/defense/http/register-bidder.http b/docs/source/tendering/defense/http/register-bidder.http index f9976cee55..c5c65768fd 100644 --- a/docs/source/tendering/defense/http/register-bidder.http +++ b/docs/source/tendering/defense/http/register-bidder.http @@ -40,7 +40,7 @@ DATA: Response: 201 Created Content-Type: application/json; charset=UTF-8 -Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/127bd59fdd464def8d1189b954eefcbb/bids/0fa7c814dd0e42e3b1f8b4f2623ab07d +Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/127bd59fdd464def8d1189b954eefcbb/bids/a97583e039614cc4b45231194304b231 { "access": { "transfer": "d5756578a82f48fba71a9186e94a15de", @@ -49,7 +49,7 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/127bd59fdd464def "data": { "status": "active", "selfEligible": true, - "id": "0fa7c814dd0e42e3b1f8b4f2623ab07d", + "id": "a97583e039614cc4b45231194304b231", "value": { "currency": "UAH", "amount": 500.0, diff --git a/docs/source/tendering/defense/http/set-bid-guarantee.http b/docs/source/tendering/defense/http/set-bid-guarantee.http index 19f32b32ec..840748d279 100644 --- a/docs/source/tendering/defense/http/set-bid-guarantee.http +++ b/docs/source/tendering/defense/http/set-bid-guarantee.http @@ -30,7 +30,7 @@ Content-Type: application/json; charset=UTF-8 "invalidationDate": "2020-05-15T01:00:00+03:00" }, "submissionMethod": "electronicAuction", - "next_check": "2020-05-30T01:00:10+03:00", + "next_check": "2020-05-31T01:00:00+03:00", "procuringEntity": { "contactPoint": { "url": "http://sch10.edu.vn.ua/", @@ -64,10 +64,10 @@ Content-Type: application/json; charset=UTF-8 "status": "active.tendering", "tenderPeriod": { "startDate": "2020-05-15T01:00:00+03:00", - "endDate": "2020-05-30T01:00:10+03:00" + "endDate": "2020-05-31T01:00:00+03:00" }, "auctionPeriod": { - "shouldStartAfter": "2020-05-31T00:00:00+03:00" + "shouldStartAfter": "2020-06-01T00:00:00+03:00" }, "procurementMethodType": "aboveThresholdUA.defense", "date": "2020-05-15T01:00:00+03:00", @@ -94,7 +94,7 @@ Content-Type: application/json; charset=UTF-8 }, "percentage": 54.45, "type": "financing", - "id": "3f86a6cd00524bf9b6a2ceb1654234a2" + "id": "ca388d7e9a7b43b1857dd01b677e64be" } ], "minimalStep": { @@ -128,7 +128,7 @@ Content-Type: application/json; charset=UTF-8 "startDate": "2020-06-04T00:00:00+02:00", "endDate": "2020-07-04T00:00:00+02:00" }, - "id": "576b1d3783f148f9a65c2664ef759400", + "id": "c44dbd3e52ea497088ba82bff063bed9", "quantity": 1.0 } ], diff --git a/docs/source/tendering/defense/http/tender-contract-get.http b/docs/source/tendering/defense/http/tender-contract-get.http index eef9169ad6..9ddd7ce6c9 100644 --- a/docs/source/tendering/defense/http/tender-contract-get.http +++ b/docs/source/tendering/defense/http/tender-contract-get.http @@ -45,7 +45,7 @@ Content-Type: application/json; charset=UTF-8 "startDate": "2020-06-04T00:00:00+02:00", "endDate": "2020-07-04T00:00:00+02:00" }, - "id": "576b1d3783f148f9a65c2664ef759400", + "id": "c44dbd3e52ea497088ba82bff063bed9", "quantity": 1.0 } ], diff --git a/docs/source/tendering/defense/http/tender-contract-period.http b/docs/source/tendering/defense/http/tender-contract-period.http index 8f6f0c552f..939f4dcb45 100644 --- a/docs/source/tendering/defense/http/tender-contract-period.http +++ b/docs/source/tendering/defense/http/tender-contract-period.http @@ -44,7 +44,7 @@ Content-Type: application/json; charset=UTF-8 "startDate": "2020-06-04T00:00:00+02:00", "endDate": "2020-07-04T00:00:00+02:00" }, - "id": "576b1d3783f148f9a65c2664ef759400", + "id": "c44dbd3e52ea497088ba82bff063bed9", "quantity": 1.0 } ], diff --git a/docs/source/tendering/defense/http/tender-contract-set-contract-value.http b/docs/source/tendering/defense/http/tender-contract-set-contract-value.http index 0a0b8c0424..fcbf05b328 100644 --- a/docs/source/tendering/defense/http/tender-contract-set-contract-value.http +++ b/docs/source/tendering/defense/http/tender-contract-set-contract-value.http @@ -44,7 +44,7 @@ Content-Type: application/json; charset=UTF-8 "startDate": "2020-06-04T00:00:00+02:00", "endDate": "2020-07-04T00:00:00+02:00" }, - "id": "576b1d3783f148f9a65c2664ef759400", + "id": "c44dbd3e52ea497088ba82bff063bed9", "quantity": 1.0 } ], diff --git a/docs/source/tendering/defense/http/tender-contract-sign-date.http b/docs/source/tendering/defense/http/tender-contract-sign-date.http index 035e327c0c..e83358e484 100644 --- a/docs/source/tendering/defense/http/tender-contract-sign-date.http +++ b/docs/source/tendering/defense/http/tender-contract-sign-date.http @@ -41,7 +41,7 @@ Content-Type: application/json; charset=UTF-8 "startDate": "2020-06-04T00:00:00+02:00", "endDate": "2020-07-04T00:00:00+02:00" }, - "id": "576b1d3783f148f9a65c2664ef759400", + "id": "c44dbd3e52ea497088ba82bff063bed9", "quantity": 1.0 } ], diff --git a/docs/source/tendering/defense/http/tender-post-attempt-json-data.http b/docs/source/tendering/defense/http/tender-post-attempt-json-data.http index f7cd9b8ac7..b9fef2265b 100644 --- a/docs/source/tendering/defense/http/tender-post-attempt-json-data.http +++ b/docs/source/tendering/defense/http/tender-post-attempt-json-data.http @@ -111,7 +111,7 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/0ef1a1deea644023 "mainProcurementCategory": "services", "complaintPeriod": { "startDate": "2020-05-26T01:00:05+03:00", - "endDate": "2020-06-08T00:00:00+02:00" + "endDate": "2020-06-05T00:00:00+02:00" }, "enquiryPeriod": { "startDate": "2020-05-26T01:00:05+03:00", @@ -179,7 +179,7 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/0ef1a1deea644023 }, "percentage": 54.45, "type": "financing", - "id": "a50e33f33efd425b8163c37e29d0b703" + "id": "6463f3b0c39d454da8ba49f5c1e050d1" } ], "minimalStep": { @@ -213,7 +213,7 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/0ef1a1deea644023 "startDate": "2020-06-04T00:00:00+02:00", "endDate": "2020-07-04T00:00:00+02:00" }, - "id": "3e31bf63ae7f476c954365433280bdd7", + "id": "a1485588dd194c258efdd9df84e636ff", "quantity": 1.0 } ], diff --git a/docs/source/tendering/defense/http/update-cancellation-doc.http b/docs/source/tendering/defense/http/update-cancellation-doc.http index 3c622dce6f..c95be419ad 100644 --- a/docs/source/tendering/defense/http/update-cancellation-doc.http +++ b/docs/source/tendering/defense/http/update-cancellation-doc.http @@ -1,4 +1,4 @@ -PUT /api/2.5/tenders/127bd59fdd464def8d1189b954eefcbb/cancellations/08bc3af3063c4663afce27bd29226488/documents/a07c11ed15064e1bad53c031eaad847c?acc_token=78250e99c9974266933e656d51b30048 HTTP/1.0 +PUT /api/2.5/tenders/127bd59fdd464def8d1189b954eefcbb/cancellations/104ab67eaa9e4bd1a1af508433066884/documents/a07c11ed15064e1bad53c031eaad847c?acc_token=78250e99c9974266933e656d51b30048 HTTP/1.0 Authorization: Bearer broker Content-Length: 145 Content-Type: multipart/form-data; boundary=---BOUNDARY diff --git a/docs/source/tendering/defense/http/update-cancellation-reasonType.http b/docs/source/tendering/defense/http/update-cancellation-reasonType.http index 8a4bd6bef5..436760937d 100644 --- a/docs/source/tendering/defense/http/update-cancellation-reasonType.http +++ b/docs/source/tendering/defense/http/update-cancellation-reasonType.http @@ -1,4 +1,4 @@ -PATCH /api/2.5/tenders/127bd59fdd464def8d1189b954eefcbb/cancellations/08bc3af3063c4663afce27bd29226488?acc_token=78250e99c9974266933e656d51b30048 HTTP/1.0 +PATCH /api/2.5/tenders/127bd59fdd464def8d1189b954eefcbb/cancellations/104ab67eaa9e4bd1a1af508433066884?acc_token=78250e99c9974266933e656d51b30048 HTTP/1.0 Authorization: Bearer broker Content-Length: 37 Content-Type: application/json @@ -19,7 +19,7 @@ Content-Type: application/json; charset=UTF-8 "reasonType": "unFixable", "date": "2020-05-15T01:00:03+03:00", "cancellationOf": "tender", - "id": "08bc3af3063c4663afce27bd29226488" + "id": "104ab67eaa9e4bd1a1af508433066884" } } diff --git a/docs/source/tendering/defense/http/update-tender-after-enqiery-with-update-periods.http b/docs/source/tendering/defense/http/update-tender-after-enqiery-with-update-periods.http index 413ad582d0..094c8fa289 100644 --- a/docs/source/tendering/defense/http/update-tender-after-enqiery-with-update-periods.http +++ b/docs/source/tendering/defense/http/update-tender-after-enqiery-with-update-periods.http @@ -62,7 +62,7 @@ Content-Type: application/json; charset=UTF-8 "title": "Калорійність", "date": "2020-05-15T01:00:00+03:00", "answer": "Таблицю додано в файлі \"Kalorijnist.xslx\"", - "id": "d3803d4479ee43cc9ed13e8d5f59d394", + "id": "997d92880fb34795ab24da25cdd60c8a", "questionOf": "tender" } ], @@ -144,7 +144,7 @@ Content-Type: application/json; charset=UTF-8 }, "percentage": 54.45, "type": "financing", - "id": "3f86a6cd00524bf9b6a2ceb1654234a2" + "id": "ca388d7e9a7b43b1857dd01b677e64be" } ], "minimalStep": { @@ -178,7 +178,7 @@ Content-Type: application/json; charset=UTF-8 "startDate": "2020-06-04T00:00:00+02:00", "endDate": "2020-07-04T00:00:00+02:00" }, - "id": "576b1d3783f148f9a65c2664ef759400", + "id": "c44dbd3e52ea497088ba82bff063bed9", "quantity": 1.0 } ], diff --git a/docs/source/tendering/defense/http/upload-bid-proposal.http b/docs/source/tendering/defense/http/upload-bid-proposal.http index de8b2cdc68..fa5e2d9a4f 100644 --- a/docs/source/tendering/defense/http/upload-bid-proposal.http +++ b/docs/source/tendering/defense/http/upload-bid-proposal.http @@ -1,4 +1,4 @@ -POST /api/2.5/tenders/127bd59fdd464def8d1189b954eefcbb/bids/0fa7c814dd0e42e3b1f8b4f2623ab07d/documents?acc_token=d2f6e6c8a7a54d2cb138ef2ef5de765a HTTP/1.0 +POST /api/2.5/tenders/127bd59fdd464def8d1189b954eefcbb/bids/a97583e039614cc4b45231194304b231/documents?acc_token=d2f6e6c8a7a54d2cb138ef2ef5de765a HTTP/1.0 Authorization: Bearer broker Content-Length: 144 Content-Type: multipart/form-data; boundary=---BOUNDARY @@ -14,12 +14,12 @@ content Response: 201 Created Content-Type: application/json; charset=UTF-8 -Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/127bd59fdd464def8d1189b954eefcbb/bids/0fa7c814dd0e42e3b1f8b4f2623ab07d/documents/c6096921d1ff45269d9b15a2b6013423 +Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/127bd59fdd464def8d1189b954eefcbb/bids/a97583e039614cc4b45231194304b231/documents/c6096921d1ff45269d9b15a2b6013423 { "data": { "hash": "md5:00000000000000000000000000000000", "title": "Proposal.pdf", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/127bd59fdd464def8d1189b954eefcbb/bids/0fa7c814dd0e42e3b1f8b4f2623ab07d/documents/c6096921d1ff45269d9b15a2b6013423?download=e57e684075ba45b286a6d9239862fef5", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/127bd59fdd464def8d1189b954eefcbb/bids/a97583e039614cc4b45231194304b231/documents/c6096921d1ff45269d9b15a2b6013423?download=e57e684075ba45b286a6d9239862fef5", "format": "application/pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:01+03:00", diff --git a/docs/source/tendering/defense/http/upload-cancellation-doc.http b/docs/source/tendering/defense/http/upload-cancellation-doc.http index d8511f16c5..6bdd02acbd 100644 --- a/docs/source/tendering/defense/http/upload-cancellation-doc.http +++ b/docs/source/tendering/defense/http/upload-cancellation-doc.http @@ -1,4 +1,4 @@ -POST /api/2.5/tenders/127bd59fdd464def8d1189b954eefcbb/cancellations/08bc3af3063c4663afce27bd29226488/documents?acc_token=78250e99c9974266933e656d51b30048 HTTP/1.0 +POST /api/2.5/tenders/127bd59fdd464def8d1189b954eefcbb/cancellations/104ab67eaa9e4bd1a1af508433066884/documents?acc_token=78250e99c9974266933e656d51b30048 HTTP/1.0 Authorization: Bearer broker Content-Length: 142 Content-Type: multipart/form-data; boundary=---BOUNDARY @@ -14,7 +14,7 @@ content Response: 201 Created Content-Type: application/json; charset=UTF-8 -Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/127bd59fdd464def8d1189b954eefcbb/cancellations/08bc3af3063c4663afce27bd29226488/documents/a07c11ed15064e1bad53c031eaad847c +Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/127bd59fdd464def8d1189b954eefcbb/cancellations/104ab67eaa9e4bd1a1af508433066884/documents/a07c11ed15064e1bad53c031eaad847c { "data": { "hash": "md5:00000000000000000000000000000000", diff --git a/docs/source/tendering/esco/multiple_lots_tutorial/bid-lot1-invalid-view.http b/docs/source/tendering/esco/multiple_lots_tutorial/bid-lot1-invalid-view.http index 8f4bf824e6..75530641af 100644 --- a/docs/source/tendering/esco/multiple_lots_tutorial/bid-lot1-invalid-view.http +++ b/docs/source/tendering/esco/multiple_lots_tutorial/bid-lot1-invalid-view.http @@ -1,4 +1,4 @@ -GET /api/2.5/tenders/db8f78603c144a8aac15730f9c763584/bids/b797c74bba014457870ceda8104f0444?acc_token=0949a68ffd9a4f4cbb1747d304615609 HTTP/1.0 +GET /api/2.5/tenders/db8f78603c144a8aac15730f9c763584/bids/6439ffe4a7324e8abdcf7d68874fb6b8?acc_token=0949a68ffd9a4f4cbb1747d304615609 HTTP/1.0 Authorization: Bearer broker Host: lb-api-sandbox.prozorro.gov.ua @@ -7,7 +7,7 @@ Content-Type: application/json; charset=UTF-8 { "data": { "status": "invalid", - "id": "b797c74bba014457870ceda8104f0444" + "id": "6439ffe4a7324e8abdcf7d68874fb6b8" } } diff --git a/docs/source/tendering/esco/multiple_lots_tutorial/bid-lot1-update-view.http b/docs/source/tendering/esco/multiple_lots_tutorial/bid-lot1-update-view.http index 5a164dfb7c..9259b60d65 100644 --- a/docs/source/tendering/esco/multiple_lots_tutorial/bid-lot1-update-view.http +++ b/docs/source/tendering/esco/multiple_lots_tutorial/bid-lot1-update-view.http @@ -1,4 +1,4 @@ -PATCH /api/2.5/tenders/db8f78603c144a8aac15730f9c763584/bids/b797c74bba014457870ceda8104f0444?acc_token=0949a68ffd9a4f4cbb1747d304615609 HTTP/1.0 +PATCH /api/2.5/tenders/db8f78603c144a8aac15730f9c763584/bids/6439ffe4a7324e8abdcf7d68874fb6b8?acc_token=0949a68ffd9a4f4cbb1747d304615609 HTTP/1.0 Authorization: Bearer broker Content-Length: 214 Content-Type: application/json @@ -9,7 +9,7 @@ DATA: "status": "pending", "lotValues": [ { - "relatedLot": "3c84167877eb48d693c12efd2c6cb01e", + "relatedLot": "45d538b502bd4124bff52a374958e9ea", "value": { "amount": 500 }, @@ -24,10 +24,9 @@ Content-Type: application/json; charset=UTF-8 { "data": { "status": "pending", - "selfEligible": true, "lotValues": [ { - "relatedLot": "3c84167877eb48d693c12efd2c6cb01e", + "relatedLot": "45d538b502bd4124bff52a374958e9ea", "date": "2020-05-15T01:00:00+03:00", "status": "pending", "value": { @@ -67,7 +66,7 @@ Content-Type: application/json; charset=UTF-8 "subcontractingDetails": "ДКП «Орфей»" } ], - "selfQualified": true, + "id": "6439ffe4a7324e8abdcf7d68874fb6b8", "tenderers": [ { "contactPoint": { @@ -92,7 +91,7 @@ Content-Type: application/json; charset=UTF-8 } ], "date": "2020-05-15T01:00:00+03:00", - "id": "b797c74bba014457870ceda8104f0444" + "selfQualified": true } } diff --git a/docs/source/tendering/esco/multiple_lots_tutorial/bid-lot1.http b/docs/source/tendering/esco/multiple_lots_tutorial/bid-lot1.http index c35995308e..a416763e4d 100644 --- a/docs/source/tendering/esco/multiple_lots_tutorial/bid-lot1.http +++ b/docs/source/tendering/esco/multiple_lots_tutorial/bid-lot1.http @@ -1,16 +1,15 @@ POST /api/2.5/tenders/db8f78603c144a8aac15730f9c763584/bids HTTP/1.0 Authorization: Bearer broker -Content-Length: 1253 +Content-Length: 1231 Content-Type: application/json Host: lb-api-sandbox.prozorro.gov.ua DATA: { "data": { - "selfEligible": true, "selfQualified": true, "lotValues": [ { - "relatedLot": "3c84167877eb48d693c12efd2c6cb01e", + "relatedLot": "45d538b502bd4124bff52a374958e9ea", "value": { "contractDuration": { "years": 7 @@ -71,7 +70,7 @@ DATA: Response: 201 Created Content-Type: application/json; charset=UTF-8 -Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/db8f78603c144a8aac15730f9c763584/bids/b797c74bba014457870ceda8104f0444 +Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/db8f78603c144a8aac15730f9c763584/bids/6439ffe4a7324e8abdcf7d68874fb6b8 { "access": { "transfer": "f8ae0b8f83d149c1bc2b327a031682e7", @@ -79,10 +78,9 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/db8f78603c144a8a }, "data": { "status": "pending", - "selfEligible": true, "lotValues": [ { - "relatedLot": "3c84167877eb48d693c12efd2c6cb01e", + "relatedLot": "45d538b502bd4124bff52a374958e9ea", "date": "2020-05-15T01:00:00+03:00", "status": "pending", "value": { @@ -122,7 +120,7 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/db8f78603c144a8a "subcontractingDetails": "ДКП «Орфей», Україна" } ], - "selfQualified": true, + "id": "6439ffe4a7324e8abdcf7d68874fb6b8", "tenderers": [ { "contactPoint": { @@ -147,7 +145,7 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/db8f78603c144a8a } ], "date": "2020-05-15T01:00:00+03:00", - "id": "b797c74bba014457870ceda8104f0444" + "selfQualified": true } } diff --git a/docs/source/tendering/esco/multiple_lots_tutorial/bid-lot2-update-view.http b/docs/source/tendering/esco/multiple_lots_tutorial/bid-lot2-update-view.http index 96b2a50d6f..14d858d536 100644 --- a/docs/source/tendering/esco/multiple_lots_tutorial/bid-lot2-update-view.http +++ b/docs/source/tendering/esco/multiple_lots_tutorial/bid-lot2-update-view.http @@ -1,4 +1,4 @@ -PATCH /api/2.5/tenders/db8f78603c144a8aac15730f9c763584/bids/e330641f19174449b434b4988cccf0c6?acc_token=1eefabf7d7e741df9f88509718bac900 HTTP/1.0 +PATCH /api/2.5/tenders/db8f78603c144a8aac15730f9c763584/bids/c036a6fb3127425ca2dc1bd343aad078?acc_token=1eefabf7d7e741df9f88509718bac900 HTTP/1.0 Authorization: Bearer broker Content-Length: 124 Content-Type: application/json @@ -9,7 +9,7 @@ DATA: "status": "pending", "lotValues": [ { - "relatedLot": "3c84167877eb48d693c12efd2c6cb01e", + "relatedLot": "45d538b502bd4124bff52a374958e9ea", "value": { "amount": 500 } @@ -23,10 +23,9 @@ Content-Type: application/json; charset=UTF-8 { "data": { "status": "pending", - "selfEligible": true, "lotValues": [ { - "relatedLot": "3c84167877eb48d693c12efd2c6cb01e", + "relatedLot": "45d538b502bd4124bff52a374958e9ea", "date": "2020-05-15T01:00:00+03:00", "status": "pending", "value": { @@ -65,7 +64,7 @@ Content-Type: application/json; charset=UTF-8 } } ], - "selfQualified": true, + "id": "c036a6fb3127425ca2dc1bd343aad078", "tenderers": [ { "contactPoint": { @@ -90,7 +89,7 @@ Content-Type: application/json; charset=UTF-8 } ], "date": "2020-05-15T01:00:00+03:00", - "id": "e330641f19174449b434b4988cccf0c6" + "selfQualified": true } } diff --git a/docs/source/tendering/esco/multiple_lots_tutorial/bid-lot2.http b/docs/source/tendering/esco/multiple_lots_tutorial/bid-lot2.http index 3b8ac17d37..9862d9c4da 100644 --- a/docs/source/tendering/esco/multiple_lots_tutorial/bid-lot2.http +++ b/docs/source/tendering/esco/multiple_lots_tutorial/bid-lot2.http @@ -1,16 +1,15 @@ POST /api/2.5/tenders/db8f78603c144a8aac15730f9c763584/bids HTTP/1.0 Authorization: Bearer broker -Content-Length: 1529 +Content-Length: 1507 Content-Type: application/json Host: lb-api-sandbox.prozorro.gov.ua DATA: { "data": { - "selfEligible": true, "selfQualified": true, "lotValues": [ { - "relatedLot": "3c84167877eb48d693c12efd2c6cb01e", + "relatedLot": "45d538b502bd4124bff52a374958e9ea", "value": { "contractDuration": { "years": 7 @@ -42,7 +41,7 @@ DATA: } }, { - "relatedLot": "92e4a20a9d7f4dada89d434409f951d8", + "relatedLot": "aa439cf36abb4b2fb712ee9932b8d55b", "value": { "contractDuration": { "years": 9 @@ -103,7 +102,7 @@ DATA: Response: 201 Created Content-Type: application/json; charset=UTF-8 -Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/db8f78603c144a8aac15730f9c763584/bids/e330641f19174449b434b4988cccf0c6 +Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/db8f78603c144a8aac15730f9c763584/bids/c036a6fb3127425ca2dc1bd343aad078 { "access": { "transfer": "09c47fa5005d433dadde01808925656c", @@ -111,10 +110,9 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/db8f78603c144a8a }, "data": { "status": "pending", - "selfEligible": true, "lotValues": [ { - "relatedLot": "3c84167877eb48d693c12efd2c6cb01e", + "relatedLot": "45d538b502bd4124bff52a374958e9ea", "date": "2020-05-15T01:00:00+03:00", "status": "pending", "value": { @@ -153,7 +151,7 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/db8f78603c144a8a } }, { - "relatedLot": "92e4a20a9d7f4dada89d434409f951d8", + "relatedLot": "aa439cf36abb4b2fb712ee9932b8d55b", "date": "2020-05-15T01:00:00+03:00", "status": "pending", "value": { @@ -193,7 +191,7 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/db8f78603c144a8a "subcontractingDetails": "ДКП «Укр Прінт», Україна" } ], - "selfQualified": true, + "id": "c036a6fb3127425ca2dc1bd343aad078", "tenderers": [ { "contactPoint": { @@ -218,7 +216,7 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/db8f78603c144a8a } ], "date": "2020-05-15T01:00:00+03:00", - "id": "e330641f19174449b434b4988cccf0c6" + "selfQualified": true } } diff --git a/docs/source/tendering/esco/multiple_lots_tutorial/qualifications-view.http b/docs/source/tendering/esco/multiple_lots_tutorial/qualifications-view.http index cc93def3ce..429924138d 100644 --- a/docs/source/tendering/esco/multiple_lots_tutorial/qualifications-view.http +++ b/docs/source/tendering/esco/multiple_lots_tutorial/qualifications-view.http @@ -8,19 +8,19 @@ Content-Type: application/json; charset=UTF-8 "data": [ { "status": "pending", - "lotID": "3c84167877eb48d693c12efd2c6cb01e", + "lotID": "45d538b502bd4124bff52a374958e9ea", "eligible": false, "qualified": false, - "bidID": "b797c74bba014457870ceda8104f0444", + "bidID": "6439ffe4a7324e8abdcf7d68874fb6b8", "date": "2020-05-15T01:00:00+03:00", "id": "221135486f7b40cd9f4087f7c58e9059" }, { "status": "pending", - "lotID": "3c84167877eb48d693c12efd2c6cb01e", + "lotID": "45d538b502bd4124bff52a374958e9ea", "eligible": false, "qualified": false, - "bidID": "e330641f19174449b434b4988cccf0c6", + "bidID": "c036a6fb3127425ca2dc1bd343aad078", "date": "2020-05-15T01:00:00+03:00", "id": "c7f191fb400948a28117bcb2f0bb23de" } diff --git a/docs/source/tendering/esco/multiple_lots_tutorial/tender-activate-qualifications.http b/docs/source/tendering/esco/multiple_lots_tutorial/tender-activate-qualifications.http index db71438a02..e2926e9416 100644 --- a/docs/source/tendering/esco/multiple_lots_tutorial/tender-activate-qualifications.http +++ b/docs/source/tendering/esco/multiple_lots_tutorial/tender-activate-qualifications.http @@ -17,10 +17,10 @@ Content-Type: application/json; charset=UTF-8 { "data": { "status": "active", - "lotID": "3c84167877eb48d693c12efd2c6cb01e", + "lotID": "45d538b502bd4124bff52a374958e9ea", "eligible": true, "qualified": true, - "bidID": "b797c74bba014457870ceda8104f0444", + "bidID": "6439ffe4a7324e8abdcf7d68874fb6b8", "date": "2020-05-15T01:00:00+03:00", "id": "221135486f7b40cd9f4087f7c58e9059" } diff --git a/docs/source/tendering/esco/multiple_lots_tutorial/tender-add-lot.http b/docs/source/tendering/esco/multiple_lots_tutorial/tender-add-lot.http index f5673d671c..1640a4fddb 100644 --- a/docs/source/tendering/esco/multiple_lots_tutorial/tender-add-lot.http +++ b/docs/source/tendering/esco/multiple_lots_tutorial/tender-add-lot.http @@ -15,7 +15,7 @@ DATA: Response: 201 Created Content-Type: application/json; charset=UTF-8 -Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/db8f78603c144a8aac15730f9c763584/lots/3c84167877eb48d693c12efd2c6cb01e +Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/db8f78603c144a8aac15730f9c763584/lots/45d538b502bd4124bff52a374958e9ea { "data": { "status": "active", @@ -33,7 +33,7 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/db8f78603c144a8a "minimalStepPercentage": 0.006, "yearlyPaymentsPercentageRange": 0.8, "date": "2020-05-15T01:00:00+03:00", - "id": "3c84167877eb48d693c12efd2c6cb01e" + "id": "45d538b502bd4124bff52a374958e9ea" } } diff --git a/docs/source/tendering/esco/multiple_lots_tutorial/tender-add-relatedLot-to-item.http b/docs/source/tendering/esco/multiple_lots_tutorial/tender-add-relatedLot-to-item.http index 64eeb05aef..863c053a25 100644 --- a/docs/source/tendering/esco/multiple_lots_tutorial/tender-add-relatedLot-to-item.http +++ b/docs/source/tendering/esco/multiple_lots_tutorial/tender-add-relatedLot-to-item.http @@ -8,10 +8,10 @@ DATA: "data": { "items": [ { - "relatedLot": "3c84167877eb48d693c12efd2c6cb01e" + "relatedLot": "45d538b502bd4124bff52a374958e9ea" }, { - "relatedLot": "92e4a20a9d7f4dada89d434409f951d8" + "relatedLot": "aa439cf36abb4b2fb712ee9932b8d55b" } ] } @@ -81,7 +81,7 @@ Content-Type: application/json; charset=UTF-8 "minimalStepPercentage": 0.006, "yearlyPaymentsPercentageRange": 0.8, "date": "2020-05-15T01:00:00+03:00", - "id": "3c84167877eb48d693c12efd2c6cb01e" + "id": "45d538b502bd4124bff52a374958e9ea" }, { "status": "active", @@ -99,7 +99,7 @@ Content-Type: application/json; charset=UTF-8 "minimalStepPercentage": 0.006, "yearlyPaymentsPercentageRange": 0.8, "date": "2020-05-15T01:00:00+03:00", - "id": "92e4a20a9d7f4dada89d434409f951d8" + "id": "aa439cf36abb4b2fb712ee9932b8d55b" } ], "tenderID": "UA-2020-05-15-000001", @@ -142,13 +142,13 @@ Content-Type: application/json; charset=UTF-8 }, "percentage": 54.45, "type": "financing", - "id": "d1202ca204144cbe9dc33b3be3890c2f" + "id": "ab5c5a60667c417b9617d930f57e7aa4" } ], "fundingKind": "other", "items": [ { - "relatedLot": "3c84167877eb48d693c12efd2c6cb01e", + "relatedLot": "45d538b502bd4124bff52a374958e9ea", "description": "Послуги шкільних їдалень", "classification": { "scheme": "ДК021", @@ -170,14 +170,14 @@ Content-Type: application/json; charset=UTF-8 "region": "м. Київ", "locality": "м. Київ" }, - "id": "690fde3cdacc4efc8e343748e53b099a", + "id": "883dc1607ec54e498aaa32c18819bdff", "unit": { "code": "44617100-9", "name": "item" } }, { - "relatedLot": "92e4a20a9d7f4dada89d434409f951d8", + "relatedLot": "aa439cf36abb4b2fb712ee9932b8d55b", "description": "Послуги шкільних їдалень", "classification": { "scheme": "ДК021", @@ -199,7 +199,7 @@ Content-Type: application/json; charset=UTF-8 "region": "м. Київ", "locality": "м. Київ" }, - "id": "c9050d5dbc614321aba56eb555dc7ded", + "id": "273260c57be54e9fb4f474cd84077507", "unit": { "code": "44617100-9", "name": "item" diff --git a/docs/source/tendering/esco/multiple_lots_tutorial/tender-invalid-all-bids.http b/docs/source/tendering/esco/multiple_lots_tutorial/tender-invalid-all-bids.http index 43b05ae60a..3f500bb21b 100644 --- a/docs/source/tendering/esco/multiple_lots_tutorial/tender-invalid-all-bids.http +++ b/docs/source/tendering/esco/multiple_lots_tutorial/tender-invalid-all-bids.http @@ -1,4 +1,4 @@ -PATCH /api/2.5/tenders/db8f78603c144a8aac15730f9c763584/lots/92e4a20a9d7f4dada89d434409f951d8?acc_token=cf69efce7aca41c2b952f04d86d7fb90 HTTP/1.0 +PATCH /api/2.5/tenders/db8f78603c144a8aac15730f9c763584/lots/aa439cf36abb4b2fb712ee9932b8d55b?acc_token=cf69efce7aca41c2b952f04d86d7fb90 HTTP/1.0 Authorization: Bearer broker Content-Length: 39 Content-Type: application/json @@ -31,7 +31,7 @@ Content-Type: application/json; charset=UTF-8 "minimalStepPercentage": 0.006, "yearlyPaymentsPercentageRange": 0.8, "date": "2020-05-15T01:00:00+03:00", - "id": "92e4a20a9d7f4dada89d434409f951d8" + "id": "aa439cf36abb4b2fb712ee9932b8d55b" } } diff --git a/docs/source/tendering/esco/multiple_lots_tutorial/tender-post-attempt-json-data.http b/docs/source/tendering/esco/multiple_lots_tutorial/tender-post-attempt-json-data.http index fafbbcc9d4..0408b6b67f 100644 --- a/docs/source/tendering/esco/multiple_lots_tutorial/tender-post-attempt-json-data.http +++ b/docs/source/tendering/esco/multiple_lots_tutorial/tender-post-attempt-json-data.http @@ -230,7 +230,7 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/db8f78603c144a8a }, "percentage": 54.45, "type": "financing", - "id": "d1202ca204144cbe9dc33b3be3890c2f" + "id": "ab5c5a60667c417b9617d930f57e7aa4" } ], "fundingKind": "other", @@ -257,7 +257,7 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/db8f78603c144a8a "region": "м. Київ", "locality": "м. Київ" }, - "id": "690fde3cdacc4efc8e343748e53b099a", + "id": "883dc1607ec54e498aaa32c18819bdff", "unit": { "code": "44617100-9", "name": "item" @@ -285,7 +285,7 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/db8f78603c144a8a "region": "м. Київ", "locality": "м. Київ" }, - "id": "c9050d5dbc614321aba56eb555dc7ded", + "id": "273260c57be54e9fb4f474cd84077507", "unit": { "code": "44617100-9", "name": "item" diff --git a/docs/source/tendering/esco/multiple_lots_tutorial/tender-view-pre-qualification-stand-still.http b/docs/source/tendering/esco/multiple_lots_tutorial/tender-view-pre-qualification-stand-still.http index 24cef498a1..9587748223 100644 --- a/docs/source/tendering/esco/multiple_lots_tutorial/tender-view-pre-qualification-stand-still.http +++ b/docs/source/tendering/esco/multiple_lots_tutorial/tender-view-pre-qualification-stand-still.http @@ -18,13 +18,13 @@ Content-Type: application/json; charset=UTF-8 "status": "active.pre-qualification.stand-still", "mainProcurementCategory": "services", "complaintPeriod": { - "startDate": "2020-04-15T01:00:00+03:00", + "startDate": "2020-04-14T01:00:00+03:00", "endDate": "2020-05-11T00:00:00+03:00" }, "enquiryPeriod": { - "startDate": "2020-04-15T01:00:00+03:00", - "clarificationsUntil": "2020-05-09T00:00:00+03:00", - "endDate": "2020-05-05T01:00:00+03:00", + "startDate": "2020-04-14T01:00:00+03:00", + "clarificationsUntil": "2020-05-08T00:00:00+03:00", + "endDate": "2020-05-05T00:00:00+03:00", "invalidationDate": "2020-05-15T01:00:00+03:00" }, "submissionMethod": "electronicAuction", @@ -75,7 +75,7 @@ Content-Type: application/json; charset=UTF-8 "minimalStepPercentage": 0.006, "yearlyPaymentsPercentageRange": 0.8, "date": "2020-05-15T01:00:00+03:00", - "id": "3c84167877eb48d693c12efd2c6cb01e" + "id": "45d538b502bd4124bff52a374958e9ea" }, { "status": "unsuccessful", @@ -90,7 +90,7 @@ Content-Type: application/json; charset=UTF-8 "minimalStepPercentage": 0.006, "yearlyPaymentsPercentageRange": 0.8, "date": "2020-05-15T01:00:00+03:00", - "id": "92e4a20a9d7f4dada89d434409f951d8" + "id": "aa439cf36abb4b2fb712ee9932b8d55b" } ], "qualificationPeriod": { @@ -103,25 +103,25 @@ Content-Type: application/json; charset=UTF-8 "dateModified": "2020-05-15T01:00:00+03:00", "numberOfBids": 2, "tenderPeriod": { - "startDate": "2020-04-15T01:00:00+03:00", + "startDate": "2020-04-14T01:00:00+03:00", "endDate": "2020-05-15T01:00:00+03:00" }, "qualifications": [ { "status": "active", - "lotID": "3c84167877eb48d693c12efd2c6cb01e", + "lotID": "45d538b502bd4124bff52a374958e9ea", "eligible": true, "qualified": true, - "bidID": "b797c74bba014457870ceda8104f0444", + "bidID": "6439ffe4a7324e8abdcf7d68874fb6b8", "date": "2020-05-15T01:00:00+03:00", "id": "221135486f7b40cd9f4087f7c58e9059" }, { "status": "active", - "lotID": "3c84167877eb48d693c12efd2c6cb01e", + "lotID": "45d538b502bd4124bff52a374958e9ea", "eligible": true, "qualified": true, - "bidID": "e330641f19174449b434b4988cccf0c6", + "bidID": "c036a6fb3127425ca2dc1bd343aad078", "date": "2020-05-15T01:00:00+03:00", "id": "c7f191fb400948a28117bcb2f0bb23de" } @@ -157,13 +157,13 @@ Content-Type: application/json; charset=UTF-8 }, "percentage": 54.45, "type": "financing", - "id": "d1202ca204144cbe9dc33b3be3890c2f" + "id": "ab5c5a60667c417b9617d930f57e7aa4" } ], "fundingKind": "other", "items": [ { - "relatedLot": "3c84167877eb48d693c12efd2c6cb01e", + "relatedLot": "45d538b502bd4124bff52a374958e9ea", "description": "Послуги шкільних їдалень", "classification": { "scheme": "ДК021", @@ -185,14 +185,14 @@ Content-Type: application/json; charset=UTF-8 "region": "м. Київ", "locality": "м. Київ" }, - "id": "690fde3cdacc4efc8e343748e53b099a", + "id": "883dc1607ec54e498aaa32c18819bdff", "unit": { "code": "44617100-9", "name": "item" } }, { - "relatedLot": "92e4a20a9d7f4dada89d434409f951d8", + "relatedLot": "aa439cf36abb4b2fb712ee9932b8d55b", "description": "Послуги шкільних їдалень", "classification": { "scheme": "ДК021", @@ -214,7 +214,7 @@ Content-Type: application/json; charset=UTF-8 "region": "м. Київ", "locality": "м. Київ" }, - "id": "c9050d5dbc614321aba56eb555dc7ded", + "id": "273260c57be54e9fb4f474cd84077507", "unit": { "code": "44617100-9", "name": "item" @@ -224,7 +224,7 @@ Content-Type: application/json; charset=UTF-8 "bids": [ { "status": "active", - "id": "b797c74bba014457870ceda8104f0444", + "id": "6439ffe4a7324e8abdcf7d68874fb6b8", "tenderers": [ { "contactPoint": { @@ -251,7 +251,7 @@ Content-Type: application/json; charset=UTF-8 }, { "status": "active", - "id": "e330641f19174449b434b4988cccf0c6", + "id": "c036a6fb3127425ca2dc1bd343aad078", "tenderers": [ { "contactPoint": { diff --git a/docs/source/tendering/esco/multiple_lots_tutorial/tender-view-pre-qualification.http b/docs/source/tendering/esco/multiple_lots_tutorial/tender-view-pre-qualification.http index a1079fa70f..7725f43e54 100644 --- a/docs/source/tendering/esco/multiple_lots_tutorial/tender-view-pre-qualification.http +++ b/docs/source/tendering/esco/multiple_lots_tutorial/tender-view-pre-qualification.http @@ -10,13 +10,13 @@ Content-Type: application/json; charset=UTF-8 "status": "active.pre-qualification", "mainProcurementCategory": "services", "complaintPeriod": { - "startDate": "2020-04-15T01:00:00+03:00", + "startDate": "2020-04-14T01:00:00+03:00", "endDate": "2020-05-11T00:00:00+03:00" }, "enquiryPeriod": { - "startDate": "2020-04-15T01:00:00+03:00", - "clarificationsUntil": "2020-05-09T00:00:00+03:00", - "endDate": "2020-05-05T01:00:00+03:00", + "startDate": "2020-04-14T01:00:00+03:00", + "clarificationsUntil": "2020-05-08T00:00:00+03:00", + "endDate": "2020-05-05T00:00:00+03:00", "invalidationDate": "2020-05-15T01:00:00+03:00" }, "submissionMethod": "electronicAuction", @@ -63,7 +63,7 @@ Content-Type: application/json; charset=UTF-8 "minimalStepPercentage": 0.006, "yearlyPaymentsPercentageRange": 0.8, "date": "2020-05-15T01:00:00+03:00", - "id": "3c84167877eb48d693c12efd2c6cb01e" + "id": "45d538b502bd4124bff52a374958e9ea" }, { "status": "unsuccessful", @@ -78,7 +78,7 @@ Content-Type: application/json; charset=UTF-8 "minimalStepPercentage": 0.006, "yearlyPaymentsPercentageRange": 0.8, "date": "2020-05-15T01:00:00+03:00", - "id": "92e4a20a9d7f4dada89d434409f951d8" + "id": "aa439cf36abb4b2fb712ee9932b8d55b" } ], "qualificationPeriod": { @@ -90,25 +90,25 @@ Content-Type: application/json; charset=UTF-8 "dateModified": "2020-05-15T01:00:00+03:00", "numberOfBids": 2, "tenderPeriod": { - "startDate": "2020-04-15T01:00:00+03:00", + "startDate": "2020-04-14T01:00:00+03:00", "endDate": "2020-05-15T01:00:00+03:00" }, "qualifications": [ { "status": "pending", - "lotID": "3c84167877eb48d693c12efd2c6cb01e", + "lotID": "45d538b502bd4124bff52a374958e9ea", "eligible": false, "qualified": false, - "bidID": "b797c74bba014457870ceda8104f0444", + "bidID": "6439ffe4a7324e8abdcf7d68874fb6b8", "date": "2020-05-15T01:00:00+03:00", "id": "221135486f7b40cd9f4087f7c58e9059" }, { "status": "pending", - "lotID": "3c84167877eb48d693c12efd2c6cb01e", + "lotID": "45d538b502bd4124bff52a374958e9ea", "eligible": false, "qualified": false, - "bidID": "e330641f19174449b434b4988cccf0c6", + "bidID": "c036a6fb3127425ca2dc1bd343aad078", "date": "2020-05-15T01:00:00+03:00", "id": "c7f191fb400948a28117bcb2f0bb23de" } @@ -144,13 +144,13 @@ Content-Type: application/json; charset=UTF-8 }, "percentage": 54.45, "type": "financing", - "id": "d1202ca204144cbe9dc33b3be3890c2f" + "id": "ab5c5a60667c417b9617d930f57e7aa4" } ], "fundingKind": "other", "items": [ { - "relatedLot": "3c84167877eb48d693c12efd2c6cb01e", + "relatedLot": "45d538b502bd4124bff52a374958e9ea", "description": "Послуги шкільних їдалень", "classification": { "scheme": "ДК021", @@ -172,14 +172,14 @@ Content-Type: application/json; charset=UTF-8 "region": "м. Київ", "locality": "м. Київ" }, - "id": "690fde3cdacc4efc8e343748e53b099a", + "id": "883dc1607ec54e498aaa32c18819bdff", "unit": { "code": "44617100-9", "name": "item" } }, { - "relatedLot": "92e4a20a9d7f4dada89d434409f951d8", + "relatedLot": "aa439cf36abb4b2fb712ee9932b8d55b", "description": "Послуги шкільних їдалень", "classification": { "scheme": "ДК021", @@ -201,7 +201,7 @@ Content-Type: application/json; charset=UTF-8 "region": "м. Київ", "locality": "м. Київ" }, - "id": "c9050d5dbc614321aba56eb555dc7ded", + "id": "273260c57be54e9fb4f474cd84077507", "unit": { "code": "44617100-9", "name": "item" @@ -211,7 +211,7 @@ Content-Type: application/json; charset=UTF-8 "bids": [ { "status": "pending", - "id": "b797c74bba014457870ceda8104f0444", + "id": "6439ffe4a7324e8abdcf7d68874fb6b8", "tenderers": [ { "contactPoint": { @@ -238,7 +238,7 @@ Content-Type: application/json; charset=UTF-8 }, { "status": "pending", - "id": "e330641f19174449b434b4988cccf0c6", + "id": "c036a6fb3127425ca2dc1bd343aad078", "tenderers": [ { "contactPoint": { diff --git a/docs/source/tendering/esco/multiple_lots_tutorial/tender-view.http b/docs/source/tendering/esco/multiple_lots_tutorial/tender-view.http index 2e732d87dd..cdc7a9ae81 100644 --- a/docs/source/tendering/esco/multiple_lots_tutorial/tender-view.http +++ b/docs/source/tendering/esco/multiple_lots_tutorial/tender-view.http @@ -65,7 +65,7 @@ Content-Type: application/json; charset=UTF-8 "minimalStepPercentage": 0.006, "yearlyPaymentsPercentageRange": 0.8, "date": "2020-05-15T01:00:00+03:00", - "id": "3c84167877eb48d693c12efd2c6cb01e" + "id": "45d538b502bd4124bff52a374958e9ea" }, { "status": "active", @@ -83,7 +83,7 @@ Content-Type: application/json; charset=UTF-8 "minimalStepPercentage": 0.006, "yearlyPaymentsPercentageRange": 0.8, "date": "2020-05-15T01:00:00+03:00", - "id": "92e4a20a9d7f4dada89d434409f951d8" + "id": "aa439cf36abb4b2fb712ee9932b8d55b" } ], "tenderID": "UA-2020-05-15-000001", @@ -126,13 +126,13 @@ Content-Type: application/json; charset=UTF-8 }, "percentage": 54.45, "type": "financing", - "id": "d1202ca204144cbe9dc33b3be3890c2f" + "id": "ab5c5a60667c417b9617d930f57e7aa4" } ], "fundingKind": "other", "items": [ { - "relatedLot": "3c84167877eb48d693c12efd2c6cb01e", + "relatedLot": "45d538b502bd4124bff52a374958e9ea", "description": "Послуги шкільних їдалень", "classification": { "scheme": "ДК021", @@ -154,14 +154,14 @@ Content-Type: application/json; charset=UTF-8 "region": "м. Київ", "locality": "м. Київ" }, - "id": "690fde3cdacc4efc8e343748e53b099a", + "id": "883dc1607ec54e498aaa32c18819bdff", "unit": { "code": "44617100-9", "name": "item" } }, { - "relatedLot": "92e4a20a9d7f4dada89d434409f951d8", + "relatedLot": "aa439cf36abb4b2fb712ee9932b8d55b", "description": "Послуги шкільних їдалень", "classification": { "scheme": "ДК021", @@ -183,7 +183,7 @@ Content-Type: application/json; charset=UTF-8 "region": "м. Київ", "locality": "м. Київ" }, - "id": "c9050d5dbc614321aba56eb555dc7ded", + "id": "273260c57be54e9fb4f474cd84077507", "unit": { "code": "44617100-9", "name": "item" diff --git a/docs/source/tendering/esco/tutorial/activate-bidder.http b/docs/source/tendering/esco/tutorial/activate-bidder.http index 05c1adc9f1..782b85b53e 100644 --- a/docs/source/tendering/esco/tutorial/activate-bidder.http +++ b/docs/source/tendering/esco/tutorial/activate-bidder.http @@ -1,4 +1,4 @@ -PATCH /api/2.5/tenders/0aac695e27804293a2854dff7bed4be8/bids/e4528bc92c0f463ca1f661381961e106?acc_token=29627267ed794908800e9ab5426bbd2e HTTP/1.0 +PATCH /api/2.5/tenders/0aac695e27804293a2854dff7bed4be8/bids/498e07f6feea4ee99de14563abcf1d0c?acc_token=29627267ed794908800e9ab5426bbd2e HTTP/1.0 Authorization: Bearer broker Content-Length: 31 Content-Type: application/json @@ -15,8 +15,7 @@ Content-Type: application/json; charset=UTF-8 { "data": { "status": "pending", - "selfEligible": true, - "id": "e4528bc92c0f463ca1f661381961e106", + "id": "498e07f6feea4ee99de14563abcf1d0c", "value": { "yearlyPaymentsPercentage": 0.9, "valueAddedTaxIncluded": true, diff --git a/docs/source/tendering/esco/tutorial/active-cancellation.http b/docs/source/tendering/esco/tutorial/active-cancellation.http index d0f861c034..d672110060 100644 --- a/docs/source/tendering/esco/tutorial/active-cancellation.http +++ b/docs/source/tendering/esco/tutorial/active-cancellation.http @@ -1,4 +1,4 @@ -GET /api/2.5/tenders/0aac695e27804293a2854dff7bed4be8/cancellations/3efefdab89324f4aa00ff1853d92d0ab?acc_token=82d005b2183e43fe8edbb00cc6eb36c1 HTTP/1.0 +GET /api/2.5/tenders/0aac695e27804293a2854dff7bed4be8/cancellations/03ede869eb8e44be9018e92170eb8423?acc_token=82d005b2183e43fe8edbb00cc6eb36c1 HTTP/1.0 Authorization: Bearer broker Host: lb-api-sandbox.prozorro.gov.ua @@ -41,7 +41,7 @@ Content-Type: application/json; charset=UTF-8 "reasonType": "expensesCut", "date": "2020-05-26T01:00:02+03:00", "cancellationOf": "tender", - "id": "3efefdab89324f4aa00ff1853d92d0ab" + "id": "03ede869eb8e44be9018e92170eb8423" } } diff --git a/docs/source/tendering/esco/tutorial/answer-question.http b/docs/source/tendering/esco/tutorial/answer-question.http index 96218104a7..7dff788ecc 100644 --- a/docs/source/tendering/esco/tutorial/answer-question.http +++ b/docs/source/tendering/esco/tutorial/answer-question.http @@ -1,4 +1,4 @@ -PATCH /api/2.5/tenders/0aac695e27804293a2854dff7bed4be8/questions/c0ace3dda24e4cfab1c52c61462ceae8?acc_token=82d005b2183e43fe8edbb00cc6eb36c1 HTTP/1.0 +PATCH /api/2.5/tenders/0aac695e27804293a2854dff7bed4be8/questions/1419a907c70b4401abafa401b7f00672?acc_token=82d005b2183e43fe8edbb00cc6eb36c1 HTTP/1.0 Authorization: Bearer broker Content-Length: 162 Content-Type: application/json @@ -19,7 +19,7 @@ Content-Type: application/json; charset=UTF-8 "title": "Калорійність", "date": "2020-05-15T01:00:00+03:00", "answer": "Таблицю додано в файлі \"Kalorijnist.xslx\"", - "id": "c0ace3dda24e4cfab1c52c61462ceae8", + "id": "1419a907c70b4401abafa401b7f00672", "questionOf": "tender" } } diff --git a/docs/source/tendering/esco/tutorial/approve-qualification1.http b/docs/source/tendering/esco/tutorial/approve-qualification1.http index cdf35069ba..2049b7a869 100644 --- a/docs/source/tendering/esco/tutorial/approve-qualification1.http +++ b/docs/source/tendering/esco/tutorial/approve-qualification1.http @@ -19,7 +19,7 @@ Content-Type: application/json; charset=UTF-8 "status": "active", "eligible": true, "qualified": true, - "bidID": "e4528bc92c0f463ca1f661381961e106", + "bidID": "498e07f6feea4ee99de14563abcf1d0c", "date": "2020-05-15T01:00:00+03:00", "id": "de8bbc96c24f498488bf279a41416c9f" } diff --git a/docs/source/tendering/esco/tutorial/approve-qualification2.http b/docs/source/tendering/esco/tutorial/approve-qualification2.http index a0c6b7985f..db46e96fd9 100644 --- a/docs/source/tendering/esco/tutorial/approve-qualification2.http +++ b/docs/source/tendering/esco/tutorial/approve-qualification2.http @@ -19,7 +19,7 @@ Content-Type: application/json; charset=UTF-8 "status": "active", "eligible": true, "qualified": true, - "bidID": "b649b9b2575142159fd240c728c87298", + "bidID": "c72b35cfbfd84d7a980f772c02d025f6", "date": "2020-05-15T01:00:00+03:00", "id": "81988da3ce1f4cfdba7afe53020a62e6" } diff --git a/docs/source/tendering/esco/tutorial/ask-question.http b/docs/source/tendering/esco/tutorial/ask-question.http index 38c272d397..f83b4b73d3 100644 --- a/docs/source/tendering/esco/tutorial/ask-question.http +++ b/docs/source/tendering/esco/tutorial/ask-question.http @@ -33,7 +33,7 @@ DATA: Response: 201 Created Content-Type: application/json; charset=UTF-8 -Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/0aac695e27804293a2854dff7bed4be8/questions/c0ace3dda24e4cfab1c52c61462ceae8 +Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/0aac695e27804293a2854dff7bed4be8/questions/1419a907c70b4401abafa401b7f00672 { "data": { "description": "Просимо додати таблицю потрібної калорійності харчування", @@ -59,7 +59,7 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/0aac695e27804293 }, "title": "Калорійність", "date": "2020-05-15T01:00:00+03:00", - "id": "c0ace3dda24e4cfab1c52c61462ceae8", + "id": "1419a907c70b4401abafa401b7f00672", "questionOf": "tender" } } diff --git a/docs/source/tendering/esco/tutorial/auction-url.http b/docs/source/tendering/esco/tutorial/auction-url.http index f4783d7ab1..418e9dd55f 100644 --- a/docs/source/tendering/esco/tutorial/auction-url.http +++ b/docs/source/tendering/esco/tutorial/auction-url.http @@ -17,7 +17,7 @@ Content-Type: application/json; charset=UTF-8 "enquiryPeriod": { "startDate": "2020-04-04T01:00:00+03:00", "clarificationsUntil": "2020-04-30T00:00:00+03:00", - "endDate": "2020-04-25T01:00:00+03:00", + "endDate": "2020-04-25T00:00:00+03:00", "invalidationDate": "2020-05-15T01:00:00+03:00" }, "submissionMethod": "electronicAuction", @@ -55,7 +55,7 @@ Content-Type: application/json; charset=UTF-8 "title": "Калорійність", "date": "2020-05-15T01:00:00+03:00", "answer": "Таблицю додано в файлі \"Kalorijnist.xslx\"", - "id": "c0ace3dda24e4cfab1c52c61462ceae8", + "id": "1419a907c70b4401abafa401b7f00672", "questionOf": "tender" } ], @@ -65,7 +65,7 @@ Content-Type: application/json; charset=UTF-8 "status": "active", "eligible": true, "qualified": true, - "bidID": "e4528bc92c0f463ca1f661381961e106", + "bidID": "498e07f6feea4ee99de14563abcf1d0c", "date": "2020-05-15T01:00:00+03:00", "id": "de8bbc96c24f498488bf279a41416c9f" }, @@ -73,7 +73,7 @@ Content-Type: application/json; charset=UTF-8 "status": "active", "eligible": true, "qualified": true, - "bidID": "b649b9b2575142159fd240c728c87298", + "bidID": "c72b35cfbfd84d7a980f772c02d025f6", "date": "2020-05-15T01:00:00+03:00", "id": "81988da3ce1f4cfdba7afe53020a62e6" }, @@ -81,7 +81,7 @@ Content-Type: application/json; charset=UTF-8 "status": "unsuccessful", "eligible": false, "qualified": false, - "bidID": "5e79c825b4c54c36a179b22db2dae23b", + "bidID": "2d751be3f6aa46ba8dfd6eebcd5d9130", "date": "2020-05-15T01:00:00+03:00", "id": "0da9ff005c5b4951af49ef8d1863ce0b" } @@ -178,7 +178,7 @@ Content-Type: application/json; charset=UTF-8 }, "percentage": 54.45, "type": "financing", - "id": "93b9835cd6f8419fb56014c014773e8b" + "id": "d1068593e9a7477a8994ecee0e7fb48c" } ], "fundingKind": "other", @@ -205,7 +205,7 @@ Content-Type: application/json; charset=UTF-8 "region": "м. Київ", "locality": "м. Київ" }, - "id": "366a042aa96a4acdbe63112500608db1", + "id": "e1e8352d141b4814ba5c79c757fdd72a", "unit": { "code": "44617100-9", "name": "item" @@ -233,7 +233,7 @@ Content-Type: application/json; charset=UTF-8 "region": "м. Київ", "locality": "м. Київ" }, - "id": "9a24ed7daf1948b2923da55b02b720ed", + "id": "3edb0dc8dd6542508b405eddb7260162", "unit": { "code": "44617100-9", "name": "item" @@ -292,7 +292,7 @@ Content-Type: application/json; charset=UTF-8 } } ], - "id": "e4528bc92c0f463ca1f661381961e106", + "id": "498e07f6feea4ee99de14563abcf1d0c", "eligibilityDocuments": [ { "hash": "md5:00000000000000000000000000000000", @@ -310,7 +310,7 @@ Content-Type: application/json; charset=UTF-8 }, { "status": "active", - "id": "b649b9b2575142159fd240c728c87298", + "id": "c72b35cfbfd84d7a980f772c02d025f6", "tenderers": [ { "contactPoint": { @@ -347,7 +347,7 @@ Content-Type: application/json; charset=UTF-8 "format": "application/pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", - "id": "824f270cc0b749bd989983329634a5de", + "id": "437ffa3708534314aa799bf9d166b0bc", "dateModified": "2020-05-15T01:00:00+03:00" }, { @@ -360,7 +360,7 @@ Content-Type: application/json; charset=UTF-8 "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", "dateModified": "2020-05-15T01:00:00+03:00", - "id": "fc90022e9584421e90d0438c8b331cc8" + "id": "685b1826738c419bb4af2e171204a06b" } ], "eligibilityDocuments": [ @@ -373,12 +373,11 @@ Content-Type: application/json; charset=UTF-8 "format": "application/pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", - "id": "7adad4419c2f4b30b066e8e584a62f25", + "id": "59a1e9382b294643adc4e5d5927146b5", "dateModified": "2020-05-15T01:00:00+03:00" } ], - "selfEligible": true, - "selfQualified": true, + "id": "2d751be3f6aa46ba8dfd6eebcd5d9130", "tenderers": [ { "contactPoint": { @@ -402,7 +401,7 @@ Content-Type: application/json; charset=UTF-8 } } ], - "id": "5e79c825b4c54c36a179b22db2dae23b" + "selfQualified": true } ], "noticePublicationDate": "2020-05-15T01:00:00+03:00", diff --git a/docs/source/tendering/esco/tutorial/bidder-activate-after-changing-tender.http b/docs/source/tendering/esco/tutorial/bidder-activate-after-changing-tender.http index af315e3ec5..4b0b3d8d04 100644 --- a/docs/source/tendering/esco/tutorial/bidder-activate-after-changing-tender.http +++ b/docs/source/tendering/esco/tutorial/bidder-activate-after-changing-tender.http @@ -1,4 +1,4 @@ -PATCH /api/2.5/tenders/0aac695e27804293a2854dff7bed4be8/bids/e4528bc92c0f463ca1f661381961e106?acc_token=29627267ed794908800e9ab5426bbd2e HTTP/1.0 +PATCH /api/2.5/tenders/0aac695e27804293a2854dff7bed4be8/bids/498e07f6feea4ee99de14563abcf1d0c?acc_token=29627267ed794908800e9ab5426bbd2e HTTP/1.0 Authorization: Bearer broker Content-Length: 31 Content-Type: application/json @@ -21,7 +21,7 @@ Content-Type: application/json; charset=UTF-8 "confidentiality": "public", "language": "uk", "title": "Proposal.pdf", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/0aac695e27804293a2854dff7bed4be8/bids/e4528bc92c0f463ca1f661381961e106/documents/f6d40d29d5ef4d1f85af6033339b5f47?download=3c66e547d52349d3ae64416f15e9c35a", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/0aac695e27804293a2854dff7bed4be8/bids/498e07f6feea4ee99de14563abcf1d0c/documents/f6d40d29d5ef4d1f85af6033339b5f47?download=3c66e547d52349d3ae64416f15e9c35a", "format": "application/pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", @@ -33,7 +33,7 @@ Content-Type: application/json; charset=UTF-8 "confidentiality": "buyerOnly", "language": "uk", "format": "application/pdf", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/0aac695e27804293a2854dff7bed4be8/bids/e4528bc92c0f463ca1f661381961e106/documents/12d76b67e831404c8628f7612d0944b1?download=92e2b793a7d34373986f3c5619906253", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/0aac695e27804293a2854dff7bed4be8/bids/498e07f6feea4ee99de14563abcf1d0c/documents/12d76b67e831404c8628f7612d0944b1?download=92e2b793a7d34373986f3c5619906253", "confidentialityRationale": "Only our company sells badgers with pink hair.", "title": "Proposal_top_secrets.pdf", "documentOf": "tender", @@ -48,7 +48,7 @@ Content-Type: application/json; charset=UTF-8 "confidentiality": "public", "language": "uk", "title": "eligibility_doc.pdf", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/0aac695e27804293a2854dff7bed4be8/bids/e4528bc92c0f463ca1f661381961e106/eligibility_documents/66f8e57da25649be9795cc6d9189c4ff?download=eb89b6fb96bb463c8f422013d61506a0", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/0aac695e27804293a2854dff7bed4be8/bids/498e07f6feea4ee99de14563abcf1d0c/eligibility_documents/66f8e57da25649be9795cc6d9189c4ff?download=eb89b6fb96bb463c8f422013d61506a0", "format": "application/pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", @@ -56,8 +56,7 @@ Content-Type: application/json; charset=UTF-8 "dateModified": "2020-05-15T01:00:00+03:00" } ], - "selfEligible": true, - "id": "e4528bc92c0f463ca1f661381961e106", + "id": "498e07f6feea4ee99de14563abcf1d0c", "value": { "yearlyPaymentsPercentage": 0.9, "valueAddedTaxIncluded": true, @@ -92,14 +91,27 @@ Content-Type: application/json; charset=UTF-8 1000.0 ] }, - "selfQualified": true, + "qualificationDocuments": [ + { + "hash": "md5:00000000000000000000000000000000", + "confidentiality": "public", + "language": "uk", + "title": "qualification_document.pdf", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/0aac695e27804293a2854dff7bed4be8/bids/498e07f6feea4ee99de14563abcf1d0c/qualification_documents/5ba700bd5a65489fbd8821531adc4434?download=469f20975c9b4087a0b601f5d48d3df4", + "format": "application/pdf", + "documentOf": "tender", + "datePublished": "2020-05-15T01:00:00+03:00", + "id": "5ba700bd5a65489fbd8821531adc4434", + "dateModified": "2020-05-15T01:00:00+03:00" + } + ], "financialDocuments": [ { "hash": "md5:00000000000000000000000000000000", "confidentiality": "public", "language": "uk", "title": "financial_doc.pdf", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/0aac695e27804293a2854dff7bed4be8/bids/e4528bc92c0f463ca1f661381961e106/financial_documents/c91b2d4d356b4f6c94cf255126fe233c?download=b5c94c3907c04f15b1eb4bcf56cf73e5", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/0aac695e27804293a2854dff7bed4be8/bids/498e07f6feea4ee99de14563abcf1d0c/financial_documents/c91b2d4d356b4f6c94cf255126fe233c?download=b5c94c3907c04f15b1eb4bcf56cf73e5", "format": "application/pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", @@ -111,7 +123,7 @@ Content-Type: application/json; charset=UTF-8 "confidentiality": "public", "language": "uk", "title": "financial_doc2.pdf", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/0aac695e27804293a2854dff7bed4be8/bids/e4528bc92c0f463ca1f661381961e106/financial_documents/d2179f9d17144ae59107edad44558986?download=90f3ed7fe83245ceb8b2f7ff6624822b", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/0aac695e27804293a2854dff7bed4be8/bids/498e07f6feea4ee99de14563abcf1d0c/financial_documents/d2179f9d17144ae59107edad44558986?download=90f3ed7fe83245ceb8b2f7ff6624822b", "format": "application/pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", @@ -144,20 +156,7 @@ Content-Type: application/json; charset=UTF-8 ], "date": "2020-05-15T01:00:00+03:00", "subcontractingDetails": "ДКП «Орфей», Україна", - "qualificationDocuments": [ - { - "hash": "md5:00000000000000000000000000000000", - "confidentiality": "public", - "language": "uk", - "title": "qualification_document.pdf", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/0aac695e27804293a2854dff7bed4be8/bids/e4528bc92c0f463ca1f661381961e106/qualification_documents/5ba700bd5a65489fbd8821531adc4434?download=469f20975c9b4087a0b601f5d48d3df4", - "format": "application/pdf", - "documentOf": "tender", - "datePublished": "2020-05-15T01:00:00+03:00", - "id": "5ba700bd5a65489fbd8821531adc4434", - "dateModified": "2020-05-15T01:00:00+03:00" - } - ] + "selfQualified": true } } diff --git a/docs/source/tendering/esco/tutorial/bidder-after-changing-tender.http b/docs/source/tendering/esco/tutorial/bidder-after-changing-tender.http index 09d7d0387c..cc76b120b2 100644 --- a/docs/source/tendering/esco/tutorial/bidder-after-changing-tender.http +++ b/docs/source/tendering/esco/tutorial/bidder-after-changing-tender.http @@ -1,4 +1,4 @@ -GET /api/2.5/tenders/0aac695e27804293a2854dff7bed4be8/bids/e4528bc92c0f463ca1f661381961e106?acc_token=29627267ed794908800e9ab5426bbd2e HTTP/1.0 +GET /api/2.5/tenders/0aac695e27804293a2854dff7bed4be8/bids/498e07f6feea4ee99de14563abcf1d0c?acc_token=29627267ed794908800e9ab5426bbd2e HTTP/1.0 Authorization: Bearer broker Host: lb-api-sandbox.prozorro.gov.ua @@ -7,7 +7,7 @@ Content-Type: application/json; charset=UTF-8 { "data": { "status": "invalid", - "id": "e4528bc92c0f463ca1f661381961e106" + "id": "498e07f6feea4ee99de14563abcf1d0c" } } diff --git a/docs/source/tendering/esco/tutorial/bidder-documents.http b/docs/source/tendering/esco/tutorial/bidder-documents.http index c819d462c8..38180d5047 100644 --- a/docs/source/tendering/esco/tutorial/bidder-documents.http +++ b/docs/source/tendering/esco/tutorial/bidder-documents.http @@ -1,4 +1,4 @@ -GET /api/2.5/tenders/0aac695e27804293a2854dff7bed4be8/bids/e4528bc92c0f463ca1f661381961e106/documents?acc_token=29627267ed794908800e9ab5426bbd2e HTTP/1.0 +GET /api/2.5/tenders/0aac695e27804293a2854dff7bed4be8/bids/498e07f6feea4ee99de14563abcf1d0c/documents?acc_token=29627267ed794908800e9ab5426bbd2e HTTP/1.0 Authorization: Bearer broker Host: lb-api-sandbox.prozorro.gov.ua @@ -11,7 +11,7 @@ Content-Type: application/json; charset=UTF-8 "confidentiality": "buyerOnly", "language": "uk", "format": "application/pdf", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/0aac695e27804293a2854dff7bed4be8/bids/e4528bc92c0f463ca1f661381961e106/documents/12d76b67e831404c8628f7612d0944b1?download=92e2b793a7d34373986f3c5619906253", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/0aac695e27804293a2854dff7bed4be8/bids/498e07f6feea4ee99de14563abcf1d0c/documents/12d76b67e831404c8628f7612d0944b1?download=92e2b793a7d34373986f3c5619906253", "confidentialityRationale": "Only our company sells badgers with pink hair.", "title": "Proposal_top_secrets.pdf", "documentOf": "tender", @@ -24,7 +24,7 @@ Content-Type: application/json; charset=UTF-8 "confidentiality": "public", "language": "uk", "title": "Proposal.pdf", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/0aac695e27804293a2854dff7bed4be8/bids/e4528bc92c0f463ca1f661381961e106/documents/f6d40d29d5ef4d1f85af6033339b5f47?download=3c66e547d52349d3ae64416f15e9c35a", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/0aac695e27804293a2854dff7bed4be8/bids/498e07f6feea4ee99de14563abcf1d0c/documents/f6d40d29d5ef4d1f85af6033339b5f47?download=3c66e547d52349d3ae64416f15e9c35a", "format": "application/pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", diff --git a/docs/source/tendering/esco/tutorial/bidder-financial-documents.http b/docs/source/tendering/esco/tutorial/bidder-financial-documents.http index 92cf56760d..b5277cf064 100644 --- a/docs/source/tendering/esco/tutorial/bidder-financial-documents.http +++ b/docs/source/tendering/esco/tutorial/bidder-financial-documents.http @@ -1,4 +1,4 @@ -GET /api/2.5/tenders/0aac695e27804293a2854dff7bed4be8/bids/e4528bc92c0f463ca1f661381961e106/financial_documents?acc_token=29627267ed794908800e9ab5426bbd2e HTTP/1.0 +GET /api/2.5/tenders/0aac695e27804293a2854dff7bed4be8/bids/498e07f6feea4ee99de14563abcf1d0c/financial_documents?acc_token=29627267ed794908800e9ab5426bbd2e HTTP/1.0 Authorization: Bearer broker Host: lb-api-sandbox.prozorro.gov.ua @@ -11,7 +11,7 @@ Content-Type: application/json; charset=UTF-8 "confidentiality": "public", "language": "uk", "title": "financial_doc2.pdf", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/0aac695e27804293a2854dff7bed4be8/bids/e4528bc92c0f463ca1f661381961e106/financial_documents/d2179f9d17144ae59107edad44558986?download=90f3ed7fe83245ceb8b2f7ff6624822b", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/0aac695e27804293a2854dff7bed4be8/bids/498e07f6feea4ee99de14563abcf1d0c/financial_documents/d2179f9d17144ae59107edad44558986?download=90f3ed7fe83245ceb8b2f7ff6624822b", "format": "application/pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", @@ -23,7 +23,7 @@ Content-Type: application/json; charset=UTF-8 "confidentiality": "public", "language": "uk", "title": "financial_doc.pdf", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/0aac695e27804293a2854dff7bed4be8/bids/e4528bc92c0f463ca1f661381961e106/financial_documents/c91b2d4d356b4f6c94cf255126fe233c?download=b5c94c3907c04f15b1eb4bcf56cf73e5", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/0aac695e27804293a2854dff7bed4be8/bids/498e07f6feea4ee99de14563abcf1d0c/financial_documents/c91b2d4d356b4f6c94cf255126fe233c?download=b5c94c3907c04f15b1eb4bcf56cf73e5", "format": "application/pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", diff --git a/docs/source/tendering/esco/tutorial/bidder-participation-url.http b/docs/source/tendering/esco/tutorial/bidder-participation-url.http index 453736942c..8e3656ef01 100644 --- a/docs/source/tendering/esco/tutorial/bidder-participation-url.http +++ b/docs/source/tendering/esco/tutorial/bidder-participation-url.http @@ -1,4 +1,4 @@ -GET /api/2.5/tenders/0aac695e27804293a2854dff7bed4be8/bids/e4528bc92c0f463ca1f661381961e106?acc_token=29627267ed794908800e9ab5426bbd2e HTTP/1.0 +GET /api/2.5/tenders/0aac695e27804293a2854dff7bed4be8/bids/498e07f6feea4ee99de14563abcf1d0c?acc_token=29627267ed794908800e9ab5426bbd2e HTTP/1.0 Authorization: Bearer broker Host: lb-api-sandbox.prozorro.gov.ua @@ -25,7 +25,7 @@ Content-Type: application/json; charset=UTF-8 "confidentiality": "buyerOnly", "language": "uk", "format": "application/pdf", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/0aac695e27804293a2854dff7bed4be8/bids/e4528bc92c0f463ca1f661381961e106/documents/12d76b67e831404c8628f7612d0944b1?download=92e2b793a7d34373986f3c5619906253", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/0aac695e27804293a2854dff7bed4be8/bids/498e07f6feea4ee99de14563abcf1d0c/documents/12d76b67e831404c8628f7612d0944b1?download=92e2b793a7d34373986f3c5619906253", "confidentialityRationale": "Only our company sells badgers with pink hair.", "title": "Proposal_top_secrets.pdf", "documentOf": "tender", @@ -48,8 +48,7 @@ Content-Type: application/json; charset=UTF-8 "dateModified": "2020-05-15T01:00:00+03:00" } ], - "selfEligible": true, - "id": "e4528bc92c0f463ca1f661381961e106", + "id": "498e07f6feea4ee99de14563abcf1d0c", "value": { "yearlyPaymentsPercentage": 0.9, "valueAddedTaxIncluded": true, @@ -84,14 +83,27 @@ Content-Type: application/json; charset=UTF-8 1000.0 ] }, - "selfQualified": true, + "qualificationDocuments": [ + { + "hash": "md5:00000000000000000000000000000000", + "confidentiality": "public", + "language": "uk", + "title": "qualification_document.pdf", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/0aac695e27804293a2854dff7bed4be8/bids/498e07f6feea4ee99de14563abcf1d0c/qualification_documents/5ba700bd5a65489fbd8821531adc4434?download=469f20975c9b4087a0b601f5d48d3df4", + "format": "application/pdf", + "documentOf": "tender", + "datePublished": "2020-05-15T01:00:00+03:00", + "id": "5ba700bd5a65489fbd8821531adc4434", + "dateModified": "2020-05-15T01:00:00+03:00" + } + ], "financialDocuments": [ { "hash": "md5:00000000000000000000000000000000", "confidentiality": "public", "language": "uk", "title": "financial_doc.pdf", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/0aac695e27804293a2854dff7bed4be8/bids/e4528bc92c0f463ca1f661381961e106/financial_documents/c91b2d4d356b4f6c94cf255126fe233c?download=b5c94c3907c04f15b1eb4bcf56cf73e5", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/0aac695e27804293a2854dff7bed4be8/bids/498e07f6feea4ee99de14563abcf1d0c/financial_documents/c91b2d4d356b4f6c94cf255126fe233c?download=b5c94c3907c04f15b1eb4bcf56cf73e5", "format": "application/pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", @@ -103,7 +115,7 @@ Content-Type: application/json; charset=UTF-8 "confidentiality": "public", "language": "uk", "title": "financial_doc2.pdf", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/0aac695e27804293a2854dff7bed4be8/bids/e4528bc92c0f463ca1f661381961e106/financial_documents/d2179f9d17144ae59107edad44558986?download=90f3ed7fe83245ceb8b2f7ff6624822b", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/0aac695e27804293a2854dff7bed4be8/bids/498e07f6feea4ee99de14563abcf1d0c/financial_documents/d2179f9d17144ae59107edad44558986?download=90f3ed7fe83245ceb8b2f7ff6624822b", "format": "application/pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", @@ -136,21 +148,8 @@ Content-Type: application/json; charset=UTF-8 ], "date": "2020-05-15T01:00:00+03:00", "subcontractingDetails": "ДКП «Орфей», Україна", - "qualificationDocuments": [ - { - "hash": "md5:00000000000000000000000000000000", - "confidentiality": "public", - "language": "uk", - "title": "qualification_document.pdf", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/0aac695e27804293a2854dff7bed4be8/bids/e4528bc92c0f463ca1f661381961e106/qualification_documents/5ba700bd5a65489fbd8821531adc4434?download=469f20975c9b4087a0b601f5d48d3df4", - "format": "application/pdf", - "documentOf": "tender", - "datePublished": "2020-05-15T01:00:00+03:00", - "id": "5ba700bd5a65489fbd8821531adc4434", - "dateModified": "2020-05-15T01:00:00+03:00" - } - ], - "participationUrl": "http://auction-sandbox.prozorro.gov.ua/tenders/0aac695e27804293a2854dff7bed4be8?key_for_bid=e4528bc92c0f463ca1f661381961e106" + "selfQualified": true, + "participationUrl": "http://auction-sandbox.prozorro.gov.ua/tenders/0aac695e27804293a2854dff7bed4be8?key_for_bid=498e07f6feea4ee99de14563abcf1d0c" } } diff --git a/docs/source/tendering/esco/tutorial/bidder-view-financial-documents.http b/docs/source/tendering/esco/tutorial/bidder-view-financial-documents.http index eb638f3b5e..239e24df0b 100644 --- a/docs/source/tendering/esco/tutorial/bidder-view-financial-documents.http +++ b/docs/source/tendering/esco/tutorial/bidder-view-financial-documents.http @@ -1,4 +1,4 @@ -GET /api/2.5/tenders/0aac695e27804293a2854dff7bed4be8/bids/e4528bc92c0f463ca1f661381961e106?acc_token=29627267ed794908800e9ab5426bbd2e HTTP/1.0 +GET /api/2.5/tenders/0aac695e27804293a2854dff7bed4be8/bids/498e07f6feea4ee99de14563abcf1d0c?acc_token=29627267ed794908800e9ab5426bbd2e HTTP/1.0 Authorization: Bearer broker Host: lb-api-sandbox.prozorro.gov.ua @@ -13,7 +13,7 @@ Content-Type: application/json; charset=UTF-8 "confidentiality": "public", "language": "uk", "title": "Proposal.pdf", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/0aac695e27804293a2854dff7bed4be8/bids/e4528bc92c0f463ca1f661381961e106/documents/f6d40d29d5ef4d1f85af6033339b5f47?download=3c66e547d52349d3ae64416f15e9c35a", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/0aac695e27804293a2854dff7bed4be8/bids/498e07f6feea4ee99de14563abcf1d0c/documents/f6d40d29d5ef4d1f85af6033339b5f47?download=3c66e547d52349d3ae64416f15e9c35a", "format": "application/pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", @@ -25,7 +25,7 @@ Content-Type: application/json; charset=UTF-8 "confidentiality": "buyerOnly", "language": "uk", "format": "application/pdf", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/0aac695e27804293a2854dff7bed4be8/bids/e4528bc92c0f463ca1f661381961e106/documents/12d76b67e831404c8628f7612d0944b1?download=92e2b793a7d34373986f3c5619906253", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/0aac695e27804293a2854dff7bed4be8/bids/498e07f6feea4ee99de14563abcf1d0c/documents/12d76b67e831404c8628f7612d0944b1?download=92e2b793a7d34373986f3c5619906253", "confidentialityRationale": "Only our company sells badgers with pink hair.", "title": "Proposal_top_secrets.pdf", "documentOf": "tender", @@ -40,7 +40,7 @@ Content-Type: application/json; charset=UTF-8 "confidentiality": "public", "language": "uk", "title": "eligibility_doc.pdf", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/0aac695e27804293a2854dff7bed4be8/bids/e4528bc92c0f463ca1f661381961e106/eligibility_documents/66f8e57da25649be9795cc6d9189c4ff?download=eb89b6fb96bb463c8f422013d61506a0", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/0aac695e27804293a2854dff7bed4be8/bids/498e07f6feea4ee99de14563abcf1d0c/eligibility_documents/66f8e57da25649be9795cc6d9189c4ff?download=eb89b6fb96bb463c8f422013d61506a0", "format": "application/pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", @@ -48,8 +48,7 @@ Content-Type: application/json; charset=UTF-8 "dateModified": "2020-05-15T01:00:00+03:00" } ], - "selfEligible": true, - "id": "e4528bc92c0f463ca1f661381961e106", + "id": "498e07f6feea4ee99de14563abcf1d0c", "value": { "yearlyPaymentsPercentage": 0.9, "valueAddedTaxIncluded": true, @@ -84,14 +83,27 @@ Content-Type: application/json; charset=UTF-8 1000.0 ] }, - "selfQualified": true, + "qualificationDocuments": [ + { + "hash": "md5:00000000000000000000000000000000", + "confidentiality": "public", + "language": "uk", + "title": "qualification_document.pdf", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/0aac695e27804293a2854dff7bed4be8/bids/498e07f6feea4ee99de14563abcf1d0c/qualification_documents/5ba700bd5a65489fbd8821531adc4434?download=469f20975c9b4087a0b601f5d48d3df4", + "format": "application/pdf", + "documentOf": "tender", + "datePublished": "2020-05-15T01:00:00+03:00", + "id": "5ba700bd5a65489fbd8821531adc4434", + "dateModified": "2020-05-15T01:00:00+03:00" + } + ], "financialDocuments": [ { "hash": "md5:00000000000000000000000000000000", "confidentiality": "public", "language": "uk", "title": "financial_doc.pdf", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/0aac695e27804293a2854dff7bed4be8/bids/e4528bc92c0f463ca1f661381961e106/financial_documents/c91b2d4d356b4f6c94cf255126fe233c?download=b5c94c3907c04f15b1eb4bcf56cf73e5", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/0aac695e27804293a2854dff7bed4be8/bids/498e07f6feea4ee99de14563abcf1d0c/financial_documents/c91b2d4d356b4f6c94cf255126fe233c?download=b5c94c3907c04f15b1eb4bcf56cf73e5", "format": "application/pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", @@ -103,7 +115,7 @@ Content-Type: application/json; charset=UTF-8 "confidentiality": "public", "language": "uk", "title": "financial_doc2.pdf", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/0aac695e27804293a2854dff7bed4be8/bids/e4528bc92c0f463ca1f661381961e106/financial_documents/d2179f9d17144ae59107edad44558986?download=90f3ed7fe83245ceb8b2f7ff6624822b", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/0aac695e27804293a2854dff7bed4be8/bids/498e07f6feea4ee99de14563abcf1d0c/financial_documents/d2179f9d17144ae59107edad44558986?download=90f3ed7fe83245ceb8b2f7ff6624822b", "format": "application/pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", @@ -136,20 +148,7 @@ Content-Type: application/json; charset=UTF-8 ], "date": "2020-05-15T01:00:00+03:00", "subcontractingDetails": "ДКП «Орфей», Україна", - "qualificationDocuments": [ - { - "hash": "md5:00000000000000000000000000000000", - "confidentiality": "public", - "language": "uk", - "title": "qualification_document.pdf", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/0aac695e27804293a2854dff7bed4be8/bids/e4528bc92c0f463ca1f661381961e106/qualification_documents/5ba700bd5a65489fbd8821531adc4434?download=469f20975c9b4087a0b601f5d48d3df4", - "format": "application/pdf", - "documentOf": "tender", - "datePublished": "2020-05-15T01:00:00+03:00", - "id": "5ba700bd5a65489fbd8821531adc4434", - "dateModified": "2020-05-15T01:00:00+03:00" - } - ] + "selfQualified": true } } diff --git a/docs/source/tendering/esco/tutorial/bidder2-participation-url.http b/docs/source/tendering/esco/tutorial/bidder2-participation-url.http index ec90cff07f..f831e85bd9 100644 --- a/docs/source/tendering/esco/tutorial/bidder2-participation-url.http +++ b/docs/source/tendering/esco/tutorial/bidder2-participation-url.http @@ -1,4 +1,4 @@ -GET /api/2.5/tenders/0aac695e27804293a2854dff7bed4be8/bids/b649b9b2575142159fd240c728c87298?acc_token=a3322ea4c3e5495ebd9a1d928ea546d7 HTTP/1.0 +GET /api/2.5/tenders/0aac695e27804293a2854dff7bed4be8/bids/c72b35cfbfd84d7a980f772c02d025f6?acc_token=a3322ea4c3e5495ebd9a1d928ea546d7 HTTP/1.0 Authorization: Bearer broker Host: lb-api-sandbox.prozorro.gov.ua @@ -7,7 +7,6 @@ Content-Type: application/json; charset=UTF-8 { "data": { "status": "active", - "selfEligible": true, "value": { "yearlyPaymentsPercentage": 0.85, "valueAddedTaxIncluded": true, @@ -42,7 +41,7 @@ Content-Type: application/json; charset=UTF-8 900.0 ] }, - "id": "b649b9b2575142159fd240c728c87298", + "selfQualified": true, "tenderers": [ { "contactPoint": { @@ -67,8 +66,8 @@ Content-Type: application/json; charset=UTF-8 } ], "date": "2020-05-15T01:00:00+03:00", - "selfQualified": true, - "participationUrl": "http://auction-sandbox.prozorro.gov.ua/tenders/0aac695e27804293a2854dff7bed4be8?key_for_bid=b649b9b2575142159fd240c728c87298" + "id": "c72b35cfbfd84d7a980f772c02d025f6", + "participationUrl": "http://auction-sandbox.prozorro.gov.ua/tenders/0aac695e27804293a2854dff7bed4be8?key_for_bid=c72b35cfbfd84d7a980f772c02d025f6" } } diff --git a/docs/source/tendering/esco/tutorial/blank-tender-view.http b/docs/source/tendering/esco/tutorial/blank-tender-view.http index aa070249a5..327292926b 100644 --- a/docs/source/tendering/esco/tutorial/blank-tender-view.http +++ b/docs/source/tendering/esco/tutorial/blank-tender-view.http @@ -91,7 +91,7 @@ Content-Type: application/json; charset=UTF-8 }, "percentage": 54.45, "type": "financing", - "id": "93b9835cd6f8419fb56014c014773e8b" + "id": "d1068593e9a7477a8994ecee0e7fb48c" } ], "fundingKind": "other", @@ -118,7 +118,7 @@ Content-Type: application/json; charset=UTF-8 "region": "м. Київ", "locality": "м. Київ" }, - "id": "366a042aa96a4acdbe63112500608db1", + "id": "e1e8352d141b4814ba5c79c757fdd72a", "unit": { "code": "44617100-9", "name": "item" @@ -146,7 +146,7 @@ Content-Type: application/json; charset=UTF-8 "region": "м. Київ", "locality": "м. Київ" }, - "id": "9a24ed7daf1948b2923da55b02b720ed", + "id": "3edb0dc8dd6542508b405eddb7260162", "unit": { "code": "44617100-9", "name": "item" diff --git a/docs/source/tendering/esco/tutorial/confirm-qualification.http b/docs/source/tendering/esco/tutorial/confirm-qualification.http index 85421a0615..dce2c8e0b4 100644 --- a/docs/source/tendering/esco/tutorial/confirm-qualification.http +++ b/docs/source/tendering/esco/tutorial/confirm-qualification.http @@ -45,7 +45,7 @@ Content-Type: application/json; charset=UTF-8 "startDate": "2020-05-15T01:00:00+03:00", "endDate": "2020-05-26T00:00:00+03:00" }, - "bid_id": "e4528bc92c0f463ca1f661381961e106", + "bid_id": "498e07f6feea4ee99de14563abcf1d0c", "value": { "yearlyPaymentsPercentage": 0.9, "valueAddedTaxIncluded": true, diff --git a/docs/source/tendering/esco/tutorial/get-answer.http b/docs/source/tendering/esco/tutorial/get-answer.http index 29e37351ae..208cefabea 100644 --- a/docs/source/tendering/esco/tutorial/get-answer.http +++ b/docs/source/tendering/esco/tutorial/get-answer.http @@ -1,4 +1,4 @@ -GET /api/2.5/tenders/0aac695e27804293a2854dff7bed4be8/questions/c0ace3dda24e4cfab1c52c61462ceae8 HTTP/1.0 +GET /api/2.5/tenders/0aac695e27804293a2854dff7bed4be8/questions/1419a907c70b4401abafa401b7f00672 HTTP/1.0 Authorization: Bearer broker Host: lb-api-sandbox.prozorro.gov.ua @@ -11,7 +11,7 @@ Content-Type: application/json; charset=UTF-8 "title": "Калорійність", "date": "2020-05-15T01:00:00+03:00", "answer": "Таблицю додано в файлі \"Kalorijnist.xslx\"", - "id": "c0ace3dda24e4cfab1c52c61462ceae8", + "id": "1419a907c70b4401abafa401b7f00672", "questionOf": "tender" } } diff --git a/docs/source/tendering/esco/tutorial/list-question.http b/docs/source/tendering/esco/tutorial/list-question.http index f21f8fff5f..c30ead395d 100644 --- a/docs/source/tendering/esco/tutorial/list-question.http +++ b/docs/source/tendering/esco/tutorial/list-question.http @@ -12,7 +12,7 @@ Content-Type: application/json; charset=UTF-8 "title": "Калорійність", "date": "2020-05-15T01:00:00+03:00", "answer": "Таблицю додано в файлі \"Kalorijnist.xslx\"", - "id": "c0ace3dda24e4cfab1c52c61462ceae8", + "id": "1419a907c70b4401abafa401b7f00672", "questionOf": "tender" } ] diff --git a/docs/source/tendering/esco/tutorial/mark-bid-doc-private.http b/docs/source/tendering/esco/tutorial/mark-bid-doc-private.http index 2aa5c960fa..7dc89699cc 100644 --- a/docs/source/tendering/esco/tutorial/mark-bid-doc-private.http +++ b/docs/source/tendering/esco/tutorial/mark-bid-doc-private.http @@ -1,4 +1,4 @@ -PATCH /api/2.5/tenders/0aac695e27804293a2854dff7bed4be8/bids/e4528bc92c0f463ca1f661381961e106/documents/12d76b67e831404c8628f7612d0944b1?acc_token=29627267ed794908800e9ab5426bbd2e HTTP/1.0 +PATCH /api/2.5/tenders/0aac695e27804293a2854dff7bed4be8/bids/498e07f6feea4ee99de14563abcf1d0c/documents/12d76b67e831404c8628f7612d0944b1?acc_token=29627267ed794908800e9ab5426bbd2e HTTP/1.0 Authorization: Bearer broker Content-Length: 120 Content-Type: application/json @@ -19,7 +19,7 @@ Content-Type: application/json; charset=UTF-8 "confidentiality": "buyerOnly", "language": "uk", "format": "application/pdf", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/0aac695e27804293a2854dff7bed4be8/bids/e4528bc92c0f463ca1f661381961e106/documents/12d76b67e831404c8628f7612d0944b1?download=92e2b793a7d34373986f3c5619906253", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/0aac695e27804293a2854dff7bed4be8/bids/498e07f6feea4ee99de14563abcf1d0c/documents/12d76b67e831404c8628f7612d0944b1?download=92e2b793a7d34373986f3c5619906253", "confidentialityRationale": "Only our company sells badgers with pink hair.", "title": "Proposal_top_secrets.pdf", "documentOf": "tender", diff --git a/docs/source/tendering/esco/tutorial/patch-cancellation.http b/docs/source/tendering/esco/tutorial/patch-cancellation.http index e07a8c7f65..064dad91f8 100644 --- a/docs/source/tendering/esco/tutorial/patch-cancellation.http +++ b/docs/source/tendering/esco/tutorial/patch-cancellation.http @@ -1,4 +1,4 @@ -PATCH /api/2.5/tenders/0aac695e27804293a2854dff7bed4be8/cancellations/3efefdab89324f4aa00ff1853d92d0ab/documents/8930b31794ed4c728351984eb91111ef?acc_token=82d005b2183e43fe8edbb00cc6eb36c1 HTTP/1.0 +PATCH /api/2.5/tenders/0aac695e27804293a2854dff7bed4be8/cancellations/03ede869eb8e44be9018e92170eb8423/documents/8930b31794ed4c728351984eb91111ef?acc_token=82d005b2183e43fe8edbb00cc6eb36c1 HTTP/1.0 Authorization: Bearer broker Content-Length: 48 Content-Type: application/json diff --git a/docs/source/tendering/esco/tutorial/patch-items-value-periods.http b/docs/source/tendering/esco/tutorial/patch-items-value-periods.http index 9432d95704..b757ab3a02 100644 --- a/docs/source/tendering/esco/tutorial/patch-items-value-periods.http +++ b/docs/source/tendering/esco/tutorial/patch-items-value-periods.http @@ -7,7 +7,7 @@ DATA: { "data": { "tenderPeriod": { - "endDate": "2020-06-14T01:00:10+03:00" + "endDate": "2020-06-15T01:00:00+03:00" } } } @@ -20,16 +20,16 @@ Content-Type: application/json; charset=UTF-8 "mainProcurementCategory": "services", "complaintPeriod": { "startDate": "2020-05-15T01:00:00+03:00", - "endDate": "2020-06-10T00:00:00+03:00" + "endDate": "2020-06-11T00:00:00+02:00" }, "enquiryPeriod": { "startDate": "2020-05-15T01:00:00+03:00", - "clarificationsUntil": "2020-06-11T00:00:00+03:00", - "endDate": "2020-06-04T01:00:10+03:00", + "clarificationsUntil": "2020-06-11T00:00:00+02:00", + "endDate": "2020-06-05T00:00:00+02:00", "invalidationDate": "2020-05-15T01:00:00+03:00" }, "submissionMethod": "electronicAuction", - "next_check": "2020-06-14T01:00:10+03:00", + "next_check": "2020-06-15T01:00:00+03:00", "procuringEntity": { "kind": "general", "name": "ЗОСШ #10 м.Вінниці", @@ -66,10 +66,10 @@ Content-Type: application/json; charset=UTF-8 "status": "active.tendering", "tenderPeriod": { "startDate": "2020-05-15T01:00:00+03:00", - "endDate": "2020-06-14T01:00:10+03:00" + "endDate": "2020-06-15T00:00:00+02:00" }, "auctionPeriod": { - "shouldStartAfter": "2020-07-20T00:00:00+03:00" + "shouldStartAfter": "2020-07-20T00:00:00+02:00" }, "procurementMethodType": "esco", "date": "2020-05-15T01:00:00+03:00", @@ -102,7 +102,7 @@ Content-Type: application/json; charset=UTF-8 }, "percentage": 54.45, "type": "financing", - "id": "93b9835cd6f8419fb56014c014773e8b" + "id": "d1068593e9a7477a8994ecee0e7fb48c" } ], "fundingKind": "other", @@ -129,7 +129,7 @@ Content-Type: application/json; charset=UTF-8 "region": "м. Київ", "locality": "м. Київ" }, - "id": "366a042aa96a4acdbe63112500608db1", + "id": "e1e8352d141b4814ba5c79c757fdd72a", "unit": { "code": "44617100-9", "name": "item" @@ -157,7 +157,7 @@ Content-Type: application/json; charset=UTF-8 "region": "м. Київ", "locality": "м. Київ" }, - "id": "9a24ed7daf1948b2923da55b02b720ed", + "id": "3edb0dc8dd6542508b405eddb7260162", "unit": { "code": "44617100-9", "name": "item" diff --git a/docs/source/tendering/esco/tutorial/pending-cancellation.http b/docs/source/tendering/esco/tutorial/pending-cancellation.http index b0e12031ae..074f0d7081 100644 --- a/docs/source/tendering/esco/tutorial/pending-cancellation.http +++ b/docs/source/tendering/esco/tutorial/pending-cancellation.http @@ -1,4 +1,4 @@ -PATCH /api/2.5/tenders/0aac695e27804293a2854dff7bed4be8/cancellations/3efefdab89324f4aa00ff1853d92d0ab?acc_token=82d005b2183e43fe8edbb00cc6eb36c1 HTTP/1.0 +PATCH /api/2.5/tenders/0aac695e27804293a2854dff7bed4be8/cancellations/03ede869eb8e44be9018e92170eb8423?acc_token=82d005b2183e43fe8edbb00cc6eb36c1 HTTP/1.0 Authorization: Bearer broker Content-Length: 31 Content-Type: application/json @@ -49,7 +49,7 @@ Content-Type: application/json; charset=UTF-8 "reasonType": "expensesCut", "date": "2020-05-15T01:00:01+03:00", "cancellationOf": "tender", - "id": "3efefdab89324f4aa00ff1853d92d0ab" + "id": "03ede869eb8e44be9018e92170eb8423" } } diff --git a/docs/source/tendering/esco/tutorial/pre-qualification-confirmation.http b/docs/source/tendering/esco/tutorial/pre-qualification-confirmation.http index 86da740e5e..8760735959 100644 --- a/docs/source/tendering/esco/tutorial/pre-qualification-confirmation.http +++ b/docs/source/tendering/esco/tutorial/pre-qualification-confirmation.http @@ -23,8 +23,8 @@ Content-Type: application/json; charset=UTF-8 }, "enquiryPeriod": { "startDate": "2020-04-14T01:00:00+03:00", - "clarificationsUntil": "2020-05-09T00:00:00+03:00", - "endDate": "2020-05-05T01:00:00+03:00", + "clarificationsUntil": "2020-05-08T00:00:00+03:00", + "endDate": "2020-05-05T00:00:00+03:00", "invalidationDate": "2020-05-15T01:00:00+03:00" }, "submissionMethod": "electronicAuction", @@ -62,7 +62,7 @@ Content-Type: application/json; charset=UTF-8 "title": "Калорійність", "date": "2020-05-15T01:00:00+03:00", "answer": "Таблицю додано в файлі \"Kalorijnist.xslx\"", - "id": "c0ace3dda24e4cfab1c52c61462ceae8", + "id": "1419a907c70b4401abafa401b7f00672", "questionOf": "tender" } ], @@ -72,7 +72,7 @@ Content-Type: application/json; charset=UTF-8 "status": "active", "eligible": true, "qualified": true, - "bidID": "e4528bc92c0f463ca1f661381961e106", + "bidID": "498e07f6feea4ee99de14563abcf1d0c", "date": "2020-05-15T01:00:00+03:00", "id": "de8bbc96c24f498488bf279a41416c9f" }, @@ -80,7 +80,7 @@ Content-Type: application/json; charset=UTF-8 "status": "active", "eligible": true, "qualified": true, - "bidID": "b649b9b2575142159fd240c728c87298", + "bidID": "c72b35cfbfd84d7a980f772c02d025f6", "date": "2020-05-15T01:00:00+03:00", "id": "81988da3ce1f4cfdba7afe53020a62e6" }, @@ -88,7 +88,7 @@ Content-Type: application/json; charset=UTF-8 "status": "unsuccessful", "eligible": false, "qualified": false, - "bidID": "5e79c825b4c54c36a179b22db2dae23b", + "bidID": "2d751be3f6aa46ba8dfd6eebcd5d9130", "date": "2020-05-15T01:00:00+03:00", "id": "0da9ff005c5b4951af49ef8d1863ce0b" } @@ -184,7 +184,7 @@ Content-Type: application/json; charset=UTF-8 }, "percentage": 54.45, "type": "financing", - "id": "93b9835cd6f8419fb56014c014773e8b" + "id": "d1068593e9a7477a8994ecee0e7fb48c" } ], "fundingKind": "other", @@ -211,7 +211,7 @@ Content-Type: application/json; charset=UTF-8 "region": "м. Київ", "locality": "м. Київ" }, - "id": "366a042aa96a4acdbe63112500608db1", + "id": "e1e8352d141b4814ba5c79c757fdd72a", "unit": { "code": "44617100-9", "name": "item" @@ -239,7 +239,7 @@ Content-Type: application/json; charset=UTF-8 "region": "м. Київ", "locality": "м. Київ" }, - "id": "9a24ed7daf1948b2923da55b02b720ed", + "id": "3edb0dc8dd6542508b405eddb7260162", "unit": { "code": "44617100-9", "name": "item" @@ -267,7 +267,7 @@ Content-Type: application/json; charset=UTF-8 "confidentiality": "buyerOnly", "language": "uk", "format": "application/pdf", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/0aac695e27804293a2854dff7bed4be8/bids/e4528bc92c0f463ca1f661381961e106/documents/12d76b67e831404c8628f7612d0944b1?download=92e2b793a7d34373986f3c5619906253", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/0aac695e27804293a2854dff7bed4be8/bids/498e07f6feea4ee99de14563abcf1d0c/documents/12d76b67e831404c8628f7612d0944b1?download=92e2b793a7d34373986f3c5619906253", "confidentialityRationale": "Only our company sells badgers with pink hair.", "title": "Proposal_top_secrets.pdf", "documentOf": "tender", @@ -299,7 +299,7 @@ Content-Type: application/json; charset=UTF-8 } } ], - "id": "e4528bc92c0f463ca1f661381961e106", + "id": "498e07f6feea4ee99de14563abcf1d0c", "eligibilityDocuments": [ { "hash": "md5:00000000000000000000000000000000", @@ -317,7 +317,7 @@ Content-Type: application/json; charset=UTF-8 }, { "status": "active", - "id": "b649b9b2575142159fd240c728c87298", + "id": "c72b35cfbfd84d7a980f772c02d025f6", "tenderers": [ { "contactPoint": { @@ -354,7 +354,7 @@ Content-Type: application/json; charset=UTF-8 "format": "application/pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", - "id": "824f270cc0b749bd989983329634a5de", + "id": "437ffa3708534314aa799bf9d166b0bc", "dateModified": "2020-05-15T01:00:00+03:00" }, { @@ -362,12 +362,12 @@ Content-Type: application/json; charset=UTF-8 "confidentiality": "buyerOnly", "language": "uk", "format": "application/pdf", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/0aac695e27804293a2854dff7bed4be8/bids/5e79c825b4c54c36a179b22db2dae23b/documents/fc90022e9584421e90d0438c8b331cc8?download=368ab90ae6a748e6be48d5d2151aee66", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/0aac695e27804293a2854dff7bed4be8/bids/2d751be3f6aa46ba8dfd6eebcd5d9130/documents/685b1826738c419bb4af2e171204a06b?download=368ab90ae6a748e6be48d5d2151aee66", "confidentialityRationale": "Only our company sells badgers with pink hair.", "title": "Proposal_part2.pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", - "id": "fc90022e9584421e90d0438c8b331cc8", + "id": "685b1826738c419bb4af2e171204a06b", "dateModified": "2020-05-15T01:00:00+03:00" } ], @@ -381,12 +381,11 @@ Content-Type: application/json; charset=UTF-8 "format": "application/pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", - "id": "7adad4419c2f4b30b066e8e584a62f25", + "id": "59a1e9382b294643adc4e5d5927146b5", "dateModified": "2020-05-15T01:00:00+03:00" } ], - "selfEligible": true, - "selfQualified": true, + "id": "2d751be3f6aa46ba8dfd6eebcd5d9130", "tenderers": [ { "contactPoint": { @@ -410,7 +409,7 @@ Content-Type: application/json; charset=UTF-8 } } ], - "id": "5e79c825b4c54c36a179b22db2dae23b" + "selfQualified": true } ], "noticePublicationDate": "2020-05-15T01:00:00+03:00", diff --git a/docs/source/tendering/esco/tutorial/prepare-cancellation.http b/docs/source/tendering/esco/tutorial/prepare-cancellation.http index 9ce125d396..f648edc78a 100644 --- a/docs/source/tendering/esco/tutorial/prepare-cancellation.http +++ b/docs/source/tendering/esco/tutorial/prepare-cancellation.http @@ -13,7 +13,7 @@ DATA: Response: 201 Created Content-Type: application/json; charset=UTF-8 -Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/0aac695e27804293a2854dff7bed4be8/cancellations/3efefdab89324f4aa00ff1853d92d0ab +Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/0aac695e27804293a2854dff7bed4be8/cancellations/03ede869eb8e44be9018e92170eb8423 { "data": { "status": "draft", @@ -21,7 +21,7 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/0aac695e27804293 "reasonType": "unFixable", "date": "2020-05-15T01:00:01+03:00", "cancellationOf": "tender", - "id": "3efefdab89324f4aa00ff1853d92d0ab" + "id": "03ede869eb8e44be9018e92170eb8423" } } diff --git a/docs/source/tendering/esco/tutorial/qualificated-bids-view.http b/docs/source/tendering/esco/tutorial/qualificated-bids-view.http index a8451208ed..6e2defa53e 100644 --- a/docs/source/tendering/esco/tutorial/qualificated-bids-view.http +++ b/docs/source/tendering/esco/tutorial/qualificated-bids-view.http @@ -26,7 +26,7 @@ Content-Type: application/json; charset=UTF-8 "confidentiality": "buyerOnly", "language": "uk", "format": "application/pdf", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/0aac695e27804293a2854dff7bed4be8/bids/e4528bc92c0f463ca1f661381961e106/documents/12d76b67e831404c8628f7612d0944b1?download=92e2b793a7d34373986f3c5619906253", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/0aac695e27804293a2854dff7bed4be8/bids/498e07f6feea4ee99de14563abcf1d0c/documents/12d76b67e831404c8628f7612d0944b1?download=92e2b793a7d34373986f3c5619906253", "confidentialityRationale": "Only our company sells badgers with pink hair.", "title": "Proposal_top_secrets.pdf", "documentOf": "tender", @@ -58,7 +58,7 @@ Content-Type: application/json; charset=UTF-8 } } ], - "id": "e4528bc92c0f463ca1f661381961e106", + "id": "498e07f6feea4ee99de14563abcf1d0c", "eligibilityDocuments": [ { "hash": "md5:00000000000000000000000000000000", @@ -76,7 +76,7 @@ Content-Type: application/json; charset=UTF-8 }, { "status": "active", - "id": "b649b9b2575142159fd240c728c87298", + "id": "c72b35cfbfd84d7a980f772c02d025f6", "tenderers": [ { "contactPoint": { @@ -113,7 +113,7 @@ Content-Type: application/json; charset=UTF-8 "format": "application/pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", - "id": "824f270cc0b749bd989983329634a5de", + "id": "437ffa3708534314aa799bf9d166b0bc", "dateModified": "2020-05-15T01:00:00+03:00" }, { @@ -121,12 +121,12 @@ Content-Type: application/json; charset=UTF-8 "confidentiality": "buyerOnly", "language": "uk", "format": "application/pdf", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/0aac695e27804293a2854dff7bed4be8/bids/5e79c825b4c54c36a179b22db2dae23b/documents/fc90022e9584421e90d0438c8b331cc8?download=368ab90ae6a748e6be48d5d2151aee66", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/0aac695e27804293a2854dff7bed4be8/bids/2d751be3f6aa46ba8dfd6eebcd5d9130/documents/685b1826738c419bb4af2e171204a06b?download=368ab90ae6a748e6be48d5d2151aee66", "confidentialityRationale": "Only our company sells badgers with pink hair.", "title": "Proposal_part2.pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", - "id": "fc90022e9584421e90d0438c8b331cc8", + "id": "685b1826738c419bb4af2e171204a06b", "dateModified": "2020-05-15T01:00:00+03:00" } ], @@ -140,12 +140,11 @@ Content-Type: application/json; charset=UTF-8 "format": "application/pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", - "id": "7adad4419c2f4b30b066e8e584a62f25", + "id": "59a1e9382b294643adc4e5d5927146b5", "dateModified": "2020-05-15T01:00:00+03:00" } ], - "selfEligible": true, - "selfQualified": true, + "id": "2d751be3f6aa46ba8dfd6eebcd5d9130", "tenderers": [ { "contactPoint": { @@ -169,7 +168,7 @@ Content-Type: application/json; charset=UTF-8 } } ], - "id": "5e79c825b4c54c36a179b22db2dae23b" + "selfQualified": true } ] } diff --git a/docs/source/tendering/esco/tutorial/qualifications-listing.http b/docs/source/tendering/esco/tutorial/qualifications-listing.http index 1b7dc930af..f7ac9cad1c 100644 --- a/docs/source/tendering/esco/tutorial/qualifications-listing.http +++ b/docs/source/tendering/esco/tutorial/qualifications-listing.http @@ -15,8 +15,8 @@ Content-Type: application/json; charset=UTF-8 }, "enquiryPeriod": { "startDate": "2020-04-14T01:00:00+03:00", - "clarificationsUntil": "2020-05-09T00:00:00+03:00", - "endDate": "2020-05-05T01:00:00+03:00", + "clarificationsUntil": "2020-05-08T00:00:00+03:00", + "endDate": "2020-05-05T00:00:00+03:00", "invalidationDate": "2020-05-15T01:00:00+03:00" }, "submissionMethod": "electronicAuction", @@ -52,7 +52,7 @@ Content-Type: application/json; charset=UTF-8 "title": "Калорійність", "date": "2020-05-15T01:00:00+03:00", "answer": "Таблицю додано в файлі \"Kalorijnist.xslx\"", - "id": "c0ace3dda24e4cfab1c52c61462ceae8", + "id": "1419a907c70b4401abafa401b7f00672", "questionOf": "tender" } ], @@ -121,7 +121,7 @@ Content-Type: application/json; charset=UTF-8 "status": "pending", "eligible": false, "qualified": false, - "bidID": "e4528bc92c0f463ca1f661381961e106", + "bidID": "498e07f6feea4ee99de14563abcf1d0c", "date": "2020-05-15T01:00:00+03:00", "id": "de8bbc96c24f498488bf279a41416c9f" }, @@ -129,7 +129,7 @@ Content-Type: application/json; charset=UTF-8 "status": "pending", "eligible": false, "qualified": false, - "bidID": "b649b9b2575142159fd240c728c87298", + "bidID": "c72b35cfbfd84d7a980f772c02d025f6", "date": "2020-05-15T01:00:00+03:00", "id": "81988da3ce1f4cfdba7afe53020a62e6" }, @@ -137,7 +137,7 @@ Content-Type: application/json; charset=UTF-8 "status": "pending", "eligible": false, "qualified": false, - "bidID": "5e79c825b4c54c36a179b22db2dae23b", + "bidID": "2d751be3f6aa46ba8dfd6eebcd5d9130", "date": "2020-05-15T01:00:00+03:00", "id": "0da9ff005c5b4951af49ef8d1863ce0b" } @@ -171,7 +171,7 @@ Content-Type: application/json; charset=UTF-8 }, "percentage": 54.45, "type": "financing", - "id": "93b9835cd6f8419fb56014c014773e8b" + "id": "d1068593e9a7477a8994ecee0e7fb48c" } ], "fundingKind": "other", @@ -198,7 +198,7 @@ Content-Type: application/json; charset=UTF-8 "region": "м. Київ", "locality": "м. Київ" }, - "id": "366a042aa96a4acdbe63112500608db1", + "id": "e1e8352d141b4814ba5c79c757fdd72a", "unit": { "code": "44617100-9", "name": "item" @@ -226,7 +226,7 @@ Content-Type: application/json; charset=UTF-8 "region": "м. Київ", "locality": "м. Київ" }, - "id": "9a24ed7daf1948b2923da55b02b720ed", + "id": "3edb0dc8dd6542508b405eddb7260162", "unit": { "code": "44617100-9", "name": "item" @@ -285,7 +285,7 @@ Content-Type: application/json; charset=UTF-8 } } ], - "id": "e4528bc92c0f463ca1f661381961e106", + "id": "498e07f6feea4ee99de14563abcf1d0c", "eligibilityDocuments": [ { "hash": "md5:00000000000000000000000000000000", @@ -303,7 +303,7 @@ Content-Type: application/json; charset=UTF-8 }, { "status": "pending", - "id": "b649b9b2575142159fd240c728c87298", + "id": "c72b35cfbfd84d7a980f772c02d025f6", "tenderers": [ { "contactPoint": { @@ -340,7 +340,7 @@ Content-Type: application/json; charset=UTF-8 "format": "application/pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", - "id": "824f270cc0b749bd989983329634a5de", + "id": "437ffa3708534314aa799bf9d166b0bc", "dateModified": "2020-05-15T01:00:00+03:00" }, { @@ -353,7 +353,7 @@ Content-Type: application/json; charset=UTF-8 "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", "dateModified": "2020-05-15T01:00:00+03:00", - "id": "fc90022e9584421e90d0438c8b331cc8" + "id": "685b1826738c419bb4af2e171204a06b" } ], "tenderers": [ @@ -379,7 +379,7 @@ Content-Type: application/json; charset=UTF-8 } } ], - "id": "5e79c825b4c54c36a179b22db2dae23b", + "id": "2d751be3f6aa46ba8dfd6eebcd5d9130", "eligibilityDocuments": [ { "hash": "md5:00000000000000000000000000000000", @@ -390,7 +390,7 @@ Content-Type: application/json; charset=UTF-8 "format": "application/pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", - "id": "7adad4419c2f4b30b066e8e584a62f25", + "id": "59a1e9382b294643adc4e5d5927146b5", "dateModified": "2020-05-15T01:00:00+03:00" } ] diff --git a/docs/source/tendering/esco/tutorial/register-2nd-bidder.http b/docs/source/tendering/esco/tutorial/register-2nd-bidder.http index 7d881ea2a3..cacc8ebd9e 100644 --- a/docs/source/tendering/esco/tutorial/register-2nd-bidder.http +++ b/docs/source/tendering/esco/tutorial/register-2nd-bidder.http @@ -1,12 +1,11 @@ POST /api/2.5/tenders/0aac695e27804293a2854dff7bed4be8/bids HTTP/1.0 Authorization: Bearer broker -Content-Length: 1022 +Content-Length: 1000 Content-Type: application/json Host: lb-api-sandbox.prozorro.gov.ua DATA: { "data": { - "selfEligible": true, "selfQualified": true, "value": { "contractDuration": { @@ -66,7 +65,7 @@ DATA: Response: 201 Created Content-Type: application/json; charset=UTF-8 -Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/0aac695e27804293a2854dff7bed4be8/bids/b649b9b2575142159fd240c728c87298 +Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/0aac695e27804293a2854dff7bed4be8/bids/c72b35cfbfd84d7a980f772c02d025f6 { "access": { "transfer": "a91de4c425bc4bc09ae040f2a987d0ce", @@ -74,7 +73,6 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/0aac695e27804293 }, "data": { "status": "pending", - "selfEligible": true, "value": { "yearlyPaymentsPercentage": 0.85, "valueAddedTaxIncluded": true, @@ -109,7 +107,7 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/0aac695e27804293 900.0 ] }, - "selfQualified": true, + "id": "c72b35cfbfd84d7a980f772c02d025f6", "tenderers": [ { "contactPoint": { @@ -134,7 +132,7 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/0aac695e27804293 } ], "date": "2020-05-15T01:00:00+03:00", - "id": "b649b9b2575142159fd240c728c87298" + "selfQualified": true } } diff --git a/docs/source/tendering/esco/tutorial/register-3rd-bidder.http b/docs/source/tendering/esco/tutorial/register-3rd-bidder.http index 0759db608f..4607b156d3 100644 --- a/docs/source/tendering/esco/tutorial/register-3rd-bidder.http +++ b/docs/source/tendering/esco/tutorial/register-3rd-bidder.http @@ -1,6 +1,6 @@ POST /api/2.5/tenders/0aac695e27804293a2854dff7bed4be8/bids HTTP/1.0 Authorization: Bearer broker -Content-Length: 2844 +Content-Length: 2822 Content-Type: application/json Host: lb-api-sandbox.prozorro.gov.ua DATA: @@ -30,7 +30,6 @@ DATA: "title": "eligibility_doc.pdf" } ], - "selfEligible": true, "value": { "contractDuration": { "days": 40, @@ -106,7 +105,7 @@ DATA: Response: 201 Created Content-Type: application/json; charset=UTF-8 -Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/0aac695e27804293a2854dff7bed4be8/bids/5e79c825b4c54c36a179b22db2dae23b +Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/0aac695e27804293a2854dff7bed4be8/bids/2d751be3f6aa46ba8dfd6eebcd5d9130 { "access": { "transfer": "c7378ba1bdda4a818b444f6a2697c3d9", @@ -120,11 +119,11 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/0aac695e27804293 "confidentiality": "public", "language": "uk", "title": "Proposal_part1.pdf", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/0aac695e27804293a2854dff7bed4be8/bids/5e79c825b4c54c36a179b22db2dae23b/documents/824f270cc0b749bd989983329634a5de?download=21ef16b5420c40b48a8d16d91f49eeb4", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/0aac695e27804293a2854dff7bed4be8/bids/2d751be3f6aa46ba8dfd6eebcd5d9130/documents/437ffa3708534314aa799bf9d166b0bc?download=21ef16b5420c40b48a8d16d91f49eeb4", "format": "application/pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", - "id": "824f270cc0b749bd989983329634a5de", + "id": "437ffa3708534314aa799bf9d166b0bc", "dateModified": "2020-05-15T01:00:00+03:00" }, { @@ -137,7 +136,7 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/0aac695e27804293 "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", "dateModified": "2020-05-15T01:00:00+03:00", - "id": "fc90022e9584421e90d0438c8b331cc8" + "id": "685b1826738c419bb4af2e171204a06b" } ], "eligibilityDocuments": [ @@ -146,16 +145,15 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/0aac695e27804293 "confidentiality": "public", "language": "uk", "title": "eligibility_doc.pdf", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/0aac695e27804293a2854dff7bed4be8/bids/5e79c825b4c54c36a179b22db2dae23b/eligibility_documents/7adad4419c2f4b30b066e8e584a62f25?download=2ee8fe8abbb94b7ebefa67990b15a743", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/0aac695e27804293a2854dff7bed4be8/bids/2d751be3f6aa46ba8dfd6eebcd5d9130/eligibility_documents/59a1e9382b294643adc4e5d5927146b5?download=2ee8fe8abbb94b7ebefa67990b15a743", "format": "application/pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", - "id": "7adad4419c2f4b30b066e8e584a62f25", + "id": "59a1e9382b294643adc4e5d5927146b5", "dateModified": "2020-05-15T01:00:00+03:00" } ], - "selfEligible": true, - "id": "5e79c825b4c54c36a179b22db2dae23b", + "id": "2d751be3f6aa46ba8dfd6eebcd5d9130", "value": { "yearlyPaymentsPercentage": 0.86, "valueAddedTaxIncluded": true, @@ -190,18 +188,31 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/0aac695e27804293 800.0 ] }, - "selfQualified": true, + "qualificationDocuments": [ + { + "hash": "md5:00000000000000000000000000000000", + "confidentiality": "public", + "language": "uk", + "title": "qualification_document.pdf", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/0aac695e27804293a2854dff7bed4be8/bids/2d751be3f6aa46ba8dfd6eebcd5d9130/qualification_documents/5b22eea36923469e9953bc02280cbd32?download=5adb6bac38c9431284763180f68198be", + "format": "application/pdf", + "documentOf": "tender", + "datePublished": "2020-05-15T01:00:00+03:00", + "id": "5b22eea36923469e9953bc02280cbd32", + "dateModified": "2020-05-15T01:00:00+03:00" + } + ], "financialDocuments": [ { "hash": "md5:00000000000000000000000000000000", "confidentiality": "public", "language": "uk", "title": "financial_doc.pdf", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/0aac695e27804293a2854dff7bed4be8/bids/5e79c825b4c54c36a179b22db2dae23b/financial_documents/1c73e057a06b4ae5a71824069263ed43?download=643769d36825492a97eb6ceebb19eb1f", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/0aac695e27804293a2854dff7bed4be8/bids/2d751be3f6aa46ba8dfd6eebcd5d9130/financial_documents/bd991958a76f4c4ea401c4588217fd0a?download=643769d36825492a97eb6ceebb19eb1f", "format": "application/pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", - "id": "1c73e057a06b4ae5a71824069263ed43", + "id": "bd991958a76f4c4ea401c4588217fd0a", "dateModified": "2020-05-15T01:00:00+03:00" } ], @@ -229,20 +240,7 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/0aac695e27804293 } ], "date": "2020-05-15T01:00:00+03:00", - "qualificationDocuments": [ - { - "hash": "md5:00000000000000000000000000000000", - "confidentiality": "public", - "language": "uk", - "title": "qualification_document.pdf", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/0aac695e27804293a2854dff7bed4be8/bids/5e79c825b4c54c36a179b22db2dae23b/qualification_documents/fe588ea0e24f4fd2b0ea10370536c95e?download=5adb6bac38c9431284763180f68198be", - "format": "application/pdf", - "documentOf": "tender", - "datePublished": "2020-05-15T01:00:00+03:00", - "id": "fe588ea0e24f4fd2b0ea10370536c95e", - "dateModified": "2020-05-15T01:00:00+03:00" - } - ] + "selfQualified": true } } diff --git a/docs/source/tendering/esco/tutorial/register-bidder.http b/docs/source/tendering/esco/tutorial/register-bidder.http index 25b8af71eb..da047d5945 100644 --- a/docs/source/tendering/esco/tutorial/register-bidder.http +++ b/docs/source/tendering/esco/tutorial/register-bidder.http @@ -1,13 +1,14 @@ POST /api/2.5/tenders/0aac695e27804293a2854dff7bed4be8/bids HTTP/1.0 Authorization: Bearer broker -Content-Length: 1217 +Content-Length: 1195 Content-Type: application/json Host: lb-api-sandbox.prozorro.gov.ua DATA: { "data": { "status": "draft", - "selfEligible": true, + "subcontractingDetails": "ДКП «Орфей», Україна", + "selfQualified": true, "value": { "contractDuration": { "days": 74, @@ -38,7 +39,6 @@ DATA: 1000 ] }, - "subcontractingDetails": "ДКП «Орфей», Україна", "tenderers": [ { "contactPoint": { @@ -61,14 +61,13 @@ DATA: "locality": "м. Вінниця" } } - ], - "selfQualified": true + ] } } Response: 201 Created Content-Type: application/json; charset=UTF-8 -Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/0aac695e27804293a2854dff7bed4be8/bids/e4528bc92c0f463ca1f661381961e106 +Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/0aac695e27804293a2854dff7bed4be8/bids/498e07f6feea4ee99de14563abcf1d0c { "access": { "transfer": "386b1470e5744d81b11a1bd9b3b247ee", @@ -76,8 +75,7 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/0aac695e27804293 }, "data": { "status": "draft", - "selfEligible": true, - "id": "e4528bc92c0f463ca1f661381961e106", + "id": "498e07f6feea4ee99de14563abcf1d0c", "value": { "yearlyPaymentsPercentage": 0.9, "valueAddedTaxIncluded": true, diff --git a/docs/source/tendering/esco/tutorial/reject-qualification3.http b/docs/source/tendering/esco/tutorial/reject-qualification3.http index 7a818c99da..25b34df24f 100644 --- a/docs/source/tendering/esco/tutorial/reject-qualification3.http +++ b/docs/source/tendering/esco/tutorial/reject-qualification3.http @@ -17,7 +17,7 @@ Content-Type: application/json; charset=UTF-8 "status": "unsuccessful", "eligible": false, "qualified": false, - "bidID": "5e79c825b4c54c36a179b22db2dae23b", + "bidID": "2d751be3f6aa46ba8dfd6eebcd5d9130", "date": "2020-05-15T01:00:00+03:00", "id": "0da9ff005c5b4951af49ef8d1863ce0b" } diff --git a/docs/source/tendering/esco/tutorial/rejected-bid-view.http b/docs/source/tendering/esco/tutorial/rejected-bid-view.http index 10dfac2707..b9ba665212 100644 --- a/docs/source/tendering/esco/tutorial/rejected-bid-view.http +++ b/docs/source/tendering/esco/tutorial/rejected-bid-view.http @@ -1,4 +1,4 @@ -GET /api/2.5/tenders/0aac695e27804293a2854dff7bed4be8/bids/5e79c825b4c54c36a179b22db2dae23b?acc_token=82d005b2183e43fe8edbb00cc6eb36c1 HTTP/1.0 +GET /api/2.5/tenders/0aac695e27804293a2854dff7bed4be8/bids/2d751be3f6aa46ba8dfd6eebcd5d9130?acc_token=82d005b2183e43fe8edbb00cc6eb36c1 HTTP/1.0 Authorization: Bearer broker Host: lb-api-sandbox.prozorro.gov.ua @@ -17,7 +17,7 @@ Content-Type: application/json; charset=UTF-8 "format": "application/pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", - "id": "824f270cc0b749bd989983329634a5de", + "id": "437ffa3708534314aa799bf9d166b0bc", "dateModified": "2020-05-15T01:00:00+03:00" }, { @@ -25,12 +25,12 @@ Content-Type: application/json; charset=UTF-8 "confidentiality": "buyerOnly", "language": "uk", "format": "application/pdf", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/0aac695e27804293a2854dff7bed4be8/bids/5e79c825b4c54c36a179b22db2dae23b/documents/fc90022e9584421e90d0438c8b331cc8?download=368ab90ae6a748e6be48d5d2151aee66", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/0aac695e27804293a2854dff7bed4be8/bids/2d751be3f6aa46ba8dfd6eebcd5d9130/documents/685b1826738c419bb4af2e171204a06b?download=368ab90ae6a748e6be48d5d2151aee66", "confidentialityRationale": "Only our company sells badgers with pink hair.", "title": "Proposal_part2.pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", - "id": "fc90022e9584421e90d0438c8b331cc8", + "id": "685b1826738c419bb4af2e171204a06b", "dateModified": "2020-05-15T01:00:00+03:00" } ], @@ -44,12 +44,11 @@ Content-Type: application/json; charset=UTF-8 "format": "application/pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", - "id": "7adad4419c2f4b30b066e8e584a62f25", + "id": "59a1e9382b294643adc4e5d5927146b5", "dateModified": "2020-05-15T01:00:00+03:00" } ], - "selfEligible": true, - "selfQualified": true, + "id": "2d751be3f6aa46ba8dfd6eebcd5d9130", "tenderers": [ { "contactPoint": { @@ -73,7 +72,7 @@ Content-Type: application/json; charset=UTF-8 } } ], - "id": "5e79c825b4c54c36a179b22db2dae23b" + "selfQualified": true } } diff --git a/docs/source/tendering/esco/tutorial/set-bid-guarantee.http b/docs/source/tendering/esco/tutorial/set-bid-guarantee.http index eca0823cbd..0ea596af01 100644 --- a/docs/source/tendering/esco/tutorial/set-bid-guarantee.http +++ b/docs/source/tendering/esco/tutorial/set-bid-guarantee.http @@ -21,16 +21,16 @@ Content-Type: application/json; charset=UTF-8 "mainProcurementCategory": "services", "complaintPeriod": { "startDate": "2020-05-15T01:00:00+03:00", - "endDate": "2020-06-10T00:00:00+03:00" + "endDate": "2020-06-11T00:00:00+02:00" }, "enquiryPeriod": { "startDate": "2020-05-15T01:00:00+03:00", - "clarificationsUntil": "2020-06-11T00:00:00+03:00", - "endDate": "2020-06-04T01:00:10+03:00", + "clarificationsUntil": "2020-06-11T00:00:00+02:00", + "endDate": "2020-06-05T00:00:00+02:00", "invalidationDate": "2020-05-15T01:00:00+03:00" }, "submissionMethod": "electronicAuction", - "next_check": "2020-06-14T01:00:10+03:00", + "next_check": "2020-06-15T01:00:00+03:00", "procuringEntity": { "kind": "general", "name": "ЗОСШ #10 м.Вінниці", @@ -71,10 +71,10 @@ Content-Type: application/json; charset=UTF-8 "status": "active.tendering", "tenderPeriod": { "startDate": "2020-05-15T01:00:00+03:00", - "endDate": "2020-06-14T01:00:10+03:00" + "endDate": "2020-06-15T00:00:00+02:00" }, "auctionPeriod": { - "shouldStartAfter": "2020-07-20T00:00:00+03:00" + "shouldStartAfter": "2020-07-20T00:00:00+02:00" }, "procurementMethodType": "esco", "date": "2020-05-15T01:00:00+03:00", @@ -107,7 +107,7 @@ Content-Type: application/json; charset=UTF-8 }, "percentage": 54.45, "type": "financing", - "id": "93b9835cd6f8419fb56014c014773e8b" + "id": "d1068593e9a7477a8994ecee0e7fb48c" } ], "fundingKind": "other", @@ -134,7 +134,7 @@ Content-Type: application/json; charset=UTF-8 "region": "м. Київ", "locality": "м. Київ" }, - "id": "366a042aa96a4acdbe63112500608db1", + "id": "e1e8352d141b4814ba5c79c757fdd72a", "unit": { "code": "44617100-9", "name": "item" @@ -162,7 +162,7 @@ Content-Type: application/json; charset=UTF-8 "region": "м. Київ", "locality": "м. Київ" }, - "id": "9a24ed7daf1948b2923da55b02b720ed", + "id": "3edb0dc8dd6542508b405eddb7260162", "unit": { "code": "44617100-9", "name": "item" diff --git a/docs/source/tendering/esco/tutorial/tender-cancelled.http b/docs/source/tendering/esco/tutorial/tender-cancelled.http index 5bbc017896..435786ecdd 100644 --- a/docs/source/tendering/esco/tutorial/tender-cancelled.http +++ b/docs/source/tendering/esco/tutorial/tender-cancelled.http @@ -21,7 +21,7 @@ Content-Type: application/json; charset=UTF-8 "enquiryPeriod": { "startDate": "2020-04-04T01:00:00+03:00", "clarificationsUntil": "2020-04-30T00:00:00+03:00", - "endDate": "2020-04-25T01:00:00+03:00", + "endDate": "2020-04-25T00:00:00+03:00", "invalidationDate": "2020-05-15T01:00:00+03:00" }, "submissionMethod": "electronicAuction", @@ -78,7 +78,7 @@ Content-Type: application/json; charset=UTF-8 "date": "2020-05-15T01:00:00+03:00", "answer": "Таблицю додано в файлі \"Kalorijnist.xslx\"", "dateAnswered": "2020-05-15T01:00:00+03:00", - "id": "c0ace3dda24e4cfab1c52c61462ceae8", + "id": "1419a907c70b4401abafa401b7f00672", "questionOf": "tender" } ], @@ -88,7 +88,7 @@ Content-Type: application/json; charset=UTF-8 "status": "active", "eligible": true, "qualified": true, - "bidID": "e4528bc92c0f463ca1f661381961e106", + "bidID": "498e07f6feea4ee99de14563abcf1d0c", "date": "2020-05-15T01:00:00+03:00", "id": "de8bbc96c24f498488bf279a41416c9f" }, @@ -96,7 +96,7 @@ Content-Type: application/json; charset=UTF-8 "status": "active", "eligible": true, "qualified": true, - "bidID": "b649b9b2575142159fd240c728c87298", + "bidID": "c72b35cfbfd84d7a980f772c02d025f6", "date": "2020-05-15T01:00:00+03:00", "id": "81988da3ce1f4cfdba7afe53020a62e6" }, @@ -104,7 +104,7 @@ Content-Type: application/json; charset=UTF-8 "status": "unsuccessful", "eligible": false, "qualified": false, - "bidID": "5e79c825b4c54c36a179b22db2dae23b", + "bidID": "2d751be3f6aa46ba8dfd6eebcd5d9130", "date": "2020-05-15T01:00:00+03:00", "id": "0da9ff005c5b4951af49ef8d1863ce0b" } @@ -221,7 +221,7 @@ Content-Type: application/json; charset=UTF-8 "region": "м. Київ", "locality": "м. Київ" }, - "id": "366a042aa96a4acdbe63112500608db1", + "id": "e1e8352d141b4814ba5c79c757fdd72a", "unit": { "code": "44617100-9", "name": "item" @@ -249,7 +249,7 @@ Content-Type: application/json; charset=UTF-8 "region": "м. Київ", "locality": "м. Київ" }, - "id": "9a24ed7daf1948b2923da55b02b720ed", + "id": "3edb0dc8dd6542508b405eddb7260162", "unit": { "code": "44617100-9", "name": "item" @@ -360,7 +360,7 @@ Content-Type: application/json; charset=UTF-8 "startDate": "2020-05-15T01:00:00+03:00", "endDate": "2020-05-15T01:00:00+03:00" }, - "bid_id": "e4528bc92c0f463ca1f661381961e106", + "bid_id": "498e07f6feea4ee99de14563abcf1d0c", "value": { "yearlyPaymentsPercentage": 0.9, "valueAddedTaxIncluded": true, @@ -429,7 +429,7 @@ Content-Type: application/json; charset=UTF-8 }, "percentage": 54.45, "type": "financing", - "id": "93b9835cd6f8419fb56014c014773e8b" + "id": "d1068593e9a7477a8994ecee0e7fb48c" } ], "fundingKind": "other", @@ -456,7 +456,7 @@ Content-Type: application/json; charset=UTF-8 "region": "м. Київ", "locality": "м. Київ" }, - "id": "366a042aa96a4acdbe63112500608db1", + "id": "e1e8352d141b4814ba5c79c757fdd72a", "unit": { "code": "44617100-9", "name": "item" @@ -484,7 +484,7 @@ Content-Type: application/json; charset=UTF-8 "region": "м. Київ", "locality": "м. Київ" }, - "id": "9a24ed7daf1948b2923da55b02b720ed", + "id": "3edb0dc8dd6542508b405eddb7260162", "unit": { "code": "44617100-9", "name": "item" @@ -512,7 +512,7 @@ Content-Type: application/json; charset=UTF-8 "confidentiality": "buyerOnly", "language": "uk", "format": "application/pdf", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/0aac695e27804293a2854dff7bed4be8/bids/e4528bc92c0f463ca1f661381961e106/documents/12d76b67e831404c8628f7612d0944b1?download=92e2b793a7d34373986f3c5619906253", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/0aac695e27804293a2854dff7bed4be8/bids/498e07f6feea4ee99de14563abcf1d0c/documents/12d76b67e831404c8628f7612d0944b1?download=92e2b793a7d34373986f3c5619906253", "confidentialityRationale": "Only our company sells badgers with pink hair.", "title": "Proposal_top_secrets.pdf", "documentOf": "tender", @@ -535,8 +535,7 @@ Content-Type: application/json; charset=UTF-8 "dateModified": "2020-05-15T01:00:00+03:00" } ], - "selfEligible": true, - "id": "e4528bc92c0f463ca1f661381961e106", + "id": "498e07f6feea4ee99de14563abcf1d0c", "value": { "yearlyPaymentsPercentage": 0.9, "valueAddedTaxIncluded": true, @@ -571,7 +570,20 @@ Content-Type: application/json; charset=UTF-8 1000.0 ] }, - "selfQualified": true, + "qualificationDocuments": [ + { + "hash": "md5:00000000000000000000000000000000", + "confidentiality": "public", + "language": "uk", + "title": "qualification_document.pdf", + "url": "http://public-docs-sandbox.prozorro.gov.ua/get/469f20975c9b4087a0b601f5d48d3df4?KeyID=a8968c46&Signature=CA7MDtn0JeS8sRu5oCGOwi%2FgH4e7AppdoIvs1zxHQP59X3p72UiaPa1IUbBZqMYMls9uTtxxCiNFQvsB8RbtCg%253D%253D", + "format": "application/pdf", + "documentOf": "tender", + "datePublished": "2020-05-15T01:00:00+03:00", + "id": "5ba700bd5a65489fbd8821531adc4434", + "dateModified": "2020-05-15T01:00:00+03:00" + } + ], "financialDocuments": [ { "hash": "md5:00000000000000000000000000000000", @@ -623,25 +635,11 @@ Content-Type: application/json; charset=UTF-8 ], "date": "2020-05-15T01:00:00+03:00", "subcontractingDetails": "ДКП «Орфей», Україна", - "qualificationDocuments": [ - { - "hash": "md5:00000000000000000000000000000000", - "confidentiality": "public", - "language": "uk", - "title": "qualification_document.pdf", - "url": "http://public-docs-sandbox.prozorro.gov.ua/get/469f20975c9b4087a0b601f5d48d3df4?KeyID=a8968c46&Signature=CA7MDtn0JeS8sRu5oCGOwi%2FgH4e7AppdoIvs1zxHQP59X3p72UiaPa1IUbBZqMYMls9uTtxxCiNFQvsB8RbtCg%253D%253D", - "format": "application/pdf", - "documentOf": "tender", - "datePublished": "2020-05-15T01:00:00+03:00", - "id": "5ba700bd5a65489fbd8821531adc4434", - "dateModified": "2020-05-15T01:00:00+03:00" - } - ], - "participationUrl": "http://auction-sandbox.prozorro.gov.ua/tenders/0aac695e27804293a2854dff7bed4be8?key_for_bid=e4528bc92c0f463ca1f661381961e106" + "selfQualified": true, + "participationUrl": "http://auction-sandbox.prozorro.gov.ua/tenders/0aac695e27804293a2854dff7bed4be8?key_for_bid=498e07f6feea4ee99de14563abcf1d0c" }, { "status": "active", - "selfEligible": true, "value": { "yearlyPaymentsPercentage": 0.85, "valueAddedTaxIncluded": true, @@ -676,7 +674,7 @@ Content-Type: application/json; charset=UTF-8 900.0 ] }, - "id": "b649b9b2575142159fd240c728c87298", + "selfQualified": true, "tenderers": [ { "contactPoint": { @@ -701,8 +699,8 @@ Content-Type: application/json; charset=UTF-8 } ], "date": "2020-05-15T01:00:00+03:00", - "selfQualified": true, - "participationUrl": "http://auction-sandbox.prozorro.gov.ua/tenders/0aac695e27804293a2854dff7bed4be8?key_for_bid=b649b9b2575142159fd240c728c87298" + "id": "c72b35cfbfd84d7a980f772c02d025f6", + "participationUrl": "http://auction-sandbox.prozorro.gov.ua/tenders/0aac695e27804293a2854dff7bed4be8?key_for_bid=c72b35cfbfd84d7a980f772c02d025f6" }, { "status": "unsuccessful", @@ -716,7 +714,7 @@ Content-Type: application/json; charset=UTF-8 "format": "application/pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", - "id": "824f270cc0b749bd989983329634a5de", + "id": "437ffa3708534314aa799bf9d166b0bc", "dateModified": "2020-05-15T01:00:00+03:00" }, { @@ -724,12 +722,12 @@ Content-Type: application/json; charset=UTF-8 "confidentiality": "buyerOnly", "language": "uk", "format": "application/pdf", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/0aac695e27804293a2854dff7bed4be8/bids/5e79c825b4c54c36a179b22db2dae23b/documents/fc90022e9584421e90d0438c8b331cc8?download=368ab90ae6a748e6be48d5d2151aee66", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/0aac695e27804293a2854dff7bed4be8/bids/2d751be3f6aa46ba8dfd6eebcd5d9130/documents/685b1826738c419bb4af2e171204a06b?download=368ab90ae6a748e6be48d5d2151aee66", "confidentialityRationale": "Only our company sells badgers with pink hair.", "title": "Proposal_part2.pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", - "id": "fc90022e9584421e90d0438c8b331cc8", + "id": "685b1826738c419bb4af2e171204a06b", "dateModified": "2020-05-15T01:00:00+03:00" } ], @@ -743,12 +741,11 @@ Content-Type: application/json; charset=UTF-8 "format": "application/pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", - "id": "7adad4419c2f4b30b066e8e584a62f25", + "id": "59a1e9382b294643adc4e5d5927146b5", "dateModified": "2020-05-15T01:00:00+03:00" } ], - "selfEligible": true, - "selfQualified": true, + "id": "2d751be3f6aa46ba8dfd6eebcd5d9130", "tenderers": [ { "contactPoint": { @@ -772,7 +769,7 @@ Content-Type: application/json; charset=UTF-8 } } ], - "id": "5e79c825b4c54c36a179b22db2dae23b" + "selfQualified": true } ], "cancellations": [ @@ -812,7 +809,7 @@ Content-Type: application/json; charset=UTF-8 "reasonType": "expensesCut", "date": "2020-05-26T01:00:02+03:00", "cancellationOf": "tender", - "id": "3efefdab89324f4aa00ff1853d92d0ab" + "id": "03ede869eb8e44be9018e92170eb8423" } ], "noticePublicationDate": "2020-05-15T01:00:00+03:00", diff --git a/docs/source/tendering/esco/tutorial/tender-contract-period.http b/docs/source/tendering/esco/tutorial/tender-contract-period.http index 876273a496..687b656bd6 100644 --- a/docs/source/tendering/esco/tutorial/tender-contract-period.http +++ b/docs/source/tendering/esco/tutorial/tender-contract-period.http @@ -41,7 +41,7 @@ Content-Type: application/json; charset=UTF-8 "region": "м. Київ", "locality": "м. Київ" }, - "id": "366a042aa96a4acdbe63112500608db1", + "id": "e1e8352d141b4814ba5c79c757fdd72a", "unit": { "code": "44617100-9", "name": "item" @@ -69,7 +69,7 @@ Content-Type: application/json; charset=UTF-8 "region": "м. Київ", "locality": "м. Київ" }, - "id": "9a24ed7daf1948b2923da55b02b720ed", + "id": "3edb0dc8dd6542508b405eddb7260162", "unit": { "code": "44617100-9", "name": "item" diff --git a/docs/source/tendering/esco/tutorial/tender-contract-set-contract-value.http b/docs/source/tendering/esco/tutorial/tender-contract-set-contract-value.http index 589c7dd764..1acffb9751 100644 --- a/docs/source/tendering/esco/tutorial/tender-contract-set-contract-value.http +++ b/docs/source/tendering/esco/tutorial/tender-contract-set-contract-value.http @@ -41,7 +41,7 @@ Content-Type: application/json; charset=UTF-8 "region": "м. Київ", "locality": "м. Київ" }, - "id": "366a042aa96a4acdbe63112500608db1", + "id": "e1e8352d141b4814ba5c79c757fdd72a", "unit": { "code": "44617100-9", "name": "item" @@ -69,7 +69,7 @@ Content-Type: application/json; charset=UTF-8 "region": "м. Київ", "locality": "м. Київ" }, - "id": "9a24ed7daf1948b2923da55b02b720ed", + "id": "3edb0dc8dd6542508b405eddb7260162", "unit": { "code": "44617100-9", "name": "item" diff --git a/docs/source/tendering/esco/tutorial/tender-contract-sign-date.http b/docs/source/tendering/esco/tutorial/tender-contract-sign-date.http index 1ad1eadeca..b7433fd7ef 100644 --- a/docs/source/tendering/esco/tutorial/tender-contract-sign-date.http +++ b/docs/source/tendering/esco/tutorial/tender-contract-sign-date.http @@ -38,7 +38,7 @@ Content-Type: application/json; charset=UTF-8 "region": "м. Київ", "locality": "м. Київ" }, - "id": "366a042aa96a4acdbe63112500608db1", + "id": "e1e8352d141b4814ba5c79c757fdd72a", "unit": { "code": "44617100-9", "name": "item" @@ -66,7 +66,7 @@ Content-Type: application/json; charset=UTF-8 "region": "м. Київ", "locality": "м. Київ" }, - "id": "9a24ed7daf1948b2923da55b02b720ed", + "id": "3edb0dc8dd6542508b405eddb7260162", "unit": { "code": "44617100-9", "name": "item" diff --git a/docs/source/tendering/esco/tutorial/tender-post-attempt-json-data.http b/docs/source/tendering/esco/tutorial/tender-post-attempt-json-data.http index 495e8fc81e..ca61b750d9 100644 --- a/docs/source/tendering/esco/tutorial/tender-post-attempt-json-data.http +++ b/docs/source/tendering/esco/tutorial/tender-post-attempt-json-data.http @@ -230,7 +230,7 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/0aac695e27804293 }, "percentage": 54.45, "type": "financing", - "id": "93b9835cd6f8419fb56014c014773e8b" + "id": "d1068593e9a7477a8994ecee0e7fb48c" } ], "fundingKind": "other", @@ -257,7 +257,7 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/0aac695e27804293 "region": "м. Київ", "locality": "м. Київ" }, - "id": "366a042aa96a4acdbe63112500608db1", + "id": "e1e8352d141b4814ba5c79c757fdd72a", "unit": { "code": "44617100-9", "name": "item" @@ -285,7 +285,7 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/0aac695e27804293 "region": "м. Київ", "locality": "м. Київ" }, - "id": "9a24ed7daf1948b2923da55b02b720ed", + "id": "3edb0dc8dd6542508b405eddb7260162", "unit": { "code": "44617100-9", "name": "item" diff --git a/docs/source/tendering/esco/tutorial/update-cancellation-doc.http b/docs/source/tendering/esco/tutorial/update-cancellation-doc.http index b8a3c877f6..fb50dece10 100644 --- a/docs/source/tendering/esco/tutorial/update-cancellation-doc.http +++ b/docs/source/tendering/esco/tutorial/update-cancellation-doc.http @@ -1,4 +1,4 @@ -PUT /api/2.5/tenders/0aac695e27804293a2854dff7bed4be8/cancellations/3efefdab89324f4aa00ff1853d92d0ab/documents/8930b31794ed4c728351984eb91111ef?acc_token=82d005b2183e43fe8edbb00cc6eb36c1 HTTP/1.0 +PUT /api/2.5/tenders/0aac695e27804293a2854dff7bed4be8/cancellations/03ede869eb8e44be9018e92170eb8423/documents/8930b31794ed4c728351984eb91111ef?acc_token=82d005b2183e43fe8edbb00cc6eb36c1 HTTP/1.0 Authorization: Bearer broker Content-Length: 145 Content-Type: multipart/form-data; boundary=---BOUNDARY diff --git a/docs/source/tendering/esco/tutorial/update-cancellation-reasonType.http b/docs/source/tendering/esco/tutorial/update-cancellation-reasonType.http index ae40f01e09..718785015b 100644 --- a/docs/source/tendering/esco/tutorial/update-cancellation-reasonType.http +++ b/docs/source/tendering/esco/tutorial/update-cancellation-reasonType.http @@ -1,4 +1,4 @@ -PATCH /api/2.5/tenders/0aac695e27804293a2854dff7bed4be8/cancellations/3efefdab89324f4aa00ff1853d92d0ab?acc_token=82d005b2183e43fe8edbb00cc6eb36c1 HTTP/1.0 +PATCH /api/2.5/tenders/0aac695e27804293a2854dff7bed4be8/cancellations/03ede869eb8e44be9018e92170eb8423?acc_token=82d005b2183e43fe8edbb00cc6eb36c1 HTTP/1.0 Authorization: Bearer broker Content-Length: 39 Content-Type: application/json @@ -19,7 +19,7 @@ Content-Type: application/json; charset=UTF-8 "reasonType": "expensesCut", "date": "2020-05-15T01:00:01+03:00", "cancellationOf": "tender", - "id": "3efefdab89324f4aa00ff1853d92d0ab" + "id": "03ede869eb8e44be9018e92170eb8423" } } diff --git a/docs/source/tendering/esco/tutorial/update-tender-after-enqiery-with-update-periods.http b/docs/source/tendering/esco/tutorial/update-tender-after-enqiery-with-update-periods.http index 2ee76cab7e..52a188eae9 100644 --- a/docs/source/tendering/esco/tutorial/update-tender-after-enqiery-with-update-periods.http +++ b/docs/source/tendering/esco/tutorial/update-tender-after-enqiery-with-update-periods.http @@ -23,13 +23,13 @@ Content-Type: application/json; charset=UTF-8 "procurementMethod": "open", "mainProcurementCategory": "services", "complaintPeriod": { - "startDate": "2020-04-17T01:00:00+03:00", + "startDate": "2020-04-16T01:00:00+03:00", "endDate": "2020-05-19T00:00:00+03:00" }, "enquiryPeriod": { - "startDate": "2020-04-17T01:00:00+03:00", - "clarificationsUntil": "2020-05-19T00:00:00+03:00", - "endDate": "2020-05-13T01:00:00+03:00", + "startDate": "2020-04-16T01:00:00+03:00", + "clarificationsUntil": "2020-05-16T00:00:00+03:00", + "endDate": "2020-05-13T00:00:00+03:00", "invalidationDate": "2020-05-15T01:00:00+03:00" }, "submissionMethod": "electronicAuction", @@ -66,7 +66,7 @@ Content-Type: application/json; charset=UTF-8 "title": "Калорійність", "date": "2020-05-15T01:00:00+03:00", "answer": "Таблицю додано в файлі \"Kalorijnist.xslx\"", - "id": "c0ace3dda24e4cfab1c52c61462ceae8", + "id": "1419a907c70b4401abafa401b7f00672", "questionOf": "tender" } ], @@ -122,7 +122,7 @@ Content-Type: application/json; charset=UTF-8 "dateModified": "2020-05-15T01:00:00+03:00", "status": "active.tendering", "tenderPeriod": { - "startDate": "2020-04-17T01:00:00+03:00", + "startDate": "2020-04-16T01:00:00+03:00", "endDate": "2020-05-23T01:00:00+03:00" }, "auctionPeriod": { @@ -159,7 +159,7 @@ Content-Type: application/json; charset=UTF-8 }, "percentage": 54.45, "type": "financing", - "id": "93b9835cd6f8419fb56014c014773e8b" + "id": "d1068593e9a7477a8994ecee0e7fb48c" } ], "fundingKind": "other", @@ -186,7 +186,7 @@ Content-Type: application/json; charset=UTF-8 "region": "м. Київ", "locality": "м. Київ" }, - "id": "366a042aa96a4acdbe63112500608db1", + "id": "e1e8352d141b4814ba5c79c757fdd72a", "unit": { "code": "44617100-9", "name": "item" @@ -214,7 +214,7 @@ Content-Type: application/json; charset=UTF-8 "region": "м. Київ", "locality": "м. Київ" }, - "id": "9a24ed7daf1948b2923da55b02b720ed", + "id": "3edb0dc8dd6542508b405eddb7260162", "unit": { "code": "44617100-9", "name": "item" diff --git a/docs/source/tendering/esco/tutorial/update-tender-after-enqiery.http b/docs/source/tendering/esco/tutorial/update-tender-after-enqiery.http index 7a9ce09a82..cd6e1bf850 100644 --- a/docs/source/tendering/esco/tutorial/update-tender-after-enqiery.http +++ b/docs/source/tendering/esco/tutorial/update-tender-after-enqiery.http @@ -9,13 +9,13 @@ Content-Type: application/json; charset=UTF-8 "procurementMethod": "open", "mainProcurementCategory": "services", "complaintPeriod": { - "startDate": "2020-04-17T01:00:00+03:00", + "startDate": "2020-04-16T01:00:00+03:00", "endDate": "2020-05-13T00:00:00+03:00" }, "enquiryPeriod": { - "startDate": "2020-04-17T01:00:00+03:00", - "clarificationsUntil": "2020-05-14T00:00:00+03:00", - "endDate": "2020-05-07T01:00:00+03:00", + "startDate": "2020-04-16T01:00:00+03:00", + "clarificationsUntil": "2020-05-13T00:00:00+03:00", + "endDate": "2020-05-07T00:00:00+03:00", "invalidationDate": "2020-05-15T01:00:00+03:00" }, "submissionMethod": "electronicAuction", @@ -52,7 +52,7 @@ Content-Type: application/json; charset=UTF-8 "title": "Калорійність", "date": "2020-05-15T01:00:00+03:00", "answer": "Таблицю додано в файлі \"Kalorijnist.xslx\"", - "id": "c0ace3dda24e4cfab1c52c61462ceae8", + "id": "1419a907c70b4401abafa401b7f00672", "questionOf": "tender" } ], @@ -108,7 +108,7 @@ Content-Type: application/json; charset=UTF-8 "dateModified": "2020-05-15T01:00:00+03:00", "status": "active.tendering", "tenderPeriod": { - "startDate": "2020-04-17T01:00:00+03:00", + "startDate": "2020-04-16T01:00:00+03:00", "endDate": "2020-05-17T01:00:00+03:00" }, "auctionPeriod": { @@ -145,7 +145,7 @@ Content-Type: application/json; charset=UTF-8 }, "percentage": 54.45, "type": "financing", - "id": "93b9835cd6f8419fb56014c014773e8b" + "id": "d1068593e9a7477a8994ecee0e7fb48c" } ], "fundingKind": "other", @@ -172,7 +172,7 @@ Content-Type: application/json; charset=UTF-8 "region": "м. Київ", "locality": "м. Київ" }, - "id": "366a042aa96a4acdbe63112500608db1", + "id": "e1e8352d141b4814ba5c79c757fdd72a", "unit": { "code": "44617100-9", "name": "item" @@ -200,7 +200,7 @@ Content-Type: application/json; charset=UTF-8 "region": "м. Київ", "locality": "м. Київ" }, - "id": "9a24ed7daf1948b2923da55b02b720ed", + "id": "3edb0dc8dd6542508b405eddb7260162", "unit": { "code": "44617100-9", "name": "item" diff --git a/docs/source/tendering/esco/tutorial/upload-bid-eligibility-document-proposal.http b/docs/source/tendering/esco/tutorial/upload-bid-eligibility-document-proposal.http index aea6f16251..6d46fb68fa 100644 --- a/docs/source/tendering/esco/tutorial/upload-bid-eligibility-document-proposal.http +++ b/docs/source/tendering/esco/tutorial/upload-bid-eligibility-document-proposal.http @@ -1,4 +1,4 @@ -POST /api/2.5/tenders/0aac695e27804293a2854dff7bed4be8/bids/e4528bc92c0f463ca1f661381961e106/eligibility_documents?acc_token=29627267ed794908800e9ab5426bbd2e HTTP/1.0 +POST /api/2.5/tenders/0aac695e27804293a2854dff7bed4be8/bids/498e07f6feea4ee99de14563abcf1d0c/eligibility_documents?acc_token=29627267ed794908800e9ab5426bbd2e HTTP/1.0 Authorization: Bearer broker Content-Length: 151 Content-Type: multipart/form-data; boundary=---BOUNDARY @@ -14,14 +14,14 @@ content Response: 201 Created Content-Type: application/json; charset=UTF-8 -Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/0aac695e27804293a2854dff7bed4be8/bids/e4528bc92c0f463ca1f661381961e106/eligibility_documents/66f8e57da25649be9795cc6d9189c4ff +Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/0aac695e27804293a2854dff7bed4be8/bids/498e07f6feea4ee99de14563abcf1d0c/eligibility_documents/66f8e57da25649be9795cc6d9189c4ff { "data": { "hash": "md5:00000000000000000000000000000000", "confidentiality": "public", "language": "uk", "title": "eligibility_doc.pdf", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/0aac695e27804293a2854dff7bed4be8/bids/e4528bc92c0f463ca1f661381961e106/eligibility_documents/66f8e57da25649be9795cc6d9189c4ff?download=eb89b6fb96bb463c8f422013d61506a0", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/0aac695e27804293a2854dff7bed4be8/bids/498e07f6feea4ee99de14563abcf1d0c/eligibility_documents/66f8e57da25649be9795cc6d9189c4ff?download=eb89b6fb96bb463c8f422013d61506a0", "format": "application/pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", diff --git a/docs/source/tendering/esco/tutorial/upload-bid-financial-document-proposal.http b/docs/source/tendering/esco/tutorial/upload-bid-financial-document-proposal.http index 37aae00612..3ae31ed35e 100644 --- a/docs/source/tendering/esco/tutorial/upload-bid-financial-document-proposal.http +++ b/docs/source/tendering/esco/tutorial/upload-bid-financial-document-proposal.http @@ -1,4 +1,4 @@ -POST /api/2.5/tenders/0aac695e27804293a2854dff7bed4be8/bids/e4528bc92c0f463ca1f661381961e106/financial_documents?acc_token=29627267ed794908800e9ab5426bbd2e HTTP/1.0 +POST /api/2.5/tenders/0aac695e27804293a2854dff7bed4be8/bids/498e07f6feea4ee99de14563abcf1d0c/financial_documents?acc_token=29627267ed794908800e9ab5426bbd2e HTTP/1.0 Authorization: Bearer broker Content-Length: 147 Content-Type: multipart/form-data; boundary=---BOUNDARY @@ -14,14 +14,14 @@ Content-Type: application/pdf Response: 201 Created Content-Type: application/json; charset=UTF-8 -Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/0aac695e27804293a2854dff7bed4be8/bids/e4528bc92c0f463ca1f661381961e106/financial_documents/c91b2d4d356b4f6c94cf255126fe233c +Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/0aac695e27804293a2854dff7bed4be8/bids/498e07f6feea4ee99de14563abcf1d0c/financial_documents/c91b2d4d356b4f6c94cf255126fe233c { "data": { "hash": "md5:00000000000000000000000000000000", "confidentiality": "public", "language": "uk", "title": "financial_doc.pdf", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/0aac695e27804293a2854dff7bed4be8/bids/e4528bc92c0f463ca1f661381961e106/financial_documents/c91b2d4d356b4f6c94cf255126fe233c?download=b5c94c3907c04f15b1eb4bcf56cf73e5", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/0aac695e27804293a2854dff7bed4be8/bids/498e07f6feea4ee99de14563abcf1d0c/financial_documents/c91b2d4d356b4f6c94cf255126fe233c?download=b5c94c3907c04f15b1eb4bcf56cf73e5", "format": "application/pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", @@ -30,7 +30,7 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/0aac695e27804293 } } -POST /api/2.5/tenders/0aac695e27804293a2854dff7bed4be8/bids/e4528bc92c0f463ca1f661381961e106/financial_documents?acc_token=29627267ed794908800e9ab5426bbd2e HTTP/1.0 +POST /api/2.5/tenders/0aac695e27804293a2854dff7bed4be8/bids/498e07f6feea4ee99de14563abcf1d0c/financial_documents?acc_token=29627267ed794908800e9ab5426bbd2e HTTP/1.0 Authorization: Bearer broker Content-Length: 148 Content-Type: multipart/form-data; boundary=---BOUNDARY @@ -46,14 +46,14 @@ Content-Type: application/pdf Response: 201 Created Content-Type: application/json; charset=UTF-8 -Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/0aac695e27804293a2854dff7bed4be8/bids/e4528bc92c0f463ca1f661381961e106/financial_documents/d2179f9d17144ae59107edad44558986 +Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/0aac695e27804293a2854dff7bed4be8/bids/498e07f6feea4ee99de14563abcf1d0c/financial_documents/d2179f9d17144ae59107edad44558986 { "data": { "hash": "md5:00000000000000000000000000000000", "confidentiality": "public", "language": "uk", "title": "financial_doc2.pdf", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/0aac695e27804293a2854dff7bed4be8/bids/e4528bc92c0f463ca1f661381961e106/financial_documents/d2179f9d17144ae59107edad44558986?download=90f3ed7fe83245ceb8b2f7ff6624822b", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/0aac695e27804293a2854dff7bed4be8/bids/498e07f6feea4ee99de14563abcf1d0c/financial_documents/d2179f9d17144ae59107edad44558986?download=90f3ed7fe83245ceb8b2f7ff6624822b", "format": "application/pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", diff --git a/docs/source/tendering/esco/tutorial/upload-bid-private-proposal.http b/docs/source/tendering/esco/tutorial/upload-bid-private-proposal.http index 6e0ee889af..0aabc0ef67 100644 --- a/docs/source/tendering/esco/tutorial/upload-bid-private-proposal.http +++ b/docs/source/tendering/esco/tutorial/upload-bid-private-proposal.http @@ -1,4 +1,4 @@ -POST /api/2.5/tenders/0aac695e27804293a2854dff7bed4be8/bids/e4528bc92c0f463ca1f661381961e106/documents?acc_token=29627267ed794908800e9ab5426bbd2e HTTP/1.0 +POST /api/2.5/tenders/0aac695e27804293a2854dff7bed4be8/bids/498e07f6feea4ee99de14563abcf1d0c/documents?acc_token=29627267ed794908800e9ab5426bbd2e HTTP/1.0 Authorization: Bearer broker Content-Length: 156 Content-Type: multipart/form-data; boundary=---BOUNDARY @@ -14,14 +14,14 @@ content Response: 201 Created Content-Type: application/json; charset=UTF-8 -Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/0aac695e27804293a2854dff7bed4be8/bids/e4528bc92c0f463ca1f661381961e106/documents/12d76b67e831404c8628f7612d0944b1 +Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/0aac695e27804293a2854dff7bed4be8/bids/498e07f6feea4ee99de14563abcf1d0c/documents/12d76b67e831404c8628f7612d0944b1 { "data": { "hash": "md5:00000000000000000000000000000000", "confidentiality": "public", "language": "uk", "title": "Proposal_top_secrets.pdf", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/0aac695e27804293a2854dff7bed4be8/bids/e4528bc92c0f463ca1f661381961e106/documents/12d76b67e831404c8628f7612d0944b1?download=92e2b793a7d34373986f3c5619906253", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/0aac695e27804293a2854dff7bed4be8/bids/498e07f6feea4ee99de14563abcf1d0c/documents/12d76b67e831404c8628f7612d0944b1?download=92e2b793a7d34373986f3c5619906253", "format": "application/pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", diff --git a/docs/source/tendering/esco/tutorial/upload-bid-proposal.http b/docs/source/tendering/esco/tutorial/upload-bid-proposal.http index 4b7b916e6b..c5e6f44cc6 100644 --- a/docs/source/tendering/esco/tutorial/upload-bid-proposal.http +++ b/docs/source/tendering/esco/tutorial/upload-bid-proposal.http @@ -1,4 +1,4 @@ -POST /api/2.5/tenders/0aac695e27804293a2854dff7bed4be8/bids/e4528bc92c0f463ca1f661381961e106/documents?acc_token=29627267ed794908800e9ab5426bbd2e HTTP/1.0 +POST /api/2.5/tenders/0aac695e27804293a2854dff7bed4be8/bids/498e07f6feea4ee99de14563abcf1d0c/documents?acc_token=29627267ed794908800e9ab5426bbd2e HTTP/1.0 Authorization: Bearer broker Content-Length: 144 Content-Type: multipart/form-data; boundary=---BOUNDARY @@ -14,14 +14,14 @@ content Response: 201 Created Content-Type: application/json; charset=UTF-8 -Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/0aac695e27804293a2854dff7bed4be8/bids/e4528bc92c0f463ca1f661381961e106/documents/f6d40d29d5ef4d1f85af6033339b5f47 +Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/0aac695e27804293a2854dff7bed4be8/bids/498e07f6feea4ee99de14563abcf1d0c/documents/f6d40d29d5ef4d1f85af6033339b5f47 { "data": { "hash": "md5:00000000000000000000000000000000", "confidentiality": "public", "language": "uk", "title": "Proposal.pdf", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/0aac695e27804293a2854dff7bed4be8/bids/e4528bc92c0f463ca1f661381961e106/documents/f6d40d29d5ef4d1f85af6033339b5f47?download=3c66e547d52349d3ae64416f15e9c35a", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/0aac695e27804293a2854dff7bed4be8/bids/498e07f6feea4ee99de14563abcf1d0c/documents/f6d40d29d5ef4d1f85af6033339b5f47?download=3c66e547d52349d3ae64416f15e9c35a", "format": "application/pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", diff --git a/docs/source/tendering/esco/tutorial/upload-bid-qualification-document-proposal.http b/docs/source/tendering/esco/tutorial/upload-bid-qualification-document-proposal.http index bea6489460..1306bbe1e2 100644 --- a/docs/source/tendering/esco/tutorial/upload-bid-qualification-document-proposal.http +++ b/docs/source/tendering/esco/tutorial/upload-bid-qualification-document-proposal.http @@ -1,4 +1,4 @@ -POST /api/2.5/tenders/0aac695e27804293a2854dff7bed4be8/bids/e4528bc92c0f463ca1f661381961e106/qualification_documents?acc_token=29627267ed794908800e9ab5426bbd2e HTTP/1.0 +POST /api/2.5/tenders/0aac695e27804293a2854dff7bed4be8/bids/498e07f6feea4ee99de14563abcf1d0c/qualification_documents?acc_token=29627267ed794908800e9ab5426bbd2e HTTP/1.0 Authorization: Bearer broker Content-Length: 158 Content-Type: multipart/form-data; boundary=---BOUNDARY @@ -14,14 +14,14 @@ content Response: 201 Created Content-Type: application/json; charset=UTF-8 -Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/0aac695e27804293a2854dff7bed4be8/bids/e4528bc92c0f463ca1f661381961e106/qualification_documents/5ba700bd5a65489fbd8821531adc4434 +Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/0aac695e27804293a2854dff7bed4be8/bids/498e07f6feea4ee99de14563abcf1d0c/qualification_documents/5ba700bd5a65489fbd8821531adc4434 { "data": { "hash": "md5:00000000000000000000000000000000", "confidentiality": "public", "language": "uk", "title": "qualification_document.pdf", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/0aac695e27804293a2854dff7bed4be8/bids/e4528bc92c0f463ca1f661381961e106/qualification_documents/5ba700bd5a65489fbd8821531adc4434?download=469f20975c9b4087a0b601f5d48d3df4", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/0aac695e27804293a2854dff7bed4be8/bids/498e07f6feea4ee99de14563abcf1d0c/qualification_documents/5ba700bd5a65489fbd8821531adc4434?download=469f20975c9b4087a0b601f5d48d3df4", "format": "application/pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", diff --git a/docs/source/tendering/esco/tutorial/upload-cancellation-doc.http b/docs/source/tendering/esco/tutorial/upload-cancellation-doc.http index 99a59469f4..342926c0a8 100644 --- a/docs/source/tendering/esco/tutorial/upload-cancellation-doc.http +++ b/docs/source/tendering/esco/tutorial/upload-cancellation-doc.http @@ -1,4 +1,4 @@ -POST /api/2.5/tenders/0aac695e27804293a2854dff7bed4be8/cancellations/3efefdab89324f4aa00ff1853d92d0ab/documents?acc_token=82d005b2183e43fe8edbb00cc6eb36c1 HTTP/1.0 +POST /api/2.5/tenders/0aac695e27804293a2854dff7bed4be8/cancellations/03ede869eb8e44be9018e92170eb8423/documents?acc_token=82d005b2183e43fe8edbb00cc6eb36c1 HTTP/1.0 Authorization: Bearer broker Content-Length: 142 Content-Type: multipart/form-data; boundary=---BOUNDARY @@ -14,7 +14,7 @@ content Response: 201 Created Content-Type: application/json; charset=UTF-8 -Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/0aac695e27804293a2854dff7bed4be8/cancellations/3efefdab89324f4aa00ff1853d92d0ab/documents/8930b31794ed4c728351984eb91111ef +Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/0aac695e27804293a2854dff7bed4be8/cancellations/03ede869eb8e44be9018e92170eb8423/documents/8930b31794ed4c728351984eb91111ef { "data": { "hash": "md5:00000000000000000000000000000000", diff --git a/docs/source/tendering/http/complaints/award-complaint-accept.http b/docs/source/tendering/http/complaints/award-complaint-accept.http index bcaa9d9712..f6f09a4778 100644 --- a/docs/source/tendering/http/complaints/award-complaint-accept.http +++ b/docs/source/tendering/http/complaints/award-complaint-accept.http @@ -1,4 +1,4 @@ -PATCH /api/2.5/tenders/56aa844d9b3a43e4a169b7d76f71041e/awards/140b7d05238849ca9d3d2153a1b2a8d5/complaints/eea6ee3d38cc4aefb76da96645d4a3c5 HTTP/1.0 +PATCH /api/2.5/tenders/56aa844d9b3a43e4a169b7d76f71041e/awards/140b7d05238849ca9d3d2153a1b2a8d5/complaints/bb9107253f974b9e91ba6171b4ee3273 HTTP/1.0 Authorization: Bearer reviewer Content-Length: 109 Content-Type: application/json @@ -65,7 +65,7 @@ Content-Type: application/json; charset=UTF-8 "date": "2020-05-15T01:00:03+03:00", "title": "Недостатньо інформації", "type": "complaint", - "id": "eea6ee3d38cc4aefb76da96645d4a3c5", + "id": "bb9107253f974b9e91ba6171b4ee3273", "reviewPlace": "Place of review" } } diff --git a/docs/source/tendering/http/complaints/award-complaint-accepted-stopped.http b/docs/source/tendering/http/complaints/award-complaint-accepted-stopped.http index 0208c176bc..908a6b26c7 100644 --- a/docs/source/tendering/http/complaints/award-complaint-accepted-stopped.http +++ b/docs/source/tendering/http/complaints/award-complaint-accepted-stopped.http @@ -1,4 +1,4 @@ -PATCH /api/2.5/tenders/56aa844d9b3a43e4a169b7d76f71041e/awards/140b7d05238849ca9d3d2153a1b2a8d5/complaints/a7a63ff68a584a2ab6cf6cf88993b950 HTTP/1.0 +PATCH /api/2.5/tenders/56aa844d9b3a43e4a169b7d76f71041e/awards/140b7d05238849ca9d3d2153a1b2a8d5/complaints/cb67aafa016c41ef9b510d82f012e166 HTTP/1.0 Authorization: Bearer reviewer Content-Length: 252 Content-Type: application/json @@ -27,7 +27,7 @@ Content-Type: application/json; charset=UTF-8 "currency": "UAH", "amount": 3000.0 }, - "id": "a7a63ff68a584a2ab6cf6cf88993b950", + "id": "cb67aafa016c41ef9b510d82f012e166", "rejectReason": "tenderCancelled", "dateAccepted": "2020-05-15T01:00:03+03:00", "author": { diff --git a/docs/source/tendering/http/complaints/award-complaint-accepted-stopping-2020-04-19.http b/docs/source/tendering/http/complaints/award-complaint-accepted-stopping-2020-04-19.http index 517d3c6430..42973befc7 100644 --- a/docs/source/tendering/http/complaints/award-complaint-accepted-stopping-2020-04-19.http +++ b/docs/source/tendering/http/complaints/award-complaint-accepted-stopping-2020-04-19.http @@ -1,4 +1,4 @@ -PATCH /api/2.5/tenders/56aa844d9b3a43e4a169b7d76f71041e/awards/140b7d05238849ca9d3d2153a1b2a8d5/complaints/d6be5dac0e684783846bcdf71ad12359?acc_token=4df72279c3a14609ac0b0e0fdd9c7e3c HTTP/1.0 +PATCH /api/2.5/tenders/56aa844d9b3a43e4a169b7d76f71041e/awards/140b7d05238849ca9d3d2153a1b2a8d5/complaints/cba74db2af9c4994836cce43b0df8de4?acc_token=4df72279c3a14609ac0b0e0fdd9c7e3c HTTP/1.0 Authorization: Bearer broker Content-Length: 228 Content-Type: application/json diff --git a/docs/source/tendering/http/complaints/award-complaint-answer.http b/docs/source/tendering/http/complaints/award-complaint-answer.http index 702612e926..72897c8fbe 100644 --- a/docs/source/tendering/http/complaints/award-complaint-answer.http +++ b/docs/source/tendering/http/complaints/award-complaint-answer.http @@ -1,4 +1,4 @@ -PATCH /api/2.5/tenders/56aa844d9b3a43e4a169b7d76f71041e/awards/140b7d05238849ca9d3d2153a1b2a8d5/complaints/c9e6b01cbe524a1cb3ffe8f053e7e9d9?acc_token=281333ecb22746549b78852a755d15da HTTP/1.0 +PATCH /api/2.5/tenders/56aa844d9b3a43e4a169b7d76f71041e/awards/140b7d05238849ca9d3d2153a1b2a8d5/complaints/e287472069134e9195a569cc7ed34896?acc_token=281333ecb22746549b78852a755d15da HTTP/1.0 Authorization: Bearer broker Content-Length: 387 Content-Type: application/json @@ -46,7 +46,7 @@ Content-Type: application/json; charset=UTF-8 "complaintID": "UA-2020-05-15-000001.6", "date": "2020-05-15T01:00:03+03:00", "resolution": "Умови виправлено, вибір переможня буде розгянуто повторно", - "id": "c9e6b01cbe524a1cb3ffe8f053e7e9d9" + "id": "e287472069134e9195a569cc7ed34896" } } diff --git a/docs/source/tendering/http/complaints/award-complaint-claim.http b/docs/source/tendering/http/complaints/award-complaint-claim.http index e6498a53af..b664ed909a 100644 --- a/docs/source/tendering/http/complaints/award-complaint-claim.http +++ b/docs/source/tendering/http/complaints/award-complaint-claim.http @@ -1,4 +1,4 @@ -PATCH /api/2.5/tenders/56aa844d9b3a43e4a169b7d76f71041e/awards/140b7d05238849ca9d3d2153a1b2a8d5/complaints/a01979c79a024470bbf203c6cc3c09cd?acc_token=c27e41ba5b154d409ca05fe489ccbfbc HTTP/1.0 +PATCH /api/2.5/tenders/56aa844d9b3a43e4a169b7d76f71041e/awards/140b7d05238849ca9d3d2153a1b2a8d5/complaints/14732702aa0240afb3838e9e87ca7e7c?acc_token=c27e41ba5b154d409ca05fe489ccbfbc HTTP/1.0 Authorization: Bearer broker Content-Length: 29 Content-Type: application/json @@ -41,7 +41,7 @@ Content-Type: application/json; charset=UTF-8 "complaintID": "UA-2020-05-15-000001.9", "date": "2020-05-15T01:00:03+03:00", "type": "claim", - "id": "a01979c79a024470bbf203c6cc3c09cd" + "id": "14732702aa0240afb3838e9e87ca7e7c" } } diff --git a/docs/source/tendering/http/complaints/award-complaint-complaint.http b/docs/source/tendering/http/complaints/award-complaint-complaint.http index 4d84a5d324..9be02ff6a0 100644 --- a/docs/source/tendering/http/complaints/award-complaint-complaint.http +++ b/docs/source/tendering/http/complaints/award-complaint-complaint.http @@ -1,4 +1,4 @@ -PATCH /api/2.5/tenders/56aa844d9b3a43e4a169b7d76f71041e/awards/140b7d05238849ca9d3d2153a1b2a8d5/complaints/eea6ee3d38cc4aefb76da96645d4a3c5 HTTP/1.0 +PATCH /api/2.5/tenders/56aa844d9b3a43e4a169b7d76f71041e/awards/140b7d05238849ca9d3d2153a1b2a8d5/complaints/bb9107253f974b9e91ba6171b4ee3273 HTTP/1.0 Authorization: Bearer bot Content-Length: 31 Content-Type: application/json @@ -60,7 +60,7 @@ Content-Type: application/json; charset=UTF-8 "complaintID": "UA-2020-05-15-000001.1", "date": "2020-05-15T01:00:03+03:00", "type": "complaint", - "id": "eea6ee3d38cc4aefb76da96645d4a3c5" + "id": "bb9107253f974b9e91ba6171b4ee3273" } } diff --git a/docs/source/tendering/http/complaints/award-complaint-decline.http b/docs/source/tendering/http/complaints/award-complaint-decline.http index 3b208f5850..a81fdc7e21 100644 --- a/docs/source/tendering/http/complaints/award-complaint-decline.http +++ b/docs/source/tendering/http/complaints/award-complaint-decline.http @@ -1,4 +1,4 @@ -PATCH /api/2.5/tenders/56aa844d9b3a43e4a169b7d76f71041e/awards/140b7d05238849ca9d3d2153a1b2a8d5/complaints/21880d3a2a7c44ad8e30cb2a19172605 HTTP/1.0 +PATCH /api/2.5/tenders/56aa844d9b3a43e4a169b7d76f71041e/awards/140b7d05238849ca9d3d2153a1b2a8d5/complaints/c42514eda49c48ed89c94bb94b0d7527 HTTP/1.0 Authorization: Bearer reviewer Content-Length: 32 Content-Type: application/json @@ -50,7 +50,7 @@ Content-Type: application/json; charset=UTF-8 "complaintID": "UA-2020-05-15-000001.3", "date": "2020-05-15T01:00:03+03:00", "type": "complaint", - "id": "21880d3a2a7c44ad8e30cb2a19172605", + "id": "c42514eda49c48ed89c94bb94b0d7527", "reviewPlace": "Place of review" } } diff --git a/docs/source/tendering/http/complaints/award-complaint-mistaken-2020-04-19.http b/docs/source/tendering/http/complaints/award-complaint-mistaken-2020-04-19.http index 126326baf9..5d812ce86a 100644 --- a/docs/source/tendering/http/complaints/award-complaint-mistaken-2020-04-19.http +++ b/docs/source/tendering/http/complaints/award-complaint-mistaken-2020-04-19.http @@ -1,4 +1,4 @@ -PATCH /api/2.5/tenders/56aa844d9b3a43e4a169b7d76f71041e/awards/b5338e7a746b4e749a9afb528d3d53a8/complaints/e15981bf83d54538a54f42ae219b8d0d?acc_token=2ae1e128ac964682900a6c92a9824c7f HTTP/1.0 +PATCH /api/2.5/tenders/56aa844d9b3a43e4a169b7d76f71041e/awards/b5338e7a746b4e749a9afb528d3d53a8/complaints/41f0e09065aa46a5abf57c193a4baf88?acc_token=2ae1e128ac964682900a6c92a9824c7f HTTP/1.0 Authorization: Bearer broker Content-Length: 32 Content-Type: application/json @@ -46,7 +46,7 @@ Content-Type: application/json; charset=UTF-8 "complaintID": "UA-2020-05-15-000001.11", "date": "2020-05-15T01:00:03+03:00", "type": "complaint", - "id": "e15981bf83d54538a54f42ae219b8d0d" + "id": "41f0e09065aa46a5abf57c193a4baf88" } } diff --git a/docs/source/tendering/http/complaints/award-complaint-post-complaint-owner.http b/docs/source/tendering/http/complaints/award-complaint-post-complaint-owner.http index 643b09df02..49e9690e6b 100644 --- a/docs/source/tendering/http/complaints/award-complaint-post-complaint-owner.http +++ b/docs/source/tendering/http/complaints/award-complaint-post-complaint-owner.http @@ -1,4 +1,4 @@ -POST /api/2.5/tenders/56aa844d9b3a43e4a169b7d76f71041e/awards/140b7d05238849ca9d3d2153a1b2a8d5/complaints/9b9892fdb7be477384fadd7514e5a8d4/posts?acc_token=d220f9211977448f892e63c4388e1db2 HTTP/1.0 +POST /api/2.5/tenders/56aa844d9b3a43e4a169b7d76f71041e/awards/140b7d05238849ca9d3d2153a1b2a8d5/complaints/5686f14f5c4649b1ac87a631dc6996a1/posts?acc_token=d220f9211977448f892e63c4388e1db2 HTTP/1.0 Authorization: Bearer broker Content-Length: 678 Content-Type: application/json @@ -15,7 +15,7 @@ DATA: "format": "application/pdf" } ], - "relatedPost": "c3886b1e75184f8f8332c9ea1fad01c0", + "relatedPost": "264158c62a8f4bd1b37986f33693d9c6", "description": "Додано документ", "title": "Уточнення по вимозі" } @@ -23,7 +23,7 @@ DATA: Response: 201 Created Content-Type: application/json; charset=UTF-8 -Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/56aa844d9b3a43e4a169b7d76f71041e/awards/140b7d05238849ca9d3d2153a1b2a8d5/complaints/9b9892fdb7be477384fadd7514e5a8d4/posts/77a7265af591460ebbc63c162a2c7587 +Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/56aa844d9b3a43e4a169b7d76f71041e/awards/140b7d05238849ca9d3d2153a1b2a8d5/complaints/5686f14f5c4649b1ac87a631dc6996a1/posts/fd1e94a259aa498d9a6f0f8f3cebbda5 { "data": { "documents": [ @@ -35,7 +35,7 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/56aa844d9b3a43e4 "format": "application/pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:03+03:00", - "id": "7b35f9df135d4de28f26444a0aeb8fad", + "id": "daa18dd118b54cde8132b7293b498900", "dateModified": "2020-05-15T01:00:03+03:00" } ], @@ -43,9 +43,9 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/56aa844d9b3a43e4 "title": "Уточнення по вимозі", "author": "complaint_owner", "datePublished": "2020-05-15T01:00:03+03:00", - "relatedPost": "c3886b1e75184f8f8332c9ea1fad01c0", + "relatedPost": "264158c62a8f4bd1b37986f33693d9c6", "recipient": "aboveThresholdReviewers", - "id": "77a7265af591460ebbc63c162a2c7587" + "id": "fd1e94a259aa498d9a6f0f8f3cebbda5" } } diff --git a/docs/source/tendering/http/complaints/award-complaint-post-reviewer-complaint-owner.http b/docs/source/tendering/http/complaints/award-complaint-post-reviewer-complaint-owner.http index 69b830ead9..a3507909e1 100644 --- a/docs/source/tendering/http/complaints/award-complaint-post-reviewer-complaint-owner.http +++ b/docs/source/tendering/http/complaints/award-complaint-post-reviewer-complaint-owner.http @@ -1,4 +1,4 @@ -POST /api/2.5/tenders/56aa844d9b3a43e4a169b7d76f71041e/awards/140b7d05238849ca9d3d2153a1b2a8d5/complaints/9b9892fdb7be477384fadd7514e5a8d4/posts HTTP/1.0 +POST /api/2.5/tenders/56aa844d9b3a43e4a169b7d76f71041e/awards/140b7d05238849ca9d3d2153a1b2a8d5/complaints/5686f14f5c4649b1ac87a631dc6996a1/posts HTTP/1.0 Authorization: Bearer reviewer Content-Length: 281 Content-Type: application/json @@ -14,7 +14,7 @@ DATA: Response: 201 Created Content-Type: application/json; charset=UTF-8 -Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/56aa844d9b3a43e4a169b7d76f71041e/awards/140b7d05238849ca9d3d2153a1b2a8d5/complaints/9b9892fdb7be477384fadd7514e5a8d4/posts/c3886b1e75184f8f8332c9ea1fad01c0 +Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/56aa844d9b3a43e4a169b7d76f71041e/awards/140b7d05238849ca9d3d2153a1b2a8d5/complaints/5686f14f5c4649b1ac87a631dc6996a1/posts/264158c62a8f4bd1b37986f33693d9c6 { "data": { "description": "Відсутній документ", @@ -22,7 +22,7 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/56aa844d9b3a43e4 "author": "aboveThresholdReviewers", "datePublished": "2020-05-15T01:00:03+03:00", "recipient": "complaint_owner", - "id": "c3886b1e75184f8f8332c9ea1fad01c0" + "id": "264158c62a8f4bd1b37986f33693d9c6" } } diff --git a/docs/source/tendering/http/complaints/award-complaint-post-reviewer-tender-owner.http b/docs/source/tendering/http/complaints/award-complaint-post-reviewer-tender-owner.http index 2372fb7a87..133dd9abdf 100644 --- a/docs/source/tendering/http/complaints/award-complaint-post-reviewer-tender-owner.http +++ b/docs/source/tendering/http/complaints/award-complaint-post-reviewer-tender-owner.http @@ -1,4 +1,4 @@ -POST /api/2.5/tenders/56aa844d9b3a43e4a169b7d76f71041e/awards/140b7d05238849ca9d3d2153a1b2a8d5/complaints/9b9892fdb7be477384fadd7514e5a8d4/posts HTTP/1.0 +POST /api/2.5/tenders/56aa844d9b3a43e4a169b7d76f71041e/awards/140b7d05238849ca9d3d2153a1b2a8d5/complaints/5686f14f5c4649b1ac87a631dc6996a1/posts HTTP/1.0 Authorization: Bearer reviewer Content-Length: 278 Content-Type: application/json @@ -14,7 +14,7 @@ DATA: Response: 201 Created Content-Type: application/json; charset=UTF-8 -Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/56aa844d9b3a43e4a169b7d76f71041e/awards/140b7d05238849ca9d3d2153a1b2a8d5/complaints/9b9892fdb7be477384fadd7514e5a8d4/posts/bb86fc2c70504c49919353932f924bab +Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/56aa844d9b3a43e4a169b7d76f71041e/awards/140b7d05238849ca9d3d2153a1b2a8d5/complaints/5686f14f5c4649b1ac87a631dc6996a1/posts/77de93b8d543420094da972262676838 { "data": { "description": "Відсутній документ", @@ -22,7 +22,7 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/56aa844d9b3a43e4 "author": "aboveThresholdReviewers", "datePublished": "2020-05-15T01:00:03+03:00", "recipient": "tender_owner", - "id": "bb86fc2c70504c49919353932f924bab" + "id": "77de93b8d543420094da972262676838" } } diff --git a/docs/source/tendering/http/complaints/award-complaint-post-tender-owner.http b/docs/source/tendering/http/complaints/award-complaint-post-tender-owner.http index d2f4b67203..6781d30f00 100644 --- a/docs/source/tendering/http/complaints/award-complaint-post-tender-owner.http +++ b/docs/source/tendering/http/complaints/award-complaint-post-tender-owner.http @@ -1,4 +1,4 @@ -POST /api/2.5/tenders/56aa844d9b3a43e4a169b7d76f71041e/awards/140b7d05238849ca9d3d2153a1b2a8d5/complaints/9b9892fdb7be477384fadd7514e5a8d4/posts?acc_token=281333ecb22746549b78852a755d15da HTTP/1.0 +POST /api/2.5/tenders/56aa844d9b3a43e4a169b7d76f71041e/awards/140b7d05238849ca9d3d2153a1b2a8d5/complaints/5686f14f5c4649b1ac87a631dc6996a1/posts?acc_token=281333ecb22746549b78852a755d15da HTTP/1.0 Authorization: Bearer broker Content-Length: 669 Content-Type: application/json @@ -15,7 +15,7 @@ DATA: "format": "application/pdf" } ], - "relatedPost": "bb86fc2c70504c49919353932f924bab", + "relatedPost": "77de93b8d543420094da972262676838", "description": "Додано документ", "title": "Уточнення по вимозі" } @@ -23,7 +23,7 @@ DATA: Response: 201 Created Content-Type: application/json; charset=UTF-8 -Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/56aa844d9b3a43e4a169b7d76f71041e/awards/140b7d05238849ca9d3d2153a1b2a8d5/complaints/9b9892fdb7be477384fadd7514e5a8d4/posts/9f8fa840973b491ba9203f8a314b320e +Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/56aa844d9b3a43e4a169b7d76f71041e/awards/140b7d05238849ca9d3d2153a1b2a8d5/complaints/5686f14f5c4649b1ac87a631dc6996a1/posts/7159127ebbfa4de0a460ea3741a862ff { "data": { "documents": [ @@ -35,7 +35,7 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/56aa844d9b3a43e4 "format": "application/pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:03+03:00", - "id": "eab0f30e991e4587ad185c37024d6b79", + "id": "03c91c7904d34442bd94855db5fe8ded", "dateModified": "2020-05-15T01:00:03+03:00" } ], @@ -43,9 +43,9 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/56aa844d9b3a43e4 "title": "Уточнення по вимозі", "author": "tender_owner", "datePublished": "2020-05-15T01:00:03+03:00", - "relatedPost": "bb86fc2c70504c49919353932f924bab", + "relatedPost": "77de93b8d543420094da972262676838", "recipient": "aboveThresholdReviewers", - "id": "9f8fa840973b491ba9203f8a314b320e" + "id": "7159127ebbfa4de0a460ea3741a862ff" } } diff --git a/docs/source/tendering/http/complaints/award-complaint-reject.http b/docs/source/tendering/http/complaints/award-complaint-reject.http index 65c94e1e2b..eaec4d1cd3 100644 --- a/docs/source/tendering/http/complaints/award-complaint-reject.http +++ b/docs/source/tendering/http/complaints/award-complaint-reject.http @@ -1,4 +1,4 @@ -PATCH /api/2.5/tenders/56aa844d9b3a43e4a169b7d76f71041e/awards/140b7d05238849ca9d3d2153a1b2a8d5/complaints/98bdde54ef9f440f83b78dbacd9ab16e HTTP/1.0 +PATCH /api/2.5/tenders/56aa844d9b3a43e4a169b7d76f71041e/awards/140b7d05238849ca9d3d2153a1b2a8d5/complaints/dcc5ec1cf90047d0aee10ee7ceabc0e8 HTTP/1.0 Authorization: Bearer reviewer Content-Length: 64 Content-Type: application/json @@ -50,7 +50,7 @@ Content-Type: application/json; charset=UTF-8 "date": "2020-05-15T01:00:03+03:00", "title": "Недостатньо інформації", "type": "complaint", - "id": "98bdde54ef9f440f83b78dbacd9ab16e" + "id": "dcc5ec1cf90047d0aee10ee7ceabc0e8" } } diff --git a/docs/source/tendering/http/complaints/award-complaint-resolution-upload.http b/docs/source/tendering/http/complaints/award-complaint-resolution-upload.http index bf3e5007b8..e8f390eaf0 100644 --- a/docs/source/tendering/http/complaints/award-complaint-resolution-upload.http +++ b/docs/source/tendering/http/complaints/award-complaint-resolution-upload.http @@ -1,4 +1,4 @@ -POST /api/2.5/tenders/56aa844d9b3a43e4a169b7d76f71041e/awards/140b7d05238849ca9d3d2153a1b2a8d5/complaints/eea6ee3d38cc4aefb76da96645d4a3c5/documents HTTP/1.0 +POST /api/2.5/tenders/56aa844d9b3a43e4a169b7d76f71041e/awards/140b7d05238849ca9d3d2153a1b2a8d5/complaints/bb9107253f974b9e91ba6171b4ee3273/documents HTTP/1.0 Authorization: Bearer reviewer Content-Length: 155 Content-Type: multipart/form-data; boundary=---BOUNDARY @@ -14,7 +14,7 @@ content Response: 201 Created Content-Type: application/json; charset=UTF-8 -Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/56aa844d9b3a43e4a169b7d76f71041e/awards/140b7d05238849ca9d3d2153a1b2a8d5/complaints/eea6ee3d38cc4aefb76da96645d4a3c5/documents/50010030ed9647afa89d33c126c2e307 +Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/56aa844d9b3a43e4a169b7d76f71041e/awards/140b7d05238849ca9d3d2153a1b2a8d5/complaints/bb9107253f974b9e91ba6171b4ee3273/documents/50010030ed9647afa89d33c126c2e307 { "data": { "hash": "md5:00000000000000000000000000000000", diff --git a/docs/source/tendering/http/complaints/award-complaint-resolve.http b/docs/source/tendering/http/complaints/award-complaint-resolve.http index 4b68a6ee5b..3a5128fc30 100644 --- a/docs/source/tendering/http/complaints/award-complaint-resolve.http +++ b/docs/source/tendering/http/complaints/award-complaint-resolve.http @@ -1,4 +1,4 @@ -PATCH /api/2.5/tenders/56aa844d9b3a43e4a169b7d76f71041e/awards/140b7d05238849ca9d3d2153a1b2a8d5/complaints/eea6ee3d38cc4aefb76da96645d4a3c5 HTTP/1.0 +PATCH /api/2.5/tenders/56aa844d9b3a43e4a169b7d76f71041e/awards/140b7d05238849ca9d3d2153a1b2a8d5/complaints/bb9107253f974b9e91ba6171b4ee3273 HTTP/1.0 Authorization: Bearer reviewer Content-Length: 33 Content-Type: application/json @@ -76,7 +76,7 @@ Content-Type: application/json; charset=UTF-8 "complaintID": "UA-2020-05-15-000001.1", "date": "2020-05-15T01:00:03+03:00", "type": "complaint", - "id": "eea6ee3d38cc4aefb76da96645d4a3c5", + "id": "bb9107253f974b9e91ba6171b4ee3273", "reviewPlace": "Place of review" } } diff --git a/docs/source/tendering/http/complaints/award-complaint-resolved.http b/docs/source/tendering/http/complaints/award-complaint-resolved.http index e6d1359c56..d3f0e45947 100644 --- a/docs/source/tendering/http/complaints/award-complaint-resolved.http +++ b/docs/source/tendering/http/complaints/award-complaint-resolved.http @@ -1,4 +1,4 @@ -PATCH /api/2.5/tenders/56aa844d9b3a43e4a169b7d76f71041e/awards/140b7d05238849ca9d3d2153a1b2a8d5/complaints/eea6ee3d38cc4aefb76da96645d4a3c5?acc_token=281333ecb22746549b78852a755d15da HTTP/1.0 +PATCH /api/2.5/tenders/56aa844d9b3a43e4a169b7d76f71041e/awards/140b7d05238849ca9d3d2153a1b2a8d5/complaints/bb9107253f974b9e91ba6171b4ee3273?acc_token=281333ecb22746549b78852a755d15da HTTP/1.0 Authorization: Bearer broker Content-Length: 361 Content-Type: application/json @@ -46,7 +46,7 @@ Content-Type: application/json; charset=UTF-8 "currency": "UAH", "amount": 3000.0 }, - "id": "eea6ee3d38cc4aefb76da96645d4a3c5", + "id": "bb9107253f974b9e91ba6171b4ee3273", "tendererAction": "Умови виправлено, вибір переможня буде розгянуто повторно", "dateSubmitted": "2020-05-15T01:00:03+03:00", "complaintID": "UA-2020-05-15-000001.1", diff --git a/docs/source/tendering/http/complaints/award-complaint-satisfied-resolving.http b/docs/source/tendering/http/complaints/award-complaint-satisfied-resolving.http index 58be727ab8..e57236e848 100644 --- a/docs/source/tendering/http/complaints/award-complaint-satisfied-resolving.http +++ b/docs/source/tendering/http/complaints/award-complaint-satisfied-resolving.http @@ -44,7 +44,7 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/56aa844d9b3a43e4 "startDate": "2020-05-15T01:00:00+03:00", "endDate": "2020-05-15T01:00:03+03:00" }, - "bid_id": "5089c58b70d041138c76a92723a7f82e", + "bid_id": "73d7d50ef4c3464e9ff440581c7364ce", "value": { "currency": "UAH", "amount": 499.0, @@ -85,7 +85,7 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/56aa844d9b3a43e4 "currency": "UAH", "amount": 3000.0 }, - "id": "eea6ee3d38cc4aefb76da96645d4a3c5", + "id": "bb9107253f974b9e91ba6171b4ee3273", "tendererAction": "Умови виправлено, вибір переможня буде розгянуто повторно", "dateSubmitted": "2020-05-15T01:00:03+03:00", "complaintID": "UA-2020-05-15-000001.1", @@ -157,7 +157,7 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/56aa844d9b3a43e4 "date": "2020-05-15T01:00:03+03:00", "title": "Недостатньо інформації", "type": "complaint", - "id": "98bdde54ef9f440f83b78dbacd9ab16e" + "id": "dcc5ec1cf90047d0aee10ee7ceabc0e8" }, { "status": "declined", @@ -196,7 +196,7 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/56aa844d9b3a43e4 "complaintID": "UA-2020-05-15-000001.3", "date": "2020-05-15T01:00:03+03:00", "type": "complaint", - "id": "21880d3a2a7c44ad8e30cb2a19172605", + "id": "c42514eda49c48ed89c94bb94b0d7527", "reviewPlace": "Place of review" }, { @@ -237,7 +237,7 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/56aa844d9b3a43e4 "complaintID": "UA-2020-05-15-000001.4", "date": "2020-05-15T01:00:03+03:00", "type": "complaint", - "id": "d6be5dac0e684783846bcdf71ad12359", + "id": "cba74db2af9c4994836cce43b0df8de4", "reviewPlace": "Place of review" }, { @@ -252,7 +252,7 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/56aa844d9b3a43e4 "currency": "UAH", "amount": 3000.0 }, - "id": "a7a63ff68a584a2ab6cf6cf88993b950", + "id": "cb67aafa016c41ef9b510d82f012e166", "rejectReason": "tenderCancelled", "dateAccepted": "2020-05-15T01:00:03+03:00", "author": { @@ -315,7 +315,7 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/56aa844d9b3a43e4 "complaintID": "UA-2020-05-15-000001.6", "date": "2020-05-15T01:00:03+03:00", "resolution": "Умови виправлено, вибір переможня буде розгянуто повторно", - "id": "c9e6b01cbe524a1cb3ffe8f053e7e9d9" + "id": "e287472069134e9195a569cc7ed34896" }, { "status": "answered", @@ -349,7 +349,7 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/56aa844d9b3a43e4 "complaintID": "UA-2020-05-15-000001.7", "date": "2020-05-15T01:00:03+03:00", "resolution": "Вимога не відповідає предмету закупівлі", - "id": "b9d791e890424c06b02c308aa516a710" + "id": "c2cf837fe0d34e5d90acc2b43b54cead" }, { "status": "pending", @@ -383,7 +383,7 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/56aa844d9b3a43e4 "author": "aboveThresholdReviewers", "datePublished": "2020-05-15T01:00:03+03:00", "recipient": "complaint_owner", - "id": "c3886b1e75184f8f8332c9ea1fad01c0" + "id": "264158c62a8f4bd1b37986f33693d9c6" }, { "documents": [ @@ -395,7 +395,7 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/56aa844d9b3a43e4 "format": "application/pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:03+03:00", - "id": "7b35f9df135d4de28f26444a0aeb8fad", + "id": "daa18dd118b54cde8132b7293b498900", "dateModified": "2020-05-15T01:00:03+03:00" } ], @@ -403,9 +403,9 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/56aa844d9b3a43e4 "title": "Уточнення по вимозі", "author": "complaint_owner", "datePublished": "2020-05-15T01:00:03+03:00", - "relatedPost": "c3886b1e75184f8f8332c9ea1fad01c0", + "relatedPost": "264158c62a8f4bd1b37986f33693d9c6", "recipient": "aboveThresholdReviewers", - "id": "77a7265af591460ebbc63c162a2c7587" + "id": "fd1e94a259aa498d9a6f0f8f3cebbda5" }, { "description": "Відсутній документ", @@ -413,7 +413,7 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/56aa844d9b3a43e4 "author": "aboveThresholdReviewers", "datePublished": "2020-05-15T01:00:03+03:00", "recipient": "tender_owner", - "id": "bb86fc2c70504c49919353932f924bab" + "id": "77de93b8d543420094da972262676838" }, { "documents": [ @@ -425,7 +425,7 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/56aa844d9b3a43e4 "format": "application/pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:03+03:00", - "id": "eab0f30e991e4587ad185c37024d6b79", + "id": "03c91c7904d34442bd94855db5fe8ded", "dateModified": "2020-05-15T01:00:03+03:00" } ], @@ -433,9 +433,9 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/56aa844d9b3a43e4 "title": "Уточнення по вимозі", "author": "tender_owner", "datePublished": "2020-05-15T01:00:03+03:00", - "relatedPost": "bb86fc2c70504c49919353932f924bab", + "relatedPost": "77de93b8d543420094da972262676838", "recipient": "aboveThresholdReviewers", - "id": "9f8fa840973b491ba9203f8a314b320e" + "id": "7159127ebbfa4de0a460ea3741a862ff" } ], "value": { @@ -446,7 +446,7 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/56aa844d9b3a43e4 "complaintID": "UA-2020-05-15-000001.8", "date": "2020-05-15T01:00:03+03:00", "type": "complaint", - "id": "9b9892fdb7be477384fadd7514e5a8d4" + "id": "5686f14f5c4649b1ac87a631dc6996a1" }, { "status": "claim", @@ -476,7 +476,7 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/56aa844d9b3a43e4 "complaintID": "UA-2020-05-15-000001.9", "date": "2020-05-15T01:00:03+03:00", "type": "claim", - "id": "a01979c79a024470bbf203c6cc3c09cd" + "id": "14732702aa0240afb3838e9e87ca7e7c" } ], "id": "140b7d05238849ca9d3d2153a1b2a8d5" diff --git a/docs/source/tendering/http/complaints/award-complaint-satisfy.http b/docs/source/tendering/http/complaints/award-complaint-satisfy.http index 60ae2762e5..cda5fabf6b 100644 --- a/docs/source/tendering/http/complaints/award-complaint-satisfy.http +++ b/docs/source/tendering/http/complaints/award-complaint-satisfy.http @@ -1,4 +1,4 @@ -PATCH /api/2.5/tenders/56aa844d9b3a43e4a169b7d76f71041e/awards/140b7d05238849ca9d3d2153a1b2a8d5/complaints/c9e6b01cbe524a1cb3ffe8f053e7e9d9?acc_token=de764a8373ba4ba08ac3499b5604188a HTTP/1.0 +PATCH /api/2.5/tenders/56aa844d9b3a43e4a169b7d76f71041e/awards/140b7d05238849ca9d3d2153a1b2a8d5/complaints/e287472069134e9195a569cc7ed34896?acc_token=de764a8373ba4ba08ac3499b5604188a HTTP/1.0 Authorization: Bearer broker Content-Length: 29 Content-Type: application/json @@ -45,7 +45,7 @@ Content-Type: application/json; charset=UTF-8 "complaintID": "UA-2020-05-15-000001.6", "date": "2020-05-15T01:00:03+03:00", "resolution": "Умови виправлено, вибір переможня буде розгянуто повторно", - "id": "c9e6b01cbe524a1cb3ffe8f053e7e9d9" + "id": "e287472069134e9195a569cc7ed34896" } } diff --git a/docs/source/tendering/http/complaints/award-complaint-submission-claim.http b/docs/source/tendering/http/complaints/award-complaint-submission-claim.http index 3f19fa968d..5cff36d3b7 100644 --- a/docs/source/tendering/http/complaints/award-complaint-submission-claim.http +++ b/docs/source/tendering/http/complaints/award-complaint-submission-claim.http @@ -35,7 +35,7 @@ DATA: Response: 201 Created Content-Type: application/json; charset=UTF-8 -Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/56aa844d9b3a43e4a169b7d76f71041e/awards/140b7d05238849ca9d3d2153a1b2a8d5/complaints/c9e6b01cbe524a1cb3ffe8f053e7e9d9 +Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/56aa844d9b3a43e4a169b7d76f71041e/awards/140b7d05238849ca9d3d2153a1b2a8d5/complaints/e287472069134e9195a569cc7ed34896 { "access": { "transfer": "c59ba92fbf3a4a0cafd9e166d211c1e5", @@ -69,7 +69,7 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/56aa844d9b3a43e4 "complaintID": "UA-2020-05-15-000001.6", "date": "2020-05-15T01:00:03+03:00", "type": "claim", - "id": "c9e6b01cbe524a1cb3ffe8f053e7e9d9" + "id": "e287472069134e9195a569cc7ed34896" } } diff --git a/docs/source/tendering/http/complaints/award-complaint-submission-upload.http b/docs/source/tendering/http/complaints/award-complaint-submission-upload.http index 80d82ab035..0e8dfad8fc 100644 --- a/docs/source/tendering/http/complaints/award-complaint-submission-upload.http +++ b/docs/source/tendering/http/complaints/award-complaint-submission-upload.http @@ -1,4 +1,4 @@ -POST /api/2.5/tenders/56aa844d9b3a43e4a169b7d76f71041e/awards/140b7d05238849ca9d3d2153a1b2a8d5/complaints/eea6ee3d38cc4aefb76da96645d4a3c5/documents?acc_token=69e23b9fbc55480a9bd740eaad6ef0c7 HTTP/1.0 +POST /api/2.5/tenders/56aa844d9b3a43e4a169b7d76f71041e/awards/140b7d05238849ca9d3d2153a1b2a8d5/complaints/bb9107253f974b9e91ba6171b4ee3273/documents?acc_token=69e23b9fbc55480a9bd740eaad6ef0c7 HTTP/1.0 Authorization: Bearer broker Content-Length: 156 Content-Type: multipart/form-data; boundary=---BOUNDARY @@ -14,7 +14,7 @@ content Response: 201 Created Content-Type: application/json; charset=UTF-8 -Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/56aa844d9b3a43e4a169b7d76f71041e/awards/140b7d05238849ca9d3d2153a1b2a8d5/complaints/eea6ee3d38cc4aefb76da96645d4a3c5/documents/d8a38dd58c724648ad4f17195a207166 +Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/56aa844d9b3a43e4a169b7d76f71041e/awards/140b7d05238849ca9d3d2153a1b2a8d5/complaints/bb9107253f974b9e91ba6171b4ee3273/documents/d8a38dd58c724648ad4f17195a207166 { "data": { "hash": "md5:00000000000000000000000000000000", diff --git a/docs/source/tendering/http/complaints/award-complaint-submission.http b/docs/source/tendering/http/complaints/award-complaint-submission.http index e50ac4f40f..8187ddad1f 100644 --- a/docs/source/tendering/http/complaints/award-complaint-submission.http +++ b/docs/source/tendering/http/complaints/award-complaint-submission.http @@ -36,7 +36,7 @@ DATA: Response: 201 Created Content-Type: application/json; charset=UTF-8 -Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/56aa844d9b3a43e4a169b7d76f71041e/awards/140b7d05238849ca9d3d2153a1b2a8d5/complaints/eea6ee3d38cc4aefb76da96645d4a3c5 +Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/56aa844d9b3a43e4a169b7d76f71041e/awards/140b7d05238849ca9d3d2153a1b2a8d5/complaints/bb9107253f974b9e91ba6171b4ee3273 { "access": { "transfer": "fe9df4f84f344a759d42160bb0acae32", @@ -74,7 +74,7 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/56aa844d9b3a43e4 "complaintID": "UA-2020-05-15-000001.1", "date": "2020-05-15T01:00:01+03:00", "type": "complaint", - "id": "eea6ee3d38cc4aefb76da96645d4a3c5" + "id": "bb9107253f974b9e91ba6171b4ee3273" } } diff --git a/docs/source/tendering/http/complaints/award-complaint-submit.http b/docs/source/tendering/http/complaints/award-complaint-submit.http index dcdc18dbce..09ce32c7e4 100644 --- a/docs/source/tendering/http/complaints/award-complaint-submit.http +++ b/docs/source/tendering/http/complaints/award-complaint-submit.http @@ -36,7 +36,7 @@ DATA: Response: 201 Created Content-Type: application/json; charset=UTF-8 -Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/56aa844d9b3a43e4a169b7d76f71041e/awards/b5338e7a746b4e749a9afb528d3d53a8/complaints/4511491b9d114704a2dbec5dc6687abd +Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/56aa844d9b3a43e4a169b7d76f71041e/awards/b5338e7a746b4e749a9afb528d3d53a8/complaints/95ccef7339254e35a3594377aff73d6c { "access": { "transfer": "fec94ce063714be0a7d7425da73f81e0", @@ -74,7 +74,7 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/56aa844d9b3a43e4 "complaintID": "UA-2020-05-15-000001.10", "date": "2020-05-15T01:00:03+03:00", "type": "complaint", - "id": "4511491b9d114704a2dbec5dc6687abd" + "id": "95ccef7339254e35a3594377aff73d6c" } } diff --git a/docs/source/tendering/http/complaints/award-complaint-unsatisfy.http b/docs/source/tendering/http/complaints/award-complaint-unsatisfy.http index ebc6a38aba..627425b7f0 100644 --- a/docs/source/tendering/http/complaints/award-complaint-unsatisfy.http +++ b/docs/source/tendering/http/complaints/award-complaint-unsatisfy.http @@ -1,4 +1,4 @@ -PATCH /api/2.5/tenders/56aa844d9b3a43e4a169b7d76f71041e/awards/140b7d05238849ca9d3d2153a1b2a8d5/complaints/b9d791e890424c06b02c308aa516a710?acc_token=7b5c8794c8864ddfaf804578760b0b36 HTTP/1.0 +PATCH /api/2.5/tenders/56aa844d9b3a43e4a169b7d76f71041e/awards/140b7d05238849ca9d3d2153a1b2a8d5/complaints/c2cf837fe0d34e5d90acc2b43b54cead?acc_token=7b5c8794c8864ddfaf804578760b0b36 HTTP/1.0 Authorization: Bearer broker Content-Length: 30 Content-Type: application/json @@ -45,7 +45,7 @@ Content-Type: application/json; charset=UTF-8 "complaintID": "UA-2020-05-15-000001.7", "date": "2020-05-15T01:00:03+03:00", "resolution": "Вимога не відповідає предмету закупівлі", - "id": "b9d791e890424c06b02c308aa516a710" + "id": "c2cf837fe0d34e5d90acc2b43b54cead" } } diff --git a/docs/source/tendering/http/complaints/award-complaint.http b/docs/source/tendering/http/complaints/award-complaint.http index 59992a0bb6..e3b23e8d8b 100644 --- a/docs/source/tendering/http/complaints/award-complaint.http +++ b/docs/source/tendering/http/complaints/award-complaint.http @@ -1,4 +1,4 @@ -GET /api/2.5/tenders/56aa844d9b3a43e4a169b7d76f71041e/awards/140b7d05238849ca9d3d2153a1b2a8d5/complaints/eea6ee3d38cc4aefb76da96645d4a3c5 HTTP/1.0 +GET /api/2.5/tenders/56aa844d9b3a43e4a169b7d76f71041e/awards/140b7d05238849ca9d3d2153a1b2a8d5/complaints/bb9107253f974b9e91ba6171b4ee3273 HTTP/1.0 Host: lb-api-sandbox.prozorro.gov.ua Response: 200 OK @@ -67,7 +67,7 @@ Content-Type: application/json; charset=UTF-8 "complaintID": "UA-2020-05-15-000001.1", "date": "2020-05-15T01:00:03+03:00", "type": "complaint", - "id": "eea6ee3d38cc4aefb76da96645d4a3c5", + "id": "bb9107253f974b9e91ba6171b4ee3273", "reviewPlace": "Place of review" } } diff --git a/docs/source/tendering/http/complaints/award-complaints-list.http b/docs/source/tendering/http/complaints/award-complaints-list.http index dc51651f06..06b520cfd4 100644 --- a/docs/source/tendering/http/complaints/award-complaints-list.http +++ b/docs/source/tendering/http/complaints/award-complaints-list.http @@ -68,7 +68,7 @@ Content-Type: application/json; charset=UTF-8 "complaintID": "UA-2020-05-15-000001.1", "date": "2020-05-15T01:00:03+03:00", "type": "complaint", - "id": "eea6ee3d38cc4aefb76da96645d4a3c5", + "id": "bb9107253f974b9e91ba6171b4ee3273", "reviewPlace": "Place of review" }, { @@ -107,7 +107,7 @@ Content-Type: application/json; charset=UTF-8 "date": "2020-05-15T01:00:03+03:00", "title": "Недостатньо інформації", "type": "complaint", - "id": "98bdde54ef9f440f83b78dbacd9ab16e" + "id": "dcc5ec1cf90047d0aee10ee7ceabc0e8" }, { "status": "declined", @@ -146,7 +146,7 @@ Content-Type: application/json; charset=UTF-8 "complaintID": "UA-2020-05-15-000001.3", "date": "2020-05-15T01:00:03+03:00", "type": "complaint", - "id": "21880d3a2a7c44ad8e30cb2a19172605", + "id": "c42514eda49c48ed89c94bb94b0d7527", "reviewPlace": "Place of review" }, { @@ -185,7 +185,7 @@ Content-Type: application/json; charset=UTF-8 "date": "2020-05-15T01:00:03+03:00", "title": "Недостатньо інформації", "type": "complaint", - "id": "d6be5dac0e684783846bcdf71ad12359", + "id": "cba74db2af9c4994836cce43b0df8de4", "reviewPlace": "Place of review" }, { @@ -200,7 +200,7 @@ Content-Type: application/json; charset=UTF-8 "currency": "UAH", "amount": 3000.0 }, - "id": "a7a63ff68a584a2ab6cf6cf88993b950", + "id": "cb67aafa016c41ef9b510d82f012e166", "rejectReason": "tenderCancelled", "dateAccepted": "2020-05-15T01:00:03+03:00", "author": { @@ -263,7 +263,7 @@ Content-Type: application/json; charset=UTF-8 "complaintID": "UA-2020-05-15-000001.6", "date": "2020-05-15T01:00:03+03:00", "resolution": "Умови виправлено, вибір переможня буде розгянуто повторно", - "id": "c9e6b01cbe524a1cb3ffe8f053e7e9d9" + "id": "e287472069134e9195a569cc7ed34896" }, { "status": "answered", @@ -297,7 +297,7 @@ Content-Type: application/json; charset=UTF-8 "complaintID": "UA-2020-05-15-000001.7", "date": "2020-05-15T01:00:03+03:00", "resolution": "Вимога не відповідає предмету закупівлі", - "id": "b9d791e890424c06b02c308aa516a710" + "id": "c2cf837fe0d34e5d90acc2b43b54cead" }, { "status": "pending", @@ -331,7 +331,7 @@ Content-Type: application/json; charset=UTF-8 "author": "aboveThresholdReviewers", "datePublished": "2020-05-15T01:00:03+03:00", "recipient": "complaint_owner", - "id": "c3886b1e75184f8f8332c9ea1fad01c0" + "id": "264158c62a8f4bd1b37986f33693d9c6" }, { "documents": [ @@ -343,7 +343,7 @@ Content-Type: application/json; charset=UTF-8 "format": "application/pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:03+03:00", - "id": "7b35f9df135d4de28f26444a0aeb8fad", + "id": "daa18dd118b54cde8132b7293b498900", "dateModified": "2020-05-15T01:00:03+03:00" } ], @@ -351,9 +351,9 @@ Content-Type: application/json; charset=UTF-8 "title": "Уточнення по вимозі", "author": "complaint_owner", "datePublished": "2020-05-15T01:00:03+03:00", - "relatedPost": "c3886b1e75184f8f8332c9ea1fad01c0", + "relatedPost": "264158c62a8f4bd1b37986f33693d9c6", "recipient": "aboveThresholdReviewers", - "id": "77a7265af591460ebbc63c162a2c7587" + "id": "fd1e94a259aa498d9a6f0f8f3cebbda5" }, { "description": "Відсутній документ", @@ -361,7 +361,7 @@ Content-Type: application/json; charset=UTF-8 "author": "aboveThresholdReviewers", "datePublished": "2020-05-15T01:00:03+03:00", "recipient": "tender_owner", - "id": "bb86fc2c70504c49919353932f924bab" + "id": "77de93b8d543420094da972262676838" }, { "documents": [ @@ -373,7 +373,7 @@ Content-Type: application/json; charset=UTF-8 "format": "application/pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:03+03:00", - "id": "eab0f30e991e4587ad185c37024d6b79", + "id": "03c91c7904d34442bd94855db5fe8ded", "dateModified": "2020-05-15T01:00:03+03:00" } ], @@ -381,9 +381,9 @@ Content-Type: application/json; charset=UTF-8 "title": "Уточнення по вимозі", "author": "tender_owner", "datePublished": "2020-05-15T01:00:03+03:00", - "relatedPost": "bb86fc2c70504c49919353932f924bab", + "relatedPost": "77de93b8d543420094da972262676838", "recipient": "aboveThresholdReviewers", - "id": "9f8fa840973b491ba9203f8a314b320e" + "id": "7159127ebbfa4de0a460ea3741a862ff" } ], "value": { @@ -394,7 +394,7 @@ Content-Type: application/json; charset=UTF-8 "complaintID": "UA-2020-05-15-000001.8", "date": "2020-05-15T01:00:03+03:00", "type": "complaint", - "id": "9b9892fdb7be477384fadd7514e5a8d4" + "id": "5686f14f5c4649b1ac87a631dc6996a1" }, { "status": "claim", @@ -424,7 +424,7 @@ Content-Type: application/json; charset=UTF-8 "complaintID": "UA-2020-05-15-000001.9", "date": "2020-05-15T01:00:03+03:00", "type": "claim", - "id": "a01979c79a024470bbf203c6cc3c09cd" + "id": "14732702aa0240afb3838e9e87ca7e7c" } ] } diff --git a/docs/source/tendering/http/complaints/cancellation-complaint-accept.http b/docs/source/tendering/http/complaints/cancellation-complaint-accept.http index accb3f43f7..31561e8162 100644 --- a/docs/source/tendering/http/complaints/cancellation-complaint-accept.http +++ b/docs/source/tendering/http/complaints/cancellation-complaint-accept.http @@ -1,4 +1,4 @@ -PATCH /api/2.5/tenders/9de80116006a4e58b18ac56dda573693/cancellations/28437ff38b254dfdacc863e870354d20/complaints/57299cc6dd6a4e86b1bc8b2c406bf397 HTTP/1.0 +PATCH /api/2.5/tenders/9de80116006a4e58b18ac56dda573693/cancellations/31235ac89ae54d56b2b78a0243f2d589/complaints/ee791245be184fe89d11df7d4650b501 HTTP/1.0 Authorization: Bearer reviewer Content-Length: 98 Content-Type: application/json @@ -64,7 +64,7 @@ Content-Type: application/json; charset=UTF-8 "date": "2020-05-15T01:00:00+03:00", "acceptance": true, "type": "complaint", - "id": "57299cc6dd6a4e86b1bc8b2c406bf397", + "id": "ee791245be184fe89d11df7d4650b501", "reviewPlace": "some" } } diff --git a/docs/source/tendering/http/complaints/cancellation-complaint-accepted-stopped.http b/docs/source/tendering/http/complaints/cancellation-complaint-accepted-stopped.http index ab200d6fe5..78ff16a7bc 100644 --- a/docs/source/tendering/http/complaints/cancellation-complaint-accepted-stopped.http +++ b/docs/source/tendering/http/complaints/cancellation-complaint-accepted-stopped.http @@ -1,4 +1,4 @@ -PATCH /api/2.5/tenders/9de80116006a4e58b18ac56dda573693/cancellations/28437ff38b254dfdacc863e870354d20/complaints/3bc7bafd9a5e4494ab22e3b770a85200 HTTP/1.0 +PATCH /api/2.5/tenders/9de80116006a4e58b18ac56dda573693/cancellations/31235ac89ae54d56b2b78a0243f2d589/complaints/fed31a7c8bcf4216ab2ce41691ffe84b HTTP/1.0 Authorization: Bearer reviewer Content-Length: 252 Content-Type: application/json @@ -27,7 +27,7 @@ Content-Type: application/json; charset=UTF-8 "currency": "UAH", "amount": 2000.0 }, - "id": "3bc7bafd9a5e4494ab22e3b770a85200", + "id": "fed31a7c8bcf4216ab2ce41691ffe84b", "rejectReason": "tenderCancelled", "dateAccepted": "2020-05-15T01:00:00+03:00", "author": { diff --git a/docs/source/tendering/http/complaints/cancellation-complaint-complaint.http b/docs/source/tendering/http/complaints/cancellation-complaint-complaint.http index bb1be47a58..154d52488b 100644 --- a/docs/source/tendering/http/complaints/cancellation-complaint-complaint.http +++ b/docs/source/tendering/http/complaints/cancellation-complaint-complaint.http @@ -1,4 +1,4 @@ -PATCH /api/2.5/tenders/9de80116006a4e58b18ac56dda573693/cancellations/28437ff38b254dfdacc863e870354d20/complaints/57299cc6dd6a4e86b1bc8b2c406bf397 HTTP/1.0 +PATCH /api/2.5/tenders/9de80116006a4e58b18ac56dda573693/cancellations/31235ac89ae54d56b2b78a0243f2d589/complaints/ee791245be184fe89d11df7d4650b501 HTTP/1.0 Authorization: Bearer bot Content-Length: 31 Content-Type: application/json @@ -59,7 +59,7 @@ Content-Type: application/json; charset=UTF-8 "complaintID": "UA-2020-05-15-000001.1", "date": "2020-05-15T01:00:00+03:00", "type": "complaint", - "id": "57299cc6dd6a4e86b1bc8b2c406bf397" + "id": "ee791245be184fe89d11df7d4650b501" } } diff --git a/docs/source/tendering/http/complaints/cancellation-complaint-decline.http b/docs/source/tendering/http/complaints/cancellation-complaint-decline.http index cf2ee5149d..e84e6161ef 100644 --- a/docs/source/tendering/http/complaints/cancellation-complaint-decline.http +++ b/docs/source/tendering/http/complaints/cancellation-complaint-decline.http @@ -1,4 +1,4 @@ -PATCH /api/2.5/tenders/9de80116006a4e58b18ac56dda573693/cancellations/28437ff38b254dfdacc863e870354d20/complaints/97865ab92faa492cb811582710d889df HTTP/1.0 +PATCH /api/2.5/tenders/9de80116006a4e58b18ac56dda573693/cancellations/31235ac89ae54d56b2b78a0243f2d589/complaints/4b2468b3657a4f8f9d66b73c680f9675 HTTP/1.0 Authorization: Bearer reviewer Content-Length: 32 Content-Type: application/json @@ -50,7 +50,7 @@ Content-Type: application/json; charset=UTF-8 "complaintID": "UA-2020-05-15-000001.2", "date": "2020-05-15T01:00:00+03:00", "type": "complaint", - "id": "97865ab92faa492cb811582710d889df", + "id": "4b2468b3657a4f8f9d66b73c680f9675", "reviewPlace": "some" } } diff --git a/docs/source/tendering/http/complaints/cancellation-complaint-reject.http b/docs/source/tendering/http/complaints/cancellation-complaint-reject.http index cb20371b2e..4e23837c39 100644 --- a/docs/source/tendering/http/complaints/cancellation-complaint-reject.http +++ b/docs/source/tendering/http/complaints/cancellation-complaint-reject.http @@ -1,4 +1,4 @@ -PATCH /api/2.5/tenders/9de80116006a4e58b18ac56dda573693/cancellations/28437ff38b254dfdacc863e870354d20/complaints/f87398f50f0f43ce8637ea8bdb532eaf HTTP/1.0 +PATCH /api/2.5/tenders/9de80116006a4e58b18ac56dda573693/cancellations/31235ac89ae54d56b2b78a0243f2d589/complaints/f7fa79ff504943328d4d06c5a29cc37c HTTP/1.0 Authorization: Bearer reviewer Content-Length: 122 Content-Type: application/json @@ -52,7 +52,7 @@ Content-Type: application/json; charset=UTF-8 "date": "2020-05-15T01:00:00+03:00", "title": "Недостатньо інформації", "type": "complaint", - "id": "f87398f50f0f43ce8637ea8bdb532eaf" + "id": "f7fa79ff504943328d4d06c5a29cc37c" } } diff --git a/docs/source/tendering/http/complaints/cancellation-complaint-resolution-upload.http b/docs/source/tendering/http/complaints/cancellation-complaint-resolution-upload.http index ac71993487..3e894566fb 100644 --- a/docs/source/tendering/http/complaints/cancellation-complaint-resolution-upload.http +++ b/docs/source/tendering/http/complaints/cancellation-complaint-resolution-upload.http @@ -1,4 +1,4 @@ -POST /api/2.5/tenders/9de80116006a4e58b18ac56dda573693/cancellations/28437ff38b254dfdacc863e870354d20/complaints/57299cc6dd6a4e86b1bc8b2c406bf397/documents HTTP/1.0 +POST /api/2.5/tenders/9de80116006a4e58b18ac56dda573693/cancellations/31235ac89ae54d56b2b78a0243f2d589/complaints/ee791245be184fe89d11df7d4650b501/documents HTTP/1.0 Authorization: Bearer reviewer Content-Length: 155 Content-Type: multipart/form-data; boundary=---BOUNDARY @@ -14,7 +14,7 @@ content Response: 201 Created Content-Type: application/json; charset=UTF-8 -Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/9de80116006a4e58b18ac56dda573693/cancellations/28437ff38b254dfdacc863e870354d20/complaints/57299cc6dd6a4e86b1bc8b2c406bf397/documents/c91a3b839a7f4bae91fd90c00e56f407 +Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/9de80116006a4e58b18ac56dda573693/cancellations/31235ac89ae54d56b2b78a0243f2d589/complaints/ee791245be184fe89d11df7d4650b501/documents/c91a3b839a7f4bae91fd90c00e56f407 { "data": { "hash": "md5:00000000000000000000000000000000", diff --git a/docs/source/tendering/http/complaints/cancellation-complaint-resolve.http b/docs/source/tendering/http/complaints/cancellation-complaint-resolve.http index af26a1d7ae..441fd5c1bd 100644 --- a/docs/source/tendering/http/complaints/cancellation-complaint-resolve.http +++ b/docs/source/tendering/http/complaints/cancellation-complaint-resolve.http @@ -1,4 +1,4 @@ -PATCH /api/2.5/tenders/9de80116006a4e58b18ac56dda573693/cancellations/28437ff38b254dfdacc863e870354d20/complaints/57299cc6dd6a4e86b1bc8b2c406bf397 HTTP/1.0 +PATCH /api/2.5/tenders/9de80116006a4e58b18ac56dda573693/cancellations/31235ac89ae54d56b2b78a0243f2d589/complaints/ee791245be184fe89d11df7d4650b501 HTTP/1.0 Authorization: Bearer reviewer Content-Length: 33 Content-Type: application/json @@ -74,7 +74,7 @@ Content-Type: application/json; charset=UTF-8 "date": "2020-05-15T01:00:00+03:00", "acceptance": true, "type": "complaint", - "id": "57299cc6dd6a4e86b1bc8b2c406bf397", + "id": "ee791245be184fe89d11df7d4650b501", "reviewPlace": "some" } } diff --git a/docs/source/tendering/http/complaints/cancellation-complaint-resolved.http b/docs/source/tendering/http/complaints/cancellation-complaint-resolved.http index cfa27281a5..310038484f 100644 --- a/docs/source/tendering/http/complaints/cancellation-complaint-resolved.http +++ b/docs/source/tendering/http/complaints/cancellation-complaint-resolved.http @@ -1,4 +1,4 @@ -PATCH /api/2.5/tenders/9de80116006a4e58b18ac56dda573693/cancellations/28437ff38b254dfdacc863e870354d20/complaints/57299cc6dd6a4e86b1bc8b2c406bf397?acc_token=72ae492d8a2f4047a556ace3bfe8b2fd HTTP/1.0 +PATCH /api/2.5/tenders/9de80116006a4e58b18ac56dda573693/cancellations/31235ac89ae54d56b2b78a0243f2d589/complaints/ee791245be184fe89d11df7d4650b501?acc_token=72ae492d8a2f4047a556ace3bfe8b2fd HTTP/1.0 Authorization: Bearer broker Content-Length: 145 Content-Type: application/json @@ -76,7 +76,7 @@ Content-Type: application/json; charset=UTF-8 "date": "2020-05-15T01:00:00+03:00", "acceptance": true, "type": "complaint", - "id": "57299cc6dd6a4e86b1bc8b2c406bf397", + "id": "ee791245be184fe89d11df7d4650b501", "reviewPlace": "some", "dateAccepted": "2020-05-15T01:00:00+03:00" } diff --git a/docs/source/tendering/http/complaints/cancellation-complaint-submission-upload.http b/docs/source/tendering/http/complaints/cancellation-complaint-submission-upload.http index 7020798a80..42a1812105 100644 --- a/docs/source/tendering/http/complaints/cancellation-complaint-submission-upload.http +++ b/docs/source/tendering/http/complaints/cancellation-complaint-submission-upload.http @@ -1,4 +1,4 @@ -POST /api/2.5/tenders/9de80116006a4e58b18ac56dda573693/cancellations/28437ff38b254dfdacc863e870354d20/complaints/57299cc6dd6a4e86b1bc8b2c406bf397/documents?acc_token=67268e88ad54408c85fd32113ace853e HTTP/1.0 +POST /api/2.5/tenders/9de80116006a4e58b18ac56dda573693/cancellations/31235ac89ae54d56b2b78a0243f2d589/complaints/ee791245be184fe89d11df7d4650b501/documents?acc_token=67268e88ad54408c85fd32113ace853e HTTP/1.0 Authorization: Bearer broker Content-Length: 156 Content-Type: multipart/form-data; boundary=---BOUNDARY @@ -14,7 +14,7 @@ content Response: 201 Created Content-Type: application/json; charset=UTF-8 -Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/9de80116006a4e58b18ac56dda573693/cancellations/28437ff38b254dfdacc863e870354d20/complaints/57299cc6dd6a4e86b1bc8b2c406bf397/documents/06517cdbfecf446b994bb0912e3d9b51 +Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/9de80116006a4e58b18ac56dda573693/cancellations/31235ac89ae54d56b2b78a0243f2d589/complaints/ee791245be184fe89d11df7d4650b501/documents/06517cdbfecf446b994bb0912e3d9b51 { "data": { "hash": "md5:00000000000000000000000000000000", diff --git a/docs/source/tendering/http/complaints/cancellation-complaint-submission.http b/docs/source/tendering/http/complaints/cancellation-complaint-submission.http index 20c34f1054..992f22d640 100644 --- a/docs/source/tendering/http/complaints/cancellation-complaint-submission.http +++ b/docs/source/tendering/http/complaints/cancellation-complaint-submission.http @@ -1,4 +1,4 @@ -POST /api/2.5/tenders/9de80116006a4e58b18ac56dda573693/cancellations/28437ff38b254dfdacc863e870354d20/complaints HTTP/1.0 +POST /api/2.5/tenders/9de80116006a4e58b18ac56dda573693/cancellations/31235ac89ae54d56b2b78a0243f2d589/complaints HTTP/1.0 Authorization: Bearer broker Content-Length: 1469 Content-Type: application/json @@ -36,7 +36,7 @@ DATA: Response: 201 Created Content-Type: application/json; charset=UTF-8 -Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/9de80116006a4e58b18ac56dda573693/cancellations/28437ff38b254dfdacc863e870354d20/complaints/57299cc6dd6a4e86b1bc8b2c406bf397 +Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/9de80116006a4e58b18ac56dda573693/cancellations/31235ac89ae54d56b2b78a0243f2d589/complaints/ee791245be184fe89d11df7d4650b501 { "access": { "transfer": "cf0c99d7f2af4a2084a12f18448c8d51", @@ -74,7 +74,7 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/9de80116006a4e58 "complaintID": "UA-2020-05-15-000001.1", "date": "2020-05-15T01:00:00+03:00", "type": "complaint", - "id": "57299cc6dd6a4e86b1bc8b2c406bf397" + "id": "ee791245be184fe89d11df7d4650b501" } } diff --git a/docs/source/tendering/http/complaints/cancellation-complaint.http b/docs/source/tendering/http/complaints/cancellation-complaint.http index 75b585a102..5fcc27275a 100644 --- a/docs/source/tendering/http/complaints/cancellation-complaint.http +++ b/docs/source/tendering/http/complaints/cancellation-complaint.http @@ -1,4 +1,4 @@ -GET /api/2.5/tenders/9de80116006a4e58b18ac56dda573693/cancellations/28437ff38b254dfdacc863e870354d20/complaints/57299cc6dd6a4e86b1bc8b2c406bf397 HTTP/1.0 +GET /api/2.5/tenders/9de80116006a4e58b18ac56dda573693/cancellations/31235ac89ae54d56b2b78a0243f2d589/complaints/ee791245be184fe89d11df7d4650b501 HTTP/1.0 Host: lb-api-sandbox.prozorro.gov.ua Response: 200 OK @@ -66,7 +66,7 @@ Content-Type: application/json; charset=UTF-8 "date": "2020-05-15T01:00:00+03:00", "acceptance": true, "type": "complaint", - "id": "57299cc6dd6a4e86b1bc8b2c406bf397", + "id": "ee791245be184fe89d11df7d4650b501", "reviewPlace": "some", "dateAccepted": "2020-05-15T01:00:00+03:00" } diff --git a/docs/source/tendering/http/complaints/cancellation-complaints-list.http b/docs/source/tendering/http/complaints/cancellation-complaints-list.http index 278debd3f0..4a4e37eb6f 100644 --- a/docs/source/tendering/http/complaints/cancellation-complaints-list.http +++ b/docs/source/tendering/http/complaints/cancellation-complaints-list.http @@ -1,4 +1,4 @@ -GET /api/2.5/tenders/9de80116006a4e58b18ac56dda573693/cancellations/28437ff38b254dfdacc863e870354d20/complaints HTTP/1.0 +GET /api/2.5/tenders/9de80116006a4e58b18ac56dda573693/cancellations/31235ac89ae54d56b2b78a0243f2d589/complaints HTTP/1.0 Host: lb-api-sandbox.prozorro.gov.ua Response: 200 OK @@ -67,7 +67,7 @@ Content-Type: application/json; charset=UTF-8 "date": "2020-05-15T01:00:00+03:00", "acceptance": true, "type": "complaint", - "id": "57299cc6dd6a4e86b1bc8b2c406bf397", + "id": "ee791245be184fe89d11df7d4650b501", "reviewPlace": "some", "dateAccepted": "2020-05-15T01:00:00+03:00" }, @@ -108,7 +108,7 @@ Content-Type: application/json; charset=UTF-8 "complaintID": "UA-2020-05-15-000001.2", "date": "2020-05-15T01:00:00+03:00", "type": "complaint", - "id": "97865ab92faa492cb811582710d889df", + "id": "4b2468b3657a4f8f9d66b73c680f9675", "reviewPlace": "some" }, { @@ -148,7 +148,7 @@ Content-Type: application/json; charset=UTF-8 "date": "2020-05-15T01:00:00+03:00", "title": "Недостатньо інформації", "type": "complaint", - "id": "f87398f50f0f43ce8637ea8bdb532eaf" + "id": "f7fa79ff504943328d4d06c5a29cc37c" }, { "status": "stopped", @@ -162,7 +162,7 @@ Content-Type: application/json; charset=UTF-8 "currency": "UAH", "amount": 2000.0 }, - "id": "c449ec9e93c749889ee412a864f8bd4f", + "id": "5f7017dae2a146f088381533135c2f68", "rejectReason": "tenderCancelled", "dateAccepted": "2020-05-15T01:00:00+03:00", "author": { @@ -205,7 +205,7 @@ Content-Type: application/json; charset=UTF-8 "currency": "UAH", "amount": 2000.0 }, - "id": "3bc7bafd9a5e4494ab22e3b770a85200", + "id": "fed31a7c8bcf4216ab2ce41691ffe84b", "rejectReason": "tenderCancelled", "dateAccepted": "2020-05-15T01:00:00+03:00", "author": { diff --git a/docs/source/tendering/http/complaints/claim-submission.http b/docs/source/tendering/http/complaints/claim-submission.http index 0866a2804e..c85735e56f 100644 --- a/docs/source/tendering/http/complaints/claim-submission.http +++ b/docs/source/tendering/http/complaints/claim-submission.http @@ -34,7 +34,7 @@ DATA: Response: 201 Created Content-Type: application/json; charset=UTF-8 -Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/1a7dc160a6954967bfb3fcd1dd4545d3/complaints/2777125e15cc49f890ea89cd88dceffb +Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/1a7dc160a6954967bfb3fcd1dd4545d3/complaints/fd73a9631f4340858339163b6ef19dd1 { "access": { "transfer": "28ff2ae37af54efab81be52717f15160", @@ -67,7 +67,7 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/1a7dc160a6954967 "complaintID": "UA-2020-05-15-000001.1", "date": "2020-05-15T01:00:00+03:00", "type": "claim", - "id": "2777125e15cc49f890ea89cd88dceffb" + "id": "fd73a9631f4340858339163b6ef19dd1" } } diff --git a/docs/source/tendering/http/complaints/complaint-accept.http b/docs/source/tendering/http/complaints/complaint-accept.http index 0c990937c2..3cf8001b2e 100644 --- a/docs/source/tendering/http/complaints/complaint-accept.http +++ b/docs/source/tendering/http/complaints/complaint-accept.http @@ -1,4 +1,4 @@ -PATCH /api/2.5/tenders/1a7dc160a6954967bfb3fcd1dd4545d3/complaints/9698c2aae121470eb87342fb51872653 HTTP/1.0 +PATCH /api/2.5/tenders/1a7dc160a6954967bfb3fcd1dd4545d3/complaints/b84e3d4216374e81a4b85a973be2fff5 HTTP/1.0 Authorization: Bearer reviewer Content-Length: 109 Content-Type: application/json @@ -51,7 +51,7 @@ Content-Type: application/json; charset=UTF-8 "date": "2020-05-15T01:00:00+03:00", "title": "Недостатньо інформації", "type": "complaint", - "id": "9698c2aae121470eb87342fb51872653", + "id": "b84e3d4216374e81a4b85a973be2fff5", "reviewPlace": "Place of review" } } diff --git a/docs/source/tendering/http/complaints/complaint-accepted-stopped.http b/docs/source/tendering/http/complaints/complaint-accepted-stopped.http index d6ddca5ae4..7db311b7a6 100644 --- a/docs/source/tendering/http/complaints/complaint-accepted-stopped.http +++ b/docs/source/tendering/http/complaints/complaint-accepted-stopped.http @@ -1,4 +1,4 @@ -PATCH /api/2.5/tenders/1a7dc160a6954967bfb3fcd1dd4545d3/complaints/b51604ff3434469a98320c9b034b4c0a HTTP/1.0 +PATCH /api/2.5/tenders/1a7dc160a6954967bfb3fcd1dd4545d3/complaints/8ab5a1c471fc483581f80792dab75484 HTTP/1.0 Authorization: Bearer reviewer Content-Length: 252 Content-Type: application/json @@ -27,7 +27,7 @@ Content-Type: application/json; charset=UTF-8 "currency": "UAH", "amount": 2000.0 }, - "id": "b51604ff3434469a98320c9b034b4c0a", + "id": "8ab5a1c471fc483581f80792dab75484", "rejectReason": "tenderCancelled", "dateAccepted": "2020-05-15T01:00:00+03:00", "author": { diff --git a/docs/source/tendering/http/complaints/complaint-accepted-stopping-2020-04-19.http b/docs/source/tendering/http/complaints/complaint-accepted-stopping-2020-04-19.http index 3d6ebc7956..1ed8f42f78 100644 --- a/docs/source/tendering/http/complaints/complaint-accepted-stopping-2020-04-19.http +++ b/docs/source/tendering/http/complaints/complaint-accepted-stopping-2020-04-19.http @@ -1,4 +1,4 @@ -PATCH /api/2.5/tenders/1a7dc160a6954967bfb3fcd1dd4545d3/complaints/bb9432ace0c047c6b4c925ec4ace0099?acc_token=f4913ab8c46841ab9c5696cab9236f3f HTTP/1.0 +PATCH /api/2.5/tenders/1a7dc160a6954967bfb3fcd1dd4545d3/complaints/cfbf11a6c9c241988f120ecbb8c4867b?acc_token=f4913ab8c46841ab9c5696cab9236f3f HTTP/1.0 Authorization: Bearer broker Content-Length: 228 Content-Type: application/json diff --git a/docs/source/tendering/http/complaints/complaint-answer.http b/docs/source/tendering/http/complaints/complaint-answer.http index 0bf353f91a..bca5a65d5e 100644 --- a/docs/source/tendering/http/complaints/complaint-answer.http +++ b/docs/source/tendering/http/complaints/complaint-answer.http @@ -1,4 +1,4 @@ -PATCH /api/2.5/tenders/1a7dc160a6954967bfb3fcd1dd4545d3/complaints/f69c1412dc8b4f318d464ff518799e37?acc_token=f3fcbf245b584352b8ee0c06c6298ad4 HTTP/1.0 +PATCH /api/2.5/tenders/1a7dc160a6954967bfb3fcd1dd4545d3/complaints/39e21275514647ba80d2ac1c9814d826?acc_token=f3fcbf245b584352b8ee0c06c6298ad4 HTTP/1.0 Authorization: Bearer broker Content-Length: 250 Content-Type: application/json @@ -26,7 +26,7 @@ Content-Type: application/json; charset=UTF-8 "complaintID": "UA-2020-05-15-000001.2", "date": "2020-05-15T01:00:00+03:00", "resolution": "Виправлено неконкурентні умови", - "id": "f69c1412dc8b4f318d464ff518799e37" + "id": "39e21275514647ba80d2ac1c9814d826" } } diff --git a/docs/source/tendering/http/complaints/complaint-claim.http b/docs/source/tendering/http/complaints/complaint-claim.http index fb5415e18c..9ba8525193 100644 --- a/docs/source/tendering/http/complaints/complaint-claim.http +++ b/docs/source/tendering/http/complaints/complaint-claim.http @@ -1,4 +1,4 @@ -PATCH /api/2.5/tenders/1a7dc160a6954967bfb3fcd1dd4545d3/complaints/2777125e15cc49f890ea89cd88dceffb?acc_token=25826c9e2eca4f4d991cb81bb4436f44 HTTP/1.0 +PATCH /api/2.5/tenders/1a7dc160a6954967bfb3fcd1dd4545d3/complaints/fd73a9631f4340858339163b6ef19dd1?acc_token=25826c9e2eca4f4d991cb81bb4436f44 HTTP/1.0 Authorization: Bearer broker Content-Length: 29 Content-Type: application/json @@ -35,7 +35,7 @@ Content-Type: application/json; charset=UTF-8 "complaintID": "UA-2020-05-15-000001.1", "date": "2020-05-15T01:00:00+03:00", "type": "claim", - "id": "2777125e15cc49f890ea89cd88dceffb" + "id": "fd73a9631f4340858339163b6ef19dd1" } } diff --git a/docs/source/tendering/http/complaints/complaint-complaint.http b/docs/source/tendering/http/complaints/complaint-complaint.http index c909c4e918..bde46530c1 100644 --- a/docs/source/tendering/http/complaints/complaint-complaint.http +++ b/docs/source/tendering/http/complaints/complaint-complaint.http @@ -1,4 +1,4 @@ -PATCH /api/2.5/tenders/1a7dc160a6954967bfb3fcd1dd4545d3/complaints/9698c2aae121470eb87342fb51872653 HTTP/1.0 +PATCH /api/2.5/tenders/1a7dc160a6954967bfb3fcd1dd4545d3/complaints/b84e3d4216374e81a4b85a973be2fff5 HTTP/1.0 Authorization: Bearer bot Content-Length: 31 Content-Type: application/json @@ -46,7 +46,7 @@ Content-Type: application/json; charset=UTF-8 "complaintID": "UA-2020-05-15-000001.5", "date": "2020-05-15T01:00:00+03:00", "type": "complaint", - "id": "9698c2aae121470eb87342fb51872653" + "id": "b84e3d4216374e81a4b85a973be2fff5" } } diff --git a/docs/source/tendering/http/complaints/complaint-decline.http b/docs/source/tendering/http/complaints/complaint-decline.http index 88eb3c7707..1da738aee9 100644 --- a/docs/source/tendering/http/complaints/complaint-decline.http +++ b/docs/source/tendering/http/complaints/complaint-decline.http @@ -1,4 +1,4 @@ -PATCH /api/2.5/tenders/1a7dc160a6954967bfb3fcd1dd4545d3/complaints/4bfb8ef256dd4c198abaccf0e9db7d58 HTTP/1.0 +PATCH /api/2.5/tenders/1a7dc160a6954967bfb3fcd1dd4545d3/complaints/437e05002e5e45a0bb463f5ad3220d2b HTTP/1.0 Authorization: Bearer reviewer Content-Length: 32 Content-Type: application/json @@ -50,7 +50,7 @@ Content-Type: application/json; charset=UTF-8 "complaintID": "UA-2020-05-15-000001.3", "date": "2020-05-15T01:00:00+03:00", "type": "complaint", - "id": "4bfb8ef256dd4c198abaccf0e9db7d58", + "id": "437e05002e5e45a0bb463f5ad3220d2b", "reviewPlace": "Place of review" } } diff --git a/docs/source/tendering/http/complaints/complaint-mistaken-2020-04-19.http b/docs/source/tendering/http/complaints/complaint-mistaken-2020-04-19.http index 3100ef0d8f..484c991b4c 100644 --- a/docs/source/tendering/http/complaints/complaint-mistaken-2020-04-19.http +++ b/docs/source/tendering/http/complaints/complaint-mistaken-2020-04-19.http @@ -1,4 +1,4 @@ -PATCH /api/2.5/tenders/1a7dc160a6954967bfb3fcd1dd4545d3/complaints/38d6d6628b5347e5af7a12c4c93fe47c?acc_token=d9246454d7d844bbb433c62b70df53e1 HTTP/1.0 +PATCH /api/2.5/tenders/1a7dc160a6954967bfb3fcd1dd4545d3/complaints/7d9aed18ef4847f2b353c7edb0c95143?acc_token=d9246454d7d844bbb433c62b70df53e1 HTTP/1.0 Authorization: Bearer broker Content-Length: 32 Content-Type: application/json @@ -46,7 +46,7 @@ Content-Type: application/json; charset=UTF-8 "complaintID": "UA-2020-05-15-000001.9", "date": "2020-05-15T01:00:00+03:00", "type": "complaint", - "id": "38d6d6628b5347e5af7a12c4c93fe47c" + "id": "7d9aed18ef4847f2b353c7edb0c95143" } } diff --git a/docs/source/tendering/http/complaints/complaint-post-complaint-owner.http b/docs/source/tendering/http/complaints/complaint-post-complaint-owner.http index 93b6b2a13e..0a300cf2bc 100644 --- a/docs/source/tendering/http/complaints/complaint-post-complaint-owner.http +++ b/docs/source/tendering/http/complaints/complaint-post-complaint-owner.http @@ -1,4 +1,4 @@ -POST /api/2.5/tenders/1a7dc160a6954967bfb3fcd1dd4545d3/complaints/9f3a6c7d446b4503872063f6021b89f2/posts?acc_token=10197838fdcd403ba5f9180fc7683aec HTTP/1.0 +POST /api/2.5/tenders/1a7dc160a6954967bfb3fcd1dd4545d3/complaints/949127b6d2834a5ba8156ffef63a9a3c/posts?acc_token=10197838fdcd403ba5f9180fc7683aec HTTP/1.0 Authorization: Bearer broker Content-Length: 670 Content-Type: application/json @@ -15,7 +15,7 @@ DATA: "format": "application/pdf" } ], - "relatedPost": "49152b64d32449558213fe0e413d8476", + "relatedPost": "a7fcad7850ac470fb74d5ea7964a7e32", "description": "Додано документ", "title": "Уточнення по вимозі" } @@ -23,7 +23,7 @@ DATA: Response: 201 Created Content-Type: application/json; charset=UTF-8 -Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/1a7dc160a6954967bfb3fcd1dd4545d3/complaints/9f3a6c7d446b4503872063f6021b89f2/posts/2fce10c54207405fac5bdfda41aa37f9 +Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/1a7dc160a6954967bfb3fcd1dd4545d3/complaints/949127b6d2834a5ba8156ffef63a9a3c/posts/ec5d79b7aa544d36824079c03e462d3c { "data": { "documents": [ @@ -35,7 +35,7 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/1a7dc160a6954967 "format": "application/pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", - "id": "8be84c5e6df142b1bebc4dc846295cbf", + "id": "e50966563324428fbe3375b2dc49a153", "dateModified": "2020-05-15T01:00:00+03:00" } ], @@ -43,9 +43,9 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/1a7dc160a6954967 "title": "Уточнення по вимозі", "author": "complaint_owner", "datePublished": "2020-05-15T01:00:00+03:00", - "relatedPost": "49152b64d32449558213fe0e413d8476", + "relatedPost": "a7fcad7850ac470fb74d5ea7964a7e32", "recipient": "aboveThresholdReviewers", - "id": "2fce10c54207405fac5bdfda41aa37f9" + "id": "ec5d79b7aa544d36824079c03e462d3c" } } diff --git a/docs/source/tendering/http/complaints/complaint-post-reviewer-complaint-owner.http b/docs/source/tendering/http/complaints/complaint-post-reviewer-complaint-owner.http index e0e98691c9..f87754404c 100644 --- a/docs/source/tendering/http/complaints/complaint-post-reviewer-complaint-owner.http +++ b/docs/source/tendering/http/complaints/complaint-post-reviewer-complaint-owner.http @@ -1,4 +1,4 @@ -POST /api/2.5/tenders/1a7dc160a6954967bfb3fcd1dd4545d3/complaints/9f3a6c7d446b4503872063f6021b89f2/posts HTTP/1.0 +POST /api/2.5/tenders/1a7dc160a6954967bfb3fcd1dd4545d3/complaints/949127b6d2834a5ba8156ffef63a9a3c/posts HTTP/1.0 Authorization: Bearer reviewer Content-Length: 281 Content-Type: application/json @@ -14,7 +14,7 @@ DATA: Response: 201 Created Content-Type: application/json; charset=UTF-8 -Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/1a7dc160a6954967bfb3fcd1dd4545d3/complaints/9f3a6c7d446b4503872063f6021b89f2/posts/49152b64d32449558213fe0e413d8476 +Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/1a7dc160a6954967bfb3fcd1dd4545d3/complaints/949127b6d2834a5ba8156ffef63a9a3c/posts/a7fcad7850ac470fb74d5ea7964a7e32 { "data": { "description": "Відсутній документ", @@ -22,7 +22,7 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/1a7dc160a6954967 "author": "aboveThresholdReviewers", "datePublished": "2020-05-15T01:00:00+03:00", "recipient": "complaint_owner", - "id": "49152b64d32449558213fe0e413d8476" + "id": "a7fcad7850ac470fb74d5ea7964a7e32" } } diff --git a/docs/source/tendering/http/complaints/complaint-post-reviewer-tender-owner.http b/docs/source/tendering/http/complaints/complaint-post-reviewer-tender-owner.http index 2fe91e4cf0..152932f6cf 100644 --- a/docs/source/tendering/http/complaints/complaint-post-reviewer-tender-owner.http +++ b/docs/source/tendering/http/complaints/complaint-post-reviewer-tender-owner.http @@ -1,4 +1,4 @@ -POST /api/2.5/tenders/1a7dc160a6954967bfb3fcd1dd4545d3/complaints/9f3a6c7d446b4503872063f6021b89f2/posts HTTP/1.0 +POST /api/2.5/tenders/1a7dc160a6954967bfb3fcd1dd4545d3/complaints/949127b6d2834a5ba8156ffef63a9a3c/posts HTTP/1.0 Authorization: Bearer reviewer Content-Length: 278 Content-Type: application/json @@ -14,7 +14,7 @@ DATA: Response: 201 Created Content-Type: application/json; charset=UTF-8 -Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/1a7dc160a6954967bfb3fcd1dd4545d3/complaints/9f3a6c7d446b4503872063f6021b89f2/posts/6ef16edfcfb54e459ba37ceae65ddf58 +Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/1a7dc160a6954967bfb3fcd1dd4545d3/complaints/949127b6d2834a5ba8156ffef63a9a3c/posts/a4b61c81a8cc44d6965de32baa8139e1 { "data": { "description": "Відсутній документ", @@ -22,7 +22,7 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/1a7dc160a6954967 "author": "aboveThresholdReviewers", "datePublished": "2020-05-15T01:00:00+03:00", "recipient": "tender_owner", - "id": "6ef16edfcfb54e459ba37ceae65ddf58" + "id": "a4b61c81a8cc44d6965de32baa8139e1" } } diff --git a/docs/source/tendering/http/complaints/complaint-post-tender-owner.http b/docs/source/tendering/http/complaints/complaint-post-tender-owner.http index 1c0a4b13e1..81ee7c1b3f 100644 --- a/docs/source/tendering/http/complaints/complaint-post-tender-owner.http +++ b/docs/source/tendering/http/complaints/complaint-post-tender-owner.http @@ -1,4 +1,4 @@ -POST /api/2.5/tenders/1a7dc160a6954967bfb3fcd1dd4545d3/complaints/9f3a6c7d446b4503872063f6021b89f2/posts?acc_token=f3fcbf245b584352b8ee0c06c6298ad4 HTTP/1.0 +POST /api/2.5/tenders/1a7dc160a6954967bfb3fcd1dd4545d3/complaints/949127b6d2834a5ba8156ffef63a9a3c/posts?acc_token=f3fcbf245b584352b8ee0c06c6298ad4 HTTP/1.0 Authorization: Bearer broker Content-Length: 663 Content-Type: application/json @@ -15,7 +15,7 @@ DATA: "format": "application/pdf" } ], - "relatedPost": "6ef16edfcfb54e459ba37ceae65ddf58", + "relatedPost": "a4b61c81a8cc44d6965de32baa8139e1", "description": "Додано документ", "title": "Уточнення по вимозі" } @@ -23,7 +23,7 @@ DATA: Response: 201 Created Content-Type: application/json; charset=UTF-8 -Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/1a7dc160a6954967bfb3fcd1dd4545d3/complaints/9f3a6c7d446b4503872063f6021b89f2/posts/c1c86e299d6a40baa9c0b37f09157800 +Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/1a7dc160a6954967bfb3fcd1dd4545d3/complaints/949127b6d2834a5ba8156ffef63a9a3c/posts/a9acd9a9b014433fa6a1eefc37f23b3b { "data": { "documents": [ @@ -35,7 +35,7 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/1a7dc160a6954967 "format": "application/pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", - "id": "8797a89acda2403ba388caedc67686c3", + "id": "fde3d09dd48b4ef994e747cc546ae78a", "dateModified": "2020-05-15T01:00:00+03:00" } ], @@ -43,9 +43,9 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/1a7dc160a6954967 "title": "Уточнення по вимозі", "author": "tender_owner", "datePublished": "2020-05-15T01:00:00+03:00", - "relatedPost": "6ef16edfcfb54e459ba37ceae65ddf58", + "relatedPost": "a4b61c81a8cc44d6965de32baa8139e1", "recipient": "aboveThresholdReviewers", - "id": "c1c86e299d6a40baa9c0b37f09157800" + "id": "a9acd9a9b014433fa6a1eefc37f23b3b" } } diff --git a/docs/source/tendering/http/complaints/complaint-reject.http b/docs/source/tendering/http/complaints/complaint-reject.http index c5feb432a6..274ed0a6a9 100644 --- a/docs/source/tendering/http/complaints/complaint-reject.http +++ b/docs/source/tendering/http/complaints/complaint-reject.http @@ -1,4 +1,4 @@ -PATCH /api/2.5/tenders/1a7dc160a6954967bfb3fcd1dd4545d3/complaints/ede6804b22c5468a9819c2e0f4496ded HTTP/1.0 +PATCH /api/2.5/tenders/1a7dc160a6954967bfb3fcd1dd4545d3/complaints/d3a973174cb548a9a4993fdbf5d9674e HTTP/1.0 Authorization: Bearer reviewer Content-Length: 64 Content-Type: application/json @@ -50,7 +50,7 @@ Content-Type: application/json; charset=UTF-8 "date": "2020-05-15T01:00:00+03:00", "title": "Недостатньо інформації", "type": "complaint", - "id": "ede6804b22c5468a9819c2e0f4496ded" + "id": "d3a973174cb548a9a4993fdbf5d9674e" } } diff --git a/docs/source/tendering/http/complaints/complaint-resolution-upload.http b/docs/source/tendering/http/complaints/complaint-resolution-upload.http index 87038d67ab..56943e6525 100644 --- a/docs/source/tendering/http/complaints/complaint-resolution-upload.http +++ b/docs/source/tendering/http/complaints/complaint-resolution-upload.http @@ -1,4 +1,4 @@ -POST /api/2.5/tenders/1a7dc160a6954967bfb3fcd1dd4545d3/complaints/9698c2aae121470eb87342fb51872653/documents HTTP/1.0 +POST /api/2.5/tenders/1a7dc160a6954967bfb3fcd1dd4545d3/complaints/b84e3d4216374e81a4b85a973be2fff5/documents HTTP/1.0 Authorization: Bearer reviewer Content-Length: 155 Content-Type: multipart/form-data; boundary=---BOUNDARY @@ -14,7 +14,7 @@ content Response: 201 Created Content-Type: application/json; charset=UTF-8 -Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/1a7dc160a6954967bfb3fcd1dd4545d3/complaints/9698c2aae121470eb87342fb51872653/documents/b9923ce980e745aaa07acc494d311c00 +Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/1a7dc160a6954967bfb3fcd1dd4545d3/complaints/b84e3d4216374e81a4b85a973be2fff5/documents/b9923ce980e745aaa07acc494d311c00 { "data": { "hash": "md5:00000000000000000000000000000000", diff --git a/docs/source/tendering/http/complaints/complaint-resolve.http b/docs/source/tendering/http/complaints/complaint-resolve.http index 2096328e1c..a79a328964 100644 --- a/docs/source/tendering/http/complaints/complaint-resolve.http +++ b/docs/source/tendering/http/complaints/complaint-resolve.http @@ -1,4 +1,4 @@ -PATCH /api/2.5/tenders/1a7dc160a6954967bfb3fcd1dd4545d3/complaints/9698c2aae121470eb87342fb51872653 HTTP/1.0 +PATCH /api/2.5/tenders/1a7dc160a6954967bfb3fcd1dd4545d3/complaints/b84e3d4216374e81a4b85a973be2fff5 HTTP/1.0 Authorization: Bearer reviewer Content-Length: 33 Content-Type: application/json @@ -64,7 +64,7 @@ Content-Type: application/json; charset=UTF-8 "complaintID": "UA-2020-05-15-000001.5", "date": "2020-05-15T01:00:00+03:00", "type": "complaint", - "id": "9698c2aae121470eb87342fb51872653", + "id": "b84e3d4216374e81a4b85a973be2fff5", "reviewPlace": "Place of review" } } diff --git a/docs/source/tendering/http/complaints/complaint-resolved.http b/docs/source/tendering/http/complaints/complaint-resolved.http index bc339026ce..ba9d7b8c68 100644 --- a/docs/source/tendering/http/complaints/complaint-resolved.http +++ b/docs/source/tendering/http/complaints/complaint-resolved.http @@ -1,4 +1,4 @@ -PATCH /api/2.5/tenders/1a7dc160a6954967bfb3fcd1dd4545d3/complaints/9698c2aae121470eb87342fb51872653?acc_token=f3fcbf245b584352b8ee0c06c6298ad4 HTTP/1.0 +PATCH /api/2.5/tenders/1a7dc160a6954967bfb3fcd1dd4545d3/complaints/b84e3d4216374e81a4b85a973be2fff5?acc_token=f3fcbf245b584352b8ee0c06c6298ad4 HTTP/1.0 Authorization: Bearer broker Content-Length: 145 Content-Type: application/json @@ -46,7 +46,7 @@ Content-Type: application/json; charset=UTF-8 "currency": "UAH", "amount": 2000.0 }, - "id": "9698c2aae121470eb87342fb51872653", + "id": "b84e3d4216374e81a4b85a973be2fff5", "tendererAction": "Умови виправлено", "dateSubmitted": "2020-05-15T01:00:00+03:00", "complaintID": "UA-2020-05-15-000001.5", diff --git a/docs/source/tendering/http/complaints/complaint-satisfy.http b/docs/source/tendering/http/complaints/complaint-satisfy.http index ef8d05fb9c..4200976f14 100644 --- a/docs/source/tendering/http/complaints/complaint-satisfy.http +++ b/docs/source/tendering/http/complaints/complaint-satisfy.http @@ -1,4 +1,4 @@ -PATCH /api/2.5/tenders/1a7dc160a6954967bfb3fcd1dd4545d3/complaints/f69c1412dc8b4f318d464ff518799e37?acc_token=4c65710b45dc4f67af804bfc7ac805ff HTTP/1.0 +PATCH /api/2.5/tenders/1a7dc160a6954967bfb3fcd1dd4545d3/complaints/39e21275514647ba80d2ac1c9814d826?acc_token=4c65710b45dc4f67af804bfc7ac805ff HTTP/1.0 Authorization: Bearer broker Content-Length: 51 Content-Type: application/json @@ -26,7 +26,7 @@ Content-Type: application/json; charset=UTF-8 "complaintID": "UA-2020-05-15-000001.2", "date": "2020-05-15T01:00:00+03:00", "resolution": "Виправлено неконкурентні умови", - "id": "f69c1412dc8b4f318d464ff518799e37" + "id": "39e21275514647ba80d2ac1c9814d826" } } diff --git a/docs/source/tendering/http/complaints/complaint-submission-claim.http b/docs/source/tendering/http/complaints/complaint-submission-claim.http index d1bd6f247d..675bed45ce 100644 --- a/docs/source/tendering/http/complaints/complaint-submission-claim.http +++ b/docs/source/tendering/http/complaints/complaint-submission-claim.http @@ -35,7 +35,7 @@ DATA: Response: 201 Created Content-Type: application/json; charset=UTF-8 -Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/1a7dc160a6954967bfb3fcd1dd4545d3/complaints/f69c1412dc8b4f318d464ff518799e37 +Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/1a7dc160a6954967bfb3fcd1dd4545d3/complaints/39e21275514647ba80d2ac1c9814d826 { "access": { "transfer": "332302af03044c0793b70909d826be08", @@ -69,7 +69,7 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/1a7dc160a6954967 "complaintID": "UA-2020-05-15-000001.2", "date": "2020-05-15T01:00:00+03:00", "type": "claim", - "id": "f69c1412dc8b4f318d464ff518799e37" + "id": "39e21275514647ba80d2ac1c9814d826" } } diff --git a/docs/source/tendering/http/complaints/complaint-submission-upload.http b/docs/source/tendering/http/complaints/complaint-submission-upload.http index d30e11123d..d9757b8aa9 100644 --- a/docs/source/tendering/http/complaints/complaint-submission-upload.http +++ b/docs/source/tendering/http/complaints/complaint-submission-upload.http @@ -1,4 +1,4 @@ -POST /api/2.5/tenders/1a7dc160a6954967bfb3fcd1dd4545d3/complaints/2777125e15cc49f890ea89cd88dceffb/documents?acc_token=25826c9e2eca4f4d991cb81bb4436f44 HTTP/1.0 +POST /api/2.5/tenders/1a7dc160a6954967bfb3fcd1dd4545d3/complaints/fd73a9631f4340858339163b6ef19dd1/documents?acc_token=25826c9e2eca4f4d991cb81bb4436f44 HTTP/1.0 Authorization: Bearer broker Content-Length: 156 Content-Type: multipart/form-data; boundary=---BOUNDARY @@ -14,7 +14,7 @@ content Response: 201 Created Content-Type: application/json; charset=UTF-8 -Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/1a7dc160a6954967bfb3fcd1dd4545d3/complaints/2777125e15cc49f890ea89cd88dceffb/documents/25b08fd7f5ca41a3a74812a5019d993e +Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/1a7dc160a6954967bfb3fcd1dd4545d3/complaints/fd73a9631f4340858339163b6ef19dd1/documents/25b08fd7f5ca41a3a74812a5019d993e { "data": { "hash": "md5:00000000000000000000000000000000", diff --git a/docs/source/tendering/http/complaints/complaint-submission.http b/docs/source/tendering/http/complaints/complaint-submission.http index fbb2ee5a76..0146eb6138 100644 --- a/docs/source/tendering/http/complaints/complaint-submission.http +++ b/docs/source/tendering/http/complaints/complaint-submission.http @@ -36,7 +36,7 @@ DATA: Response: 201 Created Content-Type: application/json; charset=UTF-8 -Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/1a7dc160a6954967bfb3fcd1dd4545d3/complaints/9698c2aae121470eb87342fb51872653 +Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/1a7dc160a6954967bfb3fcd1dd4545d3/complaints/b84e3d4216374e81a4b85a973be2fff5 { "access": { "transfer": "3969a00a20be4556a0e70816fee190ae", @@ -74,7 +74,7 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/1a7dc160a6954967 "complaintID": "UA-2020-05-15-000001.5", "date": "2020-05-15T01:00:00+03:00", "type": "complaint", - "id": "9698c2aae121470eb87342fb51872653" + "id": "b84e3d4216374e81a4b85a973be2fff5" } } diff --git a/docs/source/tendering/http/complaints/complaint.http b/docs/source/tendering/http/complaints/complaint.http index f4d22e71e4..db15f1ef0b 100644 --- a/docs/source/tendering/http/complaints/complaint.http +++ b/docs/source/tendering/http/complaints/complaint.http @@ -1,4 +1,4 @@ -GET /api/2.5/tenders/1a7dc160a6954967bfb3fcd1dd4545d3/complaints/9698c2aae121470eb87342fb51872653 HTTP/1.0 +GET /api/2.5/tenders/1a7dc160a6954967bfb3fcd1dd4545d3/complaints/b84e3d4216374e81a4b85a973be2fff5 HTTP/1.0 Host: lb-api-sandbox.prozorro.gov.ua Response: 200 OK @@ -36,7 +36,7 @@ Content-Type: application/json; charset=UTF-8 "currency": "UAH", "amount": 2000.0 }, - "id": "9698c2aae121470eb87342fb51872653", + "id": "b84e3d4216374e81a4b85a973be2fff5", "tendererAction": "Умови виправлено", "dateSubmitted": "2020-05-15T01:00:00+03:00", "complaintID": "UA-2020-05-15-000001.5", diff --git a/docs/source/tendering/http/complaints/complaints-list.http b/docs/source/tendering/http/complaints/complaints-list.http index 57db3bd1a9..1df8653539 100644 --- a/docs/source/tendering/http/complaints/complaints-list.http +++ b/docs/source/tendering/http/complaints/complaints-list.http @@ -27,7 +27,7 @@ Content-Type: application/json; charset=UTF-8 "complaintID": "UA-2020-05-15-000001.1", "date": "2020-05-15T01:00:00+03:00", "type": "claim", - "id": "2777125e15cc49f890ea89cd88dceffb" + "id": "fd73a9631f4340858339163b6ef19dd1" }, { "status": "resolved", @@ -41,7 +41,7 @@ Content-Type: application/json; charset=UTF-8 "complaintID": "UA-2020-05-15-000001.2", "date": "2020-05-15T01:00:00+03:00", "resolution": "Виправлено неконкурентні умови", - "id": "f69c1412dc8b4f318d464ff518799e37" + "id": "39e21275514647ba80d2ac1c9814d826" }, { "status": "declined", @@ -80,7 +80,7 @@ Content-Type: application/json; charset=UTF-8 "complaintID": "UA-2020-05-15-000001.3", "date": "2020-05-15T01:00:00+03:00", "type": "complaint", - "id": "4bfb8ef256dd4c198abaccf0e9db7d58", + "id": "437e05002e5e45a0bb463f5ad3220d2b", "reviewPlace": "Place of review" }, { @@ -94,7 +94,7 @@ Content-Type: application/json; charset=UTF-8 "complaintID": "UA-2020-05-15-000001.4", "date": "2020-05-15T01:00:00+03:00", "resolution": "Вимога не відповідає предмету закупівлі", - "id": "b002454f45a448c19e5d2640996f289a" + "id": "8b3298544ec94c929481909e0c7adc08" }, { "status": "resolved", @@ -128,7 +128,7 @@ Content-Type: application/json; charset=UTF-8 "currency": "UAH", "amount": 2000.0 }, - "id": "9698c2aae121470eb87342fb51872653", + "id": "b84e3d4216374e81a4b85a973be2fff5", "tendererAction": "Умови виправлено", "dateSubmitted": "2020-05-15T01:00:00+03:00", "complaintID": "UA-2020-05-15-000001.5", @@ -164,7 +164,7 @@ Content-Type: application/json; charset=UTF-8 "currency": "UAH", "amount": 2000.0 }, - "id": "b51604ff3434469a98320c9b034b4c0a", + "id": "8ab5a1c471fc483581f80792dab75484", "rejectReason": "tenderCancelled", "dateAccepted": "2020-05-15T01:00:00+03:00", "author": { @@ -231,7 +231,7 @@ Content-Type: application/json; charset=UTF-8 "date": "2020-05-15T01:00:00+03:00", "title": "Недостатньо інформації", "type": "complaint", - "id": "bb9432ace0c047c6b4c925ec4ace0099", + "id": "cfbf11a6c9c241988f120ecbb8c4867b", "reviewPlace": "Place of review" }, { @@ -270,7 +270,7 @@ Content-Type: application/json; charset=UTF-8 "date": "2020-05-15T01:00:00+03:00", "title": "Недостатньо інформації", "type": "complaint", - "id": "ede6804b22c5468a9819c2e0f4496ded" + "id": "d3a973174cb548a9a4993fdbf5d9674e" }, { "status": "mistaken", @@ -305,7 +305,7 @@ Content-Type: application/json; charset=UTF-8 "complaintID": "UA-2020-05-15-000001.9", "date": "2020-05-15T01:00:00+03:00", "type": "complaint", - "id": "38d6d6628b5347e5af7a12c4c93fe47c" + "id": "7d9aed18ef4847f2b353c7edb0c95143" }, { "status": "pending", @@ -339,7 +339,7 @@ Content-Type: application/json; charset=UTF-8 "author": "aboveThresholdReviewers", "datePublished": "2020-05-15T01:00:00+03:00", "recipient": "complaint_owner", - "id": "49152b64d32449558213fe0e413d8476" + "id": "a7fcad7850ac470fb74d5ea7964a7e32" }, { "documents": [ @@ -351,7 +351,7 @@ Content-Type: application/json; charset=UTF-8 "format": "application/pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", - "id": "8be84c5e6df142b1bebc4dc846295cbf", + "id": "e50966563324428fbe3375b2dc49a153", "dateModified": "2020-05-15T01:00:00+03:00" } ], @@ -359,9 +359,9 @@ Content-Type: application/json; charset=UTF-8 "title": "Уточнення по вимозі", "author": "complaint_owner", "datePublished": "2020-05-15T01:00:00+03:00", - "relatedPost": "49152b64d32449558213fe0e413d8476", + "relatedPost": "a7fcad7850ac470fb74d5ea7964a7e32", "recipient": "aboveThresholdReviewers", - "id": "2fce10c54207405fac5bdfda41aa37f9" + "id": "ec5d79b7aa544d36824079c03e462d3c" }, { "description": "Відсутній документ", @@ -369,7 +369,7 @@ Content-Type: application/json; charset=UTF-8 "author": "aboveThresholdReviewers", "datePublished": "2020-05-15T01:00:00+03:00", "recipient": "tender_owner", - "id": "6ef16edfcfb54e459ba37ceae65ddf58" + "id": "a4b61c81a8cc44d6965de32baa8139e1" }, { "documents": [ @@ -381,7 +381,7 @@ Content-Type: application/json; charset=UTF-8 "format": "application/pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", - "id": "8797a89acda2403ba388caedc67686c3", + "id": "fde3d09dd48b4ef994e747cc546ae78a", "dateModified": "2020-05-15T01:00:00+03:00" } ], @@ -389,9 +389,9 @@ Content-Type: application/json; charset=UTF-8 "title": "Уточнення по вимозі", "author": "tender_owner", "datePublished": "2020-05-15T01:00:00+03:00", - "relatedPost": "6ef16edfcfb54e459ba37ceae65ddf58", + "relatedPost": "a4b61c81a8cc44d6965de32baa8139e1", "recipient": "aboveThresholdReviewers", - "id": "c1c86e299d6a40baa9c0b37f09157800" + "id": "a9acd9a9b014433fa6a1eefc37f23b3b" } ], "value": { @@ -402,7 +402,7 @@ Content-Type: application/json; charset=UTF-8 "complaintID": "UA-2020-05-15-000001.10", "date": "2020-05-15T01:00:00+03:00", "type": "complaint", - "id": "9f3a6c7d446b4503872063f6021b89f2" + "id": "949127b6d2834a5ba8156ffef63a9a3c" } ] } diff --git a/docs/source/tendering/http/complaints/qualification-complaint-accept.http b/docs/source/tendering/http/complaints/qualification-complaint-accept.http index 83f4b0e6d7..9b6b5cc5ab 100644 --- a/docs/source/tendering/http/complaints/qualification-complaint-accept.http +++ b/docs/source/tendering/http/complaints/qualification-complaint-accept.http @@ -1,4 +1,4 @@ -PATCH /api/2.5/tenders/0ba5045de21b4930a220df9887be28ec/qualifications/de1fdfe83be64f45a3aa274d8f98a1e9/complaints/82367eb51f0e4686a9f9aa7745b42041 HTTP/1.0 +PATCH /api/2.5/tenders/0ba5045de21b4930a220df9887be28ec/qualifications/de1fdfe83be64f45a3aa274d8f98a1e9/complaints/92d563efe7594cd480975bd51bcf44a5 HTTP/1.0 Authorization: Bearer reviewer Content-Length: 109 Content-Type: application/json @@ -65,7 +65,7 @@ Content-Type: application/json; charset=UTF-8 "date": "2020-05-15T01:00:01+03:00", "title": "Недостатньо інформації", "type": "complaint", - "id": "82367eb51f0e4686a9f9aa7745b42041", + "id": "92d563efe7594cd480975bd51bcf44a5", "reviewPlace": "Place of review" } } diff --git a/docs/source/tendering/http/complaints/qualification-complaint-accepted-stopped.http b/docs/source/tendering/http/complaints/qualification-complaint-accepted-stopped.http index ba54b0f0ee..92b47be1a1 100644 --- a/docs/source/tendering/http/complaints/qualification-complaint-accepted-stopped.http +++ b/docs/source/tendering/http/complaints/qualification-complaint-accepted-stopped.http @@ -1,4 +1,4 @@ -PATCH /api/2.5/tenders/0ba5045de21b4930a220df9887be28ec/qualifications/de1fdfe83be64f45a3aa274d8f98a1e9/complaints/9ccb55897689468f978601fe46f2749e HTTP/1.0 +PATCH /api/2.5/tenders/0ba5045de21b4930a220df9887be28ec/qualifications/de1fdfe83be64f45a3aa274d8f98a1e9/complaints/c4eb9209aa72416c8c029a80816be774 HTTP/1.0 Authorization: Bearer reviewer Content-Length: 252 Content-Type: application/json @@ -27,7 +27,7 @@ Content-Type: application/json; charset=UTF-8 "currency": "UAH", "amount": 3000.0 }, - "id": "9ccb55897689468f978601fe46f2749e", + "id": "c4eb9209aa72416c8c029a80816be774", "rejectReason": "tenderCancelled", "dateAccepted": "2020-05-15T01:00:01+03:00", "author": { diff --git a/docs/source/tendering/http/complaints/qualification-complaint-accepted-stopping-2020-04-19.http b/docs/source/tendering/http/complaints/qualification-complaint-accepted-stopping-2020-04-19.http index bc7b5523e3..07675603ad 100644 --- a/docs/source/tendering/http/complaints/qualification-complaint-accepted-stopping-2020-04-19.http +++ b/docs/source/tendering/http/complaints/qualification-complaint-accepted-stopping-2020-04-19.http @@ -1,4 +1,4 @@ -PATCH /api/2.5/tenders/0ba5045de21b4930a220df9887be28ec/qualifications/de1fdfe83be64f45a3aa274d8f98a1e9/complaints/761c2b6925284c17b43a1513c92ab39a?acc_token=c4e7ed69b4954e888a15683ee5d78db6 HTTP/1.0 +PATCH /api/2.5/tenders/0ba5045de21b4930a220df9887be28ec/qualifications/de1fdfe83be64f45a3aa274d8f98a1e9/complaints/f4f7e7f498444d84a193ec705975bf7d?acc_token=c4e7ed69b4954e888a15683ee5d78db6 HTTP/1.0 Authorization: Bearer broker Content-Length: 228 Content-Type: application/json diff --git a/docs/source/tendering/http/complaints/qualification-complaint-answer.http b/docs/source/tendering/http/complaints/qualification-complaint-answer.http index 5324e5d8c0..aa6375f761 100644 --- a/docs/source/tendering/http/complaints/qualification-complaint-answer.http +++ b/docs/source/tendering/http/complaints/qualification-complaint-answer.http @@ -1,4 +1,4 @@ -PATCH /api/2.5/tenders/0ba5045de21b4930a220df9887be28ec/qualifications/de1fdfe83be64f45a3aa274d8f98a1e9/complaints/e8010385c6704fe49613ae6cfd5f3bc3?acc_token=22b631b8c3684fad8b7c465850ef22c0 HTTP/1.0 +PATCH /api/2.5/tenders/0ba5045de21b4930a220df9887be28ec/qualifications/de1fdfe83be64f45a3aa274d8f98a1e9/complaints/f4f8a8dc1ed5421a8eed8e11a93cd2aa?acc_token=22b631b8c3684fad8b7c465850ef22c0 HTTP/1.0 Authorization: Bearer broker Content-Length: 387 Content-Type: application/json @@ -21,13 +21,13 @@ Content-Type: application/json; charset=UTF-8 "title": "Недостатньо інформації", "resolutionType": "resolved", "type": "claim", - "bid_id": "91a7fd50cba44d128291a2298a582b95", + "bid_id": "4e3560c629254c51802d8dc72d557ad6", "dateAnswered": "2020-05-15T01:00:01+03:00", "dateSubmitted": "2020-05-15T01:00:01+03:00", "complaintID": "UA-2020-05-15-000001.6", "date": "2020-05-15T01:00:01+03:00", "resolution": "Умови виправлено, вибір переможня буде розгянуто повторно", - "id": "e8010385c6704fe49613ae6cfd5f3bc3" + "id": "f4f8a8dc1ed5421a8eed8e11a93cd2aa" } } diff --git a/docs/source/tendering/http/complaints/qualification-complaint-claim.http b/docs/source/tendering/http/complaints/qualification-complaint-claim.http index a99b991877..493516c740 100644 --- a/docs/source/tendering/http/complaints/qualification-complaint-claim.http +++ b/docs/source/tendering/http/complaints/qualification-complaint-claim.http @@ -1,4 +1,4 @@ -PATCH /api/2.5/tenders/0ba5045de21b4930a220df9887be28ec/qualifications/de1fdfe83be64f45a3aa274d8f98a1e9/complaints/347ccd6da34a4d5484e052a6bc7d7d49?acc_token=bcf016c9aba4496d81a5bf2ce1581ed3 HTTP/1.0 +PATCH /api/2.5/tenders/0ba5045de21b4930a220df9887be28ec/qualifications/de1fdfe83be64f45a3aa274d8f98a1e9/complaints/f9709d9435fd45329c82a62193890485?acc_token=bcf016c9aba4496d81a5bf2ce1581ed3 HTTP/1.0 Authorization: Bearer broker Content-Length: 29 Content-Type: application/json @@ -17,12 +17,12 @@ Content-Type: application/json; charset=UTF-8 "status": "claim", "description": "Умови виставлені замовником не містять достатньо інформації, щоб заявка мала сенс.", "title": "Недостатньо інформації", - "bid_id": "91a7fd50cba44d128291a2298a582b95", + "bid_id": "4e3560c629254c51802d8dc72d557ad6", "dateSubmitted": "2020-05-15T01:00:01+03:00", "complaintID": "UA-2020-05-15-000001.9", "date": "2020-05-15T01:00:01+03:00", "type": "claim", - "id": "347ccd6da34a4d5484e052a6bc7d7d49" + "id": "f9709d9435fd45329c82a62193890485" } } diff --git a/docs/source/tendering/http/complaints/qualification-complaint-complaint.http b/docs/source/tendering/http/complaints/qualification-complaint-complaint.http index d5e377c6fb..0297ac6565 100644 --- a/docs/source/tendering/http/complaints/qualification-complaint-complaint.http +++ b/docs/source/tendering/http/complaints/qualification-complaint-complaint.http @@ -1,4 +1,4 @@ -PATCH /api/2.5/tenders/0ba5045de21b4930a220df9887be28ec/qualifications/de1fdfe83be64f45a3aa274d8f98a1e9/complaints/82367eb51f0e4686a9f9aa7745b42041 HTTP/1.0 +PATCH /api/2.5/tenders/0ba5045de21b4930a220df9887be28ec/qualifications/de1fdfe83be64f45a3aa274d8f98a1e9/complaints/92d563efe7594cd480975bd51bcf44a5 HTTP/1.0 Authorization: Bearer bot Content-Length: 31 Content-Type: application/json @@ -60,7 +60,7 @@ Content-Type: application/json; charset=UTF-8 "complaintID": "UA-2020-05-15-000001.1", "date": "2020-05-15T01:00:01+03:00", "type": "complaint", - "id": "82367eb51f0e4686a9f9aa7745b42041" + "id": "92d563efe7594cd480975bd51bcf44a5" } } diff --git a/docs/source/tendering/http/complaints/qualification-complaint-decline.http b/docs/source/tendering/http/complaints/qualification-complaint-decline.http index 90b4586a43..5de6dedd0e 100644 --- a/docs/source/tendering/http/complaints/qualification-complaint-decline.http +++ b/docs/source/tendering/http/complaints/qualification-complaint-decline.http @@ -1,4 +1,4 @@ -PATCH /api/2.5/tenders/0ba5045de21b4930a220df9887be28ec/qualifications/de1fdfe83be64f45a3aa274d8f98a1e9/complaints/13fd8219089d4f38ad99ab8c6a9e5fa4 HTTP/1.0 +PATCH /api/2.5/tenders/0ba5045de21b4930a220df9887be28ec/qualifications/de1fdfe83be64f45a3aa274d8f98a1e9/complaints/e8f806800f1845c99f664494c6d8c4c8 HTTP/1.0 Authorization: Bearer reviewer Content-Length: 32 Content-Type: application/json @@ -50,7 +50,7 @@ Content-Type: application/json; charset=UTF-8 "complaintID": "UA-2020-05-15-000001.3", "date": "2020-05-15T01:00:01+03:00", "type": "complaint", - "id": "13fd8219089d4f38ad99ab8c6a9e5fa4", + "id": "e8f806800f1845c99f664494c6d8c4c8", "reviewPlace": "Place of review" } } diff --git a/docs/source/tendering/http/complaints/qualification-complaint-mistaken-2020-04-19.http b/docs/source/tendering/http/complaints/qualification-complaint-mistaken-2020-04-19.http index 129a12b32f..7335f40aef 100644 --- a/docs/source/tendering/http/complaints/qualification-complaint-mistaken-2020-04-19.http +++ b/docs/source/tendering/http/complaints/qualification-complaint-mistaken-2020-04-19.http @@ -1,4 +1,4 @@ -PATCH /api/2.5/tenders/0ba5045de21b4930a220df9887be28ec/qualifications/de1fdfe83be64f45a3aa274d8f98a1e9/complaints/8f1089341deb433986358a39b24aac50?acc_token=74a695cd964d497e9ce9cea1b54e3ce4 HTTP/1.0 +PATCH /api/2.5/tenders/0ba5045de21b4930a220df9887be28ec/qualifications/de1fdfe83be64f45a3aa274d8f98a1e9/complaints/09aec589ca79414db92b38c44d8d2e3f?acc_token=74a695cd964d497e9ce9cea1b54e3ce4 HTTP/1.0 Authorization: Bearer broker Content-Length: 32 Content-Type: application/json @@ -46,7 +46,7 @@ Content-Type: application/json; charset=UTF-8 "complaintID": "UA-2020-05-15-000001.10", "date": "2020-05-15T01:00:01+03:00", "type": "complaint", - "id": "8f1089341deb433986358a39b24aac50" + "id": "09aec589ca79414db92b38c44d8d2e3f" } } diff --git a/docs/source/tendering/http/complaints/qualification-complaint-post-complaint-owner.http b/docs/source/tendering/http/complaints/qualification-complaint-post-complaint-owner.http index 59a2a6a868..033a757c7d 100644 --- a/docs/source/tendering/http/complaints/qualification-complaint-post-complaint-owner.http +++ b/docs/source/tendering/http/complaints/qualification-complaint-post-complaint-owner.http @@ -1,4 +1,4 @@ -POST /api/2.5/tenders/0ba5045de21b4930a220df9887be28ec/qualifications/de1fdfe83be64f45a3aa274d8f98a1e9/complaints/db37925f5b4a4cb5b092f72f3045c53b/posts?acc_token=66944e0dd8cc4dd5bd1c7b1b637408e6 HTTP/1.0 +POST /api/2.5/tenders/0ba5045de21b4930a220df9887be28ec/qualifications/de1fdfe83be64f45a3aa274d8f98a1e9/complaints/70b8bcbbcc3c4484b773051e4a196590/posts?acc_token=66944e0dd8cc4dd5bd1c7b1b637408e6 HTTP/1.0 Authorization: Bearer broker Content-Length: 666 Content-Type: application/json @@ -15,7 +15,7 @@ DATA: "format": "application/pdf" } ], - "relatedPost": "a37083f068904776a929f51608bb9fa4", + "relatedPost": "b93e1872927e4987baa557b6d13913b5", "description": "Додано документ", "title": "Уточнення по вимозі" } @@ -23,7 +23,7 @@ DATA: Response: 201 Created Content-Type: application/json; charset=UTF-8 -Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/0ba5045de21b4930a220df9887be28ec/qualifications/de1fdfe83be64f45a3aa274d8f98a1e9/complaints/db37925f5b4a4cb5b092f72f3045c53b/posts/4c76865b35d94e098ba89e58690d60d3 +Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/0ba5045de21b4930a220df9887be28ec/qualifications/de1fdfe83be64f45a3aa274d8f98a1e9/complaints/70b8bcbbcc3c4484b773051e4a196590/posts/30dc3477f8954cfcb1514e0b58ae481a { "data": { "documents": [ @@ -35,7 +35,7 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/0ba5045de21b4930 "format": "application/pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:01+03:00", - "id": "abdc01ce4c754cc0b76d9a781a0019ca", + "id": "124e2ee15d174594aec8c62260dbb803", "dateModified": "2020-05-15T01:00:01+03:00" } ], @@ -43,9 +43,9 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/0ba5045de21b4930 "title": "Уточнення по вимозі", "author": "complaint_owner", "datePublished": "2020-05-15T01:00:01+03:00", - "relatedPost": "a37083f068904776a929f51608bb9fa4", + "relatedPost": "b93e1872927e4987baa557b6d13913b5", "recipient": "aboveThresholdReviewers", - "id": "4c76865b35d94e098ba89e58690d60d3" + "id": "30dc3477f8954cfcb1514e0b58ae481a" } } diff --git a/docs/source/tendering/http/complaints/qualification-complaint-post-reviewer-complaint-owner.http b/docs/source/tendering/http/complaints/qualification-complaint-post-reviewer-complaint-owner.http index 71b1194edb..529cae894c 100644 --- a/docs/source/tendering/http/complaints/qualification-complaint-post-reviewer-complaint-owner.http +++ b/docs/source/tendering/http/complaints/qualification-complaint-post-reviewer-complaint-owner.http @@ -1,4 +1,4 @@ -POST /api/2.5/tenders/0ba5045de21b4930a220df9887be28ec/qualifications/de1fdfe83be64f45a3aa274d8f98a1e9/complaints/db37925f5b4a4cb5b092f72f3045c53b/posts HTTP/1.0 +POST /api/2.5/tenders/0ba5045de21b4930a220df9887be28ec/qualifications/de1fdfe83be64f45a3aa274d8f98a1e9/complaints/70b8bcbbcc3c4484b773051e4a196590/posts HTTP/1.0 Authorization: Bearer reviewer Content-Length: 281 Content-Type: application/json @@ -14,7 +14,7 @@ DATA: Response: 201 Created Content-Type: application/json; charset=UTF-8 -Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/0ba5045de21b4930a220df9887be28ec/qualifications/de1fdfe83be64f45a3aa274d8f98a1e9/complaints/db37925f5b4a4cb5b092f72f3045c53b/posts/a37083f068904776a929f51608bb9fa4 +Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/0ba5045de21b4930a220df9887be28ec/qualifications/de1fdfe83be64f45a3aa274d8f98a1e9/complaints/70b8bcbbcc3c4484b773051e4a196590/posts/b93e1872927e4987baa557b6d13913b5 { "data": { "description": "Відсутній документ", @@ -22,7 +22,7 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/0ba5045de21b4930 "author": "aboveThresholdReviewers", "datePublished": "2020-05-15T01:00:01+03:00", "recipient": "complaint_owner", - "id": "a37083f068904776a929f51608bb9fa4" + "id": "b93e1872927e4987baa557b6d13913b5" } } diff --git a/docs/source/tendering/http/complaints/qualification-complaint-post-reviewer-tender-owner.http b/docs/source/tendering/http/complaints/qualification-complaint-post-reviewer-tender-owner.http index 8d768a1b96..03b24a6727 100644 --- a/docs/source/tendering/http/complaints/qualification-complaint-post-reviewer-tender-owner.http +++ b/docs/source/tendering/http/complaints/qualification-complaint-post-reviewer-tender-owner.http @@ -1,4 +1,4 @@ -POST /api/2.5/tenders/0ba5045de21b4930a220df9887be28ec/qualifications/de1fdfe83be64f45a3aa274d8f98a1e9/complaints/db37925f5b4a4cb5b092f72f3045c53b/posts HTTP/1.0 +POST /api/2.5/tenders/0ba5045de21b4930a220df9887be28ec/qualifications/de1fdfe83be64f45a3aa274d8f98a1e9/complaints/70b8bcbbcc3c4484b773051e4a196590/posts HTTP/1.0 Authorization: Bearer reviewer Content-Length: 278 Content-Type: application/json @@ -14,7 +14,7 @@ DATA: Response: 201 Created Content-Type: application/json; charset=UTF-8 -Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/0ba5045de21b4930a220df9887be28ec/qualifications/de1fdfe83be64f45a3aa274d8f98a1e9/complaints/db37925f5b4a4cb5b092f72f3045c53b/posts/a3b0139ca88a4ee5b896f564e4c37e9a +Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/0ba5045de21b4930a220df9887be28ec/qualifications/de1fdfe83be64f45a3aa274d8f98a1e9/complaints/70b8bcbbcc3c4484b773051e4a196590/posts/5e32117cd7fe4f72ad1e5f335b28393f { "data": { "description": "Відсутній документ", @@ -22,7 +22,7 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/0ba5045de21b4930 "author": "aboveThresholdReviewers", "datePublished": "2020-05-15T01:00:01+03:00", "recipient": "tender_owner", - "id": "a3b0139ca88a4ee5b896f564e4c37e9a" + "id": "5e32117cd7fe4f72ad1e5f335b28393f" } } diff --git a/docs/source/tendering/http/complaints/qualification-complaint-post-tender-owner.http b/docs/source/tendering/http/complaints/qualification-complaint-post-tender-owner.http index 762cb0c4ff..38f996f277 100644 --- a/docs/source/tendering/http/complaints/qualification-complaint-post-tender-owner.http +++ b/docs/source/tendering/http/complaints/qualification-complaint-post-tender-owner.http @@ -1,4 +1,4 @@ -POST /api/2.5/tenders/0ba5045de21b4930a220df9887be28ec/qualifications/de1fdfe83be64f45a3aa274d8f98a1e9/complaints/db37925f5b4a4cb5b092f72f3045c53b/posts?acc_token=22b631b8c3684fad8b7c465850ef22c0 HTTP/1.0 +POST /api/2.5/tenders/0ba5045de21b4930a220df9887be28ec/qualifications/de1fdfe83be64f45a3aa274d8f98a1e9/complaints/70b8bcbbcc3c4484b773051e4a196590/posts?acc_token=22b631b8c3684fad8b7c465850ef22c0 HTTP/1.0 Authorization: Bearer broker Content-Length: 669 Content-Type: application/json @@ -15,7 +15,7 @@ DATA: "format": "application/pdf" } ], - "relatedPost": "a3b0139ca88a4ee5b896f564e4c37e9a", + "relatedPost": "5e32117cd7fe4f72ad1e5f335b28393f", "description": "Додано документ", "title": "Уточнення по вимозі" } @@ -23,7 +23,7 @@ DATA: Response: 201 Created Content-Type: application/json; charset=UTF-8 -Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/0ba5045de21b4930a220df9887be28ec/qualifications/de1fdfe83be64f45a3aa274d8f98a1e9/complaints/db37925f5b4a4cb5b092f72f3045c53b/posts/29a12be25ae341e097ba0d865a87566a +Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/0ba5045de21b4930a220df9887be28ec/qualifications/de1fdfe83be64f45a3aa274d8f98a1e9/complaints/70b8bcbbcc3c4484b773051e4a196590/posts/cd2575e194de406a9ae663e2e750fa22 { "data": { "documents": [ @@ -35,7 +35,7 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/0ba5045de21b4930 "format": "application/pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:01+03:00", - "id": "a87923eb0155455d9fd22d1e3d7691e6", + "id": "98631763c0e2437792df6b134419de05", "dateModified": "2020-05-15T01:00:01+03:00" } ], @@ -43,9 +43,9 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/0ba5045de21b4930 "title": "Уточнення по вимозі", "author": "tender_owner", "datePublished": "2020-05-15T01:00:01+03:00", - "relatedPost": "a3b0139ca88a4ee5b896f564e4c37e9a", + "relatedPost": "5e32117cd7fe4f72ad1e5f335b28393f", "recipient": "aboveThresholdReviewers", - "id": "29a12be25ae341e097ba0d865a87566a" + "id": "cd2575e194de406a9ae663e2e750fa22" } } diff --git a/docs/source/tendering/http/complaints/qualification-complaint-reject.http b/docs/source/tendering/http/complaints/qualification-complaint-reject.http index c26c9d7176..2cf22a684b 100644 --- a/docs/source/tendering/http/complaints/qualification-complaint-reject.http +++ b/docs/source/tendering/http/complaints/qualification-complaint-reject.http @@ -1,4 +1,4 @@ -PATCH /api/2.5/tenders/0ba5045de21b4930a220df9887be28ec/qualifications/de1fdfe83be64f45a3aa274d8f98a1e9/complaints/b5287ae709e243eeabc145b946fab991 HTTP/1.0 +PATCH /api/2.5/tenders/0ba5045de21b4930a220df9887be28ec/qualifications/de1fdfe83be64f45a3aa274d8f98a1e9/complaints/0470e0b89a594f4d9a6c62eac67d9737 HTTP/1.0 Authorization: Bearer reviewer Content-Length: 64 Content-Type: application/json @@ -50,7 +50,7 @@ Content-Type: application/json; charset=UTF-8 "date": "2020-05-15T01:00:01+03:00", "title": "Недостатньо інформації", "type": "complaint", - "id": "b5287ae709e243eeabc145b946fab991" + "id": "0470e0b89a594f4d9a6c62eac67d9737" } } diff --git a/docs/source/tendering/http/complaints/qualification-complaint-resolution-upload.http b/docs/source/tendering/http/complaints/qualification-complaint-resolution-upload.http index 4a8bed53c6..3e5d8f8700 100644 --- a/docs/source/tendering/http/complaints/qualification-complaint-resolution-upload.http +++ b/docs/source/tendering/http/complaints/qualification-complaint-resolution-upload.http @@ -1,4 +1,4 @@ -POST /api/2.5/tenders/0ba5045de21b4930a220df9887be28ec/qualifications/de1fdfe83be64f45a3aa274d8f98a1e9/complaints/82367eb51f0e4686a9f9aa7745b42041/documents HTTP/1.0 +POST /api/2.5/tenders/0ba5045de21b4930a220df9887be28ec/qualifications/de1fdfe83be64f45a3aa274d8f98a1e9/complaints/92d563efe7594cd480975bd51bcf44a5/documents HTTP/1.0 Authorization: Bearer reviewer Content-Length: 155 Content-Type: multipart/form-data; boundary=---BOUNDARY @@ -14,7 +14,7 @@ content Response: 201 Created Content-Type: application/json; charset=UTF-8 -Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/0ba5045de21b4930a220df9887be28ec/qualifications/de1fdfe83be64f45a3aa274d8f98a1e9/complaints/82367eb51f0e4686a9f9aa7745b42041/documents/ee89a6151f1749b5b56da91a2c0976a5 +Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/0ba5045de21b4930a220df9887be28ec/qualifications/de1fdfe83be64f45a3aa274d8f98a1e9/complaints/92d563efe7594cd480975bd51bcf44a5/documents/ee89a6151f1749b5b56da91a2c0976a5 { "data": { "hash": "md5:00000000000000000000000000000000", diff --git a/docs/source/tendering/http/complaints/qualification-complaint-resolve.http b/docs/source/tendering/http/complaints/qualification-complaint-resolve.http index dbd904ea4c..e5d0cdde8a 100644 --- a/docs/source/tendering/http/complaints/qualification-complaint-resolve.http +++ b/docs/source/tendering/http/complaints/qualification-complaint-resolve.http @@ -1,4 +1,4 @@ -PATCH /api/2.5/tenders/0ba5045de21b4930a220df9887be28ec/qualifications/de1fdfe83be64f45a3aa274d8f98a1e9/complaints/82367eb51f0e4686a9f9aa7745b42041 HTTP/1.0 +PATCH /api/2.5/tenders/0ba5045de21b4930a220df9887be28ec/qualifications/de1fdfe83be64f45a3aa274d8f98a1e9/complaints/92d563efe7594cd480975bd51bcf44a5 HTTP/1.0 Authorization: Bearer reviewer Content-Length: 33 Content-Type: application/json @@ -76,7 +76,7 @@ Content-Type: application/json; charset=UTF-8 "complaintID": "UA-2020-05-15-000001.1", "date": "2020-05-15T01:00:01+03:00", "type": "complaint", - "id": "82367eb51f0e4686a9f9aa7745b42041", + "id": "92d563efe7594cd480975bd51bcf44a5", "reviewPlace": "Place of review" } } diff --git a/docs/source/tendering/http/complaints/qualification-complaint-resolved.http b/docs/source/tendering/http/complaints/qualification-complaint-resolved.http index 2760eb2844..60aff9d583 100644 --- a/docs/source/tendering/http/complaints/qualification-complaint-resolved.http +++ b/docs/source/tendering/http/complaints/qualification-complaint-resolved.http @@ -1,4 +1,4 @@ -PATCH /api/2.5/tenders/0ba5045de21b4930a220df9887be28ec/qualifications/de1fdfe83be64f45a3aa274d8f98a1e9/complaints/82367eb51f0e4686a9f9aa7745b42041?acc_token=22b631b8c3684fad8b7c465850ef22c0 HTTP/1.0 +PATCH /api/2.5/tenders/0ba5045de21b4930a220df9887be28ec/qualifications/de1fdfe83be64f45a3aa274d8f98a1e9/complaints/92d563efe7594cd480975bd51bcf44a5?acc_token=22b631b8c3684fad8b7c465850ef22c0 HTTP/1.0 Authorization: Bearer broker Content-Length: 145 Content-Type: application/json @@ -46,7 +46,7 @@ Content-Type: application/json; charset=UTF-8 "currency": "UAH", "amount": 3000.0 }, - "id": "82367eb51f0e4686a9f9aa7745b42041", + "id": "92d563efe7594cd480975bd51bcf44a5", "tendererAction": "Умови виправлено", "dateSubmitted": "2020-05-15T01:00:01+03:00", "complaintID": "UA-2020-05-15-000001.1", diff --git a/docs/source/tendering/http/complaints/qualification-complaint-satisfy.http b/docs/source/tendering/http/complaints/qualification-complaint-satisfy.http index 66ac04914a..7d9defc58f 100644 --- a/docs/source/tendering/http/complaints/qualification-complaint-satisfy.http +++ b/docs/source/tendering/http/complaints/qualification-complaint-satisfy.http @@ -1,4 +1,4 @@ -PATCH /api/2.5/tenders/0ba5045de21b4930a220df9887be28ec/qualifications/de1fdfe83be64f45a3aa274d8f98a1e9/complaints/e8010385c6704fe49613ae6cfd5f3bc3?acc_token=eedbb5c7db47426fa187d1d963f0b0fd HTTP/1.0 +PATCH /api/2.5/tenders/0ba5045de21b4930a220df9887be28ec/qualifications/de1fdfe83be64f45a3aa274d8f98a1e9/complaints/f4f8a8dc1ed5421a8eed8e11a93cd2aa?acc_token=eedbb5c7db47426fa187d1d963f0b0fd HTTP/1.0 Authorization: Bearer broker Content-Length: 29 Content-Type: application/json @@ -20,13 +20,13 @@ Content-Type: application/json; charset=UTF-8 "resolutionType": "resolved", "type": "claim", "satisfied": true, - "bid_id": "91a7fd50cba44d128291a2298a582b95", + "bid_id": "4e3560c629254c51802d8dc72d557ad6", "dateAnswered": "2020-05-15T01:00:01+03:00", "dateSubmitted": "2020-05-15T01:00:01+03:00", "complaintID": "UA-2020-05-15-000001.6", "date": "2020-05-15T01:00:01+03:00", "resolution": "Умови виправлено, вибір переможня буде розгянуто повторно", - "id": "e8010385c6704fe49613ae6cfd5f3bc3" + "id": "f4f8a8dc1ed5421a8eed8e11a93cd2aa" } } diff --git a/docs/source/tendering/http/complaints/qualification-complaint-submission-claim.http b/docs/source/tendering/http/complaints/qualification-complaint-submission-claim.http index db1eda8c02..896a584066 100644 --- a/docs/source/tendering/http/complaints/qualification-complaint-submission-claim.http +++ b/docs/source/tendering/http/complaints/qualification-complaint-submission-claim.http @@ -35,7 +35,7 @@ DATA: Response: 201 Created Content-Type: application/json; charset=UTF-8 -Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/0ba5045de21b4930a220df9887be28ec/qualifications/de1fdfe83be64f45a3aa274d8f98a1e9/complaints/e8010385c6704fe49613ae6cfd5f3bc3 +Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/0ba5045de21b4930a220df9887be28ec/qualifications/de1fdfe83be64f45a3aa274d8f98a1e9/complaints/f4f8a8dc1ed5421a8eed8e11a93cd2aa { "access": { "transfer": "4a714bf9b99d40f3aa79892add6225d8", @@ -45,12 +45,12 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/0ba5045de21b4930 "status": "claim", "description": "Умови виставлені замовником не містять достатньо інформації, щоб заявка мала сенс.", "title": "Недостатньо інформації", - "bid_id": "91a7fd50cba44d128291a2298a582b95", + "bid_id": "4e3560c629254c51802d8dc72d557ad6", "dateSubmitted": "2020-05-15T01:00:01+03:00", "complaintID": "UA-2020-05-15-000001.6", "date": "2020-05-15T01:00:01+03:00", "type": "claim", - "id": "e8010385c6704fe49613ae6cfd5f3bc3" + "id": "f4f8a8dc1ed5421a8eed8e11a93cd2aa" } } diff --git a/docs/source/tendering/http/complaints/qualification-complaint-submission-upload.http b/docs/source/tendering/http/complaints/qualification-complaint-submission-upload.http index b3a1bd0897..6f186e34d8 100644 --- a/docs/source/tendering/http/complaints/qualification-complaint-submission-upload.http +++ b/docs/source/tendering/http/complaints/qualification-complaint-submission-upload.http @@ -1,4 +1,4 @@ -POST /api/2.5/tenders/0ba5045de21b4930a220df9887be28ec/qualifications/de1fdfe83be64f45a3aa274d8f98a1e9/complaints/82367eb51f0e4686a9f9aa7745b42041/documents?acc_token=f417333f3a02407188551658e8d9dfc6 HTTP/1.0 +POST /api/2.5/tenders/0ba5045de21b4930a220df9887be28ec/qualifications/de1fdfe83be64f45a3aa274d8f98a1e9/complaints/92d563efe7594cd480975bd51bcf44a5/documents?acc_token=f417333f3a02407188551658e8d9dfc6 HTTP/1.0 Authorization: Bearer broker Content-Length: 156 Content-Type: multipart/form-data; boundary=---BOUNDARY @@ -14,7 +14,7 @@ content Response: 201 Created Content-Type: application/json; charset=UTF-8 -Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/0ba5045de21b4930a220df9887be28ec/qualifications/de1fdfe83be64f45a3aa274d8f98a1e9/complaints/82367eb51f0e4686a9f9aa7745b42041/documents/152434b16d35497095495409ee93f221 +Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/0ba5045de21b4930a220df9887be28ec/qualifications/de1fdfe83be64f45a3aa274d8f98a1e9/complaints/92d563efe7594cd480975bd51bcf44a5/documents/152434b16d35497095495409ee93f221 { "data": { "hash": "md5:00000000000000000000000000000000", diff --git a/docs/source/tendering/http/complaints/qualification-complaint-submission.http b/docs/source/tendering/http/complaints/qualification-complaint-submission.http index 16d624a649..89651e2ce9 100644 --- a/docs/source/tendering/http/complaints/qualification-complaint-submission.http +++ b/docs/source/tendering/http/complaints/qualification-complaint-submission.http @@ -36,7 +36,7 @@ DATA: Response: 201 Created Content-Type: application/json; charset=UTF-8 -Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/0ba5045de21b4930a220df9887be28ec/qualifications/de1fdfe83be64f45a3aa274d8f98a1e9/complaints/82367eb51f0e4686a9f9aa7745b42041 +Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/0ba5045de21b4930a220df9887be28ec/qualifications/de1fdfe83be64f45a3aa274d8f98a1e9/complaints/92d563efe7594cd480975bd51bcf44a5 { "access": { "transfer": "829a4e6247814f0094e9b29552e2fb9c", @@ -74,7 +74,7 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/0ba5045de21b4930 "complaintID": "UA-2020-05-15-000001.1", "date": "2020-05-15T01:00:01+03:00", "type": "complaint", - "id": "82367eb51f0e4686a9f9aa7745b42041" + "id": "92d563efe7594cd480975bd51bcf44a5" } } diff --git a/docs/source/tendering/http/complaints/qualification-complaint-unsatisfy.http b/docs/source/tendering/http/complaints/qualification-complaint-unsatisfy.http index 0b630e5ef2..94473a106e 100644 --- a/docs/source/tendering/http/complaints/qualification-complaint-unsatisfy.http +++ b/docs/source/tendering/http/complaints/qualification-complaint-unsatisfy.http @@ -1,4 +1,4 @@ -PATCH /api/2.5/tenders/0ba5045de21b4930a220df9887be28ec/qualifications/de1fdfe83be64f45a3aa274d8f98a1e9/complaints/e3a7bbe4da164d1d8fd0d310d265117c?acc_token=83df640e134b41f983356094948e8a69 HTTP/1.0 +PATCH /api/2.5/tenders/0ba5045de21b4930a220df9887be28ec/qualifications/de1fdfe83be64f45a3aa274d8f98a1e9/complaints/b9af204ddb9d4238b49073c87ce97e2a?acc_token=83df640e134b41f983356094948e8a69 HTTP/1.0 Authorization: Bearer broker Content-Length: 30 Content-Type: application/json @@ -20,13 +20,13 @@ Content-Type: application/json; charset=UTF-8 "resolutionType": "invalid", "type": "claim", "satisfied": false, - "bid_id": "91a7fd50cba44d128291a2298a582b95", + "bid_id": "4e3560c629254c51802d8dc72d557ad6", "dateAnswered": "2020-05-15T01:00:01+03:00", "dateSubmitted": "2020-05-15T01:00:01+03:00", "complaintID": "UA-2020-05-15-000001.7", "date": "2020-05-15T01:00:01+03:00", "resolution": "Вимога не відповідає предмету закупівлі", - "id": "e3a7bbe4da164d1d8fd0d310d265117c" + "id": "b9af204ddb9d4238b49073c87ce97e2a" } } diff --git a/docs/source/tendering/http/complaints/qualification-complaint.http b/docs/source/tendering/http/complaints/qualification-complaint.http index c576715cf1..83720bffcb 100644 --- a/docs/source/tendering/http/complaints/qualification-complaint.http +++ b/docs/source/tendering/http/complaints/qualification-complaint.http @@ -1,4 +1,4 @@ -GET /api/2.5/tenders/0ba5045de21b4930a220df9887be28ec/qualifications/de1fdfe83be64f45a3aa274d8f98a1e9/complaints/82367eb51f0e4686a9f9aa7745b42041 HTTP/1.0 +GET /api/2.5/tenders/0ba5045de21b4930a220df9887be28ec/qualifications/de1fdfe83be64f45a3aa274d8f98a1e9/complaints/92d563efe7594cd480975bd51bcf44a5 HTTP/1.0 Host: lb-api-sandbox.prozorro.gov.ua Response: 200 OK @@ -36,7 +36,7 @@ Content-Type: application/json; charset=UTF-8 "currency": "UAH", "amount": 3000.0 }, - "id": "82367eb51f0e4686a9f9aa7745b42041", + "id": "92d563efe7594cd480975bd51bcf44a5", "tendererAction": "Умови виправлено", "dateSubmitted": "2020-05-15T01:00:01+03:00", "complaintID": "UA-2020-05-15-000001.1", diff --git a/docs/source/tendering/http/complaints/qualification-complaints-list.http b/docs/source/tendering/http/complaints/qualification-complaints-list.http index 7e0cbe1a3f..5100c124b8 100644 --- a/docs/source/tendering/http/complaints/qualification-complaints-list.http +++ b/docs/source/tendering/http/complaints/qualification-complaints-list.http @@ -37,7 +37,7 @@ Content-Type: application/json; charset=UTF-8 "currency": "UAH", "amount": 3000.0 }, - "id": "82367eb51f0e4686a9f9aa7745b42041", + "id": "92d563efe7594cd480975bd51bcf44a5", "tendererAction": "Умови виправлено", "dateSubmitted": "2020-05-15T01:00:01+03:00", "complaintID": "UA-2020-05-15-000001.1", @@ -109,7 +109,7 @@ Content-Type: application/json; charset=UTF-8 "date": "2020-05-15T01:00:01+03:00", "title": "Недостатньо інформації", "type": "complaint", - "id": "b5287ae709e243eeabc145b946fab991" + "id": "0470e0b89a594f4d9a6c62eac67d9737" }, { "status": "declined", @@ -148,7 +148,7 @@ Content-Type: application/json; charset=UTF-8 "complaintID": "UA-2020-05-15-000001.3", "date": "2020-05-15T01:00:01+03:00", "type": "complaint", - "id": "13fd8219089d4f38ad99ab8c6a9e5fa4", + "id": "e8f806800f1845c99f664494c6d8c4c8", "reviewPlace": "Place of review" }, { @@ -187,7 +187,7 @@ Content-Type: application/json; charset=UTF-8 "date": "2020-05-15T01:00:01+03:00", "title": "Недостатньо інформації", "type": "complaint", - "id": "761c2b6925284c17b43a1513c92ab39a", + "id": "f4f7e7f498444d84a193ec705975bf7d", "reviewPlace": "Place of review" }, { @@ -202,7 +202,7 @@ Content-Type: application/json; charset=UTF-8 "currency": "UAH", "amount": 3000.0 }, - "id": "9ccb55897689468f978601fe46f2749e", + "id": "c4eb9209aa72416c8c029a80816be774", "rejectReason": "tenderCancelled", "dateAccepted": "2020-05-15T01:00:01+03:00", "author": { @@ -240,13 +240,13 @@ Content-Type: application/json; charset=UTF-8 "resolutionType": "resolved", "type": "claim", "satisfied": true, - "bid_id": "91a7fd50cba44d128291a2298a582b95", + "bid_id": "4e3560c629254c51802d8dc72d557ad6", "dateAnswered": "2020-05-15T01:00:01+03:00", "dateSubmitted": "2020-05-15T01:00:01+03:00", "complaintID": "UA-2020-05-15-000001.6", "date": "2020-05-15T01:00:01+03:00", "resolution": "Умови виправлено, вибір переможня буде розгянуто повторно", - "id": "e8010385c6704fe49613ae6cfd5f3bc3" + "id": "f4f8a8dc1ed5421a8eed8e11a93cd2aa" }, { "status": "answered", @@ -255,13 +255,13 @@ Content-Type: application/json; charset=UTF-8 "resolutionType": "invalid", "type": "claim", "satisfied": false, - "bid_id": "91a7fd50cba44d128291a2298a582b95", + "bid_id": "4e3560c629254c51802d8dc72d557ad6", "dateAnswered": "2020-05-15T01:00:01+03:00", "dateSubmitted": "2020-05-15T01:00:01+03:00", "complaintID": "UA-2020-05-15-000001.7", "date": "2020-05-15T01:00:01+03:00", "resolution": "Вимога не відповідає предмету закупівлі", - "id": "e3a7bbe4da164d1d8fd0d310d265117c" + "id": "b9af204ddb9d4238b49073c87ce97e2a" }, { "status": "pending", @@ -295,7 +295,7 @@ Content-Type: application/json; charset=UTF-8 "author": "aboveThresholdReviewers", "datePublished": "2020-05-15T01:00:01+03:00", "recipient": "complaint_owner", - "id": "a37083f068904776a929f51608bb9fa4" + "id": "b93e1872927e4987baa557b6d13913b5" }, { "documents": [ @@ -307,7 +307,7 @@ Content-Type: application/json; charset=UTF-8 "format": "application/pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:01+03:00", - "id": "abdc01ce4c754cc0b76d9a781a0019ca", + "id": "124e2ee15d174594aec8c62260dbb803", "dateModified": "2020-05-15T01:00:01+03:00" } ], @@ -315,9 +315,9 @@ Content-Type: application/json; charset=UTF-8 "title": "Уточнення по вимозі", "author": "complaint_owner", "datePublished": "2020-05-15T01:00:01+03:00", - "relatedPost": "a37083f068904776a929f51608bb9fa4", + "relatedPost": "b93e1872927e4987baa557b6d13913b5", "recipient": "aboveThresholdReviewers", - "id": "4c76865b35d94e098ba89e58690d60d3" + "id": "30dc3477f8954cfcb1514e0b58ae481a" }, { "description": "Відсутній документ", @@ -325,7 +325,7 @@ Content-Type: application/json; charset=UTF-8 "author": "aboveThresholdReviewers", "datePublished": "2020-05-15T01:00:01+03:00", "recipient": "tender_owner", - "id": "a3b0139ca88a4ee5b896f564e4c37e9a" + "id": "5e32117cd7fe4f72ad1e5f335b28393f" }, { "documents": [ @@ -337,7 +337,7 @@ Content-Type: application/json; charset=UTF-8 "format": "application/pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:01+03:00", - "id": "a87923eb0155455d9fd22d1e3d7691e6", + "id": "98631763c0e2437792df6b134419de05", "dateModified": "2020-05-15T01:00:01+03:00" } ], @@ -345,9 +345,9 @@ Content-Type: application/json; charset=UTF-8 "title": "Уточнення по вимозі", "author": "tender_owner", "datePublished": "2020-05-15T01:00:01+03:00", - "relatedPost": "a3b0139ca88a4ee5b896f564e4c37e9a", + "relatedPost": "5e32117cd7fe4f72ad1e5f335b28393f", "recipient": "aboveThresholdReviewers", - "id": "29a12be25ae341e097ba0d865a87566a" + "id": "cd2575e194de406a9ae663e2e750fa22" } ], "value": { @@ -358,18 +358,18 @@ Content-Type: application/json; charset=UTF-8 "complaintID": "UA-2020-05-15-000001.8", "date": "2020-05-15T01:00:01+03:00", "type": "complaint", - "id": "db37925f5b4a4cb5b092f72f3045c53b" + "id": "70b8bcbbcc3c4484b773051e4a196590" }, { "status": "claim", "description": "Умови виставлені замовником не містять достатньо інформації, щоб заявка мала сенс.", "title": "Недостатньо інформації", - "bid_id": "91a7fd50cba44d128291a2298a582b95", + "bid_id": "4e3560c629254c51802d8dc72d557ad6", "dateSubmitted": "2020-05-15T01:00:01+03:00", "complaintID": "UA-2020-05-15-000001.9", "date": "2020-05-15T01:00:01+03:00", "type": "claim", - "id": "347ccd6da34a4d5484e052a6bc7d7d49" + "id": "f9709d9435fd45329c82a62193890485" }, { "status": "mistaken", @@ -404,7 +404,7 @@ Content-Type: application/json; charset=UTF-8 "complaintID": "UA-2020-05-15-000001.10", "date": "2020-05-15T01:00:01+03:00", "type": "complaint", - "id": "8f1089341deb433986358a39b24aac50" + "id": "09aec589ca79414db92b38c44d8d2e3f" } ] } diff --git a/docs/source/tendering/http/criteria/add-criteria-requirement-group.http b/docs/source/tendering/http/criteria/add-criteria-requirement-group.http new file mode 100644 index 0000000000..152ec5071a --- /dev/null +++ b/docs/source/tendering/http/criteria/add-criteria-requirement-group.http @@ -0,0 +1,44 @@ +POST /api/2.5/tenders/fb07ce223a754201a341023b86d832ef/criteria/3061d99566884fb3b45862a6d237616e/requirement_groups?acc_token=056f6edd10e84810b429550ae3a12f86 HTTP/1.0 +Authorization: Bearer broker +Content-Length: 1904 +Content-Type: application/json +Host: lb-api-sandbox.prozorro.gov.ua +DATA: +{ + "data": { + "requirements": [ + { + "dataType": "boolean", + "eligibleEvidences": [ + { + "type": "document", + "description": "Довідка в довільній формі", + "title": "Документальне підтвердження" + } + ], + "expectedValue": "true", + "title": "Фізична особа, яка є учасником процедури закупівлі, не була засуджена за злочин, учинений з корисливих мотивів (зокрема, пов'язаний з хабарництвом та відмиванням коштів), судимість з якої знято або погашено у встановленому законом порядку" + } + ], + "description": "Учасник фізична особа підтверджує, що" + } +} + +Response: 201 Created +Content-Type: application/json; charset=UTF-8 +Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/fb07ce223a754201a341023b86d832ef/criteria/3061d99566884fb3b45862a6d237616e/requirement_groups/2db55debe004498b88e04e8173f09c7e +{ + "data": { + "requirements": [ + { + "dataType": "boolean", + "id": "38260002a5174893bda6e7a531ac0e89", + "expectedValue": "true", + "title": "Фізична особа, яка є учасником процедури закупівлі, не була засуджена за злочин, учинений з корисливих мотивів (зокрема, пов'язаний з хабарництвом та відмиванням коштів), судимість з якої знято або погашено у встановленому законом порядку" + } + ], + "id": "2db55debe004498b88e04e8173f09c7e", + "description": "Учасник фізична особа підтверджує, що" + } +} + diff --git a/docs/source/tendering/http/criteria/add-criteria-requirement.http b/docs/source/tendering/http/criteria/add-criteria-requirement.http new file mode 100644 index 0000000000..3e61d9fbab --- /dev/null +++ b/docs/source/tendering/http/criteria/add-criteria-requirement.http @@ -0,0 +1,33 @@ +POST /api/2.5/tenders/fb07ce223a754201a341023b86d832ef/criteria/3061d99566884fb3b45862a6d237616e/requirement_groups/672700185cd3443f9b4021f5300d11cf/requirements?acc_token=056f6edd10e84810b429550ae3a12f86 HTTP/1.0 +Authorization: Bearer broker +Content-Length: 1668 +Content-Type: application/json +Host: lb-api-sandbox.prozorro.gov.ua +DATA: +{ + "data": { + "dataType": "boolean", + "expectedValue": "true", + "eligibleEvidences": [ + { + "type": "document", + "description": "Довідка в довільній формі", + "title": "Документальне підтвердження" + } + ], + "title": "Фізична особа, яка є учасником процедури закупівлі, не була засуджена за злочин, учинений з корисливих мотивів (зокрема, пов'язаний з хабарництвом та відмиванням коштів), судимість з якої знято або погашено у встановленому законом порядку" + } +} + +Response: 201 Created +Content-Type: application/json; charset=UTF-8 +Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/fb07ce223a754201a341023b86d832ef/criteria/3061d99566884fb3b45862a6d237616e/requirement_groups/672700185cd3443f9b4021f5300d11cf/requirements/229dd43921254d289d5ff578a2e5d21c +{ + "data": { + "dataType": "boolean", + "id": "229dd43921254d289d5ff578a2e5d21c", + "expectedValue": "true", + "title": "Фізична особа, яка є учасником процедури закупівлі, не була засуджена за злочин, учинений з корисливих мотивів (зокрема, пов'язаний з хабарництвом та відмиванням коштів), судимість з якої знято або погашено у встановленому законом порядку" + } +} + diff --git a/docs/source/tendering/http/criteria/add-exclusion-criteria-requirement-group.http b/docs/source/tendering/http/criteria/add-exclusion-criteria-requirement-group.http new file mode 100644 index 0000000000..b31a645f14 --- /dev/null +++ b/docs/source/tendering/http/criteria/add-exclusion-criteria-requirement-group.http @@ -0,0 +1,39 @@ +POST /api/2.5/tenders/fb07ce223a754201a341023b86d832ef/criteria/209d9586a4ac466986e070f57ec244d6/requirement_groups?acc_token=056f6edd10e84810b429550ae3a12f86 HTTP/1.0 +Authorization: Bearer broker +Content-Length: 1904 +Content-Type: application/json +Host: lb-api-sandbox.prozorro.gov.ua +DATA: +{ + "data": { + "requirements": [ + { + "dataType": "boolean", + "eligibleEvidences": [ + { + "type": "document", + "description": "Довідка в довільній формі", + "title": "Документальне підтвердження" + } + ], + "expectedValue": "true", + "title": "Фізична особа, яка є учасником процедури закупівлі, не була засуджена за злочин, учинений з корисливих мотивів (зокрема, пов'язаний з хабарництвом та відмиванням коштів), судимість з якої знято або погашено у встановленому законом порядку" + } + ], + "description": "Учасник фізична особа підтверджує, що" + } +} + +Response: 403 Forbidden +Content-Type: application/json; charset=UTF-8 +{ + "status": "error", + "errors": [ + { + "description": "Can't update exclusion ecriteria objects", + "location": "body", + "name": "data" + } + ] +} + diff --git a/docs/source/tendering/http/criteria/add-exclusion-criteria-requirement.http b/docs/source/tendering/http/criteria/add-exclusion-criteria-requirement.http new file mode 100644 index 0000000000..cb0b8ad20e --- /dev/null +++ b/docs/source/tendering/http/criteria/add-exclusion-criteria-requirement.http @@ -0,0 +1,34 @@ +POST /api/2.5/tenders/fb07ce223a754201a341023b86d832ef/criteria/209d9586a4ac466986e070f57ec244d6/requirement_groups/ec9d9e3fe29c4e50b32efc796967ae1f/requirements?acc_token=056f6edd10e84810b429550ae3a12f86 HTTP/1.0 +Authorization: Bearer broker +Content-Length: 1668 +Content-Type: application/json +Host: lb-api-sandbox.prozorro.gov.ua +DATA: +{ + "data": { + "dataType": "boolean", + "expectedValue": "true", + "eligibleEvidences": [ + { + "type": "document", + "description": "Довідка в довільній формі", + "title": "Документальне підтвердження" + } + ], + "title": "Фізична особа, яка є учасником процедури закупівлі, не була засуджена за злочин, учинений з корисливих мотивів (зокрема, пов'язаний з хабарництвом та відмиванням коштів), судимість з якої знято або погашено у встановленому законом порядку" + } +} + +Response: 403 Forbidden +Content-Type: application/json; charset=UTF-8 +{ + "status": "error", + "errors": [ + { + "description": "Can't update exclusion ecriteria objects", + "location": "body", + "name": "data" + } + ] +} + diff --git a/docs/source/tendering/http/criteria/add-requirement-evidence.http b/docs/source/tendering/http/criteria/add-requirement-evidence.http new file mode 100644 index 0000000000..5cf7cde123 --- /dev/null +++ b/docs/source/tendering/http/criteria/add-requirement-evidence.http @@ -0,0 +1,26 @@ +POST /api/2.5/tenders/fb07ce223a754201a341023b86d832ef/criteria/3061d99566884fb3b45862a6d237616e/requirement_groups/672700185cd3443f9b4021f5300d11cf/requirements/adad5501a6584fe4a78e06af8d04a2eb/evidences?acc_token=056f6edd10e84810b429550ae3a12f86 HTTP/1.0 +Authorization: Bearer broker +Content-Length: 354 +Content-Type: application/json +Host: lb-api-sandbox.prozorro.gov.ua +DATA: +{ + "data": { + "type": "document", + "description": "Довідка в довільній формі", + "title": "Документальне підтвердження" + } +} + +Response: 201 Created +Content-Type: application/json; charset=UTF-8 +Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/fb07ce223a754201a341023b86d832ef/criteria/3061d99566884fb3b45862a6d237616e/requirement_groups/672700185cd3443f9b4021f5300d11cf/requirements/adad5501a6584fe4a78e06af8d04a2eb/evidences/6cffeb7d8f75499a810317aaac795284 +{ + "data": { + "title": "Документальне підтвердження", + "type": "document", + "description": "Довідка в довільній формі", + "id": "6cffeb7d8f75499a810317aaac795284" + } +} + diff --git a/docs/source/tendering/http/criteria/bid-activation.http b/docs/source/tendering/http/criteria/bid-activation.http new file mode 100644 index 0000000000..1a3adb1370 --- /dev/null +++ b/docs/source/tendering/http/criteria/bid-activation.http @@ -0,0 +1,25 @@ +PATCH /api/2.5/tenders/24660b6d159d42adb6aaba9d978575c7/bids/7d0b2418ff254e1c827ffe021c832900?acc_token=f0760e708e124c8fb9f34e562dbf59cf HTTP/1.0 +Authorization: Bearer token +Content-Length: 30 +Content-Type: application/json +Host: lb-api-sandbox.prozorro.gov.ua +DATA: +{ + "data": { + "status": "active" + } +} + +Response: 403 Forbidden +Content-Type: application/json; charset=UTF-8 +{ + "status": "error", + "errors": [ + { + "description": "Can't update bid to (active) status", + "location": "body", + "name": "data" + } + ] +} + diff --git a/docs/source/tendering/http/criteria/bulk-create-criteria.http b/docs/source/tendering/http/criteria/bulk-create-criteria.http new file mode 100644 index 0000000000..22efc42997 --- /dev/null +++ b/docs/source/tendering/http/criteria/bulk-create-criteria.http @@ -0,0 +1,146 @@ +POST /api/2.5/tenders/fb07ce223a754201a341023b86d832ef/criteria?acc_token=056f6edd10e84810b429550ae3a12f86 HTTP/1.0 +Authorization: Bearer broker +Content-Length: 7517 +Content-Type: application/json +Host: lb-api-sandbox.prozorro.gov.ua +DATA: +{ + "data": [ + { + "requirementGroups": [ + { + "requirements": [ + { + "dataType": "boolean", + "expectedValue": "true", + "eligibleEvidences": [ + { + "type": "document", + "description": "Довідка в довільній формі", + "title": "Документальне підтвердження" + } + ], + "title": "Фізична особа, яка є учасником процедури закупівлі, не була засуджена за злочин, учинений з корисливих мотивів (зокрема, пов'язаний з хабарництвом та відмиванням коштів), судимість з якої знято або погашено у встановленому законом порядку" + } + ], + "description": "Учасник фізична особа підтверджує, що" + }, + { + "requirements": [ + { + "dataType": "boolean", + "expectedValue": "true", + "title": "Службова (посадова) особа учасника процедури закупівлі, яка підписала тендерну пропозицію (або уповноважена на підписання договору в разі переговорної процедури закупівлі), не була засуджена за злочин, вчинений з корисливих мотивів (зокрема, пов'язаний з хабарництвом, шахрайством та відмиванням коштів), судимість з якої знято або погашено у встановленому законом порядку" + } + ], + "description": "Учасник юридична особа підтверджує, що" + } + ], + "description": "Службова (посадова) особа учасника процедури закупівлі, яка підписала тендерну пропозицію (або уповноважена на підписання договору в разі переговорної процедури закупівлі) або фізична особа, яка є учасником процедури закупівлі, не була засуджена за злочин, учинений з корисливих мотивів (зокрема, пов'язаний з хабарництвом та відмиванням коштів), судимість з якої знято або погашено у встановленому законом порядку", + "classification": { + "scheme": " espd211", + "id": "CRITERION.OTHER" + }, + "title": "Вчинення злочинів, учинених з корисливих мотивів", + "relatesTo": "tenderer", + "legislation": [ + { + "article": "17.1.5", + "version": "2020-04-19", + "type": "NATIONAL_LEGISLATION", + "identifier": { + "legalName": "Закон України \"Про публічні закупівлі\"", + "id": "922-VIII", + "uri": "https://zakon.rada.gov.ua/laws/show/922-19" + } + }, + { + "article": "17.1.6", + "version": "2020-04-19", + "type": "NATIONAL_LEGISLATION", + "identifier": { + "legalName": "Закон України \"Про публічні закупівлі\"", + "id": "922-VIII", + "uri": "https://zakon.rada.gov.ua/laws/show/922-19" + } + } + ], + "source": "tenderer" + } + ] +} + +Response: 201 Created +Content-Type: application/json; charset=UTF-8 +{ + "data": [ + { + "requirementGroups": [ + { + "requirements": [ + { + "dataType": "boolean", + "title": "Фізична особа, яка є учасником процедури закупівлі, не була засуджена за злочин, учинений з корисливих мотивів (зокрема, пов'язаний з хабарництвом та відмиванням коштів), судимість з якої знято або погашено у встановленому законом порядку", + "id": "adad5501a6584fe4a78e06af8d04a2eb", + "expectedValue": "true", + "eligibleEvidences": [ + { + "title": "Документальне підтвердження", + "type": "document", + "description": "Довідка в довільній формі", + "id": "36a71917abbb42b0bfab3522071afc9c" + } + ] + } + ], + "id": "672700185cd3443f9b4021f5300d11cf", + "description": "Учасник фізична особа підтверджує, що" + }, + { + "requirements": [ + { + "dataType": "boolean", + "id": "2626c80433124350b58af225d14e895b", + "expectedValue": "true", + "title": "Службова (посадова) особа учасника процедури закупівлі, яка підписала тендерну пропозицію (або уповноважена на підписання договору в разі переговорної процедури закупівлі), не була засуджена за злочин, вчинений з корисливих мотивів (зокрема, пов'язаний з хабарництвом, шахрайством та відмиванням коштів), судимість з якої знято або погашено у встановленому законом порядку" + } + ], + "id": "7feb91d537a744d597525e27d559a9bd", + "description": "Учасник юридична особа підтверджує, що" + } + ], + "description": "Службова (посадова) особа учасника процедури закупівлі, яка підписала тендерну пропозицію (або уповноважена на підписання договору в разі переговорної процедури закупівлі) або фізична особа, яка є учасником процедури закупівлі, не була засуджена за злочин, учинений з корисливих мотивів (зокрема, пов'язаний з хабарництвом та відмиванням коштів), судимість з якої знято або погашено у встановленому законом порядку", + "classification": { + "scheme": " espd211", + "id": "CRITERION.OTHER" + }, + "title": "Вчинення злочинів, учинених з корисливих мотивів", + "legislation": [ + { + "article": "17.1.5", + "version": "2020-04-19", + "type": "NATIONAL_LEGISLATION", + "identifier": { + "legalName": "Закон України \"Про публічні закупівлі\"", + "uri": "https://zakon.rada.gov.ua/laws/show/922-19", + "id": "922-VIII" + } + }, + { + "article": "17.1.6", + "version": "2020-04-19", + "type": "NATIONAL_LEGISLATION", + "identifier": { + "legalName": "Закон України \"Про публічні закупівлі\"", + "uri": "https://zakon.rada.gov.ua/laws/show/922-19", + "id": "922-VIII" + } + } + ], + "relatesTo": "tenderer", + "source": "tenderer", + "id": "3061d99566884fb3b45862a6d237616e" + } + ] +} + diff --git a/docs/source/tendering/http/criteria/bulk-create-criteria.http.http b/docs/source/tendering/http/criteria/bulk-create-criteria.http.http new file mode 100644 index 0000000000..8501f7c30c --- /dev/null +++ b/docs/source/tendering/http/criteria/bulk-create-criteria.http.http @@ -0,0 +1,146 @@ +POST /api/2.5/tenders/fb07ce223a754201a341023b86d832ef/criteria?acc_token=056f6edd10e84810b429550ae3a12f86 HTTP/1.0 +Authorization: Bearer broker +Content-Length: 7517 +Content-Type: application/json +Host: lb-api-sandbox.prozorro.gov.ua +DATA: +{ + "data": [ + { + "requirementGroups": [ + { + "requirements": [ + { + "dataType": "boolean", + "expectedValue": "true", + "eligibleEvidences": [ + { + "type": "document", + "description": "Довідка в довільній формі", + "title": "Документальне підтвердження" + } + ], + "title": "Фізична особа, яка є учасником процедури закупівлі, не була засуджена за злочин, учинений з корисливих мотивів (зокрема, пов'язаний з хабарництвом та відмиванням коштів), судимість з якої знято або погашено у встановленому законом порядку" + } + ], + "description": "Учасник фізична особа підтверджує, що" + }, + { + "requirements": [ + { + "dataType": "boolean", + "expectedValue": "true", + "title": "Службова (посадова) особа учасника процедури закупівлі, яка підписала тендерну пропозицію (або уповноважена на підписання договору в разі переговорної процедури закупівлі), не була засуджена за злочин, вчинений з корисливих мотивів (зокрема, пов'язаний з хабарництвом, шахрайством та відмиванням коштів), судимість з якої знято або погашено у встановленому законом порядку" + } + ], + "description": "Учасник юридична особа підтверджує, що" + } + ], + "description": "Службова (посадова) особа учасника процедури закупівлі, яка підписала тендерну пропозицію (або уповноважена на підписання договору в разі переговорної процедури закупівлі) або фізична особа, яка є учасником процедури закупівлі, не була засуджена за злочин, учинений з корисливих мотивів (зокрема, пов'язаний з хабарництвом та відмиванням коштів), судимість з якої знято або погашено у встановленому законом порядку", + "classification": { + "scheme": " espd211", + "id": "CRITERION.OTHER" + }, + "title": "Вчинення злочинів, учинених з корисливих мотивів", + "relatesTo": "tenderer", + "legislation": [ + { + "article": "17.1.5", + "version": "2020-04-19", + "type": "NATIONAL_LEGISLATION", + "identifier": { + "legalName": "Закон України \"Про публічні закупівлі\"", + "id": "922-VIII", + "uri": "https://zakon.rada.gov.ua/laws/show/922-19" + } + }, + { + "article": "17.1.6", + "version": "2020-04-19", + "type": "NATIONAL_LEGISLATION", + "identifier": { + "legalName": "Закон України \"Про публічні закупівлі\"", + "id": "922-VIII", + "uri": "https://zakon.rada.gov.ua/laws/show/922-19" + } + } + ], + "source": "tenderer" + } + ] +} + +Response: 201 Created +Content-Type: application/json; charset=UTF-8 +{ + "data": [ + { + "requirementGroups": [ + { + "requirements": [ + { + "dataType": "boolean", + "title": "Фізична особа, яка є учасником процедури закупівлі, не була засуджена за злочин, учинений з корисливих мотивів (зокрема, пов'язаний з хабарництвом та відмиванням коштів), судимість з якої знято або погашено у встановленому законом порядку", + "id": "adad5501a6584fe4a78e06af8d04a2eb", + "expectedValue": "true", + "eligibleEvidences": [ + { + "title": "Документальне підтвердження", + "type": "document", + "description": "Довідка в довільній формі", + "id": "36a71917abbb42b0bfab3522071afc9c" + } + ] + } + ], + "id": "672700185cd3443f9b4021f5300d11cf", + "description": "Учасник фізична особа підтверджує, що" + }, + { + "requirements": [ + { + "dataType": "boolean", + "id": "2626c80433124350b58af225d14e895b", + "expectedValue": "true", + "title": "Службова (посадова) особа учасника процедури закупівлі, яка підписала тендерну пропозицію (або уповноважена на підписання договору в разі переговорної процедури закупівлі), не була засуджена за злочин, вчинений з корисливих мотивів (зокрема, пов'язаний з хабарництвом, шахрайством та відмиванням коштів), судимість з якої знято або погашено у встановленому законом порядку" + } + ], + "id": "7feb91d537a744d597525e27d559a9bd", + "description": "Учасник юридична особа підтверджує, що" + } + ], + "description": "Службова (посадова) особа учасника процедури закупівлі, яка підписала тендерну пропозицію (або уповноважена на підписання договору в разі переговорної процедури закупівлі) або фізична особа, яка є учасником процедури закупівлі, не була засуджена за злочин, учинений з корисливих мотивів (зокрема, пов'язаний з хабарництвом та відмиванням коштів), судимість з якої знято або погашено у встановленому законом порядку", + "classification": { + "scheme": " espd211", + "id": "CRITERION.OTHER" + }, + "title": "Вчинення злочинів, учинених з корисливих мотивів", + "legislation": [ + { + "article": "17.1.5", + "version": "2020-04-19", + "type": "NATIONAL_LEGISLATION", + "identifier": { + "legalName": "Закон України \"Про публічні закупівлі\"", + "uri": "https://zakon.rada.gov.ua/laws/show/922-19", + "id": "922-VIII" + } + }, + { + "article": "17.1.6", + "version": "2020-04-19", + "type": "NATIONAL_LEGISLATION", + "identifier": { + "legalName": "Закон України \"Про публічні закупівлі\"", + "uri": "https://zakon.rada.gov.ua/laws/show/922-19", + "id": "922-VIII" + } + } + ], + "relatesTo": "tenderer", + "source": "tenderer", + "id": "3061d99566884fb3b45862a6d237616e" + } + ] +} + diff --git a/docs/source/tendering/http/criteria/bulk-create-exclusion-criteria.http b/docs/source/tendering/http/criteria/bulk-create-exclusion-criteria.http new file mode 100644 index 0000000000..c9b3b286ef --- /dev/null +++ b/docs/source/tendering/http/criteria/bulk-create-exclusion-criteria.http @@ -0,0 +1,129 @@ +POST /api/2.5/tenders/fb07ce223a754201a341023b86d832ef/criteria?acc_token=056f6edd10e84810b429550ae3a12f86 HTTP/1.0 +Authorization: Bearer broker +Content-Length: 5360 +Content-Type: application/json +Host: lb-api-sandbox.prozorro.gov.ua +DATA: +{ + "data": [ + { + "requirementGroups": [ + { + "requirements": [ + { + "dataType": "boolean", + "expectedValue": "true", + "title": "Суб'єкт господарювання (учасник) протягом останніх трьох років не притягувався до відповідальності за порушення, передбачене пунктом 4 частини другої статті 6, пунктом 1 статті 50 Закону України \"Про захист економічної конкуренції\", у вигляді вчинення антиконкурентних узгоджених дій, що стосуються спотворення результатів тендерів" + } + ], + "description": "Учасник підтверджує, що" + } + ], + "description": "Суб'єкт господарювання (учасник) протягом останніх трьох років не притягувався до відповідальності за порушення, передбачене пунктом 4 частини другої статті 6, пунктом 1 статті 50 Закону України \"Про захист економічної конкуренції\", у вигляді вчинення антиконкурентних узгоджених дій, що стосуються спотворення результатів тендерів", + "classification": { + "scheme": " espd211", + "id": "CRITERION.EXCLUSION.CONVICTIONS.FRAUD" + }, + "title": "Вчинення економічних правопорушень", + "relatesTo": "tenderer", + "legislation": [ + { + "article": "17.1.4", + "version": "2020-04-19", + "type": "NATIONAL_LEGISLATION", + "identifier": { + "id": "922-VIII", + "uri": "https://zakon.rada.gov.ua/laws/show/922-19", + "legalName": "Закон України \"Про публічні закупівлі\"" + } + }, + { + "article": "6.2.4", + "version": "2020-02-13", + "type": "NATIONAL_LEGISLATION", + "identifier": { + "id": "2210-III", + "uri": "https://zakon.rada.gov.ua/laws/show/2210-14", + "legalName": "Закон України \"Про захист економічної конкуренції\"" + } + }, + { + "article": "50.1", + "version": "2020-02-13", + "type": "NATIONAL_LEGISLATION", + "identifier": { + "id": "2210-III", + "uri": "https://zakon.rada.gov.ua/laws/show/2210-14", + "legalName": "Закон України \"Про захист економічної конкуренції\"" + } + } + ], + "source": "tenderer" + } + ] +} + +Response: 201 Created +Content-Type: application/json; charset=UTF-8 +{ + "data": [ + { + "requirementGroups": [ + { + "requirements": [ + { + "dataType": "boolean", + "id": "213508eab3f64741b217607ab238f91d", + "expectedValue": "true", + "title": "Суб'єкт господарювання (учасник) протягом останніх трьох років не притягувався до відповідальності за порушення, передбачене пунктом 4 частини другої статті 6, пунктом 1 статті 50 Закону України \"Про захист економічної конкуренції\", у вигляді вчинення антиконкурентних узгоджених дій, що стосуються спотворення результатів тендерів" + } + ], + "id": "ec9d9e3fe29c4e50b32efc796967ae1f", + "description": "Учасник підтверджує, що" + } + ], + "description": "Суб'єкт господарювання (учасник) протягом останніх трьох років не притягувався до відповідальності за порушення, передбачене пунктом 4 частини другої статті 6, пунктом 1 статті 50 Закону України \"Про захист економічної конкуренції\", у вигляді вчинення антиконкурентних узгоджених дій, що стосуються спотворення результатів тендерів", + "classification": { + "scheme": " espd211", + "id": "CRITERION.EXCLUSION.CONVICTIONS.FRAUD" + }, + "title": "Вчинення економічних правопорушень", + "legislation": [ + { + "article": "17.1.4", + "version": "2020-04-19", + "type": "NATIONAL_LEGISLATION", + "identifier": { + "legalName": "Закон України \"Про публічні закупівлі\"", + "uri": "https://zakon.rada.gov.ua/laws/show/922-19", + "id": "922-VIII" + } + }, + { + "article": "6.2.4", + "version": "2020-02-13", + "type": "NATIONAL_LEGISLATION", + "identifier": { + "legalName": "Закон України \"Про захист економічної конкуренції\"", + "uri": "https://zakon.rada.gov.ua/laws/show/2210-14", + "id": "2210-III" + } + }, + { + "article": "50.1", + "version": "2020-02-13", + "type": "NATIONAL_LEGISLATION", + "identifier": { + "legalName": "Закон України \"Про захист економічної конкуренції\"", + "uri": "https://zakon.rada.gov.ua/laws/show/2210-14", + "id": "2210-III" + } + } + ], + "relatesTo": "tenderer", + "source": "tenderer", + "id": "209d9586a4ac466986e070f57ec244d6" + } + ] +} + diff --git a/docs/source/tendering/http/criteria/create-requirement-response-evidence.http b/docs/source/tendering/http/criteria/create-requirement-response-evidence.http new file mode 100644 index 0000000000..ce646daa5f --- /dev/null +++ b/docs/source/tendering/http/criteria/create-requirement-response-evidence.http @@ -0,0 +1,32 @@ +POST /api/2.5/tenders/24660b6d159d42adb6aaba9d978575c7/bids/7d0b2418ff254e1c827ffe021c832900/requirement_responses/77b00a6655054f71af72e8599f27e09e/evidences?acc_token=f0760e708e124c8fb9f34e562dbf59cf HTTP/1.0 +Authorization: Bearer token +Content-Length: 147 +Content-Type: application/json +Host: lb-api-sandbox.prozorro.gov.ua +DATA: +{ + "data": { + "type": "document", + "relatedDocument": { + "id": "7261f09218de4ce79c11a48d275491e8", + "title": "name.doc" + }, + "title": "Requirement response" + } +} + +Response: 201 Created +Content-Type: application/json; charset=UTF-8 +Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/24660b6d159d42adb6aaba9d978575c7/bids/7d0b2418ff254e1c827ffe021c832900/requirement_responses/77b00a6655054f71af72e8599f27e09e/evidences/55c0261bc0cf47309851f85411a00d0d +{ + "data": { + "title": "Requirement response", + "type": "document", + "relatedDocument": { + "id": "7261f09218de4ce79c11a48d275491e8", + "title": "name.doc" + }, + "id": "55c0261bc0cf47309851f85411a00d0d" + } +} + diff --git a/docs/source/tendering/http/criteria/create-requirement-response.http b/docs/source/tendering/http/criteria/create-requirement-response.http new file mode 100644 index 0000000000..e71fedca5b --- /dev/null +++ b/docs/source/tendering/http/criteria/create-requirement-response.http @@ -0,0 +1,58 @@ +POST /api/2.5/tenders/24660b6d159d42adb6aaba9d978575c7/bids/7d0b2418ff254e1c827ffe021c832900/requirement_responses?acc_token=f0760e708e124c8fb9f34e562dbf59cf HTTP/1.0 +Authorization: Bearer token +Content-Length: 1551 +Content-Type: application/json +Host: lb-api-sandbox.prozorro.gov.ua +DATA: +{ + "data": [ + { + "requirement": { + "id": "aa44e48527b84a61a1a157f92d304bac", + "title": "Фізична особа, яка є учасником процедури закупівлі, не була засуджена за злочин, учинений з корисливих мотивів (зокрема, пов'язаний з хабарництвом та відмиванням коштів), судимість з якої знято або погашено у встановленому законом порядку" + }, + "title": "Requirement response", + "description": "some description", + "value": "True", + "evidences": [ + { + "type": "document", + "relatedDocument": { + "id": "7261f09218de4ce79c11a48d275491e8", + "title": "name.doc" + }, + "title": "Requirement response" + } + ] + } + ] +} + +Response: 201 Created +Content-Type: application/json; charset=UTF-8 +{ + "data": [ + { + "requirement": { + "id": "aa44e48527b84a61a1a157f92d304bac", + "title": "Фізична особа, яка є учасником процедури закупівлі, не була засуджена за злочин, учинений з корисливих мотивів (зокрема, пов'язаний з хабарництвом та відмиванням коштів), судимість з якої знято або погашено у встановленому законом порядку" + }, + "description": "some description", + "title": "Requirement response", + "value": "True", + "evidences": [ + { + "title": "Requirement response", + "type": "document", + "relatedDocument": { + "id": "7261f09218de4ce79c11a48d275491e8", + "title": "name.doc" + }, + "id": "80946715cbea46fab59296bd3f808848" + } + ], + "id": "77b00a6655054f71af72e8599f27e09e" + } + ] +} + diff --git a/docs/source/tendering/http/criteria/criteria-list.http b/docs/source/tendering/http/criteria/criteria-list.http new file mode 100644 index 0000000000..7451d7bcb7 --- /dev/null +++ b/docs/source/tendering/http/criteria/criteria-list.http @@ -0,0 +1,153 @@ +GET /api/2.5/tenders/fb07ce223a754201a341023b86d832ef/criteria HTTP/1.0 +Authorization: Bearer broker +Host: lb-api-sandbox.prozorro.gov.ua + +Response: 200 OK +Content-Type: application/json; charset=UTF-8 +{ + "data": [ + { + "requirementGroups": [ + { + "requirements": [ + { + "dataType": "boolean", + "title": "Updated title", + "id": "adad5501a6584fe4a78e06af8d04a2eb", + "expectedValue": "true", + "eligibleEvidences": [ + { + "title": "Документальне підтвердження", + "type": "document", + "description": "Довідка в довільній формі", + "id": "36a71917abbb42b0bfab3522071afc9c" + } + ] + }, + { + "dataType": "boolean", + "id": "229dd43921254d289d5ff578a2e5d21c", + "expectedValue": "true", + "title": "Фізична особа, яка є учасником процедури закупівлі, не була засуджена за злочин, учинений з корисливих мотивів (зокрема, пов'язаний з хабарництвом та відмиванням коштів), судимість з якої знято або погашено у встановленому законом порядку" + } + ], + "id": "672700185cd3443f9b4021f5300d11cf", + "description": "Updated description" + }, + { + "requirements": [ + { + "dataType": "boolean", + "id": "2626c80433124350b58af225d14e895b", + "expectedValue": "true", + "title": "Службова (посадова) особа учасника процедури закупівлі, яка підписала тендерну пропозицію (або уповноважена на підписання договору в разі переговорної процедури закупівлі), не була засуджена за злочин, вчинений з корисливих мотивів (зокрема, пов'язаний з хабарництвом, шахрайством та відмиванням коштів), судимість з якої знято або погашено у встановленому законом порядку" + } + ], + "id": "7feb91d537a744d597525e27d559a9bd", + "description": "Учасник юридична особа підтверджує, що" + }, + { + "requirements": [ + { + "dataType": "boolean", + "id": "38260002a5174893bda6e7a531ac0e89", + "expectedValue": "true", + "title": "Фізична особа, яка є учасником процедури закупівлі, не була засуджена за злочин, учинений з корисливих мотивів (зокрема, пов'язаний з хабарництвом та відмиванням коштів), судимість з якої знято або погашено у встановленому законом порядку" + } + ], + "id": "2db55debe004498b88e04e8173f09c7e", + "description": "Учасник фізична особа підтверджує, що" + } + ], + "description": "Службова (посадова) особа учасника процедури закупівлі, яка підписала тендерну пропозицію (або уповноважена на підписання договору в разі переговорної процедури закупівлі) або фізична особа, яка є учасником процедури закупівлі, не була засуджена за злочин, учинений з корисливих мотивів (зокрема, пов'язаний з хабарництвом та відмиванням коштів), судимість з якої знято або погашено у встановленому законом порядку", + "classification": { + "scheme": " espd211", + "id": "CRITERION.OTHER" + }, + "title": "Updated title", + "legislation": [ + { + "article": "17.1.5", + "version": "2020-04-19", + "type": "NATIONAL_LEGISLATION", + "identifier": { + "legalName": "Закон України \"Про публічні закупівлі\"", + "uri": "https://zakon.rada.gov.ua/laws/show/922-19", + "id": "922-VIII" + } + }, + { + "article": "17.1.6", + "version": "2020-04-19", + "type": "NATIONAL_LEGISLATION", + "identifier": { + "legalName": "Закон України \"Про публічні закупівлі\"", + "uri": "https://zakon.rada.gov.ua/laws/show/922-19", + "id": "922-VIII" + } + } + ], + "relatesTo": "tenderer", + "source": "tenderer", + "id": "3061d99566884fb3b45862a6d237616e" + }, + { + "requirementGroups": [ + { + "requirements": [ + { + "dataType": "boolean", + "id": "213508eab3f64741b217607ab238f91d", + "expectedValue": "true", + "title": "Суб'єкт господарювання (учасник) протягом останніх трьох років не притягувався до відповідальності за порушення, передбачене пунктом 4 частини другої статті 6, пунктом 1 статті 50 Закону України \"Про захист економічної конкуренції\", у вигляді вчинення антиконкурентних узгоджених дій, що стосуються спотворення результатів тендерів" + } + ], + "id": "ec9d9e3fe29c4e50b32efc796967ae1f", + "description": "Учасник підтверджує, що" + } + ], + "description": "Суб'єкт господарювання (учасник) протягом останніх трьох років не притягувався до відповідальності за порушення, передбачене пунктом 4 частини другої статті 6, пунктом 1 статті 50 Закону України \"Про захист економічної конкуренції\", у вигляді вчинення антиконкурентних узгоджених дій, що стосуються спотворення результатів тендерів", + "classification": { + "scheme": " espd211", + "id": "CRITERION.EXCLUSION.CONVICTIONS.FRAUD" + }, + "title": "Вчинення економічних правопорушень", + "legislation": [ + { + "article": "17.1.4", + "version": "2020-04-19", + "type": "NATIONAL_LEGISLATION", + "identifier": { + "legalName": "Закон України \"Про публічні закупівлі\"", + "uri": "https://zakon.rada.gov.ua/laws/show/922-19", + "id": "922-VIII" + } + }, + { + "article": "6.2.4", + "version": "2020-02-13", + "type": "NATIONAL_LEGISLATION", + "identifier": { + "legalName": "Закон України \"Про захист економічної конкуренції\"", + "uri": "https://zakon.rada.gov.ua/laws/show/2210-14", + "id": "2210-III" + } + }, + { + "article": "50.1", + "version": "2020-02-13", + "type": "NATIONAL_LEGISLATION", + "identifier": { + "legalName": "Закон України \"Про захист економічної конкуренції\"", + "uri": "https://zakon.rada.gov.ua/laws/show/2210-14", + "id": "2210-III" + } + } + ], + "relatesTo": "tenderer", + "source": "tenderer", + "id": "209d9586a4ac466986e070f57ec244d6" + } + ] +} + diff --git a/docs/source/tendering/http/criteria/criteria-requirement-group-list.http b/docs/source/tendering/http/criteria/criteria-requirement-group-list.http new file mode 100644 index 0000000000..db5d535ab5 --- /dev/null +++ b/docs/source/tendering/http/criteria/criteria-requirement-group-list.http @@ -0,0 +1,55 @@ +GET /api/2.5/tenders/fb07ce223a754201a341023b86d832ef/criteria/3061d99566884fb3b45862a6d237616e/requirement_groups HTTP/1.0 +Authorization: Bearer broker +Host: lb-api-sandbox.prozorro.gov.ua + +Response: 200 OK +Content-Type: application/json; charset=UTF-8 +{ + "data": [ + { + "requirements": [ + { + "dataType": "boolean", + "title": "Фізична особа, яка є учасником процедури закупівлі, не була засуджена за злочин, учинений з корисливих мотивів (зокрема, пов'язаний з хабарництвом та відмиванням коштів), судимість з якої знято або погашено у встановленому законом порядку", + "id": "adad5501a6584fe4a78e06af8d04a2eb", + "expectedValue": "true", + "eligibleEvidences": [ + { + "title": "Документальне підтвердження", + "type": "document", + "description": "Довідка в довільній формі", + "id": "36a71917abbb42b0bfab3522071afc9c" + } + ] + } + ], + "id": "672700185cd3443f9b4021f5300d11cf", + "description": "Updated description" + }, + { + "requirements": [ + { + "dataType": "boolean", + "id": "2626c80433124350b58af225d14e895b", + "expectedValue": "true", + "title": "Службова (посадова) особа учасника процедури закупівлі, яка підписала тендерну пропозицію (або уповноважена на підписання договору в разі переговорної процедури закупівлі), не була засуджена за злочин, вчинений з корисливих мотивів (зокрема, пов'язаний з хабарництвом, шахрайством та відмиванням коштів), судимість з якої знято або погашено у встановленому законом порядку" + } + ], + "id": "7feb91d537a744d597525e27d559a9bd", + "description": "Учасник юридична особа підтверджує, що" + }, + { + "requirements": [ + { + "dataType": "boolean", + "id": "38260002a5174893bda6e7a531ac0e89", + "expectedValue": "true", + "title": "Фізична особа, яка є учасником процедури закупівлі, не була засуджена за злочин, учинений з корисливих мотивів (зокрема, пов'язаний з хабарництвом та відмиванням коштів), судимість з якої знято або погашено у встановленому законом порядку" + } + ], + "id": "2db55debe004498b88e04e8173f09c7e", + "description": "Учасник фізична особа підтверджує, що" + } + ] +} + diff --git a/docs/source/tendering/http/criteria/criteria-requirement-group.http b/docs/source/tendering/http/criteria/criteria-requirement-group.http new file mode 100644 index 0000000000..8c61da21c8 --- /dev/null +++ b/docs/source/tendering/http/criteria/criteria-requirement-group.http @@ -0,0 +1,29 @@ +GET /api/2.5/tenders/fb07ce223a754201a341023b86d832ef/criteria/3061d99566884fb3b45862a6d237616e/requirement_groups/672700185cd3443f9b4021f5300d11cf HTTP/1.0 +Authorization: Bearer broker +Host: lb-api-sandbox.prozorro.gov.ua + +Response: 200 OK +Content-Type: application/json; charset=UTF-8 +{ + "data": { + "requirements": [ + { + "dataType": "boolean", + "title": "Фізична особа, яка є учасником процедури закупівлі, не була засуджена за злочин, учинений з корисливих мотивів (зокрема, пов'язаний з хабарництвом та відмиванням коштів), судимість з якої знято або погашено у встановленому законом порядку", + "id": "adad5501a6584fe4a78e06af8d04a2eb", + "expectedValue": "true", + "eligibleEvidences": [ + { + "title": "Документальне підтвердження", + "type": "document", + "description": "Довідка в довільній формі", + "id": "36a71917abbb42b0bfab3522071afc9c" + } + ] + } + ], + "id": "672700185cd3443f9b4021f5300d11cf", + "description": "Updated description" + } +} + diff --git a/docs/source/tendering/http/criteria/criteria-requirement-list.http b/docs/source/tendering/http/criteria/criteria-requirement-list.http new file mode 100644 index 0000000000..586d7ada66 --- /dev/null +++ b/docs/source/tendering/http/criteria/criteria-requirement-list.http @@ -0,0 +1,31 @@ +GET /api/2.5/tenders/fb07ce223a754201a341023b86d832ef/criteria/3061d99566884fb3b45862a6d237616e/requirement_groups/672700185cd3443f9b4021f5300d11cf/requirements HTTP/1.0 +Authorization: Bearer broker +Host: lb-api-sandbox.prozorro.gov.ua + +Response: 200 OK +Content-Type: application/json; charset=UTF-8 +{ + "data": [ + { + "dataType": "boolean", + "title": "Updated title", + "id": "adad5501a6584fe4a78e06af8d04a2eb", + "expectedValue": "true", + "eligibleEvidences": [ + { + "title": "Документальне підтвердження", + "type": "document", + "description": "Довідка в довільній формі", + "id": "36a71917abbb42b0bfab3522071afc9c" + } + ] + }, + { + "dataType": "boolean", + "id": "229dd43921254d289d5ff578a2e5d21c", + "expectedValue": "true", + "title": "Фізична особа, яка є учасником процедури закупівлі, не була засуджена за злочин, учинений з корисливих мотивів (зокрема, пов'язаний з хабарництвом та відмиванням коштів), судимість з якої знято або погашено у встановленому законом порядку" + } + ] +} + diff --git a/docs/source/tendering/http/criteria/criteria-requirement.http b/docs/source/tendering/http/criteria/criteria-requirement.http new file mode 100644 index 0000000000..eb395bc20a --- /dev/null +++ b/docs/source/tendering/http/criteria/criteria-requirement.http @@ -0,0 +1,23 @@ +GET /api/2.5/tenders/fb07ce223a754201a341023b86d832ef/criteria/3061d99566884fb3b45862a6d237616e/requirement_groups/672700185cd3443f9b4021f5300d11cf/requirements/adad5501a6584fe4a78e06af8d04a2eb HTTP/1.0 +Authorization: Bearer broker +Host: lb-api-sandbox.prozorro.gov.ua + +Response: 200 OK +Content-Type: application/json; charset=UTF-8 +{ + "data": { + "dataType": "boolean", + "title": "Updated title", + "id": "adad5501a6584fe4a78e06af8d04a2eb", + "expectedValue": "true", + "eligibleEvidences": [ + { + "title": "Документальне підтвердження", + "type": "document", + "description": "Довідка в довільній формі", + "id": "36a71917abbb42b0bfab3522071afc9c" + } + ] + } +} + diff --git a/docs/source/tendering/http/criteria/criteria.http b/docs/source/tendering/http/criteria/criteria.http new file mode 100644 index 0000000000..34a9dbaeb1 --- /dev/null +++ b/docs/source/tendering/http/criteria/criteria.http @@ -0,0 +1,94 @@ +GET /api/2.5/tenders/fb07ce223a754201a341023b86d832ef/criteria/3061d99566884fb3b45862a6d237616e HTTP/1.0 +Authorization: Bearer broker +Host: lb-api-sandbox.prozorro.gov.ua + +Response: 200 OK +Content-Type: application/json; charset=UTF-8 +{ + "data": { + "requirementGroups": [ + { + "requirements": [ + { + "dataType": "boolean", + "title": "Updated title", + "id": "adad5501a6584fe4a78e06af8d04a2eb", + "expectedValue": "true", + "eligibleEvidences": [ + { + "title": "Документальне підтвердження", + "type": "document", + "description": "Довідка в довільній формі", + "id": "36a71917abbb42b0bfab3522071afc9c" + } + ] + }, + { + "dataType": "boolean", + "id": "229dd43921254d289d5ff578a2e5d21c", + "expectedValue": "true", + "title": "Фізична особа, яка є учасником процедури закупівлі, не була засуджена за злочин, учинений з корисливих мотивів (зокрема, пов'язаний з хабарництвом та відмиванням коштів), судимість з якої знято або погашено у встановленому законом порядку" + } + ], + "id": "672700185cd3443f9b4021f5300d11cf", + "description": "Updated description" + }, + { + "requirements": [ + { + "dataType": "boolean", + "id": "2626c80433124350b58af225d14e895b", + "expectedValue": "true", + "title": "Службова (посадова) особа учасника процедури закупівлі, яка підписала тендерну пропозицію (або уповноважена на підписання договору в разі переговорної процедури закупівлі), не була засуджена за злочин, вчинений з корисливих мотивів (зокрема, пов'язаний з хабарництвом, шахрайством та відмиванням коштів), судимість з якої знято або погашено у встановленому законом порядку" + } + ], + "id": "7feb91d537a744d597525e27d559a9bd", + "description": "Учасник юридична особа підтверджує, що" + }, + { + "requirements": [ + { + "dataType": "boolean", + "id": "38260002a5174893bda6e7a531ac0e89", + "expectedValue": "true", + "title": "Фізична особа, яка є учасником процедури закупівлі, не була засуджена за злочин, учинений з корисливих мотивів (зокрема, пов'язаний з хабарництвом та відмиванням коштів), судимість з якої знято або погашено у встановленому законом порядку" + } + ], + "id": "2db55debe004498b88e04e8173f09c7e", + "description": "Учасник фізична особа підтверджує, що" + } + ], + "description": "Службова (посадова) особа учасника процедури закупівлі, яка підписала тендерну пропозицію (або уповноважена на підписання договору в разі переговорної процедури закупівлі) або фізична особа, яка є учасником процедури закупівлі, не була засуджена за злочин, учинений з корисливих мотивів (зокрема, пов'язаний з хабарництвом та відмиванням коштів), судимість з якої знято або погашено у встановленому законом порядку", + "classification": { + "scheme": " espd211", + "id": "CRITERION.OTHER" + }, + "title": "Updated title", + "legislation": [ + { + "article": "17.1.5", + "version": "2020-04-19", + "type": "NATIONAL_LEGISLATION", + "identifier": { + "legalName": "Закон України \"Про публічні закупівлі\"", + "uri": "https://zakon.rada.gov.ua/laws/show/922-19", + "id": "922-VIII" + } + }, + { + "article": "17.1.6", + "version": "2020-04-19", + "type": "NATIONAL_LEGISLATION", + "identifier": { + "legalName": "Закон України \"Про публічні закупівлі\"", + "uri": "https://zakon.rada.gov.ua/laws/show/922-19", + "id": "922-VIII" + } + } + ], + "relatesTo": "tenderer", + "source": "tenderer", + "id": "3061d99566884fb3b45862a6d237616e" + } +} + diff --git a/docs/source/tendering/http/criteria/delete-requirement-evidence.http b/docs/source/tendering/http/criteria/delete-requirement-evidence.http new file mode 100644 index 0000000000..b81332694a --- /dev/null +++ b/docs/source/tendering/http/criteria/delete-requirement-evidence.http @@ -0,0 +1,17 @@ +DELETE /api/2.5/tenders/fb07ce223a754201a341023b86d832ef/criteria/3061d99566884fb3b45862a6d237616e/requirement_groups/672700185cd3443f9b4021f5300d11cf/requirements/adad5501a6584fe4a78e06af8d04a2eb/evidences/6cffeb7d8f75499a810317aaac795284?acc_token=056f6edd10e84810b429550ae3a12f86 HTTP/1.0 +Authorization: Bearer broker +Content-Length: 0 +Host: lb-api-sandbox.prozorro.gov.ua + +Response: 200 OK +Content-Type: application/json; charset=UTF-8 +{ + "data": { + "title_en": "Documented approve", + "title": "Документальне підтвердження", + "type": "document", + "description": "Довідка в довільній формі", + "id": "6cffeb7d8f75499a810317aaac795284" + } +} + diff --git a/docs/source/tendering/http/criteria/delete-requirement-response-evidence.http b/docs/source/tendering/http/criteria/delete-requirement-response-evidence.http new file mode 100644 index 0000000000..3733fcbb5d --- /dev/null +++ b/docs/source/tendering/http/criteria/delete-requirement-response-evidence.http @@ -0,0 +1,19 @@ +DELETE /api/2.5/tenders/24660b6d159d42adb6aaba9d978575c7/bids/7d0b2418ff254e1c827ffe021c832900/requirement_responses/77b00a6655054f71af72e8599f27e09e/evidences/55c0261bc0cf47309851f85411a00d0d?acc_token=f0760e708e124c8fb9f34e562dbf59cf HTTP/1.0 +Authorization: Bearer token +Content-Length: 0 +Host: lb-api-sandbox.prozorro.gov.ua + +Response: 200 OK +Content-Type: application/json; charset=UTF-8 +{ + "data": { + "title": "Update evidence title", + "type": "document", + "relatedDocument": { + "id": "7261f09218de4ce79c11a48d275491e8", + "title": "name.doc" + }, + "id": "55c0261bc0cf47309851f85411a00d0d" + } +} + diff --git a/docs/source/tendering/http/criteria/delete-requirement-response.http b/docs/source/tendering/http/criteria/delete-requirement-response.http new file mode 100644 index 0000000000..6d268c5f30 --- /dev/null +++ b/docs/source/tendering/http/criteria/delete-requirement-response.http @@ -0,0 +1,30 @@ +GET /api/2.5/tenders/24660b6d159d42adb6aaba9d978575c7/bids/7d0b2418ff254e1c827ffe021c832900/requirement_responses/77b00a6655054f71af72e8599f27e09e?acc_token=f0760e708e124c8fb9f34e562dbf59cf HTTP/1.0 +Authorization: Bearer token +Host: lb-api-sandbox.prozorro.gov.ua + +Response: 200 OK +Content-Type: application/json; charset=UTF-8 +{ + "data": { + "requirement": { + "id": "aa44e48527b84a61a1a157f92d304bac", + "title": "Фізична особа, яка є учасником процедури закупівлі, не була засуджена за злочин, учинений з корисливих мотивів (зокрема, пов'язаний з хабарництвом та відмиванням коштів), судимість з якої знято або погашено у встановленому законом порядку" + }, + "description": "some description", + "title": "Updated title", + "value": "True", + "evidences": [ + { + "title": "Requirement response", + "type": "document", + "relatedDocument": { + "id": "7261f09218de4ce79c11a48d275491e8", + "title": "name.doc" + }, + "id": "80946715cbea46fab59296bd3f808848" + } + ], + "id": "77b00a6655054f71af72e8599f27e09e" + } +} + diff --git a/docs/source/tendering/http/criteria/patch-criteria-requirement-group.http b/docs/source/tendering/http/criteria/patch-criteria-requirement-group.http new file mode 100644 index 0000000000..16174dd88f --- /dev/null +++ b/docs/source/tendering/http/criteria/patch-criteria-requirement-group.http @@ -0,0 +1,37 @@ +PATCH /api/2.5/tenders/fb07ce223a754201a341023b86d832ef/criteria/3061d99566884fb3b45862a6d237616e/requirement_groups/672700185cd3443f9b4021f5300d11cf?acc_token=056f6edd10e84810b429550ae3a12f86 HTTP/1.0 +Authorization: Bearer broker +Content-Length: 48 +Content-Type: application/json +Host: lb-api-sandbox.prozorro.gov.ua +DATA: +{ + "data": { + "description": "Updated description" + } +} + +Response: 200 OK +Content-Type: application/json; charset=UTF-8 +{ + "data": { + "requirements": [ + { + "dataType": "boolean", + "title": "Фізична особа, яка є учасником процедури закупівлі, не була засуджена за злочин, учинений з корисливих мотивів (зокрема, пов'язаний з хабарництвом та відмиванням коштів), судимість з якої знято або погашено у встановленому законом порядку", + "id": "adad5501a6584fe4a78e06af8d04a2eb", + "expectedValue": "true", + "eligibleEvidences": [ + { + "title": "Документальне підтвердження", + "type": "document", + "description": "Довідка в довільній формі", + "id": "36a71917abbb42b0bfab3522071afc9c" + } + ] + } + ], + "id": "672700185cd3443f9b4021f5300d11cf", + "description": "Updated description" + } +} + diff --git a/docs/source/tendering/http/criteria/patch-criteria-requirement.http b/docs/source/tendering/http/criteria/patch-criteria-requirement.http new file mode 100644 index 0000000000..b7bbca5ad2 --- /dev/null +++ b/docs/source/tendering/http/criteria/patch-criteria-requirement.http @@ -0,0 +1,31 @@ +PATCH /api/2.5/tenders/fb07ce223a754201a341023b86d832ef/criteria/3061d99566884fb3b45862a6d237616e/requirement_groups/672700185cd3443f9b4021f5300d11cf/requirements/adad5501a6584fe4a78e06af8d04a2eb?acc_token=056f6edd10e84810b429550ae3a12f86 HTTP/1.0 +Authorization: Bearer broker +Content-Length: 36 +Content-Type: application/json +Host: lb-api-sandbox.prozorro.gov.ua +DATA: +{ + "data": { + "title": "Updated title" + } +} + +Response: 200 OK +Content-Type: application/json; charset=UTF-8 +{ + "data": { + "dataType": "boolean", + "title": "Updated title", + "id": "adad5501a6584fe4a78e06af8d04a2eb", + "expectedValue": "true", + "eligibleEvidences": [ + { + "title": "Документальне підтвердження", + "type": "document", + "description": "Довідка в довільній формі", + "id": "36a71917abbb42b0bfab3522071afc9c" + } + ] + } +} + diff --git a/docs/source/tendering/http/criteria/patch-criteria.http b/docs/source/tendering/http/criteria/patch-criteria.http new file mode 100644 index 0000000000..1145622864 --- /dev/null +++ b/docs/source/tendering/http/criteria/patch-criteria.http @@ -0,0 +1,84 @@ +PATCH /api/2.5/tenders/fb07ce223a754201a341023b86d832ef/criteria/3061d99566884fb3b45862a6d237616e?acc_token=056f6edd10e84810b429550ae3a12f86 HTTP/1.0 +Authorization: Bearer broker +Content-Length: 36 +Content-Type: application/json +Host: lb-api-sandbox.prozorro.gov.ua +DATA: +{ + "data": { + "title": "Updated title" + } +} + +Response: 200 OK +Content-Type: application/json; charset=UTF-8 +{ + "data": { + "requirementGroups": [ + { + "requirements": [ + { + "dataType": "boolean", + "title": "Фізична особа, яка є учасником процедури закупівлі, не була засуджена за злочин, учинений з корисливих мотивів (зокрема, пов'язаний з хабарництвом та відмиванням коштів), судимість з якої знято або погашено у встановленому законом порядку", + "id": "adad5501a6584fe4a78e06af8d04a2eb", + "expectedValue": "true", + "eligibleEvidences": [ + { + "title": "Документальне підтвердження", + "type": "document", + "description": "Довідка в довільній формі", + "id": "36a71917abbb42b0bfab3522071afc9c" + } + ] + } + ], + "id": "672700185cd3443f9b4021f5300d11cf", + "description": "Учасник фізична особа підтверджує, що" + }, + { + "requirements": [ + { + "dataType": "boolean", + "id": "2626c80433124350b58af225d14e895b", + "expectedValue": "true", + "title": "Службова (посадова) особа учасника процедури закупівлі, яка підписала тендерну пропозицію (або уповноважена на підписання договору в разі переговорної процедури закупівлі), не була засуджена за злочин, вчинений з корисливих мотивів (зокрема, пов'язаний з хабарництвом, шахрайством та відмиванням коштів), судимість з якої знято або погашено у встановленому законом порядку" + } + ], + "id": "7feb91d537a744d597525e27d559a9bd", + "description": "Учасник юридична особа підтверджує, що" + } + ], + "description": "Службова (посадова) особа учасника процедури закупівлі, яка підписала тендерну пропозицію (або уповноважена на підписання договору в разі переговорної процедури закупівлі) або фізична особа, яка є учасником процедури закупівлі, не була засуджена за злочин, учинений з корисливих мотивів (зокрема, пов'язаний з хабарництвом та відмиванням коштів), судимість з якої знято або погашено у встановленому законом порядку", + "classification": { + "scheme": " espd211", + "id": "CRITERION.OTHER" + }, + "title": "Updated title", + "legislation": [ + { + "article": "17.1.5", + "version": "2020-04-19", + "type": "NATIONAL_LEGISLATION", + "identifier": { + "legalName": "Закон України \"Про публічні закупівлі\"", + "uri": "https://zakon.rada.gov.ua/laws/show/922-19", + "id": "922-VIII" + } + }, + { + "article": "17.1.6", + "version": "2020-04-19", + "type": "NATIONAL_LEGISLATION", + "identifier": { + "legalName": "Закон України \"Про публічні закупівлі\"", + "uri": "https://zakon.rada.gov.ua/laws/show/922-19", + "id": "922-VIII" + } + } + ], + "relatesTo": "tenderer", + "source": "tenderer", + "id": "3061d99566884fb3b45862a6d237616e" + } +} + diff --git a/docs/source/tendering/http/criteria/patch-exclusion-criteria-requirement-group.http b/docs/source/tendering/http/criteria/patch-exclusion-criteria-requirement-group.http new file mode 100644 index 0000000000..b3c79f3aec --- /dev/null +++ b/docs/source/tendering/http/criteria/patch-exclusion-criteria-requirement-group.http @@ -0,0 +1,25 @@ +PATCH /api/2.5/tenders/fb07ce223a754201a341023b86d832ef/criteria/209d9586a4ac466986e070f57ec244d6/requirement_groups/ec9d9e3fe29c4e50b32efc796967ae1f?acc_token=056f6edd10e84810b429550ae3a12f86 HTTP/1.0 +Authorization: Bearer broker +Content-Length: 36 +Content-Type: application/json +Host: lb-api-sandbox.prozorro.gov.ua +DATA: +{ + "data": { + "title": "Updated title" + } +} + +Response: 403 Forbidden +Content-Type: application/json; charset=UTF-8 +{ + "status": "error", + "errors": [ + { + "description": "Can't update exclusion ecriteria objects", + "location": "body", + "name": "data" + } + ] +} + diff --git a/docs/source/tendering/http/criteria/patch-exclusion-criteria-requirement.http b/docs/source/tendering/http/criteria/patch-exclusion-criteria-requirement.http new file mode 100644 index 0000000000..56d55cab80 --- /dev/null +++ b/docs/source/tendering/http/criteria/patch-exclusion-criteria-requirement.http @@ -0,0 +1,34 @@ +PATCH /api/2.5/tenders/fb07ce223a754201a341023b86d832ef/criteria/209d9586a4ac466986e070f57ec244d6/requirement_groups/ec9d9e3fe29c4e50b32efc796967ae1f/requirements/213508eab3f64741b217607ab238f91d?acc_token=056f6edd10e84810b429550ae3a12f86 HTTP/1.0 +Authorization: Bearer broker +Content-Length: 1668 +Content-Type: application/json +Host: lb-api-sandbox.prozorro.gov.ua +DATA: +{ + "data": { + "dataType": "boolean", + "expectedValue": "true", + "eligibleEvidences": [ + { + "type": "document", + "description": "Довідка в довільній формі", + "title": "Документальне підтвердження" + } + ], + "title": "Фізична особа, яка є учасником процедури закупівлі, не була засуджена за злочин, учинений з корисливих мотивів (зокрема, пов'язаний з хабарництвом та відмиванням коштів), судимість з якої знято або погашено у встановленому законом порядку" + } +} + +Response: 403 Forbidden +Content-Type: application/json; charset=UTF-8 +{ + "status": "error", + "errors": [ + { + "description": "Can't update exclusion ecriteria objects", + "location": "body", + "name": "data" + } + ] +} + diff --git a/docs/source/tendering/http/criteria/patch-exclusion-criteria.http b/docs/source/tendering/http/criteria/patch-exclusion-criteria.http new file mode 100644 index 0000000000..275136e16e --- /dev/null +++ b/docs/source/tendering/http/criteria/patch-exclusion-criteria.http @@ -0,0 +1,25 @@ +PATCH /api/2.5/tenders/fb07ce223a754201a341023b86d832ef/criteria/209d9586a4ac466986e070f57ec244d6?acc_token=056f6edd10e84810b429550ae3a12f86 HTTP/1.0 +Authorization: Bearer broker +Content-Length: 36 +Content-Type: application/json +Host: lb-api-sandbox.prozorro.gov.ua +DATA: +{ + "data": { + "title": "Updated title" + } +} + +Response: 403 Forbidden +Content-Type: application/json; charset=UTF-8 +{ + "status": "error", + "errors": [ + { + "description": "Can't update exclusion ecriteria objects", + "location": "body", + "name": "data" + } + ] +} + diff --git a/docs/source/tendering/http/criteria/patch-requirement-evidence.http b/docs/source/tendering/http/criteria/patch-requirement-evidence.http new file mode 100644 index 0000000000..9287e558f9 --- /dev/null +++ b/docs/source/tendering/http/criteria/patch-requirement-evidence.http @@ -0,0 +1,24 @@ +PATCH /api/2.5/tenders/fb07ce223a754201a341023b86d832ef/criteria/3061d99566884fb3b45862a6d237616e/requirement_groups/672700185cd3443f9b4021f5300d11cf/requirements/adad5501a6584fe4a78e06af8d04a2eb/evidences/6cffeb7d8f75499a810317aaac795284?acc_token=056f6edd10e84810b429550ae3a12f86 HTTP/1.0 +Authorization: Bearer broker +Content-Length: 44 +Content-Type: application/json +Host: lb-api-sandbox.prozorro.gov.ua +DATA: +{ + "data": { + "title_en": "Documented approve" + } +} + +Response: 200 OK +Content-Type: application/json; charset=UTF-8 +{ + "data": { + "title_en": "Documented approve", + "title": "Документальне підтвердження", + "type": "document", + "description": "Довідка в довільній формі", + "id": "6cffeb7d8f75499a810317aaac795284" + } +} + diff --git a/docs/source/tendering/http/criteria/requirement-evidence.http b/docs/source/tendering/http/criteria/requirement-evidence.http new file mode 100644 index 0000000000..52a9bc405c --- /dev/null +++ b/docs/source/tendering/http/criteria/requirement-evidence.http @@ -0,0 +1,16 @@ +GET /api/2.5/tenders/fb07ce223a754201a341023b86d832ef/criteria/3061d99566884fb3b45862a6d237616e/requirement_groups/672700185cd3443f9b4021f5300d11cf/requirements/adad5501a6584fe4a78e06af8d04a2eb/evidences/6cffeb7d8f75499a810317aaac795284 HTTP/1.0 +Authorization: Bearer broker +Host: lb-api-sandbox.prozorro.gov.ua + +Response: 200 OK +Content-Type: application/json; charset=UTF-8 +{ + "data": { + "title_en": "Documented approve", + "title": "Документальне підтвердження", + "type": "document", + "description": "Довідка в довільній формі", + "id": "6cffeb7d8f75499a810317aaac795284" + } +} + diff --git a/docs/source/tendering/http/criteria/requirement-evidences-list.http b/docs/source/tendering/http/criteria/requirement-evidences-list.http new file mode 100644 index 0000000000..dcb0e38050 --- /dev/null +++ b/docs/source/tendering/http/criteria/requirement-evidences-list.http @@ -0,0 +1,24 @@ +GET /api/2.5/tenders/fb07ce223a754201a341023b86d832ef/criteria/3061d99566884fb3b45862a6d237616e/requirement_groups/672700185cd3443f9b4021f5300d11cf/requirements/adad5501a6584fe4a78e06af8d04a2eb/evidences HTTP/1.0 +Authorization: Bearer broker +Host: lb-api-sandbox.prozorro.gov.ua + +Response: 200 OK +Content-Type: application/json; charset=UTF-8 +{ + "data": [ + { + "title": "Документальне підтвердження", + "type": "document", + "description": "Довідка в довільній формі", + "id": "36a71917abbb42b0bfab3522071afc9c" + }, + { + "title_en": "Documented approve", + "title": "Документальне підтвердження", + "type": "document", + "description": "Довідка в довільній формі", + "id": "6cffeb7d8f75499a810317aaac795284" + } + ] +} + diff --git a/docs/source/tendering/http/criteria/requirement-response-evidence-list.http b/docs/source/tendering/http/criteria/requirement-response-evidence-list.http new file mode 100644 index 0000000000..ecf49716a2 --- /dev/null +++ b/docs/source/tendering/http/criteria/requirement-response-evidence-list.http @@ -0,0 +1,29 @@ +GET /api/2.5/tenders/24660b6d159d42adb6aaba9d978575c7/bids/7d0b2418ff254e1c827ffe021c832900/requirement_responses/77b00a6655054f71af72e8599f27e09e/evidences HTTP/1.0 +Authorization: Bearer token +Host: lb-api-sandbox.prozorro.gov.ua + +Response: 200 OK +Content-Type: application/json; charset=UTF-8 +{ + "data": [ + { + "title": "Requirement response", + "type": "document", + "relatedDocument": { + "id": "7261f09218de4ce79c11a48d275491e8", + "title": "name.doc" + }, + "id": "80946715cbea46fab59296bd3f808848" + }, + { + "title": "Update evidence title", + "type": "document", + "relatedDocument": { + "id": "7261f09218de4ce79c11a48d275491e8", + "title": "name.doc" + }, + "id": "55c0261bc0cf47309851f85411a00d0d" + } + ] +} + diff --git a/docs/source/tendering/http/criteria/requirement-response-evidence.http b/docs/source/tendering/http/criteria/requirement-response-evidence.http new file mode 100644 index 0000000000..4e6b8d97c3 --- /dev/null +++ b/docs/source/tendering/http/criteria/requirement-response-evidence.http @@ -0,0 +1,18 @@ +GET /api/2.5/tenders/24660b6d159d42adb6aaba9d978575c7/bids/7d0b2418ff254e1c827ffe021c832900/requirement_responses/77b00a6655054f71af72e8599f27e09e/evidences/55c0261bc0cf47309851f85411a00d0d HTTP/1.0 +Authorization: Bearer token +Host: lb-api-sandbox.prozorro.gov.ua + +Response: 200 OK +Content-Type: application/json; charset=UTF-8 +{ + "data": { + "title": "Update evidence title", + "type": "document", + "relatedDocument": { + "id": "7261f09218de4ce79c11a48d275491e8", + "title": "name.doc" + }, + "id": "55c0261bc0cf47309851f85411a00d0d" + } +} + diff --git a/docs/source/tendering/http/criteria/requirement-response-list.http b/docs/source/tendering/http/criteria/requirement-response-list.http new file mode 100644 index 0000000000..b28a13291c --- /dev/null +++ b/docs/source/tendering/http/criteria/requirement-response-list.http @@ -0,0 +1,32 @@ +GET /api/2.5/tenders/24660b6d159d42adb6aaba9d978575c7/bids/7d0b2418ff254e1c827ffe021c832900/requirement_responses HTTP/1.0 +Authorization: Bearer token +Host: lb-api-sandbox.prozorro.gov.ua + +Response: 200 OK +Content-Type: application/json; charset=UTF-8 +{ + "data": [ + { + "requirement": { + "id": "aa44e48527b84a61a1a157f92d304bac", + "title": "Фізична особа, яка є учасником процедури закупівлі, не була засуджена за злочин, учинений з корисливих мотивів (зокрема, пов'язаний з хабарництвом та відмиванням коштів), судимість з якої знято або погашено у встановленому законом порядку" + }, + "description": "some description", + "title": "Updated title", + "value": "True", + "evidences": [ + { + "title": "Requirement response", + "type": "document", + "relatedDocument": { + "id": "7261f09218de4ce79c11a48d275491e8", + "title": "name.doc" + }, + "id": "80946715cbea46fab59296bd3f808848" + } + ], + "id": "77b00a6655054f71af72e8599f27e09e" + } + ] +} + diff --git a/docs/source/tendering/http/criteria/requirement-response.http b/docs/source/tendering/http/criteria/requirement-response.http new file mode 100644 index 0000000000..f150e230a6 --- /dev/null +++ b/docs/source/tendering/http/criteria/requirement-response.http @@ -0,0 +1,30 @@ +GET /api/2.5/tenders/24660b6d159d42adb6aaba9d978575c7/bids/7d0b2418ff254e1c827ffe021c832900/requirement_responses/77b00a6655054f71af72e8599f27e09e HTTP/1.0 +Authorization: Bearer token +Host: lb-api-sandbox.prozorro.gov.ua + +Response: 200 OK +Content-Type: application/json; charset=UTF-8 +{ + "data": { + "requirement": { + "id": "aa44e48527b84a61a1a157f92d304bac", + "title": "Фізична особа, яка є учасником процедури закупівлі, не була засуджена за злочин, учинений з корисливих мотивів (зокрема, пов'язаний з хабарництвом та відмиванням коштів), судимість з якої знято або погашено у встановленому законом порядку" + }, + "description": "some description", + "title": "Updated title", + "value": "True", + "evidences": [ + { + "title": "Requirement response", + "type": "document", + "relatedDocument": { + "id": "7261f09218de4ce79c11a48d275491e8", + "title": "name.doc" + }, + "id": "80946715cbea46fab59296bd3f808848" + } + ], + "id": "77b00a6655054f71af72e8599f27e09e" + } +} + diff --git a/docs/source/tendering/http/criteria/update-requirement-response-evidence.http b/docs/source/tendering/http/criteria/update-requirement-response-evidence.http new file mode 100644 index 0000000000..7e0017b7c8 --- /dev/null +++ b/docs/source/tendering/http/criteria/update-requirement-response-evidence.http @@ -0,0 +1,26 @@ +PATCH /api/2.5/tenders/24660b6d159d42adb6aaba9d978575c7/bids/7d0b2418ff254e1c827ffe021c832900/requirement_responses/77b00a6655054f71af72e8599f27e09e/evidences/55c0261bc0cf47309851f85411a00d0d?acc_token=f0760e708e124c8fb9f34e562dbf59cf HTTP/1.0 +Authorization: Bearer token +Content-Length: 44 +Content-Type: application/json +Host: lb-api-sandbox.prozorro.gov.ua +DATA: +{ + "data": { + "title": "Update evidence title" + } +} + +Response: 200 OK +Content-Type: application/json; charset=UTF-8 +{ + "data": { + "title": "Update evidence title", + "type": "document", + "relatedDocument": { + "id": "7261f09218de4ce79c11a48d275491e8", + "title": "name.doc" + }, + "id": "55c0261bc0cf47309851f85411a00d0d" + } +} + diff --git a/docs/source/tendering/http/criteria/update-requirement-response.http b/docs/source/tendering/http/criteria/update-requirement-response.http new file mode 100644 index 0000000000..fa0a67dcdb --- /dev/null +++ b/docs/source/tendering/http/criteria/update-requirement-response.http @@ -0,0 +1,38 @@ +PATCH /api/2.5/tenders/24660b6d159d42adb6aaba9d978575c7/bids/7d0b2418ff254e1c827ffe021c832900/requirement_responses/77b00a6655054f71af72e8599f27e09e?acc_token=f0760e708e124c8fb9f34e562dbf59cf HTTP/1.0 +Authorization: Bearer token +Content-Length: 36 +Content-Type: application/json +Host: lb-api-sandbox.prozorro.gov.ua +DATA: +{ + "data": { + "title": "Updated title" + } +} + +Response: 200 OK +Content-Type: application/json; charset=UTF-8 +{ + "data": { + "requirement": { + "id": "aa44e48527b84a61a1a157f92d304bac", + "title": "Фізична особа, яка є учасником процедури закупівлі, не була засуджена за злочин, учинений з корисливих мотивів (зокрема, пов'язаний з хабарництвом та відмиванням коштів), судимість з якої знято або погашено у встановленому законом порядку" + }, + "description": "some description", + "title": "Updated title", + "value": "True", + "evidences": [ + { + "title": "Requirement response", + "type": "document", + "relatedDocument": { + "id": "7261f09218de4ce79c11a48d275491e8", + "title": "name.doc" + }, + "id": "80946715cbea46fab59296bd3f808848" + } + ], + "id": "77b00a6655054f71af72e8599f27e09e" + } +} + diff --git a/docs/source/tendering/http/criteria/update-tender-status-without-criteria.http b/docs/source/tendering/http/criteria/update-tender-status-without-criteria.http new file mode 100644 index 0000000000..535bea595e --- /dev/null +++ b/docs/source/tendering/http/criteria/update-tender-status-without-criteria.http @@ -0,0 +1,25 @@ +PATCH /api/2.5/tenders/fb07ce223a754201a341023b86d832ef?acc_token=056f6edd10e84810b429550ae3a12f86 HTTP/1.0 +Authorization: Bearer broker +Content-Length: 40 +Content-Type: application/json +Host: lb-api-sandbox.prozorro.gov.ua +DATA: +{ + "data": { + "status": "active.tendering" + } +} + +Response: 403 Forbidden +Content-Type: application/json; charset=UTF-8 +{ + "status": "error", + "errors": [ + { + "description": "Tender must contain all 9 `EXCLUSION` criteria", + "location": "body", + "name": "data" + } + ] +} + diff --git a/docs/source/tendering/http/milestones/tender-delete-lot-milestones-error.http b/docs/source/tendering/http/milestones/tender-delete-lot-milestones-error.http index 08b06f8121..d49248f328 100644 --- a/docs/source/tendering/http/milestones/tender-delete-lot-milestones-error.http +++ b/docs/source/tendering/http/milestones/tender-delete-lot-milestones-error.http @@ -1,4 +1,4 @@ -DELETE /api/2.5/tenders/7e23f3f26faf4146af5f668247cf04f4/lots/db096b31c7ef4b2e95516f47a34a07e1?acc_token=1fa15f3780344958b25159593e9b4836 HTTP/1.0 +DELETE /api/2.5/tenders/7e23f3f26faf4146af5f668247cf04f4/lots/7d4acdfde1b44eca8454e96734f0588c?acc_token=1fa15f3780344958b25159593e9b4836 HTTP/1.0 Authorization: Bearer broker Content-Length: 0 Host: lb-api-sandbox.prozorro.gov.ua diff --git a/docs/source/tendering/http/milestones/tender-patch-lot-milestones.http b/docs/source/tendering/http/milestones/tender-patch-lot-milestones.http index 03586f1de3..4739bad6b8 100644 --- a/docs/source/tendering/http/milestones/tender-patch-lot-milestones.http +++ b/docs/source/tendering/http/milestones/tender-patch-lot-milestones.http @@ -8,10 +8,10 @@ DATA: "data": { "milestones": [ { - "relatedLot": "db096b31c7ef4b2e95516f47a34a07e1" + "relatedLot": "7d4acdfde1b44eca8454e96734f0588c" }, { - "relatedLot": "db096b31c7ef4b2e95516f47a34a07e1" + "relatedLot": "7d4acdfde1b44eca8454e96734f0588c" } ] } @@ -25,7 +25,7 @@ Content-Type: application/json; charset=UTF-8 "status": "active.enquiries", "milestones": [ { - "relatedLot": "db096b31c7ef4b2e95516f47a34a07e1", + "relatedLot": "7d4acdfde1b44eca8454e96734f0588c", "code": "prepayment", "sequenceNumber": 0, "title": "signingTheContract", @@ -35,10 +35,10 @@ Content-Type: application/json; charset=UTF-8 }, "percentage": 45.55, "type": "financing", - "id": "9cdfea22b0b04b33b1a653ad1301c648" + "id": "fefc9f6e15a84b86b2fddc14f6591d99" }, { - "relatedLot": "db096b31c7ef4b2e95516f47a34a07e1", + "relatedLot": "7d4acdfde1b44eca8454e96734f0588c", "code": "postpayment", "description": "Підозрілий опис", "sequenceNumber": 1, @@ -49,7 +49,7 @@ Content-Type: application/json; charset=UTF-8 }, "percentage": 54.45, "type": "financing", - "id": "3381cdf128b840cf9921a72eaa4f3c56" + "id": "38783ac1487a4f55abd2e61b58497e22" } ], "mainProcurementCategory": "goods", @@ -60,7 +60,7 @@ Content-Type: application/json; charset=UTF-8 "title": "футляри до державних нагород", "minimalStep": { "currency": "UAH", - "amount": 35.0, + "amount": 15.0, "valueAddedTaxIncluded": true }, "items": [ @@ -89,7 +89,7 @@ Content-Type: application/json; charset=UTF-8 "startDate": "2020-05-17T01:00:00+03:00", "endDate": "2020-05-20T01:00:00+03:00" }, - "id": "6b281007ddb54da29dcfbfae47a3b1ad", + "id": "59416cdafac94b998fbf6bdec61facf2", "unit": { "code": "44617100-9", "name": "item" @@ -141,7 +141,7 @@ Content-Type: application/json; charset=UTF-8 "title": "lot title", "minimalStep": { "currency": "UAH", - "amount": 35.0, + "amount": 15.0, "valueAddedTaxIncluded": true }, "value": { @@ -150,7 +150,7 @@ Content-Type: application/json; charset=UTF-8 "valueAddedTaxIncluded": true }, "date": "2020-05-15T01:00:00+03:00", - "id": "db096b31c7ef4b2e95516f47a34a07e1" + "id": "7d4acdfde1b44eca8454e96734f0588c" } ], "id": "7e23f3f26faf4146af5f668247cf04f4", diff --git a/docs/source/tendering/http/milestones/tender-patch-milestones.http b/docs/source/tendering/http/milestones/tender-patch-milestones.http index 9c100f64f6..c11b13037d 100644 --- a/docs/source/tendering/http/milestones/tender-patch-milestones.http +++ b/docs/source/tendering/http/milestones/tender-patch-milestones.http @@ -33,7 +33,7 @@ Content-Type: application/json; charset=UTF-8 }, "percentage": 45.55, "type": "financing", - "id": "9cdfea22b0b04b33b1a653ad1301c648" + "id": "fefc9f6e15a84b86b2fddc14f6591d99" }, { "code": "postpayment", @@ -46,7 +46,7 @@ Content-Type: application/json; charset=UTF-8 }, "percentage": 54.45, "type": "financing", - "id": "3381cdf128b840cf9921a72eaa4f3c56" + "id": "38783ac1487a4f55abd2e61b58497e22" } ], "mainProcurementCategory": "goods", @@ -57,7 +57,7 @@ Content-Type: application/json; charset=UTF-8 "title": "футляри до державних нагород", "minimalStep": { "currency": "UAH", - "amount": 35.0, + "amount": 15.0, "valueAddedTaxIncluded": true }, "items": [ @@ -86,7 +86,7 @@ Content-Type: application/json; charset=UTF-8 "startDate": "2020-05-17T01:00:00+03:00", "endDate": "2020-05-20T01:00:00+03:00" }, - "id": "6b281007ddb54da29dcfbfae47a3b1ad", + "id": "59416cdafac94b998fbf6bdec61facf2", "unit": { "code": "44617100-9", "name": "item" diff --git a/docs/source/tendering/http/milestones/tender-post-milestones.http b/docs/source/tendering/http/milestones/tender-post-milestones.http index 9d57f001c7..e3f55f7d37 100644 --- a/docs/source/tendering/http/milestones/tender-post-milestones.http +++ b/docs/source/tendering/http/milestones/tender-post-milestones.http @@ -37,7 +37,7 @@ DATA: "title": "футляри до державних нагород", "minimalStep": { "currency": "UAH", - "amount": 35 + "amount": 15 }, "enquiryPeriod": { "endDate": "2020-05-22T01:00:00+03:00" @@ -126,7 +126,7 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/7e23f3f26faf4146 }, "percentage": 45.55, "type": "financing", - "id": "9cdfea22b0b04b33b1a653ad1301c648" + "id": "fefc9f6e15a84b86b2fddc14f6591d99" }, { "code": "postpayment", @@ -138,7 +138,7 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/7e23f3f26faf4146 }, "percentage": 54.45, "type": "financing", - "id": "3381cdf128b840cf9921a72eaa4f3c56" + "id": "38783ac1487a4f55abd2e61b58497e22" } ], "mainProcurementCategory": "goods", @@ -149,7 +149,7 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/7e23f3f26faf4146 "title": "футляри до державних нагород", "minimalStep": { "currency": "UAH", - "amount": 35.0, + "amount": 15.0, "valueAddedTaxIncluded": true }, "items": [ @@ -178,7 +178,7 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/7e23f3f26faf4146 "startDate": "2020-05-17T01:00:00+03:00", "endDate": "2020-05-20T01:00:00+03:00" }, - "id": "6b281007ddb54da29dcfbfae47a3b1ad", + "id": "59416cdafac94b998fbf6bdec61facf2", "unit": { "code": "44617100-9", "name": "item" diff --git a/docs/source/tendering/http/tutorial/activate-bidder.http b/docs/source/tendering/http/tutorial/activate-bidder.http index 8678e02484..df2fb070ea 100644 --- a/docs/source/tendering/http/tutorial/activate-bidder.http +++ b/docs/source/tendering/http/tutorial/activate-bidder.http @@ -1,4 +1,4 @@ -PATCH /api/2.5/tenders/bc3a9016b29d4fed894cc62d3ff59680/bids/b31ec66637a141c7bb03446a0f22f5dc?acc_token=7a7e299c46ba4430a2a63af9bf91af30 HTTP/1.0 +PATCH /api/2.5/tenders/bc3a9016b29d4fed894cc62d3ff59680/bids/74c272933f3046b0a4cdcc7036b67323?acc_token=7a7e299c46ba4430a2a63af9bf91af30 HTTP/1.0 Authorization: Bearer broker Content-Length: 30 Content-Type: application/json @@ -16,7 +16,7 @@ Content-Type: application/json; charset=UTF-8 "data": { "date": "2020-05-15T01:00:01+03:00", "status": "active", - "id": "b31ec66637a141c7bb03446a0f22f5dc", + "id": "74c272933f3046b0a4cdcc7036b67323", "value": { "currency": "UAH", "amount": 500.0, diff --git a/docs/source/tendering/http/tutorial/active-cancellation.http b/docs/source/tendering/http/tutorial/active-cancellation.http index efa8f1247d..df074bffcd 100644 --- a/docs/source/tendering/http/tutorial/active-cancellation.http +++ b/docs/source/tendering/http/tutorial/active-cancellation.http @@ -1,4 +1,4 @@ -PATCH /api/2.5/tenders/bc3a9016b29d4fed894cc62d3ff59680/cancellations/d4d0fafa7fbf40b8b171adc3651ed356?acc_token=e6bb69a4c5474e4987130585951b6f3e HTTP/1.0 +PATCH /api/2.5/tenders/bc3a9016b29d4fed894cc62d3ff59680/cancellations/442eab37b845408d81ed635c8d8ebadb?acc_token=e6bb69a4c5474e4987130585951b6f3e HTTP/1.0 Authorization: Bearer broker Content-Length: 30 Content-Type: application/json @@ -24,7 +24,7 @@ Content-Type: application/json; charset=UTF-8 "format": "application/pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:03+03:00", - "id": "2c95fa8b548444c08d8575bfc95f0bea", + "id": "ada2083ffec749c5ae3c8fc110e1fb3b", "dateModified": "2020-05-15T01:00:03+03:00" }, { @@ -35,7 +35,7 @@ Content-Type: application/json; charset=UTF-8 "format": "application/pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:03+03:00", - "id": "2c95fa8b548444c08d8575bfc95f0bea", + "id": "ada2083ffec749c5ae3c8fc110e1fb3b", "dateModified": "2020-05-15T01:00:03+03:00" } ], @@ -43,7 +43,7 @@ Content-Type: application/json; charset=UTF-8 "reasonType": "noDemand", "date": "2020-05-15T01:00:03+03:00", "cancellationOf": "tender", - "id": "d4d0fafa7fbf40b8b171adc3651ed356" + "id": "442eab37b845408d81ed635c8d8ebadb" } } diff --git a/docs/source/tendering/http/tutorial/answer-question.http b/docs/source/tendering/http/tutorial/answer-question.http index 5aab6b21ad..1d928117e3 100644 --- a/docs/source/tendering/http/tutorial/answer-question.http +++ b/docs/source/tendering/http/tutorial/answer-question.http @@ -1,4 +1,4 @@ -PATCH /api/2.5/tenders/bc3a9016b29d4fed894cc62d3ff59680/questions/2758aa9c71374230ab34f91ac85d72c1?acc_token=e6bb69a4c5474e4987130585951b6f3e HTTP/1.0 +PATCH /api/2.5/tenders/bc3a9016b29d4fed894cc62d3ff59680/questions/3f751fcae5fa40be86e8b38392376e1c?acc_token=e6bb69a4c5474e4987130585951b6f3e HTTP/1.0 Authorization: Bearer broker Content-Length: 162 Content-Type: application/json @@ -19,7 +19,7 @@ Content-Type: application/json; charset=UTF-8 "title": "Калорійність", "date": "2020-05-15T01:00:01+03:00", "answer": "Таблицю додано в файлі \"Kalorijnist.xslx\"", - "id": "2758aa9c71374230ab34f91ac85d72c1", + "id": "3f751fcae5fa40be86e8b38392376e1c", "questionOf": "tender" } } diff --git a/docs/source/tendering/http/tutorial/ask-question.http b/docs/source/tendering/http/tutorial/ask-question.http index bec1d5cb76..2db3a3834a 100644 --- a/docs/source/tendering/http/tutorial/ask-question.http +++ b/docs/source/tendering/http/tutorial/ask-question.http @@ -33,7 +33,7 @@ DATA: Response: 201 Created Content-Type: application/json; charset=UTF-8 -Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/bc3a9016b29d4fed894cc62d3ff59680/questions/2758aa9c71374230ab34f91ac85d72c1 +Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/bc3a9016b29d4fed894cc62d3ff59680/questions/3f751fcae5fa40be86e8b38392376e1c { "data": { "description": "Просимо додати таблицю потрібної калорійності харчування", @@ -59,7 +59,7 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/bc3a9016b29d4fed }, "title": "Калорійність", "date": "2020-05-15T01:00:01+03:00", - "id": "2758aa9c71374230ab34f91ac85d72c1", + "id": "3f751fcae5fa40be86e8b38392376e1c", "questionOf": "tender" } } diff --git a/docs/source/tendering/http/tutorial/auction-url.http b/docs/source/tendering/http/tutorial/auction-url.http index 7318d0bce5..dc24b3bed8 100644 --- a/docs/source/tendering/http/tutorial/auction-url.http +++ b/docs/source/tendering/http/tutorial/auction-url.http @@ -67,7 +67,7 @@ Content-Type: application/json; charset=UTF-8 "title": "Калорійність", "date": "2020-05-15T01:00:01+03:00", "answer": "Таблицю додано в файлі \"Kalorijnist.xslx\"", - "id": "2758aa9c71374230ab34f91ac85d72c1", + "id": "3f751fcae5fa40be86e8b38392376e1c", "questionOf": "tender" } ], @@ -88,7 +88,7 @@ Content-Type: application/json; charset=UTF-8 "datePublished": "2020-05-15T01:00:01+03:00", "author": "tender_owner", "documentType": "technicalSpecifications", - "id": "8a3d30101dc94ca58f768bec6a1f45dd", + "id": "8924acf921d645b7bce35748c4f9e237", "dateModified": "2020-05-15T01:00:01+03:00" }, { @@ -99,7 +99,7 @@ Content-Type: application/json; charset=UTF-8 "format": "application/pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:01+03:00", - "id": "90a4fef3a0f545f4807445bbd4017f29", + "id": "f05f28fd104147beb09d8b4f7bbcbd2b", "dateModified": "2020-05-15T01:00:01+03:00" }, { @@ -110,7 +110,7 @@ Content-Type: application/json; charset=UTF-8 "format": "application/pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:01+03:00", - "id": "90a4fef3a0f545f4807445bbd4017f29", + "id": "f05f28fd104147beb09d8b4f7bbcbd2b", "dateModified": "2020-05-15T01:00:01+03:00" } ], @@ -151,12 +151,12 @@ Content-Type: application/json; charset=UTF-8 }, "percentage": 54.45, "type": "financing", - "id": "bbe57ebfab144c58adb7ed673a73b0aa" + "id": "af069a25c8f94e74a8b2428b51bcd1a7" } ], "minimalStep": { "currency": "UAH", - "amount": 35.0, + "amount": 15.0, "valueAddedTaxIncluded": true }, "items": [ @@ -185,7 +185,7 @@ Content-Type: application/json; charset=UTF-8 "startDate": "2020-05-17T01:00:00+03:00", "endDate": "2020-05-20T01:00:00+03:00" }, - "id": "22efe85457d041aab3bc5a64aae6be0f", + "id": "53de0c90af0e430ea270c5970351ba0c", "unit": { "code": "44617100-9", "name": "item" diff --git a/docs/source/tendering/http/tutorial/bidder-documents.http b/docs/source/tendering/http/tutorial/bidder-documents.http index 0af6b0efe8..fe22a692f6 100644 --- a/docs/source/tendering/http/tutorial/bidder-documents.http +++ b/docs/source/tendering/http/tutorial/bidder-documents.http @@ -1,4 +1,4 @@ -GET /api/2.5/tenders/bc3a9016b29d4fed894cc62d3ff59680/bids/b31ec66637a141c7bb03446a0f22f5dc/documents?acc_token=7a7e299c46ba4430a2a63af9bf91af30 HTTP/1.0 +GET /api/2.5/tenders/bc3a9016b29d4fed894cc62d3ff59680/bids/74c272933f3046b0a4cdcc7036b67323/documents?acc_token=7a7e299c46ba4430a2a63af9bf91af30 HTTP/1.0 Authorization: Bearer broker Host: lb-api-sandbox.prozorro.gov.ua @@ -9,11 +9,11 @@ Content-Type: application/json; charset=UTF-8 { "hash": "md5:00000000000000000000000000000000", "title": "Proposal.pdf", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/bc3a9016b29d4fed894cc62d3ff59680/bids/b31ec66637a141c7bb03446a0f22f5dc/documents/86cd9a1b304d4530852984610d67c933?download=748412273ae54b27a3606febdfe1bc93", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/bc3a9016b29d4fed894cc62d3ff59680/bids/74c272933f3046b0a4cdcc7036b67323/documents/a37bf33d76374160ba0da18168a744ca?download=748412273ae54b27a3606febdfe1bc93", "format": "application/pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:01+03:00", - "id": "86cd9a1b304d4530852984610d67c933", + "id": "a37bf33d76374160ba0da18168a744ca", "dateModified": "2020-05-15T01:00:01+03:00" } ] diff --git a/docs/source/tendering/http/tutorial/bidder-participation-url.http b/docs/source/tendering/http/tutorial/bidder-participation-url.http index df5c3d33a2..dbe3f3420d 100644 --- a/docs/source/tendering/http/tutorial/bidder-participation-url.http +++ b/docs/source/tendering/http/tutorial/bidder-participation-url.http @@ -1,4 +1,4 @@ -GET /api/2.5/tenders/bc3a9016b29d4fed894cc62d3ff59680/bids/b31ec66637a141c7bb03446a0f22f5dc?acc_token=7a7e299c46ba4430a2a63af9bf91af30 HTTP/1.0 +GET /api/2.5/tenders/bc3a9016b29d4fed894cc62d3ff59680/bids/74c272933f3046b0a4cdcc7036b67323?acc_token=7a7e299c46ba4430a2a63af9bf91af30 HTTP/1.0 Authorization: Bearer broker Host: lb-api-sandbox.prozorro.gov.ua @@ -11,11 +11,11 @@ Content-Type: application/json; charset=UTF-8 { "hash": "md5:00000000000000000000000000000000", "title": "Proposal.pdf", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/bc3a9016b29d4fed894cc62d3ff59680/bids/b31ec66637a141c7bb03446a0f22f5dc/documents/86cd9a1b304d4530852984610d67c933?download=748412273ae54b27a3606febdfe1bc93", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/bc3a9016b29d4fed894cc62d3ff59680/bids/74c272933f3046b0a4cdcc7036b67323/documents/a37bf33d76374160ba0da18168a744ca?download=748412273ae54b27a3606febdfe1bc93", "format": "application/pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:01+03:00", - "id": "86cd9a1b304d4530852984610d67c933", + "id": "a37bf33d76374160ba0da18168a744ca", "dateModified": "2020-05-15T01:00:01+03:00" } ], @@ -48,8 +48,8 @@ Content-Type: application/json; charset=UTF-8 } ], "date": "2020-05-15T01:00:01+03:00", - "id": "b31ec66637a141c7bb03446a0f22f5dc", - "participationUrl": "http://auction-sandbox.prozorro.gov.ua/tenders/bc3a9016b29d4fed894cc62d3ff59680?key_for_bid=b31ec66637a141c7bb03446a0f22f5dc" + "id": "74c272933f3046b0a4cdcc7036b67323", + "participationUrl": "http://auction-sandbox.prozorro.gov.ua/tenders/bc3a9016b29d4fed894cc62d3ff59680?key_for_bid=74c272933f3046b0a4cdcc7036b67323" } } diff --git a/docs/source/tendering/http/tutorial/bidder2-participation-url.http b/docs/source/tendering/http/tutorial/bidder2-participation-url.http index 176649e97f..26d5536338 100644 --- a/docs/source/tendering/http/tutorial/bidder2-participation-url.http +++ b/docs/source/tendering/http/tutorial/bidder2-participation-url.http @@ -1,4 +1,4 @@ -GET /api/2.5/tenders/bc3a9016b29d4fed894cc62d3ff59680/bids/694f980947ff4d0b870d9a18384f23fe?acc_token=cfa7d625bdd049c79e3dfa84d8835a53 HTTP/1.0 +GET /api/2.5/tenders/bc3a9016b29d4fed894cc62d3ff59680/bids/b55f6c618ce54efe885dd3202eff3e94?acc_token=cfa7d625bdd049c79e3dfa84d8835a53 HTTP/1.0 Authorization: Bearer broker Host: lb-api-sandbox.prozorro.gov.ua @@ -11,21 +11,21 @@ Content-Type: application/json; charset=UTF-8 { "hash": "md5:00000000000000000000000000000000", "title": "Proposal_part1.pdf", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/bc3a9016b29d4fed894cc62d3ff59680/bids/694f980947ff4d0b870d9a18384f23fe/documents/ce114f673cf14b039c1ee9705b07c00b?download=9152e77768004ab1ba6b843902ac3f12", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/bc3a9016b29d4fed894cc62d3ff59680/bids/b55f6c618ce54efe885dd3202eff3e94/documents/22691d63a4694ac18fa7317ebd185da1?download=9152e77768004ab1ba6b843902ac3f12", "format": "application/pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:01+03:00", - "id": "ce114f673cf14b039c1ee9705b07c00b", + "id": "22691d63a4694ac18fa7317ebd185da1", "dateModified": "2020-05-15T01:00:01+03:00" }, { "hash": "md5:00000000000000000000000000000000", "title": "Proposal_part2.pdf", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/bc3a9016b29d4fed894cc62d3ff59680/bids/694f980947ff4d0b870d9a18384f23fe/documents/8baccb56ed4a44a18ef4c13ef8a4094b?download=99993315a2cd472f9387941fe22ee6d5", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/bc3a9016b29d4fed894cc62d3ff59680/bids/b55f6c618ce54efe885dd3202eff3e94/documents/7c11a21581814a23ae4a7e83dd30ae10?download=99993315a2cd472f9387941fe22ee6d5", "format": "application/pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:01+03:00", - "id": "8baccb56ed4a44a18ef4c13ef8a4094b", + "id": "7c11a21581814a23ae4a7e83dd30ae10", "dateModified": "2020-05-15T01:00:01+03:00" } ], @@ -58,8 +58,8 @@ Content-Type: application/json; charset=UTF-8 } ], "date": "2020-05-15T01:00:01+03:00", - "id": "694f980947ff4d0b870d9a18384f23fe", - "participationUrl": "http://auction-sandbox.prozorro.gov.ua/tenders/bc3a9016b29d4fed894cc62d3ff59680?key_for_bid=694f980947ff4d0b870d9a18384f23fe" + "id": "b55f6c618ce54efe885dd3202eff3e94", + "participationUrl": "http://auction-sandbox.prozorro.gov.ua/tenders/bc3a9016b29d4fed894cc62d3ff59680?key_for_bid=b55f6c618ce54efe885dd3202eff3e94" } } diff --git a/docs/source/tendering/http/tutorial/blank-tender-view.http b/docs/source/tendering/http/tutorial/blank-tender-view.http index 68d9464556..21fc88cd0e 100644 --- a/docs/source/tendering/http/tutorial/blank-tender-view.http +++ b/docs/source/tendering/http/tutorial/blank-tender-view.http @@ -31,7 +31,7 @@ Content-Type: application/json; charset=UTF-8 }, "percentage": 54.45, "type": "financing", - "id": "bbe57ebfab144c58adb7ed673a73b0aa" + "id": "af069a25c8f94e74a8b2428b51bcd1a7" } ], "mainProcurementCategory": "goods", @@ -42,7 +42,7 @@ Content-Type: application/json; charset=UTF-8 "title": "футляри до державних нагород", "minimalStep": { "currency": "UAH", - "amount": 35.0, + "amount": 15.0, "valueAddedTaxIncluded": true }, "items": [ @@ -71,7 +71,7 @@ Content-Type: application/json; charset=UTF-8 "startDate": "2020-05-17T01:00:00+03:00", "endDate": "2020-05-20T01:00:00+03:00" }, - "id": "22efe85457d041aab3bc5a64aae6be0f", + "id": "53de0c90af0e430ea270c5970351ba0c", "unit": { "code": "44617100-9", "name": "item" diff --git a/docs/source/tendering/http/tutorial/confirm-qualification.http b/docs/source/tendering/http/tutorial/confirm-qualification.http index bc9651e7c9..e3174431e7 100644 --- a/docs/source/tendering/http/tutorial/confirm-qualification.http +++ b/docs/source/tendering/http/tutorial/confirm-qualification.http @@ -17,7 +17,7 @@ Content-Type: application/json; charset=UTF-8 "status": "active", "complaintPeriod": { "startDate": "2020-05-15T01:00:01+03:00", - "endDate": "2020-05-19T01:00:01+03:00" + "endDate": "2020-05-20T00:00:00+03:00" }, "suppliers": [ { @@ -42,7 +42,7 @@ Content-Type: application/json; charset=UTF-8 } } ], - "bid_id": "694f980947ff4d0b870d9a18384f23fe", + "bid_id": "b55f6c618ce54efe885dd3202eff3e94", "value": { "currency": "UAH", "amount": 499.0, diff --git a/docs/source/tendering/http/tutorial/create-tender-funders.http b/docs/source/tendering/http/tutorial/create-tender-funders.http index 9ce817e382..e7def0cbff 100644 --- a/docs/source/tendering/http/tutorial/create-tender-funders.http +++ b/docs/source/tendering/http/tutorial/create-tender-funders.http @@ -63,7 +63,7 @@ DATA: "title": "футляри до державних нагород", "minimalStep": { "currency": "UAH", - "amount": 35 + "amount": 15 }, "enquiryPeriod": { "endDate": "2020-05-22T01:00:00+03:00" @@ -187,7 +187,7 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/360cfcaeb0ec4394 }, "percentage": 54.45, "type": "financing", - "id": "36d7453f44f946aaa956606dc3a7ce93" + "id": "94f9e1dd7ea74d2a99d4eff7a488a4a4" } ], "mainProcurementCategory": "goods", @@ -198,7 +198,7 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/360cfcaeb0ec4394 "title": "футляри до державних нагород", "minimalStep": { "currency": "UAH", - "amount": 35.0, + "amount": 15.0, "valueAddedTaxIncluded": true }, "items": [ @@ -227,7 +227,7 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/360cfcaeb0ec4394 "startDate": "2020-05-17T01:00:00+03:00", "endDate": "2020-05-20T01:00:00+03:00" }, - "id": "f29295604e5b42178da6d508e78e5cb0", + "id": "e36f862d48e0411c8390ea7a8811c0de", "unit": { "code": "44617100-9", "name": "item" diff --git a/docs/source/tendering/http/tutorial/create-tender-procuringEntity.http b/docs/source/tendering/http/tutorial/create-tender-procuringEntity.http index 59462f5950..63d2d9350c 100644 --- a/docs/source/tendering/http/tutorial/create-tender-procuringEntity.http +++ b/docs/source/tendering/http/tutorial/create-tender-procuringEntity.http @@ -254,7 +254,7 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/17edf8a737ff45e1 }, "percentage": 54.45, "type": "financing", - "id": "31111cc8fac44ba1aa05f63d81e03e5a" + "id": "bd1562f18e7845369bf252e44b20d082" } ], "minimalStep": { diff --git a/docs/source/tendering/http/tutorial/get-answer.http b/docs/source/tendering/http/tutorial/get-answer.http index ef31e3a209..77fb46dce9 100644 --- a/docs/source/tendering/http/tutorial/get-answer.http +++ b/docs/source/tendering/http/tutorial/get-answer.http @@ -1,4 +1,4 @@ -GET /api/2.5/tenders/bc3a9016b29d4fed894cc62d3ff59680/questions/2758aa9c71374230ab34f91ac85d72c1 HTTP/1.0 +GET /api/2.5/tenders/bc3a9016b29d4fed894cc62d3ff59680/questions/3f751fcae5fa40be86e8b38392376e1c HTTP/1.0 Authorization: Bearer broker Host: lb-api-sandbox.prozorro.gov.ua @@ -11,7 +11,7 @@ Content-Type: application/json; charset=UTF-8 "title": "Калорійність", "date": "2020-05-15T01:00:01+03:00", "answer": "Таблицю додано в файлі \"Kalorijnist.xslx\"", - "id": "2758aa9c71374230ab34f91ac85d72c1", + "id": "3f751fcae5fa40be86e8b38392376e1c", "questionOf": "tender" } } diff --git a/docs/source/tendering/http/tutorial/list-question.http b/docs/source/tendering/http/tutorial/list-question.http index c02f36e2b3..8894166666 100644 --- a/docs/source/tendering/http/tutorial/list-question.http +++ b/docs/source/tendering/http/tutorial/list-question.http @@ -12,7 +12,7 @@ Content-Type: application/json; charset=UTF-8 "title": "Калорійність", "date": "2020-05-15T01:00:01+03:00", "answer": "Таблицю додано в файлі \"Kalorijnist.xslx\"", - "id": "2758aa9c71374230ab34f91ac85d72c1", + "id": "3f751fcae5fa40be86e8b38392376e1c", "questionOf": "tender" } ] diff --git a/docs/source/tendering/http/tutorial/patch-cancellation.http b/docs/source/tendering/http/tutorial/patch-cancellation.http index 4ad3ae6d85..31a8d5db29 100644 --- a/docs/source/tendering/http/tutorial/patch-cancellation.http +++ b/docs/source/tendering/http/tutorial/patch-cancellation.http @@ -1,4 +1,4 @@ -PATCH /api/2.5/tenders/bc3a9016b29d4fed894cc62d3ff59680/cancellations/d4d0fafa7fbf40b8b171adc3651ed356/documents/2c95fa8b548444c08d8575bfc95f0bea?acc_token=e6bb69a4c5474e4987130585951b6f3e HTTP/1.0 +PATCH /api/2.5/tenders/bc3a9016b29d4fed894cc62d3ff59680/cancellations/442eab37b845408d81ed635c8d8ebadb/documents/ada2083ffec749c5ae3c8fc110e1fb3b?acc_token=e6bb69a4c5474e4987130585951b6f3e HTTP/1.0 Authorization: Bearer broker Content-Length: 48 Content-Type: application/json @@ -21,7 +21,7 @@ Content-Type: application/json; charset=UTF-8 "format": "application/pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:03+03:00", - "id": "2c95fa8b548444c08d8575bfc95f0bea", + "id": "ada2083ffec749c5ae3c8fc110e1fb3b", "dateModified": "2020-05-15T01:00:03+03:00" } } diff --git a/docs/source/tendering/http/tutorial/patch-items-value-periods.http b/docs/source/tendering/http/tutorial/patch-items-value-periods.http index a8ad100b22..378cb87e87 100644 --- a/docs/source/tendering/http/tutorial/patch-items-value-periods.http +++ b/docs/source/tendering/http/tutorial/patch-items-value-periods.http @@ -41,7 +41,7 @@ Content-Type: application/json; charset=UTF-8 }, "percentage": 54.45, "type": "financing", - "id": "bbe57ebfab144c58adb7ed673a73b0aa" + "id": "af069a25c8f94e74a8b2428b51bcd1a7" } ], "mainProcurementCategory": "goods", @@ -52,7 +52,7 @@ Content-Type: application/json; charset=UTF-8 "title": "футляри до державних нагород", "minimalStep": { "currency": "UAH", - "amount": 35.0, + "amount": 15.0, "valueAddedTaxIncluded": true }, "items": [ @@ -81,7 +81,7 @@ Content-Type: application/json; charset=UTF-8 "startDate": "2020-05-17T01:00:00+03:00", "endDate": "2020-05-20T01:00:00+03:00" }, - "id": "22efe85457d041aab3bc5a64aae6be0f", + "id": "53de0c90af0e430ea270c5970351ba0c", "unit": { "code": "44617100-9", "name": "item" diff --git a/docs/source/tendering/http/tutorial/patch-tender-funders.http b/docs/source/tendering/http/tutorial/patch-tender-funders.http index 70f411f98d..47de2c4d95 100644 --- a/docs/source/tendering/http/tutorial/patch-tender-funders.http +++ b/docs/source/tendering/http/tutorial/patch-tender-funders.http @@ -86,7 +86,7 @@ Content-Type: application/json; charset=UTF-8 }, "percentage": 54.45, "type": "financing", - "id": "bbe57ebfab144c58adb7ed673a73b0aa" + "id": "af069a25c8f94e74a8b2428b51bcd1a7" } ], "mainProcurementCategory": "goods", @@ -97,7 +97,7 @@ Content-Type: application/json; charset=UTF-8 "title": "футляри до державних нагород", "minimalStep": { "currency": "UAH", - "amount": 35.0, + "amount": 15.0, "valueAddedTaxIncluded": true }, "items": [ @@ -126,7 +126,7 @@ Content-Type: application/json; charset=UTF-8 "startDate": "2020-05-17T01:00:00+03:00", "endDate": "2020-05-20T01:00:00+03:00" }, - "id": "22efe85457d041aab3bc5a64aae6be0f", + "id": "53de0c90af0e430ea270c5970351ba0c", "unit": { "code": "44617100-9", "name": "item" diff --git a/docs/source/tendering/http/tutorial/prepare-cancellation.http b/docs/source/tendering/http/tutorial/prepare-cancellation.http index 83b1ef3d2e..4904854ddc 100644 --- a/docs/source/tendering/http/tutorial/prepare-cancellation.http +++ b/docs/source/tendering/http/tutorial/prepare-cancellation.http @@ -13,7 +13,7 @@ DATA: Response: 201 Created Content-Type: application/json; charset=UTF-8 -Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/bc3a9016b29d4fed894cc62d3ff59680/cancellations/d4d0fafa7fbf40b8b171adc3651ed356 +Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/bc3a9016b29d4fed894cc62d3ff59680/cancellations/442eab37b845408d81ed635c8d8ebadb { "data": { "status": "draft", @@ -21,7 +21,7 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/bc3a9016b29d4fed "reasonType": "noDemand", "date": "2020-05-15T01:00:03+03:00", "cancellationOf": "tender", - "id": "d4d0fafa7fbf40b8b171adc3651ed356" + "id": "442eab37b845408d81ed635c8d8ebadb" } } diff --git a/docs/source/tendering/http/tutorial/register-2nd-bidder.http b/docs/source/tendering/http/tutorial/register-2nd-bidder.http index 85e3e5c642..a31b0975dc 100644 --- a/docs/source/tendering/http/tutorial/register-2nd-bidder.http +++ b/docs/source/tendering/http/tutorial/register-2nd-bidder.http @@ -51,7 +51,7 @@ DATA: Response: 201 Created Content-Type: application/json; charset=UTF-8 -Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/bc3a9016b29d4fed894cc62d3ff59680/bids/694f980947ff4d0b870d9a18384f23fe +Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/bc3a9016b29d4fed894cc62d3ff59680/bids/b55f6c618ce54efe885dd3202eff3e94 { "access": { "transfer": "8992310021484143abd2c8a8f5e7a13a", @@ -63,21 +63,21 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/bc3a9016b29d4fed { "hash": "md5:00000000000000000000000000000000", "title": "Proposal_part1.pdf", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/bc3a9016b29d4fed894cc62d3ff59680/bids/694f980947ff4d0b870d9a18384f23fe/documents/ce114f673cf14b039c1ee9705b07c00b?download=9152e77768004ab1ba6b843902ac3f12", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/bc3a9016b29d4fed894cc62d3ff59680/bids/b55f6c618ce54efe885dd3202eff3e94/documents/22691d63a4694ac18fa7317ebd185da1?download=9152e77768004ab1ba6b843902ac3f12", "format": "application/pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:01+03:00", - "id": "ce114f673cf14b039c1ee9705b07c00b", + "id": "22691d63a4694ac18fa7317ebd185da1", "dateModified": "2020-05-15T01:00:01+03:00" }, { "hash": "md5:00000000000000000000000000000000", "title": "Proposal_part2.pdf", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/bc3a9016b29d4fed894cc62d3ff59680/bids/694f980947ff4d0b870d9a18384f23fe/documents/8baccb56ed4a44a18ef4c13ef8a4094b?download=99993315a2cd472f9387941fe22ee6d5", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/bc3a9016b29d4fed894cc62d3ff59680/bids/b55f6c618ce54efe885dd3202eff3e94/documents/7c11a21581814a23ae4a7e83dd30ae10?download=99993315a2cd472f9387941fe22ee6d5", "format": "application/pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:01+03:00", - "id": "8baccb56ed4a44a18ef4c13ef8a4094b", + "id": "7c11a21581814a23ae4a7e83dd30ae10", "dateModified": "2020-05-15T01:00:01+03:00" } ], @@ -110,7 +110,7 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/bc3a9016b29d4fed } ], "date": "2020-05-15T01:00:01+03:00", - "id": "694f980947ff4d0b870d9a18384f23fe" + "id": "b55f6c618ce54efe885dd3202eff3e94" } } diff --git a/docs/source/tendering/http/tutorial/register-bidder.http b/docs/source/tendering/http/tutorial/register-bidder.http index 31ae0ef0c4..3d5258899e 100644 --- a/docs/source/tendering/http/tutorial/register-bidder.http +++ b/docs/source/tendering/http/tutorial/register-bidder.http @@ -38,7 +38,7 @@ DATA: Response: 201 Created Content-Type: application/json; charset=UTF-8 -Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/bc3a9016b29d4fed894cc62d3ff59680/bids/b31ec66637a141c7bb03446a0f22f5dc +Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/bc3a9016b29d4fed894cc62d3ff59680/bids/74c272933f3046b0a4cdcc7036b67323 { "access": { "transfer": "60daccc06c3b4e6e99bdc2cab5c0cf3b", @@ -47,7 +47,7 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/bc3a9016b29d4fed "data": { "date": "2020-05-15T01:00:01+03:00", "status": "draft", - "id": "b31ec66637a141c7bb03446a0f22f5dc", + "id": "74c272933f3046b0a4cdcc7036b67323", "value": { "currency": "UAH", "amount": 500.0, diff --git a/docs/source/tendering/http/tutorial/set-bid-guarantee.http b/docs/source/tendering/http/tutorial/set-bid-guarantee.http index 4a0c50c1a2..c505e1f4a5 100644 --- a/docs/source/tendering/http/tutorial/set-bid-guarantee.http +++ b/docs/source/tendering/http/tutorial/set-bid-guarantee.http @@ -109,12 +109,12 @@ Content-Type: application/json; charset=UTF-8 }, "percentage": 54.45, "type": "financing", - "id": "bbe57ebfab144c58adb7ed673a73b0aa" + "id": "af069a25c8f94e74a8b2428b51bcd1a7" } ], "minimalStep": { "currency": "UAH", - "amount": 35.0, + "amount": 15.0, "valueAddedTaxIncluded": true }, "items": [ @@ -143,7 +143,7 @@ Content-Type: application/json; charset=UTF-8 "startDate": "2020-05-17T01:00:00+03:00", "endDate": "2020-05-20T01:00:00+03:00" }, - "id": "22efe85457d041aab3bc5a64aae6be0f", + "id": "53de0c90af0e430ea270c5970351ba0c", "unit": { "code": "44617100-9", "name": "item" diff --git a/docs/source/tendering/http/tutorial/tender-contract-get-contract-value.http b/docs/source/tendering/http/tutorial/tender-contract-get-contract-value.http index c89cc9b250..7d74fab933 100644 --- a/docs/source/tendering/http/tutorial/tender-contract-get-contract-value.http +++ b/docs/source/tendering/http/tutorial/tender-contract-get-contract-value.http @@ -33,7 +33,7 @@ Content-Type: application/json; charset=UTF-8 "startDate": "2020-05-17T01:00:00+03:00", "endDate": "2020-05-20T01:00:00+03:00" }, - "id": "22efe85457d041aab3bc5a64aae6be0f", + "id": "53de0c90af0e430ea270c5970351ba0c", "unit": { "code": "44617100-9", "name": "item" diff --git a/docs/source/tendering/http/tutorial/tender-contract-get-documents-again.http b/docs/source/tendering/http/tutorial/tender-contract-get-documents-again.http index 2d2d84a446..e4454560ac 100644 --- a/docs/source/tendering/http/tutorial/tender-contract-get-documents-again.http +++ b/docs/source/tendering/http/tutorial/tender-contract-get-documents-again.http @@ -8,22 +8,22 @@ Content-Type: application/json; charset=UTF-8 "data": [ { "hash": "md5:00000000000000000000000000000000", - "title": "contract_first_document.doc", - "url": "http://public-docs-sandbox.prozorro.gov.ua/get/b97562e3f33c493297fd14dd6d8c50f0?KeyID=a8968c46&Signature=dQMvA4OqNyUhOiqC5GLb4uSEt49HDaSNcEbdsglo9C4Wq8XJDos68B7pBOwMEiRZWStfSwxaG5Hf8DZduhr9DA%253D%253D", + "title": "contract_second_document.doc", + "url": "http://public-docs-sandbox.prozorro.gov.ua/get/a2aa5b35517c445ca3778b7b25560cc9?KeyID=a8968c46&Signature=VkkdjRhMvrxZzXFjmULpNVxzcq52P09KEEXjD2Fe%252BBMNBH9FUupk0ZN6hHIwAFGr5lYmPcm2HzuX83tijpfOBw%253D%253D", "format": "application/msword", "documentOf": "tender", "datePublished": "2020-05-15T01:00:03+03:00", - "id": "9f3ff556fde24588bb8d43242b4fe977", + "id": "1b567d8562a54b8dbed747e3f604cf6f", "dateModified": "2020-05-15T01:00:03+03:00" }, { "hash": "md5:00000000000000000000000000000000", - "title": "contract_second_document.doc", - "url": "http://public-docs-sandbox.prozorro.gov.ua/get/a2aa5b35517c445ca3778b7b25560cc9?KeyID=a8968c46&Signature=VkkdjRhMvrxZzXFjmULpNVxzcq52P09KEEXjD2Fe%252BBMNBH9FUupk0ZN6hHIwAFGr5lYmPcm2HzuX83tijpfOBw%253D%253D", + "title": "contract_first_document.doc", + "url": "http://public-docs-sandbox.prozorro.gov.ua/get/b97562e3f33c493297fd14dd6d8c50f0?KeyID=a8968c46&Signature=dQMvA4OqNyUhOiqC5GLb4uSEt49HDaSNcEbdsglo9C4Wq8XJDos68B7pBOwMEiRZWStfSwxaG5Hf8DZduhr9DA%253D%253D", "format": "application/msword", "documentOf": "tender", "datePublished": "2020-05-15T01:00:03+03:00", - "id": "d0c4000793a24e009a3057b4434ae119", + "id": "0fcd9edc0b0544c19fbc11c5f9c372dd", "dateModified": "2020-05-15T01:00:03+03:00" } ] diff --git a/docs/source/tendering/http/tutorial/tender-contract-get-documents.http b/docs/source/tendering/http/tutorial/tender-contract-get-documents.http index d8e2920ed5..649334e334 100644 --- a/docs/source/tendering/http/tutorial/tender-contract-get-documents.http +++ b/docs/source/tendering/http/tutorial/tender-contract-get-documents.http @@ -13,7 +13,7 @@ Content-Type: application/json; charset=UTF-8 "format": "application/msword", "documentOf": "tender", "datePublished": "2020-05-15T01:00:03+03:00", - "id": "9f3ff556fde24588bb8d43242b4fe977", + "id": "0fcd9edc0b0544c19fbc11c5f9c372dd", "dateModified": "2020-05-15T01:00:03+03:00" } ] diff --git a/docs/source/tendering/http/tutorial/tender-contract-period.http b/docs/source/tendering/http/tutorial/tender-contract-period.http index e0efd8896a..514086196c 100644 --- a/docs/source/tendering/http/tutorial/tender-contract-period.http +++ b/docs/source/tendering/http/tutorial/tender-contract-period.http @@ -44,7 +44,7 @@ Content-Type: application/json; charset=UTF-8 "startDate": "2020-05-17T01:00:00+03:00", "endDate": "2020-05-20T01:00:00+03:00" }, - "id": "22efe85457d041aab3bc5a64aae6be0f", + "id": "53de0c90af0e430ea270c5970351ba0c", "unit": { "code": "44617100-9", "name": "item" diff --git a/docs/source/tendering/http/tutorial/tender-contract-set-contract-value.http b/docs/source/tendering/http/tutorial/tender-contract-set-contract-value.http index db42291720..15d140473d 100644 --- a/docs/source/tendering/http/tutorial/tender-contract-set-contract-value.http +++ b/docs/source/tendering/http/tutorial/tender-contract-set-contract-value.http @@ -45,7 +45,7 @@ Content-Type: application/json; charset=UTF-8 "startDate": "2020-05-17T01:00:00+03:00", "endDate": "2020-05-20T01:00:00+03:00" }, - "id": "22efe85457d041aab3bc5a64aae6be0f", + "id": "53de0c90af0e430ea270c5970351ba0c", "unit": { "code": "44617100-9", "name": "item" diff --git a/docs/source/tendering/http/tutorial/tender-contract-sign.http b/docs/source/tendering/http/tutorial/tender-contract-sign.http index a46ebed510..37554bb805 100644 --- a/docs/source/tendering/http/tutorial/tender-contract-sign.http +++ b/docs/source/tendering/http/tutorial/tender-contract-sign.http @@ -23,7 +23,7 @@ Content-Type: application/json; charset=UTF-8 "format": "application/msword", "documentOf": "tender", "datePublished": "2020-05-15T01:00:03+03:00", - "id": "9f3ff556fde24588bb8d43242b4fe977", + "id": "0fcd9edc0b0544c19fbc11c5f9c372dd", "dateModified": "2020-05-15T01:00:03+03:00" }, { @@ -33,7 +33,7 @@ Content-Type: application/json; charset=UTF-8 "format": "application/msword", "documentOf": "tender", "datePublished": "2020-05-15T01:00:03+03:00", - "id": "d0c4000793a24e009a3057b4434ae119", + "id": "1b567d8562a54b8dbed747e3f604cf6f", "dateModified": "2020-05-15T01:00:03+03:00" } ], @@ -63,7 +63,7 @@ Content-Type: application/json; charset=UTF-8 "startDate": "2020-05-17T01:00:00+03:00", "endDate": "2020-05-20T01:00:00+03:00" }, - "id": "22efe85457d041aab3bc5a64aae6be0f", + "id": "53de0c90af0e430ea270c5970351ba0c", "unit": { "code": "44617100-9", "name": "item" diff --git a/docs/source/tendering/http/tutorial/tender-contract-upload-document.http b/docs/source/tendering/http/tutorial/tender-contract-upload-document.http index 4c6b70e9b5..8de617d064 100644 --- a/docs/source/tendering/http/tutorial/tender-contract-upload-document.http +++ b/docs/source/tendering/http/tutorial/tender-contract-upload-document.http @@ -15,7 +15,7 @@ DATA: Response: 201 Created Content-Type: application/json; charset=UTF-8 -Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/bc3a9016b29d4fed894cc62d3ff59680/contracts/4f7b2b4c16f24c66897d0d18d57c05f3/documents/9f3ff556fde24588bb8d43242b4fe977 +Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/bc3a9016b29d4fed894cc62d3ff59680/contracts/4f7b2b4c16f24c66897d0d18d57c05f3/documents/0fcd9edc0b0544c19fbc11c5f9c372dd { "data": { "hash": "md5:00000000000000000000000000000000", @@ -24,7 +24,7 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/bc3a9016b29d4fed "format": "application/msword", "documentOf": "tender", "datePublished": "2020-05-15T01:00:03+03:00", - "id": "9f3ff556fde24588bb8d43242b4fe977", + "id": "0fcd9edc0b0544c19fbc11c5f9c372dd", "dateModified": "2020-05-15T01:00:03+03:00" } } diff --git a/docs/source/tendering/http/tutorial/tender-contract-upload-second-document.http b/docs/source/tendering/http/tutorial/tender-contract-upload-second-document.http index a550a489b3..04a1c557e1 100644 --- a/docs/source/tendering/http/tutorial/tender-contract-upload-second-document.http +++ b/docs/source/tendering/http/tutorial/tender-contract-upload-second-document.http @@ -15,7 +15,7 @@ DATA: Response: 201 Created Content-Type: application/json; charset=UTF-8 -Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/bc3a9016b29d4fed894cc62d3ff59680/contracts/4f7b2b4c16f24c66897d0d18d57c05f3/documents/d0c4000793a24e009a3057b4434ae119 +Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/bc3a9016b29d4fed894cc62d3ff59680/contracts/4f7b2b4c16f24c66897d0d18d57c05f3/documents/1b567d8562a54b8dbed747e3f604cf6f { "data": { "hash": "md5:00000000000000000000000000000000", @@ -24,7 +24,7 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/bc3a9016b29d4fed "format": "application/msword", "documentOf": "tender", "datePublished": "2020-05-15T01:00:03+03:00", - "id": "d0c4000793a24e009a3057b4434ae119", + "id": "1b567d8562a54b8dbed747e3f604cf6f", "dateModified": "2020-05-15T01:00:03+03:00" } } diff --git a/docs/source/tendering/http/tutorial/tender-document-add-documentType.http b/docs/source/tendering/http/tutorial/tender-document-add-documentType.http index 5016f7edbf..bf9c7df26d 100644 --- a/docs/source/tendering/http/tutorial/tender-document-add-documentType.http +++ b/docs/source/tendering/http/tutorial/tender-document-add-documentType.http @@ -1,4 +1,4 @@ -PATCH /api/2.5/tenders/bc3a9016b29d4fed894cc62d3ff59680/documents/8a3d30101dc94ca58f768bec6a1f45dd?acc_token=e6bb69a4c5474e4987130585951b6f3e HTTP/1.0 +PATCH /api/2.5/tenders/bc3a9016b29d4fed894cc62d3ff59680/documents/8924acf921d645b7bce35748c4f9e237?acc_token=e6bb69a4c5474e4987130585951b6f3e HTTP/1.0 Authorization: Bearer broker Content-Length: 53 Content-Type: application/json @@ -22,7 +22,7 @@ Content-Type: application/json; charset=UTF-8 "documentOf": "tender", "datePublished": "2020-05-15T01:00:01+03:00", "documentType": "technicalSpecifications", - "id": "8a3d30101dc94ca58f768bec6a1f45dd", + "id": "8924acf921d645b7bce35748c4f9e237", "dateModified": "2020-05-15T01:00:01+03:00" } } diff --git a/docs/source/tendering/http/tutorial/tender-document-edit-docType-desc.http b/docs/source/tendering/http/tutorial/tender-document-edit-docType-desc.http index 5d14f0a6f6..f8c597e9c3 100644 --- a/docs/source/tendering/http/tutorial/tender-document-edit-docType-desc.http +++ b/docs/source/tendering/http/tutorial/tender-document-edit-docType-desc.http @@ -1,4 +1,4 @@ -PATCH /api/2.5/tenders/bc3a9016b29d4fed894cc62d3ff59680/documents/8a3d30101dc94ca58f768bec6a1f45dd?acc_token=e6bb69a4c5474e4987130585951b6f3e HTTP/1.0 +PATCH /api/2.5/tenders/bc3a9016b29d4fed894cc62d3ff59680/documents/8924acf921d645b7bce35748c4f9e237?acc_token=e6bb69a4c5474e4987130585951b6f3e HTTP/1.0 Authorization: Bearer broker Content-Length: 58 Content-Type: application/json @@ -23,7 +23,7 @@ Content-Type: application/json; charset=UTF-8 "datePublished": "2020-05-15T01:00:01+03:00", "author": "tender_owner", "documentType": "technicalSpecifications", - "id": "8a3d30101dc94ca58f768bec6a1f45dd", + "id": "8924acf921d645b7bce35748c4f9e237", "dateModified": "2020-05-15T01:00:01+03:00" } } diff --git a/docs/source/tendering/http/tutorial/tender-documents-2.http b/docs/source/tendering/http/tutorial/tender-documents-2.http index 61c9c81082..4f46a2bb0b 100644 --- a/docs/source/tendering/http/tutorial/tender-documents-2.http +++ b/docs/source/tendering/http/tutorial/tender-documents-2.http @@ -8,26 +8,26 @@ Content-Type: application/json; charset=UTF-8 "data": [ { "hash": "md5:00000000000000000000000000000000", - "description": "document description modified", - "title": "Notice.pdf", - "url": "http://public-docs-sandbox.prozorro.gov.ua/get/4d52879c11df4aa7ae80d3b6c4a274ce?KeyID=a8968c46&Signature=BiR23Y26fUFdAaBBqxSqN2Lv29UkW8VjpoZA0NLoVj2cgKeSq3J%2FiuGzva%252Bl0R6wpgLbA2zfat9mNkErf3HjAg%253D%253D", + "author": "tender_owner", + "title": "AwardCriteria.pdf", + "url": "http://public-docs-sandbox.prozorro.gov.ua/get/55286412717f4997b35cde1cdc8ca4a3?KeyID=a8968c46&Signature=SLJwlJyNeYyhfqlj5fjfDUM5HpgwZKwSFTALjLjeIuv5mzql8Jjjua0WO8iNogqE6c0DA0%252BkyD8utzz3zI27BA%253D%253D", "format": "application/pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:01+03:00", - "author": "tender_owner", - "documentType": "technicalSpecifications", - "id": "8a3d30101dc94ca58f768bec6a1f45dd", + "id": "f05f28fd104147beb09d8b4f7bbcbd2b", "dateModified": "2020-05-15T01:00:01+03:00" }, { "hash": "md5:00000000000000000000000000000000", - "author": "tender_owner", - "title": "AwardCriteria.pdf", - "url": "http://public-docs-sandbox.prozorro.gov.ua/get/55286412717f4997b35cde1cdc8ca4a3?KeyID=a8968c46&Signature=SLJwlJyNeYyhfqlj5fjfDUM5HpgwZKwSFTALjLjeIuv5mzql8Jjjua0WO8iNogqE6c0DA0%252BkyD8utzz3zI27BA%253D%253D", + "description": "document description modified", + "title": "Notice.pdf", + "url": "http://public-docs-sandbox.prozorro.gov.ua/get/4d52879c11df4aa7ae80d3b6c4a274ce?KeyID=a8968c46&Signature=BiR23Y26fUFdAaBBqxSqN2Lv29UkW8VjpoZA0NLoVj2cgKeSq3J%2FiuGzva%252Bl0R6wpgLbA2zfat9mNkErf3HjAg%253D%253D", "format": "application/pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:01+03:00", - "id": "90a4fef3a0f545f4807445bbd4017f29", + "author": "tender_owner", + "documentType": "technicalSpecifications", + "id": "8924acf921d645b7bce35748c4f9e237", "dateModified": "2020-05-15T01:00:01+03:00" } ] diff --git a/docs/source/tendering/http/tutorial/tender-documents-3.http b/docs/source/tendering/http/tutorial/tender-documents-3.http index 22f0dc890f..5fa9ded168 100644 --- a/docs/source/tendering/http/tutorial/tender-documents-3.http +++ b/docs/source/tendering/http/tutorial/tender-documents-3.http @@ -8,26 +8,26 @@ Content-Type: application/json; charset=UTF-8 "data": [ { "hash": "md5:00000000000000000000000000000000", - "description": "document description modified", - "title": "Notice.pdf", - "url": "http://public-docs-sandbox.prozorro.gov.ua/get/4d52879c11df4aa7ae80d3b6c4a274ce?KeyID=a8968c46&Signature=BiR23Y26fUFdAaBBqxSqN2Lv29UkW8VjpoZA0NLoVj2cgKeSq3J%2FiuGzva%252Bl0R6wpgLbA2zfat9mNkErf3HjAg%253D%253D", + "author": "tender_owner", + "title": "AwardCriteria-2.pdf", + "url": "http://public-docs-sandbox.prozorro.gov.ua/get/5d1c2cddad3f45a3aac16cb29b81f97f?KeyID=a8968c46&Signature=E3RouA49wKUWYJ7BPlrzsmaNUW69ZPMHhlKAAOoUy3gSRyJaA98YqWOvmbQ30Z0oCAQ44WCDW4wlwGZV0RXjCA%253D%253D", "format": "application/pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:01+03:00", - "author": "tender_owner", - "documentType": "technicalSpecifications", - "id": "8a3d30101dc94ca58f768bec6a1f45dd", + "id": "f05f28fd104147beb09d8b4f7bbcbd2b", "dateModified": "2020-05-15T01:00:01+03:00" }, { "hash": "md5:00000000000000000000000000000000", - "author": "tender_owner", - "title": "AwardCriteria-2.pdf", - "url": "http://public-docs-sandbox.prozorro.gov.ua/get/5d1c2cddad3f45a3aac16cb29b81f97f?KeyID=a8968c46&Signature=E3RouA49wKUWYJ7BPlrzsmaNUW69ZPMHhlKAAOoUy3gSRyJaA98YqWOvmbQ30Z0oCAQ44WCDW4wlwGZV0RXjCA%253D%253D", + "description": "document description modified", + "title": "Notice.pdf", + "url": "http://public-docs-sandbox.prozorro.gov.ua/get/4d52879c11df4aa7ae80d3b6c4a274ce?KeyID=a8968c46&Signature=BiR23Y26fUFdAaBBqxSqN2Lv29UkW8VjpoZA0NLoVj2cgKeSq3J%2FiuGzva%252Bl0R6wpgLbA2zfat9mNkErf3HjAg%253D%253D", "format": "application/pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:01+03:00", - "id": "90a4fef3a0f545f4807445bbd4017f29", + "author": "tender_owner", + "documentType": "technicalSpecifications", + "id": "8924acf921d645b7bce35748c4f9e237", "dateModified": "2020-05-15T01:00:01+03:00" } ] diff --git a/docs/source/tendering/http/tutorial/tender-documents.http b/docs/source/tendering/http/tutorial/tender-documents.http index 711e4ce7f0..210f56d51d 100644 --- a/docs/source/tendering/http/tutorial/tender-documents.http +++ b/docs/source/tendering/http/tutorial/tender-documents.http @@ -1,4 +1,4 @@ -GET /api/2.5/tenders/bc3a9016b29d4fed894cc62d3ff59680/documents/8a3d30101dc94ca58f768bec6a1f45dd HTTP/1.0 +GET /api/2.5/tenders/bc3a9016b29d4fed894cc62d3ff59680/documents/8924acf921d645b7bce35748c4f9e237 HTTP/1.0 Authorization: Bearer broker Host: lb-api-sandbox.prozorro.gov.ua @@ -14,7 +14,7 @@ Content-Type: application/json; charset=UTF-8 "documentOf": "tender", "datePublished": "2020-05-15T01:00:01+03:00", "previousVersions": [], - "id": "8a3d30101dc94ca58f768bec6a1f45dd", + "id": "8924acf921d645b7bce35748c4f9e237", "dateModified": "2020-05-15T01:00:01+03:00" } } diff --git a/docs/source/tendering/http/tutorial/tender-patch-2pc.http b/docs/source/tendering/http/tutorial/tender-patch-2pc.http index f8fa52f409..6b64d4ee05 100644 --- a/docs/source/tendering/http/tutorial/tender-patch-2pc.http +++ b/docs/source/tendering/http/tutorial/tender-patch-2pc.http @@ -39,7 +39,7 @@ Content-Type: application/json; charset=UTF-8 }, "percentage": 54.45, "type": "financing", - "id": "84498cf0ae0e405a9caa4ed2e70ae72d" + "id": "ef28f3c993c14965b7de1812f9e9b1e0" } ], "mainProcurementCategory": "goods", @@ -50,7 +50,7 @@ Content-Type: application/json; charset=UTF-8 "title": "футляри до державних нагород", "minimalStep": { "currency": "UAH", - "amount": 35.0, + "amount": 15.0, "valueAddedTaxIncluded": true }, "items": [ @@ -79,7 +79,7 @@ Content-Type: application/json; charset=UTF-8 "startDate": "2020-05-17T01:00:00+03:00", "endDate": "2020-05-20T01:00:00+03:00" }, - "id": "a92aaa5089044cf3b5c5639d238a6950", + "id": "f2b9a7ff5b484fe1a3f6bf64b44a32a6", "unit": { "code": "44617100-9", "name": "item" diff --git a/docs/source/tendering/http/tutorial/tender-post-2pc.http b/docs/source/tendering/http/tutorial/tender-post-2pc.http index 02d445a99e..3ded14cadd 100644 --- a/docs/source/tendering/http/tutorial/tender-post-2pc.http +++ b/docs/source/tendering/http/tutorial/tender-post-2pc.http @@ -39,7 +39,7 @@ DATA: "title": "футляри до державних нагород", "minimalStep": { "currency": "UAH", - "amount": 35 + "amount": 15 }, "enquiryPeriod": { "endDate": "2020-05-22T01:00:00+03:00" @@ -140,7 +140,7 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/083d97e76d36428c }, "percentage": 54.45, "type": "financing", - "id": "84498cf0ae0e405a9caa4ed2e70ae72d" + "id": "ef28f3c993c14965b7de1812f9e9b1e0" } ], "mainProcurementCategory": "goods", @@ -151,7 +151,7 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/083d97e76d36428c "title": "футляри до державних нагород", "minimalStep": { "currency": "UAH", - "amount": 35.0, + "amount": 15.0, "valueAddedTaxIncluded": true }, "items": [ @@ -180,7 +180,7 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/083d97e76d36428c "startDate": "2020-05-17T01:00:00+03:00", "endDate": "2020-05-20T01:00:00+03:00" }, - "id": "a92aaa5089044cf3b5c5639d238a6950", + "id": "f2b9a7ff5b484fe1a3f6bf64b44a32a6", "unit": { "code": "44617100-9", "name": "item" diff --git a/docs/source/tendering/http/tutorial/tender-post-attempt-json-data.http b/docs/source/tendering/http/tutorial/tender-post-attempt-json-data.http index 2c3e1f7299..a9aec39d1a 100644 --- a/docs/source/tendering/http/tutorial/tender-post-attempt-json-data.http +++ b/docs/source/tendering/http/tutorial/tender-post-attempt-json-data.http @@ -38,7 +38,7 @@ DATA: "title": "футляри до державних нагород", "minimalStep": { "currency": "UAH", - "amount": 35 + "amount": 15 }, "enquiryPeriod": { "endDate": "2020-05-22T01:00:00+03:00" @@ -139,7 +139,7 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/bc3a9016b29d4fed }, "percentage": 54.45, "type": "financing", - "id": "bbe57ebfab144c58adb7ed673a73b0aa" + "id": "af069a25c8f94e74a8b2428b51bcd1a7" } ], "mainProcurementCategory": "goods", @@ -150,7 +150,7 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/bc3a9016b29d4fed "title": "футляри до державних нагород", "minimalStep": { "currency": "UAH", - "amount": 35.0, + "amount": 15.0, "valueAddedTaxIncluded": true }, "items": [ @@ -179,7 +179,7 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/bc3a9016b29d4fed "startDate": "2020-05-17T01:00:00+03:00", "endDate": "2020-05-20T01:00:00+03:00" }, - "id": "22efe85457d041aab3bc5a64aae6be0f", + "id": "53de0c90af0e430ea270c5970351ba0c", "unit": { "code": "44617100-9", "name": "item" diff --git a/docs/source/tendering/http/tutorial/update-award-criteria.http b/docs/source/tendering/http/tutorial/update-award-criteria.http index a13388bf5e..bc5d4371b8 100644 --- a/docs/source/tendering/http/tutorial/update-award-criteria.http +++ b/docs/source/tendering/http/tutorial/update-award-criteria.http @@ -1,4 +1,4 @@ -PUT /api/2.5/tenders/bc3a9016b29d4fed894cc62d3ff59680/documents/90a4fef3a0f545f4807445bbd4017f29?acc_token=e6bb69a4c5474e4987130585951b6f3e HTTP/1.0 +PUT /api/2.5/tenders/bc3a9016b29d4fed894cc62d3ff59680/documents/f05f28fd104147beb09d8b4f7bbcbd2b?acc_token=e6bb69a4c5474e4987130585951b6f3e HTTP/1.0 Authorization: Bearer broker Content-Length: 329 Content-Type: application/json @@ -24,7 +24,7 @@ Content-Type: application/json; charset=UTF-8 "format": "application/pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:01+03:00", - "id": "90a4fef3a0f545f4807445bbd4017f29", + "id": "f05f28fd104147beb09d8b4f7bbcbd2b", "dateModified": "2020-05-15T01:00:01+03:00" } } diff --git a/docs/source/tendering/http/tutorial/update-cancellation-doc.http b/docs/source/tendering/http/tutorial/update-cancellation-doc.http index 60ac5abc72..bdbbe2d82e 100644 --- a/docs/source/tendering/http/tutorial/update-cancellation-doc.http +++ b/docs/source/tendering/http/tutorial/update-cancellation-doc.http @@ -1,4 +1,4 @@ -PUT /api/2.5/tenders/bc3a9016b29d4fed894cc62d3ff59680/cancellations/d4d0fafa7fbf40b8b171adc3651ed356/documents/2c95fa8b548444c08d8575bfc95f0bea?acc_token=e6bb69a4c5474e4987130585951b6f3e HTTP/1.0 +PUT /api/2.5/tenders/bc3a9016b29d4fed894cc62d3ff59680/cancellations/442eab37b845408d81ed635c8d8ebadb/documents/ada2083ffec749c5ae3c8fc110e1fb3b?acc_token=e6bb69a4c5474e4987130585951b6f3e HTTP/1.0 Authorization: Bearer broker Content-Length: 322 Content-Type: application/json @@ -24,7 +24,7 @@ Content-Type: application/json; charset=UTF-8 "format": "application/pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:03+03:00", - "id": "2c95fa8b548444c08d8575bfc95f0bea", + "id": "ada2083ffec749c5ae3c8fc110e1fb3b", "dateModified": "2020-05-15T01:00:03+03:00" } } diff --git a/docs/source/tendering/http/tutorial/upload-award-criteria.http b/docs/source/tendering/http/tutorial/upload-award-criteria.http index 4a1a3da4f4..4fc24af0f3 100644 --- a/docs/source/tendering/http/tutorial/upload-award-criteria.http +++ b/docs/source/tendering/http/tutorial/upload-award-criteria.http @@ -15,7 +15,7 @@ DATA: Response: 201 Created Content-Type: application/json; charset=UTF-8 -Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/bc3a9016b29d4fed894cc62d3ff59680/documents/90a4fef3a0f545f4807445bbd4017f29 +Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/bc3a9016b29d4fed894cc62d3ff59680/documents/f05f28fd104147beb09d8b4f7bbcbd2b { "data": { "hash": "md5:00000000000000000000000000000000", @@ -25,7 +25,7 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/bc3a9016b29d4fed "format": "application/pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:01+03:00", - "id": "90a4fef3a0f545f4807445bbd4017f29", + "id": "f05f28fd104147beb09d8b4f7bbcbd2b", "dateModified": "2020-05-15T01:00:01+03:00" } } diff --git a/docs/source/tendering/http/tutorial/upload-bid-proposal.http b/docs/source/tendering/http/tutorial/upload-bid-proposal.http index 24fb697995..1bfd7b3c30 100644 --- a/docs/source/tendering/http/tutorial/upload-bid-proposal.http +++ b/docs/source/tendering/http/tutorial/upload-bid-proposal.http @@ -1,4 +1,4 @@ -POST /api/2.5/tenders/bc3a9016b29d4fed894cc62d3ff59680/bids/b31ec66637a141c7bb03446a0f22f5dc/documents?acc_token=7a7e299c46ba4430a2a63af9bf91af30 HTTP/1.0 +POST /api/2.5/tenders/bc3a9016b29d4fed894cc62d3ff59680/bids/74c272933f3046b0a4cdcc7036b67323/documents?acc_token=7a7e299c46ba4430a2a63af9bf91af30 HTTP/1.0 Authorization: Bearer broker Content-Length: 326 Content-Type: application/json @@ -15,16 +15,16 @@ DATA: Response: 201 Created Content-Type: application/json; charset=UTF-8 -Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/bc3a9016b29d4fed894cc62d3ff59680/bids/b31ec66637a141c7bb03446a0f22f5dc/documents/86cd9a1b304d4530852984610d67c933 +Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/bc3a9016b29d4fed894cc62d3ff59680/bids/74c272933f3046b0a4cdcc7036b67323/documents/a37bf33d76374160ba0da18168a744ca { "data": { "hash": "md5:00000000000000000000000000000000", "title": "Proposal.pdf", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/bc3a9016b29d4fed894cc62d3ff59680/bids/b31ec66637a141c7bb03446a0f22f5dc/documents/86cd9a1b304d4530852984610d67c933?download=748412273ae54b27a3606febdfe1bc93", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/bc3a9016b29d4fed894cc62d3ff59680/bids/74c272933f3046b0a4cdcc7036b67323/documents/a37bf33d76374160ba0da18168a744ca?download=748412273ae54b27a3606febdfe1bc93", "format": "application/pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:01+03:00", - "id": "86cd9a1b304d4530852984610d67c933", + "id": "a37bf33d76374160ba0da18168a744ca", "dateModified": "2020-05-15T01:00:01+03:00" } } diff --git a/docs/source/tendering/http/tutorial/upload-cancellation-doc.http b/docs/source/tendering/http/tutorial/upload-cancellation-doc.http index 1646fe03ea..c652964dd9 100644 --- a/docs/source/tendering/http/tutorial/upload-cancellation-doc.http +++ b/docs/source/tendering/http/tutorial/upload-cancellation-doc.http @@ -1,4 +1,4 @@ -POST /api/2.5/tenders/bc3a9016b29d4fed894cc62d3ff59680/cancellations/d4d0fafa7fbf40b8b171adc3651ed356/documents?acc_token=e6bb69a4c5474e4987130585951b6f3e HTTP/1.0 +POST /api/2.5/tenders/bc3a9016b29d4fed894cc62d3ff59680/cancellations/442eab37b845408d81ed635c8d8ebadb/documents?acc_token=e6bb69a4c5474e4987130585951b6f3e HTTP/1.0 Authorization: Bearer broker Content-Length: 326 Content-Type: application/json @@ -15,7 +15,7 @@ DATA: Response: 201 Created Content-Type: application/json; charset=UTF-8 -Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/bc3a9016b29d4fed894cc62d3ff59680/cancellations/d4d0fafa7fbf40b8b171adc3651ed356/documents/2c95fa8b548444c08d8575bfc95f0bea +Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/bc3a9016b29d4fed894cc62d3ff59680/cancellations/442eab37b845408d81ed635c8d8ebadb/documents/ada2083ffec749c5ae3c8fc110e1fb3b { "data": { "hash": "md5:00000000000000000000000000000000", @@ -24,7 +24,7 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/bc3a9016b29d4fed "format": "application/pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:03+03:00", - "id": "2c95fa8b548444c08d8575bfc95f0bea", + "id": "ada2083ffec749c5ae3c8fc110e1fb3b", "dateModified": "2020-05-15T01:00:03+03:00" } } diff --git a/docs/source/tendering/http/tutorial/upload-tender-notice.http b/docs/source/tendering/http/tutorial/upload-tender-notice.http index bfab3552d7..e83e615b50 100644 --- a/docs/source/tendering/http/tutorial/upload-tender-notice.http +++ b/docs/source/tendering/http/tutorial/upload-tender-notice.http @@ -15,7 +15,7 @@ DATA: Response: 201 Created Content-Type: application/json; charset=UTF-8 -Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/bc3a9016b29d4fed894cc62d3ff59680/documents/8a3d30101dc94ca58f768bec6a1f45dd +Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/bc3a9016b29d4fed894cc62d3ff59680/documents/8924acf921d645b7bce35748c4f9e237 { "data": { "hash": "md5:00000000000000000000000000000000", @@ -25,7 +25,7 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/bc3a9016b29d4fed "format": "application/pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:01+03:00", - "id": "8a3d30101dc94ca58f768bec6a1f45dd", + "id": "8924acf921d645b7bce35748c4f9e237", "dateModified": "2020-05-15T01:00:01+03:00" } } diff --git a/docs/source/tendering/index.rst b/docs/source/tendering/index.rst index c153f9f2fe..aca1f07c9d 100644 --- a/docs/source/tendering/index.rst +++ b/docs/source/tendering/index.rst @@ -18,3 +18,4 @@ Contents: defense/index cfaua/index cfaselectionua/index + pricequotation/index diff --git a/docs/source/tendering/limited/http/multiple_lots_tutorial/tender-add-lot.http b/docs/source/tendering/limited/http/multiple_lots_tutorial/tender-add-lot.http index d5a05de87c..8056a48b85 100644 --- a/docs/source/tendering/limited/http/multiple_lots_tutorial/tender-add-lot.http +++ b/docs/source/tendering/limited/http/multiple_lots_tutorial/tender-add-lot.http @@ -18,7 +18,7 @@ DATA: Response: 201 Created Content-Type: application/json; charset=UTF-8 -Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/0cd37a4798fe40d1b45324a394f61c9f/lots/28f98cde22964c8ea8bbc1fda693580e +Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/0cd37a4798fe40d1b45324a394f61c9f/lots/f1747ce5d8be4161ac56c6822b290e47 { "data": { "status": "active", @@ -30,7 +30,7 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/0cd37a4798fe40d1 "valueAddedTaxIncluded": true }, "date": "2020-05-15T01:00:00+03:00", - "id": "28f98cde22964c8ea8bbc1fda693580e" + "id": "f1747ce5d8be4161ac56c6822b290e47" } } diff --git a/docs/source/tendering/limited/http/multiple_lots_tutorial/tender-add-relatedLot-to-item.http b/docs/source/tendering/limited/http/multiple_lots_tutorial/tender-add-relatedLot-to-item.http index 37662bc369..abc2d52023 100644 --- a/docs/source/tendering/limited/http/multiple_lots_tutorial/tender-add-relatedLot-to-item.http +++ b/docs/source/tendering/limited/http/multiple_lots_tutorial/tender-add-relatedLot-to-item.http @@ -8,7 +8,7 @@ DATA: "data": { "items": [ { - "relatedLot": "28f98cde22964c8ea8bbc1fda693580e" + "relatedLot": "f1747ce5d8be4161ac56c6822b290e47" } ] } @@ -56,7 +56,7 @@ Content-Type: application/json; charset=UTF-8 "valueAddedTaxIncluded": true }, "date": "2020-05-15T01:00:00+03:00", - "id": "28f98cde22964c8ea8bbc1fda693580e" + "id": "f1747ce5d8be4161ac56c6822b290e47" } ], "causeDescription_en": "original tender has failed twice", @@ -92,12 +92,12 @@ Content-Type: application/json; charset=UTF-8 }, "percentage": 54.45, "type": "financing", - "id": "155aad4a9e494a2fae96a8770c3fe7d7" + "id": "0d20327410394bd2afd4522ab4550a69" } ], "items": [ { - "relatedLot": "28f98cde22964c8ea8bbc1fda693580e", + "relatedLot": "f1747ce5d8be4161ac56c6822b290e47", "description": "Послуги шкільних їдалень", "classification": { "scheme": "ДК021", @@ -122,7 +122,7 @@ Content-Type: application/json; charset=UTF-8 "startDate": "2020-06-04T00:00:00+02:00", "endDate": "2020-07-04T00:00:00+02:00" }, - "id": "b96fb1f581bc4abab5ac8486238ea5f0", + "id": "c3fab00941aa4c30aaed1bc6be6dee94", "quantity": 1.0 } ], diff --git a/docs/source/tendering/limited/http/multiple_lots_tutorial/tender-award-approve.http b/docs/source/tendering/limited/http/multiple_lots_tutorial/tender-award-approve.http index 8c951a6148..3bc6bc8e31 100644 --- a/docs/source/tendering/limited/http/multiple_lots_tutorial/tender-award-approve.http +++ b/docs/source/tendering/limited/http/multiple_lots_tutorial/tender-award-approve.http @@ -1,4 +1,4 @@ -PATCH /api/2.5/tenders/0cd37a4798fe40d1b45324a394f61c9f/awards/f5d5d3d41f2f415ab04f3fa3e768e09d?acc_token=f78d07413fdf4cf196d0d1b94d560a4f HTTP/1.0 +PATCH /api/2.5/tenders/0cd37a4798fe40d1b45324a394f61c9f/awards/035ed729412b41d7a5695de302128f7a?acc_token=f78d07413fdf4cf196d0d1b94d560a4f HTTP/1.0 Authorization: Bearer broker Content-Length: 49 Content-Type: application/json @@ -16,7 +16,7 @@ Content-Type: application/json; charset=UTF-8 { "data": { "status": "active", - "lotID": "28f98cde22964c8ea8bbc1fda693580e", + "lotID": "f1747ce5d8be4161ac56c6822b290e47", "complaintPeriod": { "startDate": "2020-05-15T01:00:00+03:00", "endDate": "2020-05-21T00:00:00+03:00" @@ -51,7 +51,7 @@ Content-Type: application/json; charset=UTF-8 }, "qualified": true, "date": "2020-05-15T01:00:00+03:00", - "id": "f5d5d3d41f2f415ab04f3fa3e768e09d" + "id": "035ed729412b41d7a5695de302128f7a" } } diff --git a/docs/source/tendering/limited/http/multiple_lots_tutorial/tender-award.http b/docs/source/tendering/limited/http/multiple_lots_tutorial/tender-award.http index bdf3ad8c54..2fe7610270 100644 --- a/docs/source/tendering/limited/http/multiple_lots_tutorial/tender-award.http +++ b/docs/source/tendering/limited/http/multiple_lots_tutorial/tender-award.http @@ -30,7 +30,7 @@ DATA: } } ], - "lotID": "28f98cde22964c8ea8bbc1fda693580e", + "lotID": "f1747ce5d8be4161ac56c6822b290e47", "value": { "currency": "UAH", "amount": 475000, @@ -41,11 +41,11 @@ DATA: Response: 201 Created Content-Type: application/json; charset=UTF-8 -Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/0cd37a4798fe40d1b45324a394f61c9f/awards/f5d5d3d41f2f415ab04f3fa3e768e09d +Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/0cd37a4798fe40d1b45324a394f61c9f/awards/035ed729412b41d7a5695de302128f7a { "data": { "status": "pending", - "lotID": "28f98cde22964c8ea8bbc1fda693580e", + "lotID": "f1747ce5d8be4161ac56c6822b290e47", "suppliers": [ { "contactPoint": { @@ -75,7 +75,7 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/0cd37a4798fe40d1 "valueAddedTaxIncluded": true }, "date": "2020-05-15T01:00:00+03:00", - "id": "f5d5d3d41f2f415ab04f3fa3e768e09d" + "id": "035ed729412b41d7a5695de302128f7a" } } diff --git a/docs/source/tendering/limited/http/multiple_lots_tutorial/tender-contract-set-contract-value.http b/docs/source/tendering/limited/http/multiple_lots_tutorial/tender-contract-set-contract-value.http index 5fb1383374..0b4aafb8d4 100644 --- a/docs/source/tendering/limited/http/multiple_lots_tutorial/tender-contract-set-contract-value.http +++ b/docs/source/tendering/limited/http/multiple_lots_tutorial/tender-contract-set-contract-value.http @@ -20,7 +20,7 @@ Content-Type: application/json; charset=UTF-8 "status": "pending", "items": [ { - "relatedLot": "28f98cde22964c8ea8bbc1fda693580e", + "relatedLot": "f1747ce5d8be4161ac56c6822b290e47", "description": "Послуги шкільних їдалень", "classification": { "scheme": "ДК021", @@ -45,7 +45,7 @@ Content-Type: application/json; charset=UTF-8 "startDate": "2020-06-04T00:00:00+02:00", "endDate": "2020-07-04T00:00:00+02:00" }, - "id": "b96fb1f581bc4abab5ac8486238ea5f0", + "id": "c3fab00941aa4c30aaed1bc6be6dee94", "quantity": 1.0 } ], @@ -79,7 +79,7 @@ Content-Type: application/json; charset=UTF-8 "valueAddedTaxIncluded": true }, "date": "2020-05-15T01:00:00+03:00", - "awardID": "f5d5d3d41f2f415ab04f3fa3e768e09d", + "awardID": "035ed729412b41d7a5695de302128f7a", "id": "ffcf1156a46843bba9887c44b866cf0a", "contractID": "UA-2020-05-15-000001-1" } diff --git a/docs/source/tendering/limited/http/multiple_lots_tutorial/tender-contract-sign.http b/docs/source/tendering/limited/http/multiple_lots_tutorial/tender-contract-sign.http index 2473178d89..0447c03133 100644 --- a/docs/source/tendering/limited/http/multiple_lots_tutorial/tender-contract-sign.http +++ b/docs/source/tendering/limited/http/multiple_lots_tutorial/tender-contract-sign.http @@ -17,7 +17,7 @@ Content-Type: application/json; charset=UTF-8 "status": "active", "items": [ { - "relatedLot": "28f98cde22964c8ea8bbc1fda693580e", + "relatedLot": "f1747ce5d8be4161ac56c6822b290e47", "description": "Послуги шкільних їдалень", "classification": { "scheme": "ДК021", @@ -42,7 +42,7 @@ Content-Type: application/json; charset=UTF-8 "startDate": "2020-06-04T00:00:00+02:00", "endDate": "2020-07-04T00:00:00+02:00" }, - "id": "b96fb1f581bc4abab5ac8486238ea5f0", + "id": "c3fab00941aa4c30aaed1bc6be6dee94", "quantity": 1.0 } ], @@ -77,7 +77,7 @@ Content-Type: application/json; charset=UTF-8 }, "dateSigned": "2020-05-15T01:00:01+03:00", "date": "2020-05-15T01:00:01+03:00", - "awardID": "f5d5d3d41f2f415ab04f3fa3e768e09d", + "awardID": "035ed729412b41d7a5695de302128f7a", "id": "ffcf1156a46843bba9887c44b866cf0a", "contractID": "UA-2020-05-15-000001-1" } diff --git a/docs/source/tendering/limited/http/multiple_lots_tutorial/tender-post-attempt-json-data.http b/docs/source/tendering/limited/http/multiple_lots_tutorial/tender-post-attempt-json-data.http index ee8602da14..5fa3460d95 100644 --- a/docs/source/tendering/limited/http/multiple_lots_tutorial/tender-post-attempt-json-data.http +++ b/docs/source/tendering/limited/http/multiple_lots_tutorial/tender-post-attempt-json-data.http @@ -172,7 +172,7 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/0cd37a4798fe40d1 }, "percentage": 54.45, "type": "financing", - "id": "155aad4a9e494a2fae96a8770c3fe7d7" + "id": "0d20327410394bd2afd4522ab4550a69" } ], "items": [ @@ -201,7 +201,7 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/0cd37a4798fe40d1 "startDate": "2020-06-04T00:00:00+02:00", "endDate": "2020-07-04T00:00:00+02:00" }, - "id": "b96fb1f581bc4abab5ac8486238ea5f0", + "id": "c3fab00941aa4c30aaed1bc6be6dee94", "quantity": 1.0 } ], diff --git a/docs/source/tendering/limited/http/multiple_lots_tutorial/tender-view.http b/docs/source/tendering/limited/http/multiple_lots_tutorial/tender-view.http index 68e3237a9f..ea8149ba8d 100644 --- a/docs/source/tendering/limited/http/multiple_lots_tutorial/tender-view.http +++ b/docs/source/tendering/limited/http/multiple_lots_tutorial/tender-view.http @@ -43,7 +43,7 @@ Content-Type: application/json; charset=UTF-8 "valueAddedTaxIncluded": true }, "date": "2020-05-15T01:00:00+03:00", - "id": "28f98cde22964c8ea8bbc1fda693580e" + "id": "f1747ce5d8be4161ac56c6822b290e47" } ], "causeDescription_en": "original tender has failed twice", @@ -79,12 +79,12 @@ Content-Type: application/json; charset=UTF-8 }, "percentage": 54.45, "type": "financing", - "id": "155aad4a9e494a2fae96a8770c3fe7d7" + "id": "0d20327410394bd2afd4522ab4550a69" } ], "items": [ { - "relatedLot": "28f98cde22964c8ea8bbc1fda693580e", + "relatedLot": "f1747ce5d8be4161ac56c6822b290e47", "description": "Послуги шкільних їдалень", "classification": { "scheme": "ДК021", @@ -109,7 +109,7 @@ Content-Type: application/json; charset=UTF-8 "startDate": "2020-06-04T00:00:00+02:00", "endDate": "2020-07-04T00:00:00+02:00" }, - "id": "b96fb1f581bc4abab5ac8486238ea5f0", + "id": "c3fab00941aa4c30aaed1bc6be6dee94", "quantity": 1.0 } ], diff --git a/docs/source/tendering/limited/http/tutorial/active-cancellation.http b/docs/source/tendering/limited/http/tutorial/active-cancellation.http index a01971f0c7..66b6759ca6 100644 --- a/docs/source/tendering/limited/http/tutorial/active-cancellation.http +++ b/docs/source/tendering/limited/http/tutorial/active-cancellation.http @@ -1,4 +1,4 @@ -GET /api/2.5/tenders/26b780552e084bbcb2b53c5383a6e976/cancellations/5fb58f3fb6324286886aa83b15f2e0db?acc_token=df3d7d3c62c74918a4905630dbce126b HTTP/1.0 +GET /api/2.5/tenders/26b780552e084bbcb2b53c5383a6e976/cancellations/efdf6c101c54481eb17df7c76a8a9e0c?acc_token=df3d7d3c62c74918a4905630dbce126b HTTP/1.0 Authorization: Bearer broker Host: lb-api-sandbox.prozorro.gov.ua @@ -39,7 +39,7 @@ Content-Type: application/json; charset=UTF-8 "reasonType": "unFixable", "date": "2020-05-15T01:00:01+03:00", "cancellationOf": "tender", - "id": "5fb58f3fb6324286886aa83b15f2e0db" + "id": "efdf6c101c54481eb17df7c76a8a9e0c" } } diff --git a/docs/source/tendering/limited/http/tutorial/create-tender-negotiation-procuringEntity.http b/docs/source/tendering/limited/http/tutorial/create-tender-negotiation-procuringEntity.http index d7d2613e25..cc586648c0 100644 --- a/docs/source/tendering/limited/http/tutorial/create-tender-negotiation-procuringEntity.http +++ b/docs/source/tendering/limited/http/tutorial/create-tender-negotiation-procuringEntity.http @@ -172,7 +172,7 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/26b780552e084bbc }, "percentage": 54.45, "type": "financing", - "id": "fc7ef11ceb9d457298c36812ffabdb92" + "id": "98b06bf4f2ee4e0fa872b6c8841596c4" } ], "items": [ @@ -201,7 +201,7 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/26b780552e084bbc "startDate": "2020-06-04T00:00:00+02:00", "endDate": "2020-07-04T00:00:00+02:00" }, - "id": "35207e5ce4404a63a76870f2067cd4f4", + "id": "08b6cc454279495f8d2a561b50d74611", "quantity": 1.0 } ], diff --git a/docs/source/tendering/limited/http/tutorial/create-tender-negotiation-quick-procuringEntity.http b/docs/source/tendering/limited/http/tutorial/create-tender-negotiation-quick-procuringEntity.http index abdb8219b7..cd8da97322 100644 --- a/docs/source/tendering/limited/http/tutorial/create-tender-negotiation-quick-procuringEntity.http +++ b/docs/source/tendering/limited/http/tutorial/create-tender-negotiation-quick-procuringEntity.http @@ -172,7 +172,7 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/26b780552e084bbc }, "percentage": 54.45, "type": "financing", - "id": "fc7ef11ceb9d457298c36812ffabdb92" + "id": "98b06bf4f2ee4e0fa872b6c8841596c4" } ], "items": [ @@ -201,7 +201,7 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/26b780552e084bbc "startDate": "2020-06-04T00:00:00+02:00", "endDate": "2020-07-04T00:00:00+02:00" }, - "id": "35207e5ce4404a63a76870f2067cd4f4", + "id": "08b6cc454279495f8d2a561b50d74611", "quantity": 1.0 } ], diff --git a/docs/source/tendering/limited/http/tutorial/create-tender-procuringEntity.http b/docs/source/tendering/limited/http/tutorial/create-tender-procuringEntity.http index ff7e3fd4a5..784bfc7d7d 100644 --- a/docs/source/tendering/limited/http/tutorial/create-tender-procuringEntity.http +++ b/docs/source/tendering/limited/http/tutorial/create-tender-procuringEntity.http @@ -133,7 +133,7 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/5fb29c8fb65c4a12 }, "percentage": 54.45, "type": "financing", - "id": "396dc1616df245518cdfea31d983287c" + "id": "17f2a088dfd24ab297fbb7bc53d60906" } ], "mainProcurementCategory": "services", @@ -164,7 +164,7 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/5fb29c8fb65c4a12 "startDate": "2020-06-04T00:00:00+02:00", "endDate": "2020-07-04T00:00:00+02:00" }, - "id": "ca90fedbd6494c9588a959536fe7a354", + "id": "3cbf25c0bb094819a3084be21bc85cd7", "quantity": 1.0 } ], diff --git a/docs/source/tendering/limited/http/tutorial/negotiation-prepare-cancellation.http b/docs/source/tendering/limited/http/tutorial/negotiation-prepare-cancellation.http index 42d9997757..e63b17253e 100644 --- a/docs/source/tendering/limited/http/tutorial/negotiation-prepare-cancellation.http +++ b/docs/source/tendering/limited/http/tutorial/negotiation-prepare-cancellation.http @@ -13,7 +13,7 @@ DATA: Response: 201 Created Content-Type: application/json; charset=UTF-8 -Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/26b780552e084bbcb2b53c5383a6e976/cancellations/4c7f6d0311634a6094eca6ccf61256d1 +Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/26b780552e084bbcb2b53c5383a6e976/cancellations/e57e4f5a014e4f3aad51281fcafb24a8 { "data": { "status": "draft", @@ -21,7 +21,7 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/26b780552e084bbc "reasonType": "noDemand", "date": "2020-05-15T01:00:00+03:00", "cancellationOf": "tender", - "id": "4c7f6d0311634a6094eca6ccf61256d1" + "id": "e57e4f5a014e4f3aad51281fcafb24a8" } } diff --git a/docs/source/tendering/limited/http/tutorial/negotiation-update-cancellation-reasonType.http b/docs/source/tendering/limited/http/tutorial/negotiation-update-cancellation-reasonType.http index 4503c1135a..d288f061f2 100644 --- a/docs/source/tendering/limited/http/tutorial/negotiation-update-cancellation-reasonType.http +++ b/docs/source/tendering/limited/http/tutorial/negotiation-update-cancellation-reasonType.http @@ -1,4 +1,4 @@ -PATCH /api/2.5/tenders/26b780552e084bbcb2b53c5383a6e976/cancellations/4c7f6d0311634a6094eca6ccf61256d1?acc_token=df3d7d3c62c74918a4905630dbce126b HTTP/1.0 +PATCH /api/2.5/tenders/26b780552e084bbcb2b53c5383a6e976/cancellations/e57e4f5a014e4f3aad51281fcafb24a8?acc_token=df3d7d3c62c74918a4905630dbce126b HTTP/1.0 Authorization: Bearer broker Content-Length: 41 Content-Type: application/json @@ -19,7 +19,7 @@ Content-Type: application/json; charset=UTF-8 "reasonType": "dateViolation", "date": "2020-05-15T01:00:00+03:00", "cancellationOf": "tender", - "id": "4c7f6d0311634a6094eca6ccf61256d1" + "id": "e57e4f5a014e4f3aad51281fcafb24a8" } } diff --git a/docs/source/tendering/limited/http/tutorial/patch-cancellation.http b/docs/source/tendering/limited/http/tutorial/patch-cancellation.http index 80a0724c9e..e5662b28bf 100644 --- a/docs/source/tendering/limited/http/tutorial/patch-cancellation.http +++ b/docs/source/tendering/limited/http/tutorial/patch-cancellation.http @@ -1,4 +1,4 @@ -PATCH /api/2.5/tenders/26b780552e084bbcb2b53c5383a6e976/cancellations/5fb58f3fb6324286886aa83b15f2e0db/documents/7ce706c799a7481990ed0e68090d431d?acc_token=df3d7d3c62c74918a4905630dbce126b HTTP/1.0 +PATCH /api/2.5/tenders/26b780552e084bbcb2b53c5383a6e976/cancellations/efdf6c101c54481eb17df7c76a8a9e0c/documents/7ce706c799a7481990ed0e68090d431d?acc_token=df3d7d3c62c74918a4905630dbce126b HTTP/1.0 Authorization: Bearer broker Content-Length: 48 Content-Type: application/json diff --git a/docs/source/tendering/limited/http/tutorial/patch-items-value-periods.http b/docs/source/tendering/limited/http/tutorial/patch-items-value-periods.http index 544201487e..68d0ac1607 100644 --- a/docs/source/tendering/limited/http/tutorial/patch-items-value-periods.http +++ b/docs/source/tendering/limited/http/tutorial/patch-items-value-periods.http @@ -47,7 +47,7 @@ Content-Type: application/json; charset=UTF-8 }, "percentage": 54.45, "type": "financing", - "id": "396dc1616df245518cdfea31d983287c" + "id": "17f2a088dfd24ab297fbb7bc53d60906" } ], "mainProcurementCategory": "services", @@ -78,7 +78,7 @@ Content-Type: application/json; charset=UTF-8 "startDate": "2020-06-04T00:00:00+02:00", "endDate": "2020-07-04T00:00:00+02:00" }, - "id": "ca90fedbd6494c9588a959536fe7a354", + "id": "3cbf25c0bb094819a3084be21bc85cd7", "unit": { "code": "MON", "name": "month" diff --git a/docs/source/tendering/limited/http/tutorial/pending-cancellation.http b/docs/source/tendering/limited/http/tutorial/pending-cancellation.http index 2d51fbd590..6cee564061 100644 --- a/docs/source/tendering/limited/http/tutorial/pending-cancellation.http +++ b/docs/source/tendering/limited/http/tutorial/pending-cancellation.http @@ -1,4 +1,4 @@ -PATCH /api/2.5/tenders/26b780552e084bbcb2b53c5383a6e976/cancellations/5fb58f3fb6324286886aa83b15f2e0db?acc_token=df3d7d3c62c74918a4905630dbce126b HTTP/1.0 +PATCH /api/2.5/tenders/26b780552e084bbcb2b53c5383a6e976/cancellations/efdf6c101c54481eb17df7c76a8a9e0c?acc_token=df3d7d3c62c74918a4905630dbce126b HTTP/1.0 Authorization: Bearer broker Content-Length: 31 Content-Type: application/json @@ -47,7 +47,7 @@ Content-Type: application/json; charset=UTF-8 "reasonType": "unFixable", "date": "2020-05-15T01:00:01+03:00", "cancellationOf": "tender", - "id": "5fb58f3fb6324286886aa83b15f2e0db" + "id": "efdf6c101c54481eb17df7c76a8a9e0c" } } diff --git a/docs/source/tendering/limited/http/tutorial/prepare-cancellation.http b/docs/source/tendering/limited/http/tutorial/prepare-cancellation.http index 45debef489..1b24098ebd 100644 --- a/docs/source/tendering/limited/http/tutorial/prepare-cancellation.http +++ b/docs/source/tendering/limited/http/tutorial/prepare-cancellation.http @@ -13,7 +13,7 @@ DATA: Response: 201 Created Content-Type: application/json; charset=UTF-8 -Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/26b780552e084bbcb2b53c5383a6e976/cancellations/5fb58f3fb6324286886aa83b15f2e0db +Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/26b780552e084bbcb2b53c5383a6e976/cancellations/efdf6c101c54481eb17df7c76a8a9e0c { "data": { "status": "draft", @@ -21,7 +21,7 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/26b780552e084bbc "reasonType": "noDemand", "date": "2020-05-15T01:00:01+03:00", "cancellationOf": "tender", - "id": "5fb58f3fb6324286886aa83b15f2e0db" + "id": "efdf6c101c54481eb17df7c76a8a9e0c" } } diff --git a/docs/source/tendering/limited/http/tutorial/tender-award-approve.http b/docs/source/tendering/limited/http/tutorial/tender-award-approve.http index 7944ac806f..a79f916781 100644 --- a/docs/source/tendering/limited/http/tutorial/tender-award-approve.http +++ b/docs/source/tendering/limited/http/tutorial/tender-award-approve.http @@ -1,4 +1,4 @@ -PATCH /api/2.5/tenders/5fb29c8fb65c4a12b69dd3531cfe7bce/awards/68ea182233e3452d9017623a786375bf?acc_token=bc6711b5ba434b92bbba26699dca3104 HTTP/1.0 +PATCH /api/2.5/tenders/5fb29c8fb65c4a12b69dd3531cfe7bce/awards/7957eb73ee0e4bde954e87031a364f27?acc_token=bc6711b5ba434b92bbba26699dca3104 HTTP/1.0 Authorization: Bearer broker Content-Length: 30 Content-Type: application/json @@ -66,7 +66,7 @@ Content-Type: application/json; charset=UTF-8 "valueAddedTaxIncluded": true }, "date": "2020-05-15T01:00:00+03:00", - "id": "68ea182233e3452d9017623a786375bf" + "id": "7957eb73ee0e4bde954e87031a364f27" } } diff --git a/docs/source/tendering/limited/http/tutorial/tender-award-get-documents-again.http b/docs/source/tendering/limited/http/tutorial/tender-award-get-documents-again.http index 00c3a5a342..3356f13b70 100644 --- a/docs/source/tendering/limited/http/tutorial/tender-award-get-documents-again.http +++ b/docs/source/tendering/limited/http/tutorial/tender-award-get-documents-again.http @@ -1,4 +1,4 @@ -GET /api/2.5/tenders/5fb29c8fb65c4a12b69dd3531cfe7bce/awards/68ea182233e3452d9017623a786375bf/documents?acc_token=bc6711b5ba434b92bbba26699dca3104 HTTP/1.0 +GET /api/2.5/tenders/5fb29c8fb65c4a12b69dd3531cfe7bce/awards/7957eb73ee0e4bde954e87031a364f27/documents?acc_token=bc6711b5ba434b92bbba26699dca3104 HTTP/1.0 Authorization: Bearer broker Host: lb-api-sandbox.prozorro.gov.ua diff --git a/docs/source/tendering/limited/http/tutorial/tender-award-get-documents.http b/docs/source/tendering/limited/http/tutorial/tender-award-get-documents.http index a68535dce5..449729aba6 100644 --- a/docs/source/tendering/limited/http/tutorial/tender-award-get-documents.http +++ b/docs/source/tendering/limited/http/tutorial/tender-award-get-documents.http @@ -1,4 +1,4 @@ -GET /api/2.5/tenders/5fb29c8fb65c4a12b69dd3531cfe7bce/awards/68ea182233e3452d9017623a786375bf/documents?acc_token=bc6711b5ba434b92bbba26699dca3104 HTTP/1.0 +GET /api/2.5/tenders/5fb29c8fb65c4a12b69dd3531cfe7bce/awards/7957eb73ee0e4bde954e87031a364f27/documents?acc_token=bc6711b5ba434b92bbba26699dca3104 HTTP/1.0 Authorization: Bearer broker Host: lb-api-sandbox.prozorro.gov.ua diff --git a/docs/source/tendering/limited/http/tutorial/tender-award-upload-document.http b/docs/source/tendering/limited/http/tutorial/tender-award-upload-document.http index 491b230379..af86654acb 100644 --- a/docs/source/tendering/limited/http/tutorial/tender-award-upload-document.http +++ b/docs/source/tendering/limited/http/tutorial/tender-award-upload-document.http @@ -1,4 +1,4 @@ -POST /api/2.5/tenders/5fb29c8fb65c4a12b69dd3531cfe7bce/awards/68ea182233e3452d9017623a786375bf/documents?acc_token=bc6711b5ba434b92bbba26699dca3104 HTTP/1.0 +POST /api/2.5/tenders/5fb29c8fb65c4a12b69dd3531cfe7bce/awards/7957eb73ee0e4bde954e87031a364f27/documents?acc_token=bc6711b5ba434b92bbba26699dca3104 HTTP/1.0 Authorization: Bearer broker Content-Length: 159 Content-Type: multipart/form-data; boundary=---BOUNDARY @@ -14,7 +14,7 @@ content Response: 201 Created Content-Type: application/json; charset=UTF-8 -Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/5fb29c8fb65c4a12b69dd3531cfe7bce/awards/68ea182233e3452d9017623a786375bf/documents/bc1b9ded857f484dba843e9e56fde4ff +Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/5fb29c8fb65c4a12b69dd3531cfe7bce/awards/7957eb73ee0e4bde954e87031a364f27/documents/bc1b9ded857f484dba843e9e56fde4ff { "data": { "hash": "md5:00000000000000000000000000000000", diff --git a/docs/source/tendering/limited/http/tutorial/tender-award-upload-second-document.http b/docs/source/tendering/limited/http/tutorial/tender-award-upload-second-document.http index 68437856b0..a5a9796617 100644 --- a/docs/source/tendering/limited/http/tutorial/tender-award-upload-second-document.http +++ b/docs/source/tendering/limited/http/tutorial/tender-award-upload-second-document.http @@ -1,4 +1,4 @@ -POST /api/2.5/tenders/5fb29c8fb65c4a12b69dd3531cfe7bce/awards/68ea182233e3452d9017623a786375bf/documents?acc_token=bc6711b5ba434b92bbba26699dca3104 HTTP/1.0 +POST /api/2.5/tenders/5fb29c8fb65c4a12b69dd3531cfe7bce/awards/7957eb73ee0e4bde954e87031a364f27/documents?acc_token=bc6711b5ba434b92bbba26699dca3104 HTTP/1.0 Authorization: Bearer broker Content-Length: 160 Content-Type: multipart/form-data; boundary=---BOUNDARY @@ -14,7 +14,7 @@ content Response: 201 Created Content-Type: application/json; charset=UTF-8 -Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/5fb29c8fb65c4a12b69dd3531cfe7bce/awards/68ea182233e3452d9017623a786375bf/documents/e3df98e85ec74550bde73df99950323b +Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/5fb29c8fb65c4a12b69dd3531cfe7bce/awards/7957eb73ee0e4bde954e87031a364f27/documents/e3df98e85ec74550bde73df99950323b { "data": { "hash": "md5:00000000000000000000000000000000", diff --git a/docs/source/tendering/limited/http/tutorial/tender-award.http b/docs/source/tendering/limited/http/tutorial/tender-award.http index e7a31f2525..dc34880526 100644 --- a/docs/source/tendering/limited/http/tutorial/tender-award.http +++ b/docs/source/tendering/limited/http/tutorial/tender-award.http @@ -40,7 +40,7 @@ DATA: Response: 201 Created Content-Type: application/json; charset=UTF-8 -Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/5fb29c8fb65c4a12b69dd3531cfe7bce/awards/68ea182233e3452d9017623a786375bf +Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/5fb29c8fb65c4a12b69dd3531cfe7bce/awards/7957eb73ee0e4bde954e87031a364f27 { "data": { "status": "pending", @@ -68,7 +68,7 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/5fb29c8fb65c4a12 } } ], - "id": "68ea182233e3452d9017623a786375bf", + "id": "7957eb73ee0e4bde954e87031a364f27", "value": { "currency": "UAH", "amount": 475000.0, diff --git a/docs/source/tendering/limited/http/tutorial/tender-contract-period.http b/docs/source/tendering/limited/http/tutorial/tender-contract-period.http index cd932ea5d3..dc1afbc922 100644 --- a/docs/source/tendering/limited/http/tutorial/tender-contract-period.http +++ b/docs/source/tendering/limited/http/tutorial/tender-contract-period.http @@ -44,7 +44,7 @@ Content-Type: application/json; charset=UTF-8 "startDate": "2020-06-04T00:00:00+02:00", "endDate": "2020-07-04T00:00:00+02:00" }, - "id": "ca90fedbd6494c9588a959536fe7a354", + "id": "3cbf25c0bb094819a3084be21bc85cd7", "unit": { "code": "MON", "name": "month", @@ -92,7 +92,7 @@ Content-Type: application/json; charset=UTF-8 }, "dateSigned": "2020-05-15T01:00:00+03:00", "date": "2020-05-15T01:00:00+03:00", - "awardID": "68ea182233e3452d9017623a786375bf", + "awardID": "7957eb73ee0e4bde954e87031a364f27", "id": "ec50d5084bd940d68482479c4834cdf4", "contractID": "UA-2020-05-15-000001-1" } diff --git a/docs/source/tendering/limited/http/tutorial/tender-contract-set-contract-value.http b/docs/source/tendering/limited/http/tutorial/tender-contract-set-contract-value.http index a7cbb972ec..0cd9b6295d 100644 --- a/docs/source/tendering/limited/http/tutorial/tender-contract-set-contract-value.http +++ b/docs/source/tendering/limited/http/tutorial/tender-contract-set-contract-value.http @@ -44,7 +44,7 @@ Content-Type: application/json; charset=UTF-8 "startDate": "2020-06-04T00:00:00+02:00", "endDate": "2020-07-04T00:00:00+02:00" }, - "id": "ca90fedbd6494c9588a959536fe7a354", + "id": "3cbf25c0bb094819a3084be21bc85cd7", "unit": { "code": "MON", "name": "month" @@ -82,7 +82,7 @@ Content-Type: application/json; charset=UTF-8 "valueAddedTaxIncluded": true }, "date": "2020-05-15T01:00:00+03:00", - "awardID": "68ea182233e3452d9017623a786375bf", + "awardID": "7957eb73ee0e4bde954e87031a364f27", "id": "ec50d5084bd940d68482479c4834cdf4", "contractID": "UA-2020-05-15-000001-1" } diff --git a/docs/source/tendering/limited/http/tutorial/tender-contract-set-contract_items_unit-value.http b/docs/source/tendering/limited/http/tutorial/tender-contract-set-contract_items_unit-value.http index 998291be34..fa56772db1 100644 --- a/docs/source/tendering/limited/http/tutorial/tender-contract-set-contract_items_unit-value.http +++ b/docs/source/tendering/limited/http/tutorial/tender-contract-set-contract_items_unit-value.http @@ -49,7 +49,7 @@ Content-Type: application/json; charset=UTF-8 "startDate": "2020-06-04T00:00:00+02:00", "endDate": "2020-07-04T00:00:00+02:00" }, - "id": "ca90fedbd6494c9588a959536fe7a354", + "id": "3cbf25c0bb094819a3084be21bc85cd7", "unit": { "code": "MON", "name": "month", @@ -92,7 +92,7 @@ Content-Type: application/json; charset=UTF-8 "valueAddedTaxIncluded": true }, "date": "2020-05-15T01:00:00+03:00", - "awardID": "68ea182233e3452d9017623a786375bf", + "awardID": "7957eb73ee0e4bde954e87031a364f27", "id": "ec50d5084bd940d68482479c4834cdf4", "contractID": "UA-2020-05-15-000001-1" } diff --git a/docs/source/tendering/limited/http/tutorial/tender-contract-sign-date.http b/docs/source/tendering/limited/http/tutorial/tender-contract-sign-date.http index 891ce0f67b..27ac19e440 100644 --- a/docs/source/tendering/limited/http/tutorial/tender-contract-sign-date.http +++ b/docs/source/tendering/limited/http/tutorial/tender-contract-sign-date.http @@ -41,7 +41,7 @@ Content-Type: application/json; charset=UTF-8 "startDate": "2020-06-04T00:00:00+02:00", "endDate": "2020-07-04T00:00:00+02:00" }, - "id": "ca90fedbd6494c9588a959536fe7a354", + "id": "3cbf25c0bb094819a3084be21bc85cd7", "unit": { "code": "MON", "name": "month", @@ -85,7 +85,7 @@ Content-Type: application/json; charset=UTF-8 }, "dateSigned": "2020-05-15T01:00:00+03:00", "date": "2020-05-15T01:00:00+03:00", - "awardID": "68ea182233e3452d9017623a786375bf", + "awardID": "7957eb73ee0e4bde954e87031a364f27", "id": "ec50d5084bd940d68482479c4834cdf4", "contractID": "UA-2020-05-15-000001-1" } diff --git a/docs/source/tendering/limited/http/tutorial/tender-contract-sign.http b/docs/source/tendering/limited/http/tutorial/tender-contract-sign.http index e902e0e31f..11a991367d 100644 --- a/docs/source/tendering/limited/http/tutorial/tender-contract-sign.http +++ b/docs/source/tendering/limited/http/tutorial/tender-contract-sign.http @@ -63,7 +63,7 @@ Content-Type: application/json; charset=UTF-8 "startDate": "2020-06-04T00:00:00+02:00", "endDate": "2020-07-04T00:00:00+02:00" }, - "id": "ca90fedbd6494c9588a959536fe7a354", + "id": "3cbf25c0bb094819a3084be21bc85cd7", "unit": { "code": "MON", "name": "month", @@ -111,7 +111,7 @@ Content-Type: application/json; charset=UTF-8 "valueAddedTaxIncluded": true }, "date": "2020-05-15T01:00:01+03:00", - "awardID": "68ea182233e3452d9017623a786375bf", + "awardID": "7957eb73ee0e4bde954e87031a364f27", "id": "ec50d5084bd940d68482479c4834cdf4", "contractID": "UA-2020-05-15-000001-1" } diff --git a/docs/source/tendering/limited/http/tutorial/tender-negotiation-award-approve.http b/docs/source/tendering/limited/http/tutorial/tender-negotiation-award-approve.http index 3198ed532b..baa6c55636 100644 --- a/docs/source/tendering/limited/http/tutorial/tender-negotiation-award-approve.http +++ b/docs/source/tendering/limited/http/tutorial/tender-negotiation-award-approve.http @@ -1,4 +1,4 @@ -PATCH /api/2.5/tenders/26b780552e084bbcb2b53c5383a6e976/awards/3d3e484cb2eb4d3386377ed2c400d926?acc_token=df3d7d3c62c74918a4905630dbce126b HTTP/1.0 +PATCH /api/2.5/tenders/26b780552e084bbcb2b53c5383a6e976/awards/25e94c29b961421a9128a267c2ffe263?acc_token=df3d7d3c62c74918a4905630dbce126b HTTP/1.0 Authorization: Bearer broker Content-Length: 49 Content-Type: application/json @@ -50,7 +50,7 @@ Content-Type: application/json; charset=UTF-8 }, "qualified": true, "date": "2020-05-15T01:00:00+03:00", - "id": "3d3e484cb2eb4d3386377ed2c400d926" + "id": "25e94c29b961421a9128a267c2ffe263" } } diff --git a/docs/source/tendering/limited/http/tutorial/tender-negotiation-award.http b/docs/source/tendering/limited/http/tutorial/tender-negotiation-award.http index cbafa43ba9..4c354a6f92 100644 --- a/docs/source/tendering/limited/http/tutorial/tender-negotiation-award.http +++ b/docs/source/tendering/limited/http/tutorial/tender-negotiation-award.http @@ -40,7 +40,7 @@ DATA: Response: 201 Created Content-Type: application/json; charset=UTF-8 -Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/26b780552e084bbcb2b53c5383a6e976/awards/3d3e484cb2eb4d3386377ed2c400d926 +Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/26b780552e084bbcb2b53c5383a6e976/awards/25e94c29b961421a9128a267c2ffe263 { "data": { "status": "pending", @@ -68,7 +68,7 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/26b780552e084bbc } } ], - "id": "3d3e484cb2eb4d3386377ed2c400d926", + "id": "25e94c29b961421a9128a267c2ffe263", "value": { "currency": "UAH", "amount": 475000.0, diff --git a/docs/source/tendering/limited/http/tutorial/tender-negotiation-contract-sign.http b/docs/source/tendering/limited/http/tutorial/tender-negotiation-contract-sign.http index bc34ee7c5b..65dc88bbb9 100644 --- a/docs/source/tendering/limited/http/tutorial/tender-negotiation-contract-sign.http +++ b/docs/source/tendering/limited/http/tutorial/tender-negotiation-contract-sign.http @@ -41,7 +41,7 @@ Content-Type: application/json; charset=UTF-8 "startDate": "2020-06-04T00:00:00+02:00", "endDate": "2020-07-04T00:00:00+02:00" }, - "id": "35207e5ce4404a63a76870f2067cd4f4", + "id": "08b6cc454279495f8d2a561b50d74611", "quantity": 1.0 } ], @@ -76,7 +76,7 @@ Content-Type: application/json; charset=UTF-8 }, "dateSigned": "2020-05-15T01:00:01+03:00", "date": "2020-05-15T01:00:01+03:00", - "awardID": "3d3e484cb2eb4d3386377ed2c400d926", + "awardID": "25e94c29b961421a9128a267c2ffe263", "id": "961703907d164d1185e860612c0a8fc8", "contractID": "UA-2020-05-15-000001-1" } @@ -128,7 +128,7 @@ Content-Type: application/json; charset=UTF-8 }, "qualified": true, "date": "2020-05-15T01:00:00+03:00", - "id": "3d3e484cb2eb4d3386377ed2c400d926" + "id": "25e94c29b961421a9128a267c2ffe263" } ], "id": "26b780552e084bbcb2b53c5383a6e976" diff --git a/docs/source/tendering/limited/http/tutorial/tender-negotiation-quick-award-approve.http b/docs/source/tendering/limited/http/tutorial/tender-negotiation-quick-award-approve.http index 9886f3cc89..1afb3ff7b1 100644 --- a/docs/source/tendering/limited/http/tutorial/tender-negotiation-quick-award-approve.http +++ b/docs/source/tendering/limited/http/tutorial/tender-negotiation-quick-award-approve.http @@ -1,4 +1,4 @@ -PATCH /api/2.5/tenders/26b780552e084bbcb2b53c5383a6e976/awards/3d3e484cb2eb4d3386377ed2c400d926?acc_token=df3d7d3c62c74918a4905630dbce126b HTTP/1.0 +PATCH /api/2.5/tenders/26b780552e084bbcb2b53c5383a6e976/awards/25e94c29b961421a9128a267c2ffe263?acc_token=df3d7d3c62c74918a4905630dbce126b HTTP/1.0 Authorization: Bearer broker Content-Length: 49 Content-Type: application/json @@ -50,7 +50,7 @@ Content-Type: application/json; charset=UTF-8 }, "qualified": true, "date": "2020-05-15T01:00:00+03:00", - "id": "3d3e484cb2eb4d3386377ed2c400d926" + "id": "25e94c29b961421a9128a267c2ffe263" } } diff --git a/docs/source/tendering/limited/http/tutorial/tender-negotiation-quick-award.http b/docs/source/tendering/limited/http/tutorial/tender-negotiation-quick-award.http index cbafa43ba9..4c354a6f92 100644 --- a/docs/source/tendering/limited/http/tutorial/tender-negotiation-quick-award.http +++ b/docs/source/tendering/limited/http/tutorial/tender-negotiation-quick-award.http @@ -40,7 +40,7 @@ DATA: Response: 201 Created Content-Type: application/json; charset=UTF-8 -Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/26b780552e084bbcb2b53c5383a6e976/awards/3d3e484cb2eb4d3386377ed2c400d926 +Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/26b780552e084bbcb2b53c5383a6e976/awards/25e94c29b961421a9128a267c2ffe263 { "data": { "status": "pending", @@ -68,7 +68,7 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/26b780552e084bbc } } ], - "id": "3d3e484cb2eb4d3386377ed2c400d926", + "id": "25e94c29b961421a9128a267c2ffe263", "value": { "currency": "UAH", "amount": 475000.0, diff --git a/docs/source/tendering/limited/http/tutorial/tender-negotiation-quick-contract-sign.http b/docs/source/tendering/limited/http/tutorial/tender-negotiation-quick-contract-sign.http index f69fce4e90..400eda7bd8 100644 --- a/docs/source/tendering/limited/http/tutorial/tender-negotiation-quick-contract-sign.http +++ b/docs/source/tendering/limited/http/tutorial/tender-negotiation-quick-contract-sign.http @@ -41,7 +41,7 @@ Content-Type: application/json; charset=UTF-8 "startDate": "2020-06-04T00:00:00+02:00", "endDate": "2020-07-04T00:00:00+02:00" }, - "id": "35207e5ce4404a63a76870f2067cd4f4", + "id": "08b6cc454279495f8d2a561b50d74611", "quantity": 1.0 } ], @@ -76,7 +76,7 @@ Content-Type: application/json; charset=UTF-8 }, "dateSigned": "2020-05-15T01:00:01+03:00", "date": "2020-05-15T01:00:01+03:00", - "awardID": "3d3e484cb2eb4d3386377ed2c400d926", + "awardID": "25e94c29b961421a9128a267c2ffe263", "id": "0b3c1a9fcf054fa98d15801d166c4c87", "contractID": "UA-2020-05-15-000001-1" } diff --git a/docs/source/tendering/limited/http/tutorial/update-cancellation-doc.http b/docs/source/tendering/limited/http/tutorial/update-cancellation-doc.http index ced5ca17da..35bc7862df 100644 --- a/docs/source/tendering/limited/http/tutorial/update-cancellation-doc.http +++ b/docs/source/tendering/limited/http/tutorial/update-cancellation-doc.http @@ -1,4 +1,4 @@ -PUT /api/2.5/tenders/26b780552e084bbcb2b53c5383a6e976/cancellations/5fb58f3fb6324286886aa83b15f2e0db/documents/7ce706c799a7481990ed0e68090d431d?acc_token=df3d7d3c62c74918a4905630dbce126b HTTP/1.0 +PUT /api/2.5/tenders/26b780552e084bbcb2b53c5383a6e976/cancellations/efdf6c101c54481eb17df7c76a8a9e0c/documents/7ce706c799a7481990ed0e68090d431d?acc_token=df3d7d3c62c74918a4905630dbce126b HTTP/1.0 Authorization: Bearer broker Content-Length: 145 Content-Type: multipart/form-data; boundary=---BOUNDARY diff --git a/docs/source/tendering/limited/http/tutorial/update-cancellation-reasonType.http b/docs/source/tendering/limited/http/tutorial/update-cancellation-reasonType.http index f342800e00..c4c634f4b1 100644 --- a/docs/source/tendering/limited/http/tutorial/update-cancellation-reasonType.http +++ b/docs/source/tendering/limited/http/tutorial/update-cancellation-reasonType.http @@ -1,4 +1,4 @@ -PATCH /api/2.5/tenders/26b780552e084bbcb2b53c5383a6e976/cancellations/5fb58f3fb6324286886aa83b15f2e0db?acc_token=df3d7d3c62c74918a4905630dbce126b HTTP/1.0 +PATCH /api/2.5/tenders/26b780552e084bbcb2b53c5383a6e976/cancellations/efdf6c101c54481eb17df7c76a8a9e0c?acc_token=df3d7d3c62c74918a4905630dbce126b HTTP/1.0 Authorization: Bearer broker Content-Length: 37 Content-Type: application/json @@ -19,7 +19,7 @@ Content-Type: application/json; charset=UTF-8 "reasonType": "unFixable", "date": "2020-05-15T01:00:01+03:00", "cancellationOf": "tender", - "id": "5fb58f3fb6324286886aa83b15f2e0db" + "id": "efdf6c101c54481eb17df7c76a8a9e0c" } } diff --git a/docs/source/tendering/limited/http/tutorial/upload-cancellation-doc.http b/docs/source/tendering/limited/http/tutorial/upload-cancellation-doc.http index f0947a0a00..557a76ed54 100644 --- a/docs/source/tendering/limited/http/tutorial/upload-cancellation-doc.http +++ b/docs/source/tendering/limited/http/tutorial/upload-cancellation-doc.http @@ -1,4 +1,4 @@ -POST /api/2.5/tenders/26b780552e084bbcb2b53c5383a6e976/cancellations/5fb58f3fb6324286886aa83b15f2e0db/documents?acc_token=df3d7d3c62c74918a4905630dbce126b HTTP/1.0 +POST /api/2.5/tenders/26b780552e084bbcb2b53c5383a6e976/cancellations/efdf6c101c54481eb17df7c76a8a9e0c/documents?acc_token=df3d7d3c62c74918a4905630dbce126b HTTP/1.0 Authorization: Bearer broker Content-Length: 142 Content-Type: multipart/form-data; boundary=---BOUNDARY @@ -14,7 +14,7 @@ content Response: 201 Created Content-Type: application/json; charset=UTF-8 -Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/26b780552e084bbcb2b53c5383a6e976/cancellations/5fb58f3fb6324286886aa83b15f2e0db/documents/7ce706c799a7481990ed0e68090d431d +Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/26b780552e084bbcb2b53c5383a6e976/cancellations/efdf6c101c54481eb17df7c76a8a9e0c/documents/7ce706c799a7481990ed0e68090d431d { "data": { "hash": "md5:00000000000000000000000000000000", diff --git a/docs/source/tendering/openeu/http/multiple_lots_tutorial/bid-lot1-invalid-view.http b/docs/source/tendering/openeu/http/multiple_lots_tutorial/bid-lot1-invalid-view.http index 05f23f34dd..f083403011 100644 --- a/docs/source/tendering/openeu/http/multiple_lots_tutorial/bid-lot1-invalid-view.http +++ b/docs/source/tendering/openeu/http/multiple_lots_tutorial/bid-lot1-invalid-view.http @@ -1,4 +1,4 @@ -GET /api/2.5/tenders/52f1b75138ab4b2c87feff205f2a06f4/bids/1db2a89bad604311b7166807eb63d4e3?acc_token=54d541dfa06146e2a6a08281ec8f847a HTTP/1.0 +GET /api/2.5/tenders/52f1b75138ab4b2c87feff205f2a06f4/bids/28d7b15324514c31b62f48b15a1b0a2c?acc_token=54d541dfa06146e2a6a08281ec8f847a HTTP/1.0 Authorization: Bearer broker Host: lb-api-sandbox.prozorro.gov.ua @@ -7,7 +7,7 @@ Content-Type: application/json; charset=UTF-8 { "data": { "status": "invalid", - "id": "1db2a89bad604311b7166807eb63d4e3" + "id": "28d7b15324514c31b62f48b15a1b0a2c" } } diff --git a/docs/source/tendering/openeu/http/multiple_lots_tutorial/bid-lot1-update-view.http b/docs/source/tendering/openeu/http/multiple_lots_tutorial/bid-lot1-update-view.http index 01f74089e4..de23212b14 100644 --- a/docs/source/tendering/openeu/http/multiple_lots_tutorial/bid-lot1-update-view.http +++ b/docs/source/tendering/openeu/http/multiple_lots_tutorial/bid-lot1-update-view.http @@ -1,4 +1,4 @@ -PATCH /api/2.5/tenders/52f1b75138ab4b2c87feff205f2a06f4/bids/1db2a89bad604311b7166807eb63d4e3?acc_token=54d541dfa06146e2a6a08281ec8f847a HTTP/1.0 +PATCH /api/2.5/tenders/52f1b75138ab4b2c87feff205f2a06f4/bids/28d7b15324514c31b62f48b15a1b0a2c?acc_token=54d541dfa06146e2a6a08281ec8f847a HTTP/1.0 Authorization: Bearer broker Content-Length: 214 Content-Type: application/json @@ -9,7 +9,7 @@ DATA: "status": "pending", "lotValues": [ { - "relatedLot": "a678eaf5090d45db8077d4ecd36154e0", + "relatedLot": "fc297ff6c6a74743a96c6b274bae11c0", "value": { "amount": 500 }, @@ -24,10 +24,9 @@ Content-Type: application/json; charset=UTF-8 { "data": { "status": "pending", - "selfEligible": true, "lotValues": [ { - "relatedLot": "a678eaf5090d45db8077d4ecd36154e0", + "relatedLot": "fc297ff6c6a74743a96c6b274bae11c0", "date": "2020-05-15T01:00:00+03:00", "status": "pending", "value": { @@ -38,7 +37,7 @@ Content-Type: application/json; charset=UTF-8 "subcontractingDetails": "ДКП «Орфей»" } ], - "selfQualified": true, + "id": "28d7b15324514c31b62f48b15a1b0a2c", "tenderers": [ { "contactPoint": { @@ -63,7 +62,7 @@ Content-Type: application/json; charset=UTF-8 } ], "date": "2020-05-15T01:00:00+03:00", - "id": "1db2a89bad604311b7166807eb63d4e3" + "selfQualified": true } } diff --git a/docs/source/tendering/openeu/http/multiple_lots_tutorial/bid-lot1.http b/docs/source/tendering/openeu/http/multiple_lots_tutorial/bid-lot1.http index d9ec8b4b59..173f2002f9 100644 --- a/docs/source/tendering/openeu/http/multiple_lots_tutorial/bid-lot1.http +++ b/docs/source/tendering/openeu/http/multiple_lots_tutorial/bid-lot1.http @@ -1,16 +1,15 @@ POST /api/2.5/tenders/52f1b75138ab4b2c87feff205f2a06f4/bids HTTP/1.0 Authorization: Bearer broker -Content-Length: 1049 +Content-Length: 1027 Content-Type: application/json Host: lb-api-sandbox.prozorro.gov.ua DATA: { "data": { - "selfEligible": true, "selfQualified": true, "lotValues": [ { - "relatedLot": "a678eaf5090d45db8077d4ecd36154e0", + "relatedLot": "fc297ff6c6a74743a96c6b274bae11c0", "value": { "amount": 500 }, @@ -45,7 +44,7 @@ DATA: Response: 201 Created Content-Type: application/json; charset=UTF-8 -Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/52f1b75138ab4b2c87feff205f2a06f4/bids/1db2a89bad604311b7166807eb63d4e3 +Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/52f1b75138ab4b2c87feff205f2a06f4/bids/28d7b15324514c31b62f48b15a1b0a2c { "access": { "transfer": "2dad90674a194befaeb85142d8ae2e22", @@ -53,10 +52,9 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/52f1b75138ab4b2c }, "data": { "status": "pending", - "selfEligible": true, "lotValues": [ { - "relatedLot": "a678eaf5090d45db8077d4ecd36154e0", + "relatedLot": "fc297ff6c6a74743a96c6b274bae11c0", "date": "2020-05-15T01:00:00+03:00", "status": "pending", "value": { @@ -67,7 +65,7 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/52f1b75138ab4b2c "subcontractingDetails": "ДКП «Орфей», Україна" } ], - "selfQualified": true, + "id": "28d7b15324514c31b62f48b15a1b0a2c", "tenderers": [ { "contactPoint": { @@ -92,7 +90,7 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/52f1b75138ab4b2c } ], "date": "2020-05-15T01:00:00+03:00", - "id": "1db2a89bad604311b7166807eb63d4e3" + "selfQualified": true } } diff --git a/docs/source/tendering/openeu/http/multiple_lots_tutorial/bid-lot2-update-view.http b/docs/source/tendering/openeu/http/multiple_lots_tutorial/bid-lot2-update-view.http index 3395603f60..f1e3f8c749 100644 --- a/docs/source/tendering/openeu/http/multiple_lots_tutorial/bid-lot2-update-view.http +++ b/docs/source/tendering/openeu/http/multiple_lots_tutorial/bid-lot2-update-view.http @@ -1,4 +1,4 @@ -PATCH /api/2.5/tenders/52f1b75138ab4b2c87feff205f2a06f4/bids/f4c99b9e469349e296d81e700168a070?acc_token=765f074dacb14d31b625118945f17413 HTTP/1.0 +PATCH /api/2.5/tenders/52f1b75138ab4b2c87feff205f2a06f4/bids/ab9e4059fff24d9aa7b0c32166fce3ba?acc_token=765f074dacb14d31b625118945f17413 HTTP/1.0 Authorization: Bearer broker Content-Length: 124 Content-Type: application/json @@ -9,7 +9,7 @@ DATA: "status": "pending", "lotValues": [ { - "relatedLot": "a678eaf5090d45db8077d4ecd36154e0", + "relatedLot": "fc297ff6c6a74743a96c6b274bae11c0", "value": { "amount": 500 } @@ -23,10 +23,9 @@ Content-Type: application/json; charset=UTF-8 { "data": { "status": "pending", - "selfEligible": true, "lotValues": [ { - "relatedLot": "a678eaf5090d45db8077d4ecd36154e0", + "relatedLot": "fc297ff6c6a74743a96c6b274bae11c0", "date": "2020-05-15T01:00:00+03:00", "status": "pending", "value": { @@ -36,7 +35,7 @@ Content-Type: application/json; charset=UTF-8 } } ], - "selfQualified": true, + "id": "ab9e4059fff24d9aa7b0c32166fce3ba", "tenderers": [ { "contactPoint": { @@ -61,7 +60,7 @@ Content-Type: application/json; charset=UTF-8 } ], "date": "2020-05-15T01:00:00+03:00", - "id": "f4c99b9e469349e296d81e700168a070" + "selfQualified": true } } diff --git a/docs/source/tendering/openeu/http/multiple_lots_tutorial/bid-lot2.http b/docs/source/tendering/openeu/http/multiple_lots_tutorial/bid-lot2.http index 4aedae575d..6c827c7eaf 100644 --- a/docs/source/tendering/openeu/http/multiple_lots_tutorial/bid-lot2.http +++ b/docs/source/tendering/openeu/http/multiple_lots_tutorial/bid-lot2.http @@ -1,22 +1,21 @@ POST /api/2.5/tenders/52f1b75138ab4b2c87feff205f2a06f4/bids HTTP/1.0 Authorization: Bearer broker -Content-Length: 1122 +Content-Length: 1100 Content-Type: application/json Host: lb-api-sandbox.prozorro.gov.ua DATA: { "data": { - "selfEligible": true, "selfQualified": true, "lotValues": [ { - "relatedLot": "a678eaf5090d45db8077d4ecd36154e0", + "relatedLot": "fc297ff6c6a74743a96c6b274bae11c0", "value": { "amount": 500 } }, { - "relatedLot": "885ae10af23944619f6730aa24a94d92", + "relatedLot": "d9ed347dda65496aa56d9f7692c949c3", "value": { "amount": 500 }, @@ -51,7 +50,7 @@ DATA: Response: 201 Created Content-Type: application/json; charset=UTF-8 -Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/52f1b75138ab4b2c87feff205f2a06f4/bids/f4c99b9e469349e296d81e700168a070 +Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/52f1b75138ab4b2c87feff205f2a06f4/bids/ab9e4059fff24d9aa7b0c32166fce3ba { "access": { "transfer": "ec271c4d08e64d4fbf2162cc3399ba08", @@ -59,10 +58,9 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/52f1b75138ab4b2c }, "data": { "status": "pending", - "selfEligible": true, "lotValues": [ { - "relatedLot": "a678eaf5090d45db8077d4ecd36154e0", + "relatedLot": "fc297ff6c6a74743a96c6b274bae11c0", "date": "2020-05-15T01:00:00+03:00", "status": "pending", "value": { @@ -72,7 +70,7 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/52f1b75138ab4b2c } }, { - "relatedLot": "885ae10af23944619f6730aa24a94d92", + "relatedLot": "d9ed347dda65496aa56d9f7692c949c3", "date": "2020-05-15T01:00:00+03:00", "status": "pending", "value": { @@ -83,7 +81,7 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/52f1b75138ab4b2c "subcontractingDetails": "ДКП «Укр Прінт», Україна" } ], - "selfQualified": true, + "id": "ab9e4059fff24d9aa7b0c32166fce3ba", "tenderers": [ { "contactPoint": { @@ -108,7 +106,7 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/52f1b75138ab4b2c } ], "date": "2020-05-15T01:00:00+03:00", - "id": "f4c99b9e469349e296d81e700168a070" + "selfQualified": true } } diff --git a/docs/source/tendering/openeu/http/multiple_lots_tutorial/qualifications-view.http b/docs/source/tendering/openeu/http/multiple_lots_tutorial/qualifications-view.http index cb1a9e2e29..097fb8e760 100644 --- a/docs/source/tendering/openeu/http/multiple_lots_tutorial/qualifications-view.http +++ b/docs/source/tendering/openeu/http/multiple_lots_tutorial/qualifications-view.http @@ -8,19 +8,19 @@ Content-Type: application/json; charset=UTF-8 "data": [ { "status": "pending", - "lotID": "a678eaf5090d45db8077d4ecd36154e0", + "lotID": "fc297ff6c6a74743a96c6b274bae11c0", "eligible": false, "qualified": false, - "bidID": "1db2a89bad604311b7166807eb63d4e3", + "bidID": "28d7b15324514c31b62f48b15a1b0a2c", "date": "2020-05-15T01:00:00+03:00", "id": "69e23d94b0ec4a4cbf777d2557fe598a" }, { "status": "pending", - "lotID": "a678eaf5090d45db8077d4ecd36154e0", + "lotID": "fc297ff6c6a74743a96c6b274bae11c0", "eligible": false, "qualified": false, - "bidID": "f4c99b9e469349e296d81e700168a070", + "bidID": "ab9e4059fff24d9aa7b0c32166fce3ba", "date": "2020-05-15T01:00:00+03:00", "id": "73fa90c6e4a746cb859d4058ad16e5bf" } diff --git a/docs/source/tendering/openeu/http/multiple_lots_tutorial/tender-activate-qualifications.http b/docs/source/tendering/openeu/http/multiple_lots_tutorial/tender-activate-qualifications.http index 7fc71529ae..651dacef48 100644 --- a/docs/source/tendering/openeu/http/multiple_lots_tutorial/tender-activate-qualifications.http +++ b/docs/source/tendering/openeu/http/multiple_lots_tutorial/tender-activate-qualifications.http @@ -17,10 +17,10 @@ Content-Type: application/json; charset=UTF-8 { "data": { "status": "active", - "lotID": "a678eaf5090d45db8077d4ecd36154e0", + "lotID": "fc297ff6c6a74743a96c6b274bae11c0", "eligible": true, "qualified": true, - "bidID": "1db2a89bad604311b7166807eb63d4e3", + "bidID": "28d7b15324514c31b62f48b15a1b0a2c", "date": "2020-05-15T01:00:00+03:00", "id": "69e23d94b0ec4a4cbf777d2557fe598a" } diff --git a/docs/source/tendering/openeu/http/multiple_lots_tutorial/tender-add-lot.http b/docs/source/tendering/openeu/http/multiple_lots_tutorial/tender-add-lot.http index aad352e5d7..9ac8cbf94a 100644 --- a/docs/source/tendering/openeu/http/multiple_lots_tutorial/tender-add-lot.http +++ b/docs/source/tendering/openeu/http/multiple_lots_tutorial/tender-add-lot.http @@ -21,7 +21,7 @@ DATA: Response: 201 Created Content-Type: application/json; charset=UTF-8 -Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/52f1b75138ab4b2c87feff205f2a06f4/lots/a678eaf5090d45db8077d4ecd36154e0 +Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/52f1b75138ab4b2c87feff205f2a06f4/lots/fc297ff6c6a74743a96c6b274bae11c0 { "data": { "status": "active", @@ -41,7 +41,7 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/52f1b75138ab4b2c "valueAddedTaxIncluded": true }, "date": "2020-05-15T01:00:00+03:00", - "id": "a678eaf5090d45db8077d4ecd36154e0" + "id": "fc297ff6c6a74743a96c6b274bae11c0" } } diff --git a/docs/source/tendering/openeu/http/multiple_lots_tutorial/tender-add-relatedLot-to-item.http b/docs/source/tendering/openeu/http/multiple_lots_tutorial/tender-add-relatedLot-to-item.http index 23625dd04d..4e9dc5d371 100644 --- a/docs/source/tendering/openeu/http/multiple_lots_tutorial/tender-add-relatedLot-to-item.http +++ b/docs/source/tendering/openeu/http/multiple_lots_tutorial/tender-add-relatedLot-to-item.http @@ -8,10 +8,10 @@ DATA: "data": { "items": [ { - "relatedLot": "a678eaf5090d45db8077d4ecd36154e0" + "relatedLot": "fc297ff6c6a74743a96c6b274bae11c0" }, { - "relatedLot": "885ae10af23944619f6730aa24a94d92" + "relatedLot": "d9ed347dda65496aa56d9f7692c949c3" } ] } @@ -82,7 +82,7 @@ Content-Type: application/json; charset=UTF-8 "valueAddedTaxIncluded": true }, "date": "2020-05-15T01:00:00+03:00", - "id": "a678eaf5090d45db8077d4ecd36154e0" + "id": "fc297ff6c6a74743a96c6b274bae11c0" }, { "status": "active", @@ -102,7 +102,7 @@ Content-Type: application/json; charset=UTF-8 "valueAddedTaxIncluded": true }, "date": "2020-05-15T01:00:00+03:00", - "id": "885ae10af23944619f6730aa24a94d92" + "id": "d9ed347dda65496aa56d9f7692c949c3" } ], "tenderID": "UA-2020-05-15-000001", @@ -138,7 +138,7 @@ Content-Type: application/json; charset=UTF-8 }, "percentage": 54.45, "type": "financing", - "id": "fb9912a628e547ec86fd4052b35fd066" + "id": "f2ad38d355ac439d9491fc812a6a6b5f" } ], "minimalStep": { @@ -148,7 +148,7 @@ Content-Type: application/json; charset=UTF-8 }, "items": [ { - "relatedLot": "a678eaf5090d45db8077d4ecd36154e0", + "relatedLot": "fc297ff6c6a74743a96c6b274bae11c0", "description": "Послуги шкільних їдалень", "classification": { "scheme": "ДК021", @@ -174,11 +174,11 @@ Content-Type: application/json; charset=UTF-8 "startDate": "2020-06-04T00:00:00+02:00", "endDate": "2020-07-04T00:00:00+02:00" }, - "id": "79cd11ac44934e09a6ccc517d3810dd4", + "id": "0124f833a40d45a29d30d291bee35ecb", "quantity": 1.0 }, { - "relatedLot": "885ae10af23944619f6730aa24a94d92", + "relatedLot": "d9ed347dda65496aa56d9f7692c949c3", "description": "Послуги шкільних їдалень", "classification": { "scheme": "ДК021", @@ -204,7 +204,7 @@ Content-Type: application/json; charset=UTF-8 "startDate": "2020-06-04T00:00:00+02:00", "endDate": "2020-07-04T00:00:00+02:00" }, - "id": "faa12ba0bce042bfa5ad1bc8c827f6e9", + "id": "d2b44da9ce9f46bc896d32b570fab363", "quantity": 1.0 } ], diff --git a/docs/source/tendering/openeu/http/multiple_lots_tutorial/tender-invalid-all-bids.http b/docs/source/tendering/openeu/http/multiple_lots_tutorial/tender-invalid-all-bids.http index 34df5e2d33..a9e9a644bc 100644 --- a/docs/source/tendering/openeu/http/multiple_lots_tutorial/tender-invalid-all-bids.http +++ b/docs/source/tendering/openeu/http/multiple_lots_tutorial/tender-invalid-all-bids.http @@ -1,4 +1,4 @@ -PATCH /api/2.5/tenders/52f1b75138ab4b2c87feff205f2a06f4/lots/885ae10af23944619f6730aa24a94d92?acc_token=20ea9bdc44d84eec82cf2059f999ad42 HTTP/1.0 +PATCH /api/2.5/tenders/52f1b75138ab4b2c87feff205f2a06f4/lots/d9ed347dda65496aa56d9f7692c949c3?acc_token=20ea9bdc44d84eec82cf2059f999ad42 HTTP/1.0 Authorization: Bearer broker Content-Length: 36 Content-Type: application/json @@ -33,7 +33,7 @@ Content-Type: application/json; charset=UTF-8 "valueAddedTaxIncluded": true }, "date": "2020-05-15T01:00:00+03:00", - "id": "885ae10af23944619f6730aa24a94d92" + "id": "d9ed347dda65496aa56d9f7692c949c3" } } diff --git a/docs/source/tendering/openeu/http/multiple_lots_tutorial/tender-post-attempt-json-data.http b/docs/source/tendering/openeu/http/multiple_lots_tutorial/tender-post-attempt-json-data.http index 911ab46099..7dc0a66d27 100644 --- a/docs/source/tendering/openeu/http/multiple_lots_tutorial/tender-post-attempt-json-data.http +++ b/docs/source/tendering/openeu/http/multiple_lots_tutorial/tender-post-attempt-json-data.http @@ -218,7 +218,7 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/52f1b75138ab4b2c }, "percentage": 54.45, "type": "financing", - "id": "fb9912a628e547ec86fd4052b35fd066" + "id": "f2ad38d355ac439d9491fc812a6a6b5f" } ], "minimalStep": { @@ -253,7 +253,7 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/52f1b75138ab4b2c "startDate": "2020-06-04T00:00:00+02:00", "endDate": "2020-07-04T00:00:00+02:00" }, - "id": "79cd11ac44934e09a6ccc517d3810dd4", + "id": "0124f833a40d45a29d30d291bee35ecb", "quantity": 1.0 }, { @@ -282,7 +282,7 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/52f1b75138ab4b2c "startDate": "2020-06-04T00:00:00+02:00", "endDate": "2020-07-04T00:00:00+02:00" }, - "id": "faa12ba0bce042bfa5ad1bc8c827f6e9", + "id": "d2b44da9ce9f46bc896d32b570fab363", "quantity": 1.0 } ], diff --git a/docs/source/tendering/openeu/http/multiple_lots_tutorial/tender-view-pre-qualification-stand-still.http b/docs/source/tendering/openeu/http/multiple_lots_tutorial/tender-view-pre-qualification-stand-still.http index 455d155dc5..5a28aeef9f 100644 --- a/docs/source/tendering/openeu/http/multiple_lots_tutorial/tender-view-pre-qualification-stand-still.http +++ b/docs/source/tendering/openeu/http/multiple_lots_tutorial/tender-view-pre-qualification-stand-still.http @@ -18,13 +18,13 @@ Content-Type: application/json; charset=UTF-8 "status": "active.pre-qualification.stand-still", "mainProcurementCategory": "services", "complaintPeriod": { - "startDate": "2020-04-15T01:00:00+03:00", + "startDate": "2020-04-14T01:00:00+03:00", "endDate": "2020-05-11T00:00:00+03:00" }, "enquiryPeriod": { - "startDate": "2020-04-15T01:00:00+03:00", - "clarificationsUntil": "2020-05-09T00:00:00+03:00", - "endDate": "2020-05-05T01:00:00+03:00", + "startDate": "2020-04-14T01:00:00+03:00", + "clarificationsUntil": "2020-05-08T00:00:00+03:00", + "endDate": "2020-05-05T00:00:00+03:00", "invalidationDate": "2020-05-15T01:00:00+03:00" }, "submissionMethod": "electronicAuction", @@ -77,7 +77,7 @@ Content-Type: application/json; charset=UTF-8 "valueAddedTaxIncluded": true }, "date": "2020-05-15T01:00:00+03:00", - "id": "a678eaf5090d45db8077d4ecd36154e0" + "id": "fc297ff6c6a74743a96c6b274bae11c0" }, { "status": "unsuccessful", @@ -94,7 +94,7 @@ Content-Type: application/json; charset=UTF-8 "valueAddedTaxIncluded": true }, "date": "2020-05-15T01:00:00+03:00", - "id": "885ae10af23944619f6730aa24a94d92" + "id": "d9ed347dda65496aa56d9f7692c949c3" } ], "qualificationPeriod": { @@ -105,25 +105,25 @@ Content-Type: application/json; charset=UTF-8 "dateModified": "2020-05-15T01:00:00+03:00", "numberOfBids": 2, "tenderPeriod": { - "startDate": "2020-04-15T01:00:00+03:00", + "startDate": "2020-04-14T01:00:00+03:00", "endDate": "2020-05-15T01:00:00+03:00" }, "qualifications": [ { "status": "active", - "lotID": "a678eaf5090d45db8077d4ecd36154e0", + "lotID": "fc297ff6c6a74743a96c6b274bae11c0", "eligible": true, "qualified": true, - "bidID": "1db2a89bad604311b7166807eb63d4e3", + "bidID": "28d7b15324514c31b62f48b15a1b0a2c", "date": "2020-05-15T01:00:00+03:00", "id": "69e23d94b0ec4a4cbf777d2557fe598a" }, { "status": "active", - "lotID": "a678eaf5090d45db8077d4ecd36154e0", + "lotID": "fc297ff6c6a74743a96c6b274bae11c0", "eligible": true, "qualified": true, - "bidID": "f4c99b9e469349e296d81e700168a070", + "bidID": "ab9e4059fff24d9aa7b0c32166fce3ba", "date": "2020-05-15T01:00:00+03:00", "id": "73fa90c6e4a746cb859d4058ad16e5bf" } @@ -153,7 +153,7 @@ Content-Type: application/json; charset=UTF-8 }, "percentage": 54.45, "type": "financing", - "id": "fb9912a628e547ec86fd4052b35fd066" + "id": "f2ad38d355ac439d9491fc812a6a6b5f" } ], "minimalStep": { @@ -163,7 +163,7 @@ Content-Type: application/json; charset=UTF-8 }, "items": [ { - "relatedLot": "a678eaf5090d45db8077d4ecd36154e0", + "relatedLot": "fc297ff6c6a74743a96c6b274bae11c0", "description": "Послуги шкільних їдалень", "classification": { "scheme": "ДК021", @@ -189,11 +189,11 @@ Content-Type: application/json; charset=UTF-8 "startDate": "2020-06-04T00:00:00+02:00", "endDate": "2020-07-04T00:00:00+02:00" }, - "id": "79cd11ac44934e09a6ccc517d3810dd4", + "id": "0124f833a40d45a29d30d291bee35ecb", "quantity": 1.0 }, { - "relatedLot": "885ae10af23944619f6730aa24a94d92", + "relatedLot": "d9ed347dda65496aa56d9f7692c949c3", "description": "Послуги шкільних їдалень", "classification": { "scheme": "ДК021", @@ -219,14 +219,14 @@ Content-Type: application/json; charset=UTF-8 "startDate": "2020-06-04T00:00:00+02:00", "endDate": "2020-07-04T00:00:00+02:00" }, - "id": "faa12ba0bce042bfa5ad1bc8c827f6e9", + "id": "d2b44da9ce9f46bc896d32b570fab363", "quantity": 1.0 } ], "bids": [ { "status": "active", - "id": "1db2a89bad604311b7166807eb63d4e3", + "id": "28d7b15324514c31b62f48b15a1b0a2c", "tenderers": [ { "contactPoint": { @@ -253,7 +253,7 @@ Content-Type: application/json; charset=UTF-8 }, { "status": "active", - "id": "f4c99b9e469349e296d81e700168a070", + "id": "ab9e4059fff24d9aa7b0c32166fce3ba", "tenderers": [ { "contactPoint": { diff --git a/docs/source/tendering/openeu/http/multiple_lots_tutorial/tender-view-pre-qualification.http b/docs/source/tendering/openeu/http/multiple_lots_tutorial/tender-view-pre-qualification.http index 236fdb6963..4dc5b0d570 100644 --- a/docs/source/tendering/openeu/http/multiple_lots_tutorial/tender-view-pre-qualification.http +++ b/docs/source/tendering/openeu/http/multiple_lots_tutorial/tender-view-pre-qualification.http @@ -10,13 +10,13 @@ Content-Type: application/json; charset=UTF-8 "status": "active.pre-qualification", "mainProcurementCategory": "services", "complaintPeriod": { - "startDate": "2020-04-15T01:00:00+03:00", + "startDate": "2020-04-14T01:00:00+03:00", "endDate": "2020-05-11T00:00:00+03:00" }, "enquiryPeriod": { - "startDate": "2020-04-15T01:00:00+03:00", - "clarificationsUntil": "2020-05-09T00:00:00+03:00", - "endDate": "2020-05-05T01:00:00+03:00", + "startDate": "2020-04-14T01:00:00+03:00", + "clarificationsUntil": "2020-05-08T00:00:00+03:00", + "endDate": "2020-05-05T00:00:00+03:00", "invalidationDate": "2020-05-15T01:00:00+03:00" }, "submissionMethod": "electronicAuction", @@ -65,7 +65,7 @@ Content-Type: application/json; charset=UTF-8 "valueAddedTaxIncluded": true }, "date": "2020-05-15T01:00:00+03:00", - "id": "a678eaf5090d45db8077d4ecd36154e0" + "id": "fc297ff6c6a74743a96c6b274bae11c0" }, { "status": "unsuccessful", @@ -82,7 +82,7 @@ Content-Type: application/json; charset=UTF-8 "valueAddedTaxIncluded": true }, "date": "2020-05-15T01:00:00+03:00", - "id": "885ae10af23944619f6730aa24a94d92" + "id": "d9ed347dda65496aa56d9f7692c949c3" } ], "qualificationPeriod": { @@ -92,25 +92,25 @@ Content-Type: application/json; charset=UTF-8 "dateModified": "2020-05-15T01:00:00+03:00", "numberOfBids": 2, "tenderPeriod": { - "startDate": "2020-04-15T01:00:00+03:00", + "startDate": "2020-04-14T01:00:00+03:00", "endDate": "2020-05-15T01:00:00+03:00" }, "qualifications": [ { "status": "pending", - "lotID": "a678eaf5090d45db8077d4ecd36154e0", + "lotID": "fc297ff6c6a74743a96c6b274bae11c0", "eligible": false, "qualified": false, - "bidID": "1db2a89bad604311b7166807eb63d4e3", + "bidID": "28d7b15324514c31b62f48b15a1b0a2c", "date": "2020-05-15T01:00:00+03:00", "id": "69e23d94b0ec4a4cbf777d2557fe598a" }, { "status": "pending", - "lotID": "a678eaf5090d45db8077d4ecd36154e0", + "lotID": "fc297ff6c6a74743a96c6b274bae11c0", "eligible": false, "qualified": false, - "bidID": "f4c99b9e469349e296d81e700168a070", + "bidID": "ab9e4059fff24d9aa7b0c32166fce3ba", "date": "2020-05-15T01:00:00+03:00", "id": "73fa90c6e4a746cb859d4058ad16e5bf" } @@ -140,7 +140,7 @@ Content-Type: application/json; charset=UTF-8 }, "percentage": 54.45, "type": "financing", - "id": "fb9912a628e547ec86fd4052b35fd066" + "id": "f2ad38d355ac439d9491fc812a6a6b5f" } ], "minimalStep": { @@ -150,7 +150,7 @@ Content-Type: application/json; charset=UTF-8 }, "items": [ { - "relatedLot": "a678eaf5090d45db8077d4ecd36154e0", + "relatedLot": "fc297ff6c6a74743a96c6b274bae11c0", "description": "Послуги шкільних їдалень", "classification": { "scheme": "ДК021", @@ -176,11 +176,11 @@ Content-Type: application/json; charset=UTF-8 "startDate": "2020-06-04T00:00:00+02:00", "endDate": "2020-07-04T00:00:00+02:00" }, - "id": "79cd11ac44934e09a6ccc517d3810dd4", + "id": "0124f833a40d45a29d30d291bee35ecb", "quantity": 1.0 }, { - "relatedLot": "885ae10af23944619f6730aa24a94d92", + "relatedLot": "d9ed347dda65496aa56d9f7692c949c3", "description": "Послуги шкільних їдалень", "classification": { "scheme": "ДК021", @@ -206,14 +206,14 @@ Content-Type: application/json; charset=UTF-8 "startDate": "2020-06-04T00:00:00+02:00", "endDate": "2020-07-04T00:00:00+02:00" }, - "id": "faa12ba0bce042bfa5ad1bc8c827f6e9", + "id": "d2b44da9ce9f46bc896d32b570fab363", "quantity": 1.0 } ], "bids": [ { "status": "pending", - "id": "1db2a89bad604311b7166807eb63d4e3", + "id": "28d7b15324514c31b62f48b15a1b0a2c", "tenderers": [ { "contactPoint": { @@ -240,7 +240,7 @@ Content-Type: application/json; charset=UTF-8 }, { "status": "pending", - "id": "f4c99b9e469349e296d81e700168a070", + "id": "ab9e4059fff24d9aa7b0c32166fce3ba", "tenderers": [ { "contactPoint": { diff --git a/docs/source/tendering/openeu/http/multiple_lots_tutorial/tender-view.http b/docs/source/tendering/openeu/http/multiple_lots_tutorial/tender-view.http index fa57371711..70f277735c 100644 --- a/docs/source/tendering/openeu/http/multiple_lots_tutorial/tender-view.http +++ b/docs/source/tendering/openeu/http/multiple_lots_tutorial/tender-view.http @@ -66,7 +66,7 @@ Content-Type: application/json; charset=UTF-8 "valueAddedTaxIncluded": true }, "date": "2020-05-15T01:00:00+03:00", - "id": "a678eaf5090d45db8077d4ecd36154e0" + "id": "fc297ff6c6a74743a96c6b274bae11c0" }, { "status": "active", @@ -86,7 +86,7 @@ Content-Type: application/json; charset=UTF-8 "valueAddedTaxIncluded": true }, "date": "2020-05-15T01:00:00+03:00", - "id": "885ae10af23944619f6730aa24a94d92" + "id": "d9ed347dda65496aa56d9f7692c949c3" } ], "tenderID": "UA-2020-05-15-000001", @@ -122,7 +122,7 @@ Content-Type: application/json; charset=UTF-8 }, "percentage": 54.45, "type": "financing", - "id": "fb9912a628e547ec86fd4052b35fd066" + "id": "f2ad38d355ac439d9491fc812a6a6b5f" } ], "minimalStep": { @@ -132,7 +132,7 @@ Content-Type: application/json; charset=UTF-8 }, "items": [ { - "relatedLot": "a678eaf5090d45db8077d4ecd36154e0", + "relatedLot": "fc297ff6c6a74743a96c6b274bae11c0", "description": "Послуги шкільних їдалень", "classification": { "scheme": "ДК021", @@ -158,11 +158,11 @@ Content-Type: application/json; charset=UTF-8 "startDate": "2020-06-04T00:00:00+02:00", "endDate": "2020-07-04T00:00:00+02:00" }, - "id": "79cd11ac44934e09a6ccc517d3810dd4", + "id": "0124f833a40d45a29d30d291bee35ecb", "quantity": 1.0 }, { - "relatedLot": "885ae10af23944619f6730aa24a94d92", + "relatedLot": "d9ed347dda65496aa56d9f7692c949c3", "description": "Послуги шкільних їдалень", "classification": { "scheme": "ДК021", @@ -188,7 +188,7 @@ Content-Type: application/json; charset=UTF-8 "startDate": "2020-06-04T00:00:00+02:00", "endDate": "2020-07-04T00:00:00+02:00" }, - "id": "faa12ba0bce042bfa5ad1bc8c827f6e9", + "id": "d2b44da9ce9f46bc896d32b570fab363", "quantity": 1.0 } ], diff --git a/docs/source/tendering/openeu/http/tutorial/activate-bidder.http b/docs/source/tendering/openeu/http/tutorial/activate-bidder.http index e3f4274365..8ea14a3742 100644 --- a/docs/source/tendering/openeu/http/tutorial/activate-bidder.http +++ b/docs/source/tendering/openeu/http/tutorial/activate-bidder.http @@ -1,4 +1,4 @@ -PATCH /api/2.5/tenders/ef61695c05174b37b2bb6a8da114cc9d/bids/ce6fe53ed8074a8993c306b027fa9a53?acc_token=d2a2184be75540dc9943d755fd56b1e0 HTTP/1.0 +PATCH /api/2.5/tenders/ef61695c05174b37b2bb6a8da114cc9d/bids/9d482818789a45e88dfb8ad4c89bd4ef?acc_token=d2a2184be75540dc9943d755fd56b1e0 HTTP/1.0 Authorization: Bearer broker Content-Length: 31 Content-Type: application/json @@ -15,7 +15,6 @@ Content-Type: application/json; charset=UTF-8 { "data": { "status": "pending", - "selfEligible": true, "value": { "currency": "UAH", "amount": 500.0, @@ -47,7 +46,7 @@ Content-Type: application/json; charset=UTF-8 } ], "date": "2020-05-15T01:00:00+03:00", - "id": "ce6fe53ed8074a8993c306b027fa9a53" + "id": "9d482818789a45e88dfb8ad4c89bd4ef" } } diff --git a/docs/source/tendering/openeu/http/tutorial/active-cancellation.http b/docs/source/tendering/openeu/http/tutorial/active-cancellation.http index f809f21c8c..3e7363d832 100644 --- a/docs/source/tendering/openeu/http/tutorial/active-cancellation.http +++ b/docs/source/tendering/openeu/http/tutorial/active-cancellation.http @@ -1,4 +1,4 @@ -GET /api/2.5/tenders/ef61695c05174b37b2bb6a8da114cc9d/cancellations/97b552ab570842e5953352f7a3673061?acc_token=5af527ef599c4cb0a283a7ba4c445288 HTTP/1.0 +GET /api/2.5/tenders/ef61695c05174b37b2bb6a8da114cc9d/cancellations/e6d0ca7cdd784832ad4d9b48a7f3b7d3?acc_token=5af527ef599c4cb0a283a7ba4c445288 HTTP/1.0 Authorization: Bearer broker Host: lb-api-sandbox.prozorro.gov.ua @@ -41,7 +41,7 @@ Content-Type: application/json; charset=UTF-8 "reasonType": "unFixable", "date": "2020-05-26T01:00:02+03:00", "cancellationOf": "tender", - "id": "97b552ab570842e5953352f7a3673061" + "id": "e6d0ca7cdd784832ad4d9b48a7f3b7d3" } } diff --git a/docs/source/tendering/openeu/http/tutorial/answer-question.http b/docs/source/tendering/openeu/http/tutorial/answer-question.http index 3727f15a32..3021ec22b5 100644 --- a/docs/source/tendering/openeu/http/tutorial/answer-question.http +++ b/docs/source/tendering/openeu/http/tutorial/answer-question.http @@ -1,4 +1,4 @@ -PATCH /api/2.5/tenders/ef61695c05174b37b2bb6a8da114cc9d/questions/690479c37d9e47f3bff5ef4a7f4c9e23?acc_token=5af527ef599c4cb0a283a7ba4c445288 HTTP/1.0 +PATCH /api/2.5/tenders/ef61695c05174b37b2bb6a8da114cc9d/questions/60347354fc274dedb95e11f4fcbeb1d4?acc_token=5af527ef599c4cb0a283a7ba4c445288 HTTP/1.0 Authorization: Bearer broker Content-Length: 162 Content-Type: application/json @@ -19,7 +19,7 @@ Content-Type: application/json; charset=UTF-8 "title": "Калорійність", "date": "2020-05-15T01:00:00+03:00", "answer": "Таблицю додано в файлі \"Kalorijnist.xslx\"", - "id": "690479c37d9e47f3bff5ef4a7f4c9e23", + "id": "60347354fc274dedb95e11f4fcbeb1d4", "questionOf": "tender" } } diff --git a/docs/source/tendering/openeu/http/tutorial/approve-qualification1.http b/docs/source/tendering/openeu/http/tutorial/approve-qualification1.http index 7b339f2e53..be64b5396f 100644 --- a/docs/source/tendering/openeu/http/tutorial/approve-qualification1.http +++ b/docs/source/tendering/openeu/http/tutorial/approve-qualification1.http @@ -19,7 +19,7 @@ Content-Type: application/json; charset=UTF-8 "status": "active", "eligible": true, "qualified": true, - "bidID": "ce6fe53ed8074a8993c306b027fa9a53", + "bidID": "9d482818789a45e88dfb8ad4c89bd4ef", "date": "2020-05-15T01:00:00+03:00", "id": "9e160e069e95412f92c8bd685238111c" } diff --git a/docs/source/tendering/openeu/http/tutorial/approve-qualification2.http b/docs/source/tendering/openeu/http/tutorial/approve-qualification2.http index 13dab37b4b..f8b2783854 100644 --- a/docs/source/tendering/openeu/http/tutorial/approve-qualification2.http +++ b/docs/source/tendering/openeu/http/tutorial/approve-qualification2.http @@ -19,7 +19,7 @@ Content-Type: application/json; charset=UTF-8 "status": "active", "eligible": true, "qualified": true, - "bidID": "8bb3878e6aa347bf8d402a8988d6475c", + "bidID": "ca262e0588d5439b9bd58b3d33caf545", "date": "2020-05-15T01:00:00+03:00", "id": "013bfea00e914bd68600631fb69548f1" } diff --git a/docs/source/tendering/openeu/http/tutorial/ask-question.http b/docs/source/tendering/openeu/http/tutorial/ask-question.http index db1a980df9..ac9019bbdd 100644 --- a/docs/source/tendering/openeu/http/tutorial/ask-question.http +++ b/docs/source/tendering/openeu/http/tutorial/ask-question.http @@ -33,7 +33,7 @@ DATA: Response: 201 Created Content-Type: application/json; charset=UTF-8 -Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/ef61695c05174b37b2bb6a8da114cc9d/questions/690479c37d9e47f3bff5ef4a7f4c9e23 +Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/ef61695c05174b37b2bb6a8da114cc9d/questions/60347354fc274dedb95e11f4fcbeb1d4 { "data": { "description": "Просимо додати таблицю потрібної калорійності харчування", @@ -59,7 +59,7 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/ef61695c05174b37 }, "title": "Калорійність", "date": "2020-05-15T01:00:00+03:00", - "id": "690479c37d9e47f3bff5ef4a7f4c9e23", + "id": "60347354fc274dedb95e11f4fcbeb1d4", "questionOf": "tender" } } diff --git a/docs/source/tendering/openeu/http/tutorial/auction-url.http b/docs/source/tendering/openeu/http/tutorial/auction-url.http index 5c04d75674..57eac351d3 100644 --- a/docs/source/tendering/openeu/http/tutorial/auction-url.http +++ b/docs/source/tendering/openeu/http/tutorial/auction-url.http @@ -17,7 +17,7 @@ Content-Type: application/json; charset=UTF-8 "enquiryPeriod": { "startDate": "2020-04-04T01:00:00+03:00", "clarificationsUntil": "2020-04-30T00:00:00+03:00", - "endDate": "2020-04-25T01:00:00+03:00", + "endDate": "2020-04-25T00:00:00+03:00", "invalidationDate": "2020-05-15T01:00:00+03:00" }, "submissionMethod": "electronicAuction", @@ -31,7 +31,7 @@ Content-Type: application/json; charset=UTF-8 "title": "Калорійність", "date": "2020-05-15T01:00:00+03:00", "answer": "Таблицю додано в файлі \"Kalorijnist.xslx\"", - "id": "690479c37d9e47f3bff5ef4a7f4c9e23", + "id": "60347354fc274dedb95e11f4fcbeb1d4", "questionOf": "tender" } ], @@ -41,7 +41,7 @@ Content-Type: application/json; charset=UTF-8 "status": "active", "eligible": true, "qualified": true, - "bidID": "ce6fe53ed8074a8993c306b027fa9a53", + "bidID": "9d482818789a45e88dfb8ad4c89bd4ef", "date": "2020-05-15T01:00:00+03:00", "id": "9e160e069e95412f92c8bd685238111c" }, @@ -49,7 +49,7 @@ Content-Type: application/json; charset=UTF-8 "status": "active", "eligible": true, "qualified": true, - "bidID": "8bb3878e6aa347bf8d402a8988d6475c", + "bidID": "ca262e0588d5439b9bd58b3d33caf545", "date": "2020-05-15T01:00:00+03:00", "id": "013bfea00e914bd68600631fb69548f1" }, @@ -57,7 +57,7 @@ Content-Type: application/json; charset=UTF-8 "status": "unsuccessful", "eligible": false, "qualified": false, - "bidID": "300d8d13119e4450b4fa9cab0c0e9507", + "bidID": "b8bb2055efc445abbaad89741fff85c6", "date": "2020-05-15T01:00:00+03:00", "id": "44650235cbbc4993af51233c8dcc6187" } @@ -146,7 +146,7 @@ Content-Type: application/json; charset=UTF-8 }, "percentage": 54.45, "type": "financing", - "id": "93ea80580cc948249bac1c77f04afe98" + "id": "710cfcde78c04a7fa7ad616669b24c79" } ], "minimalStep": { @@ -181,7 +181,7 @@ Content-Type: application/json; charset=UTF-8 "startDate": "2020-06-04T00:00:00+02:00", "endDate": "2020-07-04T00:00:00+02:00" }, - "id": "6ebdaf1cb586410f8c8c843a108b155f", + "id": "342d8d19d6aa4ee1a5e7402aef5f5308", "quantity": 1.0 }, { @@ -210,7 +210,7 @@ Content-Type: application/json; charset=UTF-8 "startDate": "2020-06-04T00:00:00+02:00", "endDate": "2020-07-04T00:00:00+02:00" }, - "id": "2362877518ef44d783c05ed80edafa78", + "id": "ae7d27b9ef6d491c9527f262d9004c0f", "quantity": 1.0 } ], @@ -266,7 +266,7 @@ Content-Type: application/json; charset=UTF-8 } } ], - "id": "ce6fe53ed8074a8993c306b027fa9a53", + "id": "9d482818789a45e88dfb8ad4c89bd4ef", "eligibilityDocuments": [ { "hash": "md5:00000000000000000000000000000000", @@ -284,7 +284,7 @@ Content-Type: application/json; charset=UTF-8 }, { "status": "active", - "id": "8bb3878e6aa347bf8d402a8988d6475c", + "id": "ca262e0588d5439b9bd58b3d33caf545", "tenderers": [ { "contactPoint": { @@ -311,7 +311,6 @@ Content-Type: application/json; charset=UTF-8 }, { "status": "unsuccessful", - "selfEligible": true, "tenderers": [ { "contactPoint": { @@ -336,7 +335,7 @@ Content-Type: application/json; charset=UTF-8 } ], "selfQualified": true, - "id": "300d8d13119e4450b4fa9cab0c0e9507" + "id": "b8bb2055efc445abbaad89741fff85c6" } ], "value": { diff --git a/docs/source/tendering/openeu/http/tutorial/bidder-activate-after-changing-tender.http b/docs/source/tendering/openeu/http/tutorial/bidder-activate-after-changing-tender.http index 4e514abb69..b463c77db1 100644 --- a/docs/source/tendering/openeu/http/tutorial/bidder-activate-after-changing-tender.http +++ b/docs/source/tendering/openeu/http/tutorial/bidder-activate-after-changing-tender.http @@ -1,4 +1,4 @@ -PATCH /api/2.5/tenders/ef61695c05174b37b2bb6a8da114cc9d/bids/ce6fe53ed8074a8993c306b027fa9a53?acc_token=d2a2184be75540dc9943d755fd56b1e0 HTTP/1.0 +PATCH /api/2.5/tenders/ef61695c05174b37b2bb6a8da114cc9d/bids/9d482818789a45e88dfb8ad4c89bd4ef?acc_token=d2a2184be75540dc9943d755fd56b1e0 HTTP/1.0 Authorization: Bearer broker Content-Length: 31 Content-Type: application/json @@ -21,7 +21,7 @@ Content-Type: application/json; charset=UTF-8 "confidentiality": "public", "language": "uk", "title": "Proposal.pdf", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/ef61695c05174b37b2bb6a8da114cc9d/bids/ce6fe53ed8074a8993c306b027fa9a53/documents/ffb8f68e7a9442ca8c7c909ce9475091?download=b1254823518c427e84bddac2609d49cb", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/ef61695c05174b37b2bb6a8da114cc9d/bids/9d482818789a45e88dfb8ad4c89bd4ef/documents/ffb8f68e7a9442ca8c7c909ce9475091?download=b1254823518c427e84bddac2609d49cb", "format": "application/pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", @@ -33,7 +33,7 @@ Content-Type: application/json; charset=UTF-8 "confidentiality": "buyerOnly", "language": "uk", "format": "application/pdf", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/ef61695c05174b37b2bb6a8da114cc9d/bids/ce6fe53ed8074a8993c306b027fa9a53/documents/ca89fb4746d64cfd87f857401fe85d90?download=46eae2bb26bb459e80168cde78780897", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/ef61695c05174b37b2bb6a8da114cc9d/bids/9d482818789a45e88dfb8ad4c89bd4ef/documents/ca89fb4746d64cfd87f857401fe85d90?download=46eae2bb26bb459e80168cde78780897", "confidentialityRationale": "Only our company sells badgers with pink hair.", "title": "Proposal_top_secrets.pdf", "documentOf": "tender", @@ -48,7 +48,7 @@ Content-Type: application/json; charset=UTF-8 "confidentiality": "public", "language": "uk", "title": "eligibility_doc.pdf", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/ef61695c05174b37b2bb6a8da114cc9d/bids/ce6fe53ed8074a8993c306b027fa9a53/eligibility_documents/84e8cce5126f4088a9d49b2d8a61147c?download=f5bd5faca0ed402f9f631588655730d2", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/ef61695c05174b37b2bb6a8da114cc9d/bids/9d482818789a45e88dfb8ad4c89bd4ef/eligibility_documents/84e8cce5126f4088a9d49b2d8a61147c?download=f5bd5faca0ed402f9f631588655730d2", "format": "application/pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", @@ -56,21 +56,33 @@ Content-Type: application/json; charset=UTF-8 "dateModified": "2020-05-15T01:00:00+03:00" } ], - "selfEligible": true, - "id": "ce6fe53ed8074a8993c306b027fa9a53", + "id": "9d482818789a45e88dfb8ad4c89bd4ef", "value": { "currency": "UAH", "amount": 500.0, "valueAddedTaxIncluded": true }, - "selfQualified": true, + "qualificationDocuments": [ + { + "hash": "md5:00000000000000000000000000000000", + "confidentiality": "public", + "language": "uk", + "title": "qualification_document.pdf", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/ef61695c05174b37b2bb6a8da114cc9d/bids/9d482818789a45e88dfb8ad4c89bd4ef/qualification_documents/967be1d89cf846feae631c84ec4d0834?download=72b7b1d29c754e0eb64489482ad92680", + "format": "application/pdf", + "documentOf": "tender", + "datePublished": "2020-05-15T01:00:00+03:00", + "id": "967be1d89cf846feae631c84ec4d0834", + "dateModified": "2020-05-15T01:00:00+03:00" + } + ], "financialDocuments": [ { "hash": "md5:00000000000000000000000000000000", "confidentiality": "public", "language": "uk", "title": "financial_doc.pdf", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/ef61695c05174b37b2bb6a8da114cc9d/bids/ce6fe53ed8074a8993c306b027fa9a53/financial_documents/4d63bcaab539462fbc4dad2cd151cd99?download=14fd1c06e9f640f7b8891f22f2a645d6", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/ef61695c05174b37b2bb6a8da114cc9d/bids/9d482818789a45e88dfb8ad4c89bd4ef/financial_documents/4d63bcaab539462fbc4dad2cd151cd99?download=14fd1c06e9f640f7b8891f22f2a645d6", "format": "application/pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", @@ -82,7 +94,7 @@ Content-Type: application/json; charset=UTF-8 "confidentiality": "public", "language": "uk", "title": "financial_doc2.pdf", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/ef61695c05174b37b2bb6a8da114cc9d/bids/ce6fe53ed8074a8993c306b027fa9a53/financial_documents/d8273962ff464b59accf03c3dcac9460?download=4727233454434ece80cdf932dbc3ade9", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/ef61695c05174b37b2bb6a8da114cc9d/bids/9d482818789a45e88dfb8ad4c89bd4ef/financial_documents/d8273962ff464b59accf03c3dcac9460?download=4727233454434ece80cdf932dbc3ade9", "format": "application/pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", @@ -115,20 +127,7 @@ Content-Type: application/json; charset=UTF-8 ], "date": "2020-05-15T01:00:00+03:00", "subcontractingDetails": "ДКП «Орфей», Україна", - "qualificationDocuments": [ - { - "hash": "md5:00000000000000000000000000000000", - "confidentiality": "public", - "language": "uk", - "title": "qualification_document.pdf", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/ef61695c05174b37b2bb6a8da114cc9d/bids/ce6fe53ed8074a8993c306b027fa9a53/qualification_documents/967be1d89cf846feae631c84ec4d0834?download=72b7b1d29c754e0eb64489482ad92680", - "format": "application/pdf", - "documentOf": "tender", - "datePublished": "2020-05-15T01:00:00+03:00", - "id": "967be1d89cf846feae631c84ec4d0834", - "dateModified": "2020-05-15T01:00:00+03:00" - } - ] + "selfQualified": true } } diff --git a/docs/source/tendering/openeu/http/tutorial/bidder-after-changing-tender.http b/docs/source/tendering/openeu/http/tutorial/bidder-after-changing-tender.http index a6f2985b93..025bfdc1fd 100644 --- a/docs/source/tendering/openeu/http/tutorial/bidder-after-changing-tender.http +++ b/docs/source/tendering/openeu/http/tutorial/bidder-after-changing-tender.http @@ -1,4 +1,4 @@ -GET /api/2.5/tenders/ef61695c05174b37b2bb6a8da114cc9d/bids/ce6fe53ed8074a8993c306b027fa9a53?acc_token=d2a2184be75540dc9943d755fd56b1e0 HTTP/1.0 +GET /api/2.5/tenders/ef61695c05174b37b2bb6a8da114cc9d/bids/9d482818789a45e88dfb8ad4c89bd4ef?acc_token=d2a2184be75540dc9943d755fd56b1e0 HTTP/1.0 Authorization: Bearer broker Host: lb-api-sandbox.prozorro.gov.ua @@ -7,7 +7,7 @@ Content-Type: application/json; charset=UTF-8 { "data": { "status": "invalid", - "id": "ce6fe53ed8074a8993c306b027fa9a53" + "id": "9d482818789a45e88dfb8ad4c89bd4ef" } } diff --git a/docs/source/tendering/openeu/http/tutorial/bidder-financial-documents.http b/docs/source/tendering/openeu/http/tutorial/bidder-financial-documents.http index 3a440731cf..ecc5ffa6dc 100644 --- a/docs/source/tendering/openeu/http/tutorial/bidder-financial-documents.http +++ b/docs/source/tendering/openeu/http/tutorial/bidder-financial-documents.http @@ -1,4 +1,4 @@ -GET /api/2.5/tenders/ef61695c05174b37b2bb6a8da114cc9d/bids/ce6fe53ed8074a8993c306b027fa9a53/financial_documents?acc_token=d2a2184be75540dc9943d755fd56b1e0 HTTP/1.0 +GET /api/2.5/tenders/ef61695c05174b37b2bb6a8da114cc9d/bids/9d482818789a45e88dfb8ad4c89bd4ef/financial_documents?acc_token=d2a2184be75540dc9943d755fd56b1e0 HTTP/1.0 Authorization: Bearer broker Host: lb-api-sandbox.prozorro.gov.ua @@ -11,7 +11,7 @@ Content-Type: application/json; charset=UTF-8 "confidentiality": "public", "language": "uk", "title": "financial_doc.pdf", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/ef61695c05174b37b2bb6a8da114cc9d/bids/ce6fe53ed8074a8993c306b027fa9a53/financial_documents/4d63bcaab539462fbc4dad2cd151cd99?download=14fd1c06e9f640f7b8891f22f2a645d6", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/ef61695c05174b37b2bb6a8da114cc9d/bids/9d482818789a45e88dfb8ad4c89bd4ef/financial_documents/4d63bcaab539462fbc4dad2cd151cd99?download=14fd1c06e9f640f7b8891f22f2a645d6", "format": "application/pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", @@ -23,7 +23,7 @@ Content-Type: application/json; charset=UTF-8 "confidentiality": "public", "language": "uk", "title": "financial_doc2.pdf", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/ef61695c05174b37b2bb6a8da114cc9d/bids/ce6fe53ed8074a8993c306b027fa9a53/financial_documents/d8273962ff464b59accf03c3dcac9460?download=4727233454434ece80cdf932dbc3ade9", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/ef61695c05174b37b2bb6a8da114cc9d/bids/9d482818789a45e88dfb8ad4c89bd4ef/financial_documents/d8273962ff464b59accf03c3dcac9460?download=4727233454434ece80cdf932dbc3ade9", "format": "application/pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", diff --git a/docs/source/tendering/openeu/http/tutorial/bidder-participation-url.http b/docs/source/tendering/openeu/http/tutorial/bidder-participation-url.http index 5748334bdc..2cc7f37358 100644 --- a/docs/source/tendering/openeu/http/tutorial/bidder-participation-url.http +++ b/docs/source/tendering/openeu/http/tutorial/bidder-participation-url.http @@ -1,4 +1,4 @@ -GET /api/2.5/tenders/ef61695c05174b37b2bb6a8da114cc9d/bids/ce6fe53ed8074a8993c306b027fa9a53?acc_token=d2a2184be75540dc9943d755fd56b1e0 HTTP/1.0 +GET /api/2.5/tenders/ef61695c05174b37b2bb6a8da114cc9d/bids/9d482818789a45e88dfb8ad4c89bd4ef?acc_token=d2a2184be75540dc9943d755fd56b1e0 HTTP/1.0 Authorization: Bearer broker Host: lb-api-sandbox.prozorro.gov.ua @@ -25,7 +25,7 @@ Content-Type: application/json; charset=UTF-8 "confidentiality": "buyerOnly", "language": "uk", "format": "application/pdf", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/ef61695c05174b37b2bb6a8da114cc9d/bids/ce6fe53ed8074a8993c306b027fa9a53/documents/ca89fb4746d64cfd87f857401fe85d90?download=46eae2bb26bb459e80168cde78780897", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/ef61695c05174b37b2bb6a8da114cc9d/bids/9d482818789a45e88dfb8ad4c89bd4ef/documents/ca89fb4746d64cfd87f857401fe85d90?download=46eae2bb26bb459e80168cde78780897", "confidentialityRationale": "Only our company sells badgers with pink hair.", "title": "Proposal_top_secrets.pdf", "documentOf": "tender", @@ -48,21 +48,33 @@ Content-Type: application/json; charset=UTF-8 "dateModified": "2020-05-15T01:00:00+03:00" } ], - "selfEligible": true, - "id": "ce6fe53ed8074a8993c306b027fa9a53", + "id": "9d482818789a45e88dfb8ad4c89bd4ef", "value": { "currency": "UAH", "amount": 500.0, "valueAddedTaxIncluded": true }, - "selfQualified": true, + "qualificationDocuments": [ + { + "hash": "md5:00000000000000000000000000000000", + "confidentiality": "public", + "language": "uk", + "title": "qualification_document.pdf", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/ef61695c05174b37b2bb6a8da114cc9d/bids/9d482818789a45e88dfb8ad4c89bd4ef/qualification_documents/967be1d89cf846feae631c84ec4d0834?download=72b7b1d29c754e0eb64489482ad92680", + "format": "application/pdf", + "documentOf": "tender", + "datePublished": "2020-05-15T01:00:00+03:00", + "id": "967be1d89cf846feae631c84ec4d0834", + "dateModified": "2020-05-15T01:00:00+03:00" + } + ], "financialDocuments": [ { "hash": "md5:00000000000000000000000000000000", "confidentiality": "public", "language": "uk", "title": "financial_doc.pdf", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/ef61695c05174b37b2bb6a8da114cc9d/bids/ce6fe53ed8074a8993c306b027fa9a53/financial_documents/4d63bcaab539462fbc4dad2cd151cd99?download=14fd1c06e9f640f7b8891f22f2a645d6", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/ef61695c05174b37b2bb6a8da114cc9d/bids/9d482818789a45e88dfb8ad4c89bd4ef/financial_documents/4d63bcaab539462fbc4dad2cd151cd99?download=14fd1c06e9f640f7b8891f22f2a645d6", "format": "application/pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", @@ -74,7 +86,7 @@ Content-Type: application/json; charset=UTF-8 "confidentiality": "public", "language": "uk", "title": "financial_doc2.pdf", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/ef61695c05174b37b2bb6a8da114cc9d/bids/ce6fe53ed8074a8993c306b027fa9a53/financial_documents/d8273962ff464b59accf03c3dcac9460?download=4727233454434ece80cdf932dbc3ade9", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/ef61695c05174b37b2bb6a8da114cc9d/bids/9d482818789a45e88dfb8ad4c89bd4ef/financial_documents/d8273962ff464b59accf03c3dcac9460?download=4727233454434ece80cdf932dbc3ade9", "format": "application/pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", @@ -107,21 +119,8 @@ Content-Type: application/json; charset=UTF-8 ], "date": "2020-05-15T01:00:00+03:00", "subcontractingDetails": "ДКП «Орфей», Україна", - "qualificationDocuments": [ - { - "hash": "md5:00000000000000000000000000000000", - "confidentiality": "public", - "language": "uk", - "title": "qualification_document.pdf", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/ef61695c05174b37b2bb6a8da114cc9d/bids/ce6fe53ed8074a8993c306b027fa9a53/qualification_documents/967be1d89cf846feae631c84ec4d0834?download=72b7b1d29c754e0eb64489482ad92680", - "format": "application/pdf", - "documentOf": "tender", - "datePublished": "2020-05-15T01:00:00+03:00", - "id": "967be1d89cf846feae631c84ec4d0834", - "dateModified": "2020-05-15T01:00:00+03:00" - } - ], - "participationUrl": "http://auction-sandbox.prozorro.gov.ua/tenders/ef61695c05174b37b2bb6a8da114cc9d?key_for_bid=ce6fe53ed8074a8993c306b027fa9a53" + "selfQualified": true, + "participationUrl": "http://auction-sandbox.prozorro.gov.ua/tenders/ef61695c05174b37b2bb6a8da114cc9d?key_for_bid=9d482818789a45e88dfb8ad4c89bd4ef" } } diff --git a/docs/source/tendering/openeu/http/tutorial/bidder-view-financial-documents.http b/docs/source/tendering/openeu/http/tutorial/bidder-view-financial-documents.http index d8e8227c8b..343d1c8b66 100644 --- a/docs/source/tendering/openeu/http/tutorial/bidder-view-financial-documents.http +++ b/docs/source/tendering/openeu/http/tutorial/bidder-view-financial-documents.http @@ -1,4 +1,4 @@ -GET /api/2.5/tenders/ef61695c05174b37b2bb6a8da114cc9d/bids/ce6fe53ed8074a8993c306b027fa9a53?acc_token=d2a2184be75540dc9943d755fd56b1e0 HTTP/1.0 +GET /api/2.5/tenders/ef61695c05174b37b2bb6a8da114cc9d/bids/9d482818789a45e88dfb8ad4c89bd4ef?acc_token=d2a2184be75540dc9943d755fd56b1e0 HTTP/1.0 Authorization: Bearer broker Host: lb-api-sandbox.prozorro.gov.ua @@ -13,7 +13,7 @@ Content-Type: application/json; charset=UTF-8 "confidentiality": "public", "language": "uk", "title": "Proposal.pdf", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/ef61695c05174b37b2bb6a8da114cc9d/bids/ce6fe53ed8074a8993c306b027fa9a53/documents/ffb8f68e7a9442ca8c7c909ce9475091?download=b1254823518c427e84bddac2609d49cb", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/ef61695c05174b37b2bb6a8da114cc9d/bids/9d482818789a45e88dfb8ad4c89bd4ef/documents/ffb8f68e7a9442ca8c7c909ce9475091?download=b1254823518c427e84bddac2609d49cb", "format": "application/pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", @@ -25,7 +25,7 @@ Content-Type: application/json; charset=UTF-8 "confidentiality": "buyerOnly", "language": "uk", "format": "application/pdf", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/ef61695c05174b37b2bb6a8da114cc9d/bids/ce6fe53ed8074a8993c306b027fa9a53/documents/ca89fb4746d64cfd87f857401fe85d90?download=46eae2bb26bb459e80168cde78780897", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/ef61695c05174b37b2bb6a8da114cc9d/bids/9d482818789a45e88dfb8ad4c89bd4ef/documents/ca89fb4746d64cfd87f857401fe85d90?download=46eae2bb26bb459e80168cde78780897", "confidentialityRationale": "Only our company sells badgers with pink hair.", "title": "Proposal_top_secrets.pdf", "documentOf": "tender", @@ -40,7 +40,7 @@ Content-Type: application/json; charset=UTF-8 "confidentiality": "public", "language": "uk", "title": "eligibility_doc.pdf", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/ef61695c05174b37b2bb6a8da114cc9d/bids/ce6fe53ed8074a8993c306b027fa9a53/eligibility_documents/84e8cce5126f4088a9d49b2d8a61147c?download=f5bd5faca0ed402f9f631588655730d2", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/ef61695c05174b37b2bb6a8da114cc9d/bids/9d482818789a45e88dfb8ad4c89bd4ef/eligibility_documents/84e8cce5126f4088a9d49b2d8a61147c?download=f5bd5faca0ed402f9f631588655730d2", "format": "application/pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", @@ -48,21 +48,33 @@ Content-Type: application/json; charset=UTF-8 "dateModified": "2020-05-15T01:00:00+03:00" } ], - "selfEligible": true, - "id": "ce6fe53ed8074a8993c306b027fa9a53", + "id": "9d482818789a45e88dfb8ad4c89bd4ef", "value": { "currency": "UAH", "amount": 500.0, "valueAddedTaxIncluded": true }, - "selfQualified": true, + "qualificationDocuments": [ + { + "hash": "md5:00000000000000000000000000000000", + "confidentiality": "public", + "language": "uk", + "title": "qualification_document.pdf", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/ef61695c05174b37b2bb6a8da114cc9d/bids/9d482818789a45e88dfb8ad4c89bd4ef/qualification_documents/967be1d89cf846feae631c84ec4d0834?download=72b7b1d29c754e0eb64489482ad92680", + "format": "application/pdf", + "documentOf": "tender", + "datePublished": "2020-05-15T01:00:00+03:00", + "id": "967be1d89cf846feae631c84ec4d0834", + "dateModified": "2020-05-15T01:00:00+03:00" + } + ], "financialDocuments": [ { "hash": "md5:00000000000000000000000000000000", "confidentiality": "public", "language": "uk", "title": "financial_doc.pdf", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/ef61695c05174b37b2bb6a8da114cc9d/bids/ce6fe53ed8074a8993c306b027fa9a53/financial_documents/4d63bcaab539462fbc4dad2cd151cd99?download=14fd1c06e9f640f7b8891f22f2a645d6", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/ef61695c05174b37b2bb6a8da114cc9d/bids/9d482818789a45e88dfb8ad4c89bd4ef/financial_documents/4d63bcaab539462fbc4dad2cd151cd99?download=14fd1c06e9f640f7b8891f22f2a645d6", "format": "application/pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", @@ -74,7 +86,7 @@ Content-Type: application/json; charset=UTF-8 "confidentiality": "public", "language": "uk", "title": "financial_doc2.pdf", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/ef61695c05174b37b2bb6a8da114cc9d/bids/ce6fe53ed8074a8993c306b027fa9a53/financial_documents/d8273962ff464b59accf03c3dcac9460?download=4727233454434ece80cdf932dbc3ade9", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/ef61695c05174b37b2bb6a8da114cc9d/bids/9d482818789a45e88dfb8ad4c89bd4ef/financial_documents/d8273962ff464b59accf03c3dcac9460?download=4727233454434ece80cdf932dbc3ade9", "format": "application/pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", @@ -107,20 +119,7 @@ Content-Type: application/json; charset=UTF-8 ], "date": "2020-05-15T01:00:00+03:00", "subcontractingDetails": "ДКП «Орфей», Україна", - "qualificationDocuments": [ - { - "hash": "md5:00000000000000000000000000000000", - "confidentiality": "public", - "language": "uk", - "title": "qualification_document.pdf", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/ef61695c05174b37b2bb6a8da114cc9d/bids/ce6fe53ed8074a8993c306b027fa9a53/qualification_documents/967be1d89cf846feae631c84ec4d0834?download=72b7b1d29c754e0eb64489482ad92680", - "format": "application/pdf", - "documentOf": "tender", - "datePublished": "2020-05-15T01:00:00+03:00", - "id": "967be1d89cf846feae631c84ec4d0834", - "dateModified": "2020-05-15T01:00:00+03:00" - } - ] + "selfQualified": true } } diff --git a/docs/source/tendering/openeu/http/tutorial/bidder2-participation-url.http b/docs/source/tendering/openeu/http/tutorial/bidder2-participation-url.http index ed79cf5daf..eda45977c6 100644 --- a/docs/source/tendering/openeu/http/tutorial/bidder2-participation-url.http +++ b/docs/source/tendering/openeu/http/tutorial/bidder2-participation-url.http @@ -1,4 +1,4 @@ -GET /api/2.5/tenders/ef61695c05174b37b2bb6a8da114cc9d/bids/8bb3878e6aa347bf8d402a8988d6475c?acc_token=4c86f3c193ba4dde91d152256b445d0e HTTP/1.0 +GET /api/2.5/tenders/ef61695c05174b37b2bb6a8da114cc9d/bids/ca262e0588d5439b9bd58b3d33caf545?acc_token=4c86f3c193ba4dde91d152256b445d0e HTTP/1.0 Authorization: Bearer broker Host: lb-api-sandbox.prozorro.gov.ua @@ -7,13 +7,12 @@ Content-Type: application/json; charset=UTF-8 { "data": { "status": "active", - "selfEligible": true, "value": { "currency": "UAH", "amount": 499.0, "valueAddedTaxIncluded": true }, - "selfQualified": true, + "id": "ca262e0588d5439b9bd58b3d33caf545", "tenderers": [ { "contactPoint": { @@ -38,8 +37,8 @@ Content-Type: application/json; charset=UTF-8 } ], "date": "2020-05-15T01:00:00+03:00", - "id": "8bb3878e6aa347bf8d402a8988d6475c", - "participationUrl": "http://auction-sandbox.prozorro.gov.ua/tenders/ef61695c05174b37b2bb6a8da114cc9d?key_for_bid=8bb3878e6aa347bf8d402a8988d6475c" + "selfQualified": true, + "participationUrl": "http://auction-sandbox.prozorro.gov.ua/tenders/ef61695c05174b37b2bb6a8da114cc9d?key_for_bid=ca262e0588d5439b9bd58b3d33caf545" } } diff --git a/docs/source/tendering/openeu/http/tutorial/blank-tender-view.http b/docs/source/tendering/openeu/http/tutorial/blank-tender-view.http index 9339cb7ebb..91945ddcc2 100644 --- a/docs/source/tendering/openeu/http/tutorial/blank-tender-view.http +++ b/docs/source/tendering/openeu/http/tutorial/blank-tender-view.http @@ -83,7 +83,7 @@ Content-Type: application/json; charset=UTF-8 }, "percentage": 54.45, "type": "financing", - "id": "93ea80580cc948249bac1c77f04afe98" + "id": "710cfcde78c04a7fa7ad616669b24c79" } ], "minimalStep": { @@ -118,7 +118,7 @@ Content-Type: application/json; charset=UTF-8 "startDate": "2020-06-04T00:00:00+02:00", "endDate": "2020-07-04T00:00:00+02:00" }, - "id": "6ebdaf1cb586410f8c8c843a108b155f", + "id": "342d8d19d6aa4ee1a5e7402aef5f5308", "quantity": 1.0 }, { @@ -147,7 +147,7 @@ Content-Type: application/json; charset=UTF-8 "startDate": "2020-06-04T00:00:00+02:00", "endDate": "2020-07-04T00:00:00+02:00" }, - "id": "2362877518ef44d783c05ed80edafa78", + "id": "ae7d27b9ef6d491c9527f262d9004c0f", "quantity": 1.0 } ], diff --git a/docs/source/tendering/openeu/http/tutorial/confirm-qualification.http b/docs/source/tendering/openeu/http/tutorial/confirm-qualification.http index 7fa35cd8c3..48a619498e 100644 --- a/docs/source/tendering/openeu/http/tutorial/confirm-qualification.http +++ b/docs/source/tendering/openeu/http/tutorial/confirm-qualification.http @@ -45,7 +45,7 @@ Content-Type: application/json; charset=UTF-8 "startDate": "2020-05-15T01:00:00+03:00", "endDate": "2020-05-26T00:00:00+03:00" }, - "bid_id": "8bb3878e6aa347bf8d402a8988d6475c", + "bid_id": "ca262e0588d5439b9bd58b3d33caf545", "value": { "currency": "UAH", "amount": 499.0, diff --git a/docs/source/tendering/openeu/http/tutorial/get-answer.http b/docs/source/tendering/openeu/http/tutorial/get-answer.http index 0bdc901658..e5938691c0 100644 --- a/docs/source/tendering/openeu/http/tutorial/get-answer.http +++ b/docs/source/tendering/openeu/http/tutorial/get-answer.http @@ -1,4 +1,4 @@ -GET /api/2.5/tenders/ef61695c05174b37b2bb6a8da114cc9d/questions/690479c37d9e47f3bff5ef4a7f4c9e23 HTTP/1.0 +GET /api/2.5/tenders/ef61695c05174b37b2bb6a8da114cc9d/questions/60347354fc274dedb95e11f4fcbeb1d4 HTTP/1.0 Authorization: Bearer broker Host: lb-api-sandbox.prozorro.gov.ua @@ -11,7 +11,7 @@ Content-Type: application/json; charset=UTF-8 "title": "Калорійність", "date": "2020-05-15T01:00:00+03:00", "answer": "Таблицю додано в файлі \"Kalorijnist.xslx\"", - "id": "690479c37d9e47f3bff5ef4a7f4c9e23", + "id": "60347354fc274dedb95e11f4fcbeb1d4", "questionOf": "tender" } } diff --git a/docs/source/tendering/openeu/http/tutorial/list-question.http b/docs/source/tendering/openeu/http/tutorial/list-question.http index 23574ab16b..e461831fd5 100644 --- a/docs/source/tendering/openeu/http/tutorial/list-question.http +++ b/docs/source/tendering/openeu/http/tutorial/list-question.http @@ -12,7 +12,7 @@ Content-Type: application/json; charset=UTF-8 "title": "Калорійність", "date": "2020-05-15T01:00:00+03:00", "answer": "Таблицю додано в файлі \"Kalorijnist.xslx\"", - "id": "690479c37d9e47f3bff5ef4a7f4c9e23", + "id": "60347354fc274dedb95e11f4fcbeb1d4", "questionOf": "tender" } ] diff --git a/docs/source/tendering/openeu/http/tutorial/mark-bid-doc-private.http b/docs/source/tendering/openeu/http/tutorial/mark-bid-doc-private.http index 1fc1e1b215..d05d1d0e24 100644 --- a/docs/source/tendering/openeu/http/tutorial/mark-bid-doc-private.http +++ b/docs/source/tendering/openeu/http/tutorial/mark-bid-doc-private.http @@ -1,4 +1,4 @@ -PATCH /api/2.5/tenders/ef61695c05174b37b2bb6a8da114cc9d/bids/ce6fe53ed8074a8993c306b027fa9a53/documents/ca89fb4746d64cfd87f857401fe85d90?acc_token=d2a2184be75540dc9943d755fd56b1e0 HTTP/1.0 +PATCH /api/2.5/tenders/ef61695c05174b37b2bb6a8da114cc9d/bids/9d482818789a45e88dfb8ad4c89bd4ef/documents/ca89fb4746d64cfd87f857401fe85d90?acc_token=d2a2184be75540dc9943d755fd56b1e0 HTTP/1.0 Authorization: Bearer broker Content-Length: 120 Content-Type: application/json @@ -19,7 +19,7 @@ Content-Type: application/json; charset=UTF-8 "confidentiality": "buyerOnly", "language": "uk", "format": "application/pdf", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/ef61695c05174b37b2bb6a8da114cc9d/bids/ce6fe53ed8074a8993c306b027fa9a53/documents/ca89fb4746d64cfd87f857401fe85d90?download=46eae2bb26bb459e80168cde78780897", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/ef61695c05174b37b2bb6a8da114cc9d/bids/9d482818789a45e88dfb8ad4c89bd4ef/documents/ca89fb4746d64cfd87f857401fe85d90?download=46eae2bb26bb459e80168cde78780897", "confidentialityRationale": "Only our company sells badgers with pink hair.", "title": "Proposal_top_secrets.pdf", "documentOf": "tender", diff --git a/docs/source/tendering/openeu/http/tutorial/patch-cancellation.http b/docs/source/tendering/openeu/http/tutorial/patch-cancellation.http index 751d3a0fe7..1167155850 100644 --- a/docs/source/tendering/openeu/http/tutorial/patch-cancellation.http +++ b/docs/source/tendering/openeu/http/tutorial/patch-cancellation.http @@ -1,4 +1,4 @@ -PATCH /api/2.5/tenders/ef61695c05174b37b2bb6a8da114cc9d/cancellations/97b552ab570842e5953352f7a3673061/documents/ac9e2b1c99c14e34bf70690cf7d83438?acc_token=5af527ef599c4cb0a283a7ba4c445288 HTTP/1.0 +PATCH /api/2.5/tenders/ef61695c05174b37b2bb6a8da114cc9d/cancellations/e6d0ca7cdd784832ad4d9b48a7f3b7d3/documents/ac9e2b1c99c14e34bf70690cf7d83438?acc_token=5af527ef599c4cb0a283a7ba4c445288 HTTP/1.0 Authorization: Bearer broker Content-Length: 48 Content-Type: application/json diff --git a/docs/source/tendering/openeu/http/tutorial/patch-items-value-periods.http b/docs/source/tendering/openeu/http/tutorial/patch-items-value-periods.http index 449801606c..786120fd57 100644 --- a/docs/source/tendering/openeu/http/tutorial/patch-items-value-periods.http +++ b/docs/source/tendering/openeu/http/tutorial/patch-items-value-periods.http @@ -7,7 +7,7 @@ DATA: { "data": { "tenderPeriod": { - "endDate": "2020-06-14T01:00:10+03:00" + "endDate": "2020-06-15T01:00:00+03:00" } } } @@ -20,16 +20,16 @@ Content-Type: application/json; charset=UTF-8 "mainProcurementCategory": "services", "complaintPeriod": { "startDate": "2020-05-15T01:00:00+03:00", - "endDate": "2020-06-10T00:00:00+03:00" + "endDate": "2020-06-11T00:00:00+02:00" }, "enquiryPeriod": { "startDate": "2020-05-15T01:00:00+03:00", - "clarificationsUntil": "2020-06-11T00:00:00+03:00", - "endDate": "2020-06-04T01:00:10+03:00", + "clarificationsUntil": "2020-06-11T00:00:00+02:00", + "endDate": "2020-06-05T00:00:00+02:00", "invalidationDate": "2020-05-15T01:00:00+03:00" }, "submissionMethod": "electronicAuction", - "next_check": "2020-06-14T01:00:10+03:00", + "next_check": "2020-06-15T01:00:00+03:00", "procuringEntity": { "kind": "general", "name": "ЗОСШ #10 м.Вінниці", @@ -64,10 +64,10 @@ Content-Type: application/json; charset=UTF-8 "status": "active.tendering", "tenderPeriod": { "startDate": "2020-05-15T01:00:00+03:00", - "endDate": "2020-06-14T01:00:10+03:00" + "endDate": "2020-06-15T00:00:00+02:00" }, "auctionPeriod": { - "shouldStartAfter": "2020-07-20T00:00:00+03:00" + "shouldStartAfter": "2020-07-20T00:00:00+02:00" }, "procurementMethodType": "aboveThresholdEU", "date": "2020-05-15T01:00:00+03:00", @@ -94,7 +94,7 @@ Content-Type: application/json; charset=UTF-8 }, "percentage": 54.45, "type": "financing", - "id": "93ea80580cc948249bac1c77f04afe98" + "id": "710cfcde78c04a7fa7ad616669b24c79" } ], "minimalStep": { @@ -129,7 +129,7 @@ Content-Type: application/json; charset=UTF-8 "startDate": "2020-06-04T00:00:00+02:00", "endDate": "2020-07-04T00:00:00+02:00" }, - "id": "6ebdaf1cb586410f8c8c843a108b155f", + "id": "342d8d19d6aa4ee1a5e7402aef5f5308", "quantity": 1.0 }, { @@ -158,7 +158,7 @@ Content-Type: application/json; charset=UTF-8 "startDate": "2020-06-04T00:00:00+02:00", "endDate": "2020-07-04T00:00:00+02:00" }, - "id": "2362877518ef44d783c05ed80edafa78", + "id": "ae7d27b9ef6d491c9527f262d9004c0f", "quantity": 1.0 } ], diff --git a/docs/source/tendering/openeu/http/tutorial/pending-cancellation.http b/docs/source/tendering/openeu/http/tutorial/pending-cancellation.http index c5d7c5810d..60db9ca573 100644 --- a/docs/source/tendering/openeu/http/tutorial/pending-cancellation.http +++ b/docs/source/tendering/openeu/http/tutorial/pending-cancellation.http @@ -1,4 +1,4 @@ -PATCH /api/2.5/tenders/ef61695c05174b37b2bb6a8da114cc9d/cancellations/97b552ab570842e5953352f7a3673061?acc_token=5af527ef599c4cb0a283a7ba4c445288 HTTP/1.0 +PATCH /api/2.5/tenders/ef61695c05174b37b2bb6a8da114cc9d/cancellations/e6d0ca7cdd784832ad4d9b48a7f3b7d3?acc_token=5af527ef599c4cb0a283a7ba4c445288 HTTP/1.0 Authorization: Bearer broker Content-Length: 31 Content-Type: application/json @@ -49,7 +49,7 @@ Content-Type: application/json; charset=UTF-8 "reasonType": "unFixable", "date": "2020-05-15T01:00:01+03:00", "cancellationOf": "tender", - "id": "97b552ab570842e5953352f7a3673061" + "id": "e6d0ca7cdd784832ad4d9b48a7f3b7d3" } } diff --git a/docs/source/tendering/openeu/http/tutorial/pre-qualification-confirmation.http b/docs/source/tendering/openeu/http/tutorial/pre-qualification-confirmation.http index 936ac535c2..4fe879c53c 100644 --- a/docs/source/tendering/openeu/http/tutorial/pre-qualification-confirmation.http +++ b/docs/source/tendering/openeu/http/tutorial/pre-qualification-confirmation.http @@ -23,8 +23,8 @@ Content-Type: application/json; charset=UTF-8 }, "enquiryPeriod": { "startDate": "2020-04-14T01:00:00+03:00", - "clarificationsUntil": "2020-05-09T00:00:00+03:00", - "endDate": "2020-05-05T01:00:00+03:00", + "clarificationsUntil": "2020-05-08T00:00:00+03:00", + "endDate": "2020-05-05T00:00:00+03:00", "invalidationDate": "2020-05-15T01:00:00+03:00" }, "qualifications": [ @@ -32,7 +32,7 @@ Content-Type: application/json; charset=UTF-8 "status": "active", "eligible": true, "qualified": true, - "bidID": "ce6fe53ed8074a8993c306b027fa9a53", + "bidID": "9d482818789a45e88dfb8ad4c89bd4ef", "date": "2020-05-15T01:00:00+03:00", "id": "9e160e069e95412f92c8bd685238111c" }, @@ -40,7 +40,7 @@ Content-Type: application/json; charset=UTF-8 "status": "active", "eligible": true, "qualified": true, - "bidID": "8bb3878e6aa347bf8d402a8988d6475c", + "bidID": "ca262e0588d5439b9bd58b3d33caf545", "date": "2020-05-15T01:00:00+03:00", "id": "013bfea00e914bd68600631fb69548f1" }, @@ -48,7 +48,7 @@ Content-Type: application/json; charset=UTF-8 "status": "unsuccessful", "eligible": false, "qualified": false, - "bidID": "300d8d13119e4450b4fa9cab0c0e9507", + "bidID": "b8bb2055efc445abbaad89741fff85c6", "date": "2020-05-15T01:00:00+03:00", "id": "44650235cbbc4993af51233c8dcc6187" } @@ -87,7 +87,7 @@ Content-Type: application/json; charset=UTF-8 "title": "Калорійність", "date": "2020-05-15T01:00:00+03:00", "answer": "Таблицю додано в файлі \"Kalorijnist.xslx\"", - "id": "690479c37d9e47f3bff5ef4a7f4c9e23", + "id": "60347354fc274dedb95e11f4fcbeb1d4", "questionOf": "tender" } ], @@ -176,7 +176,7 @@ Content-Type: application/json; charset=UTF-8 }, "percentage": 54.45, "type": "financing", - "id": "93ea80580cc948249bac1c77f04afe98" + "id": "710cfcde78c04a7fa7ad616669b24c79" } ], "minimalStep": { @@ -211,7 +211,7 @@ Content-Type: application/json; charset=UTF-8 "startDate": "2020-06-04T00:00:00+02:00", "endDate": "2020-07-04T00:00:00+02:00" }, - "id": "6ebdaf1cb586410f8c8c843a108b155f", + "id": "342d8d19d6aa4ee1a5e7402aef5f5308", "quantity": 1.0 }, { @@ -240,7 +240,7 @@ Content-Type: application/json; charset=UTF-8 "startDate": "2020-06-04T00:00:00+02:00", "endDate": "2020-07-04T00:00:00+02:00" }, - "id": "2362877518ef44d783c05ed80edafa78", + "id": "ae7d27b9ef6d491c9527f262d9004c0f", "quantity": 1.0 } ], @@ -265,7 +265,7 @@ Content-Type: application/json; charset=UTF-8 "confidentiality": "buyerOnly", "language": "uk", "format": "application/pdf", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/ef61695c05174b37b2bb6a8da114cc9d/bids/ce6fe53ed8074a8993c306b027fa9a53/documents/ca89fb4746d64cfd87f857401fe85d90?download=46eae2bb26bb459e80168cde78780897", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/ef61695c05174b37b2bb6a8da114cc9d/bids/9d482818789a45e88dfb8ad4c89bd4ef/documents/ca89fb4746d64cfd87f857401fe85d90?download=46eae2bb26bb459e80168cde78780897", "confidentialityRationale": "Only our company sells badgers with pink hair.", "title": "Proposal_top_secrets.pdf", "documentOf": "tender", @@ -297,7 +297,7 @@ Content-Type: application/json; charset=UTF-8 } } ], - "id": "ce6fe53ed8074a8993c306b027fa9a53", + "id": "9d482818789a45e88dfb8ad4c89bd4ef", "eligibilityDocuments": [ { "hash": "md5:00000000000000000000000000000000", @@ -315,7 +315,7 @@ Content-Type: application/json; charset=UTF-8 }, { "status": "active", - "id": "8bb3878e6aa347bf8d402a8988d6475c", + "id": "ca262e0588d5439b9bd58b3d33caf545", "tenderers": [ { "contactPoint": { @@ -342,7 +342,6 @@ Content-Type: application/json; charset=UTF-8 }, { "status": "unsuccessful", - "selfEligible": true, "tenderers": [ { "contactPoint": { @@ -367,7 +366,7 @@ Content-Type: application/json; charset=UTF-8 } ], "selfQualified": true, - "id": "300d8d13119e4450b4fa9cab0c0e9507" + "id": "b8bb2055efc445abbaad89741fff85c6" } ], "value": { diff --git a/docs/source/tendering/openeu/http/tutorial/prepare-cancellation.http b/docs/source/tendering/openeu/http/tutorial/prepare-cancellation.http index 443057f672..48c929b1fb 100644 --- a/docs/source/tendering/openeu/http/tutorial/prepare-cancellation.http +++ b/docs/source/tendering/openeu/http/tutorial/prepare-cancellation.http @@ -13,7 +13,7 @@ DATA: Response: 201 Created Content-Type: application/json; charset=UTF-8 -Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/ef61695c05174b37b2bb6a8da114cc9d/cancellations/97b552ab570842e5953352f7a3673061 +Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/ef61695c05174b37b2bb6a8da114cc9d/cancellations/e6d0ca7cdd784832ad4d9b48a7f3b7d3 { "data": { "status": "draft", @@ -21,7 +21,7 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/ef61695c05174b37 "reasonType": "noDemand", "date": "2020-05-15T01:00:01+03:00", "cancellationOf": "tender", - "id": "97b552ab570842e5953352f7a3673061" + "id": "e6d0ca7cdd784832ad4d9b48a7f3b7d3" } } diff --git a/docs/source/tendering/openeu/http/tutorial/qualificated-bids-view.http b/docs/source/tendering/openeu/http/tutorial/qualificated-bids-view.http index 9902be2012..de06b5a7ac 100644 --- a/docs/source/tendering/openeu/http/tutorial/qualificated-bids-view.http +++ b/docs/source/tendering/openeu/http/tutorial/qualificated-bids-view.http @@ -26,7 +26,7 @@ Content-Type: application/json; charset=UTF-8 "confidentiality": "buyerOnly", "language": "uk", "format": "application/pdf", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/ef61695c05174b37b2bb6a8da114cc9d/bids/ce6fe53ed8074a8993c306b027fa9a53/documents/ca89fb4746d64cfd87f857401fe85d90?download=46eae2bb26bb459e80168cde78780897", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/ef61695c05174b37b2bb6a8da114cc9d/bids/9d482818789a45e88dfb8ad4c89bd4ef/documents/ca89fb4746d64cfd87f857401fe85d90?download=46eae2bb26bb459e80168cde78780897", "confidentialityRationale": "Only our company sells badgers with pink hair.", "title": "Proposal_top_secrets.pdf", "documentOf": "tender", @@ -58,7 +58,7 @@ Content-Type: application/json; charset=UTF-8 } } ], - "id": "ce6fe53ed8074a8993c306b027fa9a53", + "id": "9d482818789a45e88dfb8ad4c89bd4ef", "eligibilityDocuments": [ { "hash": "md5:00000000000000000000000000000000", @@ -76,7 +76,7 @@ Content-Type: application/json; charset=UTF-8 }, { "status": "active", - "id": "8bb3878e6aa347bf8d402a8988d6475c", + "id": "ca262e0588d5439b9bd58b3d33caf545", "tenderers": [ { "contactPoint": { @@ -103,7 +103,6 @@ Content-Type: application/json; charset=UTF-8 }, { "status": "unsuccessful", - "selfEligible": true, "tenderers": [ { "contactPoint": { @@ -128,7 +127,7 @@ Content-Type: application/json; charset=UTF-8 } ], "selfQualified": true, - "id": "300d8d13119e4450b4fa9cab0c0e9507" + "id": "b8bb2055efc445abbaad89741fff85c6" } ] } diff --git a/docs/source/tendering/openeu/http/tutorial/qualifications-listing.http b/docs/source/tendering/openeu/http/tutorial/qualifications-listing.http index 5fdc568717..2902e9d73f 100644 --- a/docs/source/tendering/openeu/http/tutorial/qualifications-listing.http +++ b/docs/source/tendering/openeu/http/tutorial/qualifications-listing.http @@ -15,8 +15,8 @@ Content-Type: application/json; charset=UTF-8 }, "enquiryPeriod": { "startDate": "2020-04-14T01:00:00+03:00", - "clarificationsUntil": "2020-05-09T00:00:00+03:00", - "endDate": "2020-05-05T01:00:00+03:00", + "clarificationsUntil": "2020-05-08T00:00:00+03:00", + "endDate": "2020-05-05T00:00:00+03:00", "invalidationDate": "2020-05-15T01:00:00+03:00" }, "submissionMethod": "electronicAuction", @@ -52,7 +52,7 @@ Content-Type: application/json; charset=UTF-8 "title": "Калорійність", "date": "2020-05-15T01:00:00+03:00", "answer": "Таблицю додано в файлі \"Kalorijnist.xslx\"", - "id": "690479c37d9e47f3bff5ef4a7f4c9e23", + "id": "60347354fc274dedb95e11f4fcbeb1d4", "questionOf": "tender" } ], @@ -117,7 +117,7 @@ Content-Type: application/json; charset=UTF-8 "status": "pending", "eligible": false, "qualified": false, - "bidID": "ce6fe53ed8074a8993c306b027fa9a53", + "bidID": "9d482818789a45e88dfb8ad4c89bd4ef", "date": "2020-05-15T01:00:00+03:00", "id": "9e160e069e95412f92c8bd685238111c" }, @@ -125,7 +125,7 @@ Content-Type: application/json; charset=UTF-8 "status": "pending", "eligible": false, "qualified": false, - "bidID": "8bb3878e6aa347bf8d402a8988d6475c", + "bidID": "ca262e0588d5439b9bd58b3d33caf545", "date": "2020-05-15T01:00:00+03:00", "id": "013bfea00e914bd68600631fb69548f1" }, @@ -133,7 +133,7 @@ Content-Type: application/json; charset=UTF-8 "status": "pending", "eligible": false, "qualified": false, - "bidID": "300d8d13119e4450b4fa9cab0c0e9507", + "bidID": "b8bb2055efc445abbaad89741fff85c6", "date": "2020-05-15T01:00:00+03:00", "id": "44650235cbbc4993af51233c8dcc6187" } @@ -163,7 +163,7 @@ Content-Type: application/json; charset=UTF-8 }, "percentage": 54.45, "type": "financing", - "id": "93ea80580cc948249bac1c77f04afe98" + "id": "710cfcde78c04a7fa7ad616669b24c79" } ], "minimalStep": { @@ -198,7 +198,7 @@ Content-Type: application/json; charset=UTF-8 "startDate": "2020-06-04T00:00:00+02:00", "endDate": "2020-07-04T00:00:00+02:00" }, - "id": "6ebdaf1cb586410f8c8c843a108b155f", + "id": "342d8d19d6aa4ee1a5e7402aef5f5308", "quantity": 1.0 }, { @@ -227,7 +227,7 @@ Content-Type: application/json; charset=UTF-8 "startDate": "2020-06-04T00:00:00+02:00", "endDate": "2020-07-04T00:00:00+02:00" }, - "id": "2362877518ef44d783c05ed80edafa78", + "id": "ae7d27b9ef6d491c9527f262d9004c0f", "quantity": 1.0 } ], @@ -283,7 +283,7 @@ Content-Type: application/json; charset=UTF-8 } } ], - "id": "ce6fe53ed8074a8993c306b027fa9a53", + "id": "9d482818789a45e88dfb8ad4c89bd4ef", "eligibilityDocuments": [ { "hash": "md5:00000000000000000000000000000000", @@ -301,7 +301,7 @@ Content-Type: application/json; charset=UTF-8 }, { "status": "pending", - "id": "8bb3878e6aa347bf8d402a8988d6475c", + "id": "ca262e0588d5439b9bd58b3d33caf545", "tenderers": [ { "contactPoint": { @@ -328,7 +328,7 @@ Content-Type: application/json; charset=UTF-8 }, { "status": "pending", - "id": "300d8d13119e4450b4fa9cab0c0e9507", + "id": "b8bb2055efc445abbaad89741fff85c6", "tenderers": [ { "contactPoint": { diff --git a/docs/source/tendering/openeu/http/tutorial/register-2nd-bidder.http b/docs/source/tendering/openeu/http/tutorial/register-2nd-bidder.http index e69c0c2a7f..a68ffdf504 100644 --- a/docs/source/tendering/openeu/http/tutorial/register-2nd-bidder.http +++ b/docs/source/tendering/openeu/http/tutorial/register-2nd-bidder.http @@ -1,12 +1,11 @@ POST /api/2.5/tenders/ef61695c05174b37b2bb6a8da114cc9d/bids HTTP/1.0 Authorization: Bearer broker -Content-Length: 824 +Content-Length: 802 Content-Type: application/json Host: lb-api-sandbox.prozorro.gov.ua DATA: { "data": { - "selfEligible": true, "selfQualified": true, "value": { "amount": 499 @@ -39,7 +38,7 @@ DATA: Response: 201 Created Content-Type: application/json; charset=UTF-8 -Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/ef61695c05174b37b2bb6a8da114cc9d/bids/8bb3878e6aa347bf8d402a8988d6475c +Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/ef61695c05174b37b2bb6a8da114cc9d/bids/ca262e0588d5439b9bd58b3d33caf545 { "access": { "transfer": "07f47c14667d482eb9264e6a9c878dd5", @@ -47,13 +46,12 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/ef61695c05174b37 }, "data": { "status": "pending", - "selfEligible": true, "value": { "currency": "UAH", "amount": 499.0, "valueAddedTaxIncluded": true }, - "selfQualified": true, + "id": "ca262e0588d5439b9bd58b3d33caf545", "tenderers": [ { "contactPoint": { @@ -78,7 +76,7 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/ef61695c05174b37 } ], "date": "2020-05-15T01:00:00+03:00", - "id": "8bb3878e6aa347bf8d402a8988d6475c" + "selfQualified": true } } diff --git a/docs/source/tendering/openeu/http/tutorial/register-3rd-bidder.http b/docs/source/tendering/openeu/http/tutorial/register-3rd-bidder.http index 7c635c5dc8..b69d07231e 100644 --- a/docs/source/tendering/openeu/http/tutorial/register-3rd-bidder.http +++ b/docs/source/tendering/openeu/http/tutorial/register-3rd-bidder.http @@ -1,12 +1,11 @@ POST /api/2.5/tenders/ef61695c05174b37b2bb6a8da114cc9d/bids HTTP/1.0 Authorization: Bearer broker -Content-Length: 824 +Content-Length: 802 Content-Type: application/json Host: lb-api-sandbox.prozorro.gov.ua DATA: { "data": { - "selfEligible": true, "selfQualified": true, "value": { "amount": 499 @@ -39,7 +38,7 @@ DATA: Response: 201 Created Content-Type: application/json; charset=UTF-8 -Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/ef61695c05174b37b2bb6a8da114cc9d/bids/300d8d13119e4450b4fa9cab0c0e9507 +Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/ef61695c05174b37b2bb6a8da114cc9d/bids/b8bb2055efc445abbaad89741fff85c6 { "access": { "transfer": "295b74165f164149a4cc68316a4db360", @@ -47,13 +46,12 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/ef61695c05174b37 }, "data": { "status": "pending", - "selfEligible": true, "value": { "currency": "UAH", "amount": 499.0, "valueAddedTaxIncluded": true }, - "selfQualified": true, + "id": "b8bb2055efc445abbaad89741fff85c6", "tenderers": [ { "contactPoint": { @@ -78,7 +76,7 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/ef61695c05174b37 } ], "date": "2020-05-15T01:00:00+03:00", - "id": "300d8d13119e4450b4fa9cab0c0e9507" + "selfQualified": true } } diff --git a/docs/source/tendering/openeu/http/tutorial/register-bidder.http b/docs/source/tendering/openeu/http/tutorial/register-bidder.http index 9228a6de94..62f5ef17a7 100644 --- a/docs/source/tendering/openeu/http/tutorial/register-bidder.http +++ b/docs/source/tendering/openeu/http/tutorial/register-bidder.http @@ -1,17 +1,12 @@ POST /api/2.5/tenders/ef61695c05174b37b2bb6a8da114cc9d/bids HTTP/1.0 Authorization: Bearer broker -Content-Length: 1001 +Content-Length: 979 Content-Type: application/json Host: lb-api-sandbox.prozorro.gov.ua DATA: { "data": { "status": "draft", - "selfEligible": true, - "value": { - "amount": 500 - }, - "subcontractingDetails": "ДКП «Орфей», Україна", "tenderers": [ { "contactPoint": { @@ -35,13 +30,17 @@ DATA: } } ], - "selfQualified": true + "selfQualified": true, + "value": { + "amount": 500 + }, + "subcontractingDetails": "ДКП «Орфей», Україна" } } Response: 201 Created Content-Type: application/json; charset=UTF-8 -Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/ef61695c05174b37b2bb6a8da114cc9d/bids/ce6fe53ed8074a8993c306b027fa9a53 +Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/ef61695c05174b37b2bb6a8da114cc9d/bids/9d482818789a45e88dfb8ad4c89bd4ef { "access": { "transfer": "0d7df4caaad2417ba53a43c0904638bb", @@ -49,7 +48,6 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/ef61695c05174b37 }, "data": { "status": "draft", - "selfEligible": true, "value": { "currency": "UAH", "amount": 500.0, @@ -81,7 +79,7 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/ef61695c05174b37 } ], "date": "2020-05-15T01:00:00+03:00", - "id": "ce6fe53ed8074a8993c306b027fa9a53" + "id": "9d482818789a45e88dfb8ad4c89bd4ef" } } diff --git a/docs/source/tendering/openeu/http/tutorial/reject-qualification3.http b/docs/source/tendering/openeu/http/tutorial/reject-qualification3.http index 77c0fcd40a..4dc8fb8add 100644 --- a/docs/source/tendering/openeu/http/tutorial/reject-qualification3.http +++ b/docs/source/tendering/openeu/http/tutorial/reject-qualification3.http @@ -17,7 +17,7 @@ Content-Type: application/json; charset=UTF-8 "status": "unsuccessful", "eligible": false, "qualified": false, - "bidID": "300d8d13119e4450b4fa9cab0c0e9507", + "bidID": "b8bb2055efc445abbaad89741fff85c6", "date": "2020-05-15T01:00:00+03:00", "id": "44650235cbbc4993af51233c8dcc6187" } diff --git a/docs/source/tendering/openeu/http/tutorial/rejected-bid-view.http b/docs/source/tendering/openeu/http/tutorial/rejected-bid-view.http index ca03d5d09a..18b03b91de 100644 --- a/docs/source/tendering/openeu/http/tutorial/rejected-bid-view.http +++ b/docs/source/tendering/openeu/http/tutorial/rejected-bid-view.http @@ -1,4 +1,4 @@ -GET /api/2.5/tenders/ef61695c05174b37b2bb6a8da114cc9d/bids/300d8d13119e4450b4fa9cab0c0e9507?acc_token=5af527ef599c4cb0a283a7ba4c445288 HTTP/1.0 +GET /api/2.5/tenders/ef61695c05174b37b2bb6a8da114cc9d/bids/b8bb2055efc445abbaad89741fff85c6?acc_token=5af527ef599c4cb0a283a7ba4c445288 HTTP/1.0 Authorization: Bearer broker Host: lb-api-sandbox.prozorro.gov.ua @@ -7,7 +7,6 @@ Content-Type: application/json; charset=UTF-8 { "data": { "status": "unsuccessful", - "selfEligible": true, "tenderers": [ { "contactPoint": { @@ -32,7 +31,7 @@ Content-Type: application/json; charset=UTF-8 } ], "selfQualified": true, - "id": "300d8d13119e4450b4fa9cab0c0e9507" + "id": "b8bb2055efc445abbaad89741fff85c6" } } diff --git a/docs/source/tendering/openeu/http/tutorial/set-bid-guarantee.http b/docs/source/tendering/openeu/http/tutorial/set-bid-guarantee.http index 52b0bdaa95..816c813de6 100644 --- a/docs/source/tendering/openeu/http/tutorial/set-bid-guarantee.http +++ b/docs/source/tendering/openeu/http/tutorial/set-bid-guarantee.http @@ -21,16 +21,16 @@ Content-Type: application/json; charset=UTF-8 "mainProcurementCategory": "services", "complaintPeriod": { "startDate": "2020-05-15T01:00:00+03:00", - "endDate": "2020-06-10T00:00:00+03:00" + "endDate": "2020-06-11T00:00:00+02:00" }, "enquiryPeriod": { "startDate": "2020-05-15T01:00:00+03:00", - "clarificationsUntil": "2020-06-11T00:00:00+03:00", - "endDate": "2020-06-04T01:00:10+03:00", + "clarificationsUntil": "2020-06-11T00:00:00+02:00", + "endDate": "2020-06-05T00:00:00+02:00", "invalidationDate": "2020-05-15T01:00:00+03:00" }, "submissionMethod": "electronicAuction", - "next_check": "2020-06-14T01:00:10+03:00", + "next_check": "2020-06-15T01:00:00+03:00", "procuringEntity": { "kind": "general", "name": "ЗОСШ #10 м.Вінниці", @@ -69,10 +69,10 @@ Content-Type: application/json; charset=UTF-8 "status": "active.tendering", "tenderPeriod": { "startDate": "2020-05-15T01:00:00+03:00", - "endDate": "2020-06-14T01:00:10+03:00" + "endDate": "2020-06-15T00:00:00+02:00" }, "auctionPeriod": { - "shouldStartAfter": "2020-07-20T00:00:00+03:00" + "shouldStartAfter": "2020-07-20T00:00:00+02:00" }, "procurementMethodType": "aboveThresholdEU", "date": "2020-05-15T01:00:00+03:00", @@ -99,7 +99,7 @@ Content-Type: application/json; charset=UTF-8 }, "percentage": 54.45, "type": "financing", - "id": "93ea80580cc948249bac1c77f04afe98" + "id": "710cfcde78c04a7fa7ad616669b24c79" } ], "minimalStep": { @@ -134,7 +134,7 @@ Content-Type: application/json; charset=UTF-8 "startDate": "2020-06-04T00:00:00+02:00", "endDate": "2020-07-04T00:00:00+02:00" }, - "id": "6ebdaf1cb586410f8c8c843a108b155f", + "id": "342d8d19d6aa4ee1a5e7402aef5f5308", "quantity": 1.0 }, { @@ -163,7 +163,7 @@ Content-Type: application/json; charset=UTF-8 "startDate": "2020-06-04T00:00:00+02:00", "endDate": "2020-07-04T00:00:00+02:00" }, - "id": "2362877518ef44d783c05ed80edafa78", + "id": "ae7d27b9ef6d491c9527f262d9004c0f", "quantity": 1.0 } ], diff --git a/docs/source/tendering/openeu/http/tutorial/tender-contract-get.http b/docs/source/tendering/openeu/http/tutorial/tender-contract-get.http index d16bb00db3..edc223aec9 100644 --- a/docs/source/tendering/openeu/http/tutorial/tender-contract-get.http +++ b/docs/source/tendering/openeu/http/tutorial/tender-contract-get.http @@ -60,7 +60,7 @@ Content-Type: application/json; charset=UTF-8 "startDate": "2020-06-04T00:00:00+02:00", "endDate": "2020-07-04T00:00:00+02:00" }, - "id": "6ebdaf1cb586410f8c8c843a108b155f", + "id": "342d8d19d6aa4ee1a5e7402aef5f5308", "quantity": 1.0 }, { @@ -89,7 +89,7 @@ Content-Type: application/json; charset=UTF-8 "startDate": "2020-06-04T00:00:00+02:00", "endDate": "2020-07-04T00:00:00+02:00" }, - "id": "2362877518ef44d783c05ed80edafa78", + "id": "ae7d27b9ef6d491c9527f262d9004c0f", "quantity": 1.0 } ], diff --git a/docs/source/tendering/openeu/http/tutorial/tender-contract-period.http b/docs/source/tendering/openeu/http/tutorial/tender-contract-period.http index 9f00893fd3..2315f68eb2 100644 --- a/docs/source/tendering/openeu/http/tutorial/tender-contract-period.http +++ b/docs/source/tendering/openeu/http/tutorial/tender-contract-period.http @@ -45,7 +45,7 @@ Content-Type: application/json; charset=UTF-8 "startDate": "2020-06-04T00:00:00+02:00", "endDate": "2020-07-04T00:00:00+02:00" }, - "id": "6ebdaf1cb586410f8c8c843a108b155f", + "id": "342d8d19d6aa4ee1a5e7402aef5f5308", "quantity": 1.0 }, { @@ -74,7 +74,7 @@ Content-Type: application/json; charset=UTF-8 "startDate": "2020-06-04T00:00:00+02:00", "endDate": "2020-07-04T00:00:00+02:00" }, - "id": "2362877518ef44d783c05ed80edafa78", + "id": "ae7d27b9ef6d491c9527f262d9004c0f", "quantity": 1.0 } ], diff --git a/docs/source/tendering/openeu/http/tutorial/tender-contract-set-contract-value.http b/docs/source/tendering/openeu/http/tutorial/tender-contract-set-contract-value.http index 54f9f40dca..b97b6fe78b 100644 --- a/docs/source/tendering/openeu/http/tutorial/tender-contract-set-contract-value.http +++ b/docs/source/tendering/openeu/http/tutorial/tender-contract-set-contract-value.http @@ -46,7 +46,7 @@ Content-Type: application/json; charset=UTF-8 "startDate": "2020-06-04T00:00:00+02:00", "endDate": "2020-07-04T00:00:00+02:00" }, - "id": "6ebdaf1cb586410f8c8c843a108b155f", + "id": "342d8d19d6aa4ee1a5e7402aef5f5308", "quantity": 1.0 }, { @@ -75,7 +75,7 @@ Content-Type: application/json; charset=UTF-8 "startDate": "2020-06-04T00:00:00+02:00", "endDate": "2020-07-04T00:00:00+02:00" }, - "id": "2362877518ef44d783c05ed80edafa78", + "id": "ae7d27b9ef6d491c9527f262d9004c0f", "quantity": 1.0 } ], diff --git a/docs/source/tendering/openeu/http/tutorial/tender-contract-sign-date.http b/docs/source/tendering/openeu/http/tutorial/tender-contract-sign-date.http index 6c16b81480..c987c9573e 100644 --- a/docs/source/tendering/openeu/http/tutorial/tender-contract-sign-date.http +++ b/docs/source/tendering/openeu/http/tutorial/tender-contract-sign-date.http @@ -42,7 +42,7 @@ Content-Type: application/json; charset=UTF-8 "startDate": "2020-06-04T00:00:00+02:00", "endDate": "2020-07-04T00:00:00+02:00" }, - "id": "6ebdaf1cb586410f8c8c843a108b155f", + "id": "342d8d19d6aa4ee1a5e7402aef5f5308", "quantity": 1.0 }, { @@ -71,7 +71,7 @@ Content-Type: application/json; charset=UTF-8 "startDate": "2020-06-04T00:00:00+02:00", "endDate": "2020-07-04T00:00:00+02:00" }, - "id": "2362877518ef44d783c05ed80edafa78", + "id": "ae7d27b9ef6d491c9527f262d9004c0f", "quantity": 1.0 } ], diff --git a/docs/source/tendering/openeu/http/tutorial/tender-post-attempt-json-data.http b/docs/source/tendering/openeu/http/tutorial/tender-post-attempt-json-data.http index 2777a945e8..2aa3a9b371 100644 --- a/docs/source/tendering/openeu/http/tutorial/tender-post-attempt-json-data.http +++ b/docs/source/tendering/openeu/http/tutorial/tender-post-attempt-json-data.http @@ -218,7 +218,7 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/ef61695c05174b37 }, "percentage": 54.45, "type": "financing", - "id": "93ea80580cc948249bac1c77f04afe98" + "id": "710cfcde78c04a7fa7ad616669b24c79" } ], "minimalStep": { @@ -253,7 +253,7 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/ef61695c05174b37 "startDate": "2020-06-04T00:00:00+02:00", "endDate": "2020-07-04T00:00:00+02:00" }, - "id": "6ebdaf1cb586410f8c8c843a108b155f", + "id": "342d8d19d6aa4ee1a5e7402aef5f5308", "quantity": 1.0 }, { @@ -282,7 +282,7 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/ef61695c05174b37 "startDate": "2020-06-04T00:00:00+02:00", "endDate": "2020-07-04T00:00:00+02:00" }, - "id": "2362877518ef44d783c05ed80edafa78", + "id": "ae7d27b9ef6d491c9527f262d9004c0f", "quantity": 1.0 } ], diff --git a/docs/source/tendering/openeu/http/tutorial/update-cancellation-doc.http b/docs/source/tendering/openeu/http/tutorial/update-cancellation-doc.http index 884d04f88f..adae663a95 100644 --- a/docs/source/tendering/openeu/http/tutorial/update-cancellation-doc.http +++ b/docs/source/tendering/openeu/http/tutorial/update-cancellation-doc.http @@ -1,4 +1,4 @@ -PUT /api/2.5/tenders/ef61695c05174b37b2bb6a8da114cc9d/cancellations/97b552ab570842e5953352f7a3673061/documents/ac9e2b1c99c14e34bf70690cf7d83438?acc_token=5af527ef599c4cb0a283a7ba4c445288 HTTP/1.0 +PUT /api/2.5/tenders/ef61695c05174b37b2bb6a8da114cc9d/cancellations/e6d0ca7cdd784832ad4d9b48a7f3b7d3/documents/ac9e2b1c99c14e34bf70690cf7d83438?acc_token=5af527ef599c4cb0a283a7ba4c445288 HTTP/1.0 Authorization: Bearer broker Content-Length: 145 Content-Type: multipart/form-data; boundary=---BOUNDARY diff --git a/docs/source/tendering/openeu/http/tutorial/update-cancellation-reasonType.http b/docs/source/tendering/openeu/http/tutorial/update-cancellation-reasonType.http index c561775060..2e4b7d8a3a 100644 --- a/docs/source/tendering/openeu/http/tutorial/update-cancellation-reasonType.http +++ b/docs/source/tendering/openeu/http/tutorial/update-cancellation-reasonType.http @@ -1,4 +1,4 @@ -PATCH /api/2.5/tenders/ef61695c05174b37b2bb6a8da114cc9d/cancellations/97b552ab570842e5953352f7a3673061?acc_token=5af527ef599c4cb0a283a7ba4c445288 HTTP/1.0 +PATCH /api/2.5/tenders/ef61695c05174b37b2bb6a8da114cc9d/cancellations/e6d0ca7cdd784832ad4d9b48a7f3b7d3?acc_token=5af527ef599c4cb0a283a7ba4c445288 HTTP/1.0 Authorization: Bearer broker Content-Length: 37 Content-Type: application/json @@ -19,7 +19,7 @@ Content-Type: application/json; charset=UTF-8 "reasonType": "unFixable", "date": "2020-05-15T01:00:01+03:00", "cancellationOf": "tender", - "id": "97b552ab570842e5953352f7a3673061" + "id": "e6d0ca7cdd784832ad4d9b48a7f3b7d3" } } diff --git a/docs/source/tendering/openeu/http/tutorial/update-tender-after-enqiery-with-update-periods.http b/docs/source/tendering/openeu/http/tutorial/update-tender-after-enqiery-with-update-periods.http index ea23e66956..21a0fc7dc0 100644 --- a/docs/source/tendering/openeu/http/tutorial/update-tender-after-enqiery-with-update-periods.http +++ b/docs/source/tendering/openeu/http/tutorial/update-tender-after-enqiery-with-update-periods.http @@ -23,13 +23,13 @@ Content-Type: application/json; charset=UTF-8 "procurementMethod": "open", "mainProcurementCategory": "services", "complaintPeriod": { - "startDate": "2020-04-17T01:00:00+03:00", + "startDate": "2020-04-16T01:00:00+03:00", "endDate": "2020-05-19T00:00:00+03:00" }, "enquiryPeriod": { - "startDate": "2020-04-17T01:00:00+03:00", - "clarificationsUntil": "2020-05-19T00:00:00+03:00", - "endDate": "2020-05-13T01:00:00+03:00", + "startDate": "2020-04-16T01:00:00+03:00", + "clarificationsUntil": "2020-05-16T00:00:00+03:00", + "endDate": "2020-05-13T00:00:00+03:00", "invalidationDate": "2020-05-15T01:00:00+03:00" }, "submissionMethod": "electronicAuction", @@ -66,7 +66,7 @@ Content-Type: application/json; charset=UTF-8 "title": "Калорійність", "date": "2020-05-15T01:00:00+03:00", "answer": "Таблицю додано в файлі \"Kalorijnist.xslx\"", - "id": "690479c37d9e47f3bff5ef4a7f4c9e23", + "id": "60347354fc274dedb95e11f4fcbeb1d4", "questionOf": "tender" } ], @@ -120,7 +120,7 @@ Content-Type: application/json; charset=UTF-8 "dateModified": "2020-05-15T01:00:00+03:00", "status": "active.tendering", "tenderPeriod": { - "startDate": "2020-04-17T01:00:00+03:00", + "startDate": "2020-04-16T01:00:00+03:00", "endDate": "2020-05-23T01:00:00+03:00" }, "auctionPeriod": { @@ -151,7 +151,7 @@ Content-Type: application/json; charset=UTF-8 }, "percentage": 54.45, "type": "financing", - "id": "93ea80580cc948249bac1c77f04afe98" + "id": "710cfcde78c04a7fa7ad616669b24c79" } ], "minimalStep": { @@ -186,7 +186,7 @@ Content-Type: application/json; charset=UTF-8 "startDate": "2020-06-04T00:00:00+02:00", "endDate": "2020-07-04T00:00:00+02:00" }, - "id": "6ebdaf1cb586410f8c8c843a108b155f", + "id": "342d8d19d6aa4ee1a5e7402aef5f5308", "quantity": 1.0 }, { @@ -215,7 +215,7 @@ Content-Type: application/json; charset=UTF-8 "startDate": "2020-06-04T00:00:00+02:00", "endDate": "2020-07-04T00:00:00+02:00" }, - "id": "2362877518ef44d783c05ed80edafa78", + "id": "ae7d27b9ef6d491c9527f262d9004c0f", "quantity": 1.0 } ], diff --git a/docs/source/tendering/openeu/http/tutorial/update-tender-after-enqiery.http b/docs/source/tendering/openeu/http/tutorial/update-tender-after-enqiery.http index 848c12f50a..ed9d38d3b4 100644 --- a/docs/source/tendering/openeu/http/tutorial/update-tender-after-enqiery.http +++ b/docs/source/tendering/openeu/http/tutorial/update-tender-after-enqiery.http @@ -9,13 +9,13 @@ Content-Type: application/json; charset=UTF-8 "procurementMethod": "open", "mainProcurementCategory": "services", "complaintPeriod": { - "startDate": "2020-04-17T01:00:00+03:00", + "startDate": "2020-04-16T01:00:00+03:00", "endDate": "2020-05-13T00:00:00+03:00" }, "enquiryPeriod": { - "startDate": "2020-04-17T01:00:00+03:00", - "clarificationsUntil": "2020-05-14T00:00:00+03:00", - "endDate": "2020-05-07T01:00:00+03:00", + "startDate": "2020-04-16T01:00:00+03:00", + "clarificationsUntil": "2020-05-13T00:00:00+03:00", + "endDate": "2020-05-07T00:00:00+03:00", "invalidationDate": "2020-05-15T01:00:00+03:00" }, "submissionMethod": "electronicAuction", @@ -52,7 +52,7 @@ Content-Type: application/json; charset=UTF-8 "title": "Калорійність", "date": "2020-05-15T01:00:00+03:00", "answer": "Таблицю додано в файлі \"Kalorijnist.xslx\"", - "id": "690479c37d9e47f3bff5ef4a7f4c9e23", + "id": "60347354fc274dedb95e11f4fcbeb1d4", "questionOf": "tender" } ], @@ -106,7 +106,7 @@ Content-Type: application/json; charset=UTF-8 "dateModified": "2020-05-15T01:00:00+03:00", "status": "active.tendering", "tenderPeriod": { - "startDate": "2020-04-17T01:00:00+03:00", + "startDate": "2020-04-16T01:00:00+03:00", "endDate": "2020-05-17T01:00:00+03:00" }, "auctionPeriod": { @@ -137,7 +137,7 @@ Content-Type: application/json; charset=UTF-8 }, "percentage": 54.45, "type": "financing", - "id": "93ea80580cc948249bac1c77f04afe98" + "id": "710cfcde78c04a7fa7ad616669b24c79" } ], "minimalStep": { @@ -172,7 +172,7 @@ Content-Type: application/json; charset=UTF-8 "startDate": "2020-06-04T00:00:00+02:00", "endDate": "2020-07-04T00:00:00+02:00" }, - "id": "6ebdaf1cb586410f8c8c843a108b155f", + "id": "342d8d19d6aa4ee1a5e7402aef5f5308", "quantity": 1.0 }, { @@ -201,7 +201,7 @@ Content-Type: application/json; charset=UTF-8 "startDate": "2020-06-04T00:00:00+02:00", "endDate": "2020-07-04T00:00:00+02:00" }, - "id": "2362877518ef44d783c05ed80edafa78", + "id": "ae7d27b9ef6d491c9527f262d9004c0f", "quantity": 1.0 } ], diff --git a/docs/source/tendering/openeu/http/tutorial/upload-bid-eligibility-document-proposal.http b/docs/source/tendering/openeu/http/tutorial/upload-bid-eligibility-document-proposal.http index 14807915a8..f00f160359 100644 --- a/docs/source/tendering/openeu/http/tutorial/upload-bid-eligibility-document-proposal.http +++ b/docs/source/tendering/openeu/http/tutorial/upload-bid-eligibility-document-proposal.http @@ -1,4 +1,4 @@ -POST /api/2.5/tenders/ef61695c05174b37b2bb6a8da114cc9d/bids/ce6fe53ed8074a8993c306b027fa9a53/eligibility_documents?acc_token=d2a2184be75540dc9943d755fd56b1e0 HTTP/1.0 +POST /api/2.5/tenders/ef61695c05174b37b2bb6a8da114cc9d/bids/9d482818789a45e88dfb8ad4c89bd4ef/eligibility_documents?acc_token=d2a2184be75540dc9943d755fd56b1e0 HTTP/1.0 Authorization: Bearer broker Content-Length: 151 Content-Type: multipart/form-data; boundary=---BOUNDARY @@ -14,14 +14,14 @@ content Response: 201 Created Content-Type: application/json; charset=UTF-8 -Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/ef61695c05174b37b2bb6a8da114cc9d/bids/ce6fe53ed8074a8993c306b027fa9a53/eligibility_documents/84e8cce5126f4088a9d49b2d8a61147c +Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/ef61695c05174b37b2bb6a8da114cc9d/bids/9d482818789a45e88dfb8ad4c89bd4ef/eligibility_documents/84e8cce5126f4088a9d49b2d8a61147c { "data": { "hash": "md5:00000000000000000000000000000000", "confidentiality": "public", "language": "uk", "title": "eligibility_doc.pdf", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/ef61695c05174b37b2bb6a8da114cc9d/bids/ce6fe53ed8074a8993c306b027fa9a53/eligibility_documents/84e8cce5126f4088a9d49b2d8a61147c?download=f5bd5faca0ed402f9f631588655730d2", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/ef61695c05174b37b2bb6a8da114cc9d/bids/9d482818789a45e88dfb8ad4c89bd4ef/eligibility_documents/84e8cce5126f4088a9d49b2d8a61147c?download=f5bd5faca0ed402f9f631588655730d2", "format": "application/pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", diff --git a/docs/source/tendering/openeu/http/tutorial/upload-bid-financial-document-proposal.http b/docs/source/tendering/openeu/http/tutorial/upload-bid-financial-document-proposal.http index 73d3daea3c..4316b5bdef 100644 --- a/docs/source/tendering/openeu/http/tutorial/upload-bid-financial-document-proposal.http +++ b/docs/source/tendering/openeu/http/tutorial/upload-bid-financial-document-proposal.http @@ -1,4 +1,4 @@ -POST /api/2.5/tenders/ef61695c05174b37b2bb6a8da114cc9d/bids/ce6fe53ed8074a8993c306b027fa9a53/financial_documents?acc_token=d2a2184be75540dc9943d755fd56b1e0 HTTP/1.0 +POST /api/2.5/tenders/ef61695c05174b37b2bb6a8da114cc9d/bids/9d482818789a45e88dfb8ad4c89bd4ef/financial_documents?acc_token=d2a2184be75540dc9943d755fd56b1e0 HTTP/1.0 Authorization: Bearer broker Content-Length: 147 Content-Type: multipart/form-data; boundary=---BOUNDARY @@ -14,14 +14,14 @@ Content-Type: application/pdf Response: 201 Created Content-Type: application/json; charset=UTF-8 -Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/ef61695c05174b37b2bb6a8da114cc9d/bids/ce6fe53ed8074a8993c306b027fa9a53/financial_documents/4d63bcaab539462fbc4dad2cd151cd99 +Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/ef61695c05174b37b2bb6a8da114cc9d/bids/9d482818789a45e88dfb8ad4c89bd4ef/financial_documents/4d63bcaab539462fbc4dad2cd151cd99 { "data": { "hash": "md5:00000000000000000000000000000000", "confidentiality": "public", "language": "uk", "title": "financial_doc.pdf", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/ef61695c05174b37b2bb6a8da114cc9d/bids/ce6fe53ed8074a8993c306b027fa9a53/financial_documents/4d63bcaab539462fbc4dad2cd151cd99?download=14fd1c06e9f640f7b8891f22f2a645d6", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/ef61695c05174b37b2bb6a8da114cc9d/bids/9d482818789a45e88dfb8ad4c89bd4ef/financial_documents/4d63bcaab539462fbc4dad2cd151cd99?download=14fd1c06e9f640f7b8891f22f2a645d6", "format": "application/pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", diff --git a/docs/source/tendering/openeu/http/tutorial/upload-bid-private-proposal.http b/docs/source/tendering/openeu/http/tutorial/upload-bid-private-proposal.http index e28d96db9d..c1387f4831 100644 --- a/docs/source/tendering/openeu/http/tutorial/upload-bid-private-proposal.http +++ b/docs/source/tendering/openeu/http/tutorial/upload-bid-private-proposal.http @@ -1,4 +1,4 @@ -POST /api/2.5/tenders/ef61695c05174b37b2bb6a8da114cc9d/bids/ce6fe53ed8074a8993c306b027fa9a53/documents?acc_token=d2a2184be75540dc9943d755fd56b1e0 HTTP/1.0 +POST /api/2.5/tenders/ef61695c05174b37b2bb6a8da114cc9d/bids/9d482818789a45e88dfb8ad4c89bd4ef/documents?acc_token=d2a2184be75540dc9943d755fd56b1e0 HTTP/1.0 Authorization: Bearer broker Content-Length: 156 Content-Type: multipart/form-data; boundary=---BOUNDARY @@ -14,14 +14,14 @@ content Response: 201 Created Content-Type: application/json; charset=UTF-8 -Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/ef61695c05174b37b2bb6a8da114cc9d/bids/ce6fe53ed8074a8993c306b027fa9a53/documents/ca89fb4746d64cfd87f857401fe85d90 +Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/ef61695c05174b37b2bb6a8da114cc9d/bids/9d482818789a45e88dfb8ad4c89bd4ef/documents/ca89fb4746d64cfd87f857401fe85d90 { "data": { "hash": "md5:00000000000000000000000000000000", "confidentiality": "public", "language": "uk", "title": "Proposal_top_secrets.pdf", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/ef61695c05174b37b2bb6a8da114cc9d/bids/ce6fe53ed8074a8993c306b027fa9a53/documents/ca89fb4746d64cfd87f857401fe85d90?download=46eae2bb26bb459e80168cde78780897", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/ef61695c05174b37b2bb6a8da114cc9d/bids/9d482818789a45e88dfb8ad4c89bd4ef/documents/ca89fb4746d64cfd87f857401fe85d90?download=46eae2bb26bb459e80168cde78780897", "format": "application/pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", diff --git a/docs/source/tendering/openeu/http/tutorial/upload-bid-proposal.http b/docs/source/tendering/openeu/http/tutorial/upload-bid-proposal.http index 77e9f6f0a3..818d168599 100644 --- a/docs/source/tendering/openeu/http/tutorial/upload-bid-proposal.http +++ b/docs/source/tendering/openeu/http/tutorial/upload-bid-proposal.http @@ -1,4 +1,4 @@ -POST /api/2.5/tenders/ef61695c05174b37b2bb6a8da114cc9d/bids/ce6fe53ed8074a8993c306b027fa9a53/documents?acc_token=d2a2184be75540dc9943d755fd56b1e0 HTTP/1.0 +POST /api/2.5/tenders/ef61695c05174b37b2bb6a8da114cc9d/bids/9d482818789a45e88dfb8ad4c89bd4ef/documents?acc_token=d2a2184be75540dc9943d755fd56b1e0 HTTP/1.0 Authorization: Bearer broker Content-Length: 144 Content-Type: multipart/form-data; boundary=---BOUNDARY @@ -14,14 +14,14 @@ content Response: 201 Created Content-Type: application/json; charset=UTF-8 -Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/ef61695c05174b37b2bb6a8da114cc9d/bids/ce6fe53ed8074a8993c306b027fa9a53/documents/ffb8f68e7a9442ca8c7c909ce9475091 +Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/ef61695c05174b37b2bb6a8da114cc9d/bids/9d482818789a45e88dfb8ad4c89bd4ef/documents/ffb8f68e7a9442ca8c7c909ce9475091 { "data": { "hash": "md5:00000000000000000000000000000000", "confidentiality": "public", "language": "uk", "title": "Proposal.pdf", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/ef61695c05174b37b2bb6a8da114cc9d/bids/ce6fe53ed8074a8993c306b027fa9a53/documents/ffb8f68e7a9442ca8c7c909ce9475091?download=b1254823518c427e84bddac2609d49cb", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/ef61695c05174b37b2bb6a8da114cc9d/bids/9d482818789a45e88dfb8ad4c89bd4ef/documents/ffb8f68e7a9442ca8c7c909ce9475091?download=b1254823518c427e84bddac2609d49cb", "format": "application/pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", diff --git a/docs/source/tendering/openeu/http/tutorial/upload-bid-qualification-document-proposal.http b/docs/source/tendering/openeu/http/tutorial/upload-bid-qualification-document-proposal.http index 05b730b3ec..81787ebb5b 100644 --- a/docs/source/tendering/openeu/http/tutorial/upload-bid-qualification-document-proposal.http +++ b/docs/source/tendering/openeu/http/tutorial/upload-bid-qualification-document-proposal.http @@ -1,4 +1,4 @@ -POST /api/2.5/tenders/ef61695c05174b37b2bb6a8da114cc9d/bids/ce6fe53ed8074a8993c306b027fa9a53/qualification_documents?acc_token=d2a2184be75540dc9943d755fd56b1e0 HTTP/1.0 +POST /api/2.5/tenders/ef61695c05174b37b2bb6a8da114cc9d/bids/9d482818789a45e88dfb8ad4c89bd4ef/qualification_documents?acc_token=d2a2184be75540dc9943d755fd56b1e0 HTTP/1.0 Authorization: Bearer broker Content-Length: 158 Content-Type: multipart/form-data; boundary=---BOUNDARY @@ -14,14 +14,14 @@ content Response: 201 Created Content-Type: application/json; charset=UTF-8 -Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/ef61695c05174b37b2bb6a8da114cc9d/bids/ce6fe53ed8074a8993c306b027fa9a53/qualification_documents/967be1d89cf846feae631c84ec4d0834 +Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/ef61695c05174b37b2bb6a8da114cc9d/bids/9d482818789a45e88dfb8ad4c89bd4ef/qualification_documents/967be1d89cf846feae631c84ec4d0834 { "data": { "hash": "md5:00000000000000000000000000000000", "confidentiality": "public", "language": "uk", "title": "qualification_document.pdf", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/ef61695c05174b37b2bb6a8da114cc9d/bids/ce6fe53ed8074a8993c306b027fa9a53/qualification_documents/967be1d89cf846feae631c84ec4d0834?download=72b7b1d29c754e0eb64489482ad92680", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/ef61695c05174b37b2bb6a8da114cc9d/bids/9d482818789a45e88dfb8ad4c89bd4ef/qualification_documents/967be1d89cf846feae631c84ec4d0834?download=72b7b1d29c754e0eb64489482ad92680", "format": "application/pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", diff --git a/docs/source/tendering/openeu/http/tutorial/upload-cancellation-doc.http b/docs/source/tendering/openeu/http/tutorial/upload-cancellation-doc.http index 5769fa29b4..b4663eaac8 100644 --- a/docs/source/tendering/openeu/http/tutorial/upload-cancellation-doc.http +++ b/docs/source/tendering/openeu/http/tutorial/upload-cancellation-doc.http @@ -1,4 +1,4 @@ -POST /api/2.5/tenders/ef61695c05174b37b2bb6a8da114cc9d/cancellations/97b552ab570842e5953352f7a3673061/documents?acc_token=5af527ef599c4cb0a283a7ba4c445288 HTTP/1.0 +POST /api/2.5/tenders/ef61695c05174b37b2bb6a8da114cc9d/cancellations/e6d0ca7cdd784832ad4d9b48a7f3b7d3/documents?acc_token=5af527ef599c4cb0a283a7ba4c445288 HTTP/1.0 Authorization: Bearer broker Content-Length: 142 Content-Type: multipart/form-data; boundary=---BOUNDARY @@ -14,7 +14,7 @@ content Response: 201 Created Content-Type: application/json; charset=UTF-8 -Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/ef61695c05174b37b2bb6a8da114cc9d/cancellations/97b552ab570842e5953352f7a3673061/documents/ac9e2b1c99c14e34bf70690cf7d83438 +Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/ef61695c05174b37b2bb6a8da114cc9d/cancellations/e6d0ca7cdd784832ad4d9b48a7f3b7d3/documents/ac9e2b1c99c14e34bf70690cf7d83438 { "data": { "hash": "md5:00000000000000000000000000000000", diff --git a/docs/source/tendering/openua/http/activate-bidder.http b/docs/source/tendering/openua/http/activate-bidder.http index bbf8b541d3..7b191f1474 100644 --- a/docs/source/tendering/openua/http/activate-bidder.http +++ b/docs/source/tendering/openua/http/activate-bidder.http @@ -1,4 +1,4 @@ -PATCH /api/2.5/tenders/7898ec9992af47ccbc9b8bf1b8539660/bids/9d3968fda7eb41c0a97e5273a1d682ab?acc_token=209d79fd54db4c518400dd7525b7be77 HTTP/1.0 +PATCH /api/2.5/tenders/7898ec9992af47ccbc9b8bf1b8539660/bids/e0b930e1240c4c8c8e0116fe380767f2?acc_token=209d79fd54db4c518400dd7525b7be77 HTTP/1.0 Authorization: Bearer broker Content-Length: 30 Content-Type: application/json @@ -15,8 +15,7 @@ Content-Type: application/json; charset=UTF-8 { "data": { "status": "active", - "selfEligible": true, - "id": "9d3968fda7eb41c0a97e5273a1d682ab", + "id": "e0b930e1240c4c8c8e0116fe380767f2", "value": { "currency": "UAH", "amount": 500.0, diff --git a/docs/source/tendering/openua/http/active-cancellation.http b/docs/source/tendering/openua/http/active-cancellation.http index 0e7a0fba17..65f0757afc 100644 --- a/docs/source/tendering/openua/http/active-cancellation.http +++ b/docs/source/tendering/openua/http/active-cancellation.http @@ -1,4 +1,4 @@ -GET /api/2.5/tenders/7898ec9992af47ccbc9b8bf1b8539660/cancellations/c7fb36d745c44f4ca4779bd0fee9fe03?acc_token=62607c36ce4a4d64961ecc0d0a21540e HTTP/1.0 +GET /api/2.5/tenders/7898ec9992af47ccbc9b8bf1b8539660/cancellations/aab29dadbafa4eadaeda723a20d44b49?acc_token=62607c36ce4a4d64961ecc0d0a21540e HTTP/1.0 Authorization: Bearer broker Host: lb-api-sandbox.prozorro.gov.ua @@ -39,7 +39,7 @@ Content-Type: application/json; charset=UTF-8 "reasonType": "forceMajeure", "date": "2020-05-26T01:00:02+03:00", "cancellationOf": "tender", - "id": "c7fb36d745c44f4ca4779bd0fee9fe03" + "id": "aab29dadbafa4eadaeda723a20d44b49" } } diff --git a/docs/source/tendering/openua/http/answer-question.http b/docs/source/tendering/openua/http/answer-question.http index 30f552937c..82faf438b2 100644 --- a/docs/source/tendering/openua/http/answer-question.http +++ b/docs/source/tendering/openua/http/answer-question.http @@ -1,4 +1,4 @@ -PATCH /api/2.5/tenders/7898ec9992af47ccbc9b8bf1b8539660/questions/65f9591952ca461c89bdf888ef0d7f44?acc_token=62607c36ce4a4d64961ecc0d0a21540e HTTP/1.0 +PATCH /api/2.5/tenders/7898ec9992af47ccbc9b8bf1b8539660/questions/a6b080b510574611a8899ecb99479271?acc_token=62607c36ce4a4d64961ecc0d0a21540e HTTP/1.0 Authorization: Bearer broker Content-Length: 162 Content-Type: application/json @@ -19,7 +19,7 @@ Content-Type: application/json; charset=UTF-8 "title": "Калорійність", "date": "2020-05-15T01:00:00+03:00", "answer": "Таблицю додано в файлі \"Kalorijnist.xslx\"", - "id": "65f9591952ca461c89bdf888ef0d7f44", + "id": "a6b080b510574611a8899ecb99479271", "questionOf": "tender" } } diff --git a/docs/source/tendering/openua/http/ask-question.http b/docs/source/tendering/openua/http/ask-question.http index ec4959fc54..6a081505c5 100644 --- a/docs/source/tendering/openua/http/ask-question.http +++ b/docs/source/tendering/openua/http/ask-question.http @@ -33,7 +33,7 @@ DATA: Response: 201 Created Content-Type: application/json; charset=UTF-8 -Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/7898ec9992af47ccbc9b8bf1b8539660/questions/65f9591952ca461c89bdf888ef0d7f44 +Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/7898ec9992af47ccbc9b8bf1b8539660/questions/a6b080b510574611a8899ecb99479271 { "data": { "description": "Просимо додати таблицю потрібної калорійності харчування", @@ -59,7 +59,7 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/7898ec9992af47cc }, "title": "Калорійність", "date": "2020-05-15T01:00:00+03:00", - "id": "65f9591952ca461c89bdf888ef0d7f44", + "id": "a6b080b510574611a8899ecb99479271", "questionOf": "tender" } } diff --git a/docs/source/tendering/openua/http/auction-url.http b/docs/source/tendering/openua/http/auction-url.http index 9a35d1cc59..53bc94fa38 100644 --- a/docs/source/tendering/openua/http/auction-url.http +++ b/docs/source/tendering/openua/http/auction-url.http @@ -15,8 +15,8 @@ Content-Type: application/json; charset=UTF-8 "auctionUrl": "http://auction-sandbox.prozorro.gov.ua/tenders/7898ec9992af47ccbc9b8bf1b8539660", "enquiryPeriod": { "startDate": "2020-04-29T01:00:00+03:00", - "clarificationsUntil": "2020-05-09T00:00:00+03:00", - "endDate": "2020-05-05T01:00:00+03:00", + "clarificationsUntil": "2020-05-08T00:00:00+03:00", + "endDate": "2020-05-05T00:00:00+03:00", "invalidationDate": "2020-05-15T01:00:00+03:00" }, "submissionMethod": "electronicAuction", @@ -49,7 +49,7 @@ Content-Type: application/json; charset=UTF-8 "title": "Калорійність", "date": "2020-05-15T01:00:00+03:00", "answer": "Таблицю додано в файлі \"Kalorijnist.xslx\"", - "id": "65f9591952ca461c89bdf888ef0d7f44", + "id": "a6b080b510574611a8899ecb99479271", "questionOf": "tender" } ], @@ -131,7 +131,7 @@ Content-Type: application/json; charset=UTF-8 }, "percentage": 54.45, "type": "financing", - "id": "4c193c7458cf4a5482c231727d0a8227" + "id": "bed04f3328294f82a17fcc8b9cf9e82c" } ], "minimalStep": { @@ -165,7 +165,7 @@ Content-Type: application/json; charset=UTF-8 "startDate": "2020-06-04T00:00:00+02:00", "endDate": "2020-07-04T00:00:00+02:00" }, - "id": "f3ba6b452c3b4fd19de53486e6486c87", + "id": "a6cf31518a5e48c7accc253ea93c582e", "quantity": 1.0 } ], diff --git a/docs/source/tendering/openua/http/bidder-activate-after-changing-tender.http b/docs/source/tendering/openua/http/bidder-activate-after-changing-tender.http index 522a2dcf45..37e2b39784 100644 --- a/docs/source/tendering/openua/http/bidder-activate-after-changing-tender.http +++ b/docs/source/tendering/openua/http/bidder-activate-after-changing-tender.http @@ -1,4 +1,4 @@ -PATCH /api/2.5/tenders/7898ec9992af47ccbc9b8bf1b8539660/bids/9d3968fda7eb41c0a97e5273a1d682ab?acc_token=209d79fd54db4c518400dd7525b7be77 HTTP/1.0 +PATCH /api/2.5/tenders/7898ec9992af47ccbc9b8bf1b8539660/bids/e0b930e1240c4c8c8e0116fe380767f2?acc_token=209d79fd54db4c518400dd7525b7be77 HTTP/1.0 Authorization: Bearer broker Content-Length: 30 Content-Type: application/json @@ -19,7 +19,7 @@ Content-Type: application/json; charset=UTF-8 { "hash": "md5:00000000000000000000000000000000", "title": "Proposal.pdf", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/7898ec9992af47ccbc9b8bf1b8539660/bids/9d3968fda7eb41c0a97e5273a1d682ab/documents/42ff9ef81bd34593b55504cebd975ffb?download=d26aaff06c9446618472802e7db9b75b", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/7898ec9992af47ccbc9b8bf1b8539660/bids/e0b930e1240c4c8c8e0116fe380767f2/documents/42ff9ef81bd34593b55504cebd975ffb?download=d26aaff06c9446618472802e7db9b75b", "format": "application/pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", @@ -27,8 +27,7 @@ Content-Type: application/json; charset=UTF-8 "dateModified": "2020-05-15T01:00:00+03:00" } ], - "selfEligible": true, - "id": "9d3968fda7eb41c0a97e5273a1d682ab", + "id": "e0b930e1240c4c8c8e0116fe380767f2", "value": { "currency": "UAH", "amount": 500.0, diff --git a/docs/source/tendering/openua/http/bidder-after-changing-tender.http b/docs/source/tendering/openua/http/bidder-after-changing-tender.http index cd196b014c..5d5bc721e6 100644 --- a/docs/source/tendering/openua/http/bidder-after-changing-tender.http +++ b/docs/source/tendering/openua/http/bidder-after-changing-tender.http @@ -1,4 +1,4 @@ -GET /api/2.5/tenders/7898ec9992af47ccbc9b8bf1b8539660/bids/9d3968fda7eb41c0a97e5273a1d682ab?acc_token=209d79fd54db4c518400dd7525b7be77 HTTP/1.0 +GET /api/2.5/tenders/7898ec9992af47ccbc9b8bf1b8539660/bids/e0b930e1240c4c8c8e0116fe380767f2?acc_token=209d79fd54db4c518400dd7525b7be77 HTTP/1.0 Authorization: Bearer broker Host: lb-api-sandbox.prozorro.gov.ua @@ -7,7 +7,7 @@ Content-Type: application/json; charset=UTF-8 { "data": { "status": "invalid", - "id": "9d3968fda7eb41c0a97e5273a1d682ab" + "id": "e0b930e1240c4c8c8e0116fe380767f2" } } diff --git a/docs/source/tendering/openua/http/bidder-documents.http b/docs/source/tendering/openua/http/bidder-documents.http index e35a8551c4..62aa6fc88f 100644 --- a/docs/source/tendering/openua/http/bidder-documents.http +++ b/docs/source/tendering/openua/http/bidder-documents.http @@ -1,4 +1,4 @@ -GET /api/2.5/tenders/7898ec9992af47ccbc9b8bf1b8539660/bids/9d3968fda7eb41c0a97e5273a1d682ab/documents?acc_token=209d79fd54db4c518400dd7525b7be77 HTTP/1.0 +GET /api/2.5/tenders/7898ec9992af47ccbc9b8bf1b8539660/bids/e0b930e1240c4c8c8e0116fe380767f2/documents?acc_token=209d79fd54db4c518400dd7525b7be77 HTTP/1.0 Authorization: Bearer broker Host: lb-api-sandbox.prozorro.gov.ua @@ -9,7 +9,7 @@ Content-Type: application/json; charset=UTF-8 { "hash": "md5:00000000000000000000000000000000", "title": "Proposal.pdf", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/7898ec9992af47ccbc9b8bf1b8539660/bids/9d3968fda7eb41c0a97e5273a1d682ab/documents/42ff9ef81bd34593b55504cebd975ffb?download=d26aaff06c9446618472802e7db9b75b", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/7898ec9992af47ccbc9b8bf1b8539660/bids/e0b930e1240c4c8c8e0116fe380767f2/documents/42ff9ef81bd34593b55504cebd975ffb?download=d26aaff06c9446618472802e7db9b75b", "format": "application/pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", diff --git a/docs/source/tendering/openua/http/bidder-participation-url.http b/docs/source/tendering/openua/http/bidder-participation-url.http index da9ed31c2e..6c0f5c852c 100644 --- a/docs/source/tendering/openua/http/bidder-participation-url.http +++ b/docs/source/tendering/openua/http/bidder-participation-url.http @@ -1,4 +1,4 @@ -GET /api/2.5/tenders/7898ec9992af47ccbc9b8bf1b8539660/bids/9d3968fda7eb41c0a97e5273a1d682ab?acc_token=209d79fd54db4c518400dd7525b7be77 HTTP/1.0 +GET /api/2.5/tenders/7898ec9992af47ccbc9b8bf1b8539660/bids/e0b930e1240c4c8c8e0116fe380767f2?acc_token=209d79fd54db4c518400dd7525b7be77 HTTP/1.0 Authorization: Bearer broker Host: lb-api-sandbox.prozorro.gov.ua @@ -11,7 +11,7 @@ Content-Type: application/json; charset=UTF-8 { "hash": "md5:00000000000000000000000000000000", "title": "Proposal.pdf", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/7898ec9992af47ccbc9b8bf1b8539660/bids/9d3968fda7eb41c0a97e5273a1d682ab/documents/42ff9ef81bd34593b55504cebd975ffb?download=d26aaff06c9446618472802e7db9b75b", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/7898ec9992af47ccbc9b8bf1b8539660/bids/e0b930e1240c4c8c8e0116fe380767f2/documents/42ff9ef81bd34593b55504cebd975ffb?download=d26aaff06c9446618472802e7db9b75b", "format": "application/pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", @@ -19,8 +19,7 @@ Content-Type: application/json; charset=UTF-8 "dateModified": "2020-05-15T01:00:00+03:00" } ], - "selfEligible": true, - "id": "9d3968fda7eb41c0a97e5273a1d682ab", + "id": "e0b930e1240c4c8c8e0116fe380767f2", "value": { "currency": "UAH", "amount": 500.0, @@ -52,7 +51,7 @@ Content-Type: application/json; charset=UTF-8 ], "date": "2020-05-15T01:00:00+03:00", "selfQualified": true, - "participationUrl": "http://auction-sandbox.prozorro.gov.ua/tenders/7898ec9992af47ccbc9b8bf1b8539660?key_for_bid=9d3968fda7eb41c0a97e5273a1d682ab" + "participationUrl": "http://auction-sandbox.prozorro.gov.ua/tenders/7898ec9992af47ccbc9b8bf1b8539660?key_for_bid=e0b930e1240c4c8c8e0116fe380767f2" } } diff --git a/docs/source/tendering/openua/http/bidder2-participation-url.http b/docs/source/tendering/openua/http/bidder2-participation-url.http index f78eab53c7..b430a7ef9c 100644 --- a/docs/source/tendering/openua/http/bidder2-participation-url.http +++ b/docs/source/tendering/openua/http/bidder2-participation-url.http @@ -1,4 +1,4 @@ -GET /api/2.5/tenders/7898ec9992af47ccbc9b8bf1b8539660/bids/74cd11740bab485cac5b0bb55ab266f6?acc_token=3bfe36dbfc044463bcb4611c9bf51d4e HTTP/1.0 +GET /api/2.5/tenders/7898ec9992af47ccbc9b8bf1b8539660/bids/4860c2536bba45df8f3376f0f7e63869?acc_token=3bfe36dbfc044463bcb4611c9bf51d4e HTTP/1.0 Authorization: Bearer broker Host: lb-api-sandbox.prozorro.gov.ua @@ -7,13 +7,12 @@ Content-Type: application/json; charset=UTF-8 { "data": { "status": "active", - "selfEligible": true, "value": { "currency": "UAH", "amount": 499.0, "valueAddedTaxIncluded": true }, - "id": "74cd11740bab485cac5b0bb55ab266f6", + "selfQualified": true, "tenderers": [ { "contactPoint": { @@ -38,8 +37,8 @@ Content-Type: application/json; charset=UTF-8 } ], "date": "2020-05-15T01:00:00+03:00", - "selfQualified": true, - "participationUrl": "http://auction-sandbox.prozorro.gov.ua/tenders/7898ec9992af47ccbc9b8bf1b8539660?key_for_bid=74cd11740bab485cac5b0bb55ab266f6" + "id": "4860c2536bba45df8f3376f0f7e63869", + "participationUrl": "http://auction-sandbox.prozorro.gov.ua/tenders/7898ec9992af47ccbc9b8bf1b8539660?key_for_bid=4860c2536bba45df8f3376f0f7e63869" } } diff --git a/docs/source/tendering/openua/http/blank-tender-view.http b/docs/source/tendering/openua/http/blank-tender-view.http index 224d83add0..82ecd3a265 100644 --- a/docs/source/tendering/openua/http/blank-tender-view.http +++ b/docs/source/tendering/openua/http/blank-tender-view.http @@ -78,7 +78,7 @@ Content-Type: application/json; charset=UTF-8 }, "percentage": 54.45, "type": "financing", - "id": "4c193c7458cf4a5482c231727d0a8227" + "id": "bed04f3328294f82a17fcc8b9cf9e82c" } ], "minimalStep": { @@ -112,7 +112,7 @@ Content-Type: application/json; charset=UTF-8 "startDate": "2020-06-04T00:00:00+02:00", "endDate": "2020-07-04T00:00:00+02:00" }, - "id": "f3ba6b452c3b4fd19de53486e6486c87", + "id": "a6cf31518a5e48c7accc253ea93c582e", "quantity": 1.0 } ], diff --git a/docs/source/tendering/openua/http/confirm-qualification.http b/docs/source/tendering/openua/http/confirm-qualification.http index 22584e4c7c..1dd64c2232 100644 --- a/docs/source/tendering/openua/http/confirm-qualification.http +++ b/docs/source/tendering/openua/http/confirm-qualification.http @@ -54,7 +54,7 @@ Content-Type: application/json; charset=UTF-8 "startDate": "2020-05-15T01:00:00+03:00", "endDate": "2020-05-26T00:00:00+03:00" }, - "bid_id": "9d3968fda7eb41c0a97e5273a1d682ab", + "bid_id": "e0b930e1240c4c8c8e0116fe380767f2", "value": { "currency": "UAH", "amount": 250.0, diff --git a/docs/source/tendering/openua/http/get-answer.http b/docs/source/tendering/openua/http/get-answer.http index a0d3fa85d4..1fc33a4cee 100644 --- a/docs/source/tendering/openua/http/get-answer.http +++ b/docs/source/tendering/openua/http/get-answer.http @@ -1,4 +1,4 @@ -GET /api/2.5/tenders/7898ec9992af47ccbc9b8bf1b8539660/questions/65f9591952ca461c89bdf888ef0d7f44 HTTP/1.0 +GET /api/2.5/tenders/7898ec9992af47ccbc9b8bf1b8539660/questions/a6b080b510574611a8899ecb99479271 HTTP/1.0 Authorization: Bearer broker Host: lb-api-sandbox.prozorro.gov.ua @@ -11,7 +11,7 @@ Content-Type: application/json; charset=UTF-8 "title": "Калорійність", "date": "2020-05-15T01:00:00+03:00", "answer": "Таблицю додано в файлі \"Kalorijnist.xslx\"", - "id": "65f9591952ca461c89bdf888ef0d7f44", + "id": "a6b080b510574611a8899ecb99479271", "questionOf": "tender" } } diff --git a/docs/source/tendering/openua/http/get-awards-list.http b/docs/source/tendering/openua/http/get-awards-list.http index 1142b416c7..c8ea35c146 100644 --- a/docs/source/tendering/openua/http/get-awards-list.http +++ b/docs/source/tendering/openua/http/get-awards-list.http @@ -41,7 +41,7 @@ Content-Type: application/json; charset=UTF-8 } } ], - "bid_id": "9d3968fda7eb41c0a97e5273a1d682ab", + "bid_id": "e0b930e1240c4c8c8e0116fe380767f2", "value": { "currency": "UAH", "amount": 250.0, diff --git a/docs/source/tendering/openua/http/list-question.http b/docs/source/tendering/openua/http/list-question.http index 1f9df97e72..13c5a92ec8 100644 --- a/docs/source/tendering/openua/http/list-question.http +++ b/docs/source/tendering/openua/http/list-question.http @@ -12,7 +12,7 @@ Content-Type: application/json; charset=UTF-8 "title": "Калорійність", "date": "2020-05-15T01:00:00+03:00", "answer": "Таблицю додано в файлі \"Kalorijnist.xslx\"", - "id": "65f9591952ca461c89bdf888ef0d7f44", + "id": "a6b080b510574611a8899ecb99479271", "questionOf": "tender" } ] diff --git a/docs/source/tendering/openua/http/patch-cancellation.http b/docs/source/tendering/openua/http/patch-cancellation.http index 05e1f95e17..c7d4a6c2cd 100644 --- a/docs/source/tendering/openua/http/patch-cancellation.http +++ b/docs/source/tendering/openua/http/patch-cancellation.http @@ -1,4 +1,4 @@ -PATCH /api/2.5/tenders/7898ec9992af47ccbc9b8bf1b8539660/cancellations/c7fb36d745c44f4ca4779bd0fee9fe03/documents/2feef28b6ec545889fa03c078fe66c16?acc_token=62607c36ce4a4d64961ecc0d0a21540e HTTP/1.0 +PATCH /api/2.5/tenders/7898ec9992af47ccbc9b8bf1b8539660/cancellations/aab29dadbafa4eadaeda723a20d44b49/documents/2feef28b6ec545889fa03c078fe66c16?acc_token=62607c36ce4a4d64961ecc0d0a21540e HTTP/1.0 Authorization: Bearer broker Content-Length: 48 Content-Type: application/json diff --git a/docs/source/tendering/openua/http/patch-items-value-periods.http b/docs/source/tendering/openua/http/patch-items-value-periods.http index 4cd10deb6c..d8d8b3ad63 100644 --- a/docs/source/tendering/openua/http/patch-items-value-periods.http +++ b/docs/source/tendering/openua/http/patch-items-value-periods.http @@ -7,7 +7,7 @@ DATA: { "data": { "tenderPeriod": { - "endDate": "2020-05-30T01:00:10+03:00" + "endDate": "2020-05-31T01:00:00+03:00" } } } @@ -20,16 +20,16 @@ Content-Type: application/json; charset=UTF-8 "mainProcurementCategory": "services", "complaintPeriod": { "startDate": "2020-05-15T01:00:00+03:00", - "endDate": "2020-05-26T00:00:00+03:00" + "endDate": "2020-05-27T00:00:00+03:00" }, "enquiryPeriod": { "startDate": "2020-05-15T01:00:00+03:00", "clarificationsUntil": "2020-05-26T00:00:00+03:00", - "endDate": "2020-05-20T01:00:10+03:00", + "endDate": "2020-05-21T00:00:00+03:00", "invalidationDate": "2020-05-15T01:00:00+03:00" }, "submissionMethod": "electronicAuction", - "next_check": "2020-05-30T01:00:10+03:00", + "next_check": "2020-05-31T01:00:00+03:00", "procuringEntity": { "contactPoint": { "url": "http://sch10.edu.vn.ua/", @@ -59,10 +59,10 @@ Content-Type: application/json; charset=UTF-8 "status": "active.tendering", "tenderPeriod": { "startDate": "2020-05-15T01:00:00+03:00", - "endDate": "2020-05-30T01:00:10+03:00" + "endDate": "2020-05-31T01:00:00+03:00" }, "auctionPeriod": { - "shouldStartAfter": "2020-05-31T00:00:00+03:00" + "shouldStartAfter": "2020-06-01T00:00:00+03:00" }, "procurementMethodType": "aboveThresholdUA", "date": "2020-05-15T01:00:00+03:00", @@ -89,7 +89,7 @@ Content-Type: application/json; charset=UTF-8 }, "percentage": 54.45, "type": "financing", - "id": "4c193c7458cf4a5482c231727d0a8227" + "id": "bed04f3328294f82a17fcc8b9cf9e82c" } ], "minimalStep": { @@ -123,7 +123,7 @@ Content-Type: application/json; charset=UTF-8 "startDate": "2020-06-04T00:00:00+02:00", "endDate": "2020-07-04T00:00:00+02:00" }, - "id": "f3ba6b452c3b4fd19de53486e6486c87", + "id": "a6cf31518a5e48c7accc253ea93c582e", "quantity": 1.0 } ], diff --git a/docs/source/tendering/openua/http/pending-cancellation.http b/docs/source/tendering/openua/http/pending-cancellation.http index 0a694d2f8b..e857022802 100644 --- a/docs/source/tendering/openua/http/pending-cancellation.http +++ b/docs/source/tendering/openua/http/pending-cancellation.http @@ -1,4 +1,4 @@ -PATCH /api/2.5/tenders/7898ec9992af47ccbc9b8bf1b8539660/cancellations/c7fb36d745c44f4ca4779bd0fee9fe03?acc_token=62607c36ce4a4d64961ecc0d0a21540e HTTP/1.0 +PATCH /api/2.5/tenders/7898ec9992af47ccbc9b8bf1b8539660/cancellations/aab29dadbafa4eadaeda723a20d44b49?acc_token=62607c36ce4a4d64961ecc0d0a21540e HTTP/1.0 Authorization: Bearer broker Content-Length: 31 Content-Type: application/json @@ -47,7 +47,7 @@ Content-Type: application/json; charset=UTF-8 "reasonType": "forceMajeure", "date": "2020-05-15T01:00:01+03:00", "cancellationOf": "tender", - "id": "c7fb36d745c44f4ca4779bd0fee9fe03" + "id": "aab29dadbafa4eadaeda723a20d44b49" } } diff --git a/docs/source/tendering/openua/http/post-evidence-document.http b/docs/source/tendering/openua/http/post-evidence-document.http index ee1c961130..455b51f0fd 100644 --- a/docs/source/tendering/openua/http/post-evidence-document.http +++ b/docs/source/tendering/openua/http/post-evidence-document.http @@ -1,4 +1,4 @@ -POST /api/2.5/tenders/7898ec9992af47ccbc9b8bf1b8539660/bids/9d3968fda7eb41c0a97e5273a1d682ab/documents?acc_token=209d79fd54db4c518400dd7525b7be77 HTTP/1.0 +POST /api/2.5/tenders/7898ec9992af47ccbc9b8bf1b8539660/bids/e0b930e1240c4c8c8e0116fe380767f2/documents?acc_token=209d79fd54db4c518400dd7525b7be77 HTTP/1.0 Authorization: Bearer broker Content-Length: 360 Content-Type: application/json @@ -16,7 +16,7 @@ DATA: Response: 201 Created Content-Type: application/json; charset=UTF-8 -Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/7898ec9992af47ccbc9b8bf1b8539660/bids/9d3968fda7eb41c0a97e5273a1d682ab/documents/307e274695ab4ae787ae6125f08956dc +Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/7898ec9992af47ccbc9b8bf1b8539660/bids/e0b930e1240c4c8c8e0116fe380767f2/documents/dbabb976fd0f4592b76f90ee9ec281a3 { "data": { "hash": "md5:00000000000000000000000000000000", @@ -26,7 +26,7 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/7898ec9992af47cc "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", "documentType": "evidence", - "id": "307e274695ab4ae787ae6125f08956dc", + "id": "dbabb976fd0f4592b76f90ee9ec281a3", "dateModified": "2020-05-15T01:00:00+03:00" } } diff --git a/docs/source/tendering/openua/http/prepare-cancellation.http b/docs/source/tendering/openua/http/prepare-cancellation.http index 53f0c66206..00e5b0c2ba 100644 --- a/docs/source/tendering/openua/http/prepare-cancellation.http +++ b/docs/source/tendering/openua/http/prepare-cancellation.http @@ -13,7 +13,7 @@ DATA: Response: 201 Created Content-Type: application/json; charset=UTF-8 -Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/7898ec9992af47ccbc9b8bf1b8539660/cancellations/c7fb36d745c44f4ca4779bd0fee9fe03 +Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/7898ec9992af47ccbc9b8bf1b8539660/cancellations/aab29dadbafa4eadaeda723a20d44b49 { "data": { "status": "draft", @@ -21,7 +21,7 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/7898ec9992af47cc "reasonType": "unFixable", "date": "2020-05-15T01:00:01+03:00", "cancellationOf": "tender", - "id": "c7fb36d745c44f4ca4779bd0fee9fe03" + "id": "aab29dadbafa4eadaeda723a20d44b49" } } diff --git a/docs/source/tendering/openua/http/register-2nd-bidder.http b/docs/source/tendering/openua/http/register-2nd-bidder.http index d94ea5cf92..abf5d2f30d 100644 --- a/docs/source/tendering/openua/http/register-2nd-bidder.http +++ b/docs/source/tendering/openua/http/register-2nd-bidder.http @@ -1,12 +1,11 @@ POST /api/2.5/tenders/7898ec9992af47ccbc9b8bf1b8539660/bids HTTP/1.0 Authorization: Bearer broker -Content-Length: 824 +Content-Length: 802 Content-Type: application/json Host: lb-api-sandbox.prozorro.gov.ua DATA: { "data": { - "selfEligible": true, "selfQualified": true, "value": { "amount": 499 @@ -39,7 +38,7 @@ DATA: Response: 201 Created Content-Type: application/json; charset=UTF-8 -Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/7898ec9992af47ccbc9b8bf1b8539660/bids/74cd11740bab485cac5b0bb55ab266f6 +Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/7898ec9992af47ccbc9b8bf1b8539660/bids/4860c2536bba45df8f3376f0f7e63869 { "access": { "transfer": "7833f5ce12584933b4f5be14567aa303", @@ -47,13 +46,12 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/7898ec9992af47cc }, "data": { "status": "active", - "selfEligible": true, "value": { "currency": "UAH", "amount": 499.0, "valueAddedTaxIncluded": true }, - "selfQualified": true, + "id": "4860c2536bba45df8f3376f0f7e63869", "tenderers": [ { "contactPoint": { @@ -78,7 +76,7 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/7898ec9992af47cc } ], "date": "2020-05-15T01:00:00+03:00", - "id": "74cd11740bab485cac5b0bb55ab266f6" + "selfQualified": true } } diff --git a/docs/source/tendering/openua/http/register-bidder.http b/docs/source/tendering/openua/http/register-bidder.http index 1ac2dc6e28..ac82ac61b4 100644 --- a/docs/source/tendering/openua/http/register-bidder.http +++ b/docs/source/tendering/openua/http/register-bidder.http @@ -1,17 +1,12 @@ POST /api/2.5/tenders/7898ec9992af47ccbc9b8bf1b8539660/bids HTTP/1.0 Authorization: Bearer broker -Content-Length: 1001 +Content-Length: 979 Content-Type: application/json Host: lb-api-sandbox.prozorro.gov.ua DATA: { "data": { "status": "draft", - "selfEligible": true, - "value": { - "amount": 500 - }, - "subcontractingDetails": "ДКП «Орфей», Україна", "tenderers": [ { "contactPoint": { @@ -35,13 +30,17 @@ DATA: } } ], - "selfQualified": true + "selfQualified": true, + "value": { + "amount": 500 + }, + "subcontractingDetails": "ДКП «Орфей», Україна" } } Response: 201 Created Content-Type: application/json; charset=UTF-8 -Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/7898ec9992af47ccbc9b8bf1b8539660/bids/9d3968fda7eb41c0a97e5273a1d682ab +Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/7898ec9992af47ccbc9b8bf1b8539660/bids/e0b930e1240c4c8c8e0116fe380767f2 { "access": { "transfer": "cc966f284bd94f9f8cf9d333d3f742c0", @@ -49,8 +48,7 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/7898ec9992af47cc }, "data": { "status": "draft", - "selfEligible": true, - "id": "9d3968fda7eb41c0a97e5273a1d682ab", + "id": "e0b930e1240c4c8c8e0116fe380767f2", "value": { "currency": "UAH", "amount": 500.0, diff --git a/docs/source/tendering/openua/http/set-bid-guarantee.http b/docs/source/tendering/openua/http/set-bid-guarantee.http index f78e2a4b82..fa4f1f978e 100644 --- a/docs/source/tendering/openua/http/set-bid-guarantee.http +++ b/docs/source/tendering/openua/http/set-bid-guarantee.http @@ -21,16 +21,16 @@ Content-Type: application/json; charset=UTF-8 "mainProcurementCategory": "services", "complaintPeriod": { "startDate": "2020-05-15T01:00:00+03:00", - "endDate": "2020-05-26T00:00:00+03:00" + "endDate": "2020-05-27T00:00:00+03:00" }, "enquiryPeriod": { "startDate": "2020-05-15T01:00:00+03:00", "clarificationsUntil": "2020-05-26T00:00:00+03:00", - "endDate": "2020-05-20T01:00:10+03:00", + "endDate": "2020-05-21T00:00:00+03:00", "invalidationDate": "2020-05-15T01:00:00+03:00" }, "submissionMethod": "electronicAuction", - "next_check": "2020-05-30T01:00:10+03:00", + "next_check": "2020-05-31T01:00:00+03:00", "procuringEntity": { "contactPoint": { "url": "http://sch10.edu.vn.ua/", @@ -64,10 +64,10 @@ Content-Type: application/json; charset=UTF-8 "status": "active.tendering", "tenderPeriod": { "startDate": "2020-05-15T01:00:00+03:00", - "endDate": "2020-05-30T01:00:10+03:00" + "endDate": "2020-05-31T01:00:00+03:00" }, "auctionPeriod": { - "shouldStartAfter": "2020-05-31T00:00:00+03:00" + "shouldStartAfter": "2020-06-01T00:00:00+03:00" }, "procurementMethodType": "aboveThresholdUA", "date": "2020-05-15T01:00:00+03:00", @@ -94,7 +94,7 @@ Content-Type: application/json; charset=UTF-8 }, "percentage": 54.45, "type": "financing", - "id": "4c193c7458cf4a5482c231727d0a8227" + "id": "bed04f3328294f82a17fcc8b9cf9e82c" } ], "minimalStep": { @@ -128,7 +128,7 @@ Content-Type: application/json; charset=UTF-8 "startDate": "2020-06-04T00:00:00+02:00", "endDate": "2020-07-04T00:00:00+02:00" }, - "id": "f3ba6b452c3b4fd19de53486e6486c87", + "id": "a6cf31518a5e48c7accc253ea93c582e", "quantity": 1.0 } ], diff --git a/docs/source/tendering/openua/http/tender-contract-get.http b/docs/source/tendering/openua/http/tender-contract-get.http index 58c065482b..3aed225ee3 100644 --- a/docs/source/tendering/openua/http/tender-contract-get.http +++ b/docs/source/tendering/openua/http/tender-contract-get.http @@ -45,7 +45,7 @@ Content-Type: application/json; charset=UTF-8 "startDate": "2020-06-04T00:00:00+02:00", "endDate": "2020-07-04T00:00:00+02:00" }, - "id": "f3ba6b452c3b4fd19de53486e6486c87", + "id": "a6cf31518a5e48c7accc253ea93c582e", "quantity": 1.0 } ], diff --git a/docs/source/tendering/openua/http/tender-contract-period.http b/docs/source/tendering/openua/http/tender-contract-period.http index f8a8bfb50c..940b395f47 100644 --- a/docs/source/tendering/openua/http/tender-contract-period.http +++ b/docs/source/tendering/openua/http/tender-contract-period.http @@ -44,7 +44,7 @@ Content-Type: application/json; charset=UTF-8 "startDate": "2020-06-04T00:00:00+02:00", "endDate": "2020-07-04T00:00:00+02:00" }, - "id": "f3ba6b452c3b4fd19de53486e6486c87", + "id": "a6cf31518a5e48c7accc253ea93c582e", "quantity": 1.0 } ], diff --git a/docs/source/tendering/openua/http/tender-contract-set-contract-value.http b/docs/source/tendering/openua/http/tender-contract-set-contract-value.http index 335cd4dcb7..e3be9c8ac7 100644 --- a/docs/source/tendering/openua/http/tender-contract-set-contract-value.http +++ b/docs/source/tendering/openua/http/tender-contract-set-contract-value.http @@ -44,7 +44,7 @@ Content-Type: application/json; charset=UTF-8 "startDate": "2020-06-04T00:00:00+02:00", "endDate": "2020-07-04T00:00:00+02:00" }, - "id": "f3ba6b452c3b4fd19de53486e6486c87", + "id": "a6cf31518a5e48c7accc253ea93c582e", "quantity": 1.0 } ], diff --git a/docs/source/tendering/openua/http/tender-contract-sign-date.http b/docs/source/tendering/openua/http/tender-contract-sign-date.http index 6a5f44aa95..c24923f4f2 100644 --- a/docs/source/tendering/openua/http/tender-contract-sign-date.http +++ b/docs/source/tendering/openua/http/tender-contract-sign-date.http @@ -41,7 +41,7 @@ Content-Type: application/json; charset=UTF-8 "startDate": "2020-06-04T00:00:00+02:00", "endDate": "2020-07-04T00:00:00+02:00" }, - "id": "f3ba6b452c3b4fd19de53486e6486c87", + "id": "a6cf31518a5e48c7accc253ea93c582e", "quantity": 1.0 } ], diff --git a/docs/source/tendering/openua/http/tender-post-attempt-json-data.http b/docs/source/tendering/openua/http/tender-post-attempt-json-data.http index 1964b75c54..f89595c2ea 100644 --- a/docs/source/tendering/openua/http/tender-post-attempt-json-data.http +++ b/docs/source/tendering/openua/http/tender-post-attempt-json-data.http @@ -179,7 +179,7 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/437cd309c59b42df }, "percentage": 54.45, "type": "financing", - "id": "822886ff12054577aea1e29a70697f95" + "id": "35210e486e4d48da85a64f0af0686123" } ], "minimalStep": { @@ -213,7 +213,7 @@ Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/437cd309c59b42df "startDate": "2020-06-04T00:00:00+02:00", "endDate": "2020-07-04T00:00:00+02:00" }, - "id": "3d69b844d45c4c54bb368305b995d57d", + "id": "2036d5a88fb04ac29cb0dc1d6a7fdf0f", "quantity": 1.0 } ], diff --git a/docs/source/tendering/openua/http/update-cancellation-doc.http b/docs/source/tendering/openua/http/update-cancellation-doc.http index f318448579..d341351873 100644 --- a/docs/source/tendering/openua/http/update-cancellation-doc.http +++ b/docs/source/tendering/openua/http/update-cancellation-doc.http @@ -1,4 +1,4 @@ -PUT /api/2.5/tenders/7898ec9992af47ccbc9b8bf1b8539660/cancellations/c7fb36d745c44f4ca4779bd0fee9fe03/documents/2feef28b6ec545889fa03c078fe66c16?acc_token=62607c36ce4a4d64961ecc0d0a21540e HTTP/1.0 +PUT /api/2.5/tenders/7898ec9992af47ccbc9b8bf1b8539660/cancellations/aab29dadbafa4eadaeda723a20d44b49/documents/2feef28b6ec545889fa03c078fe66c16?acc_token=62607c36ce4a4d64961ecc0d0a21540e HTTP/1.0 Authorization: Bearer broker Content-Length: 145 Content-Type: multipart/form-data; boundary=---BOUNDARY diff --git a/docs/source/tendering/openua/http/update-cancellation-reasonType.http b/docs/source/tendering/openua/http/update-cancellation-reasonType.http index 4db0098786..6fe40e762a 100644 --- a/docs/source/tendering/openua/http/update-cancellation-reasonType.http +++ b/docs/source/tendering/openua/http/update-cancellation-reasonType.http @@ -1,4 +1,4 @@ -PATCH /api/2.5/tenders/7898ec9992af47ccbc9b8bf1b8539660/cancellations/c7fb36d745c44f4ca4779bd0fee9fe03?acc_token=62607c36ce4a4d64961ecc0d0a21540e HTTP/1.0 +PATCH /api/2.5/tenders/7898ec9992af47ccbc9b8bf1b8539660/cancellations/aab29dadbafa4eadaeda723a20d44b49?acc_token=62607c36ce4a4d64961ecc0d0a21540e HTTP/1.0 Authorization: Bearer broker Content-Length: 40 Content-Type: application/json @@ -19,7 +19,7 @@ Content-Type: application/json; charset=UTF-8 "reasonType": "forceMajeure", "date": "2020-05-15T01:00:01+03:00", "cancellationOf": "tender", - "id": "c7fb36d745c44f4ca4779bd0fee9fe03" + "id": "aab29dadbafa4eadaeda723a20d44b49" } } diff --git a/docs/source/tendering/openua/http/update-tender-after-enqiery-with-update-periods.http b/docs/source/tendering/openua/http/update-tender-after-enqiery-with-update-periods.http index c5351b054e..591a3897ce 100644 --- a/docs/source/tendering/openua/http/update-tender-after-enqiery-with-update-periods.http +++ b/docs/source/tendering/openua/http/update-tender-after-enqiery-with-update-periods.http @@ -28,8 +28,8 @@ Content-Type: application/json; charset=UTF-8 }, "enquiryPeriod": { "startDate": "2020-04-30T01:00:00+03:00", - "clarificationsUntil": "2020-05-19T00:00:00+03:00", - "endDate": "2020-05-13T01:00:00+03:00", + "clarificationsUntil": "2020-05-16T00:00:00+03:00", + "endDate": "2020-05-13T00:00:00+03:00", "invalidationDate": "2020-05-15T01:00:00+03:00" }, "submissionMethod": "electronicAuction", @@ -62,7 +62,7 @@ Content-Type: application/json; charset=UTF-8 "title": "Калорійність", "date": "2020-05-15T01:00:00+03:00", "answer": "Таблицю додано в файлі \"Kalorijnist.xslx\"", - "id": "65f9591952ca461c89bdf888ef0d7f44", + "id": "a6b080b510574611a8899ecb99479271", "questionOf": "tender" } ], @@ -144,7 +144,7 @@ Content-Type: application/json; charset=UTF-8 }, "percentage": 54.45, "type": "financing", - "id": "4c193c7458cf4a5482c231727d0a8227" + "id": "bed04f3328294f82a17fcc8b9cf9e82c" } ], "minimalStep": { @@ -178,7 +178,7 @@ Content-Type: application/json; charset=UTF-8 "startDate": "2020-06-04T00:00:00+02:00", "endDate": "2020-07-04T00:00:00+02:00" }, - "id": "f3ba6b452c3b4fd19de53486e6486c87", + "id": "a6cf31518a5e48c7accc253ea93c582e", "quantity": 1.0 } ], diff --git a/docs/source/tendering/openua/http/upload-bid-proposal.http b/docs/source/tendering/openua/http/upload-bid-proposal.http index 497c781f71..8627d5f03b 100644 --- a/docs/source/tendering/openua/http/upload-bid-proposal.http +++ b/docs/source/tendering/openua/http/upload-bid-proposal.http @@ -1,4 +1,4 @@ -POST /api/2.5/tenders/7898ec9992af47ccbc9b8bf1b8539660/bids/9d3968fda7eb41c0a97e5273a1d682ab/documents?acc_token=209d79fd54db4c518400dd7525b7be77 HTTP/1.0 +POST /api/2.5/tenders/7898ec9992af47ccbc9b8bf1b8539660/bids/e0b930e1240c4c8c8e0116fe380767f2/documents?acc_token=209d79fd54db4c518400dd7525b7be77 HTTP/1.0 Authorization: Bearer broker Content-Length: 144 Content-Type: multipart/form-data; boundary=---BOUNDARY @@ -14,12 +14,12 @@ content Response: 201 Created Content-Type: application/json; charset=UTF-8 -Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/7898ec9992af47ccbc9b8bf1b8539660/bids/9d3968fda7eb41c0a97e5273a1d682ab/documents/42ff9ef81bd34593b55504cebd975ffb +Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/7898ec9992af47ccbc9b8bf1b8539660/bids/e0b930e1240c4c8c8e0116fe380767f2/documents/42ff9ef81bd34593b55504cebd975ffb { "data": { "hash": "md5:00000000000000000000000000000000", "title": "Proposal.pdf", - "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/7898ec9992af47ccbc9b8bf1b8539660/bids/9d3968fda7eb41c0a97e5273a1d682ab/documents/42ff9ef81bd34593b55504cebd975ffb?download=d26aaff06c9446618472802e7db9b75b", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/7898ec9992af47ccbc9b8bf1b8539660/bids/e0b930e1240c4c8c8e0116fe380767f2/documents/42ff9ef81bd34593b55504cebd975ffb?download=d26aaff06c9446618472802e7db9b75b", "format": "application/pdf", "documentOf": "tender", "datePublished": "2020-05-15T01:00:00+03:00", diff --git a/docs/source/tendering/openua/http/upload-cancellation-doc.http b/docs/source/tendering/openua/http/upload-cancellation-doc.http index 3847d3987f..e479dbd60f 100644 --- a/docs/source/tendering/openua/http/upload-cancellation-doc.http +++ b/docs/source/tendering/openua/http/upload-cancellation-doc.http @@ -1,4 +1,4 @@ -POST /api/2.5/tenders/7898ec9992af47ccbc9b8bf1b8539660/cancellations/c7fb36d745c44f4ca4779bd0fee9fe03/documents?acc_token=62607c36ce4a4d64961ecc0d0a21540e HTTP/1.0 +POST /api/2.5/tenders/7898ec9992af47ccbc9b8bf1b8539660/cancellations/aab29dadbafa4eadaeda723a20d44b49/documents?acc_token=62607c36ce4a4d64961ecc0d0a21540e HTTP/1.0 Authorization: Bearer broker Content-Length: 142 Content-Type: multipart/form-data; boundary=---BOUNDARY @@ -14,7 +14,7 @@ content Response: 201 Created Content-Type: application/json; charset=UTF-8 -Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/7898ec9992af47ccbc9b8bf1b8539660/cancellations/c7fb36d745c44f4ca4779bd0fee9fe03/documents/2feef28b6ec545889fa03c078fe66c16 +Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/7898ec9992af47ccbc9b8bf1b8539660/cancellations/aab29dadbafa4eadaeda723a20d44b49/documents/2feef28b6ec545889fa03c078fe66c16 { "data": { "hash": "md5:00000000000000000000000000000000", diff --git a/docs/source/tendering/pricequotation/http/activate-bidder.http b/docs/source/tendering/pricequotation/http/activate-bidder.http new file mode 100644 index 0000000000..14cd4dbac7 --- /dev/null +++ b/docs/source/tendering/pricequotation/http/activate-bidder.http @@ -0,0 +1,114 @@ +PATCH /api/2.5/tenders/db4fb6143a5f45b6953e8f010ed8064e/bids/8cfbfea1a5d6465292985704865c464d?acc_token=00e173e5f31f4decbb811cc01e10c1bf HTTP/1.0 +Authorization: Bearer broker +Content-Length: 30 +Content-Type: application/json +Host: lb-api-sandbox.prozorro.gov.ua +DATA: +{ + "data": { + "status": "active" + } +} + +Response: 200 OK +Content-Type: application/json; charset=UTF-8 +{ + "data": { + "status": "active", + "value": { + "currency": "UAH", + "amount": 459.0, + "valueAddedTaxIncluded": true + }, + "requirementResponses": [ + { + "requirement": { + "id": "655360-0001-001-01" + }, + "id": "0274c6a64a19467294e660c9ee6601f7", + "value": "23.8" + }, + { + "requirement": { + "id": "655360-0002-001-01" + }, + "id": "854103aaa1c6469daf6e79ebb09e8537", + "value": "1920x1080" + }, + { + "requirement": { + "id": "655360-0003-001-01" + }, + "id": "905e7e82679c45ae855141ef72f77c43", + "value": "16:9" + }, + { + "requirement": { + "id": "655360-0004-001-01" + }, + "id": "ab0e0709808c4dcf92ef070ef2be6ab5", + "value": "250" + }, + { + "requirement": { + "id": "655360-0005-001-01" + }, + "id": "747adb2de1c44fa0abb8f165bbc477b4", + "value": "1000:1" + }, + { + "requirement": { + "id": "655360-0006-001-01" + }, + "id": "335cd3c0cab64ac28eae3d9813a5f6cd", + "value": "1" + }, + { + "requirement": { + "id": "655360-0007-001-01" + }, + "id": "80be27ee91be4d38926bc4749ee7068f", + "value": "1" + }, + { + "requirement": { + "id": "655360-0008-001-01" + }, + "id": "74b57ecd0172411cb26c241775852f48", + "value": "HDMI" + }, + { + "requirement": { + "id": "655360-0009-001-01" + }, + "id": "234c914f187a492e9dfe17d484bd6f0f", + "value": "36" + } + ], + "tenderers": [ + { + "contactPoint": { + "name": "Державне управління справами", + "telephone": "0440000000" + }, + "scale": "micro", + "name": "Державне управління справами", + "identifier": { + "scheme": "UA-EDR", + "id": "00037256", + "uri": "http://www.dus.gov.ua/" + }, + "address": { + "postalCode": "01220", + "countryName": "Україна", + "streetAddress": "вул. Банкова, 11, корпус 1", + "region": "м. Київ", + "locality": "м. Київ" + } + } + ], + "date": "2020-05-15T01:00:01+03:00", + "id": "8cfbfea1a5d6465292985704865c464d" + } +} + diff --git a/docs/source/tendering/pricequotation/http/active-cancellation.http b/docs/source/tendering/pricequotation/http/active-cancellation.http new file mode 100644 index 0000000000..958b47379f --- /dev/null +++ b/docs/source/tendering/pricequotation/http/active-cancellation.http @@ -0,0 +1,49 @@ +PATCH /api/2.5/tenders/db4fb6143a5f45b6953e8f010ed8064e/cancellations/56410c1c084d442fa6b1fdde4b1b98e1?acc_token=151a30932ee245e989771be867bc8235 HTTP/1.0 +Authorization: Bearer broker +Content-Length: 30 +Content-Type: application/json +Host: lb-api-sandbox.prozorro.gov.ua +DATA: +{ + "data": { + "status": "active" + } +} + +Response: 200 OK +Content-Type: application/json; charset=UTF-8 +{ + "data": { + "status": "active", + "documents": [ + { + "hash": "md5:00000000000000000000000000000000", + "description": "Changed description", + "title": "Notice.pdf", + "url": "http://public-docs-sandbox.prozorro.gov.ua/get/aebc299ad870466a91ce3230275118b6?KeyID=a8968c46&Signature=0eUpqCYHHDqUNd2kPnfqyePCREF%2F3QeUd2%2FI1QM%252BkBW3HTNspZ%2FQz%2FcJ4diqGu729zqt8TQwJENttgIxrtOaCQ%253D%253D", + "format": "application/pdf", + "documentOf": "tender", + "datePublished": "2020-05-15T01:00:03+03:00", + "id": "67374954e7b846c591d642d35daf5292", + "dateModified": "2020-05-15T01:00:03+03:00" + }, + { + "hash": "md5:00000000000000000000000000000000", + "description": "Changed description", + "title": "Notice-2.pdf", + "url": "http://public-docs-sandbox.prozorro.gov.ua/get/63db88a0b4614dae9f611d03620daf1e?KeyID=a8968c46&Signature=0qyfbRdug5WQ32d0Ov%2F1Nqz0INT0%252B8QcUTRhRPX9Z1P%2F0GAZBRLGalDi1oZhrDaBwfGuOEUDSH7njA5uPDVaBQ%253D%253D", + "format": "application/pdf", + "documentOf": "tender", + "datePublished": "2020-05-15T01:00:03+03:00", + "id": "67374954e7b846c591d642d35daf5292", + "dateModified": "2020-05-15T01:00:03+03:00" + } + ], + "reason": "cancellation reason", + "reasonType": "expensesCut", + "date": "2020-05-15T01:00:03+03:00", + "cancellationOf": "tender", + "id": "56410c1c084d442fa6b1fdde4b1b98e1" + } +} + diff --git a/docs/source/tendering/pricequotation/http/award-active.http b/docs/source/tendering/pricequotation/http/award-active.http new file mode 100644 index 0000000000..0ef0579f53 --- /dev/null +++ b/docs/source/tendering/pricequotation/http/award-active.http @@ -0,0 +1,77 @@ +PATCH /api/2.5/tenders/db4fb6143a5f45b6953e8f010ed8064e/awards/763e8aa953f246728f00ff21743bd1dd?acc_token=01c4e9b4c80843dfbb75ae001368a5cc HTTP/1.0 +Authorization: Bearer broker +Content-Length: 30 +Content-Type: application/json +Host: lb-api-sandbox.prozorro.gov.ua +DATA: +{ + "data": { + "status": "active" + } +} + +Response: 200 OK +Content-Type: application/json; charset=UTF-8 +{ + "data": { + "status": "active", + "items": [ + { + "description": "Комп’ютерне обладнання", + "classification": { + "scheme": "ДК021", + "description": "Комп’ютерне обладнанн", + "id": "30230000-0" + }, + "deliveryAddress": { + "postalCode": "79000", + "countryName": "Україна", + "streetAddress": "вул. Банкова 1", + "region": "м. Київ", + "locality": "м. Київ" + }, + "deliveryDate": { + "startDate": "2020-05-17T01:00:00+03:00", + "endDate": "2020-05-20T01:00:00+03:00" + }, + "id": "1f2cf1221e8f42f7af3cce0e941e14b5", + "unit": { + "code": "H87", + "name": "штук" + }, + "quantity": 1.0 + } + ], + "suppliers": [ + { + "contactPoint": { + "name": "Державне управління справами", + "telephone": "0440000000" + }, + "scale": "micro", + "name": "Державне управління справами", + "identifier": { + "scheme": "UA-EDR", + "id": "00037256", + "uri": "http://www.dus.gov.ua/" + }, + "address": { + "postalCode": "01220", + "countryName": "Україна", + "streetAddress": "вул. Банкова, 11, корпус 1", + "region": "м. Київ", + "locality": "м. Київ" + } + } + ], + "bid_id": "5d821fdb36364bf59cada4ece712e18c", + "value": { + "currency": "UAH", + "amount": 479.0, + "valueAddedTaxIncluded": true + }, + "date": "2020-05-15T01:00:01+03:00", + "id": "763e8aa953f246728f00ff21743bd1dd" + } +} + diff --git a/docs/source/tendering/pricequotation/http/award-cancelled.http b/docs/source/tendering/pricequotation/http/award-cancelled.http new file mode 100644 index 0000000000..917549f36e --- /dev/null +++ b/docs/source/tendering/pricequotation/http/award-cancelled.http @@ -0,0 +1,78 @@ +PATCH /api/2.5/tenders/db4fb6143a5f45b6953e8f010ed8064e/awards/763e8aa953f246728f00ff21743bd1dd?acc_token=151a30932ee245e989771be867bc8235 HTTP/1.0 +Authorization: Bearer broker +Content-Length: 33 +Content-Type: application/json +Host: lb-api-sandbox.prozorro.gov.ua +DATA: +{ + "data": { + "status": "cancelled" + } +} + +Response: 200 OK +Content-Type: application/json; charset=UTF-8 +Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/db4fb6143a5f45b6953e8f010ed8064e/awards/e9d20fa47d934470b845028e492a8945 +{ + "data": { + "status": "cancelled", + "items": [ + { + "description": "Комп’ютерне обладнання", + "classification": { + "scheme": "ДК021", + "description": "Комп’ютерне обладнанн", + "id": "30230000-0" + }, + "deliveryAddress": { + "postalCode": "79000", + "countryName": "Україна", + "streetAddress": "вул. Банкова 1", + "region": "м. Київ", + "locality": "м. Київ" + }, + "deliveryDate": { + "startDate": "2020-05-17T01:00:00+03:00", + "endDate": "2020-05-20T01:00:00+03:00" + }, + "id": "1f2cf1221e8f42f7af3cce0e941e14b5", + "unit": { + "code": "H87", + "name": "штук" + }, + "quantity": 1.0 + } + ], + "suppliers": [ + { + "contactPoint": { + "name": "Державне управління справами", + "telephone": "0440000000" + }, + "scale": "micro", + "name": "Державне управління справами", + "identifier": { + "scheme": "UA-EDR", + "id": "00037256", + "uri": "http://www.dus.gov.ua/" + }, + "address": { + "postalCode": "01220", + "countryName": "Україна", + "streetAddress": "вул. Банкова, 11, корпус 1", + "region": "м. Київ", + "locality": "м. Київ" + } + } + ], + "bid_id": "5d821fdb36364bf59cada4ece712e18c", + "value": { + "currency": "UAH", + "amount": 479.0, + "valueAddedTaxIncluded": true + }, + "date": "2020-05-15T01:00:01+03:00", + "id": "763e8aa953f246728f00ff21743bd1dd" + } +} + diff --git a/docs/source/tendering/pricequotation/http/award-unsuccesful.http b/docs/source/tendering/pricequotation/http/award-unsuccesful.http new file mode 100644 index 0000000000..450471cc82 --- /dev/null +++ b/docs/source/tendering/pricequotation/http/award-unsuccesful.http @@ -0,0 +1,77 @@ +PATCH /api/2.5/tenders/db4fb6143a5f45b6953e8f010ed8064e/awards/4d207b4aaff146cf968e815e29d06bd6?acc_token=00e173e5f31f4decbb811cc01e10c1bf HTTP/1.0 +Authorization: Bearer broker +Content-Length: 36 +Content-Type: application/json +Host: lb-api-sandbox.prozorro.gov.ua +DATA: +{ + "data": { + "status": "unsuccessful" + } +} + +Response: 200 OK +Content-Type: application/json; charset=UTF-8 +{ + "data": { + "status": "unsuccessful", + "items": [ + { + "description": "Комп’ютерне обладнання", + "classification": { + "scheme": "ДК021", + "description": "Комп’ютерне обладнанн", + "id": "30230000-0" + }, + "deliveryAddress": { + "postalCode": "79000", + "countryName": "Україна", + "streetAddress": "вул. Банкова 1", + "region": "м. Київ", + "locality": "м. Київ" + }, + "deliveryDate": { + "startDate": "2020-05-17T01:00:00+03:00", + "endDate": "2020-05-20T01:00:00+03:00" + }, + "id": "1f2cf1221e8f42f7af3cce0e941e14b5", + "unit": { + "code": "H87", + "name": "штук" + }, + "quantity": 1.0 + } + ], + "suppliers": [ + { + "contactPoint": { + "name": "Державне управління справами", + "telephone": "0440000000" + }, + "scale": "micro", + "name": "Державне управління справами", + "identifier": { + "scheme": "UA-EDR", + "id": "00037256", + "uri": "http://www.dus.gov.ua/" + }, + "address": { + "postalCode": "01220", + "countryName": "Україна", + "streetAddress": "вул. Банкова, 11, корпус 1", + "region": "м. Київ", + "locality": "м. Київ" + } + } + ], + "bid_id": "8cfbfea1a5d6465292985704865c464d", + "value": { + "currency": "UAH", + "amount": 459.0, + "valueAddedTaxIncluded": true + }, + "date": "2020-05-15T01:00:01+03:00", + "id": "4d207b4aaff146cf968e815e29d06bd6" + } +} + diff --git a/docs/source/tendering/pricequotation/http/awards-listing-after-cancel.http b/docs/source/tendering/pricequotation/http/awards-listing-after-cancel.http new file mode 100644 index 0000000000..ec69b6fbb8 --- /dev/null +++ b/docs/source/tendering/pricequotation/http/awards-listing-after-cancel.http @@ -0,0 +1,131 @@ +GET /api/2.5/tenders/db4fb6143a5f45b6953e8f010ed8064e/awards HTTP/1.0 +Authorization: Bearer broker +Host: lb-api-sandbox.prozorro.gov.ua + +Response: 200 OK +Content-Type: application/json; charset=UTF-8 +{ + "data": [ + { + "status": "unsuccessful", + "items": [ + { + "description": "Комп’ютерне обладнання", + "classification": { + "scheme": "ДК021", + "description": "Комп’ютерне обладнанн", + "id": "30230000-0" + }, + "deliveryAddress": { + "postalCode": "79000", + "countryName": "Україна", + "streetAddress": "вул. Банкова 1", + "region": "м. Київ", + "locality": "м. Київ" + }, + "deliveryDate": { + "startDate": "2020-05-17T01:00:00+03:00", + "endDate": "2020-05-20T01:00:00+03:00" + }, + "id": "1f2cf1221e8f42f7af3cce0e941e14b5", + "unit": { + "code": "H87", + "name": "штук" + }, + "quantity": 1.0 + } + ], + "suppliers": [ + { + "contactPoint": { + "name": "Державне управління справами", + "telephone": "0440000000" + }, + "scale": "micro", + "name": "Державне управління справами", + "identifier": { + "scheme": "UA-EDR", + "id": "00037256", + "uri": "http://www.dus.gov.ua/" + }, + "address": { + "postalCode": "01220", + "countryName": "Україна", + "streetAddress": "вул. Банкова, 11, корпус 1", + "region": "м. Київ", + "locality": "м. Київ" + } + } + ], + "bid_id": "8cfbfea1a5d6465292985704865c464d", + "value": { + "currency": "UAH", + "amount": 459.0, + "valueAddedTaxIncluded": true + }, + "date": "2020-05-15T01:00:01+03:00", + "id": "4d207b4aaff146cf968e815e29d06bd6" + }, + { + "status": "pending", + "items": [ + { + "description": "Комп’ютерне обладнання", + "classification": { + "scheme": "ДК021", + "description": "Комп’ютерне обладнанн", + "id": "30230000-0" + }, + "deliveryAddress": { + "postalCode": "79000", + "countryName": "Україна", + "streetAddress": "вул. Банкова 1", + "region": "м. Київ", + "locality": "м. Київ" + }, + "deliveryDate": { + "startDate": "2020-05-17T01:00:00+03:00", + "endDate": "2020-05-20T01:00:00+03:00" + }, + "id": "1f2cf1221e8f42f7af3cce0e941e14b5", + "unit": { + "code": "H87", + "name": "штук" + }, + "quantity": 1.0 + } + ], + "suppliers": [ + { + "contactPoint": { + "name": "Державне управління справами", + "telephone": "0440000000" + }, + "scale": "micro", + "name": "Державне управління справами", + "identifier": { + "scheme": "UA-EDR", + "id": "00037256", + "uri": "http://www.dus.gov.ua/" + }, + "address": { + "postalCode": "01220", + "countryName": "Україна", + "streetAddress": "вул. Банкова, 11, корпус 1", + "region": "м. Київ", + "locality": "м. Київ" + } + } + ], + "bid_id": "5d821fdb36364bf59cada4ece712e18c", + "value": { + "currency": "UAH", + "amount": 479.0, + "valueAddedTaxIncluded": true + }, + "date": "2020-05-15T01:00:01+03:00", + "id": "763e8aa953f246728f00ff21743bd1dd" + } + ] +} + diff --git a/docs/source/tendering/pricequotation/http/awards-listing.http b/docs/source/tendering/pricequotation/http/awards-listing.http new file mode 100644 index 0000000000..b04746a137 --- /dev/null +++ b/docs/source/tendering/pricequotation/http/awards-listing.http @@ -0,0 +1,131 @@ +GET /api/2.5/tenders/db4fb6143a5f45b6953e8f010ed8064e/awards HTTP/1.0 +Authorization: Bearer broker +Host: lb-api-sandbox.prozorro.gov.ua + +Response: 200 OK +Content-Type: application/json; charset=UTF-8 +{ + "data": [ + { + "status": "pending", + "items": [ + { + "description": "Комп’ютерне обладнання", + "classification": { + "scheme": "ДК021", + "description": "Комп’ютерне обладнанн", + "id": "30230000-0" + }, + "deliveryAddress": { + "postalCode": "79000", + "countryName": "Україна", + "streetAddress": "вул. Банкова 1", + "region": "м. Київ", + "locality": "м. Київ" + }, + "deliveryDate": { + "startDate": "2020-05-17T01:00:00+03:00", + "endDate": "2020-05-20T01:00:00+03:00" + }, + "id": "1f2cf1221e8f42f7af3cce0e941e14b5", + "unit": { + "code": "H87", + "name": "штук" + }, + "quantity": 1.0 + } + ], + "suppliers": [ + { + "contactPoint": { + "name": "Державне управління справами", + "telephone": "0440000000" + }, + "scale": "micro", + "name": "Державне управління справами", + "identifier": { + "scheme": "UA-EDR", + "id": "00037256", + "uri": "http://www.dus.gov.ua/" + }, + "address": { + "postalCode": "01220", + "countryName": "Україна", + "streetAddress": "вул. Банкова, 11, корпус 1", + "region": "м. Київ", + "locality": "м. Київ" + } + } + ], + "bid_id": "8cfbfea1a5d6465292985704865c464d", + "value": { + "currency": "UAH", + "amount": 459.0, + "valueAddedTaxIncluded": true + }, + "date": "2020-05-15T01:00:01+03:00", + "id": "4d207b4aaff146cf968e815e29d06bd6" + }, + { + "status": "pending", + "items": [ + { + "description": "Комп’ютерне обладнання", + "classification": { + "scheme": "ДК021", + "description": "Комп’ютерне обладнанн", + "id": "30230000-0" + }, + "deliveryAddress": { + "postalCode": "79000", + "countryName": "Україна", + "streetAddress": "вул. Банкова 1", + "region": "м. Київ", + "locality": "м. Київ" + }, + "deliveryDate": { + "startDate": "2020-05-17T01:00:00+03:00", + "endDate": "2020-05-20T01:00:00+03:00" + }, + "id": "1f2cf1221e8f42f7af3cce0e941e14b5", + "unit": { + "code": "H87", + "name": "штук" + }, + "quantity": 1.0 + } + ], + "suppliers": [ + { + "contactPoint": { + "name": "Державне управління справами", + "telephone": "0440000000" + }, + "scale": "micro", + "name": "Державне управління справами", + "identifier": { + "scheme": "UA-EDR", + "id": "00037256", + "uri": "http://www.dus.gov.ua/" + }, + "address": { + "postalCode": "01220", + "countryName": "Україна", + "streetAddress": "вул. Банкова, 11, корпус 1", + "region": "м. Київ", + "locality": "м. Київ" + } + } + ], + "bid_id": "5d821fdb36364bf59cada4ece712e18c", + "value": { + "currency": "UAH", + "amount": 479.0, + "valueAddedTaxIncluded": true + }, + "date": "2020-05-15T01:00:01+03:00", + "id": "763e8aa953f246728f00ff21743bd1dd" + } + ] +} + diff --git a/docs/source/tendering/pricequotation/http/bidder-documents.http b/docs/source/tendering/pricequotation/http/bidder-documents.http new file mode 100644 index 0000000000..2cc2cacf70 --- /dev/null +++ b/docs/source/tendering/pricequotation/http/bidder-documents.http @@ -0,0 +1,21 @@ +GET /api/2.5/tenders/db4fb6143a5f45b6953e8f010ed8064e/bids/8cfbfea1a5d6465292985704865c464d/documents?acc_token=00e173e5f31f4decbb811cc01e10c1bf HTTP/1.0 +Authorization: Bearer broker +Host: lb-api-sandbox.prozorro.gov.ua + +Response: 200 OK +Content-Type: application/json; charset=UTF-8 +{ + "data": [ + { + "hash": "md5:00000000000000000000000000000000", + "title": "Proposal.pdf", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/db4fb6143a5f45b6953e8f010ed8064e/bids/8cfbfea1a5d6465292985704865c464d/documents/b0ddfe8372884b30a09d84e52605f52c?download=05b0d65cf15d46708161e6e0921e5c0b", + "format": "application/pdf", + "documentOf": "tender", + "datePublished": "2020-05-15T01:00:01+03:00", + "id": "b0ddfe8372884b30a09d84e52605f52c", + "dateModified": "2020-05-15T01:00:01+03:00" + } + ] +} + diff --git a/docs/source/tendering/pricequotation/http/blank-tender-view.http b/docs/source/tendering/pricequotation/http/blank-tender-view.http new file mode 100644 index 0000000000..6b2d659ed8 --- /dev/null +++ b/docs/source/tendering/pricequotation/http/blank-tender-view.http @@ -0,0 +1,71 @@ +GET /api/2.5/tenders/db4fb6143a5f45b6953e8f010ed8064e HTTP/1.0 +Authorization: Bearer broker +Host: lb-api-sandbox.prozorro.gov.ua + +Response: 200 OK +Content-Type: application/json; charset=UTF-8 +{ + "data": { + "status": "draft", + "procurementMethod": "selective", + "mainProcurementCategory": "goods", + "tenderPeriod": { + "startDate": "2020-05-15T01:00:00+03:00", + "endDate": "2020-05-29T01:00:00+03:00" + }, + "title": "Комп’ютерне обладнання", + "items": [ + { + "deliveryDate": { + "startDate": "2020-05-17T01:00:00+03:00", + "endDate": "2020-05-20T01:00:00+03:00" + }, + "description": "Комп’ютерне обладнання", + "quantity": 1.0, + "id": "1f2cf1221e8f42f7af3cce0e941e14b5", + "deliveryAddress": { + "postalCode": "79000", + "countryName": "Україна", + "streetAddress": "вул. Банкова 1", + "region": "м. Київ", + "locality": "м. Київ" + } + } + ], + "procurementMethodType": "priceQuotation", + "value": { + "currency": "UAH", + "amount": 22000.0, + "valueAddedTaxIncluded": true + }, + "submissionMethod": "electronicAuction", + "date": "2020-05-15T01:00:00+03:00", + "profile": "655360-30230000-889652-40000777", + "procuringEntity": { + "contactPoint": { + "name": "Державне управління справами", + "telephone": "0440000000" + }, + "identifier": { + "scheme": "UA-EDR", + "id": "00037256", + "uri": "http://www.dus.gov.ua/" + }, + "name": "Державне управління справами", + "kind": "general", + "address": { + "postalCode": "01220", + "countryName": "Україна", + "streetAddress": "вул. Банкова, 11, корпус 1", + "region": "м. Київ", + "locality": "м. Київ" + } + }, + "awardCriteria": "lowestCost", + "owner": "broker", + "dateModified": "2020-05-15T01:00:00+03:00", + "id": "db4fb6143a5f45b6953e8f010ed8064e", + "tenderID": "UA-2020-05-15-000001" + } +} + diff --git a/docs/source/tendering/pricequotation/http/contract-listing.http b/docs/source/tendering/pricequotation/http/contract-listing.http new file mode 100644 index 0000000000..d668bd5f53 --- /dev/null +++ b/docs/source/tendering/pricequotation/http/contract-listing.http @@ -0,0 +1,135 @@ +GET /api/2.5/tenders/db4fb6143a5f45b6953e8f010ed8064e/contracts HTTP/1.0 +Authorization: Bearer broker +Host: lb-api-sandbox.prozorro.gov.ua + +Response: 200 OK +Content-Type: application/json; charset=UTF-8 +{ + "data": [ + { + "status": "cancelled", + "items": [ + { + "description": "Комп’ютерне обладнання", + "classification": { + "scheme": "ДК021", + "description": "Комп’ютерне обладнанн", + "id": "30230000-0" + }, + "deliveryAddress": { + "postalCode": "79000", + "countryName": "Україна", + "streetAddress": "вул. Банкова 1", + "region": "м. Київ", + "locality": "м. Київ" + }, + "deliveryDate": { + "startDate": "2020-05-17T01:00:00+03:00", + "endDate": "2020-05-20T01:00:00+03:00" + }, + "id": "1f2cf1221e8f42f7af3cce0e941e14b5", + "unit": { + "code": "H87", + "name": "штук" + }, + "quantity": 1.0 + } + ], + "suppliers": [ + { + "contactPoint": { + "name": "Державне управління справами", + "telephone": "0440000000" + }, + "scale": "micro", + "name": "Державне управління справами", + "identifier": { + "scheme": "UA-EDR", + "id": "00037256", + "uri": "http://www.dus.gov.ua/" + }, + "address": { + "postalCode": "01220", + "countryName": "Україна", + "streetAddress": "вул. Банкова, 11, корпус 1", + "region": "м. Київ", + "locality": "м. Київ" + } + } + ], + "value": { + "currency": "UAH", + "amount": 479.0, + "amountNet": 479.0, + "valueAddedTaxIncluded": true + }, + "date": "2020-05-15T01:00:01+03:00", + "awardID": "763e8aa953f246728f00ff21743bd1dd", + "id": "d83498cb2ab24c89b96447ddef5e258d", + "contractID": "UA-2020-05-15-000001-1" + }, + { + "status": "pending", + "items": [ + { + "description": "Комп’ютерне обладнання", + "classification": { + "scheme": "ДК021", + "description": "Комп’ютерне обладнанн", + "id": "30230000-0" + }, + "deliveryAddress": { + "postalCode": "79000", + "countryName": "Україна", + "streetAddress": "вул. Банкова 1", + "region": "м. Київ", + "locality": "м. Київ" + }, + "deliveryDate": { + "startDate": "2020-05-17T01:00:00+03:00", + "endDate": "2020-05-20T01:00:00+03:00" + }, + "id": "1f2cf1221e8f42f7af3cce0e941e14b5", + "unit": { + "code": "H87", + "name": "штук" + }, + "quantity": 1.0 + } + ], + "suppliers": [ + { + "contactPoint": { + "name": "Державне управління справами", + "telephone": "0440000000" + }, + "scale": "micro", + "name": "Державне управління справами", + "identifier": { + "scheme": "UA-EDR", + "id": "00037256", + "uri": "http://www.dus.gov.ua/" + }, + "address": { + "postalCode": "01220", + "countryName": "Україна", + "streetAddress": "вул. Банкова, 11, корпус 1", + "region": "м. Київ", + "locality": "м. Київ" + } + } + ], + "value": { + "currency": "UAH", + "amount": 479.0, + "amountNet": 479.0, + "valueAddedTaxIncluded": true + }, + "date": "2020-05-15T01:00:01+03:00", + "awardID": "e9d20fa47d934470b845028e492a8945", + "id": "0def0972e7a648cdbbb29a291331f1f2", + "contractID": "UA-2020-05-15-000001-2" + } + ] +} + diff --git a/docs/source/tendering/pricequotation/http/initial-tender-listing.http b/docs/source/tendering/pricequotation/http/initial-tender-listing.http new file mode 100644 index 0000000000..a5d2567b5e --- /dev/null +++ b/docs/source/tendering/pricequotation/http/initial-tender-listing.http @@ -0,0 +1,15 @@ +GET /api/2.5/tenders HTTP/1.0 +Authorization: Bearer broker +Host: lb-api-sandbox.prozorro.gov.ua + +Response: 200 OK +Content-Type: application/json; charset=UTF-8 +{ + "next_page": { + "path": "/api/2.5/tenders?offset=", + "uri": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders?offset=", + "offset": "" + }, + "data": [] +} + diff --git a/docs/source/tendering/pricequotation/http/patch-bidder.http b/docs/source/tendering/pricequotation/http/patch-bidder.http new file mode 100644 index 0000000000..4cc0acfa42 --- /dev/null +++ b/docs/source/tendering/pricequotation/http/patch-bidder.http @@ -0,0 +1,116 @@ +PATCH /api/2.5/tenders/db4fb6143a5f45b6953e8f010ed8064e/bids/8cfbfea1a5d6465292985704865c464d?acc_token=00e173e5f31f4decbb811cc01e10c1bf HTTP/1.0 +Authorization: Bearer broker +Content-Length: 36 +Content-Type: application/json +Host: lb-api-sandbox.prozorro.gov.ua +DATA: +{ + "data": { + "value": { + "amount": 459 + } + } +} + +Response: 200 OK +Content-Type: application/json; charset=UTF-8 +{ + "data": { + "status": "draft", + "value": { + "currency": "UAH", + "amount": 459.0, + "valueAddedTaxIncluded": true + }, + "requirementResponses": [ + { + "requirement": { + "id": "655360-0001-001-01" + }, + "id": "0274c6a64a19467294e660c9ee6601f7", + "value": "23.8" + }, + { + "requirement": { + "id": "655360-0002-001-01" + }, + "id": "854103aaa1c6469daf6e79ebb09e8537", + "value": "1920x1080" + }, + { + "requirement": { + "id": "655360-0003-001-01" + }, + "id": "905e7e82679c45ae855141ef72f77c43", + "value": "16:9" + }, + { + "requirement": { + "id": "655360-0004-001-01" + }, + "id": "ab0e0709808c4dcf92ef070ef2be6ab5", + "value": "250" + }, + { + "requirement": { + "id": "655360-0005-001-01" + }, + "id": "747adb2de1c44fa0abb8f165bbc477b4", + "value": "1000:1" + }, + { + "requirement": { + "id": "655360-0006-001-01" + }, + "id": "335cd3c0cab64ac28eae3d9813a5f6cd", + "value": "1" + }, + { + "requirement": { + "id": "655360-0007-001-01" + }, + "id": "80be27ee91be4d38926bc4749ee7068f", + "value": "1" + }, + { + "requirement": { + "id": "655360-0008-001-01" + }, + "id": "74b57ecd0172411cb26c241775852f48", + "value": "HDMI" + }, + { + "requirement": { + "id": "655360-0009-001-01" + }, + "id": "234c914f187a492e9dfe17d484bd6f0f", + "value": "36" + } + ], + "tenderers": [ + { + "contactPoint": { + "name": "Державне управління справами", + "telephone": "0440000000" + }, + "scale": "micro", + "name": "Державне управління справами", + "identifier": { + "scheme": "UA-EDR", + "id": "00037256", + "uri": "http://www.dus.gov.ua/" + }, + "address": { + "postalCode": "01220", + "countryName": "Україна", + "streetAddress": "вул. Банкова, 11, корпус 1", + "region": "м. Київ", + "locality": "м. Київ" + } + } + ], + "date": "2020-05-15T01:00:01+03:00", + "id": "8cfbfea1a5d6465292985704865c464d" + } +} + diff --git a/docs/source/tendering/pricequotation/http/patch-cancellation.http b/docs/source/tendering/pricequotation/http/patch-cancellation.http new file mode 100644 index 0000000000..099d47badb --- /dev/null +++ b/docs/source/tendering/pricequotation/http/patch-cancellation.http @@ -0,0 +1,28 @@ +PATCH /api/2.5/tenders/db4fb6143a5f45b6953e8f010ed8064e/cancellations/56410c1c084d442fa6b1fdde4b1b98e1/documents/67374954e7b846c591d642d35daf5292?acc_token=151a30932ee245e989771be867bc8235 HTTP/1.0 +Authorization: Bearer broker +Content-Length: 48 +Content-Type: application/json +Host: lb-api-sandbox.prozorro.gov.ua +DATA: +{ + "data": { + "description": "Changed description" + } +} + +Response: 200 OK +Content-Type: application/json; charset=UTF-8 +{ + "data": { + "hash": "md5:00000000000000000000000000000000", + "description": "Changed description", + "title": "Notice.pdf", + "url": "http://public-docs-sandbox.prozorro.gov.ua/get/aebc299ad870466a91ce3230275118b6?KeyID=a8968c46&Signature=0eUpqCYHHDqUNd2kPnfqyePCREF%2F3QeUd2%2FI1QM%252BkBW3HTNspZ%2FQz%2FcJ4diqGu729zqt8TQwJENttgIxrtOaCQ%253D%253D", + "format": "application/pdf", + "documentOf": "tender", + "datePublished": "2020-05-15T01:00:03+03:00", + "id": "67374954e7b846c591d642d35daf5292", + "dateModified": "2020-05-15T01:00:03+03:00" + } +} + diff --git a/docs/source/tendering/pricequotation/http/patch-tender-data.http b/docs/source/tendering/pricequotation/http/patch-tender-data.http new file mode 100644 index 0000000000..f8bc54e512 --- /dev/null +++ b/docs/source/tendering/pricequotation/http/patch-tender-data.http @@ -0,0 +1,81 @@ +PATCH /api/2.5/tenders/db4fb6143a5f45b6953e8f010ed8064e?acc_token=151a30932ee245e989771be867bc8235 HTTP/1.0 +Authorization: Bearer broker +Content-Length: 68 +Content-Type: application/json +Host: lb-api-sandbox.prozorro.gov.ua +DATA: +{ + "data": { + "tenderPeriod": { + "endDate": "2020-05-30T01:00:11+03:00" + } + } +} + +Response: 200 OK +Content-Type: application/json; charset=UTF-8 +{ + "data": { + "status": "draft", + "procurementMethod": "selective", + "mainProcurementCategory": "goods", + "tenderPeriod": { + "startDate": "2020-05-15T01:00:00+03:00", + "endDate": "2020-05-30T01:00:11+03:00" + }, + "title": "Комп’ютерне обладнання", + "items": [ + { + "deliveryDate": { + "startDate": "2020-05-17T01:00:00+03:00", + "endDate": "2020-05-20T01:00:00+03:00" + }, + "description": "Комп’ютерне обладнання", + "quantity": 1.0, + "id": "1f2cf1221e8f42f7af3cce0e941e14b5", + "deliveryAddress": { + "postalCode": "79000", + "countryName": "Україна", + "streetAddress": "вул. Банкова 1", + "region": "м. Київ", + "locality": "м. Київ" + } + } + ], + "procurementMethodType": "priceQuotation", + "value": { + "currency": "UAH", + "amount": 22000.0, + "valueAddedTaxIncluded": true + }, + "submissionMethod": "electronicAuction", + "date": "2020-05-15T01:00:00+03:00", + "profile": "655360-30230000-889652-40000777", + "procuringEntity": { + "contactPoint": { + "name": "Державне управління справами", + "telephone": "0440000000" + }, + "identifier": { + "scheme": "UA-EDR", + "id": "00037256", + "uri": "http://www.dus.gov.ua/" + }, + "name": "Державне управління справами", + "kind": "general", + "address": { + "postalCode": "01220", + "countryName": "Україна", + "streetAddress": "вул. Банкова, 11, корпус 1", + "region": "м. Київ", + "locality": "м. Київ" + } + }, + "awardCriteria": "lowestCost", + "owner": "broker", + "dateModified": "2020-05-15T01:00:01+03:00", + "id": "db4fb6143a5f45b6953e8f010ed8064e", + "tenderID": "UA-2020-05-15-000001" + } +} + diff --git a/docs/source/tendering/pricequotation/http/prepare-cancellation.http b/docs/source/tendering/pricequotation/http/prepare-cancellation.http new file mode 100644 index 0000000000..ff7765bc8b --- /dev/null +++ b/docs/source/tendering/pricequotation/http/prepare-cancellation.http @@ -0,0 +1,27 @@ +POST /api/2.5/tenders/db4fb6143a5f45b6953e8f010ed8064e/cancellations?acc_token=151a30932ee245e989771be867bc8235 HTTP/1.0 +Authorization: Bearer broker +Content-Length: 69 +Content-Type: application/json +Host: lb-api-sandbox.prozorro.gov.ua +DATA: +{ + "data": { + "reason": "cancellation reason", + "reasonType": "noDemand" + } +} + +Response: 201 Created +Content-Type: application/json; charset=UTF-8 +Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/db4fb6143a5f45b6953e8f010ed8064e/cancellations/56410c1c084d442fa6b1fdde4b1b98e1 +{ + "data": { + "status": "draft", + "reason": "cancellation reason", + "reasonType": "noDemand", + "date": "2020-05-15T01:00:03+03:00", + "cancellationOf": "tender", + "id": "56410c1c084d442fa6b1fdde4b1b98e1" + } +} + diff --git a/docs/source/tendering/pricequotation/http/publish-tender.http b/docs/source/tendering/pricequotation/http/publish-tender.http new file mode 100644 index 0000000000..c44b25d247 --- /dev/null +++ b/docs/source/tendering/pricequotation/http/publish-tender.http @@ -0,0 +1,80 @@ +PATCH /api/2.5/tenders/85818863b7a4458ea02e3893422b0a0d?acc_token=ff06b08392354f79bae492fb807759ff HTTP/1.0 +Authorization: Bearer broker +Content-Length: 40 +Content-Type: application/json +Host: lb-api-sandbox.prozorro.gov.ua +DATA: +{ + "data": { + "status": "draft.publishing" + } +} + +Response: 200 OK +Content-Type: application/json; charset=UTF-8 +{ + "data": { + "status": "draft.publishing", + "procurementMethod": "selective", + "mainProcurementCategory": "goods", + "tenderPeriod": { + "startDate": "2020-05-15T01:00:00+03:00", + "endDate": "2020-05-29T01:00:00+03:00" + }, + "title": "Комп’ютерне обладнання", + "items": [ + { + "deliveryDate": { + "startDate": "2020-05-17T01:00:00+03:00", + "endDate": "2020-05-20T01:00:00+03:00" + }, + "description": "Комп’ютерне обладнання", + "quantity": 1.0, + "id": "98c87e3a8f2b48fa887616989dcf8294", + "deliveryAddress": { + "postalCode": "79000", + "countryName": "Україна", + "streetAddress": "вул. Банкова 1", + "region": "м. Київ", + "locality": "м. Київ" + } + } + ], + "procurementMethodType": "priceQuotation", + "value": { + "currency": "UAH", + "amount": 22000.0, + "valueAddedTaxIncluded": true + }, + "submissionMethod": "electronicAuction", + "date": "2020-05-15T01:00:00+03:00", + "noticePublicationDate": "2020-05-15T01:00:00+03:00", + "profile": "655360-30230000-889652-40000777", + "procuringEntity": { + "contactPoint": { + "name": "Державне управління справами", + "telephone": "0440000000" + }, + "identifier": { + "scheme": "UA-EDR", + "id": "00037256", + "uri": "http://www.dus.gov.ua/" + }, + "name": "Державне управління справами", + "kind": "general", + "address": { + "postalCode": "01220", + "countryName": "Україна", + "streetAddress": "вул. Банкова, 11, корпус 1", + "region": "м. Київ", + "locality": "м. Київ" + } + }, + "awardCriteria": "lowestCost", + "owner": "broker", + "dateModified": "2020-05-15T01:00:00+03:00", + "id": "85818863b7a4458ea02e3893422b0a0d", + "tenderID": "UA-2020-05-15-000001" + } +} + diff --git a/docs/source/tendering/pricequotation/http/register-2nd-bidder.http b/docs/source/tendering/pricequotation/http/register-2nd-bidder.http new file mode 100644 index 0000000000..610f625fd5 --- /dev/null +++ b/docs/source/tendering/pricequotation/http/register-2nd-bidder.http @@ -0,0 +1,237 @@ +POST /api/2.5/tenders/db4fb6143a5f45b6953e8f010ed8064e/bids HTTP/1.0 +Authorization: Bearer broker +Content-Length: 2164 +Content-Type: application/json +Host: lb-api-sandbox.prozorro.gov.ua +DATA: +{ + "data": { + "requirementResponses": [ + { + "requirement": { + "id": "655360-0001-001-01" + }, + "value": "23.8" + }, + { + "requirement": { + "id": "655360-0002-001-01" + }, + "value": "1920x1080" + }, + { + "requirement": { + "id": "655360-0003-001-01" + }, + "value": "16:9" + }, + { + "requirement": { + "id": "655360-0004-001-01" + }, + "value": 250 + }, + { + "requirement": { + "id": "655360-0005-001-01" + }, + "value": "1000:1" + }, + { + "requirement": { + "id": "655360-0006-001-01" + }, + "value": 1 + }, + { + "requirement": { + "id": "655360-0007-001-01" + }, + "value": 1 + }, + { + "requirement": { + "id": "655360-0008-001-01" + }, + "value": "HDMI" + }, + { + "requirement": { + "id": "655360-0009-001-01" + }, + "value": 36 + } + ], + "documents": [ + { + "url": "http://public-docs-sandbox.prozorro.gov.ua/get/883ee4e2b9dc4d36b2d4d7c83afcb7d6?KeyID=a8968c46&Signature=nNqvawdCDXaHhB9pJq4SCtXMo4m64qsruih%2FuYQbE5OmETDIZzvQ2Soqym8WnrH9M%2Fln0QExC%2FLw1BPb%2FKnVBA%3D%3D", + "title": "Proposal_part1.pdf", + "hash": "md5:00000000000000000000000000000000", + "format": "application/pdf" + }, + { + "url": "http://public-docs-sandbox.prozorro.gov.ua/get/084e3b1245d94306aee75ddc828ae9fd?KeyID=a8968c46&Signature=PPiUbFTdTBk9nWnNsFz44zBopOoOwfBy4LRw4WZMGfvaFJpm%2FY6zT1QTEEdFoIfe6WfgpcXzngoW9wcDovTUBw%3D%3D", + "title": "Proposal_part2.pdf", + "hash": "md5:00000000000000000000000000000000", + "format": "application/pdf" + } + ], + "value": { + "currency": "UAH", + "amount": 479, + "valueAddedTaxIncluded": true + }, + "tenderers": [ + { + "contactPoint": { + "name": "Державне управління справами", + "telephone": "0440000000" + }, + "scale": "micro", + "name": "Державне управління справами", + "identifier": { + "scheme": "UA-EDR", + "id": "00037256", + "uri": "http://www.dus.gov.ua/" + }, + "address": { + "countryName": "Україна", + "postalCode": "01220", + "region": "м. Київ", + "streetAddress": "вул. Банкова, 11, корпус 1", + "locality": "м. Київ" + } + } + ] + } +} + +Response: 201 Created +Content-Type: application/json; charset=UTF-8 +Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/db4fb6143a5f45b6953e8f010ed8064e/bids/5d821fdb36364bf59cada4ece712e18c +{ + "access": { + "transfer": "02b88cfbcf524ed6829cb76880a56bfe", + "token": "01c4e9b4c80843dfbb75ae001368a5cc" + }, + "data": { + "status": "active", + "documents": [ + { + "hash": "md5:00000000000000000000000000000000", + "title": "Proposal_part1.pdf", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/db4fb6143a5f45b6953e8f010ed8064e/bids/5d821fdb36364bf59cada4ece712e18c/documents/e3f80c76f23f46269e97ec31a9f4ae3e?download=883ee4e2b9dc4d36b2d4d7c83afcb7d6", + "format": "application/pdf", + "documentOf": "tender", + "datePublished": "2020-05-15T01:00:01+03:00", + "id": "e3f80c76f23f46269e97ec31a9f4ae3e", + "dateModified": "2020-05-15T01:00:01+03:00" + }, + { + "hash": "md5:00000000000000000000000000000000", + "title": "Proposal_part2.pdf", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/db4fb6143a5f45b6953e8f010ed8064e/bids/5d821fdb36364bf59cada4ece712e18c/documents/87a8e97e6765449a99b9353de4b7c75c?download=084e3b1245d94306aee75ddc828ae9fd", + "format": "application/pdf", + "documentOf": "tender", + "datePublished": "2020-05-15T01:00:01+03:00", + "id": "87a8e97e6765449a99b9353de4b7c75c", + "dateModified": "2020-05-15T01:00:01+03:00" + } + ], + "value": { + "currency": "UAH", + "amount": 479.0, + "valueAddedTaxIncluded": true + }, + "requirementResponses": [ + { + "requirement": { + "id": "655360-0001-001-01" + }, + "id": "994e7754eff04617aae6b21297cd0f6a", + "value": "23.8" + }, + { + "requirement": { + "id": "655360-0002-001-01" + }, + "id": "d6d86c4dc7374b528364a98aef9c8072", + "value": "1920x1080" + }, + { + "requirement": { + "id": "655360-0003-001-01" + }, + "id": "a3f53df73f2b4525965b95a86050130c", + "value": "16:9" + }, + { + "requirement": { + "id": "655360-0004-001-01" + }, + "id": "d8f00910e39b4abb97e674b7e969e8f8", + "value": "250" + }, + { + "requirement": { + "id": "655360-0005-001-01" + }, + "id": "e1220e2c66cc4e56a87cc0cb0668c15e", + "value": "1000:1" + }, + { + "requirement": { + "id": "655360-0006-001-01" + }, + "id": "4c9ca29cd7df4db4a9726242f59864f0", + "value": "1" + }, + { + "requirement": { + "id": "655360-0007-001-01" + }, + "id": "f3d36b3f13c244e59c3e2b9e6e287628", + "value": "1" + }, + { + "requirement": { + "id": "655360-0008-001-01" + }, + "id": "369ea970956549e482dcd570d3e7846f", + "value": "HDMI" + }, + { + "requirement": { + "id": "655360-0009-001-01" + }, + "id": "27c7eff0b1cf4e35a4ef93229c5c638c", + "value": "36" + } + ], + "tenderers": [ + { + "contactPoint": { + "name": "Державне управління справами", + "telephone": "0440000000" + }, + "scale": "micro", + "name": "Державне управління справами", + "identifier": { + "scheme": "UA-EDR", + "id": "00037256", + "uri": "http://www.dus.gov.ua/" + }, + "address": { + "postalCode": "01220", + "countryName": "Україна", + "streetAddress": "вул. Банкова, 11, корпус 1", + "region": "м. Київ", + "locality": "м. Київ" + } + } + ], + "date": "2020-05-15T01:00:01+03:00", + "id": "5d821fdb36364bf59cada4ece712e18c" + } +} + diff --git a/docs/source/tendering/pricequotation/http/register-bidder.http b/docs/source/tendering/pricequotation/http/register-bidder.http new file mode 100644 index 0000000000..9681275d76 --- /dev/null +++ b/docs/source/tendering/pricequotation/http/register-bidder.http @@ -0,0 +1,202 @@ +POST /api/2.5/tenders/db4fb6143a5f45b6953e8f010ed8064e/bids HTTP/1.0 +Authorization: Bearer broker +Content-Length: 1522 +Content-Type: application/json +Host: lb-api-sandbox.prozorro.gov.ua +DATA: +{ + "data": { + "status": "draft", + "requirementResponses": [ + { + "requirement": { + "id": "655360-0001-001-01" + }, + "value": "23.8" + }, + { + "requirement": { + "id": "655360-0002-001-01" + }, + "value": "1920x1080" + }, + { + "requirement": { + "id": "655360-0003-001-01" + }, + "value": "16:9" + }, + { + "requirement": { + "id": "655360-0004-001-01" + }, + "value": 250 + }, + { + "requirement": { + "id": "655360-0005-001-01" + }, + "value": "1000:1" + }, + { + "requirement": { + "id": "655360-0006-001-01" + }, + "value": 1 + }, + { + "requirement": { + "id": "655360-0007-001-01" + }, + "value": 1 + }, + { + "requirement": { + "id": "655360-0008-001-01" + }, + "value": "HDMI" + }, + { + "requirement": { + "id": "655360-0009-001-01" + }, + "value": 36 + } + ], + "value": { + "currency": "UAH", + "amount": 469, + "valueAddedTaxIncluded": true + }, + "tenderers": [ + { + "contactPoint": { + "name": "Державне управління справами", + "telephone": "0440000000" + }, + "scale": "micro", + "name": "Державне управління справами", + "identifier": { + "scheme": "UA-EDR", + "id": "00037256", + "uri": "http://www.dus.gov.ua/" + }, + "address": { + "countryName": "Україна", + "postalCode": "01220", + "region": "м. Київ", + "streetAddress": "вул. Банкова, 11, корпус 1", + "locality": "м. Київ" + } + } + ] + } +} + +Response: 201 Created +Content-Type: application/json; charset=UTF-8 +Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/db4fb6143a5f45b6953e8f010ed8064e/bids/8cfbfea1a5d6465292985704865c464d +{ + "access": { + "transfer": "875163bc5cce4314b6d374d9f14ef4f3", + "token": "00e173e5f31f4decbb811cc01e10c1bf" + }, + "data": { + "status": "draft", + "value": { + "currency": "UAH", + "amount": 469.0, + "valueAddedTaxIncluded": true + }, + "requirementResponses": [ + { + "requirement": { + "id": "655360-0001-001-01" + }, + "id": "0274c6a64a19467294e660c9ee6601f7", + "value": "23.8" + }, + { + "requirement": { + "id": "655360-0002-001-01" + }, + "id": "854103aaa1c6469daf6e79ebb09e8537", + "value": "1920x1080" + }, + { + "requirement": { + "id": "655360-0003-001-01" + }, + "id": "905e7e82679c45ae855141ef72f77c43", + "value": "16:9" + }, + { + "requirement": { + "id": "655360-0004-001-01" + }, + "id": "ab0e0709808c4dcf92ef070ef2be6ab5", + "value": "250" + }, + { + "requirement": { + "id": "655360-0005-001-01" + }, + "id": "747adb2de1c44fa0abb8f165bbc477b4", + "value": "1000:1" + }, + { + "requirement": { + "id": "655360-0006-001-01" + }, + "id": "335cd3c0cab64ac28eae3d9813a5f6cd", + "value": "1" + }, + { + "requirement": { + "id": "655360-0007-001-01" + }, + "id": "80be27ee91be4d38926bc4749ee7068f", + "value": "1" + }, + { + "requirement": { + "id": "655360-0008-001-01" + }, + "id": "74b57ecd0172411cb26c241775852f48", + "value": "HDMI" + }, + { + "requirement": { + "id": "655360-0009-001-01" + }, + "id": "234c914f187a492e9dfe17d484bd6f0f", + "value": "36" + } + ], + "tenderers": [ + { + "contactPoint": { + "name": "Державне управління справами", + "telephone": "0440000000" + }, + "scale": "micro", + "name": "Державне управління справами", + "identifier": { + "scheme": "UA-EDR", + "id": "00037256", + "uri": "http://www.dus.gov.ua/" + }, + "address": { + "postalCode": "01220", + "countryName": "Україна", + "streetAddress": "вул. Банкова, 11, корпус 1", + "region": "м. Київ", + "locality": "м. Київ" + } + } + ], + "date": "2020-05-15T01:00:01+03:00", + "id": "8cfbfea1a5d6465292985704865c464d" + } +} + diff --git a/docs/source/tendering/pricequotation/http/tender-after-bot-active.http b/docs/source/tendering/pricequotation/http/tender-after-bot-active.http new file mode 100644 index 0000000000..a91ab24e78 --- /dev/null +++ b/docs/source/tendering/pricequotation/http/tender-after-bot-active.http @@ -0,0 +1,335 @@ +GET /api/2.5/tenders/85818863b7a4458ea02e3893422b0a0d HTTP/1.0 +Authorization: Bearer broker +Host: lb-api-sandbox.prozorro.gov.ua + +Response: 200 OK +Content-Type: application/json; charset=UTF-8 +{ + "data": { + "status": "active.tendering", + "procurementMethod": "selective", + "mainProcurementCategory": "goods", + "tenderPeriod": { + "startDate": "2020-05-15T01:00:00+03:00", + "endDate": "2020-05-29T01:00:00+03:00" + }, + "title": "Комп’ютерне обладнання", + "items": [ + { + "description": "Комп’ютерне обладнання", + "classification": { + "scheme": "ДК021", + "description": "Комп’ютерне обладнанн", + "id": "30230000-0" + }, + "deliveryAddress": { + "postalCode": "79000", + "countryName": "Україна", + "streetAddress": "вул. Банкова 1", + "region": "м. Київ", + "locality": "м. Київ" + }, + "deliveryDate": { + "startDate": "2020-05-17T01:00:00+03:00", + "endDate": "2020-05-20T01:00:00+03:00" + }, + "id": "98c87e3a8f2b48fa887616989dcf8294", + "unit": { + "code": "H87", + "name": "штук" + }, + "quantity": 1.0 + } + ], + "procurementMethodType": "priceQuotation", + "value": { + "currency": "UAH", + "amount": 22000.0, + "valueAddedTaxIncluded": true + }, + "submissionMethod": "electronicAuction", + "shortlistedFirms": [ + { + "status": "active", + "scale": "large", + "name": "Товариство з обмеженою відповідальністю «Пікселі»", + "address": { + "postalCode": "01100", + "countryName": "Україна", + "streetAddress": "бул.Дружби Народів, 8", + "region": "Київська область", + "locality": "м.Київ" + }, + "contactPoint": { + "email": "contact@pixel.pix", + "telephone": "(067) 123-45-67", + "name": "Оксана Піксель" + }, + "identifier": { + "scheme": "UA-EDR", + "id": "12345678", + "legalName": "Товариство з обмеженою відповідальністю «Пікселі»" + }, + "id": "UA-EDR-12345678" + }, + { + "status": "active", + "scale": "large", + "name": "Товариство з обмеженою відповідальністю «Штекер-Пекер»", + "address": { + "postalCode": "46000", + "countryName": "Україна", + "streetAddress": "вул. Кластерна, 777-К", + "region": "Тернопільська область", + "locality": "м.Тернопіль" + }, + "contactPoint": { + "email": "info@shteker.pek", + "telephone": "(095) 123-45-67", + "name": "Олег Штекер" + }, + "identifier": { + "scheme": "UA-EDR", + "id": "87654321", + "legalName": "Товариство з обмеженою відповідальністю «Штекер-Пекер»" + }, + "id": "UA-EDR-87654321" + } + ], + "date": "2020-05-15T01:00:00+03:00", + "noticePublicationDate": "2020-05-15T01:00:00+03:00", + "profile": "655360-30230000-889652-40000777", + "procuringEntity": { + "contactPoint": { + "name": "Державне управління справами", + "telephone": "0440000000" + }, + "identifier": { + "scheme": "UA-EDR", + "id": "00037256", + "uri": "http://www.dus.gov.ua/" + }, + "name": "Державне управління справами", + "kind": "general", + "address": { + "postalCode": "01220", + "countryName": "Україна", + "streetAddress": "вул. Банкова, 11, корпус 1", + "region": "м. Київ", + "locality": "м. Київ" + } + }, + "dateModified": "2020-05-15T01:00:00+03:00", + "criteria": [ + { + "requirementGroups": [ + { + "requirements": [ + { + "dataType": "number", + "title": "Діагональ екрану", + "id": "655360-0001-001-01", + "unit": { + "code": "INH", + "name": "дюйм" + }, + "minValue": "23.8" + } + ], + "id": "655360-0001-001", + "description": "Діагональ екрану, не менше 23.8 дюймів" + } + ], + "title": "Діагональ екрану", + "description": "Діагональ екрану", + "id": "655360-0001" + }, + { + "requirementGroups": [ + { + "requirements": [ + { + "dataType": "string", + "id": "655360-0002-001-01", + "expectedValue": "1920x1080", + "title": "Роздільна здатність" + } + ], + "id": "655360-0002-001", + "description": "Роздільна здатність - 1920x1080" + } + ], + "title": "Роздільна здатність", + "description": "Роздільна здатність", + "id": "655360-0002" + }, + { + "requirementGroups": [ + { + "requirements": [ + { + "dataType": "string", + "id": "655360-0003-001-01", + "expectedValue": "16:9", + "title": "Співвідношення сторін" + } + ], + "id": "655360-0003-001", + "description": "Співвідношення сторін" + } + ], + "title": "Співвідношення сторін", + "description": "Співвідношення сторін", + "id": "655360-0003" + }, + { + "requirementGroups": [ + { + "requirements": [ + { + "dataType": "integer", + "title": "Яскравість дисплея", + "id": "655360-0004-001-01", + "unit": { + "code": "A24", + "name": "кд/м²" + }, + "minValue": "250" + } + ], + "id": "655360-0004-001", + "description": "Яскравість дисплея, не менше 250 кд/м²" + } + ], + "title": "Яскравість дисплея", + "description": "Яскравість дисплея", + "id": "655360-0004" + }, + { + "requirementGroups": [ + { + "requirements": [ + { + "dataType": "string", + "id": "655360-0005-001-01", + "expectedValue": "1000:1", + "title": "Контрастність (статична)" + } + ], + "id": "655360-0005-001", + "description": "Контрастність (статична) - 1000:1" + }, + { + "requirements": [ + { + "dataType": "string", + "id": "655360-0005-002-01", + "expectedValue": "3000:1", + "title": "Контрастність (статична)" + } + ], + "id": "655360-0005-002", + "description": "Контрастність (статична) - 3000:1" + } + ], + "title": "Контрастність (статична)", + "description": "Контрастність (статична)", + "id": "655360-0005" + }, + { + "requirementGroups": [ + { + "requirements": [ + { + "dataType": "integer", + "title": "Кількість портів HDMI", + "id": "655360-0006-001-01", + "unit": { + "code": "H87", + "name": "штук" + }, + "minValue": "1" + } + ], + "id": "655360-0006-001", + "description": "Кількість портів HDMI, не менше 1 шт." + } + ], + "title": "Кількість портів HDMI", + "description": "Кількість портів HDMI", + "id": "655360-0006" + }, + { + "requirementGroups": [ + { + "requirements": [ + { + "dataType": "integer", + "title": "Кількість портів D-sub", + "id": "655360-0007-001-01", + "unit": { + "code": "H87", + "name": "штук" + }, + "minValue": "1" + } + ], + "id": "655360-0007-001", + "description": "Кількість портів D-sub, не менше 1 шт." + } + ], + "title": "Кількість портів D-sub", + "description": "Кількість портів D-sub", + "id": "655360-0007" + }, + { + "requirementGroups": [ + { + "requirements": [ + { + "dataType": "string", + "id": "655360-0008-001-01", + "expectedValue": "HDMI", + "title": "Кабель для під’єднання" + } + ], + "id": "655360-0008-001", + "description": "Кабель для під’єднання" + } + ], + "title": "Кабель для під’єднання", + "description": "Кабель для під’єднання", + "id": "655360-0008" + }, + { + "requirementGroups": [ + { + "requirements": [ + { + "dataType": "integer", + "title": "Гарантія", + "id": "655360-0009-001-01", + "unit": { + "code": "MON", + "name": "місяців" + }, + "minValue": "36" + } + ], + "id": "655360-0009-001", + "description": "Гарантія, не менше 36 місяців" + } + ], + "title": "Гарантія", + "description": "Строк дії гарантії", + "id": "655360-0009" + } + ], + "owner": "broker", + "next_check": "2020-05-29T01:00:00+03:00", + "awardCriteria": "lowestCost", + "id": "85818863b7a4458ea02e3893422b0a0d", + "tenderID": "UA-2020-05-15-000001" + } +} + diff --git a/docs/source/tendering/pricequotation/http/tender-after-bot-unsuccessful.http b/docs/source/tendering/pricequotation/http/tender-after-bot-unsuccessful.http new file mode 100644 index 0000000000..42d8e0772d --- /dev/null +++ b/docs/source/tendering/pricequotation/http/tender-after-bot-unsuccessful.http @@ -0,0 +1,71 @@ +GET /api/2.5/tenders/9f074f27f5b0449ea59ea1d3dcfed213 HTTP/1.0 +Authorization: Bearer broker +Host: lb-api-sandbox.prozorro.gov.ua + +Response: 200 OK +Content-Type: application/json; charset=UTF-8 +{ + "data": { + "status": "draft.unsuccessful", + "procurementMethod": "selective", + "mainProcurementCategory": "goods", + "tenderPeriod": { + "startDate": "2020-05-15T01:00:00+03:00", + "endDate": "2020-05-29T01:00:00+03:00" + }, + "title": "Комп’ютерне обладнання", + "items": [ + { + "deliveryDate": { + "startDate": "2020-05-17T01:00:00+03:00", + "endDate": "2020-05-20T01:00:00+03:00" + }, + "description": "Комп’ютерне обладнання", + "quantity": 1.0, + "id": "f53b4d306e894de89aa04e436072a0e7", + "deliveryAddress": { + "postalCode": "79000", + "countryName": "Україна", + "streetAddress": "вул. Банкова 1", + "region": "м. Київ", + "locality": "м. Київ" + } + } + ], + "procurementMethodType": "priceQuotation", + "value": { + "currency": "UAH", + "amount": 22000.0, + "valueAddedTaxIncluded": true + }, + "submissionMethod": "electronicAuction", + "date": "2020-05-15T01:00:00+03:00", + "profile": "655360-30230000-889652-40000777bad_profile", + "procuringEntity": { + "contactPoint": { + "name": "Державне управління справами", + "telephone": "0440000000" + }, + "identifier": { + "scheme": "UA-EDR", + "id": "00037256", + "uri": "http://www.dus.gov.ua/" + }, + "name": "Державне управління справами", + "kind": "general", + "address": { + "postalCode": "01220", + "countryName": "Україна", + "streetAddress": "вул. Банкова, 11, корпус 1", + "region": "м. Київ", + "locality": "м. Київ" + } + }, + "awardCriteria": "lowestCost", + "owner": "broker", + "dateModified": "2020-05-15T01:00:00+03:00", + "id": "9f074f27f5b0449ea59ea1d3dcfed213", + "tenderID": "UA-2020-05-15-000002" + } +} + diff --git a/docs/source/tendering/pricequotation/http/tender-contract-get-contract-value.http b/docs/source/tendering/pricequotation/http/tender-contract-get-contract-value.http new file mode 100644 index 0000000000..d04cd826e6 --- /dev/null +++ b/docs/source/tendering/pricequotation/http/tender-contract-get-contract-value.http @@ -0,0 +1,71 @@ +GET /api/2.5/tenders/db4fb6143a5f45b6953e8f010ed8064e/contracts/0def0972e7a648cdbbb29a291331f1f2 HTTP/1.0 +Authorization: Bearer broker +Host: lb-api-sandbox.prozorro.gov.ua + +Response: 200 OK +Content-Type: application/json; charset=UTF-8 +{ + "data": { + "status": "pending", + "items": [ + { + "description": "Комп’ютерне обладнання", + "classification": { + "scheme": "ДК021", + "description": "Комп’ютерне обладнанн", + "id": "30230000-0" + }, + "deliveryAddress": { + "postalCode": "79000", + "countryName": "Україна", + "streetAddress": "вул. Банкова 1", + "region": "м. Київ", + "locality": "м. Київ" + }, + "deliveryDate": { + "startDate": "2020-05-17T01:00:00+03:00", + "endDate": "2020-05-20T01:00:00+03:00" + }, + "id": "1f2cf1221e8f42f7af3cce0e941e14b5", + "unit": { + "code": "H87", + "name": "штук" + }, + "quantity": 1.0 + } + ], + "suppliers": [ + { + "contactPoint": { + "name": "Державне управління справами", + "telephone": "0440000000" + }, + "scale": "micro", + "name": "Державне управління справами", + "identifier": { + "scheme": "UA-EDR", + "id": "00037256", + "uri": "http://www.dus.gov.ua/" + }, + "address": { + "postalCode": "01220", + "countryName": "Україна", + "streetAddress": "вул. Банкова, 11, корпус 1", + "region": "м. Київ", + "locality": "м. Київ" + } + } + ], + "value": { + "currency": "UAH", + "amount": 479.0, + "amountNet": 479.0, + "valueAddedTaxIncluded": true + }, + "date": "2020-05-15T01:00:01+03:00", + "awardID": "e9d20fa47d934470b845028e492a8945", + "id": "0def0972e7a648cdbbb29a291331f1f2", + "contractID": "UA-2020-05-15-000001-2" + } +} + diff --git a/docs/source/tendering/pricequotation/http/tender-contract-get-documents-again.http b/docs/source/tendering/pricequotation/http/tender-contract-get-documents-again.http new file mode 100644 index 0000000000..9d09357625 --- /dev/null +++ b/docs/source/tendering/pricequotation/http/tender-contract-get-documents-again.http @@ -0,0 +1,31 @@ +GET /api/2.5/tenders/db4fb6143a5f45b6953e8f010ed8064e/contracts/0def0972e7a648cdbbb29a291331f1f2/documents HTTP/1.0 +Authorization: Bearer broker +Host: lb-api-sandbox.prozorro.gov.ua + +Response: 200 OK +Content-Type: application/json; charset=UTF-8 +{ + "data": [ + { + "hash": "md5:00000000000000000000000000000000", + "title": "contract_first_document.doc", + "url": "http://public-docs-sandbox.prozorro.gov.ua/get/ae8aa265abc14f87ac488057a2223e5b?KeyID=a8968c46&Signature=LBhaXoX3LRxqDOt6Be3hhvgc62NkQiRA%252BM%252BhqEGj25CYSEWbHWJKeXv4KX8KZwMxBF1ntynCOnQ%2F%252BQ0XeeqTDA%253D%253D", + "format": "application/msword", + "documentOf": "tender", + "datePublished": "2020-05-15T01:00:03+03:00", + "id": "26a79e8ffd684b638b28e472efd912b2", + "dateModified": "2020-05-15T01:00:03+03:00" + }, + { + "hash": "md5:00000000000000000000000000000000", + "title": "contract_second_document.doc", + "url": "http://public-docs-sandbox.prozorro.gov.ua/get/0897ce4ba17b4ea2a43e11565ebc9bbe?KeyID=a8968c46&Signature=SWZWDphzyXVrcz%252Be%2FfXgHcekUsqHQvSQSWMu%252BmH0Lwznt8ENExLjHT8UNrijpUFjkjMnFXcOB9IBuQ4WOtoDBw%253D%253D", + "format": "application/msword", + "documentOf": "tender", + "datePublished": "2020-05-15T01:00:03+03:00", + "id": "f940e358b1814ad7b2c1ba6ad6485656", + "dateModified": "2020-05-15T01:00:03+03:00" + } + ] +} + diff --git a/docs/source/tendering/pricequotation/http/tender-contract-get-documents.http b/docs/source/tendering/pricequotation/http/tender-contract-get-documents.http new file mode 100644 index 0000000000..c0ac84b5cb --- /dev/null +++ b/docs/source/tendering/pricequotation/http/tender-contract-get-documents.http @@ -0,0 +1,21 @@ +GET /api/2.5/tenders/db4fb6143a5f45b6953e8f010ed8064e/contracts/0def0972e7a648cdbbb29a291331f1f2/documents HTTP/1.0 +Authorization: Bearer broker +Host: lb-api-sandbox.prozorro.gov.ua + +Response: 200 OK +Content-Type: application/json; charset=UTF-8 +{ + "data": [ + { + "hash": "md5:00000000000000000000000000000000", + "title": "contract_first_document.doc", + "url": "http://public-docs-sandbox.prozorro.gov.ua/get/ae8aa265abc14f87ac488057a2223e5b?KeyID=a8968c46&Signature=LBhaXoX3LRxqDOt6Be3hhvgc62NkQiRA%252BM%252BhqEGj25CYSEWbHWJKeXv4KX8KZwMxBF1ntynCOnQ%2F%252BQ0XeeqTDA%253D%253D", + "format": "application/msword", + "documentOf": "tender", + "datePublished": "2020-05-15T01:00:03+03:00", + "id": "26a79e8ffd684b638b28e472efd912b2", + "dateModified": "2020-05-15T01:00:03+03:00" + } + ] +} + diff --git a/docs/source/tendering/pricequotation/http/tender-contract-period.http b/docs/source/tendering/pricequotation/http/tender-contract-period.http new file mode 100644 index 0000000000..ea7e15f714 --- /dev/null +++ b/docs/source/tendering/pricequotation/http/tender-contract-period.http @@ -0,0 +1,88 @@ +PATCH /api/2.5/tenders/db4fb6143a5f45b6953e8f010ed8064e/contracts/0def0972e7a648cdbbb29a291331f1f2?acc_token=151a30932ee245e989771be867bc8235 HTTP/1.0 +Authorization: Bearer broker +Content-Length: 104 +Content-Type: application/json +Host: lb-api-sandbox.prozorro.gov.ua +DATA: +{ + "data": { + "period": { + "startDate": "2020-05-15T01:00:03+03:00", + "endDate": "2021-05-15T01:00:03+03:00" + } + } +} + +Response: 200 OK +Content-Type: application/json; charset=UTF-8 +{ + "data": { + "status": "pending", + "items": [ + { + "description": "Комп’ютерне обладнання", + "classification": { + "scheme": "ДК021", + "description": "Комп’ютерне обладнанн", + "id": "30230000-0" + }, + "deliveryAddress": { + "postalCode": "79000", + "countryName": "Україна", + "streetAddress": "вул. Банкова 1", + "region": "м. Київ", + "locality": "м. Київ" + }, + "deliveryDate": { + "startDate": "2020-05-17T01:00:00+03:00", + "endDate": "2020-05-20T01:00:00+03:00" + }, + "id": "1f2cf1221e8f42f7af3cce0e941e14b5", + "unit": { + "code": "H87", + "name": "штук" + }, + "quantity": 1.0 + } + ], + "suppliers": [ + { + "contactPoint": { + "name": "Державне управління справами", + "telephone": "0440000000" + }, + "scale": "micro", + "name": "Державне управління справами", + "identifier": { + "scheme": "UA-EDR", + "id": "00037256", + "uri": "http://www.dus.gov.ua/" + }, + "address": { + "postalCode": "01220", + "countryName": "Україна", + "streetAddress": "вул. Банкова, 11, корпус 1", + "region": "м. Київ", + "locality": "м. Київ" + } + } + ], + "contractNumber": "contract #13111", + "period": { + "startDate": "2020-05-15T01:00:03+03:00", + "endDate": "2021-05-15T01:00:03+03:00" + }, + "dateSigned": "2020-05-15T01:00:03+03:00", + "value": { + "currency": "UAH", + "amount": 238.0, + "amountNet": 230.0, + "valueAddedTaxIncluded": true + }, + "date": "2020-05-15T01:00:01+03:00", + "awardID": "e9d20fa47d934470b845028e492a8945", + "id": "0def0972e7a648cdbbb29a291331f1f2", + "contractID": "UA-2020-05-15-000001-2" + } +} + diff --git a/docs/source/tendering/pricequotation/http/tender-contract-set-contract-value.http b/docs/source/tendering/pricequotation/http/tender-contract-set-contract-value.http new file mode 100644 index 0000000000..655e339a7d --- /dev/null +++ b/docs/source/tendering/pricequotation/http/tender-contract-set-contract-value.http @@ -0,0 +1,84 @@ +PATCH /api/2.5/tenders/db4fb6143a5f45b6953e8f010ed8064e/contracts/0def0972e7a648cdbbb29a291331f1f2?acc_token=151a30932ee245e989771be867bc8235 HTTP/1.0 +Authorization: Bearer broker +Content-Length: 91 +Content-Type: application/json +Host: lb-api-sandbox.prozorro.gov.ua +DATA: +{ + "data": { + "contractNumber": "contract #13111", + "value": { + "amount": 238, + "amountNet": 230 + } + } +} + +Response: 200 OK +Content-Type: application/json; charset=UTF-8 +{ + "data": { + "status": "pending", + "items": [ + { + "description": "Комп’ютерне обладнання", + "classification": { + "scheme": "ДК021", + "description": "Комп’ютерне обладнанн", + "id": "30230000-0" + }, + "deliveryAddress": { + "postalCode": "79000", + "countryName": "Україна", + "streetAddress": "вул. Банкова 1", + "region": "м. Київ", + "locality": "м. Київ" + }, + "deliveryDate": { + "startDate": "2020-05-17T01:00:00+03:00", + "endDate": "2020-05-20T01:00:00+03:00" + }, + "id": "1f2cf1221e8f42f7af3cce0e941e14b5", + "unit": { + "code": "H87", + "name": "штук" + }, + "quantity": 1.0 + } + ], + "suppliers": [ + { + "contactPoint": { + "name": "Державне управління справами", + "telephone": "0440000000" + }, + "scale": "micro", + "name": "Державне управління справами", + "identifier": { + "scheme": "UA-EDR", + "id": "00037256", + "uri": "http://www.dus.gov.ua/" + }, + "address": { + "postalCode": "01220", + "countryName": "Україна", + "streetAddress": "вул. Банкова, 11, корпус 1", + "region": "м. Київ", + "locality": "м. Київ" + } + } + ], + "contractNumber": "contract #13111", + "value": { + "currency": "UAH", + "amount": 238.0, + "amountNet": 230.0, + "valueAddedTaxIncluded": true + }, + "date": "2020-05-15T01:00:01+03:00", + "awardID": "e9d20fa47d934470b845028e492a8945", + "id": "0def0972e7a648cdbbb29a291331f1f2", + "contractID": "UA-2020-05-15-000001-2" + } +} + diff --git a/docs/source/tendering/pricequotation/http/tender-contract-sign-date.http b/docs/source/tendering/pricequotation/http/tender-contract-sign-date.http new file mode 100644 index 0000000000..cf39c07c8b --- /dev/null +++ b/docs/source/tendering/pricequotation/http/tender-contract-sign-date.http @@ -0,0 +1,16 @@ +PATCH /api/2.5/tenders/db4fb6143a5f45b6953e8f010ed8064e/contracts/0def0972e7a648cdbbb29a291331f1f2?acc_token=151a30932ee245e989771be867bc8235 HTTP/1.0 +Authorization: Bearer broker +Content-Length: 53 +Content-Type: application/json +Host: lb-api-sandbox.prozorro.gov.ua +DATA: +{ + "data": { + "dateSigned": "2020-05-15T01:00:03+03:00" + } +} + +Response: 200 OK +Content-Type: application/json; charset=UTF-8 +null + diff --git a/docs/source/tendering/pricequotation/http/tender-contract-sign.http b/docs/source/tendering/pricequotation/http/tender-contract-sign.http new file mode 100644 index 0000000000..c05399d5b3 --- /dev/null +++ b/docs/source/tendering/pricequotation/http/tender-contract-sign.http @@ -0,0 +1,107 @@ +PATCH /api/2.5/tenders/db4fb6143a5f45b6953e8f010ed8064e/contracts/0def0972e7a648cdbbb29a291331f1f2?acc_token=151a30932ee245e989771be867bc8235 HTTP/1.0 +Authorization: Bearer broker +Content-Length: 30 +Content-Type: application/json +Host: lb-api-sandbox.prozorro.gov.ua +DATA: +{ + "data": { + "status": "active" + } +} + +Response: 200 OK +Content-Type: application/json; charset=UTF-8 +{ + "data": { + "status": "active", + "documents": [ + { + "hash": "md5:00000000000000000000000000000000", + "title": "contract_first_document.doc", + "url": "http://public-docs-sandbox.prozorro.gov.ua/get/ae8aa265abc14f87ac488057a2223e5b?KeyID=a8968c46&Signature=LBhaXoX3LRxqDOt6Be3hhvgc62NkQiRA%252BM%252BhqEGj25CYSEWbHWJKeXv4KX8KZwMxBF1ntynCOnQ%2F%252BQ0XeeqTDA%253D%253D", + "format": "application/msword", + "documentOf": "tender", + "datePublished": "2020-05-15T01:00:03+03:00", + "id": "26a79e8ffd684b638b28e472efd912b2", + "dateModified": "2020-05-15T01:00:03+03:00" + }, + { + "hash": "md5:00000000000000000000000000000000", + "title": "contract_second_document.doc", + "url": "http://public-docs-sandbox.prozorro.gov.ua/get/0897ce4ba17b4ea2a43e11565ebc9bbe?KeyID=a8968c46&Signature=SWZWDphzyXVrcz%252Be%2FfXgHcekUsqHQvSQSWMu%252BmH0Lwznt8ENExLjHT8UNrijpUFjkjMnFXcOB9IBuQ4WOtoDBw%253D%253D", + "format": "application/msword", + "documentOf": "tender", + "datePublished": "2020-05-15T01:00:03+03:00", + "id": "f940e358b1814ad7b2c1ba6ad6485656", + "dateModified": "2020-05-15T01:00:03+03:00" + } + ], + "items": [ + { + "description": "Комп’ютерне обладнання", + "classification": { + "scheme": "ДК021", + "description": "Комп’ютерне обладнанн", + "id": "30230000-0" + }, + "deliveryAddress": { + "postalCode": "79000", + "countryName": "Україна", + "streetAddress": "вул. Банкова 1", + "region": "м. Київ", + "locality": "м. Київ" + }, + "deliveryDate": { + "startDate": "2020-05-17T01:00:00+03:00", + "endDate": "2020-05-20T01:00:00+03:00" + }, + "id": "1f2cf1221e8f42f7af3cce0e941e14b5", + "unit": { + "code": "H87", + "name": "штук" + }, + "quantity": 1.0 + } + ], + "suppliers": [ + { + "contactPoint": { + "name": "Державне управління справами", + "telephone": "0440000000" + }, + "scale": "micro", + "name": "Державне управління справами", + "identifier": { + "scheme": "UA-EDR", + "id": "00037256", + "uri": "http://www.dus.gov.ua/" + }, + "address": { + "postalCode": "01220", + "countryName": "Україна", + "streetAddress": "вул. Банкова, 11, корпус 1", + "region": "м. Київ", + "locality": "м. Київ" + } + } + ], + "contractNumber": "contract #13111", + "period": { + "startDate": "2020-05-15T01:00:03+03:00", + "endDate": "2021-05-15T01:00:03+03:00" + }, + "dateSigned": "2020-05-15T01:00:03+03:00", + "value": { + "currency": "UAH", + "amount": 238.0, + "amountNet": 230.0, + "valueAddedTaxIncluded": true + }, + "date": "2020-05-15T01:00:03+03:00", + "awardID": "e9d20fa47d934470b845028e492a8945", + "id": "0def0972e7a648cdbbb29a291331f1f2", + "contractID": "UA-2020-05-15-000001-2" + } +} + diff --git a/docs/source/tendering/pricequotation/http/tender-contract-upload-document.http b/docs/source/tendering/pricequotation/http/tender-contract-upload-document.http new file mode 100644 index 0000000000..f9c8eec20e --- /dev/null +++ b/docs/source/tendering/pricequotation/http/tender-contract-upload-document.http @@ -0,0 +1,31 @@ +POST /api/2.5/tenders/db4fb6143a5f45b6953e8f010ed8064e/contracts/0def0972e7a648cdbbb29a291331f1f2/documents?acc_token=151a30932ee245e989771be867bc8235 HTTP/1.0 +Authorization: Bearer broker +Content-Length: 342 +Content-Type: application/json +Host: lb-api-sandbox.prozorro.gov.ua +DATA: +{ + "data": { + "url": "http://public-docs-sandbox.prozorro.gov.ua/get/ae8aa265abc14f87ac488057a2223e5b?KeyID=a8968c46&Signature=eFkiREyzyPgkHkp7Qff7tuXSMR8P1JOUNbcp9f03507801z5hCqTTSkGJMg2624n8deKlrf1J6PGS%2BpcV0%2FYAg%3D%3D", + "title": "contract_first_document.doc", + "hash": "md5:00000000000000000000000000000000", + "format": "application/msword" + } +} + +Response: 201 Created +Content-Type: application/json; charset=UTF-8 +Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/db4fb6143a5f45b6953e8f010ed8064e/contracts/0def0972e7a648cdbbb29a291331f1f2/documents/26a79e8ffd684b638b28e472efd912b2 +{ + "data": { + "hash": "md5:00000000000000000000000000000000", + "title": "contract_first_document.doc", + "url": "http://public-docs-sandbox.prozorro.gov.ua/get/ae8aa265abc14f87ac488057a2223e5b?KeyID=a8968c46&Signature=LBhaXoX3LRxqDOt6Be3hhvgc62NkQiRA%252BM%252BhqEGj25CYSEWbHWJKeXv4KX8KZwMxBF1ntynCOnQ%2F%252BQ0XeeqTDA%253D%253D", + "format": "application/msword", + "documentOf": "tender", + "datePublished": "2020-05-15T01:00:03+03:00", + "id": "26a79e8ffd684b638b28e472efd912b2", + "dateModified": "2020-05-15T01:00:03+03:00" + } +} + diff --git a/docs/source/tendering/pricequotation/http/tender-contract-upload-second-document.http b/docs/source/tendering/pricequotation/http/tender-contract-upload-second-document.http new file mode 100644 index 0000000000..b0be214d1f --- /dev/null +++ b/docs/source/tendering/pricequotation/http/tender-contract-upload-second-document.http @@ -0,0 +1,31 @@ +POST /api/2.5/tenders/db4fb6143a5f45b6953e8f010ed8064e/contracts/0def0972e7a648cdbbb29a291331f1f2/documents?acc_token=151a30932ee245e989771be867bc8235 HTTP/1.0 +Authorization: Bearer broker +Content-Length: 357 +Content-Type: application/json +Host: lb-api-sandbox.prozorro.gov.ua +DATA: +{ + "data": { + "url": "http://public-docs-sandbox.prozorro.gov.ua/get/0897ce4ba17b4ea2a43e11565ebc9bbe?KeyID=a8968c46&Signature=jMzDzj0GB%2BrkA1P%2F%2BvZ2NSBygX1oNAl%2Bvl6J%2FUTRc3a0zB%2FKAD0fRdd1ca5bK%2B6j0V3AI%2FlwrvpWvQkWFGK%2FBg%3D%3D", + "title": "contract_second_document.doc", + "hash": "md5:00000000000000000000000000000000", + "format": "application/msword" + } +} + +Response: 201 Created +Content-Type: application/json; charset=UTF-8 +Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/db4fb6143a5f45b6953e8f010ed8064e/contracts/0def0972e7a648cdbbb29a291331f1f2/documents/f940e358b1814ad7b2c1ba6ad6485656 +{ + "data": { + "hash": "md5:00000000000000000000000000000000", + "title": "contract_second_document.doc", + "url": "http://public-docs-sandbox.prozorro.gov.ua/get/0897ce4ba17b4ea2a43e11565ebc9bbe?KeyID=a8968c46&Signature=SWZWDphzyXVrcz%252Be%2FfXgHcekUsqHQvSQSWMu%252BmH0Lwznt8ENExLjHT8UNrijpUFjkjMnFXcOB9IBuQ4WOtoDBw%253D%253D", + "format": "application/msword", + "documentOf": "tender", + "datePublished": "2020-05-15T01:00:03+03:00", + "id": "f940e358b1814ad7b2c1ba6ad6485656", + "dateModified": "2020-05-15T01:00:03+03:00" + } +} + diff --git a/docs/source/tendering/pricequotation/http/tender-listing-after-creation.http b/docs/source/tendering/pricequotation/http/tender-listing-after-creation.http new file mode 100644 index 0000000000..a5d2567b5e --- /dev/null +++ b/docs/source/tendering/pricequotation/http/tender-listing-after-creation.http @@ -0,0 +1,15 @@ +GET /api/2.5/tenders HTTP/1.0 +Authorization: Bearer broker +Host: lb-api-sandbox.prozorro.gov.ua + +Response: 200 OK +Content-Type: application/json; charset=UTF-8 +{ + "next_page": { + "path": "/api/2.5/tenders?offset=", + "uri": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders?offset=", + "offset": "" + }, + "data": [] +} + diff --git a/docs/source/tendering/pricequotation/http/tender-listing-after-patch.http b/docs/source/tendering/pricequotation/http/tender-listing-after-patch.http new file mode 100644 index 0000000000..0302f8ef5e --- /dev/null +++ b/docs/source/tendering/pricequotation/http/tender-listing-after-patch.http @@ -0,0 +1,19 @@ +GET /api/2.5/tenders?opt_pretty=1 HTTP/1.0 +Host: lb-api-sandbox.prozorro.gov.ua + +Response: 200 OK +Content-Type: application/json; charset=UTF-8 +{ + "next_page": { + "path": "/api/2.5/tenders?offset=2020-05-15T01%3A00%3A01%2B03%3A00", + "uri": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders?offset=2020-05-15T01%3A00%3A01%2B03%3A00", + "offset": "2020-05-15T01:00:01+03:00" + }, + "data": [ + { + "id": "db4fb6143a5f45b6953e8f010ed8064e", + "dateModified": "2020-05-15T01:00:01+03:00" + } + ] +} + diff --git a/docs/source/tendering/pricequotation/http/tender-post-attempt-json-data.http b/docs/source/tendering/pricequotation/http/tender-post-attempt-json-data.http new file mode 100644 index 0000000000..fde2e5568b --- /dev/null +++ b/docs/source/tendering/pricequotation/http/tender-post-attempt-json-data.http @@ -0,0 +1,132 @@ +POST /api/2.5/tenders?opt_pretty=1 HTTP/1.0 +Authorization: Bearer broker +Content-Length: 1802 +Content-Type: application/json +Host: lb-api-sandbox.prozorro.gov.ua +DATA: +{ + "data": { + "profile": "655360-30230000-889652-40000777", + "procurementMethod": "selective", + "mainProcurementCategory": "goods", + "tenderPeriod": { + "endDate": "2020-05-29T01:00:00+03:00" + }, + "title": "Комп’ютерне обладнання", + "items": [ + { + "deliveryDate": { + "startDate": "2020-05-17T01:00:00+03:00", + "endDate": "2020-05-20T01:00:00+03:00" + }, + "quantity": 1, + "description": "Комп’ютерне обладнання", + "deliveryAddress": { + "countryName": "Україна", + "postalCode": "79000", + "region": "м. Київ", + "streetAddress": "вул. Банкова 1", + "locality": "м. Київ" + } + } + ], + "procurementMethodType": "priceQuotation", + "value": { + "currency": "UAH", + "amount": 22000 + }, + "procuringEntity": { + "contactPoint": { + "name": "Державне управління справами", + "telephone": "0440000000" + }, + "identifier": { + "scheme": "UA-EDR", + "id": "00037256", + "uri": "http://www.dus.gov.ua/" + }, + "name": "Державне управління справами", + "kind": "general", + "address": { + "countryName": "Україна", + "postalCode": "01220", + "region": "м. Київ", + "streetAddress": "вул. Банкова, 11, корпус 1", + "locality": "м. Київ" + } + } + } +} + +Response: 201 Created +Content-Type: application/json; charset=UTF-8 +Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/db4fb6143a5f45b6953e8f010ed8064e +{ + "access": { + "transfer": "05c426dc625446f283427e553ae04763", + "token": "151a30932ee245e989771be867bc8235" + }, + "data": { + "status": "draft", + "procurementMethod": "selective", + "mainProcurementCategory": "goods", + "tenderPeriod": { + "startDate": "2020-05-15T01:00:00+03:00", + "endDate": "2020-05-29T01:00:00+03:00" + }, + "title": "Комп’ютерне обладнання", + "items": [ + { + "deliveryDate": { + "startDate": "2020-05-17T01:00:00+03:00", + "endDate": "2020-05-20T01:00:00+03:00" + }, + "description": "Комп’ютерне обладнання", + "quantity": 1.0, + "id": "1f2cf1221e8f42f7af3cce0e941e14b5", + "deliveryAddress": { + "postalCode": "79000", + "countryName": "Україна", + "streetAddress": "вул. Банкова 1", + "region": "м. Київ", + "locality": "м. Київ" + } + } + ], + "procurementMethodType": "priceQuotation", + "value": { + "currency": "UAH", + "amount": 22000.0, + "valueAddedTaxIncluded": true + }, + "submissionMethod": "electronicAuction", + "date": "2020-05-15T01:00:00+03:00", + "profile": "655360-30230000-889652-40000777", + "procuringEntity": { + "contactPoint": { + "name": "Державне управління справами", + "telephone": "0440000000" + }, + "identifier": { + "scheme": "UA-EDR", + "id": "00037256", + "uri": "http://www.dus.gov.ua/" + }, + "name": "Державне управління справами", + "kind": "general", + "address": { + "postalCode": "01220", + "countryName": "Україна", + "streetAddress": "вул. Банкова, 11, корпус 1", + "region": "м. Київ", + "locality": "м. Київ" + } + }, + "awardCriteria": "lowestCost", + "owner": "broker", + "dateModified": "2020-05-15T01:00:00+03:00", + "id": "db4fb6143a5f45b6953e8f010ed8064e", + "tenderID": "UA-2020-05-15-000001" + } +} + diff --git a/docs/source/tendering/pricequotation/http/tender-post-attempt-json.http b/docs/source/tendering/pricequotation/http/tender-post-attempt-json.http new file mode 100644 index 0000000000..ce2f626d6a --- /dev/null +++ b/docs/source/tendering/pricequotation/http/tender-post-attempt-json.http @@ -0,0 +1,21 @@ +POST /api/2.5/tenders?opt_pretty=1 HTTP/1.0 +Authorization: Bearer broker +Content-Length: 4 +Content-Type: application/json +Host: lb-api-sandbox.prozorro.gov.ua +DATA: +data + +Response: 422 Unprocessable Entity +Content-Type: application/json; charset=UTF-8 +{ + "status": "error", + "errors": [ + { + "description": "No JSON object could be decoded", + "location": "body", + "name": "data" + } + ] +} + diff --git a/docs/source/tendering/pricequotation/http/tender-post-attempt.http b/docs/source/tendering/pricequotation/http/tender-post-attempt.http new file mode 100644 index 0000000000..ecb8be2c7f --- /dev/null +++ b/docs/source/tendering/pricequotation/http/tender-post-attempt.http @@ -0,0 +1,21 @@ +POST /api/2.5/tenders?opt_pretty=1 HTTP/1.0 +Authorization: Bearer broker +Content-Length: 4 +Content-Type: application/x-www-form-urlencoded +Host: lb-api-sandbox.prozorro.gov.ua +DATA: +data + +Response: 415 Unsupported Media Type +Content-Type: application/json; charset=UTF-8 +{ + "status": "error", + "errors": [ + { + "description": "Content-Type header should be one of ['application/json']", + "location": "header", + "name": "Content-Type" + } + ] +} + diff --git a/docs/source/tendering/pricequotation/http/update-cancellation-doc.http b/docs/source/tendering/pricequotation/http/update-cancellation-doc.http new file mode 100644 index 0000000000..7a9dc7f569 --- /dev/null +++ b/docs/source/tendering/pricequotation/http/update-cancellation-doc.http @@ -0,0 +1,31 @@ +PUT /api/2.5/tenders/db4fb6143a5f45b6953e8f010ed8064e/cancellations/56410c1c084d442fa6b1fdde4b1b98e1/documents/67374954e7b846c591d642d35daf5292?acc_token=151a30932ee245e989771be867bc8235 HTTP/1.0 +Authorization: Bearer broker +Content-Length: 326 +Content-Type: application/json +Host: lb-api-sandbox.prozorro.gov.ua +DATA: +{ + "data": { + "url": "http://public-docs-sandbox.prozorro.gov.ua/get/63db88a0b4614dae9f611d03620daf1e?KeyID=a8968c46&Signature=tGgz0Qg6BDkREmuIiVDQqIVLTxfnWrTCnUi3YM6TZQmgEBNmNrvkvODKBfll8KotoI%2B5fMFizVH%2BO%2FSt9hmJBg%3D%3D", + "title": "Notice-2.pdf", + "hash": "md5:00000000000000000000000000000000", + "format": "application/pdf" + } +} + +Response: 200 OK +Content-Type: application/json; charset=UTF-8 +{ + "data": { + "hash": "md5:00000000000000000000000000000000", + "description": "Changed description", + "title": "Notice-2.pdf", + "url": "http://public-docs-sandbox.prozorro.gov.ua/get/63db88a0b4614dae9f611d03620daf1e?KeyID=a8968c46&Signature=0qyfbRdug5WQ32d0Ov%2F1Nqz0INT0%252B8QcUTRhRPX9Z1P%2F0GAZBRLGalDi1oZhrDaBwfGuOEUDSH7njA5uPDVaBQ%253D%253D", + "format": "application/pdf", + "documentOf": "tender", + "datePublished": "2020-05-15T01:00:03+03:00", + "id": "67374954e7b846c591d642d35daf5292", + "dateModified": "2020-05-15T01:00:03+03:00" + } +} + diff --git a/docs/source/tendering/pricequotation/http/update-cancellation-reasonType.http b/docs/source/tendering/pricequotation/http/update-cancellation-reasonType.http new file mode 100644 index 0000000000..558e7f79f9 --- /dev/null +++ b/docs/source/tendering/pricequotation/http/update-cancellation-reasonType.http @@ -0,0 +1,25 @@ +PATCH /api/2.5/tenders/db4fb6143a5f45b6953e8f010ed8064e/cancellations/56410c1c084d442fa6b1fdde4b1b98e1?acc_token=151a30932ee245e989771be867bc8235 HTTP/1.0 +Authorization: Bearer broker +Content-Length: 39 +Content-Type: application/json +Host: lb-api-sandbox.prozorro.gov.ua +DATA: +{ + "data": { + "reasonType": "expensesCut" + } +} + +Response: 200 OK +Content-Type: application/json; charset=UTF-8 +{ + "data": { + "status": "draft", + "reason": "cancellation reason", + "reasonType": "expensesCut", + "date": "2020-05-15T01:00:03+03:00", + "cancellationOf": "tender", + "id": "56410c1c084d442fa6b1fdde4b1b98e1" + } +} + diff --git a/docs/source/tendering/pricequotation/http/upload-bid-proposal.http b/docs/source/tendering/pricequotation/http/upload-bid-proposal.http new file mode 100644 index 0000000000..31ebcd3a5e --- /dev/null +++ b/docs/source/tendering/pricequotation/http/upload-bid-proposal.http @@ -0,0 +1,31 @@ +POST /api/2.5/tenders/db4fb6143a5f45b6953e8f010ed8064e/bids/8cfbfea1a5d6465292985704865c464d/documents?acc_token=00e173e5f31f4decbb811cc01e10c1bf HTTP/1.0 +Authorization: Bearer broker +Content-Length: 332 +Content-Type: application/json +Host: lb-api-sandbox.prozorro.gov.ua +DATA: +{ + "data": { + "url": "http://public-docs-sandbox.prozorro.gov.ua/get/05b0d65cf15d46708161e6e0921e5c0b?KeyID=a8968c46&Signature=Y%2Bf0%2BVsMquCt%2BkfDMNLnGMPfK78igo2LyXu2CJfWNiSY52flcipPzRCXtLq%2FoVscEz5HnveeYJgtF%2FEC%2BCQcBA%3D%3D", + "title": "Proposal.pdf", + "hash": "md5:00000000000000000000000000000000", + "format": "application/pdf" + } +} + +Response: 201 Created +Content-Type: application/json; charset=UTF-8 +Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/db4fb6143a5f45b6953e8f010ed8064e/bids/8cfbfea1a5d6465292985704865c464d/documents/b0ddfe8372884b30a09d84e52605f52c +{ + "data": { + "hash": "md5:00000000000000000000000000000000", + "title": "Proposal.pdf", + "url": "http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/db4fb6143a5f45b6953e8f010ed8064e/bids/8cfbfea1a5d6465292985704865c464d/documents/b0ddfe8372884b30a09d84e52605f52c?download=05b0d65cf15d46708161e6e0921e5c0b", + "format": "application/pdf", + "documentOf": "tender", + "datePublished": "2020-05-15T01:00:01+03:00", + "id": "b0ddfe8372884b30a09d84e52605f52c", + "dateModified": "2020-05-15T01:00:01+03:00" + } +} + diff --git a/docs/source/tendering/pricequotation/http/upload-cancellation-doc.http b/docs/source/tendering/pricequotation/http/upload-cancellation-doc.http new file mode 100644 index 0000000000..9481ad4f37 --- /dev/null +++ b/docs/source/tendering/pricequotation/http/upload-cancellation-doc.http @@ -0,0 +1,31 @@ +POST /api/2.5/tenders/db4fb6143a5f45b6953e8f010ed8064e/cancellations/56410c1c084d442fa6b1fdde4b1b98e1/documents?acc_token=151a30932ee245e989771be867bc8235 HTTP/1.0 +Authorization: Bearer broker +Content-Length: 326 +Content-Type: application/json +Host: lb-api-sandbox.prozorro.gov.ua +DATA: +{ + "data": { + "url": "http://public-docs-sandbox.prozorro.gov.ua/get/aebc299ad870466a91ce3230275118b6?KeyID=a8968c46&Signature=Wv0gawHdoxIebBZaeRu8JbrShz1mlu%2FCuT%2BJwr8C%2BL91nZY2VtdLAR7QvtcXEDi6%2FGEbZV1GVe3s0iOIeNKqCg%3D%3D", + "title": "Notice.pdf", + "hash": "md5:00000000000000000000000000000000", + "format": "application/pdf" + } +} + +Response: 201 Created +Content-Type: application/json; charset=UTF-8 +Location: http://lb-api-sandbox.prozorro.gov.ua/api/2.5/tenders/db4fb6143a5f45b6953e8f010ed8064e/cancellations/56410c1c084d442fa6b1fdde4b1b98e1/documents/67374954e7b846c591d642d35daf5292 +{ + "data": { + "hash": "md5:00000000000000000000000000000000", + "title": "Notice.pdf", + "url": "http://public-docs-sandbox.prozorro.gov.ua/get/aebc299ad870466a91ce3230275118b6?KeyID=a8968c46&Signature=0eUpqCYHHDqUNd2kPnfqyePCREF%2F3QeUd2%2FI1QM%252BkBW3HTNspZ%2FQz%2FcJ4diqGu729zqt8TQwJENttgIxrtOaCQ%253D%253D", + "format": "application/pdf", + "documentOf": "tender", + "datePublished": "2020-05-15T01:00:03+03:00", + "id": "67374954e7b846c591d642d35daf5292", + "dateModified": "2020-05-15T01:00:03+03:00" + } +} + diff --git a/docs/source/tendering/pricequotation/index.rst b/docs/source/tendering/pricequotation/index.rst new file mode 100644 index 0000000000..ace90d3116 --- /dev/null +++ b/docs/source/tendering/pricequotation/index.rst @@ -0,0 +1,12 @@ +.. _pricequotation: + +Price Quotation procedure +============================== + +Contents: + +.. toctree:: + :maxdepth: 2 + + overview + tutorial diff --git a/docs/source/tendering/pricequotation/overview.rst b/docs/source/tendering/pricequotation/overview.rst new file mode 100644 index 0000000000..042400b3ec --- /dev/null +++ b/docs/source/tendering/pricequotation/overview.rst @@ -0,0 +1,37 @@ +.. _pricequotation_overview: + +Overview +======== + +The Open Procurement `Price Quotation` procedure is plugin to `Open Procurement API` software. + +REST-ful interface to plugin is in line with core software design principles. + +Main responsibilities +--------------------- + +Price Quotation procedure is dedicated to Open Tender procedure for Ukrainian below threshold procurements. The code for that type of procedure is `priceQuotation`. + +Business logic +-------------- + +1) Publication of the Price Quotation + +Business process begins when the Procuring Entity creates a Price Quotation procedure using parameters from the e-Catalogues Profile database. + +After Procuring Entity supplements the procedure with quantity of items and delivery details and publishes the tender by sending a request for Price Quotation to ProZorro Business Process Engine the process starts. + +At this moment Business Process Engine receives and validates the Price Quotation request. Given the validation is passed the system automatically informs shortlisted (qualified to specific eCatalogue Profile) suppliers about the request. + +2) Tendering + +Receiving a Price Quotation request, supplier decides if they are able to offer the requested product. In case of rejection supplier declines participation in procedure. +Until the end of tender period (minimal two working days) suppliers would be able to submit a bid, while BPE will collect and register quotations. + +3) Awarding, Qualification + +After the deadline system will publish received bids, awarding suppleir with most economically advantageous bid allowing to confirm award within two business days. In case if award was not confirmed system will automatically award next supplier providing same confirmation period. In case of no suppliers left system will transfer procedure to status `unsuccessful`. + +4) Contracting + +Selecting a winner will lead both Procuring Entity and supplier to the contracting process, where the contract is signed, published and taken to execution. diff --git a/docs/source/tendering/pricequotation/tutorial.rst b/docs/source/tendering/pricequotation/tutorial.rst new file mode 100644 index 0000000000..aee18138b6 --- /dev/null +++ b/docs/source/tendering/pricequotation/tutorial.rst @@ -0,0 +1,289 @@ +.. _pricequotation_tutorial: + +Tutorial +======== + +Exploring basic rules +--------------------- + +Let's try exploring the `/tenders` endpoint: + + +.. include:: http/initial-tender-listing.http + :code: + +Just invoking it reveals empty set. + +Now let's attempt creating some tender: + +.. include:: http/tender-post-attempt.http + :code: + +Error states that the only accepted Content-Type is `application/json`. + +Let's satisfy the Content-type requirement: + +.. include:: http/tender-post-attempt-json.http + :code: + +Error states that no `data` has been found in JSON body. + + +.. index:: Tender + +Creating tender +--------------- + +Let's provide the data attribute in the submitted body : + +.. include:: http/tender-post-attempt-json-data.http + :code: + +Success! Now we can see that new object was created. Response code is `201` +and `Location` response header reports the location of the created object. The +body of response reveals the information about the created tender: its internal +`id` (that matches the `Location` segment), its official `tenderID` and +`dateModified` datestamp stating the moment in time when tender was last +modified. Note that tender is created with `draft` status. + +**! Note:** User receives `access`: `token`: ``"151a30932ee245e989771be867bc8235"`` with which operations as a `Procuring Entity` role are accessible. + +Price Quotation procedure has ``procurementMethodType``: ``priceQuotation`` and ``procurementMethod``: ``selective``. + +Let's access the URL of the created object (the `Location` header of the response): + +.. include:: http/blank-tender-view.http + :code: + +We can see the same response we got after creating tender. + +Modifying tender +---------------- + +Procuring Entity can modify tender before publishing. +Let's update tender by supplementing it with all other essential properties: + +.. include:: http/patch-tender-data.http + :code: + +We see the added properties have merged with existing tender data. Additionally, the `dateModified` property was updated to reflect the last modification datestamp. + +Checking the listing again reflects the new modification date: + +.. include:: http/tender-listing-after-patch.http + :code: + +Publishing tender +------------------ + +After creation Procuring Entity publishes procedure by changing status to `draft.publishing` where **priceQuotationBot** robot runs validation of the procedure and supplement procedure with additional data taken from ProZorro e-Catalogues database including `shortListedFirms`. + +.. include:: http/publish-tender.http + :code: + + +After successful validation priceQuotationBot transmit procedure to status: `active.tendering` + +.. include:: http/tender-after-bot-active.http + :code: + +In case if procedure do not pass validation due to invalid options, it will be switched to status: `draft.unsuccessful` by the **priceQuotationBot**. + +.. include:: http/tender-after-bot-unsuccessful.http + :code: + +.. index:: Document + +Bid submission +-------------- + +Registering bid +~~~~~~~~~~~~~~~ +Tender status ``active.tendering`` allows registration of bids. + +Bidder can register a bid with ``draft`` status: + +.. include:: http/register-bidder.http + :code: + +**! Note:** User receives `access`: `token`: ``"00e173e5f31f4decbb811cc01e10c1bf"`` with which operations as a `Supplier` role are accessible. + + +And activate a bid: + +.. include:: http/activate-bidder.http + :code: + +Modifying bid +~~~~~~~~~~~~~~~ + +Bid can be updated until the end of tender period. + +.. include:: http/patch-bidder.http + :code: + +Proposal Uploading +~~~~~~~~~~~~~~~~~~ + +Then bidder should upload proposal document(s): + +.. include:: http/upload-bid-proposal.http + :code: + +It is possible to check the uploaded documents: + +.. include:: http/bidder-documents.http + :code: + +.. index:: Awarding + +Awarding process +---------------- + +After the tender period end date, system automatically creates `award` in `pending` status for the bid with the most economically advantageous price. + +.. include:: http/awards-listing.http + :code: + +The Supplier-winner can accept `award` by transferring it to status: `active`. The system is waiting for acceptance from the supplier-winner within `two working days`. + +.. include:: http/award-active.http + :code: + +Procuring Entity can cancel `award` after acceptance by changing `award` status to `cancelled` in case if supplier-winner declines to sign contract. + +.. include:: http/award-cancelled.http + :code: + +After canceling `award` system creates `second` `award` for the same bid in status: `pending` with access for Procuring Entity only. +By the decision of Procuring Entity `second` `award` can be either changed for `active` or to `unsuccessful` with ability to upload supplementary documents. + +The Supplier-winner can decline `award` by transferring it to status: `unsuccessful`. + +.. include:: http/award-unsuccesful.http + :code: + +`Award` will be granted to the next bid with most economically advantageous price, for the following cases: + + 1. Supplier-winner didn't accept `award` within two working days. + 2. Supplier-winner declined `award`. + 3. Supplier-winner refused to sign contract and `award` was canceled by Procuring Entity. + +**Note !** In the case of `award` being transferred to `unsuccessful` status for the last bid, procedure will inherit termination status: **`unsuccessful`**. + +.. index:: Setting Contract + +Setting contract +---------------- + +Setting contract value +~~~~~~~~~~~~~~~~~~~~~~ + +By default contract value is set based on the award, but there is a possibility to set custom contract value. + +If you want to **lower contract value**, you can insert new one into the `amount` field. + +.. include:: http/tender-contract-set-contract-value.http + :code: + +`200 OK` response was returned. The value was modified successfully. + +Setting contract signature date +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +There is a possibility to set custom contract signature date. You can insert appropriate date into the `dateSigned` field. + +If this date is not set, it will be auto-generated on the date of contract registration. + +.. include:: http/tender-contract-sign-date.http + :code: + +Setting contract validity period +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Setting contract validity period is optional, but if it is needed, you can set appropriate `startDate` and `endDate`. + +.. include:: http/tender-contract-period.http + :code: + +Uploading contract documentation +-------------------------------- + +You can upload contract documents for the Price Quotation procedure. + +Let's upload contract document: + +.. include:: http/tender-contract-upload-document.http + :code: + +`201 Created` response code and `Location` header confirm that this document was added. + +Let's view the uploaded contract document: + +.. include:: http/tender-contract-get-documents.http + :code: + +Cancelling tender +----------------- + +Tender creator can cancel tender anytime (except when tender in terminal status e.g. `draft.unsuccessful`, `unsuccessful`, `cancelled`, `complete`). + +The following steps should be applied: + +1. Prepare cancellation request. +2. Fill it with the protocol describing the cancellation reasons. +3. Cancel the tender with the prepared reasons. + +Only the request that has been activated (3rd step above) has power to +cancel tender. I.e. you have to not only prepare cancellation request but +to activate it as well. + +For cancelled cancellation you need to update cancellation status to `unsuccessful` +from `draft` or `pending`. + +See :ref:`cancellation` data structure for details. + +Preparing the cancellation request +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +You should pass `reason` and `reasonType`, `status` defaults to `draft`. + +There are four possible types of cancellation reason - tender was `noDemand`, `unFixable`, `forceMajeure` and `expensesCut`. + +`id` is autogenerated and passed in the `Location` header of response. + +.. include:: http/prepare-cancellation.http + :code: + +You can change ``reasonType`` value to any of the above. + +.. include:: http/update-cancellation-reasonType.http + :code: + +Filling cancellation with protocol and supplementary documentation +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +This step is required. Without documents you can't update tender status. + +Upload the file contents + +.. include:: http/upload-cancellation-doc.http + :code: + +Change the document description and other properties + + +.. include:: http/patch-cancellation.http + :code: + +Upload new version of the document + + +.. include:: http/update-cancellation-doc.http + :code: + +Activating the request and cancelling tender +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +.. include:: http/active-cancellation.http + :code: diff --git a/docs/tests/auth.ini b/docs/tests/auth.ini index 9dd2e996e5..b5839f69d2 100644 --- a/docs/tests/auth.ini +++ b/docs/tests/auth.ini @@ -33,6 +33,7 @@ test = token [bots] bot = bot +pricequotation = pricequotation [contracting] contracting = contracting diff --git a/docs/tests/base/data.py b/docs/tests/base/data.py index 3cc272035b..5ce41a5bbc 100644 --- a/docs/tests/base/data.py +++ b/docs/tests/base/data.py @@ -340,7 +340,6 @@ qualified = { - 'selfEligible': True, 'selfQualified': True } diff --git a/docs/tests/test_basic_actions.py b/docs/tests/test_basic_actions.py index 599434ddb5..b303d3ce75 100644 --- a/docs/tests/test_basic_actions.py +++ b/docs/tests/test_basic_actions.py @@ -1,1581 +1,1957 @@ -# -*- coding: utf-8 -*- -import os -from copy import deepcopy -from datetime import timedelta -from mock import patch -from openprocurement.tender.core.tests.base import change_auth -from openprocurement.api.constants import RELEASE_2020_04_19 -from openprocurement.api.models import get_now -from openprocurement.tender.openeu.tests.tender import BaseTenderWebTest - -from openprocurement.api.constants import RELEASE_2020_04_19 -from tests.base.constants import DOCS_URL, AUCTIONS_URL -from tests.base.test import DumpsWebTestApp, MockWebTestMixin -from tests.base.data import ( - question, complaint, claim, lots, subcontracting, - bid_draft, bid2, bid3_with_docs, - qualified, tender_openeu -) -from tests.base.helpers import complaint_create_pending - -test_tender_data = deepcopy(tender_openeu) -test_lots = deepcopy(lots) -bid = deepcopy(bid_draft) -bid2 = deepcopy(bid2) -bid3 = deepcopy(bid3_with_docs) - -bid.update(subcontracting) -bid.update(qualified) -bid2.update(qualified) -bid3.update(qualified) - -test_lots[0]['value'] = test_tender_data['value'] -test_lots[0]['minimalStep'] = test_tender_data['minimalStep'] -test_lots[1]['value'] = test_tender_data['value'] -test_lots[1]['minimalStep'] = test_tender_data['minimalStep'] - -TARGET_DIR = 'docs/source/tendering/http/' - - -class TenderResourceTest(BaseTenderWebTest, MockWebTestMixin): - AppClass = DumpsWebTestApp - - relative_to = os.path.dirname(__file__) - initial_data = test_tender_data - docservice = True - docservice_url = DOCS_URL - auctions_url = AUCTIONS_URL - - def setUp(self): - super(TenderResourceTest, self).setUp() - self.setUpMock() - - def tearDown(self): - self.tearDownMock() - super(TenderResourceTest, self).tearDown() - - def test_complaints(self): - self.app.authorization = ('Basic', ('broker', '')) - - response = self.app.post_json( - '/tenders?opt_pretty=1', - {'data': test_tender_data}) - self.assertEqual(response.status, '201 Created') - - tender = response.json['data'] - owner_token = response.json['access']['token'] - self.tender_id = tender['id'] - - with open(TARGET_DIR + 'complaints/claim-submission.http', 'w') as self.app.file_obj: - response = self.app.post_json( - '/tenders/{}/complaints'.format(self.tender_id), - {'data': claim}) - self.assertEqual(response.status, '201 Created') - - complaint_token = response.json['access']['token'] - complaint_id = response.json['data']['id'] - - with open(TARGET_DIR + 'complaints/complaint-submission-upload.http', 'w') as self.app.file_obj: - response = self.app.post( - '/tenders/{}/complaints/{}/documents?acc_token={}'.format(self.tender_id, complaint_id, - complaint_token), - upload_files=[('file', u'Complaint_Attachment.pdf', 'content')]) - self.assertEqual(response.status, '201 Created') - - with open(TARGET_DIR + 'complaints/complaint-claim.http', 'w') as self.app.file_obj: - response = self.app.patch_json( - '/tenders/{}/complaints/{}?acc_token={}'.format(self.tender_id, complaint_id, complaint_token), - {"data": {"status": "claim"}}) - self.assertEqual(response.status, '200 OK') - - claim_data = {'data': claim.copy()} - claim_data['data']['status'] = 'claim' - with open(TARGET_DIR + 'complaints/complaint-submission-claim.http', 'w') as self.app.file_obj: - response = self.app.post_json( - '/tenders/{}/complaints'.format(self.tender_id), claim_data) - self.assertEqual(response.status, '201 Created') - - complaint2_token = response.json['access']['token'] - complaint2_id = response.json['data']['id'] - - complaint_data = {'data': complaint.copy()} - - complaint_url = "/tenders/{}/complaints".format(self.tender_id) - complaint3_id, complaint3_token = complaint_create_pending(self, complaint_url, complaint_data) - - response = self.app.post_json( - '/tenders/{}/complaints'.format(self.tender_id), claim_data) - self.assertEqual(response.status, '201 Created') - complaint4_id = response.json['data']['id'] - complaint4_token = response.json['access']['token'] - - with open(TARGET_DIR + 'complaints/complaint-submission.http', 'w') as self.app.file_obj: - response = self.app.post_json( - '/tenders/{}/complaints'.format(self.tender_id), - {'data': complaint}) - self.assertEqual(response.status, '201 Created') - - complaint1_token = response.json['access']['token'] - complaint1_id = response.json['data']['id'] - - with open(TARGET_DIR + 'complaints/complaint-complaint.http', 'w') as self.app.file_obj: - if get_now() < RELEASE_2020_04_19: - response = self.app.patch_json( - '/tenders/{}/complaints/{}?acc_token={}'.format(self.tender_id, complaint1_id, complaint1_token), - {"data": {"status": "pending"}}) - else: - with change_auth(self.app, ("Basic", ("bot", ""))): - response = self.app.patch_json( - '/tenders/{}/complaints/{}'.format(self.tender_id, complaint1_id), - {"data": {"status": "pending"}}) - self.assertEqual(response.status, '200 OK') - - with open(TARGET_DIR + 'complaints/complaint-answer.http', 'w') as self.app.file_obj: - response = self.app.patch_json( - '/tenders/{}/complaints/{}?acc_token={}'.format(self.tender_id, complaint2_id, owner_token), - {'data': { - "status": "answered", - "resolutionType": "resolved", - "resolution": "Виправлено неконкурентні умови" - }}) - self.assertEqual(response.status, '200 OK') - - response = self.app.patch_json( - '/tenders/{}/complaints/{}?acc_token={}'.format(self.tender_id, complaint4_id, owner_token), - {'data': { - "status": "answered", - "resolutionType": "invalid", - "resolution": "Вимога не відповідає предмету закупівлі" - }}) - self.assertEqual(response.status, '200 OK') - - with open(TARGET_DIR + 'complaints/complaint-satisfy.http', 'w') as self.app.file_obj: - response = self.app.patch_json( - '/tenders/{}/complaints/{}?acc_token={}'.format(self.tender_id, complaint2_id, complaint2_token), - {"data": { - "satisfied": True, - "status": "resolved" - }}) - self.assertEqual(response.status, '200 OK') - - if get_now() < RELEASE_2020_04_19: - with open(TARGET_DIR + 'complaints/complaint-escalate.http', 'w') as self.app.file_obj: - response = self.app.patch_json( - '/tenders/{}/complaints/{}?acc_token={}'.format(self.tender_id, complaint4_id, complaint4_token), - {"data": { - "satisfied": False, - "status": "pending" - }}) - self.assertEqual(response.status, '200 OK') - - complaint5_id, complaint5_token = complaint_create_pending(self, complaint_url, complaint_data) - complaint6_id, complaint6_token = complaint_create_pending(self, complaint_url, complaint_data) - complaint9_id, complaint9_token = complaint_create_pending(self, complaint_url, complaint_data) - - self.app.authorization = ('Basic', ('reviewer', '')) - with open(TARGET_DIR + 'complaints/complaint-reject.http', 'w') as self.app.file_obj: - response = self.app.patch_json( - '/tenders/{}/complaints/{}'.format(self.tender_id, complaint9_id), - {'data': { - "status": "invalid", - "rejectReason": "alreadyExists" - }}) - self.assertEqual(response.status, '200 OK') - - with open(TARGET_DIR + 'complaints/complaint-accept.http', 'w') as self.app.file_obj: - response = self.app.patch_json( - '/tenders/{}/complaints/{}'.format(self.tender_id, complaint1_id), - {'data': { - "status": "accepted", - "reviewDate": get_now().isoformat(), - "reviewPlace": "Place of review" - }}) - self.assertEqual(response.status, '200 OK') - - response = self.app.patch_json( - '/tenders/{}/complaints/{}'.format(self.tender_id, complaint3_id), - {'data': { - "status": "accepted", - "reviewDate": get_now().isoformat(), - "reviewPlace": "Place of review" - }}) - self.assertEqual(response.status, '200 OK') - - response = self.app.patch_json( - '/tenders/{}/complaints/{}'.format(self.tender_id, complaint5_id), - {'data': { - "status": "accepted", - "reviewDate": get_now().isoformat(), - "reviewPlace": "Place of review" - }}) - self.assertEqual(response.status, '200 OK') - - response = self.app.patch_json( - '/tenders/{}/complaints/{}'.format(self.tender_id, complaint6_id), - {'data': { - "status": "accepted", - "reviewDate": get_now().isoformat(), - "reviewPlace": "Place of review" - }}) - self.assertEqual(response.status, '200 OK') - - with open(TARGET_DIR + 'complaints/complaint-resolution-upload.http', 'w') as self.app.file_obj: - response = self.app.post('/tenders/{}/complaints/{}/documents'.format(self.tender_id, complaint1_id), - upload_files=[('file', u'ComplaintResolution.pdf', 'content')]) - self.assertEqual(response.status, '201 Created') - - with open(TARGET_DIR + 'complaints/complaint-resolve.http', 'w') as self.app.file_obj: - response = self.app.patch_json( - '/tenders/{}/complaints/{}'.format(self.tender_id, complaint1_id), - {'data': { - "status": "satisfied" - }}) - self.assertEqual(response.status, '200 OK') - - with open(TARGET_DIR + 'complaints/complaint-decline.http', 'w') as self.app.file_obj: - response = self.app.patch_json( - '/tenders/{}/complaints/{}'.format(self.tender_id, complaint3_id), - {'data': { - "status": "declined" - }}) - self.assertEqual(response.status, '200 OK') - - with open(TARGET_DIR + 'complaints/complaint-accepted-stopped.http', 'w') as self.app.file_obj: - response = self.app.patch_json( - '/tenders/{}/complaints/{}'.format(self.tender_id, complaint5_id), - {'data': { - "decision": "Тендер скасовується замовником", - "status": "stopped", - "rejectReason": "tenderCancelled" - }}) - self.assertEqual(response.status, '200 OK') - - self.app.authorization = ('Basic', ('broker', '')) - with open(TARGET_DIR + 'complaints/complaint-resolved.http', 'w') as self.app.file_obj: - response = self.app.patch_json( - '/tenders/{}/complaints/{}?acc_token={}'.format(self.tender_id, complaint1_id, owner_token), - {'data': { - "tendererAction": "Умови виправлено", - "status": "resolved" - }}) - self.assertEqual(response.status, '200 OK') - - if RELEASE_2020_04_19 > get_now(): - with open(TARGET_DIR + 'complaints/complaint-accepted-stopping.http', 'w') as self.app.file_obj: - response = self.app.patch_json( - '/tenders/{}/complaints/{}?acc_token={}'.format(self.tender_id, complaint6_id, complaint6_token), - {"data": { - "cancellationReason": "Тендер скасовується замовником", - "status": "stopping" - }}, - status=200, - ) - self.assertEqual(response.status, '200 OK') - - self.app.authorization = ('Basic', ('reviewer', '')) - with open(TARGET_DIR + 'complaints/complaint-stopping-stopped.http', 'w') as self.app.file_obj: - response = self.app.patch_json( - '/tenders/{}/complaints/{}'.format(self.tender_id, complaint6_id), - {'data': { - "decision": "Тендер скасовується замовником", - "status": "stopped", - "rejectReason": "tenderCancelled" - }}) - self.assertEqual(response.status, '200 OK') - else: - with open(TARGET_DIR + 'complaints/complaint-accepted-stopping-2020-04-19.http', 'w') as self.app.file_obj: - response = self.app.patch_json( - '/tenders/{}/complaints/{}?acc_token={}'.format(self.tender_id, complaint6_id, complaint6_token), - {"data": { - "cancellationReason": "Тендер скасовується замовником", - "status": "stopping" - }}, - status=403, - ) - self.assertEqual(response.status, '403 Forbidden') - - if get_now() < RELEASE_2020_04_19: - # before RELEASE_2020_04_19 from pending to mistaken transition was available by reviewer - self.app.authorization = ('Basic', ('broker', '')) - complaint7_id, complaint7_token = complaint_create_pending(self, complaint_url, complaint_data) - - with open(TARGET_DIR + 'complaints/complaint-mistaken.http', 'w') as self.app.file_obj: - self.app.authorization = ('Basic', ('reviewer', '')) - response = self.app.patch_json( - '/tenders/{}/complaints/{}?acc_token={}'.format(self.tender_id, complaint7_id, complaint7_token), - {"data": {"status": "mistaken"}}, - ) - self.assertEqual(response.status, '200 OK') - else: - # since RELEASE_2020_04_19 from draft to mistaken transition was available by complainant - self.app.authorization = ('Basic', ('broker', '')) - response = self.app.post_json( - '/tenders/{}/complaints'.format(self.tender_id), - {'data': complaint}) - self.assertEqual(response.status, '201 Created') - complaint7_id = response.json['data']['id'] - complaint7_token = response.json['access']['token'] - - with open(TARGET_DIR + 'complaints/complaint-mistaken-2020-04-19.http', 'w') as self.app.file_obj: - response = self.app.patch_json( - '/tenders/{}/complaints/{}?acc_token={}'.format(self.tender_id, complaint7_id, complaint7_token), - {"data": {"status": "mistaken"}}, - ) - self.assertEqual(response.status, '200 OK') - - self.app.authorization = ('Basic', ('broker', '')) - complaint_url = "/tenders/{}/complaints".format(self.tender_id) - complaint8_id, complaint8_token = complaint_create_pending(self, complaint_url, complaint_data) - - self.app.authorization = ('Basic', ('reviewer', '')) - - with open(TARGET_DIR + 'complaints/complaint-post-reviewer-complaint-owner.http', 'w') as self.app.file_obj: - response = self.app.post_json( - '/tenders/{}/complaints/{}/posts'.format( - self.tender_id, complaint8_id), - {"data": { - "title": "Уточнення по вимозі", - "description": "Відсутній документ", - "recipient": "complaint_owner", - }}) - self.assertEqual(response.status, '201 Created') - - post1_id = response.json['data']['id'] - - self.app.authorization = ('Basic', ('broker', '')) - - with open(TARGET_DIR + 'complaints/complaint-post-complaint-owner.http', 'w') as self.app.file_obj: - response = self.app.post_json( - '/tenders/{}/complaints/{}/posts?acc_token={}'.format( - self.tender_id, complaint8_id, complaint8_token), - {"data": { - "title": "Уточнення по вимозі", - "description": "Додано документ", - "recipient": "aboveThresholdReviewers", - "relatedPost": post1_id, - "documents": [{ - 'title': u'post_document_complaint.pdf', - 'url': self.generate_docservice_url(), - 'hash': 'md5:' + '0' * 32, - 'format': 'application/pdf' - }] - }}) - self.assertEqual(response.status, '201 Created') - - self.app.authorization = ('Basic', ('reviewer', '')) - - with open(TARGET_DIR + 'complaints/complaint-post-reviewer-tender-owner.http', 'w') as self.app.file_obj: - response = self.app.post_json( - '/tenders/{}/complaints/{}/posts'.format( - self.tender_id, complaint8_id), - {"data": { - "title": "Уточнення по вимозі", - "description": "Відсутній документ", - "recipient": "tender_owner", - }}) - self.assertEqual(response.status, '201 Created') - - post2_id = response.json['data']['id'] - - self.app.authorization = ('Basic', ('broker', '')) - - with open(TARGET_DIR + 'complaints/complaint-post-tender-owner.http', 'w') as self.app.file_obj: - response = self.app.post_json( - '/tenders/{}/complaints/{}/posts?acc_token={}'.format( - self.tender_id, complaint8_id, owner_token), - {"data": { - "title": "Уточнення по вимозі", - "description": "Додано документ", - "recipient": "aboveThresholdReviewers", - "relatedPost": post2_id, - "documents": [{ - 'title': u'post_document_tender.pdf', - 'url': self.generate_docservice_url(), - 'hash': 'md5:' + '0' * 32, - 'format': 'application/pdf' - }] - }}) - self.assertEqual(response.status, '201 Created') - - with open(TARGET_DIR + 'complaints/complaints-list.http', 'w') as self.app.file_obj: - self.app.authorization = None - response = self.app.get('/tenders/{}/complaints'.format(self.tender_id)) - self.assertEqual(response.status, '200 OK') - - with open(TARGET_DIR + 'complaints/complaint.http', 'w') as self.app.file_obj: - self.app.authorization = None - response = self.app.get('/tenders/{}/complaints/{}'.format(self.tender_id, complaint1_id)) - self.assertEqual(response.status, '200 OK') - - def test_qualification_complaints(self): - self.app.authorization = ('Basic', ('broker', '')) - - response = self.app.post_json( - '/tenders?opt_pretty=1', - {'data': test_tender_data}) - self.assertEqual(response.status, '201 Created') - - tender = response.json['data'] - owner_token = response.json['access']['token'] - self.tender_id = tender['id'] - - response = self.app.post_json( - '/tenders/{}/bids'.format(self.tender_id), - {'data': bid}) - bid_id = response.json['data']['id'] - bid_token = response.json['access']['token'] - - response = self.app.patch_json( - '/tenders/{}/bids/{}?acc_token={}'.format( - self.tender_id, bid_id, bid_token), - {'data': {"status": "pending"}}) - - # create second bid - self.app.authorization = ('Basic', ('broker', '')) - response = self.app.post_json( - '/tenders/{}/bids'.format(self.tender_id), - {'data': bid2}) - - # Pre-qualification - self.set_status('active.pre-qualification', {"id": self.tender_id, 'status': 'active.tendering'}) - auth = self.app.authorization - self.app.authorization = ('Basic', ('chronograph', '')) - response = self.app.patch_json( - '/tenders/{}'.format(self.tender_id), - {'data': {"id": self.tender_id}}) - self.app.authorization = auth - - response = self.app.get('/tenders/{}/qualifications'.format(self.tender_id)) - self.assertEqual(response.status, "200 OK") - qualifications = response.json['data'] - - for qualification in qualifications: - response = self.app.patch_json( - '/tenders/{}/qualifications/{}?acc_token={}'.format(self.tender_id, qualification['id'], owner_token), - {"data": { - "status": "active", - "qualified": True, - "eligible": True - }}) - self.assertEqual(response.status, "200 OK") - - self.tick() - - # active.pre-qualification.stand-still - response = self.app.patch_json( - '/tenders/{}?acc_token={}'.format(self.tender_id, owner_token), - {"data": {"status": "active.pre-qualification.stand-still"}}) - self.assertEqual(response.status, "200 OK") - self.assertEqual(response.json['data']['status'], "active.pre-qualification.stand-still") - - qualification_id = qualifications[0]['id'] - - with open(TARGET_DIR + 'complaints/qualification-complaint-submission.http', 'w') as self.app.file_obj: - response = self.app.post_json( - '/tenders/{}/qualifications/{}/complaints?acc_token={}'.format( - self.tender_id, qualification_id, bid_token), - {'data': complaint}) - self.assertEqual(response.status, '201 Created') - - complaint1_token = response.json['access']['token'] - complaint1_id = response.json['data']['id'] - - with open(TARGET_DIR + 'complaints/qualification-complaint-submission-upload.http', 'w') as self.app.file_obj: - response = self.app.post( - '/tenders/{}/qualifications/{}/complaints/{}/documents?acc_token={}'.format( - self.tender_id, qualification_id, complaint1_id, complaint1_token), - upload_files=[('file', u'Complaint_Attachment.pdf', 'content')]) - self.assertEqual(response.status, '201 Created') - - with open(TARGET_DIR + 'complaints/qualification-complaint-complaint.http', 'w') as self.app.file_obj: - if get_now() < RELEASE_2020_04_19: - response = self.app.patch_json( - '/tenders/{}/qualifications/{}/complaints/{}?acc_token={}'.format( - self.tender_id, qualification_id, complaint1_id, complaint1_token), - {"data": {"status": "pending"}}) - else: - with change_auth(self.app, ("Basic", ("bot", ""))): - response = self.app.patch_json( - '/tenders/{}/qualifications/{}/complaints/{}'.format( - self.tender_id, qualification_id, complaint1_id), - {"data": {"status": "pending"}}) - self.assertEqual(response.status, '200 OK') - - complaint_data = {'data': complaint.copy()} - - complaint_url = "/tenders/{}/qualifications/{}/complaints".format(self.tender_id, qualification_id) - complaint2_id, complaint2_token = complaint_create_pending(self, complaint_url, complaint_data, bid_token) - - complaint3_id, complaint3_token = complaint_create_pending(self, complaint_url, complaint_data, bid_token) - - complaint4_id, complaint4_token = complaint_create_pending(self, complaint_url, complaint_data, bid_token) - - complaint5_id, complaint5_token = complaint_create_pending(self, complaint_url, complaint_data, bid_token) - - claim_data = {'data': claim.copy()} - claim_data['data']['status'] = 'claim' - with open(TARGET_DIR + 'complaints/qualification-complaint-submission-claim.http', 'w') as self.app.file_obj: - response = self.app.post_json( - '/tenders/{}/qualifications/{}/complaints?acc_token={}'.format( - self.tender_id, qualification_id, bid_token), claim_data) - self.assertEqual(response.status, '201 Created') - - complaint6_token = response.json['access']['token'] - complaint6_id = response.json['data']['id'] - - with open(TARGET_DIR + 'complaints/qualification-complaint-answer.http', 'w') as self.app.file_obj: - response = self.app.patch_json( - '/tenders/{}/qualifications/{}/complaints/{}?acc_token={}'.format( - self.tender_id, qualification_id, complaint6_id, owner_token), - {"data": { - "status": "answered", - "resolutionType": "resolved", - "resolution": "Умови виправлено, вибір переможня буде розгянуто повторно" - }}) - self.assertEqual(response.status, '200 OK') - - with open(TARGET_DIR + 'complaints/qualification-complaint-satisfy.http', 'w') as self.app.file_obj: - response = self.app.patch_json( - '/tenders/{}/qualifications/{}/complaints/{}?acc_token={}'.format( - self.tender_id, qualification_id, complaint6_id, complaint6_token), - {"data": { - "satisfied": True, - }}) - self.assertEqual(response.status, '200 OK') - - response = self.app.post_json( - '/tenders/{}/qualifications/{}/complaints?acc_token={}'.format( - self.tender_id, qualification_id, bid_token), claim_data) - self.assertEqual(response.status, '201 Created') - complaint7_token = response.json['access']['token'] - complaint7_id = response.json['data']['id'] - - response = self.app.patch_json( - '/tenders/{}/qualifications/{}/complaints/{}?acc_token={}'.format( - self.tender_id, qualification_id, complaint7_id, owner_token), - {'data': { - "status": "answered", - "resolutionType": "invalid", - "resolution": "Вимога не відповідає предмету закупівлі" - }}) - self.assertEqual(response.status, '200 OK') - - with open(TARGET_DIR + 'complaints/qualification-complaint-unsatisfy.http', 'w') as self.app.file_obj: - response = self.app.patch_json( - '/tenders/{}/qualifications/{}/complaints/{}?acc_token={}'.format( - self.tender_id, qualification_id, complaint7_id, complaint7_token), - {"data": { - "satisfied": False, - }}) - self.assertEqual(response.status, '200 OK') - - complaint_url = "/tenders/{}/qualifications/{}/complaints".format(self.tender_id, qualification_id) - complaint8_id, complaint8_token = complaint_create_pending(self, complaint_url, complaint_data, bid_token) - - self.app.authorization = ('Basic', ('reviewer', '')) - - with open(TARGET_DIR + 'complaints/qualification-complaint-post-reviewer-complaint-owner.http', 'w') as self.app.file_obj: - response = self.app.post_json( - '/tenders/{}/qualifications/{}/complaints/{}/posts'.format( - self.tender_id, qualification_id, complaint8_id), - {"data": { - "title": "Уточнення по вимозі", - "description": "Відсутній документ", - "recipient": "complaint_owner", - }}) - self.assertEqual(response.status, '201 Created') - - post1_id = response.json['data']['id'] - - self.app.authorization = ('Basic', ('broker', '')) - - with open(TARGET_DIR + 'complaints/qualification-complaint-post-complaint-owner.http', 'w') as self.app.file_obj: - response = self.app.post_json( - '/tenders/{}/qualifications/{}/complaints/{}/posts?acc_token={}'.format( - self.tender_id, qualification_id, complaint8_id, complaint8_token), - {"data": { - "title": "Уточнення по вимозі", - "description": "Додано документ", - "recipient": "aboveThresholdReviewers", - "relatedPost": post1_id, - "documents": [{ - 'title': u'post_document_complaint.pdf', - 'url': self.generate_docservice_url(), - 'hash': 'md5:' + '0' * 32, - 'format': 'application/pdf' - }] - }}) - self.assertEqual(response.status, '201 Created') - - self.app.authorization = ('Basic', ('reviewer', '')) - - with open(TARGET_DIR + 'complaints/qualification-complaint-post-reviewer-tender-owner.http', 'w') as self.app.file_obj: - response = self.app.post_json( - '/tenders/{}/qualifications/{}/complaints/{}/posts'.format( - self.tender_id, qualification_id, complaint8_id), - {"data": { - "title": "Уточнення по вимозі", - "description": "Відсутній документ", - "recipient": "tender_owner", - }}) - self.assertEqual(response.status, '201 Created') - - post2_id = response.json['data']['id'] - - self.app.authorization = ('Basic', ('broker', '')) - - with open(TARGET_DIR + 'complaints/qualification-complaint-post-tender-owner.http', 'w') as self.app.file_obj: - response = self.app.post_json( - '/tenders/{}/qualifications/{}/complaints/{}/posts?acc_token={}'.format( - self.tender_id, qualification_id, complaint8_id, owner_token), - {"data": { - "title": "Уточнення по вимозі", - "description": "Додано документ", - "recipient": "aboveThresholdReviewers", - "relatedPost": post2_id, - "documents": [{ - 'title': u'post_document_tender.pdf', - 'url': self.generate_docservice_url(), - 'hash': 'md5:' + '0' * 32, - 'format': 'application/pdf' - }] - }}) - self.assertEqual(response.status, '201 Created') - - response = self.app.post_json( - '/tenders/{}/qualifications/{}/complaints?acc_token={}'.format( - self.tender_id, qualification_id, bid_token), - {'data': claim}) - self.assertEqual(response.status, '201 Created') - - with open(TARGET_DIR + 'complaints/qualification-complaint-claim.http', 'w') as self.app.file_obj: - response = self.app.patch_json( - '/tenders/{}/qualifications/{}/complaints/{}?acc_token={}'.format( - self.tender_id, qualification_id, - response.json['data']['id'], response.json['access']['token']), - {"data": { - "status": "claim" - }}) - self.assertEqual(response.status, '200 OK') - - if get_now() < RELEASE_2020_04_19: - # before RELEASE_2020_04_19 from pending to mistaken transition was available by reviewer - self.app.authorization = ('Basic', ('broker', '')) - complaint9_id, complaint9_token = complaint_create_pending(self, complaint_url, complaint_data, bid_token) - - with open(TARGET_DIR + 'complaints/qualification-complaint-mistaken.http', 'w') as self.app.file_obj: - self.app.authorization = ('Basic', ('reviewer', '')) - response = self.app.patch_json( - '/tenders/{}/qualifications/{}/complaints/{}?acc_token={}'.format( - self.tender_id, - qualification_id, - complaint9_id, - complaint9_token - ), - {"data": {"status": "mistaken"}}, - ) - self.assertEqual(response.status, '200 OK') - else: - # since RELEASE_2020_04_19 from draft to mistaken transition was available by complainant - self.app.authorization = ('Basic', ('broker', '')) - response = self.app.post_json( - '/tenders/{}/qualifications/{}/complaints?acc_token={}'.format( - self.tender_id, - qualification_id, - bid_token, - ), - {'data': complaint} - ) - self.assertEqual(response.status, '201 Created') - complaint9_id = response.json['data']['id'] - complaint9_token = response.json['access']['token'] - - with open(TARGET_DIR + 'complaints/qualification-complaint-mistaken-2020-04-19.http', 'w') as self.app.file_obj: - response = self.app.patch_json( - '/tenders/{}/qualifications/{}/complaints/{}?acc_token={}'.format( - self.tender_id, - qualification_id, - complaint9_id, - complaint9_token - ), - {"data": {"status": "mistaken"}}, - ) - self.assertEqual(response.status, '200 OK') - - self.app.authorization = ('Basic', ('reviewer', '')) - with open(TARGET_DIR + 'complaints/qualification-complaint-reject.http', 'w') as self.app.file_obj: - response = self.app.patch_json( - '/tenders/{}/qualifications/{}/complaints/{}'.format( - self.tender_id, qualification_id, complaint2_id), - {"data": { - "status": "invalid", - "rejectReason": "alreadyExists" - }}) - self.assertEqual(response.status, '200 OK') - - with open(TARGET_DIR + 'complaints/qualification-complaint-accept.http', 'w') as self.app.file_obj: - response = self.app.patch_json( - '/tenders/{}/qualifications/{}/complaints/{}'.format( - self.tender_id, qualification_id, complaint1_id), - {"data": { - "status": "accepted", - "reviewDate": get_now().isoformat(), - "reviewPlace": "Place of review" - }}) - self.assertEqual(response.status, '200 OK') - - response = self.app.patch_json( - '/tenders/{}/qualifications/{}/complaints/{}'.format( - self.tender_id, qualification_id, complaint3_id), - {"data": { - "status": "accepted", - "reviewDate": get_now().isoformat(), - "reviewPlace": "Place of review" - }}) - self.assertEqual(response.status, '200 OK') - - response = self.app.patch_json( - '/tenders/{}/qualifications/{}/complaints/{}'.format( - self.tender_id, qualification_id, complaint4_id), - {"data": { - "status": "accepted", - "reviewDate": get_now().isoformat(), - "reviewPlace": "Place of review" - }}) - self.assertEqual(response.status, '200 OK') - - response = self.app.patch_json( - '/tenders/{}/qualifications/{}/complaints/{}'.format( - self.tender_id, qualification_id, complaint5_id), - {"data": { - "status": "accepted", - "reviewDate": get_now().isoformat(), - "reviewPlace": "Place of review" - }}) - self.assertEqual(response.status, '200 OK') - - with open(TARGET_DIR + 'complaints/qualification-complaint-resolution-upload.http', 'w') as self.app.file_obj: - response = self.app.post( - '/tenders/{}/qualifications/{}/complaints/{}/documents'.format( - self.tender_id, qualification_id, complaint1_id), - upload_files=[('file', u'ComplaintResolution.pdf', 'content')]) - self.assertEqual(response.status, '201 Created') - - with open(TARGET_DIR + 'complaints/qualification-complaint-resolve.http', 'w') as self.app.file_obj: - response = self.app.patch_json( - '/tenders/{}/qualifications/{}/complaints/{}'.format( - self.tender_id, qualification_id, complaint1_id), - {"data": { - "status": "satisfied" - }}) - self.assertEqual(response.status, '200 OK') - - with open(TARGET_DIR + 'complaints/qualification-complaint-decline.http', 'w') as self.app.file_obj: - response = self.app.patch_json( - '/tenders/{}/qualifications/{}/complaints/{}'.format( - self.tender_id, qualification_id, complaint3_id), - {"data": { - "status": "declined" - }}) - self.assertEqual(response.status, '200 OK') - - with open(TARGET_DIR + 'complaints/qualification-complaint-accepted-stopped.http', 'w') as self.app.file_obj: - response = self.app.patch_json( - '/tenders/{}/qualifications/{}/complaints/{}'.format( - self.tender_id, qualification_id, complaint5_id), - {"data": { - "decision": "Тендер скасовується замовником", - "status": "stopped", - "rejectReason": "tenderCancelled" - }}) - self.assertEqual(response.status, '200 OK') - - self.app.authorization = ('Basic', ('broker', '')) - with open(TARGET_DIR + 'complaints/qualification-complaint-resolved.http', 'w') as self.app.file_obj: - response = self.app.patch_json( - '/tenders/{}/qualifications/{}/complaints/{}?acc_token={}'.format( - self.tender_id, qualification_id, complaint1_id, owner_token), - {"data": { - "tendererAction": "Умови виправлено", - "status": "resolved" - }}) - self.assertEqual(response.status, '200 OK') - - if RELEASE_2020_04_19 > get_now(): - with open(TARGET_DIR + 'complaints/qualification-complaint-accepted-stopping.http', 'w') as self.app.file_obj: - response = self.app.patch_json( - '/tenders/{}/qualifications/{}/complaints/{}?acc_token={}'.format( - self.tender_id, qualification_id, complaint4_id, complaint4_token), - {"data": { - "cancellationReason": "Тендер скасовується замовником", - "status": "stopping" - }}, - status=200, - ) - self.assertEqual(response.status, '200 OK') - - self.app.authorization = ('Basic', ('reviewer', '')) - with open(TARGET_DIR + 'complaints/qualification-complaint-stopping-stopped.http', 'w') as self.app.file_obj: - response = self.app.patch_json( - '/tenders/{}/qualifications/{}/complaints/{}'.format( - self.tender_id, qualification_id, complaint4_id), - {"data": { - "decision": "Тендер скасовується замовником", - "status": "stopped", - "rejectReason": "tenderCancelled" - }}) - self.assertEqual(response.status, '200 OK') - else: - with open(TARGET_DIR + 'complaints/qualification-complaint-accepted-stopping-2020-04-19.http', 'w') as self.app.file_obj: - response = self.app.patch_json( - '/tenders/{}/qualifications/{}/complaints/{}?acc_token={}'.format( - self.tender_id, qualification_id, complaint4_id, complaint4_token), - {"data": { - "cancellationReason": "Тендер скасовується замовником", - "status": "stopping" - }}, - status=403, - ) - self.assertEqual(response.status, '403 Forbidden') - - self.app.authorization = None - with open(TARGET_DIR + 'complaints/qualification-complaints-list.http', 'w') as self.app.file_obj: - response = self.app.get( - '/tenders/{}/qualifications/{}/complaints'.format( - self.tender_id, qualification_id)) - self.assertEqual(response.status, '200 OK') - - with open(TARGET_DIR + 'complaints/qualification-complaint.http', 'w') as self.app.file_obj: - response = self.app.get( - '/tenders/{}/qualifications/{}/complaints/{}'.format( - self.tender_id, qualification_id, complaint1_id)) - self.assertEqual(response.status, '200 OK') - - def test_award_complaints(self): - self.app.authorization = ('Basic', ('broker', '')) - - response = self.app.post_json( - '/tenders?opt_pretty=1', - {'data': test_tender_data}) - self.assertEqual(response.status, '201 Created') - - tender = response.json['data'] - owner_token = response.json['access']['token'] - self.tender_id = tender['id'] - - response = self.app.post_json( - '/tenders/{}/bids'.format(self.tender_id), - {'data': bid}) - bid_id = response.json['data']['id'] - bid_token = response.json['access']['token'] - - response = self.app.patch_json( - '/tenders/{}/bids/{}?acc_token={}'.format( - self.tender_id, bid_id, bid_token), - {'data': {"status": "pending"}}) - - # create second bid - self.app.authorization = ('Basic', ('broker', '')) - response = self.app.post_json( - '/tenders/{}/bids'.format(self.tender_id), - {'data': bid2}) - - # Pre-qualification - self.set_status( - 'active.pre-qualification', - {"id": self.tender_id, 'status': 'active.tendering'}) - auth = self.app.authorization - self.app.authorization = ('Basic', ('chronograph', '')) - response = self.app.patch_json( - '/tenders/{}'.format(self.tender_id), - {'data': {"id": self.tender_id}}) - self.app.authorization = auth - - response = self.app.get('/tenders/{}/qualifications'.format(self.tender_id)) - self.assertEqual(response.status, "200 OK") - qualifications = response.json['data'] - - for qualification in qualifications: - response = self.app.patch_json( - '/tenders/{}/qualifications/{}?acc_token={}'.format( - self.tender_id, qualification['id'], owner_token), - {"data": { - "status": "active", - "qualified": True, - "eligible": True - }}) - self.assertEqual(response.status, "200 OK") - - # active.pre-qualification.stand-still - response = self.app.patch_json( - '/tenders/{}?acc_token={}'.format(self.tender_id, owner_token), - {"data": {"status": "active.pre-qualification.stand-still"}}) - self.assertEqual(response.status, "200 OK") - self.assertEqual(response.json['data']['status'], "active.pre-qualification.stand-still") - - # switch to active.auction - self.set_status('active.auction') - self.app.authorization = ('Basic', ('auction', '')) - response = self.app.get('/tenders/{}/auction'.format(self.tender_id)) - auction_bids_data = response.json['data']['bids'] - self.app.post_json( - '/tenders/{}/auction'.format(self.tender_id), - {'data': {'bids': auction_bids_data}}) - - self.app.authorization = ('Basic', ('broker', '')) - response = self.app.get('/tenders/{}/awards?acc_token={}'.format(self.tender_id, owner_token)) - # get pending award - award_id = [i['id'] for i in response.json['data'] if i['status'] == 'pending'][0] - response = self.app.patch_json( - '/tenders/{}/awards/{}?acc_token={}'.format(self.tender_id, award_id, owner_token), - {"data": { - "status": "active", - "qualified": True, - "eligible": True - }}) - self.assertEqual(response.status, '200 OK') - - self.tick() - - with open(TARGET_DIR + 'complaints/award-complaint-submission.http', 'w') as self.app.file_obj: - response = self.app.post_json( - '/tenders/{}/awards/{}/complaints?acc_token={}'.format( - self.tender_id, award_id, bid_token), - {'data': complaint}) - self.assertEqual(response.status, '201 Created') - - self.tick() - - complaint1_token = response.json['access']['token'] - complaint1_id = response.json['data']['id'] - - with open(TARGET_DIR + 'complaints/award-complaint-submission-upload.http', 'w') as self.app.file_obj: - response = self.app.post( - '/tenders/{}/awards/{}/complaints/{}/documents?acc_token={}'.format( - self.tender_id, award_id, complaint1_id, complaint1_token), - upload_files=[('file', u'Complaint_Attachment.pdf', 'content')]) - self.assertEqual(response.status, '201 Created') - - with open(TARGET_DIR + 'complaints/award-complaint-complaint.http', 'w') as self.app.file_obj: - if get_now() < RELEASE_2020_04_19: - response = self.app.patch_json( - '/tenders/{}/awards/{}/complaints/{}?acc_token={}'.format( - self.tender_id, award_id, complaint1_id, complaint1_token), - {"data": {"status": "pending"}}) - else: - with change_auth(self.app, ("Basic", ("bot", ""))): - response = self.app.patch_json( - '/tenders/{}/awards/{}/complaints/{}'.format( - self.tender_id, award_id, complaint1_id), - {"data": {"status": "pending"}}) - - self.assertEqual(response.status, '200 OK') - - complaint_data = {'data': complaint.copy()} - # with open(TARGET_DIR + 'complaints/award-complaint-submission-complaint.http', 'w') as self.app.file_obj: - # response = self.app.post_json( - # '/tenders/{}/awards/{}/complaints?acc_token={}'.format( - # self.tender_id, award_id, bid_token), - # complaint_data) - # self.assertEqual(response.status, '201 Created') - # - # complaint2_id = response.json['data']['id'] - - complaint_url = "/tenders/{}/awards/{}/complaints".format(self.tender_id, award_id) - - complaint2_id, complaint2_token = complaint_create_pending(self, complaint_url, complaint_data, bid_token) - - complaint3_id, complaint3_token = complaint_create_pending(self, complaint_url, complaint_data, bid_token) - - complaint4_id, complaint4_token = complaint_create_pending(self, complaint_url, complaint_data, bid_token) - - complaint5_id, complaint5_token = complaint_create_pending(self, complaint_url, complaint_data, bid_token) - - claim_data = {'data': claim.copy()} - claim_data['data']['status'] = 'claim' - with open(TARGET_DIR + 'complaints/award-complaint-submission-claim.http', 'w') as self.app.file_obj: - response = self.app.post_json( - '/tenders/{}/awards/{}/complaints?acc_token={}'.format( - self.tender_id, award_id, bid_token), claim_data) - self.assertEqual(response.status, '201 Created') - - complaint6_token = response.json['access']['token'] - complaint6_id = response.json['data']['id'] - - with open(TARGET_DIR + 'complaints/award-complaint-answer.http', 'w') as self.app.file_obj: - response = self.app.patch_json( - '/tenders/{}/awards/{}/complaints/{}?acc_token={}'.format( - self.tender_id, award_id, complaint6_id, owner_token), - {'data': { - "status": "answered", - "resolutionType": "resolved", - "resolution": "Умови виправлено, вибір переможня буде розгянуто повторно" - }}) - self.assertEqual(response.status, '200 OK') - - with open(TARGET_DIR + 'complaints/award-complaint-satisfy.http', 'w') as self.app.file_obj: - response = self.app.patch_json( - '/tenders/{}/awards/{}/complaints/{}?acc_token={}'.format( - self.tender_id, award_id, complaint6_id, complaint6_token), - {'data': { - "satisfied": True, - }}) - self.assertEqual(response.status, '200 OK') - - response = self.app.post_json( - '/tenders/{}/awards/{}/complaints?acc_token={}'.format( - self.tender_id, award_id, bid_token), claim_data) - self.assertEqual(response.status, '201 Created') - complaint7_token = response.json['access']['token'] - complaint7_id = response.json['data']['id'] - - response = self.app.patch_json( - '/tenders/{}/awards/{}/complaints/{}?acc_token={}'.format( - self.tender_id, award_id, complaint7_id, owner_token), - {'data': { - "status": "answered", - "resolutionType": "invalid", - "resolution": "Вимога не відповідає предмету закупівлі" - }}) - self.assertEqual(response.status, '200 OK') - - with open(TARGET_DIR + 'complaints/award-complaint-unsatisfy.http', 'w') as self.app.file_obj: - response = self.app.patch_json( - '/tenders/{}/awards/{}/complaints/{}?acc_token={}'.format( - self.tender_id, award_id, complaint7_id, complaint7_token), - {'data': { - "satisfied": False, - }}) - self.assertEqual(response.status, '200 OK') - - complaint_url = "/tenders/{}/awards/{}/complaints".format(self.tender_id, award_id) - complaint8_id, complaint8_token = complaint_create_pending(self, complaint_url, complaint_data, bid_token) - - self.app.authorization = ('Basic', ('reviewer', '')) - - with open(TARGET_DIR + 'complaints/award-complaint-post-reviewer-complaint-owner.http', 'w') as self.app.file_obj: - response = self.app.post_json( - '/tenders/{}/awards/{}/complaints/{}/posts'.format( - self.tender_id, award_id, complaint8_id), - {"data": { - "title": "Уточнення по вимозі", - "description": "Відсутній документ", - "recipient": "complaint_owner", - }}) - self.assertEqual(response.status, '201 Created') - - post1_id = response.json['data']['id'] - - self.app.authorization = ('Basic', ('broker', '')) - - with open(TARGET_DIR + 'complaints/award-complaint-post-complaint-owner.http', 'w') as self.app.file_obj: - response = self.app.post_json( - '/tenders/{}/awards/{}/complaints/{}/posts?acc_token={}'.format( - self.tender_id, award_id, complaint8_id, complaint8_token), - {"data": { - "title": "Уточнення по вимозі", - "description": "Додано документ", - "recipient": "aboveThresholdReviewers", - "relatedPost": post1_id, - "documents": [{ - 'title': u'post_document_complaint.pdf', - 'url': self.generate_docservice_url(), - 'hash': 'md5:' + '0' * 32, - 'format': 'application/pdf' - }] - }}) - self.assertEqual(response.status, '201 Created') - - self.app.authorization = ('Basic', ('reviewer', '')) - - with open(TARGET_DIR + 'complaints/award-complaint-post-reviewer-tender-owner.http', 'w') as self.app.file_obj: - response = self.app.post_json( - '/tenders/{}/awards/{}/complaints/{}/posts'.format( - self.tender_id, award_id, complaint8_id), - {"data": { - "title": "Уточнення по вимозі", - "description": "Відсутній документ", - "recipient": "tender_owner", - }}) - self.assertEqual(response.status, '201 Created') - - post2_id = response.json['data']['id'] - - self.app.authorization = ('Basic', ('broker', '')) - - with open(TARGET_DIR + 'complaints/award-complaint-post-tender-owner.http', 'w') as self.app.file_obj: - response = self.app.post_json( - '/tenders/{}/awards/{}/complaints/{}/posts?acc_token={}'.format( - self.tender_id, award_id, complaint8_id, owner_token), - {"data": { - "title": "Уточнення по вимозі", - "description": "Додано документ", - "recipient": "aboveThresholdReviewers", - "relatedPost": post2_id, - "documents": [{ - 'title': u'post_document_tender.pdf', - 'url': self.generate_docservice_url(), - 'hash': 'md5:' + '0' * 32, - 'format': 'application/pdf' - }] - }}) - self.assertEqual(response.status, '201 Created') - - response = self.app.post_json( - '/tenders/{}/awards/{}/complaints?acc_token={}'.format( - self.tender_id, award_id, bid_token), - {'data': claim}) - self.assertEqual(response.status, '201 Created') - - with open(TARGET_DIR + 'complaints/award-complaint-claim.http', 'w') as self.app.file_obj: - response = self.app.patch_json( - '/tenders/{}/awards/{}/complaints/{}?acc_token={}'.format( - self.tender_id, award_id, - response.json['data']['id'], response.json['access']['token']), - {'data': { - "status": "claim" - }}) - self.assertEqual(response.status, '200 OK') - - self.app.authorization = ('Basic', ('reviewer', '')) - with open(TARGET_DIR + 'complaints/award-complaint-reject.http', 'w') as self.app.file_obj: - response = self.app.patch_json( - '/tenders/{}/awards/{}/complaints/{}'.format(self.tender_id, award_id, complaint2_id), - {'data': { - "status": "invalid", - "rejectReason": "alreadyExists" - }}) - self.assertEqual(response.status, '200 OK') - - with open(TARGET_DIR + 'complaints/award-complaint-accept.http', 'w') as self.app.file_obj: - response = self.app.patch_json( - '/tenders/{}/awards/{}/complaints/{}'.format(self.tender_id, award_id, complaint1_id), - {'data': { - "status": "accepted", - "reviewDate": get_now().isoformat(), - "reviewPlace": "Place of review" - }}) - self.assertEqual(response.status, '200 OK') - - response = self.app.patch_json( - '/tenders/{}/awards/{}/complaints/{}'.format(self.tender_id, award_id, complaint3_id), - {'data': { - "status": "accepted", - "reviewDate": get_now().isoformat(), - "reviewPlace": "Place of review" - }}) - self.assertEqual(response.status, '200 OK') - - response = self.app.patch_json( - '/tenders/{}/awards/{}/complaints/{}'.format(self.tender_id, award_id, complaint4_id), - {'data': { - "status": "accepted", - "reviewDate": get_now().isoformat(), - "reviewPlace": "Place of review" - }}) - self.assertEqual(response.status, '200 OK') - - response = self.app.patch_json( - '/tenders/{}/awards/{}/complaints/{}'.format(self.tender_id, award_id, complaint5_id), - {'data': { - "status": "accepted", - "reviewDate": get_now().isoformat(), - "reviewPlace": "Place of review" - }}) - self.assertEqual(response.status, '200 OK') - - with open(TARGET_DIR + 'complaints/award-complaint-resolution-upload.http', 'w') as self.app.file_obj: - response = self.app.post( - '/tenders/{}/awards/{}/complaints/{}/documents'.format( - self.tender_id, award_id, complaint1_id), - upload_files=[('file', u'ComplaintResolution.pdf', 'content')]) - self.assertEqual(response.status, '201 Created') - - with open(TARGET_DIR + 'complaints/award-complaint-resolve.http', 'w') as self.app.file_obj: - response = self.app.patch_json( - '/tenders/{}/awards/{}/complaints/{}'.format(self.tender_id, award_id, complaint1_id), - {'data': { - "status": "satisfied" - }}) - self.assertEqual(response.status, '200 OK') - - with open(TARGET_DIR + 'complaints/award-complaint-decline.http', 'w') as self.app.file_obj: - response = self.app.patch_json( - '/tenders/{}/awards/{}/complaints/{}'.format(self.tender_id, award_id, complaint3_id), - {'data': { - "status": "declined" - }}) - self.assertEqual(response.status, '200 OK') - - with open(TARGET_DIR + 'complaints/award-complaint-accepted-stopped.http', 'w') as self.app.file_obj: - response = self.app.patch_json( - '/tenders/{}/awards/{}/complaints/{}'.format(self.tender_id, award_id, complaint5_id), - {'data': { - "decision": "Тендер скасовується замовником", - "status": "stopped", - "rejectReason": "tenderCancelled" - }}) - self.assertEqual(response.status, '200 OK') - - with open(TARGET_DIR + 'complaints/award-complaints-list.http', 'w') as self.app.file_obj: - self.app.authorization = None - response = self.app.get('/tenders/{}/awards/{}/complaints'.format(self.tender_id, award_id)) - self.assertEqual(response.status, '200 OK') - - with open(TARGET_DIR + 'complaints/award-complaint.http', 'w') as self.app.file_obj: - self.app.authorization = None - response = self.app.get( - '/tenders/{}/awards/{}/complaints/{}'.format(self.tender_id, award_id, complaint1_id)) - self.assertEqual(response.status, '200 OK') - - self.app.authorization = ('Basic', ('broker', '')) - with open(TARGET_DIR + 'complaints/award-complaint-resolved.http', 'w') as self.app.file_obj: - response = self.app.patch_json( - '/tenders/{}/awards/{}/complaints/{}?acc_token={}'.format( - self.tender_id, award_id, complaint1_id, owner_token), - {'data': { - "tendererAction": "Умови виправлено, вибір переможня буде розгянуто повторно", - "status": "resolved" - }}) - self.assertEqual(response.status, '200 OK') - - if RELEASE_2020_04_19 > get_now(): - with open(TARGET_DIR + 'complaints/award-complaint-accepted-stopping.http', 'w') as self.app.file_obj: - response = self.app.patch_json( - '/tenders/{}/awards/{}/complaints/{}?acc_token={}'.format( - self.tender_id, award_id, complaint4_id, complaint4_token), - {'data': { - "cancellationReason": "Тендер скасовується замовником", - "status": "stopping", - }}, - status=200, - ) - self.assertEqual(response.status, '200 OK') - - self.app.authorization = ('Basic', ('reviewer', '')) - with open(TARGET_DIR + 'complaints/award-complaint-stopping-stopped.http', 'w') as self.app.file_obj: - response = self.app.patch_json( - '/tenders/{}/awards/{}/complaints/{}'.format(self.tender_id, award_id, complaint4_id), - {'data': { - "decision": "Тендер скасовується замовником", - "status": "stopped", - "rejectReason": "tenderCancelled" - }}) - self.assertEqual(response.status, '200 OK') - else: - with open(TARGET_DIR + 'complaints/award-complaint-accepted-stopping-2020-04-19.http', 'w') as self.app.file_obj: - response = self.app.patch_json( - '/tenders/{}/awards/{}/complaints/{}?acc_token={}'.format( - self.tender_id, award_id, complaint4_id, complaint4_token), - {'data': { - "cancellationReason": "Тендер скасовується замовником", - "status": "stopping", - }}, - status=403, - ) - self.assertEqual(response.status, '403 Forbidden') - - self.app.authorization = ('Basic', ('reviewer', '')) - response = self.app.patch_json( - '/tenders/{}/awards/{}/complaints/{}?acc_token={}'.format( - self.tender_id, award_id, complaint4_id, complaint4_token), - {'data': { - "status": "declined", - "rejectReason": "tenderCancelled", - }}) - self.assertEqual(response.status, '200 OK') - - self.app.authorization = ('Basic', ('broker', '')) - with open(TARGET_DIR + 'complaints/award-complaint-satisfied-resolving.http', 'w') as self.app.file_obj: - response = self.app.patch_json( - '/tenders/{}/awards/{}?acc_token={}'.format(self.tender_id, award_id, owner_token), - {'data': { - "status": "cancelled" - }}) - self.assertEqual(response.status, '200 OK') - new_award_id = response.headers['Location'][-32:] - - award_id = new_award_id - complaint_url = "/tenders/{}/awards/{}/complaints".format(self.tender_id, award_id) - self.app.patch_json( - '/tenders/{}/awards/{}?acc_token={}'.format(self.tender_id, award_id, owner_token), - {"data": {"status": "active"}}) - self.assertEqual(response.status, '200 OK') - - with open(TARGET_DIR + 'complaints/award-complaint-submit.http', 'w') as self.app.file_obj: - response = self.app.post_json( - '/tenders/{}/awards/{}/complaints?acc_token={}'.format( - self.tender_id, award_id, bid_token), - {'data': complaint}) - self.assertEqual(response.status, '201 Created') - - if get_now() < RELEASE_2020_04_19: - # before RELEASE_2020_04_19 from pending to mistaken transition was available by reviewer - self.app.authorization = ('Basic', ('broker', '')) - complaint9_id, complaint9_token = complaint_create_pending(self, complaint_url, complaint_data, bid_token) - - with open(TARGET_DIR + 'complaints/award-complaint-mistaken.http', 'w') as self.app.file_obj: - self.app.authorization = ('Basic', ('reviewer', '')) - response = self.app.patch_json( - '/tenders/{}/awards/{}/complaints/{}?acc_token={}'.format( - self.tender_id, - award_id, - complaint9_id, - complaint9_token - ), - {'data': {"status": "mistaken"}}, - ) - self.assertEqual(response.status, '200 OK') - else: - # since RELEASE_2020_04_19 from draft to mistaken transition was available by complainant - self.app.authorization = ('Basic', ('broker', '')) - response = self.app.post_json( - '/tenders/{}/awards/{}/complaints?acc_token={}'.format( - self.tender_id, award_id, bid_token), - {'data': complaint}) - self.assertEqual(response.status, '201 Created') - complaint9_id = response.json['data']['id'] - complaint9_token = response.json['access']['token'] - - with open(TARGET_DIR + 'complaints/award-complaint-mistaken-2020-04-19.http', 'w') as self.app.file_obj: - response = self.app.patch_json( - '/tenders/{}/awards/{}/complaints/{}?acc_token={}'.format( - self.tender_id, - award_id, - complaint9_id, - complaint9_token), - {'data': {"status": "mistaken"}}, - ) - self.assertEqual(response.status, '200 OK') - - def test_cancellation_complaints(self): - self.app.authorization = ('Basic', ('broker', '')) - - response = self.app.post_json( - '/tenders?opt_pretty=1', - {'data': test_tender_data}) - self.assertEqual(response.status, '201 Created') - - tender = response.json['data'] - owner_token = response.json['access']['token'] - self.tender_id = tender['id'] - - # Cancellation turn to complaint_period - response = self.app.post_json( - '/tenders/{}/cancellations?acc_token={}'.format( - self.tender_id, owner_token), - {'data': {'reason': 'cancellation reason', 'reasonType': 'noDemand'}}) - cancellation_id = response.json['data']['id'] - self.assertEqual(response.status, '201 Created') - - response = self.app.post( - '/tenders/{}/cancellations/{}/documents?acc_token={}'.format( - self.tender_id, cancellation_id, owner_token), - upload_files=[('file', u'Notice.pdf', 'content')]) - self.assertEqual(response.status, '201 Created') - - response = self.app.patch_json( - '/tenders/{}/cancellations/{}?acc_token={}'.format( - self.tender_id, cancellation_id, owner_token), - {'data': {"status": "pending"}}) - self.assertEqual(response.status, '200 OK') - - with open(TARGET_DIR + 'complaints/cancellation-complaint-submission.http', 'w') as self.app.file_obj: - response = self.app.post_json( - '/tenders/{}/cancellations/{}/complaints'.format( - self.tender_id, cancellation_id), - {'data': complaint}) - self.assertEqual(response.status, '201 Created') - - complaint1_token = response.json['access']['token'] - complaint1_id = response.json['data']['id'] - - with open(TARGET_DIR + 'complaints/cancellation-complaint-submission-upload.http', 'w') as self.app.file_obj: - response = self.app.post( - '/tenders/{}/cancellations/{}/complaints/{}/documents?acc_token={}'.format( - self.tender_id, cancellation_id, complaint1_id, complaint1_token), - upload_files=[('file', u'Complaint_Attachment.pdf', 'content')]) - self.assertEqual(response.status, '201 Created') - - complaint_data = {'data': complaint.copy()} - - complaint_url = "/tenders/{}/cancellations/{}/complaints".format(self.tender_id, cancellation_id) - complaint3_id, complaint3_token = complaint_create_pending(self, complaint_url, complaint_data) - - complaint4_id, complaint4_token = complaint_create_pending(self, complaint_url, complaint_data) - - with open(TARGET_DIR + 'complaints/cancellation-complaint-complaint.http', 'w') as self.app.file_obj: - if get_now() < RELEASE_2020_04_19: - response = self.app.patch_json( - '/tenders/{}/cancellations/{}/complaints/{}?acc_token={}'.format( - self.tender_id, cancellation_id, complaint1_id, complaint1_token), - {"data": {"status": "pending"}}) - else: - with change_auth(self.app, ("Basic", ("bot", ""))): - response = self.app.patch_json( - '/tenders/{}/cancellations/{}/complaints/{}'.format( - self.tender_id, cancellation_id, complaint1_id), - {"data": {"status": "pending"}}) - - self.assertEqual(response.status, '200 OK') - - complaint5_id, complaint5_token = complaint_create_pending(self, complaint_url, complaint_data) - complaint6_id, complaint6_token = complaint_create_pending(self, complaint_url, complaint_data) - - self.app.authorization = ('Basic', ('reviewer', '')) - with open(TARGET_DIR + 'complaints/cancellation-complaint-reject.http', 'w') as self.app.file_obj: - response = self.app.patch_json( - '/tenders/{}/cancellations/{}/complaints/{}'.format( - self.tender_id, cancellation_id, complaint4_id), - {'data': { - "status": "invalid", - "rejectReason": "tenderCancelled", - "rejectReasonDescription": "reject reason description", - }}) - self.assertEqual(response.status, '200 OK') - - with open(TARGET_DIR + 'complaints/cancellation-complaint-accept.http', 'w') as self.app.file_obj: - response = self.app.patch_json( - '/tenders/{}/cancellations/{}/complaints/{}'.format( - self.tender_id, cancellation_id, complaint1_id), - {'data': { - "status": "accepted", - "reviewDate": get_now().isoformat(), - "reviewPlace": "some", - }}) - self.assertEqual(response.status, '200 OK') - - response = self.app.patch_json( - '/tenders/{}/cancellations/{}/complaints/{}'.format( - self.tender_id, cancellation_id, complaint3_id), - {'data': { - "status": "accepted", - "reviewDate": get_now().isoformat(), - "reviewPlace": "some", - }}) - self.assertEqual(response.status, '200 OK') - - response = self.app.patch_json( - '/tenders/{}/cancellations/{}/complaints/{}'.format( - self.tender_id, cancellation_id, complaint5_id), - {'data': { - "status": "accepted", - "reviewDate": get_now().isoformat(), - "reviewPlace": "some", - }}) - self.assertEqual(response.status, '200 OK') - - response = self.app.patch_json( - '/tenders/{}/cancellations/{}/complaints/{}'.format( - self.tender_id, cancellation_id, complaint6_id), - {'data': { - "status": "accepted", - "reviewDate": get_now().isoformat(), - "reviewPlace": "some", - }}) - self.assertEqual(response.status, '200 OK') - - with open(TARGET_DIR + 'complaints/cancellation-complaint-resolution-upload.http', 'w') as self.app.file_obj: - response = self.app.post( - '/tenders/{}/cancellations/{}/complaints/{}/documents'.format - (self.tender_id, cancellation_id, complaint1_id), - upload_files=[('file', u'ComplaintResolution.pdf', 'content')]) - self.assertEqual(response.status, '201 Created') - - with open(TARGET_DIR + 'complaints/cancellation-complaint-resolve.http', 'w') as self.app.file_obj: - response = self.app.patch_json( - '/tenders/{}/cancellations/{}/complaints/{}'.format( - self.tender_id, cancellation_id, complaint1_id), - {'data': { - "status": "satisfied" - }}) - self.assertEqual(response.status, '200 OK') - - with open(TARGET_DIR + 'complaints/cancellation-complaint-decline.http', 'w') as self.app.file_obj: - response = self.app.patch_json( - '/tenders/{}/cancellations/{}/complaints/{}'.format( - self.tender_id, cancellation_id, complaint3_id), - {'data': { - "status": "declined" - }}) - self.assertEqual(response.status, '200 OK') - - with open(TARGET_DIR + 'complaints/cancellation-complaint-accepted-stopped.http', 'w') as self.app.file_obj: - response = self.app.patch_json( - '/tenders/{}/cancellations/{}/complaints/{}'.format( - self.tender_id, cancellation_id, complaint5_id), - {'data': { - "decision": "Тендер скасовується замовником", - "status": "stopped", - "rejectReason": "tenderCancelled", - }}) - self.assertEqual(response.status, '200 OK') - - self.app.authorization = ('Basic', ('broker', '')) - - response = self.app.patch_json( - '/tenders/{}/cancellations/{}?acc_token={}'.format( - self.tender_id, cancellation_id, owner_token), - {'data': {'status': 'unsuccessful'}} - ) - self.assertEqual(response.status_code, 200) - - with open(TARGET_DIR + 'complaints/cancellation-complaint-resolved.http', 'w') as self.app.file_obj: - response = self.app.patch_json( - '/tenders/{}/cancellations/{}/complaints/{}?acc_token={}'.format( - self.tender_id, cancellation_id, complaint1_id, owner_token), - {'data': { - "tendererAction": "Умови виправлено", - "status": "resolved", - }}) - self.assertEqual(response.status, '200 OK') - - self.app.authorization = ('Basic', ('reviewer', '')) - with open(TARGET_DIR + 'complaints/cancellation-complaint-accepted-stopped.http', 'w') as self.app.file_obj: - response = self.app.patch_json( - '/tenders/{}/cancellations/{}/complaints/{}'.format( - self.tender_id, cancellation_id, complaint6_id), - {'data': { - "decision": "Тендер скасовується замовником", - "status": "stopped", - "rejectReason": "tenderCancelled", - }}) - self.assertEqual(response.status, '200 OK') - - self.app.authorization = ('Basic', ('broker', '')) - # Create new cancellations - response = self.app.post_json( - '/tenders/{}/cancellations?acc_token={}'.format( - self.tender_id, owner_token), - {'data': {'reason': 'cancellation reason', 'reasonType': 'unFixable'}}) - cancellation2_id = response.json['data']['id'] - self.assertEqual(response.status, '201 Created') - - response = self.app.post( - '/tenders/{}/cancellations/{}/documents?acc_token={}'.format( - self.tender_id, cancellation2_id, owner_token), - upload_files=[('file', u'Notice.pdf', 'content')]) - self.assertEqual(response.status, '201 Created') - - response = self.app.patch_json( - '/tenders/{}/cancellations/{}?acc_token={}'.format( - self.tender_id, cancellation2_id, owner_token), - {'data': {"status": "pending"}}) - self.assertEqual(response.status, '200 OK') - - response = self.app.post_json( - '/tenders/{}/cancellations/{}/complaints'.format(self.tender_id, cancellation2_id), - {'data': complaint}) - self.assertEqual(response.status, '201 Created') - - with open(TARGET_DIR + 'complaints/cancellation-complaints-list.http', 'w') as self.app.file_obj: - self.app.authorization = None - response = self.app.get('/tenders/{}/cancellations/{}/complaints'.format( - self.tender_id, cancellation_id)) - self.assertEqual(response.status, '200 OK') - - with open(TARGET_DIR + 'complaints/cancellation-complaint.http', 'w') as self.app.file_obj: - self.app.authorization = None - response = self.app.get('/tenders/{}/cancellations/{}/complaints/{}'.format( - self.tender_id, cancellation_id, complaint1_id)) - self.assertEqual(response.status, '200 OK') \ No newline at end of file +# -*- coding: utf-8 -*- +import os +import mock +from copy import deepcopy +from datetime import timedelta +from iso8601 import parse_date + +from openprocurement.api.models import get_now +from openprocurement.tender.openeu.tests.tender import BaseTenderWebTest +from openprocurement.tender.core.tests.base import change_auth + +from openprocurement.api.constants import RELEASE_2020_04_19 +from tests.base.constants import DOCS_URL, AUCTIONS_URL +from tests.base.test import DumpsWebTestApp, MockWebTestMixin +from tests.base.data import ( + question, complaint, claim, lots, subcontracting, + bid_draft, bid2, bid3_with_docs, + qualified, tender_openeu +) +from tests.base.helpers import complaint_create_pending +from openprocurement.tender.belowthreshold.tests.base import test_criteria +from tests.base.constants import MOCK_DATETIME + +test_tender_data = deepcopy(tender_openeu) +test_lots = deepcopy(lots) +bid = deepcopy(bid_draft) +bid2 = deepcopy(bid2) +bid3 = deepcopy(bid3_with_docs) + +bid.update(subcontracting) +bid.update(qualified) +bid2.update(qualified) +bid3.update(qualified) + +test_lots[0]['value'] = test_tender_data['value'] +test_lots[0]['minimalStep'] = test_tender_data['minimalStep'] +test_lots[1]['value'] = test_tender_data['value'] +test_lots[1]['minimalStep'] = test_tender_data['minimalStep'] + +BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) +TARGET_DIR = os.path.join(BASE_DIR, 'source/tendering/http/') + + +class TenderResourceTest(BaseTenderWebTest, MockWebTestMixin): + AppClass = DumpsWebTestApp + + relative_to = os.path.dirname(__file__) + initial_data = test_tender_data + docservice = True + docservice_url = DOCS_URL + auctions_url = AUCTIONS_URL + + def setUp(self): + super(TenderResourceTest, self).setUp() + self.setUpMock() + + def tearDown(self): + self.tearDownMock() + super(TenderResourceTest, self).tearDown() + + def test_complaints(self): + self.app.authorization = ('Basic', ('broker', '')) + + response = self.app.post_json( + '/tenders?opt_pretty=1', + {'data': test_tender_data}) + self.assertEqual(response.status, '201 Created') + + tender = response.json['data'] + owner_token = response.json['access']['token'] + self.tender_id = tender['id'] + + with open(TARGET_DIR + 'complaints/claim-submission.http', 'w') as self.app.file_obj: + response = self.app.post_json( + '/tenders/{}/complaints'.format(self.tender_id), + {'data': claim}) + self.assertEqual(response.status, '201 Created') + + complaint_token = response.json['access']['token'] + complaint_id = response.json['data']['id'] + + with open(TARGET_DIR + 'complaints/complaint-submission-upload.http', 'w') as self.app.file_obj: + response = self.app.post( + '/tenders/{}/complaints/{}/documents?acc_token={}'.format(self.tender_id, complaint_id, + complaint_token), + upload_files=[('file', u'Complaint_Attachment.pdf', 'content')]) + self.assertEqual(response.status, '201 Created') + + with open(TARGET_DIR + 'complaints/complaint-claim.http', 'w') as self.app.file_obj: + response = self.app.patch_json( + '/tenders/{}/complaints/{}?acc_token={}'.format(self.tender_id, complaint_id, complaint_token), + {"data": {"status": "claim"}}) + self.assertEqual(response.status, '200 OK') + + claim_data = {'data': claim.copy()} + claim_data['data']['status'] = 'claim' + with open(TARGET_DIR + 'complaints/complaint-submission-claim.http', 'w') as self.app.file_obj: + response = self.app.post_json( + '/tenders/{}/complaints'.format(self.tender_id), claim_data) + self.assertEqual(response.status, '201 Created') + + complaint2_token = response.json['access']['token'] + complaint2_id = response.json['data']['id'] + + complaint_data = {'data': complaint.copy()} + + complaint_url = "/tenders/{}/complaints".format(self.tender_id) + complaint3_id, complaint3_token = complaint_create_pending(self, complaint_url, complaint_data) + + response = self.app.post_json( + '/tenders/{}/complaints'.format(self.tender_id), claim_data) + self.assertEqual(response.status, '201 Created') + complaint4_id = response.json['data']['id'] + complaint4_token = response.json['access']['token'] + + with open(TARGET_DIR + 'complaints/complaint-submission.http', 'w') as self.app.file_obj: + response = self.app.post_json( + '/tenders/{}/complaints'.format(self.tender_id), + {'data': complaint}) + self.assertEqual(response.status, '201 Created') + + complaint1_token = response.json['access']['token'] + complaint1_id = response.json['data']['id'] + + with open(TARGET_DIR + 'complaints/complaint-complaint.http', 'w') as self.app.file_obj: + if get_now() < RELEASE_2020_04_19: + response = self.app.patch_json( + '/tenders/{}/complaints/{}?acc_token={}'.format(self.tender_id, complaint1_id, complaint1_token), + {"data": {"status": "pending"}}) + else: + with change_auth(self.app, ("Basic", ("bot", ""))): + response = self.app.patch_json( + '/tenders/{}/complaints/{}'.format(self.tender_id, complaint1_id), + {"data": {"status": "pending"}}) + self.assertEqual(response.status, '200 OK') + + with open(TARGET_DIR + 'complaints/complaint-answer.http', 'w') as self.app.file_obj: + response = self.app.patch_json( + '/tenders/{}/complaints/{}?acc_token={}'.format(self.tender_id, complaint2_id, owner_token), + {'data': { + "status": "answered", + "resolutionType": "resolved", + "resolution": "Виправлено неконкурентні умови" + }}) + self.assertEqual(response.status, '200 OK') + + response = self.app.patch_json( + '/tenders/{}/complaints/{}?acc_token={}'.format(self.tender_id, complaint4_id, owner_token), + {'data': { + "status": "answered", + "resolutionType": "invalid", + "resolution": "Вимога не відповідає предмету закупівлі" + }}) + self.assertEqual(response.status, '200 OK') + + with open(TARGET_DIR + 'complaints/complaint-satisfy.http', 'w') as self.app.file_obj: + response = self.app.patch_json( + '/tenders/{}/complaints/{}?acc_token={}'.format(self.tender_id, complaint2_id, complaint2_token), + {"data": { + "satisfied": True, + "status": "resolved" + }}) + self.assertEqual(response.status, '200 OK') + + if get_now() < RELEASE_2020_04_19: + with open(TARGET_DIR + 'complaints/complaint-escalate.http', 'w') as self.app.file_obj: + response = self.app.patch_json( + '/tenders/{}/complaints/{}?acc_token={}'.format(self.tender_id, complaint4_id, complaint4_token), + {"data": { + "satisfied": False, + "status": "pending" + }}) + self.assertEqual(response.status, '200 OK') + + complaint5_id, complaint5_token = complaint_create_pending(self, complaint_url, complaint_data) + complaint6_id, complaint6_token = complaint_create_pending(self, complaint_url, complaint_data) + complaint9_id, complaint9_token = complaint_create_pending(self, complaint_url, complaint_data) + + self.app.authorization = ('Basic', ('reviewer', '')) + with open(TARGET_DIR + 'complaints/complaint-reject.http', 'w') as self.app.file_obj: + response = self.app.patch_json( + '/tenders/{}/complaints/{}'.format(self.tender_id, complaint9_id), + {'data': { + "status": "invalid", + "rejectReason": "alreadyExists" + }}) + self.assertEqual(response.status, '200 OK') + + with open(TARGET_DIR + 'complaints/complaint-accept.http', 'w') as self.app.file_obj: + response = self.app.patch_json( + '/tenders/{}/complaints/{}'.format(self.tender_id, complaint1_id), + {'data': { + "status": "accepted", + "reviewDate": get_now().isoformat(), + "reviewPlace": "Place of review" + }}) + self.assertEqual(response.status, '200 OK') + + response = self.app.patch_json( + '/tenders/{}/complaints/{}'.format(self.tender_id, complaint3_id), + {'data': { + "status": "accepted", + "reviewDate": get_now().isoformat(), + "reviewPlace": "Place of review" + }}) + self.assertEqual(response.status, '200 OK') + + response = self.app.patch_json( + '/tenders/{}/complaints/{}'.format(self.tender_id, complaint5_id), + {'data': { + "status": "accepted", + "reviewDate": get_now().isoformat(), + "reviewPlace": "Place of review" + }}) + self.assertEqual(response.status, '200 OK') + + response = self.app.patch_json( + '/tenders/{}/complaints/{}'.format(self.tender_id, complaint6_id), + {'data': { + "status": "accepted", + "reviewDate": get_now().isoformat(), + "reviewPlace": "Place of review" + }}) + self.assertEqual(response.status, '200 OK') + + with open(TARGET_DIR + 'complaints/complaint-resolution-upload.http', 'w') as self.app.file_obj: + response = self.app.post('/tenders/{}/complaints/{}/documents'.format(self.tender_id, complaint1_id), + upload_files=[('file', u'ComplaintResolution.pdf', 'content')]) + self.assertEqual(response.status, '201 Created') + + with open(TARGET_DIR + 'complaints/complaint-resolve.http', 'w') as self.app.file_obj: + response = self.app.patch_json( + '/tenders/{}/complaints/{}'.format(self.tender_id, complaint1_id), + {'data': { + "status": "satisfied" + }}) + self.assertEqual(response.status, '200 OK') + + with open(TARGET_DIR + 'complaints/complaint-decline.http', 'w') as self.app.file_obj: + response = self.app.patch_json( + '/tenders/{}/complaints/{}'.format(self.tender_id, complaint3_id), + {'data': { + "status": "declined" + }}) + self.assertEqual(response.status, '200 OK') + + with open(TARGET_DIR + 'complaints/complaint-accepted-stopped.http', 'w') as self.app.file_obj: + response = self.app.patch_json( + '/tenders/{}/complaints/{}'.format(self.tender_id, complaint5_id), + {'data': { + "decision": "Тендер скасовується замовником", + "status": "stopped", + "rejectReason": "tenderCancelled" + }}) + self.assertEqual(response.status, '200 OK') + + self.app.authorization = ('Basic', ('broker', '')) + with open(TARGET_DIR + 'complaints/complaint-resolved.http', 'w') as self.app.file_obj: + response = self.app.patch_json( + '/tenders/{}/complaints/{}?acc_token={}'.format(self.tender_id, complaint1_id, owner_token), + {'data': { + "tendererAction": "Умови виправлено", + "status": "resolved" + }}) + self.assertEqual(response.status, '200 OK') + + if RELEASE_2020_04_19 > get_now(): + with open(TARGET_DIR + 'complaints/complaint-accepted-stopping.http', 'w') as self.app.file_obj: + response = self.app.patch_json( + '/tenders/{}/complaints/{}?acc_token={}'.format(self.tender_id, complaint6_id, complaint6_token), + {"data": { + "cancellationReason": "Тендер скасовується замовником", + "status": "stopping" + }}, + status=200, + ) + self.assertEqual(response.status, '200 OK') + + self.app.authorization = ('Basic', ('reviewer', '')) + with open(TARGET_DIR + 'complaints/complaint-stopping-stopped.http', 'w') as self.app.file_obj: + response = self.app.patch_json( + '/tenders/{}/complaints/{}'.format(self.tender_id, complaint6_id), + {'data': { + "decision": "Тендер скасовується замовником", + "status": "stopped", + "rejectReason": "tenderCancelled" + }}) + self.assertEqual(response.status, '200 OK') + else: + with open(TARGET_DIR + 'complaints/complaint-accepted-stopping-2020-04-19.http', 'w') as self.app.file_obj: + response = self.app.patch_json( + '/tenders/{}/complaints/{}?acc_token={}'.format(self.tender_id, complaint6_id, complaint6_token), + {"data": { + "cancellationReason": "Тендер скасовується замовником", + "status": "stopping" + }}, + status=403, + ) + self.assertEqual(response.status, '403 Forbidden') + + if get_now() < RELEASE_2020_04_19: + # before RELEASE_2020_04_19 from pending to mistaken transition was available by reviewer + self.app.authorization = ('Basic', ('broker', '')) + complaint7_id, complaint7_token = complaint_create_pending(self, complaint_url, complaint_data) + + with open(TARGET_DIR + 'complaints/complaint-mistaken.http', 'w') as self.app.file_obj: + self.app.authorization = ('Basic', ('reviewer', '')) + response = self.app.patch_json( + '/tenders/{}/complaints/{}?acc_token={}'.format(self.tender_id, complaint7_id, complaint7_token), + {"data": {"status": "mistaken"}}, + ) + self.assertEqual(response.status, '200 OK') + else: + # since RELEASE_2020_04_19 from draft to mistaken transition was available by complainant + self.app.authorization = ('Basic', ('broker', '')) + response = self.app.post_json( + '/tenders/{}/complaints'.format(self.tender_id), + {'data': complaint}) + self.assertEqual(response.status, '201 Created') + complaint7_id = response.json['data']['id'] + complaint7_token = response.json['access']['token'] + + with open(TARGET_DIR + 'complaints/complaint-mistaken-2020-04-19.http', 'w') as self.app.file_obj: + response = self.app.patch_json( + '/tenders/{}/complaints/{}?acc_token={}'.format(self.tender_id, complaint7_id, complaint7_token), + {"data": {"status": "mistaken"}}, + ) + self.assertEqual(response.status, '200 OK') + + self.app.authorization = ('Basic', ('broker', '')) + complaint_url = "/tenders/{}/complaints".format(self.tender_id) + complaint8_id, complaint8_token = complaint_create_pending(self, complaint_url, complaint_data) + + self.app.authorization = ('Basic', ('reviewer', '')) + + with open(TARGET_DIR + 'complaints/complaint-post-reviewer-complaint-owner.http', 'w') as self.app.file_obj: + response = self.app.post_json( + '/tenders/{}/complaints/{}/posts'.format( + self.tender_id, complaint8_id), + {"data": { + "title": "Уточнення по вимозі", + "description": "Відсутній документ", + "recipient": "complaint_owner", + }}) + self.assertEqual(response.status, '201 Created') + + post1_id = response.json['data']['id'] + + self.app.authorization = ('Basic', ('broker', '')) + + with open(TARGET_DIR + 'complaints/complaint-post-complaint-owner.http', 'w') as self.app.file_obj: + response = self.app.post_json( + '/tenders/{}/complaints/{}/posts?acc_token={}'.format( + self.tender_id, complaint8_id, complaint8_token), + {"data": { + "title": "Уточнення по вимозі", + "description": "Додано документ", + "recipient": "aboveThresholdReviewers", + "relatedPost": post1_id, + "documents": [{ + 'title': u'post_document_complaint.pdf', + 'url': self.generate_docservice_url(), + 'hash': 'md5:' + '0' * 32, + 'format': 'application/pdf' + }] + }}) + self.assertEqual(response.status, '201 Created') + + self.app.authorization = ('Basic', ('reviewer', '')) + + with open(TARGET_DIR + 'complaints/complaint-post-reviewer-tender-owner.http', 'w') as self.app.file_obj: + response = self.app.post_json( + '/tenders/{}/complaints/{}/posts'.format( + self.tender_id, complaint8_id), + {"data": { + "title": "Уточнення по вимозі", + "description": "Відсутній документ", + "recipient": "tender_owner", + }}) + self.assertEqual(response.status, '201 Created') + + post2_id = response.json['data']['id'] + + self.app.authorization = ('Basic', ('broker', '')) + + with open(TARGET_DIR + 'complaints/complaint-post-tender-owner.http', 'w') as self.app.file_obj: + response = self.app.post_json( + '/tenders/{}/complaints/{}/posts?acc_token={}'.format( + self.tender_id, complaint8_id, owner_token), + {"data": { + "title": "Уточнення по вимозі", + "description": "Додано документ", + "recipient": "aboveThresholdReviewers", + "relatedPost": post2_id, + "documents": [{ + 'title': u'post_document_tender.pdf', + 'url': self.generate_docservice_url(), + 'hash': 'md5:' + '0' * 32, + 'format': 'application/pdf' + }] + }}) + self.assertEqual(response.status, '201 Created') + + with open(TARGET_DIR + 'complaints/complaints-list.http', 'w') as self.app.file_obj: + self.app.authorization = None + response = self.app.get('/tenders/{}/complaints'.format(self.tender_id)) + self.assertEqual(response.status, '200 OK') + + with open(TARGET_DIR + 'complaints/complaint.http', 'w') as self.app.file_obj: + self.app.authorization = None + response = self.app.get('/tenders/{}/complaints/{}'.format(self.tender_id, complaint1_id)) + self.assertEqual(response.status, '200 OK') + + def test_qualification_complaints(self): + self.app.authorization = ('Basic', ('broker', '')) + + response = self.app.post_json( + '/tenders?opt_pretty=1', + {'data': test_tender_data}) + self.assertEqual(response.status, '201 Created') + + tender = response.json['data'] + owner_token = response.json['access']['token'] + self.tender_id = tender['id'] + + response = self.app.post_json( + '/tenders/{}/bids'.format(self.tender_id), + {'data': bid}) + bid_id = response.json['data']['id'] + bid_token = response.json['access']['token'] + + response = self.app.patch_json( + '/tenders/{}/bids/{}?acc_token={}'.format( + self.tender_id, bid_id, bid_token), + {'data': {"status": "pending"}}) + + # create second bid + self.app.authorization = ('Basic', ('broker', '')) + response = self.app.post_json( + '/tenders/{}/bids'.format(self.tender_id), + {'data': bid2}) + + # Pre-qualification + self.set_status('active.pre-qualification', {"id": self.tender_id, 'status': 'active.tendering'}) + auth = self.app.authorization + self.app.authorization = ('Basic', ('chronograph', '')) + response = self.app.patch_json( + '/tenders/{}'.format(self.tender_id), + {'data': {"id": self.tender_id}}) + self.app.authorization = auth + + response = self.app.get('/tenders/{}/qualifications'.format(self.tender_id)) + self.assertEqual(response.status, "200 OK") + qualifications = response.json['data'] + + for qualification in qualifications: + response = self.app.patch_json( + '/tenders/{}/qualifications/{}?acc_token={}'.format(self.tender_id, qualification['id'], owner_token), + {"data": { + "status": "active", + "qualified": True, + "eligible": True + }}) + self.assertEqual(response.status, "200 OK") + + self.tick() + + # active.pre-qualification.stand-still + response = self.app.patch_json( + '/tenders/{}?acc_token={}'.format(self.tender_id, owner_token), + {"data": {"status": "active.pre-qualification.stand-still"}}) + self.assertEqual(response.status, "200 OK") + self.assertEqual(response.json['data']['status'], "active.pre-qualification.stand-still") + + qualification_id = qualifications[0]['id'] + + with open(TARGET_DIR + 'complaints/qualification-complaint-submission.http', 'w') as self.app.file_obj: + response = self.app.post_json( + '/tenders/{}/qualifications/{}/complaints?acc_token={}'.format( + self.tender_id, qualification_id, bid_token), + {'data': complaint}) + self.assertEqual(response.status, '201 Created') + + complaint1_token = response.json['access']['token'] + complaint1_id = response.json['data']['id'] + + with open(TARGET_DIR + 'complaints/qualification-complaint-submission-upload.http', 'w') as self.app.file_obj: + response = self.app.post( + '/tenders/{}/qualifications/{}/complaints/{}/documents?acc_token={}'.format( + self.tender_id, qualification_id, complaint1_id, complaint1_token), + upload_files=[('file', u'Complaint_Attachment.pdf', 'content')]) + self.assertEqual(response.status, '201 Created') + + with open(TARGET_DIR + 'complaints/qualification-complaint-complaint.http', 'w') as self.app.file_obj: + if get_now() < RELEASE_2020_04_19: + response = self.app.patch_json( + '/tenders/{}/qualifications/{}/complaints/{}?acc_token={}'.format( + self.tender_id, qualification_id, complaint1_id, complaint1_token), + {"data": {"status": "pending"}}) + else: + with change_auth(self.app, ("Basic", ("bot", ""))): + response = self.app.patch_json( + '/tenders/{}/qualifications/{}/complaints/{}'.format( + self.tender_id, qualification_id, complaint1_id), + {"data": {"status": "pending"}}) + self.assertEqual(response.status, '200 OK') + + complaint_data = {'data': complaint.copy()} + + complaint_url = "/tenders/{}/qualifications/{}/complaints".format(self.tender_id, qualification_id) + complaint2_id, complaint2_token = complaint_create_pending(self, complaint_url, complaint_data, bid_token) + + complaint3_id, complaint3_token = complaint_create_pending(self, complaint_url, complaint_data, bid_token) + + complaint4_id, complaint4_token = complaint_create_pending(self, complaint_url, complaint_data, bid_token) + + complaint5_id, complaint5_token = complaint_create_pending(self, complaint_url, complaint_data, bid_token) + + claim_data = {'data': claim.copy()} + claim_data['data']['status'] = 'claim' + with open(TARGET_DIR + 'complaints/qualification-complaint-submission-claim.http', 'w') as self.app.file_obj: + response = self.app.post_json( + '/tenders/{}/qualifications/{}/complaints?acc_token={}'.format( + self.tender_id, qualification_id, bid_token), claim_data) + self.assertEqual(response.status, '201 Created') + + complaint6_token = response.json['access']['token'] + complaint6_id = response.json['data']['id'] + + with open(TARGET_DIR + 'complaints/qualification-complaint-answer.http', 'w') as self.app.file_obj: + response = self.app.patch_json( + '/tenders/{}/qualifications/{}/complaints/{}?acc_token={}'.format( + self.tender_id, qualification_id, complaint6_id, owner_token), + {"data": { + "status": "answered", + "resolutionType": "resolved", + "resolution": "Умови виправлено, вибір переможня буде розгянуто повторно" + }}) + self.assertEqual(response.status, '200 OK') + + with open(TARGET_DIR + 'complaints/qualification-complaint-satisfy.http', 'w') as self.app.file_obj: + response = self.app.patch_json( + '/tenders/{}/qualifications/{}/complaints/{}?acc_token={}'.format( + self.tender_id, qualification_id, complaint6_id, complaint6_token), + {"data": { + "satisfied": True, + }}) + self.assertEqual(response.status, '200 OK') + + response = self.app.post_json( + '/tenders/{}/qualifications/{}/complaints?acc_token={}'.format( + self.tender_id, qualification_id, bid_token), claim_data) + self.assertEqual(response.status, '201 Created') + complaint7_token = response.json['access']['token'] + complaint7_id = response.json['data']['id'] + + response = self.app.patch_json( + '/tenders/{}/qualifications/{}/complaints/{}?acc_token={}'.format( + self.tender_id, qualification_id, complaint7_id, owner_token), + {'data': { + "status": "answered", + "resolutionType": "invalid", + "resolution": "Вимога не відповідає предмету закупівлі" + }}) + self.assertEqual(response.status, '200 OK') + + with open(TARGET_DIR + 'complaints/qualification-complaint-unsatisfy.http', 'w') as self.app.file_obj: + response = self.app.patch_json( + '/tenders/{}/qualifications/{}/complaints/{}?acc_token={}'.format( + self.tender_id, qualification_id, complaint7_id, complaint7_token), + {"data": { + "satisfied": False, + }}) + self.assertEqual(response.status, '200 OK') + + complaint_url = "/tenders/{}/qualifications/{}/complaints".format(self.tender_id, qualification_id) + complaint8_id, complaint8_token = complaint_create_pending(self, complaint_url, complaint_data, bid_token) + + self.app.authorization = ('Basic', ('reviewer', '')) + + with open(TARGET_DIR + 'complaints/qualification-complaint-post-reviewer-complaint-owner.http', 'w') as self.app.file_obj: + response = self.app.post_json( + '/tenders/{}/qualifications/{}/complaints/{}/posts'.format( + self.tender_id, qualification_id, complaint8_id), + {"data": { + "title": "Уточнення по вимозі", + "description": "Відсутній документ", + "recipient": "complaint_owner", + }}) + self.assertEqual(response.status, '201 Created') + + post1_id = response.json['data']['id'] + + self.app.authorization = ('Basic', ('broker', '')) + + with open(TARGET_DIR + 'complaints/qualification-complaint-post-complaint-owner.http', 'w') as self.app.file_obj: + response = self.app.post_json( + '/tenders/{}/qualifications/{}/complaints/{}/posts?acc_token={}'.format( + self.tender_id, qualification_id, complaint8_id, complaint8_token), + {"data": { + "title": "Уточнення по вимозі", + "description": "Додано документ", + "recipient": "aboveThresholdReviewers", + "relatedPost": post1_id, + "documents": [{ + 'title': u'post_document_complaint.pdf', + 'url': self.generate_docservice_url(), + 'hash': 'md5:' + '0' * 32, + 'format': 'application/pdf' + }] + }}) + self.assertEqual(response.status, '201 Created') + + self.app.authorization = ('Basic', ('reviewer', '')) + + with open(TARGET_DIR + 'complaints/qualification-complaint-post-reviewer-tender-owner.http', 'w') as self.app.file_obj: + response = self.app.post_json( + '/tenders/{}/qualifications/{}/complaints/{}/posts'.format( + self.tender_id, qualification_id, complaint8_id), + {"data": { + "title": "Уточнення по вимозі", + "description": "Відсутній документ", + "recipient": "tender_owner", + }}) + self.assertEqual(response.status, '201 Created') + + post2_id = response.json['data']['id'] + + self.app.authorization = ('Basic', ('broker', '')) + + with open(TARGET_DIR + 'complaints/qualification-complaint-post-tender-owner.http', 'w') as self.app.file_obj: + response = self.app.post_json( + '/tenders/{}/qualifications/{}/complaints/{}/posts?acc_token={}'.format( + self.tender_id, qualification_id, complaint8_id, owner_token), + {"data": { + "title": "Уточнення по вимозі", + "description": "Додано документ", + "recipient": "aboveThresholdReviewers", + "relatedPost": post2_id, + "documents": [{ + 'title': u'post_document_tender.pdf', + 'url': self.generate_docservice_url(), + 'hash': 'md5:' + '0' * 32, + 'format': 'application/pdf' + }] + }}) + self.assertEqual(response.status, '201 Created') + + response = self.app.post_json( + '/tenders/{}/qualifications/{}/complaints?acc_token={}'.format( + self.tender_id, qualification_id, bid_token), + {'data': claim}) + self.assertEqual(response.status, '201 Created') + + with open(TARGET_DIR + 'complaints/qualification-complaint-claim.http', 'w') as self.app.file_obj: + response = self.app.patch_json( + '/tenders/{}/qualifications/{}/complaints/{}?acc_token={}'.format( + self.tender_id, qualification_id, + response.json['data']['id'], response.json['access']['token']), + {"data": { + "status": "claim" + }}) + self.assertEqual(response.status, '200 OK') + + if get_now() < RELEASE_2020_04_19: + # before RELEASE_2020_04_19 from pending to mistaken transition was available by reviewer + self.app.authorization = ('Basic', ('broker', '')) + complaint9_id, complaint9_token = complaint_create_pending(self, complaint_url, complaint_data, bid_token) + + with open(TARGET_DIR + 'complaints/qualification-complaint-mistaken.http', 'w') as self.app.file_obj: + self.app.authorization = ('Basic', ('reviewer', '')) + response = self.app.patch_json( + '/tenders/{}/qualifications/{}/complaints/{}?acc_token={}'.format( + self.tender_id, + qualification_id, + complaint9_id, + complaint9_token + ), + {"data": {"status": "mistaken"}}, + ) + self.assertEqual(response.status, '200 OK') + else: + # since RELEASE_2020_04_19 from draft to mistaken transition was available by complainant + self.app.authorization = ('Basic', ('broker', '')) + response = self.app.post_json( + '/tenders/{}/qualifications/{}/complaints?acc_token={}'.format( + self.tender_id, + qualification_id, + bid_token, + ), + {'data': complaint} + ) + self.assertEqual(response.status, '201 Created') + complaint9_id = response.json['data']['id'] + complaint9_token = response.json['access']['token'] + + with open(TARGET_DIR + 'complaints/qualification-complaint-mistaken-2020-04-19.http', 'w') as self.app.file_obj: + response = self.app.patch_json( + '/tenders/{}/qualifications/{}/complaints/{}?acc_token={}'.format( + self.tender_id, + qualification_id, + complaint9_id, + complaint9_token + ), + {"data": {"status": "mistaken"}}, + ) + self.assertEqual(response.status, '200 OK') + + self.app.authorization = ('Basic', ('reviewer', '')) + with open(TARGET_DIR + 'complaints/qualification-complaint-reject.http', 'w') as self.app.file_obj: + response = self.app.patch_json( + '/tenders/{}/qualifications/{}/complaints/{}'.format( + self.tender_id, qualification_id, complaint2_id), + {"data": { + "status": "invalid", + "rejectReason": "alreadyExists" + }}) + self.assertEqual(response.status, '200 OK') + + with open(TARGET_DIR + 'complaints/qualification-complaint-accept.http', 'w') as self.app.file_obj: + response = self.app.patch_json( + '/tenders/{}/qualifications/{}/complaints/{}'.format( + self.tender_id, qualification_id, complaint1_id), + {"data": { + "status": "accepted", + "reviewDate": get_now().isoformat(), + "reviewPlace": "Place of review" + }}) + self.assertEqual(response.status, '200 OK') + + response = self.app.patch_json( + '/tenders/{}/qualifications/{}/complaints/{}'.format( + self.tender_id, qualification_id, complaint3_id), + {"data": { + "status": "accepted", + "reviewDate": get_now().isoformat(), + "reviewPlace": "Place of review" + }}) + self.assertEqual(response.status, '200 OK') + + response = self.app.patch_json( + '/tenders/{}/qualifications/{}/complaints/{}'.format( + self.tender_id, qualification_id, complaint4_id), + {"data": { + "status": "accepted", + "reviewDate": get_now().isoformat(), + "reviewPlace": "Place of review" + }}) + self.assertEqual(response.status, '200 OK') + + response = self.app.patch_json( + '/tenders/{}/qualifications/{}/complaints/{}'.format( + self.tender_id, qualification_id, complaint5_id), + {"data": { + "status": "accepted", + "reviewDate": get_now().isoformat(), + "reviewPlace": "Place of review" + }}) + self.assertEqual(response.status, '200 OK') + + with open(TARGET_DIR + 'complaints/qualification-complaint-resolution-upload.http', 'w') as self.app.file_obj: + response = self.app.post( + '/tenders/{}/qualifications/{}/complaints/{}/documents'.format( + self.tender_id, qualification_id, complaint1_id), + upload_files=[('file', u'ComplaintResolution.pdf', 'content')]) + self.assertEqual(response.status, '201 Created') + + with open(TARGET_DIR + 'complaints/qualification-complaint-resolve.http', 'w') as self.app.file_obj: + response = self.app.patch_json( + '/tenders/{}/qualifications/{}/complaints/{}'.format( + self.tender_id, qualification_id, complaint1_id), + {"data": { + "status": "satisfied" + }}) + self.assertEqual(response.status, '200 OK') + + with open(TARGET_DIR + 'complaints/qualification-complaint-decline.http', 'w') as self.app.file_obj: + response = self.app.patch_json( + '/tenders/{}/qualifications/{}/complaints/{}'.format( + self.tender_id, qualification_id, complaint3_id), + {"data": { + "status": "declined" + }}) + self.assertEqual(response.status, '200 OK') + + with open(TARGET_DIR + 'complaints/qualification-complaint-accepted-stopped.http', 'w') as self.app.file_obj: + response = self.app.patch_json( + '/tenders/{}/qualifications/{}/complaints/{}'.format( + self.tender_id, qualification_id, complaint5_id), + {"data": { + "decision": "Тендер скасовується замовником", + "status": "stopped", + "rejectReason": "tenderCancelled" + }}) + self.assertEqual(response.status, '200 OK') + + self.app.authorization = ('Basic', ('broker', '')) + with open(TARGET_DIR + 'complaints/qualification-complaint-resolved.http', 'w') as self.app.file_obj: + response = self.app.patch_json( + '/tenders/{}/qualifications/{}/complaints/{}?acc_token={}'.format( + self.tender_id, qualification_id, complaint1_id, owner_token), + {"data": { + "tendererAction": "Умови виправлено", + "status": "resolved" + }}) + self.assertEqual(response.status, '200 OK') + + if RELEASE_2020_04_19 > get_now(): + with open(TARGET_DIR + 'complaints/qualification-complaint-accepted-stopping.http', 'w') as self.app.file_obj: + response = self.app.patch_json( + '/tenders/{}/qualifications/{}/complaints/{}?acc_token={}'.format( + self.tender_id, qualification_id, complaint4_id, complaint4_token), + {"data": { + "cancellationReason": "Тендер скасовується замовником", + "status": "stopping" + }}, + status=200, + ) + self.assertEqual(response.status, '200 OK') + + self.app.authorization = ('Basic', ('reviewer', '')) + with open(TARGET_DIR + 'complaints/qualification-complaint-stopping-stopped.http', 'w') as self.app.file_obj: + response = self.app.patch_json( + '/tenders/{}/qualifications/{}/complaints/{}'.format( + self.tender_id, qualification_id, complaint4_id), + {"data": { + "decision": "Тендер скасовується замовником", + "status": "stopped", + "rejectReason": "tenderCancelled" + }}) + self.assertEqual(response.status, '200 OK') + else: + with open(TARGET_DIR + 'complaints/qualification-complaint-accepted-stopping-2020-04-19.http', 'w') as self.app.file_obj: + response = self.app.patch_json( + '/tenders/{}/qualifications/{}/complaints/{}?acc_token={}'.format( + self.tender_id, qualification_id, complaint4_id, complaint4_token), + {"data": { + "cancellationReason": "Тендер скасовується замовником", + "status": "stopping" + }}, + status=403, + ) + self.assertEqual(response.status, '403 Forbidden') + + self.app.authorization = None + with open(TARGET_DIR + 'complaints/qualification-complaints-list.http', 'w') as self.app.file_obj: + response = self.app.get( + '/tenders/{}/qualifications/{}/complaints'.format( + self.tender_id, qualification_id)) + self.assertEqual(response.status, '200 OK') + + with open(TARGET_DIR + 'complaints/qualification-complaint.http', 'w') as self.app.file_obj: + response = self.app.get( + '/tenders/{}/qualifications/{}/complaints/{}'.format( + self.tender_id, qualification_id, complaint1_id)) + self.assertEqual(response.status, '200 OK') + + def test_award_complaints(self): + self.app.authorization = ('Basic', ('broker', '')) + + response = self.app.post_json( + '/tenders?opt_pretty=1', + {'data': test_tender_data}) + self.assertEqual(response.status, '201 Created') + + tender = response.json['data'] + owner_token = response.json['access']['token'] + self.tender_id = tender['id'] + + response = self.app.post_json( + '/tenders/{}/bids'.format(self.tender_id), + {'data': bid}) + bid_id = response.json['data']['id'] + bid_token = response.json['access']['token'] + + response = self.app.patch_json( + '/tenders/{}/bids/{}?acc_token={}'.format( + self.tender_id, bid_id, bid_token), + {'data': {"status": "pending"}}) + + # create second bid + self.app.authorization = ('Basic', ('broker', '')) + response = self.app.post_json( + '/tenders/{}/bids'.format(self.tender_id), + {'data': bid2}) + + # Pre-qualification + self.set_status( + 'active.pre-qualification', + {"id": self.tender_id, 'status': 'active.tendering'}) + auth = self.app.authorization + self.app.authorization = ('Basic', ('chronograph', '')) + response = self.app.patch_json( + '/tenders/{}'.format(self.tender_id), + {'data': {"id": self.tender_id}}) + self.app.authorization = auth + + response = self.app.get('/tenders/{}/qualifications'.format(self.tender_id)) + self.assertEqual(response.status, "200 OK") + qualifications = response.json['data'] + + for qualification in qualifications: + response = self.app.patch_json( + '/tenders/{}/qualifications/{}?acc_token={}'.format( + self.tender_id, qualification['id'], owner_token), + {"data": { + "status": "active", + "qualified": True, + "eligible": True + }}) + self.assertEqual(response.status, "200 OK") + + # active.pre-qualification.stand-still + response = self.app.patch_json( + '/tenders/{}?acc_token={}'.format(self.tender_id, owner_token), + {"data": {"status": "active.pre-qualification.stand-still"}}) + self.assertEqual(response.status, "200 OK") + self.assertEqual(response.json['data']['status'], "active.pre-qualification.stand-still") + + # switch to active.auction + self.set_status('active.auction') + self.app.authorization = ('Basic', ('auction', '')) + response = self.app.get('/tenders/{}/auction'.format(self.tender_id)) + auction_bids_data = response.json['data']['bids'] + self.app.post_json( + '/tenders/{}/auction'.format(self.tender_id), + {'data': {'bids': auction_bids_data}}) + + self.app.authorization = ('Basic', ('broker', '')) + response = self.app.get('/tenders/{}/awards?acc_token={}'.format(self.tender_id, owner_token)) + # get pending award + award_id = [i['id'] for i in response.json['data'] if i['status'] == 'pending'][0] + response = self.app.patch_json( + '/tenders/{}/awards/{}?acc_token={}'.format(self.tender_id, award_id, owner_token), + {"data": { + "status": "active", + "qualified": True, + "eligible": True + }}) + self.assertEqual(response.status, '200 OK') + + self.tick() + + with open(TARGET_DIR + 'complaints/award-complaint-submission.http', 'w') as self.app.file_obj: + response = self.app.post_json( + '/tenders/{}/awards/{}/complaints?acc_token={}'.format( + self.tender_id, award_id, bid_token), + {'data': complaint}) + self.assertEqual(response.status, '201 Created') + + self.tick() + + complaint1_token = response.json['access']['token'] + complaint1_id = response.json['data']['id'] + + with open(TARGET_DIR + 'complaints/award-complaint-submission-upload.http', 'w') as self.app.file_obj: + response = self.app.post( + '/tenders/{}/awards/{}/complaints/{}/documents?acc_token={}'.format( + self.tender_id, award_id, complaint1_id, complaint1_token), + upload_files=[('file', u'Complaint_Attachment.pdf', 'content')]) + self.assertEqual(response.status, '201 Created') + + with open(TARGET_DIR + 'complaints/award-complaint-complaint.http', 'w') as self.app.file_obj: + if get_now() < RELEASE_2020_04_19: + response = self.app.patch_json( + '/tenders/{}/awards/{}/complaints/{}?acc_token={}'.format( + self.tender_id, award_id, complaint1_id, complaint1_token), + {"data": {"status": "pending"}}) + else: + with change_auth(self.app, ("Basic", ("bot", ""))): + response = self.app.patch_json( + '/tenders/{}/awards/{}/complaints/{}'.format( + self.tender_id, award_id, complaint1_id), + {"data": {"status": "pending"}}) + + self.assertEqual(response.status, '200 OK') + + complaint_data = {'data': complaint.copy()} + # with open(TARGET_DIR + 'complaints/award-complaint-submission-complaint.http', 'w') as self.app.file_obj: + # response = self.app.post_json( + # '/tenders/{}/awards/{}/complaints?acc_token={}'.format( + # self.tender_id, award_id, bid_token), + # complaint_data) + # self.assertEqual(response.status, '201 Created') + # + # complaint2_id = response.json['data']['id'] + + complaint_url = "/tenders/{}/awards/{}/complaints".format(self.tender_id, award_id) + + complaint2_id, complaint2_token = complaint_create_pending(self, complaint_url, complaint_data, bid_token) + + complaint3_id, complaint3_token = complaint_create_pending(self, complaint_url, complaint_data, bid_token) + + complaint4_id, complaint4_token = complaint_create_pending(self, complaint_url, complaint_data, bid_token) + + complaint5_id, complaint5_token = complaint_create_pending(self, complaint_url, complaint_data, bid_token) + + claim_data = {'data': claim.copy()} + claim_data['data']['status'] = 'claim' + with open(TARGET_DIR + 'complaints/award-complaint-submission-claim.http', 'w') as self.app.file_obj: + response = self.app.post_json( + '/tenders/{}/awards/{}/complaints?acc_token={}'.format( + self.tender_id, award_id, bid_token), claim_data) + self.assertEqual(response.status, '201 Created') + + complaint6_token = response.json['access']['token'] + complaint6_id = response.json['data']['id'] + + with open(TARGET_DIR + 'complaints/award-complaint-answer.http', 'w') as self.app.file_obj: + response = self.app.patch_json( + '/tenders/{}/awards/{}/complaints/{}?acc_token={}'.format( + self.tender_id, award_id, complaint6_id, owner_token), + {'data': { + "status": "answered", + "resolutionType": "resolved", + "resolution": "Умови виправлено, вибір переможня буде розгянуто повторно" + }}) + self.assertEqual(response.status, '200 OK') + + with open(TARGET_DIR + 'complaints/award-complaint-satisfy.http', 'w') as self.app.file_obj: + response = self.app.patch_json( + '/tenders/{}/awards/{}/complaints/{}?acc_token={}'.format( + self.tender_id, award_id, complaint6_id, complaint6_token), + {'data': { + "satisfied": True, + }}) + self.assertEqual(response.status, '200 OK') + + response = self.app.post_json( + '/tenders/{}/awards/{}/complaints?acc_token={}'.format( + self.tender_id, award_id, bid_token), claim_data) + self.assertEqual(response.status, '201 Created') + complaint7_token = response.json['access']['token'] + complaint7_id = response.json['data']['id'] + + response = self.app.patch_json( + '/tenders/{}/awards/{}/complaints/{}?acc_token={}'.format( + self.tender_id, award_id, complaint7_id, owner_token), + {'data': { + "status": "answered", + "resolutionType": "invalid", + "resolution": "Вимога не відповідає предмету закупівлі" + }}) + self.assertEqual(response.status, '200 OK') + + with open(TARGET_DIR + 'complaints/award-complaint-unsatisfy.http', 'w') as self.app.file_obj: + response = self.app.patch_json( + '/tenders/{}/awards/{}/complaints/{}?acc_token={}'.format( + self.tender_id, award_id, complaint7_id, complaint7_token), + {'data': { + "satisfied": False, + }}) + self.assertEqual(response.status, '200 OK') + + complaint_url = "/tenders/{}/awards/{}/complaints".format(self.tender_id, award_id) + complaint8_id, complaint8_token = complaint_create_pending(self, complaint_url, complaint_data, bid_token) + + self.app.authorization = ('Basic', ('reviewer', '')) + + with open(TARGET_DIR + 'complaints/award-complaint-post-reviewer-complaint-owner.http', 'w') as self.app.file_obj: + response = self.app.post_json( + '/tenders/{}/awards/{}/complaints/{}/posts'.format( + self.tender_id, award_id, complaint8_id), + {"data": { + "title": "Уточнення по вимозі", + "description": "Відсутній документ", + "recipient": "complaint_owner", + }}) + self.assertEqual(response.status, '201 Created') + + post1_id = response.json['data']['id'] + + self.app.authorization = ('Basic', ('broker', '')) + + with open(TARGET_DIR + 'complaints/award-complaint-post-complaint-owner.http', 'w') as self.app.file_obj: + response = self.app.post_json( + '/tenders/{}/awards/{}/complaints/{}/posts?acc_token={}'.format( + self.tender_id, award_id, complaint8_id, complaint8_token), + {"data": { + "title": "Уточнення по вимозі", + "description": "Додано документ", + "recipient": "aboveThresholdReviewers", + "relatedPost": post1_id, + "documents": [{ + 'title': u'post_document_complaint.pdf', + 'url': self.generate_docservice_url(), + 'hash': 'md5:' + '0' * 32, + 'format': 'application/pdf' + }] + }}) + self.assertEqual(response.status, '201 Created') + + self.app.authorization = ('Basic', ('reviewer', '')) + + with open(TARGET_DIR + 'complaints/award-complaint-post-reviewer-tender-owner.http', 'w') as self.app.file_obj: + response = self.app.post_json( + '/tenders/{}/awards/{}/complaints/{}/posts'.format( + self.tender_id, award_id, complaint8_id), + {"data": { + "title": "Уточнення по вимозі", + "description": "Відсутній документ", + "recipient": "tender_owner", + }}) + self.assertEqual(response.status, '201 Created') + + post2_id = response.json['data']['id'] + + self.app.authorization = ('Basic', ('broker', '')) + + with open(TARGET_DIR + 'complaints/award-complaint-post-tender-owner.http', 'w') as self.app.file_obj: + response = self.app.post_json( + '/tenders/{}/awards/{}/complaints/{}/posts?acc_token={}'.format( + self.tender_id, award_id, complaint8_id, owner_token), + {"data": { + "title": "Уточнення по вимозі", + "description": "Додано документ", + "recipient": "aboveThresholdReviewers", + "relatedPost": post2_id, + "documents": [{ + 'title': u'post_document_tender.pdf', + 'url': self.generate_docservice_url(), + 'hash': 'md5:' + '0' * 32, + 'format': 'application/pdf' + }] + }}) + self.assertEqual(response.status, '201 Created') + + response = self.app.post_json( + '/tenders/{}/awards/{}/complaints?acc_token={}'.format( + self.tender_id, award_id, bid_token), + {'data': claim}) + self.assertEqual(response.status, '201 Created') + + with open(TARGET_DIR + 'complaints/award-complaint-claim.http', 'w') as self.app.file_obj: + response = self.app.patch_json( + '/tenders/{}/awards/{}/complaints/{}?acc_token={}'.format( + self.tender_id, award_id, + response.json['data']['id'], response.json['access']['token']), + {'data': { + "status": "claim" + }}) + self.assertEqual(response.status, '200 OK') + + self.app.authorization = ('Basic', ('reviewer', '')) + with open(TARGET_DIR + 'complaints/award-complaint-reject.http', 'w') as self.app.file_obj: + response = self.app.patch_json( + '/tenders/{}/awards/{}/complaints/{}'.format(self.tender_id, award_id, complaint2_id), + {'data': { + "status": "invalid", + "rejectReason": "alreadyExists" + }}) + self.assertEqual(response.status, '200 OK') + + with open(TARGET_DIR + 'complaints/award-complaint-accept.http', 'w') as self.app.file_obj: + response = self.app.patch_json( + '/tenders/{}/awards/{}/complaints/{}'.format(self.tender_id, award_id, complaint1_id), + {'data': { + "status": "accepted", + "reviewDate": get_now().isoformat(), + "reviewPlace": "Place of review" + }}) + self.assertEqual(response.status, '200 OK') + + response = self.app.patch_json( + '/tenders/{}/awards/{}/complaints/{}'.format(self.tender_id, award_id, complaint3_id), + {'data': { + "status": "accepted", + "reviewDate": get_now().isoformat(), + "reviewPlace": "Place of review" + }}) + self.assertEqual(response.status, '200 OK') + + response = self.app.patch_json( + '/tenders/{}/awards/{}/complaints/{}'.format(self.tender_id, award_id, complaint4_id), + {'data': { + "status": "accepted", + "reviewDate": get_now().isoformat(), + "reviewPlace": "Place of review" + }}) + self.assertEqual(response.status, '200 OK') + + response = self.app.patch_json( + '/tenders/{}/awards/{}/complaints/{}'.format(self.tender_id, award_id, complaint5_id), + {'data': { + "status": "accepted", + "reviewDate": get_now().isoformat(), + "reviewPlace": "Place of review" + }}) + self.assertEqual(response.status, '200 OK') + + with open(TARGET_DIR + 'complaints/award-complaint-resolution-upload.http', 'w') as self.app.file_obj: + response = self.app.post( + '/tenders/{}/awards/{}/complaints/{}/documents'.format( + self.tender_id, award_id, complaint1_id), + upload_files=[('file', u'ComplaintResolution.pdf', 'content')]) + self.assertEqual(response.status, '201 Created') + + with open(TARGET_DIR + 'complaints/award-complaint-resolve.http', 'w') as self.app.file_obj: + response = self.app.patch_json( + '/tenders/{}/awards/{}/complaints/{}'.format(self.tender_id, award_id, complaint1_id), + {'data': { + "status": "satisfied" + }}) + self.assertEqual(response.status, '200 OK') + + with open(TARGET_DIR + 'complaints/award-complaint-decline.http', 'w') as self.app.file_obj: + response = self.app.patch_json( + '/tenders/{}/awards/{}/complaints/{}'.format(self.tender_id, award_id, complaint3_id), + {'data': { + "status": "declined" + }}) + self.assertEqual(response.status, '200 OK') + + with open(TARGET_DIR + 'complaints/award-complaint-accepted-stopped.http', 'w') as self.app.file_obj: + response = self.app.patch_json( + '/tenders/{}/awards/{}/complaints/{}'.format(self.tender_id, award_id, complaint5_id), + {'data': { + "decision": "Тендер скасовується замовником", + "status": "stopped", + "rejectReason": "tenderCancelled" + }}) + self.assertEqual(response.status, '200 OK') + + with open(TARGET_DIR + 'complaints/award-complaints-list.http', 'w') as self.app.file_obj: + self.app.authorization = None + response = self.app.get('/tenders/{}/awards/{}/complaints'.format(self.tender_id, award_id)) + self.assertEqual(response.status, '200 OK') + + with open(TARGET_DIR + 'complaints/award-complaint.http', 'w') as self.app.file_obj: + self.app.authorization = None + response = self.app.get( + '/tenders/{}/awards/{}/complaints/{}'.format(self.tender_id, award_id, complaint1_id)) + self.assertEqual(response.status, '200 OK') + + self.app.authorization = ('Basic', ('broker', '')) + with open(TARGET_DIR + 'complaints/award-complaint-resolved.http', 'w') as self.app.file_obj: + response = self.app.patch_json( + '/tenders/{}/awards/{}/complaints/{}?acc_token={}'.format( + self.tender_id, award_id, complaint1_id, owner_token), + {'data': { + "tendererAction": "Умови виправлено, вибір переможня буде розгянуто повторно", + "status": "resolved" + }}) + self.assertEqual(response.status, '200 OK') + + if RELEASE_2020_04_19 > get_now(): + with open(TARGET_DIR + 'complaints/award-complaint-accepted-stopping.http', 'w') as self.app.file_obj: + response = self.app.patch_json( + '/tenders/{}/awards/{}/complaints/{}?acc_token={}'.format( + self.tender_id, award_id, complaint4_id, complaint4_token), + {'data': { + "cancellationReason": "Тендер скасовується замовником", + "status": "stopping", + }}, + status=200, + ) + self.assertEqual(response.status, '200 OK') + + self.app.authorization = ('Basic', ('reviewer', '')) + with open(TARGET_DIR + 'complaints/award-complaint-stopping-stopped.http', 'w') as self.app.file_obj: + response = self.app.patch_json( + '/tenders/{}/awards/{}/complaints/{}'.format(self.tender_id, award_id, complaint4_id), + {'data': { + "decision": "Тендер скасовується замовником", + "status": "stopped", + "rejectReason": "tenderCancelled" + }}) + self.assertEqual(response.status, '200 OK') + else: + with open(TARGET_DIR + 'complaints/award-complaint-accepted-stopping-2020-04-19.http', 'w') as self.app.file_obj: + response = self.app.patch_json( + '/tenders/{}/awards/{}/complaints/{}?acc_token={}'.format( + self.tender_id, award_id, complaint4_id, complaint4_token), + {'data': { + "cancellationReason": "Тендер скасовується замовником", + "status": "stopping", + }}, + status=403, + ) + self.assertEqual(response.status, '403 Forbidden') + + self.app.authorization = ('Basic', ('reviewer', '')) + response = self.app.patch_json( + '/tenders/{}/awards/{}/complaints/{}?acc_token={}'.format( + self.tender_id, award_id, complaint4_id, complaint4_token), + {'data': { + "status": "declined", + "rejectReason": "tenderCancelled", + }}) + self.assertEqual(response.status, '200 OK') + + self.app.authorization = ('Basic', ('broker', '')) + with open(TARGET_DIR + 'complaints/award-complaint-satisfied-resolving.http', 'w') as self.app.file_obj: + response = self.app.patch_json( + '/tenders/{}/awards/{}?acc_token={}'.format(self.tender_id, award_id, owner_token), + {'data': { + "status": "cancelled" + }}) + self.assertEqual(response.status, '200 OK') + new_award_id = response.headers['Location'][-32:] + + award_id = new_award_id + complaint_url = "/tenders/{}/awards/{}/complaints".format(self.tender_id, award_id) + self.app.patch_json( + '/tenders/{}/awards/{}?acc_token={}'.format(self.tender_id, award_id, owner_token), + {"data": {"status": "active"}}) + self.assertEqual(response.status, '200 OK') + + with open(TARGET_DIR + 'complaints/award-complaint-submit.http', 'w') as self.app.file_obj: + response = self.app.post_json( + '/tenders/{}/awards/{}/complaints?acc_token={}'.format( + self.tender_id, award_id, bid_token), + {'data': complaint}) + self.assertEqual(response.status, '201 Created') + + if get_now() < RELEASE_2020_04_19: + # before RELEASE_2020_04_19 from pending to mistaken transition was available by reviewer + self.app.authorization = ('Basic', ('broker', '')) + complaint9_id, complaint9_token = complaint_create_pending(self, complaint_url, complaint_data, bid_token) + + with open(TARGET_DIR + 'complaints/award-complaint-mistaken.http', 'w') as self.app.file_obj: + self.app.authorization = ('Basic', ('reviewer', '')) + response = self.app.patch_json( + '/tenders/{}/awards/{}/complaints/{}?acc_token={}'.format( + self.tender_id, + award_id, + complaint9_id, + complaint9_token + ), + {'data': {"status": "mistaken"}}, + ) + self.assertEqual(response.status, '200 OK') + else: + # since RELEASE_2020_04_19 from draft to mistaken transition was available by complainant + self.app.authorization = ('Basic', ('broker', '')) + response = self.app.post_json( + '/tenders/{}/awards/{}/complaints?acc_token={}'.format( + self.tender_id, award_id, bid_token), + {'data': complaint}) + self.assertEqual(response.status, '201 Created') + complaint9_id = response.json['data']['id'] + complaint9_token = response.json['access']['token'] + + with open(TARGET_DIR + 'complaints/award-complaint-mistaken-2020-04-19.http', 'w') as self.app.file_obj: + response = self.app.patch_json( + '/tenders/{}/awards/{}/complaints/{}?acc_token={}'.format( + self.tender_id, + award_id, + complaint9_id, + complaint9_token), + {'data': {"status": "mistaken"}}, + ) + self.assertEqual(response.status, '200 OK') + + def test_cancellation_complaints(self): + self.app.authorization = ('Basic', ('broker', '')) + + response = self.app.post_json( + '/tenders?opt_pretty=1', + {'data': test_tender_data}) + self.assertEqual(response.status, '201 Created') + + tender = response.json['data'] + owner_token = response.json['access']['token'] + self.tender_id = tender['id'] + + # Cancellation turn to complaint_period + response = self.app.post_json( + '/tenders/{}/cancellations?acc_token={}'.format( + self.tender_id, owner_token), + {'data': {'reason': 'cancellation reason', 'reasonType': 'noDemand'}}) + cancellation_id = response.json['data']['id'] + self.assertEqual(response.status, '201 Created') + + response = self.app.post( + '/tenders/{}/cancellations/{}/documents?acc_token={}'.format( + self.tender_id, cancellation_id, owner_token), + upload_files=[('file', u'Notice.pdf', 'content')]) + self.assertEqual(response.status, '201 Created') + + response = self.app.patch_json( + '/tenders/{}/cancellations/{}?acc_token={}'.format( + self.tender_id, cancellation_id, owner_token), + {'data': {"status": "pending"}}) + self.assertEqual(response.status, '200 OK') + + with open(TARGET_DIR + 'complaints/cancellation-complaint-submission.http', 'w') as self.app.file_obj: + response = self.app.post_json( + '/tenders/{}/cancellations/{}/complaints'.format( + self.tender_id, cancellation_id), + {'data': complaint}) + self.assertEqual(response.status, '201 Created') + + complaint1_token = response.json['access']['token'] + complaint1_id = response.json['data']['id'] + + with open(TARGET_DIR + 'complaints/cancellation-complaint-submission-upload.http', 'w') as self.app.file_obj: + response = self.app.post( + '/tenders/{}/cancellations/{}/complaints/{}/documents?acc_token={}'.format( + self.tender_id, cancellation_id, complaint1_id, complaint1_token), + upload_files=[('file', u'Complaint_Attachment.pdf', 'content')]) + self.assertEqual(response.status, '201 Created') + + complaint_data = {'data': complaint.copy()} + + complaint_url = "/tenders/{}/cancellations/{}/complaints".format(self.tender_id, cancellation_id) + complaint3_id, complaint3_token = complaint_create_pending(self, complaint_url, complaint_data) + + complaint4_id, complaint4_token = complaint_create_pending(self, complaint_url, complaint_data) + + with open(TARGET_DIR + 'complaints/cancellation-complaint-complaint.http', 'w') as self.app.file_obj: + if get_now() < RELEASE_2020_04_19: + response = self.app.patch_json( + '/tenders/{}/cancellations/{}/complaints/{}?acc_token={}'.format( + self.tender_id, cancellation_id, complaint1_id, complaint1_token), + {"data": {"status": "pending"}}) + else: + with change_auth(self.app, ("Basic", ("bot", ""))): + response = self.app.patch_json( + '/tenders/{}/cancellations/{}/complaints/{}'.format( + self.tender_id, cancellation_id, complaint1_id), + {"data": {"status": "pending"}}) + + self.assertEqual(response.status, '200 OK') + + complaint5_id, complaint5_token = complaint_create_pending(self, complaint_url, complaint_data) + complaint6_id, complaint6_token = complaint_create_pending(self, complaint_url, complaint_data) + + self.app.authorization = ('Basic', ('reviewer', '')) + with open(TARGET_DIR + 'complaints/cancellation-complaint-reject.http', 'w') as self.app.file_obj: + response = self.app.patch_json( + '/tenders/{}/cancellations/{}/complaints/{}'.format( + self.tender_id, cancellation_id, complaint4_id), + {'data': { + "status": "invalid", + "rejectReason": "tenderCancelled", + "rejectReasonDescription": "reject reason description", + }}) + self.assertEqual(response.status, '200 OK') + + with open(TARGET_DIR + 'complaints/cancellation-complaint-accept.http', 'w') as self.app.file_obj: + response = self.app.patch_json( + '/tenders/{}/cancellations/{}/complaints/{}'.format( + self.tender_id, cancellation_id, complaint1_id), + {'data': { + "status": "accepted", + "reviewDate": get_now().isoformat(), + "reviewPlace": "some", + }}) + self.assertEqual(response.status, '200 OK') + + response = self.app.patch_json( + '/tenders/{}/cancellations/{}/complaints/{}'.format( + self.tender_id, cancellation_id, complaint3_id), + {'data': { + "status": "accepted", + "reviewDate": get_now().isoformat(), + "reviewPlace": "some", + }}) + self.assertEqual(response.status, '200 OK') + + response = self.app.patch_json( + '/tenders/{}/cancellations/{}/complaints/{}'.format( + self.tender_id, cancellation_id, complaint5_id), + {'data': { + "status": "accepted", + "reviewDate": get_now().isoformat(), + "reviewPlace": "some", + }}) + self.assertEqual(response.status, '200 OK') + + response = self.app.patch_json( + '/tenders/{}/cancellations/{}/complaints/{}'.format( + self.tender_id, cancellation_id, complaint6_id), + {'data': { + "status": "accepted", + "reviewDate": get_now().isoformat(), + "reviewPlace": "some", + }}) + self.assertEqual(response.status, '200 OK') + + with open(TARGET_DIR + 'complaints/cancellation-complaint-resolution-upload.http', 'w') as self.app.file_obj: + response = self.app.post( + '/tenders/{}/cancellations/{}/complaints/{}/documents'.format + (self.tender_id, cancellation_id, complaint1_id), + upload_files=[('file', u'ComplaintResolution.pdf', 'content')]) + self.assertEqual(response.status, '201 Created') + + with open(TARGET_DIR + 'complaints/cancellation-complaint-resolve.http', 'w') as self.app.file_obj: + response = self.app.patch_json( + '/tenders/{}/cancellations/{}/complaints/{}'.format( + self.tender_id, cancellation_id, complaint1_id), + {'data': { + "status": "satisfied" + }}) + self.assertEqual(response.status, '200 OK') + + with open(TARGET_DIR + 'complaints/cancellation-complaint-decline.http', 'w') as self.app.file_obj: + response = self.app.patch_json( + '/tenders/{}/cancellations/{}/complaints/{}'.format( + self.tender_id, cancellation_id, complaint3_id), + {'data': { + "status": "declined" + }}) + self.assertEqual(response.status, '200 OK') + + with open(TARGET_DIR + 'complaints/cancellation-complaint-accepted-stopped.http', 'w') as self.app.file_obj: + response = self.app.patch_json( + '/tenders/{}/cancellations/{}/complaints/{}'.format( + self.tender_id, cancellation_id, complaint5_id), + {'data': { + "decision": "Тендер скасовується замовником", + "status": "stopped", + "rejectReason": "tenderCancelled", + }}) + self.assertEqual(response.status, '200 OK') + + self.app.authorization = ('Basic', ('broker', '')) + + response = self.app.patch_json( + '/tenders/{}/cancellations/{}?acc_token={}'.format( + self.tender_id, cancellation_id, owner_token), + {'data': {'status': 'unsuccessful'}} + ) + self.assertEqual(response.status_code, 200) + + with open(TARGET_DIR + 'complaints/cancellation-complaint-resolved.http', 'w') as self.app.file_obj: + response = self.app.patch_json( + '/tenders/{}/cancellations/{}/complaints/{}?acc_token={}'.format( + self.tender_id, cancellation_id, complaint1_id, owner_token), + {'data': { + "tendererAction": "Умови виправлено", + "status": "resolved", + }}) + self.assertEqual(response.status, '200 OK') + + self.app.authorization = ('Basic', ('reviewer', '')) + with open(TARGET_DIR + 'complaints/cancellation-complaint-accepted-stopped.http', 'w') as self.app.file_obj: + response = self.app.patch_json( + '/tenders/{}/cancellations/{}/complaints/{}'.format( + self.tender_id, cancellation_id, complaint6_id), + {'data': { + "decision": "Тендер скасовується замовником", + "status": "stopped", + "rejectReason": "tenderCancelled", + }}) + self.assertEqual(response.status, '200 OK') + + self.app.authorization = ('Basic', ('broker', '')) + # Create new cancellations + response = self.app.post_json( + '/tenders/{}/cancellations?acc_token={}'.format( + self.tender_id, owner_token), + {'data': {'reason': 'cancellation reason', 'reasonType': 'unFixable'}}) + cancellation2_id = response.json['data']['id'] + self.assertEqual(response.status, '201 Created') + + response = self.app.post( + '/tenders/{}/cancellations/{}/documents?acc_token={}'.format( + self.tender_id, cancellation2_id, owner_token), + upload_files=[('file', u'Notice.pdf', 'content')]) + self.assertEqual(response.status, '201 Created') + + response = self.app.patch_json( + '/tenders/{}/cancellations/{}?acc_token={}'.format( + self.tender_id, cancellation2_id, owner_token), + {'data': {"status": "pending"}}) + self.assertEqual(response.status, '200 OK') + + response = self.app.post_json( + '/tenders/{}/cancellations/{}/complaints'.format(self.tender_id, cancellation2_id), + {'data': complaint}) + self.assertEqual(response.status, '201 Created') + + with open(TARGET_DIR + 'complaints/cancellation-complaints-list.http', 'w') as self.app.file_obj: + self.app.authorization = None + response = self.app.get('/tenders/{}/cancellations/{}/complaints'.format( + self.tender_id, cancellation_id)) + self.assertEqual(response.status, '200 OK') + + with open(TARGET_DIR + 'complaints/cancellation-complaint.http', 'w') as self.app.file_obj: + self.app.authorization = None + response = self.app.get('/tenders/{}/cancellations/{}/complaints/{}'.format( + self.tender_id, cancellation_id, complaint1_id)) + self.assertEqual(response.status, '200 OK') + + @mock.patch("openprocurement.tender.core.validation.RELEASE_ECRITERIA_ARTICLE_17", parse_date(MOCK_DATETIME) - timedelta(days=1)) + def test_tender_criteria_article_17(self): + self.app.authorization = ('Basic', ('broker', '')) + tender_data = deepcopy(test_tender_data) + tender_data.update({"status": "draft"}) + + response = self.app.post_json( + '/tenders?opt_pretty=1', + {'data': tender_data}) + self.assertEqual(response.status, '201 Created') + + tender = response.json['data'] + owner_token = response.json['access']['token'] + self.tender_id = tender['id'] + + other_criteria = deepcopy(test_criteria[0]) + other_criteria["classification"]["id"] = "CRITERION.OTHER" + + with open(TARGET_DIR + 'criteria/bulk-create-criteria.http', 'wb') as self.app.file_obj: + response = self.app.post_json( + '/tenders/{}/criteria?acc_token={}'.format(self.tender_id, owner_token), + {'data': [other_criteria]}, + ) + self.assertEqual(response.status, '201 Created') + + criteria_1 = response.json['data'][0] + criteria_id_1 = criteria_1['id'] + + # Try to update tender from `draft` to `active.tendering` without criteria + with open(TARGET_DIR + 'criteria/update-tender-status-without-criteria.http', 'wb') as self.app.file_obj: + response = self.app.patch_json( + '/tenders/{}?acc_token={}'.format(self.tender_id, owner_token), + {"data": {"status": "active.tendering"}}, + status=403, + ) + self.assertEqual(response.status, '403 Forbidden') + + with open(TARGET_DIR + 'criteria/bulk-create-exclusion-criteria.http', 'wb') as self.app.file_obj: + response = self.app.post_json( + '/tenders/{}/criteria?acc_token={}'.format(self.tender_id, owner_token), + {'data': [test_criteria[1]]}, + ) + self.assertEqual(response.status, '201 Created') + + criteria_2 = response.json['data'][0] + criteria_id_2 = criteria_2['id'] + + with open(TARGET_DIR + 'criteria/patch-criteria.http', 'wb') as self.app.file_obj: + response = self.app.patch_json( + '/tenders/{}/criteria/{}?acc_token={}'.format( + self.tender_id, criteria_id_1, owner_token), + {'data': {'title': 'Updated title'}}, + ) + self.assertEqual(response.status, '200 OK') + + # Try to patch exclusion criteria + with open(TARGET_DIR + 'criteria/patch-exclusion-criteria.http', 'wb') as self.app.file_obj: + response = self.app.patch_json( + '/tenders/{}/criteria/{}?acc_token={}'.format( + self.tender_id, criteria_id_2, owner_token), + {'data': {'title': 'Updated title'}}, + status=403, + ) + self.assertEqual(response.status, '403 Forbidden') + + # Requirement groups operation + rg_id_1 = criteria_1["requirementGroups"][0]["id"] + rg_id_2 = criteria_2["requirementGroups"][0]["id"] + + test_rg_data = test_criteria[0]["requirementGroups"][0] + + with open(TARGET_DIR + 'criteria/add-criteria-requirement-group.http', 'wb') as self.app.file_obj: + response = self.app.post_json( + '/tenders/{}/criteria/{}/requirement_groups?acc_token={}'.format( + self.tender_id, criteria_id_1, owner_token), + {'data': test_rg_data}, + ) + self.assertEqual(response.status, '201 Created') + + # Try to add requirement group to exclusion criteria + with open(TARGET_DIR + 'criteria/add-exclusion-criteria-requirement-group.http', 'wb') as self.app.file_obj: + response = self.app.post_json( + '/tenders/{}/criteria/{}/requirement_groups?acc_token={}'.format( + self.tender_id, criteria_id_2, owner_token), + {'data': test_rg_data}, + status=403, + ) + self.assertEqual(response.status, '403 Forbidden') + + with open(TARGET_DIR + 'criteria/patch-criteria-requirement-group.http', 'wb') as self.app.file_obj: + response = self.app.patch_json( + '/tenders/{}/criteria/{}/requirement_groups/{}?acc_token={}'.format( + self.tender_id, criteria_id_1, rg_id_1, owner_token), + {'data': {'description': 'Updated description'}}, + ) + self.assertEqual(response.status, '200 OK') + + with open(TARGET_DIR + 'criteria/patch-exclusion-criteria-requirement-group.http', 'wb') as self.app.file_obj: + response = self.app.patch_json( + '/tenders/{}/criteria/{}/requirement_groups/{}?acc_token={}'.format( + self.tender_id, criteria_id_2, rg_id_2, owner_token), + {'data': {'title': 'Updated title'}}, + status=403, + ) + self.assertEqual(response.status, '403 Forbidden') + + with open(TARGET_DIR + 'criteria/criteria-requirement-group-list.http', 'wb') as self.app.file_obj: + response = self.app.get( + '/tenders/{}/criteria/{}/requirement_groups'.format(self.tender_id, criteria_id_1), + ) + self.assertEqual(response.status, '200 OK') + + with open(TARGET_DIR + 'criteria/criteria-requirement-group.http', 'wb') as self.app.file_obj: + response = self.app.get( + '/tenders/{}/criteria/{}/requirement_groups/{}'.format(self.tender_id, criteria_id_1, rg_id_1), + ) + self.assertEqual(response.status, '200 OK') + + # Requirements operation + + requirement_id_1 = criteria_1["requirementGroups"][0]["requirements"][0]["id"] + requirement_id_2 = criteria_2["requirementGroups"][0]["requirements"][0]["id"] + test_requirement_data = deepcopy(test_rg_data["requirements"][0]) + + with open(TARGET_DIR + 'criteria/add-criteria-requirement.http', 'wb') as self.app.file_obj: + response = self.app.post_json( + '/tenders/{}/criteria/{}/requirement_groups/{}/requirements?acc_token={}'.format( + self.tender_id, criteria_id_1, rg_id_1, owner_token), + {'data': test_requirement_data}, + ) + self.assertEqual(response.status, '201 Created') + + with open(TARGET_DIR + 'criteria/add-exclusion-criteria-requirement.http', 'wb') as self.app.file_obj: + response = self.app.post_json( + '/tenders/{}/criteria/{}/requirement_groups/{}/requirements?acc_token={}'.format( + self.tender_id, criteria_id_2, rg_id_2, owner_token), + {'data': test_requirement_data}, + status=403 + ) + self.assertEqual(response.status, '403 Forbidden') + + with open(TARGET_DIR + 'criteria/patch-criteria-requirement.http', 'wb') as self.app.file_obj: + response = self.app.patch_json( + '/tenders/{}/criteria/{}/requirement_groups/{}/requirements/{}?acc_token={}'.format( + self.tender_id, criteria_id_1, rg_id_1, requirement_id_1, owner_token), + {'data': {'title': 'Updated title'}}, + ) + self.assertEqual(response.status, '200 OK') + + with open(TARGET_DIR + 'criteria/patch-exclusion-criteria-requirement.http', 'wb') as self.app.file_obj: + response = self.app.patch_json( + '/tenders/{}/criteria/{}/requirement_groups/{}/requirements/{}?acc_token={}'.format( + self.tender_id, criteria_id_2, rg_id_2, requirement_id_2, owner_token), + {'data': test_requirement_data}, + status=403, + ) + self.assertEqual(response.status, '403 Forbidden') + + with open(TARGET_DIR + 'criteria/criteria-requirement-list.http', 'wb') as self.app.file_obj: + response = self.app.get( + '/tenders/{}/criteria/{}/requirement_groups/{}/requirements'.format( + self.tender_id, criteria_id_1, rg_id_1), + ) + self.assertEqual(response.status, '200 OK') + + with open(TARGET_DIR + 'criteria/criteria-requirement.http', 'wb') as self.app.file_obj: + response = self.app.get( + '/tenders/{}/criteria/{}/requirement_groups/{}/requirements/{}'.format( + self.tender_id, criteria_id_1, rg_id_1, requirement_id_1), + ) + self.assertEqual(response.status, '200 OK') + + # Eligible evidence operation + + test_evidence_data = { + "title": u"Документальне підтвердження", + "description": u"Довідка в довільній формі", + "type": u"document", + } + + with open(TARGET_DIR + 'criteria/add-requirement-evidence.http', 'wb') as self.app.file_obj: + response = self.app.post_json( + '/tenders/{}/criteria/{}/requirement_groups/{}/requirements/{}/evidences?acc_token={}'.format( + self.tender_id, criteria_id_1, rg_id_1, requirement_id_1, owner_token), + {'data': test_evidence_data}, + ) + self.assertEqual(response.status, '201 Created') + + evidence_id = response.json['data']['id'] + + with open(TARGET_DIR + 'criteria/patch-requirement-evidence.http', 'wb') as self.app.file_obj: + response = self.app.patch_json( + '/tenders/{}/criteria/{}/requirement_groups/{}/requirements/{}/evidences/{}?acc_token={}'.format( + self.tender_id, criteria_id_1, rg_id_1, requirement_id_1, evidence_id, owner_token), + {'data': {'title_en': 'Documented approve'}}, + ) + self.assertEqual(response.status, '200 OK') + + with open(TARGET_DIR + 'criteria/requirement-evidences-list.http', 'wb') as self.app.file_obj: + response = self.app.get( + '/tenders/{}/criteria/{}/requirement_groups/{}/requirements/{}/evidences'.format( + self.tender_id, criteria_id_1, rg_id_1, requirement_id_1), + ) + self.assertEqual(response.status, '200 OK') + + with open(TARGET_DIR + 'criteria/requirement-evidence.http', 'wb') as self.app.file_obj: + response = self.app.get( + '/tenders/{}/criteria/{}/requirement_groups/{}/requirements/{}/evidences/{}'.format( + self.tender_id, criteria_id_1, rg_id_1, requirement_id_1, evidence_id), + ) + self.assertEqual(response.status, '200 OK') + + with open(TARGET_DIR + 'criteria/delete-requirement-evidence.http', 'wb') as self.app.file_obj: + response = self.app.delete( + '/tenders/{}/criteria/{}/requirement_groups/{}/requirements/{}/evidences/{}?acc_token={}'.format( + self.tender_id, criteria_id_1, rg_id_1, requirement_id_1, evidence_id, owner_token), + ) + self.assertEqual(response.status, '200 OK') + + with open(TARGET_DIR + 'criteria/criteria-list.http', 'wb') as self.app.file_obj: + response = self.app.get('/tenders/{}/criteria'.format(self.tender_id)) + self.assertEqual(response.status, '200 OK') + + with open(TARGET_DIR + 'criteria/criteria.http', 'wb') as self.app.file_obj: + response = self.app.get('/tenders/{}/criteria/{}'.format(self.tender_id, criteria_id_1)) + self.assertEqual(response.status, '200 OK') + + @mock.patch("openprocurement.tender.core.validation.RELEASE_ECRITERIA_ARTICLE_17", parse_date(MOCK_DATETIME) - timedelta(days=1)) + def test_bid_requirement_response(self): + tender_data = deepcopy(test_tender_data) + # tender_data.update({"status": "draft"}) + + response = self.app.post_json( + '/tenders?opt_pretty=1', + {'data': tender_data}) + self.assertEqual(response.status, '201 Created') + + tender = response.json['data'] + owner_token = response.json['access']['token'] + self.tender_id = tender['id'] + + criteria_data = deepcopy(test_criteria[:2]) + + response = self.app.post_json( + '/tenders/{}/criteria?acc_token={}'.format(self.tender_id, owner_token), + {'data': criteria_data}, + ) + self.assertEqual(response.status, '201 Created') + + criteria = response.json["data"] + + bid_data = deepcopy(bid) + bid_data["status"] = "draft" + + response = self.app.post_json( + '/tenders/{}/bids'.format(self.tender_id), + {'data': bid}) + bid_id = response.json['data']['id'] + bid_token = response.json['access']['token'] + self.assertEqual(response.status, '201 Created') + + response = self.app.post( + "/tenders/{}/bids/{}/documents?acc_token={}".format( + self.tender_id, bid_id, bid_token), + upload_files=[("file", "name.doc", "content")], + ) + self.assertEqual(response.status, "201 Created") + + doc_id = response.json["data"]["id"] + + evidence_data = { + "title": "Requirement response", + "relatedDocument": { + "id": doc_id, + "title": "name.doc", + }, + "type": "document", + } + + requirement_1 = criteria[0]["requirementGroups"][0]["requirements"][0] + + test_rr_data = [{ + "title": "Requirement response", + "description": "some description", + "requirement": { + "id": requirement_1["id"], + "title": requirement_1["title"], + }, + "evidences": [ + evidence_data, + ], + "value": "True", + }] + + with open(TARGET_DIR + 'criteria/create-requirement-response.http', 'wb') as self.app.file_obj: + response = self.app.post_json( + '/tenders/{}/bids/{}/requirement_responses?acc_token={}'.format( + self.tender_id, bid_id, bid_token), + {'data': test_rr_data}, + ) + self.assertEqual(response.status, '201 Created') + + rr_id = response.json["data"][0]["id"] + + with open(TARGET_DIR + 'criteria/update-requirement-response.http', 'wb') as self.app.file_obj: + response = self.app.patch_json( + '/tenders/{}/bids/{}/requirement_responses/{}?acc_token={}'.format( + self.tender_id, bid_id, rr_id, bid_token), + {'data': {'title': 'Updated title'}}, + ) + self.assertEqual(response.status, '200 OK') + + with open(TARGET_DIR + 'criteria/requirement-response-list.http', 'wb') as self.app.file_obj: + response = self.app.get( + '/tenders/{}/bids/{}/requirement_responses'.format(self.tender_id, bid_id)) + self.assertEqual(response.status, '200 OK') + + with open(TARGET_DIR + 'criteria/requirement-response.http', 'wb') as self.app.file_obj: + response = self.app.get( + '/tenders/{}/bids/{}/requirement_responses/{}'.format(self.tender_id, bid_id, rr_id)) + self.assertEqual(response.status, '200 OK') + + with open(TARGET_DIR + 'criteria/create-requirement-response-evidence.http', 'wb') as self.app.file_obj: + response = self.app.post_json( + '/tenders/{}/bids/{}/requirement_responses/{}/evidences?acc_token={}'.format( + self.tender_id, bid_id, rr_id, bid_token), + {'data': evidence_data}, + ) + self.assertEqual(response.status, '201 Created') + + evidence_id = response.json["data"]["id"] + + with open(TARGET_DIR + 'criteria/update-requirement-response-evidence.http', 'wb') as self.app.file_obj: + response = self.app.patch_json( + '/tenders/{}/bids/{}/requirement_responses/{}/evidences/{}?acc_token={}'.format( + self.tender_id, bid_id, rr_id, evidence_id, bid_token), + {'data': {'title': 'Update evidence title'}}, + ) + self.assertEqual(response.status, '200 OK') + + with open(TARGET_DIR + 'criteria/requirement-response-evidence-list.http', 'wb') as self.app.file_obj: + response = self.app.get( + '/tenders/{}/bids/{}/requirement_responses/{}/evidences'.format(self.tender_id, bid_id, rr_id)) + self.assertEqual(response.status, '200 OK') + + with open(TARGET_DIR + 'criteria/requirement-response-evidence.http', 'wb') as self.app.file_obj: + response = self.app.get( + '/tenders/{}/bids/{}/requirement_responses/{}/evidences/{}'.format( + self.tender_id, bid_id, rr_id, evidence_id)) + self.assertEqual(response.status, '200 OK') + + with open(TARGET_DIR + 'criteria/bid-activation.http', 'wb') as self.app.file_obj: + response = self.app.patch_json( + '/tenders/{}/bids/{}?acc_token={}'.format( + self.tender_id, bid_id, bid_token), + {'data': {'status': 'active'}}, + status=403 + ) + self.assertEqual(response.status, '403 Forbidden') + + with open(TARGET_DIR + 'criteria/delete-requirement-response-evidence.http', 'wb') as self.app.file_obj: + response = self.app.delete( + '/tenders/{}/bids/{}/requirement_responses/{}/evidences/{}?acc_token={}'.format( + self.tender_id, bid_id, rr_id, evidence_id, bid_token)) + self.assertEqual(response.status, '200 OK') + + with open(TARGET_DIR + 'criteria/delete-requirement-response.http', 'wb') as self.app.file_obj: + response = self.app.get( + '/tenders/{}/bids/{}/requirement_responses/{}?acc_token={}'.format( + self.tender_id, bid_id, rr_id, bid_token)) + self.assertEqual(response.status, '200 OK') diff --git a/docs/tests/test_belowthreshold.py b/docs/tests/test_belowthreshold.py index 86a769a84f..50928a8740 100644 --- a/docs/tests/test_belowthreshold.py +++ b/docs/tests/test_belowthreshold.py @@ -167,11 +167,11 @@ def test_docs_tutorial(self): self.tick() - tenderPeriod_endDate = get_now() + timedelta(days=15, seconds=10) + tender_period_end_date = get_now() + timedelta(days=15, seconds=10) with open(TARGET_DIR + 'tutorial/patch-items-value-periods.http', 'w') as self.app.file_obj: response = self.app.patch_json( '/tenders/{}?acc_token={}'.format(tender['id'], owner_token), - {'data': {"tenderPeriod": {"endDate": tenderPeriod_endDate.isoformat()}}}) + {'data': {"tenderPeriod": {"endDate": tender_period_end_date.isoformat()}}}) with open(TARGET_DIR + 'tutorial/tender-listing-after-patch.http', 'w') as self.app.file_obj: self.app.authorization = None diff --git a/docs/tests/test_cfaselectionua.py b/docs/tests/test_cfaselectionua.py index d85fe500ec..1d390f15c2 100644 --- a/docs/tests/test_cfaselectionua.py +++ b/docs/tests/test_cfaselectionua.py @@ -202,12 +202,12 @@ def test_docs_tutorial(self): # Modifying tender - tenderPeriod_endDate = get_now() + timedelta(days=15, seconds=10) + tender_period_end_date = get_now() + timedelta(days=15, seconds=10) with open(TARGET_DIR + 'patch-items-value-periods.http', 'w') as self.app.file_obj: response = self.app.patch_json( '/tenders/{}?acc_token={}'.format(tender['id'], owner_token), {'data': { - "tenderPeriod": {"endDate": tenderPeriod_endDate.isoformat()}, + "tenderPeriod": {"endDate": tender_period_end_date.isoformat()}, "items": [{"quantity": 6}] }}) self.assertEqual(response.status, '200 OK') diff --git a/docs/tests/test_cfaua.py b/docs/tests/test_cfaua.py index 49816bda13..be47698536 100644 --- a/docs/tests/test_cfaua.py +++ b/docs/tests/test_cfaua.py @@ -98,7 +98,7 @@ def test_docs(self): owner_token = response.json['access']['token'] self.tender_id = tender['id'] - self.set_status('active.enquiries') + self.set_status('active.tendering', startend="enquiry_end") with open(TARGET_DIR + 'blank-tender-view.http', 'w') as self.app.file_obj: response = self.app.get('/tenders/{}'.format(tender['id'])) @@ -112,11 +112,11 @@ def test_docs(self): # Modifying tender - tenderPeriod_endDate = get_now() + timedelta(days=30, seconds=10) + tender_period_end_date = get_now() + timedelta(days=30, seconds=10) with open(TARGET_DIR + 'patch-items-value-periods.http', 'w') as self.app.file_obj: response = self.app.patch_json( '/tenders/{}?acc_token={}'.format(tender['id'], owner_token), - {'data': {"tenderPeriod": {"endDate": tenderPeriod_endDate.isoformat()}}}) + {'data': {"tenderPeriod": {"endDate": tender_period_end_date.isoformat()}}}) with open(TARGET_DIR + 'tender-listing-after-patch.http', 'w') as self.app.file_obj: self.app.authorization = None @@ -193,7 +193,7 @@ def test_docs(self): self.tender_id, question_id)) self.assertEqual(response.status, '200 OK') - self.time_shift('enquiryPeriod_ends') + self.set_enquiry_period_end() self.app.authorization = ('Basic', ('broker', '')) @@ -205,7 +205,7 @@ def test_docs(self): with open(TARGET_DIR + 'update-tender-after-enqiery-with-update-periods.http', 'w') as self.app.file_obj: - tenderPeriod_endDate = get_now() + timedelta(days=8) + tender_period_end_date = get_now() + timedelta(days=8) response = self.app.patch_json( '/tenders/{}?acc_token={}'.format(tender['id'], owner_token), {'data': { @@ -214,7 +214,7 @@ def test_docs(self): "currency": u"UAH" }, "tenderPeriod": { - "endDate": tenderPeriod_endDate.isoformat() + "endDate": tender_period_end_date.isoformat() } }}) self.assertEqual(response.status, '200 OK') @@ -780,4 +780,4 @@ def test_docs(self): with open(TARGET_DIR + 'tender-unsuccessful.http', 'w') as self.app.file_obj: response = self.app.get('/tenders/{}'.format(self.tender_id)) - self.assertEqual(response.status, '200 OK') \ No newline at end of file + self.assertEqual(response.status, '200 OK') diff --git a/docs/tests/test_competitivedialogue.py b/docs/tests/test_competitivedialogue.py index 0a164b9945..75a7f1f323 100644 --- a/docs/tests/test_competitivedialogue.py +++ b/docs/tests/test_competitivedialogue.py @@ -3,8 +3,10 @@ from datetime import timedelta from hashlib import sha512 from copy import deepcopy +from mock import patch from openprocurement.api.models import get_now +from openprocurement.tender.competitivedialogue.models import TenderStage2EU, CompetitiveDialogEU from openprocurement.tender.competitivedialogue.tests.base import ( BaseCompetitiveDialogEUWebTest, BaseCompetitiveDialogUAStage2WebTest @@ -77,6 +79,8 @@ def tearDown(self): super(TenderResourceTest, self).tearDown() def test_stage1(self): + self.tender_class = CompetitiveDialogEU + request_path = '/tenders?opt_pretty=1' #### Exploring basic rules @@ -130,11 +134,11 @@ def test_stage1(self): #### Modifying tender # Update endDate - tenderPeriod_endDate = get_now() + timedelta(days=30, seconds=10) + tender_period_end_date = get_now() + timedelta(days=31) with open(TARGET_DIR + 'patch-items-value-periods.http', 'w') as self.app.file_obj: response = self.app.patch_json( '/tenders/{}?acc_token={}'.format(tender['id'], owner_token), - {'data': {"tenderPeriod": {"endDate": tenderPeriod_endDate.isoformat()}}}) + {'data': {"tenderPeriod": {"endDate": tender_period_end_date.isoformat()}}}) # Show listing after tender patch with open(TARGET_DIR + 'tender-listing-after-patch.http', 'w') as self.app.file_obj: @@ -216,7 +220,7 @@ def test_stage1(self): self.tender_id, question_id)) self.assertEqual(response.status, '200 OK') - self.time_shift('enquiryPeriod_ends') + self.set_enquiry_period_end() self.app.authorization = ('Basic', ('broker', '')) with open(TARGET_DIR + 'update-tender-after-enqiery.http', 'w') as self.app.file_obj: @@ -233,7 +237,7 @@ def test_stage1(self): self.assertEqual(response.status, '403 Forbidden') with open(TARGET_DIR + 'update-tender-after-enqiery-with-update-periods.http', 'w') as self.app.file_obj: - tenderPeriod_endDate = get_now() + timedelta(days=8) + tender_period_end_date = get_now() + timedelta(days=8) response = self.app.patch_json( '/tenders/{}?acc_token={}'.format(tender['id'], owner_token), {'data': { @@ -241,7 +245,7 @@ def test_stage1(self): 'amount': 501, 'currency': u'UAH' }, - 'tenderPeriod': {'endDate': tenderPeriod_endDate.isoformat()} + 'tenderPeriod': {'endDate': tender_period_end_date.isoformat()} }}) self.assertEqual(response.status, '200 OK') @@ -498,13 +502,17 @@ def test_stage1(self): self.new_tender_token = response.json['access']['token'] with open(TARGET_DIR + 'tender_stage2_modify_status.http', 'w') as self.app.file_obj: - response = self.app.patch_json( - '/tenders/{}?acc_token={}'.format(new_tender_id, self.new_tender_token), - {'data': {'status': 'active.tendering'}}) - self.assertEqual(response.status, '200 OK') - self.assertEqual(response.json['data']['status'], 'active.tendering') + with patch("openprocurement.tender.core.validation.RELEASE_ECRITERIA_ARTICLE_17", + get_now() + timedelta(days=1)): + response = self.app.patch_json( + '/tenders/{}?acc_token={}'.format(new_tender_id, self.new_tender_token), + {'data': {'status': 'active.tendering'}}) + self.assertEqual(response.status, '200 OK') + self.assertEqual(response.json['data']['status'], 'active.tendering') def test_stage2_EU(self): + self.tender_class = TenderStage2EU + request_path = '/tenders?opt_pretty=1' #### Creating tender @@ -530,16 +538,18 @@ def test_stage2_EU(self): #### Modifying tender - tenderPeriod_endDate = get_now() + timedelta(days=30, seconds=10) + tender_period_end_date = get_now() + timedelta(days=31) with open(TARGET_DIR + 'stage2/EU/patch-tender-periods.http', 'w') as self.app.file_obj: response = self.app.patch_json( '/tenders/{}?acc_token={}'.format(self.tender_id, owner_token), - {'data': {'tenderPeriod': {'endDate': tenderPeriod_endDate.isoformat()}}}) + {'data': {'tenderPeriod': {'endDate': tender_period_end_date.isoformat()}}}) with open(TARGET_DIR + 'stage2/EU/tender-activate.http', 'w') as self.app.file_obj: - response = self.app.patch_json( - '/tenders/{}?acc_token={}'.format(self.tender_id, owner_token), - {'data': {'status': 'active.tendering'}}) + with patch("openprocurement.tender.core.validation.RELEASE_ECRITERIA_ARTICLE_17", + get_now() + timedelta(days=1)): + response = self.app.patch_json( + '/tenders/{}?acc_token={}'.format(self.tender_id, owner_token), + {'data': {'status': 'active.tendering'}}) response = self.app.get('/tenders') with open(TARGET_DIR + 'stage2/EU/tender-listing-after-patch.http', 'w') as self.app.file_obj: @@ -620,13 +630,14 @@ def test_stage2_EU(self): response = self.app.get('/tenders/{}/questions/{}'.format(self.tender_id, question_id)) self.assertEqual(response.status, '200 OK') - self.time_shift('enquiryPeriod_ends', {'items': [{"deliveryDate": { + extra = {'items': [{"deliveryDate": { "startDate": (get_now() + timedelta(days=20)).isoformat(), "endDate": (get_now() + timedelta(days=50)).isoformat() - }}]}) + }}]} + self.time_shift('active.tendering', extra=extra, startend="enquiry_end") self.app.authorization = ('Basic', ('broker', '')) response = self.app.get('/tenders/{}?acc_token={}'.format(tender['id'], owner_token)) - endDate = (get_now() + timedelta(days=30, seconds=10)).isoformat() + endDate = (get_now() + timedelta(days=31)).isoformat() with open(TARGET_DIR + 'stage2/EU/update-tender-after-enqiery.http', 'w') as self.app.file_obj: response = self.app.patch_json( @@ -642,12 +653,12 @@ def test_stage2_EU(self): with open(TARGET_DIR + 'stage2/EU/update-tender-after-enqiery-with-update-periods.http', 'w') as self.app.file_obj: - tenderPeriod_endDate = get_now() + timedelta(days=8) + tender_period_end_date = get_now() + timedelta(days=8) response = self.app.patch_json( '/tenders/{}?acc_token={}'.format(tender['id'], owner_token), {'data': { 'items': [{'deliveryDate': {'endDate': endDate}}], - 'tenderPeriod': {'endDate': tenderPeriod_endDate.isoformat()} + 'tenderPeriod': {'endDate': tender_period_end_date.isoformat()} }}) self.assertEqual(response.status, '200 OK') @@ -1113,7 +1124,6 @@ def test_multiple_lots(self): response = self.app.post_json( '/tenders/{}/bids'.format(tender_id), {'data': { - 'selfEligible': True, 'selfQualified': True, 'tenderers': bid["tenderers"], 'lotValues': [{ @@ -1129,7 +1139,6 @@ def test_multiple_lots(self): response = self.app.post_json( '/tenders/{}/bids'.format(tender_id), {'data': { - 'selfEligible': True, 'selfQualified': True, 'tenderers': bid2['tenderers'], 'lotValues': [{ @@ -1147,7 +1156,6 @@ def test_multiple_lots(self): response = self.app.post_json( '/tenders/{}/bids'.format(tender_id), {'data': { - 'selfEligible': True, 'selfQualified': True, 'tenderers': bid3['tenderers'], 'lotValues': [{ @@ -1316,7 +1324,6 @@ def test_multiple_lots(self): response = self.app.post_json( '/tenders/{}/bids'.format(new_tender_id), {'data': { - 'selfEligible': True, 'selfQualified': True, 'tenderers': bid_with_bad_participant['tenderers'], 'lotValues': [{ @@ -1331,7 +1338,6 @@ def test_multiple_lots(self): response = self.app.post_json( '/tenders/{}/bids'.format(new_tender_id), {'data': { - 'selfEligible': True, 'selfQualified': True, 'tenderers': bid['tenderers'], 'lotValues': [{ @@ -1346,7 +1352,6 @@ def test_multiple_lots(self): response = self.app.post_json( '/tenders/{}/bids'.format(new_tender_id), {'data': { - 'selfEligible': True, 'selfQualified': True, 'tenderers': bid['tenderers'], 'lotValues': [{ @@ -1402,16 +1407,18 @@ def test_stage2_UA(self): #### Modifying tender - tenderPeriod_endDate = get_now() + timedelta(days=30, seconds=10) + tender_period_end_date = get_now() + timedelta(days=31) with open(TARGET_DIR + 'stage2/UA/patch-tender-periods.http', 'w') as self.app.file_obj: response = self.app.patch_json( '/tenders/{}?acc_token={}'.format(self.tender_id, owner_token), - {'data': {'tenderPeriod': {'endDate': tenderPeriod_endDate.isoformat()}}}) + {'data': {'tenderPeriod': {'endDate': tender_period_end_date.isoformat()}}}) with open(TARGET_DIR + 'stage2/UA/tender-activate.http', 'w') as self.app.file_obj: - response = self.app.patch_json( - '/tenders/{}?acc_token={}'.format(self.tender_id, owner_token), - {'data': {'status': 'active.tendering'}}) + with patch("openprocurement.tender.core.validation.RELEASE_ECRITERIA_ARTICLE_17", + get_now() + timedelta(days=1)): + response = self.app.patch_json( + '/tenders/{}?acc_token={}'.format(self.tender_id, owner_token), + {'data': {'status': 'active.tendering'}}) with open(TARGET_DIR + 'stage2/UA/tender-listing-after-patch.http', 'w') as self.app.file_obj: self.app.authorization = None @@ -1492,7 +1499,7 @@ def test_stage2_UA(self): self.set_enquiry_period_end() self.app.authorization = ('Basic', ('broker', '')) - endDate = (get_now() + timedelta(days=30, seconds=10)).isoformat() + endDate = (get_now() + timedelta(days=31)).isoformat() with open(TARGET_DIR + 'stage2/UA/update-tender-after-enqiery.http', 'w') as self.app.file_obj: response = self.app.patch_json( '/tenders/{}?acc_token={}'.format(tender['id'], owner_token), @@ -1507,12 +1514,12 @@ def test_stage2_UA(self): with open(TARGET_DIR + 'stage2/UA/update-tender-after-enqiery-with-update-periods.http', 'w') as self.app.file_obj: - tenderPeriod_endDate = get_now() + timedelta(days=8) + tender_period_end_date = get_now() + timedelta(days=8) response = self.app.patch_json( '/tenders/{}?acc_token={}'.format(tender['id'], owner_token), {'data': { 'items': [{'deliveryDate': {'endDate': endDate}}], - 'tenderPeriod': {'endDate': tenderPeriod_endDate.isoformat()} + 'tenderPeriod': {'endDate': tender_period_end_date.isoformat()} }}) self.assertEqual(response.status, '200 OK') @@ -1756,4 +1763,4 @@ def test_stage2_UA(self): response = self.app.get( '/tenders/{}/cancellations/{}?acc_token={}'.format( self.tender_id, cancellation_id, owner_token)) - self.assertEqual(response.status, '200 OK') \ No newline at end of file + self.assertEqual(response.status, '200 OK') diff --git a/docs/tests/test_defense.py b/docs/tests/test_defense.py index a88aae9fb8..d44855edd8 100644 --- a/docs/tests/test_defense.py +++ b/docs/tests/test_defense.py @@ -20,6 +20,8 @@ bid.update(subcontracting) bid.update(qualified) bid2.update(qualified) +bid.update({"selfEligible": True}) +bid2.update({"selfEligible": True}) TARGET_DIR = 'docs/source/tendering/defense/http/' @@ -90,11 +92,11 @@ def test_docs(self): #### Modifying tender - tenderPeriod_endDate = get_now() + timedelta(days=15, seconds=10) + tender_period_end_date = get_now() + timedelta(days=16) with open(TARGET_DIR + 'patch-items-value-periods.http', 'w') as self.app.file_obj: response = self.app.patch_json( '/tenders/{}?acc_token={}'.format(tender['id'], owner_token), - {'data': {"tenderPeriod": {"endDate": tenderPeriod_endDate.isoformat()}}}) + {'data': {"tenderPeriod": {"endDate": tender_period_end_date.isoformat()}}}) with open(TARGET_DIR + 'tender-listing-after-patch.http', 'w') as self.app.file_obj: self.app.authorization = None @@ -197,7 +199,7 @@ def test_docs(self): self.assertEqual(response.status, '403 Forbidden') with open(TARGET_DIR + 'update-tender-after-enqiery-with-update-periods.http', 'w') as self.app.file_obj: - tenderPeriod_endDate = get_now() + timedelta(days=8) + tender_period_end_date = get_now() + timedelta(days=8) response = self.app.patch_json( '/tenders/{}?acc_token={}'.format(tender['id'], owner_token), {'data': { @@ -206,7 +208,7 @@ def test_docs(self): "currency": u"UAH" }, "tenderPeriod": { - "endDate": tenderPeriod_endDate.isoformat() + "endDate": tender_period_end_date.isoformat() } }}) self.assertEqual(response.status, '200 OK') @@ -444,4 +446,4 @@ def test_docs(self): response = self.app.post_json( '/tenders?opt_pretty=1', {'data': test_tender_ua_data}) - self.assertEqual(response.status, '201 Created') \ No newline at end of file + self.assertEqual(response.status, '201 Created') diff --git a/docs/tests/test_esco.py b/docs/tests/test_esco.py index b9d5dc54c1..c54c108e6b 100644 --- a/docs/tests/test_esco.py +++ b/docs/tests/test_esco.py @@ -138,11 +138,11 @@ def test_docs(self): #### Modifying tender - tenderPeriod_endDate = get_now() + timedelta(days=30, seconds=10) + tender_period_end_date = get_now() + timedelta(days=31) with open(TARGET_DIR + 'patch-items-value-periods.http', 'w') as self.app.file_obj: response = self.app.patch_json( '/tenders/{}?acc_token={}'.format(tender['id'], owner_token), - {'data': {"tenderPeriod": {"endDate": tenderPeriod_endDate.isoformat()}}}) + {'data': {"tenderPeriod": {"endDate": tender_period_end_date.isoformat()}}}) self.assertEqual(response.status, '200 OK') with open(TARGET_DIR + 'tender-listing-after-patch.http', 'w') as self.app.file_obj: @@ -232,7 +232,7 @@ def test_docs(self): self.tender_id, question_id)) self.assertEqual(response.status, '200 OK') - self.time_shift('enquiryPeriod_ends') + self.set_enquiry_period_end() self.app.authorization = ('Basic', ('broker', '')) with open(TARGET_DIR + 'update-tender-after-enqiery.http', 'w') as self.app.file_obj: response = self.app.get('/tenders/{}?acc_token={}'.format(tender['id'], owner_token)) @@ -249,7 +249,7 @@ def test_docs(self): self.assertEqual(response.status, '403 Forbidden') with open(TARGET_DIR + 'update-tender-after-enqiery-with-update-periods.http', 'w') as self.app.file_obj: - tenderPeriod_endDate = get_now() + timedelta(days=8) + tender_period_end_date = get_now() + timedelta(days=8) response = self.app.patch_json( '/tenders/{}?acc_token={}'.format(tender['id'], owner_token), {'data': { @@ -258,7 +258,7 @@ def test_docs(self): "currency": u"UAH" }, "tenderPeriod": { - "endDate": tenderPeriod_endDate.isoformat() + "endDate": tender_period_end_date.isoformat() } }}) self.assertEqual(response.status, '200 OK') @@ -748,7 +748,6 @@ def test_multiple_lots(self): response = self.app.post_json( '/tenders/{}/bids'.format(tender_id), {'data': { - 'selfEligible': True, 'selfQualified': True, 'tenderers': bid["tenderers"], 'lotValues': [{ @@ -769,7 +768,6 @@ def test_multiple_lots(self): response = self.app.post_json( '/tenders/{}/bids'.format(tender_id), {'data': { - 'selfEligible': True, 'selfQualified': True, 'tenderers': bid2["tenderers"], 'lotValues': [{ @@ -866,4 +864,4 @@ def test_multiple_lots(self): response = self.app.patch_json( '/tenders/{}?acc_token={}'.format(tender_id, owner_token), {"data": {"status": "active.pre-qualification.stand-still"}}) - self.assertEqual(response.status, "200 OK") \ No newline at end of file + self.assertEqual(response.status, "200 OK") diff --git a/docs/tests/test_openeu.py b/docs/tests/test_openeu.py index 706b1e8452..802625b547 100644 --- a/docs/tests/test_openeu.py +++ b/docs/tests/test_openeu.py @@ -98,14 +98,14 @@ def test_docs(self): #### Modifying tender - tenderPeriod_endDate = get_now() + timedelta(days=30, seconds=10) + tender_period_end_date = get_now() + timedelta(days=31) with open(TARGET_DIR + 'patch-items-value-periods.http', 'w') as self.app.file_obj: response = self.app.patch_json( '/tenders/{}?acc_token={}'.format(tender['id'], owner_token), {'data': { "tenderPeriod": { - "endDate": tenderPeriod_endDate.isoformat() + "endDate": tender_period_end_date.isoformat() } } }) @@ -192,7 +192,7 @@ def test_docs(self): self.tender_id, question_id)) self.assertEqual(response.status, '200 OK') - self.time_shift('enquiryPeriod_ends') + self.set_enquiry_period_end() self.app.authorization = ('Basic', ('broker', '')) with open(TARGET_DIR + 'update-tender-after-enqiery.http', 'w') as self.app.file_obj: response = self.app.get('/tenders/{}?acc_token={}'.format(tender['id'], owner_token)) @@ -209,7 +209,7 @@ def test_docs(self): with open(TARGET_DIR + 'update-tender-after-enqiery-with-update-periods.http', 'w') as self.app.file_obj: - tenderPeriod_endDate = get_now() + timedelta(days=8) + tender_period_end_date = get_now() + timedelta(days=8) response = self.app.patch_json( '/tenders/{}?acc_token={}'.format(tender['id'], owner_token), {'data': { @@ -218,7 +218,7 @@ def test_docs(self): "currency": u"UAH" }, "tenderPeriod": { - "endDate": tenderPeriod_endDate.isoformat() + "endDate": tender_period_end_date.isoformat() } }}) self.assertEqual(response.status, '200 OK') @@ -676,7 +676,6 @@ def test_multiple_lots(self): response = self.app.post_json( '/tenders/{}/bids'.format(tender_id), {'data': { - 'selfEligible': True, 'selfQualified': True, 'tenderers': bid["tenderers"], 'lotValues': [{ @@ -693,7 +692,6 @@ def test_multiple_lots(self): response = self.app.post_json( '/tenders/{}/bids'.format(tender_id), {'data': { - 'selfEligible': True, 'selfQualified': True, 'tenderers': bid2["tenderers"], 'lotValues': [{ diff --git a/docs/tests/test_openua.py b/docs/tests/test_openua.py index 445c5fc19f..ad86349e70 100644 --- a/docs/tests/test_openua.py +++ b/docs/tests/test_openua.py @@ -89,11 +89,11 @@ def test_docs(self): #### Modifying tender - tenderPeriod_endDate = get_now() + timedelta(days=15, seconds=10) + tender_period_end_date = get_now() + timedelta(days=16) with open(TARGET_DIR + 'patch-items-value-periods.http', 'w') as self.app.file_obj: response = self.app.patch_json( '/tenders/{}?acc_token={}'.format(tender['id'], owner_token), - {'data': {"tenderPeriod": {"endDate": tenderPeriod_endDate.isoformat()}}}) + {'data': {"tenderPeriod": {"endDate": tender_period_end_date.isoformat()}}}) with open(TARGET_DIR + 'tender-listing-after-patch.http', 'w') as self.app.file_obj: self.app.authorization = None @@ -197,7 +197,7 @@ def test_docs(self): self.assertEqual(response.status, '403 Forbidden') with open(TARGET_DIR + 'update-tender-after-enqiery-with-update-periods.http', 'w') as self.app.file_obj: - tenderPeriod_endDate = get_now() + timedelta(days=8) + tender_period_end_date = get_now() + timedelta(days=8) response = self.app.patch_json( '/tenders/{}?acc_token={}'.format(tender['id'], owner_token), {'data': { @@ -206,7 +206,7 @@ def test_docs(self): "currency": u"UAH" }, "tenderPeriod": { - "endDate": tenderPeriod_endDate.isoformat() + "endDate": tender_period_end_date.isoformat() } }}) self.assertEqual(response.status, '200 OK') @@ -610,8 +610,8 @@ def test_docs(self): ) self.assertEqual(len(response.json["data"]), 3) self.assertNotIn("url", response.json["data"][0]) - self.assertNotIn("url", response.json["data"][1]) - self.assertIn("url", response.json["data"][2]) + self.assertIn("url", response.json["data"][1]) + self.assertNotIn("url", response.json["data"][2]) TARGET_VALUE_DIR = 'docs/source/tendering/basic-actions/http/complaints-value/' @@ -638,8 +638,8 @@ def test_complaint_value(self): } self.initial_data.update({ - "enquiryPeriod": {"endDate": (get_now() + timedelta(days=7)).isoformat()}, - "tenderPeriod": {"endDate": (get_now() + timedelta(days=15)).isoformat()} + "enquiryPeriod": {"endDate": (get_now() + timedelta(days=8)).isoformat()}, + "tenderPeriod": {"endDate": (get_now() + timedelta(days=16)).isoformat()} }) response = self.app.post_json("/tenders", {"data": self.initial_data}) diff --git a/docs/tests/test_pricequotation.py b/docs/tests/test_pricequotation.py new file mode 100644 index 0000000000..4bbd3aa81e --- /dev/null +++ b/docs/tests/test_pricequotation.py @@ -0,0 +1,467 @@ +# -*- coding: utf-8 -*- +import os +from copy import deepcopy +from uuid import uuid4 +from datetime import timedelta + +from openprocurement.api.models import get_now +from openprocurement.tender.pricequotation.tests.base import ( + BaseTenderWebTest, test_tender_data, test_bids, bid_with_docs, test_short_profile, + test_shortlisted_firms) +from openprocurement.tender.core.tests.base import change_auth + +from tests.base.test import DumpsWebTestApp, MockWebTestMixin +from tests.base.constants import DOCS_URL, AUCTIONS_URL + +test_tender_data = deepcopy(test_tender_data) +test_tender_data['items'][0].pop('classification') +test_tender_data['items'][0].pop('additionalClassifications') +bid_draft = deepcopy(test_bids[0]) +bid_draft["status"] = "draft" + +TARGET_DIR = 'docs/source/tendering/pricequotation/http/' + + +class TenderResourceTest(BaseTenderWebTest, MockWebTestMixin): + AppClass = DumpsWebTestApp + + relative_to = os.path.dirname(__file__) + initial_data = test_tender_data + initial_bids = test_bids + docservice = True + docservice_url = DOCS_URL + auctions_url = AUCTIONS_URL + + def setUp(self): + super(TenderResourceTest, self).setUp() + self.setUpMock() + + def tearDown(self): + self.tearDownMock() + super(TenderResourceTest, self).tearDown() + + def test_docs_publish_tenders(self): + tender_data = deepcopy(test_tender_data) + tender_data.update({ + "tenderPeriod": {"endDate": (get_now() + timedelta(days=14)).isoformat()} + }) + for item in tender_data['items']: + item['deliveryDate'] = { + "startDate": (get_now() + timedelta(days=2)).isoformat(), + "endDate": (get_now() + timedelta(days=5)).isoformat() + } + + tender_data_1 = deepcopy(tender_data) + tender_data_1['profile'] = test_short_profile["id"] + response = self.app.post_json("/tenders", {"data": tender_data_1}) + self.assertEqual(response.status, "201 Created") + tender_id_1 = response.json["data"]["id"] + owner_token = response.json["access"]["token"] + tender = response.json["data"] + + self.assertEqual(tender["status"], "draft") + self.assertEqual(len(tender["items"]), 1) + self.assertNotIn("shortlistedFirms", tender) + self.assertNotIn("classification", tender["items"][0]) + self.assertNotIn("unit", tender["items"][0]) + self.assertEqual(tender["profile"], test_short_profile["id"]) + + with open(TARGET_DIR + 'publish-tender.http', 'w') as self.app.file_obj: + response = self.app.patch_json( + "/tenders/{}?acc_token={}".format(tender_id_1, owner_token), + {"data": {"status": "draft.publishing"}} + ) + self.assertEqual(response.status, "200 OK") + tender = response.json["data"] + self.assertEqual(tender["status"], "draft.publishing") + + items = deepcopy(tender["items"]) + items[0]["classification"] = test_short_profile["classification"] + items[0]["unit"] = test_short_profile["unit"] + criteria = deepcopy(test_short_profile["criteria"]) + data = { + "data": { + "status": "active.tendering", + "items": items, + "shortlistedFirms": test_shortlisted_firms, + "criteria": criteria + } + } + + test_tender_data2 = deepcopy(tender_data) + test_tender_data2["profile"] += "bad_profile" + + response = self.app.post_json( + '/tenders?opt_pretty=1', + {'data': test_tender_data2}) + self.assertEqual(response.status, '201 Created') + + tender_id_2 = response.json['data']['id'] + + with change_auth(self.app, ("Basic", ("pricequotation", ""))) as app: + resp = app.patch_json("/tenders/{}".format(tender_id_1), data) + self.assertEqual(resp.status, "200 OK") + resp = app.patch_json('/tenders/{}'.format(tender_id_2), {"data": {"status": "draft.unsuccessful"}}) + self.assertEqual(resp.status, "200 OK") + + with open(TARGET_DIR + 'tender-after-bot-active.http', 'w') as self.app.file_obj: + response = self.app.get("/tenders/{}".format(tender_id_1)) + tender = response.json["data"] + self.assertEqual(response.status, "200 OK") + self.assertIn("shortlistedFirms", tender) + self.assertIn("classification", tender["items"][0]) + self.assertIn("unit", tender["items"][0]) + + with open(TARGET_DIR + 'tender-after-bot-unsuccessful.http', 'w') as self.app.file_obj: + response = self.app.get('/tenders/{}'.format(tender_id_2)) + self.assertEqual(response.status, '200 OK') + + def test_docs_tutorial(self): + + request_path = '/tenders?opt_pretty=1' + + # Exploring basic rules + + with open(TARGET_DIR + 'tender-post-attempt.http', 'w') as self.app.file_obj: + response = self.app.post(request_path, 'data', status=415) + self.assertEqual(response.status, '415 Unsupported Media Type') + + self.app.authorization = ('Basic', ('broker', '')) + + with open(TARGET_DIR + 'tender-post-attempt-json.http', 'w') as self.app.file_obj: + self.app.authorization = ('Basic', ('broker', '')) + response = self.app.post( + request_path, 'data', content_type='application/json', status=422) + self.assertEqual(response.status, '422 Unprocessable Entity') + + # Creating tender + + for item in test_tender_data['items']: + item['deliveryDate'] = { + "startDate": (get_now() + timedelta(days=2)).isoformat(), + "endDate": (get_now() + timedelta(days=5)).isoformat() + } + + test_tender_data.update({ + "tenderPeriod": {"endDate": (get_now() + timedelta(days=14)).isoformat()} + }) + + with open(TARGET_DIR + 'tender-post-attempt-json-data.http', 'w') as self.app.file_obj: + response = self.app.post_json( + '/tenders?opt_pretty=1', + {'data': test_tender_data}) + self.assertEqual(response.status, '201 Created') + + tender = response.json['data'] + owner_token = response.json['access']['token'] + self.tender_id = tender['id'] + + with open(TARGET_DIR + 'blank-tender-view.http', 'w') as self.app.file_obj: + response = self.app.get('/tenders/{}'.format(tender['id'])) + self.assertEqual(response.status, '200 OK') + + with open(TARGET_DIR + 'initial-tender-listing.http', 'w') as self.app.file_obj: + response = self.app.get('/tenders') + self.assertEqual(response.status, '200 OK') + + response = self.app.post_json( + '/tenders?opt_pretty=1', + {'data': test_tender_data}) + self.assertEqual(response.status, '201 Created') + + with open(TARGET_DIR + 'tender-listing-after-creation.http', 'w') as self.app.file_obj: + response = self.app.get('/tenders') + self.assertEqual(response.status, '200 OK') + + self.app.authorization = ('Basic', ('broker', '')) + + # Modifying tender + + self.tick() + + tenderPeriod_endDate = get_now() + timedelta(days=15, seconds=10) + with open(TARGET_DIR + 'patch-tender-data.http', 'w') as self.app.file_obj: + response = self.app.patch_json( + '/tenders/{}?acc_token={}'.format(tender['id'], owner_token), + {'data': {"tenderPeriod": {"endDate": tenderPeriod_endDate.isoformat()}}}) + + self.app.authorization = ('Basic', ('broker', '')) + + self.set_status('active.tendering') + + with open(TARGET_DIR + 'tender-listing-after-patch.http', 'w') as self.app.file_obj: + self.app.authorization = None + response = self.app.get(request_path) + self.assertEqual(response.status, '200 OK') + + # Registering bid + + self.app.authorization = ('Basic', ('broker', '')) + bids_access = {} + with open(TARGET_DIR + 'register-bidder.http', 'w') as self.app.file_obj: + response = self.app.post_json( + '/tenders/{}/bids'.format(self.tender_id), + {'data': bid_draft}) + bid1_id = response.json['data']['id'] + bids_access[bid1_id] = response.json['access']['token'] + self.assertEqual(response.status, '201 Created') + + with open(TARGET_DIR + 'patch-bidder.http', 'w') as self.app.file_obj: + response = self.app.patch_json( + '/tenders/{}/bids/{}?acc_token={}'.format( + self.tender_id, bid1_id, bids_access[bid1_id] + ), + {'data': {"value": {"amount": 459}}} + ) + self.assertEqual(response.status, '200 OK') + + with open(TARGET_DIR + 'activate-bidder.http', 'w') as self.app.file_obj: + response = self.app.patch_json( + '/tenders/{}/bids/{}?acc_token={}'.format( + self.tender_id, bid1_id, bids_access[bid1_id]), + {'data': {"status": "active"}}) + self.assertEqual(response.status, '200 OK') + + # Proposal Uploading + + with open(TARGET_DIR + 'upload-bid-proposal.http', 'w') as self.app.file_obj: + response = self.app.post_json( + '/tenders/{}/bids/{}/documents?acc_token={}'.format( + self.tender_id, bid1_id, bids_access[bid1_id]), + {'data': { + 'title': u'Proposal.pdf', + 'url': self.generate_docservice_url(), + 'hash': 'md5:' + '0' * 32, + 'format': 'application/pdf', + }}) + self.assertEqual(response.status, '201 Created') + + with open(TARGET_DIR + 'bidder-documents.http', 'w') as self.app.file_obj: + response = self.app.get('/tenders/{}/bids/{}/documents?acc_token={}'.format( + self.tender_id, bid1_id, bids_access[bid1_id])) + self.assertEqual(response.status, '200 OK') + + # Second bid registration with documents + + with open(TARGET_DIR + 'register-2nd-bidder.http', 'w') as self.app.file_obj: + for document in bid_with_docs['documents']: + document['url'] = self.generate_docservice_url() + response = self.app.post_json( + '/tenders/{}/bids'.format(self.tender_id), + {'data': bid_with_docs}) + bid2_id = response.json['data']['id'] + bids_access[bid2_id] = response.json['access']['token'] + self.assertEqual(response.status, '201 Created') + + self.set_status('active.qualification') + + with open(TARGET_DIR + 'awards-listing.http', 'w') as self.app.file_obj: + response = self.app.get('/tenders/{}/awards'.format(self.tender_id)) + self.assertEqual(response.status, '200 OK') + + # get pending award + award = [i for i in response.json['data'] if i['status'] == 'pending'][0] + award_id = award['id'] + award_token = bids_access[award['bid_id']] + + with open(TARGET_DIR + 'award-unsuccesful.http', 'w') as self.app.file_obj: + response = self.app.patch_json( + '/tenders/{}/awards/{}?acc_token={}'.format(self.tender_id, award_id, award_token), + {"data": {"status": "unsuccessful"}}) + self.assertEqual(response.status, '200 OK') + + with open(TARGET_DIR + 'awards-listing-after-cancel.http', 'w') as self.app.file_obj: + response = self.app.get('/tenders/{}/awards'.format(self.tender_id)) + self.assertEqual(response.status, '200 OK') + award = [i for i in response.json['data'] if i['status'] == 'pending'][0] + award_id = award['id'] + award_token = bids_access[award['bid_id']] + + with open(TARGET_DIR + 'award-active.http', 'w') as self.app.file_obj: + response = self.app.patch_json( + '/tenders/{}/awards/{}?acc_token={}'.format(self.tender_id, award_id, award_token), + {"data": {"status": "active"}}) + self.assertEqual(response.status, '200 OK') + + with open(TARGET_DIR + 'award-cancelled.http', 'w') as self.app.file_obj: + response = self.app.patch_json( + '/tenders/{}/awards/{}?acc_token={}'.format(self.tender_id, award_id, owner_token), + {"data": {"status": "cancelled"}}) + self.assertEqual(response.status, '200 OK') + + response = self.app.get('/tenders/{}/awards'.format(self.tender_id)) + award = [i for i in response.json['data'] if i['status'] == 'pending'][0] + award_id = award['id'] + + response = self.app.patch_json( + '/tenders/{}/awards/{}?acc_token={}'.format(self.tender_id, award_id, owner_token), + {"data": {"status": "active"}}) + self.assertEqual(response.status, '200 OK') + + with open(TARGET_DIR + 'contract-listing.http', 'w') as self.app.file_obj: + response = self.app.get('/tenders/{}/contracts'.format(self.tender_id)) + self.assertEqual(response.status, '200 OK') + + self.contract_id = [contract for contract in response.json['data'] if contract['status'] == 'pending'][0]['id'] + + #### Set contract value + + with open(TARGET_DIR + 'tender-contract-get-contract-value.http', 'w') as self.app.file_obj: + response = self.app.get('/tenders/{}/contracts/{}'.format( + self.tender_id, self.contract_id)) + self.assertEqual(response.status, '200 OK') + + with open(TARGET_DIR + 'tender-contract-set-contract-value.http', 'w') as self.app.file_obj: + response = self.app.patch_json( + '/tenders/{}/contracts/{}?acc_token={}'.format( + self.tender_id, self.contract_id, owner_token), + {"data": { + "contractNumber": "contract #13111", + "value": {"amount": 238, "amountNet": 230} + }}) + self.assertEqual(response.status, '200 OK') + self.assertEqual(response.json['data']['value']['amount'], 238) + + #### Setting contract signature date + + self.tick() + + with open(TARGET_DIR + 'tender-contract-sign-date.http', 'w') as self.app.file_obj: + response = self.app.patch_json( + '/tenders/{}/contracts/{}?acc_token={}'.format( + self.tender_id, self.contract_id, owner_token), + {'data': {"dateSigned": get_now().isoformat()}}) + self.assertEqual(response.status, '200 OK') + + #### Setting contract period + + period_dates = {"period": { + "startDate": get_now().isoformat(), + "endDate": (get_now() + timedelta(days=365)).isoformat() + }} + with open(TARGET_DIR + 'tender-contract-period.http', 'w') as self.app.file_obj: + response = self.app.patch_json( + '/tenders/{}/contracts/{}?acc_token={}'.format( + self.tender_id, self.contract_id, owner_token), + {'data': {'period': period_dates["period"]}}) + self.assertEqual(response.status, '200 OK') + + #### Uploading contract documentation + + with open(TARGET_DIR + 'tender-contract-upload-document.http', 'w') as self.app.file_obj: + response = self.app.post_json( + '/tenders/{}/contracts/{}/documents?acc_token={}'.format( + self.tender_id, self.contract_id, owner_token), + {'data': { + 'title': u'contract_first_document.doc', + 'url': self.generate_docservice_url(), + 'hash': 'md5:' + '0' * 32, + 'format': 'application/msword', + }}) + self.assertEqual(response.status, '201 Created') + + with open(TARGET_DIR + 'tender-contract-get-documents.http', 'w') as self.app.file_obj: + response = self.app.get('/tenders/{}/contracts/{}/documents'.format( + self.tender_id, self.contract_id)) + self.assertEqual(response.status, '200 OK') + + with open(TARGET_DIR + 'tender-contract-upload-second-document.http', 'w') as self.app.file_obj: + response = self.app.post_json( + '/tenders/{}/contracts/{}/documents?acc_token={}'.format( + self.tender_id, self.contract_id, owner_token), + {'data': { + 'title': u'contract_second_document.doc', + 'url': self.generate_docservice_url(), + 'hash': 'md5:' + '0' * 32, + 'format': 'application/msword', + }}) + self.assertEqual(response.status, '201 Created') + + with open(TARGET_DIR + 'tender-contract-get-documents-again.http', 'w') as self.app.file_obj: + response = self.app.get('/tenders/{}/contracts/{}/documents'.format( + self.tender_id, self.contract_id)) + self.assertEqual(response.status, '200 OK') + + #### Setting contract signature date + + with open(TARGET_DIR + 'tender-contract-sign-date.http', 'w') as self.app.file_obj: + response = self.app.patch_json( + '/tenders/{}/contracts/{}?acc_token={}'.format( + self.tender_id, self.contract_id, owner_token), + {'data': {"dateSigned": get_now().isoformat()}}) + self.assertEqual(response.status, '200 OK') + + #### Contract signing + + with open(TARGET_DIR + 'tender-contract-sign.http', 'w') as self.app.file_obj: + response = self.app.patch_json( + '/tenders/{}/contracts/{}?acc_token={}'.format( + self.tender_id, self.contract_id, owner_token), + {'data': {'status': 'active'}}) + self.assertEqual(response.status, '200 OK') + + # Preparing the cancellation request + + self.set_status('active.awarded') + with open(TARGET_DIR + 'prepare-cancellation.http', 'w') as self.app.file_obj: + response = self.app.post_json( + '/tenders/{}/cancellations?acc_token={}'.format( + self.tender_id, owner_token), + {'data': {'reason': 'cancellation reason', 'reasonType': 'noDemand'}}) + self.assertEqual(response.status, '201 Created') + + cancellation_id = response.json['data']['id'] + + # Changing cancellation reasonType + + with open(TARGET_DIR + 'update-cancellation-reasonType.http', 'w') as self.app.file_obj: + response = self.app.patch_json( + '/tenders/{}/cancellations/{}?acc_token={}'.format( + self.tender_id, cancellation_id, owner_token + ), + {'data': {'reasonType': 'expensesCut'}} + ) + self.assertEqual(response.status, '200 OK') + + # Filling cancellation with protocol and supplementary documentation + + with open(TARGET_DIR + 'upload-cancellation-doc.http', 'w') as self.app.file_obj: + response = self.app.post_json( + '/tenders/{}/cancellations/{}/documents?acc_token={}'.format( + self.tender_id, cancellation_id, owner_token), + {'data': { + 'title': u'Notice.pdf', + 'url': self.generate_docservice_url(), + 'hash': 'md5:' + '0' * 32, + 'format': 'application/pdf', + }}) + cancellation_doc_id = response.json['data']['id'] + self.assertEqual(response.status, '201 Created') + + with open(TARGET_DIR + 'patch-cancellation.http', 'w') as self.app.file_obj: + response = self.app.patch_json( + '/tenders/{}/cancellations/{}/documents/{}?acc_token={}'.format( + self.tender_id, cancellation_id, cancellation_doc_id, owner_token), + {'data': {"description": 'Changed description'}}) + self.assertEqual(response.status, '200 OK') + + with open(TARGET_DIR + 'update-cancellation-doc.http', 'w') as self.app.file_obj: + response = self.app.put_json( + '/tenders/{}/cancellations/{}/documents/{}?acc_token={}'.format( + self.tender_id, cancellation_id, cancellation_doc_id, owner_token), + {'data': { + 'title': u'Notice-2.pdf', + 'url': self.generate_docservice_url(), + 'hash': 'md5:' + '0' * 32, + 'format': 'application/pdf', + }}) + self.assertEqual(response.status, '200 OK') + + # Activating the request and cancelling tender + + with open(TARGET_DIR + 'active-cancellation.http', 'w') as self.app.file_obj: + response = self.app.patch_json( + '/tenders/{}/cancellations/{}?acc_token={}'.format( + self.tender_id, cancellation_id, owner_token), + {'data': {"status": "active"}}) + self.assertEqual(response.status, '200 OK') diff --git a/kube/config b/kube/config new file mode 100644 index 0000000000..ebd246db7e --- /dev/null +++ b/kube/config @@ -0,0 +1,31 @@ +apiVersion: v1 +clusters: +- cluster: + insecure-skip-tls-verify: true + server: https://localhost:6443 + name: docker-for-desktop-cluster +- cluster: + certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUN5RENDQWJDZ0F3SUJBZ0lCQURBTkJna3Foa2lHOXcwQkFRc0ZBREFWTVJNd0VRWURWUVFERXdwcmRXSmwKY201bGRHVnpNQjRYRFRFNE1URXhOVEE0TlRBeU9Gb1hEVEk0TVRFeE1qQTROVEF5T0Zvd0ZURVRNQkVHQTFVRQpBeE1LYTNWaVpYSnVaWFJsY3pDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBUFRSCmtGL3ZTenFmOWtmbnA1ditSbzJZVXdEMkx4THd1YnpqM1FuWjZmTnd3V1U3UmREdzA3NDI3Y29NbnYydkRmZFoKSGIybVZxWkdlRUJYaExjYWtMV09FUVdHNG9NbzNxb3VQMFZaT1lIWitlVlF3akNZTkxTOHhKbkV6MHBWYTNrSApIYWNPaU9DSTFGU3JaQWRvQjNId2lkYmxJY2hacGJtVFJiQ0lxZVhlTU52RlNEeVJjTG9xYTN0MktwY1U1NWwwCmVVQ2pnaFFVckEyNzVnTDZVblNkR256eWEyNENpODNMMEdNLzR4bEdTNW5xQVg3MktEVEVzTzlaL3E2T1JLaVQKWG1pM1dYYkZuOXN3bW5CcFV5ZndmMXlmS0xaMWNhK1JXTm5SOW53N0s5S3FjWUxrZ1dMdG8xbEZnaWtIRjdzbAowQTNad01ZK0VUTnhpUktJQ2JNQ0F3RUFBYU1qTUNFd0RnWURWUjBQQVFIL0JBUURBZ0trTUE4R0ExVWRFd0VCCi93UUZNQU1CQWY4d0RRWUpLb1pJaHZjTkFRRUxCUUFEZ2dFQkFPWG9ramJrY1BFNE8zMm5RRXMwa3E3TEJFaTUKOW5oMThRck9md2tZVlIreXppdjhaNFljckM1NUw1ci9TVHlDYmdoM0hDNXlDWkdvWERHKzNxbFNjSkNVaGlqbwo2cHdqdm5PSTVTNTVHcGlSZVFjcVIvVUdjRTNoRlYrcDdKQVdCeWZiQmczL2dtZkpSSU83eVdJTUVIWDZibEVTCjdvTktCMGVPMTkza1IzNWRSZ1FBWG5wSmt0d0FDOGlFRnJycUlBZVlqQ2N2S00reDk2aitLQlBpbHhLT0hVUGkKUlFyKytBTG56cDJ5NWlybnlBRFZyUm1WLytzakZlNFZVYklFRzB2bHBhN0JESTZjRnhiUFB0Z05ma3hXdjFJeQprY2YySUV4T25LOXFmWkxHSzI3WUhtemdzUVIrRStsZ0lacnpPckpTSFc5bngwQUlIa011RGVSZ1htdz0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo= + server: https://10.6.4.200:6443 + name: kubernetes +contexts: +- context: + cluster: docker-for-desktop-cluster + user: docker-for-desktop + name: docker-for-desktop +- context: + cluster: kubernetes + user: kubernetes-admin + name: kubernetes-admin@kubernetes +current-context: kubernetes-admin@kubernetes +kind: Config +preferences: {} +users: +- name: docker-for-desktop + user: + client-certificate-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUM5RENDQWR5Z0F3SUJBZ0lJRDQ3bGVzaGUxVG93RFFZSktvWklodmNOQVFFTEJRQXdGVEVUTUJFR0ExVUUKQXhNS2EzVmlaWEp1WlhSbGN6QWVGdzB4T0RFd01UWXhOek15TWpOYUZ3MHlNREEyTURnd05qVTNNakphTURZeApGekFWQmdOVkJBb1REbk41YzNSbGJUcHRZWE4wWlhKek1Sc3dHUVlEVlFRREV4SmtiMk5yWlhJdFptOXlMV1JsCmMydDBiM0F3Z2dFaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQkR3QXdnZ0VLQW9JQkFRRGtkOUNMMUFCaEY4dDcKRENNMnNXZ2x6djhUSGF2TzJlaHNFczBLeEk5bWFQNWhSejBlZS91K0tJY0M2LzVMQit5ZGFjZGhNVXVEc1pteAo5NFBYWTFsZmNnVEx1MS84S3FJVnBQOWFzaGYrU0gxelJYYkswOTM0Uit5TkJGUDArN3gvUXhtcE5RZkE3SU1NCjVHTjE2d3dtWHBFSFg4NjhqZ2pGSks4eWtsVkQ2YlFBekF3WThWbkowODJnMDNrUUc5T3FWNFYvekV0Z045MVIKUGVVTHJMVHhnTUJDNGFFdFM1UWZwbkpFUEJLU1lZcCtwWC9HRVcraEVwVmR3RXBTUUQzWEtsRXNFUmNnOHlhSAp1TklySEI3Y2dGcXJLM05ZWXdaaXBhZ0E5OXczQ1hOS29Ed3lVbkVOT3NBbXBHZjFOS3l3eFpuQjk5MGkxc0tTCmR3TzZXTEd2QWdNQkFBR2pKekFsTUE0R0ExVWREd0VCL3dRRUF3SUZvREFUQmdOVkhTVUVEREFLQmdnckJnRUYKQlFjREFqQU5CZ2txaGtpRzl3MEJBUXNGQUFPQ0FRRUFhTWFXQlhidUV0a1VWMUtuck90Szg0dTJ4anVwa0MwNApIVUpsUnVFTjI4Zk5aMHN3VUZ5M29KWEgxYjA3aS9UdmloVlM2c3o1T004RkI3RGVkZlA3ZWVoYTJmNzVaeERCCi9qc24vcmNUN1pDcWg1blprNXk4dkZrUmJ1dFRpVkNCV2NRMVM4aThGcW5XYVZJM0YyNVVEVnMwMEg2RU00czMKeDdSeEhmbHY4S2FCM0x1RXV1b1VkRWpLMVRiMW1vUjE2eXJTKzBIRjN2a1VLMnRwb1ZJYmN2S0xJWnJEa2ZKUgpveTl6OXhPbjhiWnNEMXZOZ3lOMU9RMTRGdVJRTmNhQ2R5RlB3aFpRNGRxNDh5NUk2OWFwbit4NTl1ZFExMS9mCk55YWZvQTlOSFlzL2pTcnJydEJld2pzdzNpUVMrektmWG82VXN0aUkyNWRaMTRWbzVOTXkxUT09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K + client-key-data: LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlFcFFJQkFBS0NBUUVBNUhmUWk5UUFZUmZMZXd3ak5yRm9KYzcvRXgycnp0bm9iQkxOQ3NTUFptaitZVWM5Ckhudjd2aWlIQXV2K1N3ZnNuV25IWVRGTGc3R1pzZmVEMTJOWlgzSUV5N3RmL0NxaUZhVC9XcklYL2toOWMwVjIKeXRQZCtFZnNqUVJUOVB1OGYwTVpxVFVId095RERPUmpkZXNNSmw2UkIxL092STRJeFNTdk1wSlZRK20wQU13TQpHUEZaeWRQTm9OTjVFQnZUcWxlRmY4eExZRGZkVVQzbEM2eTA4WURBUXVHaExVdVVINlp5UkR3U2ttR0tmcVYvCnhoRnZvUktWWGNCS1VrQTkxeXBSTEJFWElQTW1oN2pTS3h3ZTNJQmFxeXR6V0dNR1lxV29BUGZjTndselNxQTgKTWxKeERUckFKcVJuOVRTc3NNV1p3ZmZkSXRiQ2tuY0R1bGl4cndJREFRQUJBb0lCQVFEZGhTNjM1VDdZNVhGdQpSVDUvY1ZSQ0ZJcE54cDhuV1RGNldHQm02RjhDTlJzd3h4b0R6TU15aGFraXRCOUVNTkxEYmlUYm9DaFA4SXZOCmV1aGlsdm01Q1p5TXpZa3J2MHFaSWZwVnZnaDFqV1BWdUt5TnpRK1VCR2pmOGlwVmh5QWxaTElrMWo1R1dReFkKRzdvMFEwcnNpUlNseWNkeUcyVjFnVFErSEpSLzJ1eDQ4cU0zb04xSnhMUGNyelVaSFNUR09tNWp1V0czTU1QZwpMbG9NaGZzMDd6WlgvQ0MzWlNVTk04djVkc3V0YUR1YTlNRUtSMlJOcWZCcDN6dUdDbmV1aGp0dTlmL3NOWHdWCm1Bb1pHK3U2enVxR29lYW9QVFpndm9VNGJuYVRIM3pnckVCdlh4cFR6c2NrR3VLdUk4RFhTRkk2emhMSkFNaEkKVjg3RExaS0JBb0dCQU9zUGdXU1o2STVYcHQ1Q2I4SXBaemxUcDA0UEYrY2lQWSt0V01aN0lTSGxRMVdUVUx1UQpXSW92ZTBNazI4NnpqekdmSzc4RG9hQ0lKcTllV3FWc3VUVXBuejd3a0x4TGYvQjJMME5xcXRKYW5Pc3hROXM0CkExUDl2VFB0VDBMY1BlZTdlZ2JhNWRJSzRFUWJDeHdlbXcyZWZEay9DVVRJUWRvL04rUHl1alJKQW9HQkFQalIKOTg2dHAzay85Q2Z0RndodzNXb0RSLy9pUUNaTFlCSjJlWGFpK3Y1TDJmbWdvanZRSzc2OHFZMCtmNnNWd2VmdApiZmtaeno4anNYbE4wQ3h1NWZXWURmS29vQXFDTmhwR0x4Y2NWbFhiN1dlMy9rdDV5Nk8wcUJsYXhrbGF0TXFBCnhURlVsd2RLNWQyb1FrZjNjc25zczhMTW01VFA4cGdKWURwQ3I4WTNBb0dCQUozMkVJVVRiSlZqVDg3aXBJbTkKR3hJS0prOHRrMm1PdUFINmdzTDI4Wi8rbWs1Q3Jpa3RhbUtLWC9JU0xlaHRBQmhmbDUxSWltLy9yc2VBeDdlTgpKYlVWSUYvQ2QvRWhaM3VuWUVHVXgvQ09WZzh6VHg5ZE45ZFVsN1h5anFZbXJTOHg3R0g0N2lKRmpzb1Z4bFNDCk9MNWhONmVjdGRUVUluVFFzUFZ0SXphSkFvR0JBSURSNUNSQ3o3UDhvbUdSWkIxZ29hRmpOWUdMRjM4OEF1OU0KR3pLS3lydWhkYWJCdlh5T0dEZlY0VXBaRXl2MlJiL1hzdG9HdkwrSnNUYUdUTUxVWDRZNVJPOWUwZ3pld1RmMQpJaWdxNlovbUR4Rmx0dWhJbEYrYkJuU3FCSUt4eld3U0l3V1pMOS84ck9tSFZWbUJDUkwxMDFPRkx2OXFjY1M1CkJmTGoxN0VkQW9HQWVYcGtEcXFRNUg4UnBKbStsaVpOSm45em1wY2ZlVGlTeStlNGNNZW1NNC9uV1hyMVg0aTIKcURpWkFRbUFva2ZkODhTemFDWEhvc015T1dFeFZpNStpZ0ZxMWRuajFjdGRTdnNvT2hUNEU3bTAwTlVMNGlqRApZMytNemc5REdkUDRwa0pNMFEyRkIrcnhzNE9lVjc3djFxT0hnR216dFdKS1RHb2JYbEpKTWM0PQotLS0tLUVORCBSU0EgUFJJVkFURSBLRVktLS0tLQo= +- name: kubernetes-admin + user: + client-certificate-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUM4akNDQWRxZ0F3SUJBZ0lJWkp2ckxwck9WZ293RFFZSktvWklodmNOQVFFTEJRQXdGVEVUTUJFR0ExVUUKQXhNS2EzVmlaWEp1WlhSbGN6QWVGdzB4T0RFeE1UVXdPRFV3TWpoYUZ3MHlNREV4TVRjeE1USXhOREphTURReApGekFWQmdOVkJBb1REbk41YzNSbGJUcHRZWE4wWlhKek1Sa3dGd1lEVlFRREV4QnJkV0psY201bGRHVnpMV0ZrCmJXbHVNSUlCSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQVE4QU1JSUJDZ0tDQVFFQXVhd0xMN3l0b21iZWdTZFgKRjcyYWVYWFQ4NVd0YTdHNUtoNFE2Z2ZCSGNTOFlDbDNEL1R0bU5RWlJ1UHNWZHY4OUhTUGlkOGNSQmQwWnB1ZQpJSGJzOUplTENrMThZSlc4WUJRYkFhdlFkUHFJTVF6VTRSQUZpR05LMUNaSnJJdGxPL1RDVDBoSDhFOWd5TDNNCjFGeUhwWVF5ek9WV3B5bEN6a3pBZW5DQWl4WFlTNStjbmJhZFN4UWQ4YjBtVDBGWGRtWVZGcWt6L28vM21lSGwKUXF0VWo4Y01POFM5cmpsMUgxR2p3cURZZklqcXlCZFpXYkZwMDJvVUR0R2Nnd2RQOWFxV2xueWJZNlVmeEJXegp0S0RFYTc1Rng2b3dVOVVHWk92R2haZFRRbDY4bG9lc2NPVFBCdHRuR25wV2Y0ekpJc2p5MXFtaHhzY0xQRXhuCnhBT3JmUUlEQVFBQm95Y3dKVEFPQmdOVkhROEJBZjhFQkFNQ0JhQXdFd1lEVlIwbEJBd3dDZ1lJS3dZQkJRVUgKQXdJd0RRWUpLb1pJaHZjTkFRRUxCUUFEZ2dFQkFCajhTczRKMkFaZUhTb3NTdmI2bGFNQkpzdEpjZ0FlNDd2SQowYnZJQVVQUjJYNGN2K045WWVuNEkrdFpYNlIwOFlVZWh5Vm5mbnY2MDFDSnVWbFJscnpjY2tZSEZkMkcvdUMyCkJFTlBETFBSeDZjTmtpTkxJRE5sekFPUHcxaWhaaURDL2EzWG52OWFWTVZLSDZxYkIrM2RFUjdFYzcvOWYyRXUKM1ZFZEVGSzVtUDhZamJKOERkMm1aRUhJNmtwb1N6bEZNb1hoU0lxeU9KVWFKNWxWVGtTbmp2SGcxQ0ppYVowaQozQXRsQ2lhSy9DUUJmM0I3YUhwWG5rNWpuQ2lXNnJDYXdJc2RJREVtcmFLRTMzUjB6emQ5TE1JS2RGd0dBeHBHCmoxRDFXNjYyMjRVc1NVRDRYOGFlNjhVbGZvL2gxcC9YcXdkRG5kaXdBYzFqQ1VmSWo3RT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo= + client-key-data: LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlFcEFJQkFBS0NBUUVBdWF3TEw3eXRvbWJlZ1NkWEY3MmFlWFhUODVXdGE3RzVLaDRRNmdmQkhjUzhZQ2wzCkQvVHRtTlFaUnVQc1Zkdjg5SFNQaWQ4Y1JCZDBacHVlSUhiczlKZUxDazE4WUpXOFlCUWJBYXZRZFBxSU1RelUKNFJBRmlHTksxQ1pKckl0bE8vVENUMGhIOEU5Z3lMM00xRnlIcFlReXpPVldweWxDemt6QWVuQ0FpeFhZUzUrYwpuYmFkU3hRZDhiMG1UMEZYZG1ZVkZxa3ovby8zbWVIbFFxdFVqOGNNTzhTOXJqbDFIMUdqd3FEWWZJanF5QmRaCldiRnAwMm9VRHRHY2d3ZFA5YXFXbG55Ylk2VWZ4Qld6dEtERWE3NUZ4Nm93VTlVR1pPdkdoWmRUUWw2OGxvZXMKY09UUEJ0dG5HbnBXZjR6SklzankxcW1oeHNjTFBFeG54QU9yZlFJREFRQUJBb0lCQVFDUTZOcU9ObGJaOGlsawphWnpLbFp0VGdvZWFpODRleUVWNHZxQjYxdlI4MUVnbFVSZHdwN3NzVlJVcFE4ZjNOc3VVeXNnZ1ZiWk0yblZwCmc3a0ZJMnhLZFYvNStZSENLL3NxaldhS2hsc2FnVkg3M2tUakpzcjZxR3dGYWFDRWZ3TFNxWE5oeDBzR0hoMnUKYnB2SGZqUU1GVUpFc2hWUVA1NjVQaVBYSzZqWFl5L2pnYjQwQThleTFoRHlIT1lCS0dEWFBzdXlmMzl1T3JoZgpwaGRSRE5sVkMzdk5RV25KZWFRRnEvWjJJM2pUNkR4a2dJUHNUemtqNEJZcHM0eWs1NTh6YW1jUC9YRTBHREtmCnNZNDZHa2U2WXZ2ejhHdGo1M0NtM3h2bXBZMEJuQzk1K3JDaDlhalpsYWhXaVczUXJiRTdRck4vTlpJeGZ1YnQKbmN3NDJBSWhBb0dCQU4xUGZnamNnSDExY0xDTVhBTmF3b29yTnRQVnJteDFERCtIaStRSm1aVWFhVkFjeEk3SApabFpOUWhiY0kzZlFnTy8yZmJQNU4wQUdMRnZteFdZSXVhL2RDdzVaMjNFNnZ5YURkY2k3akRWMUg1cXp1NWF3ClQwYzR6aEdOdVNyM3B5SGl5ajlZajc0R1RJdzNYOHlDWWtUU24zL0t3dklVak1JZW5oR2tPWE1KQW9HQkFOYkcKZlZSN29JL1NyOGFWZmo2MUdhcUx4QWREdklORlFYcmppc0hyVGxpcFhtNXFQVlY3QzVHeXkyL1hSUm9MZExZcApZMW1NRmJ4cTBtbUxVQ0k4UFhWd1FlZ1NBU3RhYjRnMTI2bXJiT2hFMi9LVzU5ZCtacnowSElnbzZoWUVra1dOCkxQcXRoa0doSUJ3dnFvVkxNUGEyV3FKMWk4ZGNCQzM1NzgvOHc0M1ZBb0dCQUpxc3NEMnBQdlJ3WEM1SUt4YjkKRy9KTmVhaGNNK2dCZG1vQVpqa2VySVNWVFAxODNiT2NrVjNINldUb3ZyRkN2SnI1LzZrRmlTUHFMSjZlajJCYwp3TXExQnNFazlFWVM5UDRKNnd3OGFDWUVrZTRocC80Tmc1c1hqSTZnS3NacENCcWEweGVxNGV2Qm8wWnNmVHdGCjlJQjlaSlNBTmZmVGZQMC9RT0s3a0p0aEFvR0FEM21KdWphV0lRYTdKNEhKOE5hM25MUXBVYVN0eG4rTThqL0cKMWFZUXBRNi9BUkdpamJBcDZ6dUlzT3cvekZxYTlDMFRQWFo4Y25EMzdDYmZoVGYxN2FwQzlXZW1zZXI0TWtZLwpKNEIwZmwvSHdUamlSNEtTQUhkT1B2bER0SVpyeTVzYWJJMW9LUDVsQStMalZHdFFnZFl0dlpyZWtXU3Q0R29yCnZ6NmxFR2tDZ1lCcVc0L08rK2hmM1loQmdFYkdNUEJVdVlBK292aVM2ZmhGcVhjWGs1ZkRhY3NDcWkyVzgyZ0wKR0ErKzNsZWt3c1hTS2ZTSkI5R29ETDVGOWczakx5ZW9rUml3Wmh6aGZnelpFRldiWWVVUFNNSlhHYjkzYmRKSgpacGIxaWE2bGFsbC9DV2FULzJJbjFtM1Y1cW9rNlZtZWJGVVRCanFEYnY4eUREa0NjdmdpMVE9PQotLS0tLUVORCBSU0EgUFJJVkFURSBLRVktLS0tLQo= diff --git a/requirements.txt b/requirements.txt index 9d21a8e7aa..418112ffdb 100644 --- a/requirements.txt +++ b/requirements.txt @@ -86,4 +86,4 @@ git+git://github.com/ProzorroUKR/openprocurement.archivarius.core.git@1.0.2dp git+git://github.com/ProzorroUKR/openprocurement.archivarius.tenders.git@1.0.1dp git+git://github.com/ProzorroUKR/openprocurement.archivarius.plans.git@1.0.1dp git+git://github.com/ProzorroUKR/openprocurement.archivarius.contracts.git@1.0.1dp -git+git://github.com/ProzorroUKR/couchdb-python.git@1.2-bad-status-line +git+git://github.com/ProzorroUKR/couchdb-python.git@1.2-bad-status-line#egg=couchdb diff --git a/setup.py b/setup.py index 8b664fc93b..641c57af7b 100644 --- a/setup.py +++ b/setup.py @@ -1,7 +1,7 @@ import os from setuptools import setup, find_packages -version = "2.5.81" +version = "2.5.93" here = os.path.abspath(os.path.dirname(__file__)) @@ -32,7 +32,7 @@ "zope.component", "zope.configuration", "esculator", - "dateorro>=0.0.2", + "dateorro>=0.0.3", "configparser", "sentry-sdk", ] @@ -70,6 +70,7 @@ "tender.esco = openprocurement.tender.esco.includeme:includeme", "tender.cfaua = openprocurement.tender.cfaua.includeme:includeme", "tender.cfaselectionua = openprocurement.tender.cfaselectionua.includeme:includeme", + "tender.pricequotation = openprocurement.tender.pricequotation.includeme:includeme", ], "openprocurement.agreements.core.plugins": [ "agreement.cfaua = openprocurement.agreement.cfaua.includeme:includeme" diff --git a/src/__init__.py b/src/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/openprocurement/api/constants.ini b/src/openprocurement/api/constants.ini index 3755c6a87f..c70f7264de 100644 --- a/src/openprocurement/api/constants.ini +++ b/src/openprocurement/api/constants.ini @@ -15,4 +15,7 @@ RELEASE_2020_04_19 = 2020-04-19 VALIDATE_ADDRESS_FROM = 2019-10-30T00:00:00.000000+02:00 COMPLAINT_IDENTIFIER_REQUIRED_FROM = 2020-01-01T00:00:00.000000+03:00 PLAN_ADDRESS_KIND_REQUIRED_FROM = 2020-05-19T00:00:00.000000+03:00 +NORMALIZED_TENDER_PERIOD_FROM = 2020-05-01T00:00:00.000000+03:00 NEW_NEGOTIATION_CAUSES_FROM = 2020-06-04T00:00:00.000000+03:00 +MINIMAL_STEP_VALIDATION_FROM = 2020-08-01T00:00:00.000000+03:00 +RELEASE_ECRITERIA_ARTICLE_17 = 2020-01-01T00:00:00.000000+03:00 diff --git a/src/openprocurement/api/constants.py b/src/openprocurement/api/constants.py index 6bc1edc470..35b6e0883c 100644 --- a/src/openprocurement/api/constants.py +++ b/src/openprocurement/api/constants.py @@ -62,10 +62,11 @@ def read_json(name): SCALE_CODES = ["micro", "sme", "mid", "large", "not specified"] +NORMALIZE_SHOULD_START_AFTER = datetime(2016, 7, 16, tzinfo=TZ) + CPV_ITEMS_CLASS_FROM = datetime(2017, 1, 1, tzinfo=TZ) CPV_BLOCK_FROM = datetime(2017, 6, 2, tzinfo=TZ) - def get_default_constants_file_path(): return os.path.join(os.path.dirname(os.path.realpath(__file__)), "constants.ini") @@ -139,6 +140,9 @@ def get_constant(config, constant, section=DEFAULTSECT, parse_func=parse_date_tz # CS-7231 new negotiation causes released (old partly disabled) NEW_NEGOTIATION_CAUSES_FROM = get_constant(CONSTANTS_CONFIG, "NEW_NEGOTIATION_CAUSES_FROM") +# CS-8167 tender/lot minimalStep validation +MINIMAL_STEP_VALIDATION_FROM = get_constant(CONSTANTS_CONFIG, "MINIMAL_STEP_VALIDATION_FROM") + # Address validation COUNTRIES = read_json("data/countries.json") UA_REGIONS = read_json("data/ua_regions.json") @@ -147,3 +151,5 @@ def get_constant(config, constant, section=DEFAULTSECT, parse_func=parse_date_tz # address and kind fields required for procuringEntity and buyers objects in plan PLAN_ADDRESS_KIND_REQUIRED_FROM = get_constant(CONSTANTS_CONFIG, "PLAN_ADDRESS_KIND_REQUIRED_FROM") +NORMALIZED_TENDER_PERIOD_FROM = get_constant(CONSTANTS_CONFIG, "NORMALIZED_TENDER_PERIOD_FROM") +RELEASE_ECRITERIA_ARTICLE_17 = get_constant(CONSTANTS_CONFIG, "RELEASE_ECRITERIA_ARTICLE_17") diff --git a/src/openprocurement/api/data/ecriteria_standart.json b/src/openprocurement/api/data/ecriteria_standart.json new file mode 100644 index 0000000000..9e466ec706 --- /dev/null +++ b/src/openprocurement/api/data/ecriteria_standart.json @@ -0,0 +1,403 @@ +{ + "EXCLUSION.CONVICTIONS.PARTICIPATION_IN_CRIMINAL_ORGANISATION": { + "title": "Вчинення злочинів, учинених з корисливих мотивів", + "description": "Службова (посадова) особа учасника процедури закупівлі, яка підписала тендерну пропозицію (або уповноважена на підписання договору в разі переговорної процедури закупівлі) або Фізична особа, яка є учасником процедури закупівлі, не була засуджена за злочин, учинений з корисливих мотивів (зокрема, пов'язаний з хабарництвом та відмиванням коштів), судимість з якої не знято або не погашено у встановленому законом порядку", + "source": "tenderer", + "relatesTo": "tenderer", + "legislation": [ + { + "version": "2020-04-19", + "identifier": { + "id": "922-VIII", + "legalName": "Закон України Про публічні закупівлі" + }, + "type": "NATIONAL_LEGISLATION", + "acticle": "17.1.5", + "identifier.uri": "http://www.rada.gov.ua" + }, + { + "version": "2020-04-19", + "identifier": { + "id": "922-VIII", + "legalName": "Закон України Про публічні закупівлі" + }, + "type": "NATIONAL_LEGISLATION", + "acticle": "17.1.6", + "identifier.uri": "http://www.rada.gov.ua" + } + ], + "requirementGroups": [ + { + "description": "Учасник фізична особа підтверджує, що", + "requirements": [ + { + "title": "Фізична особа, яка є учасником процедури закупівлі, не була засуджена за злочин, учинений з корисливих мотивів (зокрема, пов'язаний з хабарництвом та відмиванням коштів), судимість з якої не знято або не погашено у встановленому законом порядку", + "dataType": "boolean", + "expectedValue": "true" + } + ] + }, + { + "description": "Учасник юридична особа підтверджує, що", + "requirements": [ + { + "title": "Службова (посадова) особа учасника процедури закупівлі, яка підписала тендерну пропозицію (або уповноважена на підписання договору в разі переговорної процедури закупівлі), не була засуджена за злочин, вчинений з корисливих мотивів (зокрема, пов'язаний з хабарництвом, шахрайством та відмиванням коштів), судимість з якої не знято або не погашено у встановленому законом порядку", + "dataType": "boolean", + "expectedValue": "true" + } + ] + } + ] + }, + "EXCLUSION.CONVICTIONS.FRAUD": { + "title": "Вчинення економічних правопорушень", + "description": "Суб'єкт господарювання (учасник) протягом останніх трьох років не притягувався до відповідальності за порушення, передбачене пунктом 4 частини другої статті 6, пунктом 1 статті 50 Закону України \"Про захист економічної конкуренції\", у вигляді вчинення антиконкурентних узгоджених дій, що стосуються спотворення результатів тендерів", + "source": "tenderer", + "relatesTo": "tenderer", + "legislation": [ + { + "version": "2020-04-19", + "identifier": { + "id": "922-VIII", + "legalName": "Закон України Про публічні закупівлі" + }, + "type": "NATIONAL_LEGISLATION", + "acticle": "17.1.4", + "identifier.uri": "https://zakon.rada.gov.ua/laws/show/922-19" + }, + { + "version": "2020-02-13", + "identifier": { + "id": "2210-III", + "legalName": "Закон України Про захист економічної конкуренції" + }, + "type": "NATIONAL_LEGISLATION", + "acticle": "6.2.4", + "identifier.uri": "https://zakon.rada.gov.ua/laws/show/2210-14" + }, + { + "version": "2020-02-13", + "identifier": { + "id": "2210-III", + "legalName": "Закон України Про захист економічної конкуренції" + }, + "type": "NATIONAL_LEGISLATION", + "acticle": "50.1", + "identifier.uri": "https://zakon.rada.gov.ua/laws/show/2210-14" + } + ], + "requirementGroups": [ + { + "description": "Учасник фізична особа підтверджує, що", + "requirements": [ + { + "title": "Суб'єкт господарювання (учасник) протягом останніх трьох років не притягувався до відповідальності за порушення, передбачене пунктом 4 частини другої статті 6, пунктом 1 статті 50 Закону України \"Про захист економічної конкуренції\", у вигляді вчинення антиконкурентних узгоджених дій, що стосуються спотворення результатів тендерів", + "dataType": "boolean", + "expectedValue": "true" + } + ] + } + ] + }, + "EXCLUSION.CONVICTIONS.CORRUPTION": { + "title": "Вчинення коррупційних правопорушень", + "description": "Відомості про юридичну особу, яка є учасником процедури закупівлі, не внесено до Єдиного державного реєстру осіб, які вчинили корупційні або пов'язані з корупцією правопорушення. Службову (посадову) особу учасника процедури закупівлі, яку уповноважено учасником представляти його інтереси під час проведення процедури закупівлі, фізичну особу, яка є учасником, не було притягнуто згідно із законом до відповідальності за вчинення корупційного правопорушення або правопорушення, пов'язаного з корупцією", + "source": "tenderer", + "relatesTo": "tenderer", + "legislation": [ + { + "version": "2020-04-19", + "identifier": { + "id": "922-VIII", + "legalName": "Закон України Про публічні закупівлі" + }, + "type": "NATIONAL_LEGISLATION", + "acticle": "17.1.2", + "identifier.uri": "https://zakon.rada.gov.ua/laws/show/922-19" + }, + { + "version": "2020-04-19", + "identifier": { + "id": "922-VIII", + "legalName": "Закон України Про публічні закупівлі" + }, + "type": "NATIONAL_LEGISLATION", + "acticle": "17.1.3", + "identifier.uri": "https://zakon.rada.gov.ua/laws/show/922-19" + } + ], + "requirementGroups": [ + { + "description": "Учасник підтверджує, що", + "requirements": [ + { + "title": "Відомості про юридичну особу, яка є учасником процедури закупівлі, не внесено до Єдиного державного реєстру осіб, які вчинили корупційні або пов'язані з корупцією правопорушення.", + "dataType": "boolean", + "expectedValue": "true" + }, + { + "title": "Службову (посадову) особу учасника процедури закупівлі, яку уповноважено учасником представляти його інтереси під час проведення процедури закупівлі, фізичну особу, яка є учасником, не було притягнуто згідно із законом до відповідальності за вчинення корупційного правопорушення або правопорушення, пов'язаного з корупцієюv", + "dataType": "boolean", + "expectedValue": "true" + } + ] + } + ] + }, + "EXCLUSION.CONVICTIONS.CHILD_LABOUR-HUMAN_TRAFFICKING": { + "title": "Вчинення правопорушень, пов'язаних з використанням дитячої праці чи будь-якими формами торгівлі людьми", + "description": "Службова (посадова) особа учасника процедури закупівлі, яку уповноважено учасником представляти його інтереси під час проведення процедури закупівлі, фізичну особу, яка є учасником, не було притягнуто згідно із законом до відповідальності за вчинення правопорушення, пов'язаного з використанням дитячої праці чи будь-якими формами торгівлі людьми", + "source": "tenderer", + "relatesTo": "tenderer", + "legislation": [ + { + "version": "2020-04-19", + "identifier": { + "id": "922-VIII", + "legalName": "Закон України Про публічні закупівлі" + }, + "type": "NATIONAL_LEGISLATION", + "acticle": "17.1.12", + "identifier.uri": "https://zakon.rada.gov.ua/laws/show/922-19" + } + ], + "requirementGroups": [ + { + "description": "Учасник підтверджує, що", + "requirements":[ + { + "title": "Службова (посадова) особа учасника процедури закупівлі, яку уповноважено учасником представляти його інтереси під час проведення процедури закупівлі, фізичну особу, яка є учасником, не було притягнуто згідно із законом до відповідальності за вчинення правопорушення, пов'язаного з використанням дитячої праці чи будь-якими формами торгівлі людьми", + "dataType": "boolean", + "expectedValue": "true" + } + ] + } + ] + }, + "EXCLUSION.CONTRIBUTIONS.PAYMENT_OF_TAXES": { + "title": "Заборгованість із сплати податків і зборів (обов'язкових платежів)", + "description": "Учасник процедури закупівлі не має заборгованість із сплати податків і зборів (обов'язкових платежів)", + "source": "tenderer", + "relatesTo": "tenderer", + "legislation": [ + { + "version": "2020-04-19", + "identifier": { + "id": "922-VIII", + "legalName": "Закон України Про публічні закупівлі" + }, + "type": "NATIONAL_LEGISLATION", + "acticle": "17.1.13", + "identifier.uri": "https://zakon.rada.gov.ua/laws/show/922-19" + } + ], + "requirementGroups": [ + { + "description": "Учасник підтверджує, що", + "requirements": [ + { + "title": "Він не має заборгованість із сплати податків і зборів (обов'язкових платежів)", + "dataType": "boolean", + "expectedValue": "true" + } + ] + }, + { + "description": "Учасник підтверджує, що", + "requirements": [ + { + "title": "Він має заборгованість із сплати податків і зборів (обов'язкових платежів)", + "dataType": "boolean", + "expectedValue": "true" + }, + { + "title": "Сума існуючої заборгованості", + "dataType": "number" + }, + { + "title": "Характер існуючої заборгованості", + "dataType": "string" + }, + { + "title": "Причина виникнення існуючої заборгованості", + "dataType": "string" + }, + { + "title": "Учасник здійснив заходи щодо розстрочення і відстрочення такої заборгованості у порядку та на умовах, визначених законодавством країни реєстрації такого учасника", + "dataType": "boolean", + "expectedValue": "true" + } + ] + } + ] + }, + "EXCLUSION.BUSINESS.BANKRUPTCY": { + "title": "Порушення справ про банкрутство", + "description": "Учасник процедури закупівлі не визнаний у встановленому законом порядку банкрутом та стосовно нього не відкрита ліквідаційна процедура", + "source": "tenderer", + "relatesTo": "tenderer", + "legislation": [ + { + "version": "2020-04-19", + "identifier": { + "id": "922-VIII", + "legalName": "Закон України Про публічні закупівлі" + }, + "type": "NATIONAL_LEGISLATION", + "acticle": "17.1.8", + "identifier.uri": "https://zakon.rada.gov.ua/laws/show/922-19" + } + ], + "requirementGroups": [ + { + "description": "Учасник підтверджує, що", + "requirements": [ + { + "title": "Учасник процедури закупівлі не визнаний у встановленому законом порядку банкрутом та стосовно нього не відкрита ліквідаційна процедура", + "dataType": "boolean", + "expectedValue": "true" + } + ] + } + ] + }, + "EXCLUSION.MISCONDUCT.MARKET_DISTORTION": { + "title": "Виявлення факту зв'язку Учасника з іншими учасниками процедури або Замовником", + "description": "Тендерна пропозиція подана учасником конкурентної процедури закупівлі або участь у переговорній процедурі бере учасник, який є пов'язаною особою з іншими учасниками процедури закупівлі та/або з уповноваженою особою (особами), та/або з керівником замовника", + "source": "procuringEntity", + "relatesTo": "tenderer", + "legislation": [ + { + "version": "2020-04-19", + "identifier": { + "id": "922-VIII", + "legalName": "Закон України Про публічні закупівлі" + }, + "type": "NATIONAL_LEGISLATION", + "acticle": "17.1.7", + "identifier.uri": "https://zakon.rada.gov.ua/laws/show/922-19" + } + ], + "requirementGroups": [ + { + "description": "Замовник підтверджує, що", + "requirements": [ + { + "title": "Тендерна пропозиція подана учасником конкурентної процедури закупівлі або участь у переговорній процедурі бере учасник, який є пов'язаною особою з іншими учасниками процедури закупівлі та/або з уповноваженою особою (особами), та/або з керівником замовника", + "dataType": "boolean" + } + ] + } + ] + }, + "EXCLUSION.CONFLICT_OF_INTEREST.MISINTERPRETATION": { + "title": "Виявлення факту наміру впливу на прийняття рішення Замовника", + "description": "Замовник має незаперечні докази того, що учасник процедури закупівлі пропонує, дає або погоджується дати прямо чи опосередковано будь-якій службовій (посадовій) особі замовника, іншого державного органу винагороду в будь-якій формі (пропозиція щодо найму на роботу, цінна річ, послуга тощо) з метою вплинути на прийняття рішення щодо визначення переможця процедури закупівлі або застосування замовником певної процедури закупівлі", + "source": "procuringEntity", + "relatesTo": "tenderer", + "legislation": [ + { + "version": "2020-04-19", + "identifier": { + "id": "922-VIII", + "legalName": "Закон України Про публічні закупівлі" + }, + "type": "NATIONAL_LEGISLATION", + "acticle": "17.1.1", + "identifier.uri": "https://zakon.rada.gov.ua/laws/show/922-19" + } + ], + "requirementGroups": [ + { + "description": "Замовник підтверджує, що", + "requirements": [ + { + "title": "Замовник має незаперечні докази того, що учасник процедури закупівлі пропонує, дає або погоджується дати прямо чи опосередковано будь-якій службовій (посадовій) особі замовника, іншого державного органу винагороду в будь-якій формі (пропозиція щодо найму на роботу, цінна річ, послуга тощо) з метою вплинути на прийняття рішення щодо визначення переможця процедури закупівлі або застосування замовником певної процедури закупівлі", + "dataType": "boolean" + } + ] + } + ] + }, + "EXCLUSION.NATIONAL.OTHER": { + "title": "Наявність інших підстав для відмови в участі у процедурі закупівлі", + "description": "У Єдиному державному реєстрі юридичних осіб, фізичних осіб - підприємців та громадських формувань присутня інформація, передбачена пунктом 9 частини другої статті 9 Закону України \"Про державну реєстрацію юридичних осіб, фізичних осіб - підприємців та громадських формувань\" (крім нерезидентів", + "source": "tenderer", + "relatesTo": "tenderer", + "legislation": [ + { + "version": "2020-04-19", + "identifier": { + "id": "922-VIII", + "legalName": "Закон України Про публічні закупівлі" + }, + "type": "NATIONAL_LEGISLATION", + "acticle": "17.1.9", + "identifier.uri": "https://zakon.rada.gov.ua/laws/show/922-19" + }, + { + "version": "2020-03-16", + "identifier": { + "id": "755-IV", + "legalName": "Закон України \"Про державну реєстрацію юридичних осіб, фізичних осіб - підприємців та громадських формувань\"" + }, + "type": "NATIONAL_LEGISLATION", + "acticle": "9.2.9", + "identifier.uri": "https://zakon.rada.gov.ua/laws/show/755-15" + }, + { + "version": "2020-04-19", + "identifier": { + "id": "922-VIII", + "legalName": "Закон України Про публічні закупівлі" + }, + "type": "NATIONAL_LEGISLATION", + "acticle": "17.1.10", + "identifier.uri": "https://zakon.rada.gov.ua/laws/show/922-19" + }, + { + "version": "2020-04-19", + "identifier": { + "id": "922-VIII", + "legalName": "Закон України Про публічні закупівлі" + }, + "type": "NATIONAL_LEGISLATION", + "acticle": "17.1.11", + "identifier.uri": "https://zakon.rada.gov.ua/laws/show/922-19" + }, + { + "version": "2020-04-19", + "identifier": { + "id": "1644-VII", + "legalName": "Закон України \"Про санкції\"" + }, + "type": "NATIONAL_LEGISLATION", + "identifier.uri": "https://zakon.rada.gov.ua/laws/show/1644-18" + } + ], + "requirementGroups": [ + { + "description": "Учасник підтверджує, що", + "requirements": [ + { + "title": "У Єдиному державному реєстрі юридичних осіб, фізичних осіб - підприємців та громадських формувань присутня інформація, передбачена пунктом 9 частини другої статті 9 Закону України \"Про державну реєстрацію юридичних осіб, фізичних осіб - підприємців та громадських формувань\" (крім нерезидентів)", + "dataType": "boolean", + "expectedValue": "true" + }, + { + "title": "Юридична особа, яка є учасником процедури закупівлі (крім нерезидентів), має антикорупційну програму чи уповноваженого з реалізації антикорупційної програми, якщо вартість закупівлі товару (товарів), послуги (послуг) або робіт дорівнює чи перевищує 20 мільйонів гривень (у тому числі за лотом)", + "dataType": "boolean", + "expectedValue": "true" + }, + { + "title": "Учасник процедури закупівлі не є особою, до якої застосовано санкцію у виді заборони на здійснення у неї публічних закупівель товарів, робіт і послуг згідно із Законом України \"Про санкції\"", + "dataType": "boolean", + "expectedValue": "true" + } + ] + } + ] + } +} + + diff --git a/src/openprocurement/api/models.py b/src/openprocurement/api/models.py index 838892369c..c66bdef8d9 100644 --- a/src/openprocurement/api/models.py +++ b/src/openprocurement/api/models.py @@ -688,3 +688,13 @@ class Contract(Model): items = ListType(ModelType(Item)) suppliers = ListType(ModelType(BusinessOrganization), min_size=1, max_size=1) date = IsoDateTimeType() + + +class BankAccount(Model): + id = StringType(required=True) + scheme = StringType(choices=["IBAN", ], required=True) + + +class Reference(Model): + id = StringType(required=True) + title = StringType(required=True, min_length=1) diff --git a/src/openprocurement/api/tests/auth.ini b/src/openprocurement/api/tests/auth.ini index da2796f364..2e6fa8e08f 100644 --- a/src/openprocurement/api/tests/auth.ini +++ b/src/openprocurement/api/tests/auth.ini @@ -45,6 +45,7 @@ test = token [bots] bot = bot +pricequotation = pricequotation [contracting] contracting = contracting diff --git a/src/openprocurement/api/tests/base.py b/src/openprocurement/api/tests/base.py index 38ffa15069..cd80becb2c 100644 --- a/src/openprocurement/api/tests/base.py +++ b/src/openprocurement/api/tests/base.py @@ -89,6 +89,7 @@ def setUpClass(cls): def setUp(self): self.app.authorization = self.initial_auth self.db = self.app.recreate_db() + self.maxDiff = None def tearDown(self): self.app.drop_db() diff --git a/src/openprocurement/api/traversal.py b/src/openprocurement/api/traversal.py index cda13ced61..108aedf047 100644 --- a/src/openprocurement/api/traversal.py +++ b/src/openprocurement/api/traversal.py @@ -18,14 +18,14 @@ def __init__(self, request): self.db = request.registry.db -def get_item(parent, key, request): +def get_item(parent, key, request, where_search=None): if "document" in key and key != "document": item_type = "document" item_field = key.split("_") item_field = item_field[0] + item_field[1].capitalize() + "s" else: item_type = key - item_field = "{}s".format(item_type) + item_field = where_search if where_search else "{}s".format(item_type) item_id_key = "{}_id".format(item_type) item_id = request.matchdict[item_id_key] diff --git a/src/openprocurement/api/utils.py b/src/openprocurement/api/utils.py index ecc6c62b2e..058a64110f 100644 --- a/src/openprocurement/api/utils.py +++ b/src/openprocurement/api/utils.py @@ -10,7 +10,8 @@ from cornice.resource import resource, view from email.header import decode_header from functools import partial -from jsonpatch import make_patch, apply_patch as _apply_patch + +from jsonpatch import make_patch, apply_patch from schematics.types import StringType from openprocurement.api.traversal import factory @@ -45,7 +46,6 @@ import requests import decimal import json -import sys json_view = partial(view, renderer="simplejson") @@ -330,7 +330,7 @@ def apply_data_patch(item, changes): prepare_patch(patch_changes, item, changes) if not patch_changes: return {} - return _apply_patch(item, patch_changes) + return apply_patch(item, patch_changes) def get_revision_changes(dst, src): @@ -665,7 +665,7 @@ def my_decode(string_): def get_first_revision_date(schematics_document, default=None): - revisions = schematics_document.get('revisions') if schematics_document else None + revisions = schematics_document.get("revisions") if schematics_document else None return revisions[0].date if revisions else default @@ -788,3 +788,10 @@ def get_uah_amount_from_value(request, value, logging_params): ), ) return amount + + +def is_new_created(data): + """ + Check if data['_rev'] is None then tender was created just now + """ + return data["_rev"] is None diff --git a/src/openprocurement/api/validation.py b/src/openprocurement/api/validation.py index 1f94082203..f0aefac686 100644 --- a/src/openprocurement/api/validation.py +++ b/src/openprocurement/api/validation.py @@ -1,5 +1,5 @@ # -*- coding: utf-8 -*- -from schematics.exceptions import ValidationError +from schematics.exceptions import ValidationError, ModelValidationError from openprocurement.api.auth import check_user_accreditations, ACCR_TEST, ACCR_EXIT from openprocurement.api.constants import INN_SCHEME, CPV_PHARM_PRODUCTS, CPV_336_INN_FROM from openprocurement.api.utils import ( @@ -16,14 +16,14 @@ OPERATIONS = {"POST": "add", "PATCH": "update", "PUT": "update", "DELETE": "delete"} -def validate_json_data(request): +def validate_json_data(request, expected_type=dict): try: json = request.json_body except ValueError as e: request.errors.add("body", "data", str(e)) request.errors.status = 422 raise error_handler(request.errors) - if not isinstance(json, dict) or "data" not in json or not isinstance(json.get("data"), dict): + if not isinstance(json, dict) or "data" not in json or not isinstance(json.get("data"), expected_type): request.errors.add("body", "data", "Data not available") request.errors.status = 422 raise error_handler(request.errors) @@ -31,7 +31,7 @@ def validate_json_data(request): return json["data"] -def validate_data(request, model, partial=False, data=None): +def validate_object_data(request, model, partial=False, data=None): if data is None: data = validate_json_data(request) @@ -70,6 +70,61 @@ def validate_data(request, model, partial=False, data=None): return data +def validate_post_list_data(request, model, data=None): + if data is None: + data = validate_json_data(request, list) + + with handle_data_exceptions(request): + valid_data = [] + valid_models = [] + errors = {} + for i, el in enumerate(data): + m = model(el) + m.__parent__ = request.context + try: + m.validate() + except ModelValidationError as err: + errors[i] = err.messages + valid_models.append(m) + valid_data.append(m.serialize("create")) + + if errors: + raise ModelValidationError(errors) + + if hasattr(type(m), "_options") and "create" not in type(m)._options.roles: + request.errors.add("url", "role", "Forbidden") + request.errors.status = 403 + raise error_handler(request.errors) + + request.validated["data"] = data + if model._options.namespace: + request.validated["{}s".format(model._options.namespace.lower())] = valid_models + else: + request.validated["{}s".format(model.__name__.lower())] = valid_models + return data + + +def validate_data(request, model, partial=False, data=None, bulk=None): + """ + function that validate input data for view + @param request: pyramid.request.Request object + @param model: api.models.Model object + @param partial: boolean + @param data: None or dict + @param bulk: None, 'partial' or 'full', show use bulk create validation + @return: list or dict + """ + + if ( + request.method == "POST" + and ((request.params.get("bulk") and bulk == "partial") or bulk == "full") + ): + data = validate_post_list_data(request, model, data) + else: + data = validate_object_data(request, model, partial, data) + return data + + def validate_patch_document_data(request): model = type(request.context) return validate_data(request, model, True) diff --git a/src/openprocurement/contracting/api/models.py b/src/openprocurement/contracting/api/models.py index 9a21584225..1df95a7b30 100644 --- a/src/openprocurement/contracting/api/models.py +++ b/src/openprocurement/contracting/api/models.py @@ -4,7 +4,7 @@ # from couchdb_schematics.document import SchematicsDocument from pyramid.security import Allow -from schematics.types import StringType, BaseType, MD5Type +from schematics.types import StringType, BaseType, MD5Type, FloatType from schematics.types.compound import ModelType, DictType from schematics.types.serializable import serializable from schematics.exceptions import ValidationError @@ -21,11 +21,12 @@ from openprocurement.api.models import CPVClassification as BaseCPVClassification from openprocurement.api.models import Item as BaseItem from openprocurement.api.models import AdditionalClassification as BaseAdditionalClassification -from openprocurement.api.models import Model, ListType, Revision, Value, IsoDateTimeType +from openprocurement.api.models import Model, ListType, Revision, Value, IsoDateTimeType, Guarantee from openprocurement.api.validation import validate_items_uniq from openprocurement.api.models import plain_role, schematics_default_role, schematics_embedded_role from openprocurement.api.interfaces import IOPContent from openprocurement.tender.core.models import Tender, ContractValue, PROCURING_ENTITY_KINDS +from openprocurement.api.models import BankAccount contract_create_role = whitelist( "id", @@ -65,6 +66,7 @@ "amountPaid", "terminationDetails", "contract_amountPaid", + "implementation" ) contract_view_role = whitelist( @@ -94,6 +96,7 @@ "amountPaid", "terminationDetails", "contract_amountPaid", + "implementation", ) contract_administrator_role = Tender.Options.roles["Administrator"] + whitelist("suppliers") @@ -138,6 +141,12 @@ def validate_relatedItem(self, data, relatedItem): raise ValidationError(u"relatedItem should be one of items") +class TransactionDocument(BaseDocument): + """ Contract Transaction Document """ + + documentOf = StringType(required=True, default="contract") + + class ContactPoint(BaseContactPoint): availableLanguage = StringType() @@ -231,6 +240,30 @@ def validate_dateSigned(self, data, value): raise ValidationError(u"Contract signature date can't be in the future") +class OrganizationReference(Model): + bankAccount = ModelType(BankAccount, required=True) + name = StringType(required=True) + + +class Transaction(Model): + id = StringType(required=True) + documents = ListType(ModelType(TransactionDocument), default=list()) + date = IsoDateTimeType(required=True) + value = ModelType(Guarantee, required=True) + payer = ModelType(OrganizationReference, required=True) + payee = ModelType(OrganizationReference, required=True) + status = StringType(required=True) + + class Options: + roles = { + "view": schematics_default_role, + } + + +class Implementation(Model): + transactions = ListType(ModelType(Transaction), default=list()) + + @implementer(IContract) class Contract(SchematicsDocument, BaseContract): """ Contract """ @@ -255,6 +288,7 @@ class Contract(SchematicsDocument, BaseContract): amountPaid = ModelType(ContractValue) value = ModelType(ContractValue) terminationDetails = StringType() + implementation = ModelType(Implementation, default=dict()) create_accreditations = (ACCR_3, ACCR_5) # TODO @@ -282,6 +316,8 @@ def __acl__(self): (Allow, "{}_{}".format(self.owner, self.owner_token), "edit_contract"), (Allow, "{}_{}".format(self.owner, self.owner_token), "upload_contract_documents"), (Allow, "{}_{}".format(self.owner, self.tender_token), "generate_credentials"), + (Allow, "{}_{}".format(self.owner, self.owner_token), "edit_contract_transactions"), + (Allow, "{}_{}".format(self.owner, self.owner_token), "upload_contract_transaction_documents"), ] return acl diff --git a/src/openprocurement/contracting/api/tests/contract.py b/src/openprocurement/contracting/api/tests/contract.py index f88616c46b..deb590991b 100644 --- a/src/openprocurement/contracting/api/tests/contract.py +++ b/src/openprocurement/contracting/api/tests/contract.py @@ -39,7 +39,8 @@ contract_wo_items_status_change, patch_tender_contract_wo_amount_net, patch_tender_without_value, - skip_address_validation + skip_address_validation, + put_transaction_to_contract, ) @@ -85,6 +86,7 @@ class ContractResource4BrokersTest(BaseContractWebTest): test_get_credentials = snitch(get_credentials) test_generate_credentials = snitch(generate_credentials) test_generate_credentials_invalid = snitch(generate_credentials_invalid) + test_put_transaction_to_contract = snitch(put_transaction_to_contract) class ContractResource4AdministratorTest(BaseContractWebTest): diff --git a/src/openprocurement/contracting/api/tests/contract_blanks.py b/src/openprocurement/contracting/api/tests/contract_blanks.py index 61b9fc3b34..d8e3b794bf 100644 --- a/src/openprocurement/contracting/api/tests/contract_blanks.py +++ b/src/openprocurement/contracting/api/tests/contract_blanks.py @@ -537,6 +537,426 @@ def create_contract(self): self.assertEqual(response.status, "403 Forbidden") +def put_transaction_to_contract(self): + + response = self.app.get("/contracts/{}".format(self.contract["id"])) + self.assertEqual(response.status, "200 OK") + self.assertEqual(response.content_type, "application/json") + self.assertEqual(response.json["data"]["status"], "active") + + tender_token = self.initial_data["tender_token"] + credentials_url = "/contracts/{}/credentials?acc_token={}".format(self.contract["id"], tender_token) + response = self.app.patch_json(credentials_url, {"data": ""}) + self.assertEqual(response.status, "200 OK") + token = response.json["access"]["token"] + + response = self.app.put_json( + "/contracts/{}/transactions/{}?acc_token={}".format(self.contract["id"], 12345, 'fake_token'), + {"data": ""}, status=403 + ) + + self.assertEqual(response.status, "403 Forbidden") + self.assertEqual( + response.json["errors"], [{"description": "Forbidden", "location": "url", "name": "permission"}] + ) + + response = self.app.put_json( + "/contracts/{}/transactions/{}?acc_token={}".format(self.contract["id"], 12345, token), + { + "data": { + "date": "2020-05-20T18:47:47.136678+02:00", + "value": { + "amount": 500, + "currency": "UAH" + }, + "payer": { + "bankAccount": { + "id": 789, + "scheme": "IBAN", + }, + "name": "payer1" + }, + "payee": { + "bankAccount": { + "id": 888, + "scheme": "IBAN", + }, + "name": "payee1" + }, + "status": 0 + } + } + ) + + self.assertEqual( + response.json['data']['implementation']['transactions'], + [ + { + 'status': 'successful', + 'payer': { + "bankAccount": { + "id": "789", + "scheme": "IBAN", + }, + "name": "payer1" + }, + 'value': { + 'currency': 'UAH', + 'amount': 500.0 + }, + 'payee': { + "bankAccount": { + "id": "888", + "scheme": "IBAN", + }, + "name": "payee1" + }, + 'date': '2020-05-20T18:47:47.136678+02:00', + 'id': '12345' + } + ] + ) + + response = self.app.put_json( + "/contracts/{}/transactions/{}?acc_token={}".format(self.contract["id"], 12345, token), + {"data": { + "date": "2020-05-20T18:47:47.136678+02:00", + "value": { + "amount": 500, + "currency": "UAH" + }, + "payer": { + "bankAccount": { + "id": 800000000, + "scheme": "IBAN", + }, + "name": "payer_should_not_applied1" + }, + "payee": { + "bankAccount": { + "id": 90000000, + "scheme": "IBAN", + }, + "name": "payee_should_not_applied1" + }, + "status": "new_status_123" + } + } + ) + self.assertEqual(response.status, "200 OK") + + self.assertEqual( + response.json['data']['implementation']['transactions'], + [ + { + 'status': 'new_status_123', + 'payer': { + "bankAccount": { + "id": "789", + "scheme": "IBAN", + }, + "name": "payer1" + }, + 'value': { + 'currency': 'UAH', 'amount': 500.0 + }, + 'payee': { + "bankAccount": { + "id": "888", + "scheme": "IBAN", + }, + "name": "payee1" + }, + 'date': '2020-05-20T18:47:47.136678+02:00', + 'id': '12345' + } + ] + ) + + response = self.app.put_json( + "/contracts/{}/transactions/{}?acc_token={}".format(self.contract["id"], 90800777, token), + {"data": { + "date": "2020-06-10T10:47:47.136678+02:00", + "value": { + "amount": 14500.5, + "currency": "UAH" + }, + "payer": { + "bankAccount": { + "id": 78999, + "scheme": "IBAN", + }, + "name": "payer2" + }, + "payee": { + "bankAccount": { + "id": 199000, + "scheme": "IBAN", + }, + "name": "payee2" + }, + "status": -1 + } + } + ) + self.assertEqual(response.status, "200 OK") + + self.assertEqual( + response.json['data']['implementation']['transactions'], + [ + { + 'status': 'new_status_123', + 'payer': { + "bankAccount": { + "id": "789", + "scheme": "IBAN", + }, + "name": "payer1" + }, + 'value': { + 'currency': 'UAH', 'amount': 500.0 + }, + 'payee': { + "bankAccount": { + "id": "888", + "scheme": "IBAN", + }, + "name": "payee1" + }, + 'date': '2020-05-20T18:47:47.136678+02:00', + 'id': '12345' + }, + { + 'status': 'canceled', + 'payer': { + "bankAccount": { + "id": "78999", + "scheme": "IBAN", + }, + "name": "payer2" + }, + 'value': { + 'currency': 'UAH', 'amount': 14500.5 + }, + 'payee': { + "bankAccount": { + "id": "199000", + "scheme": "IBAN", + }, + 'name': 'payee2' + }, + 'date': '2020-06-10T10:47:47.136678+02:00', + 'id': '90800777' + } + ] + ) + + response = self.app.put_json( + "/contracts/{}/transactions/{}?acc_token={}".format(self.contract["id"], 111122, token), + { + "data": { + "date": "2020-06-10T10:47:47.136678+02:00", + "value": { + "amount": 18500.5, + "currency": "UAH", + }, + } + }, status=422 + ) + + self.assertEqual(response.status, "422 Unprocessable Entity") + self.assertEqual( + response.json["errors"], + [ + { + u'description': [u'This field is required.'], u'location': u'body', u'name': u'status' + }, + { + u'description': [u'This field is required.'], u'location': u'body', u'name': u'payee' + }, + { + u'description': [u'This field is required.'], u'location': u'body', u'name': u'payer' + } + ] + ) + + response = self.app.put_json( + "/contracts/{}/transactions/{}?acc_token={}".format(self.contract["id"], 3444444, token), + { + "data": { + "date": "2020-06-10T10:47:47.136678+02:00", + "value": { + "amount": 14500.5, + "currency": "UAH" + }, + "payer": { + "bankAccount": { + "id": "789", + "scheme": "IBAN", + }, + "name": "payer2" + }, + "payee": "payee_invalid_structure", + "status": "Accepted_status_123" + } + }, status=422 + ) + + self.assertEqual(response.status, "422 Unprocessable Entity") + self.assertEqual( + response.json["errors"], + [ + { + u'description': [ + u'Please use a mapping for this field or OrganizationReference instance instead of unicode.' + ], + u'location': u'body', u'name': u'payee' + } + ] + ) + response = self.app.get("/contracts/{}".format(self.contract['id'])) + self.assertEqual(response.status, "200 OK") + + self.assertEqual( + response.json['data']['implementation']['transactions'], + [ + { + 'status': 'new_status_123', + 'payer': { + "bankAccount": { + "id": "789", + "scheme": "IBAN", + }, + "name": "payer1" + }, + 'value': { + 'currency': 'UAH', 'amount': 500.0 + }, + 'payee': { + "bankAccount": { + "id": "888", + "scheme": "IBAN", + }, + "name": "payee1" + }, + 'date': '2020-05-20T18:47:47.136678+02:00', + 'id': '12345' + }, + { + 'status': 'canceled', + 'payer': { + "bankAccount": { + "id": "78999", + "scheme": "IBAN", + }, + "name": "payer2" + }, + 'value': { + 'currency': 'UAH', 'amount': 14500.5 + }, + 'payee': { + "bankAccount": { + "id": "199000", + "scheme": "IBAN", + }, + "name": "payee2" + }, + 'date': '2020-06-10T10:47:47.136678+02:00', + 'id': '90800777' + } + ] + ) + response = self.app.get("/contracts/{}/transactions/{}".format(self.contract['id'], 2222222), status=404) + self.assertEqual(response.status, "404 Not Found") + self.assertEqual( + response.json["errors"], + [ + { + "location": "body", "name": "data", + "description": "Transaction does not exist" + } + ] + ) + + response = self.app.put_json( + "/contracts/{}/transactions/{}?acc_token={}".format(self.contract["id"], 5555, token), + { + "data": { + "date": "2020-06-10T10:47:47.136678+02:00", + "value": { + "amount": 14500.5, + "currency": "UAH" + }, + "payer": { + "bankAccount": { + "id": "789", + "scheme": "INCORRECT_SCHEMA", + }, + "name": "payer2" + }, + "payee": { + "bankAccount": { + "id": "789" + }, + "name": "payee2" + }, + "status": 0 + } + }, status=422 + ) + self.assertEqual(response.status, "422 Unprocessable Entity") + self.assertEqual( + response.json["errors"], + [ + { + 'description': { + 'bankAccount': { + 'scheme': ["This field is required."] + } + }, + 'location': 'body', + 'name': 'payee' + }, + { + 'description': { + 'bankAccount': { + 'scheme': ["Value must be one of ['IBAN']."] + } + }, + 'location': 'body', + 'name': 'payer' + } + ] + ) + + response = self.app.get("/contracts/{}/transactions/{}".format(self.contract['id'], 12345)) + self.assertEqual( + response.json['data'], + { + 'status': 'new_status_123', + 'payer': { + "bankAccount": { + "id": "789", + "scheme": "IBAN", + }, + 'name': 'payer1' + }, + 'value': { + 'currency': 'UAH', 'amount': 500.0 + }, + 'payee': { + "bankAccount": { + "id": "888", + "scheme": "IBAN", + }, + 'name': 'payee1' + }, + 'date': '2020-05-20T18:47:47.136678+02:00', + 'id': '12345' + } + ) + + def create_contract_transfer_token(self): response = self.app.post_json("/contracts", {"data": self.initial_data}) self.assertEqual(response.status, "201 Created") diff --git a/src/openprocurement/contracting/api/tests/data/tender-contract-complete.json b/src/openprocurement/contracting/api/tests/data/tender-contract-complete.json index 4de52c6cbe..f07534fabd 100644 --- a/src/openprocurement/contracting/api/tests/data/tender-contract-complete.json +++ b/src/openprocurement/contracting/api/tests/data/tender-contract-complete.json @@ -190,7 +190,7 @@ ], "minimalStep": { "currency": "UAH", - "amount": 35.0, + "amount": 15.0, "valueAddedTaxIncluded": true }, "items": [ diff --git a/src/openprocurement/contracting/api/tests/document.py b/src/openprocurement/contracting/api/tests/document.py index 5b6c12fb4f..27a6ab6b51 100644 --- a/src/openprocurement/contracting/api/tests/document.py +++ b/src/openprocurement/contracting/api/tests/document.py @@ -13,6 +13,7 @@ create_contract_document_json_invalid, create_contract_document_json, put_contract_document_json, + create_contract_transaction_document_json ) @@ -32,6 +33,7 @@ class ContractDocumentWithDSResourceTest(ContractDocumentResourceTest): test_create_contract_documnet_json_invalid = snitch(create_contract_document_json_invalid) test_create_contract_documnet_json = snitch(create_contract_document_json) test_put_contract_document_json = snitch(put_contract_document_json) + test_create_contract_transaction_document_json = snitch(create_contract_transaction_document_json) def suite(): diff --git a/src/openprocurement/contracting/api/tests/document_blanks.py b/src/openprocurement/contracting/api/tests/document_blanks.py index fe298487fa..21fc464e7e 100644 --- a/src/openprocurement/contracting/api/tests/document_blanks.py +++ b/src/openprocurement/contracting/api/tests/document_blanks.py @@ -801,3 +801,126 @@ def put_contract_document_json(self): self.assertIn("Signature=", response.location) self.assertIn("KeyID=", response.location) self.assertNotIn("Expires=", response.location) + + +def create_contract_transaction_document_json(self): + + transaction_id = 123456 + response = self.app.put_json( + "/contracts/{}/transactions/{}?acc_token={}".format(self.contract_id, transaction_id, self.contract_token), + { + "data": { + "date": "2020-05-20T18:47:47.136678+02:00", + "value": { + "amount": 500, + "currency": "UAH" + }, + "payer": { + "bankAccount": { + "id": 789, + "scheme": "IBAN" + }, + "name": "payer1" + }, + "payee": { + "bankAccount": { + "id": 789, + "scheme": "IBAN" + }, + "name": "payee1" + }, + "status": "status1234" + } + } + ) + + self.assertEqual(response.status, "200 OK") + + response = self.app.post_json( + "/contracts/{}/transactions/{}/documents?acc_token={}".format( + self.contract_id, transaction_id, self.contract_token + ), + { + "data": { + "title": u"name name.doc", + "url": self.generate_docservice_url(), + "hash": "md5:" + "0" * 32, + "format": "application/xml", + } + }, + ) + self.assertEqual(response.status, "201 Created") + self.assertEqual(response.content_type, "application/json") + self.assertEqual(u"name name.doc", response.json["data"]["title"]) + doc_id = response.json["data"]["id"] + + response = self.app.get("/contracts/{}/transactions/{}".format(self.contract['id'], transaction_id)) + documents = response.json['data']['documents'] + + self.assertEqual(doc_id, documents[0]['id']) + + response = self.app.post_json( + "/contracts/{}/transactions/{}/documents?acc_token={}".format( + self.contract_id, transaction_id, self.contract_token + ), + { + "dt": {} + }, + status=422 + ) + self.assertEqual(response.status, "422 Unprocessable Entity") + self.assertEqual(response.content_type, "application/json") + self.assertEqual(response.json["status"], "error") + self.assertEqual( + response.json["errors"], [{u"description": u"Data not available", u"location": u"body", u"name": u"data"}] + ) + + response = self.app.post_json( + "/contracts/{}/transactions/{}/documents?acc_token={}".format( + self.contract_id, transaction_id, self.contract_token + ), + { + "data": { + "title": u"name name2.doc", + "url": self.generate_docservice_url(), + "hash": "md5:" + "0" * 32, + "format": "application/xml", + } + }, + ) + self.assertEqual(response.status, "201 Created") + self.assertEqual(response.content_type, "application/json") + self.assertEqual(u"name name2.doc", response.json["data"]["title"]) + doc_id2 = response.json["data"]["id"] + + response = self.app.get("/contracts/{}/transactions/{}".format(self.contract['id'], transaction_id)) + documents = response.json['data']['documents'] + self.assertEqual(len(documents), 2) + self.assertEqual(doc_id2, documents[1]['id']) + + invalid_transaction_id = 678123 + response = self.app.post_json( + "/contracts/{}/transactions/{}/documents?acc_token={}".format( + self.contract_id, invalid_transaction_id, self.contract_token + ), + { + "data": { + "title": u"name name2.doc", + "url": self.generate_docservice_url(), + "hash": "md5:" + "0" * 32, + "format": "application/xml", + } + }, + status=404 + ) + self.assertEqual(response.status, "404 Not Found") + self.assertEqual( + response.json["errors"], + [ + {u'description': u"Can't add document contract to nonexistent transaction", + u'location': u'body', u'name': u'data' + } + ] + ) + + diff --git a/src/openprocurement/contracting/api/traversal.py b/src/openprocurement/contracting/api/traversal.py index f869f3070e..cc9e4f0b43 100644 --- a/src/openprocurement/contracting/api/traversal.py +++ b/src/openprocurement/contracting/api/traversal.py @@ -13,6 +13,8 @@ class Root(object): (Allow, "g:contracting", "create_contract"), (Allow, "g:Administrator", "edit_contract"), (Allow, "g:admins", ALL_PERMISSIONS), + (Allow, "g:bots", "edit_contract_transactions"), + (Allow, "g:bots", "upload_contract_transaction_documents"), ] def __init__(self, request): diff --git a/src/openprocurement/contracting/api/utils.py b/src/openprocurement/contracting/api/utils.py index 39535b062b..07176daf61 100644 --- a/src/openprocurement/contracting/api/utils.py +++ b/src/openprocurement/contracting/api/utils.py @@ -15,6 +15,8 @@ get_now, handle_store_exceptions, append_revision, + check_document, + update_document_url, ) from openprocurement.contracting.api.traversal import factory @@ -101,3 +103,23 @@ def set_ownership(item, request): item.transfer_token = sha512(transfer).hexdigest() access["transfer"] = transfer return access + + +def upload_file_to_transaction(request): + + document = request.validated["document"] + check_document(request, document, "body") + + document_route = request.matched_route.name.replace("collection_", "") + document = update_document_url(request, document, document_route, {}) + + return document + + +def get_transaction_by_id(request): + transaction_id = request.matchdict["transaction_id"] + contract = request.validated["contract"] + transactions = contract.implementation.transactions + + _transaction = next((trans for trans in transactions if trans["id"] == transaction_id), None) + return _transaction diff --git a/src/openprocurement/contracting/api/validation.py b/src/openprocurement/contracting/api/validation.py index cb90f48c95..9fc972c603 100644 --- a/src/openprocurement/contracting/api/validation.py +++ b/src/openprocurement/contracting/api/validation.py @@ -21,6 +21,12 @@ validate_update_contract_value_amount, validate_update_contract_value_net_required, ) +from openprocurement.api.models import Model, IsoDateTimeType, Guarantee +from openprocurement.contracting.api.models import OrganizationReference +from schematics.types import StringType +from schematics.types.compound import ModelType +from openprocurement.api.models import schematics_default_role +from openprocurement.contracting.api.utils import get_transaction_by_id def validate_contract_data(request): @@ -40,6 +46,22 @@ def validate_patch_contract_data(request): return validate_data(request, Contract, True) +def validate_put_transaction_to_contract(request): + class InitialTransaction(Model): + date = IsoDateTimeType(required=True) + value = ModelType(Guarantee, required=True) + payer = ModelType(OrganizationReference, required=True) + payee = ModelType(OrganizationReference, required=True) + status = StringType(required=True) + + class Options: + roles = { + "create": schematics_default_role + } + + return validate_data(request, model=InitialTransaction) + + def validate_change_data(request): update_logging_context(request, {"change_id": "__new__"}) data = validate_json_data(request) @@ -109,6 +131,23 @@ def validate_contract_document_operation_not_in_allowed_contract_status(request) ) +def validate_transaction_existence(request): + transaction = get_transaction_by_id(request) + if not transaction: + raise_operation_error(request, "Transaction does not exist", status=404) + + +def validate_file_transaction_upload(request): + transaction = get_transaction_by_id(request) + if not transaction: + raise_operation_error(request, "Can't add document contract to nonexistent transaction", status=404) + + update_logging_context(request, {"document_id": "__new__"}) + if request.registry.docservice_url and request.content_type == "application/json": + model = type(transaction).documents.model_class + return validate_data(request, model) + + def validate_add_document_to_active_change(request): data = request.validated["data"] if "relatedItem" in data and data.get("documentOf") == "change": diff --git a/src/openprocurement/contracting/api/views/contract.py b/src/openprocurement/contracting/api/views/contract.py index 891f0b5866..446a919b80 100644 --- a/src/openprocurement/contracting/api/views/contract.py +++ b/src/openprocurement/contracting/api/views/contract.py @@ -7,6 +7,7 @@ contract_serialize, set_ownership, save_contract, + get_transaction_by_id, ) from openprocurement.contracting.api.validation import ( validate_contract_data, @@ -19,6 +20,8 @@ validate_update_contracting_paid_amount, validate_update_contracting_value_amount, validate_update_contract_paid_net_required, + validate_put_transaction_to_contract, + validate_transaction_existence, ) from openprocurement.contracting.api.design import ( FIELDS, @@ -137,3 +140,64 @@ def patch(self): extra=context_unpack(self.request, {"MESSAGE_ID": "contract_patch"}), ) return {"data": contract.serialize("view"), "access": access} + + +@contractingresource( + name="Contract transactions", + path="/contracts/{contract_id}/transactions/{transaction_id}", + description="Contract transactions", +) +class ContractTransactionsResource(APIResource): + def __init__(self, request, context): + super(ContractTransactionsResource, self).__init__(request, context) + self.server = request.registry.couchdb_server + + @json_view( + content_type="application/json", + permission="edit_contract_transactions", + validators=(validate_put_transaction_to_contract,) + ) + def put(self): + new_transaction = self.request.json["data"] + transaction_id = self.request.matchdict["transaction_id"] + new_transaction.update({"id": transaction_id}) + + contract = self.request.validated["contract"] + transactions = contract.implementation.transactions + + status_mapping = { + 0: "successful", + -1: "canceled", + } + _status_value = new_transaction['status'] + new_transaction['status'] = status_mapping.get(_status_value, _status_value) + + existing_transaction = next((trans for trans in transactions if trans["id"] == transaction_id), None) + + if existing_transaction: + existing_transaction["status"] = new_transaction["status"] + + if save_contract(self.request): + self.LOGGER.info( + "Transaction {} for {} contract already exists, status updated".format(transaction_id, contract.id) + ) + else: + + trans = type(contract.implementation).transactions.model_class(new_transaction) + trans.__parent__ = contract.implementation + transactions.append(trans) + + if save_contract(self.request): + self.LOGGER.info( + "New transaction {} for {} contract has been created".format(transaction_id, contract.id) + ) + + return {"data": contract.serialize("view")} + + @json_view( + permission="view_contract", + validators=(validate_transaction_existence,) + ) + def get(self): + _transaction = get_transaction_by_id(self.request) + return {'data': _transaction.serialize("view")} diff --git a/src/openprocurement/contracting/api/views/document.py b/src/openprocurement/contracting/api/views/document.py index 6a50ed616f..7f0c6a4249 100644 --- a/src/openprocurement/contracting/api/views/document.py +++ b/src/openprocurement/contracting/api/views/document.py @@ -12,7 +12,9 @@ from openprocurement.contracting.api.validation import ( validate_add_document_to_active_change, validate_contract_document_operation_not_in_allowed_contract_status, + validate_file_transaction_upload, ) +from openprocurement.contracting.api.utils import get_transaction_by_id, upload_file_to_transaction @contractingresource( @@ -101,3 +103,32 @@ def patch(self): extra=context_unpack(self.request, {"MESSAGE_ID": "contract_document_patch"}), ) return {"data": self.request.context.serialize("view")} + + +@contractingresource( + name="Contract Transaction Documents", + path="/contracts/{contract_id}/transactions/{transaction_id}/documents", + description="Contract transaction related binary files (PDFs, etc.)", +) +class ContractTransactionDocumentResource(APIResource): + + @json_view( + content_type="application/json", + permission="upload_contract_transaction_documents", + validators=(validate_file_transaction_upload,), + ) + def post(self): + """Contract Transaction Document Upload""" + document = upload_file_to_transaction(self.request) + _transaction = get_transaction_by_id(self.request) + _transaction.documents.append(document) + if save_contract(self.request): + self.LOGGER.info( + "Created contract transaction document {}".format(document.id), + extra=context_unpack( + self.request, {"MESSAGE_ID": "contract_transaction_document_create"}, {"document_id": document.id} + ), + ) + + self.request.response.status = 201 + return {"data": document.serialize("view")} diff --git a/src/openprocurement/historical/core/utils.py b/src/openprocurement/historical/core/utils.py index 4c8aadde90..519d4b87a2 100644 --- a/src/openprocurement/historical/core/utils.py +++ b/src/openprocurement/historical/core/utils.py @@ -1,5 +1,5 @@ from jsonpointer import JsonPointerException -from jsonpatch import JsonPatchException +from jsonpatch import JsonPatchException, apply_patch from iso8601 import parse_date from zope.interface import providedBy @@ -15,7 +15,7 @@ ACCREDITATION_LEVELS, VERSION_BY_DATE, ) -from openprocurement.api.utils import error_handler, _apply_patch, APIResource, json_view, context_unpack +from openprocurement.api.utils import error_handler, APIResource, json_view, context_unpack class Root(object): @@ -30,7 +30,7 @@ def __init__(self, request): def get_valid_apply_patch_doc(doc, request, patch): try: - doc = _apply_patch(doc, patch["changes"]) + doc = apply_patch(doc, patch["changes"]) return doc except (JsonPointerException, JsonPatchException): raise_not_implemented(request) @@ -177,7 +177,7 @@ def validate_header(request): def validate_accreditation(request): if request.authenticated_role != "Administrator" and not request.check_accreditations(ACCREDITATION_LEVELS): request.errors.add( - "historical", "accreditation", "Broker Accreditation level does not " "permit viewing tender historica info" + "historical", "accreditation", "Broker Accreditation level does not permit viewing tender historical info" ) request.errors.status = 403 return diff --git a/src/openprocurement/historical/tender/tests/tests.py b/src/openprocurement/historical/tender/tests/tests.py index ec3a28638e..495c00df3e 100644 --- a/src/openprocurement/historical/tender/tests/tests.py +++ b/src/openprocurement/historical/tender/tests/tests.py @@ -1,10 +1,11 @@ # -*- coding: utf-8 -*- import os.path from jsonpointer import resolve_pointer +from jsonpatch import apply_patch from copy import deepcopy from mock import patch -from openprocurement.historical.core.utils import parse_hash, _apply_patch +from openprocurement.historical.core.utils import parse_hash from openprocurement.historical.core.constants import VERSION, PREVIOUS_HASH as PHASH, HASH from openprocurement.tender.belowthreshold.tests.base import BaseTenderWebTest, test_tender_data, test_organization @@ -151,7 +152,7 @@ def test_get_tender_equal_with_api(self): revisions = data.pop("revisions") tenders = [] for p in reversed(revisions): - data = _apply_patch(data, p["changes"]) + data = apply_patch(data, p["changes"]) tenders.append(data.copy()) for tender in reversed(tenders[:-1]): diff --git a/src/openprocurement/planning/api/constants.py b/src/openprocurement/planning/api/constants.py index a076c12c96..39d87c8789 100644 --- a/src/openprocurement/planning/api/constants.py +++ b/src/openprocurement/planning/api/constants.py @@ -13,6 +13,7 @@ "esco", "closeFrameworkAgreementUA", ), + "selective": ("priceQuotation",), "limited": ("reporting", "negotiation", "negotiation.quick"), } diff --git a/src/openprocurement/planning/api/tests/plan_blanks.py b/src/openprocurement/planning/api/tests/plan_blanks.py index 9a10bcdd87..1463fd2e95 100644 --- a/src/openprocurement/planning/api/tests/plan_blanks.py +++ b/src/openprocurement/planning/api/tests/plan_blanks.py @@ -908,7 +908,7 @@ def create_plan_invalid_procuring_entity(self): { u'description': u'procuringEntity with general kind cannot publish this type of procedure.' u' Procurement method types allowed for this kind: centralizedProcurement,' - u' reporting, negotiation, negotiation.quick, belowThreshold, aboveThresholdUA,' + u' reporting, negotiation, negotiation.quick, priceQuotation, belowThreshold, aboveThresholdUA,' u' aboveThresholdEU, competitiveDialogueUA, competitiveDialogueEU, esco, ' u'closeFrameworkAgreementUA.', u'location': u'procuringEntity', u'name': u'kind' } diff --git a/src/openprocurement/planning/api/tests/plan_status.py b/src/openprocurement/planning/api/tests/plan_status.py index c9a0f6efe0..fc67d3449a 100644 --- a/src/openprocurement/planning/api/tests/plan_status.py +++ b/src/openprocurement/planning/api/tests/plan_status.py @@ -395,7 +395,7 @@ def test_fail_complete_manually(app, value): assert response.json["errors"] == [ {u'description': u'procuringEntity with general kind cannot publish this type of procedure.' u' Procurement method types allowed for this kind: centralizedProcurement, reporting,' - u' negotiation, negotiation.quick, belowThreshold, aboveThresholdUA, aboveThresholdEU,' + u' negotiation, negotiation.quick, priceQuotation, belowThreshold, aboveThresholdUA, aboveThresholdEU,' u' competitiveDialogueUA, competitiveDialogueEU, esco, closeFrameworkAgreementUA.', u'location': u'procuringEntity', u'name': u'kind' } diff --git a/src/openprocurement/planning/api/tests/plan_tenders.py b/src/openprocurement/planning/api/tests/plan_tenders.py index af84bfb8a5..4fb4371ac7 100644 --- a/src/openprocurement/planning/api/tests/plan_tenders.py +++ b/src/openprocurement/planning/api/tests/plan_tenders.py @@ -19,6 +19,7 @@ from openprocurement.tender.openua.tests.base import test_tender_data as openua_tender_data from openprocurement.tender.openuadefense.tests.base import test_tender_data as defense_tender_data from openprocurement.tender.cfaselectionua.tests.tender import tender_data as cfa_selection_tender_data +from openprocurement.tender.pricequotation.tests.data import test_tender_data as pricequotation_tender_data from copy import deepcopy import pytest @@ -292,6 +293,7 @@ def test_fail_tender_creation(app): openeu_tender_data, openua_tender_data, defense_tender_data, + pricequotation_tender_data ] diff --git a/src/openprocurement/planning/api/tests/tests.ini b/src/openprocurement/planning/api/tests/tests.ini index 40e3459385..767354d7ad 100644 --- a/src/openprocurement/planning/api/tests/tests.ini +++ b/src/openprocurement/planning/api/tests/tests.ini @@ -26,6 +26,7 @@ plugins = tender.esco, tender.cfaua, tender.cfaselectionua, + tender.pricequotation, planning.api, contracting.api update_after = false diff --git a/src/openprocurement/relocation/api/tests/tender.py b/src/openprocurement/relocation/api/tests/tender.py index 0ff5278cf2..a7d4acc6c6 100644 --- a/src/openprocurement/relocation/api/tests/tender.py +++ b/src/openprocurement/relocation/api/tests/tender.py @@ -3,9 +3,11 @@ from copy import deepcopy from openprocurement.tender.core.tests.base import change_auth +from openprocurement.tender.core.utils import calculate_tender_business_date +from openprocurement.tender.core.tests.criteria_utils import add_criteria from openprocurement.tender.openeu.models import TENDERING_DURATION from openprocurement.api.models import get_now -from openprocurement.tender.belowthreshold.tests.base import test_tender_data, BaseTenderWebTest +from openprocurement.tender.belowthreshold.tests.base import test_tender_data, test_criteria, BaseTenderWebTest from openprocurement.tender.openua.tests.base import test_tender_data as test_ua_tender_data from openprocurement.tender.openuadefense.tests.base import test_tender_data as test_uadefense_tender_data from openprocurement.tender.openeu.tests.base import test_tender_data as test_eu_tender_data @@ -47,6 +49,7 @@ class TenderOwnershipChangeTest(BaseTenderOwnershipChangeTest): test_owner = "broker1t" invalid_owner = "broker3" central_owner = "broker5" + initial_criteria = test_criteria def setUp(self): super(TenderOwnershipChangeTest, self).setUp() @@ -392,6 +395,9 @@ def create_tender(self): ) self.tender_transfer = response.json["access"]["transfer"] tender_access_token = response.json["access"]["token"] + + add_criteria(self, tender_token=tender_access_token) + response = self.app.patch_json( "/tenders/{}?acc_token={}".format(self.tender_id, tender_access_token), {"data": {"status": "active.tendering"}}, @@ -432,23 +438,25 @@ def test_change_ownership(self): self.assertNotEqual(transfer_creation_date, transfer_modification_date) # second owner can change the tender - now = get_now() + end_date = calculate_tender_business_date( + get_now(), TENDERING_DURATION + ) with change_auth(self.app, ("Basic", (self.second_owner, ""))): response = self.app.patch_json( "/tenders/{}?acc_token={}".format(self.tender_id, new_access_token), - {"data": {"tenderPeriod": {"endDate": (now + TENDERING_DURATION).isoformat()}}}, + {"data": {"tenderPeriod": {"endDate": end_date.isoformat()}}}, ) self.assertEqual(response.status, "200 OK") self.assertNotIn("transfer", response.json["data"]) self.assertNotIn("transfer_token", response.json["data"]) self.assertIn("owner", response.json["data"]) self.assertEqual(response.json["data"]["owner"], self.second_owner) - self.assertEqual(response.json["data"]["tenderPeriod"]["endDate"], (now + TENDERING_DURATION).isoformat()) + self.assertEqual(response.json["data"]["tenderPeriod"]["endDate"], end_date.isoformat()) # first owner now can`t change tender response = self.app.patch_json( "/tenders/{}?acc_token={}".format(self.tender_id, new_access_token), - {"data": {"tenderPeriod": {"endDate": (now + TENDERING_DURATION).isoformat()}}}, + {"data": {"tenderPeriod": {"endDate": end_date.isoformat()}}}, status=403, ) self.assertEqual(response.status, "403 Forbidden") diff --git a/src/openprocurement/tender/belowthreshold/constants.py b/src/openprocurement/tender/belowthreshold/constants.py index d6770969a4..949e3d06c5 100644 --- a/src/openprocurement/tender/belowthreshold/constants.py +++ b/src/openprocurement/tender/belowthreshold/constants.py @@ -1,17 +1,12 @@ # -*- coding: utf-8 -*- -import re -from datetime import datetime, timedelta -from openprocurement.api.constants import TZ +from datetime import timedelta STAND_STILL_TIME = timedelta(days=2) -# COMPLAINT_STAND_STILL_TIME = timedelta(days=3) -# BIDDER_TIME = timedelta(minutes=6) -# SERVICE_TIME = timedelta(minutes=9) -# AUCTION_STAND_STILL_TIME = timedelta(minutes=15) -# CANT_DELETE_PERIOD_START_DATE_FROM = datetime(2016, 8, 30, tzinfo=TZ) -# BID_LOTVALUES_VALIDATION_FROM = datetime(2016, 10, 24, tzinfo=TZ) -# CPV_ITEMS_CLASS_FROM = datetime(2017, 1, 1, tzinfo=TZ) -STATUS4ROLE = {"complaint_owner": ["draft", "answered"], "reviewers": ["pending"], "tender_owner": ["claim"]} MIN_BIDS_NUMBER = 2 +STATUS4ROLE = { + "complaint_owner": ["draft", "answered"], + "reviewers": ["pending"], + "tender_owner": ["claim"] +} diff --git a/src/openprocurement/tender/belowthreshold/models.py b/src/openprocurement/tender/belowthreshold/models.py index 343dc5a981..8ce4872364 100644 --- a/src/openprocurement/tender/belowthreshold/models.py +++ b/src/openprocurement/tender/belowthreshold/models.py @@ -12,17 +12,14 @@ from zope.interface import implementer from openprocurement.api.models import ListType, Period, Value, Guarantee - from openprocurement.api.utils import get_now, get_first_revision_date - -from openprocurement.api.constants import TZ, RELEASE_2020_04_19 +from openprocurement.api.constants import TZ, RELEASE_2020_04_19, CPV_ITEMS_CLASS_FROM from openprocurement.api.validation import validate_items_uniq, validate_cpv_group, validate_classification_id - -from openprocurement.tender.core.models import ITender - -from openprocurement.tender.core.models import validate_features_uniq, validate_lots_uniq, get_tender +from openprocurement.tender.core.constants import COMPLAINT_STAND_STILL_TIME +from openprocurement.tender.core.validation import validate_minimalstep from openprocurement.tender.core.models import ( + ITender, ComplaintModelType, TenderAuctionPeriod, PeriodEndRequired, @@ -35,18 +32,20 @@ Question, Cancellation as BaseCancellation, Feature, - Lot as BaseLot, + LotWithMinimalStepLimitsValidation as BaseLot, Complaint, + validate_features_uniq, + validate_lots_uniq, + get_tender ) from openprocurement.tender.core.utils import ( calc_auction_end_time, - rounding_shouldStartAfter, + normalize_should_start_after, + calculate_tender_date, calculate_tender_business_date, ) - -from openprocurement.tender.core.constants import CPV_ITEMS_CLASS_FROM, COMPLAINT_STAND_STILL_TIME -from openprocurement.tender.core.validation import validate_minimalstep +from openprocurement.tender.openua.validation import validate_tender_period_duration class LotAuctionPeriod(Period): @@ -58,7 +57,8 @@ def shouldStartAfter(self): return tender = get_tender(self) lot = self.__parent__ - if tender.status not in ["active.tendering", "active.auction"] or lot.status != "active": + statuses = ["active.tendering", "active.auction"] + if tender.status not in statuses or lot.status != "active": return if tender.status == "active.auction" and lot.numberOfBids < 2: return @@ -66,7 +66,7 @@ def shouldStartAfter(self): start_after = calc_auction_end_time(tender.numberOfBids, self.startDate) else: start_after = tender.tenderPeriod.endDate - return rounding_shouldStartAfter(start_after, tender).isoformat() + return normalize_should_start_after(start_after, tender).isoformat() class Lot(BaseLot): @@ -229,8 +229,12 @@ def next_check(self): ): if now < self.auctionPeriod.startDate: checks.append(self.auctionPeriod.startDate.astimezone(TZ)) - elif now < calc_auction_end_time(self.numberOfBids, self.auctionPeriod.startDate).astimezone(TZ): - checks.append(calc_auction_end_time(self.numberOfBids, self.auctionPeriod.startDate).astimezone(TZ)) + else: + auction_end_time = calc_auction_end_time( + self.numberOfBids, self.auctionPeriod.startDate + ).astimezone(TZ) + if now < auction_end_time: + checks.append(auction_end_time) elif self.lots and self.status == "active.auction": for lot in self.lots: if ( @@ -242,8 +246,12 @@ def next_check(self): continue if now < lot.auctionPeriod.startDate: checks.append(lot.auctionPeriod.startDate.astimezone(TZ)) - elif now < calc_auction_end_time(lot.numberOfBids, lot.auctionPeriod.startDate).astimezone(TZ): - checks.append(calc_auction_end_time(lot.numberOfBids, lot.auctionPeriod.startDate).astimezone(TZ)) + else: + auction_end_time = calc_auction_end_time( + lot.numberOfBids, lot.auctionPeriod.startDate + ).astimezone(TZ) + if now < auction_end_time: + checks.append(auction_end_time) elif ( not self.lots and self.status == "active.awarded" @@ -287,13 +295,10 @@ def next_check(self): ): checks.append(max(standStillEnds)) if self.status.startswith("active"): - from openprocurement.tender.core.utils import calculate_tender_business_date - for complaint in self.complaints: if complaint.status == "answered" and complaint.dateAnswered: - checks.append( - calculate_tender_business_date(complaint.dateAnswered, COMPLAINT_STAND_STILL_TIME, self) - ) + check = calculate_tender_date(complaint.dateAnswered, COMPLAINT_STAND_STILL_TIME, self) + checks.append(check) elif complaint.status == "pending": checks.append(self.dateModified) for award in self.awards: @@ -301,9 +306,8 @@ def next_check(self): checks.append(award.date) for complaint in award.complaints: if complaint.status == "answered" and complaint.dateAnswered: - checks.append( - calculate_tender_business_date(complaint.dateAnswered, COMPLAINT_STAND_STILL_TIME, self) - ) + check = calculate_tender_date(complaint.dateAnswered, COMPLAINT_STAND_STILL_TIME, self) + checks.append(check) elif complaint.status == "pending": checks.append(self.dateModified) return min(checks).isoformat() if checks else None @@ -432,9 +436,8 @@ def validate_tenderPeriod(self, data, period): and period and period.startDate and period.endDate - and period.endDate < calculate_tender_business_date(period.startDate, timedelta(days=2), data, True) ): - raise ValidationError(u"the tenderPeriod cannot end earlier than 2 business days after the start") + validate_tender_period_duration(data, period, timedelta(days=2), working_days=True) def validate_awardPeriod(self, data, period): if ( diff --git a/src/openprocurement/tender/belowthreshold/tests/base.py b/src/openprocurement/tender/belowthreshold/tests/base.py index c0718ba5b6..5ae53bede2 100644 --- a/src/openprocurement/tender/belowthreshold/tests/base.py +++ b/src/openprocurement/tender/belowthreshold/tests/base.py @@ -1,5 +1,6 @@ # -*- coding: utf-8 -*- import os +import json from copy import deepcopy from uuid import uuid4 @@ -8,6 +9,8 @@ from openprocurement.api.constants import SANDBOX_MODE, RELEASE_2020_04_19 from openprocurement.api.tests.base import BaseWebTest from openprocurement.api.utils import get_now +from openprocurement.tender.belowthreshold.models import Tender +from openprocurement.tender.belowthreshold.tests.periods import PERIODS from openprocurement.tender.core.tests.base import BaseCoreWebTest from openprocurement.tender.belowthreshold.constants import MIN_BIDS_NUMBER @@ -84,7 +87,7 @@ "mainProcurementCategory": "goods", "procuringEntity": test_procuringEntity, "value": {"amount": 500, "currency": u"UAH"}, - "minimalStep": {"amount": 35, "currency": u"UAH"}, + "minimalStep": {"amount": 15, "currency": u"UAH"}, "items": [deepcopy(test_item)], "enquiryPeriod": {"endDate": (now + timedelta(days=7)).isoformat()}, "tenderPeriod": {"endDate": (now + timedelta(days=14)).isoformat()}, @@ -186,6 +189,14 @@ } +current_dir = os.path.dirname(os.path.abspath(__file__)) + +with open(os.path.join(current_dir, "test_criteria.json")) as json_file: + test_criteria = json.load(json_file) + +test_requirement_groups = test_criteria[0]["requirementGroups"] + + def set_tender_lots(tender, lots): tender["lots"] = [] for lot in lots: @@ -197,6 +208,15 @@ def set_tender_lots(tender, lots): return tender +def set_tender_criteria(criteria, lots, items): + for i, criterion in enumerate(criteria): + if lots and criterion["relatesTo"] == "lot": + criterion["relatedItem"] = lots[i % len(lots)]["id"] + elif items and criterion["relatesTo"] == "item": + criterion["relatedItem"] = items[i % len(lots)]["id"] + return criteria + + def set_bid_lotvalues(bid, lots): value = bid.pop("value", None) or bid["lotValues"][0]["value"] bid["lotValues"] = [{"value": value, "relatedLot": lot["id"]} for lot in lots] @@ -213,6 +233,7 @@ class BaseTenderWebTest(BaseCoreWebTest): initial_status = None initial_bids = None initial_lots = None + initial_criteria = None initial_auth = ("Basic", ("broker", "")) docservice = False min_bids_number = MIN_BIDS_NUMBER @@ -238,141 +259,9 @@ class BaseTenderWebTest(BaseCoreWebTest): "active.tendering" ) # status, in which adding document to tender auction is forbidden - def update_status(self, status, extra=None): - now = get_now() - data = {"status": status} - if status == "active.enquiries": - data.update( - { - "enquiryPeriod": {"startDate": (now).isoformat(), "endDate": (now + timedelta(days=7)).isoformat()}, - "tenderPeriod": { - "startDate": (now + timedelta(days=7)).isoformat(), - "endDate": (now + timedelta(days=14)).isoformat(), - }, - } - ) - elif status == "active.tendering": - data.update( - { - "enquiryPeriod": { - "startDate": (now - timedelta(days=10)).isoformat(), - "endDate": (now).isoformat(), - }, - "tenderPeriod": {"startDate": (now).isoformat(), "endDate": (now + timedelta(days=7)).isoformat()}, - } - ) - elif status == "active.auction": - data.update( - { - "enquiryPeriod": { - "startDate": (now - timedelta(days=14)).isoformat(), - "endDate": (now - timedelta(days=7)).isoformat(), - }, - "tenderPeriod": {"startDate": (now - timedelta(days=7)).isoformat(), "endDate": (now).isoformat()}, - "auctionPeriod": {"startDate": (now).isoformat()}, - } - ) - if self.initial_lots: - data.update({"lots": [{"auctionPeriod": {"startDate": (now).isoformat()}} for i in self.initial_lots]}) - elif status == "active.qualification": - data.update( - { - "enquiryPeriod": { - "startDate": (now - timedelta(days=15)).isoformat(), - "endDate": (now - timedelta(days=8)).isoformat(), - }, - "tenderPeriod": { - "startDate": (now - timedelta(days=8)).isoformat(), - "endDate": (now - timedelta(days=1)).isoformat(), - }, - "auctionPeriod": {"startDate": (now - timedelta(days=1)).isoformat(), "endDate": (now).isoformat()}, - "awardPeriod": {"startDate": (now).isoformat()}, - } - ) - if self.initial_lots: - data.update( - { - "lots": [ - { - "auctionPeriod": { - "startDate": (now - timedelta(days=1)).isoformat(), - "endDate": (now).isoformat(), - } - } - for i in self.initial_lots - ] - } - ) - elif status == "active.awarded": - data.update( - { - "enquiryPeriod": { - "startDate": (now - timedelta(days=15)).isoformat(), - "endDate": (now - timedelta(days=8)).isoformat(), - }, - "tenderPeriod": { - "startDate": (now - timedelta(days=8)).isoformat(), - "endDate": (now - timedelta(days=1)).isoformat(), - }, - "auctionPeriod": {"startDate": (now - timedelta(days=1)).isoformat(), "endDate": (now).isoformat()}, - "awardPeriod": {"startDate": (now).isoformat(), "endDate": (now).isoformat()}, - } - ) - if self.initial_lots: - data.update( - { - "lots": [ - { - "auctionPeriod": { - "startDate": (now - timedelta(days=1)).isoformat(), - "endDate": (now).isoformat(), - } - } - for i in self.initial_lots - ] - } - ) - elif status == "complete": - data.update( - { - "enquiryPeriod": { - "startDate": (now - timedelta(days=25)).isoformat(), - "endDate": (now - timedelta(days=18)).isoformat(), - }, - "tenderPeriod": { - "startDate": (now - timedelta(days=18)).isoformat(), - "endDate": (now - timedelta(days=11)).isoformat(), - }, - "auctionPeriod": { - "startDate": (now - timedelta(days=11)).isoformat(), - "endDate": (now - timedelta(days=10)).isoformat(), - }, - "awardPeriod": { - "startDate": (now - timedelta(days=10)).isoformat(), - "endDate": (now - timedelta(days=10)).isoformat(), - }, - } - ) - if self.initial_lots: - data.update( - { - "lots": [ - { - "auctionPeriod": { - "startDate": (now - timedelta(days=11)).isoformat(), - "endDate": (now - timedelta(days=10)).isoformat(), - } - } - for i in self.initial_lots - ] - } - ) - - self.tender_document_patch = data - if extra: - self.tender_document_patch.update(extra) - self.save_changes() - + periods = PERIODS + tender_class = Tender + def create_tender(self): data = deepcopy(self.initial_data) if self.initial_lots: @@ -382,6 +271,19 @@ def create_tender(self): tender = response.json["data"] self.tender_token = response.json["access"]["token"] self.tender_id = tender["id"] + + if self.initial_criteria: + self.app.post_json( + "/tenders/{}/criteria?acc_token={}&bulk=true".format(self.tender_id, self.tender_token), + { + "data": set_tender_criteria( + self.initial_criteria, + tender.get("lots", []), + tender.get("items", []), + ) + } + ) + status = tender["status"] if self.initial_bids: self.initial_bids_tokens = {} diff --git a/src/openprocurement/tender/belowthreshold/tests/bid.py b/src/openprocurement/tender/belowthreshold/tests/bid.py index c1b6c14933..3d9b2e782a 100644 --- a/src/openprocurement/tender/belowthreshold/tests/bid.py +++ b/src/openprocurement/tender/belowthreshold/tests/bid.py @@ -40,6 +40,11 @@ # Tender2LotBidResourceTest patch_tender_with_bids_lots_none, ) +from openprocurement.tender.openeu.tests.bid import CreateBidMixin +from openprocurement.tender.openeu.tests.bid import ( + TenderBidRequirementResponseTestMixin, + TenderBidRequirementResponseEvidenceTestMixin, +) class TenderBidResourceTest(TenderContentWebTest): @@ -111,12 +116,32 @@ class TenderBidBatchDocumentWithDSResourceTest(TenderContentWebTest): test_create_tender_bid_with_documents = snitch(create_tender_bid_with_documents) +class TenderBidRequirementResponseResourceTest( + TenderBidRequirementResponseTestMixin, + CreateBidMixin, + TenderContentWebTest, +): + test_bids_data = test_bids + initial_status = "active.tendering" + + +class TenderBidRequirementResponseEvidenceResourceTest( + TenderBidRequirementResponseEvidenceTestMixin, + CreateBidMixin, + TenderContentWebTest, +): + test_bids_data = test_bids + initial_status = "active.tendering" + + def suite(): suite = unittest.TestSuite() suite.addTest(unittest.makeSuite(TenderBidDocumentResourceTest)) suite.addTest(unittest.makeSuite(TenderBidDocumentWithDSResourceTest)) suite.addTest(unittest.makeSuite(TenderBidFeaturesResourceTest)) suite.addTest(unittest.makeSuite(TenderBidResourceTest)) + suite.addTest(unittest.makeSuite(TenderBidRequirementResponseResourceTest)) + suite.addTest(unittest.makeSuite(TenderBidRequirementResponseEvidenceResourceTest)) return suite diff --git a/src/openprocurement/tender/belowthreshold/tests/chronograph_blanks.py b/src/openprocurement/tender/belowthreshold/tests/chronograph_blanks.py index a840ae2e50..ac2117d7b8 100644 --- a/src/openprocurement/tender/belowthreshold/tests/chronograph_blanks.py +++ b/src/openprocurement/tender/belowthreshold/tests/chronograph_blanks.py @@ -3,11 +3,10 @@ from iso8601 import parse_date from openprocurement.api.utils import get_now -from openprocurement.tender.belowthreshold.tests.base import test_claim, test_author +from openprocurement.tender.belowthreshold.tests.base import test_claim # TenderSwitchTenderingResourceTest -from openprocurement.tender.core.utils import calculate_tender_business_date def switch_to_tendering_by_tenderPeriod_startDate(self): @@ -53,51 +52,58 @@ def switch_to_unsuccessful(self): def set_auction_period(self): + def check_chronograph(auction_period_data=None): + if self.initial_lots: + data = {"data": {"lots": [{"auctionPeriod": auction_period_data}]}} if auction_period_data else None + ch_response = self.check_chronograph(data) + ch_response_item = ch_response.json["data"]["lots"][0] + else: + data = {"data": {"auctionPeriod": auction_period_data}} if auction_period_data else None + ch_response = self.check_chronograph(data) + ch_response_item = ch_response.json["data"] + return ch_response, ch_response_item + self.set_status("active.tendering", {"status": "active.enquiries"}) - response = self.check_chronograph() + + response, item = check_chronograph() self.assertEqual(response.json["data"]["status"], "active.tendering") - if self.initial_lots: - item = response.json["data"]["lots"][0] - else: - item = response.json["data"] self.assertIn("auctionPeriod", item) self.assertIn("shouldStartAfter", item["auctionPeriod"]) - self.assertGreaterEqual(item["auctionPeriod"]["shouldStartAfter"], response.json["data"]["tenderPeriod"]["endDate"]) + self.assertGreaterEqual( + item["auctionPeriod"]["shouldStartAfter"], + response.json["data"]["tenderPeriod"]["endDate"] + ) self.assertIn("T00:00:00+", item["auctionPeriod"]["shouldStartAfter"]) self.assertEqual( parse_date(response.json["data"]["next_check"]), parse_date(response.json["data"]["tenderPeriod"]["endDate"]) ) - if self.initial_lots: - response = self.check_chronograph( - {"data": {"lots": [{"auctionPeriod": {"startDate": "9999-01-01T00:00:00+00:00"}}]}} - ) - item = response.json["data"]["lots"][0] - else: - response = self.check_chronograph({"data": {"auctionPeriod": {"startDate": "9999-01-01T00:00:00+00:00"}}}) - item = response.json["data"] + response, item = check_chronograph(auction_period_data={"startDate": "9999-01-01T00:00:00"}) self.assertEqual(response.status, "200 OK") - self.assertEqual(item["auctionPeriod"]["startDate"], "9999-01-01T00:00:00+00:00") + self.assertEqual(item["auctionPeriod"]["startDate"], "9999-01-01T00:00:00+02:00") - if self.initial_lots: - response = self.check_chronograph({"data": {"lots": [{"auctionPeriod": {"startDate": None}}]}}) - item = response.json["data"]["lots"][0] - else: - response = self.check_chronograph({"data": {"auctionPeriod": {"startDate": None}}}) - item = response.json["data"] + response, item = check_chronograph(auction_period_data={"startDate": None}) self.assertEqual(response.status, "200 OK") self.assertNotIn("startDate", item["auctionPeriod"]) def reset_auction_period(self): + def check_chronograph(auction_period_data=None): + if self.initial_lots: + data = {"data": {"lots": [{"auctionPeriod": auction_period_data}]}} if auction_period_data else None + ch_response = self.check_chronograph(data) + ch_response_item = ch_response.json["data"]["lots"][0] + else: + data = {"data": {"auctionPeriod": auction_period_data}} if auction_period_data else None + ch_response = self.check_chronograph(data) + ch_response_item = ch_response.json["data"] + return ch_response, ch_response_item + self.set_status("active.tendering", {"status": "active.enquiries"}) - response = self.check_chronograph() + + response, item = check_chronograph() self.assertEqual(response.json["data"]["status"], "active.tendering") - if self.initial_lots: - item = response.json["data"]["lots"][0] - else: - item = response.json["data"] self.assertIn("auctionPeriod", item) self.assertIn("shouldStartAfter", item["auctionPeriod"]) self.assertGreaterEqual(item["auctionPeriod"]["shouldStartAfter"], response.json["data"]["tenderPeriod"]["endDate"]) @@ -105,111 +111,87 @@ def reset_auction_period(self): parse_date(response.json["data"]["next_check"]), parse_date(response.json["data"]["tenderPeriod"]["endDate"]) ) - if self.initial_lots: - response = self.check_chronograph({"data": {"lots": [{"auctionPeriod": {"startDate": "9999-01-01T00:00:00"}}]}}) - item = response.json["data"]["lots"][0] - else: - response = self.check_chronograph({"data": {"auctionPeriod": {"startDate": "9999-01-01T00:00:00"}}}) - item = response.json["data"] + + response, item = check_chronograph(auction_period_data={"startDate": "9999-01-01T00:00:00"}) self.assertEqual(response.status, "200 OK") - self.assertGreaterEqual(item["auctionPeriod"]["shouldStartAfter"], response.json["data"]["tenderPeriod"]["endDate"]) + self.assertGreaterEqual( + item["auctionPeriod"]["shouldStartAfter"], + response.json["data"]["tenderPeriod"]["endDate"] + ) self.assertIn("9999-01-01T00:00:00", item["auctionPeriod"]["startDate"]) self.set_status("active.auction", {"status": "active.tendering"}) response = self.check_chronograph() self.assertEqual(response.json["data"]["status"], "active.auction") item = response.json["data"]["lots"][0] if self.initial_lots else response.json["data"] - self.assertGreaterEqual(item["auctionPeriod"]["shouldStartAfter"], response.json["data"]["tenderPeriod"]["endDate"]) + self.assertGreaterEqual( + item["auctionPeriod"]["shouldStartAfter"], + response.json["data"]["tenderPeriod"]["endDate"] + ) - if self.initial_lots: - response = self.check_chronograph({"data": {"lots": [{"auctionPeriod": {"startDate": "9999-01-01T00:00:00"}}]}}) - item = response.json["data"]["lots"][0] - else: - response = self.check_chronograph({"data": {"auctionPeriod": {"startDate": "9999-01-01T00:00:00"}}}) - item = response.json["data"] + response, item = check_chronograph(auction_period_data={"startDate": "9999-01-01T00:00:00"}) self.assertEqual(response.status, "200 OK") self.assertEqual(response.json["data"]["status"], "active.auction") - self.assertGreaterEqual(item["auctionPeriod"]["shouldStartAfter"], response.json["data"]["tenderPeriod"]["endDate"]) + self.assertGreaterEqual( + item["auctionPeriod"]["shouldStartAfter"], + response.json["data"]["tenderPeriod"]["endDate"] + ) self.assertIn("9999-01-01T00:00:00", item["auctionPeriod"]["startDate"]) self.assertIn("9999-01-01T00:00:00", response.json["data"]["next_check"]) - now = get_now().isoformat() - tender = self.db.get(self.tender_id) - if self.initial_lots: - tender["lots"][0]["auctionPeriod"]["startDate"] = now - else: - tender["auctionPeriod"]["startDate"] = now - self.db.save(tender) - - response = self.check_chronograph() + now = get_now() + response, item = check_chronograph(auction_period_data={"startDate": now.isoformat()}) self.assertEqual(response.json["data"]["status"], "active.auction") item = response.json["data"]["lots"][0] if self.initial_lots else response.json["data"] - self.assertGreaterEqual(item["auctionPeriod"]["shouldStartAfter"], response.json["data"]["tenderPeriod"]["endDate"]) + self.assertGreaterEqual( + item["auctionPeriod"]["shouldStartAfter"], + response.json["data"]["tenderPeriod"]["endDate"] + ) + self.assertIn(now.isoformat(), item["auctionPeriod"]["startDate"]) self.assertGreater( parse_date(response.json["data"]["next_check"]), parse_date(item["auctionPeriod"]["startDate"]) ) - self.assertEqual(response.json["data"]["next_check"], self.db.get(self.tender_id)["next_check"]) + self.assertEqual( + response.json["data"]["next_check"], + self.db.get(self.tender_id)["next_check"] + ) - if self.initial_lots: - response = self.check_chronograph( - {"data": {"lots": [{"auctionPeriod": {"startDate": response.json["data"]["tenderPeriod"]["endDate"]}}]}} - ) - item = response.json["data"]["lots"][0] - else: - response = self.check_chronograph( - {"data": {"auctionPeriod": {"startDate": response.json["data"]["tenderPeriod"]["endDate"]}}} - ) - item = response.json["data"] + tender_period_end_date = response.json["data"]["tenderPeriod"]["endDate"] + response, item = check_chronograph(auction_period_data={"startDate": tender_period_end_date}) self.assertEqual(response.status, "200 OK") self.assertEqual(response.json["data"]["status"], "active.auction") - self.assertGreaterEqual(item["auctionPeriod"]["shouldStartAfter"], response.json["data"]["tenderPeriod"]["endDate"]) - self.assertNotIn("9999-01-01T00:00:00", item["auctionPeriod"]["startDate"]) + self.assertGreaterEqual( + item["auctionPeriod"]["shouldStartAfter"], + response.json["data"]["tenderPeriod"]["endDate"] + ) + self.assertIn(tender_period_end_date, item["auctionPeriod"]["startDate"]) self.assertGreater( parse_date(response.json["data"]["next_check"]), parse_date(response.json["data"]["tenderPeriod"]["endDate"]) ) - tender = self.db.get(self.tender_id) - self.assertGreater(tender["next_check"], response.json["data"]["tenderPeriod"]["endDate"]) - tender["tenderPeriod"]["endDate"] = tender["tenderPeriod"]["startDate"] - tender["tenderPeriod"]["startDate"] = calculate_tender_business_date( - parse_date(tender["tenderPeriod"]["endDate"]), -timedelta(2), None, True - ).isoformat() - tender["enquiryPeriod"]["endDate"] = tender["tenderPeriod"]["startDate"] - tender["enquiryPeriod"]["startDate"] = calculate_tender_business_date( - parse_date(tender["enquiryPeriod"]["endDate"]), -timedelta(4), None, True - ).isoformat() - if self.initial_lots: - tender["lots"][0]["auctionPeriod"]["startDate"] = tender["tenderPeriod"]["endDate"] - else: - tender["auctionPeriod"]["startDate"] = tender["tenderPeriod"]["endDate"] - self.db.save(tender) + self.assertGreater( + self.db.get(self.tender_id)["next_check"], + response.json["data"]["tenderPeriod"]["endDate"] + ) - response = self.check_chronograph() - if self.initial_lots: - item = response.json["data"]["lots"][0] - else: - item = response.json["data"] - self.assertGreaterEqual(item["auctionPeriod"]["shouldStartAfter"], response.json["data"]["tenderPeriod"]["endDate"]) + self.time_shift("active.auction", shift=-timedelta(days=2)) + + response, item = check_chronograph() + self.assertGreaterEqual( + item["auctionPeriod"]["shouldStartAfter"], + response.json["data"]["tenderPeriod"]["endDate"] + ) self.assertNotIn("next_check", response.json["data"]) self.assertNotIn("next_check", self.db.get(self.tender_id)) shouldStartAfter = item["auctionPeriod"]["shouldStartAfter"] - response = self.check_chronograph() - if self.initial_lots: - item = response.json["data"]["lots"][0] - else: - item = response.json["data"] + response, item = check_chronograph() self.assertEqual(item["auctionPeriod"]["shouldStartAfter"], shouldStartAfter) self.assertNotIn("next_check", response.json["data"]) - if self.initial_lots: - response = self.check_chronograph({"data": {"lots": [{"auctionPeriod": {"startDate": "9999-01-01T00:00:00"}}]}}) - item = response.json["data"]["lots"][0] - else: - response = self.check_chronograph({"data": {"auctionPeriod": {"startDate": "9999-01-01T00:00:00"}}}) - item = response.json["data"] + response, item = check_chronograph(auction_period_data={"startDate": "9999-01-01T00:00:00"}) self.assertEqual(response.status, "200 OK") self.assertEqual(response.json["data"]["status"], "active.auction") self.assertGreaterEqual(item["auctionPeriod"]["shouldStartAfter"], response.json["data"]["tenderPeriod"]["endDate"]) diff --git a/src/openprocurement/tender/belowthreshold/tests/contract.py b/src/openprocurement/tender/belowthreshold/tests/contract.py index f88314ff51..a859d29963 100644 --- a/src/openprocurement/tender/belowthreshold/tests/contract.py +++ b/src/openprocurement/tender/belowthreshold/tests/contract.py @@ -15,10 +15,12 @@ create_tender_contract, create_tender_contract_in_complete_status, patch_tender_contract, + patch_tender_contract_rationale_simple, get_tender_contract, get_tender_contracts, # Tender2LotContractResourceTest lot2_patch_tender_contract, + lot2_patch_tender_contract_rationale_simple, # TenderContractDocumentResourceTest not_found, create_tender_contract_document, @@ -93,6 +95,7 @@ def setUp(self): test_create_tender_contract = snitch(create_tender_contract) test_create_tender_contract_in_complete_status = snitch(create_tender_contract_in_complete_status) test_patch_tender_contract = snitch(patch_tender_contract) + test_patch_tender_contract_rationale_simple = snitch(patch_tender_contract_rationale_simple) test_patch_tender_contract_value = snitch(patch_tender_contract_value) test_patch_tender_contract_status_by_owner = snitch(patch_tender_contract_status_by_owner) test_patch_tender_contract_status_by_supplier = snitch(patch_tender_contract_status_by_supplier) @@ -170,6 +173,7 @@ def setUp(self): ) test_lot2_patch_tender_contract = snitch(lot2_patch_tender_contract) + test_lot2_patch_tender_contract_rationale_simple = snitch(lot2_patch_tender_contract_rationale_simple) class TenderContractDocumentResourceTest(TenderContentWebTest, TenderContractDocumentResourceTestMixin): diff --git a/src/openprocurement/tender/belowthreshold/tests/contract_blanks.py b/src/openprocurement/tender/belowthreshold/tests/contract_blanks.py index 28e2e419cc..8023968273 100644 --- a/src/openprocurement/tender/belowthreshold/tests/contract_blanks.py +++ b/src/openprocurement/tender/belowthreshold/tests/contract_blanks.py @@ -424,6 +424,54 @@ def patch_tender_contract(self): self.assertEqual(response.json["data"]["dateSigned"], custom_signature_date) +def patch_tender_contract_rationale_simple(self): + # make tender procurementMethodRationale simple + doc = self.db.get(self.tender_id) + doc["procurementMethodRationale"] = "simple" + self.db.save(doc) + + self.app.authorization = ("Basic", ("token", "")) + response = self.app.get("/tenders/{}/contracts".format(self.tender_id)) + contract = response.json["data"][0] + + self.assertEqual(contract["value"]["amount"], contract["value"]["amountNet"]) + + response = self.app.patch_json( + "/tenders/{}/contracts/{}?acc_token={}".format(self.tender_id, contract["id"], self.tender_token), + { + "data": { + "value": { + "amountNet": contract["value"]["amount"] - 1 + } + } + }, + ) + self.assertEqual(response.status, "200 OK") + + self.app.authorization = ("Basic", ("broker", "")) + response = self.app.patch_json( + "/tenders/{}/contracts/{}?acc_token={}".format( + self.tender_id, + contract["id"], + self.tender_token + ), + { + "data": { + "status": "active" + } + }, + status=200, + ) + self.assertEqual(response.status, "200 OK") + self.assertEqual(response.content_type, "application/json") + self.assertEqual(response.json["data"]["status"], "active") + + response = self.app.get( + "/tenders/{}".format(self.tender_id) + ) + self.assertEqual(response.json["data"]["status"], "complete") + + def patch_tender_contract_value(self): response = self.app.get("/tenders/{}/contracts".format(self.tender_id)) contract = response.json["data"][0] @@ -819,6 +867,40 @@ def lot2_patch_tender_contract(self): self.assertEqual(response.json["errors"][0]["description"], "Can update contract only in active lot status") +def lot2_patch_tender_contract_rationale_simple(self): + # make tender procurementMethodRationale simple + doc = self.db.get(self.tender_id) + doc["procurementMethodRationale"] = "simple" + self.db.save(doc) + + self.app.authorization = ("Basic", ("token", "")) + response = self.app.get("/tenders/{}/contracts".format(self.tender_id)) + contract = response.json["data"][0] + + self.app.authorization = ("Basic", ("broker", "")) + response = self.app.patch_json( + "/tenders/{}/contracts/{}?acc_token={}".format(self.tender_id, contract["id"], self.tender_token), + { + "data": { + "status": "active" + } + }, + status=200, + ) + self.assertEqual(response.status, "200 OK") + self.assertEqual(response.content_type, "application/json") + self.assertEqual(response.json["data"]["status"], "active") + + # check if lot complete after contract activated + response = self.app.get( + "/tenders/{}".format(self.tender_id) + ) + tender = response.json["data"] + active_award = [award for award in tender["awards"] if award["id"] == self.award_id][0] + completed_lot = [lot for lot in tender["lots"] if lot["id"] == active_award["lotID"]][0] + self.assertEqual(completed_lot["status"], "complete") + + # TenderContractDocumentResourceTest diff --git a/src/openprocurement/tender/belowthreshold/tests/criterion.py b/src/openprocurement/tender/belowthreshold/tests/criterion.py new file mode 100644 index 0000000000..18d0750bc2 --- /dev/null +++ b/src/openprocurement/tender/belowthreshold/tests/criterion.py @@ -0,0 +1,67 @@ +# -*- coding: utf-8 -*- +import unittest + +from openprocurement.tender.belowthreshold.tests.base import test_tender_data, test_lots, TenderContentWebTest +from openprocurement.tender.openua.tests.criterion import ( + TenderCriteriaTestMixin, + TenderCriteriaRGTestMixin, + TenderCriteriaRGRequirementTestMixin, + TenderCriteriaRGRequirementEvidenceTestMixin, +) +from openprocurement.api.tests.base import snitch +from openprocurement.tender.belowthreshold.tests.criterion_blanks import ( + activate_tender, + patch_tender_criteria_invalid, + patch_criteria_rg, + delete_requirement_evidence, +) + + +class TenderCriteriaTest(TenderCriteriaTestMixin, TenderContentWebTest): + initial_data = test_tender_data + test_lots_data = test_lots + initial_status = "draft" + + test_activate_tender = snitch(activate_tender) + test_patch_tender_criteria_invalid = snitch(patch_tender_criteria_invalid) + + +class TenderCriteriaRGTest(TenderCriteriaRGTestMixin, TenderContentWebTest): + initial_data = test_tender_data + test_lots_data = test_lots + initial_status = "draft" + + test_patch_criteria_rg = snitch(patch_criteria_rg) + + +class TenderCriteriaRGRequirementTest( + TenderCriteriaRGRequirementTestMixin, + TenderContentWebTest +): + initial_data = test_tender_data + test_lots_data = test_lots + initial_status = "draft" + + +class TenderCriteriaRGRequirementEvidenceTest( + TenderCriteriaRGRequirementEvidenceTestMixin, + TenderContentWebTest, +): + initial_data = test_tender_data + test_lots_data = test_lots + initial_status = "active.enquiries" + + test_delete_requirement_evidence = snitch(delete_requirement_evidence) + + +def suite(): + suite = unittest.TestSuite() + suite.addTest(unittest.makeSuite(TenderCriteriaTest)) + suite.addTest(unittest.makeSuite(TenderCriteriaRGTest)) + suite.addTest(unittest.makeSuite(TenderCriteriaRGRequirementTest)) + suite.addTest(unittest.makeSuite(TenderCriteriaRGRequirementEvidenceTest)) + return suite + + +if __name__ == "__main__": + unittest.main(defaultTest="suite") diff --git a/src/openprocurement/tender/belowthreshold/tests/criterion_blanks.py b/src/openprocurement/tender/belowthreshold/tests/criterion_blanks.py new file mode 100644 index 0000000000..62e70ee29e --- /dev/null +++ b/src/openprocurement/tender/belowthreshold/tests/criterion_blanks.py @@ -0,0 +1,186 @@ +# -*- coding: utf-8 -*- + +from copy import deepcopy +from openprocurement.tender.belowthreshold.tests.base import test_criteria + + +def activate_tender(self): + request_path = "/tenders/{}?acc_token={}".format(self.tender_id, self.tender_token) + + response = self.app.patch_json( + request_path, + {"data": {"status": "active.enquiries"}}, + ) + + self.assertEqual(response.status, "200 OK") + self.assertEqual(response.content_type, "application/json") + self.assertEqual(response.json["data"]["status"], "active.enquiries") + + +def patch_tender_criteria_invalid(self): + criteria_data = deepcopy(test_criteria) + criteria_data[0]["classification"]["id"] = "CRITERION.OTHER" + + response = self.app.post_json( + "/tenders/{}/criteria?acc_token={}&bulk=true".format(self.tender_id, self.tender_token), + {"data": criteria_data} + ) + self.assertEqual(response.status, "201 Created") + self.assertEqual(response.content_type, "application/json") + + criteria_id = response.json["data"][0]["id"] + criteria_not_editable_id = response.json["data"][1]["id"] + + request_path = "/tenders/{}/criteria/{}?acc_token={}".format(self.tender_id, criteria_id, self.tender_token) + + updated_data = { + "title": u"Оновлена назва", + "title_en": u"Updated title", + "title_ru": u"Обновлённое название", + "description": u"Оновлений опис", + "relatesTo": "lot", + } + + response = self.app.patch_json( + request_path, + {"data": updated_data}, + status=422 + ) + + self.assertEqual(response.status, "422 Unprocessable Entity") + self.assertEqual(response.content_type, "application/json") + self.assertEqual(response.json["status"], "error") + self.assertEqual( + response.json["errors"], + [ + { + u"description": [u"This field is required."], + u"location": u"body", + u"name": u"relatedItem", + } + ], + ) + + updated_data["relatedItem"] = "0" * 32 + response = self.app.patch_json( + request_path, + {"data": updated_data}, + status=422 + ) + + self.assertEqual(response.status, "422 Unprocessable Entity") + self.assertEqual(response.content_type, "application/json") + self.assertEqual(response.json["status"], "error") + self.assertEqual( + response.json["errors"], + [ + { + u"description": [u"relatedItem should be one of lots"], + u"location": u"body", + u"name": u"relatedItem", + } + ], + ) + + updated_data["relatesTo"] = "item" + + response = self.app.patch_json( + request_path, + {"data": updated_data}, + status=422 + ) + + self.assertEqual(response.status, "422 Unprocessable Entity") + self.assertEqual(response.content_type, "application/json") + self.assertEqual(response.json["status"], "error") + self.assertEqual( + response.json["errors"], + [ + { + u"description": [u"relatedItem should be one of items"], + u"location": u"body", + u"name": u"relatedItem", + } + ], + ) + + +def patch_criteria_rg(self): + response = self.app.get("/tenders/{}/criteria".format(self.tender_id)) + rg_id = response.json["data"][0]["requirementGroups"][0]["id"] + + criteria_not_editable_id = response.json["data"][1]["id"] + rg_not_editable_id = response.json["data"][1]["requirementGroups"][0]["id"] + + request_path = "/tenders/{}/criteria/{}/requirement_groups/{}?acc_token={}".format( + self.tender_id, self.criteria_id, rg_id, self.tender_token) + + updated_fields = { + "description": u"Оновлений опис", + "description_en": u"Updated requirement description", + } + + response = self.app.patch_json(request_path, {"data": updated_fields}) + self.assertEqual(response.status, "200 OK") + self.assertEqual(response.content_type, "application/json") + updated_rg = response.json["data"] + + for k, v in updated_fields.items(): + self.assertIn(k, updated_rg) + self.assertEqual(updated_rg[k], v) + + +def delete_requirement_evidence(self): + response = self.app.post_json( + "/tenders/{}/criteria/{}/requirement_groups/{}/requirements/{}/evidences?acc_token={}".format( + self.tender_id, self.criteria_id, self.rg_id, self.requirement_id, self.tender_token), + {"data": self.test_evidence_data} + ) + self.assertEqual(response.status, "201 Created") + self.assertEqual(response.content_type, "application/json") + evidence_id = response.json["data"]["id"] + + base_request_path = "/tenders/{}/criteria/{}/requirement_groups/{}/requirements/{}/evidences".format( + self.tender_id, self.criteria_id, self.rg_id, self.requirement_id, evidence_id, self.tender_token) + + response = self.app.delete("{}/{}?acc_token={}".format(base_request_path, evidence_id, self.tender_token)) + + self.assertEqual(response.status, "200 OK") + self.assertEqual(response.content_type, "application/json") + + response = self.app.get( + "/tenders/{}/criteria/{}/requirement_groups/{}/requirements/{}/evidences".format( + self.tender_id, self.criteria_id, self.rg_id, self.requirement_id, self.tender_token), + ) + self.assertEqual(response.status, "200 OK") + self.assertEqual(response.content_type, "application/json") + self.assertEqual(len(response.json["data"]), 1) + + response = self.app.post_json( + "/tenders/{}/criteria/{}/requirement_groups/{}/requirements/{}/evidences?acc_token={}".format( + self.tender_id, self.criteria_id, self.rg_id, self.requirement_id, self.tender_token), + {"data": self.test_evidence_data} + ) + + self.assertEqual(response.status, "201 Created") + self.assertEqual(response.content_type, "application/json") + evidence_id = response.json["data"]["id"] + + self.set_status("active.auction") + + response = self.app.delete( + "{}/{}?acc_token={}".format(base_request_path, evidence_id, self.tender_token), + status=403, + ) + self.assertEqual(response.status, "403 Forbidden") + self.assertEqual(response.content_type, "application/json") + self.assertEqual(response.json["status"], "error") + self.assertEqual( + response.json["errors"], + [{ + u'description': u"Can't delete object if tender not in " + u"['draft', 'active.enquiries'] statuses", + u'location': u'body', + u'name': u'data', + }] + ) \ No newline at end of file diff --git a/src/openprocurement/tender/belowthreshold/tests/lot.py b/src/openprocurement/tender/belowthreshold/tests/lot.py index ae637bca30..0de083809f 100644 --- a/src/openprocurement/tender/belowthreshold/tests/lot.py +++ b/src/openprocurement/tender/belowthreshold/tests/lot.py @@ -40,6 +40,8 @@ proc_2lot_2bid_2com_2win, proc_2lot_1feature_2bid_2com_2win, proc_2lot_2diff_bids_check_auction, + create_tender_lot_minimalstep_validation, + patch_tender_lot_minimalstep_validation, ) @@ -74,6 +76,8 @@ class TenderLotResourceTest(TenderContentWebTest, TenderLotResourceTestMixin, Te test_get_tender_lot = snitch(get_tender_lot) test_get_tender_lots = snitch(get_tender_lots) + test_create_tender_lot_minimalstep_validation = snitch(create_tender_lot_minimalstep_validation) + test_patch_tender_lot_minimalstep_validation = snitch(patch_tender_lot_minimalstep_validation) class TenderLotFeatureResourceTest(TenderContentWebTest, TenderLotFeatureResourceTestMixin): diff --git a/src/openprocurement/tender/belowthreshold/tests/lot_blanks.py b/src/openprocurement/tender/belowthreshold/tests/lot_blanks.py index 998f828fb1..caeb8c57e3 100644 --- a/src/openprocurement/tender/belowthreshold/tests/lot_blanks.py +++ b/src/openprocurement/tender/belowthreshold/tests/lot_blanks.py @@ -1,4 +1,5 @@ # -*- coding: utf-8 -*- +import mock from copy import deepcopy from datetime import timedelta from email.header import Header @@ -130,7 +131,7 @@ def create_tender_lot_invalid(self): "title": "lot title", "description": "lot description", "value": {"amount": "500.0"}, - "minimalStep": {"amount": "100.0", "currency": "USD"}, + "minimalStep": {"amount": "15.0", "currency": "USD"}, } }, ) @@ -141,7 +142,7 @@ def create_tender_lot_invalid(self): lots = response.json["data"] self.assertEqual(len(lots), 1) self.assertEqual(lots[0]["minimalStep"]["currency"], "UAH") - self.assertEqual(lots[0]["minimalStep"]["amount"], 100) + self.assertEqual(lots[0]["minimalStep"]["amount"], 15) response = self.app.patch_json( "/tenders/{}?acc_token={}".format(self.tender_id, self.tender_token), @@ -286,6 +287,29 @@ def create_tender_lot(self): ) +def create_tender_lot_minimalstep_validation(self): + data = deepcopy(self.test_lots_data)[0] + data["minimalStep"]["amount"] = 35 + request_path = "/tenders/{}/lots?acc_token={}".format(self.tender_id, self.tender_token) + with mock.patch("openprocurement.tender.core.validation.MINIMAL_STEP_VALIDATION_FROM", + get_now() - timedelta(days=1)): + response = self.app.post_json(request_path, {"data": data}, status=422) + self.assertEqual(response.status, "422 Unprocessable Entity") + self.assertEqual(response.content_type, "application/json") + self.assertEqual(response.json["status"], "error") + self.assertEqual( + response.json["errors"], + [{u"description": [u"minimalstep must be between 0.5% and 3% of value (with 2 digits precision)."], + u"location": u"body", u"name": u"minimalStep"}], + ) + + with mock.patch("openprocurement.tender.core.validation.MINIMAL_STEP_VALIDATION_FROM", + get_now() + timedelta(days=1)): + response = self.app.post_json(request_path, {"data": data}, status=201) + self.assertEqual(response.status, "201 Created") + self.assertEqual(response.content_type, "application/json") + + def patch_tender_lot(self): response = self.app.post_json( "/tenders/{}/lots?acc_token={}".format(self.tender_id, self.tender_token), {"data": self.test_lots_data[0]} @@ -356,6 +380,40 @@ def patch_tender_lot(self): ) +def patch_tender_lot_minimalstep_validation(self): + response = self.app.post_json( + "/tenders/{}/lots?acc_token={}".format(self.tender_id, self.tender_token), {"data": self.test_lots_data[0]} + ) + self.assertEqual(response.status, "201 Created") + self.assertEqual(response.content_type, "application/json") + lot = response.json["data"] + + with mock.patch("openprocurement.tender.core.validation.MINIMAL_STEP_VALIDATION_FROM", + get_now() - timedelta(days=1)): + response = self.app.patch_json( + "/tenders/{}/lots/{}?acc_token={}".format(self.tender_id, lot["id"], self.tender_token), + {"data": {"minimalStep": {"amount": 100.0}}}, + status=422, + ) + self.assertEqual(response.status, "422 Unprocessable Entity") + self.assertEqual(response.content_type, "application/json") + self.assertEqual(response.json["status"], "error") + self.assertEqual( + response.json["errors"], + [{u"description": [u"minimalstep must be between 0.5% and 3% of value (with 2 digits precision)."], + u"location": u"body", u"name": u"minimalStep"}], + ) + with mock.patch("openprocurement.tender.core.validation.MINIMAL_STEP_VALIDATION_FROM", + get_now() + timedelta(days=1)): + response = self.app.patch_json( + "/tenders/{}/lots/{}?acc_token={}".format(self.tender_id, lot["id"], self.tender_token), + {"data": {"minimalStep": {"amount": 100.0}}}, + status=200, + ) + self.assertEqual(response.status, "200 OK") + self.assertEqual(response.content_type, "application/json") + + def patch_tender_currency(self): # create lot response = self.app.post_json( @@ -531,7 +589,10 @@ def get_tender_lot(self): response = self.app.get("/tenders/{}/lots/{}".format(self.tender_id, lot["id"])) self.assertEqual(response.status, "200 OK") self.assertEqual(response.content_type, "application/json") - self.assertEqual(response.json["data"], lot) + api_lot = response.json["data"] + if "auctionPeriod" in api_lot: + api_lot.pop("auctionPeriod") + self.assertEqual(api_lot, lot) response = self.app.get("/tenders/{}/lots/some_id".format(self.tender_id), status=404) self.assertEqual(response.status, "404 Not Found") @@ -569,7 +630,10 @@ def get_tender_lots(self): response = self.app.get("/tenders/{}/lots".format(self.tender_id)) self.assertEqual(response.status, "200 OK") self.assertEqual(response.content_type, "application/json") - self.assertEqual(response.json["data"][0], lot) + api_lot = response.json["data"][0] + if "auctionPeriod" in api_lot: + api_lot.pop("auctionPeriod") + self.assertEqual(api_lot, lot) response = self.app.get("/tenders/some_id/lots", status=404) self.assertEqual(response.status, "404 Not Found") diff --git a/src/openprocurement/tender/belowthreshold/tests/periods.py b/src/openprocurement/tender/belowthreshold/tests/periods.py new file mode 100644 index 0000000000..51c5326d47 --- /dev/null +++ b/src/openprocurement/tender/belowthreshold/tests/periods.py @@ -0,0 +1,102 @@ +from datetime import timedelta + +PERIODS = { + "active.enquiries": { + "start": { + "enquiryPeriod": { + "startDate": timedelta(), + "endDate": timedelta(days=7) + }, + "tenderPeriod": { + "startDate": timedelta(days=7), + "endDate": timedelta(days=14), + }, + }, + }, + "active.tendering": { + "start": { + "enquiryPeriod": { + "startDate": -timedelta(days=10), + "endDate": timedelta(), + }, + "tenderPeriod": { + "startDate": timedelta(), + "endDate": timedelta(days=7) + }, + } + }, + "active.auction": { + "start": { + "enquiryPeriod": { + "startDate": -timedelta(days=14), + "endDate": -timedelta(days=7), + }, + "tenderPeriod": { + "startDate": -timedelta(days=7), + "endDate": timedelta() + }, + "auctionPeriod": { + "startDate": timedelta() + }, + } + }, + "active.qualification": { + "start": { + "enquiryPeriod": { + "startDate": -timedelta(days=15), + "endDate": -timedelta(days=8), + }, + "tenderPeriod": { + "startDate": -timedelta(days=8), + "endDate": -timedelta(days=1), + }, + "auctionPeriod": { + "startDate": -timedelta(days=1), + "endDate": timedelta() + }, + "awardPeriod": { + "startDate": timedelta() + }, + } + }, + "active.awarded": { + "start": { + "enquiryPeriod": { + "startDate": -timedelta(days=15), + "endDate": -timedelta(days=8), + }, + "tenderPeriod": { + "startDate": -timedelta(days=8), + "endDate": -timedelta(days=1), + }, + "auctionPeriod": { + "startDate": -timedelta(days=1), + "endDate": timedelta() + }, + "awardPeriod": { + "startDate": timedelta(), + "endDate": timedelta() + }, + } + }, + "complete": { + "start": { + "enquiryPeriod": { + "startDate": -timedelta(days=25), + "endDate": -timedelta(days=18), + }, + "tenderPeriod": { + "startDate": -timedelta(days=18), + "endDate": -timedelta(days=11), + }, + "auctionPeriod": { + "startDate": -timedelta(days=11), + "endDate": -timedelta(days=10), + }, + "awardPeriod": { + "startDate": -timedelta(days=10), + "endDate": -timedelta(days=10), + }, + } + } +} diff --git a/src/openprocurement/tender/belowthreshold/tests/tender.py b/src/openprocurement/tender/belowthreshold/tests/tender.py index 9571f94b17..efb9e8fce2 100644 --- a/src/openprocurement/tender/belowthreshold/tests/tender.py +++ b/src/openprocurement/tender/belowthreshold/tests/tender.py @@ -51,6 +51,8 @@ tender_token_invalid, create_tender_central, create_tender_central_invalid, + tender_minimalstep_validation, + patch_tender_minimalstep_validation, ) @@ -106,6 +108,8 @@ class TenderResourceTest(BaseTenderWebTest, TenderResourceTestMixin): test_create_tender_with_inn_before = snitch(create_tender_with_inn_before) test_tender_milestones_required = snitch(tender_milestones_required) test_patch_tender_lots_none = snitch(patch_tender_lots_none) + test_tender_minimalstep_validation = snitch(tender_minimalstep_validation) + test_patch_tender_minimalstep_validation = snitch(patch_tender_minimalstep_validation) class TenderProcessTest(BaseTenderWebTest): diff --git a/src/openprocurement/tender/belowthreshold/tests/tender_blanks.py b/src/openprocurement/tender/belowthreshold/tests/tender_blanks.py index 37013dd368..a8101a202b 100644 --- a/src/openprocurement/tender/belowthreshold/tests/tender_blanks.py +++ b/src/openprocurement/tender/belowthreshold/tests/tender_blanks.py @@ -13,13 +13,12 @@ CPV_BLOCK_FROM, NOT_REQUIRED_ADDITIONAL_CLASSIFICATION_FROM, RELEASE_2020_04_19, + CPV_ITEMS_CLASS_FROM, ) -from openprocurement.tender.core.constants import CPV_ITEMS_CLASS_FROM from openprocurement.tender.core.tests.cancellation import ( activate_cancellation_after_2020_04_19, ) from openprocurement.tender.belowthreshold.models import Tender -from openprocurement.tender.belowthreshold.utils import calculate_tender_business_date from openprocurement.tender.belowthreshold.tests.base import ( test_organization, test_author, @@ -31,6 +30,8 @@ # TenderTest from openprocurement.tender.core.tests.base import change_auth +from openprocurement.tender.core.utils import calculate_tender_business_date +from openprocurement.tender.core.tests.criteria_utils import add_criteria def simple_add_tender(self): @@ -886,7 +887,7 @@ def validate_tenderPeriod(self): response.json["errors"], [ { - u"description": [u"the tenderPeriod cannot end earlier than 2 business days after the start"], + u"description": [u"tenderPeriod must be at least 2 full business days long"], u"location": u"body", u"name": u"tenderPeriod", } @@ -921,7 +922,7 @@ def validate_tenderPeriod(self): response.json["errors"], [ { - u"description": [u"the tenderPeriod cannot end earlier than 2 business days after the start"], + u"description": [u"tenderPeriod must be at least 2 full business days long"], u"location": u"body", u"name": u"tenderPeriod", } @@ -1096,7 +1097,7 @@ def create_tender_draft(self): response.json["errors"], [{u"description": u"Can't update tender in current (draft) status", u"location": u"body", u"name": u"data"}], ) - + add_criteria(self, tender["id"], token) response = self.app.patch_json( "/tenders/{}?acc_token={}".format(tender["id"], token), {"data": {"status": self.primary_tender_status}} ) @@ -2620,3 +2621,106 @@ def tender_token_invalid(self): self.assertEqual( response.json["errors"], [{u'description': u'Forbidden', u'location': u'url', u'name': u'permission'}] ) + + +def tender_minimalstep_validation(self): + data = deepcopy(self.initial_data) + data["minimalStep"]["amount"] = 35 + # invalid minimalStep validated on tender level + with mock.patch("openprocurement.tender.core.validation.MINIMAL_STEP_VALIDATION_FROM", + get_now() - timedelta(days=1)): + response = self.app.post_json("/tenders", {"data": data}, status=422) + self.assertEqual(response.status, "422 Unprocessable Entity") + self.assertEqual( + response.json["errors"], + [{u"description": [u"minimalstep must be between 0.5% and 3% of value (with 2 digits precision)."], + u"location": u"body", u"name": u"minimalStep"}], + ) + with mock.patch("openprocurement.tender.core.validation.MINIMAL_STEP_VALIDATION_FROM", + get_now() + timedelta(days=1)): + response = self.app.post_json("/tenders", {"data": data}, status=201) + self.assertEqual(response.status, "201 Created") + + # invalid minimalStep validated on lots level + test_lots_data = deepcopy(self.test_lots_data) + test_lots_data.append({ + "title": "invalid lot title", + "description": "invalid lot description", + "value": {"amount": 500}, + "minimalStep": {"amount": 35}, + }) + set_tender_lots(data, test_lots_data) + with mock.patch("openprocurement.tender.core.validation.MINIMAL_STEP_VALIDATION_FROM", + get_now() - timedelta(days=1)): + response = self.app.post_json("/tenders", {"data": data}, status=422) + self.assertEqual(response.json["status"], "error") + self.assertEqual( + response.json["errors"], + [{u'description': + [{u'minimalStep': [u'minimalstep must be between 0.5% and 3% of value (with 2 digits precision).']}], + u'location': u'body', u'name': u'lots'} + ] + ) + with mock.patch("openprocurement.tender.core.validation.MINIMAL_STEP_VALIDATION_FROM", + get_now() + timedelta(days=1)): + response = self.app.post_json("/tenders", {"data": data}, status=201) + self.assertEqual(response.status, "201 Created") + + # valid minimalStep on lots level + test_lots_data[1]["minimalStep"]["amount"] = 15 + set_tender_lots(data, test_lots_data) + with mock.patch("openprocurement.tender.core.validation.MINIMAL_STEP_VALIDATION_FROM", + get_now() - timedelta(days=1)): + response = self.app.post_json("/tenders", {"data": data}) + self.assertEqual(response.status, "201 Created") + self.assertEqual(response.json["data"]["value"]["amount"], 1000.0) + self.assertEqual(response.json["data"]["minimalStep"]["amount"], 15.0) + + +def patch_tender_minimalstep_validation(self): + data = deepcopy(self.initial_data) + lots = deepcopy(self.test_lots_data) + lots.append({ + "title": "invalid lot title", + "description": "invalid lot description", + "value": {"amount": 500}, + "minimalStep": {"amount": 15}, + }) + set_tender_lots(data, lots) + + # tender created before MINIMAL_STEP_VALIDATION_FROM + with mock.patch("openprocurement.tender.core.validation.MINIMAL_STEP_VALIDATION_FROM", + get_now() + timedelta(days=1)): + response = self.app.post_json("/tenders", {"data": data}) + self.tender_id = response.json["data"]["id"] + self.token_token = response.json["access"]["token"] + + lots[0]["minimalStep"]["amount"] = 123 + response = self.app.patch_json( + "/tenders/{}?acc_token={}".format(self.tender_id, self.token_token), {"data": {"lots": lots}}, status=200) + self.assertEqual(response.status, "200 OK") + + # tender created after MINIMAL_STEP_VALIDATION_FROM + with mock.patch("openprocurement.tender.core.validation.MINIMAL_STEP_VALIDATION_FROM", + get_now() - timedelta(days=1)): + response = self.app.post_json("/tenders", {"data": data}) + self.tender_id = response.json["data"]["id"] + self.token_token = response.json["access"]["token"] + + lots[0]["minimalStep"]["amount"] = 123 + response = self.app.patch_json( + "/tenders/{}?acc_token={}".format(self.tender_id, self.token_token), {"data": {"lots": lots}}, status=422) + self.assertEqual(response.status, "422 Unprocessable Entity") + self.assertEqual( + response.json["errors"], + [{u'description': + [{u'minimalStep': [u'minimalstep must be between 0.5% and 3% of value (with 2 digits precision).']}], + u'location': u'body', u'name': u'lots'} + ], + ) + + lots[0]["minimalStep"]["amount"] = 15 + response = self.app.patch_json( + "/tenders/{}?acc_token={}".format(self.tender_id, self.token_token), {"data": {"lots": lots}}, status=200) + self.assertEqual(response.status, "200 OK") + self.assertEqual(response.content_type, "application/json") diff --git a/src/openprocurement/tender/belowthreshold/tests/test_criteria.json b/src/openprocurement/tender/belowthreshold/tests/test_criteria.json new file mode 100644 index 0000000000..73c4c716fb --- /dev/null +++ b/src/openprocurement/tender/belowthreshold/tests/test_criteria.json @@ -0,0 +1,447 @@ +[ + { + "title": "Вчинення злочинів, учинених з корисливих мотивів", + "description": "Службова (посадова) особа учасника процедури закупівлі, яка підписала тендерну пропозицію (або уповноважена на підписання договору в разі переговорної процедури закупівлі) або фізична особа, яка є учасником процедури закупівлі, не була засуджена за злочин, учинений з корисливих мотивів (зокрема, пов'язаний з хабарництвом та відмиванням коштів), судимість з якої знято або погашено у встановленому законом порядку", + "source": "tenderer", + "classification": { + "scheme": " espd211", + "id": "CRITERION.EXCLUSION.CONVICTIONS.PARTICIPATION_IN_CRIMINAL_ORGANISATION" + }, + "relatesTo": "tenderer", + "legislation": [ + { + "version": "2020-04-19", + "identifier": { + "id": "922-VIII", + "legalName": "Закон України \"Про публічні закупівлі\"", + "uri": "https://zakon.rada.gov.ua/laws/show/922-19" + }, + "type": "NATIONAL_LEGISLATION", + "article": "17.1.5" + }, + { + "version": "2020-04-19", + "identifier": { + "id": "922-VIII", + "legalName": "Закон України \"Про публічні закупівлі\"", + "uri": "https://zakon.rada.gov.ua/laws/show/922-19" + }, + "type": "NATIONAL_LEGISLATION", + "article": "17.1.6" + } + ], + "requirementGroups": [ + { + "description": "Учасник фізична особа підтверджує, що", + "requirements": [ + { + "title": "Фізична особа, яка є учасником процедури закупівлі, не була засуджена за злочин, учинений з корисливих мотивів (зокрема, пов'язаний з хабарництвом та відмиванням коштів), судимість з якої знято або погашено у встановленому законом порядку", + "dataType": "boolean", + "expectedValue": "true", + "eligibleEvidences": [ + { + "title": "Документальне підтвердження", + "description": "Довідка в довільній формі", + "type": "document" + } + ] + } + ] + }, + { + "description": "Учасник юридична особа підтверджує, що", + "requirements": [ + { + "title": "Службова (посадова) особа учасника процедури закупівлі, яка підписала тендерну пропозицію (або уповноважена на підписання договору в разі переговорної процедури закупівлі), не була засуджена за злочин, вчинений з корисливих мотивів (зокрема, пов'язаний з хабарництвом, шахрайством та відмиванням коштів), судимість з якої знято або погашено у встановленому законом порядку", + "dataType": "boolean", + "expectedValue": "true" + } + ] + } + ] + }, + { + "title": "Вчинення економічних правопорушень", + "description": "Суб'єкт господарювання (учасник) протягом останніх трьох років не притягувався до відповідальності за порушення, передбачене пунктом 4 частини другої статті 6, пунктом 1 статті 50 Закону України \"Про захист економічної конкуренції\", у вигляді вчинення антиконкурентних узгоджених дій, що стосуються спотворення результатів тендерів", + "source": "tenderer", + "classification": { + "scheme": " espd211", + "id": "CRITERION.EXCLUSION.CONVICTIONS.FRAUD" + }, + "relatesTo": "tenderer", + "legislation": [ + { + "version": "2020-04-19", + "identifier": { + "id": "922-VIII", + "legalName": "Закон України \"Про публічні закупівлі\"", + "uri": "https://zakon.rada.gov.ua/laws/show/922-19" + }, + "type": "NATIONAL_LEGISLATION", + "article": "17.1.4" + }, + { + "version": "2020-02-13", + "identifier": { + "id": "2210-III", + "legalName": "Закон України \"Про захист економічної конкуренції\"", + "uri": "https://zakon.rada.gov.ua/laws/show/2210-14" + }, + "type": "NATIONAL_LEGISLATION", + "article": "6.2.4" + }, + { + "version": "2020-02-13", + "identifier": { + "id": "2210-III", + "legalName": "Закон України \"Про захист економічної конкуренції\"", + "uri": "https://zakon.rada.gov.ua/laws/show/2210-14" + }, + "type": "NATIONAL_LEGISLATION", + "article": "50.1" + } + ], + "requirementGroups": [ + { + "description": "Учасник підтверджує, що", + "requirements": [ + { + "title": "Суб'єкт господарювання (учасник) протягом останніх трьох років не притягувався до відповідальності за порушення, передбачене пунктом 4 частини другої статті 6, пунктом 1 статті 50 Закону України \"Про захист економічної конкуренції\", у вигляді вчинення антиконкурентних узгоджених дій, що стосуються спотворення результатів тендерів", + "dataType": "boolean", + "expectedValue": "true" + } + ] + } + ] + }, + { + "title": "Вчинення корупційних правопорушень", + "description": "Відомості про юридичну особу, яка є учасником процедури закупівлі, не внесено до Єдиного державного реєстру осіб, які вчинили корупційні або пов'язані з корупцією правопорушення. Службову (посадову) особу учасника процедури закупівлі, яку уповноважено учасником представляти його інтереси під час проведення процедури закупівлі, фізичну особу, яка є учасником, не було притягнуто згідно із законом до відповідальності за вчинення корупційного правопорушення або правопорушення, пов'язаного з корупцією", + "source": "tenderer", + "classification": { + "scheme": " espd211", + "id": "CRITERION.EXCLUSION.CONVICTIONS.CORRUPTION" + }, + "relatesTo": "tenderer", + "legislation": [ + { + "version": "2020-04-19", + "identifier": { + "id": "922-VIII", + "legalName": "Закон України \"Про публічні закупівлі\"", + "uri": "https://zakon.rada.gov.ua/laws/show/922-19" + }, + "type": "NATIONAL_LEGISLATION", + "article": "17.1.2" + }, + { + "version": "2020-04-19", + "identifier": { + "id": "922-VIII", + "legalName": "Закон України \"Про публічні закупівлі\"", + "uri": "https://zakon.rada.gov.ua/laws/show/922-19" + }, + "type": "NATIONAL_LEGISLATION", + "article": "17.1.3" + } + ], + "requirementGroups": [ + { + "description": "Учасник підтверджує, що", + "requirements": [ + { + "title": "Відомості про юридичну особу, яка є учасником процедури закупівлі, не внесено до Єдиного державного реєстру осіб, які вчинили корупційні або пов'язані з корупцією правопорушення", + "dataType": "boolean", + "expectedValue": "true" + }, + { + "title": "Службову (посадову) особу учасника процедури закупівлі, яку уповноважено учасником представляти його інтереси під час проведення процедури закупівлі, фізичну особу, яка є учасником, не було притягнуто згідно із законом до відповідальності за вчинення корупційного правопорушення або правопорушення, пов'язаного з корупцією", + "dataType": "boolean", + "expectedValue": "true" + } + ] + } + ] + }, + { + "title": "Вчинення правопорушень, пов'язаних з використанням дитячої праці чи будь-якими формами торгівлі людьми", + "description": "Службова (посадова) особа учасника процедури закупівлі, яку уповноважено учасником представляти його інтереси під час проведення процедури закупівлі, фізичну особу, яка є учасником, не було притягнуто згідно із законом до відповідальності за вчинення правопорушення, пов'язаного з використанням дитячої праці чи будь-якими формами торгівлі людьми", + "source": "tenderer", + "classification": { + "scheme": " espd211", + "id": "CRITERION.EXCLUSION.CONVICTIONS.CHILD_LABOUR-HUMAN_TRAFFICKING" + }, + "relatesTo": "tenderer", + "legislation": [ + { + "version": "2020-04-19", + "identifier": { + "id": "922-VIII", + "legalName": "Закон України \"Про публічні закупівлі\"", + "uri": "https://zakon.rada.gov.ua/laws/show/922-19" + }, + "type": "NATIONAL_LEGISLATION", + "article": "17.1.12" + } + ], + "requirementGroups": [ + { + "description": "Учасник підтверджує, що", + "requirements":[ + { + "title": "Службова (посадова) особа учасника процедури закупівлі, яку уповноважено учасником представляти його інтереси під час проведення процедури закупівлі, фізичну особу, яка є учасником, не було притягнуто згідно із законом до відповідальності за вчинення правопорушення, пов'язаного з використанням дитячої праці чи будь-якими формами торгівлі людьми", + "dataType": "boolean", + "expectedValue": "true" + } + ] + } + ] + }, + { + "title": "Заборгованість зі сплати податків і зборів (обов'язкових платежів)", + "description": "Учасник процедури закупівлі не має заборгованості зі сплати податків і зборів (обов'язкових платежів)", + "source": "tenderer", + "classification": { + "scheme": " espd211", + "id": "CRITERION.EXCLUSION.CONTRIBUTIONS.PAYMENT_OF_TAXES" + }, + "relatesTo": "tenderer", + "legislation": [ + { + "version": "2020-04-19", + "identifier": { + "id": "922-VIII", + "legalName": "Закон України \"Про публічні закупівлі\"", + "uri": "https://zakon.rada.gov.ua/laws/show/922-19" + }, + "type": "NATIONAL_LEGISLATION", + "article": "17.1.13" + } + ], + "requirementGroups": [ + { + "description": "Учасник підтверджує, що", + "requirements": [ + { + "title": "Він не має заборгованості зі сплати податків і зборів (обов'язкових платежів)", + "dataType": "boolean", + "expectedValue": "true" + } + ] + }, + { + "description": "Учасник підтверджує, що", + "requirements": [ + { + "title": "Він має заборгованість зі сплати податків і зборів (обов'язкових платежів)", + "dataType": "boolean", + "expectedValue": "true" + }, + { + "title": "Сума існуючої заборгованості", + "dataType": "number" + }, + { + "title": "Характер існуючої заборгованості", + "dataType": "string" + }, + { + "title": "Причина виникнення існуючої заборгованості", + "dataType": "string" + }, + { + "title": "Учасник здійснив заходи щодо розстрочення і відстрочення такої заборгованості у порядку та на умовах, визначених законодавством країни реєстрації такого учасника", + "dataType": "boolean", + "expectedValue": "true" + } + ] + } + ] + }, + { + "title": "Порушення справ про банкрутство", + "description": "Учасник процедури закупівлі не визнаний у встановленому законом порядку банкрутом та стосовно нього не відкрита ліквідаційна процедура", + "source": "tenderer", + "classification": { + "scheme": " espd211", + "id": "CRITERION.EXCLUSION.BUSINESS.BANKRUPTCY" + }, + "relatesTo": "tenderer", + "legislation": [ + { + "version": "2020-04-19", + "identifier": { + "id": "922-VIII", + "legalName": "Закон України \"Про публічні закупівлі\"", + "uri": "https://zakon.rada.gov.ua/laws/show/922-19" + }, + "type": "NATIONAL_LEGISLATION", + "article": "17.1.8" + } + ], + "requirementGroups": [ + { + "description": "Учасник підтверджує, що", + "requirements": [ + { + "title": "Учасник процедури закупівлі не визнаний у встановленому законом порядку банкрутом та стосовно нього не відкрита ліквідаційна процедура", + "dataType": "boolean", + "expectedValue": "true" + } + ] + } + ] + }, + { + "title": "Виявлення факту зв'язку учасника з іншими учасниками процедури або замовником", + "description": "Тендерна пропозиція подана учасником конкурентної процедури закупівлі або участь у переговорній процедурі бере учасник, який є пов'язаною особою з іншими учасниками процедури закупівлі та/або з уповноваженою особою (особами), та/або з керівником замовника", + "source": "procuringEntity", + "classification": { + "scheme": " espd211", + "id": "CRITERION.EXCLUSION.MISCONDUCT.MARKET_DISTORTION" + }, + "relatesTo": "tenderer", + "legislation": [ + { + "version": "2020-04-19", + "identifier": { + "id": "922-VIII", + "legalName": "Закон України \"Про публічні закупівлі\"", + "uri": "https://zakon.rada.gov.ua/laws/show/922-19" + }, + "type": "NATIONAL_LEGISLATION", + "article": "17.1.7" + } + ], + "requirementGroups": [ + { + "description": "Замовник підтверджує, що", + "requirements": [ + { + "title": "Тендерна пропозиція подана учасником конкурентної процедури закупівлі або участь у переговорній процедурі бере учасник, який є пов'язаною особою з іншими учасниками процедури закупівлі та/або з уповноваженою особою (особами), та/або з керівником замовника", + "dataType": "boolean" + } + ] + } + ] + }, + { + "title": "Виявлення факту наміру впливу на прийняття рішення замовника", + "description": "Замовник має незаперечні докази того, що учасник процедури закупівлі пропонує, дає або погоджується дати прямо чи опосередковано будь-якій службовій (посадовій) особі замовника, іншого державного органу винагороду в будь-якій формі (пропозиція щодо найму на роботу, цінна річ, послуга тощо) з метою вплинути на прийняття рішення щодо визначення переможця процедури закупівлі або застосування замовником певної процедури закупівлі", + "source": "procuringEntity", + "classification": { + "scheme": " espd211", + "id": "CRITERION.EXCLUSION.CONFLICT_OF_INTEREST.MISINTERPRETATION" + }, + "relatesTo": "tenderer", + "legislation": [ + { + "version": "2020-04-19", + "identifier": { + "id": "922-VIII", + "legalName": "Закон України \"Про публічні закупівлі\"", + "uri": "https://zakon.rada.gov.ua/laws/show/922-19" + }, + "type": "NATIONAL_LEGISLATION", + "article": "17.1.1" + } + ], + "requirementGroups": [ + { + "description": "Замовник підтверджує, що", + "requirements": [ + { + "title": "Замовник має незаперечні докази того, що учасник процедури закупівлі пропонує, дає або погоджується дати прямо чи опосередковано будь-якій службовій (посадовій) особі замовника, іншого державного органу винагороду в будь-якій формі (пропозиція щодо найму на роботу, цінна річ, послуга тощо) з метою вплинути на прийняття рішення щодо визначення переможця процедури закупівлі або застосування замовником певної процедури закупівлі", + "dataType": "boolean" + } + ] + } + ] + }, + { + "title": "Наявність інших підстав для відмови в участі у процедурі закупівлі", + "description": "У Єдиному державному реєстрі юридичних осіб, фізичних осіб - підприємців та громадських формувань присутня інформація, передбачена пунктом 9 частини другої статті 9 Закону України \"Про державну реєстрацію юридичних осіб, фізичних осіб - підприємців та громадських формувань\" (крім нерезидентів)", + "source": "tenderer", + "classification": { + "scheme": " espd211", + "id": "CRITERION.EXCLUSION.NATIONAL.OTHER" + }, + "relatesTo": "tenderer", + "legislation": [ + { + "version": "2020-04-19", + "identifier": { + "id": "922-VIII", + "legalName": "Закон України \"Про публічні закупівлі\"", + "uri": "https://zakon.rada.gov.ua/laws/show/922-19" + }, + "type": "NATIONAL_LEGISLATION", + "article": "17.1.9" + }, + { + "version": "2020-03-16", + "identifier": { + "id": "755-IV", + "legalName": "Закон України \"Про державну реєстрацію юридичних осіб, фізичних осіб - підприємців та громадських формувань\"", + "uri": "https://zakon.rada.gov.ua/laws/show/755-15" + }, + "type": "NATIONAL_LEGISLATION", + "article": "9.2.9" + }, + { + "version": "2020-04-19", + "identifier": { + "id": "922-VIII", + "legalName": "Закон України \"Про публічні закупівлі\"", + "uri": "https://zakon.rada.gov.ua/laws/show/922-19" + }, + "type": "NATIONAL_LEGISLATION", + "article": "17.1.10" + }, + { + "version": "2020-04-19", + "identifier": { + "id": "922-VIII", + "legalName": "Закон України \"Про публічні закупівлі\"", + "uri": "https://zakon.rada.gov.ua/laws/show/922-19" + }, + "type": "NATIONAL_LEGISLATION", + "article": "17.1.11" + }, + { + "version": "2020-04-19", + "identifier": { + "id": "1644-VII", + "legalName": "Закон України \"Про санкції\"", + "uri": "https://zakon.rada.gov.ua/laws/show/1644-18" + }, + "type": "NATIONAL_LEGISLATION" + } + ], + "requirementGroups": [ + { + "description": "Учасник підтверджує, що", + "requirements": [ + { + "title": "У Єдиному державному реєстрі юридичних осіб, фізичних осіб - підприємців та громадських формувань присутня інформація, передбачена пунктом 9 частини другої статті 9 Закону України \"Про державну реєстрацію юридичних осіб, фізичних осіб - підприємців та громадських формувань\" (крім нерезидентів)", + "dataType": "boolean", + "expectedValue": "true" + }, + { + "title": "Юридична особа, яка є учасником процедури закупівлі (крім нерезидентів), має антикорупційну програму чи уповноваженого з реалізації антикорупційної програми, якщо вартість закупівлі товару (товарів), послуги (послуг) або робіт дорівнює чи перевищує 20 мільйонів гривень (у тому числі за лотом)", + "dataType": "boolean", + "expectedValue": "true" + }, + { + "title": "Учасник процедури закупівлі не є особою, до якої застосовано санкцію у вигляді заборони на здійснення у неї публічних закупівель товарів, робіт і послуг згідно із Законом України \"Про санкції\"", + "dataType": "boolean", + "expectedValue": "true" + } + ] + } + ] + } +] + + + diff --git a/src/openprocurement/tender/belowthreshold/utils.py b/src/openprocurement/tender/belowthreshold/utils.py index 867f90b463..000f749c2e 100644 --- a/src/openprocurement/tender/belowthreshold/utils.py +++ b/src/openprocurement/tender/belowthreshold/utils.py @@ -3,10 +3,13 @@ from logging import getLogger from openprocurement.api.constants import TZ, RELEASE_2020_04_19 from openprocurement.api.utils import get_now, context_unpack +from openprocurement.tender.core.constants import COMPLAINT_STAND_STILL_TIME from openprocurement.tender.core.utils import ( calculate_tender_business_date, cleanup_bids_for_cancelled_lots, remove_draft_bids, + calculate_tender_date, + check_skip_award_complaint_period, ) from openprocurement.tender.core.constants import COMPLAINT_STAND_STILL_TIME from openprocurement.tender.core.utils import ( @@ -48,7 +51,6 @@ def check_bids(request): if tender.numberOfBids == 0: tender.status = "unsuccessful" if tender.numberOfBids == 1: - # tender.status = 'active.qualification' add_next_award(request) check_ignored_claim(tender) @@ -56,11 +58,10 @@ def check_bids(request): def check_complaint_status(request, complaint, now=None): if not now: now = get_now() - if ( - complaint.status == "answered" - and calculate_tender_business_date(complaint.dateAnswered, COMPLAINT_STAND_STILL_TIME, request.tender) < now - ): - complaint.status = complaint.resolutionType + if complaint.status == "answered": + date = calculate_tender_date(complaint.dateAnswered, COMPLAINT_STAND_STILL_TIME, request.tender) + if date < now: + complaint.status = complaint.resolutionType elif complaint.status == "pending" and complaint.resolutionType and complaint.dateEscalated: complaint.status = complaint.resolutionType elif complaint.status == "pending": @@ -213,8 +214,17 @@ def check_tender_status(request): pending_awards_complaints = any( [i.status in tender.block_complaint_status for a in lot_awards for i in a.complaints] ) - stand_still_end = max([(a.complaintPeriod and a.complaintPeriod.endDate) or now for a in lot_awards]) - if pending_complaints or pending_awards_complaints or not stand_still_end <= now: + stand_still_end = max([ + a.complaintPeriod.endDate + if a.complaintPeriod and a.complaintPeriod.endDate else now + for a in lot_awards + ]) + skip_award_complaint_period = check_skip_award_complaint_period(tender) + if ( + pending_complaints + or pending_awards_complaints + or (not stand_still_end <= now and not skip_award_complaint_period) + ): continue elif last_award.status == "unsuccessful": LOGGER.info( diff --git a/src/openprocurement/tender/belowthreshold/validation.py b/src/openprocurement/tender/belowthreshold/validation.py index d6f3fe8d5a..1fed22aa8e 100644 --- a/src/openprocurement/tender/belowthreshold/validation.py +++ b/src/openprocurement/tender/belowthreshold/validation.py @@ -1,6 +1,12 @@ # -*- coding: utf-8 -*- from openprocurement.api.utils import error_handler, raise_operation_error from openprocurement.api.validation import OPERATIONS +from openprocurement.tender.core.validation import ( + RELEASE_ECRITERIA_ARTICLE_17, + validate_tender_first_revision_date, + base_validate_operation_ecriteria_objects, +) + # tender documents @@ -164,3 +170,8 @@ def validate_award_document(request): request.errors.add("url", "role", "Can update document only author") request.errors.status = 403 raise error_handler(request.errors) + + +def validate_operation_ecriteria_objects(request): + valid_statuses = ["draft", "active.enquiries"] + base_validate_operation_ecriteria_objects(request, valid_statuses) diff --git a/src/openprocurement/tender/belowthreshold/views/award.py b/src/openprocurement/tender/belowthreshold/views/award.py index 8a9ec8674e..7b28ef94b4 100644 --- a/src/openprocurement/tender/belowthreshold/views/award.py +++ b/src/openprocurement/tender/belowthreshold/views/award.py @@ -355,7 +355,8 @@ def patch(self): for i in tender.awards[tender.awards.index(award):]: if i.lotID != award.lotID: continue - i.complaintPeriod.endDate = now + if i.complaintPeriod and (not i.complaintPeriod.endDate or i.complaintPeriod.endDate > now): + i.complaintPeriod.endDate = now i.status = "cancelled" for j in i.complaints: if j.status not in ["invalid", "resolved", "declined"]: diff --git a/src/openprocurement/tender/belowthreshold/views/award_document.py b/src/openprocurement/tender/belowthreshold/views/award_document.py index 50e1931449..0230a28907 100644 --- a/src/openprocurement/tender/belowthreshold/views/award_document.py +++ b/src/openprocurement/tender/belowthreshold/views/award_document.py @@ -3,7 +3,11 @@ from openprocurement.api.validation import validate_file_update, validate_file_upload, validate_patch_document_data from openprocurement.tender.core.utils import optendersresource from openprocurement.tender.core.views.document import BaseDocumentResource -from openprocurement.tender.belowthreshold.validation import validate_award_document +from openprocurement.tender.core.validation import ( + validate_award_document_tender_not_in_allowed_status_base, + validate_award_document_lot_not_in_allowed_status, + validate_award_document_author, +) @optendersresource( @@ -20,7 +24,14 @@ class TenderAwardDocumentResource(BaseDocumentResource): def collection_get(self): return super(TenderAwardDocumentResource, self).collection_get() - @json_view(validators=(validate_file_upload, validate_award_document), permission="upload_tender_documents") + @json_view( + validators=( + validate_file_upload, + validate_award_document_tender_not_in_allowed_status_base, + validate_award_document_lot_not_in_allowed_status, + validate_award_document_author + ), + permission="upload_tender_documents") def collection_post(self): return super(TenderAwardDocumentResource, self).collection_post() @@ -28,13 +39,25 @@ def collection_post(self): def get(self): return super(TenderAwardDocumentResource, self).get() - @json_view(validators=(validate_file_update, validate_award_document), permission="edit_tender") + @json_view( + validators=( + validate_file_update, + validate_award_document_tender_not_in_allowed_status_base, + validate_award_document_lot_not_in_allowed_status, + validate_award_document_author + ), + permission="edit_tender") def put(self): return super(TenderAwardDocumentResource, self).put() @json_view( content_type="application/json", - validators=(validate_patch_document_data, validate_award_document), + validators=( + validate_patch_document_data, + validate_award_document_tender_not_in_allowed_status_base, + validate_award_document_lot_not_in_allowed_status, + validate_award_document_author + ), permission="edit_tender", ) def patch(self): diff --git a/src/openprocurement/tender/belowthreshold/views/award_rr.py b/src/openprocurement/tender/belowthreshold/views/award_rr.py new file mode 100644 index 0000000000..b4a2486acf --- /dev/null +++ b/src/openprocurement/tender/belowthreshold/views/award_rr.py @@ -0,0 +1,14 @@ +# -*- coding: utf-8 -*- +from openprocurement.tender.core.views.award_rr import BaseAwardRequirementResponseResource +from openprocurement.tender.core.utils import optendersresource + + +@optendersresource( + name="belowThreshold:Award Requirement Response", + collection_path="/tenders/{tender_id}/awards/{award_id}/requirement_responses", + path="/tenders/{tender_id}/awards/{award_id}/requirement_responses/{requirement_response_id}", + procurementMethodType="belowThreshold", + description="Tender award requirement responses", +) +class AwardRequirementResponseResource(BaseAwardRequirementResponseResource): + pass diff --git a/src/openprocurement/tender/belowthreshold/views/award_rr_evidence.py b/src/openprocurement/tender/belowthreshold/views/award_rr_evidence.py new file mode 100644 index 0000000000..d76e1901b3 --- /dev/null +++ b/src/openprocurement/tender/belowthreshold/views/award_rr_evidence.py @@ -0,0 +1,16 @@ +# -*- coding: utf-8 -*- +from openprocurement.tender.core.views.award_rr_evidence import BaseAwardRequirementResponseEvidenceResource +from openprocurement.tender.core.utils import optendersresource + + +@optendersresource( + name="belowThreshold:Award Requirement Response Evidence", + collection_path="/tenders/{tender_id}/awards/{award_id}/requirement_responses/{requirement_response_id}/evidences", + path="/tenders/{tender_id}/awards/{award_id}/requirement_responses/{requirement_response_id}/evidences/{evidence_id}", + procurementMethodType="belowThreshold", + description="Tender award evidences", +) +class AwardRequirementResponseEvidenceResource( + BaseAwardRequirementResponseEvidenceResource +): + pass diff --git a/src/openprocurement/tender/belowthreshold/views/bid.py b/src/openprocurement/tender/belowthreshold/views/bid.py index 2fdda1ae55..dd17dba6c9 100644 --- a/src/openprocurement/tender/belowthreshold/views/bid.py +++ b/src/openprocurement/tender/belowthreshold/views/bid.py @@ -6,6 +6,7 @@ validate_patch_bid_data, validate_bid_operation_period, validate_bid_operation_not_in_tendering, + validate_bid_activate_criteria, ) from openprocurement.tender.belowthreshold.validation import validate_view_bids, validate_update_bid_status @@ -24,7 +25,11 @@ class TenderBidResource(APIResource): @json_view( content_type="application/json", permission="create_bid", - validators=(validate_bid_data, validate_bid_operation_not_in_tendering, validate_bid_operation_period), + validators=( + validate_bid_operation_not_in_tendering, + validate_bid_data, + validate_bid_operation_period + ), ) def collection_post(self): """Registration of new bid proposal @@ -204,6 +209,7 @@ def get(self): validate_bid_operation_not_in_tendering, validate_bid_operation_period, validate_update_bid_status, + validate_bid_activate_criteria, ), ) def patch(self): diff --git a/src/openprocurement/tender/belowthreshold/views/bid_rr.py b/src/openprocurement/tender/belowthreshold/views/bid_rr.py new file mode 100644 index 0000000000..65d5aafac7 --- /dev/null +++ b/src/openprocurement/tender/belowthreshold/views/bid_rr.py @@ -0,0 +1,14 @@ +# -*- coding: utf-8 -*- +from openprocurement.tender.core.views.bid_rr import BaseBidRequirementResponseResource +from openprocurement.tender.core.utils import optendersresource + + +@optendersresource( + name="belowThreshold:Bid Requirement Response", + collection_path="/tenders/{tender_id}/bids/{bid_id}/requirement_responses", + path="/tenders/{tender_id}/bids/{bid_id}/requirement_responses/{requirement_response_id}", + procurementMethodType="belowThreshold", + description="Tender bidder requirement responses", +) +class BidRequirementResponseResource(BaseBidRequirementResponseResource): + pass diff --git a/src/openprocurement/tender/belowthreshold/views/bid_rr_evidence.py b/src/openprocurement/tender/belowthreshold/views/bid_rr_evidence.py new file mode 100644 index 0000000000..33060b9c51 --- /dev/null +++ b/src/openprocurement/tender/belowthreshold/views/bid_rr_evidence.py @@ -0,0 +1,16 @@ +# -*- coding: utf-8 -*- +from openprocurement.tender.core.views.bid_rr_evidence import BaseBidRequirementResponseEvidenceResource +from openprocurement.tender.core.utils import optendersresource + + +@optendersresource( + name="belowThreshold:Bid Requirement Response Evidence", + collection_path="/tenders/{tender_id}/bids/{bid_id}/requirement_responses/{requirement_response_id}/evidences", + path="/tenders/{tender_id}/bids/{bid_id}/requirement_responses/{requirement_response_id}/evidences/{evidence_id}", + procurementMethodType="belowThreshold", + description="Tender bidder evidences", +) +class BidRequirementResponseEvidenceResource( + BaseBidRequirementResponseEvidenceResource +): + pass diff --git a/src/openprocurement/tender/belowthreshold/views/criterion.py b/src/openprocurement/tender/belowthreshold/views/criterion.py new file mode 100644 index 0000000000..593ebf9898 --- /dev/null +++ b/src/openprocurement/tender/belowthreshold/views/criterion.py @@ -0,0 +1,37 @@ +# -*- coding: utf-8 -*- +from openprocurement.tender.core.utils import optendersresource +from openprocurement.tender.core.views.criterion import BaseTenderCriteriaResource +from openprocurement.tender.core.validation import validate_criterion_data, validate_patch_criterion_data +from openprocurement.tender.belowthreshold.validation import validate_operation_ecriteria_objects +from openprocurement.api.utils import json_view + + +@optendersresource( + name="belowThreshold:Tender Criteria", + collection_path="/tenders/{tender_id}/criteria", + path="/tenders/{tender_id}/criteria/{criterion_id}", + procurementMethodType="belowThreshold", + description="Tender criteria", +) +class TenderCriteriaResource(BaseTenderCriteriaResource): + @json_view( + content_type="application/json", + validators=( + validate_operation_ecriteria_objects, + validate_criterion_data, + ), + permission="edit_tender" + ) + def collection_post(self): + return super(TenderCriteriaResource, self).collection_post() + + @json_view( + content_type="application/json", + validators=( + validate_operation_ecriteria_objects, + validate_patch_criterion_data, + ), + permission="edit_tender" + ) + def patch(self): + return super(TenderCriteriaResource, self).patch() diff --git a/src/openprocurement/tender/belowthreshold/views/criterion_rg.py b/src/openprocurement/tender/belowthreshold/views/criterion_rg.py new file mode 100644 index 0000000000..208cf9911e --- /dev/null +++ b/src/openprocurement/tender/belowthreshold/views/criterion_rg.py @@ -0,0 +1,40 @@ +# -*- coding: utf-8 -*- +from openprocurement.tender.core.utils import optendersresource +from openprocurement.tender.core.views.criterion_rg import BaseTenderCriteriaRGResource +from openprocurement.tender.core.validation import ( + validate_requirement_group_data, + validate_patch_requirement_group_data, +) +from openprocurement.tender.belowthreshold.validation import validate_operation_ecriteria_objects +from openprocurement.api.utils import json_view + + +@optendersresource( + name="belowThreshold:Criteria Requirement Group", + collection_path="/tenders/{tender_id}/criteria/{criterion_id}/requirement_groups", + path="/tenders/{tender_id}/criteria/{criterion_id}/requirement_groups/{requirement_group_id}", + procurementMethodType="belowThreshold", + description="Tender criteria requirement group", +) +class TenderCriteriaRGResource(BaseTenderCriteriaRGResource): + @json_view( + content_type="application/json", + validators=( + validate_operation_ecriteria_objects, + validate_requirement_group_data, + ), + permission="edit_tender" + ) + def collection_post(self): + return super(TenderCriteriaRGResource, self).collection_post() + + @json_view( + content_type="application/json", + validators=( + validate_operation_ecriteria_objects, + validate_patch_requirement_group_data, + ), + permission="edit_tender" + ) + def patch(self): + return super(TenderCriteriaRGResource, self).patch() diff --git a/src/openprocurement/tender/belowthreshold/views/criterion_rg_requirement.py b/src/openprocurement/tender/belowthreshold/views/criterion_rg_requirement.py new file mode 100644 index 0000000000..90ca633d97 --- /dev/null +++ b/src/openprocurement/tender/belowthreshold/views/criterion_rg_requirement.py @@ -0,0 +1,43 @@ +# -*- coding: utf-8 -*- +from openprocurement.tender.core.utils import optendersresource +from openprocurement.tender.core.views.criterion_rg_requirement import BaseTenderCriteriaRGRequirementResource +from openprocurement.tender.core.validation import ( + validate_requirement_data, + validate_patch_requirement_data +) +from openprocurement.tender.belowthreshold.validation import validate_operation_ecriteria_objects +from openprocurement.api.utils import json_view + + +@optendersresource( + name="belowThreshold:Requirement Group Requirement", + collection_path="/tenders/{tender_id}/criteria/{criterion_id}/" + "requirement_groups/{requirement_group_id}/requirements", + path="/tenders/{tender_id}/criteria/{criterion_id}/" + "requirement_groups/{requirement_group_id}/requirements/{requirement_id}", + procurementMethodType="belowThreshold", + description="Tender requirement group requirement", +) +class TenderCriteriaRGRequirementResource(BaseTenderCriteriaRGRequirementResource): + @json_view( + content_type="application/json", + validators=( + validate_operation_ecriteria_objects, + validate_requirement_data, + ), + permission="edit_tender" + ) + def collection_post(self): + return super(TenderCriteriaRGRequirementResource, self).collection_post() + + @json_view( + content_type="application/json", + validators=( + validate_operation_ecriteria_objects, + validate_patch_requirement_data, + ), + permission="edit_tender" + ) + def patch(self): + return super(TenderCriteriaRGRequirementResource, self).patch() + diff --git a/src/openprocurement/tender/belowthreshold/views/criterion_rg_requirement_evidence.py b/src/openprocurement/tender/belowthreshold/views/criterion_rg_requirement_evidence.py new file mode 100644 index 0000000000..f192a4afaf --- /dev/null +++ b/src/openprocurement/tender/belowthreshold/views/criterion_rg_requirement_evidence.py @@ -0,0 +1,52 @@ +# -*- coding: utf-8 -*- +from openprocurement.tender.core.utils import optendersresource +from openprocurement.tender.core.views.criterion_rg_requirement_evidence import ( + BaseTenderCriteriaRGRequirementEvidenceResource, +) +from openprocurement.tender.core.validation import ( + validate_eligible_evidence_data, + validate_patch_eligible_evidence_data, +) +from openprocurement.tender.belowthreshold.validation import validate_operation_ecriteria_objects +from openprocurement.api.utils import json_view + + +@optendersresource( + name="belowThreshold:Requirement Eligible Evidence", + collection_path="/tenders/{tender_id}/criteria/{criterion_id}/" + "requirement_groups/{requirement_group_id}/requirements/{requirement_id}/evidences", + path="/tenders/{tender_id}/criteria/{criterion_id}/" + "requirement_groups/{requirement_group_id}/requirements/{requirement_id}/evidences/{evidence_id}", + procurementMethodType="belowThreshold", + description="Tender requirement evidence", +) +class TenderCriteriaRGRequirementEvidenceResource(BaseTenderCriteriaRGRequirementEvidenceResource): + @json_view( + content_type="application/json", + validators=( + validate_operation_ecriteria_objects, + validate_eligible_evidence_data, + ), + permission="edit_tender" + ) + def collection_post(self): + return super(TenderCriteriaRGRequirementEvidenceResource, self).collection_post() + + @json_view( + content_type="application/json", + validators=( + validate_operation_ecriteria_objects, + validate_patch_eligible_evidence_data, + ), + permission="edit_tender" + ) + def patch(self): + return super(TenderCriteriaRGRequirementEvidenceResource, self).patch() + + @json_view( + validators=(validate_operation_ecriteria_objects,), + permission="edit_tender" + ) + def delete(self): + return super(TenderCriteriaRGRequirementEvidenceResource, self).delete() + diff --git a/src/openprocurement/tender/cfaselectionua/adapters/serializable/next_check.py b/src/openprocurement/tender/cfaselectionua/adapters/serializable/next_check.py index 83fe2d792e..c3372d97d7 100644 --- a/src/openprocurement/tender/cfaselectionua/adapters/serializable/next_check.py +++ b/src/openprocurement/tender/cfaselectionua/adapters/serializable/next_check.py @@ -10,7 +10,7 @@ class SerializableTenderNextCheck(Serializable): serialized_name = "next_check" serialize_when_none = False - def __call__(self, obj): + def __call__(self, obj, *args, **kwargs): now = get_now() checks = [] configurator = getAdapter(obj, IContentConfigurator) @@ -27,10 +27,12 @@ def __call__(self, obj): ): if now < obj.auctionPeriod.startDate: checks.append(obj.auctionPeriod.startDate.astimezone(configurator.tz)) - elif now < calc_auction_end_time(obj.numberOfBids, obj.auctionPeriod.startDate).astimezone(configurator.tz): - checks.append( - calc_auction_end_time(obj.numberOfBids, obj.auctionPeriod.startDate).astimezone(configurator.tz) - ) + else: + auction_end_time = calc_auction_end_time( + obj.numberOfBids, obj.auctionPeriod.startDate + ).astimezone(configurator.tz) + if now < auction_end_time: + checks.append(auction_end_time) elif obj.lots and obj.status == "active.auction": for lot in obj.lots: if ( @@ -42,12 +44,12 @@ def __call__(self, obj): continue if now < lot.auctionPeriod.startDate: checks.append(lot.auctionPeriod.startDate.astimezone(configurator.tz)) - elif now < calc_auction_end_time(lot.numberOfBids, lot.auctionPeriod.startDate).astimezone( - configurator.tz - ): - checks.append( - calc_auction_end_time(lot.numberOfBids, lot.auctionPeriod.startDate).astimezone(configurator.tz) - ) + else: + auction_end_time = calc_auction_end_time( + lot.numberOfBids, lot.auctionPeriod.startDate + ).astimezone(configurator.tz) + if now < auction_end_time: + checks.append(auction_end_time) elif obj.lots and obj.status in ["active.qualification", "active.awarded"]: for lot in obj.lots: if lot["status"] != "active": diff --git a/src/openprocurement/tender/cfaselectionua/adapters/validators/tenderperiod.py b/src/openprocurement/tender/cfaselectionua/adapters/validators/tenderperiod.py index 68bac3ddbe..b3b57aa782 100644 --- a/src/openprocurement/tender/cfaselectionua/adapters/validators/tenderperiod.py +++ b/src/openprocurement/tender/cfaselectionua/adapters/validators/tenderperiod.py @@ -1,5 +1,8 @@ from schematics.exceptions import ValidationError +from openprocurement.tender.cfaselectionua.constants import TENDERING_DURATION +from openprocurement.tender.openua.validation import validate_tender_period_duration + class TenderPeriodValidate(object): def __init__(self, tender): @@ -14,3 +17,9 @@ def __call__(self, cls, data, period): and period.startDate < data.get("enquiryPeriod").endDate ): raise ValidationError(u"period should begin after enquiryPeriod") + if ( + period + and period.startDate + and period.endDate + ): + validate_tender_period_duration(data, period, TENDERING_DURATION) diff --git a/src/openprocurement/tender/cfaselectionua/models/submodels/Award.csv b/src/openprocurement/tender/cfaselectionua/models/submodels/Award.csv index bd2fd2f9cc..ffdacfa482 100644 --- a/src/openprocurement/tender/cfaselectionua/models/submodels/Award.csv +++ b/src/openprocurement/tender/cfaselectionua/models/submodels/Award.csv @@ -1,7 +1,7 @@ -rolename,status,documents,description,title,items,suppliers,title_en,bid_id,description_en,subcontractingDetails,lotID,qualified,value,title_ru,date,description_ru,id,__parent__ +rolename,status,documents,description,title,items,suppliers,title_en,bid_id,description_en,subcontractingDetails,lotID,qualified,value,title_ru,date,description_ru, requirementResponses,id,__parent__ Administrator,,,,,,,,,,,,,,,,,, -embedded,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -edit,1,,1,1,,,1,,1,,,,,1,,1,, -create,,,1,1,1,1,1,1,1,1,1,1,1,1,,1,,1 -default,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -view,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +embedded,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +edit,1,,1,1,,,1,,1,,,,,1,,1,,, +create,,,1,1,1,1,1,1,1,1,1,1,1,1,,1,,,1, +default,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +view,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, diff --git a/src/openprocurement/tender/cfaselectionua/models/submodels/Bid.csv b/src/openprocurement/tender/cfaselectionua/models/submodels/Bid.csv index 006e54da48..57791777d5 100644 --- a/src/openprocurement/tender/cfaselectionua/models/submodels/Bid.csv +++ b/src/openprocurement/tender/cfaselectionua/models/submodels/Bid.csv @@ -1,18 +1,18 @@ -rolename,status,participationUrl,documents,parameters,lotValues,subcontractingDetails,owner,owner_token,value,tenderers,date,id,__parent__ -auction_view,,1,,1,1,1,,,1,,1,1, -Administrator,,,,,,,,,,1,,, -active.qualification,1,1,1,1,1,1,,,1,1,1,1, -complete,1,1,1,1,1,1,,,1,1,1,1, -embedded,1,1,1,1,1,1,,,1,1,1,1, -default,1,1,1,1,1,1,1,1,1,1,1,1, -auction_patch,,1,,,1,,,,,,,1, -active.awarded,1,1,1,1,1,1,,,1,1,1,1, -active.enquiries,,,,,,,,,,,,, -edit,1,,,1,1,1,,,1,1,,, -auction_post,,,,,1,1,,,1,,1,1, -active.auction,,,,,,,,,,,,, -active.tendering,,,,,,,,,,,,, -unsuccessful,1,1,1,1,1,1,,,1,1,1,1, -cancelled,1,1,1,1,1,1,,,1,1,1,1, -create,1,,1,1,1,1,,,1,1,,, -view,1,1,1,1,1,1,,,1,1,1,1, +rolename,status,participationUrl,documents,parameters,lotValues,subcontractingDetails,owner,owner_token,value,tenderers,date,requirementResponses,id,__parent__ +auction_view,,1,,1,1,1,,,1,,1,,1, +Administrator,,,,,,,,,,1,,,, +active.qualification,1,1,1,1,1,1,,,1,1,1,,1, +complete,1,1,1,1,1,1,,,1,1,1,,1, +embedded,1,1,1,1,1,1,,,1,1,1,1,1, +default,1,1,1,1,1,1,1,1,1,1,1,1,1, +auction_patch,,1,,,1,,,,,,,,1, +active.awarded,1,1,1,1,1,1,,,1,1,1,,1, +active.enquiries,,,,,,,,,,,,,, +edit,1,,,1,1,1,,,1,1,,,, +auction_post,,,,,1,1,,,1,,1,,1, +active.auction,,,,,,,,,,,,,, +active.tendering,,,,,,,,,,,,,, +unsuccessful,1,1,1,1,1,1,,,1,1,1,,1, +cancelled,1,1,1,1,1,1,,,1,1,1,,1, +create,1,,1,1,1,1,,,1,1,,,, +view,1,1,1,1,1,1,,,1,1,1,1,1, diff --git a/src/openprocurement/tender/cfaselectionua/models/submodels/lotAuctionPeriod.py b/src/openprocurement/tender/cfaselectionua/models/submodels/lotAuctionPeriod.py index 8fbd7889b7..bd0b8e9f93 100644 --- a/src/openprocurement/tender/cfaselectionua/models/submodels/lotAuctionPeriod.py +++ b/src/openprocurement/tender/cfaselectionua/models/submodels/lotAuctionPeriod.py @@ -4,7 +4,7 @@ from openprocurement.api.models import Period from openprocurement.tender.core.models import get_tender from openprocurement.api.utils import get_now -from openprocurement.tender.core.utils import calc_auction_end_time, rounding_shouldStartAfter +from openprocurement.tender.core.utils import calc_auction_end_time, normalize_should_start_after class LotAuctionPeriod(Period): @@ -19,7 +19,8 @@ def shouldStartAfter(self): return tender = get_tender(self) lot = self.__parent__ - if tender.status not in ["active.tendering", "active.auction"] or lot.status != "active": + statuses = ["active.tendering", "active.auction"] + if tender.status not in statuses or lot.status != "active": return if tender.status == "active.auction" and lot.numberOfBids < 2: return @@ -27,4 +28,4 @@ def shouldStartAfter(self): start_after = calc_auction_end_time(tender.numberOfBids, self.startDate) else: start_after = tender.tenderPeriod.endDate - return rounding_shouldStartAfter(start_after, tender).isoformat() + return normalize_should_start_after(start_after, tender).isoformat() diff --git a/src/openprocurement/tender/cfaselectionua/subscribers/event_handlers.py b/src/openprocurement/tender/cfaselectionua/subscribers/event_handlers.py index c89065da07..e2583a6f40 100644 --- a/src/openprocurement/tender/cfaselectionua/subscribers/event_handlers.py +++ b/src/openprocurement/tender/cfaselectionua/subscribers/event_handlers.py @@ -4,6 +4,7 @@ from openprocurement.api.utils import get_now, raise_operation_error from openprocurement.tender.core.models import PeriodEndRequired from openprocurement.tender.cfaselectionua.adapters.configurator import TenderCfaSelectionUAConfigurator +from openprocurement.tender.core.utils import calculate_tender_business_date @subscriber(TenderInitializeEvent, procurementMethodType="closeFrameworkAgreementSelectionUA") @@ -19,14 +20,22 @@ def tender_init_handler(event): if not tender.enquiryPeriod.startDate: tender.enquiryPeriod.startDate = get_now() if not tender.enquiryPeriod.endDate: - tender.enquiryPeriod.endDate = tender.enquiryPeriod.startDate + TenderCfaSelectionUAConfigurator.enquiry_period + tender.enquiryPeriod.endDate = calculate_tender_business_date( + tender.enquiryPeriod.startDate, + TenderCfaSelectionUAConfigurator.enquiry_period, + tender + ) if not tender.tenderPeriod: tender.tenderPeriod = PeriodEndRequired() tender.tenderPeriod["__parent__"] = tender if not tender.tenderPeriod.startDate: tender.tenderPeriod.startDate = tender.enquiryPeriod.endDate if not tender.tenderPeriod.endDate: - tender.tenderPeriod.endDate = tender.tenderPeriod.startDate + TenderCfaSelectionUAConfigurator.tender_period + tender.tenderPeriod.endDate = calculate_tender_business_date( + tender.tenderPeriod.startDate, + TenderCfaSelectionUAConfigurator.tender_period, + tender + ) now = get_now() tender.date = now if tender.lots: diff --git a/src/openprocurement/tender/cfaselectionua/tests/base.py b/src/openprocurement/tender/cfaselectionua/tests/base.py index e2f1c0af0d..614055a208 100644 --- a/src/openprocurement/tender/cfaselectionua/tests/base.py +++ b/src/openprocurement/tender/cfaselectionua/tests/base.py @@ -8,11 +8,12 @@ from openprocurement.api.constants import SANDBOX_MODE, TZ from openprocurement.api.tests.base import BaseWebTest from openprocurement.api.utils import get_now +from openprocurement.tender.belowthreshold.tests.base import set_tender_criteria from openprocurement.tender.cfaselectionua.constants import BOT_NAME +from openprocurement.tender.cfaselectionua.models.tender import CFASelectionUATender from openprocurement.tender.core.tests.base import BaseCoreWebTest from openprocurement.tender.cfaselectionua.adapters.configurator import TenderCfaSelectionUAConfigurator -from openprocurement.tender.cfaselectionua.tests.periods import periods - +from openprocurement.tender.cfaselectionua.tests.periods import PERIODS here = os.path.dirname(os.path.abspath(__file__)) now = datetime.now(TZ) @@ -75,6 +76,7 @@ class BaseTenderWebTest(BaseCoreWebTest): initial_data = test_tender_data initial_agreement = deepcopy(test_agreement) initial_status = None + initial_criteria = None initial_bids = None initial_lots = None initial_auth = ("Basic", ("broker", "")) @@ -103,33 +105,9 @@ class BaseTenderWebTest(BaseCoreWebTest): meta_initial_bids = test_bids meta_initial_lots = test_lots - periods = periods - - def update_periods(self, status, startend): - LOT_PERIODS = ("auctionPeriod",) - lots = self.tender_document.get("lots", []) - - for period in self.periods[status][startend]: - self.tender_document_patch.update({period: {}}) - if period in LOT_PERIODS: - continue - for date in self.periods[status][startend][period]: - self.tender_document_patch[period][date] = ( - self.now + self.periods[status][startend][period][date] - ).isoformat() - - if lots: - for period in self.periods[status][startend]: - if period in LOT_PERIODS: - for lot in lots: - if lot.get("status", None) == "active": - lot.update({period: {}}) - for date in self.periods[status][startend][period]: - lot[period][date] = ( - self.now + self.periods[status][startend][period][date] - ).isoformat() - self.tender_document_patch.update({"lots": lots}) - self.save_changes() + + periods = PERIODS + tender_class = CFASelectionUATender def get_timedelta(self, **kw): delta = timedelta(**kw) @@ -276,6 +254,15 @@ def create_tender(self): self.tender_token = response.json["access"]["token"] self.tender_id = tender["id"] status = tender["status"] + if self.initial_criteria: + self.app.post_json( + "/tenders/{id}/criteria?acc_token={token}".format(id=self.tender_id, token=self.tender_token), + {"data": set_tender_criteria( + self.initial_criteria, + tender.get("lots", []), + tender.get("items", []), + )}, + ) if self.initial_status != status and self.initial_status: self.set_status(self.initial_status) diff --git a/src/openprocurement/tender/cfaselectionua/tests/bid.py b/src/openprocurement/tender/cfaselectionua/tests/bid.py index 7c262f205f..1b60e1801a 100644 --- a/src/openprocurement/tender/cfaselectionua/tests/bid.py +++ b/src/openprocurement/tender/cfaselectionua/tests/bid.py @@ -15,6 +15,10 @@ test_agreement_features, test_bids, ) +from openprocurement.tender.openua.tests.bid import ( + TenderBidRequirementResponseTestMixin, + TenderBidRequirementResponseEvidenceTestMixin, +) from openprocurement.tender.cfaselectionua.tests.bid_blanks import ( # TenderBidResourceTest create_tender_bid_invalid, @@ -44,6 +48,26 @@ ) +class CreateBidMixin(object): + base_bid_status = "draft" + def setUp(self): + super(CreateBidMixin, self).setUp() + # Create bid + response = self.app.post_json( + "/tenders/{}/bids".format(self.tender_id), + { + "data": { + "status": self.base_bid_status, + "tenderers": [test_organization], + "lotValues": [{"value": {"amount": 500}, "relatedLot": self.initial_lots[0]["id"]}], + } + }, + ) + bid = response.json["data"] + self.bid_id = bid["id"] + self.bid_token = response.json["access"]["token"] + + class TenderBidResourceTest(TenderContentWebTest): initial_status = "active.tendering" initial_lots = deepcopy(test_lots) @@ -130,12 +154,34 @@ class TenderBidBatchDocumentWithDSResourceTest(TenderContentWebTest): test_create_tender_bid_with_documents = snitch(create_tender_bid_with_documents) +class TenderBidRequirementResponseResourceTest( + TenderBidRequirementResponseTestMixin, + CreateBidMixin, + TenderContentWebTest, +): + initial_lots = deepcopy(test_lots) + test_bids_data = test_bids + initial_status = "active.tendering" + + +class TenderBidRequirementResponseEvidenceResourceTest( + TenderBidRequirementResponseEvidenceTestMixin, + CreateBidMixin, + TenderContentWebTest, +): + initial_lots = deepcopy(test_lots) + test_bids_data = test_bids + initial_status = "active.tendering" + + def suite(): suite = unittest.TestSuite() suite.addTest(unittest.makeSuite(TenderBidDocumentResourceTest)) suite.addTest(unittest.makeSuite(TenderBidDocumentWithDSResourceTest)) suite.addTest(unittest.makeSuite(TenderBidFeaturesResourceTest)) suite.addTest(unittest.makeSuite(TenderBidResourceTest)) + suite.addTest(unittest.makeSuite(TenderBidRequirementResponseResourceTest)) + suite.addTest(unittest.makeSuite(TenderBidRequirementResponseEvidenceResourceTest)) return suite diff --git a/src/openprocurement/tender/cfaselectionua/tests/chronograph.py b/src/openprocurement/tender/cfaselectionua/tests/chronograph.py index 97ddeebdb1..0c96391f4f 100644 --- a/src/openprocurement/tender/cfaselectionua/tests/chronograph.py +++ b/src/openprocurement/tender/cfaselectionua/tests/chronograph.py @@ -2,6 +2,7 @@ import unittest from openprocurement.api.tests.base import snitch +from openprocurement.tender.belowthreshold.tests.chronograph_blanks import reset_auction_period, set_auction_period from openprocurement.tender.cfaselectionua.tests.base import TenderContentWebTest, test_lots, test_bids from openprocurement.tender.cfaselectionua.tests.chronograph_blanks import ( @@ -14,9 +15,6 @@ switch_to_auction, # TenderSwitchUnsuccessfulResourceTest switch_to_unsuccessful, - # TenderAuctionPeriodResourceTest - set_auction_period, - reset_auction_period, # TenderComplaintSwitchResourceTest switch_to_ignored_on_complete, switch_from_pending_to_ignored, diff --git a/src/openprocurement/tender/cfaselectionua/tests/chronograph_blanks.py b/src/openprocurement/tender/cfaselectionua/tests/chronograph_blanks.py index 2ff5b4af20..9233f31ca1 100644 --- a/src/openprocurement/tender/cfaselectionua/tests/chronograph_blanks.py +++ b/src/openprocurement/tender/cfaselectionua/tests/chronograph_blanks.py @@ -1,12 +1,11 @@ # -*- coding: utf-8 -*- from copy import deepcopy from datetime import timedelta -from iso8601 import parse_date from openprocurement.api.utils import get_now from openprocurement.tender.cfaselectionua.constants import BOT_NAME from openprocurement.tender.belowthreshold.tests.base import test_claim -from openprocurement.tender.cfaselectionua.tests.base import test_author, test_agreement +from openprocurement.tender.cfaselectionua.tests.base import test_agreement # TenderSwitchTenderingResourceTest @@ -89,169 +88,6 @@ def switch_to_unsuccessful(self): self.assertEqual(set([i["status"] for i in response.json["data"]["lots"]]), set(["unsuccessful"])) -# TenderAuctionPeriodResourceTest - - -def set_auction_period(self): - self.set_status("active.enquiries", start_end="end") - response = self.check_chronograph() - self.assertEqual(response.json["data"]["status"], "active.tendering") - - if self.initial_lots: - item = response.json["data"]["lots"][0] - else: - item = response.json["data"] - self.assertIn("auctionPeriod", item) - self.assertIn("shouldStartAfter", item["auctionPeriod"]) - self.assertGreaterEqual(item["auctionPeriod"]["shouldStartAfter"], response.json["data"]["tenderPeriod"]["endDate"]) - self.assertIn("T00:00:00+", item["auctionPeriod"]["shouldStartAfter"]) - self.assertEqual( - parse_date(response.json["data"]["next_check"]), parse_date(response.json["data"]["tenderPeriod"]["endDate"]) - ) - - if self.initial_lots: - response = self.check_chronograph( - {"data": {"lots": [{"auctionPeriod": {"startDate": "9999-01-01T00:00:00+00:00"}}]}} - ) - item = response.json["data"]["lots"][0] - else: - response = self.check_chronograph({"data": {"auctionPeriod": {"startDate": "9999-01-01T00:00:00+00:00"}}}) - item = response.json["data"] - self.assertEqual(response.status, "200 OK") - self.assertEqual(item["auctionPeriod"]["startDate"], "9999-01-01T00:00:00+00:00") - - if self.initial_lots: - response = self.check_chronograph({"data": {"lots": [{"auctionPeriod": {"startDate": None}}]}}) - item = response.json["data"]["lots"][0] - else: - response = self.check_chronograph({"data": {"auctionPeriod": {"startDate": None}}}) - item = response.json["data"] - self.assertEqual(response.status, "200 OK") - self.assertNotIn("startDate", item["auctionPeriod"]) - - -def reset_auction_period(self): - self.set_status("active.enquiries", start_end="end") - response = self.check_chronograph() - self.assertEqual(response.json["data"]["status"], "active.tendering") - - if self.initial_lots: - item = response.json["data"]["lots"][0] - else: - item = response.json["data"] - self.assertIn("auctionPeriod", item) - self.assertIn("shouldStartAfter", item["auctionPeriod"]) - self.assertGreaterEqual(item["auctionPeriod"]["shouldStartAfter"], response.json["data"]["tenderPeriod"]["endDate"]) - self.assertEqual( - parse_date(response.json["data"]["next_check"]), - parse_date(response.json["data"]["tenderPeriod"]["endDate"]) - ) - - if self.initial_lots: - response = self.check_chronograph({"data": {"lots": [{"auctionPeriod": {"startDate": "9999-01-01T00:00:00"}}]}}) - item = response.json["data"]["lots"][0] - else: - response = self.check_chronograph({"data": {"auctionPeriod": {"startDate": "9999-01-01T00:00:00"}}}) - item = response.json["data"] - self.assertEqual(response.status, "200 OK") - self.assertGreaterEqual(item["auctionPeriod"]["shouldStartAfter"], response.json["data"]["tenderPeriod"]["endDate"]) - self.assertIn("9999-01-01T00:00:00", item["auctionPeriod"]["startDate"]) - - self.set_status("active.tendering", start_end="end") - response = self.check_chronograph() - self.assertEqual(response.json["data"]["status"], "active.auction") - item = response.json["data"]["lots"][0] if self.initial_lots else response.json["data"] - self.assertGreaterEqual(item["auctionPeriod"]["shouldStartAfter"], response.json["data"]["tenderPeriod"]["endDate"]) - - if self.initial_lots: - response = self.check_chronograph({"data": {"lots": [{"auctionPeriod": {"startDate": "9999-01-01T00:00:00"}}]}}) - item = response.json["data"]["lots"][0] - else: - response = self.check_chronograph({"data": {"auctionPeriod": {"startDate": "9999-01-01T00:00:00"}}}) - item = response.json["data"] - self.assertEqual(response.status, "200 OK") - self.assertEqual(response.json["data"]["status"], "active.auction") - self.assertGreaterEqual(item["auctionPeriod"]["shouldStartAfter"], response.json["data"]["tenderPeriod"]["endDate"]) - self.assertIn("9999-01-01T00:00:00", item["auctionPeriod"]["startDate"]) - self.assertIn("9999-01-01T00:00:00", response.json["data"]["next_check"]) - - now = get_now().isoformat() - tender = self.db.get(self.tender_id) - if self.initial_lots: - tender["lots"][0]["auctionPeriod"]["startDate"] = now - else: - tender["auctionPeriod"]["startDate"] = now - self.db.save(tender) - - response = self.check_chronograph() - self.assertEqual(response.json["data"]["status"], "active.auction") - item = response.json["data"]["lots"][0] if self.initial_lots else response.json["data"] - self.assertGreaterEqual(item["auctionPeriod"]["shouldStartAfter"], response.json["data"]["tenderPeriod"]["endDate"]) - self.assertGreater( - parse_date(response.json["data"]["next_check"]), - parse_date(item["auctionPeriod"]["startDate"]) - ) - self.assertEqual(response.json["data"]["next_check"], self.db.get(self.tender_id)["next_check"]) - - if self.initial_lots: - response = self.check_chronograph( - {"data": {"lots": [{"auctionPeriod": {"startDate": response.json["data"]["tenderPeriod"]["endDate"]}}]}} - ) - item = response.json["data"]["lots"][0] - else: - response = self.check_chronograph( - {"data": {"auctionPeriod": {"startDate": response.json["data"]["tenderPeriod"]["endDate"]}}} - ) - item = response.json["data"] - self.assertEqual(response.status, "200 OK") - self.assertEqual(response.json["data"]["status"], "active.auction") - self.assertGreaterEqual(item["auctionPeriod"]["shouldStartAfter"], response.json["data"]["tenderPeriod"]["endDate"]) - self.assertNotIn("9999-01-01T00:00:00", item["auctionPeriod"]["startDate"]) - self.assertGreater( - parse_date(response.json["data"]["next_check"]), - parse_date(response.json["data"]["tenderPeriod"]["endDate"]) - ) - - tender = self.db.get(self.tender_id) - self.assertGreater(tender["next_check"], response.json["data"]["tenderPeriod"]["endDate"]) - tender["tenderPeriod"]["endDate"] = tender["tenderPeriod"]["startDate"] - if self.initial_lots: - tender["lots"][0]["auctionPeriod"]["startDate"] = tender["tenderPeriod"]["startDate"] - else: - tender["auctionPeriod"]["startDate"] = tender["tenderPeriod"]["startDate"] - self.db.save(tender) - - response = self.check_chronograph() - if self.initial_lots: - item = response.json["data"]["lots"][0] - else: - item = response.json["data"] - self.assertGreaterEqual(item["auctionPeriod"]["shouldStartAfter"], response.json["data"]["tenderPeriod"]["endDate"]) - self.assertNotIn("next_check", response.json["data"]) - self.assertNotIn("next_check", self.db.get(self.tender_id)) - shouldStartAfter = item["auctionPeriod"]["shouldStartAfter"] - - response = self.check_chronograph() - if self.initial_lots: - item = response.json["data"]["lots"][0] - else: - item = response.json["data"] - self.assertEqual(item["auctionPeriod"]["shouldStartAfter"], shouldStartAfter) - self.assertNotIn("next_check", response.json["data"]) - - if self.initial_lots: - response = self.check_chronograph({"data": {"lots": [{"auctionPeriod": {"startDate": "9999-01-01T00:00:00"}}]}}) - item = response.json["data"]["lots"][0] - else: - response = self.check_chronograph({"data": {"auctionPeriod": {"startDate": "9999-01-01T00:00:00"}}}) - item = response.json["data"] - self.assertEqual(response.status, "200 OK") - self.assertEqual(response.json["data"]["status"], "active.auction") - self.assertGreaterEqual(item["auctionPeriod"]["shouldStartAfter"], response.json["data"]["tenderPeriod"]["endDate"]) - self.assertIn("9999-01-01T00:00:00", item["auctionPeriod"]["startDate"]) - self.assertIn("9999-01-01T00:00:00", response.json["data"]["next_check"]) - - # TenderComplaintSwitchResourceTest diff --git a/src/openprocurement/tender/cfaselectionua/tests/criterion.py b/src/openprocurement/tender/cfaselectionua/tests/criterion.py new file mode 100644 index 0000000000..e599544e2b --- /dev/null +++ b/src/openprocurement/tender/cfaselectionua/tests/criterion.py @@ -0,0 +1,68 @@ +# -*- coding: utf-8 -*- +import unittest + +from openprocurement.api.tests.base import snitch +from openprocurement.tender.belowthreshold.tests.criterion_blanks import ( + activate_tender, + patch_tender_criteria_invalid, + patch_criteria_rg, + delete_requirement_evidence, +) +from openprocurement.tender.cfaselectionua.tests.base import test_tender_data, test_lots, TenderContentWebTest +from openprocurement.tender.openua.tests.criterion import ( + TenderCriteriaTestMixin, + TenderCriteriaRGTestMixin, + TenderCriteriaRGRequirementTestMixin, + TenderCriteriaRGRequirementEvidenceTestMixin, +) + + +class TenderCriteriaTest(TenderCriteriaTestMixin, TenderContentWebTest): + initial_data = test_tender_data + initial_lots = test_lots + test_lots_data = test_lots + initial_status = "active.enquiries" + + test_activate_tender = snitch(activate_tender) + test_patch_tender_criteria_invalid = snitch(patch_tender_criteria_invalid) + + +class TenderCriteriaRGTest(TenderCriteriaRGTestMixin, TenderContentWebTest): + initial_data = test_tender_data + test_lots_data = test_lots + initial_lots = test_lots + + test_patch_criteria_rg = snitch(patch_criteria_rg) + + +class TenderCriteriaRGRequirementTest( + TenderCriteriaRGRequirementTestMixin, + TenderContentWebTest +): + initial_data = test_tender_data + test_lots_data = test_lots + initial_lots = test_lots + + +class TenderCriteriaRGRequirementEvidenceTest( + TenderCriteriaRGRequirementEvidenceTestMixin, + TenderContentWebTest, +): + initial_data = test_tender_data + test_lots_data = test_lots + initial_lots = test_lots + + test_delete_requirement_evidence = snitch(delete_requirement_evidence) + + +def suite(): + suite = unittest.TestSuite() + suite.addTest(unittest.makeSuite(TenderCriteriaTest)) + suite.addTest(unittest.makeSuite(TenderCriteriaRGTest)) + suite.addTest(unittest.makeSuite(TenderCriteriaRGRequirementTest)) + suite.addTest(unittest.makeSuite(TenderCriteriaRGRequirementEvidenceTest)) + return suite + + +if __name__ == "__main__": + unittest.main(defaultTest="suite") diff --git a/src/openprocurement/tender/cfaselectionua/tests/periods.py b/src/openprocurement/tender/cfaselectionua/tests/periods.py index af395ff6c8..3516ebe56f 100644 --- a/src/openprocurement/tender/cfaselectionua/tests/periods.py +++ b/src/openprocurement/tender/cfaselectionua/tests/periods.py @@ -1,6 +1,5 @@ -from datetime import datetime, timedelta +from datetime import timedelta -from openprocurement.api.constants import TZ from openprocurement.tender.cfaselectionua.constants import ( ENQUIRY_PERIOD, TENDERING_DURATION, @@ -9,77 +8,171 @@ CLARIFICATIONS_DURATION, ) -periods = { +PERIODS = { "active.enquiries": { "start": { - "enquiryPeriod": {"startDate": timedelta(), "endDate": (+ENQUIRY_PERIOD)}, - "tenderPeriod": {"startDate": (+ENQUIRY_PERIOD), "endDate": (+ENQUIRY_PERIOD + TENDERING_DURATION)}, + "enquiryPeriod": { + "startDate": timedelta(), + "endDate": (+ENQUIRY_PERIOD + timedelta(days=1)) + }, + "tenderPeriod": { + "startDate": (+ENQUIRY_PERIOD + timedelta(days=1)), + "endDate": (+ENQUIRY_PERIOD + TENDERING_DURATION + timedelta(days=2)) + }, }, "end": { - "enquiryPeriod": {"startDate": (-ENQUIRY_PERIOD), "endDate": timedelta()}, - "tenderPeriod": {"startDate": timedelta(), "endDate": (+TENDERING_DURATION)}, + "enquiryPeriod": { + "startDate": (-ENQUIRY_PERIOD - timedelta(days=1)), + "endDate": timedelta() + }, + "tenderPeriod": { + "startDate": timedelta(), + "endDate": (+TENDERING_DURATION + timedelta(days=1))}, }, }, "active.tendering": { "start": { - "enquiryPeriod": {"startDate": (-ENQUIRY_PERIOD), "endDate": timedelta()}, - "tenderPeriod": {"startDate": timedelta(), "endDate": (+TENDERING_DURATION)}, + "enquiryPeriod": { + "startDate": (-ENQUIRY_PERIOD - timedelta(days=1)), + "endDate": timedelta() + }, + "tenderPeriod": { + "startDate": timedelta(), + "endDate": (+TENDERING_DURATION + timedelta(days=1)) + }, }, "end": { - "enquiryPeriod": {"startDate": (-ENQUIRY_PERIOD - TENDERING_DURATION), "endDate": (-TENDERING_DURATION)}, - "tenderPeriod": {"startDate": (-TENDERING_DURATION), "endDate": timedelta()}, + "enquiryPeriod": { + "startDate": (-ENQUIRY_PERIOD - TENDERING_DURATION - timedelta(days=2)), + "endDate": (-TENDERING_DURATION - timedelta(days=1)) + }, + "tenderPeriod": { + "startDate": (-TENDERING_DURATION - timedelta(days=1)), + "endDate": timedelta() + }, }, }, "active.auction": { "start": { - "enquiryPeriod": {"startDate": (-ENQUIRY_PERIOD - TENDERING_DURATION), "endDate": (-TENDERING_DURATION)}, - "tenderPeriod": {"startDate": (-TENDERING_DURATION), "endDate": timedelta()}, - "auctionPeriod": {"startDate": timedelta()}, + "enquiryPeriod": { + "startDate": (-ENQUIRY_PERIOD - TENDERING_DURATION - timedelta(days=2)), + "endDate": (-TENDERING_DURATION - timedelta(days=1)) + }, + "tenderPeriod": { + "startDate": (-TENDERING_DURATION - timedelta(days=1)), + "endDate": timedelta()}, + "auctionPeriod": { + "startDate": timedelta() + }, }, "end": { "enquiryPeriod": { - "startDate": (-ENQUIRY_PERIOD - TENDERING_DURATION - AUCTION_DURATION), - "endDate": (-TENDERING_DURATION - AUCTION_DURATION), + "startDate": (-ENQUIRY_PERIOD - TENDERING_DURATION - AUCTION_DURATION - timedelta(days=3)), + "endDate": (-TENDERING_DURATION - AUCTION_DURATION - timedelta(days=2)), + }, + "tenderPeriod": { + "startDate": (-TENDERING_DURATION - AUCTION_DURATION - timedelta(days=2)), + "endDate": (-AUCTION_DURATION - timedelta(days=1)) + }, + "auctionPeriod": { + "startDate": (-AUCTION_DURATION - timedelta(days=1)), + "endDate": timedelta() }, - "tenderPeriod": {"startDate": (-TENDERING_DURATION - AUCTION_DURATION), "endDate": (-AUCTION_DURATION)}, - "auctionPeriod": {"startDate": (-AUCTION_DURATION), "endDate": timedelta()}, }, }, "active.qualification": { "start": { "enquiryPeriod": { - "startDate": (-ENQUIRY_PERIOD - TENDERING_DURATION - AUCTION_DURATION), - "endDate": (-TENDERING_DURATION - AUCTION_DURATION), + "startDate": (-ENQUIRY_PERIOD - TENDERING_DURATION - AUCTION_DURATION - timedelta(days=3)), + "endDate": (-TENDERING_DURATION - AUCTION_DURATION - timedelta(days=2)), + }, + "tenderPeriod": { + "startDate": (-TENDERING_DURATION - AUCTION_DURATION - timedelta(days=2)), + "endDate": (-AUCTION_DURATION - timedelta(days=1)) + }, + "auctionPeriod": { + "startDate": (-AUCTION_DURATION - timedelta(days=1)), + "endDate": timedelta() }, - "tenderPeriod": {"startDate": (-TENDERING_DURATION - AUCTION_DURATION), "endDate": (-AUCTION_DURATION)}, - "auctionPeriod": {"startDate": (-AUCTION_DURATION), "endDate": timedelta()}, "awardPeriod": {"startDate": timedelta()}, }, "end": { "enquiryPeriod": { - "startDate": (-ENQUIRY_PERIOD - TENDERING_DURATION - AUCTION_DURATION - COMPLAINT_DURATION), - "endDate": (-TENDERING_DURATION - AUCTION_DURATION - COMPLAINT_DURATION), + "startDate": ( + -ENQUIRY_PERIOD + - TENDERING_DURATION + - AUCTION_DURATION + - COMPLAINT_DURATION + - timedelta(days=3) + ), + "endDate": ( + -TENDERING_DURATION + - AUCTION_DURATION + - COMPLAINT_DURATION + - timedelta(days=2) + ), }, "tenderPeriod": { - "startDate": (-TENDERING_DURATION - AUCTION_DURATION - COMPLAINT_DURATION), - "endDate": (-AUCTION_DURATION - COMPLAINT_DURATION), + "startDate": ( + -TENDERING_DURATION + - AUCTION_DURATION + - COMPLAINT_DURATION + - timedelta(days=2) + ), + "endDate": ( + -AUCTION_DURATION + - COMPLAINT_DURATION + - timedelta(days=1) + ), + }, + "auctionPeriod": { + "startDate": (-AUCTION_DURATION - COMPLAINT_DURATION - timedelta(days=1)), + "endDate": (-COMPLAINT_DURATION - timedelta(days=1)) + }, + "awardPeriod": { + "startDate": (-COMPLAINT_DURATION - timedelta(days=1)), + "endDate": timedelta() }, - "auctionPeriod": {"startDate": (-AUCTION_DURATION - COMPLAINT_DURATION), "endDate": (-COMPLAINT_DURATION)}, - "awardPeriod": {"startDate": (-COMPLAINT_DURATION), "endDate": timedelta()}, }, }, "active.awarded": { "start": { "enquiryPeriod": { - "startDate": (-ENQUIRY_PERIOD - TENDERING_DURATION - AUCTION_DURATION - COMPLAINT_DURATION), - "endDate": (-TENDERING_DURATION - AUCTION_DURATION - COMPLAINT_DURATION), + "startDate": ( + -ENQUIRY_PERIOD + - TENDERING_DURATION + - AUCTION_DURATION + - COMPLAINT_DURATION + - timedelta(days=3) + ), + "endDate": ( + -TENDERING_DURATION + - AUCTION_DURATION + - COMPLAINT_DURATION + - timedelta(days=2) + ), }, "tenderPeriod": { - "startDate": (-TENDERING_DURATION - AUCTION_DURATION - COMPLAINT_DURATION), - "endDate": (-AUCTION_DURATION - COMPLAINT_DURATION), + "startDate": ( + -TENDERING_DURATION + - AUCTION_DURATION + - COMPLAINT_DURATION + - timedelta(days=2) + ), + "endDate": ( + -AUCTION_DURATION + - COMPLAINT_DURATION + - timedelta(days=1) + ), + }, + "auctionPeriod": { + "startDate": (-AUCTION_DURATION - COMPLAINT_DURATION - timedelta(days=1)), + "endDate": (-COMPLAINT_DURATION - timedelta(days=1)) + }, + "awardPeriod": { + "startDate": (-COMPLAINT_DURATION - timedelta(days=1)), + "endDate": timedelta() }, - "auctionPeriod": {"startDate": (-AUCTION_DURATION - COMPLAINT_DURATION), "endDate": (-COMPLAINT_DURATION)}, - "awardPeriod": {"startDate": (-COMPLAINT_DURATION), "endDate": timedelta()}, }, "end": { "enquiryPeriod": { @@ -89,19 +182,42 @@ - AUCTION_DURATION - COMPLAINT_DURATION - CLARIFICATIONS_DURATION + - timedelta(days=3) + ), + "endDate": ( + -TENDERING_DURATION + - AUCTION_DURATION + - COMPLAINT_DURATION + - CLARIFICATIONS_DURATION + - timedelta(days=2) ), - "endDate": (-TENDERING_DURATION - AUCTION_DURATION - COMPLAINT_DURATION - CLARIFICATIONS_DURATION), }, "tenderPeriod": { - "startDate": (-TENDERING_DURATION - AUCTION_DURATION - COMPLAINT_DURATION - CLARIFICATIONS_DURATION), - "endDate": (-AUCTION_DURATION - COMPLAINT_DURATION - CLARIFICATIONS_DURATION), + "startDate": ( + -TENDERING_DURATION + - AUCTION_DURATION + - COMPLAINT_DURATION + - CLARIFICATIONS_DURATION + - timedelta(days=2) + ), + "endDate": ( + -AUCTION_DURATION + - COMPLAINT_DURATION + - CLARIFICATIONS_DURATION + - timedelta(days=1) + ), }, "auctionPeriod": { - "startDate": (-AUCTION_DURATION - COMPLAINT_DURATION - CLARIFICATIONS_DURATION), - "endDate": (-COMPLAINT_DURATION - CLARIFICATIONS_DURATION), + "startDate": ( + -AUCTION_DURATION + - COMPLAINT_DURATION + - CLARIFICATIONS_DURATION + - timedelta(days=1) + ), + "endDate": (-COMPLAINT_DURATION - CLARIFICATIONS_DURATION - timedelta(days=1)), }, "awardPeriod": { - "startDate": (-COMPLAINT_DURATION - CLARIFICATIONS_DURATION), + "startDate": (-COMPLAINT_DURATION - CLARIFICATIONS_DURATION - timedelta(days=1)), "endDate": (-CLARIFICATIONS_DURATION), }, }, @@ -115,20 +231,53 @@ - AUCTION_DURATION - COMPLAINT_DURATION - CLARIFICATIONS_DURATION + - timedelta(days=3) + ), + "endDate": ( + -TENDERING_DURATION + - AUCTION_DURATION + - COMPLAINT_DURATION + - CLARIFICATIONS_DURATION + - timedelta(days=2) ), - "endDate": (-TENDERING_DURATION - AUCTION_DURATION - COMPLAINT_DURATION - CLARIFICATIONS_DURATION), }, "tenderPeriod": { - "startDate": (-TENDERING_DURATION - AUCTION_DURATION - COMPLAINT_DURATION - CLARIFICATIONS_DURATION), - "endDate": (-AUCTION_DURATION - COMPLAINT_DURATION - CLARIFICATIONS_DURATION), + "startDate": ( + -TENDERING_DURATION + - AUCTION_DURATION + - COMPLAINT_DURATION + - CLARIFICATIONS_DURATION + - timedelta(days=2) + ), + "endDate": ( + -AUCTION_DURATION + - COMPLAINT_DURATION + - CLARIFICATIONS_DURATION + - timedelta(days=1) + ), }, "auctionPeriod": { - "startDate": (-AUCTION_DURATION - COMPLAINT_DURATION - CLARIFICATIONS_DURATION), - "endDate": (-COMPLAINT_DURATION - CLARIFICATIONS_DURATION), + "startDate": ( + -AUCTION_DURATION + - COMPLAINT_DURATION + - CLARIFICATIONS_DURATION + - timedelta(days=1) + ), + "endDate": ( + -COMPLAINT_DURATION + - CLARIFICATIONS_DURATION + - timedelta(days=1) + ), }, "awardPeriod": { - "startDate": (-COMPLAINT_DURATION - CLARIFICATIONS_DURATION), - "endDate": (-CLARIFICATIONS_DURATION), + "startDate": ( + -COMPLAINT_DURATION + - CLARIFICATIONS_DURATION + - timedelta(days=1) + ), + "endDate": ( + -CLARIFICATIONS_DURATION + ), }, } }, diff --git a/src/openprocurement/tender/cfaselectionua/tests/tender_blanks.py b/src/openprocurement/tender/cfaselectionua/tests/tender_blanks.py index 56139a6aca..845afca39e 100644 --- a/src/openprocurement/tender/cfaselectionua/tests/tender_blanks.py +++ b/src/openprocurement/tender/cfaselectionua/tests/tender_blanks.py @@ -1,5 +1,4 @@ # -*- coding: utf-8 -*- -import unittest import jmespath import mock from uuid import uuid4 @@ -13,6 +12,7 @@ ROUTE_PREFIX, SANDBOX_MODE, NOT_REQUIRED_ADDITIONAL_CLASSIFICATION_FROM, + CPV_ITEMS_CLASS_FROM, ) from openprocurement.tender.belowthreshold.tests.base import test_claim, test_cancellation from openprocurement.api.constants import RELEASE_2020_04_19 @@ -23,12 +23,13 @@ MIN_PERIOD_UNTIL_AGREEMENT_END, MIN_ACTIVE_CONTRACTS, AGREEMENT_IDENTIFIER, + TENDERING_DURATION, ) -from openprocurement.tender.core.constants import CANT_DELETE_PERIOD_START_DATE_FROM, CPV_ITEMS_CLASS_FROM from openprocurement.tender.cfaselectionua.models.tender import CFASelectionUATender as Tender from openprocurement.tender.cfaselectionua.tests.base import test_organization, test_features # TenderTest +from openprocurement.tender.core.utils import calculate_tender_business_date def simple_add_tender(self): @@ -1457,27 +1458,34 @@ def patch_tender(self): response = self.app.get("/tenders/{}".format(self.tender_id)) tender = response.json["data"] - endDate = ( - parse_date(tender["tenderPeriod"]["startDate"]) + self.get_timedelta(days=2, hours=23, minutes=59) - ).isoformat() + end_date = calculate_tender_business_date( + parse_date(tender["tenderPeriod"]["startDate"]), timedelta(days=3), self.tender_class(tender) + ) - self.get_timedelta(minutes=1) response = self.app.patch_json( "/tenders/{}?acc_token={}".format(self.tender_id, owner_token), - {"data": {"tenderPeriod": {"endDate": endDate}}}, - status=403, + {"data": {"tenderPeriod": {"endDate": end_date.isoformat()}}}, + status=422, ) - self.assertEqual(response.status, "403 Forbidden") + self.assertEqual(response.status, "422 Unprocessable Entity") self.assertEqual(response.content_type, "application/json") self.assertEqual(response.json["status"], "error") self.assertEqual( response.json["errors"], - [{"location": "body", "name": "data", "description": "tenderPeriod should last at least 3 days"}], - ) - endDate = (parse_date(tender["tenderPeriod"]["startDate"]) + self.get_timedelta(days=3, minutes=1)).isoformat() + [{ + "location": "body", + "name": "tenderPeriod", + "description": ["tenderPeriod must be at least 3 full calendar days long"] + }], + ) + end_date = calculate_tender_business_date( + parse_date(tender["tenderPeriod"]["startDate"]), timedelta(days=3), tender + ) + self.get_timedelta(minutes=1) response = self.app.patch_json( - "/tenders/{}?acc_token={}".format(self.tender_id, owner_token), {"data": {"tenderPeriod": {"endDate": endDate}}} + "/tenders/{}?acc_token={}".format(self.tender_id, owner_token), + {"data": {"tenderPeriod": {"endDate": end_date.isoformat()}}} ) self.assertEqual((response.status, response.content_type), ("200 OK", "application/json")) - self.assertNotEqual(endDate, tender["tenderPeriod"]["endDate"]) + self.assertNotEqual(end_date.isoformat(), tender["tenderPeriod"]["endDate"]) items = deepcopy(tender["items"]) items[0]["quantity"] += 1 @@ -1550,13 +1558,15 @@ def patch_tender(self): tender = response.json["data"] startDate = (parse_date(tender["tenderPeriod"]["startDate"]) + self.get_timedelta(days=1)).isoformat() + endDate = (parse_date(tender["tenderPeriod"]["endDate"]) + self.get_timedelta(days=1)).isoformat() response = self.app.patch_json( "/tenders/{}?acc_token={}".format(tender["id"], owner_token), - {"data": {"tenderPeriod": {"startDate": startDate}}}, + {"data": {"tenderPeriod": {"startDate": startDate, "endDate": endDate}}}, ) self.assertEqual((response.status, response.content_type), ("200 OK", "application/json")) response = self.app.get("/tenders/{}".format(self.tender_id)) tender = response.json["data"] + self.assertEqual(endDate, tender["tenderPeriod"]["endDate"]) self.assertNotEqual(startDate, tender["tenderPeriod"]["startDate"]) endDate = (parse_date(tender["tenderPeriod"]["endDate"]) + self.get_timedelta(days=1)).isoformat() @@ -1582,10 +1592,12 @@ def patch_tender(self): response = self.app.get("/tenders/{}".format(self.tender_id)) tender = response.json["data"] + # can't startDate either startDate = (parse_date(tender["tenderPeriod"]["startDate"]) + self.get_timedelta(days=1)).isoformat() + endDate = (parse_date(tender["tenderPeriod"]["endDate"]) + self.get_timedelta(days=1)).isoformat() response = self.app.patch_json( "/tenders/{}?acc_token={}".format(tender["id"], owner_token), - {"data": {"tenderPeriod": {"startDate": startDate}}}, + {"data": {"tenderPeriod": {"startDate": startDate, "endDate": endDate}}}, ) self.assertEqual((response.status, response.content_type), ("200 OK", "application/json")) response = self.app.get("/tenders/{}".format(self.tender_id)) @@ -1704,11 +1716,12 @@ def patch_tender_bot(self): response.json["data"]["lots"][0]["minimalStep"]["amount"], round(response.json["data"]["lots"][0]["minimalStep"]["amount"], 2), ) - enquiry_period = ENQUIRY_PERIOD - if SANDBOX_MODE: - enquiry_period = ENQUIRY_PERIOD / 1440 self.assertEqual( - parse_date(response.json["data"]["enquiryPeriod"]["startDate"]) + enquiry_period, + calculate_tender_business_date( + parse_date(response.json["data"]["enquiryPeriod"]["startDate"]), + ENQUIRY_PERIOD, + self.tender_class(tender) + ), parse_date(response.json["data"]["enquiryPeriod"]["endDate"]), ) @@ -1874,10 +1887,11 @@ def patch_tender_bot(self): ) self.assertEqual((response.status, response.content_type), ("200 OK", "application/json")) + tender_period_start_date = calculate_tender_business_date(get_now(), -TENDERING_DURATION) tender_doc = self.db.get(self.tender_id) - tender_doc["enquiryPeriod"]["startDate"] = get_now().isoformat() - tender_doc["enquiryPeriod"]["endDate"] = get_now().isoformat() - tender_doc["tenderPeriod"]["startDate"] = get_now().isoformat() + tender_doc["enquiryPeriod"]["startDate"] = tender_period_start_date.isoformat() + tender_doc["enquiryPeriod"]["endDate"] = tender_period_start_date.isoformat() + tender_doc["tenderPeriod"]["startDate"] = tender_period_start_date.isoformat() tender_doc["tenderPeriod"]["endDate"] = get_now().isoformat() self.db.save(tender_doc) @@ -2565,11 +2579,12 @@ def edit_tender_in_active_enquiries(self): response.json["data"]["lots"][0]["minimalStep"]["amount"], round(response.json["data"]["lots"][0]["minimalStep"]["amount"], 2), ) - enquiry_period = ENQUIRY_PERIOD - if SANDBOX_MODE: - enquiry_period = ENQUIRY_PERIOD / 1440 self.assertEqual( - parse_date(response.json["data"]["enquiryPeriod"]["startDate"]) + enquiry_period, + calculate_tender_business_date( + parse_date(response.json["data"]["enquiryPeriod"]["startDate"]), + ENQUIRY_PERIOD, + self.tender_class(tender) + ), parse_date(response.json["data"]["enquiryPeriod"]["endDate"]), ) diff --git a/src/openprocurement/tender/cfaselectionua/utils.py b/src/openprocurement/tender/cfaselectionua/utils.py index ecc78aef1a..748b7b4350 100644 --- a/src/openprocurement/tender/cfaselectionua/utils.py +++ b/src/openprocurement/tender/cfaselectionua/utils.py @@ -20,8 +20,7 @@ from openprocurement.tender.core.utils import ( cleanup_bids_for_cancelled_lots, remove_draft_bids, - calculate_tender_business_date, - get_first_revision_date, + calculate_tender_date, CancelTenderLot as BaseCancelTenderLot, ) from functools import partial @@ -329,7 +328,7 @@ def check_period_and_items(request, tender): return delta = -request.content_configurator.agreement_expired_until - date = calculate_tender_business_date(tender.agreements[0].period.endDate, delta, tender) + date = calculate_tender_date(tender.agreements[0].period.endDate, delta, tender) if get_now() > date: drop_draft_to_unsuccessful(request, tender, AGREEMENT_EXPIRED) elif tender.agreements[0].period.startDate > tender.date: diff --git a/src/openprocurement/tender/cfaselectionua/validation.py b/src/openprocurement/tender/cfaselectionua/validation.py index 55ec15860f..f2bba2efde 100644 --- a/src/openprocurement/tender/cfaselectionua/validation.py +++ b/src/openprocurement/tender/cfaselectionua/validation.py @@ -1,11 +1,10 @@ # -*- coding: utf-8 -*- -from iso8601 import parse_date +from schematics.exceptions import ValidationError from openprocurement.api.utils import error_handler, raise_operation_error, get_now from openprocurement.api.validation import OPERATIONS, validate_data, validate_json_data -from openprocurement.tender.cfaselectionua.constants import TENDER_PERIOD_MINIMAL_DURATION -from openprocurement.tender.core.utils import calculate_tender_business_date +from openprocurement.tender.openua.validation import validate_tender_period_duration def validate_patch_tender_data(request): @@ -178,7 +177,6 @@ def validate_json_data_in_active_enquiries(request): tender = request.validated["tender_src"] data = source if "tenderPeriod" in source and "endDate" in source["tenderPeriod"]: - validate_patch_tender_tenderPeriod(request) data["tenderPeriod"] = {"endDate": source["tenderPeriod"]["endDate"]} if len(source["items"]) != len(tender["items"]): @@ -187,14 +185,3 @@ def validate_json_data_in_active_enquiries(request): raise_operation_error(request, "Can't update tender items. Items order mismatch") request.validated["data"] = data - - -def validate_patch_tender_tenderPeriod(request): - source = request.validated["data"] - tender = request.validated["tender_src"] - startDate = tender["tenderPeriod"].get("startDate") - endDate = source["tenderPeriod"].get("endDate") - - date = calculate_tender_business_date(parse_date(startDate), request.content_configurator.tender_period, tender) - if (startDate and endDate) and date > parse_date(endDate): - raise_operation_error(request, "tenderPeriod should last at least 3 days") diff --git a/src/openprocurement/tender/cfaselectionua/views/award_rr.py b/src/openprocurement/tender/cfaselectionua/views/award_rr.py new file mode 100644 index 0000000000..68d3834f44 --- /dev/null +++ b/src/openprocurement/tender/cfaselectionua/views/award_rr.py @@ -0,0 +1,14 @@ +# -*- coding: utf-8 -*- +from openprocurement.tender.core.views.award_rr import BaseAwardRequirementResponseResource +from openprocurement.tender.core.utils import optendersresource + + +@optendersresource( + name="closeFrameworkAgreementSelectionUA:Award Requirement Response", + collection_path="/tenders/{tender_id}/awards/{award_id}/requirement_responses", + path="/tenders/{tender_id}/awards/{award_id}/requirement_responses/{requirement_response_id}", + procurementMethodType="closeFrameworkAgreementSelectionUA", + description="Tender award requirement responses", +) +class AwardRequirementResponseResource(BaseAwardRequirementResponseResource): + pass diff --git a/src/openprocurement/tender/cfaselectionua/views/award_rr_evidence.py b/src/openprocurement/tender/cfaselectionua/views/award_rr_evidence.py new file mode 100644 index 0000000000..c7076ecece --- /dev/null +++ b/src/openprocurement/tender/cfaselectionua/views/award_rr_evidence.py @@ -0,0 +1,16 @@ +# -*- coding: utf-8 -*- +from openprocurement.tender.core.views.award_rr_evidence import BaseAwardRequirementResponseEvidenceResource +from openprocurement.tender.core.utils import optendersresource + + +@optendersresource( + name="closeFrameworkAgreementSelectionUA:Award Requirement Response Evidence", + collection_path="/tenders/{tender_id}/awards/{award_id}/requirement_responses/{requirement_response_id}/evidences", + path="/tenders/{tender_id}/awards/{award_id}/requirement_responses/{requirement_response_id}/evidences/{evidence_id}", + procurementMethodType="closeFrameworkAgreementSelectionUA", + description="Tender award evidences", +) +class AwardRequirementResponseEvidenceResource( + BaseAwardRequirementResponseEvidenceResource +): + pass diff --git a/src/openprocurement/tender/cfaselectionua/views/bid.py b/src/openprocurement/tender/cfaselectionua/views/bid.py index 059a4b2d54..611ee135ac 100644 --- a/src/openprocurement/tender/cfaselectionua/views/bid.py +++ b/src/openprocurement/tender/cfaselectionua/views/bid.py @@ -6,6 +6,7 @@ validate_patch_bid_data, validate_bid_operation_period, validate_bid_operation_not_in_tendering, + validate_bid_activate_criteria, ) from openprocurement.tender.cfaselectionua.validation import ( @@ -214,6 +215,7 @@ def get(self): validate_bid_operation_period, validate_update_bid_status, validate_bid, + validate_bid_activate_criteria, ), ) def patch(self): diff --git a/src/openprocurement/tender/cfaselectionua/views/bid_rr.py b/src/openprocurement/tender/cfaselectionua/views/bid_rr.py new file mode 100644 index 0000000000..5c6221c8bb --- /dev/null +++ b/src/openprocurement/tender/cfaselectionua/views/bid_rr.py @@ -0,0 +1,14 @@ +# -*- coding: utf-8 -*- +from openprocurement.tender.core.views.bid_rr import BaseBidRequirementResponseResource +from openprocurement.tender.core.utils import optendersresource + + +@optendersresource( + name="closeFrameworkAgreementSelectionUA:Bid Requirement Response", + collection_path="/tenders/{tender_id}/bids/{bid_id}/requirement_responses", + path="/tenders/{tender_id}/bids/{bid_id}/requirement_responses/{requirement_response_id}", + procurementMethodType="closeFrameworkAgreementSelectionUA", + description="Tender bidder requirement responses", +) +class BidRequirementResponseResource(BaseBidRequirementResponseResource): + pass diff --git a/src/openprocurement/tender/cfaselectionua/views/bid_rr_evidence.py b/src/openprocurement/tender/cfaselectionua/views/bid_rr_evidence.py new file mode 100644 index 0000000000..a959d44b4b --- /dev/null +++ b/src/openprocurement/tender/cfaselectionua/views/bid_rr_evidence.py @@ -0,0 +1,16 @@ +# -*- coding: utf-8 -*- +from openprocurement.tender.core.views.bid_rr_evidence import BaseBidRequirementResponseEvidenceResource +from openprocurement.tender.core.utils import optendersresource + + +@optendersresource( + name="closeFrameworkAgreementSelectionUA:Bid Requirement Response Evidence", + collection_path="/tenders/{tender_id}/bids/{bid_id}/requirement_responses/{requirement_response_id}/evidences", + path="/tenders/{tender_id}/bids/{bid_id}/requirement_responses/{requirement_response_id}/evidences/{evidence_id}", + procurementMethodType="closeFrameworkAgreementSelectionUA", + description="Tenderbidder evidences", +) +class BidRequirementResponseEvidenceResource( + BaseBidRequirementResponseEvidenceResource +): + pass diff --git a/src/openprocurement/tender/cfaselectionua/views/criterion.py b/src/openprocurement/tender/cfaselectionua/views/criterion.py new file mode 100644 index 0000000000..e4017727a0 --- /dev/null +++ b/src/openprocurement/tender/cfaselectionua/views/criterion.py @@ -0,0 +1,15 @@ +# -*- coding: utf-8 -*- +from openprocurement.tender.core.utils import optendersresource +from openprocurement.tender.belowthreshold.views.criterion import TenderCriteriaResource + + +@optendersresource( + name="closeFrameworkAgreementSelectionUA:Tender Criteria", + collection_path="/tenders/{tender_id}/criteria", + path="/tenders/{tender_id}/criteria/{criterion_id}", + procurementMethodType="closeFrameworkAgreementSelectionUA", + description="Tender criteria", +) +class TenderCriteriaResource(TenderCriteriaResource): + pass + diff --git a/src/openprocurement/tender/cfaselectionua/views/criterion_rg.py b/src/openprocurement/tender/cfaselectionua/views/criterion_rg.py new file mode 100644 index 0000000000..90e2f4ce39 --- /dev/null +++ b/src/openprocurement/tender/cfaselectionua/views/criterion_rg.py @@ -0,0 +1,14 @@ +# -*- coding: utf-8 -*- +from openprocurement.tender.core.utils import optendersresource +from openprocurement.tender.belowthreshold.views.criterion_rg import TenderCriteriaRGResource + + +@optendersresource( + name="closeFrameworkAgreementSelectionUA:Criteria Requirement Group", + collection_path="/tenders/{tender_id}/criteria/{criterion_id}/requirement_groups", + path="/tenders/{tender_id}/criteria/{criterion_id}/requirement_groups/{requirement_group_id}", + procurementMethodType="closeFrameworkAgreementSelectionUA", + description="Tender criteria requirement group", +) +class TenderCriteriaRGResource(TenderCriteriaRGResource): + pass diff --git a/src/openprocurement/tender/cfaselectionua/views/criterion_rg_requirement.py b/src/openprocurement/tender/cfaselectionua/views/criterion_rg_requirement.py new file mode 100644 index 0000000000..9cf6fdf56b --- /dev/null +++ b/src/openprocurement/tender/cfaselectionua/views/criterion_rg_requirement.py @@ -0,0 +1,16 @@ +# -*- coding: utf-8 -*- +from openprocurement.tender.core.utils import optendersresource +from openprocurement.tender.belowthreshold.views.criterion_rg_requirement import TenderCriteriaRGRequirementResource + + +@optendersresource( + name="closeFrameworkAgreementSelectionUA:Requirement Group Requirement", + collection_path="/tenders/{tender_id}/criteria/{criterion_id}/" + "requirement_groups/{requirement_group_id}/requirements", + path="/tenders/{tender_id}/criteria/{criterion_id}/" + "requirement_groups/{requirement_group_id}/requirements/{requirement_id}", + procurementMethodType="closeFrameworkAgreementSelectionUA", + description="Tender requirement group requirement", +) +class TenderCriteriaRGRequirementResource(TenderCriteriaRGRequirementResource): + pass diff --git a/src/openprocurement/tender/cfaselectionua/views/criterion_rg_requirement_evidence.py b/src/openprocurement/tender/cfaselectionua/views/criterion_rg_requirement_evidence.py new file mode 100644 index 0000000000..f0daa0a29a --- /dev/null +++ b/src/openprocurement/tender/cfaselectionua/views/criterion_rg_requirement_evidence.py @@ -0,0 +1,18 @@ +# -*- coding: utf-8 -*- +from openprocurement.tender.core.utils import optendersresource +from openprocurement.tender.belowthreshold.views.criterion_rg_requirement_evidence import ( + TenderCriteriaRGRequirementEvidenceResource, +) + + +@optendersresource( + name="closeFrameworkAgreementSelectionUA:Requirement Eligible Evidence", + collection_path="/tenders/{tender_id}/criteria/{criterion_id}/" + "requirement_groups/{requirement_group_id}/requirements/{requirement_id}/evidences", + path="/tenders/{tender_id}/criteria/{criterion_id}/" + "requirement_groups/{requirement_group_id}/requirements/{requirement_id}/evidences/{evidence_id}", + procurementMethodType="closeFrameworkAgreementSelectionUA", + description="Tender requirement evidence", +) +class TenderCriteriaRGRequirementEvidenceResource(TenderCriteriaRGRequirementEvidenceResource): + pass diff --git a/src/openprocurement/tender/cfaselectionua/views/tender.py b/src/openprocurement/tender/cfaselectionua/views/tender.py index b2913ed496..ed7e4730bc 100644 --- a/src/openprocurement/tender/cfaselectionua/views/tender.py +++ b/src/openprocurement/tender/cfaselectionua/views/tender.py @@ -7,6 +7,7 @@ optendersresource, apply_patch, calculate_tender_business_date, + calculate_tender_date, ) from openprocurement.tender.core.validation import ( validate_tender_not_in_terminated_status, diff --git a/src/openprocurement/tender/cfaua/adapters/tender/serializable/complaintperiod.py b/src/openprocurement/tender/cfaua/adapters/tender/serializable/complaintperiod.py index d9bd405f70..f997fcdeda 100644 --- a/src/openprocurement/tender/cfaua/adapters/tender/serializable/complaintperiod.py +++ b/src/openprocurement/tender/cfaua/adapters/tender/serializable/complaintperiod.py @@ -11,6 +11,6 @@ class SerializableTenderComplaintPeriod(Serializable): serialized_type = ModelType(Period) def __call__(self, obj, *args, **kwargs): - complaintPeriod_class = obj._fields["tenderPeriod"] - endDate = calculate_complaint_business_date(obj.tenderPeriod.endDate, -COMPLAINT_SUBMIT_TIME, obj) - return complaintPeriod_class(dict(startDate=obj.tenderPeriod.startDate, endDate=endDate)) + complaint_period_class = obj._fields["tenderPeriod"] + end_date = calculate_complaint_business_date(obj.tenderPeriod.endDate, -COMPLAINT_SUBMIT_TIME, obj) + return complaint_period_class(dict(startDate=obj.tenderPeriod.startDate, endDate=end_date)) diff --git a/src/openprocurement/tender/cfaua/adapters/tender/serializable/enquiryperiod.py b/src/openprocurement/tender/cfaua/adapters/tender/serializable/enquiryperiod.py index 28c8f1a0f4..ff61e99d8b 100644 --- a/src/openprocurement/tender/cfaua/adapters/tender/serializable/enquiryperiod.py +++ b/src/openprocurement/tender/cfaua/adapters/tender/serializable/enquiryperiod.py @@ -2,7 +2,7 @@ from zope.component import getAdapter from openprocurement.api.interfaces import IContentConfigurator from openprocurement.api.adapters import Serializable -from openprocurement.tender.core.utils import calculate_tender_business_date, calculate_clarifications_business_date +from openprocurement.tender.core.utils import calculate_tender_business_date, calculate_clarif_business_date class SerializableTenderEnquiryPeriod(Serializable): @@ -11,16 +11,14 @@ class SerializableTenderEnquiryPeriod(Serializable): def __call__(self, obj, *args, **kwargs): configurator = getAdapter(obj, IContentConfigurator) - enquiryPeriod_class = obj._fields["enquiryPeriod"] - endDate = calculate_tender_business_date(obj.tenderPeriod.endDate, -configurator.questions_stand_still, obj) - clarificationsUntil = calculate_clarifications_business_date( - endDate, configurator.enquiry_stand_still, obj, True - ) - return enquiryPeriod_class( + enquiry_period_class = obj._fields["enquiryPeriod"] + end_date = calculate_tender_business_date(obj.tenderPeriod.endDate, -configurator.questions_stand_still, obj) + clarifications_until = calculate_clarif_business_date(end_date, configurator.enquiry_stand_still, obj, True) + return enquiry_period_class( dict( startDate=obj.tenderPeriod.startDate, - endDate=endDate, + endDate=end_date, invalidationDate=obj.enquiryPeriod and obj.enquiryPeriod.invalidationDate, - clarificationsUntil=clarificationsUntil, + clarificationsUntil=clarifications_until, ) ) diff --git a/src/openprocurement/tender/cfaua/adapters/tender/serializable/next_check.py b/src/openprocurement/tender/cfaua/adapters/tender/serializable/next_check.py index a620f11198..47d9abd33e 100644 --- a/src/openprocurement/tender/cfaua/adapters/tender/serializable/next_check.py +++ b/src/openprocurement/tender/cfaua/adapters/tender/serializable/next_check.py @@ -49,10 +49,12 @@ def __call__(self, obj): ): if now < obj.auctionPeriod.startDate: checks.append(obj.auctionPeriod.startDate.astimezone(configurator.tz)) - elif now < calc_auction_end_time(obj.numberOfBids, obj.auctionPeriod.startDate).astimezone(configurator.tz): - checks.append( - calc_auction_end_time(obj.numberOfBids, obj.auctionPeriod.startDate).astimezone(configurator.tz) - ) + else: + auction_end_time = calc_auction_end_time( + obj.numberOfBids, obj.auctionPeriod.startDate + ).astimezone(configurator.tz) + if now < auction_end_time: + checks.append(auction_end_time) elif obj.lots and obj.status == "active.auction": for lot in obj.lots: if ( @@ -64,12 +66,12 @@ def __call__(self, obj): continue if now < lot.auctionPeriod.startDate: checks.append(lot.auctionPeriod.startDate.astimezone(configurator.tz)) - elif now < calc_auction_end_time(lot.numberOfBids, lot.auctionPeriod.startDate).astimezone( - configurator.tz - ): - checks.append( - calc_auction_end_time(lot.numberOfBids, lot.auctionPeriod.startDate).astimezone(configurator.tz) - ) + else: + auction_end_time = calc_auction_end_time( + lot.numberOfBids, lot.auctionPeriod.startDate + ).astimezone(configurator.tz) + if now < auction_end_time: + checks.append(auction_end_time) elif obj.status == "active.qualification.stand-still" and obj.awardPeriod and obj.awardPeriod.endDate: active_lots = [lot.id for lot in obj.lots if lot.status == "active"] if obj.lots else [None] if not any( diff --git a/src/openprocurement/tender/cfaua/adapters/tender/validators/items.py b/src/openprocurement/tender/cfaua/adapters/tender/validators/items.py index 8b5b1817b8..c5c026939d 100644 --- a/src/openprocurement/tender/cfaua/adapters/tender/validators/items.py +++ b/src/openprocurement/tender/cfaua/adapters/tender/validators/items.py @@ -1,7 +1,7 @@ +from openprocurement.api.constants import CPV_ITEMS_CLASS_FROM from openprocurement.api.validation import validate_cpv_group from schematics.exceptions import ValidationError from openprocurement.api.utils import get_now -from openprocurement.tender.core.constants import CPV_ITEMS_CLASS_FROM class TenderCPVItemsValidate(object): diff --git a/src/openprocurement/tender/cfaua/adapters/tender/validators/tenderperiod.py b/src/openprocurement/tender/cfaua/adapters/tender/validators/tenderperiod.py index 8ced8b5adf..02c92f2307 100644 --- a/src/openprocurement/tender/cfaua/adapters/tender/validators/tenderperiod.py +++ b/src/openprocurement/tender/cfaua/adapters/tender/validators/tenderperiod.py @@ -1,9 +1,10 @@ # openprocurement.tender.openeu.models.Tender#validate_tenderPeriod -from openprocurement.tender.core.utils import calculate_tender_business_date -from datetime import timedelta -from openprocurement.api.utils import get_now -from schematics.exceptions import ValidationError -from openprocurement.tender.cfaua.constants import TENDERING_DURATION, TENDERING_DAYS +from openprocurement.api.utils import is_new_created +from openprocurement.tender.cfaua.constants import TENDERING_DURATION +from openprocurement.tender.openua.validation import ( + validate_tender_period_start_date, + validate_tender_period_duration, +) class TenderPeriodValidate(object): @@ -11,7 +12,7 @@ def __init__(self, tender): self.context = tender def __call__(self, cls, data, period): - if not data["_rev"] and calculate_tender_business_date(get_now(), -timedelta(minutes=10)) >= period.startDate: - raise ValidationError(u"tenderPeriod.startDate should be in greater than current date") - if period and calculate_tender_business_date(period.startDate, TENDERING_DURATION, data) > period.endDate: - raise ValidationError(u"tenderPeriod should be greater than {} days".format(TENDERING_DAYS)) + if period: + if is_new_created(data): + validate_tender_period_start_date(data, period) + validate_tender_period_duration(data, period, TENDERING_DURATION) diff --git a/src/openprocurement/tender/cfaua/models/submodels/agreement.py b/src/openprocurement/tender/cfaua/models/submodels/agreement.py index 41003f9340..6b5cc8a840 100644 --- a/src/openprocurement/tender/cfaua/models/submodels/agreement.py +++ b/src/openprocurement/tender/cfaua/models/submodels/agreement.py @@ -48,7 +48,11 @@ def validate_dateSigned(self, data, value): awards_id = [c.awardID for c in data["contracts"]] if value and isinstance(parent, Model): award = [i for i in parent.awards if i.id in awards_id][0] - if award.complaintPeriod.endDate >= value: + if ( + award.complaintPeriod + and award.complaintPeriod.endDate + and award.complaintPeriod.endDate >= value + ): raise ValidationError( u"Agreement signature date should be after award complaint period end date ({})".format( award.complaintPeriod.endDate.isoformat() diff --git a/src/openprocurement/tender/cfaua/models/submodels/award.py b/src/openprocurement/tender/cfaua/models/submodels/award.py index 12213820f5..0923327ca7 100644 --- a/src/openprocurement/tender/cfaua/models/submodels/award.py +++ b/src/openprocurement/tender/cfaua/models/submodels/award.py @@ -22,7 +22,7 @@ class Options: ) _all = _common + whitelist( "status", "lotID", "complaintPeriod", "bid_id", "subcontractingDetails", "date", - "complaints", "id", "documents", "items", "suppliers", "value", "milestones", + "complaints", "id", "documents", "items", "suppliers", "value", "milestones", "requirementResponses" ) roles = { "Administrator": whitelist("complaintPeriod"), diff --git a/src/openprocurement/tender/cfaua/models/submodels/bids.py b/src/openprocurement/tender/cfaua/models/submodels/bids.py index 8b019e9787..e76a031e35 100644 --- a/src/openprocurement/tender/cfaua/models/submodels/bids.py +++ b/src/openprocurement/tender/cfaua/models/submodels/bids.py @@ -11,6 +11,7 @@ EUConfidentialDocument, ConfidentialDocumentModelType, ) +from openprocurement.tender.core.validation import ValidateSelfEligibleMixin from openprocurement.tender.cfaua.constants import BID_UNSUCCESSFUL_FROM from openprocurement.tender.cfaua.models.submodels.lotvalue import LotValue from openprocurement.tender.cfaua.models.submodels.parameters import BidParameter @@ -44,12 +45,12 @@ def export_loop(self, model_instance, field_converter, role=None, print_none=Fal return shaped -class Bid(BaseBid): +class Bid(ValidateSelfEligibleMixin, BaseBid): class Options: _all_documents = whitelist("documents", "eligibilityDocuments", "financialDocuments", "qualificationDocuments") _edit = whitelist("value", "lotValues", "parameters", "subcontractingDetails", "tenderers", "status") _create = _all_documents + _edit + {"selfEligible", "selfQualified"} - _open_view = _create + whitelist("id", "date", "participationUrl") + _open_view = _create + whitelist("id", "date", "participationUrl", "requirementResponses") _qualification_view = whitelist("id", "status", "tenderers", "documents", "eligibilityDocuments") roles = { "create": _create, @@ -86,7 +87,7 @@ class Options: qualificationDocuments = ListType(ConfidentialDocumentModelType(EUConfidentialDocument, required=True), default=list()) lotValues = ListType(ModelType(LotValue, required=True), default=list()) selfQualified = BooleanType(required=True, choices=[True]) - selfEligible = BooleanType(required=True, choices=[True]) + selfEligible = BooleanType(choices=[True]) subcontractingDetails = StringType() parameters = ListType(ModelType(BidParameter, required=True), default=list(), validators=[validate_parameters_uniq]) status = StringType( diff --git a/src/openprocurement/tender/cfaua/models/submodels/lot.py b/src/openprocurement/tender/cfaua/models/submodels/lot.py index 0bcaa314c0..89766f1e0e 100644 --- a/src/openprocurement/tender/cfaua/models/submodels/lot.py +++ b/src/openprocurement/tender/cfaua/models/submodels/lot.py @@ -2,7 +2,7 @@ from openprocurement.tender.cfaua.models.submodels.guarantee import Guarantee from openprocurement.tender.cfaua.models.submodels.periods import LotAuctionPeriod from openprocurement.tender.cfaua.models.submodels.value import Value -from openprocurement.tender.core.models import Lot as BaseLot +from openprocurement.tender.core.models import LotWithMinimalStepLimitsValidation as BaseLot from schematics.types.compound import ModelType from schematics.types.serializable import serializable diff --git a/src/openprocurement/tender/cfaua/models/submodels/periods.py b/src/openprocurement/tender/cfaua/models/submodels/periods.py index 02c31df9a8..700121a972 100644 --- a/src/openprocurement/tender/cfaua/models/submodels/periods.py +++ b/src/openprocurement/tender/cfaua/models/submodels/periods.py @@ -6,9 +6,9 @@ from openprocurement.tender.core.models import get_tender from openprocurement.api.models import PeriodEndRequired as BasePeriodEndRequired, Period from openprocurement.tender.core.utils import ( - calculate_tender_business_date, calc_auction_end_time, - rounding_shouldStartAfter, + normalize_should_start_after, + calculate_tender_date, ) from schematics.exceptions import ValidationError from schematics.types.serializable import serializable @@ -37,7 +37,7 @@ def shouldStartAfter(self): return start_after = None if tender.status == "active.tendering" and tender.tenderPeriod.endDate: - start_after = calculate_tender_business_date(tender.tenderPeriod.endDate, TENDERING_AUCTION, tender) + start_after = calculate_tender_date(tender.tenderPeriod.endDate, TENDERING_AUCTION, tender) elif self.startDate and get_now() > calc_auction_end_time(tender.numberOfBids, self.startDate): start_after = calc_auction_end_time(tender.numberOfBids, self.startDate) elif tender.qualificationPeriod and tender.qualificationPeriod.endDate: @@ -52,7 +52,7 @@ def shouldStartAfter(self): decision_dates.append(tender.qualificationPeriod.endDate) start_after = max(decision_dates) if start_after: - return rounding_shouldStartAfter(start_after, tender).isoformat() + return normalize_should_start_after(start_after, tender).isoformat() class ContractPeriod(Period): @@ -68,14 +68,12 @@ def shouldStartAfter(self): return tender = get_tender(self) lot = self.__parent__ - if ( - tender.status not in ["active.tendering", "active.pre-qualification.stand-still", "active.auction"] - or lot.status != "active" - ): + statuses = ["active.tendering", "active.pre-qualification.stand-still", "active.auction"] + if tender.status not in statuses or lot.status != "active": return start_after = None if tender.status == "active.tendering" and tender.tenderPeriod.endDate: - start_after = calculate_tender_business_date(tender.tenderPeriod.endDate, TENDERING_AUCTION, tender) + start_after = calculate_tender_date(tender.tenderPeriod.endDate, TENDERING_AUCTION, tender) elif self.startDate and get_now() > calc_auction_end_time(lot.numberOfBids, self.startDate): start_after = calc_auction_end_time(lot.numberOfBids, self.startDate) elif tender.qualificationPeriod and tender.qualificationPeriod.endDate: @@ -90,4 +88,4 @@ def shouldStartAfter(self): decision_dates.append(tender.qualificationPeriod.endDate) start_after = max(decision_dates) if start_after: - return rounding_shouldStartAfter(start_after, tender).isoformat() + return normalize_should_start_after(start_after, tender).isoformat() diff --git a/src/openprocurement/tender/cfaua/models/tender.py b/src/openprocurement/tender/cfaua/models/tender.py index 0beacb087f..194ee2d60a 100644 --- a/src/openprocurement/tender/cfaua/models/tender.py +++ b/src/openprocurement/tender/cfaua/models/tender.py @@ -7,7 +7,7 @@ from zope.interface import implementer, provider from openprocurement.api.auth import ACCR_3, ACCR_4, ACCR_5 -from openprocurement.api.models import Period, ListType, SifterListType, plain_role, IsoDurationType +from openprocurement.api.models import Period, ListType, SifterListType, IsoDurationType from openprocurement.api.utils import get_now from openprocurement.api.validation import validate_cpv_group, validate_items_uniq, validate_classification_id from openprocurement.tender.cfaua.validation import validate_max_awards_number, validate_max_agreement_duration_period @@ -30,12 +30,8 @@ validate_features_uniq, Question, Tender, EUDocument, ) from openprocurement.tender.core.utils import ( - calculate_tender_business_date, - calc_auction_end_time, - has_unanswered_questions, - has_unanswered_complaints, + check_auction_period, ) -from openprocurement.tender.openua.constants import AUCTION_PERIOD_TIME @implementer(ICloseFrameworkAgreementUA) @@ -226,26 +222,10 @@ def __acl__(self): return acl def check_auction_time(self): - if ( - self.auctionPeriod - and self.auctionPeriod.startDate - and self.auctionPeriod.shouldStartAfter - and self.auctionPeriod.startDate - > calculate_tender_business_date( - parse_date(self.auctionPeriod.shouldStartAfter), AUCTION_PERIOD_TIME, self, True - ) - ): + if check_auction_period(self.auctionPeriod, self): self.auctionPeriod.startDate = None for lot in self.lots: - if ( - lot.auctionPeriod - and lot.auctionPeriod.startDate - and lot.auctionPeriod.shouldStartAfter - and lot.auctionPeriod.startDate - > calculate_tender_business_date( - parse_date(lot.auctionPeriod.shouldStartAfter), AUCTION_PERIOD_TIME, self, True - ) - ): + if check_auction_period(lot.auctionPeriod, self): lot.auctionPeriod.startDate = None def invalidate_bids_data(self): diff --git a/src/openprocurement/tender/cfaua/subscribers.py b/src/openprocurement/tender/cfaua/subscribers.py index edde974497..d5bc22cb60 100644 --- a/src/openprocurement/tender/cfaua/subscribers.py +++ b/src/openprocurement/tender/cfaua/subscribers.py @@ -6,7 +6,7 @@ from openprocurement.tender.core.utils import ( get_now, calculate_tender_business_date, - calculate_clarifications_business_date, + calculate_clarif_business_date, ) from openprocurement.tender.core.models import EnquiryPeriod @@ -16,14 +16,14 @@ def tender_init_handler(event): """ initialization handler for closeFrameworkAgreementUA tenders """ tender = event.tender config = getAdapter(tender, IContentConfigurator) - endDate = calculate_tender_business_date(tender.tenderPeriod.endDate, -config.questions_stand_still, tender) - clarificationsUntil = calculate_clarifications_business_date(endDate, config.enquiry_stand_still, tender, True) + end_date = calculate_tender_business_date(tender.tenderPeriod.endDate, -config.questions_stand_still, tender) + clarifications_until = calculate_clarif_business_date(end_date, config.enquiry_stand_still, tender, True) tender.enquiryPeriod = EnquiryPeriod( dict( startDate=tender.tenderPeriod.startDate, - endDate=endDate, + endDate=end_date, invalidationDate=tender.enquiryPeriod and tender.enquiryPeriod.invalidationDate, - clarificationsUntil=clarificationsUntil, + clarificationsUntil=clarifications_until, ) ) now = get_now() diff --git a/src/openprocurement/tender/cfaua/tests/base.py b/src/openprocurement/tender/cfaua/tests/base.py index 1ae6341a50..285d9f45ec 100644 --- a/src/openprocurement/tender/cfaua/tests/base.py +++ b/src/openprocurement/tender/cfaua/tests/base.py @@ -2,23 +2,19 @@ import json import os from copy import deepcopy -from datetime import datetime, timedelta +from datetime import timedelta from uuid import uuid4 from openprocurement.api.constants import SANDBOX_MODE from openprocurement.tender.belowthreshold.tests.base import set_tender_lots, set_bid_lotvalues, test_cancellation +from openprocurement.tender.cfaua.models.tender import CloseFrameworkAgreementUA +from openprocurement.tender.cfaua.tests.periods import PERIODS from openprocurement.tender.openua.tests.base import BaseTenderUAWebTest as BaseBaseTenderWebTest from openprocurement.tender.core.tests.cancellation import activate_cancellation_with_complaints_after_2020_04_19 from openprocurement.api.utils import apply_data_patch, get_now -from openprocurement.api.constants import RELEASE_2020_04_19 +from openprocurement.api.constants import RELEASE_2020_04_19, RELEASE_ECRITERIA_ARTICLE_17 from openprocurement.tender.cfaua.constants import ( TENDERING_DAYS, - TENDERING_DURATION, - QUESTIONS_STAND_STILL, - COMPLAINT_STAND_STILL, - QUALIFICATION_COMPLAINT_STAND_STILL, MIN_BIDS_NUMBER, - TENDERING_EXTRA_PERIOD, - CLARIFICATIONS_UNTIL_PERIOD, ) BASE_DIR = os.path.dirname(os.path.abspath(__file__)) @@ -29,6 +25,8 @@ test_bids = json.load(fd) test_bids = [deepcopy(test_bids[0]) for _ in range(MIN_BIDS_NUMBER)] for num, test_bid in enumerate(test_bids): + if get_now() > RELEASE_ECRITERIA_ARTICLE_17: + del test_bid["selfEligible"] test_bid["value"]["amount"] = test_bid["value"]["amount"] + num * 1 # Prepare test_features_tender_data @@ -70,367 +68,8 @@ agreement_period = {"startDate": start_date.isoformat(), "endDate": (start_date + timedelta(days=4 * 365)).isoformat()} - -PERIODS = { - "active.enquiries": { - "start": { - "enquiryPeriod": {"startDate": -timedelta(days=1), "endDate": TENDERING_DURATION - QUESTIONS_STAND_STILL}, - "tenderPeriod": {"startDate": -timedelta(days=1), "endDate": TENDERING_DURATION}, - }, - "end": { - "enquiryPeriod": { - "startDate": (-TENDERING_DURATION + TENDERING_EXTRA_PERIOD - timedelta(days=1)), - "endDate": timedelta(), - }, - "tenderPeriod": { - "startDate": (-TENDERING_DURATION + TENDERING_EXTRA_PERIOD - timedelta(days=1)), - "endDate": TENDERING_EXTRA_PERIOD, - }, - }, - }, - "active.tendering": { - "start": { - "enquiryPeriod": {"startDate": -timedelta(days=1), "endDate": TENDERING_DURATION - QUESTIONS_STAND_STILL}, - "tenderPeriod": {"startDate": -timedelta(days=1), "endDate": TENDERING_DURATION}, - }, - "end": { - "enquiryPeriod": { - "startDate": (-TENDERING_DURATION - timedelta(days=1)), - "endDate": (-QUESTIONS_STAND_STILL), - }, - "tenderPeriod": {"startDate": (-TENDERING_DURATION - timedelta(days=1)), "endDate": timedelta()}, - }, - }, - "active.pre-qualification": { - "start": { - "enquiryPeriod": { - "startDate": (-TENDERING_DURATION - timedelta(days=1)), - "endDate": (-QUESTIONS_STAND_STILL), - }, - "tenderPeriod": {"startDate": (-TENDERING_DURATION - timedelta(days=1)), "endDate": timedelta()}, - "qualificationPeriod": {"startDate": timedelta()}, - }, - "end": { - "enquiryPeriod": { - "startDate": (-TENDERING_DURATION - timedelta(days=1)), - "endDate": (-QUESTIONS_STAND_STILL), - }, - "tenderPeriod": {"startDate": (-TENDERING_DURATION - timedelta(days=1)), "endDate": timedelta()}, - "qualificationPeriod": {"startDate": timedelta()}, - }, - }, - "active.pre-qualification.stand-still": { - "start": { - "enquiryPeriod": { - "startDate": (-TENDERING_DURATION - timedelta(days=1)), - "endDate": (-QUESTIONS_STAND_STILL), - }, - "tenderPeriod": {"startDate": (-TENDERING_DURATION - timedelta(days=1)), "endDate": timedelta()}, - "qualificationPeriod": {"startDate": timedelta()}, - "auctionPeriod": {"startDate": (+COMPLAINT_STAND_STILL)}, - }, - "end": { - "enquiryPeriod": { - "startDate": (-TENDERING_DURATION - COMPLAINT_STAND_STILL - timedelta(days=1)), - "endDate": (-COMPLAINT_STAND_STILL - TENDERING_DURATION + QUESTIONS_STAND_STILL), - }, - "tenderPeriod": { - "startDate": (-TENDERING_DURATION - COMPLAINT_STAND_STILL - timedelta(days=1)), - "endDate": (-COMPLAINT_STAND_STILL), - }, - "qualificationPeriod": {"startDate": (-COMPLAINT_STAND_STILL), "endDate": timedelta()}, - "auctionPeriod": {"startDate": timedelta()}, - }, - }, - "active.auction": { - "start": { - "enquiryPeriod": { - "startDate": (-TENDERING_DURATION - COMPLAINT_STAND_STILL - timedelta(days=1)), - "endDate": (-COMPLAINT_STAND_STILL - TENDERING_DURATION + QUESTIONS_STAND_STILL), - }, - "tenderPeriod": { - "startDate": (-TENDERING_DURATION - COMPLAINT_STAND_STILL - timedelta(days=1)), - "endDate": (-COMPLAINT_STAND_STILL), - }, - "qualificationPeriod": {"startDate": (-COMPLAINT_STAND_STILL), "endDate": timedelta()}, - "auctionPeriod": {"startDate": timedelta()}, - }, - "end": { - "enquiryPeriod": { - "startDate": (-TENDERING_DURATION - COMPLAINT_STAND_STILL - timedelta(days=2)), - "endDate": (-QUESTIONS_STAND_STILL - COMPLAINT_STAND_STILL - timedelta(days=1)), - }, - "tenderPeriod": { - "startDate": (-TENDERING_DURATION - COMPLAINT_STAND_STILL - timedelta(days=2)), - "endDate": (-COMPLAINT_STAND_STILL - timedelta(days=1)), - }, - "qualificationPeriod": { - "startDate": (-COMPLAINT_STAND_STILL - timedelta(days=1)), - "endDate": (-timedelta(days=1)), - }, - "auctionPeriod": {"startDate": -timedelta(days=1), "endDate": timedelta()}, - }, - }, - "active.qualification": { - "start": { - "enquiryPeriod": { - "startDate": (-TENDERING_DURATION - COMPLAINT_STAND_STILL - timedelta(days=2)), - "endDate": (-QUESTIONS_STAND_STILL - COMPLAINT_STAND_STILL - timedelta(days=1)), - }, - "tenderPeriod": { - "startDate": (-TENDERING_DURATION - COMPLAINT_STAND_STILL - timedelta(days=2)), - "endDate": (-COMPLAINT_STAND_STILL - timedelta(days=1)), - }, - "qualificationPeriod": { - "startDate": (-COMPLAINT_STAND_STILL - timedelta(days=1)), - "endDate": (-timedelta(days=1)), - }, - "auctionPeriod": {"startDate": -timedelta(days=1), "endDate": timedelta()}, - "awardPeriod": {"startDate": timedelta()}, - }, - "end": { - "enquiryPeriod": { - "startDate": (-TENDERING_DURATION - COMPLAINT_STAND_STILL - timedelta(days=2)), - "endDate": (-QUESTIONS_STAND_STILL - COMPLAINT_STAND_STILL - timedelta(days=1)), - }, - "tenderPeriod": { - "startDate": (-TENDERING_DURATION - COMPLAINT_STAND_STILL - timedelta(days=2)), - "endDate": (-COMPLAINT_STAND_STILL - timedelta(days=1)), - }, - "qualificationPeriod": { - "startDate": (-COMPLAINT_STAND_STILL - timedelta(days=1)), - "endDate": (-timedelta(days=1)), - }, - "auctionPeriod": {"startDate": -timedelta(days=1), "endDate": timedelta()}, - "awardPeriod": {"startDate": timedelta()}, - }, - }, - "active.qualification.stand-still": { - "start": { - "enquiryPeriod": { - "startDate": (-TENDERING_DURATION - COMPLAINT_STAND_STILL - timedelta(days=2)), - "endDate": (-QUESTIONS_STAND_STILL - COMPLAINT_STAND_STILL - timedelta(days=1)), - }, - "tenderPeriod": { - "startDate": (-TENDERING_DURATION - COMPLAINT_STAND_STILL - timedelta(days=2)), - "endDate": (-COMPLAINT_STAND_STILL - timedelta(days=1)), - }, - "qualificationPeriod": { - "startDate": (-COMPLAINT_STAND_STILL - timedelta(days=1)), - "endDate": (-timedelta(days=1)), - }, - "auctionPeriod": {"startDate": -timedelta(days=1), "endDate": timedelta()}, - "awardPeriod": {"startDate": timedelta(), "endDate": QUALIFICATION_COMPLAINT_STAND_STILL}, - }, - "end": { - "enquiryPeriod": { - "startDate": ( - -TENDERING_DURATION - - COMPLAINT_STAND_STILL - - QUALIFICATION_COMPLAINT_STAND_STILL - - timedelta(days=2) - ), - "endDate": ( - -QUESTIONS_STAND_STILL - - COMPLAINT_STAND_STILL - - QUALIFICATION_COMPLAINT_STAND_STILL - - timedelta(days=1) - ), - }, - "tenderPeriod": { - "startDate": ( - -TENDERING_DURATION - - COMPLAINT_STAND_STILL - - QUALIFICATION_COMPLAINT_STAND_STILL - - timedelta(days=2) - ), - "endDate": (-COMPLAINT_STAND_STILL - QUALIFICATION_COMPLAINT_STAND_STILL - timedelta(days=1)), - }, - "qualificationPeriod": { - "startDate": (-COMPLAINT_STAND_STILL - QUALIFICATION_COMPLAINT_STAND_STILL - timedelta(days=1)), - "endDate": (-QUALIFICATION_COMPLAINT_STAND_STILL - timedelta(days=1)), - }, - "auctionPeriod": { - "startDate": (-QUALIFICATION_COMPLAINT_STAND_STILL - timedelta(days=1)), - "endDate": (-QUALIFICATION_COMPLAINT_STAND_STILL), - }, - "awardPeriod": {"startDate": (-QUALIFICATION_COMPLAINT_STAND_STILL), "endDate": timedelta()}, - }, - }, - "active.awarded": { - "start": { - "enquiryPeriod": { - "startDate": ( - -TENDERING_DURATION - - COMPLAINT_STAND_STILL - - QUALIFICATION_COMPLAINT_STAND_STILL - - timedelta(days=2) - ), - "endDate": ( - -QUESTIONS_STAND_STILL - - COMPLAINT_STAND_STILL - - QUALIFICATION_COMPLAINT_STAND_STILL - - timedelta(days=1) - ), - }, - "tenderPeriod": { - "startDate": ( - -TENDERING_DURATION - - COMPLAINT_STAND_STILL - - QUALIFICATION_COMPLAINT_STAND_STILL - - timedelta(days=2) - ), - "endDate": (-COMPLAINT_STAND_STILL - QUALIFICATION_COMPLAINT_STAND_STILL - timedelta(days=1)), - }, - "qualificationPeriod": { - "startDate": (-COMPLAINT_STAND_STILL - QUALIFICATION_COMPLAINT_STAND_STILL - timedelta(days=1)), - "endDate": (-QUALIFICATION_COMPLAINT_STAND_STILL - timedelta(days=1)), - }, - "auctionPeriod": { - "startDate": (-QUALIFICATION_COMPLAINT_STAND_STILL - timedelta(days=1)), - "endDate": (-QUALIFICATION_COMPLAINT_STAND_STILL), - }, - "awardPeriod": {"startDate": (-QUALIFICATION_COMPLAINT_STAND_STILL), "endDate": timedelta()}, - "contractPeriod": {"startDate": timedelta(), "clarificationsUntil": CLARIFICATIONS_UNTIL_PERIOD}, - }, - "end": { - "enquiryPeriod": { - "startDate": -TENDERING_DURATION - - COMPLAINT_STAND_STILL - - QUALIFICATION_COMPLAINT_STAND_STILL - - CLARIFICATIONS_UNTIL_PERIOD - - timedelta(days=3), - "endDate": -QUESTIONS_STAND_STILL - - COMPLAINT_STAND_STILL - - QUALIFICATION_COMPLAINT_STAND_STILL - - CLARIFICATIONS_UNTIL_PERIOD - - timedelta(days=2), - }, - "tenderPeriod": { - "startDate": -TENDERING_DURATION - - COMPLAINT_STAND_STILL - - QUALIFICATION_COMPLAINT_STAND_STILL - - CLARIFICATIONS_UNTIL_PERIOD - - timedelta(days=3), - "endDate": -COMPLAINT_STAND_STILL - - QUALIFICATION_COMPLAINT_STAND_STILL - - CLARIFICATIONS_UNTIL_PERIOD - - timedelta(days=2), - }, - "qualificationPeriod": { - "startDate": -COMPLAINT_STAND_STILL - - QUALIFICATION_COMPLAINT_STAND_STILL - - CLARIFICATIONS_UNTIL_PERIOD - - timedelta(days=2), - "endDate": -QUALIFICATION_COMPLAINT_STAND_STILL - CLARIFICATIONS_UNTIL_PERIOD - timedelta(days=2), - }, - "auctionPeriod": { - "startDate": -QUALIFICATION_COMPLAINT_STAND_STILL - CLARIFICATIONS_UNTIL_PERIOD - timedelta(days=2), - "endDate": -QUALIFICATION_COMPLAINT_STAND_STILL - CLARIFICATIONS_UNTIL_PERIOD - timedelta(days=1), - }, - "awardPeriod": { - "startDate": -QUALIFICATION_COMPLAINT_STAND_STILL - CLARIFICATIONS_UNTIL_PERIOD - timedelta(days=1), - "endDate": -CLARIFICATIONS_UNTIL_PERIOD - timedelta(days=1), - }, - "contractPeriod": { - "startDate": -CLARIFICATIONS_UNTIL_PERIOD - timedelta(days=1), - "clarificationsUntil": -timedelta(days=1), - }, - }, - }, - "complete": { - "start": { - "enquiryPeriod": { - "startDate": ( - -TENDERING_DURATION - - COMPLAINT_STAND_STILL - - QUALIFICATION_COMPLAINT_STAND_STILL - - timedelta(days=2) - - (CLARIFICATIONS_UNTIL_PERIOD + timedelta(days=1)) - ), - "endDate": ( - -QUESTIONS_STAND_STILL - - COMPLAINT_STAND_STILL - - QUALIFICATION_COMPLAINT_STAND_STILL - - timedelta(days=1) - - (CLARIFICATIONS_UNTIL_PERIOD + timedelta(days=1)) - ), - }, - "tenderPeriod": { - "startDate": ( - -TENDERING_DURATION - - COMPLAINT_STAND_STILL - - QUALIFICATION_COMPLAINT_STAND_STILL - - timedelta(days=2) - - (CLARIFICATIONS_UNTIL_PERIOD + timedelta(days=1)) - ), - "endDate": ( - -COMPLAINT_STAND_STILL - - QUALIFICATION_COMPLAINT_STAND_STILL - - timedelta(days=1) - - (CLARIFICATIONS_UNTIL_PERIOD + timedelta(days=1)) - ), - }, - "qualificationPeriod": { - "startDate": ( - -COMPLAINT_STAND_STILL - - QUALIFICATION_COMPLAINT_STAND_STILL - - timedelta(days=1) - - (CLARIFICATIONS_UNTIL_PERIOD + timedelta(days=1)) - ), - "endDate": ( - -QUALIFICATION_COMPLAINT_STAND_STILL - - timedelta(days=1) - - (CLARIFICATIONS_UNTIL_PERIOD + timedelta(days=1)) - ), - }, - "auctionPeriod": { - "startDate": ( - -QUALIFICATION_COMPLAINT_STAND_STILL - - timedelta(days=1) - - (CLARIFICATIONS_UNTIL_PERIOD + timedelta(days=1)) - ), - "endDate": (-QUALIFICATION_COMPLAINT_STAND_STILL - (CLARIFICATIONS_UNTIL_PERIOD + timedelta(days=1))), - }, - "awardPeriod": { - "startDate": (-QUALIFICATION_COMPLAINT_STAND_STILL - (CLARIFICATIONS_UNTIL_PERIOD + timedelta(days=1))), - "endDate": (-(CLARIFICATIONS_UNTIL_PERIOD + timedelta(days=1))), - }, - "contractPeriod": { - "startDate": (-(CLARIFICATIONS_UNTIL_PERIOD + timedelta(days=1))), - "clarificationsUntil": (-timedelta(days=1)), - "endDate": timedelta(), - }, - } - }, -} - - if SANDBOX_MODE: test_tender_data["procurementMethodDetails"] = "quick, accelerator=1440" - PERIODS.update( - { - "active.enquiries": { - "start": { - "enquiryPeriod": { - "startDate": -timedelta(minutes=1), - "endDate": (TENDERING_DURATION - QUESTIONS_STAND_STILL) / 1440, - }, - "tenderPeriod": {"startDate": -timedelta(minutes=1), "endDate": TENDERING_DURATION / 1440}, - }, - "end": { - "enquiryPeriod": { - "startDate": (-TENDERING_DURATION + TENDERING_EXTRA_PERIOD - timedelta(days=1)) / 1440, - "endDate": timedelta(), - }, - "tenderPeriod": { - "startDate": (-TENDERING_DURATION + TENDERING_EXTRA_PERIOD - timedelta(days=1)) / 1440, - "endDate": TENDERING_EXTRA_PERIOD / 1440, - }, - }, - } - } - ) class BaseTenderWebTest(BaseBaseTenderWebTest): @@ -455,6 +94,8 @@ class BaseTenderWebTest(BaseBaseTenderWebTest): meta_initial_lots = deepcopy(test_lots) periods = PERIODS + tender_class = CloseFrameworkAgreementUA + forbidden_agreement_document_modification_actions_status = ( "unsuccessful" ) # status, in which operations with tender's contract documents (adding, updating) are forbidden @@ -491,16 +132,10 @@ def convert_bids_for_tender_with_lots(self, bids, lots): set_bid_lotvalues(bid, lots) def set_enquiry_period_end(self): - self.now = get_now() - self.tender_document = self.db.get(self.tender_id) - self.tender_document_patch = {} - self.update_periods("active.enquiries", "end") + self.set_status("active.tendering", startend="enquiry_end") def set_complaint_period_end(self): - self.now = get_now() - self.tender_document = self.db.get(self.tender_id) - self.tender_document_patch = {} - self.update_periods("active.tendering", "end") + self.set_status("active.tendering", startend="end") def setUp(self): super(BaseBaseTenderWebTest, self).setUp() @@ -510,121 +145,6 @@ def tearDown(self): super(BaseTenderWebTest, self).tearDown() self.restore_pure_data() - def time_shift(self, status, extra=None): - now = get_now() - tender = self.db.get(self.tender_id) - self.tender_document = tender - data = {} - if status == "enquiryPeriod_ends": - data.update( - { - "enquiryPeriod": { - "startDate": (now - timedelta(days=28)).isoformat(), - "endDate": (now - timedelta(days=1)).isoformat(), - }, - "tenderPeriod": { - "startDate": (now - timedelta(days=28)).isoformat(), - "endDate": (now + timedelta(days=2)).isoformat(), - }, - } - ) - if status == "active.pre-qualification": - data.update( - { - "enquiryPeriod": { - "startDate": (now - TENDERING_DURATION).isoformat(), - "endDate": (now - QUESTIONS_STAND_STILL).isoformat(), - }, - "tenderPeriod": {"startDate": (now - TENDERING_DURATION).isoformat(), "endDate": (now).isoformat()}, - } - ) - elif status == "active.pre-qualification.stand-still": - data.update( - { - "enquiryPeriod": { - "startDate": (now - TENDERING_DURATION).isoformat(), - "endDate": (now - QUESTIONS_STAND_STILL).isoformat(), - }, - "tenderPeriod": {"startDate": (now - TENDERING_DURATION).isoformat(), "endDate": (now).isoformat()}, - "qualificationPeriod": {"startDate": (now).isoformat()}, - } - ) - if "lots" in tender and tender["lots"]: - data["lots"] = [] - for index, lot in enumerate(tender["lots"]): - lot_data = {"id": lot["id"]} - if lot["status"] is "active": - lot_data["auctionPeriod"] = {"startDate": (now + COMPLAINT_STAND_STILL).isoformat()} - data["lots"].append(lot_data) - else: - data.update({"auctionPeriod": {"startDate": (now + COMPLAINT_STAND_STILL).isoformat()}}) - elif status == "active.auction": - data.update( - { - "enquiryPeriod": { - "startDate": (now - TENDERING_DURATION - COMPLAINT_STAND_STILL).isoformat(), - "endDate": ( - now - COMPLAINT_STAND_STILL - TENDERING_DURATION + QUESTIONS_STAND_STILL - ).isoformat(), - }, - "tenderPeriod": { - "startDate": (now - TENDERING_DURATION - COMPLAINT_STAND_STILL).isoformat(), - "endDate": (now - COMPLAINT_STAND_STILL).isoformat(), - }, - "qualificationPeriod": { - "startDate": (now - COMPLAINT_STAND_STILL).isoformat(), - "endDate": (now).isoformat(), - }, - } - ) - if "lots" in tender and tender["lots"]: - data["lots"] = [] - for index, lot in enumerate(tender["lots"]): - lot_data = {"id": lot["id"]} - if lot["status"] == "active": - lot_data["auctionPeriod"] = {"startDate": (now).isoformat()} - data["lots"].append(lot_data) - else: - data.update({"auctionPeriod": {"startDate": now.isoformat()}}) - elif status == "complete": - data.update( - { - "enquiryPeriod": { - "startDate": (now - TENDERING_DURATION - COMPLAINT_STAND_STILL - timedelta(days=3)).isoformat(), - "endDate": ( - now - QUESTIONS_STAND_STILL - COMPLAINT_STAND_STILL - timedelta(days=3) - ).isoformat(), - }, - "tenderPeriod": { - "startDate": (now - TENDERING_DURATION - COMPLAINT_STAND_STILL - timedelta(days=3)).isoformat(), - "endDate": (now - COMPLAINT_STAND_STILL - timedelta(days=3)).isoformat(), - }, - "auctionPeriod": { - "startDate": (now - timedelta(days=3)).isoformat(), - "endDate": (now - timedelta(days=2)).isoformat(), - }, - "awardPeriod": {"startDate": (now - timedelta(days=1)).isoformat(), "endDate": (now).isoformat()}, - } - ) - if self.initial_lots: - data.update( - { - "lots": [ - { - "auctionPeriod": { - "startDate": (now - timedelta(days=3)).isoformat(), - "endDate": (now - timedelta(days=2)).isoformat(), - } - } - for i in self.initial_lots - ] - } - ) - if extra: - data.update(extra) - self.tender_document_patch = data - self.save_changes() - def generate_bids(self, status, startend): tenderPeriod_startDate = self.now + self.periods[status][startend]["tenderPeriod"]["startDate"] bids = self.tender_document.get("bids", []) @@ -776,30 +296,6 @@ def activate_awards(self): self.tender_document_patch.update({"awards": awards}) self.save_changes() - def update_periods(self, status, startend): - LOT_PERIODS = ("auctionPeriod",) - lots = self.tender_document.get("lots", []) - - for period in self.periods[status][startend]: - self.tender_document_patch.update({period: {}}) - for date in self.periods[status][startend][period]: - self.tender_document_patch[period][date] = ( - self.now + self.periods[status][startend][period][date] - ).isoformat() - - if lots: - for period in self.periods[status][startend]: - if period in LOT_PERIODS: - for lot in lots: - if lot.get("status", None) == "active": - lot.update({period: {}}) - for date in self.periods[status][startend][period]: - lot[period][date] = ( - self.now + self.periods[status][startend][period][date] - ).isoformat() - self.tender_document_patch.update({"lots": lots}) - self.save_changes() - def update_awards_complaint_periods(self, status, startend): AWARDS_COMPLAINTS_STATUSES = ("active.qualification.stand-still", "active.awarded", "complete") awards = self.tender_document.get("awards", []) @@ -898,6 +394,7 @@ def set_status(self, status, startend="start", extra=None): self.now = get_now() self.tender_document = self.db.get(self.tender_id) self.tender_document_patch = {"status": status} + self.save_changes() if status == "active.tendering": self.update_periods(status, startend) elif status == "active.pre-qualification": @@ -976,6 +473,7 @@ def set_status(self, status, startend="start", extra=None): self.generate_agreements(status, startend) self.activate_agreements(status, startend) + self.save_changes() return self.get_tender("chronograph") def prepare_awards(self): diff --git a/src/openprocurement/tender/cfaua/tests/bid.py b/src/openprocurement/tender/cfaua/tests/bid.py index 31a4891f9f..0733ce59fc 100644 --- a/src/openprocurement/tender/cfaua/tests/bid.py +++ b/src/openprocurement/tender/cfaua/tests/bid.py @@ -3,6 +3,8 @@ from copy import deepcopy from openprocurement.api.tests.base import snitch +from openprocurement.api.utils import get_now +from openprocurement.api.constants import RELEASE_ECRITERIA_ARTICLE_17 from openprocurement.tender.belowthreshold.tests.base import test_organization, test_author from openprocurement.tender.belowthreshold.tests.bid_blanks import patch_tender_with_bids_lots_none @@ -51,7 +53,10 @@ view_bid_in_qualification_st_st, post_winningBid_document_in_awarded, ) - +from openprocurement.tender.openua.tests.bid import ( + TenderBidRequirementResponseTestMixin, + TenderBidRequirementResponseEvidenceTestMixin, +) from openprocurement.tender.openeu.tests.bid_blanks import patch_tender_bidder_document_private_json, not_found @@ -150,13 +155,6 @@ class TenderBidBatchDocumentsWithDSResourceTest(BaseTenderLotsContentWebTest): test_bids_data = deepcopy(test_bids) author_data = test_bids[0]["tenderers"][0] - bid_data_wo_docs = { - "tenderers": [test_organization], - "value": {"amount": 500}, - "selfEligible": True, - "selfQualified": True, - "documents": [], - } test_create_tender_bid_with_document_invalid = snitch(create_tender_bid_with_document_invalid) test_create_tender_bid_with_document = snitch(create_tender_bid_with_document) @@ -180,6 +178,56 @@ class TenderBidBatchDocumentsWithDSResourceTest(BaseTenderLotsContentWebTest): test_create_tender_bid_with_all_documents = snitch(create_tender_bid_with_all_documents) + def setUp(self): + self.bid_data_wo_docs = { + "tenderers": [test_organization], + "value": {"amount": 500}, + "selfQualified": True, + "documents": [], + } + if get_now() < RELEASE_ECRITERIA_ARTICLE_17: + self.bid_data_wo_docs["selfEligible"] = True + + super(TenderBidBatchDocumentsWithDSResourceTest, self).setUp() + + +class CreateBidMixin(object): + base_bid_status = "draft" + + def setUp(self): + super(CreateBidMixin, self).setUp() + # Create bids + for x in range(self.min_bids_number): + bids_data = deepcopy(test_bids) + self.convert_bids_for_tender_with_lots(bids_data, self.initial_lots) + bids_data[0]["status"] = self.base_bid_status + response = self.app.post_json("/tenders/{}/bids".format(self.tender_id), {"data": bids_data[0]}) + bid = response.json["data"] + x = "" if x == 0 else x + 1 + setattr(self, "bid{}_id".format(x), bid["id"]) + setattr(self, "bid{}_token".format(x), response.json["access"]["token"]) + + self.bid_id = bid["id"] + self.bid_token = response.json["access"]["token"] + + +class TenderBidRequirementResponseResourceTest( + TenderBidRequirementResponseTestMixin, + CreateBidMixin, + BaseTenderLotsContentWebTest, +): + test_bids_data = test_bids + initial_status = "active.tendering" + + +class TenderBidRequirementResponseEvidenceResourceTest( + TenderBidRequirementResponseEvidenceTestMixin, + CreateBidMixin, + BaseTenderLotsContentWebTest, +): + test_bids_data = test_bids + initial_status = "active.tendering" + def suite(): suite = unittest.TestSuite() @@ -188,6 +236,8 @@ def suite(): suite.addTest(unittest.makeSuite(TenderBidFeaturesResourceTest)) suite.addTest(unittest.makeSuite(TenderBidResourceTest)) suite.addTest(unittest.makeSuite(TenderBidBatchDocumentsWithDSResourceTest)) + suite.addTest(unittest.makeSuite(TenderBidRequirementResponseResourceTest)) + suite.addTest(unittest.makeSuite(TenderBidRequirementResponseEvidenceResourceTest)) return suite diff --git a/src/openprocurement/tender/cfaua/tests/bid_blanks.py b/src/openprocurement/tender/cfaua/tests/bid_blanks.py index 337b96bce3..9c383b3dc4 100644 --- a/src/openprocurement/tender/cfaua/tests/bid_blanks.py +++ b/src/openprocurement/tender/cfaua/tests/bid_blanks.py @@ -3,6 +3,8 @@ from datetime import datetime, timedelta from openprocurement.tender.cfaua.constants import CLARIFICATIONS_UNTIL_PERIOD from openprocurement.tender.cfaua.tests.base import agreement_period +from openprocurement.api.constants import RELEASE_ECRITERIA_ARTICLE_17 +from openprocurement.api.utils import get_now extra = {"agreements": [{"contracts": [{"unitPrices": [{"value": {"amount": 0}}]}] * 3}]} @@ -205,7 +207,7 @@ def bids_invalidation_on_tender_change(self): # they will be invalidated by this request response = self.app.patch_json( "/tenders/{}/lots/{}?acc_token={}".format(self.tender_id, self.initial_lots[0]["id"], self.tender_token), - {"data": {"value": {"amount": 300.0}}}, + {"data": {"value": {"amount": 300.0}, "minimalStep": {"amount": 9.0}}}, ) self.assertEqual(response.status, "200 OK") self.assertEqual(response.json["data"]["value"]["amount"], 300) @@ -251,17 +253,15 @@ def bids_invalidation_on_tender_change(self): valid_bid_token = response.json["access"]["token"] valid_bid_date = response.json["data"]["date"] + bid_data = deepcopy(self.test_bids_data[0]) + del bid_data["value"] + bid_data["lotValues"] = [{"value": {"amount": 101}, "relatedLot": self.initial_lots[0]["id"]}] + for i in range(1, self.min_bids_number): + bid_data["tenderers"] = initial_bids[i]["tenderers"] response = self.app.post_json( "/tenders/{}/bids".format(self.tender_id), - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": initial_bids[i]["tenderers"], - "lotValues": [{"value": {"amount": 101}, "relatedLot": self.initial_lots[0]["id"]}], - } - }, + {"data": bid_data}, ) # switch to active.pre-qualification @@ -811,47 +811,38 @@ def all_documents_accessible_for_reviewer(): response = self.app.get("/tenders/{}/bids".format(self.tender_id)) self.assertEqual(response.status, "200 OK") self.assertEqual(len(response.json["data"]), self.min_bids_number) + assert_data_1 = { + u"date", + u"status", + u"id", + u"lotValues", + u"tenderers", + u"documents", + u"eligibilityDocuments", + u"qualificationDocuments", + u"financialDocuments", + u"selfQualified", + } + + assert_data_2 = {u"date", u"status", u"id", u"lotValues", u"tenderers", u"selfQualified"} + + if get_now() < RELEASE_ECRITERIA_ARTICLE_17: + assert_data_1.add(u"selfEligible") + assert_data_2.add(u"selfEligible") + self.assertEqual( set(response.json["data"][0].keys()), - set( - [ - u"date", - u"status", - u"id", - u"lotValues", - u"tenderers", - u"documents", - u"eligibilityDocuments", - u"qualificationDocuments", - u"financialDocuments", - u"selfEligible", - u"selfQualified", - ] - ), + assert_data_1, ) self.assertEqual( set(response.json["data"][1].keys()), - set([u"date", u"status", u"id", u"lotValues", u"tenderers", u"selfEligible", u"selfQualified"]), + assert_data_2, ) response = self.app.get("/tenders/{}/bids/{}".format(self.tender_id, self.bid_id)) self.assertEqual(response.status, "200 OK") self.assertEqual( set(response.json["data"].keys()), - set( - [ - u"date", - u"status", - u"id", - u"lotValues", - u"tenderers", - u"documents", - u"eligibilityDocuments", - u"qualificationDocuments", - u"financialDocuments", - u"selfEligible", - u"selfQualified", - ] - ), + assert_data_1, ) all_documents_are_accessible_for_bid_owner(doc_resource) @@ -868,45 +859,17 @@ def all_documents_accessible_for_reviewer(): self.assertEqual(len(response.json["data"]), self.min_bids_number) self.assertEqual( set(response.json["data"][0].keys()), - set( - [ - u"date", - u"status", - u"id", - u"lotValues", - u"tenderers", - u"documents", - u"eligibilityDocuments", - u"qualificationDocuments", - u"financialDocuments", - u"selfEligible", - u"selfQualified", - ] - ), + assert_data_1, ) self.assertEqual( set(response.json["data"][1].keys()), - set([u"date", u"status", u"id", u"lotValues", u"tenderers", u"selfEligible", u"selfQualified"]), + assert_data_2, ) response = self.app.get("/tenders/{}/bids/{}".format(self.tender_id, self.bid_id)) self.assertEqual(response.status, "200 OK") self.assertEqual( set(response.json["data"].keys()), - set( - [ - u"date", - u"status", - u"id", - u"lotValues", - u"tenderers", - u"documents", - u"eligibilityDocuments", - u"qualificationDocuments", - u"financialDocuments", - u"selfEligible", - u"selfQualified", - ] - ), + assert_data_1, ) all_documents_are_accessible_for_bid_owner(doc_resource) for doc_resource in ["documents", "financial_documents", "eligibility_documents", "qualification_documents"]: @@ -922,45 +885,17 @@ def all_documents_accessible_for_reviewer(): self.assertEqual(len(response.json["data"]), self.min_bids_number) self.assertEqual( set(response.json["data"][0].keys()), - set( - [ - u"date", - u"status", - u"id", - u"lotValues", - u"tenderers", - u"documents", - u"eligibilityDocuments", - u"qualificationDocuments", - u"financialDocuments", - u"selfEligible", - u"selfQualified", - ] - ), + assert_data_1, ) self.assertEqual( set(response.json["data"][1].keys()), - set([u"date", u"status", u"id", u"lotValues", u"tenderers", u"selfEligible", u"selfQualified"]), + assert_data_2, ) response = self.app.get("/tenders/{}/bids/{}".format(self.tender_id, self.bid_id)) self.assertEqual(response.status, "200 OK") self.assertEqual( set(response.json["data"].keys()), - set( - [ - u"date", - u"status", - u"id", - u"lotValues", - u"tenderers", - u"documents", - u"eligibilityDocuments", - u"qualificationDocuments", - u"financialDocuments", - u"selfEligible", - u"selfQualified", - ] - ), + assert_data_1, ) all_documents_are_accessible_for_bid_owner(doc_resource) for doc_resource in ["documents", "financial_documents", "eligibility_documents", "qualification_documents"]: @@ -1866,7 +1801,7 @@ def download_tender_bidder_document(self): "Can't view bid documents in current (active.tendering) tender status", ) - self.time_shift("active.pre-qualification") + self.set_status("active.pre-qualification") self.check_chronograph() def test_bids_documents_after_tendering_resource(self, doc_id_by_type, private_doc_id_by_type, status): @@ -2204,32 +2139,26 @@ def create_tender_bidder_document_nopending(self): def bid_Administrator_change(self): + bid_data = deepcopy(self.test_bids_data[0]) + bid_data["lotValues"] = [{"value": {"amount": 500}, "relatedLot": self.initial_lots[0]["id"]}] + del bid_data["value"] response = self.app.post_json( "/tenders/{}/bids".format(self.tender_id), - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": [self.test_bids_data[0]["tenderers"][0]], - "lotValues": [{"value": {"amount": 500}, "relatedLot": self.initial_lots[0]["id"]}], - } - }, + {"data": bid_data}, ) self.assertEqual(response.status, "201 Created") self.assertEqual(response.content_type, "application/json") bid = response.json["data"] self.app.authorization = ("Basic", ("administrator", "")) + + bid_data.update({ + "tenderers": [{"identifier": {"id": "00000000"}}], + "lotValues": [{"value": {"amount": 400}, "relatedLot": self.initial_lots[0]["id"]}], + }) response = self.app.patch_json( "/tenders/{}/bids/{}".format(self.tender_id, bid["id"]), - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": [{"identifier": {"id": "00000000"}}], - "lotValues": [{"value": {"amount": 400}, "relatedLot": self.initial_lots[0]["id"]}], - } - }, + {"data": bid_data}, ) self.assertEqual(response.status, "200 OK") self.assertEqual(response.content_type, "application/json") @@ -2356,24 +2285,27 @@ def create_tender_biddder_invalid(self): self.assertEqual(response.status, "422 Unprocessable Entity") self.assertEqual(response.content_type, "application/json") self.assertEqual(response.json["status"], "error") + + assert_data = [ + {u"description": [u"This field is required."], u"location": u"body", u"name": u"selfQualified"}, + { + u"description": [ + { + u"contactPoint": [u"This field is required."], + u"identifier": {u"scheme": [u"This field is required."], u"id": [u"This field is required."]}, + u"name": [u"This field is required."], + u"address": [u"This field is required."], + } + ], + u"location": u"body", + u"name": u"tenderers", + }, + ] + if get_now() < RELEASE_ECRITERIA_ARTICLE_17: + assert_data.insert(0, {u"description": [u"This field is required."], u"location": u"body", u"name": u"selfEligible"}) self.assertEqual( response.json["errors"], - [ - {u"description": [u"This field is required."], u"location": u"body", u"name": u"selfEligible"}, - {u"description": [u"This field is required."], u"location": u"body", u"name": u"selfQualified"}, - { - u"description": [ - { - u"contactPoint": [u"This field is required."], - u"identifier": {u"scheme": [u"This field is required."], u"id": [u"This field is required."]}, - u"name": [u"This field is required."], - u"address": [u"This field is required."], - } - ], - u"location": u"body", - u"name": u"tenderers", - }, - ], + assert_data ) response = self.app.post_json( @@ -2381,35 +2313,40 @@ def create_tender_biddder_invalid(self): {"data": {"selfEligible": False, "tenderers": [{"name": "name", "identifier": {"uri": "invalid_value"}}]}}, status=422, ) + assert_data = [ + {u"description": [u"Value must be one of [True]."], u"location": u"body", u"name": u"selfEligible"}, + {u"description": [u"This field is required."], u"location": u"body", u"name": u"selfQualified"}, + { + u"description": [ + { + u"contactPoint": [u"This field is required."], + u"identifier": { + u"scheme": [u"This field is required."], + u"id": [u"This field is required."], + u"uri": [u"Not a well formed URL."], + }, + u"address": [u"This field is required."], + } + ], + u"location": u"body", + u"name": u"tenderers", + }, + ] + self.assertEqual(response.status, "422 Unprocessable Entity") self.assertEqual(response.content_type, "application/json") self.assertEqual(response.json["status"], "error") self.assertEqual( response.json["errors"], - [ - {u"description": [u"Value must be one of [True]."], u"location": u"body", u"name": u"selfEligible"}, - {u"description": [u"This field is required."], u"location": u"body", u"name": u"selfQualified"}, - { - u"description": [ - { - u"contactPoint": [u"This field is required."], - u"identifier": { - u"scheme": [u"This field is required."], - u"id": [u"This field is required."], - u"uri": [u"Not a well formed URL."], - }, - u"address": [u"This field is required."], - } - ], - u"location": u"body", - u"name": u"tenderers", - }, - ], + assert_data, ) + bid_data = deepcopy(self.test_bids_data[0]) + del bid_data["value"] + response = self.app.post_json( request_path, - {"data": {"selfEligible": True, "selfQualified": True, "tenderers": initial_bids[0]["tenderers"]}}, + {"data": bid_data}, status=422, ) self.assertEqual(response.status, "422 Unprocessable Entity") @@ -2663,34 +2600,22 @@ def features_bidder(self): initial_bids = deepcopy(self.test_bids_data) self.convert_bids_for_tender_with_lots(initial_bids, self.initial_lots) - test_features_bids = [ + test_features_bids = initial_bids[:2] + test_features_bids[0]["parameters"] = [{"code": i["code"], "value": 0.1} for i in self.initial_data["features"]] + test_features_bids[0]["lotValues"] = [ { - # "status": "pending", - "parameters": [{"code": i["code"], "value": 0.1} for i in self.initial_data["features"]], - "tenderers": initial_bids[0]["tenderers"], - "lotValues": [ - { - "value": {"amount": 469, "currency": "UAH", "valueAddedTaxIncluded": True}, - "relatedLot": self.initial_lots[0]["id"], - } - ], - "selfQualified": True, - "selfEligible": True, - }, + "value": {"amount": 469, "currency": "UAH", "valueAddedTaxIncluded": True}, + "relatedLot": self.initial_lots[0]["id"], + } + ] + test_features_bids[1]["parameters"] = [{"code": i["code"], "value": 0.15} for i in self.initial_data["features"]] + test_features_bids[1]["lotValues"] = [ { - "status": "pending", - "parameters": [{"code": i["code"], "value": 0.15} for i in self.initial_data["features"]], - "tenderers": initial_bids[1]["tenderers"], - "lotValues": [ - { - "value": {"amount": 479, "currency": "UAH", "valueAddedTaxIncluded": True}, - "relatedLot": self.initial_lots[0]["id"], - } - ], - "selfQualified": True, - "selfEligible": True, - }, + "value": {"amount": 479, "currency": "UAH", "valueAddedTaxIncluded": True}, + "relatedLot": self.initial_lots[0]["id"], + } ] + for i in test_features_bids: response = self.app.post_json("/tenders/{}/bids".format(self.tender_id), {"data": i}) i["status"] = "pending" @@ -2708,18 +2633,13 @@ def features_bidder_invalid(self): initial_bids = deepcopy(self.test_bids_data) self.convert_bids_for_tender_with_lots(initial_bids, self.initial_lots) - data = { - "tenderers": initial_bids[0]["tenderers"], - "lotValues": [ - { - "value": {"amount": 469, "currency": "UAH", "valueAddedTaxIncluded": True}, - "relatedLot": self.initial_lots[0]["id"], - } - ], - "selfQualified": True, - "selfEligible": True, - } - response = self.app.post_json("/tenders/{}/bids".format(self.tender_id), {"data": data}, status=422) + bid_data = deepcopy(self.test_bids_data[0]) + del bid_data["value"] + bid_data["lotValues"] = [{ + "value": {"amount": 469, "currency": "UAH", "valueAddedTaxIncluded": True}, + "relatedLot": self.initial_lots[0]["id"], + }] + response = self.app.post_json("/tenders/{}/bids".format(self.tender_id), {"data": bid_data}, status=422) self.assertEqual(response.status, "422 Unprocessable Entity") self.assertEqual(response.content_type, "application/json") self.assertEqual(response.json["status"], "error") @@ -2727,8 +2647,8 @@ def features_bidder_invalid(self): response.json["errors"], [{u"description": [u"All features parameters is required."], u"location": u"body", u"name": u"parameters"}], ) - data["parameters"] = [{"code": "OCDS-123454-AIR-INTAKE", "value": 0.1}] - response = self.app.post_json("/tenders/{}/bids".format(self.tender_id), {"data": data}, status=422) + bid_data["parameters"] = [{"code": "OCDS-123454-AIR-INTAKE", "value": 0.1}] + response = self.app.post_json("/tenders/{}/bids".format(self.tender_id), {"data": bid_data}, status=422) self.assertEqual(response.status, "422 Unprocessable Entity") self.assertEqual(response.content_type, "application/json") self.assertEqual(response.json["status"], "error") @@ -2736,8 +2656,8 @@ def features_bidder_invalid(self): response.json["errors"], [{u"description": [u"All features parameters is required."], u"location": u"body", u"name": u"parameters"}], ) - data["parameters"].append({"code": "OCDS-123454-AIR-INTAKE", "value": 0.1}) - response = self.app.post_json("/tenders/{}/bids".format(self.tender_id), {"data": data}, status=422) + bid_data["parameters"].append({"code": "OCDS-123454-AIR-INTAKE", "value": 0.1}) + response = self.app.post_json("/tenders/{}/bids".format(self.tender_id), {"data": bid_data}, status=422) self.assertEqual(response.status, "422 Unprocessable Entity") self.assertEqual(response.content_type, "application/json") self.assertEqual(response.json["status"], "error") @@ -2751,9 +2671,9 @@ def features_bidder_invalid(self): } ], ) - data["parameters"][1]["code"] = "OCDS-123454-YEARS" - data["parameters"][1]["value"] = 0.2 - response = self.app.post_json("/tenders/{}/bids".format(self.tender_id), {"data": data}, status=422) + bid_data["parameters"][1]["code"] = "OCDS-123454-YEARS" + bid_data["parameters"][1]["value"] = 0.2 + response = self.app.post_json("/tenders/{}/bids".format(self.tender_id), {"data": bid_data}, status=422) self.assertEqual(response.status, "422 Unprocessable Entity") self.assertEqual(response.content_type, "application/json") self.assertEqual(response.json["status"], "error") @@ -3448,51 +3368,42 @@ def all_public_documents_are_accessible_for_others(): response = self.app.get("/tenders/{}".format(self.tender_id)) self.assertEqual(response.json["data"]["status"], "active.qualification") + assert_data_1 = { + u"date", + u"status", + u"id", + u"lotValues", + u"tenderers", + u"documents", + u"eligibilityDocuments", + u"qualificationDocuments", + u"financialDocuments", + u"selfQualified", + } + + assert_data_2 = {u"date", u"status", u"id", u"lotValues", u"tenderers", u"selfQualified"} + + if get_now() < RELEASE_ECRITERIA_ARTICLE_17: + assert_data_1.add(u"selfEligible") + assert_data_2.add(u"selfEligible") + self.app.authorization = ("Basic", ("anon", "")) response = self.app.get("/tenders/{}/bids".format(self.tender_id)) self.assertEqual(response.status, "200 OK") self.assertEqual(len(response.json["data"]), self.min_bids_number) self.assertEqual( set(response.json["data"][0].keys()), - set( - [ - u"date", - u"status", - u"id", - u"lotValues", - u"tenderers", - u"documents", - u"eligibilityDocuments", - u"qualificationDocuments", - u"financialDocuments", - u"selfEligible", - u"selfQualified", - ] - ), + assert_data_1, ) self.assertEqual( set(response.json["data"][1].keys()), - set([u"date", u"status", u"id", u"lotValues", u"tenderers", u"selfEligible", u"selfQualified"]), + assert_data_2, ) response = self.app.get("/tenders/{}/bids/{}".format(self.tender_id, self.bid_id)) self.assertEqual(response.status, "200 OK") self.assertEqual( set(response.json["data"].keys()), - set( - [ - u"date", - u"status", - u"id", - u"lotValues", - u"tenderers", - u"documents", - u"eligibilityDocuments", - u"qualificationDocuments", - u"financialDocuments", - u"selfEligible", - u"selfQualified", - ] - ), + assert_data_1, ) all_documents_are_accessible_for_bid_owner(doc_resource) @@ -3511,45 +3422,17 @@ def all_public_documents_are_accessible_for_others(): self.assertEqual(len(response.json["data"]), self.min_bids_number) self.assertEqual( set(response.json["data"][0].keys()), - set( - [ - u"date", - u"status", - u"id", - u"lotValues", - u"tenderers", - u"documents", - u"eligibilityDocuments", - u"qualificationDocuments", - u"financialDocuments", - u"selfEligible", - u"selfQualified", - ] - ), + assert_data_1, ) self.assertEqual( set(response.json["data"][1].keys()), - set([u"date", u"status", u"id", u"lotValues", u"tenderers", u"selfEligible", u"selfQualified"]), + assert_data_2, ) response = self.app.get("/tenders/{}/bids/{}".format(self.tender_id, self.bid_id)) self.assertEqual(response.status, "200 OK") self.assertEqual( set(response.json["data"].keys()), - set( - [ - u"date", - u"status", - u"id", - u"lotValues", - u"tenderers", - u"documents", - u"eligibilityDocuments", - u"qualificationDocuments", - u"financialDocuments", - u"selfEligible", - u"selfQualified", - ] - ), + assert_data_1, ) all_documents_are_accessible_for_bid_owner(doc_resource) for doc_resource in ["documents", "financial_documents", "eligibility_documents", "qualification_documents"]: @@ -3601,45 +3484,17 @@ def all_public_documents_are_accessible_for_others(): self.assertEqual(len(response.json["data"]), self.min_bids_number) self.assertEqual( set(response.json["data"][0].keys()), - set( - [ - u"date", - u"status", - u"id", - u"lotValues", - u"tenderers", - u"documents", - u"eligibilityDocuments", - u"qualificationDocuments", - u"financialDocuments", - u"selfEligible", - u"selfQualified", - ] - ), + assert_data_1, ) self.assertEqual( set(response.json["data"][1].keys()), - set([u"date", u"status", u"id", u"lotValues", u"tenderers", u"selfEligible", u"selfQualified"]), + assert_data_2, ) response = self.app.get("/tenders/{}/bids/{}".format(self.tender_id, self.bid_id)) self.assertEqual(response.status, "200 OK") self.assertEqual( set(response.json["data"].keys()), - set( - [ - u"date", - u"status", - u"id", - u"lotValues", - u"tenderers", - u"documents", - u"eligibilityDocuments", - u"qualificationDocuments", - u"financialDocuments", - u"selfEligible", - u"selfQualified", - ] - ), + assert_data_1, ) all_documents_are_accessible_for_bid_owner(doc_resource) for doc_resource in ["documents", "financial_documents", "eligibility_documents", "qualification_documents"]: @@ -3721,7 +3576,7 @@ def patch_and_put_document_into_invalid_bid(self): # they will be invalidated by this request response = self.app.patch_json( "/tenders/{}/lots/{}?acc_token={}".format(self.tender_id, self.initial_lots[0]["id"], self.tender_token), - {"data": {"value": {"amount": 300.0}}}, + {"data": {"value": {"amount": 300.0}, "minimalStep": {"amount": 9.0}}}, ) self.assertEqual(response.status, "200 OK") self.assertEqual(response.json["data"]["value"]["amount"], 300) @@ -4022,7 +3877,9 @@ def view_bid_in_qualification_st_st(self): # CS-5342 response = self.app.get("/tenders/{}".format(self.tender_id)) self.assertEqual(response.json["data"]["status"], "active.qualification.stand-still") bids = response.json["data"]["bids"] - expected_keys = {"id", "status", "selfEligible", "selfQualified", "lotValues", "tenderers", "date"} + expected_keys = {"id", "status", "selfQualified", "lotValues", "tenderers", "date"} + if get_now() < RELEASE_ECRITERIA_ARTICLE_17: + expected_keys.add("selfEligible") self.assertEqual(set(bids[0].keys()), expected_keys) response = self.app.get("/tenders/{}/bids/{}".format(self.tender_id, bids[0]["id"])) diff --git a/src/openprocurement/tender/cfaua/tests/cancellation_blanks.py b/src/openprocurement/tender/cfaua/tests/cancellation_blanks.py index a5ed712597..9dd1ab1b0b 100644 --- a/src/openprocurement/tender/cfaua/tests/cancellation_blanks.py +++ b/src/openprocurement/tender/cfaua/tests/cancellation_blanks.py @@ -398,7 +398,7 @@ def cancel_lot_active_pre_qualification(self): "invalid.pre-qualification", "invalid.pre-qualification", ], - "data.qualifications[*].status": ["cancelled", "cancelled", "cancelled"], + "data.qualifications[*].status": ["pending", "pending", "pending"], "data.awards[*].status": None, "data.agreements[*].status": None, "data.complaints[*].status": statuses, @@ -428,7 +428,7 @@ def cancel_lot_active_pre_qualification_stand_still(self): "invalid.pre-qualification", "invalid.pre-qualification", ], - "data.qualifications[*].status": ["cancelled", "cancelled", "cancelled"], + "data.qualifications[*].status": ["active", "active", "active"], "data.awards[*].status": None, "data.agreements[*].status": None, "data.complaints[*].status": statuses, @@ -456,7 +456,7 @@ def cancel_lot_active_auction(self): "invalid.pre-qualification", "invalid.pre-qualification", ], - "data.qualifications[*].status": ["cancelled", "cancelled", "cancelled"], + "data.qualifications[*].status": ["active", "active", "active"], "data.awards[*].status": None, "data.agreements[*].status": None, "data.complaints[*].status": statuses, @@ -487,7 +487,7 @@ def cancel_lot_active_qualification(self): "data.status": "cancelled", "data.lots[*].status": ["cancelled"], "data.bids[*].status": ["active", "active", "active"], - "data.qualifications[*].status": ["cancelled", "cancelled", "cancelled"], + "data.qualifications[*].status": ["active", "active", "active"], "data.awards[*].status": ["pending", "pending", "pending"], "data.agreements[*].status": None, "data.complaints[*].status": None, @@ -510,7 +510,7 @@ def cancel_lot_active_qualification_stand_still(self): "data.status": "cancelled", "data.lots[*].status": ["cancelled"], "data.bids[*].status": ["active", "active", "active"], - "data.qualifications[*].status": ["cancelled", "cancelled", "cancelled"], + "data.qualifications[*].status": ["active", "active", "active"], "data.awards[*].status": ["active", "active", "active"], "data.agreements[*].status": None, "data.complaints[*].status": None, @@ -530,7 +530,7 @@ def cancel_lot_active_awarded(self): "data.status": "cancelled", "data.lots[*].status": ["cancelled"], "data.bids[*].status": ["active", "active", "active"], - "data.qualifications[*].status": ["cancelled", "cancelled", "cancelled"], + "data.qualifications[*].status": ["active", "active", "active"], "data.awards[*].status": ["active", "active", "active"], "data.agreements[*].status": ["cancelled"], "data.complaints[*].status": None, diff --git a/src/openprocurement/tender/cfaua/tests/criterion.py b/src/openprocurement/tender/cfaua/tests/criterion.py new file mode 100644 index 0000000000..e27243ba3d --- /dev/null +++ b/src/openprocurement/tender/cfaua/tests/criterion.py @@ -0,0 +1,54 @@ +# -*- coding: utf-8 -*- +import unittest +from copy import deepcopy + +from openprocurement.tender.belowthreshold.tests.base import test_lots +from openprocurement.tender.cfaua.tests.base import test_tender_data, BaseTenderContentWebTest +from openprocurement.tender.openua.tests.criterion import ( + TenderCriteriaTestMixin, + TenderCriteriaRGTestMixin, + TenderCriteriaRGRequirementTestMixin, + TenderCriteriaRGRequirementEvidenceTestMixin, +) + +tender_data = deepcopy(test_tender_data) +tender_data["status"] = "draft" + + +class TenderCriteriaTest(TenderCriteriaTestMixin, BaseTenderContentWebTest): + initial_data = tender_data + test_lots_data = test_lots + + +class TenderCriteriaRGTest(TenderCriteriaRGTestMixin, BaseTenderContentWebTest): + initial_data = test_tender_data + test_lots_data = test_lots + + +class TenderCriteriaRGRequirementTest( + TenderCriteriaRGRequirementTestMixin, + BaseTenderContentWebTest +): + initial_data = test_tender_data + test_lots_data = test_lots + + +class TenderCriteriaRGRequirementEvidenceTest( + TenderCriteriaRGRequirementEvidenceTestMixin, + BaseTenderContentWebTest, +): + initial_data = test_tender_data + test_lots_data = test_lots + + +def suite(): + suite = unittest.TestSuite() + suite.addTest(unittest.makeSuite(TenderCriteriaTest)) + suite.addTest(unittest.makeSuite(TenderCriteriaRGTest)) + suite.addTest(unittest.makeSuite(TenderCriteriaRGRequirementTest)) + suite.addTest(unittest.makeSuite(TenderCriteriaRGRequirementEvidenceTest)) + return suite + + +if __name__ == "__main__": + unittest.main(defaultTest="suite") diff --git a/src/openprocurement/tender/cfaua/tests/data/test_lots.json b/src/openprocurement/tender/cfaua/tests/data/test_lots.json index f3da998601..3e171d8df1 100644 --- a/src/openprocurement/tender/cfaua/tests/data/test_lots.json +++ b/src/openprocurement/tender/cfaua/tests/data/test_lots.json @@ -2,7 +2,7 @@ { "minimalStep": { "currency": "UAH", - "amount": 35 + "amount": 15 }, "description": "lot description", "value": { diff --git a/src/openprocurement/tender/cfaua/tests/lot_blanks.py b/src/openprocurement/tender/cfaua/tests/lot_blanks.py index 75118be2ce..f4426be6ed 100644 --- a/src/openprocurement/tender/cfaua/tests/lot_blanks.py +++ b/src/openprocurement/tender/cfaua/tests/lot_blanks.py @@ -1,5 +1,7 @@ # -*- coding: utf-8 -*- +import mock from copy import deepcopy +from datetime import timedelta from email.header import Header from openprocurement.api.constants import RELEASE_2020_04_19 @@ -161,6 +163,20 @@ def patch_tender_lot(self): response = self.app.get("/tenders/{}".format(self.tender_id)) lot = response.json["data"]["lots"][0] + with mock.patch("openprocurement.tender.core.validation.MINIMAL_STEP_VALIDATION_FROM", + get_now() - timedelta(days=1)): + response = self.app.patch_json( + "/tenders/{}/lots/{}?acc_token={}".format(self.tender_id, lot["id"], self.tender_token), + {"data": {"minimalStep": {"amount": 35.0}}}, status=422 + ) + self.assertEqual(response.status, "422 Unprocessable Entity") + self.assertEqual(response.json["status"], "error") + self.assertEqual( + response.json["errors"], + [{u"description": [u"minimalstep must be between 0.5% and 3% of value (with 2 digits precision)."], + u"location": u"body", u"name": u"minimalStep"}] + ) + response = self.app.patch_json( "/tenders/{}/lots/{}?acc_token={}".format(self.tender_id, lot["id"], self.tender_token), {"data": {"title": "new title"}}, @@ -1153,6 +1169,23 @@ def proc_1lot_1can(self): def create_tender_lot(self): + tender_data = deepcopy(self.initial_data) + tender_data["lots"] = deepcopy(self.initial_lots) + tender_data["lots"][0]["minimalStep"]["amount"] = 35 + + with mock.patch("openprocurement.tender.core.validation.MINIMAL_STEP_VALIDATION_FROM", + get_now() - timedelta(days=1)): + response = self.app.post_json("/tenders", {"data": tender_data}, status=422) + self.assertEqual(response.status, "422 Unprocessable Entity") + self.assertEqual(response.content_type, "application/json") + self.assertEqual(response.json["status"], "error") + self.assertEqual( + response.json["errors"], + [{u'description': [ + {u'minimalStep': [u'minimalstep must be between 0.5% and 3% of value (with 2 digits precision).']}], + u'location': u'body', u'name': u'lots'}], + ) + tender_data = deepcopy(self.initial_data) tender_data["lots"] = deepcopy(self.initial_lots) tender_data["lots"][0]["guarantee"] = {"amount": 100500, "currency": "USD"} @@ -1530,6 +1563,11 @@ def one_lot_1bid(self): response = self.app.get("/tenders/{}".format(self.tender_id)) lot_id = response.json["data"]["lots"][0]["id"] + + bid_data = deepcopy(self.test_bids_data[0]) + bid_data["lotValues"] = [{"value": self.test_bids_data[0]["value"], "relatedLot": lot_id}] + del bid_data["value"] + # add relatedLot for item response = self.app.patch_json( "/tenders/{}?acc_token={}".format(self.tender_id, self.tender_token), @@ -1540,14 +1578,7 @@ def one_lot_1bid(self): self.app.authorization = ("Basic", ("broker", "")) response = self.app.post_json( "/tenders/{}/bids".format(self.tender_id), - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": self.test_bids_data[0]["tenderers"], - "lotValues": [{"value": self.test_bids_data[0]["value"], "relatedLot": lot_id}], - } - }, + {"data": bid_data}, ) # switch to active.pre-qualification self.time_shift("active.pre-qualification") @@ -1647,17 +1678,15 @@ def one_lot_2bid_1unqualified(self): # create bid self.app.authorization = ("Basic", ("broker", "")) + bid_data = deepcopy(self.test_bids_data[0]) + del bid_data["value"] + for i in range(self.min_bids_number): + bid_data["lotValues"] = [{"value": self.test_bids_data[i]["value"], "relatedLot": lot_id}] + bid_data["tenderers"] = self.test_bids_data[i]["tenderers"] response = self.app.post_json( "/tenders/{}/bids".format(self.tender_id), - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": self.test_bids_data[i]["tenderers"], - "lotValues": [{"value": self.test_bids_data[i]["value"], "relatedLot": lot_id}], - } - }, + {"data": bid_data}, ) # switch to active.pre-qualification @@ -1706,21 +1735,16 @@ def one_lot_2bid_1unqualified(self): def create_tender_feature_bidder(self): request_path = "/tenders/{}/bids".format(self.tender_id) + bid_data = deepcopy(self.test_bids_data[0]) + bid_data["lotValues"] = [{"value": {"amount": 500}, "relatedLot": self.lot_id}] + bid_data["parameters"] = [ + {"code": "code_item", "value": 0.01}, + {"code": "code_tenderer", "value": 0.01}, + ] + del bid_data["value"] response = self.app.post_json( request_path, - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": self.test_bids_data[0]["tenderers"], - "lotValues": [{"value": {"amount": 500}, "relatedLot": self.lot_id}], - "parameters": [ - {"code": "code_item", "value": 0.01}, - {"code": "code_tenderer", "value": 0.01}, - # {"code": "code_lot", "value": 0.01}, - ], - } - }, + {"data": bid_data}, ) self.assertEqual(response.status, "201 Created") self.assertEqual(response.content_type, "application/json") @@ -1734,19 +1758,7 @@ def create_tender_feature_bidder(self): response = self.app.post_json( request_path, - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": self.test_bids_data[0]["tenderers"], - "lotValues": [{"value": {"amount": 500}, "relatedLot": self.lot_id}], - "parameters": [ - {"code": "code_item", "value": 0.01}, - {"code": "code_tenderer", "value": 0.01}, - # {"code": "code_lot", "value": 0.01}, - ], - } - }, + {"data": bid_data}, status=403, ) self.assertEqual(response.status, "403 Forbidden") @@ -1756,25 +1768,22 @@ def create_tender_feature_bidder(self): def create_tender_feature_bidder_invalid(self): request_path = "/tenders/{}/bids".format(self.tender_id) + + bid_data = deepcopy(self.test_bids_data[0]) + del bid_data["value"] response = self.app.post_json( request_path, - {"data": {"selfEligible": True, "selfQualified": True, "tenderers": self.test_bids_data[0]["tenderers"]}}, + {"data": bid_data}, status=422, ) self.assertEqual(response.status, "422 Unprocessable Entity") self.assertEqual(response.content_type, "application/json") self.assertEqual(response.json["status"], "error") + bid_data["lotValues"] = [{"value": {"amount": 500}}] response = self.app.post_json( request_path, - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": self.test_bids_data[0]["tenderers"], - "lotValues": [{"value": {"amount": 500}}], - } - }, + {"data": bid_data}, status=422, ) self.assertEqual(response.status, "422 Unprocessable Entity") @@ -1791,16 +1800,10 @@ def create_tender_feature_bidder_invalid(self): ], ) + bid_data["lotValues"] = [{"value": {"amount": 500}, "relatedLot": "0" * 32}] response = self.app.post_json( request_path, - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": self.test_bids_data[0]["tenderers"], - "lotValues": [{"value": {"amount": 500}, "relatedLot": "0" * 32}], - } - }, + {"data": bid_data}, status=422, ) self.assertEqual(response.status, "422 Unprocessable Entity") @@ -1817,16 +1820,10 @@ def create_tender_feature_bidder_invalid(self): ], ) + bid_data["lotValues"] = [{"value": {"amount": 5000000}, "relatedLot": self.lot_id}] response = self.app.post_json( request_path, - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": self.test_bids_data[0]["tenderers"], - "lotValues": [{"value": {"amount": 5000000}, "relatedLot": self.lot_id}], - } - }, + {"data": bid_data}, status=422, ) self.assertEqual(response.status, "422 Unprocessable Entity") @@ -1843,16 +1840,10 @@ def create_tender_feature_bidder_invalid(self): ], ) + bid_data["lotValues"] = [{"value": {"amount": 500, "valueAddedTaxIncluded": False}, "relatedLot": self.lot_id}] response = self.app.post_json( request_path, - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": self.test_bids_data[0]["tenderers"], - "lotValues": [{"value": {"amount": 500, "valueAddedTaxIncluded": False}, "relatedLot": self.lot_id}], - } - }, + {"data": bid_data}, status=422, ) self.assertEqual(response.status, "422 Unprocessable Entity") @@ -1875,16 +1866,10 @@ def create_tender_feature_bidder_invalid(self): ], ) + bid_data["lotValues"] = [{"value": {"amount": 500, "currency": "USD"}, "relatedLot": self.lot_id}] response = self.app.post_json( request_path, - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": self.test_bids_data[0]["tenderers"], - "lotValues": [{"value": {"amount": 500, "currency": "USD"}, "relatedLot": self.lot_id}], - } - }, + {"data": bid_data}, status=422, ) self.assertEqual(response.status, "422 Unprocessable Entity") @@ -1901,32 +1886,20 @@ def create_tender_feature_bidder_invalid(self): ], ) + bid_data["lotValues"] = [{"value": {"amount": 500}, "relatedLot": self.lot_id}] response = self.app.post_json( request_path, - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": self.test_bids_data[0]["tenderers"], - "lotValues": [{"value": {"amount": 500}, "relatedLot": self.lot_id}], - } - }, + {"data": bid_data}, status=422, ) self.assertEqual(response.status, "422 Unprocessable Entity") self.assertEqual(response.content_type, "application/json") self.assertEqual(response.json["status"], "error") + bid_data["lotValues"] = [{"value": {"amount": 500}, "relatedLot": self.lot_id}] response = self.app.post_json( request_path, - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": self.test_bids_data[0]["tenderers"], - "lotValues": [{"value": {"amount": 500}, "relatedLot": self.lot_id}], - } - }, + {"data": bid_data}, status=422, ) self.assertEqual(response.status, "422 Unprocessable Entity") @@ -1937,17 +1910,10 @@ def create_tender_feature_bidder_invalid(self): [{u"description": [u"All features parameters is required."], u"location": u"body", u"name": u"parameters"}], ) + bid_data["parameters"] = [{"code": "code_item", "value": 0.01}] response = self.app.post_json( request_path, - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": self.test_bids_data[0]["tenderers"], - "lotValues": [{"value": {"amount": 500}, "relatedLot": self.lot_id}], - "parameters": [{"code": "code_item", "value": 0.01}], - } - }, + {"data": bid_data}, status=422, ) self.assertEqual(response.status, "422 Unprocessable Entity") @@ -1958,17 +1924,10 @@ def create_tender_feature_bidder_invalid(self): [{u"description": [u"All features parameters is required."], u"location": u"body", u"name": u"parameters"}], ) + bid_data["parameters"] = [{"code": "code_invalid", "value": 0.01}] response = self.app.post_json( request_path, - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": self.test_bids_data[0]["tenderers"], - "lotValues": [{"value": {"amount": 500}, "relatedLot": self.lot_id}], - "parameters": [{"code": "code_invalid", "value": 0.01}], - } - }, + {"data": bid_data}, status=422, ) self.assertEqual(response.status, "422 Unprocessable Entity") @@ -1985,21 +1944,13 @@ def create_tender_feature_bidder_invalid(self): ], ) + bid_data["parameters"] = [ + {"code": "code_item", "value": 0.01}, + {"code": "code_tenderer", "value": 0}, + ] response = self.app.post_json( request_path, - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": self.test_bids_data[0]["tenderers"], - "lotValues": [{"value": {"amount": 500}, "relatedLot": self.lot_id}], - "parameters": [ - {"code": "code_item", "value": 0.01}, - {"code": "code_tenderer", "value": 0}, - # {"code": "code_lot", "value": 0.01}, - ], - } - }, + {"data": bid_data}, status=422, ) self.assertEqual(response.status, "422 Unprocessable Entity") diff --git a/src/openprocurement/tender/cfaua/tests/periods.py b/src/openprocurement/tender/cfaua/tests/periods.py new file mode 100644 index 0000000000..ab20b61a1f --- /dev/null +++ b/src/openprocurement/tender/cfaua/tests/periods.py @@ -0,0 +1,346 @@ +from datetime import timedelta +from openprocurement.tender.cfaua.constants import ( + TENDERING_DURATION, + QUESTIONS_STAND_STILL, + TENDERING_EXTRA_PERIOD, + COMPLAINT_STAND_STILL, + QUALIFICATION_COMPLAINT_STAND_STILL, + CLARIFICATIONS_UNTIL_PERIOD, +) + +PERIODS = { + "active.tendering": { + "start": { + "enquiryPeriod": { + "startDate": -timedelta(days=1), + "endDate": TENDERING_DURATION - QUESTIONS_STAND_STILL + }, + "tenderPeriod": { + "startDate": -timedelta(days=1), + "endDate": TENDERING_DURATION + }, + }, + "end": { + "enquiryPeriod": { + "startDate": -TENDERING_DURATION - timedelta(days=1), + "endDate": -QUESTIONS_STAND_STILL, + }, + "tenderPeriod": { + "startDate": -TENDERING_DURATION - timedelta(days=1), + "endDate": timedelta() + }, + }, + "enquiry_end": { + "enquiryPeriod": { + "startDate": -TENDERING_DURATION + TENDERING_EXTRA_PERIOD - timedelta(days=2), + "endDate": -timedelta(days=1), + }, + "tenderPeriod": { + "startDate": -TENDERING_DURATION + TENDERING_EXTRA_PERIOD - timedelta(days=2), + "endDate": TENDERING_EXTRA_PERIOD - timedelta(days=1), + }, + }, + }, + "active.pre-qualification": { + "start": { + "enquiryPeriod": { + "startDate": (-TENDERING_DURATION - timedelta(days=1)), + "endDate": (-QUESTIONS_STAND_STILL), + }, + "tenderPeriod": {"startDate": (-TENDERING_DURATION - timedelta(days=1)), "endDate": timedelta()}, + "qualificationPeriod": {"startDate": timedelta()}, + }, + "end": { + "enquiryPeriod": { + "startDate": (-TENDERING_DURATION - timedelta(days=1)), + "endDate": (-QUESTIONS_STAND_STILL), + }, + "tenderPeriod": {"startDate": (-TENDERING_DURATION - timedelta(days=1)), "endDate": timedelta()}, + "qualificationPeriod": {"startDate": timedelta()}, + }, + }, + "active.pre-qualification.stand-still": { + "start": { + "enquiryPeriod": { + "startDate": (-TENDERING_DURATION - timedelta(days=1)), + "endDate": (-QUESTIONS_STAND_STILL), + }, + "tenderPeriod": {"startDate": (-TENDERING_DURATION - timedelta(days=1)), "endDate": timedelta()}, + "qualificationPeriod": {"startDate": timedelta()}, + "auctionPeriod": {"startDate": (+COMPLAINT_STAND_STILL)}, + }, + "end": { + "enquiryPeriod": { + "startDate": (-TENDERING_DURATION - COMPLAINT_STAND_STILL - timedelta(days=1)), + "endDate": (-COMPLAINT_STAND_STILL - TENDERING_DURATION + QUESTIONS_STAND_STILL), + }, + "tenderPeriod": { + "startDate": (-TENDERING_DURATION - COMPLAINT_STAND_STILL - timedelta(days=1)), + "endDate": (-COMPLAINT_STAND_STILL), + }, + "qualificationPeriod": {"startDate": (-COMPLAINT_STAND_STILL), "endDate": timedelta()}, + "auctionPeriod": {"startDate": timedelta()}, + }, + }, + "active.auction": { + "start": { + "enquiryPeriod": { + "startDate": (-TENDERING_DURATION - COMPLAINT_STAND_STILL - timedelta(days=1)), + "endDate": (-COMPLAINT_STAND_STILL - TENDERING_DURATION + QUESTIONS_STAND_STILL), + }, + "tenderPeriod": { + "startDate": (-TENDERING_DURATION - COMPLAINT_STAND_STILL - timedelta(days=1)), + "endDate": (-COMPLAINT_STAND_STILL), + }, + "qualificationPeriod": {"startDate": (-COMPLAINT_STAND_STILL), "endDate": timedelta()}, + "auctionPeriod": {"startDate": timedelta()}, + }, + "end": { + "enquiryPeriod": { + "startDate": (-TENDERING_DURATION - COMPLAINT_STAND_STILL - timedelta(days=2)), + "endDate": (-QUESTIONS_STAND_STILL - COMPLAINT_STAND_STILL - timedelta(days=1)), + }, + "tenderPeriod": { + "startDate": (-TENDERING_DURATION - COMPLAINT_STAND_STILL - timedelta(days=2)), + "endDate": (-COMPLAINT_STAND_STILL - timedelta(days=1)), + }, + "qualificationPeriod": { + "startDate": (-COMPLAINT_STAND_STILL - timedelta(days=1)), + "endDate": (-timedelta(days=1)), + }, + "auctionPeriod": {"startDate": -timedelta(days=1), "endDate": timedelta()}, + }, + }, + "active.qualification": { + "start": { + "enquiryPeriod": { + "startDate": (-TENDERING_DURATION - COMPLAINT_STAND_STILL - timedelta(days=2)), + "endDate": (-QUESTIONS_STAND_STILL - COMPLAINT_STAND_STILL - timedelta(days=1)), + }, + "tenderPeriod": { + "startDate": (-TENDERING_DURATION - COMPLAINT_STAND_STILL - timedelta(days=2)), + "endDate": (-COMPLAINT_STAND_STILL - timedelta(days=1)), + }, + "qualificationPeriod": { + "startDate": (-COMPLAINT_STAND_STILL - timedelta(days=1)), + "endDate": (-timedelta(days=1)), + }, + "auctionPeriod": {"startDate": -timedelta(days=1), "endDate": timedelta()}, + "awardPeriod": {"startDate": timedelta()}, + }, + "end": { + "enquiryPeriod": { + "startDate": (-TENDERING_DURATION - COMPLAINT_STAND_STILL - timedelta(days=2)), + "endDate": (-QUESTIONS_STAND_STILL - COMPLAINT_STAND_STILL - timedelta(days=1)), + }, + "tenderPeriod": { + "startDate": (-TENDERING_DURATION - COMPLAINT_STAND_STILL - timedelta(days=2)), + "endDate": (-COMPLAINT_STAND_STILL - timedelta(days=1)), + }, + "qualificationPeriod": { + "startDate": (-COMPLAINT_STAND_STILL - timedelta(days=1)), + "endDate": (-timedelta(days=1)), + }, + "auctionPeriod": {"startDate": -timedelta(days=1), "endDate": timedelta()}, + "awardPeriod": {"startDate": timedelta()}, + }, + }, + "active.qualification.stand-still": { + "start": { + "enquiryPeriod": { + "startDate": (-TENDERING_DURATION - COMPLAINT_STAND_STILL - timedelta(days=2)), + "endDate": (-QUESTIONS_STAND_STILL - COMPLAINT_STAND_STILL - timedelta(days=1)), + }, + "tenderPeriod": { + "startDate": (-TENDERING_DURATION - COMPLAINT_STAND_STILL - timedelta(days=2)), + "endDate": (-COMPLAINT_STAND_STILL - timedelta(days=1)), + }, + "qualificationPeriod": { + "startDate": (-COMPLAINT_STAND_STILL - timedelta(days=1)), + "endDate": (-timedelta(days=1)), + }, + "auctionPeriod": {"startDate": -timedelta(days=1), "endDate": timedelta()}, + "awardPeriod": {"startDate": timedelta(), "endDate": QUALIFICATION_COMPLAINT_STAND_STILL}, + }, + "end": { + "enquiryPeriod": { + "startDate": ( + -TENDERING_DURATION + - COMPLAINT_STAND_STILL + - QUALIFICATION_COMPLAINT_STAND_STILL + - timedelta(days=2) + ), + "endDate": ( + -QUESTIONS_STAND_STILL + - COMPLAINT_STAND_STILL + - QUALIFICATION_COMPLAINT_STAND_STILL + - timedelta(days=1) + ), + }, + "tenderPeriod": { + "startDate": ( + -TENDERING_DURATION + - COMPLAINT_STAND_STILL + - QUALIFICATION_COMPLAINT_STAND_STILL + - timedelta(days=2) + ), + "endDate": (-COMPLAINT_STAND_STILL - QUALIFICATION_COMPLAINT_STAND_STILL - timedelta(days=1)), + }, + "qualificationPeriod": { + "startDate": (-COMPLAINT_STAND_STILL - QUALIFICATION_COMPLAINT_STAND_STILL - timedelta(days=1)), + "endDate": (-QUALIFICATION_COMPLAINT_STAND_STILL - timedelta(days=1)), + }, + "auctionPeriod": { + "startDate": (-QUALIFICATION_COMPLAINT_STAND_STILL - timedelta(days=1)), + "endDate": (-QUALIFICATION_COMPLAINT_STAND_STILL), + }, + "awardPeriod": {"startDate": (-QUALIFICATION_COMPLAINT_STAND_STILL), "endDate": timedelta()}, + }, + }, + "active.awarded": { + "start": { + "enquiryPeriod": { + "startDate": ( + -TENDERING_DURATION + - COMPLAINT_STAND_STILL + - QUALIFICATION_COMPLAINT_STAND_STILL + - timedelta(days=2) + ), + "endDate": ( + -QUESTIONS_STAND_STILL + - COMPLAINT_STAND_STILL + - QUALIFICATION_COMPLAINT_STAND_STILL + - timedelta(days=1) + ), + }, + "tenderPeriod": { + "startDate": ( + -TENDERING_DURATION + - COMPLAINT_STAND_STILL + - QUALIFICATION_COMPLAINT_STAND_STILL + - timedelta(days=2) + ), + "endDate": (-COMPLAINT_STAND_STILL - QUALIFICATION_COMPLAINT_STAND_STILL - timedelta(days=1)), + }, + "qualificationPeriod": { + "startDate": (-COMPLAINT_STAND_STILL - QUALIFICATION_COMPLAINT_STAND_STILL - timedelta(days=1)), + "endDate": (-QUALIFICATION_COMPLAINT_STAND_STILL - timedelta(days=1)), + }, + "auctionPeriod": { + "startDate": (-QUALIFICATION_COMPLAINT_STAND_STILL - timedelta(days=1)), + "endDate": (-QUALIFICATION_COMPLAINT_STAND_STILL), + }, + "awardPeriod": {"startDate": (-QUALIFICATION_COMPLAINT_STAND_STILL), "endDate": timedelta()}, + "contractPeriod": {"startDate": timedelta(), "clarificationsUntil": CLARIFICATIONS_UNTIL_PERIOD}, + }, + "end": { + "enquiryPeriod": { + "startDate": -TENDERING_DURATION + - COMPLAINT_STAND_STILL + - QUALIFICATION_COMPLAINT_STAND_STILL + - CLARIFICATIONS_UNTIL_PERIOD + - timedelta(days=3), + "endDate": -QUESTIONS_STAND_STILL + - COMPLAINT_STAND_STILL + - QUALIFICATION_COMPLAINT_STAND_STILL + - CLARIFICATIONS_UNTIL_PERIOD + - timedelta(days=2), + }, + "tenderPeriod": { + "startDate": -TENDERING_DURATION + - COMPLAINT_STAND_STILL + - QUALIFICATION_COMPLAINT_STAND_STILL + - CLARIFICATIONS_UNTIL_PERIOD + - timedelta(days=3), + "endDate": -COMPLAINT_STAND_STILL + - QUALIFICATION_COMPLAINT_STAND_STILL + - CLARIFICATIONS_UNTIL_PERIOD + - timedelta(days=2), + }, + "qualificationPeriod": { + "startDate": -COMPLAINT_STAND_STILL + - QUALIFICATION_COMPLAINT_STAND_STILL + - CLARIFICATIONS_UNTIL_PERIOD + - timedelta(days=2), + "endDate": -QUALIFICATION_COMPLAINT_STAND_STILL - CLARIFICATIONS_UNTIL_PERIOD - timedelta(days=2), + }, + "auctionPeriod": { + "startDate": -QUALIFICATION_COMPLAINT_STAND_STILL - CLARIFICATIONS_UNTIL_PERIOD - timedelta(days=2), + "endDate": -QUALIFICATION_COMPLAINT_STAND_STILL - CLARIFICATIONS_UNTIL_PERIOD - timedelta(days=1), + }, + "awardPeriod": { + "startDate": -QUALIFICATION_COMPLAINT_STAND_STILL - CLARIFICATIONS_UNTIL_PERIOD - timedelta(days=1), + "endDate": -CLARIFICATIONS_UNTIL_PERIOD - timedelta(days=1), + }, + "contractPeriod": { + "startDate": -CLARIFICATIONS_UNTIL_PERIOD - timedelta(days=1), + "clarificationsUntil": -timedelta(days=1), + }, + }, + }, + "complete": { + "start": { + "enquiryPeriod": { + "startDate": ( + -TENDERING_DURATION + - COMPLAINT_STAND_STILL + - QUALIFICATION_COMPLAINT_STAND_STILL + - timedelta(days=2) + - (CLARIFICATIONS_UNTIL_PERIOD + timedelta(days=1)) + ), + "endDate": ( + -QUESTIONS_STAND_STILL + - COMPLAINT_STAND_STILL + - QUALIFICATION_COMPLAINT_STAND_STILL + - timedelta(days=1) + - (CLARIFICATIONS_UNTIL_PERIOD + timedelta(days=1)) + ), + }, + "tenderPeriod": { + "startDate": ( + -TENDERING_DURATION + - COMPLAINT_STAND_STILL + - QUALIFICATION_COMPLAINT_STAND_STILL + - timedelta(days=2) + - (CLARIFICATIONS_UNTIL_PERIOD + timedelta(days=1)) + ), + "endDate": ( + -COMPLAINT_STAND_STILL + - QUALIFICATION_COMPLAINT_STAND_STILL + - timedelta(days=1) + - (CLARIFICATIONS_UNTIL_PERIOD + timedelta(days=1)) + ), + }, + "qualificationPeriod": { + "startDate": ( + -COMPLAINT_STAND_STILL + - QUALIFICATION_COMPLAINT_STAND_STILL + - timedelta(days=1) + - (CLARIFICATIONS_UNTIL_PERIOD + timedelta(days=1)) + ), + "endDate": ( + -QUALIFICATION_COMPLAINT_STAND_STILL + - timedelta(days=1) + - (CLARIFICATIONS_UNTIL_PERIOD + timedelta(days=1)) + ), + }, + "auctionPeriod": { + "startDate": ( + -QUALIFICATION_COMPLAINT_STAND_STILL + - timedelta(days=1) + - (CLARIFICATIONS_UNTIL_PERIOD + timedelta(days=1)) + ), + "endDate": (-QUALIFICATION_COMPLAINT_STAND_STILL - (CLARIFICATIONS_UNTIL_PERIOD + timedelta(days=1))), + }, + "awardPeriod": { + "startDate": (-QUALIFICATION_COMPLAINT_STAND_STILL - (CLARIFICATIONS_UNTIL_PERIOD + timedelta(days=1))), + "endDate": (-(CLARIFICATIONS_UNTIL_PERIOD + timedelta(days=1))), + }, + "contractPeriod": { + "startDate": (-(CLARIFICATIONS_UNTIL_PERIOD + timedelta(days=1))), + "clarificationsUntil": (-timedelta(days=1)), + "endDate": timedelta(), + }, + } + }, +} diff --git a/src/openprocurement/tender/cfaua/tests/tender.py b/src/openprocurement/tender/cfaua/tests/tender.py index 8ec2c513f1..ae03e6b2f9 100644 --- a/src/openprocurement/tender/cfaua/tests/tender.py +++ b/src/openprocurement/tender/cfaua/tests/tender.py @@ -163,7 +163,7 @@ def setUp(self): super(TenderPendingAwardsResourceTest, self).setUp() # switch to active.pre-qualification - self.time_shift("active.pre-qualification") + self.set_status("active.pre-qualification") self.app.authorization = ("Basic", ("chronograph", "")) response = self.app.patch_json("/tenders/{}".format(self.tender_id), {"data": {"id": self.tender_id}}) self.assertEqual(response.status, "200 OK") diff --git a/src/openprocurement/tender/cfaua/tests/tender_blanks.py b/src/openprocurement/tender/cfaua/tests/tender_blanks.py index 4cd9ed10c9..0bcb87a05c 100644 --- a/src/openprocurement/tender/cfaua/tests/tender_blanks.py +++ b/src/openprocurement/tender/cfaua/tests/tender_blanks.py @@ -1,4 +1,5 @@ # -*- coding: utf-8 -*- +import mock from datetime import timedelta from copy import deepcopy @@ -17,6 +18,7 @@ from openprocurement.tender.cfaua.constants import MAX_AGREEMENT_PERIOD from openprocurement.tender.cfaua.models.tender import CloseFrameworkAgreementUA from openprocurement.tender.cfaua.utils import add_next_awards +from openprocurement.api.constants import RELEASE_ECRITERIA_ARTICLE_17 # TenderTest from openprocurement.tender.core.utils import calculate_tender_business_date @@ -354,6 +356,22 @@ def create_tender_invalid(self): } ], ) + with mock.patch("openprocurement.tender.core.validation.MINIMAL_STEP_VALIDATION_FROM", + get_now() - timedelta(days=1)): + data = deepcopy(self.initial_data["lots"]) + self.initial_data["lots"][0]["minimalStep"] = {"amount": "1.0"} + response = self.app.post_json(request_path, {"data": self.initial_data}, status=422) + self.initial_data["lots"] = data + self.assertEqual(response.status, "422 Unprocessable Entity") + self.assertEqual(response.content_type, "application/json") + self.assertEqual(response.json["status"], "error") + self.assertEqual( + response.json["errors"], + [{u'description': + [{u'minimalStep': [u'minimalstep must be between 0.5% and 3% of value (with 2 digits precision).']}], + u'location': u'body', u'name': u'lots'} + ] + ) data = self.initial_data["items"][0].pop("additionalClassifications") if get_now() > CPV_ITEMS_CLASS_FROM: @@ -565,7 +583,11 @@ def patch_tender(self): self.assertEqual(response.content_type, "application/json") self.assertEqual( response.json["errors"], - [{"location": "body", "name": "tenderPeriod", "description": ["tenderPeriod should be greater than 30 days"]}], + [{ + "location": "body", + "name": "tenderPeriod", + "description": ["tenderPeriod must be at least 30 full calendar days long"] + }], ) response = self.app.patch_json( @@ -738,6 +760,25 @@ def patch_tender(self): self.assertEqual(response.content_type, "application/json") self.assertEqual(response.json["errors"][0]["description"], "Can't update tender in current (complete) status") + with mock.patch("openprocurement.tender.core.validation.MINIMAL_STEP_VALIDATION_FROM", + get_now() - timedelta(days=1)): + lots = deepcopy(self.initial_lots) + lots[0]["minimalStep"]["amount"] = 123 + response = self.app.patch_json( + "/tenders/{}?acc_token={}".format(tender["id"], owner_token), + {"data": {"lots": lots}}, + status=422, + ) + self.assertEqual(response.status, "422 Unprocessable Entity") + self.assertEqual(response.content_type, "application/json") + self.assertEqual( + response.json["errors"], + [{u'description': + [{u'minimalStep': [u'minimalstep must be between 0.5% and 3% of value (with 2 digits precision).']}], + u'location': u'body', u'name': u'lots'} + ], + ) + def patch_tender_period(self): data = deepcopy(self.initial_data) @@ -766,16 +807,20 @@ def patch_tender_period(self): self.assertEqual(response.status, "403 Forbidden") self.assertEqual(response.content_type, "application/json") self.assertEqual(response.json["errors"][0]["description"], "tenderPeriod should be extended by 7 days") - tenderPeriod_endDate = get_now() + timedelta(days=7, seconds=10) - enquiryPeriod_endDate = tenderPeriod_endDate - (timedelta(minutes=10) if SANDBOX_MODE else timedelta(days=10)) + tender_period_end_date = calculate_tender_business_date( + get_now(), timedelta(days=7), tender + ) + timedelta(seconds=10) + enquiry_period_end_date = calculate_tender_business_date( + tender_period_end_date, -timedelta(days=10), tender + ) response = self.app.patch_json( "/tenders/{}?acc_token={}".format(tender["id"], owner_token), - {"data": {"description": "new description", "tenderPeriod": {"endDate": tenderPeriod_endDate.isoformat()}}}, + {"data": {"description": "new description", "tenderPeriod": {"endDate": tender_period_end_date.isoformat()}}}, ) self.assertEqual(response.status, "200 OK") self.assertEqual(response.content_type, "application/json") - self.assertEqual(response.json["data"]["tenderPeriod"]["endDate"], tenderPeriod_endDate.isoformat()) - self.assertEqual(response.json["data"]["enquiryPeriod"]["endDate"], enquiryPeriod_endDate.isoformat()) + self.assertEqual(response.json["data"]["tenderPeriod"]["endDate"], tender_period_end_date.isoformat()) + self.assertEqual(response.json["data"]["enquiryPeriod"]["endDate"], enquiry_period_end_date.isoformat()) def tender_contract_period(self): @@ -1105,9 +1150,13 @@ def unsuccessful_after_prequalification_tender(self): self.app.authorization = ("Basic", ("chronograph", "")) response = self.app.patch_json("/tenders/{}".format(tender_id), {"data": {"id": tender_id}}) self.assertEqual(response.json["data"]["status"], "unsuccessful") + + assert_data = {u"id", u"status", u"tenderers", u"selfQualified"} + if get_now() < RELEASE_ECRITERIA_ARTICLE_17: + assert_data.add(u"selfEligible") for bid in response.json["data"]["bids"]: self.assertEqual(bid["status"], "unsuccessful") - self.assertEqual(set(bid.keys()), set([u"id", u"status", u"selfEligible", u"tenderers", u"selfQualified"])) + self.assertEqual(set(bid.keys()), assert_data) def one_qualificated_bid_tender(self): diff --git a/src/openprocurement/tender/cfaua/utils.py b/src/openprocurement/tender/cfaua/utils.py index de18da5031..b0d8fb27ac 100644 --- a/src/openprocurement/tender/cfaua/utils.py +++ b/src/openprocurement/tender/cfaua/utils.py @@ -238,10 +238,11 @@ def check_tender_status_on_active_qualification_stand_still(request): extra=context_unpack(request, {"MESSAGE_ID": "switched_tender_active_awarded"}), ) tender.status = "active.awarded" - tender.contractPeriod = {"startDate": now} - tender.contractPeriod["clarificationsUntil"] = calculate_tender_business_date( - now, config.clarifications_until_period, tender, False - ) + clarif_date = calculate_tender_business_date(now, config.clarifications_until_period, tender, False) + tender.contractPeriod = { + "startDate": now, + "clarificationsUntil": clarif_date + } lots = [l for l in tender.get("lots", []) if l.status == "active"] if lots: for lot in lots: diff --git a/src/openprocurement/tender/cfaua/validation.py b/src/openprocurement/tender/cfaua/validation.py index d4410f065b..e6dbda3c37 100644 --- a/src/openprocurement/tender/cfaua/validation.py +++ b/src/openprocurement/tender/cfaua/validation.py @@ -11,6 +11,7 @@ from openprocurement.api.interfaces import IContentConfigurator from openprocurement.tender.cfaua.constants import MIN_BIDS_NUMBER, MAX_AGREEMENT_PERIOD +from openprocurement.tender.core.validation import validate_award_document_tender_not_in_allowed_status_base def validate_patch_qualification_data(request): @@ -307,3 +308,9 @@ def validate_update_award_in_not_allowed_status(request): tender = request.validated["tender"] if tender.status not in ["active.qualification", "active.qualification.stand-still"]: raise_operation_error(request, "Can't update award in current ({}) tender status".format(tender.status)) + + +def validate_award_document_tender_not_in_allowed_status(request): + validate_award_document_tender_not_in_allowed_status_base( + request, allowed_bot_statuses=("active.awarded", "active.qualification.stand-still") + ) diff --git a/src/openprocurement/tender/cfaua/views/award_document.py b/src/openprocurement/tender/cfaua/views/award_document.py index 879226d27e..86800c7945 100644 --- a/src/openprocurement/tender/cfaua/views/award_document.py +++ b/src/openprocurement/tender/cfaua/views/award_document.py @@ -1,5 +1,12 @@ # -*- coding: utf-8 -*- +from openprocurement.api.utils import json_view +from openprocurement.api.validation import validate_file_upload +from openprocurement.tender.cfaua.validation import validate_award_document_tender_not_in_allowed_status from openprocurement.tender.core.utils import optendersresource +from openprocurement.tender.core.validation import ( + validate_award_document_lot_not_in_allowed_status, + validate_award_document_author) +from openprocurement.tender.openua.validation import validate_accepted_complaints from openprocurement.tender.openua.views.award_document import TenderUaAwardDocumentResource as BaseResource @@ -12,3 +19,15 @@ ) class TenderAwardDocumentResource(BaseResource): """ Tender Award Document """ + @json_view( + validators=( + validate_file_upload, + validate_award_document_tender_not_in_allowed_status, + validate_award_document_lot_not_in_allowed_status, + validate_award_document_author, + validate_accepted_complaints + ), + permission="upload_tender_documents", + ) + def collection_post(self): + return super(BaseResource, self).collection_post() diff --git a/src/openprocurement/tender/cfaua/views/award_rr.py b/src/openprocurement/tender/cfaua/views/award_rr.py new file mode 100644 index 0000000000..83e939a27a --- /dev/null +++ b/src/openprocurement/tender/cfaua/views/award_rr.py @@ -0,0 +1,14 @@ +# -*- coding: utf-8 -*- +from openprocurement.tender.core.views.award_rr import BaseAwardRequirementResponseResource +from openprocurement.tender.core.utils import optendersresource + + +@optendersresource( + name="closeFrameworkAgreementUA:Award Requirement Response", + collection_path="/tenders/{tender_id}/awards/{award_id}/requirement_responses", + path="/tenders/{tender_id}/awards/{award_id}/requirement_responses/{requirement_response_id}", + procurementMethodType="closeFrameworkAgreementUA", + description="Tender award requirement responses", +) +class AwardRequirementResponseResource(BaseAwardRequirementResponseResource): + pass diff --git a/src/openprocurement/tender/cfaua/views/award_rr_evidence.py b/src/openprocurement/tender/cfaua/views/award_rr_evidence.py new file mode 100644 index 0000000000..789bbe8c5e --- /dev/null +++ b/src/openprocurement/tender/cfaua/views/award_rr_evidence.py @@ -0,0 +1,16 @@ +# -*- coding: utf-8 -*- +from openprocurement.tender.core.views.award_rr_evidence import BaseAwardRequirementResponseEvidenceResource +from openprocurement.tender.core.utils import optendersresource + + +@optendersresource( + name="closeFrameworkAgreementUA:Award Requirement Response Evidence", + collection_path="/tenders/{tender_id}/awards/{award_id}/requirement_responses/{requirement_response_id}/evidences", + path="/tenders/{tender_id}/awards/{award_id}/requirement_responses/{requirement_response_id}/evidences/{evidence_id}", + procurementMethodType="closeFrameworkAgreementUA", + description="Tender award evidences", +) +class AwardRequirementResponseEvidenceResource( + BaseAwardRequirementResponseEvidenceResource +): + pass diff --git a/src/openprocurement/tender/cfaua/views/bid.py b/src/openprocurement/tender/cfaua/views/bid.py index d2dd2b01bb..313858fc39 100644 --- a/src/openprocurement/tender/cfaua/views/bid.py +++ b/src/openprocurement/tender/cfaua/views/bid.py @@ -7,6 +7,7 @@ validate_bid_operation_period, validate_bid_operation_not_in_tendering, validate_bid_status_update_not_to_pending, + validate_bid_activate_criteria, ) from openprocurement.tender.openua.views.bid import TenderUABidResource as BaseResource from openprocurement.tender.cfaua.validation import validate_view_bids_in_active_tendering @@ -108,6 +109,7 @@ def get(self): validate_bid_operation_period, validate_update_deleted_bid, validate_bid_status_update_not_to_pending, + validate_bid_activate_criteria, ), ) def patch(self): diff --git a/src/openprocurement/tender/cfaua/views/bid_rr.py b/src/openprocurement/tender/cfaua/views/bid_rr.py new file mode 100644 index 0000000000..cb45410e6c --- /dev/null +++ b/src/openprocurement/tender/cfaua/views/bid_rr.py @@ -0,0 +1,14 @@ +# -*- coding: utf-8 -*- +from openprocurement.tender.core.views.bid_rr import BaseBidRequirementResponseResource +from openprocurement.tender.core.utils import optendersresource + + +@optendersresource( + name="closeFrameworkAgreementUA:Bid Requirement Response", + collection_path="/tenders/{tender_id}/bids/{bid_id}/requirement_responses", + path="/tenders/{tender_id}/bids/{bid_id}/requirement_responses/{requirement_response_id}", + procurementMethodType="closeFrameworkAgreementUA", + description="Tender bidder requirement responses", +) +class BidRequirementResponseResource(BaseBidRequirementResponseResource): + pass diff --git a/src/openprocurement/tender/cfaua/views/bid_rr_evidence.py b/src/openprocurement/tender/cfaua/views/bid_rr_evidence.py new file mode 100644 index 0000000000..7c579d8111 --- /dev/null +++ b/src/openprocurement/tender/cfaua/views/bid_rr_evidence.py @@ -0,0 +1,16 @@ +# -*- coding: utf-8 -*- +from openprocurement.tender.core.views.bid_rr_evidence import BaseBidRequirementResponseEvidenceResource +from openprocurement.tender.core.utils import optendersresource + + +@optendersresource( + name="closeFrameworkAgreementUA:Bid Requirement Response Evidence", + collection_path="/tenders/{tender_id}/bids/{bid_id}/requirement_responses/{requirement_response_id}/evidences", + path="/tenders/{tender_id}/bids/{bid_id}/requirement_responses/{requirement_response_id}/evidences/{evidence_id}", + procurementMethodType="closeFrameworkAgreementUA", + description="Tender bidder evidences", +) +class BidRequirementResponseEvidenceResource( + BaseBidRequirementResponseEvidenceResource +): + pass diff --git a/src/openprocurement/tender/cfaua/views/criterion.py b/src/openprocurement/tender/cfaua/views/criterion.py new file mode 100644 index 0000000000..58b76306ef --- /dev/null +++ b/src/openprocurement/tender/cfaua/views/criterion.py @@ -0,0 +1,15 @@ +# -*- coding: utf-8 -*- +from openprocurement.tender.core.utils import optendersresource +from openprocurement.tender.core.views.criterion import BaseTenderCriteriaResource + + +@optendersresource( + name="closeFrameworkAgreementUA:Tender Criteria", + collection_path="/tenders/{tender_id}/criteria", + path="/tenders/{tender_id}/criteria/{criterion_id}", + procurementMethodType="closeFrameworkAgreementUA", + description="Tender criteria", +) +class TenderCriteriaResource(BaseTenderCriteriaResource): + pass + diff --git a/src/openprocurement/tender/cfaua/views/criterion_rg.py b/src/openprocurement/tender/cfaua/views/criterion_rg.py new file mode 100644 index 0000000000..72f2a661cc --- /dev/null +++ b/src/openprocurement/tender/cfaua/views/criterion_rg.py @@ -0,0 +1,14 @@ +# -*- coding: utf-8 -*- +from openprocurement.tender.core.utils import optendersresource +from openprocurement.tender.core.views.criterion_rg import BaseTenderCriteriaRGResource + + +@optendersresource( + name="closeFrameworkAgreementUA:Criteria Requirement Group", + collection_path="/tenders/{tender_id}/criteria/{criterion_id}/requirement_groups", + path="/tenders/{tender_id}/criteria/{criterion_id}/requirement_groups/{requirement_group_id}", + procurementMethodType="closeFrameworkAgreementUA", + description="Tender criteria requirement group", +) +class TenderCriteriaRGResource(BaseTenderCriteriaRGResource): + pass diff --git a/src/openprocurement/tender/cfaua/views/criterion_rg_requirement.py b/src/openprocurement/tender/cfaua/views/criterion_rg_requirement.py new file mode 100644 index 0000000000..c765684b28 --- /dev/null +++ b/src/openprocurement/tender/cfaua/views/criterion_rg_requirement.py @@ -0,0 +1,16 @@ +# -*- coding: utf-8 -*- +from openprocurement.tender.core.utils import optendersresource +from openprocurement.tender.core.views.criterion_rg_requirement import BaseTenderCriteriaRGRequirementResource + + +@optendersresource( + name="closeFrameworkAgreementUA:Requirement Group Requirement", + collection_path="/tenders/{tender_id}/criteria/{criterion_id}/" + "requirement_groups/{requirement_group_id}/requirements", + path="/tenders/{tender_id}/criteria/{criterion_id}/" + "requirement_groups/{requirement_group_id}/requirements/{requirement_id}", + procurementMethodType="closeFrameworkAgreementUA", + description="Tender requirement group requirement", +) +class TenderCriteriaRGRequirementResource(BaseTenderCriteriaRGRequirementResource): + pass diff --git a/src/openprocurement/tender/cfaua/views/criterion_rg_requirement_evidence.py b/src/openprocurement/tender/cfaua/views/criterion_rg_requirement_evidence.py new file mode 100644 index 0000000000..8dccae0a88 --- /dev/null +++ b/src/openprocurement/tender/cfaua/views/criterion_rg_requirement_evidence.py @@ -0,0 +1,18 @@ +# -*- coding: utf-8 -*- +from openprocurement.tender.core.utils import optendersresource +from openprocurement.tender.core.views.criterion_rg_requirement_evidence import ( + BaseTenderCriteriaRGRequirementEvidenceResource, +) + + +@optendersresource( + name="closeFrameworkAgreementUA:Requirement Eligible Evidence", + collection_path="/tenders/{tender_id}/criteria/{criterion_id}/" + "requirement_groups/{requirement_group_id}/requirements/{requirement_id}/evidences", + path="/tenders/{tender_id}/criteria/{criterion_id}/" + "requirement_groups/{requirement_group_id}/requirements/{requirement_id}/evidences/{evidence_id}", + procurementMethodType="closeFrameworkAgreementUA", + description="Tender requirement evidence", +) +class TenderCriteriaRGRequirementEvidenceResource(BaseTenderCriteriaRGRequirementEvidenceResource): + pass diff --git a/src/openprocurement/tender/cfaua/views/tender.py b/src/openprocurement/tender/cfaua/views/tender.py index fecb12d343..442b336af3 100644 --- a/src/openprocurement/tender/cfaua/views/tender.py +++ b/src/openprocurement/tender/cfaua/views/tender.py @@ -13,6 +13,7 @@ validate_tender_period_extension, validate_tender_not_in_terminated_status, validate_tender_change_status_with_cancellation_lot_pending, + validate_tender_activate_with_criteria, ) from openprocurement.tender.belowthreshold.views.tender import TenderResource from openprocurement.tender.cfaua.utils import check_status, all_bids_are_reviewed, all_awards_are_reviewed @@ -38,6 +39,7 @@ class TenderEUResource(TenderResource): validate_tender_not_in_terminated_status, validate_tender_status_update, validate_tender_change_status_with_cancellation_lot_pending, + validate_tender_activate_with_criteria, ), permission="edit_tender", ) diff --git a/src/openprocurement/tender/competitivedialogue/adapters.py b/src/openprocurement/tender/competitivedialogue/adapters.py index 71589ed0ae..f7f2a0e4a5 100644 --- a/src/openprocurement/tender/competitivedialogue/adapters.py +++ b/src/openprocurement/tender/competitivedialogue/adapters.py @@ -9,7 +9,7 @@ TenderStage2EU, TenderStage2UA, ) -from openprocurement.tender.openua.constants import TENDER_PERIOD as TENDERING_DURATION_UA +from openprocurement.tender.openua.constants import TENDERING_DURATION as TENDERING_DURATION_UA from openprocurement.tender.openeu.constants import TENDERING_DURATION as TENDERING_DURATION_EU from openprocurement.tender.openeu.constants import PREQUALIFICATION_COMPLAINT_STAND_STILL diff --git a/src/openprocurement/tender/competitivedialogue/models.py b/src/openprocurement/tender/competitivedialogue/models.py index db704b7d53..1ff48cca21 100644 --- a/src/openprocurement/tender/competitivedialogue/models.py +++ b/src/openprocurement/tender/competitivedialogue/models.py @@ -32,10 +32,11 @@ validate_lots_uniq, Lot as BaseLotUA, EUConfidentialDocument, + ConfidentialDocumentModelType, ) from openprocurement.tender.core.utils import calculate_tender_business_date from openprocurement.tender.openua.models import Item as BaseUAItem, Tender as BaseTenderUA -from openprocurement.tender.openua.constants import TENDER_PERIOD as TENDERING_DURATION_UA +from openprocurement.tender.openua.constants import TENDERING_DURATION as TENDERING_DURATION_UA from openprocurement.tender.openeu.models import ( Administrator_bid_role, view_bid_role, @@ -134,7 +135,7 @@ class Options: "deleted": whitelist("id", "status"), } - documents = ListType(ModelType(Document, required=True), default=list()) + documents = ListType(ConfidentialDocumentModelType(Document, required=True), default=list()) value = None lotValues = ListType(ModelType(LotValue, required=True), default=list()) @@ -364,11 +365,12 @@ class CompetitiveDialogUA(CompetitiveDialogEU): # stage 2 models -def init_PeriodStartEndRequired(tendering_duration): +def default_period(tendering_duration): def wrapper(): - return PeriodStartEndRequired( - {"startDate": get_now(), "endDate": calculate_tender_business_date(get_now(), tendering_duration)} - ) + return PeriodStartEndRequired({ + "startDate": get_now(), + "endDate": calculate_tender_business_date(get_now(), tendering_duration) + }) return wrapper @@ -482,7 +484,7 @@ class TenderStage2EU(BaseTenderEU): dialogueID = StringType() shortlistedFirms = ListType(ModelType(Firms, required=True), min_size=3, required=True) tenderPeriod = ModelType( - PeriodStartEndRequired, required=False, default=init_PeriodStartEndRequired(TENDERING_DURATION_EU) + PeriodStartEndRequired, required=False, default=default_period(TENDERING_DURATION_EU) ) status = StringType( choices=[ @@ -607,7 +609,7 @@ class TenderStage2UA(BaseTenderUA): dialogueID = StringType() shortlistedFirms = ListType(ModelType(Firms, required=True), min_size=3, required=True) tenderPeriod = ModelType( - PeriodStartEndRequired, required=False, default=init_PeriodStartEndRequired(TENDERING_DURATION_UA) + PeriodStartEndRequired, required=False, default=default_period(TENDERING_DURATION_UA) ) status = StringType( choices=[ diff --git a/src/openprocurement/tender/competitivedialogue/subscribers.py b/src/openprocurement/tender/competitivedialogue/subscribers.py index 1e3c1b124b..6eff4aa518 100644 --- a/src/openprocurement/tender/competitivedialogue/subscribers.py +++ b/src/openprocurement/tender/competitivedialogue/subscribers.py @@ -1,16 +1,15 @@ from pyramid.events import subscriber from openprocurement.tender.core.events import TenderInitializeEvent -from openprocurement.tender.core.utils import get_now, calculate_tender_business_date +from openprocurement.tender.core.utils import calculate_tender_business_date from openprocurement.tender.openeu.constants import TENDERING_DURATION as TENDERING_DURATION_EU -from openprocurement.tender.openua.constants import TENDER_PERIOD as TENDERING_DURATION_UA +from openprocurement.tender.openua.constants import TENDERING_DURATION as TENDERING_DURATION_UA from openprocurement.tender.openua.subscribers import tender_init_handler as tender_init_handler_ua from openprocurement.tender.openeu.subscribers import tender_init_handler as tender_init_handler_eu @subscriber(TenderInitializeEvent, procurementMethodType="competitiveDialogueEU.stage2") -def tender_init_handler_1(event): +def tender_init_handler_eu_stage2(event): """ initialization handler for tenders """ - # import pdb; pdb.set_trace() tender = event.tender tender.tenderPeriod.endDate = calculate_tender_business_date( tender.tenderPeriod.startDate, TENDERING_DURATION_EU, tender @@ -19,9 +18,8 @@ def tender_init_handler_1(event): @subscriber(TenderInitializeEvent, procurementMethodType="competitiveDialogueUA.stage2") -def tender_init_handler_2(event): +def tender_init_handler_ua_stage2(event): """ initialization handler for tenders """ - # import pdb; pdb.set_trace() tender = event.tender tender.tenderPeriod.endDate = calculate_tender_business_date( tender.tenderPeriod.startDate, TENDERING_DURATION_UA, tender @@ -30,18 +28,12 @@ def tender_init_handler_2(event): @subscriber(TenderInitializeEvent, procurementMethodType="competitiveDialogueEU") -def tender_init_handler_3(event): +def tender_init_handler_eu_stage1(event): """ initialization handler for tenders """ - # tender = event.tender - # tender.tenderPeriod.endDate = calculate_business_date(tender.tenderPeriod.startDate, TENDERING_DURATION_EU, tender) tender_init_handler_eu(event) - # import pdb; pdb.set_trace() @subscriber(TenderInitializeEvent, procurementMethodType="competitiveDialogueUA") -def tender_init_handler_4(event): +def tender_init_handler_ua_stage1(event): """ initialization handler for tenders """ - # tender = event.tender - # tender.tenderPeriod.endDate = calculate_business_date(tender.tenderPeriod.startDate, TENDERING_DURATION_UA, tender) tender_init_handler_ua(event) - # import pdb; pdb.set_trace() diff --git a/src/openprocurement/tender/competitivedialogue/tests/base.py b/src/openprocurement/tender/competitivedialogue/tests/base.py index 7687dcb572..e89f0c1698 100644 --- a/src/openprocurement/tender/competitivedialogue/tests/base.py +++ b/src/openprocurement/tender/competitivedialogue/tests/base.py @@ -4,12 +4,17 @@ from datetime import datetime, timedelta from uuid import uuid4 from copy import deepcopy +from mock import patch from openprocurement.api.constants import SANDBOX_MODE -from openprocurement.api.tests.base import BaseWebTest from openprocurement.api.utils import get_now +from openprocurement.api.tests.base import BaseWebTest +from openprocurement.tender.competitivedialogue.models import ( + TenderStage2UA, CompetitiveDialogEU, CompetitiveDialogUA, + TenderStage2EU, +) +from openprocurement.tender.competitivedialogue.tests.periods import PERIODS, PERIODS_UA_STAGE_2 from openprocurement.tender.openua.tests.base import BaseTenderUAWebTest as BaseTenderWebTest from openprocurement.tender.belowthreshold.tests.base import test_organization -from openprocurement.tender.openeu.constants import TENDERING_DURATION, QUESTIONS_STAND_STILL, COMPLAINT_STAND_STILL from openprocurement.tender.openeu.tests.base import ( test_tender_data as base_test_tender_data_eu, test_features_tender_data, @@ -125,485 +130,30 @@ class BaseCompetitiveDialogWebTest(BaseTenderWebTest): ) # status, in which operations with tender lots (adding, updating, deleting) are forbidden def set_enquiry_period_end(self): - now = get_now() - self.set_status( - "active.tendering", - { - "enquiryPeriod": { - "startDate": (now - timedelta(days=28)).isoformat(), - "endDate": (now - (timedelta(minutes=1) if SANDBOX_MODE else timedelta(days=1))).isoformat(), - }, - "tenderPeriod": { - "startDate": (now - timedelta(days=28)).isoformat(), - "endDate": (now + (timedelta(minutes=2) if SANDBOX_MODE else timedelta(days=2))).isoformat(), - }, - }, - ) + self.set_status("active.tendering", startend="enquiry_end") def set_complaint_period_end(self): - now = get_now() - self.set_status( - "active.tendering", - { - "enquiryPeriod": { - "startDate": (now - timedelta(days=27)).isoformat(), - "endDate": (now - (timedelta(minutes=2) if SANDBOX_MODE else timedelta(days=2))).isoformat(), - }, - "tenderPeriod": { - "startDate": (now - timedelta(days=27)).isoformat(), - "endDate": (now + (timedelta(minutes=3) if SANDBOX_MODE else timedelta(days=3))).isoformat(), - }, - }, - ) - - + self.set_status("active.tendering", startend="complaint_end") def setUp(self): super(BaseCompetitiveDialogWebTest, self).setUp() self.app.authorization = self.initial_auth or ("Basic", ("broker", "")) - def time_shift(self, status, extra=None): - now = get_now() - tender = self.db.get(self.tender_id) - self.tender_document = tender - data = {} - if status == "enquiryPeriod_ends": - data.update( - { - "enquiryPeriod": { - "startDate": (now - timedelta(days=28)).isoformat(), - "endDate": (now - timedelta(days=1)).isoformat(), - }, - "tenderPeriod": { - "startDate": (now - timedelta(days=28)).isoformat(), - "endDate": (now + timedelta(days=2)).isoformat(), - }, - } - ) - if status == "active.pre-qualification": - data.update( - { - "enquiryPeriod": { - "startDate": (now - TENDERING_DURATION).isoformat(), - "endDate": (now - QUESTIONS_STAND_STILL).isoformat(), - }, - "tenderPeriod": {"startDate": (now - TENDERING_DURATION).isoformat(), "endDate": (now).isoformat()}, - } - ) - elif status == "active.pre-qualification.stand-still": - data.update( - { - "enquiryPeriod": { - "startDate": (now - TENDERING_DURATION).isoformat(), - "endDate": (now - QUESTIONS_STAND_STILL).isoformat(), - }, - "tenderPeriod": {"startDate": (now - TENDERING_DURATION).isoformat(), "endDate": (now).isoformat()}, - "qualificationPeriod": {"startDate": (now).isoformat()}, - } - ) - if "lots" in tender and tender["lots"]: - data["lots"] = [] - for index, lot in enumerate(tender["lots"]): - lot_data = {"id": lot["id"]} - if lot["status"] is "active": - lot_data["auctionPeriod"] = {"startDate": (now + COMPLAINT_STAND_STILL).isoformat()} - data["lots"].append(lot_data) - else: - data.update({"auctionPeriod": {"startDate": (now + COMPLAINT_STAND_STILL).isoformat()}}) - elif status == "active.auction": - data.update( - { - "enquiryPeriod": { - "startDate": (now - TENDERING_DURATION - COMPLAINT_STAND_STILL).isoformat(), - "endDate": ( - now - COMPLAINT_STAND_STILL - TENDERING_DURATION + QUESTIONS_STAND_STILL - ).isoformat(), - }, - "tenderPeriod": { - "startDate": (now - TENDERING_DURATION - COMPLAINT_STAND_STILL).isoformat(), - "endDate": (now - COMPLAINT_STAND_STILL).isoformat(), - }, - "qualificationPeriod": { - "startDate": (now - COMPLAINT_STAND_STILL).isoformat(), - "endDate": (now).isoformat(), - }, - } - ) - if "lots" in tender and tender["lots"]: - data["lots"] = [] - for index, lot in enumerate(tender["lots"]): - lot_data = {"id": lot["id"]} - if lot["status"] == "active": - lot_data["auctionPeriod"] = {"startDate": (now).isoformat()} - data["lots"].append(lot_data) - else: - data.update({"auctionPeriod": {"startDate": now.isoformat()}}) - elif status == "complete": - data.update( - { - "enquiryPeriod": { - "startDate": (now - TENDERING_DURATION - COMPLAINT_STAND_STILL - timedelta(days=3)).isoformat(), - "endDate": ( - now - QUESTIONS_STAND_STILL - COMPLAINT_STAND_STILL - timedelta(days=3) - ).isoformat(), - }, - "tenderPeriod": { - "startDate": (now - TENDERING_DURATION - COMPLAINT_STAND_STILL - timedelta(days=3)).isoformat(), - "endDate": (now - COMPLAINT_STAND_STILL - timedelta(days=3)).isoformat(), - }, - "auctionPeriod": { - "startDate": (now - timedelta(days=3)).isoformat(), - "endDate": (now - timedelta(days=2)).isoformat(), - }, - "awardPeriod": {"startDate": (now - timedelta(days=1)).isoformat(), "endDate": (now).isoformat()}, - } - ) - if self.initial_lots: - data.update( - { - "lots": [ - { - "auctionPeriod": { - "startDate": (now - timedelta(days=3)).isoformat(), - "endDate": (now - timedelta(days=2)).isoformat(), - } - } - for i in self.initial_lots - ] - } - ) - if extra: - data.update(extra) - self.tender_document_patch = data - self.save_changes() - - def update_status(self, status, extra=None): - now = get_now() - data = {"status": status} - if status == "active.tendering": - data.update( - { - "enquiryPeriod": { - "startDate": (now - timedelta(days=1)).isoformat(), - "endDate": (now + TENDERING_DURATION - QUESTIONS_STAND_STILL).isoformat(), - }, - "tenderPeriod": { - "startDate": (now - timedelta(days=1)).isoformat(), - "endDate": (now + TENDERING_DURATION).isoformat(), - }, - } - ) - elif status == "active.pre-qualification": - data.update( - { - "enquiryPeriod": { - "startDate": (now - TENDERING_DURATION - timedelta(days=1)).isoformat(), - "endDate": (now - QUESTIONS_STAND_STILL).isoformat(), - }, - "tenderPeriod": { - "startDate": (now - TENDERING_DURATION - timedelta(days=1)).isoformat(), - "endDate": (now).isoformat(), - }, - "qualificationPeriod": {"startDate": (now).isoformat()}, - } - ) - elif status == "active.qualification": - data.update( - { - "enquiryPeriod": { - "startDate": (now - TENDERING_DURATION - COMPLAINT_STAND_STILL - timedelta(days=2)).isoformat(), - "endDate": ( - now - QUESTIONS_STAND_STILL - COMPLAINT_STAND_STILL - timedelta(days=1) - ).isoformat(), - }, - "tenderPeriod": { - "startDate": (now - TENDERING_DURATION - COMPLAINT_STAND_STILL - timedelta(days=2)).isoformat(), - "endDate": (now - COMPLAINT_STAND_STILL - timedelta(days=1)).isoformat(), - }, - "auctionPeriod": {"startDate": (now - timedelta(days=1)).isoformat(), "endDate": (now).isoformat()}, - "awardPeriod": {"startDate": (now).isoformat()}, - } - ) - if self.initial_lots: - data.update( - { - "lots": [ - { - "auctionPeriod": { - "startDate": (now - timedelta(days=1)).isoformat(), - "endDate": (now).isoformat(), - } - } - for i in self.initial_lots - ] - } - ) - elif status == "active.pre-qualification.stand-still": - data.update( - { - "enquiryPeriod": { - "startDate": (now - TENDERING_DURATION - timedelta(days=1)).isoformat(), - "endDate": (now - QUESTIONS_STAND_STILL).isoformat(), - }, - "tenderPeriod": { - "startDate": (now - TENDERING_DURATION - timedelta(days=1)).isoformat(), - "endDate": (now).isoformat(), - }, - "qualificationPeriod": {"startDate": (now).isoformat()}, - "auctionPeriod": {"startDate": (now + COMPLAINT_STAND_STILL).isoformat()}, - } - ) - elif status == "active.stage2.pending": - data.update( - { - "enquiryPeriod": { - "startDate": (now - TENDERING_DURATION - COMPLAINT_STAND_STILL - timedelta(days=1)).isoformat(), - "endDate": ( - now - COMPLAINT_STAND_STILL - TENDERING_DURATION + QUESTIONS_STAND_STILL - ).isoformat(), - }, - "tenderPeriod": { - "startDate": (now - TENDERING_DURATION - COMPLAINT_STAND_STILL - timedelta(days=1)).isoformat(), - "endDate": (now - COMPLAINT_STAND_STILL).isoformat(), - }, - "qualificationPeriod": { - "startDate": (now - COMPLAINT_STAND_STILL).isoformat(), - "endDate": (now).isoformat(), - }, - } - ) - if self.initial_lots: - data.update({"lots": [{"auctionPeriod": {"startDate": (now).isoformat()}} for i in self.initial_lots]}) - elif status == "active.auction": - data.update( - { - "enquiryPeriod": { - "startDate": (now - TENDERING_DURATION - COMPLAINT_STAND_STILL - timedelta(days=1)).isoformat(), - "endDate": ( - now - COMPLAINT_STAND_STILL - TENDERING_DURATION + QUESTIONS_STAND_STILL - ).isoformat(), - }, - "tenderPeriod": { - "startDate": (now - TENDERING_DURATION - COMPLAINT_STAND_STILL - timedelta(days=1)).isoformat(), - "endDate": (now - COMPLAINT_STAND_STILL).isoformat(), - }, - "qualificationPeriod": { - "startDate": (now - COMPLAINT_STAND_STILL).isoformat(), - "endDate": (now).isoformat(), - }, - "auctionPeriod": {"startDate": (now).isoformat()}, - } - ) - if self.initial_lots: - data.update({"lots": [{"auctionPeriod": {"startDate": (now).isoformat()}} for i in self.initial_lots]}) - elif status == "active.awarded": - data.update( - { - "enquiryPeriod": { - "startDate": (now - TENDERING_DURATION - COMPLAINT_STAND_STILL - timedelta(days=3)).isoformat(), - "endDate": ( - now - QUESTIONS_STAND_STILL - COMPLAINT_STAND_STILL - timedelta(days=2) - ).isoformat(), - }, - "tenderPeriod": { - "startDate": (now - TENDERING_DURATION - COMPLAINT_STAND_STILL - timedelta(days=3)).isoformat(), - "endDate": (now - COMPLAINT_STAND_STILL - timedelta(days=2)).isoformat(), - }, - "auctionPeriod": { - "startDate": (now - timedelta(days=2)).isoformat(), - "endDate": (now - timedelta(days=1)).isoformat(), - }, - "awardPeriod": {"startDate": (now - timedelta(days=1)).isoformat(), "endDate": (now).isoformat()}, - } - ) - if self.initial_lots: - data.update( - { - "lots": [ - { - "auctionPeriod": { - "startDate": (now - timedelta(days=2)).isoformat(), - "endDate": (now - timedelta(days=1)).isoformat(), - } - } - for i in self.initial_lots - ] - } - ) - elif status == "complete": - data.update( - { - "enquiryPeriod": { - "startDate": (now - TENDERING_DURATION - COMPLAINT_STAND_STILL - timedelta(days=4)).isoformat(), - "endDate": ( - now - QUESTIONS_STAND_STILL - COMPLAINT_STAND_STILL - timedelta(days=3) - ).isoformat(), - }, - "tenderPeriod": { - "startDate": (now - TENDERING_DURATION - COMPLAINT_STAND_STILL - timedelta(days=4)).isoformat(), - "endDate": (now - COMPLAINT_STAND_STILL - timedelta(days=3)).isoformat(), - }, - "auctionPeriod": { - "startDate": (now - timedelta(days=3)).isoformat(), - "endDate": (now - timedelta(days=2)).isoformat(), - }, - "awardPeriod": {"startDate": (now - timedelta(days=1)).isoformat(), "endDate": (now).isoformat()}, - } - ) - if self.initial_lots: - data.update( - { - "lots": [ - { - "auctionPeriod": { - "startDate": (now - timedelta(days=3)).isoformat(), - "endDate": (now - timedelta(days=2)).isoformat(), - } - } - for i in self.initial_lots - ] - } - ) - - self.tender_document_patch = data - if extra: - self.tender_document_patch.update(extra) - self.save_changes() - class BaseCompetitiveDialogEUStage2WebTest(BaseCompetitiveDialogWebTest): initial_data = test_tender_stage2_data_eu test_bids_data = test_bids + periods = PERIODS + tender_class = TenderStage2EU + class BaseCompetitiveDialogUAStage2WebTest(BaseCompetitiveDialogWebTest): initial_data = test_tender_stage2_data_ua test_bids_data = test_bids - def update_status(self, status, extra=None): - now = get_now() - data = {"status": status} - if status == "active.tendering": - data.update( - { - "enquiryPeriod": { - "startDate": (now).isoformat(), - "endDate": (now + timedelta(days=13)).isoformat(), - }, - "tenderPeriod": {"startDate": (now).isoformat(), "endDate": (now + timedelta(days=16)).isoformat()}, - } - ) - elif status == "active.auction": - data.update( - { - "enquiryPeriod": { - "startDate": (now - timedelta(days=16)).isoformat(), - "endDate": (now - timedelta(days=3)).isoformat(), - }, - "tenderPeriod": {"startDate": (now - timedelta(days=16)).isoformat(), "endDate": (now).isoformat()}, - "auctionPeriod": {"startDate": (now).isoformat()}, - } - ) - if self.initial_lots: - data.update({"lots": [{"auctionPeriod": {"startDate": (now).isoformat()}} for i in self.initial_lots]}) - elif status == "active.qualification": - data.update( - { - "enquiryPeriod": { - "startDate": (now - timedelta(days=17)).isoformat(), - "endDate": (now - timedelta(days=4)).isoformat(), - }, - "tenderPeriod": { - "startDate": (now - timedelta(days=17)).isoformat(), - "endDate": (now - timedelta(days=1)).isoformat(), - }, - "auctionPeriod": {"startDate": (now - timedelta(days=1)).isoformat(), "endDate": (now).isoformat()}, - "awardPeriod": {"startDate": (now).isoformat()}, - } - ) - if self.initial_lots: - data.update( - { - "lots": [ - { - "auctionPeriod": { - "startDate": (now - timedelta(days=1)).isoformat(), - "endDate": (now).isoformat(), - } - } - for i in self.initial_lots - ] - } - ) - elif status == "active.awarded": - data.update( - { - "enquiryPeriod": { - "startDate": (now - timedelta(days=17)).isoformat(), - "endDate": (now - timedelta(days=4)).isoformat(), - }, - "tenderPeriod": { - "startDate": (now - timedelta(days=17)).isoformat(), - "endDate": (now - timedelta(days=1)).isoformat(), - }, - "auctionPeriod": {"startDate": (now - timedelta(days=1)).isoformat(), "endDate": (now).isoformat()}, - "awardPeriod": {"startDate": (now).isoformat(), "endDate": (now).isoformat()}, - } - ) - if self.initial_lots: - data.update( - { - "lots": [ - { - "auctionPeriod": { - "startDate": (now - timedelta(days=1)).isoformat(), - "endDate": (now).isoformat(), - } - } - for i in self.initial_lots - ] - } - ) - elif status == "complete": - data.update( - { - "enquiryPeriod": { - "startDate": (now - timedelta(days=25)).isoformat(), - "endDate": (now - timedelta(days=11)).isoformat(), - }, - "tenderPeriod": { - "startDate": (now - timedelta(days=25)).isoformat(), - "endDate": (now - timedelta(days=8)).isoformat(), - }, - "auctionPeriod": { - "startDate": (now - timedelta(days=8)).isoformat(), - "endDate": (now - timedelta(days=7)).isoformat(), - }, - "awardPeriod": { - "startDate": (now - timedelta(days=7)).isoformat(), - "endDate": (now - timedelta(days=7)).isoformat(), - }, - } - ) - if self.initial_lots: - data.update( - { - "lots": [ - { - "auctionPeriod": { - "startDate": (now - timedelta(days=8)).isoformat(), - "endDate": (now - timedelta(days=7)).isoformat(), - } - } - for i in self.initial_lots - ] - } - ) - - self.tender_document_patch = data - if extra: - self.tender_document_patch.update(extra) - self.save_changes() + periods = PERIODS_UA_STAGE_2 + tender_class = TenderStage2UA class BaseCompetitiveDialogEUWebTest(BaseCompetitiveDialogWebTest): @@ -619,6 +169,9 @@ class BaseCompetitiveDialogEUWebTest(BaseCompetitiveDialogWebTest): "active.pre-qualification.stand-still" ) # status, in which adding document to tender auction is forbidden + periods = PERIODS + tender_class = CompetitiveDialogEU + class BaseCompetitiveDialogUAWebTest(BaseCompetitiveDialogWebTest): initial_data = test_tender_data_ua @@ -630,6 +183,9 @@ class BaseCompetitiveDialogUAWebTest(BaseCompetitiveDialogWebTest): "active.tendering" ) # status, in which adding document to tender auction is forbidden + periods = PERIODS + tender_class = CompetitiveDialogUA + class BaseCompetitiveDialogUAContentWebTest(BaseCompetitiveDialogUAWebTest): initial_data = test_tender_data_ua @@ -642,6 +198,9 @@ def setUp(self): super(BaseCompetitiveDialogUAContentWebTest, self).setUp() self.create_tender() + periods = PERIODS + tender_class = CompetitiveDialogUA + class BaseCompetitiveDialogEUContentWebTest(BaseCompetitiveDialogEUWebTest): initial_data = test_tender_data_eu @@ -655,6 +214,66 @@ def setUp(self): self.create_tender() +class BaseCompetitiveDialogEUStage2ContentWebTest(BaseCompetitiveDialogEUWebTest): + initial_data = test_tender_stage2_data_eu + initial_status = None + initial_bids = None + initial_lots = None + initial_features = None + + tender_class = TenderStage2EU + periods = PERIODS + + def setUp(self): + self.app.authorization = ("Basic", ("broker", "")) + super(BaseCompetitiveDialogEUStage2ContentWebTest, self).setUp() + self.create_tender() + + def create_tender(self, initial_lots=None, initial_data=None, features=None, initial_bids=None): + return create_tender_stage2( + self, + initial_lots=initial_lots, + initial_data=initial_data, + features=features, + initial_bids=initial_bids + ) + + +class BaseCompetitiveDialogUAStage2ContentWebTest(BaseCompetitiveDialogUAWebTest): + initial_data = test_tender_stage2_data_ua + initial_status = None + initial_bids = None + initial_lots = None + initial_features = None + + tender_class = TenderStage2UA + periods = PERIODS_UA_STAGE_2 + + def create_tenderers(self, count=1): + tenderers = [] + for i in xrange(count): + tenderer = deepcopy(test_bids[0]["tenderers"]) + identifier = self.initial_data["shortlistedFirms"][i if i < 3 else 3]["identifier"] + tenderer[0]["identifier"]["id"] = identifier["id"] + tenderer[0]["identifier"]["scheme"] = identifier["scheme"] + tenderers.append(tenderer) + return tenderers + + def setUp(self): + self.app.authorization = ("Basic", ("broker", "")) + super(BaseCompetitiveDialogUAStage2ContentWebTest, self).setUp() + self.create_tender() + + def create_tender(self, initial_lots=None, initial_data=None, features=None, initial_bids=None): + return create_tender_stage2( + self, + initial_lots=initial_lots, + initial_data=initial_data, + features=features, + initial_bids=initial_bids + ) + + def create_tender_stage2(self, initial_lots=None, initial_data=None, features=None, initial_bids=None): if initial_lots is None: initial_lots = self.initial_lots @@ -699,11 +318,17 @@ def create_tender_stage2(self, initial_lots=None, initial_data=None, features=No {"data": {"status": "draft.stage2"}}, ) + if self.initial_criteria: + self.app.post_json( + "/tenders/{id}/criteria?acc_token={token}".format(id=self.tender_id, token=self.tender_token), + {"data": self.initial_criteria}, + ) self.app.authorization = ("Basic", ("broker", "")) - self.app.patch_json( - "/tenders/{id}?acc_token={token}".format(id=self.tender_id, token=self.tender_token), - {"data": {"status": "active.tendering"}}, - ) + with patch("openprocurement.tender.core.validation.RELEASE_ECRITERIA_ARTICLE_17", get_now() + timedelta(days=1)): + self.app.patch_json( + "/tenders/{id}?acc_token={token}".format(id=self.tender_id, token=self.tender_token), + {"data": {"status": "active.tendering"}}, + ) self.app.authorization = auth if initial_bids: self.initial_bids_tokens = {} @@ -723,168 +348,3 @@ def create_tender_stage2(self, initial_lots=None, initial_data=None, features=No if self.initial_status and self.initial_status != status: self.set_status(self.initial_status) - - -class BaseCompetitiveDialogEUStage2ContentWebTest(BaseCompetitiveDialogEUWebTest): - initial_data = test_tender_stage2_data_eu - initial_status = None - initial_bids = None - initial_lots = None - initial_features = None - - def setUp(self): - self.app.authorization = ("Basic", ("broker", "")) - super(BaseCompetitiveDialogEUStage2ContentWebTest, self).setUp() - self.create_tender() - - create_tender = create_tender_stage2 - - -class BaseCompetitiveDialogUAStage2ContentWebTest(BaseCompetitiveDialogUAWebTest): - initial_data = test_tender_stage2_data_ua - initial_status = None - initial_bids = None - initial_lots = None - initial_features = None - - def create_tenderers(self, count=1): - tenderers = [] - for i in xrange(count): - tenderer = deepcopy(test_bids[0]["tenderers"]) - identifier = self.initial_data["shortlistedFirms"][i if i < 3 else 3]["identifier"] - tenderer[0]["identifier"]["id"] = identifier["id"] - tenderer[0]["identifier"]["scheme"] = identifier["scheme"] - tenderers.append(tenderer) - return tenderers - - def setUp(self): - self.app.authorization = ("Basic", ("broker", "")) - super(BaseCompetitiveDialogUAStage2ContentWebTest, self).setUp() - self.create_tender() - - create_tender = create_tender_stage2 - - def update_status(self, status, extra=None): - now = get_now() - data = {"status": status} - if status == "active.tendering": - data.update( - { - "enquiryPeriod": { - "startDate": (now).isoformat(), - "endDate": (now + timedelta(days=13)).isoformat(), - }, - "tenderPeriod": {"startDate": (now).isoformat(), "endDate": (now + timedelta(days=16)).isoformat()}, - } - ) - elif status == "active.auction": - data.update( - { - "enquiryPeriod": { - "startDate": (now - timedelta(days=16)).isoformat(), - "endDate": (now - timedelta(days=3)).isoformat(), - }, - "tenderPeriod": {"startDate": (now - timedelta(days=16)).isoformat(), "endDate": (now).isoformat()}, - "auctionPeriod": {"startDate": (now).isoformat()}, - } - ) - if self.initial_lots: - data.update({"lots": [{"auctionPeriod": {"startDate": (now).isoformat()}} for i in self.initial_lots]}) - elif status == "active.qualification": - data.update( - { - "enquiryPeriod": { - "startDate": (now - timedelta(days=17)).isoformat(), - "endDate": (now - timedelta(days=4)).isoformat(), - }, - "tenderPeriod": { - "startDate": (now - timedelta(days=17)).isoformat(), - "endDate": (now - timedelta(days=1)).isoformat(), - }, - "auctionPeriod": {"startDate": (now - timedelta(days=1)).isoformat(), "endDate": (now).isoformat()}, - "awardPeriod": {"startDate": (now).isoformat()}, - } - ) - if self.initial_lots: - data.update( - { - "lots": [ - { - "auctionPeriod": { - "startDate": (now - timedelta(days=1)).isoformat(), - "endDate": (now).isoformat(), - } - } - for i in self.initial_lots - ] - } - ) - elif status == "active.awarded": - data.update( - { - "enquiryPeriod": { - "startDate": (now - timedelta(days=17)).isoformat(), - "endDate": (now - timedelta(days=4)).isoformat(), - }, - "tenderPeriod": { - "startDate": (now - timedelta(days=17)).isoformat(), - "endDate": (now - timedelta(days=1)).isoformat(), - }, - "auctionPeriod": {"startDate": (now - timedelta(days=1)).isoformat(), "endDate": (now).isoformat()}, - "awardPeriod": {"startDate": (now).isoformat(), "endDate": (now).isoformat()}, - } - ) - if self.initial_lots: - data.update( - { - "lots": [ - { - "auctionPeriod": { - "startDate": (now - timedelta(days=1)).isoformat(), - "endDate": (now).isoformat(), - } - } - for i in self.initial_lots - ] - } - ) - elif status == "complete": - data.update( - { - "enquiryPeriod": { - "startDate": (now - timedelta(days=25)).isoformat(), - "endDate": (now - timedelta(days=11)).isoformat(), - }, - "tenderPeriod": { - "startDate": (now - timedelta(days=25)).isoformat(), - "endDate": (now - timedelta(days=8)).isoformat(), - }, - "auctionPeriod": { - "startDate": (now - timedelta(days=8)).isoformat(), - "endDate": (now - timedelta(days=7)).isoformat(), - }, - "awardPeriod": { - "startDate": (now - timedelta(days=7)).isoformat(), - "endDate": (now - timedelta(days=7)).isoformat(), - }, - } - ) - if self.initial_lots: - data.update( - { - "lots": [ - { - "auctionPeriod": { - "startDate": (now - timedelta(days=8)).isoformat(), - "endDate": (now - timedelta(days=7)).isoformat(), - } - } - for i in self.initial_lots - ] - } - ) - - self.tender_document_patch = data - if extra: - self.tender_document_patch.update(extra) - self.save_changes() diff --git a/src/openprocurement/tender/competitivedialogue/tests/periods.py b/src/openprocurement/tender/competitivedialogue/tests/periods.py new file mode 100644 index 0000000000..c52c823a04 --- /dev/null +++ b/src/openprocurement/tender/competitivedialogue/tests/periods.py @@ -0,0 +1,248 @@ +from datetime import timedelta + +from openprocurement.tender.openeu.constants import TENDERING_DURATION, QUESTIONS_STAND_STILL, COMPLAINT_STAND_STILL + +PERIODS = { + "active.tendering": { + "start": { + "enquiryPeriod": { + "startDate": -timedelta(days=1), + "endDate": TENDERING_DURATION - QUESTIONS_STAND_STILL, + }, + "tenderPeriod": { + "startDate": -timedelta(days=1), + "endDate": TENDERING_DURATION, + }, + }, + "enquiry_end": { + "enquiryPeriod": { + "startDate": -timedelta(days=29), + "endDate": -timedelta(days=1), + }, + "tenderPeriod": { + "startDate": -timedelta(days=29), + "endDate": timedelta(days=2), + }, + }, + "complaint_end": { + "enquiryPeriod": { + "startDate": -timedelta(days=28), + "endDate": -timedelta(days=2), + }, + "tenderPeriod": { + "startDate": -timedelta(days=28), + "endDate": timedelta(days=3), + }, + }, + }, + "active.pre-qualification": { + "start": { + "enquiryPeriod": { + "startDate": -TENDERING_DURATION - timedelta(days=1), + "endDate": -QUESTIONS_STAND_STILL, + }, + "tenderPeriod": { + "startDate": -TENDERING_DURATION - timedelta(days=1), + "endDate": timedelta(), + }, + "qualificationPeriod": {"startDate": timedelta()}, + } + }, + "active.qualification": { + "start": { + "enquiryPeriod": { + "startDate": -TENDERING_DURATION - COMPLAINT_STAND_STILL - timedelta(days=2), + "endDate": -QUESTIONS_STAND_STILL - COMPLAINT_STAND_STILL - timedelta(days=1), + }, + "tenderPeriod": { + "startDate": -TENDERING_DURATION - COMPLAINT_STAND_STILL - timedelta(days=2), + "endDate": -COMPLAINT_STAND_STILL - timedelta(days=1), + }, + "auctionPeriod": {"startDate": -timedelta(days=1), "endDate": timedelta()}, + "awardPeriod": {"startDate": timedelta()}, + } + }, + "active.pre-qualification.stand-still": { + "start": { + "enquiryPeriod": { + "startDate": -TENDERING_DURATION - timedelta(days=1), + "endDate": -QUESTIONS_STAND_STILL, + }, + "tenderPeriod": { + "startDate": -TENDERING_DURATION - timedelta(days=1), + "endDate": timedelta(), + }, + "qualificationPeriod": {"startDate": timedelta()}, + "auctionPeriod": {"startDate": COMPLAINT_STAND_STILL}, + } + }, + "active.stage2.pending": { + "start": { + "enquiryPeriod": { + "startDate": -TENDERING_DURATION - COMPLAINT_STAND_STILL - timedelta(days=1), + "endDate": -COMPLAINT_STAND_STILL - TENDERING_DURATION + QUESTIONS_STAND_STILL, + }, + "tenderPeriod": { + "startDate": -TENDERING_DURATION - COMPLAINT_STAND_STILL - timedelta(days=1), + "endDate": -COMPLAINT_STAND_STILL, + }, + "qualificationPeriod": { + "startDate": -COMPLAINT_STAND_STILL, + "endDate": timedelta(), + }, + } + }, + "active.auction": { + "start": { + "enquiryPeriod": { + "startDate": -TENDERING_DURATION - COMPLAINT_STAND_STILL - timedelta(days=1), + "endDate": -COMPLAINT_STAND_STILL - TENDERING_DURATION + QUESTIONS_STAND_STILL, + }, + "tenderPeriod": { + "startDate": -TENDERING_DURATION - COMPLAINT_STAND_STILL - timedelta(days=1), + "endDate": -COMPLAINT_STAND_STILL, + }, + "qualificationPeriod": { + "startDate": -COMPLAINT_STAND_STILL, + "endDate": timedelta(), + }, + "auctionPeriod": {"startDate": timedelta()}, + } + }, + "active.awarded": { + "start": { + "enquiryPeriod": { + "startDate": -TENDERING_DURATION - COMPLAINT_STAND_STILL - timedelta(days=3), + "endDate": -QUESTIONS_STAND_STILL - COMPLAINT_STAND_STILL - timedelta(days=2), + }, + "tenderPeriod": { + "startDate": -TENDERING_DURATION - COMPLAINT_STAND_STILL - timedelta(days=3), + "endDate": -COMPLAINT_STAND_STILL - timedelta(days=2), + }, + "auctionPeriod": { + "startDate": -timedelta(days=2), + "endDate": -timedelta(days=1), + }, + "awardPeriod": {"startDate": -timedelta(days=1), "endDate": timedelta()}, + } + }, + "complete": { + "start": { + "enquiryPeriod": { + "startDate": -TENDERING_DURATION - COMPLAINT_STAND_STILL - timedelta(days=4), + "endDate": -QUESTIONS_STAND_STILL - COMPLAINT_STAND_STILL - timedelta(days=3), + }, + "tenderPeriod": { + "startDate": -TENDERING_DURATION - COMPLAINT_STAND_STILL - timedelta(days=4), + "endDate": -COMPLAINT_STAND_STILL - timedelta(days=3), + }, + "auctionPeriod": { + "startDate": -timedelta(days=3), + "endDate": -timedelta(days=2), + }, + "awardPeriod": {"startDate": -timedelta(days=1), "endDate": timedelta()}, + } + } +} + +PERIODS_UA_STAGE_2 = { + "active.tendering": { + "start": { + "enquiryPeriod": { + "startDate": timedelta(), + "endDate": timedelta(days=13), + }, + "tenderPeriod": { + "startDate": timedelta(), + "endDate": timedelta(days=16) + }, + }, + "enquiry_end": { + "enquiryPeriod": { + "startDate": -timedelta(days=28), + "endDate": -timedelta(days=1), + }, + "tenderPeriod": { + "startDate": -timedelta(days=28), + "endDate": timedelta(days=2), + }, + }, + "complaint_end": { + "enquiryPeriod": { + "startDate": -timedelta(days=27), + "endDate": -timedelta(days=2), + }, + "tenderPeriod": { + "startDate": -timedelta(days=27), + "endDate": timedelta(days=3), + }, + }, + }, + "active.auction": { + "start": { + "enquiryPeriod": { + "startDate": -timedelta(days=16), + "endDate": -timedelta(days=3), + }, + "tenderPeriod": {"startDate": -timedelta(days=16), "endDate": timedelta()}, + "auctionPeriod": {"startDate": timedelta()}, + }, + }, + "active.pre-qualification": { + "start": { + "enquiryPeriod": { + "startDate": -TENDERING_DURATION, + "endDate": -QUESTIONS_STAND_STILL, + }, + "tenderPeriod": {"startDate": -TENDERING_DURATION, "endDate": timedelta()}, + } + }, + "active.qualification": { + "start": { + "enquiryPeriod": { + "startDate": -timedelta(days=17), + "endDate": -timedelta(days=4), + }, + "tenderPeriod": { + "startDate": -timedelta(days=17), + "endDate": -timedelta(days=1), + }, + "auctionPeriod": {"startDate": -timedelta(days=1), "endDate": timedelta()}, + "awardPeriod": {"startDate": timedelta()}, + } + }, + "active.awarded": { + "start": { + "enquiryPeriod": { + "startDate": -timedelta(days=17), + "endDate": -timedelta(days=4), + }, + "tenderPeriod": { + "startDate": -timedelta(days=17), + "endDate": -timedelta(days=1), + }, + "auctionPeriod": {"startDate": -timedelta(days=1), "endDate": timedelta()}, + "awardPeriod": {"startDate": timedelta(), "endDate": timedelta()}, + } + }, + "complete": { + "start": { + "enquiryPeriod": { + "startDate": -timedelta(days=25), + "endDate": -timedelta(days=11), + }, + "tenderPeriod": { + "startDate": -timedelta(days=25), + "endDate": -timedelta(days=8), + }, + "auctionPeriod": { + "startDate": -timedelta(days=8), + "endDate": -timedelta(days=7), + }, + "awardPeriod": { + "startDate": -timedelta(days=7), + "endDate": -timedelta(days=7), + }, + } + } +} diff --git a/src/openprocurement/tender/competitivedialogue/tests/stage1/bid.py b/src/openprocurement/tender/competitivedialogue/tests/stage1/bid.py index 2d22323cdc..7c41fb61cb 100644 --- a/src/openprocurement/tender/competitivedialogue/tests/stage1/bid.py +++ b/src/openprocurement/tender/competitivedialogue/tests/stage1/bid.py @@ -8,8 +8,12 @@ patch_tender_with_bids_lots_none, ) -from openprocurement.tender.openeu.tests.bid import TenderBidResourceTestMixin -from openprocurement.tender.openua.tests.bid import TenderBidDocumentWithDSResourceTestMixin +from openprocurement.tender.openeu.tests.bid import TenderBidResourceTestMixin, CreateBidMixin +from openprocurement.tender.openua.tests.bid import ( + TenderBidDocumentWithDSResourceTestMixin, + TenderBidRequirementResponseTestMixin, + TenderBidRequirementResponseEvidenceTestMixin, +) from openprocurement.tender.competitivedialogue.tests.base import ( BaseCompetitiveDialogUAContentWebTest, BaseCompetitiveDialogEUContentWebTest, @@ -130,27 +134,64 @@ class TenderUABidDocumentWithDSWebTest(TenderBidDocumentWithDSResourceTestMixin, def setUp(self): super(TenderUABidDocumentWithDSWebTest, self).setUp() # Create bid + bid_data = deepcopy(self.test_bids_data[0]) + bid_data["value"] = {"amount": 500} + bid_data["tenderers"] = [test_tenderer] + response = self.app.post_json( "/tenders/{}/bids".format(self.tender_id), - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": [test_tenderer], - "value": {"amount": 500}, - } - }, + {"data": bid_data}, ) bid = response.json["data"] self.bid_id = bid["id"] self.bid_token = response.json["access"]["token"] +class TenderEUBidRequirementResponseResourceTest( + TenderBidRequirementResponseTestMixin, + CreateBidMixin, + BaseCompetitiveDialogEUContentWebTest, +): + test_bids_data = test_bids + initial_status = "active.tendering" + + +class TenderUABidRequirementResponseResourceTest( + TenderBidRequirementResponseTestMixin, + CreateBidMixin, + BaseCompetitiveDialogUAContentWebTest, +): + test_bids_data = test_bids + initial_status = "active.tendering" + + +class TenderEUBidRequirementResponseEvidenceResourceTest( + TenderBidRequirementResponseEvidenceTestMixin, + CreateBidMixin, + BaseCompetitiveDialogEUContentWebTest, +): + test_bids_data = test_bids + initial_status = "active.tendering" + + +class TenderUABidRequirementResponseEvidenceResourceTest( + TenderBidRequirementResponseEvidenceTestMixin, + CreateBidMixin, + BaseCompetitiveDialogUAContentWebTest, +): + test_bids_data = test_bids + initial_status = "active.tendering" + + def suite(): suite = unittest.TestSuite() suite.addTest(unittest.makeSuite(CompetitiveDialogEUBidResourceTest)) suite.addTest(unittest.makeSuite(CompetitiveDialogEUBidFeaturesResourceTest)) suite.addTest(unittest.makeSuite(CompetitiveDialogEUBidDocumentResourceTest)) + suite.addTest(unittest.makeSuite(TenderEUBidRequirementResponseResourceTest)) + suite.addTest(unittest.makeSuite(TenderUABidRequirementResponseResourceTest)) + suite.addTest(unittest.makeSuite(TenderEUBidRequirementResponseEvidenceResourceTest)) + suite.addTest(unittest.makeSuite(TenderUABidRequirementResponseEvidenceResourceTest)) return suite diff --git a/src/openprocurement/tender/competitivedialogue/tests/stage1/bid_blanks.py b/src/openprocurement/tender/competitivedialogue/tests/stage1/bid_blanks.py index 6af2c39b04..94c0a15856 100644 --- a/src/openprocurement/tender/competitivedialogue/tests/stage1/bid_blanks.py +++ b/src/openprocurement/tender/competitivedialogue/tests/stage1/bid_blanks.py @@ -1,6 +1,9 @@ # -*- coding: utf-8 -*- from copy import deepcopy +from openprocurement.api.utils import get_now +from openprocurement.api.constants import RELEASE_ECRITERIA_ARTICLE_17 + # CompetitiveDialogEUBidResourceTest @@ -97,93 +100,95 @@ def create_tender_bidder_invalid(self): self.assertEqual(response.status, "422 Unprocessable Entity") self.assertEqual(response.content_type, "application/json") self.assertEqual(response.json["status"], "error") + + assert_data = [ + {u"description": [u"This field is required."], u"location": u"body", u"name": u"selfQualified"}, + { + u"description": [ + { + u"contactPoint": [u"This field is required."], + u"identifier": {u"scheme": [u"This field is required."], u"id": [u"This field is required."]}, + u"name": [u"This field is required."], + u"address": [u"This field is required."], + } + ], + u"location": u"body", + u"name": u"tenderers", + }, + ] + if get_now() < RELEASE_ECRITERIA_ARTICLE_17: + assert_data.insert(0, {u"description": [u"This field is required."], u"location": u"body", u"name": u"selfEligible"},) + self.assertEqual( response.json["errors"], - [ - {u"description": [u"This field is required."], u"location": u"body", u"name": u"selfEligible"}, - {u"description": [u"This field is required."], u"location": u"body", u"name": u"selfQualified"}, - { - u"description": [ - { - u"contactPoint": [u"This field is required."], - u"identifier": {u"scheme": [u"This field is required."], u"id": [u"This field is required."]}, - u"name": [u"This field is required."], - u"address": [u"This field is required."], - } - ], - u"location": u"body", - u"name": u"tenderers", - }, - ], + assert_data, ) # Try create bid with invalid identifier.uri + assert_data = [ + {u"description": [u"This field is required."], u"location": u"body", u"name": u"selfQualified"}, + { + u"description": [ + { + u"contactPoint": [u"This field is required."], + u"identifier": { + u"scheme": [u"This field is required."], + u"id": [u"This field is required."], + u"uri": [u"Not a well formed URL."], + }, + u"address": [u"This field is required."], + } + ], + u"location": u"body", + u"name": u"tenderers", + }, + ] + bid_data = {"tenderers": [{"name": "name", "identifier": {"uri": "invalid_value"}}]} + if get_now() < RELEASE_ECRITERIA_ARTICLE_17: + assert_data.insert(0, {u"description": [u"This field is required."], u"location": u"body", + u"name": u"selfEligible"}, ) + bid_data["selfEligible"] = False + response = self.app.post_json( request_path, - {"data": {"selfEligible": False, "tenderers": [{"name": "name", "identifier": {"uri": "invalid_value"}}]}}, + {"data": bid_data}, status=422, ) + self.assertEqual(response.status, "422 Unprocessable Entity") self.assertEqual(response.content_type, "application/json") self.assertEqual(response.json["status"], "error") self.assertEqual( response.json["errors"], - [ - {u"description": [u"Value must be one of [True]."], u"location": u"body", u"name": u"selfEligible"}, - {u"description": [u"This field is required."], u"location": u"body", u"name": u"selfQualified"}, - { - u"description": [ - { - u"contactPoint": [u"This field is required."], - u"identifier": { - u"scheme": [u"This field is required."], - u"id": [u"This field is required."], - u"uri": [u"Not a well formed URL."], - }, - u"address": [u"This field is required."], - } - ], - u"location": u"body", - u"name": u"tenderers", - }, - ], + assert_data, ) + bid_data = deepcopy(self.test_bids_data[0]) + del bid_data["value"] + # Field value doesn't exists on first stage # Try create bid without description response = self.app.post_json( request_path, - {"data": {"selfEligible": True, "selfQualified": True, "tenderers": self.test_bids_data[0]["tenderers"]}}, + {"data": bid_data}, ) self.assertEqual(response.status, "201 Created") self.assertEqual(response.content_type, "application/json") # Try create bid with bad valueAddedTaxIncluded + bid_data["value"] = {"amount": 500, "valueAddedTaxIncluded": False} response = self.app.post_json( request_path, - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": self.test_bids_data[0]["tenderers"], - "value": {"amount": 500, "valueAddedTaxIncluded": False}, - } - }, + {"data": bid_data}, ) self.assertEqual(response.status, "201 Created") self.assertEqual(response.content_type, "application/json") + bid_data["value"] = {"amount": 500, "currency": "USD"} # Try create bid bad currency response = self.app.post_json( request_path, - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": self.test_bids_data[0]["tenderers"], - "value": {"amount": 500, "currency": "USD"}, - } - }, + {"data": bid_data}, ) self.assertEqual(response.status, "201 Created") self.assertEqual(response.content_type, "application/json") @@ -191,30 +196,35 @@ def create_tender_bidder_invalid(self): def status_jumping(self): """ Owner try set active.stage2.waiting status after pre-qualification """ + bid_data = deepcopy(self.test_bids_data[0]) + del bid_data["value"] + response = self.app.post_json( "/tenders/{}/bids".format(self.tender_id), - {"data": {"selfEligible": True, "selfQualified": True, "tenderers": self.test_bids_data[0]["tenderers"]}}, + {"data": bid_data}, ) self.assertEqual(response.status, "201 Created") self.assertEqual(response.content_type, "application/json") bid = response.json["data"] bid_token = response.json["access"]["token"] - bidder_data = deepcopy(self.test_bids_data[0]["tenderers"][0]) + bidder_data = bid_data["tenderers"][0] bidder_data["identifier"]["id"] = u"00037256" + + # bid_data["tenderers"] = [bid_data] response = self.app.post_json( "/tenders/{}/bids".format(self.tender_id), - {"data": {"selfEligible": True, "selfQualified": True, "tenderers": [bidder_data]}}, + {"data": bid_data}, ) bidder_data["identifier"]["id"] = u"00037257" response = self.app.post_json( "/tenders/{}/bids".format(self.tender_id), - {"data": {"selfEligible": True, "selfQualified": True, "tenderers": [bidder_data]}}, + {"data": bid_data}, ) bidder_data["identifier"]["id"] = u"00037258" response = self.app.post_json( "/tenders/{}/bids".format(self.tender_id), - {"data": {"selfEligible": True, "selfQualified": True, "tenderers": [bidder_data]}}, + {"data": bid_data}, ) response = self.app.get("/tenders/{}/bids/{}".format(self.tender_id, bid["id"]), status=403) @@ -254,7 +264,7 @@ def create_bid_without_parameters(self): "/tenders/{}/lots?acc_token={}".format(self.tender_id, self.tender_token), { "data": { - "minimalStep": {"amount": 35}, + "minimalStep": {"amount": 15}, "description": "Опис Лот №1", "value": {"amount": 500}, "title": "Лот №1", @@ -302,34 +312,24 @@ def create_bid_without_parameters(self): ) self.assertEqual(response.status, "200 OK") # Create bid without parameters + bid_data = deepcopy(self.test_bids_data[0]) + bid_data["lotValues"] = [{"relatedLot": lot["id"]}] response = self.app.post_json( "/tenders/{}/bids".format(self.tender_id), - { - "data": { - "selfEligible": True, - "selfQualified": True, - "lotValues": [{"relatedLot": lot["id"]}], - "tenderers": self.test_bids_data[0]["tenderers"], - } - }, + {"data": bid_data}, ) self.assertEqual(response.status, "201 Created") # Create another bid and send parameters + + bid_data["parameters"] = [ + {"code": "code_item", "value": 0.01}, + {"code": "code_tenderer", "value": 0.01}, + {"code": "code_lot", "value": 0.01}, + ] + response = self.app.post_json( "/tenders/{}/bids".format(self.tender_id), - { - "data": { - "selfEligible": True, - "selfQualified": True, - "lotValues": [{"relatedLot": lot["id"]}], - "tenderers": self.test_bids_data[0]["tenderers"], - "parameters": [ - {"code": "code_item", "value": 0.01}, - {"code": "code_tenderer", "value": 0.01}, - {"code": "code_lot", "value": 0.01}, - ], - } - }, + {"data": bid_data}, ) self.assertEqual(response.status, "201 Created") bid = response.json["data"] @@ -344,9 +344,11 @@ def patch_tender_bidder(self): Test path dialog bidder """ # Create test bidder + bid_data = deepcopy(self.test_bids_data[0]) + del bid_data["value"] response = self.app.post_json( "/tenders/{}/bids".format(self.tender_id), - {"data": {"selfEligible": True, "selfQualified": True, "tenderers": self.test_bids_data[0]["tenderers"]}}, + {"data": bid_data}, ) self.assertEqual(response.status, "201 Created") self.assertEqual(response.content_type, "application/json") @@ -435,11 +437,13 @@ def get_tender_bidder(self): Try get bidder on different tender status """ # Create bidder, and save - bidder_data = deepcopy(self.test_bids_data[0]["tenderers"][0]) + bid_data = deepcopy(self.test_bids_data[0]) + bidder_data = bid_data["tenderers"][0] + bid_data["value"]["amount"] = 500 bidder_data["identifier"]["id"] = u"00037256" response = self.app.post_json( "/tenders/{}/bids".format(self.tender_id), - {"data": {"selfEligible": True, "selfQualified": True, "tenderers": [bidder_data], "value": {"amount": 500}}}, + {"data": bid_data}, ) self.assertEqual(response.status, "201 Created") self.assertEqual(response.content_type, "application/json") @@ -448,16 +452,17 @@ def get_tender_bidder(self): # Create another bidder bidder_data["identifier"]["id"] = u"00037257" + bid_data["value"]["amount"] = 499 response = self.app.post_json( "/tenders/{}/bids".format(self.tender_id), - {"data": {"selfEligible": True, "selfQualified": True, "tenderers": [bidder_data], "value": {"amount": 499}}}, + {"data": bid_data}, ) # Create another 2 bidder bidder_data["identifier"]["id"] = u"00037258" response = self.app.post_json( "/tenders/{}/bids".format(self.tender_id), - {"data": {"selfEligible": True, "selfQualified": True, "tenderers": [bidder_data], "value": {"amount": 499}}}, + {"data": bid_data}, ) # Try get bidder when dialog status active.tendering @@ -543,19 +548,15 @@ def get_tender_bidder(self): def deleted_bid_do_not_locks_tender_in_state(self): bids = [] bids_tokens = [] - bidder_data = deepcopy(self.test_bids_data[0]["tenderers"][0]) + + bid_data = deepcopy(self.test_bids_data[0]) + bidder_data = bid_data["tenderers"][0] for bid_amount in (400, 405): # Create two bids bidder_data["identifier"]["id"] = "00037256" + str(bid_amount) + bid_data["value"] = {"amount": bid_amount} response = self.app.post_json( "/tenders/{}/bids".format(self.tender_id), - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": [bidder_data], - "value": {"amount": bid_amount}, - } - }, + {"data": bid_data}, ) self.assertEqual(response.status, "201 Created") self.assertEqual(response.content_type, "application/json") @@ -571,15 +572,16 @@ def deleted_bid_do_not_locks_tender_in_state(self): # Create new bid bidder_data["identifier"]["id"] = u"00037258" + bid_data["value"] = {"amount": 101} response = self.app.post_json( "/tenders/{}/bids".format(self.tender_id), - {"data": {"selfEligible": True, "selfQualified": True, "tenderers": [bidder_data], "value": {"amount": 101}}}, + {"data": bid_data}, ) # Create new bid bidder_data["identifier"]["id"] = u"00037259" response = self.app.post_json( "/tenders/{}/bids".format(self.tender_id), - {"data": {"selfEligible": True, "selfQualified": True, "tenderers": [bidder_data], "value": {"amount": 101}}}, + {"data": bid_data}, ) # switch to active.pre-qualification @@ -633,11 +635,13 @@ def deleted_bid_do_not_locks_tender_in_state(self): def get_tender_tenderers(self): # Create bid - bidder_data = deepcopy(self.test_bids_data[0]["tenderers"][0]) + bid_data = deepcopy(self.test_bids_data[0]) + bid_data["value"] = {"amount": 500} + bidder_data = bid_data["tenderers"][0] bidder_data["identifier"]["id"] = u"00037256" response = self.app.post_json( "/tenders/{}/bids".format(self.tender_id), - {"data": {"selfEligible": True, "selfQualified": True, "tenderers": [bidder_data], "value": {"amount": 500}}}, + {"data": bid_data}, ) self.assertEqual(response.status, "201 Created") self.assertEqual(response.content_type, "application/json") @@ -652,16 +656,18 @@ def get_tender_tenderers(self): ) # Create bid + bid_data["value"]["amount"] = 101 bidder_data["identifier"]["id"] = u"00037257" response = self.app.post_json( "/tenders/{}/bids".format(self.tender_id), - {"data": {"selfEligible": True, "selfQualified": True, "tenderers": [bidder_data], "value": {"amount": 101}}}, + {"data": bid_data}, ) # Create another bid + bid_data["value"]["amount"] = 111 bidder_data["identifier"]["id"] = u"00037258" response = self.app.post_json( "/tenders/{}/bids".format(self.tender_id), - {"data": {"selfEligible": True, "selfQualified": True, "tenderers": [bidder_data], "value": {"amount": 111}}}, + {"data": bid_data}, ) # switch to active.pre-qualification @@ -723,7 +729,8 @@ def bids_invalidation_on_tender_change(self): # update tender. we can set value that is less than a value in bids as # they will be invalidated by this request response = self.app.patch_json( - "/tenders/{}?acc_token={}".format(self.tender_id, self.tender_token), {"data": {"value": {"amount": 300.0}}} + "/tenders/{}?acc_token={}".format(self.tender_id, self.tender_token), + {"data": {"value": {"amount": 300.0}, "minimalStep": {"amount": 9.0}}} ) self.assertEqual(response.status, "200 OK") self.assertEqual(response.json["data"]["value"]["amount"], 300) @@ -762,15 +769,19 @@ def bids_invalidation_on_tender_change(self): bidder_data = deepcopy(self.test_bids_data[0]["tenderers"][0]) bidder_data["identifier"]["id"] = u"00037257" + data.update({ + "tenderers": [bidder_data], + "value": {"amount": 101}, + }) self.app.post_json( "/tenders/{}/bids".format(self.tender_id), - {"data": {"selfEligible": True, "selfQualified": True, "tenderers": [bidder_data], "value": {"amount": 101}}}, + {"data": data}, ) bidder_data["identifier"]["id"] = u"00037258" self.app.post_json( "/tenders/{}/bids".format(self.tender_id), - {"data": {"selfEligible": True, "selfQualified": True, "tenderers": [bidder_data], "value": {"amount": 101}}}, + {"data": data}, ) # switch to active.pre-qualification @@ -1717,7 +1728,8 @@ def patch_and_put_document_into_invalid_bid(self): # update tender. we can set value that is less than a value in bids as # they will be invalidated by this request response = self.app.patch_json( - "/tenders/{}?acc_token={}".format(self.tender_id, self.tender_token), {"data": {"value": {"amount": 300.0}}} + "/tenders/{}?acc_token={}".format(self.tender_id, self.tender_token), + {"data": {"value": {"amount": 300.0}, "minimalStep": {"amount": 9.0}}} ) self.assertEqual(response.status, "200 OK") self.assertEqual(response.json["data"]["value"]["amount"], 300) diff --git a/src/openprocurement/tender/competitivedialogue/tests/stage1/criterion.py b/src/openprocurement/tender/competitivedialogue/tests/stage1/criterion.py new file mode 100644 index 0000000000..9ec0a96f57 --- /dev/null +++ b/src/openprocurement/tender/competitivedialogue/tests/stage1/criterion.py @@ -0,0 +1,87 @@ +# -*- coding: utf-8 -*- +import unittest + +from openprocurement.tender.belowthreshold.tests.base import test_lots +from openprocurement.tender.competitivedialogue.tests.base import ( + test_tender_data_ua, + test_tender_data_eu, + BaseCompetitiveDialogEUContentWebTest, + BaseCompetitiveDialogUAContentWebTest, +) +from openprocurement.tender.openua.tests.criterion import ( + TenderCriteriaTestMixin, + TenderCriteriaRGTestMixin, + TenderCriteriaRGRequirementTestMixin, + TenderCriteriaRGRequirementEvidenceTestMixin, +) + + +class TenderCDEUCriteriaTest(TenderCriteriaTestMixin, BaseCompetitiveDialogEUContentWebTest): + initial_data = test_tender_data_eu + test_lots_data = test_lots + initial_status = "draft" + + +class TenderCDUACriteriaTest(TenderCriteriaTestMixin, BaseCompetitiveDialogUAContentWebTest): + initial_data = test_tender_data_ua + test_lots_data = test_lots + initial_status = "draft" + + +class TenderCDEUCriteriaRGTest(TenderCriteriaRGTestMixin, BaseCompetitiveDialogEUContentWebTest): + initial_data = test_tender_data_eu + test_lots_data = test_lots + + +class TenderCDUACriteriaRGTest(TenderCriteriaRGTestMixin, BaseCompetitiveDialogUAContentWebTest): + initial_data = test_tender_data_ua + test_lots_data = test_lots + + +class TenderCDEUCriteriaRGRequirementTest( + TenderCriteriaRGRequirementTestMixin, + BaseCompetitiveDialogEUContentWebTest +): + initial_data = test_tender_data_eu + test_lots_data = test_lots + + +class TenderCDUACriteriaRGRequirementTest( + TenderCriteriaRGRequirementTestMixin, + BaseCompetitiveDialogUAContentWebTest +): + initial_data = test_tender_data_ua + test_lots_data = test_lots + + +class TenderCDEUCriteriaRGRequirementEvidenceTest( + TenderCriteriaRGRequirementEvidenceTestMixin, + BaseCompetitiveDialogEUContentWebTest, +): + initial_data = test_tender_data_eu + test_lots_data = test_lots + + +class TenderCDUACriteriaRGRequirementEvidenceTest( + TenderCriteriaRGRequirementEvidenceTestMixin, + BaseCompetitiveDialogUAContentWebTest, +): + initial_data = test_tender_data_ua + test_lots_data = test_lots + + +def suite(): + suite = unittest.TestSuite() + suite.addTest(unittest.makeSuite(TenderCDEUCriteriaTest)) + suite.addTest(unittest.makeSuite(TenderCDEUCriteriaRGTest)) + suite.addTest(unittest.makeSuite(TenderCDEUCriteriaRGRequirementTest)) + suite.addTest(unittest.makeSuite(TenderCDEUCriteriaRGRequirementEvidenceTest)) + suite.addTest(unittest.makeSuite(TenderCDUACriteriaTest)) + suite.addTest(unittest.makeSuite(TenderCDUACriteriaRGTest)) + suite.addTest(unittest.makeSuite(TenderCDUACriteriaRGRequirementTest)) + suite.addTest(unittest.makeSuite(TenderCDUACriteriaRGRequirementEvidenceTest)) + return suite + + +if __name__ == "__main__": + unittest.main(defaultTest="suite") diff --git a/src/openprocurement/tender/competitivedialogue/tests/stage1/lot.py b/src/openprocurement/tender/competitivedialogue/tests/stage1/lot.py index a1f6c201c0..808be9d0e5 100644 --- a/src/openprocurement/tender/competitivedialogue/tests/stage1/lot.py +++ b/src/openprocurement/tender/competitivedialogue/tests/stage1/lot.py @@ -21,6 +21,8 @@ tender_features_invalid, get_tender_lot, get_tender_lots, + create_tender_lot_minimalstep_validation, + patch_tender_lot_minimalstep_validation, ) from openprocurement.tender.openua.tests.lot_blanks import ( # CompetitiveDialogueEULotFeatureBidderResourceTest @@ -61,6 +63,8 @@ class CompetitiveDialogueEULotResourceTest( test_get_tender_lot = snitch(get_tender_lot) test_get_tender_lots = snitch(get_tender_lots) + test_create_tender_lot_minimalstep_validation = snitch(create_tender_lot_minimalstep_validation) + test_patch_tender_lot_minimalstep_validation = snitch(patch_tender_lot_minimalstep_validation) class CompetitiveDialogueEULotEdgeCasesTest(BaseCompetitiveDialogEUContentWebTest, TenderLotEdgeCasesTestMixin): diff --git a/src/openprocurement/tender/competitivedialogue/tests/stage1/lot_blanks.py b/src/openprocurement/tender/competitivedialogue/tests/stage1/lot_blanks.py index 4367d589e3..8df77df6c7 100644 --- a/src/openprocurement/tender/competitivedialogue/tests/stage1/lot_blanks.py +++ b/src/openprocurement/tender/competitivedialogue/tests/stage1/lot_blanks.py @@ -10,10 +10,12 @@ def create_tender_bidder_invalid(self): + bid_data = deepcopy(self.test_bids_data[0]) + del bid_data["value"] request_path = "/tenders/{}/bids".format(self.tender_id) response = self.app.post_json( request_path, - {"data": {"selfEligible": True, "selfQualified": True, "tenderers": self.test_bids_data[0]["tenderers"]}}, + {"data": bid_data}, status=422, ) self.assertEqual(response.status, "422 Unprocessable Entity") @@ -24,16 +26,10 @@ def create_tender_bidder_invalid(self): [{u"description": [u"This field is required."], u"location": u"body", u"name": u"lotValues"}], ) + bid_data["lotValues"] = [{"value": {"amount": 500}}] response = self.app.post_json( request_path, - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": self.test_bids_data[0]["tenderers"], - "lotValues": [{"value": {"amount": 500}}], - } - }, + {"data": bid_data}, status=422, ) self.assertEqual(response.status, "422 Unprocessable Entity") @@ -50,16 +46,10 @@ def create_tender_bidder_invalid(self): ], ) + bid_data["lotValues"] = [{"value": {"amount": 500}, "relatedLot": "0" * 32}] response = self.app.post_json( request_path, - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": self.test_bids_data[0]["tenderers"], - "lotValues": [{"value": {"amount": 500}, "relatedLot": "0" * 32}], - } - }, + {"data": bid_data}, status=422, ) self.assertEqual(response.status, "422 Unprocessable Entity") @@ -77,61 +67,39 @@ def create_tender_bidder_invalid(self): ) # Field 'value' doesn't exists on first stage + bid_data["lotValues"] = [{"value": {"amount": 5000000}, "relatedLot": self.initial_lots[0]["id"]}] + response = self.app.post_json( request_path, - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": self.test_bids_data[0]["tenderers"], - "lotValues": [{"value": {"amount": 5000000}, "relatedLot": self.initial_lots[0]["id"]}], - } - }, + {"data": bid_data}, ) self.assertEqual(response.status, "201 Created") self.assertEqual(response.content_type, "application/json") + bid_data["lotValues"] = [ + {"value": {"amount": 500, "valueAddedTaxIncluded": False}, "relatedLot": self.initial_lots[0]["id"]} + ] response = self.app.post_json( request_path, - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": self.test_bids_data[0]["tenderers"], - "lotValues": [ - {"value": {"amount": 500, "valueAddedTaxIncluded": False}, "relatedLot": self.initial_lots[0]["id"]} - ], - } - }, + {"data": bid_data}, ) self.assertEqual(response.status, "201 Created") self.assertEqual(response.content_type, "application/json") + bid_data["lotValues"] = [{"value": {"amount": 500, "currency": "USD"}, "relatedLot": self.initial_lots[0]["id"]}] response = self.app.post_json( request_path, - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": self.test_bids_data[0]["tenderers"], - "lotValues": [{"value": {"amount": 500, "currency": "USD"}, "relatedLot": self.initial_lots[0]["id"]}], - } - }, + {"data": bid_data}, ) self.assertEqual(response.status, "201 Created") self.assertEqual(response.content_type, "application/json") + bid_data["value"] = {"amount": 500} + bid_data["lotValues"] = [{"value": {"amount": 500}, "relatedLot": self.initial_lots[0]["id"]}] + response = self.app.post_json( request_path, - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": self.test_bids_data[0]["tenderers"], - "value": {"amount": 500}, - "lotValues": [{"value": {"amount": 500}, "relatedLot": self.initial_lots[0]["id"]}], - } - }, + {"data": bid_data}, ) self.assertEqual(response.status, "201 Created") self.assertEqual(response.content_type, "application/json") @@ -139,16 +107,12 @@ def create_tender_bidder_invalid(self): def patch_tender_bidder(self): lot_id = self.initial_lots[0]["id"] + bid_data = deepcopy(self.test_bids_data[0]) + del bid_data["value"] + bid_data["lotValues"] = [{"value": {"amount": 500}, "relatedLot": lot_id}] response = self.app.post_json( "/tenders/{}/bids".format(self.tender_id), - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": self.test_bids_data[0]["tenderers"], - "lotValues": [{"value": {"amount": 500}, "relatedLot": lot_id}], - } - }, + {"data": bid_data}, ) self.assertEqual(response.status, "201 Created") self.assertEqual(response.content_type, "application/json") @@ -212,24 +176,21 @@ def patch_tender_bidder(self): def create_tender_with_features_bidder_invalid(self): request_path = "/tenders/{}/bids".format(self.tender_id) + bid_data = deepcopy(self.test_bids_data[0]) + del bid_data["value"] response = self.app.post_json( request_path, - {"data": {"selfEligible": True, "selfQualified": True, "tenderers": self.test_bids_data[0]["tenderers"]}}, + {"data": bid_data}, status=422, ) self.assertEqual(response.status, "422 Unprocessable Entity") self.assertEqual(response.content_type, "application/json") + bid_data["lotValues"] = [{"value": {"amount": 500}}] + response = self.app.post_json( request_path, - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": self.test_bids_data[0]["tenderers"], - "lotValues": [{"value": {"amount": 500}}], - } - }, + {"data": bid_data}, status=422, ) self.assertEqual(response.status, "422 Unprocessable Entity") @@ -246,16 +207,10 @@ def create_tender_with_features_bidder_invalid(self): ], ) + bid_data["lotValues"] = [{"value": {"amount": 500}, "relatedLot": "0" * 32}] response = self.app.post_json( request_path, - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": self.test_bids_data[0]["tenderers"], - "lotValues": [{"value": {"amount": 500}, "relatedLot": "0" * 32}], - } - }, + {"data": bid_data}, status=422, ) self.assertEqual(response.status, "422 Unprocessable Entity") @@ -273,44 +228,27 @@ def create_tender_with_features_bidder_invalid(self): ) # Field 'value' doesn't exists on first stage + bid_data["lotValues"] = [{"value": {"amount": 5000000}, "relatedLot": self.lot_id}] + response = self.app.post_json( request_path, - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": self.test_bids_data[0]["tenderers"], - "lotValues": [{"value": {"amount": 5000000}, "relatedLot": self.lot_id}], - } - }, + {"data": bid_data}, ) self.assertEqual(response.status, "201 Created") self.assertEqual(response.content_type, "application/json") + bid_data["lotValues"] = [{"value": {"amount": 500, "valueAddedTaxIncluded": False}, "relatedLot": self.lot_id}] response = self.app.post_json( request_path, - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": self.test_bids_data[0]["tenderers"], - "lotValues": [{"value": {"amount": 500, "valueAddedTaxIncluded": False}, "relatedLot": self.lot_id}], - } - }, + {"data": bid_data}, ) self.assertEqual(response.status, "201 Created") self.assertEqual(response.content_type, "application/json") + bid_data["lotValues"] = [{"value": {"amount": 500, "currency": "USD"}, "relatedLot": self.lot_id}] response = self.app.post_json( request_path, - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": self.test_bids_data[0]["tenderers"], - "lotValues": [{"value": {"amount": 500, "currency": "USD"}, "relatedLot": self.lot_id}], - } - }, + {"data": bid_data}, ) self.assertEqual(response.status, "201 Created") self.assertEqual(response.content_type, "application/json") @@ -373,43 +311,26 @@ def one_lot_2bid_1unqualified(self): self.assertEqual(response.status, "200 OK") # create bid self.app.authorization = ("Basic", ("broker", "")) - bidder_data = deepcopy(self.test_bids_data[0]["tenderers"][0]) + + bid_data = deepcopy(self.test_bids_data[0]) + del bid_data["value"] + bid_data["lotValues"] = [{"value": {"amount": 500}, "relatedLot": lot_id}] + bidder_data = bid_data["tenderers"][0] bidder_data["identifier"]["id"] = u"00037256" response = self.app.post_json( "/tenders/{}/bids".format(tender_id), - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": [bidder_data], - "lotValues": [{"value": {"amount": 500}, "relatedLot": lot_id}], - } - }, + {"data": bid_data}, ) bidder_data["identifier"]["id"] = u"00037257" response = self.app.post_json( "/tenders/{}/bids".format(tender_id), - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": [bidder_data], - "lotValues": [{"value": {"amount": 500}, "relatedLot": lot_id}], - } - }, + {"data": bid_data}, ) bidder_data["identifier"]["id"] = u"00037258" response = self.app.post_json( "/tenders/{}/bids".format(tender_id), - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": [bidder_data], - "lotValues": [{"value": {"amount": 500}, "relatedLot": lot_id}], - } - }, + {"data": bid_data}, ) # switch to active.pre-qualification self.time_shift("active.pre-qualification") @@ -467,47 +388,31 @@ def one_lot_2bid(self): self.assertEqual(response.status, "200 OK") # create bid self.app.authorization = ("Basic", ("broker", "")) - bidder_data = deepcopy(self.test_bids_data[0]["tenderers"][0]) + bid_data = deepcopy(self.test_bids_data[0]) + del bid_data["value"] + bid_data["lotValues"] = [{"value": {"amount": 450}, "relatedLot": lot_id}] + bidder_data = bid_data["tenderers"][0] bidder_data["identifier"]["id"] = u"00037256" response = self.app.post_json( "/tenders/{}/bids".format(tender_id), - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": [bidder_data], - "lotValues": [{"value": {"amount": 450}, "relatedLot": lot_id}], - } - }, + {"data": bid_data}, ) bid_id = response.json["data"]["id"] bid_token = response.json["access"]["token"] # create second bid self.app.authorization = ("Basic", ("broker", "")) + bid_data["lotValues"] = [{"value": {"amount": 475}, "relatedLot": lot_id}] bidder_data["identifier"]["id"] = u"00037257" response = self.app.post_json( "/tenders/{}/bids".format(tender_id), - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": [bidder_data], - "lotValues": [{"value": {"amount": 475}, "relatedLot": lot_id}], - } - }, + {"data": bid_data }, ) # create third + bid_data["lotValues"] = [{"value": {"amount": 470}, "relatedLot": lot_id}] bidder_data["identifier"]["id"] = u"00037258" response = self.app.post_json( "/tenders/{}/bids".format(tender_id), - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": [bidder_data], - "lotValues": [{"value": {"amount": 470}, "relatedLot": lot_id}], - } - }, + {"data": bid_data}, ) # switch to active.pre-qualification self.time_shift("active.pre-qualification") @@ -567,31 +472,22 @@ def two_lot_2bid_1lot_del(self): # create bid bids = [] + bid_data = deepcopy(self.test_bids_data[0]) + del bid_data["value"] + bid_data["lotValues"] = [{"value": {"amount": 500}, "relatedLot": lot_id} for lot_id in lots] self.app.authorization = ("Basic", ("broker", "")) response = self.app.post_json( "/tenders/{}/bids".format(tender_id), - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": self.test_bids_data[0]["tenderers"], - "lotValues": [{"value": {"amount": 500}, "relatedLot": lot_id} for lot_id in lots], - } - }, + {"data": bid_data}, ) bids.append(response.json) # create second bid self.app.authorization = ("Basic", ("broker", "")) + + bid_data["tenderers"] = self.test_bids_data[1]["tenderers"] response = self.app.post_json( "/tenders/{}/bids".format(tender_id), - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": self.test_bids_data[1]["tenderers"], - "lotValues": [{"value": {"amount": 500}, "relatedLot": lot_id} for lot_id in lots], - } - }, + {"data": bid_data}, ) bids.append(response.json) response = self.app.delete("/tenders/{}/lots/{}?acc_token={}".format(self.tender_id, lots[0], owner_token)) @@ -620,19 +516,14 @@ def one_lot_3bid_1del(self): # create bids self.app.authorization = ("Basic", ("broker", "")) bids = [] - bidder_data = deepcopy(self.test_bids_data[0]["tenderers"][0]) + bid_data = deepcopy(self.test_bids_data[0]) + bid_data["lotValues"] = [{"value": {"amount": 450}, "relatedLot": lot_id}] + bidder_data = bid_data["tenderers"][0] for index, test_bid in enumerate(self.test_bids_data): bidder_data["identifier"]["id"] = "00037256" + str(index) response = self.app.post_json( "/tenders/{}/bids".format(tender_id), - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": [bidder_data], - "lotValues": [{"value": {"amount": 450}, "relatedLot": lot_id}], - } - }, + {"data": bid_data}, ) bids.append({response.json["data"]["id"]: response.json["access"]["token"]}) @@ -670,19 +561,15 @@ def one_lot_3bid_1un(self): # create bid self.app.authorization = ("Basic", ("broker", "")) bids = [] - bidder_data = deepcopy(self.test_bids_data[0]["tenderers"][0]) + bid_data = deepcopy(self.test_bids_data[0]) + del bid_data["value"] + bid_data["lotValues"] = [{"value": {"amount": 450}, "relatedLot": lot_id}] + bidder_data = bid_data["tenderers"][0] for i in range(3): bidder_data["identifier"]["id"] = "00037256" + str(i) response = self.app.post_json( "/tenders/{}/bids".format(tender_id), - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": [bidder_data], - "lotValues": [{"value": {"amount": 450}, "relatedLot": lot_id}], - } - }, + {"data": bid_data}, ) bids.append({response.json["data"]["id"]: response.json["access"]["token"]}) @@ -837,44 +724,28 @@ def two_lot_2bid_0com_1can(self): self.assertEqual(response.status, "200 OK") # create bid self.app.authorization = ("Basic", ("broker", "")) - bidder_data = deepcopy(self.test_bids_data[0]["tenderers"][0]) + + bid_data = deepcopy(self.test_bids_data[0]) + del bid_data["value"] + bid_data["lotValues"] = [{"value": {"amount": 500}, "relatedLot": lot_id} for lot_id in lots] + bidder_data = bid_data["tenderers"][0] bidder_data["identifier"]["id"] = u"00037256" response = self.app.post_json( "/tenders/{}/bids".format(tender_id), - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": [bidder_data], - "lotValues": [{"value": {"amount": 500}, "relatedLot": lot_id} for lot_id in lots], - } - }, + {"data": bid_data}, ) + bid_data["lotValues"] = [{"value": {"amount": 499}, "relatedLot": lot_id} for lot_id in lots] bidder_data["identifier"]["id"] = u"00037257" response = self.app.post_json( "/tenders/{}/bids".format(tender_id), - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": [bidder_data], - "lotValues": [{"value": {"amount": 499}, "relatedLot": lot_id} for lot_id in lots], - } - }, + {"data": bid_data}, ) bidder_data["identifier"]["id"] = u"00037258" response = self.app.post_json( "/tenders/{}/bids".format(tender_id), - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": [bidder_data], - "lotValues": [{"value": {"amount": 499}, "relatedLot": lot_id} for lot_id in lots], - } - }, + {"data": bid_data}, ) set_complaint_period_end = getattr(self, "set_complaint_period_end", None) @@ -948,45 +819,27 @@ def two_lot_2bid_2com_2win(self): ) self.assertEqual(response.status, "200 OK") # create bid - bidder_data = deepcopy(self.test_bids_data[0]["tenderers"][0]) + bid_data = deepcopy(self.test_bids_data[0]) + del bid_data["value"] + bid_data["lotValues"] = [{"value": {"amount": 500}, "relatedLot": lot_id} for lot_id in lots] + bidder_data = bid_data["tenderers"][0] bidder_data["identifier"]["id"] = u"00037256" self.app.authorization = ("Basic", ("broker", "")) self.app.post_json( "/tenders/{}/bids".format(tender_id), - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": [bidder_data], - "lotValues": [{"value": {"amount": 500}, "relatedLot": lot_id} for lot_id in lots], - } - }, + {"data": bid_data}, ) # create second bid bidder_data["identifier"]["id"] = u"00037257" self.app.post_json( "/tenders/{}/bids".format(tender_id), - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": [bidder_data], - "lotValues": [{"value": {"amount": 500}, "relatedLot": lot_id} for lot_id in lots], - } - }, + {"data": bid_data}, ) # create third bid bidder_data["identifier"]["id"] = u"00037258" self.app.post_json( "/tenders/{}/bids".format(tender_id), - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": [bidder_data], - "lotValues": [{"value": {"amount": 500}, "relatedLot": lot_id} for lot_id in lots], - } - }, + {"data": bid_data}, ) # switch to active.pre-qualification self.time_shift("active.pre-qualification") diff --git a/src/openprocurement/tender/competitivedialogue/tests/stage1/post.py b/src/openprocurement/tender/competitivedialogue/tests/stage1/post.py index a2868008cc..f78c34bfe6 100644 --- a/src/openprocurement/tender/competitivedialogue/tests/stage1/post.py +++ b/src/openprocurement/tender/competitivedialogue/tests/stage1/post.py @@ -78,38 +78,30 @@ class TenderCompetitiveDialogUAQualificationComplaintPostResourceTest( def setUp(self): super(TenderCompetitiveDialogUAQualificationComplaintPostResourceTest, self).setUp() # Create bid - bidder_data = deepcopy(self.initial_bids[0]["tenderers"][0]) + bid_data = deepcopy(test_bids[0]) + bid_data["value"] = {"amount": 500} + bidder_data = bid_data["tenderers"][0] bidder_data["identifier"]["id"] = u"00037256" response = self.app.post_json( "/tenders/{}/bids".format(self.tender_id), - { - "data": { - "selfEligible": True, "selfQualified": True, "tenderers": [bidder_data], "value": {"amount": 500} - } - }, + {"data": bid_data}, ) self.assertEqual(response.status, "201 Created") self.assertEqual(response.content_type, "application/json") # Create bid + bid_data["value"] = {"amount": 101} bidder_data["identifier"]["id"] = u"00037257" response = self.app.post_json( "/tenders/{}/bids".format(self.tender_id), - { - "data": { - "selfEligible": True, "selfQualified": True, "tenderers": [bidder_data], "value": {"amount": 101} - } - }, + {"data": bid_data}, ) # Create another bid + bid_data["value"] = {"amount": 111} bidder_data["identifier"]["id"] = u"00037258" response = self.app.post_json( "/tenders/{}/bids".format(self.tender_id), - { - "data": { - "selfEligible": True, "selfQualified": True, "tenderers": [bidder_data], "value": {"amount": 111} - } - }, + {"data": bid_data}, ) # update periods to have possibility to change tender status by chronograph @@ -165,7 +157,6 @@ def setUp(self): self.assertEqual(response.content_type, "application/json") - class TenderCompetitiveDialogEUQualificationComplaintPostResourceTest( BaseCompetitiveDialogEUContentWebTest, ComplaintPostResourceMixin, @@ -181,38 +172,30 @@ class TenderCompetitiveDialogEUQualificationComplaintPostResourceTest( def setUp(self): super(TenderCompetitiveDialogEUQualificationComplaintPostResourceTest, self).setUp() # Create bid - bidder_data = deepcopy(self.initial_bids[0]["tenderers"][0]) + bid_data = deepcopy(self.initial_bids[0]) + bid_data["value"] = {"amount": 500} + bidder_data = bid_data["tenderers"][0] bidder_data["identifier"]["id"] = u"00037256" response = self.app.post_json( "/tenders/{}/bids".format(self.tender_id), - { - "data": { - "selfEligible": True, "selfQualified": True, "tenderers": [bidder_data], "value": {"amount": 500} - } - }, + {"data": bid_data}, ) self.assertEqual(response.status, "201 Created") self.assertEqual(response.content_type, "application/json") # Create bid + bid_data["value"] = {"amount": 101} bidder_data["identifier"]["id"] = u"00037257" response = self.app.post_json( "/tenders/{}/bids".format(self.tender_id), - { - "data": { - "selfEligible": True, "selfQualified": True, "tenderers": [bidder_data], "value": {"amount": 101} - } - }, + {"data": bid_data}, ) # Create another bid + bid_data["value"] = {"amount": 111} bidder_data["identifier"]["id"] = u"00037258" response = self.app.post_json( "/tenders/{}/bids".format(self.tender_id), - { - "data": { - "selfEligible": True, "selfQualified": True, "tenderers": [bidder_data], "value": {"amount": 111} - } - }, + {"data": bid_data}, ) # update periods to have possibility to change tender status by chronograph diff --git a/src/openprocurement/tender/competitivedialogue/tests/stage1/question_blanks.py b/src/openprocurement/tender/competitivedialogue/tests/stage1/question_blanks.py index 09d7b2be30..0ecab6f1d1 100644 --- a/src/openprocurement/tender/competitivedialogue/tests/stage1/question_blanks.py +++ b/src/openprocurement/tender/competitivedialogue/tests/stage1/question_blanks.py @@ -227,7 +227,7 @@ def create_tender_question_eu(self): self.assertIn(question["id"], response.headers["Location"]) # Shift time to end of enquiry period - self.time_shift("enquiryPeriod_ends") + self.set_enquiry_period_end() # Try create question, when enquiry period end response = self.app.post_json( @@ -285,7 +285,7 @@ def get_tender_question_eu(self): question["dateAnswered"] = response.json["data"]["dateAnswered"] self.time_shift("active.pre-qualification") # Shift time tender to status active.pre-qualification - self.check_chronograph() + response = self.check_chronograph() # Get question by token_id, and question_id response = self.app.get("/tenders/{}/questions/{}".format(self.tender_id, question["id"])) diff --git a/src/openprocurement/tender/competitivedialogue/tests/stage1/tender.py b/src/openprocurement/tender/competitivedialogue/tests/stage1/tender.py index 22b07a134f..6682df0fdb 100644 --- a/src/openprocurement/tender/competitivedialogue/tests/stage1/tender.py +++ b/src/openprocurement/tender/competitivedialogue/tests/stage1/tender.py @@ -11,6 +11,8 @@ patch_tender_lots_none, create_tender_central, create_tender_central_invalid, + tender_minimalstep_validation, + patch_tender_minimalstep_validation, ) from openprocurement.tender.openua.tests.tender_blanks import ( @@ -85,6 +87,8 @@ class CompetitiveDialogEUResourceTest(BaseCompetitiveDialogEUWebTest, TenderReso test_tender_finance_milestones = snitch(tender_finance_milestones) test_patch_tender_lots_none = snitch(patch_tender_lots_none) test_tender_milestones_required = snitch(tender_milestones_required) + test_tender_minimalstep_validation = snitch(tender_minimalstep_validation) + test_patch_tender_minimalstep_validation = snitch(patch_tender_minimalstep_validation) class CompetitiveDialogUAResourceTest(BaseCompetitiveDialogUAWebTest, TenderResourceTestMixin): @@ -104,6 +108,8 @@ class CompetitiveDialogUAResourceTest(BaseCompetitiveDialogUAWebTest, TenderReso test_tender_finance_milestones = snitch(tender_finance_milestones) test_tender_milestones_required = snitch(tender_milestones_required) test_patch_tender_lots_none = snitch(patch_tender_lots_none) + test_tender_minimalstep_validation = snitch(tender_minimalstep_validation) + test_patch_tender_minimalstep_validation = snitch(patch_tender_minimalstep_validation) def suite(): diff --git a/src/openprocurement/tender/competitivedialogue/tests/stage1/tender_blanks.py b/src/openprocurement/tender/competitivedialogue/tests/stage1/tender_blanks.py index fbca920a9d..85fbbabe46 100644 --- a/src/openprocurement/tender/competitivedialogue/tests/stage1/tender_blanks.py +++ b/src/openprocurement/tender/competitivedialogue/tests/stage1/tender_blanks.py @@ -11,6 +11,7 @@ from openprocurement.tender.competitivedialogue.constants import CD_EU_TYPE, CD_UA_TYPE, FEATURES_MAX_SUM from openprocurement.tender.competitivedialogue.models import CompetitiveDialogUA, CompetitiveDialogEU +from openprocurement.tender.competitivedialogue.tests.base import test_bids # CompetitiveDialogTest @@ -598,21 +599,26 @@ def multiple_bidders_tender_eu(self): # create bids bidder_data = deepcopy(test_organization) self.app.authorization = ("Basic", ("broker", "")) + bid_data = deepcopy(test_bids[0]) + bid_data["value"] = {"amount": 500} + bid_data["tenderers"] = [bidder_data] response = self.app.post_json( "/tenders/{}/bids".format(tender_id), - {"data": {"selfEligible": True, "selfQualified": True, "tenderers": [bidder_data], "value": {"amount": 500}}}, + {"data": bid_data}, ) + bid_data["value"]["amount"] = 499 bidder_data["identifier"]["id"] = u"00037257" response = self.app.post_json( "/tenders/{}/bids".format(tender_id), - {"data": {"selfEligible": True, "selfQualified": True, "tenderers": [bidder_data], "value": {"amount": 499}}}, + {"data": bid_data}, ) bid_id = response.json["data"]["id"] bid_token = response.json["access"]["token"] + bid_data["value"]["amount"] = 498 bidder_data["identifier"]["id"] = u"00037259" response = self.app.post_json( "/tenders/{}/bids".format(tender_id), - {"data": {"selfEligible": True, "selfQualified": True, "tenderers": [bidder_data], "value": {"amount": 498}}}, + {"data": bid_data}, ) # switch to active.pre-qualification self.set_status("active.pre-qualification", {"id": tender_id, "status": "active.tendering"}) @@ -702,23 +708,28 @@ def try_go_to_ready_stage_eu(self): tender_id = self.tender_id = response.json["data"]["id"] tender_owner_token = response.json["access"]["token"] # create bids + bid_data = deepcopy(test_bids[0]) + bid_data["value"] = {"amount": 500} bidder_data = deepcopy(test_organization) + bid_data["tenderers"] = [bidder_data] self.app.authorization = ("Basic", ("broker", "")) response = self.app.post_json( "/tenders/{}/bids".format(tender_id), - {"data": {"selfEligible": True, "selfQualified": True, "tenderers": [bidder_data], "value": {"amount": 500}}}, + {"data": bid_data}, ) + bid_data["value"]["amount"] = 499 bidder_data["identifier"]["id"] = u"00037257" response = self.app.post_json( "/tenders/{}/bids".format(tender_id), - {"data": {"selfEligible": True, "selfQualified": True, "tenderers": [bidder_data], "value": {"amount": 499}}}, + {"data": bid_data}, ) bid_id = response.json["data"]["id"] bid_token = response.json["access"]["token"] + bid_data["value"]["amount"] = 498 bidder_data["identifier"]["id"] = u"00037258" response = self.app.post_json( "/tenders/{}/bids".format(tender_id), - {"data": {"selfEligible": True, "selfQualified": True, "tenderers": [bidder_data], "value": {"amount": 498}}}, + {"data": bid_data}, ) # switch to active.pre-qualification self.set_status("active.pre-qualification", {"id": tender_id, "status": "active.tendering"}) @@ -1189,7 +1200,11 @@ def patch_tender_1(self): self.assertEqual(response.content_type, "application/json") self.assertEqual( response.json["errors"], - [{"location": "body", "name": "tenderPeriod", "description": ["tenderPeriod should be greater than 30 days"]}], + [{ + "location": "body", + "name": "tenderPeriod", + "description": ["tenderPeriod must be at least 30 full calendar days long"] + }], ) response = self.app.patch_json( @@ -1384,21 +1399,25 @@ def patch_tender_eu_ua(self): self.assertEqual(response.status, "403 Forbidden") self.assertEqual(response.content_type, "application/json") self.assertEqual(response.json["errors"][0]["description"], "tenderPeriod should be extended by 7 days") - tenderPeriod_endDate = get_now() + timedelta(days=7, seconds=10) - enquiryPeriod_endDate = tenderPeriod_endDate - (timedelta(minutes=10) if SANDBOX_MODE else timedelta(days=10)) + tender_period_end_date = calculate_tender_business_date( + get_now(), timedelta(days=7), tender + ) + timedelta(seconds=10) + enquiry_period_end_date = calculate_tender_business_date( + tender_period_end_date, -timedelta(days=10), tender + ) response = self.app.patch_json( "/tenders/{}?acc_token={}".format(tender["id"], owner_token), { "data": { "value": {"amount": 501, "currency": u"UAH"}, - "tenderPeriod": {"endDate": tenderPeriod_endDate.isoformat()}, + "tenderPeriod": {"endDate": tender_period_end_date.isoformat()}, } }, ) self.assertEqual(response.status, "200 OK") self.assertEqual(response.content_type, "application/json") - self.assertEqual(response.json["data"]["tenderPeriod"]["endDate"], tenderPeriod_endDate.isoformat()) - self.assertEqual(response.json["data"]["enquiryPeriod"]["endDate"], enquiryPeriod_endDate.isoformat()) + self.assertEqual(response.json["data"]["tenderPeriod"]["endDate"], tender_period_end_date.isoformat()) + self.assertEqual(response.json["data"]["enquiryPeriod"]["endDate"], enquiry_period_end_date.isoformat()) response = self.app.patch_json( "/tenders/{}?acc_token={}".format(tender["id"], owner_token), diff --git a/src/openprocurement/tender/competitivedialogue/tests/stage2/auction.py b/src/openprocurement/tender/competitivedialogue/tests/stage2/auction.py index f04b54ac37..5026043856 100644 --- a/src/openprocurement/tender/competitivedialogue/tests/stage2/auction.py +++ b/src/openprocurement/tender/competitivedialogue/tests/stage2/auction.py @@ -75,18 +75,15 @@ def setUp(self): class TenderStage2EUSameValueAuctionResourceTest(BaseCompetitiveDialogEUStage2ContentWebTest): # initial_status = 'active.auction' tenderer_info = deepcopy(test_tenderer) - initial_bids = [ - { - "tenderers": [tenderer_info], - "value": {"amount": 469, "currency": "UAH", "valueAddedTaxIncluded": True}, - "selfQualified": True, - "selfEligible": True, - } - for i in range(3) - ] def setUp(self): """ Init tender and set status to active.auction """ + bid_data = deepcopy(test_bids[0]) + bid_data["tenderers"] = [self.tenderer_info] + self.initial_bids = [ + bid_data + for i in range(3) + ] super(TenderStage2EUSameValueAuctionResourceTest, self).setUp() auth = self.app.authorization # switch to active.pre-qualification @@ -161,25 +158,18 @@ class TenderStage2EUFeaturesAuctionResourceTest(BaseCompetitiveDialogEUStage2Con }, ] tenderer_info = deepcopy(test_tenderer) - initial_bids = [ - { - "parameters": [{"code": i["code"], "value": 0.05} for i in features], - "tenderers": [tenderer_info], - "value": {"amount": 469, "currency": "UAH", "valueAddedTaxIncluded": True}, - "selfQualified": True, - "selfEligible": True, - }, - { - "parameters": [{"code": i["code"], "value": 0.1} for i in features], - "tenderers": [tenderer_info], - "value": {"amount": 479, "currency": "UAH", "valueAddedTaxIncluded": True}, - "selfQualified": True, - "selfEligible": True, - }, - ] initial_status = "active.tendering" def setUp(self): + self.initial_bids = deepcopy(test_bids[:2]) + self.initial_bids[0].update({ + "parameters": [{"code": i["code"], "value": 0.05} for i in self.features], + "tenderers": [self.tenderer_info] + }) + self.initial_bids[1].update({ + "parameters": [{"code": i["code"], "value": 0.1} for i in self.features], + "tenderers": [self.tenderer_info] + }) super(TenderStage2EUFeaturesAuctionResourceTest, self).setUp() self.prepare_for_auction() @@ -258,6 +248,15 @@ class TenderStage2UASameValueAuctionResourceTest(BaseCompetitiveDialogUAStage2Co test_post_tender_auction_not_changed = snitch(post_tender_auction_not_changed) test_post_tender_auction_reversed = snitch(post_tender_auction_reversed) + def setUp(self): + bid_data = deepcopy(test_bids[0]) + bid_data["tenderers"] = [test_tenderer] + self.initial_bids = [ + bid_data + for i in range(3) + ] + super(TenderStage2UASameValueAuctionResourceTest, self).setUp() + class TenderStage2UALotAuctionResourceTest(TenderLotAuctionResourceTestMixin, TenderStage2UAAuctionResourceTest): initial_lots = test_lots @@ -293,25 +292,18 @@ class TenderStage2UAFeaturesAuctionResourceTest(BaseCompetitiveDialogUAStage2Con }, ] tenderer_info = deepcopy(test_tenderer) - initial_bids = [ - { - "parameters": [{"code": i["code"], "value": 0.05} for i in features], - "tenderers": [tenderer_info], - "value": {"amount": 469, "currency": "UAH", "valueAddedTaxIncluded": True}, - "selfQualified": True, - "selfEligible": True, - }, - { - "parameters": [{"code": i["code"], "value": 0.1} for i in features], - "tenderers": [tenderer_info], - "value": {"amount": 479, "currency": "UAH", "valueAddedTaxIncluded": True}, - "selfQualified": True, - "selfEligible": True, - }, - ] initial_status = "active.tendering" def setUp(self): + self.initial_bids = deepcopy(test_bids[:2]) + self.initial_bids[0].update({ + "parameters": [{"code": i["code"], "value": 0.05} for i in self.features], + "tenderers": [self.tenderer_info] + }) + self.initial_bids[1].update({ + "parameters": [{"code": i["code"], "value": 0.1} for i in self.features], + "tenderers": [self.tenderer_info] + }) super(TenderStage2UAFeaturesAuctionResourceTest, self).setUp() self.app.authorization = ("Basic", ("broker", "")) data = test_tender_stage2_data_ua.copy() diff --git a/src/openprocurement/tender/competitivedialogue/tests/stage2/bid.py b/src/openprocurement/tender/competitivedialogue/tests/stage2/bid.py index 216d3429db..beb3323213 100644 --- a/src/openprocurement/tender/competitivedialogue/tests/stage2/bid.py +++ b/src/openprocurement/tender/competitivedialogue/tests/stage2/bid.py @@ -13,6 +13,8 @@ from openprocurement.tender.openua.tests.bid import ( TenderBidDocumentResourceTestMixin as TenderUABidDocumentResourceTestMixin, TenderBidDocumentWithDSResourceTestMixin as TenderUABidDocumentWithDSResourceTestMixin, + TenderBidRequirementResponseTestMixin, + TenderBidRequirementResponseEvidenceTestMixin, ) from openprocurement.tender.openua.tests.bid_blanks import ( # TenderStage2UABidResourceTest @@ -71,6 +73,22 @@ test_bids_stage2[0]["tenderers"][0] = test_tenderer +class CreateBidMixin(object): + def setUp(self): + super(CreateBidMixin, self).setUp() + # Create bid + bid_data = deepcopy(self.test_bids_data[0]) + bid_data["value"] = {"amount": 500} + bid_data["status"] = "draft" + response = self.app.post_json( + "/tenders/{}/bids".format(self.tender_id), + {"data": bid_data}, + ) + bid = response.json["data"] + self.bid_id = bid["id"] + self.bid_token = response.json["access"]["token"] + + class TenderStage2EUBidResourceTest( BaseCompetitiveDialogEUStage2ContentWebTest, TenderBidResourceTestMixin, Tender2BidResourceTestMixin ): @@ -192,16 +210,11 @@ class BaseCDUAStage2BidContentWebTest(BaseCompetitiveDialogUAStage2ContentWebTes def setUp(self): super(BaseCDUAStage2BidContentWebTest, self).setUp() # Create bid + bid_data = deepcopy(self.test_bids_data[0]) + bid_data["value"] = {"amount": 500} response = self.app.post_json( "/tenders/{}/bids".format(self.tender_id), - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": [test_tenderer], - "value": {"amount": 500}, - } - }, + {"data": bid_data}, ) bid = response.json["data"] self.bid_id = bid["id"] @@ -219,6 +232,42 @@ class TenderStage2UABidDocumentWithDSResourceTest( pass +class TenderEUBidRequirementResponseResourceTest( + TenderBidRequirementResponseTestMixin, + CreateBidMixin, + BaseCompetitiveDialogEUStage2ContentWebTest, +): + test_bids_data = test_bids_stage2 + initial_status = "active.tendering" + + +class TenderUABidRequirementResponseResourceTest( + TenderBidRequirementResponseTestMixin, + CreateBidMixin, + BaseCDUAStage2BidContentWebTest, +): + test_bids_data = test_bids_stage2 + initial_status = "active.tendering" + + +class TenderEUBidRequirementResponseEvidenceResourceTest( + TenderBidRequirementResponseEvidenceTestMixin, + CreateBidMixin, + BaseCompetitiveDialogEUStage2ContentWebTest, +): + test_bids_data = test_bids_stage2 + initial_status = "active.tendering" + + +class TenderUABidRequirementResponseEvidenceResourceTest( + TenderBidRequirementResponseEvidenceTestMixin, + CreateBidMixin, + BaseCDUAStage2BidContentWebTest, +): + test_bids_data = test_bids_stage2 + initial_status = "active.tendering" + + def suite(): suite = unittest.TestSuite() suite.addTest(unittest.makeSuite(TenderStage2EUBidDocumentResourceTest)) @@ -227,6 +276,10 @@ def suite(): suite.addTest(unittest.makeSuite(TenderStage2UABidResourceTest)) suite.addTest(unittest.makeSuite(TenderStage2UABidFeaturesResourceTest)) suite.addTest(unittest.makeSuite(TenderStage2UABidDocumentResourceTest)) + suite.addTest(unittest.makeSuite(TenderEUBidRequirementResponseResourceTest)) + suite.addTest(unittest.makeSuite(TenderUABidRequirementResponseResourceTest)) + suite.addTest(unittest.makeSuite(TenderEUBidRequirementResponseEvidenceResourceTest)) + suite.addTest(unittest.makeSuite(TenderUABidRequirementResponseEvidenceResourceTest)) return suite diff --git a/src/openprocurement/tender/competitivedialogue/tests/stage2/bid_blanks.py b/src/openprocurement/tender/competitivedialogue/tests/stage2/bid_blanks.py index 6499c667db..279ffcc1ff 100644 --- a/src/openprocurement/tender/competitivedialogue/tests/stage2/bid_blanks.py +++ b/src/openprocurement/tender/competitivedialogue/tests/stage2/bid_blanks.py @@ -9,16 +9,12 @@ def create_tender_bidder_firm(self): request_path = "/tenders/{}/bids".format(self.tender_id) + bid_data = deepcopy(self.test_bids_data[0]) + bid_data["value"] = {"amount": 500} + bid_data["tenderers"] = [test_organization] response = self.app.post_json( request_path, - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": [test_organization], - "value": {"amount": 500}, - } - }, + {"data": bid_data}, status=403, ) self.assertEqual(response.status, "403 Forbidden") @@ -30,16 +26,11 @@ def create_tender_bidder_firm(self): def delete_tender_bidder_eu(self): + bid_data = deepcopy(self.test_bids_data[0]) + bid_data["value"] = {"amount": 500} response = self.app.post_json( "/tenders/{}/bids".format(self.tender_id), - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": [self.test_bids_data[0]["tenderers"][0]], - "value": {"amount": 500}, - } - }, + {"data": bid_data}, ) self.assertEqual(response.status, "201 Created") self.assertEqual(response.content_type, "application/json") @@ -90,14 +81,7 @@ def delete_tender_bidder_eu(self): # create new bid response = self.app.post_json( "/tenders/{}/bids".format(self.tender_id), - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": [self.test_bids_data[0]["tenderers"][0]], - "value": {"amount": 500}, - } - }, + {"data": bid_data}, ) self.assertEqual(response.status, "201 Created") bid = response.json["data"] @@ -109,27 +93,16 @@ def delete_tender_bidder_eu(self): self.assertEqual(response.json["data"]["id"], bid["id"]) self.assertEqual(response.json["data"]["status"], "deleted") + bid_data["value"] = {"amount": 100} response = self.app.post_json( "/tenders/{}/bids".format(self.tender_id), - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": [self.test_bids_data[0]["tenderers"][0]], - "value": {"amount": 100}, - } - }, + {"data": bid_data}, ) + + bid_data["value"] = {"amount": 101} response = self.app.post_json( "/tenders/{}/bids".format(self.tender_id), - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": [self.test_bids_data[0]["tenderers"][0]], - "value": {"amount": 101}, - } - }, + {"data": bid_data}, ) # switch to active.pre-qualification @@ -233,7 +206,8 @@ def bids_invalidation_on_tender_change_eu(self): # update tender. we can set value that is less than a value in bids as # they will be invalidated by this request response = self.app.patch_json( - "/tenders/{}?acc_token={}".format(self.tender_id, self.tender_token), {"data": {"value": {"amount": 300.0}}} + "/tenders/{}?acc_token={}".format(self.tender_id, self.tender_token), + {"data": {"value": {"amount": 300.0}, "minimalStep": {"amount": 9.0}}} ) self.assertEqual(response.status, "200 OK") self.assertEqual(response.json["data"]["value"]["amount"], 500) @@ -283,16 +257,11 @@ def bids_invalidation_on_tender_change_eu(self): valid_bid_token = response.json["access"]["token"] valid_bid_date = response.json["data"]["date"] + test_bid["value"] = {"amount": 101} + response = self.app.post_json( "/tenders/{}/bids".format(self.tender_id), - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": [self.test_bids_data[0]["tenderers"][0]], - "value": {"amount": 101}, - } - }, + {"data": test_bid}, ) # switch to active.pre-qualification @@ -382,7 +351,9 @@ def bids_invalidation_on_tender_change_eu(self): def ukrainian_author_id(self): - multilingual_author = deepcopy(self.test_bids_data[0]["tenderers"][0]) + bid_data = deepcopy(self.test_bids_data[0]) + bid_data["value"] = {"amount": 500} + multilingual_author = bid_data["tenderers"][0] multilingual_author["identifier"]["id"] = u"Українська мова" data = self.initial_data.copy() data["shortlistedFirms"][0] = { @@ -397,14 +368,7 @@ def ukrainian_author_id(self): response = self.app.post_json( "/tenders/{}/bids".format(self.tender_id), - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": [multilingual_author], - "value": {"amount": 500}, - } - }, + {"data": bid_data}, ) self.assertEqual(response.status, "201 Created") self.assertEqual(response.content_type, "application/json") @@ -414,33 +378,19 @@ def ukrainian_author_id(self): self.assertIn(bid["id"], response.headers["Location"]) for status in ("active", "unsuccessful", "deleted", "invalid"): + bid_data["status"] = status response = self.app.post_json( "/tenders/{}/bids".format(self.tender_id), - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": [multilingual_author], - "value": {"amount": 500}, - "status": status, - } - }, + {"data": bid_data}, status=403, ) self.assertEqual(response.status, "403 Forbidden") self.set_status("complete") - + del bid_data["status"] response = self.app.post_json( "/tenders/{}/bids".format(self.tender_id), - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": [multilingual_author], - "value": {"amount": 500}, - } - }, + {"data": bid_data}, status=403, ) self.assertEqual(response.status, "403 Forbidden") @@ -477,24 +427,12 @@ def features_bidder_eu(self): ] self.create_tender(initial_data=data) - test_features_bids = [ - { - # "status": "pending", - "parameters": [{"code": i["code"], "value": 0.05} for i in data["features"]], - "tenderers": [self.test_bids_data[0]["tenderers"][0]], - "value": {"amount": 469, "currency": "UAH", "valueAddedTaxIncluded": True}, - "selfQualified": True, - "selfEligible": True, - }, - { - "status": "pending", - "parameters": [{"code": i["code"], "value": 0.05} for i in data["features"]], - "tenderers": [self.test_bids_data[0]["tenderers"][0]], - "value": {"amount": 479, "currency": "UAH", "valueAddedTaxIncluded": True}, - "selfQualified": True, - "selfEligible": True, - }, - ] + test_features_bids = deepcopy(self.test_bids_data[:2]) + test_features_bids[0]["parameters"] = [{"code": i["code"], "value": 0.05} for i in data["features"]] + test_features_bids[1]["parameters"] = [{"code": i["code"], "value": 0.05} for i in data["features"]] + test_features_bids[1]["tenderers"] = [self.test_bids_data[0]["tenderers"][0]] + test_features_bids[1]["status"] = "pending" + for i in test_features_bids: response = self.app.post_json("/tenders/{}/bids".format(self.tender_id), {"data": i}) i["status"] = "pending" @@ -749,9 +687,11 @@ def create_tender_biddder_invalid_ua(self): ], ) + bid_data = deepcopy(self.test_bids_data[0]) + del bid_data["value"] response = self.app.post_json( request_path, - {"data": {"selfEligible": True, "selfQualified": True, "tenderers": self.test_bids_data[0]["tenderers"]}}, + {"data": bid_data}, status=422, ) self.assertEqual(response.status, "422 Unprocessable Entity") @@ -762,16 +702,10 @@ def create_tender_biddder_invalid_ua(self): [{u"description": [u"This field is required."], u"location": u"body", u"name": u"value"}], ) + bid_data["value"] = {"amount": 500, "valueAddedTaxIncluded": False} response = self.app.post_json( request_path, - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": self.test_bids_data[0]["tenderers"], - "value": {"amount": 500, "valueAddedTaxIncluded": False}, - } - }, + {"data": bid_data}, status=422, ) self.assertEqual(response.status, "422 Unprocessable Entity") @@ -790,16 +724,10 @@ def create_tender_biddder_invalid_ua(self): ], ) + bid_data["value"] = {"amount": 500, "currency": "USD"} response = self.app.post_json( request_path, - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": [self.test_bids_data[0]["tenderers"][0]], - "value": {"amount": 500, "currency": "USD"}, - } - }, + {"data": bid_data}, status=422, ) self.assertEqual(response.status, "422 Unprocessable Entity") @@ -816,16 +744,11 @@ def create_tender_biddder_invalid_ua(self): ], ) + bid_data["value"] = {"amount": 500} + bid_data["tenderers"] = self.test_bids_data[0]["tenderers"][0] response = self.app.post_json( request_path, - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": self.test_bids_data[0]["tenderers"][0], - "value": {"amount": 500}, - } - }, + {"data": bid_data}, status=422, ) self.assertEqual(response.status, "422 Unprocessable Entity") @@ -833,16 +756,10 @@ def create_tender_biddder_invalid_ua(self): self.assertEqual(response.json["status"], "error") self.assertIn(u"invalid literal for int() with base 10", response.json["errors"][0]["description"]) + bid_data["tenderers"] = [test_organization] response = self.app.post_json( request_path, - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": [test_organization], - "value": {"amount": 500}, - } - }, + {"data": bid_data}, status=403, ) self.assertEqual(response.status, "403 Forbidden") @@ -854,16 +771,11 @@ def create_tender_biddder_invalid_ua(self): def create_tender_bidder_ua(self): + bid_data = deepcopy(self.test_bids_data[0]) + bid_data["value"] = {"amount": 500} response = self.app.post_json( "/tenders/{}/bids".format(self.tender_id), - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": [self.test_bids_data[0]["tenderers"][0]], - "value": {"amount": 500}, - } - }, + {"data": bid_data}, ) self.assertEqual(response.status, "201 Created") self.assertEqual(response.content_type, "application/json") @@ -885,14 +797,7 @@ def create_tender_bidder_ua(self): response = self.app.post_json( "/tenders/{}/bids".format(self.tender_id), - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": self.test_bids_data[0]["tenderers"], - "value": {"amount": 500}, - } - }, + {"data": bid_data}, status=403, ) self.assertEqual(response.status, "403 Forbidden") @@ -903,14 +808,7 @@ def create_tender_bidder_ua(self): response = self.app.post_json( "/tenders/{}/bids".format(self.tender_id), - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": self.test_bids_data[0]["tenderers"], - "value": {"amount": 500}, - } - }, + {"data": bid_data}, status=403, ) self.assertEqual(response.status, "403 Forbidden") @@ -938,7 +836,8 @@ def bids_invalidation_on_tender_change_ua(self): # update tender. we can set value that is less than a value in bids as # they will be invalidated by this request response = self.app.patch_json( - "/tenders/{}?acc_token={}".format(self.tender_id, self.tender_token), {"data": {"value": {"amount": 300.0}}} + "/tenders/{}?acc_token={}".format(self.tender_id, self.tender_token), + {"data": {"value": {"amount": 300.0}, "minimalStep": {"amount": 9.0}}} ) self.assertEqual(response.status, "200 OK") self.assertEqual(response.json["data"]["value"]["amount"], 500) @@ -1086,24 +985,11 @@ def features_bidder_ua(self): }, ] self.create_tender(initial_data=data) - test_features_bids = [ - { - # "status": "active", - "parameters": [{"code": i["code"], "value": 0.1} for i in data["features"]], - "tenderers": [self.test_bids_data[0]["tenderers"][0]], - "value": {"amount": 469, "currency": "UAH", "valueAddedTaxIncluded": True}, - "selfEligible": True, - "selfQualified": True, - }, - { - "status": "active", - "parameters": [{"code": i["code"], "value": 0.05} for i in data["features"]], - "tenderers": [self.test_bids_data[0]["tenderers"][0]], - "value": {"amount": 479, "currency": "UAH", "valueAddedTaxIncluded": True}, - "selfEligible": True, - "selfQualified": True, - }, - ] + test_features_bids = deepcopy(self.test_bids_data[:2]) + test_features_bids[0]["parameters"] = [{"code": i["code"], "value": 0.05} for i in data["features"]] + test_features_bids[1]["parameters"] = [{"code": i["code"], "value": 0.05} for i in data["features"]] + test_features_bids[1]["tenderers"] = [self.test_bids_data[0]["tenderers"][0]] + test_features_bids[1]["status"] = "active" for i in test_features_bids: response = self.app.post_json("/tenders/{}/bids".format(self.tender_id), {"data": i}) i["status"] = "active" @@ -1204,16 +1090,12 @@ def put_tender_bidder_document_ua(self): def deleted_bid_is_not_restorable(self): + + bid_data = deepcopy(self.test_bids_data[0]) + bid_data["value"] = {"amount": 500} response = self.app.post_json( "/tenders/{}/bids".format(self.tender_id), - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": [self.test_bids_data[0]["tenderers"][0]], - "value": {"amount": 500}, - } - }, + {"data": bid_data}, ) self.assertEqual(response.status, "201 Created") self.assertEqual(response.content_type, "application/json") @@ -1270,12 +1152,7 @@ def features_bidder_invalid(self): }, ] self.create_tender(initial_data=tender_data) - data = { - "tenderers": [self.test_bids_data[0]["tenderers"][0]], - "value": {"amount": 469, "currency": "UAH", "valueAddedTaxIncluded": True}, - "selfEligible": True, - "selfQualified": True, - } + data = deepcopy(self.test_bids_data[0]) response = self.app.post_json("/tenders/{}/bids".format(self.tender_id), {"data": data}, status=422) self.assertEqual(response.status, "422 Unprocessable Entity") self.assertEqual(response.content_type, "application/json") diff --git a/src/openprocurement/tender/competitivedialogue/tests/stage2/criterion.py b/src/openprocurement/tender/competitivedialogue/tests/stage2/criterion.py new file mode 100644 index 0000000000..edf1e2fa04 --- /dev/null +++ b/src/openprocurement/tender/competitivedialogue/tests/stage2/criterion.py @@ -0,0 +1,104 @@ +# -*- coding: utf-8 -*- +import unittest +from mock import patch +from datetime import timedelta + +from openprocurement.api.utils import get_now +from openprocurement.api.tests.base import snitch +from openprocurement.tender.belowthreshold.tests.base import test_lots +from openprocurement.tender.competitivedialogue.tests.base import ( + test_tender_stage2_data_ua, + test_tender_stage2_data_eu, + BaseCompetitiveDialogEUStage2ContentWebTest, + BaseCompetitiveDialogUAStage2ContentWebTest, +) +from openprocurement.tender.openua.tests.criterion import ( + TenderCriteriaTestMixin, + TenderCriteriaRGTestMixin, + TenderCriteriaRGRequirementTestMixin, + TenderCriteriaRGRequirementEvidenceTestMixin, +) +from openprocurement.tender.competitivedialogue.tests.stage2.criterion_blanks import activate_tender + + +class TenderCDEUCriteriaTest(TenderCriteriaTestMixin, BaseCompetitiveDialogEUStage2ContentWebTest): + initial_data = test_tender_stage2_data_eu + test_lots_data = test_lots + initial_status = "draft" + + test_activate_tender = snitch(activate_tender) + + @patch("openprocurement.tender.core.validation.RELEASE_ECRITERIA_ARTICLE_17", get_now() - timedelta(days=1)) + def setUp(self): + super(TenderCDEUCriteriaTest, self).setUp() + + +class TenderCDUACriteriaTest(TenderCriteriaTestMixin, BaseCompetitiveDialogUAStage2ContentWebTest): + initial_data = test_tender_stage2_data_ua + test_lots_data = test_lots + initial_status = "draft" + + test_activate_tender = snitch(activate_tender) + + @patch("openprocurement.tender.core.validation.RELEASE_ECRITERIA_ARTICLE_17", get_now() - timedelta(days=1)) + def setUp(self): + super(TenderCDUACriteriaTest, self).setUp() + + +class TenderCDEUCriteriaRGTest(TenderCriteriaRGTestMixin, BaseCompetitiveDialogEUStage2ContentWebTest): + initial_data = test_tender_stage2_data_eu + test_lots_data = test_lots + + +class TenderCDUACriteriaRGTest(TenderCriteriaRGTestMixin, BaseCompetitiveDialogUAStage2ContentWebTest): + initial_data = test_tender_stage2_data_ua + test_lots_data = test_lots + + +class TenderCDEUCriteriaRGRequirementTest( + TenderCriteriaRGRequirementTestMixin, + BaseCompetitiveDialogEUStage2ContentWebTest +): + initial_data = test_tender_stage2_data_eu + test_lots_data = test_lots + + +class TenderCDUACriteriaRGRequirementTest( + TenderCriteriaRGRequirementTestMixin, + BaseCompetitiveDialogUAStage2ContentWebTest, +): + initial_data = test_tender_stage2_data_ua + test_lots_data = test_lots + + +class TenderCDEUCriteriaRGRequirementEvidenceTest( + TenderCriteriaRGRequirementEvidenceTestMixin, + BaseCompetitiveDialogEUStage2ContentWebTest, +): + initial_data = test_tender_stage2_data_eu + test_lots_data = test_lots + + +class TenderCDUACriteriaRGRequirementEvidenceTest( + TenderCriteriaRGRequirementEvidenceTestMixin, + BaseCompetitiveDialogUAStage2ContentWebTest, +): + initial_data = test_tender_stage2_data_ua + test_lots_data = test_lots + + +def suite(): + suite = unittest.TestSuite() + suite.addTest(unittest.makeSuite(TenderCDEUCriteriaTest)) + suite.addTest(unittest.makeSuite(TenderCDEUCriteriaRGTest)) + suite.addTest(unittest.makeSuite(TenderCDEUCriteriaRGRequirementTest)) + suite.addTest(unittest.makeSuite(TenderCDEUCriteriaRGRequirementEvidenceTest)) + suite.addTest(unittest.makeSuite(TenderCDUACriteriaTest)) + suite.addTest(unittest.makeSuite(TenderCDUACriteriaRGTest)) + suite.addTest(unittest.makeSuite(TenderCDUACriteriaRGRequirementTest)) + suite.addTest(unittest.makeSuite(TenderCDUACriteriaRGRequirementEvidenceTest)) + return suite + + +if __name__ == "__main__": + unittest.main(defaultTest="suite") diff --git a/src/openprocurement/tender/competitivedialogue/tests/stage2/criterion_blanks.py b/src/openprocurement/tender/competitivedialogue/tests/stage2/criterion_blanks.py new file mode 100644 index 0000000000..9585be38d9 --- /dev/null +++ b/src/openprocurement/tender/competitivedialogue/tests/stage2/criterion_blanks.py @@ -0,0 +1,11 @@ +def activate_tender(self): + request_path = "/tenders/{}?acc_token={}".format(self.tender_id, self.tender_token) + + response = self.app.patch_json( + request_path, + {"data": {"status": "active.tendering"}}, + ) + + self.assertEqual(response.status, "200 OK") + self.assertEqual(response.content_type, "application/json") + self.assertEqual(response.json["data"]["status"], "active.tendering") \ No newline at end of file diff --git a/src/openprocurement/tender/competitivedialogue/tests/stage2/lot.py b/src/openprocurement/tender/competitivedialogue/tests/stage2/lot.py index 96f86c0394..f773c663aa 100644 --- a/src/openprocurement/tender/competitivedialogue/tests/stage2/lot.py +++ b/src/openprocurement/tender/competitivedialogue/tests/stage2/lot.py @@ -5,6 +5,7 @@ from openprocurement.api.tests.base import snitch +from openprocurement.tender.core.tests.criteria_utils import add_criteria from openprocurement.tender.competitivedialogue.tests.base import ( BaseCompetitiveDialogEUStage2ContentWebTest, BaseCompetitiveDialogUAStage2ContentWebTest, @@ -12,6 +13,7 @@ test_tender_stage2_data_ua, test_tender_stage2_data_eu, test_author, + BaseCompetitiveDialogEUStage2WebTest, ) from openprocurement.tender.openeu.tests.base import test_tender_data, test_lots, test_bids from openprocurement.tender.belowthreshold.tests.lot_blanks import ( @@ -169,7 +171,7 @@ def setUp(self): test_create_tender_bidder = snitch(create_tender_with_features_bidder) -class TenderStage2EULotProcessTest(BaseCompetitiveDialogEUWebTest): +class TenderStage2EULotProcessTest(BaseCompetitiveDialogEUStage2WebTest): initial_data = test_tender_stage2_data_eu test_lots_data = test_lots # TODO: change attribute identifier test_bids_data = test_bids # TODO: change attribute identifier @@ -223,6 +225,8 @@ def create_tender(self, initial_lots, features=None): {"data": {"status": "draft.stage2"}}, ) + add_criteria(self) + self.app.authorization = ("Basic", ("broker", "")) self.app.patch_json( "/tenders/{id}?acc_token={token}".format(id=self.tender_id, token=self.tender_token), @@ -395,6 +399,7 @@ def create_tender(self, initial_lots, features=None): {"data": {"status": "draft.stage2"}}, ) + add_criteria(self) self.app.authorization = ("Basic", ("broker", "")) self.app.patch_json( "/tenders/{id}?acc_token={token}".format(id=self.tender_id, token=self.tender_token), diff --git a/src/openprocurement/tender/competitivedialogue/tests/stage2/lot_blanks.py b/src/openprocurement/tender/competitivedialogue/tests/stage2/lot_blanks.py index 311c5b5e13..d7e5b5af92 100644 --- a/src/openprocurement/tender/competitivedialogue/tests/stage2/lot_blanks.py +++ b/src/openprocurement/tender/competitivedialogue/tests/stage2/lot_blanks.py @@ -8,7 +8,7 @@ activate_cancellation_with_complaints_after_2020_04_19, ) from openprocurement.tender.belowthreshold.tests.base import test_organization, test_cancellation - +from openprocurement.tender.competitivedialogue.tests.base import test_bids # TenderStage2EU(UA)LotResourceTest @@ -666,16 +666,16 @@ def patch_tender_bidder(self): tenderers = deepcopy(self.test_bids_data[0]["tenderers"]) tenderers[0]["identifier"]["id"] = self.initial_data["shortlistedFirms"][0]["identifier"]["id"] tenderers[0]["identifier"]["scheme"] = self.initial_data["shortlistedFirms"][0]["identifier"]["scheme"] + + bid_data = deepcopy(self.test_bids_data[0]) + del bid_data["value"] + bid_data.update({ + "tenderers": tenderers, + "lotValues": [{"value": {"amount": 500}, "relatedLot": lot_id}], + }) response = self.app.post_json( "/tenders/{}/bids".format(self.tender_id), - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": tenderers, - "lotValues": [{"value": {"amount": 500}, "relatedLot": lot_id}], - } - }, + {"data": bid_data}, ) self.assertEqual(response.status, "201 Created") self.assertEqual(response.content_type, "application/json") @@ -737,9 +737,11 @@ def patch_tender_bidder(self): def create_tender_bidder_invalid(self): request_path = "/tenders/{}/bids".format(self.tender_id) + bid_data = deepcopy(self.test_bids_data[0]) + del bid_data["value"] response = self.app.post_json( request_path, - {"data": {"selfEligible": True, "selfQualified": True, "tenderers": self.test_bids_data[0]["tenderers"]}}, + {"data": bid_data}, status=422, ) self.assertEqual(response.status, "422 Unprocessable Entity") @@ -750,16 +752,10 @@ def create_tender_bidder_invalid(self): [{u"description": [u"This field is required."], u"location": u"body", u"name": u"lotValues"}], ) + bid_data["lotValues"] = [{"value": {"amount": 500}}] response = self.app.post_json( request_path, - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": self.test_bids_data[0]["tenderers"], - "lotValues": [{"value": {"amount": 500}}], - } - }, + {"data": bid_data}, status=422, ) self.assertEqual(response.status, "422 Unprocessable Entity") @@ -776,16 +772,10 @@ def create_tender_bidder_invalid(self): ], ) + bid_data["lotValues"] = [{"value": {"amount": 500}, "relatedLot": "0" * 32}] response = self.app.post_json( request_path, - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": self.test_bids_data[0]["tenderers"], - "lotValues": [{"value": {"amount": 500}, "relatedLot": "0" * 32}], - } - }, + {"data": bid_data}, status=422, ) self.assertEqual(response.status, "422 Unprocessable Entity") @@ -802,16 +792,10 @@ def create_tender_bidder_invalid(self): ], ) + bid_data["lotValues"] = [{"value": {"amount": 5000000}, "relatedLot": self.lots[0]["id"]}] response = self.app.post_json( request_path, - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": self.test_bids_data[0]["tenderers"], - "lotValues": [{"value": {"amount": 5000000}, "relatedLot": self.lots[0]["id"]}], - } - }, + {"data": bid_data}, status=422, ) self.assertEqual(response.status, "422 Unprocessable Entity") @@ -828,18 +812,12 @@ def create_tender_bidder_invalid(self): ], ) + bid_data["lotValues"] = [ + {"value": {"amount": 500, "valueAddedTaxIncluded": False}, "relatedLot": self.lots[0]["id"]} + ] response = self.app.post_json( request_path, - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": self.test_bids_data[0]["tenderers"], - "lotValues": [ - {"value": {"amount": 500, "valueAddedTaxIncluded": False}, "relatedLot": self.lots[0]["id"]} - ], - } - }, + {"data": bid_data}, status=422, ) self.assertEqual(response.status, "422 Unprocessable Entity") @@ -862,16 +840,10 @@ def create_tender_bidder_invalid(self): ], ) + bid_data["lotValues"] = [{"value": {"amount": 500, "currency": "USD"}, "relatedLot": self.lots[0]["id"]}] response = self.app.post_json( request_path, - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": self.test_bids_data[0]["tenderers"], - "lotValues": [{"value": {"amount": 500, "currency": "USD"}, "relatedLot": self.lots[0]["id"]}], - } - }, + {"data": bid_data}, status=422, ) self.assertEqual(response.status, "422 Unprocessable Entity") @@ -888,17 +860,11 @@ def create_tender_bidder_invalid(self): ], ) + bid_data["lotValues"] = [{"value": {"amount": 500}, "relatedLot": self.lots[0]["id"]}] + bid_data["value"] = {"amount": 500} response = self.app.post_json( request_path, - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": self.test_bids_data[0]["tenderers"], - "value": {"amount": 500}, - "lotValues": [{"value": {"amount": 500}, "relatedLot": self.lots[0]["id"]}], - } - }, + {"data": bid_data}, status=422, ) self.assertEqual(response.status, "422 Unprocessable Entity") @@ -914,28 +880,24 @@ def create_tender_bidder_invalid(self): def create_tender_with_features_bidder_invalid(self): - tenderers = deepcopy(self.test_bids_data[0]["tenderers"]) + bid_data = deepcopy(self.test_bids_data[0]) + del bid_data["value"] + tenderers = bid_data["tenderers"] tenderers[0]["identifier"]["id"] = self.initial_data["shortlistedFirms"][0]["identifier"]["id"] tenderers[0]["identifier"]["scheme"] = self.initial_data["shortlistedFirms"][0]["identifier"]["scheme"] request_path = "/tenders/{}/bids".format(self.tender_id) response = self.app.post_json( - request_path, {"data": {"selfEligible": True, "selfQualified": True, "tenderers": tenderers}}, status=422 + request_path, {"data": bid_data}, status=422 ) self.assertEqual(response.status, "422 Unprocessable Entity") self.assertEqual(response.content_type, "application/json") self.assertEqual(response.json["status"], "error") + bid_data["lotValues"] = [{"value": {"amount": 500}}] response = self.app.post_json( request_path, - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": tenderers, - "lotValues": [{"value": {"amount": 500}}], - } - }, + {"data": bid_data}, status=422, ) self.assertEqual(response.status, "422 Unprocessable Entity") @@ -952,16 +914,10 @@ def create_tender_with_features_bidder_invalid(self): ], ) + bid_data["lotValues"] = [{"value": {"amount": 500}, "relatedLot": "0" * 32}] response = self.app.post_json( request_path, - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": tenderers, - "lotValues": [{"value": {"amount": 500}, "relatedLot": "0" * 32}], - } - }, + {"data": bid_data}, status=422, ) self.assertEqual(response.status, "422 Unprocessable Entity") @@ -977,17 +933,10 @@ def create_tender_with_features_bidder_invalid(self): } ], ) - + bid_data["lotValues"] = [{"value": {"amount": 5000000}, "relatedLot": self.lot_id}] response = self.app.post_json( request_path, - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": tenderers, - "lotValues": [{"value": {"amount": 5000000}, "relatedLot": self.lot_id}], - } - }, + {"data": bid_data}, status=422, ) self.assertEqual(response.status, "422 Unprocessable Entity") @@ -1004,16 +953,10 @@ def create_tender_with_features_bidder_invalid(self): ], ) + bid_data["lotValues"] = [{"value": {"amount": 500, "valueAddedTaxIncluded": False}, "relatedLot": self.lot_id}] response = self.app.post_json( request_path, - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": tenderers, - "lotValues": [{"value": {"amount": 500, "valueAddedTaxIncluded": False}, "relatedLot": self.lot_id}], - } - }, + {"data": bid_data}, status=422, ) self.assertEqual(response.status, "422 Unprocessable Entity") @@ -1036,16 +979,10 @@ def create_tender_with_features_bidder_invalid(self): ], ) + bid_data["lotValues"] = [{"value": {"amount": 500, "currency": "USD"}, "relatedLot": self.lot_id}] response = self.app.post_json( request_path, - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": tenderers, - "lotValues": [{"value": {"amount": 500, "currency": "USD"}, "relatedLot": self.lot_id}], - } - }, + {"data": bid_data}, status=422, ) self.assertEqual(response.status, "422 Unprocessable Entity") @@ -1062,16 +999,10 @@ def create_tender_with_features_bidder_invalid(self): ], ) + bid_data["lotValues"] = [{"value": {"amount": 500}, "relatedLot": self.lot_id}] response = self.app.post_json( request_path, - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": tenderers, - "lotValues": [{"value": {"amount": 500}, "relatedLot": self.lot_id}], - } - }, + {"data": bid_data}, status=422, ) self.assertEqual(response.status, "422 Unprocessable Entity") @@ -1080,14 +1011,7 @@ def create_tender_with_features_bidder_invalid(self): response = self.app.post_json( request_path, - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": tenderers, - "lotValues": [{"value": {"amount": 500}, "relatedLot": self.lot_id}], - } - }, + {"data": bid_data}, status=422, ) self.assertEqual(response.status, "422 Unprocessable Entity") @@ -1098,17 +1022,10 @@ def create_tender_with_features_bidder_invalid(self): [{u"description": [u"All features parameters is required."], u"location": u"body", u"name": u"parameters"}], ) + bid_data["parameters"] = [{"code": "code_item", "value": 0.01}] response = self.app.post_json( request_path, - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": tenderers, - "lotValues": [{"value": {"amount": 500}, "relatedLot": self.lot_id}], - "parameters": [{"code": "code_item", "value": 0.01}], - } - }, + {"data": bid_data}, status=422, ) self.assertEqual(response.status, "422 Unprocessable Entity") @@ -1119,17 +1036,10 @@ def create_tender_with_features_bidder_invalid(self): [{u"description": [u"All features parameters is required."], u"location": u"body", u"name": u"parameters"}], ) + bid_data["parameters"] = [{"code": "code_invalid", "value": 0.01}] response = self.app.post_json( request_path, - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": tenderers, - "lotValues": [{"value": {"amount": 500}, "relatedLot": self.lot_id}], - "parameters": [{"code": "code_invalid", "value": 0.01}], - } - }, + {"data": bid_data}, status=422, ) self.assertEqual(response.status, "422 Unprocessable Entity") @@ -1146,21 +1056,14 @@ def create_tender_with_features_bidder_invalid(self): ], ) + bid_data["parameters"] = [ + {"code": "code_item", "value": 0.01}, + {"code": "code_tenderer", "value": 0}, + {"code": "code_lot", "value": 0.01}, + ] response = self.app.post_json( request_path, - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": tenderers, - "lotValues": [{"value": {"amount": 500}, "relatedLot": self.lot_id}], - "parameters": [ - {"code": "code_item", "value": 0.01}, - {"code": "code_tenderer", "value": 0}, - {"code": "code_lot", "value": 0.01}, - ], - } - }, + {"data": bid_data}, status=422, ) self.assertEqual(response.status, "422 Unprocessable Entity") @@ -1184,21 +1087,21 @@ def create_tender_with_features_bidder(self): tenderers[0]["identifier"]["scheme"] = self.initial_data["shortlistedFirms"][0]["identifier"]["scheme"] request_path = "/tenders/{}/bids".format(self.tender_id) + + bid_data = deepcopy(self.test_bids_data[0]) + del bid_data["value"] + bid_data.update({ + "tenderers": tenderers, + "lotValues": [{"value": {"amount": 500}, "relatedLot": self.lot_id}], + "parameters": [ + {"code": "code_item", "value": 0.01}, + {"code": "code_tenderer", "value": 0.01}, + {"code": "code_lot", "value": 0.01}, + ] + }) response = self.app.post_json( request_path, - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": tenderers, - "lotValues": [{"value": {"amount": 500}, "relatedLot": self.lot_id}], - "parameters": [ - {"code": "code_item", "value": 0.01}, - {"code": "code_tenderer", "value": 0.01}, - {"code": "code_lot", "value": 0.01}, - ], - } - }, + {"data": bid_data}, ) self.assertEqual(response.status, "201 Created") self.assertEqual(response.content_type, "application/json") @@ -1212,19 +1115,7 @@ def create_tender_with_features_bidder(self): response = self.app.post_json( request_path, - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": tenderers, - "lotValues": [{"value": {"amount": 500}, "relatedLot": self.lot_id}], - "parameters": [ - {"code": "code_item", "value": 0.01}, - {"code": "code_tenderer", "value": 0.01}, - {"code": "code_lot", "value": 0.01}, - ], - } - }, + {"data": bid_data}, status=403, ) self.assertEqual(response.status, "403 Forbidden") @@ -1262,21 +1153,17 @@ def one_lot_0bid(self): def one_lot_1bid(self): self.create_tender(self.test_lots_data) - tenderers = deepcopy(self.test_bids_data[0]["tenderers"]) + bid_data = deepcopy(self.test_bids_data[0]) + del bid_data["value"] + tenderers = bid_data["tenderers"] tenderers[0]["identifier"]["id"] = self.initial_data["shortlistedFirms"][0]["identifier"]["id"] tenderers[0]["identifier"]["scheme"] = self.initial_data["shortlistedFirms"][0]["identifier"]["scheme"] # create bid + bid_data["lotValues"] = [{"value": {"amount": 500}, "relatedLot": self.initial_lots[0]["id"]}] self.app.authorization = ("Basic", ("broker", "")) response = self.app.post_json( "/tenders/{}/bids".format(self.tender_id), - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": tenderers, - "lotValues": [{"value": {"amount": 500}, "relatedLot": self.initial_lots[0]["id"]}], - } - }, + {"data": bid_data}, ) # switch to active.pre-qualification self.time_shift("active.pre-qualification") @@ -1289,33 +1176,24 @@ def one_lot_1bid(self): def one_lot_2bid_1un(self): self.create_tender(self.test_lots_data) - tenderers = deepcopy(self.test_bids_data[0]["tenderers"]) + bid_data = deepcopy(self.test_bids_data[0]) + del bid_data["value"] + + tenderers = bid_data["tenderers"] tenderers[0]["identifier"]["id"] = self.initial_data["shortlistedFirms"][0]["identifier"]["id"] tenderers[0]["identifier"]["scheme"] = self.initial_data["shortlistedFirms"][0]["identifier"]["scheme"] # create bid + + bid_data["lotValues"] = [{"value": {"amount": 500}, "relatedLot": self.initial_lots[0]["id"]}] self.app.authorization = ("Basic", ("broker", "")) response = self.app.post_json( "/tenders/{}/bids".format(self.tender_id), - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": tenderers, - "lotValues": [{"value": {"amount": 500}, "relatedLot": self.initial_lots[0]["id"]}], - } - }, + {"data": bid_data}, ) response = self.app.post_json( "/tenders/{}/bids".format(self.tender_id), - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": tenderers, - "lotValues": [{"value": {"amount": 500}, "relatedLot": self.initial_lots[0]["id"]}], - } - }, + {"data": bid_data}, ) # switch to active.pre-qualification self.time_shift("active.pre-qualification") @@ -1363,32 +1241,28 @@ def one_lot_2bid(self): tenderers_2[0]["identifier"]["id"] = self.initial_data["shortlistedFirms"][1]["identifier"]["id"] tenderers_2[0]["identifier"]["scheme"] = self.initial_data["shortlistedFirms"][1]["identifier"]["scheme"] # create bid + bid_data = deepcopy(self.test_bids_data[0]) + bid_data["tenderers"] = tenderers_1 + bid_data["lotValues"] = [{"value": {"amount": 450}, "relatedLot": self.lots_id[0]}] + del bid_data["value"] + self.app.authorization = ("Basic", ("broker", "")) response = self.app.post_json( "/tenders/{}/bids".format(self.tender_id), - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": tenderers_1, - "lotValues": [{"value": {"amount": 450}, "relatedLot": self.lots_id[0]}], - } - }, + {"data": bid_data}, ) bid_id = response.json["data"]["id"] bid_token = response.json["access"]["token"] # create second bid self.app.authorization = ("Basic", ("broker", "")) + + bid_data.update({ + "tenderers": tenderers_2, + "lotValues": [{"value": {"amount": 475}, "relatedLot": self.lots_id[0]}], + }) self.app.post_json( "/tenders/{}/bids".format(self.tender_id), - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": tenderers_2, - "lotValues": [{"value": {"amount": 475}, "relatedLot": self.lots_id[0]}], - } - }, + {"data": bid_data}, ) # switch to active.auction self.time_shift("active.pre-qualification") @@ -1525,31 +1399,24 @@ def two_lot_2bid_1lot_del(self): tenderers_2[0]["identifier"]["scheme"] = self.initial_data["shortlistedFirms"][1]["identifier"]["scheme"] bids = [] + bid_data = deepcopy(self.test_bids_data[0]) + del bid_data["value"] + bid_data.update({ + "tenderers": tenderers_1, + "lotValues": [{"value": {"amount": 500}, "relatedLot": lot["id"]} for lot in self.initial_lots], + }) self.app.authorization = ("Basic", ("broker", "")) response = self.app.post_json( "/tenders/{}/bids".format(self.tender_id), - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": tenderers_1, - "lotValues": [{"value": {"amount": 500}, "relatedLot": lot["id"]} for lot in self.initial_lots], - } - }, + {"data": bid_data}, ) bids.append(response.json) # create second bid + bid_data["tenderers"] = tenderers_2 self.app.authorization = ("Basic", ("broker", "")) response = self.app.post_json( "/tenders/{}/bids".format(self.tender_id), - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": tenderers_2, - "lotValues": [{"value": {"amount": 500}, "relatedLot": lot["id"]} for lot in self.initial_lots], - } - }, + {"data": bid_data}, ) bids.append(response.json) response = self.app.delete( @@ -1565,8 +1432,11 @@ def one_lot_3bid_1del(self): """ Create tender with 1 lot and 3 bids, later delete 1 bid """ self.create_tender(initial_lots=self.test_lots_data) tenderers = [] + bid_data = deepcopy(self.test_bids_data[0]) + del bid_data["value"] + bid_data["lotValues"] = [{"value": {"amount": 450}, "relatedLot": self.initial_lots[0]["id"]}] for i in xrange(3): - tenderer = deepcopy(self.test_bids_data[0]["tenderers"]) + tenderer = deepcopy(bid_data["tenderers"]) tenderer[0]["identifier"]["id"] = self.initial_data["shortlistedFirms"][i]["identifier"]["id"] tenderer[0]["identifier"]["scheme"] = self.initial_data["shortlistedFirms"][i]["identifier"]["scheme"] tenderers.append(tenderer) @@ -1574,16 +1444,10 @@ def one_lot_3bid_1del(self): self.app.authorization = ("Basic", ("broker", "")) bids = [] for i in range(3): + bid_data["tenderers"] = tenderers[i] response = self.app.post_json( "/tenders/{}/bids".format(self.tender_id), - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": tenderers[i], - "lotValues": [{"value": {"amount": 450}, "relatedLot": self.initial_lots[0]["id"]}], - } - }, + {"data": bid_data}, ) bids.append({response.json["data"]["id"]: response.json["access"]["token"]}) @@ -1713,17 +1577,14 @@ def one_lot_3bid_1un(self): # create bid self.app.authorization = ("Basic", ("broker", "")) bids = [] + bid_data = deepcopy(test_bids[0]) + del bid_data["value"] + bid_data["lotValues"] = [{"value": {"amount": 450}, "relatedLot": self.initial_lots[0]["id"]}] for i in xrange(bid_count): + bid_data["tenderers"] = tenderers[i] response = self.app.post_json( "/tenders/{}/bids".format(self.tender_id), - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": tenderers[i], - "lotValues": [{"value": {"amount": 450}, "relatedLot": self.initial_lots[0]["id"]}], - } - }, + {"data": bid_data}, ) bids.append({response.json["data"]["id"]: response.json["access"]["token"]}) @@ -1954,29 +1815,23 @@ def two_lot_2bid_0com_1can(self): tenderers = self.create_tenderers(2) # create bid + bid_data = deepcopy(test_bids[0]) + del bid_data["value"] + bid_data["tenderers"] = tenderers[0] + bid_data["lotValues"] = [{"value": {"amount": 500}, "relatedLot": lot["id"]} for lot in self.initial_lots] self.app.authorization = ("Basic", ("broker", "")) self.app.post_json( "/tenders/{}/bids".format(self.tender_id), - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": tenderers[0], - "lotValues": [{"value": {"amount": 500}, "relatedLot": lot["id"]} for lot in self.initial_lots], - } - }, + {"data": bid_data}, ) + bid_data.update({ + "tenderers": tenderers[1], + "lotValues": [{"value": {"amount": 499}, "relatedLot": lot["id"]} for lot in self.initial_lots], + }) self.app.post_json( "/tenders/{}/bids".format(self.tender_id), - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": tenderers[1], - "lotValues": [{"value": {"amount": 499}, "relatedLot": lot["id"]} for lot in self.initial_lots], - } - }, + {"data": bid_data}, ) self.app.authorization = ("Basic", ("broker", "")) @@ -2023,30 +1878,24 @@ def two_lot_2bid_2com_2win(self): self.create_tender(initial_lots=self.test_lots_data * 2) tenderers = self.create_tenderers(2) # create bid + bid_data = deepcopy(self.test_bids_data[0]) + del bid_data["value"] + bid_data.update({ + "tenderers": tenderers[0], + "lotValues": [{"value": {"amount": 500}, "relatedLot": lot["id"]} for lot in self.initial_lots], + }) + self.app.authorization = ("Basic", ("broker", "")) self.app.post_json( "/tenders/{}/bids".format(self.tender_id), - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": tenderers[0], - "lotValues": [{"value": {"amount": 500}, "relatedLot": lot["id"]} for lot in self.initial_lots], - } - }, + {"data": bid_data}, ) # create second bid + bid_data["tenderers"] = tenderers[1] self.app.authorization = ("Basic", ("broker", "")) self.app.post_json( "/tenders/{}/bids".format(self.tender_id), - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": tenderers[1], - "lotValues": [{"value": {"amount": 500}, "relatedLot": lot["id"]} for lot in self.initial_lots], - } - }, + {"data": bid_data}, ) # switch to active.pre-qualification self.time_shift("active.pre-qualification") @@ -2187,16 +2036,15 @@ def patch_tender_bidder_ua(self): lot_id = self.lots[0]["id"] tenderers = self.create_tenderers() + bid_data = deepcopy(test_bids[0]) + del bid_data["value"] + bid_data.update({ + "tenderers": tenderers[0], + "lotValues": [{"value": {"amount": 500}, "relatedLot": lot_id}], + }) response = self.app.post_json( "/tenders/{}/bids".format(self.tender_id), - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": tenderers[0], - "lotValues": [{"value": {"amount": 500}, "relatedLot": lot_id}], - } - }, + {"data": bid_data}, ) self.assertEqual(response.status, "201 Created") self.assertEqual(response.content_type, "application/json") @@ -2277,34 +2125,29 @@ def one_lot_2bid_ua(self): ) self.assertIn("auctionPeriod", response.json["data"]["lots"][0]) # create bid + bid_data = deepcopy(test_bids[0]) + del bid_data["value"] + bid_data["tenderers"] = tenderers[0] + bid_data["lotValues"] = [ + {"subcontractingDetails": "test", "value": {"amount": 450}, "relatedLot": self.lots_id[0]} + ] + self.app.authorization = ("Basic", ("broker", "")) response = self.app.post_json( "/tenders/{}/bids".format(self.tender_id), - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": tenderers[0], - "lotValues": [ - {"subcontractingDetails": "test", "value": {"amount": 450}, "relatedLot": self.lots_id[0]} - ], - } - }, + {"data": bid_data}, ) bid_id = response.json["data"]["id"] bid_token = response.json["access"]["token"] # create second bid self.app.authorization = ("Basic", ("broker", "")) + bid_data.update({ + "tenderers": tenderers[1], + "lotValues": [{"value": {"amount": 475}, "relatedLot": self.lots_id[0]}], + }) response = self.app.post_json( "/tenders/{}/bids".format(self.tender_id), - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": tenderers[1], - "lotValues": [{"value": {"amount": 475}, "relatedLot": self.lots_id[0]}], - } - }, + {"data": bid_data}, ) # switch to active.auction self.set_status("active.auction") @@ -2390,19 +2233,15 @@ def one_lot_3bid_1un_ua(self): self.assertIn("auctionPeriod", response.json["data"]["lots"][0]) # create bids bids_data = {} + bid_data = deepcopy(test_bids[0]) + del bid_data["value"] + bid_data["lotValues"] = [{"value": {"amount": 450}, "relatedLot": self.lots_id[0]}] for i in range(3): - + bid_data["tenderers"] = tenderers[i] self.app.authorization = ("Basic", ("broker", "")) response = self.app.post_json( "/tenders/{}/bids".format(self.tender_id), - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": tenderers[i], - "lotValues": [{"value": {"amount": 450}, "relatedLot": self.lots_id[0]}], - } - }, + {"data": bid_data}, ) bids_data[response.json["data"]["id"]] = response.json["access"]["token"] @@ -2497,16 +2336,16 @@ def one_lot_1bid_patch_ua(self): tenderers = self.create_tenderers() # create bid self.app.authorization = ("Basic", ("broker", "")) + + bid_data = deepcopy(test_bids[0]) + del bid_data["value"] + bid_data.update({ + "tenderers": tenderers[0], + "lotValues": [{"value": {"amount": 500}, "relatedLot": self.lots_id[0]}], + }) response = self.app.post_json( "/tenders/{}/bids".format(self.tender_id), - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": tenderers[0], - "lotValues": [{"value": {"amount": 500}, "relatedLot": self.lots_id[0]}], - } - }, + {"data": bid_data}, ) bid_id = response.json["data"]["id"] bid_token = response.json["access"]["token"] @@ -2560,17 +2399,17 @@ def two_lot_1bid_0com_1can_ua(self): }, ) # create bid + bid_data = deepcopy(test_bids[0]) + del bid_data["value"] + bid_data.update({ + "tenderers": tenderers[0], + "lotValues": [{"value": {"amount": 500}, "relatedLot": lot_id} for lot_id in self.lots_id], + }) + self.app.authorization = ("Basic", ("broker", "")) response = self.app.post_json( "/tenders/{}/bids".format(self.tender_id), - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": tenderers[0], - "lotValues": [{"value": {"amount": 500}, "relatedLot": lot_id} for lot_id in self.lots_id], - } - }, + {"data": bid_data}, ) # switch to active.qualification response = self.set_status( @@ -2596,16 +2435,16 @@ def two_lot_1bid_2com_1win_ua(self): ) # create bid self.app.authorization = ("Basic", ("broker", "")) + + bid_data = deepcopy(test_bids[0]) + del bid_data["value"] + bid_data.update({ + "tenderers": tenderers[0], + "lotValues": [{"value": {"amount": 500}, "relatedLot": lot_id} for lot_id in self.lots_id], + }) self.app.post_json( "/tenders/{}/bids".format(self.tender_id), - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": tenderers[0], - "lotValues": [{"value": {"amount": 500}, "relatedLot": lot_id} for lot_id in self.lots_id], - } - }, + {"data": bid_data}, ) # switch to active.qualification self.set_status( @@ -2665,16 +2504,15 @@ def two_lot_1bid_0com_0win_ua(self): ) # create bid self.app.authorization = ("Basic", ("broker", "")) + bid_data = deepcopy(test_bids[0]) + del bid_data["value"] + bid_data.update({ + "tenderers": tenderers[0], + "lotValues": [{"value": {"amount": 500}, "relatedLot": lot_id} for lot_id in self.lots_id], + }) self.app.post_json( "/tenders/{}/bids".format(self.tender_id), - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": tenderers[0], - "lotValues": [{"value": {"amount": 500}, "relatedLot": lot_id} for lot_id in self.lots_id], - } - }, + {"data": bid_data}, ) # switch to active.qualification self.set_status( @@ -2701,16 +2539,15 @@ def two_lot_1bid_1com_1win_ua(self): ) # create bid self.app.authorization = ("Basic", ("broker", "")) + bid_data = deepcopy(test_bids[0]) + del bid_data["value"] + bid_data.update({ + "tenderers": tenderers[0], + "lotValues": [{"value": {"amount": 500}, "relatedLot": lot_id} for lot_id in self.lots_id], + }) self.app.post_json( "/tenders/{}/bids".format(self.tender_id), - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": tenderers[0], - "lotValues": [{"value": {"amount": 500}, "relatedLot": lot_id} for lot_id in self.lots_id], - } - }, + {"data": bid_data}, ) # switch to active.qualification self.set_status( @@ -2736,29 +2573,24 @@ def two_lot_2bid_2com_2win_ua(self): ) # create bid self.app.authorization = ("Basic", ("broker", "")) + + bid_data = deepcopy(test_bids[0]) + del bid_data["value"] + bid_data.update({ + "tenderers": tenderers[0], + "lotValues": [{"value": {"amount": 500}, "relatedLot": lot_id} for lot_id in self.lots_id], + }) self.app.post_json( "/tenders/{}/bids".format(self.tender_id), - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": tenderers[0], - "lotValues": [{"value": {"amount": 500}, "relatedLot": lot_id} for lot_id in self.lots_id], - } - }, + {"data": bid_data}, ) # create second bid + + bid_data["tenderers"] = tenderers[1] self.app.authorization = ("Basic", ("broker", "")) self.app.post_json( "/tenders/{}/bids".format(self.tender_id), - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": tenderers[1], - "lotValues": [{"value": {"amount": 500}, "relatedLot": lot_id} for lot_id in self.lots_id], - } - }, + {"data": bid_data}, ) # switch to active.auction self.set_status("active.auction") diff --git a/src/openprocurement/tender/competitivedialogue/tests/stage2/question_blanks.py b/src/openprocurement/tender/competitivedialogue/tests/stage2/question_blanks.py index cd20498f6e..0bd8cf3113 100644 --- a/src/openprocurement/tender/competitivedialogue/tests/stage2/question_blanks.py +++ b/src/openprocurement/tender/competitivedialogue/tests/stage2/question_blanks.py @@ -64,7 +64,7 @@ def create_tender_question_with_question(self): self.assertIn("id", question) self.assertIn(question["id"], response.headers["Location"]) - self.time_shift("enquiryPeriod_ends") + self.set_enquiry_period_end() response = self.app.post_json( "/tenders/{}/questions".format(self.tender_id), @@ -99,7 +99,7 @@ def create_tender_question(self): self.assertIn("id", question) self.assertIn(question["id"], response.headers["Location"]) - self.time_shift("enquiryPeriod_ends") + self.set_enquiry_period_end() response = self.app.post_json( "/tenders/{}/questions".format(self.tender_id), diff --git a/src/openprocurement/tender/competitivedialogue/tests/stage2/tender.py b/src/openprocurement/tender/competitivedialogue/tests/stage2/tender.py index 9440f039bc..582acb380d 100644 --- a/src/openprocurement/tender/competitivedialogue/tests/stage2/tender.py +++ b/src/openprocurement/tender/competitivedialogue/tests/stage2/tender.py @@ -52,6 +52,7 @@ test_access_token_stage1, test_author, ) +from openprocurement.tender.core.tests.criteria_utils import add_criteria class CompetitiveDialogStage2Test(BaseCompetitiveDialogApiWebTest): @@ -79,6 +80,7 @@ def set_tender_status(self, tender, token, status): self.app.authorization = auth return response if status == "active.tendering": + add_criteria(self, tender["id"], token) self.app.authorization = ("Basic", ("broker", "")) response = self.app.patch_json( "/tenders/{id}?acc_token={token}".format(id=tender["id"], token=token), {"data": {"status": status}} @@ -97,7 +99,7 @@ def set_tender_status(self, tender, token, status): test_tender_features_invalid = snitch(tender_features_invalid) test_tender_features = snitch(tender_features) test_patch_tender = snitch(patch_tender_1) - test_patch_tender_ua = snitch(patch_tender_eu) + test_patch_tender_eu = snitch(patch_tender_eu) test_dateModified_tender = snitch(dateModified_tender) test_tender_not_found = snitch(tender_not_found) test_guarantee = snitch(guarantee) @@ -123,6 +125,7 @@ def set_tender_status(self, tender, token, status): self.app.authorization = auth return response if status == "active.tendering": + add_criteria(self, tender["id"], token) self.app.authorization = ("Basic", ("broker", "")) response = self.app.patch_json( "/tenders/{id}?acc_token={token}".format(id=tender["id"], token=token), {"data": {"status": status}} diff --git a/src/openprocurement/tender/competitivedialogue/tests/stage2/tender_blanks.py b/src/openprocurement/tender/competitivedialogue/tests/stage2/tender_blanks.py index 1000c181c7..842c11e3e8 100644 --- a/src/openprocurement/tender/competitivedialogue/tests/stage2/tender_blanks.py +++ b/src/openprocurement/tender/competitivedialogue/tests/stage2/tender_blanks.py @@ -24,10 +24,12 @@ CD_EU_TYPE, ) from openprocurement.tender.competitivedialogue.models import TenderStage2EU, TenderStage2UA +from openprocurement.tender.core.tests.criteria_utils import add_criteria # CompetitiveDialogStage2Test from openprocurement.tender.core.tests.base import change_auth +from openprocurement.tender.core.utils import calculate_tender_business_date def simple_add_cd_tender_eu(self): @@ -401,21 +403,25 @@ def patch_tender_eu(self): self.assertEqual(response.status, "403 Forbidden") self.assertEqual(response.content_type, "application/json") self.assertEqual(response.json["errors"][0]["description"], "tenderPeriod should be extended by 7 days") - tenderPeriod_endDate = get_now() + timedelta(days=7, seconds=10) - enquiryPeriod_endDate = tenderPeriod_endDate - (timedelta(minutes=10) if SANDBOX_MODE else timedelta(days=10)) + tender_period_end_date = calculate_tender_business_date( + get_now(), timedelta(days=7), tender + ) + timedelta(seconds=10) + enquiry_period_end_date = calculate_tender_business_date( + tender_period_end_date, -timedelta(days=10), tender + ) response = self.app.patch_json( "/tenders/{}?acc_token={}".format(tender["id"], owner_token), { "data": { "value": {"amount": 502, "currency": u"UAH"}, - "tenderPeriod": {"endDate": tenderPeriod_endDate.isoformat()}, + "tenderPeriod": {"endDate": tender_period_end_date.isoformat()}, } }, ) self.assertEqual(response.status, "200 OK") self.assertEqual(response.content_type, "application/json") - self.assertEqual(response.json["data"]["tenderPeriod"]["endDate"], tenderPeriod_endDate.isoformat()) - self.assertEqual(response.json["data"]["enquiryPeriod"]["endDate"], enquiryPeriod_endDate.isoformat()) + self.assertEqual(response.json["data"]["tenderPeriod"]["endDate"], tender_period_end_date.isoformat()) + self.assertEqual(response.json["data"]["enquiryPeriod"]["endDate"], enquiry_period_end_date.isoformat()) self.assertNotEqual(response.json["data"]["value"]["amount"], 502) self.assertNotEqual(response.json["data"]["value"]["amount"], 501) @@ -843,21 +849,25 @@ def patch_tender_ua(self): self.assertEqual(response.content_type, "application/json") self.assertEqual(response.json["errors"][0]["description"], "tenderPeriod should be extended by 7 days") - tenderPeriod_endDate = get_now() + timedelta(days=7, seconds=10) - enquiryPeriod_endDate = tenderPeriod_endDate - (timedelta(minutes=10) if SANDBOX_MODE else timedelta(days=10)) + tender_period_end_date = calculate_tender_business_date( + get_now(), timedelta(days=7), tender + ) + timedelta(seconds=10) + enquiry_period_end_date = calculate_tender_business_date( + tender_period_end_date, -timedelta(days=10), tender + ) response = self.app.patch_json( "/tenders/{}?acc_token={}".format(tender["id"], owner_token), { "data": { "value": {"amount": 501, "currency": u"UAH"}, - "tenderPeriod": {"endDate": tenderPeriod_endDate.isoformat()}, + "tenderPeriod": {"endDate": tender_period_end_date.isoformat()}, } }, ) self.assertEqual(response.status, "200 OK") self.assertEqual(response.content_type, "application/json") - self.assertEqual(response.json["data"]["tenderPeriod"]["endDate"], tenderPeriod_endDate.isoformat()) - self.assertEqual(response.json["data"]["enquiryPeriod"]["endDate"], enquiryPeriod_endDate.isoformat()) + self.assertEqual(response.json["data"]["tenderPeriod"]["endDate"], tender_period_end_date.isoformat()) + self.assertEqual(response.json["data"]["enquiryPeriod"]["endDate"], enquiry_period_end_date.isoformat()) response = self.app.patch_json( "/tenders/{}?acc_token={}".format(tender["id"], owner_token), @@ -909,6 +919,7 @@ def listing(self): # set status to active.tendering for tender in tenders: offset = get_now().isoformat() + add_criteria(self, tender["id"], tokens[tenders.index(tender)]) response = self.set_tender_status(tender, tokens[tenders.index(tender)], "active.tendering") tenders[tenders.index(tender)] = response.json["data"] @@ -1080,6 +1091,7 @@ def invalid_procurementMethod(self): token = response.json["access"]["token"] self.assertEqual(response.json["data"]["procurementMethod"], "selective") + add_criteria(self, tender["id"], token) # Try edit self.app.authorization = ("Basic", ("broker", "")) response = self.app.patch_json( @@ -1929,18 +1941,15 @@ def one_valid_bid_tender_ua(self): self.app.authorization = ("Basic", ("broker", "")) tender_db = self.db.get(tender["id"]) identifier = tender_db["shortlistedFirms"][0]["identifier"] - self.test_bids_data[0]["tenderers"][0]["identifier"]["id"] = identifier["id"] - self.test_bids_data[0]["tenderers"][0]["identifier"]["scheme"] = identifier["scheme"] + bid_data = deepcopy(self.test_bids_data[0]) + del bid_data["value"] + bid_data["tenderers"][0]["identifier"]["id"] = identifier["id"] + bid_data["tenderers"][0]["identifier"]["scheme"] = identifier["scheme"] + bid_data["value"] = {"amount": 500} + self.app.post_json( "/tenders/{}/bids".format(tender_id), - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": [self.test_bids_data[0]["tenderers"][0]], - "value": {"amount": 500}, - } - }, + {"data": bid_data}, ) # switch to active.qualification @@ -1966,32 +1975,21 @@ def one_invalid_and_1draft_bids_tender(self): self.app.authorization = ("Basic", ("broker", "")) tender_db = self.db.get(tender["id"]) identifier = tender_db["shortlistedFirms"][0]["identifier"] - self.test_bids_data[0]["tenderers"][0]["identifier"]["id"] = identifier["id"] - self.test_bids_data[0]["tenderers"][0]["identifier"]["scheme"] = identifier["scheme"] + bid_data = deepcopy(self.test_bids_data[0]) + del bid_data["value"] + bid_data["tenderers"][0]["identifier"]["id"] = identifier["id"] + bid_data["tenderers"][0]["identifier"]["scheme"] = identifier["scheme"] + bid_data["value"] = {"amount": 500} self.app.post_json( "/tenders/{}/bids".format(tender_id), - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": [self.test_bids_data[0]["tenderers"][0]], - "value": {"amount": 500}, - } - }, + {"data": bid_data}, ) + bid_data["status"] = "draft" self.app.authorization = ("Basic", ("broker", "")) self.app.post_json( "/tenders/{}/bids".format(tender_id), - { - "data": { - "selfEligible": True, - "selfQualified": True, - "status": "draft", - "tenderers": [self.test_bids_data[0]["tenderers"][0]], - "value": {"amount": 500}, - } - }, + {"data": bid_data}, ) # switch to active.qualification self.set_status("active.auction", {"auctionPeriod": {"startDate": None}, "status": "active.tendering"}) @@ -2019,33 +2017,25 @@ def first_bid_tender(self): self.app.authorization = ("Basic", ("broker", "")) tender_db = self.db.get(tender["id"]) identifier = tender_db["shortlistedFirms"][0]["identifier"] - self.test_bids_data[0]["tenderers"][0]["identifier"]["id"] = identifier["id"] - self.test_bids_data[0]["tenderers"][0]["identifier"]["scheme"] = identifier["scheme"] + bid_data = deepcopy(self.test_bids_data[0]) + del bid_data["value"] + bid_data["tenderers"][0]["identifier"]["id"] = identifier["id"] + bid_data["tenderers"][0]["identifier"]["scheme"] = identifier["scheme"] + bid_data["value"] = {"amount": 450} + response = self.app.post_json( "/tenders/{}/bids".format(tender_id), - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": [self.test_bids_data[0]["tenderers"][0]], - "value": {"amount": 450}, - } - }, + {"data": bid_data}, ) bid_id = response.json["data"]["id"] bid_token = response.json["access"]["token"] # create second bid + bid_data["value"] = {"amount": 475} + self.app.authorization = ("Basic", ("broker", "")) self.app.post_json( "/tenders/{}/bids".format(tender_id), - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": [self.test_bids_data[0]["tenderers"][0]], - "value": {"amount": 475}, - } - }, + {"data": bid_data}, ) # switch to active.auction self.set_status("active.auction") diff --git a/src/openprocurement/tender/competitivedialogue/views/stage1/bid.py b/src/openprocurement/tender/competitivedialogue/views/stage1/bid.py index c1520f47b8..534218e113 100644 --- a/src/openprocurement/tender/competitivedialogue/views/stage1/bid.py +++ b/src/openprocurement/tender/competitivedialogue/views/stage1/bid.py @@ -9,6 +9,7 @@ validate_bid_operation_period, validate_bid_operation_not_in_tendering, validate_bid_status_update_not_to_pending, + validate_bid_activate_criteria, ) from openprocurement.tender.competitivedialogue.validation import validate_bid_status_update_not_to_pending_or_draft @@ -19,6 +20,7 @@ validate_bid_operation_period, validate_update_deleted_bid, validate_bid_status_update_not_to_pending_or_draft, + validate_bid_activate_criteria, ) ) def patch_bid_first_stage(self): @@ -86,6 +88,7 @@ class CompetitiveDialogueEUBidResource(BaseResourceEU): validate_bid_operation_period, validate_update_deleted_bid, validate_bid_status_update_not_to_pending, + validate_bid_activate_criteria, ), )(patch_bid_first_stage) @@ -109,5 +112,6 @@ class CompetitiveDialogueUABidResource(BaseResourceEU): validate_bid_operation_period, validate_update_deleted_bid, validate_bid_status_update_not_to_pending, + validate_bid_activate_criteria, ), )(patch_bid_first_stage) diff --git a/src/openprocurement/tender/competitivedialogue/views/stage1/bid_rr.py b/src/openprocurement/tender/competitivedialogue/views/stage1/bid_rr.py new file mode 100644 index 0000000000..d6f5bb105b --- /dev/null +++ b/src/openprocurement/tender/competitivedialogue/views/stage1/bid_rr.py @@ -0,0 +1,26 @@ +# -*- coding: utf-8 -*- +from openprocurement.tender.core.views.bid_rr import BaseBidRequirementResponseResource +from openprocurement.tender.core.utils import optendersresource +from openprocurement.tender.competitivedialogue.constants import CD_EU_TYPE, CD_UA_TYPE + + +@optendersresource( + name="{}:Bid Requirement Response".format(CD_EU_TYPE), + collection_path="/tenders/{tender_id}/bids/{bid_id}/requirement_responses", + path="/tenders/{tender_id}/bids/{bid_id}/requirement_responses/{requirement_response_id}", + procurementMethodType=CD_EU_TYPE, + description="Competitive Dialogue EU bidder requirement responses", +) +class CDEUBidRequirementResponseResource(BaseBidRequirementResponseResource): + pass + + +@optendersresource( + name="{}:Bid Requirement Response".format(CD_UA_TYPE), + collection_path="/tenders/{tender_id}/bids/{bid_id}/requirement_responses", + path="/tenders/{tender_id}/bids/{bid_id}/requirement_responses/{requirement_response_id}", + procurementMethodType=CD_UA_TYPE, + description="Competitive Dialogue UA bidder requirement responses", +) +class CDUABidRequirementResponseResource(BaseBidRequirementResponseResource): + pass diff --git a/src/openprocurement/tender/competitivedialogue/views/stage1/bid_rr_evidence.py b/src/openprocurement/tender/competitivedialogue/views/stage1/bid_rr_evidence.py new file mode 100644 index 0000000000..4f0bebf80a --- /dev/null +++ b/src/openprocurement/tender/competitivedialogue/views/stage1/bid_rr_evidence.py @@ -0,0 +1,30 @@ +# -*- coding: utf-8 -*- +from openprocurement.tender.core.views.bid_rr_evidence import BaseBidRequirementResponseEvidenceResource +from openprocurement.tender.core.utils import optendersresource +from openprocurement.tender.competitivedialogue.constants import CD_EU_TYPE, CD_UA_TYPE + + +@optendersresource( + name="{}:Bid Requirement Response Evidence".format(CD_EU_TYPE), + collection_path="/tenders/{tender_id}/bids/{bid_id}/requirement_responses/{requirement_response_id}/evidences", + path="/tenders/{tender_id}/bids/{bid_id}/requirement_responses/{requirement_response_id}/evidences/{evidence_id}", + procurementMethodType=CD_EU_TYPE, + description="Competitive Dialogue EU bidder evidences", +) +class CDEUBidRequirementResponseEvidenceResource( + BaseBidRequirementResponseEvidenceResource +): + pass + + +@optendersresource( + name="{}:Bid Requirement Response Evidence".format(CD_UA_TYPE), + collection_path="/tenders/{tender_id}/bids/{bid_id}/requirement_responses/{requirement_response_id}/evidences", + path="/tenders/{tender_id}/bids/{bid_id}/requirement_responses/{requirement_response_id}/evidences/{evidence_id}", + procurementMethodType=CD_UA_TYPE, + description="Competitive Dialogue EU bidder evidences", +) +class CDUABidRequirementResponseEvidenceResource( + BaseBidRequirementResponseEvidenceResource +): + pass diff --git a/src/openprocurement/tender/competitivedialogue/views/stage1/criterion.py b/src/openprocurement/tender/competitivedialogue/views/stage1/criterion.py new file mode 100644 index 0000000000..b0fcb1e33f --- /dev/null +++ b/src/openprocurement/tender/competitivedialogue/views/stage1/criterion.py @@ -0,0 +1,27 @@ +# -*- coding: utf-8 -*- +from openprocurement.tender.core.utils import optendersresource +from openprocurement.tender.core.views.criterion import BaseTenderCriteriaResource +from openprocurement.tender.competitivedialogue.constants import CD_EU_TYPE, CD_UA_TYPE + + +@optendersresource( + name="{}:Tender Criteria".format(CD_EU_TYPE), + collection_path="/tenders/{tender_id}/criteria", + path="/tenders/{tender_id}/criteria/{criterion_id}", + procurementMethodType=CD_EU_TYPE, + description="Competitive Dialogue EU criteria", +) +class CDEUCriteriaResource(BaseTenderCriteriaResource): + pass + + +@optendersresource( + name="{}:Tender Criteria".format(CD_UA_TYPE), + collection_path="/tenders/{tender_id}/criteria", + path="/tenders/{tender_id}/criteria/{criterion_id}", + procurementMethodType=CD_UA_TYPE, + description="Competitive Dialogue UA criteria", +) +class CDUACriteriaResource(BaseTenderCriteriaResource): + pass + diff --git a/src/openprocurement/tender/competitivedialogue/views/stage1/criterion_rg.py b/src/openprocurement/tender/competitivedialogue/views/stage1/criterion_rg.py new file mode 100644 index 0000000000..472b525965 --- /dev/null +++ b/src/openprocurement/tender/competitivedialogue/views/stage1/criterion_rg.py @@ -0,0 +1,26 @@ +# -*- coding: utf-8 -*- +from openprocurement.tender.core.utils import optendersresource +from openprocurement.tender.core.views.criterion_rg import BaseTenderCriteriaRGResource +from openprocurement.tender.competitivedialogue.constants import CD_EU_TYPE, CD_UA_TYPE + + +@optendersresource( + name="{}:Criteria Requirement Group".format(CD_EU_TYPE), + collection_path="/tenders/{tender_id}/criteria/{criterion_id}/requirement_groups", + path="/tenders/{tender_id}/criteria/{criterion_id}/requirement_groups/{requirement_group_id}", + procurementMethodType=CD_EU_TYPE, + description="Competitive Dialogue EU requirement group", +) +class CDEUCriteriaRGResource(BaseTenderCriteriaRGResource): + pass + + +@optendersresource( + name="{}:Criteria Requirement Group".format(CD_UA_TYPE), + collection_path="/tenders/{tender_id}/criteria/{criterion_id}/requirement_groups", + path="/tenders/{tender_id}/criteria/{criterion_id}/requirement_groups/{requirement_group_id}", + procurementMethodType=CD_UA_TYPE, + description="Competitive Dialogue UA requirement group", +) +class CDUACriteriaRGResource(BaseTenderCriteriaRGResource): + pass diff --git a/src/openprocurement/tender/competitivedialogue/views/stage1/criterion_rg_requirement.py b/src/openprocurement/tender/competitivedialogue/views/stage1/criterion_rg_requirement.py new file mode 100644 index 0000000000..55db670b19 --- /dev/null +++ b/src/openprocurement/tender/competitivedialogue/views/stage1/criterion_rg_requirement.py @@ -0,0 +1,30 @@ +# -*- coding: utf-8 -*- +from openprocurement.tender.core.utils import optendersresource +from openprocurement.tender.core.views.criterion_rg_requirement import BaseTenderCriteriaRGRequirementResource +from openprocurement.tender.competitivedialogue.constants import CD_EU_TYPE, CD_UA_TYPE + + +@optendersresource( + name="{}:Requirement Group Requirement".format(CD_EU_TYPE), + collection_path="/tenders/{tender_id}/criteria/{criterion_id}/" + "requirement_groups/{requirement_group_id}/requirements", + path="/tenders/{tender_id}/criteria/{criterion_id}/" + "requirement_groups/{requirement_group_id}/requirements/{requirement_id}", + procurementMethodType=CD_EU_TYPE, + description="Competitive Dialogue EU requirement group requirement", +) +class CDEUCriteriaRGRequirementResource(BaseTenderCriteriaRGRequirementResource): + pass + + +@optendersresource( + name="{}:Requirement Group Requirement".format(CD_UA_TYPE), + collection_path="/tenders/{tender_id}/criteria/{criterion_id}/" + "requirement_groups/{requirement_group_id}/requirements", + path="/tenders/{tender_id}/criteria/{criterion_id}/" + "requirement_groups/{requirement_group_id}/requirements/{requirement_id}", + procurementMethodType=CD_UA_TYPE, + description="Competitive Dialogue UA requirement group requirement", +) +class CDUACriteriaRGRequirementResource(BaseTenderCriteriaRGRequirementResource): + pass diff --git a/src/openprocurement/tender/competitivedialogue/views/stage1/criterion_rg_requirement_evidence.py b/src/openprocurement/tender/competitivedialogue/views/stage1/criterion_rg_requirement_evidence.py new file mode 100644 index 0000000000..adb84f7b71 --- /dev/null +++ b/src/openprocurement/tender/competitivedialogue/views/stage1/criterion_rg_requirement_evidence.py @@ -0,0 +1,33 @@ +# -*- coding: utf-8 -*- +from openprocurement.tender.core.utils import optendersresource +from openprocurement.tender.core.views.criterion_rg_requirement_evidence import ( + BaseTenderCriteriaRGRequirementEvidenceResource, +) + +from openprocurement.tender.competitivedialogue.constants import CD_EU_TYPE, CD_UA_TYPE + + +@optendersresource( + name="{}:Requirement Eligible Evidence".format(CD_EU_TYPE), + collection_path="/tenders/{tender_id}/criteria/{criterion_id}/" + "requirement_groups/{requirement_group_id}/requirements/{requirement_id}/evidences", + path="/tenders/{tender_id}/criteria/{criterion_id}/" + "requirement_groups/{requirement_group_id}/requirements/{requirement_id}/evidences/{evidence_id}", + procurementMethodType=CD_EU_TYPE, + description="Competitive Dialogue EU requirement evidence", +) +class CDEUCriteriaRGRequirementEvidenceResource(BaseTenderCriteriaRGRequirementEvidenceResource): + pass + + +@optendersresource( + name="{}:Requirement Eligible Evidence".format(CD_UA_TYPE), + collection_path="/tenders/{tender_id}/criteria/{criterion_id}/" + "requirement_groups/{requirement_group_id}/requirements/{requirement_id}/evidences", + path="/tenders/{tender_id}/criteria/{criterion_id}/" + "requirement_groups/{requirement_group_id}/requirements/{requirement_id}/evidences/{evidence_id}", + procurementMethodType=CD_UA_TYPE, + description="Competitive Dialogue UA requirement evidence", +) +class CDUACriteriaRGRequirementEvidenceResource(BaseTenderCriteriaRGRequirementEvidenceResource): + pass diff --git a/src/openprocurement/tender/competitivedialogue/views/stage1/tender.py b/src/openprocurement/tender/competitivedialogue/views/stage1/tender.py index a8a5d3c078..70e291ebd5 100644 --- a/src/openprocurement/tender/competitivedialogue/views/stage1/tender.py +++ b/src/openprocurement/tender/competitivedialogue/views/stage1/tender.py @@ -3,6 +3,7 @@ from openprocurement.tender.core.validation import ( validate_tender_not_in_terminated_status, validate_tender_change_status_with_cancellation_lot_pending, + validate_tender_activate_with_criteria, ) from openprocurement.api.utils import json_view, context_unpack, APIResource from openprocurement.tender.belowthreshold.views.tender import TenderResource @@ -37,6 +38,7 @@ class CompetitiveDialogueEUResource(TenderEUResource): validate_tender_not_in_terminated_status, validate_tender_update, validate_tender_change_status_with_cancellation_lot_pending, + validate_tender_activate_with_criteria, ), permission="edit_tender", ) @@ -60,6 +62,7 @@ class CompetitiveDialogueUAResource(TenderResource): validate_tender_not_in_terminated_status, validate_tender_update, validate_tender_change_status_with_cancellation_lot_pending, + validate_tender_activate_with_criteria, ), permission="edit_tender", ) diff --git a/src/openprocurement/tender/competitivedialogue/views/stage2/award_rr.py b/src/openprocurement/tender/competitivedialogue/views/stage2/award_rr.py new file mode 100644 index 0000000000..df59e62e1e --- /dev/null +++ b/src/openprocurement/tender/competitivedialogue/views/stage2/award_rr.py @@ -0,0 +1,26 @@ +# -*- coding: utf-8 -*- +from openprocurement.tender.core.views.award_rr import BaseAwardRequirementResponseResource +from openprocurement.tender.core.utils import optendersresource +from openprocurement.tender.competitivedialogue.constants import STAGE_2_EU_TYPE, STAGE_2_UA_TYPE + + +@optendersresource( + name="{}:Award Requirement Response".format(STAGE_2_EU_TYPE), + collection_path="/tenders/{tender_id}/awards/{award_id}/requirement_responses", + path="/tenders/{tender_id}/awards/{award_id}/requirement_responses/{requirement_response_id}", + procurementMethodType=STAGE_2_EU_TYPE, + description="Competitive Dialogue Stage 2 EU award requirement responses", +) +class CDUAAwardRequirementResponseResource(BaseAwardRequirementResponseResource): + pass + + +@optendersresource( + name="{}:Award Requirement Response".format(STAGE_2_UA_TYPE), + collection_path="/tenders/{tender_id}/awards/{award_id}/requirement_responses", + path="/tenders/{tender_id}/awards/{award_id}/requirement_responses/{requirement_response_id}", + procurementMethodType=STAGE_2_UA_TYPE, + description="Competitive Dialogue Stage 2 UA award requirement responses", +) +class CDEUAwardRequirementResponseResource(BaseAwardRequirementResponseResource): + pass diff --git a/src/openprocurement/tender/competitivedialogue/views/stage2/award_rr_evidence.py b/src/openprocurement/tender/competitivedialogue/views/stage2/award_rr_evidence.py new file mode 100644 index 0000000000..d1681eec47 --- /dev/null +++ b/src/openprocurement/tender/competitivedialogue/views/stage2/award_rr_evidence.py @@ -0,0 +1,30 @@ +# -*- coding: utf-8 -*- +from openprocurement.tender.core.views.award_rr_evidence import BaseAwardRequirementResponseEvidenceResource +from openprocurement.tender.core.utils import optendersresource +from openprocurement.tender.competitivedialogue.constants import STAGE_2_EU_TYPE, STAGE_2_UA_TYPE + + +@optendersresource( + name="{}:Award Requirement Response Evidence".format(STAGE_2_EU_TYPE), + collection_path="/tenders/{tender_id}/awards/{award_id}/requirement_responses/{requirement_response_id}/evidences", + path="/tenders/{tender_id}/awards/{award_id}/requirement_responses/{requirement_response_id}/evidences/{evidence_id}", + procurementMethodType=STAGE_2_EU_TYPE, + description="Competitive Dialogue Stage 2 EU award evidences", +) +class CDEUAwardRequirementResponseEvidenceResource( + BaseAwardRequirementResponseEvidenceResource +): + pass + + +@optendersresource( + name="{}:Award Requirement Response Evidence".format(STAGE_2_UA_TYPE), + collection_path="/tenders/{tender_id}/awards/{award_id}/requirement_responses/{requirement_response_id}/evidences", + path="/tenders/{tender_id}/awards/{award_id}/requirement_responses/{requirement_response_id}/evidences/{evidence_id}", + procurementMethodType=STAGE_2_UA_TYPE, + description="Competitive Dialogue Stage 2 UA award evidences", +) +class CDUAAwardRequirementResponseEvidenceResource( + BaseAwardRequirementResponseEvidenceResource +): + pass \ No newline at end of file diff --git a/src/openprocurement/tender/competitivedialogue/views/stage2/bid_rr.py b/src/openprocurement/tender/competitivedialogue/views/stage2/bid_rr.py new file mode 100644 index 0000000000..9219d6396b --- /dev/null +++ b/src/openprocurement/tender/competitivedialogue/views/stage2/bid_rr.py @@ -0,0 +1,26 @@ +# -*- coding: utf-8 -*- +from openprocurement.tender.core.views.bid_rr import BaseBidRequirementResponseResource +from openprocurement.tender.core.utils import optendersresource +from openprocurement.tender.competitivedialogue.constants import STAGE_2_EU_TYPE, STAGE_2_UA_TYPE + + +@optendersresource( + name="{}:Bid Requirement Response".format(STAGE_2_EU_TYPE), + collection_path="/tenders/{tender_id}/bids/{bid_id}/requirement_responses", + path="/tenders/{tender_id}/bids/{bid_id}/requirement_responses/{requirement_response_id}", + procurementMethodType=STAGE_2_EU_TYPE, + description="Competitive Dialogue Stage 2 EU bidder requirement responses", +) +class CDEUBidRequirementResponseResource(BaseBidRequirementResponseResource): + pass + + +@optendersresource( + name="{}:Bid Requirement Response".format(STAGE_2_UA_TYPE), + collection_path="/tenders/{tender_id}/bids/{bid_id}/requirement_responses", + path="/tenders/{tender_id}/bids/{bid_id}/requirement_responses/{requirement_response_id}", + procurementMethodType=STAGE_2_UA_TYPE, + description="Competitive Dialogue Stage 2 UA bidder requirement responses", +) +class CDUABidRequirementResponseResource(BaseBidRequirementResponseResource): + pass diff --git a/src/openprocurement/tender/competitivedialogue/views/stage2/bid_rr_evidence.py b/src/openprocurement/tender/competitivedialogue/views/stage2/bid_rr_evidence.py new file mode 100644 index 0000000000..0391138eff --- /dev/null +++ b/src/openprocurement/tender/competitivedialogue/views/stage2/bid_rr_evidence.py @@ -0,0 +1,30 @@ +# -*- coding: utf-8 -*- +from openprocurement.tender.core.views.bid_rr_evidence import BaseBidRequirementResponseEvidenceResource +from openprocurement.tender.core.utils import optendersresource +from openprocurement.tender.competitivedialogue.constants import STAGE_2_EU_TYPE, STAGE_2_UA_TYPE + + +@optendersresource( + name="{}:Bid Requirement Response Evidence".format(STAGE_2_EU_TYPE), + collection_path="/tenders/{tender_id}/bids/{bid_id}/requirement_responses/{requirement_response_id}/evidences", + path="/tenders/{tender_id}/bids/{bid_id}/requirement_responses/{requirement_response_id}/evidences/{evidence_id}", + procurementMethodType=STAGE_2_EU_TYPE, + description="Competitive Dialogue Stage 2 EU bidder evidences", +) +class CDEUBidRequirementResponseEvidenceResource( + BaseBidRequirementResponseEvidenceResource +): + pass + + +@optendersresource( + name="{}:Bid Requirement Response Evidence".format(STAGE_2_UA_TYPE), + collection_path="/tenders/{tender_id}/bids/{bid_id}/requirement_responses/{requirement_response_id}/evidences", + path="/tenders/{tender_id}/bids/{bid_id}/requirement_responses/{requirement_response_id}/evidences/{evidence_id}", + procurementMethodType=STAGE_2_UA_TYPE, + description="Competitive Dialogue Stage 2 EU bidder evidences", +) +class CDUABidRequirementResponseEvidenceResource( + BaseBidRequirementResponseEvidenceResource +): + pass diff --git a/src/openprocurement/tender/competitivedialogue/views/stage2/criterion.py b/src/openprocurement/tender/competitivedialogue/views/stage2/criterion.py new file mode 100644 index 0000000000..601a0dcb7e --- /dev/null +++ b/src/openprocurement/tender/competitivedialogue/views/stage2/criterion.py @@ -0,0 +1,27 @@ +# -*- coding: utf-8 -*- +from openprocurement.tender.core.utils import optendersresource +from openprocurement.tender.core.views.criterion import BaseTenderCriteriaResource +from openprocurement.tender.competitivedialogue.constants import STAGE_2_EU_TYPE, STAGE_2_UA_TYPE + + +@optendersresource( + name="{}:Tender Criteria".format(STAGE_2_EU_TYPE), + collection_path="/tenders/{tender_id}/criteria", + path="/tenders/{tender_id}/criteria/{criterion_id}", + procurementMethodType=STAGE_2_EU_TYPE, + description="Competitive Dialogue Stage 2 EU criteria", +) +class CDEUCriteriaResource(BaseTenderCriteriaResource): + pass + + +@optendersresource( + name="{}:Tender Criteria".format(STAGE_2_UA_TYPE), + collection_path="/tenders/{tender_id}/criteria", + path="/tenders/{tender_id}/criteria/{criterion_id}", + procurementMethodType=STAGE_2_UA_TYPE, + description="Competitive Dialogue Stage 2 UA criteria", +) +class CDUACriteriaResource(BaseTenderCriteriaResource): + pass + diff --git a/src/openprocurement/tender/competitivedialogue/views/stage2/criterion_rg.py b/src/openprocurement/tender/competitivedialogue/views/stage2/criterion_rg.py new file mode 100644 index 0000000000..fbecc1f8e5 --- /dev/null +++ b/src/openprocurement/tender/competitivedialogue/views/stage2/criterion_rg.py @@ -0,0 +1,26 @@ +# -*- coding: utf-8 -*- +from openprocurement.tender.core.utils import optendersresource +from openprocurement.tender.core.views.criterion_rg import BaseTenderCriteriaRGResource +from openprocurement.tender.competitivedialogue.constants import STAGE_2_EU_TYPE, STAGE_2_UA_TYPE + + +@optendersresource( + name="{}:Criteria Requirement Group".format(STAGE_2_EU_TYPE), + collection_path="/tenders/{tender_id}/criteria/{criterion_id}/requirement_groups", + path="/tenders/{tender_id}/criteria/{criterion_id}/requirement_groups/{requirement_group_id}", + procurementMethodType=STAGE_2_EU_TYPE, + description="Competitive Dialogue Stage 2 EU requirement group", +) +class CDEUCriteriaRGResource(BaseTenderCriteriaRGResource): + pass + + +@optendersresource( + name="{}:Criteria Requirement Group".format(STAGE_2_UA_TYPE), + collection_path="/tenders/{tender_id}/criteria/{criterion_id}/requirement_groups", + path="/tenders/{tender_id}/criteria/{criterion_id}/requirement_groups/{requirement_group_id}", + procurementMethodType=STAGE_2_UA_TYPE, + description="Competitive Dialogue Stage 2 UA requirement group", +) +class CDUACriteriaRGResource(BaseTenderCriteriaRGResource): + pass diff --git a/src/openprocurement/tender/competitivedialogue/views/stage2/criterion_rg_requirement.py b/src/openprocurement/tender/competitivedialogue/views/stage2/criterion_rg_requirement.py new file mode 100644 index 0000000000..29528f2bd5 --- /dev/null +++ b/src/openprocurement/tender/competitivedialogue/views/stage2/criterion_rg_requirement.py @@ -0,0 +1,30 @@ +# -*- coding: utf-8 -*- +from openprocurement.tender.core.utils import optendersresource +from openprocurement.tender.core.views.criterion_rg_requirement import BaseTenderCriteriaRGRequirementResource +from openprocurement.tender.competitivedialogue.constants import STAGE_2_EU_TYPE, STAGE_2_UA_TYPE + + +@optendersresource( + name="{}:Requirement Group Requirement".format(STAGE_2_EU_TYPE), + collection_path="/tenders/{tender_id}/criteria/{criterion_id}/" + "requirement_groups/{requirement_group_id}/requirements", + path="/tenders/{tender_id}/criteria/{criterion_id}/" + "requirement_groups/{requirement_group_id}/requirements/{requirement_id}", + procurementMethodType=STAGE_2_EU_TYPE, + description="Competitive Dialogue Stage 2 EU requirement group requirement", +) +class CDEUCriteriaRGRequirementResource(BaseTenderCriteriaRGRequirementResource): + pass + + +@optendersresource( + name="{}:Requirement Group Requirement".format(STAGE_2_UA_TYPE), + collection_path="/tenders/{tender_id}/criteria/{criterion_id}/" + "requirement_groups/{requirement_group_id}/requirements", + path="/tenders/{tender_id}/criteria/{criterion_id}/" + "requirement_groups/{requirement_group_id}/requirements/{requirement_id}", + procurementMethodType=STAGE_2_UA_TYPE, + description="Competitive Dialogue Stage 2 UA requirement group requirement", +) +class CDUACriteriaRGRequirementResource(BaseTenderCriteriaRGRequirementResource): + pass diff --git a/src/openprocurement/tender/competitivedialogue/views/stage2/criterion_rg_requirement_evidence.py b/src/openprocurement/tender/competitivedialogue/views/stage2/criterion_rg_requirement_evidence.py new file mode 100644 index 0000000000..77695771bb --- /dev/null +++ b/src/openprocurement/tender/competitivedialogue/views/stage2/criterion_rg_requirement_evidence.py @@ -0,0 +1,32 @@ +# -*- coding: utf-8 -*- +from openprocurement.tender.core.utils import optendersresource +from openprocurement.tender.core.views.criterion_rg_requirement_evidence import ( + BaseTenderCriteriaRGRequirementEvidenceResource, +) +from openprocurement.tender.competitivedialogue.constants import STAGE_2_EU_TYPE, STAGE_2_UA_TYPE + + +@optendersresource( + name="{}:Requirement Eligible Evidence".format(STAGE_2_EU_TYPE), + collection_path="/tenders/{tender_id}/criteria/{criterion_id}/" + "requirement_groups/{requirement_group_id}/requirements/{requirement_id}/evidences", + path="/tenders/{tender_id}/criteria/{criterion_id}/" + "requirement_groups/{requirement_group_id}/requirements/{requirement_id}/evidences/{evidence_id}", + procurementMethodType=STAGE_2_EU_TYPE, + description="Competitive Dialogue Stage 2 EU requirement evidence", +) +class CDEUCriteriaRGRequirementEvidenceResource(BaseTenderCriteriaRGRequirementEvidenceResource): + pass + + +@optendersresource( + name="{}:Requirement Eligible Evidence".format(STAGE_2_UA_TYPE), + collection_path="/tenders/{tender_id}/criteria/{criterion_id}/" + "requirement_groups/{requirement_group_id}/requirements/{requirement_id}/evidences", + path="/tenders/{tender_id}/criteria/{criterion_id}/" + "requirement_groups/{requirement_group_id}/requirements/{requirement_id}/evidences/{evidence_id}", + procurementMethodType=STAGE_2_UA_TYPE, + description="Competitive Dialogue Stage 2 UA requirement evidence", +) +class CDUACriteriaRGRequirementEvidenceResource(BaseTenderCriteriaRGRequirementEvidenceResource): + pass diff --git a/src/openprocurement/tender/competitivedialogue/views/stage2/tender.py b/src/openprocurement/tender/competitivedialogue/views/stage2/tender.py index 6c722227ad..c9c6a38e0a 100644 --- a/src/openprocurement/tender/competitivedialogue/views/stage2/tender.py +++ b/src/openprocurement/tender/competitivedialogue/views/stage2/tender.py @@ -11,6 +11,7 @@ validate_tender_not_in_terminated_status, validate_tender_status_update_not_in_pre_qualificaton, validate_tender_change_status_with_cancellation_lot_pending, + validate_tender_activate_with_criteria, ) from openprocurement.tender.openua.views.tender import TenderUAResource from openprocurement.tender.openeu.views.tender import TenderEUResource @@ -37,6 +38,7 @@ class TenderStage2UAResource(TenderUAResource): validate_patch_tender_stage2_data, validate_tender_not_in_terminated_status, validate_tender_change_status_with_cancellation_lot_pending, + validate_tender_activate_with_criteria, ), permission="edit_tender", ) @@ -132,6 +134,7 @@ class TenderStage2UEResource(TenderEUResource): validate_tender_not_in_terminated_status, validate_tender_status_update_not_in_pre_qualificaton, validate_tender_change_status_with_cancellation_lot_pending, + validate_tender_activate_with_criteria, ), permission="edit_tender", ) diff --git a/src/openprocurement/tender/core/constants.py b/src/openprocurement/tender/core/constants.py index 0fe9446d81..1107aee13b 100644 --- a/src/openprocurement/tender/core/constants.py +++ b/src/openprocurement/tender/core/constants.py @@ -1,8 +1,10 @@ # -*- coding: utf-8 -*- from decimal import Decimal from datetime import datetime, timedelta -from openprocurement.api.constants import TZ, CPV_ITEMS_CLASS_FROM +from openprocurement.api.constants import TZ from openprocurement.tender.competitivedialogue.constants import CD_UA_TYPE, CD_EU_TYPE +from openprocurement.tender.pricequotation.constants import PMT as PRICEQUOTATION + BIDDER_TIME = timedelta(minutes=6) SERVICE_TIME = timedelta(minutes=9) @@ -27,6 +29,7 @@ "aboveThresholdEU", "aboveThresholdUA", "aboveThresholdUA.defense", + PRICEQUOTATION } diff --git a/src/openprocurement/tender/core/models.py b/src/openprocurement/tender/core/models.py index 892d7f4db6..da96ec29a8 100644 --- a/src/openprocurement/tender/core/models.py +++ b/src/openprocurement/tender/core/models.py @@ -2,9 +2,9 @@ from uuid import uuid4 from datetime import timedelta, time, datetime from openprocurement.api.models import OpenprocurementSchematicsDocument, BusinessOrganization, Guarantee -from schematics.transforms import whitelist, blacklist, export_loop from zope.interface import implementer from pyramid.security import Allow +from schematics.transforms import whitelist, blacklist, export_loop from schematics.exceptions import ValidationError from schematics.types.compound import ModelType, DictType from schematics.types.serializable import serializable @@ -22,17 +22,21 @@ IsoDateTimeType, ListType, Document as BaseDocument, + Classification as BaseClassification, CPVClassification, Location, Contract as BaseContract, Value, PeriodEndRequired as BasePeriodEndRequired, ) -from openprocurement.api.models import Item as BaseItem +from openprocurement.api.models import Item as BaseItem, Reference from openprocurement.api.models import schematics_default_role, schematics_embedded_role from openprocurement.api.validation import validate_items_uniq from openprocurement.api.utils import ( - get_now, get_first_revision_date, get_root, generate_docservice_url, + generate_docservice_url, + get_now, + get_first_revision_date, + get_root, get_uah_amount_from_value, ) from openprocurement.api.constants import ( @@ -45,23 +49,31 @@ MILESTONES_VALIDATION_FROM, RELEASE_2020_04_19, COMPLAINT_IDENTIFIER_REQUIRED_FROM, + CPV_ITEMS_CLASS_FROM, ) from openprocurement.api.auth import ACCR_1, ACCR_2, ACCR_5 from openprocurement.tender.core.constants import ( CANT_DELETE_PERIOD_START_DATE_FROM, BID_LOTVALUES_VALIDATION_FROM, - CPV_ITEMS_CLASS_FROM, - COMPLAINT_AMOUNT_RATE, COMPLAINT_MIN_AMOUNT, COMPLAINT_MAX_AMOUNT, - COMPLAINT_ENHANCED_AMOUNT_RATE, COMPLAINT_ENHANCED_MIN_AMOUNT, COMPLAINT_ENHANCED_MAX_AMOUNT, + COMPLAINT_AMOUNT_RATE, + COMPLAINT_MIN_AMOUNT, + COMPLAINT_MAX_AMOUNT, + COMPLAINT_ENHANCED_AMOUNT_RATE, + COMPLAINT_ENHANCED_MIN_AMOUNT, + COMPLAINT_ENHANCED_MAX_AMOUNT, ) from openprocurement.tender.core.utils import ( - calc_auction_end_time, rounding_shouldStartAfter, - restrict_value_to_bounds, round_up_to_ten, - get_contract_supplier_roles, get_contract_supplier_permissions, - calculate_tender_business_date, - calculate_complaint_business_date, + normalize_should_start_after, + calc_auction_end_time, + restrict_value_to_bounds, + round_up_to_ten, + get_contract_supplier_roles, + get_contract_supplier_permissions, + calculate_tender_date, prepare_award_milestones, + check_skip_award_complaint_period, + calculate_complaint_business_date, ) from openprocurement.tender.core.validation import ( validate_lotvalue_value, @@ -71,6 +83,9 @@ validate_milestones, validate_bid_value, validate_relatedlot, + validate_value_type, + validate_requirement_values, + validate_minimalstep_limits, ) from openprocurement.tender.esco.utils import get_complaint_amount as get_esco_complaint_amount from openprocurement.planning.api.models import BaseOrganization @@ -130,7 +145,7 @@ def shouldStartAfter(self): start_after = calc_auction_end_time(tender.numberOfBids, self.startDate) else: start_after = tender.tenderPeriod.endDate - return rounding_shouldStartAfter(start_after, tender).isoformat() + return normalize_should_start_after(start_after, tender).isoformat() class ComplaintModelType(ModelType): @@ -299,6 +314,35 @@ def validator(klass, data, value): return validator +def bids_response_validation_wrapper(validation_func): + def validator(klass, data, value): + orig_data = data + while not isinstance(data["__parent__"], Tender): + # in case this validation wrapper is used for subelement of bid (such as response) + # traverse back to the bid to get possibility to check status # troo-to-to =) + data = data["__parent__"] + + tender = data["__parent__"] + request = tender.__parent__.request + + # TODO: find better solution for check if object created + if ( + not isinstance(data, (Bid, dict)) + or (request.method == "POST" and request.authenticated_role == "bid_owner" and data["status"] == "draft") + ): + return validation_func(klass, orig_data, value) + + if data["status"] in ("deleted", "invalid", "invalid.pre-qualification", "unsuccessful", "draft"): + # skip not valid bids + return + if request.method == "PATCH" and isinstance(tender, Tender) and request.authenticated_role == "tender_owner": + # disable bids validation on tender PATCH requests as tender bids will be invalidated + return + return validation_func(klass, orig_data, value) + + return validator + + def validate_dkpp(items, *args): if items and not any([i.scheme in ADDITIONAL_CLASSIFICATIONS_SCHEMES for i in items]): raise ValidationError( @@ -357,7 +401,8 @@ def shouldStartAfter(self): return tender = get_tender(self) lot = self.__parent__ - if tender.status not in ["active.tendering", "active.auction"] or lot.status != "active": + statuses = ["active.tendering", "active.auction"] + if tender.status not in statuses or lot.status != "active": return if self.startDate and get_now() > calc_auction_end_time(lot.numberOfBids, self.startDate): start_after = calc_auction_end_time(lot.numberOfBids, self.startDate) @@ -371,7 +416,7 @@ def shouldStartAfter(self): ] decision_dates.append(tender.tenderPeriod.endDate) start_after = max(decision_dates) - return rounding_shouldStartAfter(start_after, tender).isoformat() + return normalize_should_start_after(start_after, tender).isoformat() class Item(BaseItem): @@ -461,13 +506,24 @@ def validate_awardID(self, data, awardID): def validate_dateSigned(self, data, value): parent = data["__parent__"] if value and isinstance(parent, Model): + tender = get_tender(parent) + skip_award_complaint_period = check_skip_award_complaint_period(tender) award = [i for i in parent.awards if i.id == data["awardID"]][0] - if award.complaintPeriod.endDate >= value: - raise ValidationError( - u"Contract signature date should be after award complaint period end date ({})".format( - award.complaintPeriod.endDate.isoformat() - ) - ) + if award.complaintPeriod: + if not skip_award_complaint_period: + if award.complaintPeriod.endDate and value <= award.complaintPeriod.endDate: + raise ValidationError( + u"Contract signature date should be after award complaint period end date ({})".format( + award.complaintPeriod.endDate.isoformat() + ) + ) + elif award.complaintPeriod.startDate and value <= award.complaintPeriod.startDate: + raise ValidationError( + u"Contract signature date should be after award activation date ({})".format( + award.complaintPeriod.startDate.isoformat() + ) + ) + if value > get_now(): raise ValidationError(u"Contract signature date can't be in the future") @@ -518,6 +574,334 @@ def validate_value(self, data, value): raise ValidationError(u"value should be one of feature value.") +class FeatureValue(Model): + value = FloatType(required=True, min_value=0.0, max_value=0.3) + title = StringType(required=True, min_length=1) + title_en = StringType() + title_ru = StringType() + description = StringType() + description_en = StringType() + description_ru = StringType() + + +class Feature(Model): + code = StringType(required=True, min_length=1, default=lambda: uuid4().hex) + featureOf = StringType(required=True, choices=["tenderer", "lot", "item"], default="tenderer") + relatedItem = StringType(min_length=1) + title = StringType(required=True, min_length=1) + title_en = StringType() + title_ru = StringType() + description = StringType() + description_en = StringType() + description_ru = StringType() + enum = ListType( + ModelType(FeatureValue, required=True), default=list(), min_size=1, validators=[validate_values_uniq] + ) + + def validate_relatedItem(self, data, relatedItem): + if not relatedItem and data.get("featureOf") in ["item", "lot"]: + raise ValidationError(u"This field is required.") + parent = data["__parent__"] + if isinstance(parent, Model): + if data.get("featureOf") == "item" and relatedItem not in [i.id for i in parent.items if i]: + raise ValidationError(u"relatedItem should be one of items") + if data.get("featureOf") == "lot" and relatedItem not in [i.id for i in parent.lots if i]: + raise ValidationError(u"relatedItem should be one of lots") + + +# ECriteria +class EligibleEvidence(Model): + class Options: + namespace = "Evidence" + roles = { + "create": blacklist(), + "edit": blacklist("type"), + "embedded": schematics_embedded_role, + "view": schematics_default_role, + } + + id = StringType(required=True, default=lambda: uuid4().hex) + title = StringType(required=True, min_length=1) + title_en = StringType() + title_ru = StringType() + description = StringType() + description_en = StringType() + description_ru = StringType() + type = StringType( + choices=["document", "statement"], + default="statement" + ) + + +class Evidence(EligibleEvidence): + class Options: + namespace = "Evidence" + roles = { + "create": blacklist(), + "edit": blacklist(), + "embedded": schematics_embedded_role, + "view": schematics_default_role, + } + relatedDocument = ModelType(Reference) + + @bids_response_validation_wrapper + def validate_relatedDocument(self, data, document_reference): + if data["type"] in ["document"] and not document_reference: + raise ValidationError("This field is required.") + + if document_reference: + requirement_response = data["__parent__"] + parent = requirement_response["__parent__"] + parent_name = parent.__class__.__name__.lower() + if document_reference.id not in [document.id for document in parent.documents if document]: + raise ValidationError("relatedDocument.id should be one of {} documents".format(parent_name)) + + @bids_response_validation_wrapper + def validate_type(self, data, value): + parent = data["__parent__"] + requirement_reference = parent.requirement + if value and requirement_reference and isinstance(parent, Model): + tender = get_tender(parent) + requirement = None + for criteria in tender.criteria: + for group in criteria.requirementGroups: + for req in group.requirements: + if req.id == requirement_reference.id: + requirement = req + break + if requirement: + evidences_type = [i.type for i in requirement.eligibleEvidences] + if evidences_type and value not in evidences_type: + raise ValidationError("type should be one of eligibleEvidences types") + + +class ExtendPeriod(Period): + maxExtendDate = IsoDateTimeType() + durationInDays = IntType() + duration = StringType() + + +class LegislationIdentifier(Identifier): + scheme = StringType() + + +class LegislationItem(Model): + version = StringType() + identifier = ModelType(LegislationIdentifier, required=True) + type = StringType(choices=["NATIONAL_LEGISLATION"], default="NATIONAL_LEGISLATION") + article = StringType() + + +class Requirement(Model): + class Options: + roles = { + "create": blacklist("eligibleEvidences"), + "edit": blacklist("eligibleEvidences"), + "embedded": schematics_embedded_role, + "view": schematics_default_role, + } + + id = StringType(required=True, default=lambda: uuid4().hex) + title = StringType(required=True, min_length=1) + title_en = StringType() + title_ru = StringType() + description = StringType() + description_en = StringType() + description_ru = StringType() + dataType = StringType(required=True, + choices=["string", "number", "integer", "boolean", "date-time"]) + + minValue = StringType() + maxValue = StringType() + period = ModelType(ExtendPeriod) + eligibleEvidences = ListType(ModelType(EligibleEvidence, required=True), default=list()) + relatedFeature = MD5Type() + expectedValue = StringType() + + def validate_minValue(self, data, value): + if value: + if data["dataType"] not in ["integer", "number"]: + raise ValidationError("minValue must be integer or number") + validate_value_type(value, data['dataType']) + + def validate_maxValue(self, data, value): + if value: + if data["dataType"] not in ["integer", "number"]: + raise ValidationError("minValue must be integer or number") + validate_value_type(value, data['dataType']) + + def validate_expectedValue(self, data, value): + if value: + validate_value_type(value, data['dataType']) + + def validate_relatedFeature(self, data, feature_id): + parent = data["__parent__"] + if feature_id and isinstance(parent, Model): + tender = get_tender(parent) + features = [] if not tender.get("features") else tender.get("features") + if feature_id not in [feature.id for feature in features]: + raise ValidationError("relatedFeature should be one of features") + + +class RequirementGroup(Model): + class Options: + roles = { + "create": blacklist(), + "edit": blacklist("requirements"), + "embedded": schematics_embedded_role, + "view": schematics_default_role, + } + + id = MD5Type(required=True, default=lambda: uuid4().hex) + description = StringType() + description_en = StringType() + description_ru = StringType() + requirements = ListType( + ModelType(Requirement, required=True, validators=[validate_requirement_values]), + default=list(), + ) + + +class CriterionClassification(BaseClassification): + description = StringType() + + +class Criterion(Model): + class Options: + roles = { + "create": blacklist(), + "edit": blacklist( + "requirementGroups", + "additionalClassifications", + "legislation", + ), + "embedded": schematics_embedded_role, + "view": schematics_default_role, + } + + id = MD5Type(required=True, default=lambda: uuid4().hex) + title = StringType(required=True, min_length=1) + title_en = StringType() + title_ru = StringType() + description = StringType() + description_en = StringType() + description_ru = StringType() + + source = StringType(choices=["tenderer", "buyer", "procuringEntity", "ssrBot", "winner"]) + relatesTo = StringType(choices=["tenderer", "item", "lot"]) + relatedItem = MD5Type() + classification = ModelType(CriterionClassification, required=True) # TODO: make it required + additionalClassifications = ListType(ModelType(BaseClassification, required=True), default=list()) + legislation = ListType(ModelType(LegislationItem, required=True), default=list()) + requirementGroups = ListType( + ModelType(RequirementGroup, required=True), + required=True, + min_size=1, + ) + + def validate_relatedItem(self, data, relatedItem): + if not relatedItem and data.get("relatesTo") in ["item", "lot"]: + raise ValidationError(u"This field is required.") + parent = data["__parent__"] + if relatedItem and isinstance(parent, Model): + tender = get_tender(parent) + if data.get("relatesTo") == "lot" and relatedItem not in [i.id for i in tender.lots if i]: + raise ValidationError(u"relatedItem should be one of lots") + if data.get("relatesTo") == "item" and relatedItem not in [i.id for i in tender.items if i]: + raise ValidationError(u"relatedItem should be one of items") + + +class RequirementResponse(Model): + class Options: + roles = { + "create": blacklist("evidences"), + "edit": blacklist("evidences"), + "embedded": schematics_embedded_role, + "view": schematics_default_role, + } + id = StringType(required=True, default=lambda: uuid4().hex) + title = StringType() + title_en = StringType() + title_ru = StringType() + description = StringType() + description_en = StringType() + description_ru = StringType() + + period = ModelType(ExtendPeriod) + requirement = ModelType(Reference, required=True) + relatedTenderer = ModelType(Reference) + relatedItem = MD5Type() + evidences = ListType(ModelType(Evidence, required=True), default=list()) + + value = StringType(required=True) + + @bids_response_validation_wrapper + def validate_relatedItem(self, data, relatedItem): + parent = data["__parent__"] + if relatedItem and isinstance(parent, Model): + tender = get_tender(parent) + if relatedItem not in [i.id for i in tender.items if i]: + raise ValidationError(u"relatedItem should be one of items") + + @bids_response_validation_wrapper + def validate_relatedTenderer(self, data, relatedTenderer): + parent = data["__parent__"] + if relatedTenderer and isinstance(parent, Model): + if relatedTenderer.id not in [ + organization.identifier.id + for organization in parent.get("tenderers", list()) + ]: + raise ValidationError(u"relatedTenderer should be one of bid tenderers") + + @bids_response_validation_wrapper + def validate_requirement(self, data, requirement): + parent = data["__parent__"] + + if requirement and requirement.get("id") and isinstance(parent, Model): + tender = get_tender(parent) + requirement_id = requirement["id"] + + requirements = [ + requirement.id + for criteria in tender.criteria + for group in criteria.requirementGroups + for requirement in group.requirements + if requirement.id == requirement_id + ] + + if not requirements: + raise ValidationError("requirement should be one of criteria requirements") + + @bids_response_validation_wrapper + def validate_value(self, data, value): + requirement_reference = data.get("requirement") + parent = data["__parent__"] + if isinstance(parent, Model): + tender = get_tender(parent) + requirement = None + for criteria in tender.criteria: + for group in criteria.requirementGroups: + for req in group.requirements: + if req.id == requirement_reference.id: + requirement = req + break + if requirement: + data_type = requirement.dataType + valid_value = validate_value_type(value, data_type) + expectedValue = requirement.get("expectedValue") + minValue = requirement.get("minValue") + maxValue = requirement.get("maxValue") + + if expectedValue and validate_value_type(expectedValue, data_type) != valid_value: + raise ValidationError("value and requirementGroup.expectedValue must be equal") + if minValue and valid_value < validate_value_type(minValue, data_type): + raise ValidationError("value should be higher than eligibleEvidence.minValue") + if maxValue and valid_value > validate_value_type(maxValue, data_type): + raise ValidationError("value should be lower than eligibleEvidence.maxValue") + + return valid_value + + class Bid(Model): class Options: roles = { @@ -554,6 +938,10 @@ def __local_roles__(self): owner_token = StringType() transfer_token = StringType() owner = StringType() + requirementResponses = ListType( + ModelType(RequirementResponse, required=True), + default=list() + ) __name__ = "" @@ -1010,6 +1398,8 @@ class BaseAward(Model): documents = ListType(ModelType(Document, required=True), default=list()) items = ListType(ModelType(Item, required=True)) + requirementResponses = ListType(ModelType(RequirementResponse, required=True), default=list()) + class QualificationMilestone(Model): id = MD5Type(required=True, default=lambda: uuid4().hex) @@ -1032,12 +1422,12 @@ class Options: def set_due_date(self): if not self.dueDate: if self.code == self.CODE_24_HOURS: - self.dueDate = calculate_tender_business_date( + self.dueDate = calculate_tender_date( self.date, timedelta(hours=24), get_tender(self) ) elif self.code == self.CODE_LOW_PRICE: self.dueDate = calculate_complaint_business_date( - self.date, timedelta(days=1), get_tender(self), working_days=True, + self.date, timedelta(days=1), get_tender(self), working_days=True ) return self.dueDate and self.dueDate.isoformat() @@ -1086,41 +1476,6 @@ def validate_lotID(self, data, lotID): raise ValidationError(u"lotID should be one of lots") -class FeatureValue(Model): - value = FloatType(required=True, min_value=0.0, max_value=0.3) - title = StringType(required=True, min_length=1) - title_en = StringType() - title_ru = StringType() - description = StringType() - description_en = StringType() - description_ru = StringType() - - -class Feature(Model): - code = StringType(required=True, min_length=1, default=lambda: uuid4().hex) - featureOf = StringType(required=True, choices=["tenderer", "lot", "item"], default="tenderer") - relatedItem = StringType(min_length=1) - title = StringType(required=True, min_length=1) - title_en = StringType() - title_ru = StringType() - description = StringType() - description_en = StringType() - description_ru = StringType() - enum = ListType( - ModelType(FeatureValue, required=True), default=list(), min_size=1, validators=[validate_values_uniq] - ) - - def validate_relatedItem(self, data, relatedItem): - if not relatedItem and data.get("featureOf") in ["item", "lot"]: - raise ValidationError(u"This field is required.") - parent = data["__parent__"] - if isinstance(parent, Model): - if data.get("featureOf") == "item" and relatedItem not in [i.id for i in parent.items if i]: - raise ValidationError(u"relatedItem should be one of items") - if data.get("featureOf") == "lot" and relatedItem not in [i.id for i in parent.lots if i]: - raise ValidationError(u"relatedItem should be one of lots") - - class BaseLot(Model): id = MD5Type(required=True, default=lambda: uuid4().hex) title = StringType(required=True, min_length=1) @@ -1217,6 +1572,26 @@ def validate_minimalStep(self, data, value): raise ValidationError(u"value should be less than value of lot") +class LotWithMinimalStepLimitsValidation(Lot): + """Additional minimalStep validation for : + belowThreshold + aboveThresholdUA + aboveThresholdEU + aboveThresholdUA.defense + competitiveDialogueUA.stage1 + competitiveDialogueEU.stage1 + closeFrameworkAgreementUA + """ + class Options: + namespace = "Lot" + + def validate_minimalStep(self, data, value): + if value and value.amount and data.get("value"): + if data.get("value").amount < value.amount: + raise ValidationError(u"value should be less than value of lot") + validate_minimalstep_limits(data, value) + + class Duration(Model): days = IntType(required=True, min_value=1) type = StringType(required=True, choices=["working", "banking", "calendar"]) @@ -1323,6 +1698,7 @@ class Options: "procurementMethod", "owner", "plans", + "criteria", ), "auction_view": whitelist( "tenderID", @@ -1551,6 +1927,8 @@ class Tender(BaseTender): default="active.enquiries", ) + criteria = ListType(ModelType(Criterion, required=True), default=list()) + create_accreditations = (ACCR_1, ACCR_5) central_accreditations = (ACCR_5,) edit_accreditations = (ACCR_2,) diff --git a/src/openprocurement/tender/core/tests/base.py b/src/openprocurement/tender/core/tests/base.py index ed7e758fb2..01e01e9b24 100644 --- a/src/openprocurement/tender/core/tests/base.py +++ b/src/openprocurement/tender/core/tests/base.py @@ -11,6 +11,10 @@ from openprocurement.tender.core.models import QualificationMilestone from openprocurement.api.tests.base import BaseWebTest as BaseApiWebTest from openprocurement.api.utils import SESSION, apply_data_patch, get_now +from openprocurement.tender.core.utils import ( + calculate_tender_date, + calculate_tender_business_date, +) now = datetime.now() @@ -84,17 +88,59 @@ class BaseCoreWebTest(BaseWebTest): tender_id = None + periods = None + now = None + tender_class = None + def tearDown(self): self.delete_tender() super(BaseCoreWebTest, self).tearDown() - def set_status(self, status, extra=None): + def set_status(self, status, extra=None, startend="start"): + self.now = get_now() self.tender_document = self.db.get(self.tender_id) - self.update_status(status, extra=extra) + self.tender_document_patch = {"status": status} + self.update_periods(status, startend=startend) + if extra: + self.tender_document_patch.update(extra) + self.save_changes() return self.get_tender("chronograph") - def update_status(self, status, extra=None): - self.tender_document_patch = {"status": status} + def update_periods(self, status, startend="start", shift=None): + shift = shift or timedelta() + if status in self.periods: + for period in self.periods[status][startend]: + self.tender_document_patch.update({period: {}}) + for date in self.periods[status][startend][period]: + self.tender_document_patch[period][date] = (self.calculate_period_date( + date, period, startend, status + ) + shift).isoformat() + + lots = self.tender_document.get("lots", []) + if lots: + for period in self.periods[status][startend]: + if period in ("auctionPeriod",): + for lot in lots: + if lot.get("status", None) == "active": + lot.update({period: {}}) + for date in self.periods[status][startend][period]: + lot[period][date] = (self.calculate_period_date( + date, period, startend, status + ) + shift).isoformat() + self.tender_document_patch.update({"lots": lots}) + + def calculate_period_date(self, date, period, startend, status): + tender = self.tender_class(self.tender_document) + period_date_item = self.periods[status][startend][period][date] + return calculate_tender_date( + self.now, period_date_item, tender=tender, working_days=False + ) + + def time_shift(self, status, extra=None, startend="start", shift=None): + self.now = get_now() + self.tender_document = self.db.get(self.tender_id) + self.tender_document_patch = {} + self.update_periods(status, startend=startend, shift=shift) if extra: self.tender_document_patch.update(extra) self.save_changes() diff --git a/src/openprocurement/tender/core/tests/cancellation_view_validators.py b/src/openprocurement/tender/core/tests/cancellation_view_validators.py index 3d86c82dea..9f5396cc06 100644 --- a/src/openprocurement/tender/core/tests/cancellation_view_validators.py +++ b/src/openprocurement/tender/core/tests/cancellation_view_validators.py @@ -85,7 +85,7 @@ def mock_validate(request, cancellation=None): if get_now() < RELEASE_2020_04_19: with mock.patch( - "openprocurement.tender.core.utils.validate_absence_of_pending_accepted_satisfied_complaints", + "openprocurement.tender.core.validation.validate_absence_of_pending_accepted_satisfied_complaints", mock_validate ): cancellation = dict(**test_cancellation) @@ -109,10 +109,10 @@ def test_patch_cancellation(app, tender_data): def mock_validate(request, cancellation=None): raise_operation_error(request, "hello") - def patch(data): - return "openprocurement.tender.core.utils.validate_absence_of_pending_accepted_satisfied_complaints" - - with mock.patch(patch(tender_data), mock_validate): + with mock.patch( + "openprocurement.tender.core.validation.validate_absence_of_pending_accepted_satisfied_complaints", + mock_validate + ): if get_now() < RELEASE_2020_04_19: response = app.post_json( "/tenders/{}/cancellations?acc_token={}".format(tender["id"], tender_token), @@ -224,4 +224,4 @@ def test_post_cancellation_openeu(app): ) assert response.json == {u'status': u'error', u'errors': [ {u'description': u"Can't perform operation for there is a tender complaint in satisfied status", - u'location': u'body', u'name': u'data'}]} \ No newline at end of file + u'location': u'body', u'name': u'data'}]} diff --git a/src/openprocurement/tender/core/tests/chronograph.py b/src/openprocurement/tender/core/tests/chronograph.py index 6dcfa1a7c4..ec4d25a1a9 100644 --- a/src/openprocurement/tender/core/tests/chronograph.py +++ b/src/openprocurement/tender/core/tests/chronograph.py @@ -2,6 +2,7 @@ from datetime import timedelta from openprocurement.api.utils import get_now from openprocurement.tender.belowthreshold.tests.base import test_draft_complaint, test_cancellation +from openprocurement.tender.core.utils import calculate_tender_business_date from openprocurement.tender.openeu.models import Cancellation from copy import deepcopy from mock import patch @@ -23,9 +24,10 @@ def switch_tender_complaints_draft(self): # and once the date passed tender = self.db.get(self.tender_id) + start_date = get_now() - timedelta(days=40) tender["tenderPeriod"] = dict( - startDate=(get_now() - timedelta(days=40)).isoformat(), - endDate=(get_now() - timedelta(days=10)).isoformat() + startDate=start_date.isoformat(), + endDate=calculate_tender_business_date(start_date, timedelta(days=30)).isoformat() ) self.db.save(tender) diff --git a/src/openprocurement/tender/core/tests/complaint_value.py b/src/openprocurement/tender/core/tests/complaint_value.py index f155043874..0ba7af1b1e 100644 --- a/src/openprocurement/tender/core/tests/complaint_value.py +++ b/src/openprocurement/tender/core/tests/complaint_value.py @@ -59,6 +59,7 @@ def test_complaint_value_with_lots(app): test_data["lots"].append(deepcopy(test_lots[0])) test_data["lots"][0]["value"]["amount"] = 500 test_data["lots"][1]["value"]["amount"] = 99999999999999 + test_data["lots"][1]["minimalStep"]["amount"] = 2999999999999 tender = create_tender(app, test_data) req_data = deepcopy(complaint_data) diff --git a/src/openprocurement/tender/core/tests/criteria_utils.py b/src/openprocurement/tender/core/tests/criteria_utils.py new file mode 100644 index 0000000000..135886d84d --- /dev/null +++ b/src/openprocurement/tender/core/tests/criteria_utils.py @@ -0,0 +1,22 @@ +from openprocurement.tender.belowthreshold.tests.base import test_criteria +from openprocurement.api.constants import RELEASE_ECRITERIA_ARTICLE_17 +from openprocurement.api.utils import get_now + + +def add_criteria(self, tender_id=None, tender_token=None): + if not tender_id: + tender_id = self.tender_id + if not tender_token: + tender_token = self.tender_token + + response = self.app.get("/tenders/{}".format(tender_id)) + without_criteria = ["aboveThresholdUA.defense", "reporting", "negotiation", "negotiation.quick"] + if response.json["data"]["procurementMethodType"] in without_criteria: + return + if get_now() > RELEASE_ECRITERIA_ARTICLE_17: + response = self.app.post_json( + "/tenders/{}/criteria?acc_token={}".format(tender_id, tender_token), + {"data": test_criteria}, + ) + + self.assertEqual(response.status, "201 Created") diff --git a/src/openprocurement/tender/core/tests/qualification_milestone.py b/src/openprocurement/tender/core/tests/qualification_milestone.py index ec25ee7cec..bf401cfc3c 100644 --- a/src/openprocurement/tender/core/tests/qualification_milestone.py +++ b/src/openprocurement/tender/core/tests/qualification_milestone.py @@ -1,7 +1,7 @@ from openprocurement.api.utils import get_now from openprocurement.tender.core.tests.base import change_auth from openprocurement.api.constants import RELEASE_2020_04_19 -from openprocurement.tender.core.utils import calculate_tender_business_date, calculate_complaint_business_date +from openprocurement.tender.core.utils import calculate_tender_date, calculate_complaint_business_date from openprocurement.tender.core.constants import ALP_MILESTONE_REASONS from copy import deepcopy from datetime import timedelta @@ -112,7 +112,7 @@ def test_24hours_milestone(self): self.assertEqual(created_milestone["code"], request_data["code"]) self.assertEqual(created_milestone["description"], request_data["description"]) self.assertNotEqual(created_milestone["dueDate"], request_data["dueDate"]) - expected_date = calculate_tender_business_date( + expected_date = calculate_tender_date( parse_date(created_milestone["date"]), timedelta(hours=24), tender_data diff --git a/src/openprocurement/tender/core/tests/validators.py b/src/openprocurement/tender/core/tests/validators.py index 2811983bb0..8bb3894412 100644 --- a/src/openprocurement/tender/core/tests/validators.py +++ b/src/openprocurement/tender/core/tests/validators.py @@ -1,5 +1,7 @@ # -*- coding: utf-8 -*- import copy +from datetime import timedelta + import mock import unittest from decimal import Decimal @@ -8,6 +10,7 @@ from schematics.exceptions import ModelValidationError from openprocurement.api.auth import ACCR_TEST +from openprocurement.api.utils import get_now from openprocurement.tender.core.validation import ( validate_update_contract_value_with_award, validate_update_contract_value, @@ -17,7 +20,7 @@ validate_tender_accreditation_level_mode ) from openprocurement.tender.belowthreshold.models import Tender -from openprocurement.tender.belowthreshold.tests.base import test_tender_data +from openprocurement.tender.belowthreshold.tests.base import test_tender_data, test_lots @mock.patch("openprocurement.api.validation.error_handler", lambda *_: HTTPError) @@ -478,3 +481,33 @@ def test_required_id_description(self): self.assertEqual( error_messages, {"id": [u"This field is required."], "description": [u"This field is required."]} ) + + +class TestTenderMinimalStepLimitsValidation(unittest.TestCase): + + def setUp(self): + self.test_tender = copy.deepcopy(test_tender_data) + self.test_lots = copy.deepcopy(test_lots) + + @mock.patch("openprocurement.tender.core.validation.MINIMAL_STEP_VALIDATION_FROM", get_now() - timedelta(days=1)) + def test_validate_tender_minimalstep(self): + self.test_tender["minimalStep"]["amount"] = 35 + tender = Tender(self.test_tender) + with self.assertRaises(ModelValidationError) as e: + tender.validate() + self.assertEqual( + e.exception.message, + {'minimalStep': [u'minimalstep must be between 0.5% and 3% of value (with 2 digits precision).']} + ) + + @mock.patch("openprocurement.tender.core.validation.MINIMAL_STEP_VALIDATION_FROM", get_now() + timedelta(days=1)) + def test_not_validate_tender_minimalstep_before_feature_start_date(self): + self.test_tender["minimalStep"]["amount"] = 35 + tender = Tender(self.test_tender) + tender.validate() + + def test_not_validate_minimalstep_for_tender_with_lots(self): + self.test_tender["minimalStep"]["amount"] = 35 + self.test_tender["lots"] = self.test_lots + tender = Tender(self.test_tender) + tender.validate() diff --git a/src/openprocurement/tender/core/traversal.py b/src/openprocurement/tender/core/traversal.py index 7876049f31..423b2996f0 100644 --- a/src/openprocurement/tender/core/traversal.py +++ b/src/openprocurement/tender/core/traversal.py @@ -25,6 +25,7 @@ class Root(object): (Allow, "g:Administrator", "edit_complaint"), (Allow, "g:admins", ALL_PERMISSIONS), (Allow, "g:bots", "upload_tender_documents"), + (Allow, "g:bots", "edit_tender"), (Allow, "g:bots", "upload_qualification_documents"), ] @@ -74,6 +75,8 @@ def factory(request): return resolve_question(request, tender) elif request.matchdict.get("lot_id"): return resolve_lot(request, tender) + elif request.matchdict.get("criterion_id"): + return resolve_criteria(request, tender) request.validated["id"] = request.matchdict["tender_id"] @@ -112,8 +115,9 @@ def resolve_bid(request, obj, document_type=None): bid = get_item(obj, "bid", request) if request.matchdict.get("document_id"): return resolve_document(request, bid, document_type=document_type) - else: - return bid + if request.matchdict.get("requirement_response_id"): + return resolve_requirement_response(request, bid) + return bid def resolve_contract(request, obj): @@ -132,6 +136,8 @@ def resolve_award(request, obj): return resolve_document(request, award) elif request.matchdict.get("milestone_id"): return resolve_milestone(request, award) + elif request.matchdict.get("requirement_response_id"): + return resolve_requirement_response(request, award) else: return award @@ -150,3 +156,34 @@ def resolve_document(request, obj, document_type=None): def resolve_milestone(request, obj): return get_item(obj, "milestone", request) + + +def resolve_requirement(request, obj): + requirement = get_item(obj, "requirement", request) + if request.matchdict.get("evidence_id"): + return get_item(requirement, "evidence", request, where_search="eligibleEvidences") + return requirement + + +def resolve_requirement_group(request, obj): + requirement_group = get_item(obj, "requirement_group", request, "requirementGroups") + if request.matchdict.get("requirement_id"): + return resolve_requirement(request, requirement_group) + return requirement_group + + +def resolve_criteria(request, obj): + criteria = get_item(obj, "criterion", request, "criteria") + + if request.matchdict.get("requirement_group_id"): + return resolve_requirement_group(request, criteria) + else: + return criteria + + +def resolve_requirement_response(request, obj): + requirement_response = get_item(obj, "requirement_response", request, "requirementResponses") + + if request.matchdict.get("evidence_id"): + return get_item(requirement_response, "evidence", request) + return requirement_response diff --git a/src/openprocurement/tender/core/utils.py b/src/openprocurement/tender/core/utils.py index 0c9995b7fb..185e788ab1 100644 --- a/src/openprocurement/tender/core/utils.py +++ b/src/openprocurement/tender/core/utils.py @@ -2,6 +2,7 @@ import jmespath from decimal import Decimal from re import compile +from functools import wraps from dateorro import ( calc_datetime, @@ -9,6 +10,7 @@ calc_normalized_datetime, ) from dateorro.calculations import check_working_datetime +from iso8601 import parse_date from jsonpointer import resolve_pointer from functools import partial from datetime import datetime, time, timedelta @@ -25,9 +27,10 @@ TZ, WORKING_DATE_ALLOW_MIDNIGHT_FROM, NORMALIZED_CLARIFICATIONS_PERIOD_FROM, + NORMALIZE_SHOULD_START_AFTER, RELEASE_2020_04_19, + NORMALIZED_TENDER_PERIOD_FROM, ) -from openprocurement.api.utils import error_handler, get_first_revision_date, handle_store_exceptions, append_revision from openprocurement.api.utils import ( get_now, context_unpack, @@ -35,6 +38,10 @@ apply_data_patch, update_logging_context, set_modetest_titles, + error_handler, + get_first_revision_date, + handle_store_exceptions, + append_revision, ) from openprocurement.tender.core.constants import ( BIDDER_TIME, @@ -44,6 +51,7 @@ ALP_MILESTONE_REASONS, ) from openprocurement.tender.core.traversal import factory +from openprocurement.tender.openua.constants import AUCTION_PERIOD_TIME from jsonpointer import JsonPointerException from jsonpatch import JsonPatchException, apply_patch as apply_json_patch from barbecue import chef @@ -57,13 +65,12 @@ optendersresource = partial(resource, error_handler=error_handler, factory=factory) -def rounding_shouldStartAfter(start_after, tender, use_from=datetime(2016, 7, 16, tzinfo=TZ)): - if use_from < (tender.enquiryPeriod and tender.enquiryPeriod.startDate or get_now()) and not ( - SANDBOX_MODE and tender.submissionMethodDetails and u"quick" in tender.submissionMethodDetails - ): - midnigth = datetime.combine(start_after.date(), time(0, tzinfo=start_after.tzinfo)) - if start_after > midnigth: - start_after = midnigth + timedelta(1) +def normalize_should_start_after(start_after, tender): + if SANDBOX_MODE and tender.submissionMethodDetails and u"quick" in tender.submissionMethodDetails: + return start_after + date = tender.enquiryPeriod and tender.enquiryPeriod.startDate or get_now() + if NORMALIZE_SHOULD_START_AFTER < date: + return calc_normalized_datetime(start_after, ceil=True) return start_after @@ -310,44 +317,50 @@ def get_tender_accelerator(context): return None -def calculate_tender_date(date_obj, timedelta_obj, tender, working_days, calendar=WORKING_DAYS): - tender_date = get_first_revision_date(tender, default=get_now()) +def acceleratable(wrapped): + @wraps(wrapped) + def wrapper(date_obj, timedelta_obj, tender=None, working_days=False, calendar=WORKING_DAYS): + accelerator = get_tender_accelerator(tender) + if accelerator: + return calc_datetime(date_obj, timedelta_obj, accelerator=accelerator) + return wrapped(date_obj, timedelta_obj, tender=tender, working_days=working_days, calendar=calendar) + return wrapper + + +@acceleratable +def calculate_tender_date(date_obj, timedelta_obj, tender=None, working_days=False, calendar=WORKING_DAYS): if working_days: + tender_date = get_first_revision_date(tender, default=get_now()) midnight = tender_date > WORKING_DATE_ALLOW_MIDNIGHT_FROM return calc_working_datetime(date_obj, timedelta_obj, midnight, calendar) else: return calc_datetime(date_obj, timedelta_obj) +def calculate_period_start_date(date_obj, timedelta_obj, normalized_from_date_obj, tender=None): + tender_date = get_first_revision_date(tender, default=get_now()) + if tender_date > normalized_from_date_obj: + return calc_normalized_datetime(date_obj, ceil=timedelta_obj > timedelta()) + else: + return date_obj + + +@acceleratable def calculate_tender_business_date(date_obj, timedelta_obj, tender=None, working_days=False, calendar=WORKING_DAYS): - accelerator = get_tender_accelerator(tender) - if accelerator: - return calc_datetime(date_obj, timedelta_obj, accelerator) - return calculate_tender_date(date_obj, timedelta_obj, tender, working_days, calendar) + start_obj = calculate_period_start_date(date_obj, timedelta_obj, NORMALIZED_TENDER_PERIOD_FROM, tender) + return calculate_tender_date(start_obj, timedelta_obj, tender, working_days, calendar) +@acceleratable def calculate_complaint_business_date(date_obj, timedelta_obj, tender=None, working_days=False, calendar=WORKING_DAYS): - accelerator = get_tender_accelerator(tender) - if accelerator: - return calc_datetime(date_obj, timedelta_obj, accelerator) - tender_date = get_first_revision_date(tender, default=get_now()) - if tender_date > NORMALIZED_COMPLAINT_PERIOD_FROM: - source_date_obj = calc_normalized_datetime(date_obj, ceil=timedelta_obj > timedelta()) - else: - source_date_obj = date_obj - return calculate_tender_date(source_date_obj, timedelta_obj, tender, working_days, calendar) + start_obj = calculate_period_start_date(date_obj, timedelta_obj, NORMALIZED_COMPLAINT_PERIOD_FROM, tender) + return calculate_tender_date(start_obj, timedelta_obj, tender, working_days, calendar) -def calculate_clarifications_business_date(date_obj, timedelta_obj, tender=None, working_days=False, calendar=WORKING_DAYS): - accelerator = get_tender_accelerator(tender) - if accelerator: - return calc_datetime(date_obj, timedelta_obj, accelerator) - tender_date = get_first_revision_date(tender, default=get_now()) - if tender_date > NORMALIZED_CLARIFICATIONS_PERIOD_FROM: - source_date_obj = calc_normalized_datetime(date_obj, ceil=timedelta_obj > timedelta()) - else: - source_date_obj = date_obj - return calculate_tender_date(source_date_obj, timedelta_obj, tender, working_days, calendar) +@acceleratable +def calculate_clarif_business_date(date_obj, timedelta_obj, tender=None, working_days=False, calendar=WORKING_DAYS): + start_obj = calculate_period_start_date(date_obj, timedelta_obj, NORMALIZED_CLARIFICATIONS_PERIOD_FROM, tender) + return calculate_tender_date(start_obj, timedelta_obj, tender, working_days, calendar) def calculate_date_diff(dt1, dt2, working_days=True, calendar=WORKING_DAYS): @@ -386,6 +399,14 @@ def convert_to_decimal(value): raise TypeError("Unable to convert %s to Decimal" % value) +def check_auction_period(period, tender): + if period and period.startDate and period.shouldStartAfter: + start = parse_date(period.shouldStartAfter) + date = calculate_tender_date(start, AUCTION_PERIOD_TIME, tender, True) + return period.startDate > date + return False + + def restrict_value_to_bounds(value, min_value, max_value): if value < min_value: return min_value @@ -413,13 +434,18 @@ def calculate_total_complaints(tender): return total_complaints -from openprocurement.tender.core.validation import validate_absence_of_pending_accepted_satisfied_complaints +def check_skip_award_complaint_period(tender): + return ( + tender.procurementMethodType == "belowThreshold" + and tender.get("procurementMethodRationale", "") == "simple" + ) class CancelTenderLot(object): def __call__(self, request, cancellation): if cancellation.status == "active": + from openprocurement.tender.core.validation import validate_absence_of_pending_accepted_satisfied_complaints validate_absence_of_pending_accepted_satisfied_complaints(request, cancellation) if cancellation.relatedLot: self.cancel_lot(request, cancellation) diff --git a/src/openprocurement/tender/core/validation.py b/src/openprocurement/tender/core/validation.py index a16c05e843..763aada1a6 100644 --- a/src/openprocurement/tender/core/validation.py +++ b/src/openprocurement/tender/core/validation.py @@ -1,5 +1,6 @@ # -*- coding: utf-8 -*- from collections import defaultdict +from math import floor, ceil from decimal import Decimal, ROUND_UP from schematics.types import BaseType @@ -12,7 +13,9 @@ OPERATIONS, validate_accreditation_level_kind, validate_tender_first_revision_date, + validate_post_list_data, ) +from openprocurement.api.models import Model from openprocurement.api.constants import ( SANDBOX_MODE, UA_ROAD_SCHEME, @@ -21,10 +24,14 @@ ATC_SCHEME, INN_SCHEME, GMDN_CPV_PREFIXES, - RELEASE_2020_04_19 + RELEASE_2020_04_19, + RELEASE_ECRITERIA_ARTICLE_17, + RELEASE_2020_04_19, + MINIMAL_STEP_VALIDATION_FROM, ) from openprocurement.api.utils import ( get_now, + get_root, is_ua_road_classification, is_gmdn_classification, to_decimal, @@ -34,11 +41,22 @@ check_document_batch, handle_data_exceptions, get_first_revision_date, + get_root, ) from openprocurement.tender.core.constants import AMOUNT_NET_COEF, FIRST_STAGE_PROCUREMENT_TYPES -from openprocurement.tender.core.utils import calculate_tender_business_date, requested_fields_changes +from openprocurement.tender.core.utils import ( + calculate_tender_business_date, + requested_fields_changes, + check_skip_award_complaint_period, +) from openprocurement.planning.api.utils import extract_plan_adapter from schematics.exceptions import ValidationError +from schematics.types import DecimalType, StringType, IntType, BooleanType, DateTimeType + +# Decided in CS-8167 +MINIMAL_STEP_VALIDATION_PRESCISSION = 2 +MINIMAL_STEP_VALIDATION_LOWER_LIMIT = 0.005 +MINIMAL_STEP_VALIDATION_UPPER_LIMIT = 0.03 def validate_tender_data(request): @@ -191,7 +209,7 @@ def validate_tender_auction_data(request): if ( SANDBOX_MODE and tender.submissionMethodDetails - and tender.submissionMethodDetails in [u"quick(mode:no-auction)", u"quick(mode:fast-forward)"] + and tender.submissionMethodDetails.endswith((u"quick(mode:no-auction)", u"quick(mode:fast-forward)")) ): if tender.lots: data["lots"] = [ @@ -246,6 +264,52 @@ def validate_bid_documents(request): return documents +def validate_bid_activate_criteria(request): + """ + Validate that bidder gave response for all requirements + for only one of requirementGroups inside all criteria + """ + + tender = request.validated["tender"] + bid = request.context + + bid_status_to = request.validated["data"].get("status", request.context.status) + tender_created = get_first_revision_date(tender, default=get_now()) + + if ( + tender_created < RELEASE_ECRITERIA_ARTICLE_17 + or bid.status == bid_status_to + or bid_status_to not in ["active", "pending"] + ): + return + + all_answered_requirements = [i.requirement.id for i in bid.requirementResponses] + + for criteria in tender.criteria: + if criteria.source != "tenderer": + continue + + criteria_ids = {} + group_answered_requirement_ids = {} + for rg in criteria.requirementGroups: + req_ids = {i.id for i in rg.requirements} + answered_reqs = {i for i in all_answered_requirements if i in req_ids} + + if answered_reqs: + group_answered_requirement_ids[rg.id] = answered_reqs + criteria_ids[rg.id] = req_ids + + if not group_answered_requirement_ids: + raise_operation_error(request, "Must be answered on all criteria with source `tenderer`") + + if len(group_answered_requirement_ids) > 1: + raise_operation_error(request, "Inside criteria must be answered only one requirement group") + + rg_id = group_answered_requirement_ids.keys()[0] + if set(criteria_ids[rg_id]).difference(set(group_answered_requirement_ids[rg_id])): + raise_operation_error(request, "Inside requirement group must get answered all of requirements") + + def validate_patch_bid_data(request): model = type(request.tender).bids.model_class return validate_data(request, model, True) @@ -668,7 +732,7 @@ def validate_bid_value(tender, value): def validate_minimalstep(data, value): - if value and value.amount and data.get("value"): + if value and value.amount is not None and data.get("value"): if data.get("value").amount < value.amount: raise ValidationError(u"value should be less than value of tender") if data.get("value").currency != value.currency: @@ -677,6 +741,25 @@ def validate_minimalstep(data, value): raise ValidationError( u"valueAddedTaxIncluded should be identical " u"to valueAddedTaxIncluded of value of tender" ) + if not data.get("lots"): + validate_minimalstep_limits(data, value, is_tender=True) + + +def validate_minimalstep_limits(data, value, is_tender=False): + if value and value.amount is not None and data.get("value"): + tender = data if is_tender else get_root(data["__parent__"]) + tender_created = get_first_revision_date(tender, default=get_now()) + if tender_created > MINIMAL_STEP_VALIDATION_FROM: + precision_multiplier = 10**MINIMAL_STEP_VALIDATION_PRESCISSION + lower_minimalstep = (floor(float(data.get("value").amount) + * MINIMAL_STEP_VALIDATION_LOWER_LIMIT * precision_multiplier) + / precision_multiplier) + higher_minimalstep = (ceil(float(data.get("value").amount) + * MINIMAL_STEP_VALIDATION_UPPER_LIMIT * precision_multiplier) + / precision_multiplier) + if higher_minimalstep < value.amount or value.amount < lower_minimalstep: + raise ValidationError( + u"minimalstep must be between 0.5% and 3% of value (with 2 digits precision).") # cancellation @@ -812,6 +895,36 @@ def validate_tender_change_status_with_cancellation_lot_pending(request): ) +def validate_tender_activate_with_criteria(request): + tender = request.context + data = request.validated["data"] + tender_created = get_first_revision_date(tender, default=get_now()) + + if ( + tender_created < RELEASE_ECRITERIA_ARTICLE_17 + or request.validated["tender_src"]["status"] == data.get("status") + or data.get("status") not in ["active", "active.tendering"] + ): + return + + tender_criteria = [criterion.classification.id for criterion in tender.criteria if criterion.classification] + + needed_criteria = { + "CRITERION.EXCLUSION.CONVICTIONS.PARTICIPATION_IN_CRIMINAL_ORGANISATION", + "CRITERION.EXCLUSION.CONVICTIONS.FRAUD", + "CRITERION.EXCLUSION.CONVICTIONS.CORRUPTION", + "CRITERION.EXCLUSION.CONVICTIONS.CHILD_LABOUR-HUMAN_TRAFFICKING", + "CRITERION.EXCLUSION.CONTRIBUTIONS.PAYMENT_OF_TAXES", + "CRITERION.EXCLUSION.BUSINESS.BANKRUPTCY", + "CRITERION.EXCLUSION.MISCONDUCT.MARKET_DISTORTION", + "CRITERION.EXCLUSION.CONFLICT_OF_INTEREST.MISINTERPRETATION", + "CRITERION.EXCLUSION.NATIONAL.OTHER", + } + + if needed_criteria.difference(tender_criteria): + raise_operation_error(request, "Tender must contain all 9 `EXCLUSION` criteria") + + def validate_tender_status_update_not_in_pre_qualificaton(request): tender = request.context data = request.validated["data"] @@ -1092,7 +1205,10 @@ def validate_submit_complaint_time(request): if get_now() > tender.complaintPeriod.endDate: raise_operation_error( request, - "Can submit complaint not later than {0.days} days before tenderPeriod end".format(complaint_submit_time), + "Can submit complaint not later than {duration.days} " + "full calendar days before tenderPeriod ends".format( + duration=complaint_submit_time + ), ) @@ -1407,12 +1523,22 @@ def validate_contract_signing(request): tender = request.validated["tender"] data = request.validated["data"] if request.context.status != "active" and "status" in data and data["status"] == "active": + skip_complaint_period = check_skip_award_complaint_period(tender) award = [a for a in tender.awards if a.id == request.context.awardID][0] - stand_still_end = award.complaintPeriod.endDate - if stand_still_end > get_now(): - raise_operation_error( - request, "Can't sign contract before stand-still period end ({})".format(stand_still_end.isoformat()) - ) + if not skip_complaint_period: + stand_still_end = award.complaintPeriod.endDate + if stand_still_end > get_now(): + raise_operation_error( + request, + "Can't sign contract before stand-still period end ({})".format(stand_still_end.isoformat()) + ) + else: + stand_still_end = award.complaintPeriod.startDate + if stand_still_end > get_now(): + raise_operation_error( + request, + "Can't sign contract before award activation date ({})".format(stand_still_end.isoformat()) + ) pending_complaints = [ i for i in tender.complaints @@ -1515,7 +1641,8 @@ def validate_tender_matches_plan(request): pattern = plan.classification.id[:3] if plan.classification.id.startswith("336") else plan.classification.id[:4] for i, item in enumerate(tender.items): - if item.classification.id[: len(pattern)] != pattern: + # item.classification may be empty in pricequotaiton + if item.classification and item.classification.id[: len(pattern)] != pattern: request.errors.add( "data", "items[{}].classification.id".format(i), @@ -1605,3 +1732,198 @@ def validate_role_for_contract_document_operation(request): raise_operation_error( request, "Tender onwer can't {} document in current contract status".format(OPERATIONS.get(request.method)) ) + + +def validate_award_document_tender_not_in_allowed_status_base(request, allowed_bot_statuses=("active.awarded",)): + allowed_tender_statuses = ["active.qualification"] + if request.authenticated_role == "bots": + allowed_tender_statuses.extend(allowed_bot_statuses) + if request.validated["tender_status"] not in allowed_tender_statuses: + raise_operation_error( + request, + "Can't {} document in current ({}) tender status".format( + OPERATIONS.get(request.method), request.validated["tender_status"] + ), + ) + + +def validate_award_document_lot_not_in_allowed_status(request): + if any([ + i.status != "active" + for i in request.validated["tender"].lots + if i.id == request.validated["award"].lotID + ]): + raise_operation_error(request, "Can {} document only in active lot status".format( + OPERATIONS.get(request.method) + )) + + +def validate_award_document_author(request): + operation = OPERATIONS.get(request.method) + if operation == "update" and request.authenticated_role != (request.context.author or "tender_owner"): + request.errors.add("url", "role", "Can update document only author") + request.errors.status = 403 + raise error_handler(request.errors) + + +TYPEMAP = { + 'string': StringType(), + 'integer': IntType(), + 'number': DecimalType(), + 'boolean': BooleanType(), + 'date-time': DateTimeType(), +} + +# Criteria + + +def validate_value_type(value, datatype): + if not value: + return + type_ = TYPEMAP.get(datatype) + if not type_: + raise ValidationError( + u'Type mismatch: value {} does not confront type {}'.format( + value, type_ + ) + ) + # validate value + return type_.to_native(value) + + +# tender.criterion.requirementGroups +def validate_requirement_values(requirement): + expected = requirement.get('expectedValue') + min_value = requirement.get('minValue') + max_value = requirement.get('maxValue') + + if any((expected and min_value, expected and max_value)): + raise ValidationError( + u'expectedValue conflicts with ["minValue", "maxValue"]' + ) + + +def validate_requirement(requirement): + expected = requirement.get('expectedValue') + min_value = requirement.get('minValue') + max_value = requirement.get('maxValue') + if not any((expected, min_value, max_value)): + raise ValidationError( + u'Value required for at least one field ["expectedValue", "minValue", "maxValue"]' + ) + validate_requirement_values(requirement) + + +def validate_requirement_groups(value): + for requirements in value: + for requirement in requirements.requirements: + validate_requirement(requirement) + + +def base_validate_operation_ecriteria_objects(request, valid_statuses="", obj_name="tender"): + validate_tender_first_revision_date(request, validation_date=RELEASE_ECRITERIA_ARTICLE_17) + current_status = request.validated[obj_name].status + if current_status not in valid_statuses: + raise_operation_error(request, "Can't {} object if {} not in {} statuses".format( + request.method.lower(), obj_name, valid_statuses)) + + +def validate_operation_ecriteria_objects(request): + valid_statuses = ["draft", "draft.pending", "draft.stage2", "active.tendering"] + base_validate_operation_ecriteria_objects(request, valid_statuses) + + +def validate_patch_exclusion_ecriteria_objects(request): + criterion = request.validated["criterion"] + if criterion.classification.id.startswith("CRITERION.EXCLUSION"): + raise_operation_error(request, "Can't update exclusion ecriteria objects") + + +def validate_operation_bid_requirement_response(request): + valid_statuses = ["draft", "invalid"] + base_validate_operation_ecriteria_objects(request, valid_statuses, "bid") + + +def validate_operation_award_requirement_response(request): + validate_tender_first_revision_date(request, validation_date=RELEASE_ECRITERIA_ARTICLE_17) + base_validate_operation_ecriteria_objects(request, ["pending"], "award") + + +def validate_criterion_data(request): + update_logging_context(request, {"criterion_id": "__new__"}) + model = type(request.tender).criteria.model_class + return validate_data(request, model, bulk="full") + + +def validate_patch_criterion_data(request): + model = type(request.tender).criteria.model_class + return validate_data(request, model, True) + + +def validate_requirement_group_data(request): + update_logging_context(request, {"requirementgroup_id": "__new__"}) + model = type(request.tender).criteria.model_class.requirementGroups.model_class + return validate_data(request, model) + + +def validate_patch_requirement_group_data(request): + model = type(request.tender).criteria.model_class.requirementGroups.model_class + return validate_data(request, model, True) + + +def validate_requirement_data(request): + update_logging_context(request, {"requirement_id": "__new__"}) + model = type(request.tender).criteria.model_class.requirementGroups.model_class.requirements.model_class + return validate_data(request, model) + + +def validate_patch_requirement_data(request): + model = type(request.tender).criteria.model_class.requirementGroups.model_class.requirements.model_class + return validate_data(request, model, True) + + +def validate_eligible_evidence_data(request): + update_logging_context(request, {"evidence_id": "__new__"}) + model = (type(request.tender).criteria.model_class.requirementGroups.model_class + .requirements.model_class + .eligibleEvidences.model_class) + return validate_data(request, model) + + +def validate_patch_eligible_evidence_data(request): + model = (type(request.tender).criteria.model_class.requirementGroups.model_class + .requirements.model_class + .eligibleEvidences.model_class) + return validate_data(request, model, True) + + +def validate_requirement_response_data(request): + update_logging_context(request, {"requirement_response_id": "__new__"}) + model = type(request.tender).bids.model_class.requirementResponses.model_class + return validate_data(request, model, bulk="full") + + +def validate_patch_requirement_response_data(request): + model = type(request.tender).bids.model_class.requirementResponses.model_class + return validate_data(request, model, True) + + +def validate_evidence_data(request): + update_logging_context(request, {"evidence_id": "__new__"}) + model = type(request.tender).bids.model_class.requirementResponses.model_class.evidences.model_class + return validate_data(request, model) + + +def validate_patch_evidence_data(request): + model = type(request.tender).bids.model_class.requirementResponses.model_class.evidences.model_class + return validate_data(request, model, True) + + +class ValidateSelfEligibleMixin(Model): + def validate_selfEligible(self, data, value): + tender = get_root(data["__parent__"]) + if get_first_revision_date(tender, default=get_now()) > RELEASE_ECRITERIA_ARTICLE_17: + if value is not None: + raise ValidationError("Rogue field.") + elif value is None: + raise ValidationError("This field is required.") diff --git a/src/openprocurement/tender/core/views/award_rr.py b/src/openprocurement/tender/core/views/award_rr.py new file mode 100644 index 0000000000..c360e3f34f --- /dev/null +++ b/src/openprocurement/tender/core/views/award_rr.py @@ -0,0 +1,49 @@ +# -*- coding: utf-8 -*- +from openprocurement.api.utils import json_view +from openprocurement.tender.core.validation import ( + validate_requirement_response_data, + validate_patch_requirement_response_data, + validate_operation_award_requirement_response, +) +from openprocurement.tender.core.views.requirement_response import BaseRequirementResponseResource + + +class BaseAwardRequirementResponseResource(BaseRequirementResponseResource): + + @json_view( + content_type="application/json", + validators=( + validate_operation_award_requirement_response, + validate_requirement_response_data, + ), + permission="edit_tender" + ) + def collection_post(self): + return super(BaseAwardRequirementResponseResource, self).collection_post() + + @json_view(permission="view_tender") + def collection_get(self): + return super(BaseAwardRequirementResponseResource, self).collection_get() + + @json_view(permission="view_tender") + def get(self): + return super(BaseAwardRequirementResponseResource, self).get() + + @json_view( + content_type="application/json", + validators=( + validate_operation_award_requirement_response, + validate_patch_requirement_response_data, + ), + permission="edit_tender" + ) + def patch(self): + return super(BaseAwardRequirementResponseResource, self).patch() + + @json_view( + validators=(validate_operation_award_requirement_response,), + permission="edit_bid", + ) + def delete(self): + return super(BaseAwardRequirementResponseResource, self).delete() + diff --git a/src/openprocurement/tender/core/views/award_rr_evidence.py b/src/openprocurement/tender/core/views/award_rr_evidence.py new file mode 100644 index 0000000000..6a3f399141 --- /dev/null +++ b/src/openprocurement/tender/core/views/award_rr_evidence.py @@ -0,0 +1,51 @@ +# -*- coding: utf-8 -*- +from openprocurement.api.utils import ( + json_view, +) +from openprocurement.tender.core.validation import ( + validate_evidence_data, + validate_patch_evidence_data, + validate_operation_award_requirement_response, +) +from openprocurement.tender.core.views.requirement_response_evidence import BaseRequirementResponseEvidenceResource + + +class BaseAwardRequirementResponseEvidenceResource(BaseRequirementResponseEvidenceResource): + + @json_view( + content_type="application/json", + validators=( + validate_operation_award_requirement_response, + validate_evidence_data, + ), + permission="edit_tender" + ) + def collection_post(self): + return super(BaseAwardRequirementResponseEvidenceResource, self).collection_post() + + @json_view(permission="view_tender") + def collection_get(self): + return super(BaseAwardRequirementResponseEvidenceResource, self).collection_get() + + @json_view(permission="view_tender") + def get(self): + return super(BaseAwardRequirementResponseEvidenceResource, self).get() + + @json_view( + content_type="application/json", + validators=( + validate_operation_award_requirement_response, + validate_patch_evidence_data, + ), + permission="edit_tender" + ) + def patch(self): + return super(BaseAwardRequirementResponseEvidenceResource, self).patch() + + @json_view( + validators=(validate_operation_award_requirement_response,), + permission="edit_bid", + ) + def delete(self): + return super(BaseAwardRequirementResponseEvidenceResource, self).delete() + diff --git a/src/openprocurement/tender/core/views/bid_rr.py b/src/openprocurement/tender/core/views/bid_rr.py new file mode 100644 index 0000000000..b88872c029 --- /dev/null +++ b/src/openprocurement/tender/core/views/bid_rr.py @@ -0,0 +1,55 @@ +# -*- coding: utf-8 -*- +from openprocurement.api.utils import json_view +from openprocurement.tender.core.validation import ( + validate_requirement_response_data, + validate_patch_requirement_response_data, + validate_operation_ecriteria_objects, + validate_operation_bid_requirement_response, + +) +from openprocurement.tender.core.views.requirement_response import BaseRequirementResponseResource + + +class BaseBidRequirementResponseResource(BaseRequirementResponseResource): + + @json_view( + content_type="application/json", + validators=( + validate_operation_ecriteria_objects, + validate_requirement_response_data, + validate_operation_bid_requirement_response, + ), + permission="edit_bid", + ) + def collection_post(self): + return super(BaseBidRequirementResponseResource, self).collection_post() + + @json_view(permission="view_tender") + def collection_get(self): + return super(BaseBidRequirementResponseResource, self).collection_get() + + @json_view(permission="view_tender") + def get(self): + return super(BaseBidRequirementResponseResource, self).get() + + @json_view( + content_type="application/json", + validators=( + validate_operation_ecriteria_objects, + validate_patch_requirement_response_data, + validate_operation_bid_requirement_response, + ), + permission="edit_bid", + ) + def patch(self): + return super(BaseBidRequirementResponseResource, self).patch() + + @json_view( + validators=( + validate_operation_ecriteria_objects, + validate_operation_bid_requirement_response, + ), + permission="edit_bid", + ) + def delete(self): + return super(BaseBidRequirementResponseResource, self).delete() diff --git a/src/openprocurement/tender/core/views/bid_rr_evidence.py b/src/openprocurement/tender/core/views/bid_rr_evidence.py new file mode 100644 index 0000000000..0f3960316a --- /dev/null +++ b/src/openprocurement/tender/core/views/bid_rr_evidence.py @@ -0,0 +1,54 @@ +# -*- coding: utf-8 -*- +from openprocurement.api.utils import json_view +from openprocurement.tender.core.validation import ( + validate_evidence_data, + validate_patch_evidence_data, + validate_operation_ecriteria_objects, + validate_operation_bid_requirement_response, +) +from openprocurement.tender.core.views.requirement_response_evidence import BaseRequirementResponseEvidenceResource + + +class BaseBidRequirementResponseEvidenceResource(BaseRequirementResponseEvidenceResource): + + @json_view( + content_type="application/json", + validators=( + validate_operation_ecriteria_objects, + validate_operation_bid_requirement_response, + validate_evidence_data, + ), + permission="edit_bid", + ) + def collection_post(self): + return super(BaseBidRequirementResponseEvidenceResource, self).collection_post() + + @json_view(permission="view_tender") + def collection_get(self): + return super(BaseBidRequirementResponseEvidenceResource, self).collection_get() + + @json_view(permission="view_tender") + def get(self): + return super(BaseBidRequirementResponseEvidenceResource, self).get() + + @json_view( + content_type="application/json", + validators=( + validate_operation_ecriteria_objects, + validate_operation_bid_requirement_response, + validate_patch_evidence_data, + ), + permission="edit_bid", + ) + def patch(self): + return super(BaseBidRequirementResponseEvidenceResource, self).patch() + + @json_view( + validators=( + validate_operation_ecriteria_objects, + validate_operation_bid_requirement_response, + ), + permission="edit_bid", + ) + def delete(self): + return super(BaseBidRequirementResponseEvidenceResource, self).delete() diff --git a/src/openprocurement/tender/core/views/criterion.py b/src/openprocurement/tender/core/views/criterion.py new file mode 100644 index 0000000000..6de157a64c --- /dev/null +++ b/src/openprocurement/tender/core/views/criterion.py @@ -0,0 +1,82 @@ +# -*- coding: utf-8 -*- +from openprocurement.api.utils import ( + json_view, + context_unpack, + APIResource, +) +from openprocurement.tender.core.utils import save_tender, apply_patch +from openprocurement.tender.core.validation import ( + validate_criterion_data, + validate_patch_criterion_data, + validate_operation_ecriteria_objects, + validate_patch_exclusion_ecriteria_objects, +) + + +class BaseTenderCriteriaResource(APIResource): + + @json_view( + content_type="application/json", + validators=( + validate_operation_ecriteria_objects, + validate_criterion_data, + ), + permission="edit_tender" + ) + def collection_post(self): + + criterions = self.request.validated["criterions"] + self.request.context.criteria.extend(criterions) + tender = self.request.validated["tender"] + + if ( + self.request.authenticated_role == "tender_owner" + and tender.status == "active.tendering" + and hasattr(tender, "invalidate_bids_data") + ): + tender.invalidate_bids_data() + + if save_tender(self.request): + for criterion in criterions: + self.LOGGER.info( + "Created tender criterion {}".format(criterion.id), + extra=context_unpack( + self.request, {"MESSAGE_ID": "tender_criterion_create"}, {"criterion_id": criterion.id} + ), + ) + + self.request.response.status = 201 + + return {"data": [i.serialize("view") for i in criterions]} + + @json_view(permission="view_tender") + def collection_get(self): + return {"data": [i.serialize("view") for i in self.request.context.criteria]} + + @json_view(permission="view_tender") + def get(self): + return {"data": self.request.validated["criterion"].serialize("view")} + + @json_view( + content_type="application/json", + validators=( + validate_operation_ecriteria_objects, + validate_patch_exclusion_ecriteria_objects, + validate_patch_criterion_data, + ), + permission="edit_tender" + ) + def patch(self): + criterion = self.request.context + tender = self.request.validated["tender"] + apply_patch(self.request, save=False, src=criterion.serialize()) + + if self.request.authenticated_role == "tender_owner" and hasattr(tender, "invalidate_bids_data"): + tender.invalidate_bids_data() + + if save_tender(self.request): + self.LOGGER.info( + "Updated tender criterion {}".format(criterion.id), + extra=context_unpack(self.request, {"MESSAGE_ID": "tender_criterion_patch"}), + ) + return {"data": criterion.serialize("view")} diff --git a/src/openprocurement/tender/core/views/criterion_rg.py b/src/openprocurement/tender/core/views/criterion_rg.py new file mode 100644 index 0000000000..825dbeebdd --- /dev/null +++ b/src/openprocurement/tender/core/views/criterion_rg.py @@ -0,0 +1,86 @@ +# -*- coding: utf-8 -*- +from openprocurement.api.utils import ( + json_view, + context_unpack, + APIResource, +) +from openprocurement.tender.core.utils import save_tender, apply_patch +from openprocurement.tender.core.validation import ( + validate_requirement_group_data, + validate_patch_requirement_group_data, + validate_operation_ecriteria_objects, + validate_patch_exclusion_ecriteria_objects, +) + + +class BaseTenderCriteriaRGResource(APIResource): + + @json_view( + content_type="application/json", + validators=( + validate_operation_ecriteria_objects, + validate_patch_exclusion_ecriteria_objects, + validate_requirement_group_data, + ), + permission="edit_tender" + ) + def collection_post(self): + + requirement_group = self.request.validated["requirementgroup"] + self.request.context.requirementGroups.append(requirement_group) + tender = self.request.validated["tender"] + if ( + self.request.authenticated_role == "tender_owner" + and tender.status == "active.tendering" + and hasattr(tender, "invalidate_bids_data") + ): + tender.invalidate_bids_data() + + if save_tender(self.request): + self.LOGGER.info( + "Created criteria requirement group {}".format(requirement_group.id), + extra=context_unpack( + self.request, + {"MESSAGE_ID": "criteria_requirement_group_create"}, + {"requirement_group_id": requirement_group.id}, + ), + ) + self.request.response.status = 201 + self.request.response.headers["Location"] = self.request.route_url( + "{}:Criteria Requirement Group".format(self.request.validated["tender"].procurementMethodType), + tender_id=self.request.validated["tender_id"], + criterion_id=self.request.validated["criterion"].id, + requirement_group_id=requirement_group.id, + ) + return {"data": requirement_group.serialize("view")} + + @json_view(permission="view_tender") + def collection_get(self): + return {"data": [i.serialize("view") for i in self.request.context.requirementGroups]} + + @json_view(permission="view_tender") + def get(self): + return {"data": self.request.validated["requirement_group"].serialize("view")} + + @json_view( + content_type="application/json", + validators=( + validate_operation_ecriteria_objects, + validate_patch_exclusion_ecriteria_objects, + validate_patch_requirement_group_data, + ), + permission="edit_tender" + ) + def patch(self): + requirement_group = self.request.context + apply_patch(self.request, save=False, src=requirement_group.serialize()) + tender = self.request.validated["tender"] + if self.request.authenticated_role == "tender_owner" and hasattr(tender, "invalidate_bids_data"): + tender.invalidate_bids_data() + + if save_tender(self.request): + self.LOGGER.info( + "Updated criteria requirement group {}".format(requirement_group.id), + extra=context_unpack(self.request, {"MESSAGE_ID": "criteria_requirement_group_patch"}), + ) + return {"data": requirement_group.serialize("view")} diff --git a/src/openprocurement/tender/core/views/criterion_rg_requirement.py b/src/openprocurement/tender/core/views/criterion_rg_requirement.py new file mode 100644 index 0000000000..b8bcdfa91f --- /dev/null +++ b/src/openprocurement/tender/core/views/criterion_rg_requirement.py @@ -0,0 +1,88 @@ +# -*- coding: utf-8 -*- +from openprocurement.api.utils import ( + json_view, + context_unpack, + APIResource, +) +from openprocurement.tender.core.utils import save_tender, apply_patch +from openprocurement.tender.core.validation import ( + validate_requirement_data, + validate_patch_requirement_data, + validate_operation_ecriteria_objects, + validate_patch_exclusion_ecriteria_objects, +) + + +class BaseTenderCriteriaRGRequirementResource(APIResource): + + @json_view( + content_type="application/json", + validators=( + validate_operation_ecriteria_objects, + validate_patch_exclusion_ecriteria_objects, + validate_requirement_data, + ), + permission="edit_tender" + ) + def collection_post(self): + + requirement = self.request.validated["requirement"] + self.request.context.requirements.append(requirement) + tender = self.request.validated["tender"] + if ( + self.request.authenticated_role == "tender_owner" + and tender.status == "active.tendering" + and hasattr(tender, "invalidate_bids_data") + ): + tender.invalidate_bids_data() + + if save_tender(self.request): + self.LOGGER.info( + "Created requirement group requirement {}".format(requirement.id), + extra=context_unpack( + self.request, + {"MESSAGE_ID": "requirement_group_requirement_create"}, + {"requirement_id": requirement.id}, + ), + ) + self.request.response.status = 201 + self.request.response.headers["Location"] = self.request.route_url( + "{}:Requirement Group Requirement".format(self.request.validated["tender"].procurementMethodType), + tender_id=self.request.validated["tender_id"], + criterion_id=self.request.validated["criterion"].id, + requirement_group_id=self.request.validated["requirement_group"].id, + requirement_id=requirement.id + ) + return {"data": requirement.serialize("view")} + + @json_view(permission="view_tender") + def collection_get(self): + return {"data": [i.serialize("view") for i in self.request.context.requirements]} + + @json_view(permission="view_tender") + def get(self): + return {"data": self.request.validated["requirement"].serialize("view")} + + @json_view( + content_type="application/json", + validators=( + validate_operation_ecriteria_objects, + validate_patch_exclusion_ecriteria_objects, + validate_patch_requirement_data, + ), + permission="edit_tender" + ) + def patch(self): + requirement = self.request.context + apply_patch(self.request, save=False, src=requirement.serialize()) + tender = self.request.validated["tender"] + + if self.request.authenticated_role == "tender_owner" and hasattr(tender, "invalidate_bids_data"): + tender.invalidate_bids_data() + + if save_tender(self.request): + self.LOGGER.info( + "Updated {}".format(requirement.id), + extra=context_unpack(self.request, {"MESSAGE_ID": "requirement_group_requirement_patch"}), + ) + return {"data": requirement.serialize("view")} diff --git a/src/openprocurement/tender/core/views/criterion_rg_requirement_evidence.py b/src/openprocurement/tender/core/views/criterion_rg_requirement_evidence.py new file mode 100644 index 0000000000..42eb6f38ca --- /dev/null +++ b/src/openprocurement/tender/core/views/criterion_rg_requirement_evidence.py @@ -0,0 +1,113 @@ +# -*- coding: utf-8 -*- +from openprocurement.api.utils import ( + json_view, + context_unpack, + APIResource, +) +from openprocurement.tender.core.utils import save_tender, apply_patch +from openprocurement.tender.core.validation import ( + validate_eligible_evidence_data, + validate_patch_eligible_evidence_data, + validate_operation_ecriteria_objects, +) + + +class BaseTenderCriteriaRGRequirementEvidenceResource(APIResource): + + @json_view( + content_type="application/json", + validators=( + validate_operation_ecriteria_objects, + validate_eligible_evidence_data, + ), + permission="edit_tender" + ) + def collection_post(self): + + evidence = self.request.validated["evidence"] + tender = self.request.validated["tender"] + self.request.context.eligibleEvidences.append(evidence) + + if ( + self.request.authenticated_role == "tender_owner" + and tender.status == "active.tendering" + and hasattr(tender, "invalidate_bids_data") + ): + tender.invalidate_bids_data() + + if save_tender(self.request): + self.LOGGER.info( + "Created requirement eligible evidence {}".format(evidence.id), + extra=context_unpack( + self.request, + {"MESSAGE_ID": "requirement_eligible_evidence_create"}, + {"evidence_id": evidence.id}, + ), + ) + self.request.response.status = 201 + self.request.response.headers["Location"] = self.request.route_url( + "{}:Requirement Eligible Evidence".format(self.request.validated["tender"].procurementMethodType), + tender_id=self.request.validated["tender_id"], + criterion_id=self.request.validated["criterion"].id, + requirement_group_id=self.request.validated["requirement_group"].id, + requirement_id=self.request.validated["requirement"].id, + evidence_id=evidence.id, + ) + return {"data": evidence.serialize("view")} + + @json_view(permission="view_tender") + def collection_get(self): + return {"data": [i.serialize("view") for i in self.request.context.eligibleEvidences]} + + @json_view(permission="view_tender") + def get(self): + return {"data": self.request.context.serialize("view")} + + @json_view( + content_type="application/json", + validators=( + validate_operation_ecriteria_objects, + validate_patch_eligible_evidence_data, + ), + permission="edit_tender" + ) + def patch(self): + evidence = self.request.context + apply_patch(self.request, save=False, src=evidence.serialize()) + tender = self.request.validated["tender"] + if self.request.authenticated_role == "tender_owner" and hasattr(tender, "invalidate_bids_data"): + tender.invalidate_bids_data() + + if save_tender(self.request): + self.LOGGER.info( + "Updated requirement eligible evidence {}".format(evidence.id), + extra=context_unpack(self.request, {"MESSAGE_ID": "requirement_eligible_evidence_patch"}), + ) + return {"data": evidence.serialize("view")} + + @json_view( + validators=( + validate_operation_ecriteria_objects, + ), + permission="edit_tender" + ) + def delete(self): + evidence = self.request.context + res = evidence.serialize("view") + self.request.validated["requirement"].eligibleEvidences.remove(evidence) + self.request.validated["tender"].modified = False + tender = self.request.validated["tender"] + + if ( + self.request.authenticated_role == "tender_owner" + and tender.status == "active.tendering" + and hasattr(tender, "invalidate_bids_data") + ): + tender.invalidate_bids_data() + + if save_tender(self.request): + self.LOGGER.info( + "Deleted requirement eligible evidence {}".format(self.request.context.id), + extra=context_unpack(self.request, {"MESSAGE_ID": "requirement_eligible_evidence_delete"}), + ) + return {"data": res} diff --git a/src/openprocurement/tender/core/views/requirement_response.py b/src/openprocurement/tender/core/views/requirement_response.py new file mode 100644 index 0000000000..de6c9eb73e --- /dev/null +++ b/src/openprocurement/tender/core/views/requirement_response.py @@ -0,0 +1,59 @@ +# -*- coding: utf-8 -*- +from openprocurement.api.utils import context_unpack, APIResource +from openprocurement.tender.core.utils import save_tender, apply_patch + + +class BaseRequirementResponseResource(APIResource): + + def collection_post(self): + + requirement_responses = self.request.validated["requirementresponses"] + self.request.context.requirementResponses.extend(requirement_responses) + + context_name = self.request.context.__class__.__name__.lower() + + if save_tender(self.request): + for requirement_response in requirement_responses: + self.LOGGER.info( + "Created {} requirement response {}".format(context_name, requirement_response.id), + extra=context_unpack( + self.request, + {"MESSAGE_ID": "{}_requirement_response_create".format(context_name)}, + {"requirement_response_id": requirement_response.id}, + ), + ) + self.request.response.status = 201 + + return {"data": [i.serialize("view") for i in requirement_responses]} + + def collection_get(self): + return {"data": [i.serialize("view") for i in self.request.context.requirementResponses]} + + def get(self): + return {"data": self.request.context.serialize("view")} + + def patch(self): + requirement_response = self.request.context + context_name = self.request.context["__parent__"].__class__.__name__.lower() + apply_patch(self.request, save=False, src=requirement_response.serialize()) + + if save_tender(self.request): + self.LOGGER.info( + "Updated {} requirement response {}".format(context_name, requirement_response.id), + extra=context_unpack(self.request, {"MESSAGE_ID": "{}_requirement_response_patch".format(context_name)}), + ) + return {"data": requirement_response.serialize("view")} + + def delete(self): + rr = self.request.context + context_name = rr["__parent__"].__class__.__name__.lower() + res = rr.serialize("view") + + self.request.validated[context_name].requirementResponses.remove(rr) + self.request.validated["tender"].modified = False + if save_tender(self.request): + self.LOGGER.info( + "Deleted {} requirement response {}".format(context_name, self.request.context.id), + extra=context_unpack(self.request, {"MESSAGE_ID": "{}_requirement_response_delete".format(context_name)}), + ) + return {"data": res} diff --git a/src/openprocurement/tender/core/views/requirement_response_evidence.py b/src/openprocurement/tender/core/views/requirement_response_evidence.py new file mode 100644 index 0000000000..5a3379d0c9 --- /dev/null +++ b/src/openprocurement/tender/core/views/requirement_response_evidence.py @@ -0,0 +1,65 @@ +# -*- coding: utf-8 -*- +from openprocurement.api.utils import ( + json_view, + context_unpack, + APIResource, +) +from openprocurement.tender.core.utils import save_tender, apply_patch + + +class BaseRequirementResponseEvidenceResource(APIResource): + + def collection_post(self): + context_name = self.request.context["__parent__"].__class__.__name__.lower() + evidence = self.request.validated["evidence"] + self.request.context.evidences.append(evidence) + if save_tender(self.request): + self.LOGGER.info( + "Created {} requirement response evidence {}".format(context_name, evidence.id), + extra=context_unpack( + self.request, + {"MESSAGE_ID": "{}_requirement_response_evidence_create".format(context_name)}, + {"evidence_id": evidence.id}, + ), + ) + self.request.response.status = 201 + evidence_route = self.request.matched_route.name.replace("collection_", "") + self.request.response.headers["Location"] = self.request.current_route_url( + _route_name=evidence_route, evidence_id=evidence.id, _query={} + ) + return {"data": evidence.serialize("view")} + + def collection_get(self): + return {"data": [i.serialize("view") for i in self.request.context.evidences]} + + def get(self): + return {"data": self.request.context.serialize("view")} + + def patch(self): + evidence = self.request.context + context_name = self.request.context["__parent__"]["__parent__"].__class__.__name__.lower() + apply_patch(self.request, save=False, src=evidence.serialize()) + + if save_tender(self.request): + self.LOGGER.info( + "Updated {} requirement response evidence {}".format(context_name, evidence.id), + extra=context_unpack( + self.request, + {"MESSAGE_ID": "{}_requirement_response_evidence_patch".format(context_name)} + ), + ) + return {"data": evidence.serialize("view")} + + def delete(self): + evidence = self.request.context + context_name = evidence["__parent__"]["__parent__"].__class__.__name__.lower() + res = evidence.serialize("view") + + self.request.validated["requirement_response"].evidences.remove(evidence) + self.request.validated["tender"].modified = False + if save_tender(self.request): + self.LOGGER.info( + "Deleted {} evidence {}".format(context_name, self.request.context.id), + extra=context_unpack(self.request, {"MESSAGE_ID": "{}_evidence_delete".format(context_name)}), + ) + return {"data": res} diff --git a/src/openprocurement/tender/esco/models.py b/src/openprocurement/tender/esco/models.py index e8a0ecbfd2..8e7af4fb35 100644 --- a/src/openprocurement/tender/esco/models.py +++ b/src/openprocurement/tender/esco/models.py @@ -1,8 +1,6 @@ # -*- coding: utf-8 -*- from decimal import Decimal -from datetime import timedelta from zope.interface import implementer -from iso8601 import parse_date from pyramid.security import Allow from schematics.types import StringType, FloatType, IntType, URLType, BooleanType from schematics.types.compound import ModelType @@ -11,8 +9,8 @@ from schematics.transforms import whitelist, blacklist from barbecue import vnmax from esculator import npv, escp -from openprocurement.api.utils import get_now -from openprocurement.api.constants import TZ +from openprocurement.api.utils import get_now, is_new_created, get_root, get_first_revision_date +from openprocurement.api.constants import TZ, CPV_ITEMS_CLASS_FROM, RELEASE_ECRITERIA_ARTICLE_17 from openprocurement.api.auth import ACCR_3, ACCR_4, ACCR_5 from openprocurement.api.validation import validate_cpv_group, validate_items_uniq from openprocurement.api.models import ( @@ -52,12 +50,12 @@ has_unanswered_questions, has_unanswered_complaints, calculate_complaint_business_date, - calculate_clarifications_business_date, + calculate_clarif_business_date, + check_auction_period, extend_next_check_by_complaint_period_ends, ) -from openprocurement.tender.core.constants import CPV_ITEMS_CLASS_FROM from openprocurement.tender.openua.models import Tender as OpenUATender -from openprocurement.tender.openua.constants import COMPLAINT_SUBMIT_TIME, ENQUIRY_STAND_STILL_TIME, AUCTION_PERIOD_TIME +from openprocurement.tender.openua.constants import COMPLAINT_SUBMIT_TIME, ENQUIRY_STAND_STILL_TIME from openprocurement.tender.openeu.models import ( IAboveThresholdEUTender, Bid as BaseEUBid, @@ -74,9 +72,12 @@ Contract as BaseEUContract, BidModelType, ) -from openprocurement.tender.openeu.constants import TENDERING_DURATION, QUESTIONS_STAND_STILL, TENDERING_DAYS +from openprocurement.tender.openeu.constants import TENDERING_DURATION, QUESTIONS_STAND_STILL from openprocurement.tender.esco.utils import to_decimal - +from openprocurement.tender.openua.validation import ( + validate_tender_period_start_date, + validate_tender_period_duration, +) view_value_role_esco = whitelist( "amount", @@ -420,6 +421,12 @@ def validate_value(self, data, value): u"valueAddedTaxIncluded of bid should be identical to valueAddedTaxIncluded of minValue of tender" ) + def validate_selfEligible(self, data, value): + tender = get_root(data["__parent__"]) + if get_first_revision_date(tender, default=get_now()) > RELEASE_ECRITERIA_ARTICLE_17: + if value is not None: + raise ValidationError("Rogue field.") + class FeatureValue(BaseFeatureValue): value = FloatType(required=True, min_value=0.0, max_value=0.25) @@ -666,21 +673,21 @@ def __acl__(self): @serializable(serialized_name="enquiryPeriod", type=ModelType(EnquiryPeriod)) def tender_enquiryPeriod(self): - endDate = calculate_tender_business_date(self.tenderPeriod.endDate, -QUESTIONS_STAND_STILL, self) - clarificationsUntil = calculate_clarifications_business_date(endDate, ENQUIRY_STAND_STILL_TIME, self, True) + end_date = calculate_tender_business_date(self.tenderPeriod.endDate, -QUESTIONS_STAND_STILL, self) + clarifications_until = calculate_clarif_business_date(end_date, ENQUIRY_STAND_STILL_TIME, self, True) return EnquiryPeriod( dict( startDate=self.tenderPeriod.startDate, - endDate=endDate, + endDate=end_date, invalidationDate=self.enquiryPeriod and self.enquiryPeriod.invalidationDate, - clarificationsUntil=clarificationsUntil, + clarificationsUntil=clarifications_until, ) ) @serializable(type=ModelType(Period)) def complaintPeriod(self): - endDate = calculate_complaint_business_date(self.tenderPeriod.endDate, -COMPLAINT_SUBMIT_TIME, self) - return Period(dict(startDate=self.tenderPeriod.startDate, endDate=endDate)) + end_date = calculate_complaint_business_date(self.tenderPeriod.endDate, -COMPLAINT_SUBMIT_TIME, self) + return Period(dict(startDate=self.tenderPeriod.startDate, endDate=end_date)) @serializable(serialize_when_none=False) def next_check(self): @@ -717,8 +724,12 @@ def next_check(self): ): if now < self.auctionPeriod.startDate: checks.append(self.auctionPeriod.startDate.astimezone(TZ)) - elif now < calc_auction_end_time(self.numberOfBids, self.auctionPeriod.startDate).astimezone(TZ): - checks.append(calc_auction_end_time(self.numberOfBids, self.auctionPeriod.startDate).astimezone(TZ)) + else: + auction_end_time = calc_auction_end_time( + self.numberOfBids, self.auctionPeriod.startDate + ).astimezone(TZ) + if now < auction_end_time: + checks.append(auction_end_time) elif self.lots and self.status == "active.auction": for lot in self.lots: if ( @@ -730,8 +741,12 @@ def next_check(self): continue if now < lot.auctionPeriod.startDate: checks.append(lot.auctionPeriod.startDate.astimezone(TZ)) - elif now < calc_auction_end_time(lot.numberOfBids, lot.auctionPeriod.startDate).astimezone(TZ): - checks.append(calc_auction_end_time(lot.numberOfBids, lot.auctionPeriod.startDate).astimezone(TZ)) + else: + auction_end_time = calc_auction_end_time( + lot.numberOfBids, lot.auctionPeriod.startDate + ).astimezone(TZ) + if now < auction_end_time: + checks.append(auction_end_time) elif ( not self.lots and self.status == "active.awarded" @@ -889,11 +904,10 @@ def validate_minimalStep(self, data, value): pass def validate_tenderPeriod(self, data, period): - # if data['_rev'] is None when tender was created just now - if not data["_rev"] and calculate_tender_business_date(get_now(), -timedelta(minutes=10)) >= period.startDate: - raise ValidationError(u"tenderPeriod.startDate should be in greater than current date") - if period and calculate_tender_business_date(period.startDate, TENDERING_DURATION, data) > period.endDate: - raise ValidationError(u"tenderPeriod should be greater than {} days".format(TENDERING_DAYS)) + if period: + if is_new_created(data): + validate_tender_period_start_date(data, period) + validate_tender_period_duration(data, period, TENDERING_DURATION) def validate_awardPeriod(self, data, period): if ( @@ -928,26 +942,10 @@ def validate_yearlyPaymentsPercentageRange(self, data, value): ) def check_auction_time(self): - if ( - self.auctionPeriod - and self.auctionPeriod.startDate - and self.auctionPeriod.shouldStartAfter - and self.auctionPeriod.startDate - > calculate_tender_business_date( - parse_date(self.auctionPeriod.shouldStartAfter), AUCTION_PERIOD_TIME, self, True - ) - ): + if check_auction_period(self.auctionPeriod, self): self.auctionPeriod.startDate = None for lot in self.lots: - if ( - lot.auctionPeriod - and lot.auctionPeriod.startDate - and lot.auctionPeriod.shouldStartAfter - and lot.auctionPeriod.startDate - > calculate_tender_business_date( - parse_date(lot.auctionPeriod.shouldStartAfter), AUCTION_PERIOD_TIME, self, True - ) - ): + if check_auction_period(lot.auctionPeriod, self): lot.auctionPeriod.startDate = None def invalidate_bids_data(self): diff --git a/src/openprocurement/tender/esco/subscribers.py b/src/openprocurement/tender/esco/subscribers.py index 7e7b68ba2e..a8dfbbaa2a 100644 --- a/src/openprocurement/tender/esco/subscribers.py +++ b/src/openprocurement/tender/esco/subscribers.py @@ -3,7 +3,7 @@ from openprocurement.tender.core.utils import ( get_now, calculate_tender_business_date, - calculate_clarifications_business_date, + calculate_clarif_business_date, ) from openprocurement.tender.core.models import EnquiryPeriod from openprocurement.tender.openua.constants import ENQUIRY_STAND_STILL_TIME @@ -14,14 +14,14 @@ def tender_init_handler(event): """ initialization handler for esco tenders """ tender = event.tender - endDate = calculate_tender_business_date(tender.tenderPeriod.endDate, -QUESTIONS_STAND_STILL, tender) - clarificationsUntil = calculate_clarifications_business_date(endDate, ENQUIRY_STAND_STILL_TIME, tender, True) + end_date = calculate_tender_business_date(tender.tenderPeriod.endDate, -QUESTIONS_STAND_STILL, tender) + clarifications_until = calculate_clarif_business_date(end_date, ENQUIRY_STAND_STILL_TIME, tender, True) tender.enquiryPeriod = EnquiryPeriod( dict( startDate=tender.tenderPeriod.startDate, - endDate=endDate, + endDate=end_date, invalidationDate=tender.enquiryPeriod and tender.enquiryPeriod.invalidationDate, - clarificationsUntil=clarificationsUntil, + clarificationsUntil=clarifications_until, ) ) now = get_now() diff --git a/src/openprocurement/tender/esco/tests/auction.py b/src/openprocurement/tender/esco/tests/auction.py index f60fc7f4a8..e99f99d18f 100644 --- a/src/openprocurement/tender/esco/tests/auction.py +++ b/src/openprocurement/tender/esco/tests/auction.py @@ -100,21 +100,16 @@ def setUp(self): class TenderSameValueAuctionResourceTest(BaseESCOContentWebTest): initial_status = "active.auction" tenderer_info = deepcopy(test_bids[0]["tenderers"]) - initial_bids = [ - { - "tenderers": tenderer_info, - "value": { - "yearlyPaymentsPercentage": 0.9, - "annualCostsReduction": [751.5] * 21, - "contractDuration": {"years": 10, "days": 10}, - }, - "selfQualified": True, - "selfEligible": True, - } - for i in range(3) - ] def setUp(self): + bid_data = deepcopy(test_bids[0]) + bid_data["value"] = { + "yearlyPaymentsPercentage": 0.9, + "annualCostsReduction": [751.5] * 21, + "contractDuration": {"years": 10, "days": 10}, + } + self.initial_bids = [bid_data for i in range(3)] + super(TenderSameValueAuctionResourceTest, self).setUp() # switch to active.pre-qualification self.set_status("active.pre-qualification", {"status": "active.tendering"}) @@ -183,32 +178,20 @@ class TenderMultipleLotAuctionResourceTest(TenderMultipleLotAuctionResourceTestM class TenderFeaturesAuctionResourceTest(BaseESCOContentWebTest): initial_data = test_features_tender_data tenderer_info = deepcopy(test_bids[0]["tenderers"]) - initial_bids = [ - { - "parameters": [{"code": i["code"], "value": 0.03} for i in test_features_tender_data["features"]], - "tenderers": tenderer_info, - "value": { - "yearlyPaymentsPercentage": 0.9, - "annualCostsReduction": [100] * 21, - "contractDuration": {"years": 10}, - }, - "selfQualified": True, - "selfEligible": True, - }, - { - "parameters": [{"code": i["code"], "value": 0.07} for i in test_features_tender_data["features"]], - "tenderers": tenderer_info, - "value": { - "yearlyPaymentsPercentage": 0.9, - "annualCostsReduction": [100] * 21, - "contractDuration": {"years": 10}, - }, - "selfQualified": True, - "selfEligible": True, - }, - ] def setUp(self): + bid_data_1 = deepcopy(test_bids[0]) + bid_data_1["value"] = { + "yearlyPaymentsPercentage": 0.9, + "annualCostsReduction": [100] * 21, + "contractDuration": {"years": 10}, + } + bid_data_1["parameters"] = [{"code": i["code"], "value": 0.03} for i in test_features_tender_data["features"]] + + bid_data_2 = deepcopy(bid_data_1) + bid_data_2["parameters"] = [{"code": i["code"], "value": 0.07} for i in test_features_tender_data["features"]] + + self.initial_bids = [bid_data_1, bid_data_2] super(TenderFeaturesAuctionResourceTest, self).setUp() prepare_for_auction(self) diff --git a/src/openprocurement/tender/esco/tests/base.py b/src/openprocurement/tender/esco/tests/base.py index fd266e7258..260dafa9c7 100644 --- a/src/openprocurement/tender/esco/tests/base.py +++ b/src/openprocurement/tender/esco/tests/base.py @@ -2,6 +2,7 @@ import os from copy import deepcopy +from openprocurement.tender.esco.models import Tender from openprocurement.tender.openeu.tests.base import ( BaseTenderWebTest, test_features_tender_data as base_eu_test_features_data, @@ -62,6 +63,8 @@ class BaseESCOWebTest(BaseTenderWebTest): initial_auth = ("Basic", ("broker", "")) docservice = False + tender_class = Tender + class BaseESCOContentWebTest(BaseESCOWebTest): """ ESCO Content Test """ diff --git a/src/openprocurement/tender/esco/tests/bid.py b/src/openprocurement/tender/esco/tests/bid.py index ec0a625e96..714921bff4 100644 --- a/src/openprocurement/tender/esco/tests/bid.py +++ b/src/openprocurement/tender/esco/tests/bid.py @@ -1,5 +1,6 @@ # -*- coding: utf-8 -*- import unittest +from copy import deepcopy from esculator import npv, escp from openprocurement.api.utils import get_now @@ -20,7 +21,14 @@ # Tender2LotBidResourceTest patch_tender_with_bids_lots_none, ) -from openprocurement.tender.openeu.tests.bid import TenderBidDocumentResourceTestMixin +from openprocurement.tender.openeu.tests.bid import ( + TenderBidDocumentResourceTestMixin, + CreateBidMixin, +) +from openprocurement.tender.openua.tests.bid import ( + TenderBidRequirementResponseTestMixin, + TenderBidRequirementResponseEvidenceTestMixin, +) from openprocurement.tender.openeu.tests.bid_blanks import ( # TenderBidDocumentWithDSResourceTest patch_tender_bidder_document_private_json, @@ -177,14 +185,6 @@ class TenderBidBatchDocumentsWithDSResourceTest(BaseESCOContentWebTest): docservice = True initial_status = "active.tendering" - bid_data_wo_docs = { - "tenderers": [test_organization], - "value": test_bids[0]["value"], - "selfEligible": True, - "selfQualified": True, - "documents": [], - } - test_create_tender_bid_with_document_invalid = snitch(create_tender_bid_with_document_invalid) test_create_tender_bid_with_document = snitch(create_tender_bid_with_document) test_create_tender_bid_with_documents = snitch(create_tender_bid_with_documents) @@ -207,6 +207,35 @@ class TenderBidBatchDocumentsWithDSResourceTest(BaseESCOContentWebTest): test_create_tender_bid_with_all_documents = snitch(create_tender_bid_with_all_documents) + def setUp(self): + bid_data = deepcopy(test_bids[0]) + bid_data.update({ + "tenderers": [test_organization], + "documents": [] + }) + + self.bid_data_wo_docs = bid_data + + super(TenderBidBatchDocumentsWithDSResourceTest, self).setUp() + + +class TenderBidRequirementResponseResourceTest( + TenderBidRequirementResponseTestMixin, + CreateBidMixin, + BaseESCOContentWebTest, +): + test_bids_data = test_bids + initial_status = "active.tendering" + + +class TenderBidRequirementResponseEvidenceResourceTest( + TenderBidRequirementResponseEvidenceTestMixin, + CreateBidMixin, + BaseESCOContentWebTest, +): + test_bids_data = test_bids + initial_status = "active.tendering" + def suite(): suite = unittest.TestSuite() @@ -216,6 +245,8 @@ def suite(): suite.addTest(TenderBidDocumentWithDSResourceTest) suite.addTest(TenderBidDocumentWithoutDSResourceTest) suite.addTest(TenderBidBatchDocumentsWithDSResourceTest) + suite.addTest(TenderBidRequirementResponseResourceTest) + suite.addTest(TenderBidRequirementResponseEvidenceResourceTest) return suite diff --git a/src/openprocurement/tender/esco/tests/bid_blanks.py b/src/openprocurement/tender/esco/tests/bid_blanks.py index 56b20cf58e..195c0cd8d7 100644 --- a/src/openprocurement/tender/esco/tests/bid_blanks.py +++ b/src/openprocurement/tender/esco/tests/bid_blanks.py @@ -6,6 +6,8 @@ # TenderBidResourceTest from openprocurement.api.utils import get_now +from openprocurement.api.constants import RELEASE_ECRITERIA_ARTICLE_17 +from openprocurement.tender.esco.tests.base import test_bids def create_tender_bid_invalid(self): @@ -138,9 +140,12 @@ def create_tender_bid_invalid(self): ], ) + bid_data = deepcopy(self.test_bids_data[0]) + del bid_data["value"] + response = self.app.post_json( request_path, - {"data": {"selfEligible": True, "selfQualified": True, "tenderers": [self.test_bids_data[0]["tenderers"][0]]}}, + {"data": bid_data}, status=422, ) self.assertEqual(response.status, "422 Unprocessable Entity") @@ -151,16 +156,11 @@ def create_tender_bid_invalid(self): [{u"description": [u"This field is required."], u"location": u"body", u"name": u"value"}], ) + bid_data["value"] = {} + response = self.app.post_json( request_path, - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": [self.test_bids_data[0]["tenderers"][0]], - "value": {}, - } - }, + {"data": bid_data}, status=422, ) self.assertEqual(response.status, "422 Unprocessable Entity") @@ -181,16 +181,10 @@ def create_tender_bid_invalid(self): ], ) + bid_data["value"] = {"amount": 500} response = self.app.post_json( request_path, - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": [self.test_bids_data[0]["tenderers"][0]], - "value": {"amount": 500}, - } - }, + {"data": bid_data}, status=422, ) self.assertEqual(response.status, "422 Unprocessable Entity") @@ -211,16 +205,10 @@ def create_tender_bid_invalid(self): ], ) + bid_data["value"] = {"contractDuration": {"years": 20}} response = self.app.post_json( request_path, - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": [self.test_bids_data[0]["tenderers"][0]], - "value": {"contractDuration": {"years": 20}}, - } - }, + {"data": bid_data}, status=422, ) self.assertEqual(response.status, "422 Unprocessable Entity") @@ -241,16 +229,11 @@ def create_tender_bid_invalid(self): ], ) + bid_data["value"] = {"contractDuration": {"years": 15, "days": 10}} + response = self.app.post_json( request_path, - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": [self.test_bids_data[0]["tenderers"][0]], - "value": {"contractDuration": {"years": 15, "days": 10}}, - } - }, + {"data": bid_data}, status=422, ) self.assertEqual(response.status, "422 Unprocessable Entity") @@ -271,16 +254,11 @@ def create_tender_bid_invalid(self): ], ) + bid_data["value"] = {"contractDuration": {"years": 0, "days": 0}} + response = self.app.post_json( request_path, - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": [self.test_bids_data[0]["tenderers"][0]], - "value": {"contractDuration": {"years": 0, "days": 0}}, - } - }, + {"data": bid_data}, status=422, ) self.assertEqual(response.status, "422 Unprocessable Entity") @@ -301,21 +279,15 @@ def create_tender_bid_invalid(self): ], ) - response = self.app.get("/tenders/{}".format(self.tender_id)) + bid_data["value"] = { + "yearlyPaymentsPercentage": 0, + "contractDuration": {"years": 12}, + "annualCostsReduction": [100] * 21, + + } response = self.app.post_json( request_path, - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": [self.test_bids_data[0]["tenderers"][0]], - "value": { - "yearlyPaymentsPercentage": 0, - "contractDuration": {"years": 12}, - "annualCostsReduction": [100] * 21, - }, - } - }, + {"data": bid_data}, status=422, ) self.assertEqual(response.status, "422 Unprocessable Entity") @@ -336,20 +308,15 @@ def create_tender_bid_invalid(self): ], ) + bid_data["value"] = { + "yearlyPaymentsPercentage": 0.8, + "contractDuration": {"years": 12}, + "annualCostsReduction": [100] * 10, + } + response = self.app.post_json( request_path, - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": [self.test_bids_data[0]["tenderers"][0]], - "value": { - "yearlyPaymentsPercentage": 0.8, - "contractDuration": {"years": 12}, - "annualCostsReduction": [100] * 10, - }, - } - }, + {"data": bid_data}, status=422, ) self.assertEqual(response.status, "422 Unprocessable Entity") @@ -366,21 +333,17 @@ def create_tender_bid_invalid(self): ], ) + bid_data["value"] = { + "yearlyPaymentsPercentage": 0.8, + "contractDuration": {"years": 12}, + "annualCostsReduction": [100] * 21, + "currency": "USD", + } + + response = self.app.post_json( request_path, - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": [self.test_bids_data[0]["tenderers"][0]], - "value": { - "yearlyPaymentsPercentage": 0.8, - "contractDuration": {"years": 12}, - "annualCostsReduction": [100] * 21, - "currency": "USD", - }, - } - }, + {"data": bid_data}, status=422, ) self.assertEqual(response.status, "422 Unprocessable Entity") @@ -397,22 +360,16 @@ def create_tender_bid_invalid(self): ], ) + bid_data["value"] = { + "yearlyPaymentsPercentage": 0.8, + "contractDuration": {"years": 12}, + "annualCostsReduction": [100] * 21, + "currency": "UAH", + "valueAddedTaxIncluded": False, + } response = self.app.post_json( request_path, - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": [self.test_bids_data[0]["tenderers"][0]], - "value": { - "yearlyPaymentsPercentage": 0.8, - "contractDuration": {"years": 12}, - "annualCostsReduction": [100] * 21, - "currency": "UAH", - "valueAddedTaxIncluded": False, - }, - } - }, + {"data": bid_data}, status=422, ) self.assertEqual(response.status, "422 Unprocessable Entity") @@ -527,20 +484,26 @@ def create_tender_bid(self): data = deepcopy(self.test_bids_data[0]) data["selfQualified"] = False - data["selfEligible"] = False + + ecriteria_released = get_now() < RELEASE_ECRITERIA_ARTICLE_17 + if ecriteria_released: + data["selfEligible"] = False response = self.app.post_json("/tenders/{}/bids".format(self.tender_id), {"data": data}) self.assertEqual(response.status, "201 Created") self.assertEqual(response.content_type, "application/json") self.assertEqual(response.json["data"]["selfQualified"], False) - self.assertEqual(response.json["data"]["selfEligible"], False) + if ecriteria_released: + self.assertEqual(response.json["data"]["selfEligible"], False) del data["selfQualified"] - del data["selfEligible"] + if ecriteria_released: + del data["selfEligible"] response = self.app.post_json("/tenders/{}/bids".format(self.tender_id), {"data": data}) self.assertEqual(response.status, "201 Created") self.assertEqual(response.content_type, "application/json") self.assertNotIn("selfQualified", response.json["data"]) - self.assertNotIn("selfEligible", response.json["data"]) + if ecriteria_released: + self.assertNotIn("selfEligible", response.json["data"]) for status in ("active", "unsuccessful", "deleted", "invalid"): data = deepcopy(self.test_bids_data[0]) @@ -775,16 +738,12 @@ def patch_tender_bid(self): def delete_tender_bidder(self): + + bid_data = deepcopy(self.test_bids_data[0]) + response = self.app.post_json( "/tenders/{}/bids".format(self.tender_id), - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": self.test_bids_data[0]["tenderers"], - "value": self.test_bids_data[0]["value"], - } - }, + {"data": bid_data}, ) self.assertEqual(response.status, "201 Created") self.assertEqual(response.content_type, "application/json") @@ -835,14 +794,7 @@ def delete_tender_bidder(self): # create new bid response = self.app.post_json( "/tenders/{}/bids".format(self.tender_id), - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": self.test_bids_data[0]["tenderers"], - "value": self.test_bids_data[0]["value"], - } - }, + {"data": bid_data}, ) self.assertEqual(response.status, "201 Created") bid = response.json["data"] @@ -871,35 +823,20 @@ def delete_tender_bidder(self): self.assertEqual(response.json["data"]["id"], bid["id"]) self.assertEqual(response.json["data"]["status"], "deleted") + bid_data["value"] = { + "annualCostsReduction": [100] * 21, + "yearlyPaymentsPercentage": 0.8, + "contractDuration": {"years": 10}, + } + response = self.app.post_json( "/tenders/{}/bids".format(self.tender_id), { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": self.test_bids_data[0]["tenderers"], - "value": { - "annualCostsReduction": [100] * 21, - "yearlyPaymentsPercentage": 0.8, - "contractDuration": {"years": 10}, - }, - } - }, + "data": bid_data}, ) response = self.app.post_json( "/tenders/{}/bids".format(self.tender_id), - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": self.test_bids_data[1]["tenderers"], - "value": { - "annualCostsReduction": [100] * 21, - "yearlyPaymentsPercentage": 0.8, - "contractDuration": {"years": 8}, - }, - } - }, + {"data": bid_data}, ) # switch to active.pre-qualification @@ -1020,20 +957,20 @@ def bid_Administrator_change(self): bid = response.json["data"] self.app.authorization = ("Basic", ("administrator", "")) + + bid_data = deepcopy(test_bids[0]) + bid_data.update({ + "tenderers": [{"identifier": {"id": "00000000"}}], + "value": { + "annualCostsReduction": [300] * 21, + "yearlyPaymentsPercentage": 0.8, + "contractDuration": {"years": 8}, + } + }) + response = self.app.patch_json( "/tenders/{}/bids/{}".format(self.tender_id, bid["id"]), - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": [{"identifier": {"id": "00000000"}}], - "value": { - "annualCostsReduction": [300] * 21, - "yearlyPaymentsPercentage": 0.8, - "contractDuration": {"years": 8}, - }, - } - }, + {"data": bid_data}, ) self.assertEqual(response.status, "200 OK") self.assertEqual(response.content_type, "application/json") @@ -1149,18 +1086,7 @@ def bids_invalidation_on_tender_change(self): response = self.app.post_json( "/tenders/{}/bids".format(self.tender_id), - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": self.test_bids_data[1]["tenderers"], - "value": { - "annualCostsReduction": [200] * 21, - "yearlyPaymentsPercentage": 0.7, - "contractDuration": {"years": 10, "days": 15}, - }, - } - }, + {"data": data}, ) # switch to active.pre-qualification @@ -1252,21 +1178,17 @@ def bids_invalidation_on_tender_change(self): def deleted_bid_do_not_locks_tender_in_state(self): bids = [] bids_tokens = [] + bid_data = deepcopy(self.test_bids_data[0]) for bid_annual_cost_reduction in ([800] * 21, [750] * 21): + bid_data["value"] = { + "annualCostsReduction": bid_annual_cost_reduction, + "yearlyPaymentsPercentage": 0.9, + "contractDuration": {"years": 10}, + } + response = self.app.post_json( "/tenders/{}/bids".format(self.tender_id), - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": [self.test_bids_data[0]["tenderers"][0]], - "value": { - "annualCostsReduction": bid_annual_cost_reduction, - "yearlyPaymentsPercentage": 0.9, - "contractDuration": {"years": 10}, - }, - } - }, + {"data": bid_data}, ) self.assertEqual(response.status, "201 Created") self.assertEqual(response.content_type, "application/json") @@ -1280,20 +1202,15 @@ def deleted_bid_do_not_locks_tender_in_state(self): self.assertEqual(response.json["data"]["id"], bids[0]["id"]) self.assertEqual(response.json["data"]["status"], "deleted") + bid_data["value"] = { + "annualCostsReduction": [950] * 21, + "yearlyPaymentsPercentage": 0.9, + "contractDuration": {"years": 10}, + } + response = self.app.post_json( "/tenders/{}/bids".format(self.tender_id), - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": [self.test_bids_data[0]["tenderers"][0]], - "value": { - "annualCostsReduction": [950] * 21, - "yearlyPaymentsPercentage": 0.9, - "contractDuration": {"years": 10}, - }, - } - }, + {"data": bid_data}, ) # switch to active.pre-qualification diff --git a/src/openprocurement/tender/esco/tests/criterion.py b/src/openprocurement/tender/esco/tests/criterion.py new file mode 100644 index 0000000000..432e104810 --- /dev/null +++ b/src/openprocurement/tender/esco/tests/criterion.py @@ -0,0 +1,51 @@ +# -*- coding: utf-8 -*- +import unittest + +from openprocurement.tender.belowthreshold.tests.base import test_lots +from openprocurement.tender.esco.tests.base import test_tender_data, BaseESCOContentWebTest +from openprocurement.tender.openua.tests.criterion import ( + TenderCriteriaTestMixin, + TenderCriteriaRGTestMixin, + TenderCriteriaRGRequirementTestMixin, + TenderCriteriaRGRequirementEvidenceTestMixin, +) + + +class TenderCriteriaTest(TenderCriteriaTestMixin, BaseESCOContentWebTest): + initial_data = test_tender_data + test_lots_data = test_lots + initial_status = "draft" + + +class TenderCriteriaRGTest(TenderCriteriaRGTestMixin, BaseESCOContentWebTest): + initial_data = test_tender_data + test_lots_data = test_lots + + +class TenderCriteriaRGRequirementTest( + TenderCriteriaRGRequirementTestMixin, + BaseESCOContentWebTest, +): + initial_data = test_tender_data + test_lots_data = test_lots + + +class TenderCriteriaRGRequirementEvidenceTest( + TenderCriteriaRGRequirementEvidenceTestMixin, + BaseESCOContentWebTest, +): + initial_data = test_tender_data + test_lots_data = test_lots + + +def suite(): + suite = unittest.TestSuite() + suite.addTest(unittest.makeSuite(TenderCriteriaTest)) + suite.addTest(unittest.makeSuite(TenderCriteriaRGTest)) + suite.addTest(unittest.makeSuite(TenderCriteriaRGRequirementTest)) + suite.addTest(unittest.makeSuite(TenderCriteriaRGRequirementEvidenceTest)) + return suite + + +if __name__ == "__main__": + unittest.main(defaultTest="suite") diff --git a/src/openprocurement/tender/esco/tests/lot_blanks.py b/src/openprocurement/tender/esco/tests/lot_blanks.py index 8f3d7fee8e..36724db2b4 100644 --- a/src/openprocurement/tender/esco/tests/lot_blanks.py +++ b/src/openprocurement/tender/esco/tests/lot_blanks.py @@ -149,8 +149,11 @@ def get_tender_lot(self): response = self.app.get("/tenders/{}/lots/{}".format(self.tender_id, lot["id"])) self.assertEqual(response.status, "200 OK") self.assertEqual(response.content_type, "application/json") + api_lot = response.json["data"] + if "auctionPeriod" in api_lot: + api_lot.pop("auctionPeriod") lot.pop("auctionPeriod") - self.assertEqual(response.json["data"], lot) + self.assertEqual(api_lot, lot) response = self.app.get("/tenders/{}/lots/some_id".format(self.tender_id), status=404) self.assertEqual(response.status, "404 Not Found") @@ -202,7 +205,10 @@ def get_tender_lots(self): self.assertEqual(response.status, "200 OK") self.assertEqual(response.content_type, "application/json") lot.pop("auctionPeriod") - self.assertEqual(response.json["data"][0], lot) + api_lot = response.json["data"][0] + if "auctionPeriod" in api_lot: + api_lot.pop("auctionPeriod") + self.assertEqual(api_lot, lot) response = self.app.get("/tenders/some_id/lots", status=404) self.assertEqual(response.status, "404 Not Found") @@ -1012,9 +1018,13 @@ def tender_min_value(self): def create_tender_bid_invalid(self): request_path = "/tenders/{}/bids".format(self.tender_id) + + bid_data = deepcopy(self.test_bids_data[0]) + del bid_data["value"] + response = self.app.post_json( request_path, - {"data": {"selfEligible": True, "selfQualified": True, "tenderers": self.test_bids_data[0]["tenderers"]}}, + {"data": bid_data}, status=422, ) self.assertEqual(response.status, "422 Unprocessable Entity") @@ -1025,16 +1035,10 @@ def create_tender_bid_invalid(self): [{u"description": [u"This field is required."], u"location": u"body", u"name": u"lotValues"}], ) + bid_data["lotValues"] = [{"value": self.test_bids_data[0]["value"]}] response = self.app.post_json( request_path, - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": self.test_bids_data[0]["tenderers"], - "lotValues": [{"value": self.test_bids_data[0]["value"]}], - } - }, + {"data": bid_data}, status=422, ) self.assertEqual(response.status, "422 Unprocessable Entity") @@ -1050,17 +1054,10 @@ def create_tender_bid_invalid(self): } ], ) - + bid_data["lotValues"] = [{"value": self.test_bids_data[0]["value"], "relatedLot": "0" * 32}] response = self.app.post_json( request_path, - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": self.test_bids_data[0]["tenderers"], - "lotValues": [{"value": self.test_bids_data[0]["value"], "relatedLot": "0" * 32}], - } - }, + {"data": bid_data}, status=422, ) self.assertEqual(response.status, "422 Unprocessable Entity") @@ -1089,25 +1086,19 @@ def create_tender_bid_invalid(self): # {u'description': [{u'value': [u'value of bid should be greater than minValue of lot']}], u'location': u'body', u'name': u'lotValues'} # ]) + bid_data["lotValues"] = [ + { + "value": { + "yearlyPaymentsPercentage": 0.9, + "annualCostsReduction": [751.5] * 11, + "contractDuration": {"years": 10}, + }, + "relatedLot": self.initial_lots[0]["id"], + } + ] response = self.app.post_json( request_path, - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": self.test_bids_data[0]["tenderers"], - "lotValues": [ - { - "value": { - "yearlyPaymentsPercentage": 0.9, - "annualCostsReduction": [751.5] * 11, - "contractDuration": {"years": 10}, - }, - "relatedLot": self.initial_lots[0]["id"], - } - ], - } - }, + {"data": bid_data}, status=422, ) self.assertEqual(response.status, "422 Unprocessable Entity") @@ -1126,25 +1117,19 @@ def create_tender_bid_invalid(self): ], ) + bid_data["lotValues"] = [ + { + "value": { + "yearlyPaymentsPercentage": 0.9, + "annualCostsReduction": 751.5, + "contractDuration": {"years": 25}, + }, + "relatedLot": self.initial_lots[0]["id"], + } + ] response = self.app.post_json( request_path, - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": self.test_bids_data[0]["tenderers"], - "lotValues": [ - { - "value": { - "yearlyPaymentsPercentage": 0.9, - "annualCostsReduction": 751.5, - "contractDuration": {"years": 25}, - }, - "relatedLot": self.initial_lots[0]["id"], - } - ], - } - }, + {"data": bid_data}, status=422, ) self.assertEqual(response.status, "422 Unprocessable Entity") @@ -1161,26 +1146,20 @@ def create_tender_bid_invalid(self): ], ) + bid_data["lotValues"] = [ + { + "value": { + "yearlyPaymentsPercentage": 0.8, + "contractDuration": {"years": 12}, + "annualCostsReduction": [100] * 21, + "currency": "USD", + }, + "relatedLot": self.initial_lots[0]["id"], + } + ] response = self.app.post_json( request_path, - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": self.test_bids_data[0]["tenderers"], - "lotValues": [ - { - "value": { - "yearlyPaymentsPercentage": 0.8, - "contractDuration": {"years": 12}, - "annualCostsReduction": [100] * 21, - "currency": "USD", - }, - "relatedLot": self.initial_lots[0]["id"], - } - ], - } - }, + {"data": bid_data}, status=422, ) self.assertEqual(response.status, "422 Unprocessable Entity") @@ -1197,27 +1176,21 @@ def create_tender_bid_invalid(self): ], ) + bid_data["lotValues"] = [ + { + "value": { + "yearlyPaymentsPercentage": 0.8, + "contractDuration": {"years": 12}, + "annualCostsReduction": [100] * 21, + "currency": "UAH", + "valueAddedTaxIncluded": False, + }, + "relatedLot": self.initial_lots[0]["id"], + } + ] response = self.app.post_json( request_path, - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": self.test_bids_data[0]["tenderers"], - "lotValues": [ - { - "value": { - "yearlyPaymentsPercentage": 0.8, - "contractDuration": {"years": 12}, - "annualCostsReduction": [100] * 21, - "currency": "UAH", - "valueAddedTaxIncluded": False, - }, - "relatedLot": self.initial_lots[0]["id"], - } - ], - } - }, + {"data": bid_data}, status=422, ) self.assertEqual(response.status, "422 Unprocessable Entity") @@ -1240,17 +1213,13 @@ def create_tender_bid_invalid(self): ], ) + bid_data.update({ + "value": self.test_bids_data[0]["value"], + "lotValues": [{"value": self.test_bids_data[0]["value"], "relatedLot": self.initial_lots[0]["id"]}] + }) response = self.app.post_json( request_path, - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": self.test_bids_data[0]["tenderers"], - "value": self.test_bids_data[0]["value"], - "lotValues": [{"value": self.test_bids_data[0]["value"], "relatedLot": self.initial_lots[0]["id"]}], - } - }, + {"data": bid_data}, status=422, ) self.assertEqual(response.status, "422 Unprocessable Entity") @@ -1264,16 +1233,13 @@ def create_tender_bid_invalid(self): def patch_tender_bid(self): lot_id = self.initial_lots[0]["id"] + + bid_data = deepcopy(self.test_bids_data[0]) + del bid_data["value"] + bid_data["lotValues"] = [{"value": self.test_bids_data[0]["value"], "relatedLot": lot_id}] response = self.app.post_json( "/tenders/{}/bids".format(self.tender_id), - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": self.test_bids_data[0]["tenderers"], - "lotValues": [{"value": self.test_bids_data[0]["value"], "relatedLot": lot_id}], - } - }, + {"data": bid_data}, ) self.assertEqual(response.status, "201 Created") self.assertEqual(response.content_type, "application/json") @@ -1409,18 +1375,15 @@ def patch_tender_bid(self): def bids_invalidation_on_lot_change(self): bids_access = {} - lot_id = self.initial_lots[0]["id"] + + bid_data = deepcopy(self.test_bids_data[0]) + del bid_data["value"] + bid_data["lotValues"] = [{"value": self.test_bids_data[0]["value"], "relatedLot": lot_id}] + response = self.app.post_json( "/tenders/{}/bids".format(self.tender_id), - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": self.test_bids_data[0]["tenderers"], - "lotValues": [{"value": self.test_bids_data[0]["value"], "relatedLot": lot_id}], - } - }, + {"data": bid_data}, ) self.assertEqual(response.status, "201 Created") self.assertEqual(response.content_type, "application/json") @@ -1459,15 +1422,21 @@ def bids_invalidation_on_lot_change(self): def create_tender_feature_bid_invalid(self): request_path = "/tenders/{}/bids".format(self.tender_id) + + bid_data = deepcopy(self.test_bids_data[0]) + del bid_data["value"] + response = self.app.post_json( request_path, - {"data": {"selfEligible": True, "selfQualified": True, "tenderers": self.test_bids_data[0]["tenderers"]}}, + {"data": bid_data}, status=422, ) self.assertEqual(response.status, "422 Unprocessable Entity") self.assertEqual(response.content_type, "application/json") self.assertEqual(response.json["status"], "error") + bid_data["lotValues"] = [{"value": self.test_bids_data[0]["value"]}] + response = self.app.post_json( request_path, { @@ -1494,16 +1463,11 @@ def create_tender_feature_bid_invalid(self): ], ) + bid_data["lotValues"] = [{"value": self.test_bids_data[0]["value"], "relatedLot": "0" * 32}] + response = self.app.post_json( request_path, - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": self.test_bids_data[0]["tenderers"], - "lotValues": [{"value": self.test_bids_data[0]["value"], "relatedLot": "0" * 32}], - } - }, + {"data": bid_data}, status=422, ) self.assertEqual(response.status, "422 Unprocessable Entity") @@ -1532,16 +1496,11 @@ def create_tender_feature_bid_invalid(self): # {u'description': [{u'value': [u'value of bid should be greater than minValue of lot']}], u'location': u'body', u'name': u'lotValues'} # ]) + bid_data["lotValues"] = [{"value": self.test_bids_data[0]["value"], "relatedLot": self.lot_id}] + response = self.app.post_json( request_path, - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": self.test_bids_data[0]["tenderers"], - "lotValues": [{"value": self.test_bids_data[0]["value"], "relatedLot": self.lot_id}], - } - }, + {"data": bid_data}, status=422, ) self.assertEqual(response.status, "422 Unprocessable Entity") @@ -1552,17 +1511,11 @@ def create_tender_feature_bid_invalid(self): [{u"description": [u"All features parameters is required."], u"location": u"body", u"name": u"parameters"}], ) + bid_data["parameters"] = [{"code": "code_item", "value": 0.01}] + response = self.app.post_json( request_path, - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": self.test_bids_data[0]["tenderers"], - "lotValues": [{"value": self.test_bids_data[0]["value"], "relatedLot": self.lot_id}], - "parameters": [{"code": "code_item", "value": 0.01}], - } - }, + {"data": bid_data}, status=422, ) self.assertEqual(response.status, "422 Unprocessable Entity") @@ -1573,17 +1526,10 @@ def create_tender_feature_bid_invalid(self): [{u"description": [u"All features parameters is required."], u"location": u"body", u"name": u"parameters"}], ) + bid_data["parameters"] = [{"code": "code_invalid", "value": 0.01}] response = self.app.post_json( request_path, - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": self.test_bids_data[0]["tenderers"], - "lotValues": [{"value": self.test_bids_data[0]["value"], "relatedLot": self.lot_id}], - "parameters": [{"code": "code_invalid", "value": 0.01}], - } - }, + {"data": bid_data}, status=422, ) self.assertEqual(response.status, "422 Unprocessable Entity") @@ -1600,21 +1546,15 @@ def create_tender_feature_bid_invalid(self): ], ) + bid_data["parameters"] = [ + {"code": "code_item", "value": 0.01}, + {"code": "code_tenderer", "value": 0}, + {"code": "code_lot", "value": 0.01}, + ] + response = self.app.post_json( request_path, - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": self.test_bids_data[0]["tenderers"], - "lotValues": [{"value": self.test_bids_data[0]["value"], "relatedLot": self.lot_id}], - "parameters": [ - {"code": "code_item", "value": 0.01}, - {"code": "code_tenderer", "value": 0}, - {"code": "code_lot", "value": 0.01}, - ], - } - }, + {"data": bid_data}, status=422, ) self.assertEqual(response.status, "422 Unprocessable Entity") @@ -1634,21 +1574,20 @@ def create_tender_feature_bid_invalid(self): def create_tender_feature_bid(self): request_path = "/tenders/{}/bids".format(self.tender_id) + + bid_data = deepcopy(self.test_bids_data[0]) + del bid_data["value"] + bid_data.update({ + "lotValues": [{"value": self.test_bids_data[0]["value"], "relatedLot": self.lot_id}], + "parameters": [ + {"code": "code_item", "value": 0.01}, + {"code": "code_tenderer", "value": 0.01}, + {"code": "code_lot", "value": 0.01}, + ] + }) response = self.app.post_json( request_path, - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": self.test_bids_data[0]["tenderers"], - "lotValues": [{"value": self.test_bids_data[0]["value"], "relatedLot": self.lot_id}], - "parameters": [ - {"code": "code_item", "value": 0.01}, - {"code": "code_tenderer", "value": 0.01}, - {"code": "code_lot", "value": 0.01}, - ], - } - }, + {"data": bid_data}, ) self.assertEqual(response.status, "201 Created") self.assertEqual(response.content_type, "application/json") @@ -1662,19 +1601,7 @@ def create_tender_feature_bid(self): response = self.app.post_json( request_path, - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": self.test_bids_data[0]["tenderers"], - "lotValues": [{"value": self.test_bids_data[0]["value"], "relatedLot": self.lot_id}], - "parameters": [ - {"code": "code_item", "value": 0.01}, - {"code": "code_tenderer", "value": 0.01}, - {"code": "code_lot", "value": 0.01}, - ], - } - }, + {"data": bid_data}, status=403, ) self.assertEqual(response.status, "403 Forbidden") diff --git a/src/openprocurement/tender/esco/tests/tender_blanks.py b/src/openprocurement/tender/esco/tests/tender_blanks.py index 122e0135b3..1346bbd9fb 100644 --- a/src/openprocurement/tender/esco/tests/tender_blanks.py +++ b/src/openprocurement/tender/esco/tests/tender_blanks.py @@ -7,6 +7,7 @@ from openprocurement.api.utils import get_now from openprocurement.tender.core.utils import calculate_tender_business_date from openprocurement.tender.esco.models import TenderESCO +from openprocurement.tender.core.tests.criteria_utils import add_criteria # TenderESCOTest @@ -258,6 +259,7 @@ def items_without_deliveryDate_quantity(self): self.assertEqual(response.content_type, "application/json") self.assertEqual(response.json["errors"][0]["description"], "Can't update tender in current (draft) status") + add_criteria(self) # edit_active.tendering role response = self.app.patch_json( "/tenders/{}?acc_token={}".format(self.tender_id, self.tender_token), {"data": {"status": "active.tendering"}} @@ -444,6 +446,7 @@ def tender_noticePublicationDate(self): self.assertEqual(response.content_type, "application/json") self.assertEqual(response.json["errors"][0]["description"], "Can't update tender in current (draft) status") + add_criteria(self) # set active.tendering status response = self.app.patch_json( "/tenders/{}?acc_token={}".format(self.tender_id, self.tender_token), {"data": {"status": "active.tendering"}} @@ -979,7 +982,11 @@ def patch_tender(self): self.assertEqual(response.content_type, "application/json") self.assertEqual( response.json["errors"], - [{"location": "body", "name": "tenderPeriod", "description": ["tenderPeriod should be greater than 30 days"]}], + [{ + "location": "body", + "name": "tenderPeriod", + "description": ["tenderPeriod must be at least 30 full calendar days long"] + }], ) response = self.app.patch_json( diff --git a/src/openprocurement/tender/esco/views/award_rr.py b/src/openprocurement/tender/esco/views/award_rr.py new file mode 100644 index 0000000000..20748b5020 --- /dev/null +++ b/src/openprocurement/tender/esco/views/award_rr.py @@ -0,0 +1,14 @@ +# -*- coding: utf-8 -*- +from openprocurement.tender.core.views.award_rr import BaseAwardRequirementResponseResource +from openprocurement.tender.core.utils import optendersresource + + +@optendersresource( + name="esco:Award Requirement Response", + collection_path="/tenders/{tender_id}/awards/{award_id}/requirement_responses", + path="/tenders/{tender_id}/awards/{award_id}/requirement_responses/{requirement_response_id}", + procurementMethodType="esco", + description="Tender UA award requirement responses", +) +class AwardRequirementResponseResource(BaseAwardRequirementResponseResource): + pass diff --git a/src/openprocurement/tender/esco/views/award_rr_evidence.py b/src/openprocurement/tender/esco/views/award_rr_evidence.py new file mode 100644 index 0000000000..e744af5d7a --- /dev/null +++ b/src/openprocurement/tender/esco/views/award_rr_evidence.py @@ -0,0 +1,16 @@ +# -*- coding: utf-8 -*- +from openprocurement.tender.core.views.award_rr_evidence import BaseAwardRequirementResponseEvidenceResource +from openprocurement.tender.core.utils import optendersresource + + +@optendersresource( + name="esco:Award Requirement Response Evidence", + collection_path="/tenders/{tender_id}/awards/{award_id}/requirement_responses/{requirement_response_id}/evidences", + path="/tenders/{tender_id}/awards/{award_id}/requirement_responses/{requirement_response_id}/evidences/{evidence_id}", + procurementMethodType="esco", + description="Tender UA award evidences", +) +class AwardRequirementResponseEvidenceResource( + BaseAwardRequirementResponseEvidenceResource +): + pass diff --git a/src/openprocurement/tender/esco/views/bid_rr.py b/src/openprocurement/tender/esco/views/bid_rr.py new file mode 100644 index 0000000000..c96fbb4a98 --- /dev/null +++ b/src/openprocurement/tender/esco/views/bid_rr.py @@ -0,0 +1,14 @@ +# -*- coding: utf-8 -*- +from openprocurement.tender.core.views.bid_rr import BaseBidRequirementResponseResource +from openprocurement.tender.core.utils import optendersresource + + +@optendersresource( + name="esco:Bid Requirement Response", + collection_path="/tenders/{tender_id}/bids/{bid_id}/requirement_responses", + path="/tenders/{tender_id}/bids/{bid_id}/requirement_responses/{requirement_response_id}", + procurementMethodType="esco", + description="Tender UA bidder requirement responses", +) +class BidRequirementResponseResource(BaseBidRequirementResponseResource): + pass diff --git a/src/openprocurement/tender/esco/views/bid_rr_evidence.py b/src/openprocurement/tender/esco/views/bid_rr_evidence.py new file mode 100644 index 0000000000..bde409b1ed --- /dev/null +++ b/src/openprocurement/tender/esco/views/bid_rr_evidence.py @@ -0,0 +1,16 @@ +# -*- coding: utf-8 -*- +from openprocurement.tender.core.views.bid_rr_evidence import BaseBidRequirementResponseEvidenceResource +from openprocurement.tender.core.utils import optendersresource + + +@optendersresource( + name="esco:Bid Requirement Response Evidence", + collection_path="/tenders/{tender_id}/bids/{bid_id}/requirement_responses/{requirement_response_id}/evidences", + path="/tenders/{tender_id}/bids/{bid_id}/requirement_responses/{requirement_response_id}/evidences/{evidence_id}", + procurementMethodType="esco", + description="Tender UA bidder evidences", +) +class BidRequirementResponseEvidenceResource( + BaseBidRequirementResponseEvidenceResource +): + pass diff --git a/src/openprocurement/tender/esco/views/criterion.py b/src/openprocurement/tender/esco/views/criterion.py new file mode 100644 index 0000000000..8d1a2e85c1 --- /dev/null +++ b/src/openprocurement/tender/esco/views/criterion.py @@ -0,0 +1,15 @@ +# -*- coding: utf-8 -*- +from openprocurement.tender.core.utils import optendersresource +from openprocurement.tender.core.views.criterion import BaseTenderCriteriaResource + + +@optendersresource( + name="esco:Tender Criteria", + collection_path="/tenders/{tender_id}/criteria", + path="/tenders/{tender_id}/criteria/{criterion_id}", + procurementMethodType="esco", + description="Tender criteria", +) +class TenderUaCriteriaResource(BaseTenderCriteriaResource): + pass + diff --git a/src/openprocurement/tender/esco/views/criterion_rg.py b/src/openprocurement/tender/esco/views/criterion_rg.py new file mode 100644 index 0000000000..d6c5dd9f8c --- /dev/null +++ b/src/openprocurement/tender/esco/views/criterion_rg.py @@ -0,0 +1,14 @@ +# -*- coding: utf-8 -*- +from openprocurement.tender.core.utils import optendersresource +from openprocurement.tender.core.views.criterion_rg import BaseTenderCriteriaRGResource + + +@optendersresource( + name="esco:Criteria Requirement Group", + collection_path="/tenders/{tender_id}/criteria/{criterion_id}/requirement_groups", + path="/tenders/{tender_id}/criteria/{criterion_id}/requirement_groups/{requirement_group_id}", + procurementMethodType="esco", + description="Tender criteria requirement group", +) +class TenderUaCriteriaRGResource(BaseTenderCriteriaRGResource): + pass diff --git a/src/openprocurement/tender/esco/views/criterion_rg_requirement.py b/src/openprocurement/tender/esco/views/criterion_rg_requirement.py new file mode 100644 index 0000000000..d4160529a7 --- /dev/null +++ b/src/openprocurement/tender/esco/views/criterion_rg_requirement.py @@ -0,0 +1,16 @@ +# -*- coding: utf-8 -*- +from openprocurement.tender.core.utils import optendersresource +from openprocurement.tender.core.views.criterion_rg_requirement import BaseTenderCriteriaRGRequirementResource + + +@optendersresource( + name="esco:Requirement Group Requirement", + collection_path="/tenders/{tender_id}/criteria/{criterion_id}/" + "requirement_groups/{requirement_group_id}/requirements", + path="/tenders/{tender_id}/criteria/{criterion_id}/" + "requirement_groups/{requirement_group_id}/requirements/{requirement_id}", + procurementMethodType="esco", + description="Tender requirement group requirement", +) +class TenderUaCriteriaRGRequirementResource(BaseTenderCriteriaRGRequirementResource): + pass diff --git a/src/openprocurement/tender/esco/views/criterion_rg_requirement_evidence.py b/src/openprocurement/tender/esco/views/criterion_rg_requirement_evidence.py new file mode 100644 index 0000000000..2709f57eb4 --- /dev/null +++ b/src/openprocurement/tender/esco/views/criterion_rg_requirement_evidence.py @@ -0,0 +1,18 @@ +# -*- coding: utf-8 -*- +from openprocurement.tender.core.utils import optendersresource +from openprocurement.tender.core.views.criterion_rg_requirement_evidence import ( + BaseTenderCriteriaRGRequirementEvidenceResource, +) + + +@optendersresource( + name="esco:Requirement Eligible Evidence", + collection_path="/tenders/{tender_id}/criteria/{criterion_id}/" + "requirement_groups/{requirement_group_id}/requirements/{requirement_id}/evidences", + path="/tenders/{tender_id}/criteria/{criterion_id}/" + "requirement_groups/{requirement_group_id}/requirements/{requirement_id}/evidences/{evidence_id}", + procurementMethodType="esco", + description="Tender requirement evidence", +) +class TenderUaCriteriaRGRequirementEvidenceResource(BaseTenderCriteriaRGRequirementEvidenceResource): + pass diff --git a/src/openprocurement/tender/limited/tests/base.py b/src/openprocurement/tender/limited/tests/base.py index e5f39ea80d..99530aa8a0 100644 --- a/src/openprocurement/tender/limited/tests/base.py +++ b/src/openprocurement/tender/limited/tests/base.py @@ -4,6 +4,7 @@ from datetime import datetime, timedelta from openprocurement.api.constants import SANDBOX_MODE from openprocurement.api.utils import get_now +from openprocurement.tender.limited.models import ReportingTender from openprocurement.tender.belowthreshold.tests.base import test_tender_data as base_data from openprocurement.tender.belowthreshold.tests.base import BaseTenderWebTest as BaseBaseTenderWebTest @@ -64,11 +65,7 @@ class BaseTenderWebTest(BaseBaseTenderWebTest): "complete" ) # status, in which operations with tender's contract documents (adding, updating) are forbidden - def update_status(self, status, extra=None): - self.tender_document_patch = {"status": status} - if extra: - self.tender_document_patch.update(extra) - self.save_changes() + periods = {} def set_all_awards_complaint_period_end(self): now = get_now() diff --git a/src/openprocurement/tender/limited/views/award.py b/src/openprocurement/tender/limited/views/award.py index 0caa129b6e..467b0556a8 100644 --- a/src/openprocurement/tender/limited/views/award.py +++ b/src/openprocurement/tender/limited/views/award.py @@ -551,7 +551,7 @@ def patch(self): for i in tender.awards: if i.lotID != award.lotID: continue - if not i.complaintPeriod.endDate or i.complaintPeriod.endDate > now: + if i.complaintPeriod and (not i.complaintPeriod.endDate or i.complaintPeriod.endDate > now): i.complaintPeriod.endDate = now i.status = "cancelled" cancelled_awards.append(i.id) @@ -575,7 +575,7 @@ def patch(self): for i in tender.awards: if i.lotID != award.lotID: continue - if not i.complaintPeriod.endDate or i.complaintPeriod.endDate > now: + if i.complaintPeriod and (not i.complaintPeriod.endDate or i.complaintPeriod.endDate > now): i.complaintPeriod.endDate = now i.status = "cancelled" cancelled_awards.append(i.id) diff --git a/src/openprocurement/tender/limited/views/contract.py b/src/openprocurement/tender/limited/views/contract.py index c5fc888a21..a451060753 100644 --- a/src/openprocurement/tender/limited/views/contract.py +++ b/src/openprocurement/tender/limited/views/contract.py @@ -40,7 +40,11 @@ def check_tender_negotiation_status(request): pending_awards_complaints = any( [i.status in ["claim", "answered", "pending"] for a in lot_awards for i in a.complaints] ) - stand_still_end = max([a.complaintPeriod.endDate or now for a in lot_awards]) + stand_still_end = max([ + a.complaintPeriod.endDate + if a.complaintPeriod and a.complaintPeriod.endDate else now + for a in lot_awards + ]) if pending_awards_complaints or not stand_still_end <= now: continue elif last_award.status == "unsuccessful": diff --git a/src/openprocurement/tender/openeu/models.py b/src/openprocurement/tender/openeu/models.py index 5b045f7ba1..096539703c 100644 --- a/src/openprocurement/tender/openeu/models.py +++ b/src/openprocurement/tender/openeu/models.py @@ -1,6 +1,5 @@ from uuid import uuid4 from datetime import timedelta, datetime, time -from iso8601 import parse_date from pyramid.security import Allow from zope.interface import implementer from schematics.types import StringType, MD5Type, BooleanType @@ -8,7 +7,7 @@ from schematics.types.serializable import serializable from schematics.transforms import blacklist, whitelist, export_loop from schematics.exceptions import ValidationError -from openprocurement.api.utils import get_now, get_first_revision_date +from openprocurement.api.utils import get_now, get_first_revision_date, is_new_created from openprocurement.api.constants import TZ from openprocurement.api.auth import ACCR_3, ACCR_4, ACCR_5 from openprocurement.api.models import ( @@ -26,7 +25,7 @@ ITender, Bid as BaseBid, Contract as BaseContract, - Lot as BaseLot, + LotWithMinimalStepLimitsValidation as BaseLot, ConfidentialDocumentModelType, EUConfidentialDocument, EUDocument, @@ -42,11 +41,12 @@ default_lot_role, get_tender, validate_lots_uniq, - rounding_shouldStartAfter, + normalize_should_start_after, validate_parameters_uniq, bids_validation_wrapper, PROCURING_ENTITY_KINDS, QualificationMilestoneListMixin, + RequirementResponse, ) from openprocurement.tender.core.utils import ( calculate_tender_business_date, @@ -54,11 +54,17 @@ has_unanswered_questions, has_unanswered_complaints, calculate_complaint_business_date, - calculate_clarifications_business_date, + calculate_clarif_business_date, + check_auction_period, + calculate_tender_date, extend_next_check_by_complaint_period_ends, ) from openprocurement.tender.belowthreshold.models import Tender as BaseTender -from openprocurement.tender.core.validation import validate_lotvalue_value, validate_relatedlot +from openprocurement.tender.core.validation import ( + validate_lotvalue_value, + validate_relatedlot, + ValidateSelfEligibleMixin, +) from openprocurement.tender.openua.models import ( Complaint as BaseComplaint, Award as BaseAward, @@ -67,13 +73,16 @@ Cancellation as BaseCancellation, Parameter, ) -from openprocurement.tender.openua.constants import COMPLAINT_SUBMIT_TIME, ENQUIRY_STAND_STILL_TIME, AUCTION_PERIOD_TIME +from openprocurement.tender.openua.constants import COMPLAINT_SUBMIT_TIME, ENQUIRY_STAND_STILL_TIME from openprocurement.tender.openeu.constants import ( TENDERING_DURATION, QUESTIONS_STAND_STILL, TENDERING_AUCTION, BID_UNSUCCESSFUL_FROM, - TENDERING_DAYS, +) +from openprocurement.tender.openua.validation import ( + validate_tender_period_start_date, + validate_tender_period_duration, ) @@ -215,7 +224,7 @@ def shouldStartAfter(self): return start_after = None if tender.status == "active.tendering" and tender.tenderPeriod.endDate: - start_after = calculate_tender_business_date(tender.tenderPeriod.endDate, TENDERING_AUCTION, tender) + start_after = calculate_tender_date(tender.tenderPeriod.endDate, TENDERING_AUCTION, tender) elif self.startDate and get_now() > calc_auction_end_time(tender.numberOfBids, self.startDate): start_after = calc_auction_end_time(tender.numberOfBids, self.startDate) elif tender.qualificationPeriod and tender.qualificationPeriod.endDate: @@ -230,7 +239,7 @@ def shouldStartAfter(self): decision_dates.append(tender.qualificationPeriod.endDate) start_after = max(decision_dates) if start_after: - return rounding_shouldStartAfter(start_after, tender).isoformat() + return normalize_should_start_after(start_after, tender).isoformat() class LotAuctionPeriod(Period): @@ -242,14 +251,12 @@ def shouldStartAfter(self): return tender = get_tender(self) lot = self.__parent__ - if ( - tender.status not in ["active.tendering", "active.pre-qualification.stand-still", "active.auction"] - or lot.status != "active" - ): + statuses = ["active.tendering", "active.pre-qualification.stand-still", "active.auction"] + if tender.status not in statuses or lot.status != "active": return start_after = None if tender.status == "active.tendering" and tender.tenderPeriod.endDate: - start_after = calculate_tender_business_date(tender.tenderPeriod.endDate, TENDERING_AUCTION, tender) + start_after = calculate_tender_date(tender.tenderPeriod.endDate, TENDERING_AUCTION, tender) elif self.startDate and get_now() > calc_auction_end_time(lot.numberOfBids, self.startDate): start_after = calc_auction_end_time(lot.numberOfBids, self.startDate) elif tender.qualificationPeriod and tender.qualificationPeriod.endDate: @@ -264,7 +271,7 @@ def shouldStartAfter(self): decision_dates.append(tender.qualificationPeriod.endDate) start_after = max(decision_dates) if start_after: - return rounding_shouldStartAfter(start_after, tender).isoformat() + return normalize_should_start_after(start_after, tender).isoformat() class Lot(BaseLot): @@ -340,7 +347,7 @@ def validate_relatedLot(self, data, relatedLot): validate_relatedlot(get_tender(parent), relatedLot) -class Bid(BaseBid): +class Bid(ValidateSelfEligibleMixin, BaseBid): class Options: roles = { "Administrator": Administrator_bid_role, @@ -398,7 +405,7 @@ class Options: qualificationDocuments = ListType(ConfidentialDocumentModelType(EUConfidentialDocument, required=True), default=list()) lotValues = ListType(ModelType(LotValue, required=True), default=list()) selfQualified = BooleanType(required=True, choices=[True]) - selfEligible = BooleanType(required=True, choices=[True]) + selfEligible = BooleanType(choices=[True]) subcontractingDetails = StringType() parameters = ListType(ModelType(Parameter, required=True), default=list(), validators=[validate_parameters_uniq]) status = StringType( @@ -508,6 +515,11 @@ class Options: qualified = BooleanType(default=False) eligible = BooleanType(default=False) + requirementResponses = ListType( + ModelType(RequirementResponse, required=True), + default=list() + ) + def validate_qualified(self, data, qualified): if data["status"] == "active" and not qualified: raise ValidationError(u"This field is required.") @@ -656,23 +668,27 @@ def __acl__(self): self._acl_cancellation_complaint(acl) return acl + def validate_enquiryPeriod(self, data, period): + # for deactivate validation to enquiryPeriod from parent class + return + @serializable(serialized_name="enquiryPeriod", type=ModelType(EnquiryPeriod)) def tender_enquiryPeriod(self): - endDate = calculate_tender_business_date(self.tenderPeriod.endDate, -QUESTIONS_STAND_STILL, self) - clarificationsUntil = calculate_clarifications_business_date(endDate, ENQUIRY_STAND_STILL_TIME, self, True) + end_date = calculate_tender_business_date(self.tenderPeriod.endDate, -QUESTIONS_STAND_STILL, self) + clarifications_until = calculate_clarif_business_date(end_date, ENQUIRY_STAND_STILL_TIME, self, True) return EnquiryPeriod( dict( startDate=self.tenderPeriod.startDate, - endDate=endDate, + endDate=end_date, invalidationDate=self.enquiryPeriod and self.enquiryPeriod.invalidationDate, - clarificationsUntil=clarificationsUntil, + clarificationsUntil=clarifications_until, ) ) @serializable(type=ModelType(Period)) def complaintPeriod(self): - endDate = calculate_complaint_business_date(self.tenderPeriod.endDate, -COMPLAINT_SUBMIT_TIME, self) - return Period(dict(startDate=self.tenderPeriod.startDate, endDate=endDate)) + end_date = calculate_complaint_business_date(self.tenderPeriod.endDate, -COMPLAINT_SUBMIT_TIME, self) + return Period(dict(startDate=self.tenderPeriod.startDate, endDate=end_date)) @serializable(serialize_when_none=False) def next_check(self): @@ -709,8 +725,12 @@ def next_check(self): ): if now < self.auctionPeriod.startDate: checks.append(self.auctionPeriod.startDate.astimezone(TZ)) - elif now < calc_auction_end_time(self.numberOfBids, self.auctionPeriod.startDate).astimezone(TZ): - checks.append(calc_auction_end_time(self.numberOfBids, self.auctionPeriod.startDate).astimezone(TZ)) + else: + auction_end_time = calc_auction_end_time( + self.numberOfBids, self.auctionPeriod.startDate + ).astimezone(TZ) + if now < auction_end_time: + checks.append(auction_end_time) elif self.lots and self.status == "active.auction": for lot in self.lots: if ( @@ -722,8 +742,12 @@ def next_check(self): continue if now < lot.auctionPeriod.startDate: checks.append(lot.auctionPeriod.startDate.astimezone(TZ)) - elif now < calc_auction_end_time(lot.numberOfBids, lot.auctionPeriod.startDate).astimezone(TZ): - checks.append(calc_auction_end_time(lot.numberOfBids, lot.auctionPeriod.startDate).astimezone(TZ)) + else: + auction_end_time = calc_auction_end_time( + lot.numberOfBids, lot.auctionPeriod.startDate + ).astimezone(TZ) + if now < auction_end_time: + checks.append(auction_end_time) elif ( not self.lots and self.status == "active.awarded" @@ -766,7 +790,7 @@ def next_check(self): and last_award_status == "unsuccessful" ): checks.append(max(standStillEnds)) - if self.status.startswith("active"): + if self.status and self.status.startswith("active"): for award in self.awards: if award.status == "active" and not any([i.awardID == award.id for i in self.contracts]): checks.append(award.date) @@ -776,11 +800,9 @@ def next_check(self): return min(checks).isoformat() if checks else None def validate_tenderPeriod(self, data, period): - # if data['_rev'] is None when tender was created just now - if not data["_rev"] and calculate_tender_business_date(get_now(), -timedelta(minutes=10)) >= period.startDate: - raise ValidationError(u"tenderPeriod.startDate should be in greater than current date") - if period and calculate_tender_business_date(period.startDate, TENDERING_DURATION, data) > period.endDate: - raise ValidationError(u"tenderPeriod should be greater than {} days".format(TENDERING_DAYS)) + if is_new_created(data): + validate_tender_period_start_date(data, period) + validate_tender_period_duration(data, period, TENDERING_DURATION) @serializable def numberOfBids(self): @@ -788,26 +810,10 @@ def numberOfBids(self): return len([bid for bid in self.bids if bid.status in ("active", "pending")]) def check_auction_time(self): - if ( - self.auctionPeriod - and self.auctionPeriod.startDate - and self.auctionPeriod.shouldStartAfter - and self.auctionPeriod.startDate - > calculate_tender_business_date( - parse_date(self.auctionPeriod.shouldStartAfter), AUCTION_PERIOD_TIME, self, True - ) - ): + if check_auction_period(self.auctionPeriod, self): self.auctionPeriod.startDate = None for lot in self.lots: - if ( - lot.auctionPeriod - and lot.auctionPeriod.startDate - and lot.auctionPeriod.shouldStartAfter - and lot.auctionPeriod.startDate - > calculate_tender_business_date( - parse_date(lot.auctionPeriod.shouldStartAfter), AUCTION_PERIOD_TIME, self, True - ) - ): + if check_auction_period(lot.auctionPeriod, self): lot.auctionPeriod.startDate = None def invalidate_bids_data(self): diff --git a/src/openprocurement/tender/openeu/subscribers.py b/src/openprocurement/tender/openeu/subscribers.py index 30e68f6079..446c10d451 100644 --- a/src/openprocurement/tender/openeu/subscribers.py +++ b/src/openprocurement/tender/openeu/subscribers.py @@ -3,7 +3,7 @@ from openprocurement.tender.core.utils import ( get_now, calculate_tender_business_date, - calculate_clarifications_business_date, + calculate_clarif_business_date, ) from openprocurement.tender.core.models import EnquiryPeriod from openprocurement.tender.openua.constants import ENQUIRY_STAND_STILL_TIME @@ -14,14 +14,14 @@ def tender_init_handler(event): """ initialization handler for openeu tenders """ tender = event.tender - endDate = calculate_tender_business_date(tender.tenderPeriod.endDate, -QUESTIONS_STAND_STILL, tender) - clarificationsUntil = calculate_clarifications_business_date(endDate, ENQUIRY_STAND_STILL_TIME, tender, True) + end_date = calculate_tender_business_date(tender.tenderPeriod.endDate, -QUESTIONS_STAND_STILL, tender) + clarifications_until = calculate_clarif_business_date(end_date, ENQUIRY_STAND_STILL_TIME, tender, True) tender.enquiryPeriod = EnquiryPeriod( dict( startDate=tender.tenderPeriod.startDate, - endDate=endDate, + endDate=end_date, invalidationDate=tender.enquiryPeriod and tender.enquiryPeriod.invalidationDate, - clarificationsUntil=clarificationsUntil, + clarificationsUntil=clarifications_until, ) ) now = get_now() diff --git a/src/openprocurement/tender/openeu/tests/auction.py b/src/openprocurement/tender/openeu/tests/auction.py index d864e20b3d..7467738225 100644 --- a/src/openprocurement/tender/openeu/tests/auction.py +++ b/src/openprocurement/tender/openeu/tests/auction.py @@ -68,12 +68,7 @@ class TenderSameValueAuctionResourceTest(BaseTenderContentWebTest): initial_status = "active.auction" tenderer_info = deepcopy(test_organization) initial_bids = [ - { - "tenderers": [tenderer_info], - "value": {"amount": 469, "currency": "UAH", "valueAddedTaxIncluded": True}, - "selfQualified": True, - "selfEligible": True, - } + test_bids[0] for i in range(3) ] @@ -130,26 +125,16 @@ class TenderMultipleLotAuctionResourceTest(TenderMultipleLotAuctionResourceTestM class TenderFeaturesAuctionResourceTest(TenderAuctionResourceTest): initial_data = test_features_tender_data tenderer_info = deepcopy(test_organization) - initial_bids = [ - { - "parameters": [{"code": i["code"], "value": 0.1} for i in test_features_tender_data["features"]], - "tenderers": [tenderer_info], - "value": {"amount": 469, "currency": "UAH", "valueAddedTaxIncluded": True}, - "selfQualified": True, - "selfEligible": True, - }, - { - "parameters": [{"code": i["code"], "value": 0.15} for i in test_features_tender_data["features"]], - "tenderers": [tenderer_info], - "value": {"amount": 479, "currency": "UAH", "valueAddedTaxIncluded": True}, - "selfQualified": True, - "selfEligible": True, - }, - ] test_get_tender_auction = snitch(get_tender_auction_feature) test_post_tender_auction = snitch(post_tender_auction_feature) + def setUp(self): + self.initial_bids = deepcopy(test_bids[:2]) + self.initial_bids[0]["parameters"] = [{"code": i["code"], "value": 0.1} for i in test_features_tender_data["features"]] + self.initial_bids[1]["parameters"] = [{"code": i["code"], "value": 0.15} for i in test_features_tender_data["features"]] + super(TenderFeaturesAuctionResourceTest, self).setUp() + class TenderFeaturesLotAuctionResourceTest(TenderLotAuctionResourceTestMixin, TenderFeaturesAuctionResourceTest): initial_lots = test_lots diff --git a/src/openprocurement/tender/openeu/tests/auction_blanks.py b/src/openprocurement/tender/openeu/tests/auction_blanks.py index ead7159585..01f3ef0e98 100644 --- a/src/openprocurement/tender/openeu/tests/auction_blanks.py +++ b/src/openprocurement/tender/openeu/tests/auction_blanks.py @@ -5,7 +5,6 @@ from openprocurement.tender.belowthreshold.tests.base import test_cancellation from openprocurement.api.constants import RELEASE_2020_04_19 from openprocurement.api.utils import get_now -from openprocurement.tender.core.tests.cancellation import activate_cancellation_after_2020_04_19 def patch_tender_2lot_auction(self): diff --git a/src/openprocurement/tender/openeu/tests/base.py b/src/openprocurement/tender/openeu/tests/base.py index 9cc242a81b..3110e27394 100644 --- a/src/openprocurement/tender/openeu/tests/base.py +++ b/src/openprocurement/tender/openeu/tests/base.py @@ -3,15 +3,14 @@ import os from datetime import datetime, timedelta -from openprocurement.api.constants import SANDBOX_MODE +from openprocurement.api.constants import SANDBOX_MODE, RELEASE_ECRITERIA_ARTICLE_17 from openprocurement.tender.belowthreshold.tests.base import test_milestones as base_test_milestones +from openprocurement.tender.openeu.models import Tender +from openprocurement.tender.openeu.tests.periods import PERIODS from openprocurement.tender.openua.tests.base import BaseTenderUAWebTest from openprocurement.api.utils import get_now from openprocurement.tender.openeu.constants import ( TENDERING_DAYS, - TENDERING_DURATION, - QUESTIONS_STAND_STILL, - COMPLAINT_STAND_STILL, ) test_milestones = copy.deepcopy(base_test_milestones) @@ -46,7 +45,6 @@ ], "value": {"amount": 469, "currency": "UAH", "valueAddedTaxIncluded": True}, "selfQualified": True, - "selfEligible": True, }, { "tenderers": [ @@ -77,9 +75,13 @@ ], "value": {"amount": 479, "currency": "UAH", "valueAddedTaxIncluded": True}, "selfQualified": True, - "selfEligible": True, }, ] + +if get_now() < RELEASE_ECRITERIA_ARTICLE_17: + for i in test_bids: + i["selfEligible"] = True + now = datetime.now() test_tender_data = { "title": u"футляри до державних нагород", @@ -109,7 +111,7 @@ }, }, "value": {"amount": 500, "currency": u"UAH"}, - "minimalStep": {"amount": 35, "currency": u"UAH"}, + "minimalStep": {"amount": 15, "currency": u"UAH"}, "items": [ { "description": u"футляри до державних нагород", @@ -203,342 +205,48 @@ class BaseTenderWebTest(BaseTenderUAWebTest): "active.pre-qualification.stand-still" ) # status, in which adding document to tender auction is forbidden + periods = PERIODS + tender_class = Tender + def set_enquiry_period_end(self): - now = get_now() - self.set_status( - "active.tendering", - { - "enquiryPeriod": { - "startDate": (now - timedelta(days=28)).isoformat(), - "endDate": (now - (timedelta(minutes=1) if SANDBOX_MODE else timedelta(days=1))).isoformat(), - }, - "tenderPeriod": { - "startDate": (now - timedelta(days=28)).isoformat(), - "endDate": (now + (timedelta(minutes=2) if SANDBOX_MODE else timedelta(days=2))).isoformat(), - }, - }, - ) + self.set_status("active.tendering", startend="enquiry_end") def set_complaint_period_end(self): - now = get_now() - self.set_status( - "active.tendering", - { - "enquiryPeriod": { - "startDate": (now - timedelta(days=27)).isoformat(), - "endDate": (now - (timedelta(minutes=2) if SANDBOX_MODE else timedelta(days=2))).isoformat(), - }, - "tenderPeriod": { - "startDate": (now - timedelta(days=27)).isoformat(), - "endDate": (now + (timedelta(minutes=3) if SANDBOX_MODE else timedelta(days=3))).isoformat(), - }, - }, - ) + self.set_status("active.tendering", startend="complaint_end") def setUp(self): super(BaseTenderUAWebTest, self).setUp() self.app.authorization = self.initial_auth or ("Basic", ("token", "")) - def time_shift(self, status, extra=None): - now = get_now() - tender = self.db.get(self.tender_id) - self.tender_document = tender - data = {} - if status == "enquiryPeriod_ends": - data.update( - { - "enquiryPeriod": { - "startDate": (now - timedelta(days=28)).isoformat(), - "endDate": (now - timedelta(days=1)).isoformat(), - }, - "tenderPeriod": { - "startDate": (now - timedelta(days=28)).isoformat(), - "endDate": (now + timedelta(days=2)).isoformat(), - }, - } - ) - if status == "active.pre-qualification": - data.update( - { - "enquiryPeriod": { - "startDate": (now - TENDERING_DURATION).isoformat(), - "endDate": (now - QUESTIONS_STAND_STILL).isoformat(), - }, - "tenderPeriod": {"startDate": (now - TENDERING_DURATION).isoformat(), "endDate": (now).isoformat()}, - } - ) - elif status == "active.pre-qualification.stand-still": - data.update( - { - "enquiryPeriod": { - "startDate": (now - TENDERING_DURATION).isoformat(), - "endDate": (now - QUESTIONS_STAND_STILL).isoformat(), - }, - "tenderPeriod": {"startDate": (now - TENDERING_DURATION).isoformat(), "endDate": (now).isoformat()}, - "qualificationPeriod": {"startDate": (now).isoformat()}, - } - ) - if "lots" in tender and tender["lots"]: - data["lots"] = [] - for index, lot in enumerate(tender["lots"]): - lot_data = {"id": lot["id"]} - if lot["status"] is "active": - lot_data["auctionPeriod"] = {"startDate": (now + COMPLAINT_STAND_STILL).isoformat()} - data["lots"].append(lot_data) - else: - data.update({"auctionPeriod": {"startDate": (now + COMPLAINT_STAND_STILL).isoformat()}}) - elif status == "active.auction": - data.update( - { - "enquiryPeriod": { - "startDate": (now - TENDERING_DURATION - COMPLAINT_STAND_STILL).isoformat(), - "endDate": ( - now - COMPLAINT_STAND_STILL - TENDERING_DURATION + QUESTIONS_STAND_STILL - ).isoformat(), - }, - "tenderPeriod": { - "startDate": (now - TENDERING_DURATION - COMPLAINT_STAND_STILL).isoformat(), - "endDate": (now - COMPLAINT_STAND_STILL).isoformat(), - }, - "qualificationPeriod": { - "startDate": (now - COMPLAINT_STAND_STILL).isoformat(), - "endDate": (now).isoformat(), - }, - } - ) - if "lots" in tender and tender["lots"]: - data["lots"] = [] - for index, lot in enumerate(tender["lots"]): - lot_data = {"id": lot["id"]} - if lot["status"] == "active": - lot_data["auctionPeriod"] = {"startDate": (now).isoformat()} - data["lots"].append(lot_data) - else: - data.update({"auctionPeriod": {"startDate": now.isoformat()}}) - elif status == "complete": - data.update( - { - "enquiryPeriod": { - "startDate": (now - TENDERING_DURATION - COMPLAINT_STAND_STILL - timedelta(days=3)).isoformat(), - "endDate": ( - now - QUESTIONS_STAND_STILL - COMPLAINT_STAND_STILL - timedelta(days=3) - ).isoformat(), - }, - "tenderPeriod": { - "startDate": (now - TENDERING_DURATION - COMPLAINT_STAND_STILL - timedelta(days=3)).isoformat(), - "endDate": (now - COMPLAINT_STAND_STILL - timedelta(days=3)).isoformat(), - }, - "auctionPeriod": { - "startDate": (now - timedelta(days=3)).isoformat(), - "endDate": (now - timedelta(days=2)).isoformat(), - }, - "awardPeriod": {"startDate": (now - timedelta(days=1)).isoformat(), "endDate": (now).isoformat()}, - } - ) - if self.initial_lots: - data.update( - { - "lots": [ - { - "auctionPeriod": { - "startDate": (now - timedelta(days=3)).isoformat(), - "endDate": (now - timedelta(days=2)).isoformat(), - } - } - for i in self.initial_lots - ] - } - ) - if extra: - data.update(extra) - - self.tender_document_patch = data - self.save_changes() - - def update_status(self, status, extra=None): - now = get_now() - tender = self.db.get(self.tender_id) + def set_status(self, status, extra=None, startend="start"): + self.now = get_now() + self.tender_document = self.db.get(self.tender_id) + self.tender_document_patch = {"status": status} + self.update_periods(status, startend=startend) def activate_bids(): - if tender.get("bids", ""): - bids = tender["bids"] + if self.tender_document.get("bids", ""): + bids = self.tender_document["bids"] for bid in bids: if bid["status"] == "pending": bid.update({"status": "active"}) - data.update({"bids": bids}) + self.tender_document_patch.update({"bids": bids}) data = {"status": status} - if status == "active.tendering": - data.update( - { - "enquiryPeriod": { - "startDate": (now - timedelta(days=1)).isoformat(), - "endDate": (now + TENDERING_DURATION - QUESTIONS_STAND_STILL).isoformat(), - }, - "tenderPeriod": { - "startDate": (now - timedelta(days=1)).isoformat(), - "endDate": (now + TENDERING_DURATION).isoformat(), - }, - } - ) - elif status == "active.pre-qualification": - data.update( - { - "enquiryPeriod": { - "startDate": (now - TENDERING_DURATION - timedelta(days=1)).isoformat(), - "endDate": (now - QUESTIONS_STAND_STILL).isoformat(), - }, - "tenderPeriod": { - "startDate": (now - TENDERING_DURATION - timedelta(days=1)).isoformat(), - "endDate": (now).isoformat(), - }, - } - ) - elif status == "active.pre-qualification.stand-still": - data.update( - { - "enquiryPeriod": { - "startDate": (now - TENDERING_DURATION - timedelta(days=1)).isoformat(), - "endDate": (now - QUESTIONS_STAND_STILL).isoformat(), - }, - "tenderPeriod": { - "startDate": (now - TENDERING_DURATION - timedelta(days=1)).isoformat(), - "endDate": (now).isoformat(), - }, - "qualificationPeriod": {"startDate": (now).isoformat()}, - "auctionPeriod": {"startDate": (now + COMPLAINT_STAND_STILL).isoformat()}, - } - ) + if status == "active.pre-qualification.stand-still": activate_bids() elif status == "active.auction": - data.update( - { - "enquiryPeriod": { - "startDate": (now - TENDERING_DURATION - COMPLAINT_STAND_STILL - timedelta(days=1)).isoformat(), - "endDate": ( - now - COMPLAINT_STAND_STILL - TENDERING_DURATION + QUESTIONS_STAND_STILL - ).isoformat(), - }, - "tenderPeriod": { - "startDate": (now - TENDERING_DURATION - COMPLAINT_STAND_STILL - timedelta(days=1)).isoformat(), - "endDate": (now - COMPLAINT_STAND_STILL).isoformat(), - }, - "qualificationPeriod": { - "startDate": (now - COMPLAINT_STAND_STILL).isoformat(), - "endDate": (now).isoformat(), - }, - "auctionPeriod": {"startDate": (now).isoformat()}, - } - ) - if self.initial_lots: - data.update({"lots": [{"auctionPeriod": {"startDate": (now).isoformat()}} for i in self.initial_lots]}) activate_bids() elif status == "active.qualification": - data.update( - { - "enquiryPeriod": { - "startDate": (now - TENDERING_DURATION - COMPLAINT_STAND_STILL - timedelta(days=2)).isoformat(), - "endDate": ( - now - QUESTIONS_STAND_STILL - COMPLAINT_STAND_STILL - timedelta(days=1) - ).isoformat(), - }, - "tenderPeriod": { - "startDate": (now - TENDERING_DURATION - COMPLAINT_STAND_STILL - timedelta(days=2)).isoformat(), - "endDate": (now - COMPLAINT_STAND_STILL - timedelta(days=1)).isoformat(), - }, - "auctionPeriod": {"startDate": (now - timedelta(days=1)).isoformat(), "endDate": (now).isoformat()}, - "awardPeriod": {"startDate": (now).isoformat()}, - } - ) activate_bids() - if self.initial_lots: - data.update( - { - "lots": [ - { - "auctionPeriod": { - "startDate": (now - timedelta(days=1)).isoformat(), - "endDate": (now).isoformat(), - } - } - for i in self.initial_lots - ] - } - ) elif status == "active.awarded": - data.update( - { - "enquiryPeriod": { - "startDate": (now - TENDERING_DURATION - COMPLAINT_STAND_STILL - timedelta(days=3)).isoformat(), - "endDate": ( - now - QUESTIONS_STAND_STILL - COMPLAINT_STAND_STILL - timedelta(days=2) - ).isoformat(), - }, - "tenderPeriod": { - "startDate": (now - TENDERING_DURATION - COMPLAINT_STAND_STILL - timedelta(days=3)).isoformat(), - "endDate": (now - COMPLAINT_STAND_STILL - timedelta(days=2)).isoformat(), - }, - "auctionPeriod": { - "startDate": (now - timedelta(days=2)).isoformat(), - "endDate": (now - timedelta(days=1)).isoformat(), - }, - "awardPeriod": {"startDate": (now - timedelta(days=1)).isoformat(), "endDate": (now).isoformat()}, - } - ) activate_bids() - if self.initial_lots: - data.update( - { - "lots": [ - { - "auctionPeriod": { - "startDate": (now - timedelta(days=2)).isoformat(), - "endDate": (now - timedelta(days=1)).isoformat(), - } - } - for i in self.initial_lots - ] - } - ) - elif status == "complete": - data.update( - { - "enquiryPeriod": { - "startDate": (now - TENDERING_DURATION - COMPLAINT_STAND_STILL - timedelta(days=4)).isoformat(), - "endDate": ( - now - QUESTIONS_STAND_STILL - COMPLAINT_STAND_STILL - timedelta(days=3) - ).isoformat(), - }, - "tenderPeriod": { - "startDate": (now - TENDERING_DURATION - COMPLAINT_STAND_STILL - timedelta(days=4)).isoformat(), - "endDate": (now - COMPLAINT_STAND_STILL - timedelta(days=3)).isoformat(), - }, - "auctionPeriod": { - "startDate": (now - timedelta(days=3)).isoformat(), - "endDate": (now - timedelta(days=2)).isoformat(), - }, - "awardPeriod": {"startDate": (now - timedelta(days=1)).isoformat(), "endDate": (now).isoformat()}, - } - ) - if self.initial_lots: - data.update( - { - "lots": [ - { - "auctionPeriod": { - "startDate": (now - timedelta(days=3)).isoformat(), - "endDate": (now - timedelta(days=2)).isoformat(), - } - } - for i in self.initial_lots - ] - } - ) - self.tender_document_patch = data if extra: self.tender_document_patch.update(extra) + self.save_changes() + return self.get_tender("chronograph") def prepare_award(self): # switch to active.pre-qualification diff --git a/src/openprocurement/tender/openeu/tests/bid.py b/src/openprocurement/tender/openeu/tests/bid.py index 0f118a3454..03d9cf22bd 100644 --- a/src/openprocurement/tender/openeu/tests/bid.py +++ b/src/openprocurement/tender/openeu/tests/bid.py @@ -1,7 +1,10 @@ # -*- coding: utf-8 -*- import unittest +from copy import deepcopy from openprocurement.api.tests.base import snitch +from openprocurement.api.utils import get_now +from openprocurement.api.constants import RELEASE_ECRITERIA_ARTICLE_17 from openprocurement.tender.belowthreshold.tests.base import test_organization, test_author @@ -20,6 +23,10 @@ test_bids, test_lots, ) +from openprocurement.tender.openua.tests.bid import ( + TenderBidRequirementResponseTestMixin, + TenderBidRequirementResponseEvidenceTestMixin, +) from openprocurement.tender.openeu.tests.bid_blanks import ( # TenderBidDocumentWithDSResourceTest patch_tender_bidder_document_private_json, @@ -70,6 +77,22 @@ ) +class CreateBidMixin(object): + base_bid_status = "draft" + + def setUp(self): + super(CreateBidMixin, self).setUp() + # Create bid + auth = self.app.authorization + self.app.authorization = ('Basic', ('broker', '')) + bid_data = self.test_bids_data[0].copy() + bid_data["status"] = self.base_bid_status + response = self.app.post_json("/tenders/{}/bids".format(self.tender_id), {"data": bid_data}) + bid = response.json["data"] + self.bid_id = bid["id"] + self.bid_token = response.json["access"]["token"] + + class TenderBidResourceTestMixin(object): test_create_tender_bidder = snitch(create_tender_bidder) test_deleted_bid_is_not_restorable = snitch(deleted_bid_is_not_restorable) @@ -160,14 +183,6 @@ class TenderBidBatchDocumentsWithDSResourceTest(BaseTenderContentWebTest): docservice = True initial_status = "active.tendering" - bid_data_wo_docs = { - "tenderers": [test_organization], - "value": {"amount": 500}, - "selfEligible": True, - "selfQualified": True, - "documents": [], - } - test_create_tender_bid_with_document_invalid = snitch(create_tender_bid_with_document_invalid) test_create_tender_bid_with_document = snitch(create_tender_bid_with_document) test_create_tender_bid_with_documents = snitch(create_tender_bid_with_documents) @@ -190,6 +205,36 @@ class TenderBidBatchDocumentsWithDSResourceTest(BaseTenderContentWebTest): test_create_tender_bid_with_all_documents = snitch(create_tender_bid_with_all_documents) + def setUp(self): + self.bid_data_wo_docs = { + "tenderers": [test_organization], + "value": {"amount": 500}, + "selfQualified": True, + "documents": [], + } + if get_now() < RELEASE_ECRITERIA_ARTICLE_17: + self.bid_data_wo_docs["selfEligible"] = True + + super(TenderBidBatchDocumentsWithDSResourceTest, self).setUp() + + +class TenderBidRequirementResponseResourceTest( + TenderBidRequirementResponseTestMixin, + CreateBidMixin, + BaseTenderContentWebTest, +): + test_bids_data = test_bids + initial_status = "active.tendering" + + +class TenderBidRequirementResponseEvidenceResourceTest( + TenderBidRequirementResponseEvidenceTestMixin, + CreateBidMixin, + BaseTenderContentWebTest, +): + test_bids_data = test_bids + initial_status = "active.tendering" + def suite(): suite = unittest.TestSuite() @@ -198,6 +243,8 @@ def suite(): suite.addTest(unittest.makeSuite(TenderBidFeaturesResourceTest)) suite.addTest(unittest.makeSuite(TenderBidResourceTest)) suite.addTest(unittest.makeSuite(TenderBidBatchDocumentsWithDSResourceTest)) + suite.addTest(unittest.makeSuite(TenderBidRequirementResponseResourceTest)) + suite.addTest(unittest.makeSuite(TenderBidRequirementResponseEvidenceResourceTest)) return suite diff --git a/src/openprocurement/tender/openeu/tests/bid_blanks.py b/src/openprocurement/tender/openeu/tests/bid_blanks.py index 732ce93329..720f7f02e8 100644 --- a/src/openprocurement/tender/openeu/tests/bid_blanks.py +++ b/src/openprocurement/tender/openeu/tests/bid_blanks.py @@ -6,7 +6,9 @@ create_tender_bid_with_document_invalid, create_tender_bid_with_document, ) - +from openprocurement.tender.openeu.tests.base import test_bids +from openprocurement.api.constants import RELEASE_ECRITERIA_ARTICLE_17 +from openprocurement.api.utils import get_now # TenderBidResourceTest @@ -94,24 +96,28 @@ def create_tender_biddder_invalid(self): self.assertEqual(response.status, "422 Unprocessable Entity") self.assertEqual(response.content_type, "application/json") self.assertEqual(response.json["status"], "error") + + assert_data = [ + {u"description": [u"This field is required."], u"location": u"body", u"name": u"selfQualified"}, + { + u"description": [ + { + u"contactPoint": [u"This field is required."], + u"identifier": {u"scheme": [u"This field is required."], u"id": [u"This field is required."]}, + u"name": [u"This field is required."], + u"address": [u"This field is required."], + } + ], + u"location": u"body", + u"name": u"tenderers", + }, + ] + if get_now() < RELEASE_ECRITERIA_ARTICLE_17: + assert_data.insert(0, {u"description": [u"This field is required."], u"location": u"body", u"name": u"selfEligible"},) + self.assertEqual( response.json["errors"], - [ - {u"description": [u"This field is required."], u"location": u"body", u"name": u"selfEligible"}, - {u"description": [u"This field is required."], u"location": u"body", u"name": u"selfQualified"}, - { - u"description": [ - { - u"contactPoint": [u"This field is required."], - u"identifier": {u"scheme": [u"This field is required."], u"id": [u"This field is required."]}, - u"name": [u"This field is required."], - u"address": [u"This field is required."], - } - ], - u"location": u"body", - u"name": u"tenderers", - }, - ], + assert_data ) response = self.app.post_json( @@ -145,9 +151,12 @@ def create_tender_biddder_invalid(self): ], ) + bid_data = deepcopy(test_bids[0]) + bid_data["tenderers"] = self.test_bids_data[0]["tenderers"] + del bid_data["value"] response = self.app.post_json( request_path, - {"data": {"selfEligible": True, "selfQualified": True, "tenderers": self.test_bids_data[0]["tenderers"]}}, + {"data": bid_data}, status=422, ) self.assertEqual(response.status, "422 Unprocessable Entity") @@ -158,16 +167,10 @@ def create_tender_biddder_invalid(self): [{u"description": [u"This field is required."], u"location": u"body", u"name": u"value"}], ) + bid_data["value"] = {"amount": 500, "valueAddedTaxIncluded": False} response = self.app.post_json( request_path, - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": self.test_bids_data[0]["tenderers"], - "value": {"amount": 500, "valueAddedTaxIncluded": False}, - } - }, + {"data": bid_data}, status=422, ) self.assertEqual(response.status, "422 Unprocessable Entity") @@ -186,16 +189,13 @@ def create_tender_biddder_invalid(self): ], ) + bid_data.update({ + "tenderers": self.test_bids_data[0]["tenderers"], + "value": {"amount": 500, "currency": "USD"}, + }) response = self.app.post_json( request_path, - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": self.test_bids_data[0]["tenderers"], - "value": {"amount": 500, "currency": "USD"}, - } - }, + {"data": bid_data}, status=422, ) self.assertEqual(response.status, "422 Unprocessable Entity") @@ -215,16 +215,14 @@ def create_tender_biddder_invalid(self): def create_tender_bidder(self): + bid_data = deepcopy(test_bids[0]) + bid_data.update({ + "tenderers": [self.test_bids_data[0]["tenderers"][0]], + "value": {"amount": 500}, + }) response = self.app.post_json( "/tenders/{}/bids".format(self.tender_id), - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": [self.test_bids_data[0]["tenderers"][0]], - "value": {"amount": 500}, - } - }, + {"data": bid_data}, ) self.assertEqual(response.status, "201 Created") self.assertEqual(response.content_type, "application/json") @@ -234,33 +232,20 @@ def create_tender_bidder(self): self.assertIn(bid["id"], response.headers["Location"]) for status in ("active", "unsuccessful", "deleted", "invalid"): + bid_data["status"] = status response = self.app.post_json( "/tenders/{}/bids".format(self.tender_id), - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": [self.test_bids_data[0]["tenderers"][0]], - "value": {"amount": 500}, - "status": status, - } - }, + {"data": bid_data}, status=403, ) self.assertEqual(response.status, "403 Forbidden") self.set_status("complete") + del bid_data["status"] response = self.app.post_json( "/tenders/{}/bids".format(self.tender_id), - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": [self.test_bids_data[0]["tenderers"][0]], - "value": {"amount": 500}, - } - }, + {"data": bid_data}, status=403, ) self.assertEqual(response.status, "403 Forbidden") @@ -269,16 +254,14 @@ def create_tender_bidder(self): def patch_tender_bidder(self): + bid_data = deepcopy(test_bids[0]) + bid_data.update({ + "tenderers": [self.test_bids_data[0]["tenderers"][0]], + "value": {"amount": 500}, + }) response = self.app.post_json( "/tenders/{}/bids".format(self.tender_id), - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": [self.test_bids_data[0]["tenderers"][0]], - "value": {"amount": 500}, - } - }, + {"data": bid_data}, ) self.assertEqual(response.status, "201 Created") self.assertEqual(response.content_type, "application/json") @@ -376,17 +359,15 @@ def patch_tender_bidder(self): def get_tender_bidder(self): + bid_data = deepcopy(test_bids[0]) + bid_data.update({ + "tenderers": [self.test_bids_data[0]["tenderers"][0]], + "value": self.test_bids_data[0]["value"], + }) for _ in range(self.min_bids_number - 1): response = self.app.post_json( "/tenders/{}/bids".format(self.tender_id), - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": [self.test_bids_data[0]["tenderers"][0]], - "value": self.test_bids_data[0]["value"], - } - }, + {"data": bid_data}, ) self.assertEqual(response.status, "201 Created") @@ -395,14 +376,7 @@ def get_tender_bidder(self): bid_token = response.json["access"]["token"] response = self.app.post_json( "/tenders/{}/bids".format(self.tender_id), - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": [self.test_bids_data[0]["tenderers"][0]], - "value": self.test_bids_data[0]["value"], - } - }, + {"data": bid_data}, ) response = self.app.get("/tenders/{}/bids/{}".format(self.tender_id, bid["id"]), status=403) @@ -492,16 +466,19 @@ def get_tender_bidder(self): response = self.app.get("/tenders/{}/bids".format(self.tender_id)) self.assertEqual(response.status, "200 OK") self.assertEqual(len(response.json["data"]), self.min_bids_number) + assert_keys = [u"date", u"status", u"id", u"value", u"tenderers", "selfQualified"] + if get_now() < RELEASE_ECRITERIA_ARTICLE_17: + assert_keys.append("selfEligible") for b in response.json["data"]: self.assertEqual( - set(b.keys()), set([u"date", u"status", u"id", u"value", u"tenderers", "selfEligible", "selfQualified"]) + set(b.keys()), set(assert_keys) ) response = self.app.get("/tenders/{}/bids/{}".format(self.tender_id, bid["id"])) self.assertEqual(response.status, "200 OK") self.assertEqual( set(response.json["data"].keys()), - set([u"date", u"status", u"id", u"value", u"tenderers", "selfEligible", "selfQualified"]), + set(assert_keys), ) # get awards @@ -524,14 +501,14 @@ def get_tender_bidder(self): self.assertEqual(len(response.json["data"]), self.min_bids_number) for b in response.json["data"]: self.assertEqual( - set(b.keys()), set([u"date", u"status", u"id", u"value", u"tenderers", "selfEligible", "selfQualified"]) + set(b.keys()), set(assert_keys) ) response = self.app.get("/tenders/{}/bids/{}".format(self.tender_id, bid["id"])) self.assertEqual(response.status, "200 OK") self.assertEqual( set(response.json["data"].keys()), - set([u"date", u"status", u"id", u"value", u"tenderers", "selfEligible", "selfQualified"]), + set(assert_keys), ) # time travel @@ -557,28 +534,26 @@ def get_tender_bidder(self): self.assertEqual(len(response.json["data"]), self.min_bids_number) for b in response.json["data"]: self.assertEqual( - set(b.keys()), set([u"date", u"status", u"id", u"value", u"tenderers", "selfEligible", "selfQualified"]) + set(b.keys()), set(assert_keys) ) response = self.app.get("/tenders/{}/bids/{}".format(self.tender_id, bid["id"])) self.assertEqual(response.status, "200 OK") self.assertEqual( set(response.json["data"].keys()), - set([u"date", u"status", u"id", u"value", u"tenderers", "selfEligible", "selfQualified"]), + set(assert_keys), ) def delete_tender_bidder(self): + bid_data = deepcopy(test_bids[0]) + bid_data.update({ + "tenderers": self.test_bids_data[0]["tenderers"], + "value": {"amount": 500}, + }) response = self.app.post_json( "/tenders/{}/bids".format(self.tender_id), - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": self.test_bids_data[0]["tenderers"], - "value": {"amount": 500}, - } - }, + {"data": bid_data}, ) self.assertEqual(response.status, "201 Created") self.assertEqual(response.content_type, "application/json") @@ -629,14 +604,7 @@ def delete_tender_bidder(self): # create new bid response = self.app.post_json( "/tenders/{}/bids".format(self.tender_id), - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": self.test_bids_data[0]["tenderers"], - "value": {"amount": 500}, - } - }, + {"data": bid_data}, ) self.assertEqual(response.status, "201 Created") bid = response.json["data"] @@ -645,7 +613,8 @@ def delete_tender_bidder(self): # update tender. we can set value that is less than a value in bid as # they will be invalidated by this request response = self.app.patch_json( - "/tenders/{}?acc_token={}".format(self.tender_id, self.tender_token), {"data": {"value": {"amount": 300.0}}} + "/tenders/{}?acc_token={}".format(self.tender_id, self.tender_token), + {"data": {"value": {"amount": 300.0}, "minimalStep": {"amount": 9.0}}} ) self.assertEqual(response.status, "200 OK") self.assertEqual(response.json["data"]["value"]["amount"], 300) @@ -663,16 +632,10 @@ def delete_tender_bidder(self): self.assertEqual(response.json["data"]["status"], "deleted") for i in range(self.min_bids_number): + bid_data["value"] = {"amount": 100 + i} response = self.app.post_json( "/tenders/{}/bids".format(self.tender_id), - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": self.test_bids_data[i]["tenderers"], - "value": {"amount": 100 + i}, - } - }, + {"data": bid_data}, ) # switch to active.pre-qualification @@ -757,16 +720,14 @@ def delete_tender_bidder(self): def deleted_bid_is_not_restorable(self): + bid_data = deepcopy(test_bids[0]) + bid_data.update({ + "tenderers": self.test_bids_data[0]["tenderers"], + "value": {"amount": 500}, + }) response = self.app.post_json( "/tenders/{}/bids".format(self.tender_id), - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": self.test_bids_data[0]["tenderers"], - "value": {"amount": 500}, - } - }, + {"data": bid_data}, ) self.assertEqual(response.status, "201 Created") self.assertEqual(response.content_type, "application/json") @@ -799,17 +760,16 @@ def deleted_bid_do_not_locks_tender_in_state(self): bids = [] bids_tokens = [] bid_amount = 400 + bid_data = deepcopy(test_bids[0]) + bid_data.update({ + "tenderers": self.test_bids_data[0]["tenderers"], + }) + for _ in range(self.min_bids_number): + bid_data["value"] = {"amount": bid_amount} response = self.app.post_json( "/tenders/{}/bids".format(self.tender_id), - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": [self.test_bids_data[0]["tenderers"][0]], - "value": {"amount": bid_amount}, - } - }, + {"data": bid_data}, ) bid_amount += 5 self.assertEqual(response.status, "201 Created") @@ -824,16 +784,10 @@ def deleted_bid_do_not_locks_tender_in_state(self): self.assertEqual(response.json["data"]["id"], bids[0]["id"]) self.assertEqual(response.json["data"]["status"], "deleted") + bid_data["value"] = {"amount": 101} response = self.app.post_json( "/tenders/{}/bids".format(self.tender_id), - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": [self.test_bids_data[0]["tenderers"][0]], - "value": {"amount": 101}, - } - }, + {"data": bid_data}, ) # switch to active.pre-qualification @@ -884,16 +838,14 @@ def deleted_bid_do_not_locks_tender_in_state(self): def get_tender_tenderers(self): + bid_data = deepcopy(test_bids[0]) + bid_data.update({ + "tenderers": [self.test_bids_data[0]["tenderers"][0]], + "value": self.test_bids_data[0]["value"], + }) response = self.app.post_json( "/tenders/{}/bids".format(self.tender_id), - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": [self.test_bids_data[0]["tenderers"][0]], - "value": self.test_bids_data[0]["value"], - } - }, + {"data": bid_data}, ) self.assertEqual(response.status, "201 Created") self.assertEqual(response.content_type, "application/json") @@ -908,14 +860,7 @@ def get_tender_tenderers(self): for _ in range(self.min_bids_number - 1): response = self.app.post_json( "/tenders/{}/bids".format(self.tender_id), - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": [self.test_bids_data[0]["tenderers"][0]], - "value": self.test_bids_data[0]["value"], - } - }, + {"data": bid_data}, ) # switch to active.pre-qualification @@ -975,32 +920,27 @@ def get_tender_tenderers(self): def bid_Administrator_change(self): + bid_data = deepcopy(test_bids[0]) + bid_data.update({ + "tenderers": [self.test_bids_data[0]["tenderers"][0]], + "value": {"amount": 500} + }) response = self.app.post_json( "/tenders/{}/bids".format(self.tender_id), - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": [self.test_bids_data[0]["tenderers"][0]], - "value": {"amount": 500}, - } - }, + {"data": bid_data}, ) self.assertEqual(response.status, "201 Created") self.assertEqual(response.content_type, "application/json") bid = response.json["data"] + bid_data.update({ + "tenderers": [{"identifier": {"id": "00000000"}}], + "value": {"amount": 400}, + }) self.app.authorization = ("Basic", ("administrator", "")) response = self.app.patch_json( "/tenders/{}/bids/{}".format(self.tender_id, bid["id"]), - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": [{"identifier": {"id": "00000000"}}], - "value": {"amount": 400}, - } - }, + {"data": bid_data}, ) self.assertEqual(response.status, "200 OK") self.assertEqual(response.content_type, "application/json") @@ -1027,7 +967,8 @@ def bids_invalidation_on_tender_change(self): # update tender. we can set value that is less than a value in bids as # they will be invalidated by this request response = self.app.patch_json( - "/tenders/{}?acc_token={}".format(self.tender_id, self.tender_token), {"data": {"value": {"amount": 300.0}}} + "/tenders/{}?acc_token={}".format(self.tender_id, self.tender_token), + {"data": {"value": {"amount": 300.0}, "minimalStep": {"amount": 9.0}}} ) self.assertEqual(response.status, "200 OK") self.assertEqual(response.json["data"]["value"]["amount"], 300) @@ -1075,17 +1016,18 @@ def bids_invalidation_on_tender_change(self): valid_bid_token = response.json["access"]["token"] valid_bid_date = response.json["data"]["date"] + bid_data = deepcopy(test_bids[0]) + bid_data.update({ + "value": {"amount": 101} + }) + for i in range(1, self.min_bids_number): + bid_data.update({ + "tenderers": self.test_bids_data[i]["tenderers"] + }) response = self.app.post_json( "/tenders/{}/bids".format(self.tender_id), - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": self.test_bids_data[i]["tenderers"], - "value": {"amount": 101}, - } - }, + {"data": bid_data}, ) # switch to active.pre-qualification @@ -1223,7 +1165,6 @@ def features_bidder(self): "tenderers": self.test_bids_data[0]["tenderers"], "value": {"amount": 469, "currency": "UAH", "valueAddedTaxIncluded": True}, "selfQualified": True, - "selfEligible": True, }, { "status": "pending", @@ -1231,9 +1172,13 @@ def features_bidder(self): "tenderers": self.test_bids_data[1]["tenderers"], "value": {"amount": 479, "currency": "UAH", "valueAddedTaxIncluded": True}, "selfQualified": True, - "selfEligible": True, }, ] + + if get_now() < RELEASE_ECRITERIA_ARTICLE_17: + test_features_bids[0]["selfEligible"] = True + test_features_bids[1]["selfEligible"] = True + for i in test_features_bids: response = self.app.post_json("/tenders/{}/bids".format(self.tender_id), {"data": i}) i["status"] = "pending" @@ -1246,13 +1191,9 @@ def features_bidder(self): def features_bidder_invalid(self): - data = { - "tenderers": self.test_bids_data[0]["tenderers"], - "value": {"amount": 469, "currency": "UAH", "valueAddedTaxIncluded": True}, - "selfQualified": True, - "selfEligible": True, - } - response = self.app.post_json("/tenders/{}/bids".format(self.tender_id), {"data": data}, status=422) + bid_data = deepcopy(test_bids[0]) + bid_data["tenderers"] = self.test_bids_data[0]["tenderers"] + response = self.app.post_json("/tenders/{}/bids".format(self.tender_id), {"data": bid_data}, status=422) self.assertEqual(response.status, "422 Unprocessable Entity") self.assertEqual(response.content_type, "application/json") self.assertEqual(response.json["status"], "error") @@ -1260,8 +1201,8 @@ def features_bidder_invalid(self): response.json["errors"], [{u"description": [u"This field is required."], u"location": u"body", u"name": u"parameters"}], ) - data["parameters"] = [{"code": "OCDS-123454-AIR-INTAKE", "value": 0.1}] - response = self.app.post_json("/tenders/{}/bids".format(self.tender_id), {"data": data}, status=422) + bid_data["parameters"] = [{"code": "OCDS-123454-AIR-INTAKE", "value": 0.1}] + response = self.app.post_json("/tenders/{}/bids".format(self.tender_id), {"data": bid_data}, status=422) self.assertEqual(response.status, "422 Unprocessable Entity") self.assertEqual(response.content_type, "application/json") self.assertEqual(response.json["status"], "error") @@ -1269,8 +1210,8 @@ def features_bidder_invalid(self): response.json["errors"], [{u"description": [u"All features parameters is required."], u"location": u"body", u"name": u"parameters"}], ) - data["parameters"].append({"code": "OCDS-123454-AIR-INTAKE", "value": 0.1}) - response = self.app.post_json("/tenders/{}/bids".format(self.tender_id), {"data": data}, status=422) + bid_data["parameters"].append({"code": "OCDS-123454-AIR-INTAKE", "value": 0.1}) + response = self.app.post_json("/tenders/{}/bids".format(self.tender_id), {"data": bid_data}, status=422) self.assertEqual(response.status, "422 Unprocessable Entity") self.assertEqual(response.content_type, "application/json") self.assertEqual(response.json["status"], "error") @@ -1284,9 +1225,9 @@ def features_bidder_invalid(self): } ], ) - data["parameters"][1]["code"] = "OCDS-123454-YEARS" - data["parameters"][1]["value"] = 0.2 - response = self.app.post_json("/tenders/{}/bids".format(self.tender_id), {"data": data}, status=422) + bid_data["parameters"][1]["code"] = "OCDS-123454-YEARS" + bid_data["parameters"][1]["value"] = 0.2 + response = self.app.post_json("/tenders/{}/bids".format(self.tender_id), {"data": bid_data}, status=422) self.assertEqual(response.status, "422 Unprocessable Entity") self.assertEqual(response.content_type, "application/json") self.assertEqual(response.json["status"], "error") @@ -1777,52 +1718,39 @@ def all_public_documents_are_accessible_for_others(): self.assertEqual(response.status, "200 OK") response = self.app.get("/tenders/{}".format(self.tender_id)) self.assertEqual(response.json["data"]["status"], "active.qualification") - self.app.authorization = ("Basic", ("anon", "")) response = self.app.get("/tenders/{}/bids".format(self.tender_id)) self.assertEqual(response.status, "200 OK") self.assertEqual(len(response.json["data"]), 2) + assert_data = [ + u"date", + u"status", + u"id", + u"value", + u"tenderers", + u"documents", + u"eligibilityDocuments", + u"qualificationDocuments", + u"financialDocuments", + u"selfQualified", + ] + assert_data_less = [u"date", u"status", u"id", u"value", u"tenderers", u"selfQualified"] + if get_now() < RELEASE_ECRITERIA_ARTICLE_17: + assert_data.append(u"selfEligible") + assert_data_less.append(u"selfEligible") self.assertEqual( set(response.json["data"][0].keys()), - set( - [ - u"date", - u"status", - u"id", - u"value", - u"tenderers", - u"documents", - u"eligibilityDocuments", - u"qualificationDocuments", - u"financialDocuments", - u"selfEligible", - u"selfQualified", - ] - ), + set(assert_data), ) self.assertEqual( set(response.json["data"][1].keys()), - set([u"date", u"status", u"id", u"value", u"tenderers", u"selfEligible", u"selfQualified"]), + set(assert_data_less), ) response = self.app.get("/tenders/{}/bids/{}".format(self.tender_id, self.bid_id)) self.assertEqual(response.status, "200 OK") self.assertEqual( set(response.json["data"].keys()), - set( - [ - u"date", - u"status", - u"id", - u"value", - u"tenderers", - u"documents", - u"eligibilityDocuments", - u"qualificationDocuments", - u"financialDocuments", - u"selfEligible", - u"selfQualified", - ] - ), + set(assert_data), ) all_documents_are_accessible_for_bid_owner(doc_resource) @@ -1850,43 +1778,17 @@ def all_public_documents_are_accessible_for_others(): self.assertEqual(len(response.json["data"]), 2) self.assertEqual( set(response.json["data"][0].keys()), - set( - [ - u"date", - u"status", - u"id", - u"value", - u"tenderers", - u"documents", - u"eligibilityDocuments", - u"qualificationDocuments", - u"financialDocuments", - u"selfEligible", - u"selfQualified", - ] - ), + set(assert_data), ) self.assertEqual( set(response.json["data"][1].keys()), - set([u"date", u"status", u"id", u"value", u"tenderers", u"selfEligible", u"selfQualified"]), + set(assert_data_less), ) response = self.app.get("/tenders/{}/bids/{}".format(self.tender_id, self.bid_id)) self.assertEqual(response.status, "200 OK") self.assertEqual( set(response.json["data"].keys()), - { - "date", - "status", - "id", - "value", - "tenderers", - "documents", - "eligibilityDocuments", - "qualificationDocuments", - "financialDocuments", - "selfEligible", - "selfQualified", - }, + set(assert_data), ) all_documents_are_accessible_for_bid_owner(doc_resource) for doc_resource in ["documents", "financial_documents", "eligibility_documents", "qualification_documents"]: @@ -1916,45 +1818,17 @@ def all_public_documents_are_accessible_for_others(): self.assertEqual(len(response.json["data"]), 2) self.assertEqual( set(response.json["data"][0].keys()), - set( - [ - u"date", - u"status", - u"id", - u"value", - u"tenderers", - u"documents", - u"eligibilityDocuments", - u"qualificationDocuments", - u"financialDocuments", - u"selfEligible", - u"selfQualified", - ] - ), + set(assert_data), ) self.assertEqual( set(response.json["data"][1].keys()), - set([u"date", u"status", u"id", u"value", u"tenderers", u"selfEligible", u"selfQualified"]), + set(assert_data_less), ) response = self.app.get("/tenders/{}/bids/{}".format(self.tender_id, self.bid_id)) self.assertEqual(response.status, "200 OK") self.assertEqual( set(response.json["data"].keys()), - set( - [ - u"date", - u"status", - u"id", - u"value", - u"tenderers", - u"documents", - u"eligibilityDocuments", - u"qualificationDocuments", - u"financialDocuments", - u"selfEligible", - u"selfQualified", - ] - ), + set(assert_data), ) all_documents_are_accessible_for_bid_owner(doc_resource) for doc_resource in ["documents", "financial_documents", "eligibility_documents", "qualification_documents"]: @@ -2895,7 +2769,8 @@ def patch_and_put_document_into_invalid_bid(self): # update tender. we can set value that is less than a value in bids as # they will be invalidated by this request response = self.app.patch_json( - "/tenders/{}?acc_token={}".format(self.tender_id, self.tender_token), {"data": {"value": {"amount": 300.0}}} + "/tenders/{}?acc_token={}".format(self.tender_id, self.tender_token), + {"data": {"value": {"amount": 300.0}, "minimalStep": {"amount": 9.0}}} ) self.assertEqual(response.status, "200 OK") self.assertEqual(response.json["data"]["value"]["amount"], 300) @@ -3865,47 +3740,35 @@ def all_public_documents_are_accessible_for_others(): response = self.app.get("/tenders/{}/bids".format(self.tender_id)) self.assertEqual(response.status, "200 OK") self.assertEqual(len(response.json["data"]), 2) + assert_data = [ + u"date", + u"status", + u"id", + u"value", + u"tenderers", + u"documents", + u"eligibilityDocuments", + u"qualificationDocuments", + u"financialDocuments", + u"selfQualified", + ] + assert_data_less = [u"date", u"status", u"id", u"value", u"tenderers", u"selfQualified"] + if get_now() < RELEASE_ECRITERIA_ARTICLE_17: + assert_data.append(u"selfEligible") + assert_data_less.append(u"selfEligible") self.assertEqual( set(response.json["data"][0].keys()), - set( - [ - u"date", - u"status", - u"id", - u"value", - u"tenderers", - u"documents", - u"eligibilityDocuments", - u"qualificationDocuments", - u"financialDocuments", - u"selfEligible", - u"selfQualified", - ] - ), + set(assert_data), ) self.assertEqual( set(response.json["data"][1].keys()), - set([u"date", u"status", u"id", u"value", u"tenderers", u"selfEligible", u"selfQualified"]), + set(assert_data_less), ) response = self.app.get("/tenders/{}/bids/{}".format(self.tender_id, self.bid_id)) self.assertEqual(response.status, "200 OK") self.assertEqual( set(response.json["data"].keys()), - set( - [ - u"date", - u"status", - u"id", - u"value", - u"tenderers", - u"documents", - u"eligibilityDocuments", - u"qualificationDocuments", - u"financialDocuments", - u"selfEligible", - u"selfQualified", - ] - ), + set(assert_data), ) all_documents_are_accessible_for_bid_owner(doc_resource) @@ -3933,45 +3796,17 @@ def all_public_documents_are_accessible_for_others(): self.assertEqual(len(response.json["data"]), 2) self.assertEqual( set(response.json["data"][0].keys()), - set( - [ - u"date", - u"status", - u"id", - u"value", - u"tenderers", - u"documents", - u"eligibilityDocuments", - u"qualificationDocuments", - u"financialDocuments", - u"selfEligible", - u"selfQualified", - ] - ), + set(assert_data), ) self.assertEqual( set(response.json["data"][1].keys()), - set([u"date", u"status", u"id", u"value", u"tenderers", u"selfEligible", u"selfQualified"]), + set(assert_data_less), ) response = self.app.get("/tenders/{}/bids/{}".format(self.tender_id, self.bid_id)) self.assertEqual(response.status, "200 OK") self.assertEqual( set(response.json["data"].keys()), - set( - [ - u"date", - u"status", - u"id", - u"value", - u"tenderers", - u"documents", - u"eligibilityDocuments", - u"qualificationDocuments", - u"financialDocuments", - u"selfEligible", - u"selfQualified", - ] - ), + set(assert_data), ) all_documents_are_accessible_for_bid_owner(doc_resource) for doc_resource in ["documents", "financial_documents", "eligibility_documents", "qualification_documents"]: @@ -4001,45 +3836,17 @@ def all_public_documents_are_accessible_for_others(): self.assertEqual(len(response.json["data"]), 2) self.assertEqual( set(response.json["data"][0].keys()), - set( - [ - u"date", - u"status", - u"id", - u"value", - u"tenderers", - u"documents", - u"eligibilityDocuments", - u"qualificationDocuments", - u"financialDocuments", - u"selfEligible", - u"selfQualified", - ] - ), + set(assert_data), ) self.assertEqual( set(response.json["data"][1].keys()), - set([u"date", u"status", u"id", u"value", u"tenderers", u"selfEligible", u"selfQualified"]), + set(assert_data_less), ) response = self.app.get("/tenders/{}/bids/{}".format(self.tender_id, self.bid_id)) self.assertEqual(response.status, "200 OK") self.assertEqual( set(response.json["data"].keys()), - set( - [ - u"date", - u"status", - u"id", - u"value", - u"tenderers", - u"documents", - u"eligibilityDocuments", - u"qualificationDocuments", - u"financialDocuments", - u"selfEligible", - u"selfQualified", - ] - ), + set(assert_data), ) all_documents_are_accessible_for_bid_owner(doc_resource) for doc_resource in ["documents", "financial_documents", "eligibility_documents", "qualification_documents"]: diff --git a/src/openprocurement/tender/openeu/tests/cancellation_blanks.py b/src/openprocurement/tender/openeu/tests/cancellation_blanks.py index 1695493ce4..9d2f8c341f 100644 --- a/src/openprocurement/tender/openeu/tests/cancellation_blanks.py +++ b/src/openprocurement/tender/openeu/tests/cancellation_blanks.py @@ -4,7 +4,7 @@ from mock import patch from openprocurement.api.utils import get_now -from openprocurement.api.constants import RELEASE_2020_04_19 +from openprocurement.api.constants import RELEASE_2020_04_19, RELEASE_ECRITERIA_ARTICLE_17 from openprocurement.tender.core.tests.cancellation import ( activate_cancellation_with_complaints_after_2020_04_19, ) @@ -154,13 +154,15 @@ def bids_on_tender_cancellation_in_qualification(self): u"id", u"selfQualified", u"eligibilityDocuments", - u"selfEligible", u"value", u"date", u"financialDocuments", u"participationUrl", u"qualificationDocuments", ] + if get_now() < RELEASE_ECRITERIA_ARTICLE_17: + self.bid_visible_fields.append(u"selfEligible") + deleted_bid_id = self._mark_one_bid_deleted() self.set_status("active.pre-qualification", {"id": self.tender_id, "status": "active.tendering"}) @@ -180,6 +182,16 @@ def bids_on_tender_cancellation_in_qualification(self): tender = self._cancel_tender() self.app.authorization = ("Basic", ("broker", "")) + visible_fields = { + u"documents", + u"eligibilityDocuments", + u"id", + u"status", + u"tenderers", + u"selfQualified", + } + if get_now() < RELEASE_ECRITERIA_ARTICLE_17: + visible_fields.add(u"selfEligible") for bid in tender["bids"]: if bid["id"] in self.valid_bids: self.assertEqual(bid["status"], "active") @@ -191,17 +203,7 @@ def bids_on_tender_cancellation_in_qualification(self): self.assertEqual(bid["status"], "unsuccessful") self.assertEqual( set(bid.keys()), - set( - [ - u"documents", - u"eligibilityDocuments", - u"id", - u"status", - u"selfEligible", - u"tenderers", - u"selfQualified", - ] - ), + visible_fields, ) for bid_id, bid_token in self.initial_bids_tokens.items(): @@ -247,13 +249,15 @@ def bids_on_tender_cancellation_in_awarded(self): u"id", u"selfQualified", u"eligibilityDocuments", - u"selfEligible", u"value", u"date", u"financialDocuments", u"participationUrl", u"qualificationDocuments", ] + + if get_now() < RELEASE_ECRITERIA_ARTICLE_17: + self.bid_visible_fields.append(u"selfEligible") self._mark_one_bid_deleted() self.set_status("active.pre-qualification", {"id": self.tender_id, "status": "active.tendering"}) diff --git a/src/openprocurement/tender/openeu/tests/criterion.py b/src/openprocurement/tender/openeu/tests/criterion.py new file mode 100644 index 0000000000..7a860ee3c8 --- /dev/null +++ b/src/openprocurement/tender/openeu/tests/criterion.py @@ -0,0 +1,51 @@ +# -*- coding: utf-8 -*- +import unittest + +from openprocurement.tender.belowthreshold.tests.base import test_lots +from openprocurement.tender.openeu.tests.base import test_tender_data, BaseTenderContentWebTest +from openprocurement.tender.openua.tests.criterion import ( + TenderCriteriaTestMixin, + TenderCriteriaRGTestMixin, + TenderCriteriaRGRequirementTestMixin, + TenderCriteriaRGRequirementEvidenceTestMixin, +) + + +class TenderEUCriteriaTest(TenderCriteriaTestMixin, BaseTenderContentWebTest): + initial_data = test_tender_data + test_lots_data = test_lots + initial_status = "draft" + + +class TenderEUCriteriaRGTest(TenderCriteriaRGTestMixin, BaseTenderContentWebTest): + initial_data = test_tender_data + test_lots_data = test_lots + + +class TenderEUCriteriaRGRequirementTest( + TenderCriteriaRGRequirementTestMixin, + BaseTenderContentWebTest +): + initial_data = test_tender_data + test_lots_data = test_lots + + +class TenderEUCriteriaRGRequirementEvidenceTest( + TenderCriteriaRGRequirementEvidenceTestMixin, + BaseTenderContentWebTest, +): + initial_data = test_tender_data + test_lots_data = test_lots + + +def suite(): + suite = unittest.TestSuite() + suite.addTest(unittest.makeSuite(TenderEUCriteriaTest)) + suite.addTest(unittest.makeSuite(TenderEUCriteriaRGTest)) + suite.addTest(unittest.makeSuite(TenderEUCriteriaRGRequirementTest)) + suite.addTest(unittest.makeSuite(TenderEUCriteriaRGRequirementEvidenceTest)) + return suite + + +if __name__ == "__main__": + unittest.main(defaultTest="suite") diff --git a/src/openprocurement/tender/openeu/tests/lot.py b/src/openprocurement/tender/openeu/tests/lot.py index 9a3d3fc328..495f694889 100644 --- a/src/openprocurement/tender/openeu/tests/lot.py +++ b/src/openprocurement/tender/openeu/tests/lot.py @@ -11,6 +11,10 @@ ) from openprocurement.tender.belowthreshold.tests.base import test_author +from openprocurement.tender.belowthreshold.tests.lot_blanks import ( + patch_tender_lot_minimalstep_validation, + create_tender_lot_minimalstep_validation, +) from openprocurement.tender.openua.tests.lot_blanks import ( # TenderLotResourceTest @@ -61,6 +65,8 @@ class TenderLotResourceTest(BaseTenderContentWebTest, TenderLotResourceTestMixin test_get_tender_lot = snitch(get_tender_lot) test_get_tender_lots = snitch(get_tender_lots) + test_create_tender_lot_minimalstep_validation = snitch(create_tender_lot_minimalstep_validation) + test_patch_tender_lot_minimalstep_validation = snitch(patch_tender_lot_minimalstep_validation) class TenderLotEdgeCasesTest(BaseTenderContentWebTest, TenderLotEdgeCasesTestMixin): diff --git a/src/openprocurement/tender/openeu/tests/lot_blanks.py b/src/openprocurement/tender/openeu/tests/lot_blanks.py index 00f943268e..fdadf90246 100644 --- a/src/openprocurement/tender/openeu/tests/lot_blanks.py +++ b/src/openprocurement/tender/openeu/tests/lot_blanks.py @@ -207,9 +207,13 @@ def next_check_value_with_unanswered_claim(self): def create_tender_bidder_invalid(self): request_path = "/tenders/{}/bids".format(self.tender_id) + + bid_data = deepcopy(self.test_bids_data[0]) + del bid_data["value"] + response = self.app.post_json( request_path, - {"data": {"selfEligible": True, "selfQualified": True, "tenderers": self.test_bids_data[0]["tenderers"]}}, + {"data": bid_data}, status=422, ) self.assertEqual(response.status, "422 Unprocessable Entity") @@ -220,16 +224,10 @@ def create_tender_bidder_invalid(self): [{u"description": [u"This field is required."], u"location": u"body", u"name": u"lotValues"}], ) + bid_data["lotValues"] = [{"value": {"amount": 500}}] response = self.app.post_json( request_path, - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": self.test_bids_data[0]["tenderers"], - "lotValues": [{"value": {"amount": 500}}], - } - }, + {"data": bid_data}, status=422, ) self.assertEqual(response.status, "422 Unprocessable Entity") @@ -246,16 +244,10 @@ def create_tender_bidder_invalid(self): ], ) + bid_data["lotValues"] = [{"value": {"amount": 500}, "relatedLot": "0" * 32}] response = self.app.post_json( request_path, - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": self.test_bids_data[0]["tenderers"], - "lotValues": [{"value": {"amount": 500}, "relatedLot": "0" * 32}], - } - }, + {"data": bid_data}, status=422, ) self.assertEqual(response.status, "422 Unprocessable Entity") @@ -272,16 +264,10 @@ def create_tender_bidder_invalid(self): ], ) + bid_data["lotValues"] = [{"value": {"amount": 5000000}, "relatedLot": self.initial_lots[0]["id"]}] response = self.app.post_json( request_path, - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": self.test_bids_data[0]["tenderers"], - "lotValues": [{"value": {"amount": 5000000}, "relatedLot": self.initial_lots[0]["id"]}], - } - }, + {"data": bid_data}, status=422, ) self.assertEqual(response.status, "422 Unprocessable Entity") @@ -298,18 +284,10 @@ def create_tender_bidder_invalid(self): ], ) + bid_data["lotValues"] = [{"value": {"amount": 500, "valueAddedTaxIncluded": False}, "relatedLot": self.initial_lots[0]["id"]}] response = self.app.post_json( request_path, - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": self.test_bids_data[0]["tenderers"], - "lotValues": [ - {"value": {"amount": 500, "valueAddedTaxIncluded": False}, "relatedLot": self.initial_lots[0]["id"]} - ], - } - }, + {"data": bid_data}, status=422, ) self.assertEqual(response.status, "422 Unprocessable Entity") @@ -332,16 +310,10 @@ def create_tender_bidder_invalid(self): ], ) + bid_data["lotValues"] = [{"value": {"amount": 500, "currency": "USD"}, "relatedLot": self.initial_lots[0]["id"]}] response = self.app.post_json( request_path, - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": self.test_bids_data[0]["tenderers"], - "lotValues": [{"value": {"amount": 500, "currency": "USD"}, "relatedLot": self.initial_lots[0]["id"]}], - } - }, + {"data": bid_data}, status=422, ) self.assertEqual(response.status, "422 Unprocessable Entity") @@ -358,17 +330,11 @@ def create_tender_bidder_invalid(self): ], ) + bid_data["value"] = {"amount": 500} + bid_data["lotValues"] = [{"value": {"amount": 500}, "relatedLot": self.initial_lots[0]["id"]}] response = self.app.post_json( request_path, - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": self.test_bids_data[0]["tenderers"], - "value": {"amount": 500}, - "lotValues": [{"value": {"amount": 500}, "relatedLot": self.initial_lots[0]["id"]}], - } - }, + {"data": bid_data}, status=422, ) self.assertEqual(response.status, "422 Unprocessable Entity") @@ -382,16 +348,13 @@ def create_tender_bidder_invalid(self): def patch_tender_bidder(self): lot_id = self.initial_lots[0]["id"] + bid_data = deepcopy(self.test_bids_data[0]) + bid_data["lotValues"] = [{"value": {"amount": 500}, "relatedLot": lot_id}] + del bid_data["value"] + response = self.app.post_json( "/tenders/{}/bids".format(self.tender_id), - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": self.test_bids_data[0]["tenderers"], - "lotValues": [{"value": {"amount": 500}, "relatedLot": lot_id}], - } - }, + {"data": bid_data}, ) self.assertEqual(response.status, "201 Created") self.assertEqual(response.content_type, "application/json") @@ -456,25 +419,24 @@ def patch_tender_bidder(self): def create_tender_feature_bidder_invalid(self): request_path = "/tenders/{}/bids".format(self.tender_id) + + bid_data = deepcopy(self.test_bids_data[0]) + del bid_data["value"] + response = self.app.post_json( request_path, - {"data": {"selfEligible": True, "selfQualified": True, "tenderers": self.test_bids_data[0]["tenderers"]}}, + {"data": bid_data}, status=422, ) self.assertEqual(response.status, "422 Unprocessable Entity") self.assertEqual(response.content_type, "application/json") self.assertEqual(response.json["status"], "error") + bid_data["lotValues"] = [{"value": {"amount": 500}}] + response = self.app.post_json( request_path, - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": self.test_bids_data[0]["tenderers"], - "lotValues": [{"value": {"amount": 500}}], - } - }, + {"data": bid_data}, status=422, ) self.assertEqual(response.status, "422 Unprocessable Entity") @@ -491,16 +453,10 @@ def create_tender_feature_bidder_invalid(self): ], ) + bid_data["lotValues"] = [{"value": {"amount": 500}, "relatedLot": "0" * 32}] response = self.app.post_json( request_path, - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": self.test_bids_data[0]["tenderers"], - "lotValues": [{"value": {"amount": 500}, "relatedLot": "0" * 32}], - } - }, + {"data": bid_data}, status=422, ) self.assertEqual(response.status, "422 Unprocessable Entity") @@ -517,16 +473,11 @@ def create_tender_feature_bidder_invalid(self): ], ) + bid_data["lotValues"] = [{"value": {"amount": 5000000}, "relatedLot": self.lot_id}] + response = self.app.post_json( request_path, - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": self.test_bids_data[0]["tenderers"], - "lotValues": [{"value": {"amount": 5000000}, "relatedLot": self.lot_id}], - } - }, + {"data": bid_data}, status=422, ) self.assertEqual(response.status, "422 Unprocessable Entity") @@ -543,16 +494,10 @@ def create_tender_feature_bidder_invalid(self): ], ) + bid_data["lotValues"] = [{"value": {"amount": 500, "valueAddedTaxIncluded": False}, "relatedLot": self.lot_id}] response = self.app.post_json( request_path, - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": self.test_bids_data[0]["tenderers"], - "lotValues": [{"value": {"amount": 500, "valueAddedTaxIncluded": False}, "relatedLot": self.lot_id}], - } - }, + {"data": bid_data}, status=422, ) self.assertEqual(response.status, "422 Unprocessable Entity") @@ -575,16 +520,10 @@ def create_tender_feature_bidder_invalid(self): ], ) + bid_data["lotValues"] = [{"value": {"amount": 500, "currency": "USD"}, "relatedLot": self.lot_id}] response = self.app.post_json( request_path, - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": self.test_bids_data[0]["tenderers"], - "lotValues": [{"value": {"amount": 500, "currency": "USD"}, "relatedLot": self.lot_id}], - } - }, + {"data": bid_data}, status=422, ) self.assertEqual(response.status, "422 Unprocessable Entity") @@ -601,16 +540,10 @@ def create_tender_feature_bidder_invalid(self): ], ) + bid_data["lotValues"] = [{"value": {"amount": 500}, "relatedLot": self.lot_id}] response = self.app.post_json( request_path, - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": self.test_bids_data[0]["tenderers"], - "lotValues": [{"value": {"amount": 500}, "relatedLot": self.lot_id}], - } - }, + {"data": bid_data}, status=422, ) self.assertEqual(response.status, "422 Unprocessable Entity") @@ -619,14 +552,7 @@ def create_tender_feature_bidder_invalid(self): response = self.app.post_json( request_path, - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": self.test_bids_data[0]["tenderers"], - "lotValues": [{"value": {"amount": 500}, "relatedLot": self.lot_id}], - } - }, + {"data": bid_data}, status=422, ) self.assertEqual(response.status, "422 Unprocessable Entity") @@ -637,17 +563,10 @@ def create_tender_feature_bidder_invalid(self): [{u"description": [u"All features parameters is required."], u"location": u"body", u"name": u"parameters"}], ) + bid_data["parameters"] = [{"code": "code_item", "value": 0.01}] response = self.app.post_json( request_path, - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": self.test_bids_data[0]["tenderers"], - "lotValues": [{"value": {"amount": 500}, "relatedLot": self.lot_id}], - "parameters": [{"code": "code_item", "value": 0.01}], - } - }, + {"data": bid_data}, status=422, ) self.assertEqual(response.status, "422 Unprocessable Entity") @@ -658,17 +577,10 @@ def create_tender_feature_bidder_invalid(self): [{u"description": [u"All features parameters is required."], u"location": u"body", u"name": u"parameters"}], ) + bid_data["parameters"] = [{"code": "code_invalid", "value": 0.01}] response = self.app.post_json( request_path, - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": self.test_bids_data[0]["tenderers"], - "lotValues": [{"value": {"amount": 500}, "relatedLot": self.lot_id}], - "parameters": [{"code": "code_invalid", "value": 0.01}], - } - }, + {"data": bid_data}, status=422, ) self.assertEqual(response.status, "422 Unprocessable Entity") @@ -685,21 +597,14 @@ def create_tender_feature_bidder_invalid(self): ], ) + bid_data["parameters"] = [ + {"code": "code_item", "value": 0.01}, + {"code": "code_tenderer", "value": 0}, + {"code": "code_lot", "value": 0.01}, + ] response = self.app.post_json( request_path, - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": self.test_bids_data[0]["tenderers"], - "lotValues": [{"value": {"amount": 500}, "relatedLot": self.lot_id}], - "parameters": [ - {"code": "code_item", "value": 0.01}, - {"code": "code_tenderer", "value": 0}, - {"code": "code_lot", "value": 0.01}, - ], - } - }, + {"data": bid_data}, status=422, ) self.assertEqual(response.status, "422 Unprocessable Entity") @@ -719,21 +624,20 @@ def create_tender_feature_bidder_invalid(self): def create_tender_feature_bidder(self): request_path = "/tenders/{}/bids".format(self.tender_id) + + bid_data = deepcopy(self.test_bids_data[0]) + del bid_data["value"] + bid_data.update({ + "lotValues": [{"value": {"amount": 500}, "relatedLot": self.lot_id}], + "parameters": [ + {"code": "code_item", "value": 0.01}, + {"code": "code_tenderer", "value": 0.01}, + {"code": "code_lot", "value": 0.01}, + ], + }) response = self.app.post_json( request_path, - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": self.test_bids_data[0]["tenderers"], - "lotValues": [{"value": {"amount": 500}, "relatedLot": self.lot_id}], - "parameters": [ - {"code": "code_item", "value": 0.01}, - {"code": "code_tenderer", "value": 0.01}, - {"code": "code_lot", "value": 0.01}, - ], - } - }, + {"data": bid_data}, ) self.assertEqual(response.status, "201 Created") self.assertEqual(response.content_type, "application/json") @@ -747,19 +651,7 @@ def create_tender_feature_bidder(self): response = self.app.post_json( request_path, - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": self.test_bids_data[0]["tenderers"], - "lotValues": [{"value": {"amount": 500}, "relatedLot": self.lot_id}], - "parameters": [ - {"code": "code_item", "value": 0.01}, - {"code": "code_tenderer", "value": 0.01}, - {"code": "code_lot", "value": 0.01}, - ], - } - }, + {"data": bid_data}, status=403, ) self.assertEqual(response.status, "403 Forbidden") @@ -788,17 +680,15 @@ def one_lot_1bid(self): ) self.assertEqual(response.status, "200 OK") # create bid + + bid_data = deepcopy(self.test_bids_data[0]) + del bid_data["value"] + bid_data["lotValues"] = [{"value": self.test_bids_data[0]["value"], "relatedLot": lot_id}] + self.app.authorization = ("Basic", ("broker", "")) response = self.app.post_json( "/tenders/{}/bids".format(tender_id), - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": self.test_bids_data[0]["tenderers"], - "lotValues": [{"value": self.test_bids_data[0]["value"], "relatedLot": lot_id}], - } - }, + {"data": bid_data}, ) # switch to active.pre-qualification self.time_shift("active.pre-qualification") @@ -829,17 +719,15 @@ def one_lot_2bid_1unqualified(self): # create bid self.app.authorization = ("Basic", ("broker", "")) + bid_data = deepcopy(self.test_bids_data[0]) + del bid_data["value"] + for i in range(self.min_bids_number): + bid_data["tenderers"] = self.test_bids_data[i]["tenderers"] + bid_data["lotValues"] = [{"value": self.test_bids_data[i]["value"], "relatedLot": lot_id}] response = self.app.post_json( "/tenders/{}/bids".format(tender_id), - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": self.test_bids_data[i]["tenderers"], - "lotValues": [{"value": self.test_bids_data[i]["value"], "relatedLot": lot_id}], - } - }, + {"data": bid_data}, ) # switch to active.pre-qualification @@ -898,31 +786,22 @@ def one_lot_2bid(self): self.assertEqual(response.status, "200 OK") # create bid self.app.authorization = ("Basic", ("broker", "")) + bid_data = deepcopy(self.test_bids_data[0]) + del bid_data["value"] + bid_data["lotValues"] = [{"value": self.test_bids_data[0]["value"], "relatedLot": lot_id}] response = self.app.post_json( "/tenders/{}/bids".format(tender_id), - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": self.test_bids_data[0]["tenderers"], - "lotValues": [{"value": self.test_bids_data[0]["value"], "relatedLot": lot_id}], - } - }, + {"data": bid_data}, ) bid_id = response.json["data"]["id"] bid_token = response.json["access"]["token"] # create second bid + bid_data["tenderers"] = self.test_bids_data[1]["tenderers"] + bid_data["lotValues"] = [{"value": self.test_bids_data[1]["value"], "relatedLot": lot_id}] self.app.authorization = ("Basic", ("broker", "")) response = self.app.post_json( "/tenders/{}/bids".format(tender_id), - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": self.test_bids_data[1]["tenderers"], - "lotValues": [{"value": self.test_bids_data[1]["value"], "relatedLot": lot_id}], - } - }, + {"data": bid_data}, ) # switch to active.auction self.time_shift("active.pre-qualification") @@ -1074,31 +953,27 @@ def two_lot_2bid_1lot_del(self): # create bid bids = [] + + bid_data = deepcopy(self.test_bids_data[0]) + del bid_data["value"] + bid_data["lotValues"] = [{"value": self.test_bids_data[0]["value"], "relatedLot": lot_id} for lot_id in lots] + self.app.authorization = ("Basic", ("broker", "")) response = self.app.post_json( "/tenders/{}/bids".format(tender_id), - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": self.test_bids_data[0]["tenderers"], - "lotValues": [{"value": self.test_bids_data[0]["value"], "relatedLot": lot_id} for lot_id in lots], - } - }, + {"data": bid_data}, ) bids.append(response.json) # create second bid + bid_data.update({ + "tenderers": self.test_bids_data[1]["tenderers"], + "lotValues": [{"value": self.test_bids_data[1]["value"], "relatedLot": lot_id} for lot_id in lots] + }) + self.app.authorization = ("Basic", ("broker", "")) response = self.app.post_json( "/tenders/{}/bids".format(tender_id), - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": self.test_bids_data[1]["tenderers"], - "lotValues": [{"value": self.test_bids_data[1]["value"], "relatedLot": lot_id} for lot_id in lots], - } - }, + {"data": bid_data}, ) bids.append(response.json) response = self.app.delete("/tenders/{}/lots/{}?acc_token={}".format(self.tender_id, lots[0], owner_token)) @@ -1127,17 +1002,13 @@ def one_lot_3bid_1del(self): # create bid self.app.authorization = ("Basic", ("broker", "")) bids = [] + bid_data = deepcopy(self.test_bids_data[0]) + del bid_data["value"] + bid_data["lotValues"] = [{"value": self.test_bids_data[0]["value"], "relatedLot": lot_id}] for i in range(3): response = self.app.post_json( "/tenders/{}/bids".format(tender_id), - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": self.test_bids_data[0]["tenderers"], - "lotValues": [{"value": self.test_bids_data[0]["value"], "relatedLot": lot_id}], - } - }, + {"data": bid_data}, ) bids.append({response.json["data"]["id"]: response.json["access"]["token"]}) @@ -1279,18 +1150,14 @@ def one_lot_3bid_1un(self): self.assertEqual(response.status, "200 OK") # create bid self.app.authorization = ("Basic", ("broker", "")) + bid_data = deepcopy(self.test_bids_data[0]) + del bid_data["value"] + bid_data["lotValues"] = [{"value": self.test_bids_data[0]["value"], "relatedLot": lot_id}] bids = [] for i in range(3): response = self.app.post_json( "/tenders/{}/bids".format(tender_id), - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": self.test_bids_data[0]["tenderers"], - "lotValues": [{"value": self.test_bids_data[0]["value"], "relatedLot": lot_id}], - } - }, + {"data": bid_data}, ) bids.append({response.json["data"]["id"]: response.json["access"]["token"]}) @@ -1531,17 +1398,17 @@ def two_lot_2bid_0com_1can(self): # create bid self.app.authorization = ("Basic", ("broker", "")) + bid_data = deepcopy(self.test_bids_data[0]) + del bid_data["value"] + for i in range(self.min_bids_number): + bid_data.update({ + "tenderers": self.test_bids_data[i]["tenderers"], + "lotValues": [{"value": self.test_bids_data[i]["value"], "relatedLot": lot_id} for lot_id in lots], + }) response = self.app.post_json( "/tenders/{}/bids".format(tender_id), - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": self.test_bids_data[i]["tenderers"], - "lotValues": [{"value": self.test_bids_data[i]["value"], "relatedLot": lot_id} for lot_id in lots], - } - }, + {"data": bid_data}, ) set_complaint_period_end = getattr(self, "set_complaint_period_end", None) @@ -1617,29 +1484,23 @@ def two_lot_2bid_2com_2win(self): self.assertEqual(response.status, "200 OK") # create bid self.app.authorization = ("Basic", ("broker", "")) + + bid_data = deepcopy(self.test_bids_data[0]) + del bid_data["value"] + bid_data["lotValues"] = [{"value": self.test_bids_data[0]["value"], "relatedLot": lot_id} for lot_id in lots] + response = self.app.post_json( "/tenders/{}/bids".format(tender_id), - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": self.test_bids_data[0]["tenderers"], - "lotValues": [{"value": self.test_bids_data[0]["value"], "relatedLot": lot_id} for lot_id in lots], - } - }, + {"data": bid_data}, ) # create second bid + bid_data["tenderers"] = self.test_bids_data[1]["tenderers"] + bid_data["lotValues"] = [{"value": self.test_bids_data[1]["value"], "relatedLot": lot_id} for lot_id in lots] + self.app.authorization = ("Basic", ("broker", "")) response = self.app.post_json( "/tenders/{}/bids".format(tender_id), - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": self.test_bids_data[1]["tenderers"], - "lotValues": [{"value": self.test_bids_data[1]["value"], "relatedLot": lot_id} for lot_id in lots], - } - }, + {"data": bid_data}, ) # switch to active.pre-qualification self.time_shift("active.pre-qualification") @@ -1804,42 +1665,29 @@ def two_lot_3bid_1win_bug(self): self.assertEqual(response.status, "200 OK") # create bid self.app.authorization = ("Basic", ("broker", "")) + + bid_data = deepcopy(self.test_bids_data[0]) + del bid_data["value"] + bid_data["lotValues"] = [{"value": self.test_bids_data[0]["value"], "relatedLot": lot_id} for lot_id in lots] + response = self.app.post_json( "/tenders/{}/bids".format(tender_id), - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": self.test_bids_data[0]["tenderers"], - "lotValues": [{"value": self.test_bids_data[0]["value"], "relatedLot": lot_id} for lot_id in lots], - } - }, + {"data": bid_data}, ) # create second bid + bid_data["tenderers"] = self.test_bids_data[1]["tenderers"] + bid_data["lotValues"] = [{"value": self.test_bids_data[1]["value"], "relatedLot": lot_id} for lot_id in lots] + self.app.authorization = ("Basic", ("broker", "")) response = self.app.post_json( "/tenders/{}/bids".format(tender_id), - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": self.test_bids_data[1]["tenderers"], - "lotValues": [{"value": self.test_bids_data[1]["value"], "relatedLot": lot_id} for lot_id in lots], - } - }, + {"data": bid_data}, ) # create third bid self.app.authorization = ("Basic", ("broker", "")) response = self.app.post_json( "/tenders/{}/bids".format(tender_id), - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": self.test_bids_data[1]["tenderers"], - "lotValues": [{"value": self.test_bids_data[1]["value"], "relatedLot": lot_id} for lot_id in lots], - } - }, + {"data": bid_data}, ) bid_id = response.json["data"]["id"] # switch to active.pre-qualification diff --git a/src/openprocurement/tender/openeu/tests/periods.py b/src/openprocurement/tender/openeu/tests/periods.py new file mode 100644 index 0000000000..e828a43551 --- /dev/null +++ b/src/openprocurement/tender/openeu/tests/periods.py @@ -0,0 +1,131 @@ +from datetime import timedelta + +from openprocurement.tender.openeu.constants import TENDERING_DURATION, QUESTIONS_STAND_STILL, COMPLAINT_STAND_STILL + +PERIODS = { + "active.tendering": { + "start": { + "enquiryPeriod": { + "startDate": -timedelta(days=1), + "endDate": TENDERING_DURATION - QUESTIONS_STAND_STILL, + }, + "tenderPeriod": { + "startDate": -timedelta(days=1), + "endDate": TENDERING_DURATION, + }, + }, + "enquiry_end": { + "enquiryPeriod": { + "startDate": -timedelta(days=29), + "endDate": -timedelta(days=1), + }, + "tenderPeriod": { + "startDate": -timedelta(days=29), + "endDate": timedelta(days=2), + }, + }, + "complaint_end": + { + "enquiryPeriod": { + "startDate": -timedelta(days=28), + "endDate": -timedelta(days=2), + }, + "tenderPeriod": { + "startDate": -timedelta(days=28), + "endDate": timedelta(days=3), + }, + }, + }, + "active.pre-qualification": { + "start": { + "enquiryPeriod": { + "startDate": -TENDERING_DURATION, + "endDate": -QUESTIONS_STAND_STILL, + }, + "tenderPeriod": { + "startDate": -TENDERING_DURATION - timedelta(days=1), + "endDate": timedelta(), + }, + } + }, + "active.pre-qualification.stand-still": { + "start": { + "enquiryPeriod": { + "startDate": -TENDERING_DURATION, + "endDate": -QUESTIONS_STAND_STILL, + }, + "tenderPeriod": { + "startDate": -TENDERING_DURATION - timedelta(days=1), + "endDate": timedelta(), + }, + "qualificationPeriod": {"startDate": timedelta()}, + "auctionPeriod": {"startDate": COMPLAINT_STAND_STILL}, + } + }, + "active.auction": { + "start": { + "enquiryPeriod": { + "startDate": -TENDERING_DURATION - COMPLAINT_STAND_STILL, + "endDate": -COMPLAINT_STAND_STILL - TENDERING_DURATION + QUESTIONS_STAND_STILL, + }, + "tenderPeriod": { + "startDate": -TENDERING_DURATION - COMPLAINT_STAND_STILL - timedelta(days=1), + "endDate": -COMPLAINT_STAND_STILL, + }, + "qualificationPeriod": { + "startDate": -COMPLAINT_STAND_STILL, + "endDate": timedelta(), + }, + "auctionPeriod": {"startDate": timedelta()}, + } + }, + "active.qualification": { + "start": { + "enquiryPeriod": { + "startDate": -TENDERING_DURATION - COMPLAINT_STAND_STILL - timedelta(days=2), + "endDate": -QUESTIONS_STAND_STILL - COMPLAINT_STAND_STILL - timedelta(days=1), + }, + "tenderPeriod": { + "startDate": -TENDERING_DURATION - COMPLAINT_STAND_STILL - timedelta(days=2), + "endDate": -COMPLAINT_STAND_STILL - timedelta(days=1), + }, + "auctionPeriod": {"startDate": -timedelta(days=1), "endDate": timedelta()}, + "awardPeriod": {"startDate": timedelta()}, + } + }, + "active.awarded": { + "start": { + "enquiryPeriod": { + "startDate": -TENDERING_DURATION - COMPLAINT_STAND_STILL - timedelta(days=3), + "endDate": -QUESTIONS_STAND_STILL - COMPLAINT_STAND_STILL - timedelta(days=2), + }, + "tenderPeriod": { + "startDate": -TENDERING_DURATION - COMPLAINT_STAND_STILL - timedelta(days=3), + "endDate": -COMPLAINT_STAND_STILL - timedelta(days=2), + }, + "auctionPeriod": { + "startDate": -timedelta(days=2), + "endDate": -timedelta(days=1), + }, + "awardPeriod": {"startDate": -timedelta(days=1), "endDate": timedelta()}, + } + }, + "complete": { + "start": { + "enquiryPeriod": { + "startDate": -TENDERING_DURATION - COMPLAINT_STAND_STILL - timedelta(days=4), + "endDate": -QUESTIONS_STAND_STILL - COMPLAINT_STAND_STILL - timedelta(days=3) + , + }, + "tenderPeriod": { + "startDate": -TENDERING_DURATION - COMPLAINT_STAND_STILL - timedelta(days=4), + "endDate": -COMPLAINT_STAND_STILL - timedelta(days=3), + }, + "auctionPeriod": { + "startDate": -timedelta(days=3), + "endDate": -timedelta(days=2), + }, + "awardPeriod": {"startDate": -timedelta(days=1), "endDate": timedelta()}, + } + } +} diff --git a/src/openprocurement/tender/openeu/tests/post.py b/src/openprocurement/tender/openeu/tests/post.py index f9d3a751eb..8998f2b4bd 100644 --- a/src/openprocurement/tender/openeu/tests/post.py +++ b/src/openprocurement/tender/openeu/tests/post.py @@ -111,7 +111,6 @@ def setUp(self): self.assertEqual(response.content_type, "application/json") - class TenderAwardComplaintPostResourceTest( BaseTenderContentWebTest, ComplaintPostResourceMixin, diff --git a/src/openprocurement/tender/openeu/tests/tender.py b/src/openprocurement/tender/openeu/tests/tender.py index 4fb009394a..efe4126aed 100644 --- a/src/openprocurement/tender/openeu/tests/tender.py +++ b/src/openprocurement/tender/openeu/tests/tender.py @@ -15,8 +15,11 @@ patch_tender_lots_none, create_tender_central, create_tender_central_invalid, + tender_minimalstep_validation, + patch_tender_minimalstep_validation, ) +from openprocurement.tender.openuadefense.tests.base import test_bids from openprocurement.tender.openua.tests.tender import TenderUAResourceTestMixin from openprocurement.tender.openua.tests.tender_blanks import ( tender_with_main_procurement_category, @@ -70,6 +73,8 @@ class TenderResourceTest(BaseTenderWebTest, TenderResourceTestMixin, TenderUARes test_create_tender_with_inn_before = snitch(create_tender_with_inn_before) test_tender_milestones_required = snitch(tender_milestones_required) test_patch_tender_lots_none = snitch(patch_tender_lots_none) + test_tender_minimalstep_validation = snitch(tender_minimalstep_validation) + test_patch_tender_minimalstep_validation = snitch(patch_tender_minimalstep_validation) def test_patch_not_author(self): response = self.app.post_json("/tenders", {"data": test_tender_data}) diff --git a/src/openprocurement/tender/openeu/tests/tender_blanks.py b/src/openprocurement/tender/openeu/tests/tender_blanks.py index 7b494e80c3..4edede6f36 100644 --- a/src/openprocurement/tender/openeu/tests/tender_blanks.py +++ b/src/openprocurement/tender/openeu/tests/tender_blanks.py @@ -10,6 +10,7 @@ from openprocurement.tender.belowthreshold.tests.base import test_organization from openprocurement.tender.core.utils import calculate_tender_business_date from openprocurement.tender.openeu.models import Tender +from openprocurement.api.constants import RELEASE_ECRITERIA_ARTICLE_17 # TenderTest @@ -505,7 +506,11 @@ def patch_tender(self): self.assertEqual(response.content_type, "application/json") self.assertEqual( response.json["errors"], - [{"location": "body", "name": "tenderPeriod", "description": ["tenderPeriod should be greater than 30 days"]}], + [{ + "location": "body", + "name": "tenderPeriod", + "description": ["tenderPeriod must be at least 30 full calendar days long"] + }], ) response = self.app.patch_json( @@ -702,17 +707,14 @@ def invalid_bid_tender_features(self): # create bid self.app.authorization = ("Basic", ("broker", "")) + + bid_data = deepcopy(self.test_bids_data[0]) + bid_data["value"] = {"amount": 500} + bid_data["parameters"] = [{"code": "OCDS-123454-POSTPONEMENT", "value": 0.1}] + response = self.app.post_json( "/tenders/{}/bids".format(tender_id), - { - "data": { - "selfEligible": True, - "selfQualified": True, - "parameters": [{"code": "OCDS-123454-POSTPONEMENT", "value": 0.1}], - "tenderers": [test_organization], - "value": {"amount": 500}, - } - }, + {"data": bid_data}, ) self.assertEqual(response.status, "201 Created") self.assertEqual(response.content_type, "application/json") @@ -787,17 +789,17 @@ def invalid_bid_tender_lot(self): # create bid self.app.authorization = ("Basic", ("broker", "")) + + bid_data = deepcopy(self.test_bids_data[0]) + del bid_data["value"] + bid_data.update({ + "status": "draft", + "lotValues": [{"value": self.test_bids_data[0]["value"], "relatedLot": i} for i in lots], + }) + response = self.app.post_json( "/tenders/{}/bids".format(tender_id), - { - "data": { - "selfEligible": True, - "selfQualified": True, - "status": "draft", - "lotValues": [{"value": self.test_bids_data[0]["value"], "relatedLot": i} for i in lots], - "tenderers": [test_organization], - } - }, + {"data": bid_data}, ) self.assertEqual(response.status, "201 Created") self.assertEqual(response.content_type, "application/json") @@ -828,16 +830,13 @@ def one_bid_tender(self): # create bid bidder_data = deepcopy(test_organization) self.app.authorization = ("Basic", ("broker", "")) + + bid_data = deepcopy(self.test_bids_data[0]) + bid_data["tenderers"] = [bidder_data] + response = self.app.post_json( "/tenders/{}/bids".format(tender_id), - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": [bidder_data], - "value": self.test_bids_data[0]["value"], - } - }, + {"data": bid_data}, ) # switch to active.pre-qualification self.set_status("active.pre-qualification", {"id": tender_id, "status": "active.tendering"}) @@ -861,38 +860,21 @@ def unsuccessful_after_prequalification_tender(self): # create bid bidder_data = deepcopy(test_organization) self.app.authorization = ("Basic", ("broker", "")) + + bid_data = deepcopy(self.test_bids_data[0]) + bid_data["tenderers"] = [bidder_data] + response = self.app.post_json( "/tenders/{}/bids".format(tender_id), - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": [bidder_data], - "value": self.test_bids_data[0]["value"], - } - }, + {"data": bid_data}, ) response = self.app.post_json( "/tenders/{}/bids".format(tender_id), - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": [bidder_data], - "value": self.test_bids_data[0]["value"], - } - }, + {"data": bid_data}, ) response = self.app.post_json( "/tenders/{}/bids".format(tender_id), - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": [bidder_data], - "value": self.test_bids_data[0]["value"], - } - }, + {"data": bid_data}, ) # switch to active.pre-qualification self.set_status("active.pre-qualification", {"id": tender_id, "status": "active.tendering"}) @@ -928,9 +910,14 @@ def unsuccessful_after_prequalification_tender(self): self.app.authorization = ("Basic", ("chronograph", "")) response = self.app.patch_json("/tenders/{}".format(tender_id), {"data": {"id": tender_id}}) self.assertEqual(response.json["data"]["status"], "unsuccessful") + + assert_data = {u"id", u"status", u"tenderers", u"selfQualified"} + if get_now() < RELEASE_ECRITERIA_ARTICLE_17: + assert_data.add(u"selfEligible") + for bid in response.json["data"]["bids"]: self.assertEqual(bid["status"], "unsuccessful") - self.assertEqual(set(bid.keys()), set([u"id", u"status", u"selfEligible", u"tenderers", u"selfQualified"])) + self.assertEqual(set(bid.keys()), assert_data) def one_qualificated_bid_tender(self): @@ -945,27 +932,20 @@ def one_qualificated_bid_tender(self): # create bids bidder_data = deepcopy(test_organization) self.app.authorization = ("Basic", ("broker", "")) + + bid_data = deepcopy(self.test_bids_data[0]) + bid_data["tenderers"] = [bidder_data] + response = self.app.post_json( "/tenders/{}/bids".format(tender_id), - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": [bidder_data], - "value": self.test_bids_data[0]["value"], - } - }, + {"data": bid_data}, ) + + bid_data["value"] = self.test_bids_data[1]["value"] + response = self.app.post_json( "/tenders/{}/bids".format(tender_id), - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": [bidder_data], - "value": self.test_bids_data[1]["value"], - } - }, + {"data": bid_data}, ) # switch to active.pre-qualification self.set_status("active.pre-qualification", {"id": tender_id, "status": "active.tendering"}) @@ -1047,41 +1027,24 @@ def multiple_bidders_tender(self): tender_owner_token = response.json["access"]["token"] # create bids bidder_data = deepcopy(test_organization) + + bid_data = deepcopy(self.test_bids_data[0]) + bid_data["tenderers"] = [bidder_data] + self.app.authorization = ("Basic", ("broker", "")) response = self.app.post_json( "/tenders/{}/bids".format(tender_id), - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": [bidder_data], - "value": self.test_bids_data[0]["value"], - } - }, + {"data": bid_data}, ) response = self.app.post_json( "/tenders/{}/bids".format(tender_id), - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": [bidder_data], - "value": self.test_bids_data[0]["value"], - } - }, + {"data": bid_data}, ) bid_id = response.json["data"]["id"] bid_token = response.json["access"]["token"] response = self.app.post_json( "/tenders/{}/bids".format(tender_id), - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": [bidder_data], - "value": self.test_bids_data[0]["value"], - } - }, + {"data": bid_data}, ) # switch to active.pre-qualification self.set_status("active.pre-qualification", {"id": tender_id, "status": "active.tendering"}) @@ -1237,30 +1200,19 @@ def lost_contract_for_active_award(self): tender_id = self.tender_id = response.json["data"]["id"] owner_token = response.json["access"]["token"] # create bid + bid_data = deepcopy(self.test_bids_data[0]) + bid_data["tenderers"] = [test_organization] + self.app.authorization = ("Basic", ("broker", "")) response = self.app.post_json( "/tenders/{}/bids".format(tender_id), - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": [test_organization], - "value": self.test_bids_data[0]["value"], - } - }, + {"data": bid_data}, ) # create bid #2 self.app.authorization = ("Basic", ("broker", "")) response = self.app.post_json( "/tenders/{}/bids".format(tender_id), - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": [test_organization], - "value": self.test_bids_data[0]["value"], - } - }, + {"data": bid_data}, ) # switch to active.pre-qualification self.set_status("active.pre-qualification", {"id": tender_id, "status": "active.tendering"}) diff --git a/src/openprocurement/tender/openeu/utils.py b/src/openprocurement/tender/openeu/utils.py index d296732f01..b4d5789a35 100644 --- a/src/openprocurement/tender/openeu/utils.py +++ b/src/openprocurement/tender/openeu/utils.py @@ -56,7 +56,6 @@ def cancel_lot(self, request, cancellation): cancelled_lots, cancelled_items, cancelled_features = self._get_cancelled_lot_objects(tender) self._invalidate_lot_bids(tender, cancelled_lots=cancelled_lots, cancelled_features=cancelled_features) - self._cancel_lot_qualifications(tender, cancelled_lots=cancelled_lots) self._lot_update_check_tender_status(request, tender) self._lot_update_check_next_award(request, tender) @@ -106,12 +105,6 @@ def filter_docs(items): if not bid.lotValues and bid.status in ["pending", "active"]: bid.status = "invalid" if tender.status == "active.tendering" else "invalid.pre-qualification" - @staticmethod - def _cancel_lot_qualifications(tender, cancelled_lots): - for qualification in tender.qualifications: - if qualification.lotID in cancelled_lots: - qualification.status = "cancelled" - def check_initial_bids_count(request): tender = request.validated["tender"] diff --git a/src/openprocurement/tender/openeu/views/award_rr.py b/src/openprocurement/tender/openeu/views/award_rr.py new file mode 100644 index 0000000000..1e969d094c --- /dev/null +++ b/src/openprocurement/tender/openeu/views/award_rr.py @@ -0,0 +1,14 @@ +# -*- coding: utf-8 -*- +from openprocurement.tender.core.views.award_rr import BaseAwardRequirementResponseResource +from openprocurement.tender.core.utils import optendersresource + + +@optendersresource( + name="aboveThresholdEU:Award Requirement Response", + collection_path="/tenders/{tender_id}/awards/{award_id}/requirement_responses", + path="/tenders/{tender_id}/awards/{award_id}/requirement_responses/{requirement_response_id}", + procurementMethodType="aboveThresholdEU", + description="Tender UA award requirement responses", +) +class AwardRequirementResponseResource(BaseAwardRequirementResponseResource): + pass diff --git a/src/openprocurement/tender/openeu/views/award_rr_evidence.py b/src/openprocurement/tender/openeu/views/award_rr_evidence.py new file mode 100644 index 0000000000..baadb9679d --- /dev/null +++ b/src/openprocurement/tender/openeu/views/award_rr_evidence.py @@ -0,0 +1,16 @@ +# -*- coding: utf-8 -*- +from openprocurement.tender.core.views.award_rr_evidence import BaseAwardRequirementResponseEvidenceResource +from openprocurement.tender.core.utils import optendersresource + + +@optendersresource( + name="aboveThresholdEU:Award Requirement Response Evidence", + collection_path="/tenders/{tender_id}/awards/{award_id}/requirement_responses/{requirement_response_id}/evidences", + path="/tenders/{tender_id}/awards/{award_id}/requirement_responses/{requirement_response_id}/evidences/{evidence_id}", + procurementMethodType="aboveThresholdEU", + description="Tender UA award evidences", +) +class AwardRequirementResponseEvidenceResource( + BaseAwardRequirementResponseEvidenceResource +): + pass diff --git a/src/openprocurement/tender/openeu/views/bid.py b/src/openprocurement/tender/openeu/views/bid.py index e5804849ea..25dcc69194 100644 --- a/src/openprocurement/tender/openeu/views/bid.py +++ b/src/openprocurement/tender/openeu/views/bid.py @@ -7,6 +7,7 @@ validate_bid_operation_period, validate_bid_operation_not_in_tendering, validate_bid_status_update_not_to_pending, + validate_bid_activate_criteria, ) from openprocurement.tender.openua.views.bid import TenderUABidResource as BaseResource from openprocurement.tender.openeu.validation import validate_view_bids_in_active_tendering @@ -95,7 +96,7 @@ def get(self): """ if self.request.authenticated_role == "bid_owner": return {"data": self.request.context.serialize("view")} - # TODO can't move this validator becacuse of check above + # TODO can't move this validator because of check above validate_view_bids_in_active_tendering(self.request) return {"data": self.request.context.serialize(self.request.validated["tender_status"])} @@ -108,6 +109,7 @@ def get(self): validate_bid_operation_period, validate_update_deleted_bid, validate_bid_status_update_not_to_pending, + validate_bid_activate_criteria, ), ) def patch(self): diff --git a/src/openprocurement/tender/openeu/views/bid_rr.py b/src/openprocurement/tender/openeu/views/bid_rr.py new file mode 100644 index 0000000000..e2b433d4b3 --- /dev/null +++ b/src/openprocurement/tender/openeu/views/bid_rr.py @@ -0,0 +1,14 @@ +# -*- coding: utf-8 -*- +from openprocurement.tender.core.views.bid_rr import BaseBidRequirementResponseResource +from openprocurement.tender.core.utils import optendersresource + + +@optendersresource( + name="aboveThresholdEU:Bid Requirement Response", + collection_path="/tenders/{tender_id}/bids/{bid_id}/requirement_responses", + path="/tenders/{tender_id}/bids/{bid_id}/requirement_responses/{requirement_response_id}", + procurementMethodType="aboveThresholdEU", + description="Tender EU bidder requirement responses", +) +class BidRequirementResponseResource(BaseBidRequirementResponseResource): + pass diff --git a/src/openprocurement/tender/openeu/views/bid_rr_evidence.py b/src/openprocurement/tender/openeu/views/bid_rr_evidence.py new file mode 100644 index 0000000000..4cdcf9895f --- /dev/null +++ b/src/openprocurement/tender/openeu/views/bid_rr_evidence.py @@ -0,0 +1,16 @@ +# -*- coding: utf-8 -*- +from openprocurement.tender.core.views.bid_rr_evidence import BaseBidRequirementResponseEvidenceResource +from openprocurement.tender.core.utils import optendersresource + + +@optendersresource( + name="aboveThresholdEU:Bid Requirement Response Evidence", + collection_path="/tenders/{tender_id}/bids/{bid_id}/requirement_responses/{requirement_response_id}/evidences", + path="/tenders/{tender_id}/bids/{bid_id}/requirement_responses/{requirement_response_id}/evidences/{evidence_id}", + procurementMethodType="aboveThresholdEU", + description="Tender EU bidder evidences", +) +class BidRequirementResponseEvidenceResource( + BaseBidRequirementResponseEvidenceResource +): + pass diff --git a/src/openprocurement/tender/openeu/views/criterion.py b/src/openprocurement/tender/openeu/views/criterion.py new file mode 100644 index 0000000000..86916800a2 --- /dev/null +++ b/src/openprocurement/tender/openeu/views/criterion.py @@ -0,0 +1,15 @@ +# -*- coding: utf-8 -*- +from openprocurement.tender.core.utils import optendersresource +from openprocurement.tender.core.views.criterion import BaseTenderCriteriaResource + + +@optendersresource( + name="aboveThresholdEU:Tender Criteria", + collection_path="/tenders/{tender_id}/criteria", + path="/tenders/{tender_id}/criteria/{criterion_id}", + procurementMethodType="aboveThresholdEU", + description="Tender criteria", +) +class TenderUaCriteriaResource(BaseTenderCriteriaResource): + pass + diff --git a/src/openprocurement/tender/openeu/views/criterion_rg.py b/src/openprocurement/tender/openeu/views/criterion_rg.py new file mode 100644 index 0000000000..0d3dd2e977 --- /dev/null +++ b/src/openprocurement/tender/openeu/views/criterion_rg.py @@ -0,0 +1,14 @@ +# -*- coding: utf-8 -*- +from openprocurement.tender.core.utils import optendersresource +from openprocurement.tender.core.views.criterion_rg import BaseTenderCriteriaRGResource + + +@optendersresource( + name="aboveThresholdEU:Criteria Requirement Group", + collection_path="/tenders/{tender_id}/criteria/{criterion_id}/requirement_groups", + path="/tenders/{tender_id}/criteria/{criterion_id}/requirement_groups/{requirement_group_id}", + procurementMethodType="aboveThresholdEU", + description="Tender criteria requirement group", +) +class TenderUaCriteriaRGResource(BaseTenderCriteriaRGResource): + pass diff --git a/src/openprocurement/tender/openeu/views/criterion_rg_requirement.py b/src/openprocurement/tender/openeu/views/criterion_rg_requirement.py new file mode 100644 index 0000000000..6e90f81140 --- /dev/null +++ b/src/openprocurement/tender/openeu/views/criterion_rg_requirement.py @@ -0,0 +1,16 @@ +# -*- coding: utf-8 -*- +from openprocurement.tender.core.utils import optendersresource +from openprocurement.tender.core.views.criterion_rg_requirement import BaseTenderCriteriaRGRequirementResource + + +@optendersresource( + name="aboveThresholdEU:Requirement Group Requirement", + collection_path="/tenders/{tender_id}/criteria/{criterion_id}/" + "requirement_groups/{requirement_group_id}/requirements", + path="/tenders/{tender_id}/criteria/{criterion_id}/" + "requirement_groups/{requirement_group_id}/requirements/{requirement_id}", + procurementMethodType="aboveThresholdEU", + description="Tender requirement group requirement", +) +class TenderUaCriteriaRGRequirementResource(BaseTenderCriteriaRGRequirementResource): + pass diff --git a/src/openprocurement/tender/openeu/views/criterion_rg_requirement_evidence.py b/src/openprocurement/tender/openeu/views/criterion_rg_requirement_evidence.py new file mode 100644 index 0000000000..e950b96c29 --- /dev/null +++ b/src/openprocurement/tender/openeu/views/criterion_rg_requirement_evidence.py @@ -0,0 +1,18 @@ +# -*- coding: utf-8 -*- +from openprocurement.tender.core.utils import optendersresource +from openprocurement.tender.core.views.criterion_rg_requirement_evidence import ( + BaseTenderCriteriaRGRequirementEvidenceResource, +) + + +@optendersresource( + name="aboveThresholdEU:Requirement Eligible Evidence", + collection_path="/tenders/{tender_id}/criteria/{criterion_id}/" + "requirement_groups/{requirement_group_id}/requirements/{requirement_id}/evidences", + path="/tenders/{tender_id}/criteria/{criterion_id}/" + "requirement_groups/{requirement_group_id}/requirements/{requirement_id}/evidences/{evidence_id}", + procurementMethodType="aboveThresholdEU", + description="Tender requirement evidence", +) +class TenderUaCriteriaRGRequirementEvidenceResource(BaseTenderCriteriaRGRequirementEvidenceResource): + pass diff --git a/src/openprocurement/tender/openeu/views/tender.py b/src/openprocurement/tender/openeu/views/tender.py index e34fc29131..3e918d0386 100644 --- a/src/openprocurement/tender/openeu/views/tender.py +++ b/src/openprocurement/tender/openeu/views/tender.py @@ -11,6 +11,7 @@ validate_tender_not_in_terminated_status, validate_tender_status_update_not_in_pre_qualificaton, validate_tender_change_status_with_cancellation_lot_pending, + validate_tender_activate_with_criteria, ) from openprocurement.tender.belowthreshold.views.tender import TenderResource from openprocurement.tender.openeu.utils import check_status, all_bids_are_reviewed @@ -35,6 +36,7 @@ class TenderEUResource(TenderResource): validate_tender_not_in_terminated_status, validate_tender_status_update_not_in_pre_qualificaton, validate_tender_change_status_with_cancellation_lot_pending, + validate_tender_activate_with_criteria, ), permission="edit_tender", ) diff --git a/src/openprocurement/tender/openua/adapters.py b/src/openprocurement/tender/openua/adapters.py index eb6df8db96..8684b2f945 100644 --- a/src/openprocurement/tender/openua/adapters.py +++ b/src/openprocurement/tender/openua/adapters.py @@ -2,7 +2,7 @@ from openprocurement.tender.core.adapters import TenderConfigurator from openprocurement.tender.openua.models import Tender from openprocurement.tender.openua.constants import ( - TENDER_PERIOD, + TENDERING_DURATION, TENDERING_EXTRA_PERIOD, STATUS4ROLE, CLAIM_SUBMIT_TIME, @@ -17,7 +17,7 @@ class TenderAboveThresholdUAConfigurator(TenderConfigurator): model = Tender # duration of tendering period. timedelta object. - tendering_period_duration = TENDER_PERIOD + tendering_period_duration = TENDERING_DURATION # duration of tender period extension. timedelta object tendering_period_extra = TENDERING_EXTRA_PERIOD diff --git a/src/openprocurement/tender/openua/constants.py b/src/openprocurement/tender/openua/constants.py index 255c135483..a695dadefc 100644 --- a/src/openprocurement/tender/openua/constants.py +++ b/src/openprocurement/tender/openua/constants.py @@ -2,11 +2,12 @@ from openprocurement.api.constants import TZ from datetime import timedelta, datetime +TENDERING_DAYS = 15 +TENDERING_DURATION = timedelta(days=TENDERING_DAYS) STAND_STILL_TIME = timedelta(days=10) ENQUIRY_STAND_STILL_TIME = timedelta(days=3) CLAIM_SUBMIT_TIME = timedelta(days=10) COMPLAINT_SUBMIT_TIME = timedelta(days=4) -TENDER_PERIOD = timedelta(days=15) ENQUIRY_PERIOD_TIME = timedelta(days=10) TENDERING_EXTRA_PERIOD = timedelta(days=7) AUCTION_PERIOD_TIME = timedelta(days=2) diff --git a/src/openprocurement/tender/openua/models.py b/src/openprocurement/tender/openua/models.py index 598719a751..184b490fe0 100644 --- a/src/openprocurement/tender/openua/models.py +++ b/src/openprocurement/tender/openua/models.py @@ -2,7 +2,6 @@ from uuid import uuid4 from datetime import time, timedelta, datetime -from iso8601 import parse_date from zope.interface import implementer from pyramid.security import Allow from schematics.exceptions import ValidationError @@ -10,7 +9,7 @@ from schematics.types import StringType, BooleanType, MD5Type, BaseType from schematics.types.compound import ModelType from schematics.types.serializable import serializable -from openprocurement.api.utils import get_now, get_first_revision_date +from openprocurement.api.utils import get_now, get_first_revision_date, is_new_created from openprocurement.api.models import ( schematics_default_role, schematics_embedded_role, @@ -31,7 +30,7 @@ get_tender, validate_lots_uniq, bids_validation_wrapper, - Lot, + LotWithMinimalStepLimitsValidation as Lot, ComplaintModelType, Award as BaseAward, Parameter as BaseParameter, @@ -51,25 +50,34 @@ QualificationMilestoneListMixin, ) from openprocurement.tender.core.utils import ( - rounding_shouldStartAfter, + normalize_should_start_after, has_unanswered_questions, has_unanswered_complaints, calc_auction_end_time, calculate_tender_business_date, calculate_complaint_business_date, - calculate_clarifications_business_date, + calculate_clarif_business_date, + check_auction_period, extend_next_check_by_complaint_period_ends, ) -from openprocurement.tender.core.validation import validate_lotvalue_value, validate_relatedlot +from openprocurement.tender.core.validation import ( + validate_lotvalue_value, + validate_relatedlot, + ValidateSelfEligibleMixin, +) from openprocurement.tender.belowthreshold.models import Tender as BaseTender from openprocurement.tender.openua.constants import ( ENQUIRY_STAND_STILL_TIME, COMPLAINT_SUBMIT_TIME, - TENDER_PERIOD, + TENDERING_DURATION, ENQUIRY_PERIOD_TIME, - AUCTION_PERIOD_TIME, PERIOD_END_REQUIRED_FROM, ) +from openprocurement.tender.openua.validation import ( + validate_tender_period_duration, + validate_tender_period_start_date, +) + class IAboveThresholdUATender(ITender): @@ -98,7 +106,7 @@ def shouldStartAfter(self): ] decision_dates.append(tender.tenderPeriod.endDate) start_after = max(decision_dates) - return rounding_shouldStartAfter(start_after, tender).isoformat() + return normalize_should_start_after(start_after, tender).isoformat() class PeriodEndRequired(BasePeriodEndRequired): @@ -141,7 +149,7 @@ class Options: def validate_value(self, data, value): parent = data["__parent__"] - if isinstance(parent, Bid) and parent.status not in self.skip: + if isinstance(parent, BaseUaBid) and parent.status not in self.skip: validate_lotvalue_value(get_tender(parent), data["relatedLot"], value) def validate_relatedLot(self, data, relatedLot): @@ -160,7 +168,7 @@ def validate_code(self, data, code): BaseParameter._validator_functions["code"](self, data, code) -class Bid(BaseBid): +class BaseUaBid(BaseBid): class Options: roles = { "Administrator": Administrator_bid_role, @@ -197,14 +205,14 @@ class Options: subcontractingDetails = StringType() status = StringType(choices=["draft", "active", "invalid", "deleted"], default="active") selfQualified = BooleanType(required=True, choices=[True]) - selfEligible = BooleanType(required=True, choices=[True]) + selfEligible = BooleanType(choices=[True]) parameters = ListType(ModelType(Parameter, required=True), default=list(), validators=[validate_parameters_uniq]) documents = ListType(ConfidentialDocumentModelType(ConfidentialDocument, required=True), default=list()) def serialize(self, role=None): if role and self.status in ["invalid", "deleted"]: role = self.status - return super(Bid, self).serialize(role) + return super(BaseUaBid, self).serialize(role) @bids_validation_wrapper def validate_value(self, data, value): @@ -223,6 +231,10 @@ def validate_parameters(self, data, parameters): BaseBid._validator_functions["parameters"](self, data, parameters) +class Bid(BaseUaBid, ValidateSelfEligibleMixin): + pass + + class ComplaintPost(Model): class Options: namespace = "post" @@ -624,33 +636,32 @@ def __acl__(self): return acl def validate_enquiryPeriod(self, data, period): - # for deactivate validation to enquiryPeriod from parent tender + # for deactivate validation to enquiryPeriod from parent class return def validate_tenderPeriod(self, data, period): - # data['_rev'] is None when tender was created just now - if not data["_rev"] and calculate_tender_business_date(get_now(), -timedelta(minutes=10)) >= period.startDate: - raise ValidationError(u"tenderPeriod.startDate should be in greater than current date") - if period and calculate_tender_business_date(period.startDate, TENDER_PERIOD, data) > period.endDate: - raise ValidationError(u"tenderPeriod should be greater than 15 days") + if period: + if is_new_created(data): + validate_tender_period_start_date(data, period) + validate_tender_period_duration(data, period, TENDERING_DURATION) @serializable(serialized_name="enquiryPeriod", type=ModelType(EnquiryPeriod)) def tender_enquiryPeriod(self): - endDate = calculate_tender_business_date(self.tenderPeriod.endDate, -ENQUIRY_PERIOD_TIME, self) - clarificationsUntil = calculate_clarifications_business_date(endDate, ENQUIRY_STAND_STILL_TIME, self, True) + end_date = calculate_tender_business_date(self.tenderPeriod.endDate, -ENQUIRY_PERIOD_TIME, self) + clarifications_until = calculate_clarif_business_date(end_date, ENQUIRY_STAND_STILL_TIME, self, True) return EnquiryPeriod( dict( startDate=self.tenderPeriod.startDate, - endDate=endDate, + endDate=end_date, invalidationDate=self.enquiryPeriod and self.enquiryPeriod.invalidationDate, - clarificationsUntil=clarificationsUntil, + clarificationsUntil=clarifications_until, ) ) @serializable(type=ModelType(Period)) def complaintPeriod(self): - endDate = calculate_complaint_business_date(self.tenderPeriod.endDate, -COMPLAINT_SUBMIT_TIME, self) - return Period(dict(startDate=self.tenderPeriod.startDate, endDate=endDate)) + end_date = calculate_complaint_business_date(self.tenderPeriod.endDate, -COMPLAINT_SUBMIT_TIME, self) + return Period(dict(startDate=self.tenderPeriod.startDate, endDate=end_date)) @serializable def numberOfBids(self): @@ -677,8 +688,12 @@ def next_check(self): ): if now < self.auctionPeriod.startDate: checks.append(self.auctionPeriod.startDate.astimezone(TZ)) - elif now < calc_auction_end_time(self.numberOfBids, self.auctionPeriod.startDate).astimezone(TZ): - checks.append(calc_auction_end_time(self.numberOfBids, self.auctionPeriod.startDate).astimezone(TZ)) + else: + auction_end_time = calc_auction_end_time( + self.numberOfBids, self.auctionPeriod.startDate + ).astimezone(TZ) + if now < auction_end_time: + checks.append(auction_end_time) elif self.lots and self.status == "active.auction": for lot in self.lots: if ( @@ -690,8 +705,12 @@ def next_check(self): continue if now < lot.auctionPeriod.startDate: checks.append(lot.auctionPeriod.startDate.astimezone(TZ)) - elif now < calc_auction_end_time(lot.numberOfBids, lot.auctionPeriod.startDate).astimezone(TZ): - checks.append(calc_auction_end_time(lot.numberOfBids, lot.auctionPeriod.startDate).astimezone(TZ)) + else: + auction_end_time = calc_auction_end_time( + lot.numberOfBids, lot.auctionPeriod.startDate + ).astimezone(TZ) + if now < auction_end_time: + checks.append(auction_end_time) elif ( not self.lots and self.status == "active.awarded" @@ -743,28 +762,15 @@ def next_check(self): return min(checks).isoformat() if checks else None - def invalidate_bids_data(self): - if ( - self.auctionPeriod - and self.auctionPeriod.startDate - and self.auctionPeriod.shouldStartAfter - and self.auctionPeriod.startDate - > calculate_tender_business_date( - parse_date(self.auctionPeriod.shouldStartAfter), AUCTION_PERIOD_TIME, self, True - ) - ): + def check_auction_time(self): + if check_auction_period(self.auctionPeriod, self): self.auctionPeriod.startDate = None for lot in self.lots: - if ( - lot.auctionPeriod - and lot.auctionPeriod.startDate - and lot.auctionPeriod.shouldStartAfter - and lot.auctionPeriod.startDate - > calculate_tender_business_date( - parse_date(lot.auctionPeriod.shouldStartAfter), AUCTION_PERIOD_TIME, self, True - ) - ): + if check_auction_period(lot.auctionPeriod, self): lot.auctionPeriod.startDate = None + + def invalidate_bids_data(self): + self.check_auction_time() self.enquiryPeriod.invalidationDate = get_now() for bid in self.bids: if bid.status not in ["deleted", "draft"]: diff --git a/src/openprocurement/tender/openua/subscribers.py b/src/openprocurement/tender/openua/subscribers.py index 31bc60407e..21fc4cc78b 100644 --- a/src/openprocurement/tender/openua/subscribers.py +++ b/src/openprocurement/tender/openua/subscribers.py @@ -3,7 +3,7 @@ from openprocurement.tender.core.utils import ( get_now, calculate_tender_business_date, - calculate_clarifications_business_date, + calculate_clarif_business_date, ) from openprocurement.tender.core.models import EnquiryPeriod @@ -14,14 +14,14 @@ def tender_init_handler(event): """ initialization handler for openua tenders """ tender = event.tender - endDate = calculate_tender_business_date(tender.tenderPeriod.endDate, -ENQUIRY_PERIOD_TIME, tender) - clarificationsUntil = calculate_clarifications_business_date(endDate, ENQUIRY_STAND_STILL_TIME, tender, True) + end_date = calculate_tender_business_date(tender.tenderPeriod.endDate, -ENQUIRY_PERIOD_TIME, tender) + clarifications_until = calculate_clarif_business_date(end_date, ENQUIRY_STAND_STILL_TIME, tender, True) tender.enquiryPeriod = EnquiryPeriod( dict( startDate=tender.tenderPeriod.startDate, - endDate=endDate, + endDate=end_date, invalidationDate=tender.enquiryPeriod and tender.enquiryPeriod.invalidationDate, - clarificationsUntil=clarificationsUntil, + clarificationsUntil=clarifications_until, ) ) now = get_now() diff --git a/src/openprocurement/tender/openua/tests/auction.py b/src/openprocurement/tender/openua/tests/auction.py index 3d36530297..45c1f247f6 100644 --- a/src/openprocurement/tender/openua/tests/auction.py +++ b/src/openprocurement/tender/openua/tests/auction.py @@ -1,5 +1,6 @@ # -*- coding: utf-8 -*- import unittest +from copy import deepcopy from openprocurement.api.tests.base import snitch @@ -42,12 +43,7 @@ class TenderAuctionResourceTest(BaseTenderUAContentWebTest, TenderAuctionResourc class TenderSameValueAuctionResourceTest(BaseTenderUAContentWebTest): initial_status = "active.auction" initial_bids = [ - { - "tenderers": [test_organization], - "value": {"amount": 469, "currency": "UAH", "valueAddedTaxIncluded": True}, - "selfEligible": True, - "selfQualified": True, - } + test_bids[0] for i in range(3) ] @@ -69,26 +65,16 @@ class TenderMultipleLotAuctionResourceTest(TenderMultipleLotAuctionResourceTestM class TenderFeaturesAuctionResourceTest(BaseTenderUAContentWebTest): initial_data = test_features_tender_ua_data initial_status = "active.tendering" - initial_bids = [ - { - "parameters": [{"code": i["code"], "value": 0.1} for i in test_features_tender_data["features"]], - "tenderers": [test_organization], - "value": {"amount": 469, "currency": "UAH", "valueAddedTaxIncluded": True}, - "selfEligible": True, - "selfQualified": True, - }, - { - "parameters": [{"code": i["code"], "value": 0.15} for i in test_features_tender_data["features"]], - "tenderers": [test_organization], - "value": {"amount": 479, "currency": "UAH", "valueAddedTaxIncluded": True}, - "selfEligible": True, - "selfQualified": True, - }, - ] test_get_tender_auction = snitch(get_tender_auction_feature) test_post_tender_auction = snitch(post_tender_auction_feature) + def setUp(self): + self.initial_bids = deepcopy(test_bids[:2]) + self.initial_bids[0]["parameters"] = [{"code": i["code"], "value": 0.1} for i in test_features_tender_data["features"]] + self.initial_bids[1]["parameters"] = [{"code": i["code"], "value": 0.15} for i in test_features_tender_data["features"]] + super(TenderFeaturesAuctionResourceTest, self).setUp() + class TenderFeaturesLotAuctionResourceTest(TenderLotAuctionResourceTestMixin, TenderFeaturesAuctionResourceTest): initial_lots = test_lots diff --git a/src/openprocurement/tender/openua/tests/award.py b/src/openprocurement/tender/openua/tests/award.py index 42b49a9fe2..41d08fda34 100644 --- a/src/openprocurement/tender/openua/tests/award.py +++ b/src/openprocurement/tender/openua/tests/award.py @@ -10,7 +10,12 @@ from openprocurement.api.utils import get_now from openprocurement.tender.core.tests.base import change_auth -from openprocurement.tender.belowthreshold.tests.base import test_lots, test_organization, test_draft_complaint +from openprocurement.tender.belowthreshold.tests.base import ( + test_lots, + test_organization, + test_draft_complaint, + test_criteria, +) from openprocurement.tender.belowthreshold.tests.award import ( TenderAwardResourceTestMixin, @@ -71,6 +76,14 @@ tender_award_complaint_period, bot_patch_tender_award_complaint, bot_patch_tender_award_complaint_forbidden, + # TenderAwardRequirementResponseResourceTest + create_award_requirement_response, + patch_award_requirement_response, + get_award_requirement_response, + # TenderAwardRequirementResponseResourceEvidenceTest + create_award_requirement_response_evidence, + patch_award_requirement_response_evidence, + get_award_requirement_response_evidence, ) @@ -88,6 +101,24 @@ class TenderUAAwardComplaintResourceTestMixin(object): test_bot_patch_tender_award_complaint_forbidden = snitch(bot_patch_tender_award_complaint_forbidden) +@mock.patch("openprocurement.tender.core.validation.RELEASE_ECRITERIA_ARTICLE_17", get_now() - timedelta(days=1)) +class TenderAwardRequirementResponseTestMixin(object): + initial_criteria = test_criteria + + test_create_award_requirement_response = snitch(create_award_requirement_response) + test_patch_award_requirement_response = snitch(patch_award_requirement_response) + test_get_award_requirement_response = snitch(get_award_requirement_response) + + +@mock.patch("openprocurement.tender.core.validation.RELEASE_ECRITERIA_ARTICLE_17", get_now() - timedelta(days=1)) +class TenderAwardRequirementResponseEvidenceTestMixin(object): + initial_criteria = test_criteria + + test_create_award_requirement_response_evidence = snitch(create_award_requirement_response_evidence) + test_patch_award_requirement_response_evidence = snitch(patch_award_requirement_response_evidence) + test_get_award_requirement_response_evidence = snitch(get_award_requirement_response_evidence) + + class TenderAwardResourceTest(BaseTenderUAContentWebTest, TenderAwardResourceTestMixin): initial_status = "active.qualification" initial_bids = test_bids @@ -230,6 +261,61 @@ class Tender2LotAwardDocumentResourceTest(TenderAwardPendingResourceTestCase, initial_lots = 2 * test_lots +class TenderAwardRequirementResponseResourceTest( + TenderAwardRequirementResponseTestMixin, + TenderAwardPendingResourceTestCase +): + @mock.patch("openprocurement.tender.core.validation.RELEASE_ECRITERIA_ARTICLE_17", get_now() - timedelta(days=1)) + def setUp(self): + super(TenderAwardRequirementResponseResourceTest, self).setUp() + response = self.app.get("/tenders/{}/criteria".format(self.tender_id)) + criteria = response.json["data"] + requirement = criteria[0]["requirementGroups"][0]["requirements"][0] + self.requirement_id = requirement["id"] + self.requirement_title = requirement["title"] + + +class TenderAwardRequirementResponsEvidenceResourceTest( + TenderAwardRequirementResponseEvidenceTestMixin, + TenderAwardPendingResourceTestCase +): + @mock.patch("openprocurement.tender.core.validation.RELEASE_ECRITERIA_ARTICLE_17", get_now() - timedelta(days=1)) + def setUp(self): + super(TenderAwardRequirementResponsEvidenceResourceTest, self).setUp() + response = self.app.get("/tenders/{}/criteria".format(self.tender_id)) + criteria = response.json["data"] + requirement = criteria[0]["requirementGroups"][0]["requirements"][0] + self.requirement_id = requirement["id"] + self.requirement_title = requirement["title"] + + request_path = "/tenders/{}/awards/{}/requirement_responses?acc_token={}".format( + self.tender_id, self.award_id, self.tender_token) + + rr_data = [{ + "title": "Requirement response", + "description": "some description", + "requirement": { + "id": self.requirement_id, + "title": self.requirement_title, + }, + "value": "True" + }] + + response = self.app.post_json(request_path, {"data": rr_data}) + self.assertEqual(response.status, "201 Created") + self.assertEqual(response.content_type, "application/json") + self.rr_id = response.json["data"][0]["id"] + + response = self.app.post( + "/tenders/{}/awards/{}/documents?acc_token={}".format( + self.tender_id, self.award_id, self.tender_token), + upload_files=[("file", "name.doc", "content")], + ) + self.assertEqual(response.status, "201 Created") + self.assertEqual(response.content_type, "application/json") + self.doc_id = response.json["data"]["id"] + + def suite(): suite = unittest.TestSuite() suite.addTest(unittest.makeSuite(Tender2LotAwardComplaintDocumentResourceTest)) diff --git a/src/openprocurement/tender/openua/tests/award_blanks.py b/src/openprocurement/tender/openua/tests/award_blanks.py index a0480d99f5..b825c9aa42 100644 --- a/src/openprocurement/tender/openua/tests/award_blanks.py +++ b/src/openprocurement/tender/openua/tests/award_blanks.py @@ -2417,3 +2417,417 @@ def tender_award_complaint_period(self): end = parse_date(award["complaintPeriod"]["endDate"]) delta = end - start self.assertEqual(delta.days, 0 if SANDBOX_MODE else STAND_STILL_TIME.days) + + +def create_award_requirement_response(self): + base_request_path = "/tenders/{}/awards/{}/requirement_responses".format(self.tender_id, self.award_id) + request_path = "{}?acc_token={}".format(base_request_path, self.tender_token) + + valid_data = [{ + "title": "Requirement response", + "description": "some description", + "requirement": { + "id": self.requirement_id, + "title": self.requirement_title, + }, + "value": "True", + }] + + response = self.app.post_json( + base_request_path, + {"data": valid_data}, + status=403, + ) + + self.assertEqual(response.status, "403 Forbidden") + self.assertEqual(response.content_type, "application/json") + self.assertIn("errors", response.json) + self.assertEqual( + response.json["errors"], + [{u'description': u'Forbidden', u'location': u'url', u'name': u'permission'}] + ) + + response = self.app.post_json( + "{}?acc_token={}".format(base_request_path, "some_random_phrase"), + {"data": valid_data}, + status=403, + ) + + self.assertEqual(response.status, "403 Forbidden") + self.assertEqual(response.content_type, "application/json") + self.assertIn("errors", response.json) + self.assertEqual( + response.json["errors"], + [{u'description': u'Forbidden', u'location': u'url', u'name': u'permission'}] + ) + + response = self.app.post_json( + request_path, + {"data": [{"description": "some description"}]}, + status=422, + ) + + self.assertEqual(response.status, "422 Unprocessable Entity") + self.assertEqual(response.content_type, "application/json") + self.assertIn("errors", response.json) + self.assertEqual( + response.json["errors"], + [{u'description': {u'requirement': [u'This field is required.'], + u'value': [u'This field is required.']}, + u'location': u'body', + u'name': 0}] + ) + + response = self.app.post_json(request_path, {"data": valid_data}) + self.assertEqual(response.status, "201 Created") + self.assertEqual(response.content_type, "application/json") + rr = response.json["data"] + + for i, rr_data in enumerate(valid_data): + for k, v in rr_data.items(): + self.assertEqual(rr[i][k], v) + + +def patch_award_requirement_response(self): + request_path = "/tenders/{}/awards/{}/requirement_responses?acc_token={}".format( + self.tender_id, self.award_id, self.tender_token) + + valid_data = [{ + "title": "Requirement response", + "description": "some description", + "requirement": { + "id": self.requirement_id, + "title": self.requirement_title, + }, + "value": "True", + }] + + response = self.app.post_json(request_path, {"data": valid_data}) + self.assertEqual(response.status, "201 Created") + self.assertEqual(response.content_type, "application/json") + rr_id = response.json["data"][0]["id"] + + base_request_path = "/tenders/{}/awards/{}/requirement_responses/{}".format(self.tender_id, self.award_id, rr_id) + request_path = "{}?acc_token={}".format(base_request_path, self.tender_token) + updated_data = { + "title": "Rquirement response updated", + "value": 100, + } + + response = self.app.patch_json( + base_request_path, + {"data": updated_data}, + status=403, + ) + + self.assertEqual(response.status, "403 Forbidden") + self.assertEqual(response.content_type, "application/json") + self.assertIn("errors", response.json) + self.assertEqual( + response.json["errors"], + [{u'description': u'Forbidden', u'location': u'url', u'name': u'permission'}] + ) + + response = self.app.patch_json( + "{}?acc_token={}".format(base_request_path, "some_random_token"), + {"data": updated_data}, + status=403, + ) + + self.assertEqual(response.status, "403 Forbidden") + self.assertEqual(response.content_type, "application/json") + self.assertIn("errors", response.json) + self.assertEqual( + response.json["errors"], + [{u'description': u'Forbidden', u'location': u'url', u'name': u'permission'}] + ) + + response = self.app.patch_json( + request_path, + {"data": updated_data}, + status=422, + ) + + self.assertEqual(response.status, "422 Unprocessable Entity") + self.assertEqual(response.content_type, "application/json") + self.assertIn("errors", response.json) + self.assertEqual( + response.json["errors"], + [{ + u'description': [u'Must be either true or false.'], + u'location': u'body', + u'name': u'value', + }] + ) + + updated_data["value"] = "True" + response = self.app.patch_json( + request_path, + {"data": updated_data}, + ) + + self.assertEqual(response.status, "200 OK") + self.assertEqual(response.content_type, "application/json") + rr = response.json["data"] + self.assertEqual(rr["title"], updated_data["title"]) + self.assertEqual(rr["value"], updated_data["value"]) + self.assertNotIn("evidences", rr) + + +def get_award_requirement_response(self): + request_path = "/tenders/{}/awards/{}/requirement_responses?acc_token={}".format( + self.tender_id, self.award_id, self.tender_token) + + valid_data = [{ + "title": "Requirement response", + "description": "some description", + "requirement": { + "id": self.requirement_id, + "title": self.requirement_title, + }, + "value": "True", + }] + + response = self.app.post_json(request_path, {"data": valid_data}) + self.assertEqual(response.status, "201 Created") + self.assertEqual(response.content_type, "application/json") + rr_id = response.json["data"][0]["id"] + + response = self.app.get("/tenders/{}/awards/{}/requirement_responses".format(self.tender_id, self.award_id)) + self.assertEqual(response.status, "200 OK") + self.assertEqual(response.content_type, "application/json") + + rrs = response.json["data"] + self.assertEqual(len(rrs), 1) + + for i, rr_data in enumerate(valid_data): + for k, v in rr_data.items(): + self.assertIn(k, rrs[i]) + self.assertEqual(v, rrs[i][k]) + + response = self.app.get("/tenders/{}/awards/{}/requirement_responses/{}".format(self.tender_id, self.award_id, rr_id)) + self.assertEqual(response.status, "200 OK") + self.assertEqual(response.content_type, "application/json") + + rr = response.json["data"] + for k, v in valid_data[0].items(): + self.assertIn(k, rr) + self.assertEqual(v, rr[k]) + + +def create_award_requirement_response_evidence(self): + base_request_path = "/tenders/{}/awards/{}/requirement_responses/{}/evidences".format( + self.tender_id, self.award_id, self.rr_id) + request_path = "{}?acc_token={}".format(base_request_path, self.tender_token) + + valid_data = { + "title": "Requirement response", + "relatedDocument": { + "id": self.doc_id, + "title": "name.doc", + }, + "type": "document", + } + + response = self.app.post_json( + base_request_path, + {"data": valid_data}, + status=403, + ) + + self.assertEqual(response.status, "403 Forbidden") + self.assertEqual(response.content_type, "application/json") + self.assertIn("errors", response.json) + self.assertEqual( + response.json["errors"], + [{u'description': u'Forbidden', u'location': u'url', u'name': u'permission'}] + ) + + response = self.app.post_json( + "{}?acc_token={}".format(base_request_path, "some_test_token"), + {"data": valid_data}, + status=403, + ) + + self.assertEqual(response.status, "403 Forbidden") + self.assertEqual(response.content_type, "application/json") + self.assertIn("errors", response.json) + self.assertEqual( + response.json["errors"], + [{u'description': u'Forbidden', u'location': u'url', u'name': u'permission'}] + ) + + response = self.app.post_json( + request_path, + {"data": { + "description": "some description" + }}, + status=422 + ) + + self.assertEqual(response.status, "422 Unprocessable Entity") + self.assertEqual(response.content_type, "application/json") + self.assertIn("errors", response.json) + self.assertEqual( + response.json["errors"], + [{u'description': [u'This field is required.'], + u'location': u'body', + u'name': u'title'}] + ) + + response = self.app.post_json( + request_path, + {"data": { + "title": "Some title", + "description": "some description", + }}, + status=422, + ) + + self.assertEqual(response.status, "422 Unprocessable Entity") + self.assertEqual(response.content_type, "application/json") + self.assertIn("errors", response.json) + self.assertEqual( + response.json["errors"], + [{u'description': [u'type should be one of eligibleEvidences types'], + u'location': u'body', + u'name': u'type'}], + ) + + response = self.app.post_json( + request_path, + {"data": { + "title": "Some title", + "description": "some description", + "type": "document", + }}, + status=422, + ) + + self.assertEqual(response.status, "422 Unprocessable Entity") + self.assertEqual(response.content_type, "application/json") + self.assertIn("errors", response.json) + self.assertEqual( + response.json["errors"], + [{u'description': [u'This field is required.'], + u'location': u'body', + u'name': u'relatedDocument'}] + ) + + response = self.app.post_json( + request_path, + {"data": { + "title": "Some title", + "description": "some description", + "type": "document", + "relatedDocument": { + "id": "0"*32, + "title": "name.doc", + } + }}, + status=422, + ) + + self.assertEqual(response.status, "422 Unprocessable Entity") + self.assertEqual(response.content_type, "application/json") + self.assertIn("errors", response.json) + self.assertEqual( + response.json["errors"], + [{u'description': [u'relatedDocument.id should be one of award documents'], + u'location': u'body', + u'name': u'relatedDocument'}] + ) + + response = self.app.post_json( + request_path, + {"data": valid_data} + ) + + self.assertEqual(response.status, "201 Created") + self.assertEqual(response.content_type, "application/json") + evidence = response.json["data"] + + for k, v in valid_data.items(): + self.assertIn(k, evidence) + self.assertEqual(evidence[k], v) + + +def patch_award_requirement_response_evidence(self): + + valid_data = { + "title": "Requirement response", + "relatedDocument": { + "id": self.doc_id, + "title": "name.doc", + }, + "type": "document", + } + + response = self.app.post_json( + "/tenders/{}/awards/{}/requirement_responses/{}/evidences?acc_token={}".format( + self.tender_id, self.award_id, self.rr_id, self.tender_token), + {"data": valid_data}, + ) + + self.assertEqual(response.status, "201 Created") + self.assertEqual(response.content_type, "application/json") + evidence_id = response.json["data"]["id"] + + updated_data = { + "title": "Updated title", + "description": "Updated description", + } + + response = self.app.patch_json( + "/tenders/{}/awards/{}/requirement_responses/{}/evidences/{}?acc_token={}".format( + self.tender_id, self.award_id, self.rr_id, evidence_id, self.tender_token), + {"data": updated_data}, + ) + self.assertEqual(response.status, "200 OK") + self.assertEqual(response.content_type, "application/json") + evidence = response.json["data"] + + self.assertEqual(evidence["title"], updated_data["title"]) + self.assertEqual(evidence["description"], updated_data["description"]) + + +def get_award_requirement_response_evidence(self): + valid_data = { + "title": "Requirement response", + "relatedDocument": { + "id": self.doc_id, + "title": "name.doc", + }, + "type": "document", + } + + response = self.app.post_json( + "/tenders/{}/awards/{}/requirement_responses/{}/evidences?acc_token={}".format( + self.tender_id, self.award_id, self.rr_id, self.tender_token), + {"data": valid_data}, + ) + + self.assertEqual(response.status, "201 Created") + self.assertEqual(response.content_type, "application/json") + evidence_id = response.json["data"]["id"] + + response = self.app.get("/tenders/{}/awards/{}/requirement_responses/{}/evidences".format( + self.tender_id, self.award_id, self.rr_id + )) + + evidences = response.json["data"] + self.assertEqual(len(evidences), 1) + + for k, v in valid_data.items(): + self.assertIn(k, evidences[0]) + self.assertEqual(v, evidences[0][k]) + + response = self.app.get("/tenders/{}/awards/{}/requirement_responses/{}/evidences/{}".format( + self.tender_id, self.award_id, self.rr_id, evidence_id)) + self.assertEqual(response.status, "200 OK") + self.assertEqual(response.content_type, "application/json") + + rr = response.json["data"] + for k, v in valid_data.items(): + self.assertIn(k, rr) + self.assertEqual(v, rr[k]) diff --git a/src/openprocurement/tender/openua/tests/base.py b/src/openprocurement/tender/openua/tests/base.py index daab958de4..c40c738a5b 100644 --- a/src/openprocurement/tender/openua/tests/base.py +++ b/src/openprocurement/tender/openua/tests/base.py @@ -6,12 +6,15 @@ from openprocurement.api.constants import SANDBOX_MODE from openprocurement.api.tests.base import BaseWebTest from openprocurement.api.utils import get_now +from openprocurement.api.constants import RELEASE_ECRITERIA_ARTICLE_17 from openprocurement.tender.belowthreshold.tests.base import ( test_tender_data as test_tender_data_api, test_features_tender_data, BaseTenderWebTest, test_bids as base_test_bids, ) +from openprocurement.tender.openua.models import Tender +from openprocurement.tender.openua.tests.periods import PERIODS now = get_now() test_tender_data = test_tender_ua_data = test_tender_data_api.copy() @@ -45,8 +48,13 @@ test_tender_data["procurementMethodDetails"] = "quick, accelerator=1440" test_bids = deepcopy(base_test_bids) + +bid_update_data = {"selfQualified": True} +if get_now() < RELEASE_ECRITERIA_ARTICLE_17: + bid_update_data["selfEligible"] = True + for i in test_bids: - i.update({"selfEligible": True, "selfQualified": True}) + i.update(bid_update_data) test_features_tender_ua_data = test_features_tender_data.copy() test_features_tender_ua_data["procurementMethodType"] = "aboveThresholdUA" @@ -66,6 +74,7 @@ class BaseTenderUAWebTest(BaseTenderWebTest): initial_status = None initial_bids = None initial_lots = None + initial_criteria = None primary_tender_status = "active.tendering" # status, to which tender should be switched from 'draft' question_claim_block_status = ( "active.auction" @@ -89,39 +98,14 @@ class BaseTenderUAWebTest(BaseTenderWebTest): "active.tendering" ) # status, in which adding document to tender auction is forbidden + periods = PERIODS + tender_class = Tender + def set_enquiry_period_end(self): - now = get_now() - self.set_status( - "active.tendering", - { - "enquiryPeriod": { - "startDate": (now - timedelta(days=15)).isoformat(), - "endDate": (now - (timedelta(minutes=1) if SANDBOX_MODE else timedelta(days=1))).isoformat(), - }, - "tenderPeriod": { - "startDate": (now - timedelta(days=15)).isoformat(), - "endDate": (now + (timedelta(minutes=2) if SANDBOX_MODE else timedelta(days=2))).isoformat(), - }, - "auctionPeriod": {"startDate": (now + timedelta(days=2)).isoformat()}, - }, - ) + self.set_status("active.tendering", startend="enquiry_end") def set_complaint_period_end(self): - now = get_now() - self.set_status( - "active.tendering", - { - "enquiryPeriod": { - "startDate": (now - timedelta(days=14)).isoformat(), - "endDate": (now + (timedelta(minutes=1) if SANDBOX_MODE else timedelta(days=1))).isoformat(), - }, - "tenderPeriod": { - "startDate": (now - timedelta(days=14)).isoformat(), - "endDate": (now + (timedelta(minutes=3) if SANDBOX_MODE else timedelta(days=3))).isoformat(), - }, - "auctionPeriod": {"startDate": (now + timedelta(days=2)).isoformat()}, - }, - ) + self.set_status("active.tendering", startend="complaint_end") def set_all_awards_complaint_period_end(self): now = get_now() @@ -132,131 +116,6 @@ def set_all_awards_complaint_period_end(self): award.update({"complaintPeriod": {"startDate": startDate, "endDate": endDate}}) self.db.save(tender_document) - def update_status(self, status, extra=None): - now = get_now() - data = {"status": status} - if status == "active.tendering": - data.update( - { - "enquiryPeriod": { - "startDate": (now).isoformat(), - "endDate": (now + timedelta(days=13)).isoformat(), - }, - "tenderPeriod": {"startDate": (now).isoformat(), "endDate": (now + timedelta(days=16)).isoformat()}, - } - ) - elif status == "active.auction": - data.update( - { - "enquiryPeriod": { - "startDate": (now - timedelta(days=16)).isoformat(), - "endDate": (now - timedelta(days=3)).isoformat(), - }, - "tenderPeriod": {"startDate": (now - timedelta(days=16)).isoformat(), "endDate": (now).isoformat()}, - "auctionPeriod": {"startDate": (now).isoformat()}, - } - ) - if self.initial_lots: - data.update({"lots": [{"auctionPeriod": {"startDate": (now).isoformat()}} for i in self.initial_lots]}) - elif status == "active.qualification": - data.update( - { - "enquiryPeriod": { - "startDate": (now - timedelta(days=17)).isoformat(), - "endDate": (now - timedelta(days=4)).isoformat(), - }, - "tenderPeriod": { - "startDate": (now - timedelta(days=17)).isoformat(), - "endDate": (now - timedelta(days=1)).isoformat(), - }, - "auctionPeriod": {"startDate": (now - timedelta(days=1)).isoformat(), "endDate": (now).isoformat()}, - "awardPeriod": {"startDate": (now).isoformat()}, - } - ) - if self.initial_lots: - data.update( - { - "lots": [ - { - "auctionPeriod": { - "startDate": (now - timedelta(days=1)).isoformat(), - "endDate": (now).isoformat(), - } - } - for i in self.initial_lots - ] - } - ) - elif status == "active.awarded": - data.update( - { - "enquiryPeriod": { - "startDate": (now - timedelta(days=17)).isoformat(), - "endDate": (now - timedelta(days=4)).isoformat(), - }, - "tenderPeriod": { - "startDate": (now - timedelta(days=17)).isoformat(), - "endDate": (now - timedelta(days=1)).isoformat(), - }, - "auctionPeriod": {"startDate": (now - timedelta(days=1)).isoformat(), "endDate": (now).isoformat()}, - "awardPeriod": {"startDate": (now).isoformat(), "endDate": (now).isoformat()}, - } - ) - if self.initial_lots: - data.update( - { - "lots": [ - { - "auctionPeriod": { - "startDate": (now - timedelta(days=1)).isoformat(), - "endDate": (now).isoformat(), - } - } - for i in self.initial_lots - ] - } - ) - elif status == "complete": - data.update( - { - "enquiryPeriod": { - "startDate": (now - timedelta(days=25)).isoformat(), - "endDate": (now - timedelta(days=11)).isoformat(), - }, - "tenderPeriod": { - "startDate": (now - timedelta(days=25)).isoformat(), - "endDate": (now - timedelta(days=8)).isoformat(), - }, - "auctionPeriod": { - "startDate": (now - timedelta(days=8)).isoformat(), - "endDate": (now - timedelta(days=7)).isoformat(), - }, - "awardPeriod": { - "startDate": (now - timedelta(days=7)).isoformat(), - "endDate": (now - timedelta(days=7)).isoformat(), - }, - } - ) - if self.initial_lots: - data.update( - { - "lots": [ - { - "auctionPeriod": { - "startDate": (now - timedelta(days=8)).isoformat(), - "endDate": (now - timedelta(days=7)).isoformat(), - } - } - for i in self.initial_lots - ] - } - ) - - self.tender_document_patch = data - if extra: - self.tender_document_patch.update(extra) - self.save_changes() - class BaseTenderUAContentWebTest(BaseTenderUAWebTest): initial_data = test_tender_data diff --git a/src/openprocurement/tender/openua/tests/bid.py b/src/openprocurement/tender/openua/tests/bid.py index a25ffe0aad..30023e07ad 100644 --- a/src/openprocurement/tender/openua/tests/bid.py +++ b/src/openprocurement/tender/openua/tests/bid.py @@ -1,9 +1,18 @@ # -*- coding: utf-8 -*- import unittest +from mock import patch +from datetime import timedelta +from copy import deepcopy from openprocurement.api.tests.base import snitch +from openprocurement.api.utils import get_now -from openprocurement.tender.belowthreshold.tests.base import test_organization, test_author, test_lots +from openprocurement.tender.belowthreshold.tests.base import ( + test_organization, + test_author, + test_lots, + test_criteria, +) from openprocurement.tender.belowthreshold.tests.bid_blanks import ( # TenderBidDocumentResourceTest not_found, @@ -51,6 +60,15 @@ create_tender_bidder_document_json, put_tender_bidder_document_json, tender_bidder_confidential_document, + # TenderBidRequirementResponseResourceTest + create_bid_requirement_response, + patch_bid_requirement_response, + get_bid_requirement_response, + # TenderBidRequirementResponseEvidenceResourceTest + create_bid_requirement_response_evidence, + patch_bid_requirement_response_evidence, + get_bid_requirement_response_evidence, + bid_activate, ) @@ -71,6 +89,7 @@ class TenderBidResourceTestMixin(object): test_create_tender_bid_no_scale = snitch(create_tender_bid_no_scale) +@patch("openprocurement.tender.core.validation.RELEASE_ECRITERIA_ARTICLE_17", get_now() - timedelta(days=1)) class TenderBidDocumentResourceTestMixin(object): test_create_tender_bidder_document = snitch(create_tender_bidder_document) test_put_tender_bidder_document = snitch(put_tender_bidder_document) @@ -78,6 +97,88 @@ class TenderBidDocumentResourceTestMixin(object): test_create_tender_bidder_document_nopending = snitch(create_tender_bidder_document_nopending) +@patch("openprocurement.tender.core.validation.RELEASE_ECRITERIA_ARTICLE_17", get_now() - timedelta(days=1)) +class TenderBidRequirementResponseTestMixin(object): + test_create_bid_requirement_response = snitch(create_bid_requirement_response) + test_patch_bid_requirement_response = snitch(patch_bid_requirement_response) + test_get_bid_requirement_response = snitch(get_bid_requirement_response) + + initial_criteria = test_criteria + + @patch("openprocurement.tender.core.validation.RELEASE_ECRITERIA_ARTICLE_17", get_now() - timedelta(days=1)) + def setUp(self): + super(TenderBidRequirementResponseTestMixin, self).setUp() + response = self.app.get("/tenders/{}/criteria".format(self.tender_id)) + criteria = response.json["data"] + requirement = criteria[0]["requirementGroups"][0]["requirements"][0] + self.requirement_id = requirement["id"] + self.requirement_title = requirement["title"] + + +@patch("openprocurement.tender.core.validation.RELEASE_ECRITERIA_ARTICLE_17", get_now() - timedelta(days=1)) +class TenderBidRequirementResponseEvidenceTestMixin(object): + test_create_bid_requirement_response_evidence = snitch(create_bid_requirement_response_evidence) + test_patch_bid_requirement_response_evidence = snitch(patch_bid_requirement_response_evidence) + test_get_bid_requirement_response_evidence = snitch(get_bid_requirement_response_evidence) + test_bid_activate = snitch(bid_activate) + + initial_criteria = test_criteria + + @patch("openprocurement.tender.core.validation.RELEASE_ECRITERIA_ARTICLE_17", get_now() - timedelta(days=1)) + def setUp(self): + super(TenderBidRequirementResponseEvidenceTestMixin, self).setUp() + response = self.app.get("/tenders/{}/criteria".format(self.tender_id)) + criteria = response.json["data"] + requirement = criteria[0]["requirementGroups"][0]["requirements"][0] + self.requirement_id = requirement["id"] + self.requirement_title = requirement["title"] + + request_path = "/tenders/{}/bids/{}/requirement_responses?acc_token={}".format( + self.tender_id, self.bid_id, self.bid_token) + + rr_data = [{ + "title": "Requirement response", + "description": "some description", + "requirement": { + "id": self.requirement_id, + "title": self.requirement_title, + }, + "value": True, + }] + + response = self.app.post_json(request_path, {"data": rr_data}) + self.assertEqual(response.status, "201 Created") + self.assertEqual(response.content_type, "application/json") + self.rr_id = response.json["data"][0]["id"] + + response = self.app.post( + "/tenders/{}/bids/{}/documents?acc_token={}".format( + self.tender_id, self.bid_id, self.bid_token), + upload_files=[("file", "name.doc", "content")], + ) + self.assertEqual(response.status, "201 Created") + self.assertEqual(response.content_type, "application/json") + self.doc_id = response.json["data"]["id"] + + +class CreateBidMixin(object): + base_bid_status = "active" + + def setUp(self): + super(CreateBidMixin, self).setUp() + bid_data = deepcopy(test_bids[0]) + bid_data["status"] = self.base_bid_status + + # Create bid + response = self.app.post_json( + "/tenders/{}/bids".format(self.tender_id), + {"data": bid_data}, + ) + bid = response.json["data"] + self.bid_id = bid["id"] + self.bid_token = response.json["access"]["token"] + + class TenderBidResourceTest(BaseTenderUAContentWebTest, TenderBidResourceTestMixin): initial_data = test_tender_data initial_status = "active.tendering" @@ -100,34 +201,17 @@ class Tender2LotBidResourceTest(BaseTenderUAContentWebTest): class TenderBidFeaturesResourceTest(BaseTenderUAContentWebTest): initial_data = test_features_tender_ua_data initial_status = "active.tendering" + test_bids_data = test_bids test_features_bidder = snitch(features_bidder) test_features_bidder_invalid = snitch(features_bidder_invalid) -class TenderBidDocumentResourceTest(BaseTenderUAContentWebTest, TenderBidDocumentResourceTestMixin): +class TenderBidDocumentResourceTest(CreateBidMixin, TenderBidDocumentResourceTestMixin, BaseTenderUAContentWebTest): initial_status = "active.tendering" test_bids_data = test_bids author_data = test_author - def setUp(self): - super(TenderBidDocumentResourceTest, self).setUp() - # Create bid - response = self.app.post_json( - "/tenders/{}/bids".format(self.tender_id), - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": [test_organization], - "value": {"amount": 500}, - } - }, - ) - bid = response.json["data"] - self.bid_id = bid["id"] - self.bid_token = response.json["access"]["token"] - test_not_found = snitch(not_found) @@ -159,12 +243,34 @@ class TenderBidderBatchDocumentWithDSResourceTest(BaseTenderUAContentWebTest): create_tender_bid_with_documents = snitch(create_tender_bid_with_documents) +class TenderBidRequirementResponseResourceTest( + TenderBidRequirementResponseTestMixin, + CreateBidMixin, + BaseTenderUAContentWebTest, +): + initial_data = test_tender_data + base_bid_status = "draft" + initial_status = "active.tendering" + + +class TenderBidRequirementResponseEvidenceResourceTest( + TenderBidRequirementResponseEvidenceTestMixin, + CreateBidMixin, + BaseTenderUAContentWebTest, +): + initial_data = test_tender_data + base_bid_status = "draft" + initial_status = "active.tendering" + + def suite(): suite = unittest.TestSuite() suite.addTest(unittest.makeSuite(TenderBidDocumentResourceTest)) suite.addTest(unittest.makeSuite(TenderBidDocumentWithDSResourceTest)) suite.addTest(unittest.makeSuite(TenderBidFeaturesResourceTest)) suite.addTest(unittest.makeSuite(TenderBidResourceTest)) + suite.addTest(unittest.makeSuite(TenderBidRequirementResponseResourceTest)) + suite.addTest(unittest.makeSuite(TenderBidRequirementResponseEvidenceResourceTest)) return suite diff --git a/src/openprocurement/tender/openua/tests/bid_blanks.py b/src/openprocurement/tender/openua/tests/bid_blanks.py index 58ec1d37a8..be2bb85eb6 100644 --- a/src/openprocurement/tender/openua/tests/bid_blanks.py +++ b/src/openprocurement/tender/openua/tests/bid_blanks.py @@ -155,9 +155,12 @@ def create_tender_biddder_invalid(self): ], ) + bid_data = deepcopy(self.test_bids_data[0]) + del bid_data["value"] + response = self.app.post_json( request_path, - {"data": {"selfEligible": True, "selfQualified": True, "tenderers": [test_organization]}}, + {"data": bid_data}, status=422, ) self.assertEqual(response.status, "422 Unprocessable Entity") @@ -168,16 +171,11 @@ def create_tender_biddder_invalid(self): [{u"description": [u"This field is required."], u"location": u"body", u"name": u"value"}], ) + bid_data["value"] = {"amount": 500, "valueAddedTaxIncluded": False} + response = self.app.post_json( request_path, - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": [test_organization], - "value": {"amount": 500, "valueAddedTaxIncluded": False}, - } - }, + {"data": bid_data}, status=422, ) self.assertEqual(response.status, "422 Unprocessable Entity") @@ -196,16 +194,10 @@ def create_tender_biddder_invalid(self): ], ) + bid_data["value"] = {"amount": 500, "currency": "USD"} response = self.app.post_json( request_path, - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": [test_organization], - "value": {"amount": 500, "currency": "USD"}, - } - }, + {"data": bid_data}, status=422, ) self.assertEqual(response.status, "422 Unprocessable Entity") @@ -222,16 +214,12 @@ def create_tender_biddder_invalid(self): ], ) + bid_data["value"] = {"amount": 500} + bid_data["tenderers"] = test_organization + response = self.app.post_json( request_path, - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": test_organization, - "value": {"amount": 500}, - } - }, + {"data": bid_data}, status=422, ) self.assertEqual(response.status, "422 Unprocessable Entity") @@ -241,16 +229,10 @@ def create_tender_biddder_invalid(self): def create_tender_bidder(self): + bid_data = deepcopy(self.test_bids_data[0]) response = self.app.post_json( "/tenders/{}/bids".format(self.tender_id), - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": [test_organization], - "value": {"amount": 500}, - } - }, + {"data": bid_data}, ) self.assertEqual(response.status, "201 Created") self.assertEqual(response.content_type, "application/json") @@ -271,14 +253,7 @@ def create_tender_bidder(self): response = self.app.post_json( "/tenders/{}/bids".format(self.tender_id), - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": [test_organization], - "value": {"amount": 500}, - } - }, + {"data": bid_data}, status=403, ) self.assertEqual(response.status, "403 Forbidden") @@ -289,14 +264,7 @@ def create_tender_bidder(self): response = self.app.post_json( "/tenders/{}/bids".format(self.tender_id), - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": [test_organization], - "value": {"amount": 500}, - } - }, + {"data": bid_data}, status=403, ) self.assertEqual(response.status, "403 Forbidden") @@ -305,17 +273,15 @@ def create_tender_bidder(self): def patch_tender_bidder(self): + bid_data = deepcopy(self.test_bids_data[0]) + bid_data.update({ + "value": {"amount": 500}, + "status": "draft", + }) + response = self.app.post_json( "/tenders/{}/bids".format(self.tender_id), - { - "data": { - "selfEligible": True, - "selfQualified": True, - "status": "draft", - "tenderers": [self.test_bids_data[0]["tenderers"][0]], - "value": {"amount": 500}, - } - }, + {"data": bid_data}, ) self.assertEqual(response.status, "201 Created") self.assertEqual(response.content_type, "application/json") @@ -412,16 +378,14 @@ def patch_tender_bidder(self): def get_tender_bidder(self): + bid_data = deepcopy(self.test_bids_data[0]) + bid_data.update({ + "tenderers": [self.test_bids_data[0]["tenderers"][0]], + "value": {"amount": 500}, + }) response = self.app.post_json( "/tenders/{}/bids".format(self.tender_id), - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": [self.test_bids_data[0]["tenderers"][0]], - "value": {"amount": 500}, - } - }, + {"data": bid_data}, ) self.assertEqual(response.status, "201 Created") self.assertEqual(response.content_type, "application/json") @@ -475,16 +439,10 @@ def get_tender_bidder(self): def delete_tender_bidder(self): + bid_data = deepcopy(self.test_bids_data[0]) response = self.app.post_json( "/tenders/{}/bids".format(self.tender_id), - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": [self.test_bids_data[0]["tenderers"][0]], - "value": {"amount": 500}, - } - }, + {"data": bid_data}, ) self.assertEqual(response.status, "201 Created") self.assertEqual(response.content_type, "application/json") @@ -538,14 +496,7 @@ def delete_tender_bidder(self): def deleted_bid_is_not_restorable(self): response = self.app.post_json( "/tenders/{}/bids".format(self.tender_id), - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": [test_organization], - "value": {"amount": 500}, - } - }, + {"data": self.test_bids_data[0]}, ) self.assertEqual(response.status, "201 Created") self.assertEqual(response.content_type, "application/json") @@ -577,17 +528,13 @@ def deleted_bid_is_not_restorable(self): def deleted_bid_do_not_locks_tender_in_state(self): bids = [] bids_tokens = [] + bid_data = deepcopy(self.test_bids_data[0]) + bid_data["tenderers"] = [self.test_bids_data[0]["tenderers"][0]] for bid_amount in (400, 405): + bid_data["value"] = {"amount": bid_amount} response = self.app.post_json( "/tenders/{}/bids".format(self.tender_id), - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": [self.test_bids_data[0]["tenderers"][0]], - "value": {"amount": bid_amount}, - } - }, + {"data": bid_data}, ) self.assertEqual(response.status, "201 Created") self.assertEqual(response.content_type, "application/json") @@ -619,16 +566,15 @@ def deleted_bid_do_not_locks_tender_in_state(self): def get_tender_tenderers(self): + bid_data = deepcopy(self.test_bids_data[0]) + bid_data.update({ + "tenderers": [self.test_bids_data[0]["tenderers"][0]], + "value": {"amount": 500}, + }) + response = self.app.post_json( "/tenders/{}/bids".format(self.tender_id), - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": [self.test_bids_data[0]["tenderers"][0]], - "value": {"amount": 500}, - } - }, + {"data": bid_data}, ) self.assertEqual(response.status, "201 Created") self.assertEqual(response.content_type, "application/json") @@ -658,16 +604,13 @@ def get_tender_tenderers(self): def bid_Administrator_change(self): + + bid_data = deepcopy(self.test_bids_data[0]) + bid_data["value"] = {"amount": 500} + response = self.app.post_json( "/tenders/{}/bids".format(self.tender_id), - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": [self.test_bids_data[0]["tenderers"][0]], - "value": {"amount": 500}, - } - }, + {"data": bid_data}, ) self.assertEqual(response.status, "201 Created") self.assertEqual(response.content_type, "application/json") @@ -684,17 +627,15 @@ def bid_Administrator_change(self): def draft1_bid(self): + bid_data = deepcopy(test_bids[0]) + bid_data.update({ + "tenderers": [self.test_bids_data[0]["tenderers"][0]], + "value": {"amount": 500}, + "status": "draft", + }) response = self.app.post_json( "/tenders/{}/bids".format(self.tender_id), - { - "data": { - "selfEligible": True, - "selfQualified": True, - "status": "draft", - "tenderers": [self.test_bids_data[0]["tenderers"][0]], - "value": {"amount": 500}, - } - }, + {"data": bid_data}, ) self.assertEqual(response.status, "201 Created") self.assertEqual(response.content_type, "application/json") @@ -709,29 +650,18 @@ def draft1_bid(self): def draft2_bids(self): + bid_data = deepcopy(test_bids[0]) + bid_data["value"] = {"amount": 500} + bid_data["status"] = "draft" + bid_data["tenderers"] = [self.test_bids_data[0]["tenderers"][0]] + response = self.app.post_json( "/tenders/{}/bids".format(self.tender_id), - { - "data": { - "selfEligible": True, - "selfQualified": True, - "status": "draft", - "tenderers": [self.test_bids_data[0]["tenderers"][0]], - "value": {"amount": 500}, - } - }, + {"data": bid_data} ) response = self.app.post_json( "/tenders/{}/bids".format(self.tender_id), - { - "data": { - "selfEligible": True, - "selfQualified": True, - "status": "draft", - "tenderers": [self.test_bids_data[0]["tenderers"][0]], - "value": {"amount": 500}, - } - }, + {"data": bid_data}, ) self.assertEqual(response.status, "201 Created") self.assertEqual(response.content_type, "application/json") @@ -749,7 +679,7 @@ def bids_invalidation_on_tender_change(self): bids_access = {} # submit bids - for data in test_bids: + for data in self.test_bids_data: response = self.app.post_json("/tenders/{}/bids".format(self.tender_id), {"data": data}) self.assertEqual(response.status, "201 Created") self.assertEqual(response.content_type, "application/json") @@ -764,7 +694,8 @@ def bids_invalidation_on_tender_change(self): # update tender. we can set value that is less than a value in bids as # they will be invalidated by this request response = self.app.patch_json( - "/tenders/{}?acc_token={}".format(self.tender_id, self.tender_token), {"data": {"value": {"amount": 300.0}}} + "/tenders/{}?acc_token={}".format(self.tender_id, self.tender_token), + {"data": {"value": {"amount": 300.0}, "minimalStep": {"amount": 9.0}}} ) self.assertEqual(response.status, "200 OK") self.assertEqual(response.json["data"]["value"]["amount"], 300) @@ -777,7 +708,7 @@ def bids_invalidation_on_tender_change(self): # check that tender status change does not invalidate bids # submit one more bid. check for invalid value first - response = self.app.post_json("/tenders/{}/bids".format(self.tender_id), {"data": test_bids[0]}, status=422) + response = self.app.post_json("/tenders/{}/bids".format(self.tender_id), {"data": self.test_bids_data[0]}, status=422) self.assertEqual(response.status, "422 Unprocessable Entity") self.assertEqual(response.content_type, "application/json") self.assertEqual(response.json["status"], "error") @@ -792,7 +723,7 @@ def bids_invalidation_on_tender_change(self): ], ) # and submit valid bid - data = deepcopy(test_bids[0]) + data = deepcopy(self.test_bids_data[0]) data["value"]["amount"] = 299 response = self.app.post_json("/tenders/{}/bids".format(self.tender_id), {"data": data}) self.assertEqual(response.status, "201 Created") @@ -856,7 +787,7 @@ def bids_activation_on_tender_documents(self): bids_access = {} # submit bids - for data in test_bids: + for data in self.test_bids_data: response = self.app.post_json("/tenders/{}/bids".format(self.tender_id), {"data": data}) self.assertEqual(response.status, "201 Created") self.assertEqual(response.content_type, "application/json") @@ -882,16 +813,14 @@ def bids_activation_on_tender_documents(self): def create_tender_bid_no_scale_invalid(self): request_path = "/tenders/{}/bids".format(self.tender_id) - bid_data = { - "data": { - "selfEligible": True, - "selfQualified": True, - "value": {"amount": 500}, - "tenderers": [ - {key: value for key, value in self.test_bids_data[0]["tenderers"][0].iteritems() if key != "scale"} - ], - } - } + bid_data = deepcopy(self.test_bids_data[0]) + bid_data.update({ + "value": {"amount": 500}, + "tenderers": [ + {key: value for key, value in self.test_bids_data[0]["tenderers"][0].iteritems() if key != "scale"} + ], + }) + bid_data = {"data": bid_data} response = self.app.post_json(request_path, bid_data, status=422) self.assertEqual(response.status, "422 Unprocessable Entity") self.assertEqual(response.content_type, "application/json") @@ -905,16 +834,13 @@ def create_tender_bid_no_scale_invalid(self): @mock.patch("openprocurement.api.models.ORGANIZATION_SCALE_FROM", get_now() + timedelta(days=1)) def create_tender_bid_with_scale_not_required(self): request_path = "/tenders/{}/bids".format(self.tender_id) - bid_data = { - "data": { - "selfEligible": True, - "selfQualified": True, - "value": {"amount": 500}, - "tenderers": [self.test_bids_data[0]["tenderers"][0]], - } - } - response = self.app.post_json(request_path, bid_data) - response = self.app.post_json(request_path, bid_data) + + bid_data = deepcopy(self.test_bids_data[0]) + bid_data["value"] = {"amount": 500} + bid_data["tenderers"] = [self.test_bids_data[0]["tenderers"][0]] + + response = self.app.post_json(request_path, {"data": bid_data}) + response = self.app.post_json(request_path, {"data": bid_data}) self.assertEqual(response.status, "201 Created") self.assertEqual(response.content_type, "application/json") self.assertNotIn("scale", response.json["data"]) @@ -922,17 +848,15 @@ def create_tender_bid_with_scale_not_required(self): @mock.patch("openprocurement.api.models.ORGANIZATION_SCALE_FROM", get_now() + timedelta(days=1)) def create_tender_bid_no_scale(self): + bid_data = deepcopy(self.test_bids_data[0]) + bid_data.update({ + "value": {"amount": 500}, + "tenderers": [ + {key: value for key, value in self.test_bids_data[0]["tenderers"][0].iteritems() if key != "scale"} + ], + }) request_path = "/tenders/{}/bids".format(self.tender_id) - test_data = { - "data": { - "selfEligible": True, - "selfQualified": True, - "value": {"amount": 500}, - "tenderers": [ - {key: value for key, value in self.test_bids_data[0]["tenderers"][0].iteritems() if key != "scale"} - ], - } - } + test_data = {"data": bid_data} response = self.app.post_json(request_path, test_data) self.assertEqual(response.status, "201 Created") self.assertEqual(response.content_type, "application/json") @@ -943,24 +867,12 @@ def create_tender_bid_no_scale(self): def features_bidder(self): - test_features_bids = [ - { - # "status": "active", - "parameters": [{"code": i["code"], "value": 0.1} for i in self.initial_data["features"]], - "tenderers": [test_organization], - "value": {"amount": 469, "currency": "UAH", "valueAddedTaxIncluded": True}, - "selfEligible": True, - "selfQualified": True, - }, - { - "status": "active", - "parameters": [{"code": i["code"], "value": 0.15} for i in self.initial_data["features"]], - "tenderers": [test_organization], - "value": {"amount": 479, "currency": "UAH", "valueAddedTaxIncluded": True}, - "selfEligible": True, - "selfQualified": True, - }, - ] + test_features_bids = deepcopy(self.test_bids_data) + test_features_bids[0]["parameters"] = [{"code": i["code"], "value": 0.1} for i in self.initial_data["features"]] + test_features_bids[1].update({ + "parameters": [{"code": i["code"], "value": 0.1} for i in self.initial_data["features"]], + "status": "active", + }) for i in test_features_bids: response = self.app.post_json("/tenders/{}/bids".format(self.tender_id), {"data": i}) i["status"] = "active" @@ -973,12 +885,7 @@ def features_bidder(self): def features_bidder_invalid(self): - data = { - "tenderers": [test_organization], - "value": {"amount": 469, "currency": "UAH", "valueAddedTaxIncluded": True}, - "selfEligible": True, - "selfQualified": True, - } + data = deepcopy(self.test_bids_data[0]) response = self.app.post_json("/tenders/{}/bids".format(self.tender_id), {"data": data}, status=422) self.assertEqual(response.status, "422 Unprocessable Entity") self.assertEqual(response.content_type, "application/json") @@ -1325,16 +1232,15 @@ def patch_tender_bidder_document(self): def create_tender_bidder_document_nopending(self): + bid_data = deepcopy(test_bids[0]) + bid_data.update({ + "tenderers": [self.test_bids_data[0]["tenderers"][0]], + "value": {"amount": 500}, + }) + response = self.app.post_json( "/tenders/{}/bids".format(self.tender_id), - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": [self.test_bids_data[0]["tenderers"][0]], - "value": {"amount": 500}, - } - }, + {"data": bid_data}, ) bid = response.json["data"] bid_id = bid["id"] @@ -1797,3 +1703,589 @@ def tender_bidder_confidential_document(self): status=403 ) self.assertEqual(response.json, expected_error) + + +def create_bid_requirement_response(self): + self.app.authorization = ("Basic", ("broker", "")) + + base_request_path = "/tenders/{}/bids/{}/requirement_responses".format(self.tender_id, self.bid_id) + request_path = "{}?acc_token={}".format(base_request_path, self.bid_token) + + valid_data = [{ + "title": "Requirement response", + "description": "some description", + "requirement": { + "id": self.requirement_id, + "title": self.requirement_title, + }, + "value": True, + }] + + response = self.app.post_json( + base_request_path, + {"data": valid_data}, + status=403, + ) + + self.assertEqual(response.status, "403 Forbidden") + self.assertEqual(response.content_type, "application/json") + self.assertIn("errors", response.json) + self.assertEqual( + response.json["errors"], + [{u'description': u'Forbidden', u'location': u'url', u'name': u'permission'}] + ) + + response = self.app.post_json( + "{}?acc_token={}".format(base_request_path, self.tender_token), + {"data": valid_data}, + status=403, + ) + + self.assertEqual(response.status, "403 Forbidden") + self.assertEqual(response.content_type, "application/json") + self.assertIn("errors", response.json) + self.assertEqual( + response.json["errors"], + [{u'description': u'Forbidden', u'location': u'url', u'name': u'permission'}] + ) + + response = self.app.post_json( + request_path, + {"data": [{"description": "some description"}]}, + status=422, + ) + + self.assertEqual(response.status, "422 Unprocessable Entity") + self.assertEqual(response.content_type, "application/json") + self.assertIn("errors", response.json) + self.assertEqual( + response.json["errors"], + [{u'description': {u'requirement': [u'This field is required.'], u'value': [u'This field is required.']}, + u'location': u'body', + u'name': 0}] + ) + + response = self.app.post_json( + request_path, + {"data": [{ + "description": "some description", + "requirement": { + "id": self.requirement_id, + "title": self.requirement_title, + }, + "value": False, + }]}, + status=422, + ) + self.assertEqual(response.status, "422 Unprocessable Entity") + self.assertEqual(response.content_type, "application/json") + self.assertIn("errors", response.json) + self.assertEqual( + response.json["errors"], + [{u'description': {u"value": [u"value and requirementGroup.expectedValue must be equal"]}, + u'location': u'body', + u'name': 0}] + ) + + response = self.app.post_json(request_path, {"data": valid_data}) + self.assertEqual(response.status, "201 Created") + self.assertEqual(response.content_type, "application/json") + rr = response.json["data"] + + for i, rr_data in enumerate(valid_data): + for k, v in rr_data.items(): + if k == "value": + self.assertEqual(str(rr[i][k]), str(v)) + else: + self.assertEqual(rr[i][k], v) + + +def patch_bid_requirement_response(self): + base_request_path = "/tenders/{}/bids/{}/requirement_responses".format(self.tender_id, self.bid_id) + request_path = "{}?acc_token={}".format(base_request_path, self.bid_token) + + valid_data = [{ + "title": "Requirement response", + "description": "some description", + "requirement": { + "id": self.requirement_id, + "title": self.requirement_title, + }, + "value": "True" + }] + + response = self.app.post_json(request_path, {"data": valid_data}) + self.assertEqual(response.status, "201 Created") + self.assertEqual(response.content_type, "application/json") + rr_id = response.json["data"][0]["id"] + + base_request_path = "/tenders/{}/bids/{}/requirement_responses/{}".format(self.tender_id, self.bid_id, rr_id) + request_path = "{}?acc_token={}".format(base_request_path, self.bid_token) + updated_data = { + "title": "Rquirement response updated", + "value": 100, + } + + auth = self.app.authorization + self.app.authorization = ("Basic", ("broker", "")) + + response = self.app.patch_json( + base_request_path, + {"data": updated_data}, + status=403, + ) + + self.assertEqual(response.status, "403 Forbidden") + self.assertEqual(response.content_type, "application/json") + self.assertIn("errors", response.json) + self.assertEqual( + response.json["errors"], + [{u'description': u'Forbidden', u'location': u'url', u'name': u'permission'}] + ) + + response = self.app.patch_json( + "{}?acc_token={}".format(base_request_path, self.tender_token), + {"data": updated_data}, + status=403, + ) + + self.assertEqual(response.status, "403 Forbidden") + self.assertEqual(response.content_type, "application/json") + self.assertIn("errors", response.json) + self.assertEqual( + response.json["errors"], + [{u'description': u'Forbidden', u'location': u'url', u'name': u'permission'}] + ) + + self.app.authorization = auth + response = self.app.patch_json( + request_path, + {"data": updated_data}, + ) + + self.assertEqual(response.status, "200 OK") + self.assertEqual(response.content_type, "application/json") + + response = self.app.patch_json( + "/tenders/{}/bids/{}?acc_token={}".format(self.tender_id, self.bid_id, self.bid_token), + {"data": {"status": "active"}}, + status=422, + ) + self.assertEqual(response.status, "422 Unprocessable Entity") + self.assertEqual(response.content_type, "application/json") + self.assertEqual( + response.json["errors"], + [{u'description': [{u'value': [u'Must be either true or false.']}], + u'location': u'body', + u'name': u'requirementResponses'}] + ) + + updated_data["value"] = "True" + response = self.app.patch_json( + request_path, + {"data": updated_data}, + ) + + self.assertEqual(response.status, "200 OK") + self.assertEqual(response.content_type, "application/json") + rr = response.json["data"] + self.assertEqual(rr["title"], updated_data["title"]) + self.assertEqual(rr["value"], updated_data["value"]) + self.assertNotIn("evidences", rr) + + +def get_bid_requirement_response(self): + base_request_path = "/tenders/{}/bids/{}/requirement_responses".format(self.tender_id, self.bid_id) + request_path = "{}?acc_token={}".format(base_request_path, self.bid_token) + + valid_data = [{ + "title": "Requirement response", + "description": "some description", + "requirement": { + "id": self.requirement_id, + "title": self.requirement_title, + }, + "value": 'True' + }] + + response = self.app.post_json(request_path, {"data": valid_data}) + self.assertEqual(response.status, "201 Created") + self.assertEqual(response.content_type, "application/json") + rr_id = response.json["data"][0]["id"] + + response = self.app.get("/tenders/{}/bids/{}/requirement_responses".format(self.tender_id, self.bid_id)) + self.assertEqual(response.status, "200 OK") + self.assertEqual(response.content_type, "application/json") + + rrs = response.json["data"] + self.assertEqual(len(rrs), 1) + + for i, rr_data in enumerate(valid_data): + for k, v in rr_data.items(): + self.assertIn(k, rrs[i]) + self.assertEqual(v, rrs[i][k]) + + response = self.app.get("/tenders/{}/bids/{}/requirement_responses/{}".format(self.tender_id, self.bid_id, rr_id)) + self.assertEqual(response.status, "200 OK") + self.assertEqual(response.content_type, "application/json") + + rr = response.json["data"] + for k, v in valid_data[0].items(): + self.assertIn(k, rr) + self.assertEqual(v, rr[k]) + + +def create_bid_requirement_response_evidence(self): + base_request_path = "/tenders/{}/bids/{}/requirement_responses/{}/evidences".format( + self.tender_id, self.bid_id, self.rr_id) + request_path = "{}?acc_token={}".format(base_request_path, self.bid_token) + + auth = self.app.authorization + self.app.authorization = ("Basic", ("broker", "")) + + valid_data = { + "title": "Requirement response", + "relatedDocument": { + "id": self.doc_id, + "title": "name.doc", + }, + "type": "document", + } + + response = self.app.post_json( + base_request_path, + {"data": valid_data}, + status=403, + ) + + self.assertEqual(response.status, "403 Forbidden") + self.assertEqual(response.content_type, "application/json") + self.assertIn("errors", response.json) + self.assertEqual( + response.json["errors"], + [{u'description': u'Forbidden', u'location': u'url', u'name': u'permission'}] + ) + + response = self.app.post_json( + "{}?acc_token={}".format(base_request_path, self.tender_token), + {"data": valid_data}, + status=403, + ) + + self.assertEqual(response.status, "403 Forbidden") + self.assertEqual(response.content_type, "application/json") + self.assertIn("errors", response.json) + self.assertEqual( + response.json["errors"], + [{u'description': u'Forbidden', u'location': u'url', u'name': u'permission'}] + ) + + self.app.authorization = auth + response = self.app.post_json( + request_path, + {"data": { + "description": "some description" + }}, + status=422 + ) + + self.assertEqual(response.status, "422 Unprocessable Entity") + self.assertEqual(response.content_type, "application/json") + self.assertIn("errors", response.json) + self.assertEqual( + response.json["errors"], + [{u'description': [u'This field is required.'], + u'location': u'body', + u'name': u'title'}] + ) + + response = self.app.post_json( + request_path, + {"data": { + "title": "Some title", + "description": "some description", + }}, + status=422, + ) + + self.assertEqual(response.status, "422 Unprocessable Entity") + self.assertEqual(response.content_type, "application/json") + self.assertIn("errors", response.json) + self.assertEqual( + response.json["errors"], + [{u'description': [u'type should be one of eligibleEvidences types'], + u'location': u'body', + u'name': u'type'}], + ) + + response = self.app.post_json( + request_path, + {"data": { + "title": "Some title", + "description": "some description", + "type": "document", + }}, + status=422, + ) + + self.assertEqual(response.status, "422 Unprocessable Entity") + self.assertEqual(response.content_type, "application/json") + self.assertIn("errors", response.json) + self.assertEqual( + response.json["errors"], + [{u'description': [u'This field is required.'], + u'location': u'body', + u'name': u'relatedDocument'}] + ) + + response = self.app.post_json( + request_path, + {"data": { + "title": "Some title", + "description": "some description", + "type": "document", + "relatedDocument": { + "id": "0"*32, + "title": "test.doc", + } + }}, + status=422, + ) + + self.assertEqual(response.status, "422 Unprocessable Entity") + self.assertEqual(response.content_type, "application/json") + self.assertIn("errors", response.json) + self.assertEqual( + response.json["errors"], + [{u'description': [u'relatedDocument.id should be one of bid documents'], + u'location': u'body', + u'name': u'relatedDocument'}] + ) + + response = self.app.post_json( + request_path, + {"data": valid_data} + ) + + self.assertEqual(response.status, "201 Created") + self.assertEqual(response.content_type, "application/json") + evidence = response.json["data"] + + for k, v in valid_data.items(): + self.assertIn(k, evidence) + self.assertEqual(evidence[k], v) + + +def patch_bid_requirement_response_evidence(self): + valid_data = { + "title": "Requirement response", + "relatedDocument": { + "id": self.doc_id, + "title": "name.doc", + }, + "type": "document", + } + + response = self.app.post_json( + "/tenders/{}/bids/{}/requirement_responses/{}/evidences?acc_token={}".format( + self.tender_id, self.bid_id, self.rr_id, self.bid_token), + {"data": valid_data}, + ) + + self.assertEqual(response.status, "201 Created") + self.assertEqual(response.content_type, "application/json") + evidence_id = response.json["data"]["id"] + + updated_data = { + "title": "Updated title", + "description": "Updated description", + } + + response = self.app.patch_json( + "/tenders/{}/bids/{}/requirement_responses/{}/evidences/{}?acc_token={}".format( + self.tender_id, self.bid_id, self.rr_id, evidence_id, self.bid_token), + {"data": updated_data}, + ) + self.assertEqual(response.status, "200 OK") + self.assertEqual(response.content_type, "application/json") + evidence = response.json["data"] + + self.assertEqual(evidence["title"], updated_data["title"]) + self.assertEqual(evidence["description"], updated_data["description"]) + + +def get_bid_requirement_response_evidence(self): + + valid_data = { + "title": "Requirement response", + "relatedDocument": { + "id": self.doc_id, + "title": "name.doc", + }, + "type": "document", + } + + response = self.app.post_json( + "/tenders/{}/bids/{}/requirement_responses/{}/evidences?acc_token={}".format( + self.tender_id, self.bid_id, self.rr_id, self.bid_token), + {"data": valid_data}, + ) + + self.assertEqual(response.status, "201 Created") + self.assertEqual(response.content_type, "application/json") + evidence_id = response.json["data"]["id"] + + response = self.app.get("/tenders/{}/bids/{}/requirement_responses/{}/evidences".format( + self.tender_id, self.bid_id, self.rr_id + )) + + evidences = response.json["data"] + self.assertEqual(len(evidences), 1) + + for k, v in valid_data.items(): + self.assertIn(k, evidences[0]) + self.assertEqual(v, evidences[0][k]) + + response = self.app.get("/tenders/{}/bids/{}/requirement_responses/{}/evidences/{}".format( + self.tender_id, self.bid_id, self.rr_id, evidence_id)) + self.assertEqual(response.status, "200 OK") + self.assertEqual(response.content_type, "application/json") + + rr = response.json["data"] + for k, v in valid_data.items(): + self.assertIn(k, rr) + self.assertEqual(v, rr[k]) + + +def bid_activate(self): + response = self.app.get("/tenders/{}".format(self.tender_id)) + bid_pending_procedures = [ + "aboveThresholdEU", + "esco", + "closeFrameworkAgreementUA", + "competitiveDialogueEU", + "competitiveDialogueUA", + "competitiveDialogueEU.stage2", + ] + if response.json["data"]["procurementMethodType"] in bid_pending_procedures: + next_status = "pending" + else: + next_status = "active" + + response = self.app.patch_json( + "/tenders/{}/bids/{}?acc_token={}".format(self.tender_id, self.bid_id, self.bid_token), + {"data": {"status": next_status}}, + status=403, + ) + + self.assertEqual(response.status, "403 Forbidden") + self.assertEqual(response.content_type, "application/json") + self.assertIn("errors", response.json) + self.assertEqual( + response.json["errors"], + [{u'description': u'Must be answered on all criteria with source `tenderer`', + u'location': u'body', + u'name': u'data'}], + ) + + response = self.app.get("/tenders/{}/criteria".format(self.tender_id)) + self.assertEqual(response.content_type, "application/json") + criteria = response.json["data"] + + rrs = [] + for criterion in criteria: + for req in criterion["requirementGroups"][0]["requirements"]: + if criterion["source"] == "tenderer": + rrs.append( + { + "title": "Requirement response", + "description": "some description", + "requirement": { + "id": req["id"], + "title": req["title"], + }, + "value": True, + }, + ) + + response = self.app.post_json( + "/tenders/{}/bids/{}/requirement_responses?acc_token={}".format(self.tender_id, self.bid_id, self.bid_token), + {"data": rrs[:-1]}, + ) + self.assertEqual(response.status, "201 Created") + self.assertEqual(response.content_type, "application/json") + + response = self.app.patch_json( + "/tenders/{}/bids/{}?acc_token={}".format(self.tender_id, self.bid_id, self.bid_token), + {"data": {"status": next_status}}, + status=403, + ) + + self.assertEqual(response.status, "403 Forbidden") + self.assertEqual(response.content_type, "application/json") + self.assertIn("errors", response.json) + self.assertEqual( + response.json["errors"], + [{u'description': u'Inside requirement group must get answered all of requirements', + u'location': u'body', + u'name': u'data'}], + ) + + another_rg_req = criteria[0]["requirementGroups"][1]["requirements"][0] + response = self.app.post_json( + "/tenders/{}/bids/{}/requirement_responses?acc_token={}".format(self.tender_id, self.bid_id, self.bid_token), + {"data": [{ + "title": "Requirement response", + "description": "some description", + "requirement": { + "id": another_rg_req["id"], + "title": another_rg_req["title"], + }, + "value": "True", + }]}, + ) + self.assertEqual(response.status, "201 Created") + remove_rr_id = response.json["data"][0]["id"] + + response = self.app.patch_json( + "/tenders/{}/bids/{}?acc_token={}".format(self.tender_id, self.bid_id, self.bid_token), + {"data": {"status": next_status}}, + status=403, + ) + + self.assertEqual(response.status, "403 Forbidden") + self.assertEqual(response.content_type, "application/json") + self.assertIn("errors", response.json) + self.assertEqual( + response.json["errors"], + [{u'description': u'Inside criteria must be answered only one requirement group', + u'location': u'body', + u'name': u'data'}] + ) + + response = self.app.delete( + "/tenders/{}/bids/{}/requirement_responses/{}?acc_token={}".format( + self.tender_id, self.bid_id, remove_rr_id, self.bid_token) + ) + self.assertEqual(response.status, "200 OK") + + response = self.app.post_json( + "/tenders/{}/bids/{}/requirement_responses?acc_token={}".format(self.tender_id, self.bid_id, self.bid_token), + {"data": [rrs[-1]]}, + ) + self.assertEqual(response.status, "201 Created") + + + response = self.app.post_json( + "/tenders/{}/bids/{}/requirement_responses?acc_token={}".format(self.tender_id, self.bid_id, self.bid_token), + {"data": rrs}, + ) + self.assertEqual(response.status, "201 Created") + self.assertEqual(response.content_type, "application/json") + + response = self.app.patch_json( + "/tenders/{}/bids/{}?acc_token={}".format(self.tender_id, self.bid_id, self.bid_token), + {"data": {"status": next_status}}, + ) + self.assertEqual(response.status, "200 OK") + self.assertEqual(response.content_type, "application/json") diff --git a/src/openprocurement/tender/openua/tests/criterion.py b/src/openprocurement/tender/openua/tests/criterion.py new file mode 100644 index 0000000000..bdd515ff6d --- /dev/null +++ b/src/openprocurement/tender/openua/tests/criterion.py @@ -0,0 +1,159 @@ +# -*- coding: utf-8 -*- +import unittest +from copy import deepcopy +from mock import patch +from datetime import timedelta + +from openprocurement.api.tests.base import snitch +from openprocurement.api.utils import get_now +from openprocurement.tender.belowthreshold.tests.base import test_lots, test_criteria + +from openprocurement.tender.openua.tests.base import test_tender_data, BaseTenderUAContentWebTest +from openprocurement.tender.openua.tests.criterion_blanks import ( + create_tender_criteria_valid, + create_tender_criteria_invalid, + patch_tender_criteria_valid, + patch_tender_criteria_invalid, + get_tender_criteria, + activate_tender, + # RequirementGroup + create_criteria_rg, + patch_criteria_rg, + get_criteria_rg, + # Requirement + create_rg_requirement_valid, + create_rg_requirement_invalid, + patch_rg_requirement, + get_rg_requirement, + # Evidence + create_requirement_evidence_valid, + create_requirement_evidence_invalid, + patch_requirement_evidence, + delete_requirement_evidence, + get_requirement_evidence, +) + + +@patch("openprocurement.tender.core.validation.RELEASE_ECRITERIA_ARTICLE_17", get_now() - timedelta(days=1)) +class TenderCriteriaTestMixin(object): + test_create_tender_criteria_valid = snitch(create_tender_criteria_valid) + test_create_tender_criteria_invalid = snitch(create_tender_criteria_invalid) + test_patch_tender_criteria_valid = snitch(patch_tender_criteria_valid) + test_patch_tender_criteria_invalid = snitch(patch_tender_criteria_invalid) + test_get_tender_criteria = snitch(get_tender_criteria) + test_activate_tender = snitch(activate_tender) + + +@patch("openprocurement.tender.core.validation.RELEASE_ECRITERIA_ARTICLE_17", get_now() - timedelta(days=1)) +class TenderCriteriaRGTestMixin(object): + test_create_criteria_rg_valid = snitch(create_criteria_rg) + test_patch_criteria_rg = snitch(patch_criteria_rg) + test_get_criteria_rg = snitch(get_criteria_rg) + + @patch("openprocurement.tender.core.validation.RELEASE_ECRITERIA_ARTICLE_17", get_now() - timedelta(days=1)) + def setUp(self): + super(TenderCriteriaRGTestMixin, self).setUp() + criteria_data = deepcopy(test_criteria) + criteria_data[0]["classification"]["id"] = "CRITERION.OTHER" + + response = self.app.post_json( + "/tenders/{}/criteria?acc_token={}".format(self.tender_id, self.tender_token), + {"data": criteria_data}, + ) + self.criteria_id = response.json["data"][0]["id"] + + +@patch("openprocurement.tender.core.validation.RELEASE_ECRITERIA_ARTICLE_17", get_now() - timedelta(days=1)) +class TenderCriteriaRGRequirementTestMixin(object): + test_create_rg_requirement_valid = snitch(create_rg_requirement_valid) + test_create_rg_requirement_invalid = snitch(create_rg_requirement_invalid) + test_patch_rg_requirement = snitch(patch_rg_requirement) + test_get_rg_requirement = snitch(get_rg_requirement) + + test_requirement_data = { + u"title": u"Фізична особа, яка є учасником процедури закупівлі, ", + u"description": u"?", + u"dataType": u"boolean", + u"expectedValue": u"true", + } + + @patch("openprocurement.tender.core.validation.RELEASE_ECRITERIA_ARTICLE_17", get_now() - timedelta(days=1)) + def setUp(self): + super(TenderCriteriaRGRequirementTestMixin, self).setUp() + criteria_data = deepcopy(test_criteria) + criteria_data[0]["classification"]["id"] = "CRITERION.OTHER" + del criteria_data[0]["requirementGroups"][0]["requirements"] + + response = self.app.post_json( + "/tenders/{}/criteria?acc_token={}&bulk=true".format(self.tender_id, self.tender_token), + {"data": criteria_data}, + ) + self.criteria_id = response.json["data"][0]["id"] + self.rg_id = response.json["data"][0]["requirementGroups"][0]["id"] + + +@patch("openprocurement.tender.core.validation.RELEASE_ECRITERIA_ARTICLE_17", get_now() - timedelta(days=1)) +class TenderCriteriaRGRequirementEvidenceTestMixin(object): + test_create_requirement_evidence_valid = snitch(create_requirement_evidence_valid) + test_create_requirement_evidence_invalid = snitch(create_requirement_evidence_invalid) + test_patch_requirement_evidence = snitch(patch_requirement_evidence) + test_get_requirement_evidence = snitch(get_requirement_evidence) + test_delete_requirement_evidence = snitch(delete_requirement_evidence) + + test_evidence_data = { + "title": u"Документальне підтвердження", + "description": u"Довідка в довільній формі", + "type": u"document", + } + + @patch("openprocurement.tender.core.validation.RELEASE_ECRITERIA_ARTICLE_17", get_now() - timedelta(days=1)) + def setUp(self): + super(TenderCriteriaRGRequirementEvidenceTestMixin, self).setUp() + criteria_data = deepcopy(test_criteria) + response = self.app.post_json( + "/tenders/{}/criteria?acc_token={}&bulk=true".format(self.tender_id, self.tender_token), + {"data": criteria_data}, + ) + self.criteria_id = response.json["data"][0]["id"] + self.rg_id = response.json["data"][0]["requirementGroups"][0]["id"] + self.requirement_id = response.json["data"][0]["requirementGroups"][0]["requirements"][0]["id"] + + +class TenderUACriteriaTest(TenderCriteriaTestMixin, BaseTenderUAContentWebTest): + initial_data = test_tender_data + test_lots_data = test_lots + initial_status = "draft" + + +class TenderUACriteriaRGTest(TenderCriteriaRGTestMixin, BaseTenderUAContentWebTest): + initial_data = test_tender_data + test_lots_data = test_lots + + +class TenderUACriteriaRGRequirementTest( + TenderCriteriaRGRequirementTestMixin, + BaseTenderUAContentWebTest +): + initial_data = test_tender_data + test_lots_data = test_lots + + +class TenderUACriteriaRGRequirementEvidenceTest( + TenderCriteriaRGRequirementEvidenceTestMixin, + BaseTenderUAContentWebTest, +): + initial_data = test_tender_data + test_lots_data = test_lots + + +def suite(): + suite = unittest.TestSuite() + suite.addTest(unittest.makeSuite(TenderUACriteriaTest)) + suite.addTest(unittest.makeSuite(TenderUACriteriaRGTest)) + suite.addTest(unittest.makeSuite(TenderUACriteriaRGRequirementTest)) + suite.addTest(unittest.makeSuite(TenderUACriteriaRGRequirementEvidenceTest)) + return suite + + +if __name__ == "__main__": + unittest.main(defaultTest="suite") diff --git a/src/openprocurement/tender/openua/tests/criterion_blanks.py b/src/openprocurement/tender/openua/tests/criterion_blanks.py new file mode 100644 index 0000000000..c0264f8d88 --- /dev/null +++ b/src/openprocurement/tender/openua/tests/criterion_blanks.py @@ -0,0 +1,827 @@ +# -*- coding: utf-8 -*- +from copy import deepcopy + +from openprocurement.tender.belowthreshold.tests.base import test_criteria, test_requirement_groups + + +def create_tender_criteria_valid(self): + + request_path = "/tenders/{}/criteria?acc_token={}&bulk=true".format(self.tender_id, self.tender_token) + + response = self.app.post_json(request_path, {"data": test_criteria}) + self.assertEqual(response.status, "201 Created") + self.assertEqual(response.content_type, "application/json") + + criteria = response.json["data"][0] + self.assertEqual(u"Вчинення злочинів, учинених з корисливих мотивів", criteria["title"]) + self.assertEqual("tenderer", criteria["source"]) + self.assertIn("requirementGroups", criteria) + for requirementGroup in criteria["requirementGroups"]: + self.assertIn("requirements", requirementGroup) + + +def create_tender_criteria_invalid(self): + + invalid_criteria = deepcopy(test_criteria) + invalid_criteria[0]["relatesTo"] = "lot" + + request_path = "/tenders/{}/criteria?acc_token={}&bulk=true".format(self.tender_id, self.tender_token) + response = self.app.post_json(request_path, {"data": invalid_criteria}, status=422) + self.assertEqual(response.status, "422 Unprocessable Entity") + self.assertEqual(response.content_type, "application/json") + self.assertEqual(response.json["status"], "error") + self.assertEqual( + response.json["errors"], + [ + { + u"description": {u"relatedItem": [u"This field is required."]}, + u"location": u"body", + u"name": 0, + } + ], + ) + + invalid_criteria[0]["relatedItem"] = "0"*32 + response = self.app.post_json(request_path, {"data": invalid_criteria}, status=422) + self.assertEqual(response.status, "422 Unprocessable Entity") + self.assertEqual(response.content_type, "application/json") + self.assertEqual(response.json["status"], "error") + self.assertEqual( + response.json["errors"], + [ + { + u"description": {u"relatedItem": [u"relatedItem should be one of lots"]}, + u"location": u"body", + u"name": 0, + } + ], + ) + + invalid_criteria[0]["relatesTo"] = "item" + response = self.app.post_json(request_path, {"data": invalid_criteria}, status=422) + self.assertEqual(response.status, "422 Unprocessable Entity") + self.assertEqual(response.content_type, "application/json") + self.assertEqual(response.json["status"], "error") + self.assertEqual( + response.json["errors"], + [ + { + u"description": {u"relatedItem": [u"relatedItem should be one of items"]}, + u"location": u"body", + u"name": 0, + } + ], + ) + + invalid_criteria[0]["relatesTo"] = "tenderer" + del invalid_criteria[0]["relatedItem"] + + requirement_1 = invalid_criteria[0]["requirementGroups"][0]["requirements"][0] + requirement_1["expectedValue"] = 100 + requirement_1["relatedFeature"] = "0" * 32 + response = self.app.post_json(request_path, {"data": invalid_criteria}, status=422) + self.assertEqual(response.status, "422 Unprocessable Entity") + self.assertEqual(response.content_type, "application/json") + self.assertEqual(response.json["status"], "error") + self.assertEqual( + response.json["errors"], + [ + { + u"description": { + u'requirementGroups': [ + { + u'requirements': [ + { + u'expectedValue': [u'Must be either true or false.'], + u'relatedFeature': [u'relatedFeature should be one of features'], + } + ], + } + ], + }, + u"location": u"body", + u"name": 0, + } + ], + ) + + requirement_1["minValue"] = "min some text" + requirement_1["maxValue"] = 100 + requirement_1["dataType"] = "number" + del requirement_1["relatedFeature"] + response = self.app.post_json(request_path, {"data": invalid_criteria}, status=422) + self.assertEqual(response.status, "422 Unprocessable Entity") + self.assertEqual(response.content_type, "application/json") + self.assertEqual(response.json["status"], "error") + self.assertEqual( + response.json["errors"], + [ + { + u"description": { + u'requirementGroups': [ + {u'requirements': [[u'expectedValue conflicts with ["minValue", "maxValue"]']]} + ] + }, + u"location": u"body", + u"name": 0, + } + ], + ) + + +def patch_tender_criteria_valid(self): + criteria_data = deepcopy(test_criteria) + criteria_data[0]["classification"]["id"] = "CRITERION.OTHER" + + response = self.app.post_json( + "/tenders/{}/criteria?acc_token={}&bulk=true".format(self.tender_id, self.tender_token), + {"data": criteria_data} + ) + self.assertEqual(response.status, "201 Created") + self.assertEqual(response.content_type, "application/json") + + criteria_id = response.json["data"][0]["id"] + + request_path = "/tenders/{}/criteria/{}?acc_token={}".format(self.tender_id, criteria_id, self.tender_token) + + updated_data = { + "title": u"Оновлена назва", + "title_en": u"Updated title", + "title_ru": u"Обновлённое название", + "description": u"Оновлений опис", + "requirementGroups": [ + { + "description": "Not added requirementGroup", + } + ] + } + response = self.app.patch_json( + request_path, + {"data": updated_data}, + ) + + criteria = response.json["data"] + + self.assertEqual(criteria["title"], updated_data["title"]) + self.assertEqual(criteria["title_en"], updated_data["title_en"]) + self.assertEqual(criteria["title_ru"], updated_data["title_ru"]) + self.assertEqual(criteria["description"], updated_data["description"]) + self.assertNotEqual(criteria["requirementGroups"], updated_data["requirementGroups"]) + for rg in criteria["requirementGroups"]: + self.assertNotEqual(rg["description"], updated_data["requirementGroups"][0]["description"]) + + +def patch_tender_criteria_invalid(self): + criteria_data = deepcopy(test_criteria) + criteria_data[0]["classification"]["id"] = "CRITERION.OTHER" + + response = self.app.post_json( + "/tenders/{}/criteria?acc_token={}&bulk=true".format(self.tender_id, self.tender_token), + {"data": criteria_data} + ) + self.assertEqual(response.status, "201 Created") + self.assertEqual(response.content_type, "application/json") + + criteria_id = response.json["data"][0]["id"] + criteria_not_editable_id = response.json["data"][1]["id"] + + request_path = "/tenders/{}/criteria/{}?acc_token={}".format(self.tender_id, criteria_id, self.tender_token) + + updated_data = { + "title": u"Оновлена назва", + "title_en": u"Updated title", + "title_ru": u"Обновлённое название", + "description": u"Оновлений опис", + "relatesTo": "lot", + } + + response = self.app.patch_json( + "/tenders/{}/criteria/{}?acc_token={}".format(self.tender_id, criteria_not_editable_id, self.tender_token), + {"data": updated_data}, + status=403 + ) + + self.assertEqual(response.status, "403 Forbidden") + self.assertEqual(response.content_type, "application/json") + self.assertEqual(response.json["status"], "error") + self.assertEqual( + response.json["errors"], + [{ + u'description': u"Can't update exclusion ecriteria objects", + u'location': u'body', + u'name': u'data', + }] + ) + + response = self.app.patch_json( + request_path, + {"data": updated_data}, + status=422 + ) + + self.assertEqual(response.status, "422 Unprocessable Entity") + self.assertEqual(response.content_type, "application/json") + self.assertEqual(response.json["status"], "error") + self.assertEqual( + response.json["errors"], + [ + { + u"description": [u"This field is required."], + u"location": u"body", + u"name": u"relatedItem", + } + ], + ) + + updated_data["relatedItem"] = "0" * 32 + response = self.app.patch_json( + request_path, + {"data": updated_data}, + status=422 + ) + + self.assertEqual(response.status, "422 Unprocessable Entity") + self.assertEqual(response.content_type, "application/json") + self.assertEqual(response.json["status"], "error") + self.assertEqual( + response.json["errors"], + [ + { + u"description": [u"relatedItem should be one of lots"], + u"location": u"body", + u"name": u"relatedItem", + } + ], + ) + + updated_data["relatesTo"] = "item" + + response = self.app.patch_json( + request_path, + {"data": updated_data}, + status=422 + ) + + self.assertEqual(response.status, "422 Unprocessable Entity") + self.assertEqual(response.content_type, "application/json") + self.assertEqual(response.json["status"], "error") + self.assertEqual( + response.json["errors"], + [ + { + u"description": [u"relatedItem should be one of items"], + u"location": u"body", + u"name": u"relatedItem", + } + ], + ) + + +def get_tender_criteria(self): + response = self.app.post_json( + "/tenders/{}/criteria?acc_token={}&bulk=true".format(self.tender_id, self.tender_token), + {"data": test_criteria} + ) + self.assertEqual(response.status, "201 Created") + self.assertEqual(response.content_type, "application/json") + + criteria_id = response.json["data"][0]["id"] + + response = self.app.get("/tenders/{}/criteria".format(self.tender_id)) + criteria = response.json["data"] + + self.assertIn("requirementGroups", criteria[0]) + self.assertEqual( + len(test_criteria[0]["requirementGroups"]), + len(criteria[0]["requirementGroups"]) + ) + + for i, criterion in enumerate(criteria): + for k, v in criterion.items(): + if k not in ["id", "requirementGroups"]: + self.assertEqual(test_criteria[i][k], v) + + response = self.app.get("/tenders/{}/criteria/{}".format(self.tender_id, criteria_id)) + criterion = response.json["data"] + + for k, v in criterion.items(): + if k not in ["id", "requirementGroups"]: + self.assertEqual(test_criteria[0][k], v) + + +def activate_tender(self): + request_path = "/tenders/{}?acc_token={}".format(self.tender_id, self.tender_token) + + response = self.app.patch_json( + request_path, + {"data": {"status": "active.tendering"}}, + status=403, + ) + + self.assertEqual(response.status, "403 Forbidden") + self.assertEqual(response.content_type, "application/json") + self.assertIn("errors", response.json) + self.assertEqual( + response.json["errors"], + [{u'description': u'Tender must contain all 9 `EXCLUSION` criteria', + u'location': u'body', + u'name': u'data'}], + ) + + response = self.app.post_json( + "/tenders/{}/criteria?acc_token={}".format(self.tender_id, self.tender_token), + {"data": test_criteria[:8]}, + ) + + self.assertEqual(response.status, "201 Created") + self.assertEqual(response.content_type, "application/json") + + response = self.app.patch_json( + request_path, + {"data": {"status": "active.tendering"}}, + status=403, + ) + self.assertEqual(response.status, "403 Forbidden") + self.assertEqual(response.content_type, "application/json") + self.assertIn("errors", response.json) + self.assertEqual( + response.json["errors"], + [{u'description': u'Tender must contain all 9 `EXCLUSION` criteria', + u'location': u'body', + u'name': u'data'}], + ) + + response = self.app.post_json( + "/tenders/{}/criteria?acc_token={}".format(self.tender_id, self.tender_token), + {"data": test_criteria[:1]}, + ) + + self.assertEqual(response.status, "201 Created") + self.assertEqual(response.content_type, "application/json") + + response = self.app.patch_json( + request_path, + {"data": {"status": "active.tendering"}}, + status=403, + ) + self.assertEqual(response.status, "403 Forbidden") + self.assertEqual(response.content_type, "application/json") + self.assertIn("errors", response.json) + self.assertEqual( + response.json["errors"], + [{u'description': u'Tender must contain all 9 `EXCLUSION` criteria', + u'location': u'body', + u'name': u'data'}], + ) + + response = self.app.post_json( + "/tenders/{}/criteria?acc_token={}".format(self.tender_id, self.tender_token), + {"data": test_criteria[8:]}, + ) + + self.assertEqual(response.status, "201 Created") + self.assertEqual(response.content_type, "application/json") + + response = self.app.patch_json( + request_path, + {"data": {"status": "active.tendering"}}, + ) + self.assertEqual(response.status, "200 OK") + self.assertEqual(response.content_type, "application/json") + self.assertEqual(response.json["data"]["status"], "active.tendering") + self.assertEqual(len(response.json["data"]["criteria"]), 10) + + +def create_criteria_rg(self): + request_path = "/tenders/{}/criteria/{}/requirement_groups?acc_token={}".format( + self.tender_id, self.criteria_id, self.tender_token) + + response = self.app.post_json(request_path, {"data": test_requirement_groups[0]}) + self.assertEqual(response.status, "201 Created") + self.assertEqual(response.content_type, "application/json") + + rg = response.json["data"] + + self.assertEqual(u"Учасник фізична особа підтверджує, що", rg["description"]) + self.assertIn("requirements", rg) + for requirement in rg["requirements"]: + self.assertEqual("boolean", requirement["dataType"]) + self.assertEqual("true", requirement["expectedValue"]) + + +def patch_criteria_rg(self): + response = self.app.get("/tenders/{}/criteria".format(self.tender_id)) + rg_id = response.json["data"][0]["requirementGroups"][0]["id"] + + criteria_not_editable_id = response.json["data"][1]["id"] + rg_not_editable_id = response.json["data"][1]["requirementGroups"][0]["id"] + + request_path = "/tenders/{}/criteria/{}/requirement_groups/{}?acc_token={}".format( + self.tender_id, self.criteria_id, rg_id, self.tender_token) + + updated_fields = { + "description": u"Оновлений опис", + "description_en": u"Updated requirement description", + } + + response = self.app.patch_json( + "/tenders/{}/criteria/{}/requirement_groups/{}?acc_token={}".format( + self.tender_id, criteria_not_editable_id, rg_not_editable_id, self.tender_token), + {"data": updated_fields}, + status=403, + ) + self.assertEqual(response.status, "403 Forbidden") + self.assertEqual(response.content_type, "application/json") + self.assertEqual(response.json["status"], "error") + self.assertEqual( + response.json["errors"], + [{ + u'description': u"Can't update exclusion ecriteria objects", + u'location': u'body', + u'name': u'data', + }] + ) + + response = self.app.patch_json(request_path, {"data": updated_fields}) + self.assertEqual(response.status, "200 OK") + self.assertEqual(response.content_type, "application/json") + updated_rg = response.json["data"] + + for k, v in updated_fields.items(): + self.assertIn(k, updated_rg) + self.assertEqual(updated_rg[k], v) + + +def get_criteria_rg(self): + + requirement_group_data = deepcopy(test_requirement_groups[0]) + + response = self.app.post_json( + "/tenders/{}/criteria/{}/requirement_groups?acc_token={}".format( + self.tender_id, self.criteria_id, self.tender_token), + {"data": requirement_group_data}, + ) + self.assertEqual(response.status, "201 Created") + self.assertEqual(response.content_type, "application/json") + rg_id = response.json["data"]["id"] + + response = self.app.get("/tenders/{}/criteria/{}/requirement_groups?acc_token={}".format( + self.tender_id, self.criteria_id, self.tender_token), + ) + rgs = response.json["data"] + self.assertEqual(len(rgs), 3) + self.assertIn("requirements", rgs[2]) + + del requirement_group_data["requirements"] + + for k, v in requirement_group_data.items(): + self.assertEqual(rgs[2][k], v) + + response = self.app.get("/tenders/{}/criteria/{}/requirement_groups/{}?acc_token={}".format( + self.tender_id, self.criteria_id, rg_id, self.tender_token), + ) + rg = response.json["data"] + for k, v in requirement_group_data.items(): + self.assertEqual(rg[k], v) + + +def create_rg_requirement_valid(self): + request_path = "/tenders/{}/criteria/{}/requirement_groups/{}/requirements?acc_token={}".format( + self.tender_id, self.criteria_id, self.rg_id, self.tender_token) + + response = self.app.post_json(request_path, {"data": self.test_requirement_data}) + self.assertEqual(response.status, "201 Created") + self.assertEqual(response.content_type, "application/json") + + requirement = response.json["data"] + + self.assertEqual(requirement["title"], self.test_requirement_data["title"]) + self.assertEqual(requirement["description"], self.test_requirement_data["description"]) + self.assertEqual(requirement["dataType"], self.test_requirement_data["dataType"]) + self.assertEqual(requirement["expectedValue"], self.test_requirement_data["expectedValue"]) + + +def create_rg_requirement_invalid(self): + request_path = "/tenders/{}/criteria/{}/requirement_groups/{}/requirements?acc_token={}".format( + self.tender_id, self.criteria_id, self.rg_id, self.tender_token) + + requirement_data = deepcopy(self.test_requirement_data) + + # response = self.app.post_json(request_path, {"data": requirement_data}, status=422) + # self.assertEqual(response.status, "422 Unprocessable Entity") + # self.assertEqual(response.content_type, "application/json") + # self.assertEqual(response.json["status"], "error") + # self.assertEqual( + # response.json["errors"], + # [ + # { + # u"description": [u"This field is required."], + # u"location": u"body", + # u"name": u"relatedItem", + # } + # ], + # ) + + requirement_data["minValue"] = 2 + response = self.app.post_json(request_path, {"data": requirement_data}, status=422) + self.assertEqual(response.status, "422 Unprocessable Entity") + self.assertEqual(response.content_type, "application/json") + self.assertEqual(response.json["status"], "error") + self.assertEqual( + response.json["errors"], + [ + { + u"description": [u"minValue must be integer or number"], + u"location": u"body", + u"name": u"minValue", + } + ], + ) + + del requirement_data["minValue"] + requirement_data["maxValue"] = "sdasas" + requirement_data["dataType"] = "integer" + + response = self.app.post_json(request_path, {"data": requirement_data}, status=422) + self.assertEqual(response.status, "422 Unprocessable Entity") + self.assertEqual(response.content_type, "application/json") + self.assertEqual(response.json["status"], "error") + self.assertEqual( + response.json["errors"], + [ + { + u"description": [u"Value 'sdasas' is not int."], + u"location": u"body", + u"name": u"maxValue", + }, + { + u'description': [u"Value 'true' is not int."], + u'location': u'body', + u'name': u'expectedValue', + } + ], + ) + + del requirement_data["maxValue"] + requirement_data["expectedValue"] = "some text" + requirement_data["dataType"] = "number" + response = self.app.post_json(request_path, {"data": requirement_data}, status=422) + self.assertEqual(response.status, "422 Unprocessable Entity") + self.assertEqual(response.content_type, "application/json") + self.assertEqual(response.json["status"], "error") + self.assertEqual( + response.json["errors"], + [ + { + u"description": [u"Number 'some text' failed to convert to a decimal."], + u"location": u"body", + u"name": u"expectedValue", + } + ], + ) + + requirement_data.update({ + "expectedValue": 10, + "dataType": "number", + "relatedFeature": "0"*32 + }) + response = self.app.post_json(request_path, {"data": requirement_data}, status=422) + self.assertEqual(response.status, "422 Unprocessable Entity") + self.assertEqual(response.content_type, "application/json") + self.assertEqual(response.json["status"], "error") + self.assertEqual( + response.json["errors"], + [ + { + u"description": [u"relatedFeature should be one of features"], + u"location": u"body", + u"name": u"relatedFeature", + } + ], + ) + + +def patch_rg_requirement(self): + response = self.app.post_json( + "/tenders/{}/criteria/{}/requirement_groups/{}/requirements?acc_token={}".format( + self.tender_id, self.criteria_id, self.rg_id, self.tender_token), + {"data": self.test_requirement_data} + ) + self.assertEqual(response.status, "201 Created") + self.assertEqual(response.content_type, "application/json") + + requirement_id = response.json["data"]["id"] + + request_path = "/tenders/{}/criteria/{}/requirement_groups/{}/requirements/{}?acc_token={}".format( + self.tender_id, self.criteria_id, self.rg_id, requirement_id, self.tender_token) + + updated_fields = { + "title": u"Updated requirement title", + "description": u"Updated requirement description", + "expectedValue": "False", + "dataType": "boolean", + } + + response = self.app.patch_json(request_path, {"data": updated_fields}) + self.assertEqual(response.status, "200 OK") + self.assertEqual(response.content_type, "application/json") + updated_requirement = response.json["data"] + + for k, v in updated_fields.items(): + self.assertIn(k, updated_requirement) + self.assertEqual(updated_requirement[k], v) + + +def get_rg_requirement(self): + response = self.app.post_json( + "/tenders/{}/criteria/{}/requirement_groups/{}/requirements?acc_token={}".format( + self.tender_id, self.criteria_id, self.rg_id, self.tender_token), + {"data": self.test_requirement_data} + ) + self.assertEqual(response.status, "201 Created") + self.assertEqual(response.content_type, "application/json") + requirement_id = response.json["data"]["id"] + + response = self.app.get("/tenders/{}/criteria/{}/requirement_groups/{}/requirements?acc_token={}".format( + self.tender_id, self.criteria_id, self.rg_id, self.tender_token), + ) + requirements = response.json["data"] + self.assertEqual(len(requirements), 1) + + for k, v in self.test_requirement_data.items(): + self.assertEqual(requirements[0][k], v) + + response = self.app.get("/tenders/{}/criteria/{}/requirement_groups/{}/requirements/{}?acc_token={}".format( + self.tender_id, self.criteria_id, self.rg_id, requirement_id, self.tender_token), + ) + requirement = response.json["data"] + for k, v in self.test_requirement_data.items(): + self.assertEqual(requirement[k], v) + + +def create_requirement_evidence_valid(self): + request_path = "/tenders/{}/criteria/{}/requirement_groups/{}/requirements/{}/evidences?acc_token={}".format( + self.tender_id, self.criteria_id, self.rg_id, self.requirement_id, self.tender_token) + + response = self.app.post_json(request_path, {"data": self.test_evidence_data}) + self.assertEqual(response.status, "201 Created") + self.assertEqual(response.content_type, "application/json") + evidence = response.json["data"] + + self.assertEqual(evidence["title"], self.test_evidence_data["title"]) + self.assertEqual(evidence["description"], self.test_evidence_data["description"]) + self.assertEqual(evidence["type"], self.test_evidence_data["type"]) + + +def create_requirement_evidence_invalid(self): + request_path = "/tenders/{}/criteria/{}/requirement_groups/{}/requirements/{}/evidences?acc_token={}".format( + self.tender_id, self.criteria_id, self.rg_id, self.requirement_id, self.tender_token) + + evidence_data = deepcopy(self.test_evidence_data) + evidence_data["type"] = "another_type" + del evidence_data["title"] + + response = self.app.post_json(request_path, {"data": evidence_data}, status=422) + self.assertEqual(response.status, "422 Unprocessable Entity") + self.assertEqual(response.content_type, "application/json") + self.assertEqual(response.json["status"], "error") + self.assertEqual( + response.json["errors"], + [ + { + u"description": [u"Value must be one of ['document', 'statement']."], + u"location": u"body", + u"name": u"type", + }, + { + u"description": [u"This field is required."], + u"location": u"body", + u"name": u"title", + } + ], + ) + + +def patch_requirement_evidence(self): + + response = self.app.post_json( + "/tenders/{}/criteria/{}/requirement_groups/{}/requirements/{}/evidences?acc_token={}".format( + self.tender_id, self.criteria_id, self.rg_id, self.requirement_id, self.tender_token), + {"data": self.test_evidence_data} + ) + self.assertEqual(response.status, "201 Created") + self.assertEqual(response.content_type, "application/json") + evidence_id = response.json["data"]["id"] + + request_path = "/tenders/{}/criteria/{}/requirement_groups/{}/requirements/{}/evidences/{}?acc_token={}".format( + self.tender_id, self.criteria_id, self.rg_id, self.requirement_id, evidence_id, self.tender_token) + + updated_fields = { + "title": u"Updated requirement title", + "description": u"Updated requirement description", + "type": u"statement", + } + + response = self.app.patch_json(request_path, {"data": updated_fields}) + self.assertEqual(response.status, "200 OK") + self.assertEqual(response.content_type, "application/json") + updated_evidence = response.json["data"] + + for k, v in updated_fields.items(): + self.assertIn(k, updated_evidence) + if k == "type": + self.assertNotEqual(updated_evidence[k], v) + else: + self.assertEqual(updated_evidence[k], v) + + +def delete_requirement_evidence(self): + response = self.app.post_json( + "/tenders/{}/criteria/{}/requirement_groups/{}/requirements/{}/evidences?acc_token={}".format( + self.tender_id, self.criteria_id, self.rg_id, self.requirement_id, self.tender_token), + {"data": self.test_evidence_data} + ) + self.assertEqual(response.status, "201 Created") + self.assertEqual(response.content_type, "application/json") + evidence_id = response.json["data"]["id"] + + base_request_path = "/tenders/{}/criteria/{}/requirement_groups/{}/requirements/{}/evidences".format( + self.tender_id, self.criteria_id, self.rg_id, self.requirement_id, evidence_id, self.tender_token) + + response = self.app.delete("{}/{}?acc_token={}".format(base_request_path, evidence_id, self.tender_token)) + + self.assertEqual(response.status, "200 OK") + self.assertEqual(response.content_type, "application/json") + + response = self.app.get( + "/tenders/{}/criteria/{}/requirement_groups/{}/requirements/{}/evidences".format( + self.tender_id, self.criteria_id, self.rg_id, self.requirement_id, self.tender_token), + ) + self.assertEqual(response.status, "200 OK") + self.assertEqual(response.content_type, "application/json") + self.assertEqual(len(response.json["data"]), 1) + + response = self.app.post_json( + "/tenders/{}/criteria/{}/requirement_groups/{}/requirements/{}/evidences?acc_token={}".format( + self.tender_id, self.criteria_id, self.rg_id, self.requirement_id, self.tender_token), + {"data": self.test_evidence_data} + ) + + self.assertEqual(response.status, "201 Created") + self.assertEqual(response.content_type, "application/json") + evidence_id = response.json["data"]["id"] + + self.set_status("active.auction") + + response = self.app.delete( + "{}/{}?acc_token={}".format(base_request_path, evidence_id, self.tender_token), + status=403, + ) + self.assertEqual(response.status, "403 Forbidden") + self.assertEqual(response.content_type, "application/json") + self.assertEqual(response.json["status"], "error") + self.assertEqual( + response.json["errors"], + [{ + u'description': u"Can't delete object if tender not in " + u"['draft', 'draft.pending', 'draft.stage2', " + u"'active.tendering'] statuses", + u'location': u'body', + u'name': u'data', + }] + ) + + +def get_requirement_evidence(self): + response = self.app.post_json( + "/tenders/{}/criteria/{}/requirement_groups/{}/requirements/{}/evidences?acc_token={}".format( + self.tender_id, self.criteria_id, self.rg_id, self.requirement_id, self.tender_token), + {"data": self.test_evidence_data} + ) + self.assertEqual(response.status, "201 Created") + self.assertEqual(response.content_type, "application/json") + evidence_id = response.json["data"]["id"] + + response = self.app.get( + "/tenders/{}/criteria/{}/requirement_groups/{}/requirements/{}/evidences".format( + self.tender_id, self.criteria_id, self.rg_id, self.requirement_id, self.tender_token), + ) + self.assertEqual(response.status, "200 OK") + self.assertEqual(response.content_type, "application/json") + + evidences = response.json["data"] + + self.assertEqual(len(evidences), 2) + for k, v in self.test_evidence_data.items(): + self.assertEqual(evidences[0][k], v) + + response = self.app.get( + "/tenders/{}/criteria/{}/requirement_groups/{}/requirements/{}/evidences/{}?acc_token={}".format( + self.tender_id, self.criteria_id, self.rg_id, self.requirement_id, evidence_id, self.tender_token), + ) + self.assertEqual(response.status, "200 OK") + self.assertEqual(response.content_type, "application/json") + evidence = response.json["data"] + + for k, v in self.test_evidence_data.items(): + self.assertEqual(evidence[k], v) diff --git a/src/openprocurement/tender/openua/tests/lot.py b/src/openprocurement/tender/openua/tests/lot.py index 0e91ff6d0c..9655ecbd94 100644 --- a/src/openprocurement/tender/openua/tests/lot.py +++ b/src/openprocurement/tender/openua/tests/lot.py @@ -13,14 +13,16 @@ # TenderLotResourceTest tender_lot_guarantee, tender_lot_milestones, + create_tender_lot_minimalstep_validation, + patch_tender_lot_minimalstep_validation, ) from openprocurement.tender.openua.tests.base import ( - test_bids, BaseTenderUAContentWebTest, test_tender_data, test_features_tender_ua_data, ) +from openprocurement.tender.openua.tests.base import test_bids from openprocurement.tender.openua.tests.lot_blanks import ( # TenderLotResourceTest patch_tender_currency, @@ -74,6 +76,8 @@ class TenderLotResourceTest(BaseTenderUAContentWebTest, TenderLotResourceTestMix test_tender_lot_guarantee = snitch(tender_lot_guarantee) test_tender_lot_milestones = snitch(tender_lot_milestones) + test_create_tender_lot_minimalstep_validation = snitch(create_tender_lot_minimalstep_validation) + test_patch_tender_lot_minimalstep_validation = snitch(patch_tender_lot_minimalstep_validation) class TenderLotEdgeCasesTest(BaseTenderUAContentWebTest): @@ -90,6 +94,7 @@ class TenderLotEdgeCasesTest(BaseTenderUAContentWebTest): class TenderLotFeatureResourceTest(BaseTenderUAContentWebTest, TenderLotFeatureResourceTestMixin): initial_data = test_tender_data initial_lots = 2 * test_lots + test_bids_data = test_bids invalid_feature_value = 0.5 max_feature_value = 0.3 sum_of_max_value_of_all_features = 0.3 @@ -98,6 +103,7 @@ class TenderLotFeatureResourceTest(BaseTenderUAContentWebTest, TenderLotFeatureR class TenderLotBidderResourceTest(BaseTenderUAContentWebTest): initial_data = test_tender_data initial_lots = test_lots + test_bids_data = test_bids test_create_tender_bidder_invalid = snitch(create_tender_bidder_invalid) test_patch_tender_bidder = snitch(patch_tender_bidder) @@ -106,6 +112,7 @@ class TenderLotBidderResourceTest(BaseTenderUAContentWebTest): class TenderLotFeatureBidderResourceTest(BaseTenderUAContentWebTest): initial_data = test_tender_data initial_lots = test_lots + test_bids_data = test_bids def setUp(self): super(TenderLotFeatureBidderResourceTest, self).setUp() @@ -150,6 +157,7 @@ def setUp(self): class TenderLotProcessTest(BaseTenderUAContentWebTest, TenderLotProcessTestMixin, TenderUALotProcessTestMixin): initial_data = test_tender_data + test_bids_data = test_bids test_lots_data = test_lots test_features_tender_data = test_features_tender_ua_data setUp = BaseTenderUAContentWebTest.setUp diff --git a/src/openprocurement/tender/openua/tests/lot_blanks.py b/src/openprocurement/tender/openua/tests/lot_blanks.py index 552f8710d2..fe2e6035a0 100644 --- a/src/openprocurement/tender/openua/tests/lot_blanks.py +++ b/src/openprocurement/tender/openua/tests/lot_blanks.py @@ -10,6 +10,7 @@ from openprocurement.tender.belowthreshold.tests.base import ( test_organization, test_author, test_cancellation, test_claim ) +from openprocurement.tender.openua.tests.base import test_bids # TenderLotResourceTest @@ -211,8 +212,10 @@ def get_tender_lot(self): response = self.app.get("/tenders/{}/lots/{}".format(self.tender_id, lot["id"])) self.assertEqual(response.status, "200 OK") self.assertEqual(response.content_type, "application/json") + api_lot = response.json["data"] lot.pop("auctionPeriod") - self.assertEqual(response.json["data"], lot) + api_lot.pop("auctionPeriod") + self.assertEqual(api_lot, lot) response = self.app.get("/tenders/{}/lots/some_id".format(self.tender_id), status=404) self.assertEqual(response.status, "404 Not Found") @@ -250,8 +253,10 @@ def get_tender_lots(self): response = self.app.get("/tenders/{}/lots".format(self.tender_id)) self.assertEqual(response.status, "200 OK") self.assertEqual(response.content_type, "application/json") + api_lot = response.json["data"][0] lot.pop("auctionPeriod") - self.assertEqual(response.json["data"][0], lot) + api_lot.pop("auctionPeriod") + self.assertEqual(api_lot, lot) response = self.app.get("/tenders/some_id/lots", status=404) self.assertEqual(response.status, "404 Not Found") @@ -465,10 +470,12 @@ def next_check_value_with_unanswered_claim(self): def create_tender_bidder_invalid(self): + bid_data = deepcopy(self.test_bids_data[0]) + del bid_data["value"] request_path = "/tenders/{}/bids".format(self.tender_id) response = self.app.post_json( request_path, - {"data": {"selfEligible": True, "selfQualified": True, "tenderers": [test_organization]}}, + {"data": bid_data}, status=422, ) self.assertEqual(response.status, "422 Unprocessable Entity") @@ -479,16 +486,10 @@ def create_tender_bidder_invalid(self): [{u"description": [u"This field is required."], u"location": u"body", u"name": u"lotValues"}], ) + bid_data["lotValues"] = [{"value": {"amount": 500}}] response = self.app.post_json( request_path, - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": [test_organization], - "lotValues": [{"value": {"amount": 500}}], - } - }, + {"data": bid_data}, status=422, ) self.assertEqual(response.status, "422 Unprocessable Entity") @@ -505,16 +506,10 @@ def create_tender_bidder_invalid(self): ], ) + bid_data["lotValues"] = [{"value": {"amount": 500}, "relatedLot": "0" * 32}] response = self.app.post_json( request_path, - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": [test_organization], - "lotValues": [{"value": {"amount": 500}, "relatedLot": "0" * 32}], - } - }, + {"data": bid_data}, status=422, ) self.assertEqual(response.status, "422 Unprocessable Entity") @@ -531,16 +526,10 @@ def create_tender_bidder_invalid(self): ], ) + bid_data["lotValues"] = [{"value": {"amount": 5000000}, "relatedLot": self.initial_lots[0]["id"]}] response = self.app.post_json( request_path, - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": [test_organization], - "lotValues": [{"value": {"amount": 5000000}, "relatedLot": self.initial_lots[0]["id"]}], - } - }, + {"data": bid_data}, status=422, ) self.assertEqual(response.status, "422 Unprocessable Entity") @@ -557,18 +546,10 @@ def create_tender_bidder_invalid(self): ], ) + bid_data["lotValues"] = [{"value": {"amount": 500, "valueAddedTaxIncluded": False}, "relatedLot": self.initial_lots[0]["id"]}] response = self.app.post_json( request_path, - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": [test_organization], - "lotValues": [ - {"value": {"amount": 500, "valueAddedTaxIncluded": False}, "relatedLot": self.initial_lots[0]["id"]} - ], - } - }, + {"data": bid_data}, status=422, ) self.assertEqual(response.status, "422 Unprocessable Entity") @@ -591,16 +572,10 @@ def create_tender_bidder_invalid(self): ], ) + bid_data["lotValues"] = [{"value": {"amount": 500, "currency": "USD"}, "relatedLot": self.initial_lots[0]["id"]}] response = self.app.post_json( request_path, - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": [test_organization], - "lotValues": [{"value": {"amount": 500, "currency": "USD"}, "relatedLot": self.initial_lots[0]["id"]}], - } - }, + {"data": bid_data}, status=422, ) self.assertEqual(response.status, "422 Unprocessable Entity") @@ -617,17 +592,11 @@ def create_tender_bidder_invalid(self): ], ) + bid_data["lotValues"] = [{"value": {"amount": 500}, "relatedLot": self.initial_lots[0]["id"]}] + bid_data["value"] = {"amount": 500} response = self.app.post_json( request_path, - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": [test_organization], - "value": {"amount": 500}, - "lotValues": [{"value": {"amount": 500}, "relatedLot": self.initial_lots[0]["id"]}], - } - }, + {"data": bid_data}, status=422, ) self.assertEqual(response.status, "422 Unprocessable Entity") @@ -638,16 +607,12 @@ def create_tender_bidder_invalid(self): [{u"description": [u"value should be posted for each lot of bid"], u"location": u"body", u"name": u"value"}], ) + bid_data["tenderers"] = test_organization + bid_data["tenderers"] = test_organization + del bid_data["value"] response = self.app.post_json( request_path, - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": test_organization, - "lotValues": [{"value": {"amount": 500}, "relatedLot": self.initial_lots[0]["id"]}], - } - }, + {"data": bid_data}, status=422, ) self.assertEqual(response.status, "422 Unprocessable Entity") @@ -658,16 +623,12 @@ def create_tender_bidder_invalid(self): def patch_tender_bidder(self): lot_id = self.initial_lots[0]["id"] + bid_data = deepcopy(self.test_bids_data[0]) + del bid_data["value"] + bid_data["lotValues"] = [{"value": {"amount": 500}, "relatedLot": lot_id}] response = self.app.post_json( "/tenders/{}/bids".format(self.tender_id), - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": [test_organization], - "lotValues": [{"value": {"amount": 500}, "relatedLot": lot_id}], - } - }, + {"data": bid_data}, ) self.assertEqual(response.status, "201 Created") self.assertEqual(response.content_type, "application/json") @@ -723,10 +684,13 @@ def patch_tender_bidder(self): def create_tender_bidder_feature_invalid(self): + bid_data = deepcopy(self.test_bids_data[0]) + del bid_data["value"] + request_path = "/tenders/{}/bids".format(self.tender_id) response = self.app.post_json( request_path, - {"data": {"selfEligible": True, "selfQualified": True, "tenderers": [test_organization]}}, + {"data": bid_data}, status=422, ) self.assertEqual(response.status, "422 Unprocessable Entity") @@ -740,16 +704,10 @@ def create_tender_bidder_feature_invalid(self): ], ) + bid_data["lotValues"] = [{"value": {"amount": 500}}] response = self.app.post_json( request_path, - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": [test_organization], - "lotValues": [{"value": {"amount": 500}}], - } - }, + {"data": bid_data}, status=422, ) self.assertEqual(response.status, "422 Unprocessable Entity") @@ -766,16 +724,10 @@ def create_tender_bidder_feature_invalid(self): ], ) + bid_data["lotValues"] = [{"value": {"amount": 500}, "relatedLot": "0" * 32}] response = self.app.post_json( request_path, - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": [test_organization], - "lotValues": [{"value": {"amount": 500}, "relatedLot": "0" * 32}], - } - }, + {"data": bid_data}, status=422, ) self.assertEqual(response.status, "422 Unprocessable Entity") @@ -792,16 +744,10 @@ def create_tender_bidder_feature_invalid(self): ], ) + bid_data["lotValues"] = [{"value": {"amount": 5000000}, "relatedLot": self.lot_id}] response = self.app.post_json( request_path, - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": [test_organization], - "lotValues": [{"value": {"amount": 5000000}, "relatedLot": self.lot_id}], - } - }, + {"data": bid_data}, status=422, ) self.assertEqual(response.status, "422 Unprocessable Entity") @@ -818,16 +764,10 @@ def create_tender_bidder_feature_invalid(self): ], ) + bid_data["lotValues"] = [{"value": {"amount": 500, "valueAddedTaxIncluded": False}, "relatedLot": self.lot_id}] response = self.app.post_json( request_path, - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": [test_organization], - "lotValues": [{"value": {"amount": 500, "valueAddedTaxIncluded": False}, "relatedLot": self.lot_id}], - } - }, + {"data": bid_data}, status=422, ) self.assertEqual(response.status, "422 Unprocessable Entity") @@ -850,16 +790,10 @@ def create_tender_bidder_feature_invalid(self): ], ) + bid_data["lotValues"] = [{"value": {"amount": 500, "currency": "USD"}, "relatedLot": self.lot_id}] response = self.app.post_json( request_path, - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": [test_organization], - "lotValues": [{"value": {"amount": 500, "currency": "USD"}, "relatedLot": self.lot_id}], - } - }, + {"data": bid_data}, status=422, ) self.assertEqual(response.status, "422 Unprocessable Entity") @@ -876,16 +810,11 @@ def create_tender_bidder_feature_invalid(self): ], ) + bid_data["lotValues"] = [{"value": {"amount": 500}, "relatedLot": self.lot_id}] + bid_data["tenderers"] = test_organization response = self.app.post_json( request_path, - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": test_organization, - "lotValues": [{"value": {"amount": 500}, "relatedLot": self.lot_id}], - } - }, + {"data": bid_data}, status=422, ) self.assertEqual(response.status, "422 Unprocessable Entity") @@ -893,16 +822,11 @@ def create_tender_bidder_feature_invalid(self): self.assertEqual(response.json["status"], "error") self.assertIn(u"invalid literal for int() with base 10", response.json["errors"][0]["description"]) + bid_data["tenderers"] = [test_organization] + bid_data["lotValues"] = [{"value": {"amount": 500}, "relatedLot": self.lot_id}] response = self.app.post_json( request_path, - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": [test_organization], - "lotValues": [{"value": {"amount": 500}, "relatedLot": self.lot_id}], - } - }, + {"data": bid_data}, status=422, ) self.assertEqual(response.status, "422 Unprocessable Entity") @@ -913,17 +837,13 @@ def create_tender_bidder_feature_invalid(self): [{u"description": [u"All features parameters is required."], u"location": u"body", u"name": u"parameters"}], ) + bid_data.update({ + "lotValues": [{"value": {"amount": 500}, "relatedLot": self.lot_id}], + "parameters": [{"code": "code_item", "value": 0.01}], + }) response = self.app.post_json( request_path, - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": [test_organization], - "lotValues": [{"value": {"amount": 500}, "relatedLot": self.lot_id}], - "parameters": [{"code": "code_item", "value": 0.01}], - } - }, + {"data": bid_data}, status=422, ) self.assertEqual(response.status, "422 Unprocessable Entity") @@ -934,17 +854,10 @@ def create_tender_bidder_feature_invalid(self): [{u"description": [u"All features parameters is required."], u"location": u"body", u"name": u"parameters"}], ) + bid_data["parameters"] = [{"code": "code_invalid", "value": 0.01}] response = self.app.post_json( request_path, - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": [test_organization], - "lotValues": [{"value": {"amount": 500}, "relatedLot": self.lot_id}], - "parameters": [{"code": "code_invalid", "value": 0.01}], - } - }, + {"data": bid_data}, status=422, ) self.assertEqual(response.status, "422 Unprocessable Entity") @@ -961,21 +874,14 @@ def create_tender_bidder_feature_invalid(self): ], ) + bid_data["parameters"] = [ + {"code": "code_item", "value": 0.01}, + {"code": "code_tenderer", "value": 0}, + {"code": "code_lot", "value": 0.01}, + ] response = self.app.post_json( request_path, - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": [test_organization], - "lotValues": [{"value": {"amount": 500}, "relatedLot": self.lot_id}], - "parameters": [ - {"code": "code_item", "value": 0.01}, - {"code": "code_tenderer", "value": 0}, - {"code": "code_lot", "value": 0.01}, - ], - } - }, + {"data": bid_data}, status=422, ) self.assertEqual(response.status, "422 Unprocessable Entity") @@ -995,21 +901,21 @@ def create_tender_bidder_feature_invalid(self): def create_tender_bidder_feature(self): request_path = "/tenders/{}/bids".format(self.tender_id) + + bid_data = deepcopy(self.test_bids_data[0]) + del bid_data["value"] + + bid_data.update({ + "lotValues": [{"value": {"amount": 500}, "relatedLot": self.lot_id}], + "parameters": [ + {"code": "code_item", "value": 0.01}, + {"code": "code_tenderer", "value": 0.01}, + {"code": "code_lot", "value": 0.01}, + ] + }) response = self.app.post_json( request_path, - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": [test_organization], - "lotValues": [{"value": {"amount": 500}, "relatedLot": self.lot_id}], - "parameters": [ - {"code": "code_item", "value": 0.01}, - {"code": "code_tenderer", "value": 0.01}, - {"code": "code_lot", "value": 0.01}, - ], - } - }, + {"data": bid_data}, ) self.assertEqual(response.status, "201 Created") self.assertEqual(response.content_type, "application/json") @@ -1022,19 +928,7 @@ def create_tender_bidder_feature(self): response = self.app.post_json( request_path, - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": [test_organization], - "lotValues": [{"value": {"amount": 500}, "relatedLot": self.lot_id}], - "parameters": [ - {"code": "code_item", "value": 0.01}, - {"code": "code_tenderer", "value": 0.01}, - {"code": "code_lot", "value": 0.01}, - ], - } - }, + {"data": bid_data}, status=403, ) self.assertEqual(response.status, "403 Forbidden") @@ -1067,16 +961,12 @@ def proc_1lot_1bid(self): self.assertIn("auctionPeriod", response.json["data"]["lots"][0]) # create bid self.app.authorization = ("Basic", ("broker", "")) + bid_data = deepcopy(test_bids[0]) + del bid_data["value"] + bid_data["lotValues"] = [{"subcontractingDetails": "test", "value": {"amount": 500}, "relatedLot": lot_id}] self.app.post_json( "/tenders/{}/bids".format(tender_id), - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": [test_organization], - "lotValues": [{"subcontractingDetails": "test", "value": {"amount": 500}, "relatedLot": lot_id}], - } - }, + {"data": bid_data}, ) # switch to active.qualification self.set_status("active.auction", {"lots": [{"auctionPeriod": {"startDate": None}}], "status": "active.tendering"}) @@ -1105,22 +995,20 @@ def proc_1lot_1bid_patch(self): self.assertEqual(response.status, "200 OK") # create bid self.app.authorization = ("Basic", ("broker", "")) + + bid_data = deepcopy(self.test_bids_data[0]) + del bid_data["value"] + bid_data["lotValues"] = [{"value": {"amount": 500}, "relatedLot": lot_id}] response = self.app.post_json( "/tenders/{}/bids".format(tender_id), - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": [test_organization], - "lotValues": [{"value": {"amount": 500}, "relatedLot": lot_id}], - } - }, + {"data": bid_data}, ) bid_id = response.json["data"]["id"] bid_token = response.json["access"]["token"] response = self.app.patch_json( - "/tenders/{}/lots/{}?acc_token={}".format(tender_id, lot_id, owner_token), {"data": {"value": {"amount": 499}}} + "/tenders/{}/lots/{}?acc_token={}".format(tender_id, lot_id, owner_token), + {"data": {"value": {"amount": 499}, "minimalStep": {"amount": 14.0}}} ) self.assertEqual(response.status, "200 OK") @@ -1153,31 +1041,23 @@ def proc_1lot_2bid(self): self.assertIn("auctionPeriod", response.json["data"]["lots"][0]) # create bid self.app.authorization = ("Basic", ("broker", "")) + bid_data = deepcopy(self.test_bids_data[0]) + del bid_data["value"] + bid_data["lotValues"] = [{"subcontractingDetails": "test", "value": {"amount": 450}, "relatedLot": lot_id}] response = self.app.post_json( "/tenders/{}/bids".format(tender_id), - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": [test_organization], - "lotValues": [{"subcontractingDetails": "test", "value": {"amount": 450}, "relatedLot": lot_id}], - } - }, + {"data": bid_data}, ) bid_id = response.json["data"]["id"] bid_token = response.json["access"]["token"] # create second bid self.app.authorization = ("Basic", ("broker", "")) + + bid_data["lotValues"] = [{"value": {"amount": 475}, "relatedLot": lot_id}] + self.app.post_json( "/tenders/{}/bids".format(tender_id), - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": [test_organization], - "lotValues": [{"value": {"amount": 475}, "relatedLot": lot_id}], - } - }, + {"data": bid_data}, ) # switch to active.auction self.set_status("active.auction") @@ -1275,19 +1155,15 @@ def proc_1lot_3bid_1un(self): response = self.set_status("active.tendering", {"lots": [{"auctionPeriod": {"startDate": start_date.isoformat()}}]}) self.assertIn("auctionPeriod", response.json["data"]["lots"][0]) # create bids + bid_data = deepcopy(self.test_bids_data[0]) + del bid_data["value"] + bid_data["lotValues"] = [{"value": {"amount": 450}, "relatedLot": lot_id}] bids_data = {} for i in range(3): self.app.authorization = ("Basic", ("broker", "")) response = self.app.post_json( "/tenders/{}/bids".format(tender_id), - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": [test_organization], - "lotValues": [{"value": {"amount": 450}, "relatedLot": lot_id}], - } - }, + {"data": bid_data}, ) bids_data[response.json["data"]["id"]] = response.json["access"]["token"] @@ -1411,16 +1287,14 @@ def proc_2lot_1bid_0com_1can(self): ) # create bid self.app.authorization = ("Basic", ("broker", "")) + + bid_data = deepcopy(test_bids[0]) + del bid_data["value"] + bid_data["lotValues"] = [{"value": {"amount": 500}, "relatedLot": lot_id} for lot_id in lots] + self.app.post_json( "/tenders/{}/bids".format(tender_id), - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": [test_organization], - "lotValues": [{"value": {"amount": 500}, "relatedLot": lot_id} for lot_id in lots], - } - }, + {"data": bid_data}, ) # switch to active.qualification self.set_status( @@ -1461,30 +1335,21 @@ def proc_2lot_2bid_1lot_del(self): bids = [] self.app.authorization = ("Basic", ("broker", "")) + + bid_data = deepcopy(test_bids[0]) + del bid_data["value"] + bid_data["lotValues"] = [{"value": {"amount": 500}, "relatedLot": lot_id} for lot_id in lots] + response = self.app.post_json( "/tenders/{}/bids".format(tender_id), - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": [test_organization], - "lotValues": [{"value": {"amount": 500}, "relatedLot": lot_id} for lot_id in lots], - } - }, + {"data": bid_data}, ) bids.append(response.json) # create second bid self.app.authorization = ("Basic", ("broker", "")) response = self.app.post_json( "/tenders/{}/bids".format(tender_id), - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": [test_organization], - "lotValues": [{"value": {"amount": 500}, "relatedLot": lot_id} for lot_id in lots], - } - }, + {"data": bid_data}, ) bids.append(response.json) response = self.app.delete("/tenders/{}/lots/{}?acc_token={}".format(self.tender_id, lots[0], owner_token)) @@ -1524,16 +1389,13 @@ def proc_2lot_1bid_2com_1win(self): ) # create bid self.app.authorization = ("Basic", ("broker", "")) + bid_data = deepcopy(test_bids[0]) + del bid_data["value"] + bid_data["lotValues"] = [{"value": {"amount": 500}, "relatedLot": lot_id} for lot_id in lots] + self.app.post_json( "/tenders/{}/bids".format(tender_id), - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": [test_organization], - "lotValues": [{"value": {"amount": 500}, "relatedLot": lot_id} for lot_id in lots], - } - }, + {"data": bid_data}, ) # switch to active.qualification self.set_status( @@ -1609,16 +1471,14 @@ def proc_2lot_1bid_0com_0win(self): ) # create bid self.app.authorization = ("Basic", ("broker", "")) + + bid_data = deepcopy(test_bids[0]) + del bid_data["value"] + bid_data["lotValues"] = [{"value": {"amount": 500}, "relatedLot": lot_id} for lot_id in lots] + self.app.post_json( "/tenders/{}/bids".format(tender_id), - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": [test_organization], - "lotValues": [{"value": {"amount": 500}, "relatedLot": lot_id} for lot_id in lots], - } - }, + {"data": bid_data}, ) # switch to active.qualification self.set_status( @@ -1661,16 +1521,12 @@ def proc_2lot_1bid_1com_1win(self): ) # create bid self.app.authorization = ("Basic", ("broker", "")) + bid_data = deepcopy(test_bids[0]) + del bid_data["value"] + bid_data["lotValues"] = [{"value": {"amount": 500}, "relatedLot": lot_id} for lot_id in lots] self.app.post_json( "/tenders/{}/bids".format(tender_id), - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": [test_organization], - "lotValues": [{"value": {"amount": 500}, "relatedLot": lot_id} for lot_id in lots], - } - }, + {"data": bid_data}, ) # switch to active.qualification self.set_status( @@ -1712,31 +1568,22 @@ def proc_2lot_2bid_2com_2win(self): self.set_status( "active.tendering", {"lots": [{"auctionPeriod": {"startDate": start_date.isoformat()}} for i in lots]} ) + + bid_data = deepcopy(self.test_bids_data[0]) + del bid_data["value"] + bid_data["lotValues"] = [{"value": {"amount": 500}, "relatedLot": lot_id} for lot_id in lots] + # create bid self.app.authorization = ("Basic", ("broker", "")) self.app.post_json( "/tenders/{}/bids".format(tender_id), - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": [test_organization], - "lotValues": [{"value": {"amount": 500}, "relatedLot": lot_id} for lot_id in lots], - } - }, + {"data": bid_data}, ) # create second bid self.app.authorization = ("Basic", ("broker", "")) self.app.post_json( "/tenders/{}/bids".format(tender_id), - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": [test_organization], - "lotValues": [{"value": {"amount": 500}, "relatedLot": lot_id} for lot_id in lots], - } - }, + {"data": bid_data}, ) # switch to active.auction self.set_status("active.auction") @@ -1897,17 +1744,16 @@ def lots_features_delete(self): }, ) # create bid + bid_data = deepcopy(test_bids[0]) + del bid_data["value"] + bid_data.update({ + "lotValues": [{"value": {"amount": 500}, "relatedLot": lots[1]}], + "parameters": [{"code": "code_lot", "value": 0.01}, {"code": "code_tenderer", "value": 0.01}] + }) + response = self.app.post_json( "/tenders/{}/bids".format(tender_id), - { - "data": { - "selfEligible": True, - "selfQualified": True, - "lotValues": [{"value": {"amount": 500}, "relatedLot": lots[1]}], - "parameters": [{"code": "code_lot", "value": 0.01}, {"code": "code_tenderer", "value": 0.01}], - "tenderers": [test_organization], - } - }, + {"data": bid_data}, ) self.assertEqual(response.status, "201 Created") self.assertEqual(response.content_type, "application/json") @@ -1918,18 +1764,11 @@ def lots_features_delete(self): response = self.app.get("/tenders/{}?opt_pretty=1".format(tender_id)) self.assertNotIn("features", response.json["data"]) # patch bid without parameters + bid_data["parameters"] = [] + response = self.app.patch_json( "/tenders/{}/bids/{}?acc_token={}".format(tender_id, bid_id, bid_token), - { - "data": { - "selfEligible": True, - "selfQualified": True, - "status": "active", - "lotValues": [{"value": {"amount": 500}, "relatedLot": lots[1]}], - "parameters": [], - "tenderers": [test_organization], - } - }, + {"data": bid_data}, ) self.assertEqual(response.status, "200 OK") self.assertNotIn("parameters", response.json["data"]) @@ -1967,30 +1806,22 @@ def proc_2lot_2bid_1claim_1com_1win(self): ) # create bid self.app.authorization = ("Basic", ("broker", "")) + + bid_data = deepcopy(test_bids[0]) + del bid_data["value"] + bid_data["lotValues"] = [{"value": {"amount": 500}, "relatedLot": lot_id} for lot_id in lots] + response = self.app.post_json( "/tenders/{}/bids".format(tender_id), - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": [test_organization], - "lotValues": [{"value": {"amount": 500}, "relatedLot": lot_id} for lot_id in lots], - } - }, + {"data": bid_data}, ) bid_token = response.json["access"]["token"] # create second bid self.app.authorization = ("Basic", ("broker", "")) + self.app.post_json( "/tenders/{}/bids".format(tender_id), - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": [test_organization], - "lotValues": [{"value": {"amount": 500}, "relatedLot": lot_id} for lot_id in lots], - } - }, + {"data": bid_data}, ) # switch to active.auction self.set_status("active.auction") diff --git a/src/openprocurement/tender/openua/tests/periods.py b/src/openprocurement/tender/openua/tests/periods.py new file mode 100644 index 0000000000..74e3ba4639 --- /dev/null +++ b/src/openprocurement/tender/openua/tests/periods.py @@ -0,0 +1,93 @@ +from datetime import timedelta + +PERIODS = { + "active.tendering": { + "start": { + "enquiryPeriod": { + "startDate": timedelta(), + "endDate": timedelta(days=13), + }, + "tenderPeriod": {"startDate": timedelta(), "endDate": timedelta(days=16)}, + }, + "enquiry_end": { + "enquiryPeriod": { + "startDate": -timedelta(days=15), + "endDate": -timedelta(days=1), + }, + "tenderPeriod": { + "startDate": -timedelta(days=15), + "endDate": timedelta(days=2), + }, + "auctionPeriod": {"startDate": timedelta(days=2)}, + }, + "complaint_end": { + "enquiryPeriod": { + "startDate": -timedelta(days=14), + "endDate": timedelta(days=1), + }, + "tenderPeriod": { + "startDate": -timedelta(days=14), + "endDate": timedelta(days=3), + }, + "auctionPeriod": {"startDate": timedelta(days=2)}, + } + }, + "active.auction": { + "start": { + "enquiryPeriod": { + "startDate": -timedelta(days=16), + "endDate": -timedelta(days=3), + }, + "tenderPeriod": {"startDate": -timedelta(days=16), "endDate": timedelta()}, + "auctionPeriod": {"startDate": timedelta()}, + } + }, + "active.qualification": { + "start": { + "enquiryPeriod": { + "startDate": -timedelta(days=17), + "endDate": -timedelta(days=4), + }, + "tenderPeriod": { + "startDate": -timedelta(days=17), + "endDate": -timedelta(days=1), + }, + "auctionPeriod": {"startDate": -timedelta(days=1), "endDate": timedelta()}, + "awardPeriod": {"startDate": timedelta()}, + } + }, + "active.awarded": { + "start": { + "enquiryPeriod": { + "startDate": -timedelta(days=17), + "endDate": -timedelta(days=4), + }, + "tenderPeriod": { + "startDate": -timedelta(days=17), + "endDate": -timedelta(days=1), + }, + "auctionPeriod": {"startDate": -timedelta(days=1), "endDate": timedelta()}, + "awardPeriod": {"startDate": timedelta(), "endDate": timedelta()}, + } + }, + "complete": { + "start": { + "enquiryPeriod": { + "startDate": -timedelta(days=25), + "endDate": -timedelta(days=11), + }, + "tenderPeriod": { + "startDate": -timedelta(days=25), + "endDate": -timedelta(days=8), + }, + "auctionPeriod": { + "startDate": -timedelta(days=8), + "endDate": -timedelta(days=7), + }, + "awardPeriod": { + "startDate": -timedelta(days=7), + "endDate": -timedelta(days=7), + }, + } + } +} diff --git a/src/openprocurement/tender/openua/tests/post_blanks.py b/src/openprocurement/tender/openua/tests/post_blanks.py index e294d79435..fecf3702a3 100644 --- a/src/openprocurement/tender/openua/tests/post_blanks.py +++ b/src/openprocurement/tender/openua/tests/post_blanks.py @@ -77,7 +77,7 @@ def create_complaint_post_review_date_forbidden(self): self.assertEqual(response.content_type, "application/json") self.assertEqual( response.json["errors"][0]["description"], - "Can submit or edit post not later than 3 working days before reviewDate" + "Can submit or edit post not later than 3 full business days before reviewDate" ) @@ -643,7 +643,7 @@ def create_tender_complaint_post_document_json(self): self.assertEqual(response.content_type, "application/json") self.assertEqual( response.json["errors"][0]["description"], - "Can submit or edit post not later than 3 working days before reviewDate" + "Can submit or edit post not later than 3 full business days before reviewDate" ) # change complaint reviewDate @@ -858,7 +858,7 @@ def put_tender_complaint_document_json(self): self.assertEqual(response.content_type, "application/json") self.assertEqual( response.json["errors"][0]["description"], - "Can submit or edit post not later than 3 working days before reviewDate" + "Can submit or edit post not later than 3 full business days before reviewDate" ) # change complaint reviewDate diff --git a/src/openprocurement/tender/openua/tests/tender.py b/src/openprocurement/tender/openua/tests/tender.py index a06f17c2db..28fdd5d895 100644 --- a/src/openprocurement/tender/openua/tests/tender.py +++ b/src/openprocurement/tender/openua/tests/tender.py @@ -16,9 +16,11 @@ tender_milestones_required, create_tender_central, create_tender_central_invalid, + tender_minimalstep_validation, + patch_tender_minimalstep_validation, ) -from openprocurement.tender.openua.tests.base import test_tender_data, BaseTenderUAWebTest, BaseApiWebTest +from openprocurement.tender.openua.tests.base import test_tender_data, test_bids, BaseTenderUAWebTest, BaseApiWebTest from openprocurement.tender.openua.tests.tender_blanks import ( # Tender UA Test simple_add_tender, @@ -78,10 +80,13 @@ class TenderUAResourceTest(BaseTenderUAWebTest, TenderResourceTestMixin, TenderU test_create_tender_with_inn_before = snitch(create_tender_with_inn_before) test_patch_tender_lots_none = snitch(patch_tender_lots_none) test_tender_milestones_required = snitch(tender_milestones_required) + test_tender_minimalstep_validation = snitch(tender_minimalstep_validation) + test_patch_tender_minimalstep_validation = snitch(patch_tender_minimalstep_validation) class TenderUAProcessTest(BaseTenderUAWebTest, TenderUaProcessTestMixin): initial_data = test_tender_data + test_bids_data = test_bids test_invalid_tender_conditions = snitch(invalid_tender_conditions) test_one_valid_bid_tender_ua = snitch(one_valid_bid_tender_ua) diff --git a/src/openprocurement/tender/openua/tests/tender_blanks.py b/src/openprocurement/tender/openua/tests/tender_blanks.py index 4c79443ef8..fafa996553 100644 --- a/src/openprocurement/tender/openua/tests/tender_blanks.py +++ b/src/openprocurement/tender/openua/tests/tender_blanks.py @@ -12,6 +12,7 @@ ) from openprocurement.tender.belowthreshold.tests.base import test_organization, test_lots +from openprocurement.tender.openua.tests.base import test_bids from openprocurement.tender.core.utils import calculate_tender_business_date from openprocurement.tender.openua.models import Tender @@ -681,7 +682,11 @@ def patch_tender(self): self.assertEqual(response.content_type, "application/json") self.assertEqual( response.json["errors"], - [{"location": "body", "name": "tenderPeriod", "description": ["tenderPeriod should be greater than 15 days"]}], + [{ + "location": "body", + "name": "tenderPeriod", + "description": ["tenderPeriod must be at least 15 full calendar days long"] + }], ) response = self.app.patch_json( @@ -837,16 +842,20 @@ def patch_tender_period(self): self.assertEqual(response.status, "403 Forbidden") self.assertEqual(response.content_type, "application/json") self.assertEqual(response.json["errors"][0]["description"], "tenderPeriod should be extended by 7 days") - tenderPeriod_endDate = get_now() + timedelta(days=7, seconds=10) - enquiryPeriod_endDate = tenderPeriod_endDate - (timedelta(minutes=10) if SANDBOX_MODE else timedelta(days=10)) + tender_period_end_date = calculate_tender_business_date( + get_now(), timedelta(days=7), tender + ) + timedelta(seconds=10) + enquiry_period_end_date = calculate_tender_business_date( + tender_period_end_date, -timedelta(days=10), tender + ) response = self.app.patch_json( "/tenders/{}?acc_token={}".format(tender["id"], owner_token), - {"data": {"description": "new description", "tenderPeriod": {"endDate": tenderPeriod_endDate.isoformat()}}}, + {"data": {"description": "new description", "tenderPeriod": {"endDate": tender_period_end_date.isoformat()}}}, ) self.assertEqual(response.status, "200 OK") self.assertEqual(response.content_type, "application/json") - self.assertEqual(response.json["data"]["tenderPeriod"]["endDate"], tenderPeriod_endDate.isoformat()) - self.assertEqual(response.json["data"]["enquiryPeriod"]["endDate"], enquiryPeriod_endDate.isoformat()) + self.assertEqual(response.json["data"]["tenderPeriod"]["endDate"], tender_period_end_date.isoformat()) + self.assertEqual(response.json["data"]["enquiryPeriod"]["endDate"], enquiry_period_end_date.isoformat()) # TenderUAProcessTest @@ -877,17 +886,12 @@ def invalid_bid_tender_features(self): # create bid self.app.authorization = ("Basic", ("broker", "")) + bid_data = deepcopy(self.test_bids_data[0]) + bid_data["parameters"] = [{"code": "OCDS-123454-POSTPONEMENT", "value": 0.1}] + bid_data["value"] = {"amount": 500} response = self.app.post_json( "/tenders/{}/bids".format(tender_id), - { - "data": { - "selfEligible": True, - "selfQualified": True, - "parameters": [{"code": "OCDS-123454-POSTPONEMENT", "value": 0.1}], - "tenderers": [test_organization], - "value": {"amount": 500}, - } - }, + {"data": bid_data}, ) self.assertEqual(response.status, "201 Created") self.assertEqual(response.content_type, "application/json") @@ -962,17 +966,14 @@ def invalid_bid_tender_lot(self): # create bid self.app.authorization = ("Basic", ("broker", "")) + bid_data = deepcopy(self.test_bids_data[0]) + bid_data.update({ + "status": "draft", + "lotValues": [{"value": {"amount": 500}, "relatedLot": i} for i in lots] + }) response = self.app.post_json( "/tenders/{}/bids".format(tender_id), - { - "data": { - "selfEligible": True, - "selfQualified": True, - "status": "draft", - "lotValues": [{"value": {"amount": 500}, "relatedLot": i} for i in lots], - "tenderers": [test_organization], - } - }, + {"data": bid_data}, ) self.assertEqual(response.status, "201 Created") self.assertEqual(response.content_type, "application/json") @@ -1007,18 +1008,14 @@ def one_valid_bid_tender_ua(self): ) self.assertIn("auctionPeriod", response.json["data"]) + bid_data = deepcopy(self.test_bids_data[0]) + bid_data["value"] = {"amount": 500} + # create bid self.app.authorization = ("Basic", ("broker", "")) response = self.app.post_json( "/tenders/{}/bids".format(tender_id), - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": [test_organization], - "value": {"amount": 500}, - } - }, + {"data": bid_data}, ) bid_id = self.bid_id = response.json["data"]["id"] @@ -1042,30 +1039,19 @@ def invalid1_and_1draft_bids_tender(self): owner_token = response.json["access"]["token"] # create bid self.app.authorization = ("Basic", ("broker", "")) + + bid_data = deepcopy(self.test_bids_data[0]) + bid_data["value"] = {"amount": 500} response = self.app.post_json( "/tenders/{}/bids".format(tender_id), - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": [test_organization], - "value": {"amount": 500}, - } - }, + {"data": bid_data}, ) + bid_data["status"] = "draft" self.app.authorization = ("Basic", ("broker", "")) response = self.app.post_json( "/tenders/{}/bids".format(tender_id), - { - "data": { - "selfEligible": True, - "selfQualified": True, - "status": "draft", - "tenderers": [test_organization], - "value": {"amount": 500}, - } - }, + {"data": bid_data}, ) # switch to active.qualification self.set_status("active.auction", {"auctionPeriod": {"startDate": None}, "status": "active.tendering"}) @@ -1077,6 +1063,8 @@ def invalid1_and_1draft_bids_tender(self): def activate_bid_after_adding_lot(self): self.app.authorization = ("Basic", ("broker", "")) + bid_data = deepcopy(self.test_bids_data[0]) + bid_data["value"] = {"amount": 500} # empty tenders listing response = self.app.get("/tenders") self.assertEqual(response.json["data"], []) @@ -1088,14 +1076,7 @@ def activate_bid_after_adding_lot(self): self.app.authorization = ("Basic", ("broker", "")) response = self.app.post_json( "/tenders/{}/bids".format(tender_id), - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": [test_organization], - "value": {"amount": 500}, - } - }, + {"data": bid_data}, ) bid_id = response.json["data"]["id"] @@ -1140,31 +1121,20 @@ def first_bid_tender(self): self.set_status("active.tendering") # create bid self.app.authorization = ("Basic", ("broker", "")) + bid_data = deepcopy(self.test_bids_data[0]) + bid_data["value"] = {"amount": 450} response = self.app.post_json( "/tenders/{}/bids".format(tender_id), - { - "data": { - "tenderers": [test_organization], - "value": {"amount": 450}, - "selfEligible": True, - "selfQualified": True, - } - }, + {"data": bid_data}, ) bid_id = response.json["data"]["id"] bid_token = response.json["access"]["token"] # create second bid self.app.authorization = ("Basic", ("broker", "")) + bid_data["value"] = {"amount": 475} response = self.app.post_json( "/tenders/{}/bids".format(tender_id), - { - "data": { - "tenderers": [test_organization], - "value": {"amount": 475}, - "selfEligible": True, - "selfQualified": True, - } - }, + {"data": bid_data}, ) # switch to active.auction self.set_status("active.auction") @@ -1293,6 +1263,8 @@ def first_bid_tender(self): def lost_contract_for_active_award(self): + bid_data = deepcopy(self.test_bids_data[0]) + bid_data["value"] = {"amount": 450} self.app.authorization = ("Basic", ("broker", "")) # create tender response = self.app.post_json("/tenders", {"data": self.initial_data}) @@ -1302,27 +1274,13 @@ def lost_contract_for_active_award(self): self.app.authorization = ("Basic", ("broker", "")) response = self.app.post_json( "/tenders/{}/bids".format(tender_id), - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": [test_organization], - "value": {"amount": 450}, - } - }, + {"data": bid_data}, ) # create bid #2 self.app.authorization = ("Basic", ("broker", "")) response = self.app.post_json( "/tenders/{}/bids".format(tender_id), - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": [test_organization], - "value": {"amount": 450}, - } - }, + {"data": bid_data}, ) # switch to active.auction self.set_status("active.auction") diff --git a/src/openprocurement/tender/openua/validation.py b/src/openprocurement/tender/openua/validation.py index 24d02e9bff..c3fd22a5dd 100644 --- a/src/openprocurement/tender/openua/validation.py +++ b/src/openprocurement/tender/openua/validation.py @@ -1,4 +1,8 @@ -from openprocurement.api.constants import RELEASE_2020_04_19 +from datetime import timedelta + +from schematics.exceptions import ValidationError + +from openprocurement.api.constants import RELEASE_2020_04_19, WORKING_DAYS from openprocurement.api.auth import extract_access_token from openprocurement.api.validation import ( validate_data, validate_json_data, OPERATIONS, validate_accreditation_level, @@ -10,7 +14,7 @@ update_logging_context, upload_objects_documents, ) -from openprocurement.tender.core.utils import calculate_tender_business_date +from openprocurement.tender.core.utils import calculate_tender_business_date, calculate_tender_date from openprocurement.tender.core.validation import validate_tender_period_extension, validate_patch_tender_data_draft from openprocurement.tender.openua.constants import POST_SUBMIT_TIME @@ -46,6 +50,30 @@ def validate_update_tender_document(request): validate_tender_period_extension(request) +def validate_tender_period_start_date(data, period, working_days=False, calendar=WORKING_DAYS): + TENDER_CREATION_BUFFER_DURATION=timedelta(minutes=10) + min_allowed_date = calculate_tender_date( + get_now(), -TENDER_CREATION_BUFFER_DURATION, + working_days=working_days, + calendar=calendar + ) + if min_allowed_date >= period.startDate: + raise ValidationError(u"tenderPeriod.startDate should be in greater than current date") + + +def validate_tender_period_duration(data, period, duration, working_days=False, calendar=WORKING_DAYS): + tender_period_end_date = calculate_tender_business_date( + period.startDate, duration, data, + working_days=working_days, + calendar=calendar + ) + if tender_period_end_date > period.endDate: + raise ValidationError(u"tenderPeriod must be at least {duration.days} full {type} days long".format( + duration=duration, + type="business" if working_days else "calendar" + )) + + # bids def validate_update_bid_to_draft(request): bid_status_to = request.validated["data"].get("status", request.context.status) @@ -100,9 +128,14 @@ def validate_update_bid_document_confidentiality(request): def validate_submit_claim_time(request): tender = request.validated["tender"] claim_submit_time = request.content_configurator.tender_claim_submit_time - if get_now() > calculate_tender_business_date(tender.tenderPeriod.endDate, -claim_submit_time, tender): + claim_end_date = calculate_tender_business_date(tender.tenderPeriod.endDate, -claim_submit_time, tender) + if get_now() > claim_end_date: raise_operation_error( - request, "Can submit claim not later than {0.days} days before tenderPeriod end".format(claim_submit_time) + request, + "Can submit claim not later than {duration.days} " + "full calendar days before tenderPeriod ends".format( + duration=claim_submit_time + ) ) @@ -247,15 +280,20 @@ def validate_complaint_post_complaint_status(request): ) -def validate_complaint_post_review_date(request): +def validate_complaint_post_review_date(request, calendar=WORKING_DAYS): complaint = request.validated["complaint"] if complaint.status == "accepted": tender = request.validated["tender"] - post_end_date = calculate_tender_business_date(complaint.reviewDate, -POST_SUBMIT_TIME, tender, True) + post_end_date = calculate_tender_business_date( + complaint.reviewDate, -POST_SUBMIT_TIME, + tender=tender, working_days=True, calendar=calendar + ) if get_now() > post_end_date: raise_operation_error( - request, "Can submit or edit post not later than {0.days} working days before reviewDate".format( - POST_SUBMIT_TIME + request, + "Can submit or edit post not later than {duration.days} " + "full business days before reviewDate".format( + duration=POST_SUBMIT_TIME ) ) diff --git a/src/openprocurement/tender/openua/views/award.py b/src/openprocurement/tender/openua/views/award.py index d58b60cc90..d8d9f9c324 100644 --- a/src/openprocurement/tender/openua/views/award.py +++ b/src/openprocurement/tender/openua/views/award.py @@ -134,7 +134,7 @@ def patch(self): for i in tender.awards: if i.lotID != award.lotID: continue - if not i.complaintPeriod.endDate or i.complaintPeriod.endDate > now: + if i.complaintPeriod and (not i.complaintPeriod.endDate or i.complaintPeriod.endDate > now): i.complaintPeriod.endDate = now i.status = "cancelled" cancelled_awards.append(i.id) diff --git a/src/openprocurement/tender/openua/views/award_document.py b/src/openprocurement/tender/openua/views/award_document.py index 61d55b874d..29340fc7ea 100644 --- a/src/openprocurement/tender/openua/views/award_document.py +++ b/src/openprocurement/tender/openua/views/award_document.py @@ -2,7 +2,11 @@ from openprocurement.api.utils import raise_operation_error, error_handler, json_view from openprocurement.api.validation import validate_file_update, validate_file_upload, validate_patch_document_data from openprocurement.tender.belowthreshold.views.award_document import TenderAwardDocumentResource -from openprocurement.tender.belowthreshold.validation import validate_award_document +from openprocurement.tender.core.validation import ( + validate_award_document_tender_not_in_allowed_status_base, + validate_award_document_lot_not_in_allowed_status, + validate_award_document_author, +) from openprocurement.tender.core.utils import optendersresource from openprocurement.tender.openua.validation import validate_accepted_complaints @@ -16,14 +20,26 @@ ) class TenderUaAwardDocumentResource(TenderAwardDocumentResource): @json_view( - validators=(validate_file_upload, validate_award_document, validate_accepted_complaints), + validators=( + validate_file_upload, + validate_award_document_tender_not_in_allowed_status_base, + validate_award_document_lot_not_in_allowed_status, + validate_award_document_author, + validate_accepted_complaints + ), permission="upload_tender_documents", ) def collection_post(self): return super(TenderUaAwardDocumentResource, self).collection_post() @json_view( - validators=(validate_file_update, validate_award_document, validate_accepted_complaints), + validators=( + validate_file_update, + validate_award_document_tender_not_in_allowed_status_base, + validate_award_document_lot_not_in_allowed_status, + validate_award_document_author, + validate_accepted_complaints + ), permission="edit_tender", ) def put(self): @@ -31,7 +47,13 @@ def put(self): @json_view( content_type="application/json", - validators=(validate_patch_document_data, validate_award_document, validate_accepted_complaints), + validators=( + validate_patch_document_data, + validate_award_document_tender_not_in_allowed_status_base, + validate_award_document_lot_not_in_allowed_status, + validate_award_document_author, + validate_accepted_complaints + ), permission="edit_tender", ) def patch(self): diff --git a/src/openprocurement/tender/openua/views/award_rr.py b/src/openprocurement/tender/openua/views/award_rr.py new file mode 100644 index 0000000000..dbe9caf2ee --- /dev/null +++ b/src/openprocurement/tender/openua/views/award_rr.py @@ -0,0 +1,14 @@ +# -*- coding: utf-8 -*- +from openprocurement.tender.core.views.award_rr import BaseAwardRequirementResponseResource +from openprocurement.tender.core.utils import optendersresource + + +@optendersresource( + name="aboveThresholdUA:Award Requirement Response", + collection_path="/tenders/{tender_id}/awards/{award_id}/requirement_responses", + path="/tenders/{tender_id}/awards/{award_id}/requirement_responses/{requirement_response_id}", + procurementMethodType="aboveThresholdUA", + description="Tender UA award requirement responses", +) +class AwardRequirementResponseResource(BaseAwardRequirementResponseResource): + pass diff --git a/src/openprocurement/tender/openua/views/award_rr_evidence.py b/src/openprocurement/tender/openua/views/award_rr_evidence.py new file mode 100644 index 0000000000..94f4ed537a --- /dev/null +++ b/src/openprocurement/tender/openua/views/award_rr_evidence.py @@ -0,0 +1,16 @@ +# -*- coding: utf-8 -*- +from openprocurement.tender.core.views.award_rr_evidence import BaseAwardRequirementResponseEvidenceResource +from openprocurement.tender.core.utils import optendersresource + + +@optendersresource( + name="aboveThresholdUA:Award Requirement Response Evidence", + collection_path="/tenders/{tender_id}/awards/{award_id}/requirement_responses/{requirement_response_id}/evidences", + path="/tenders/{tender_id}/awards/{award_id}/requirement_responses/{requirement_response_id}/evidences/{evidence_id}", + procurementMethodType="aboveThresholdUA", + description="Tender UA award evidences", +) +class AwardRequirementResponseEvidenceResource( + BaseAwardRequirementResponseEvidenceResource +): + pass diff --git a/src/openprocurement/tender/openua/views/bid.py b/src/openprocurement/tender/openua/views/bid.py index f1544d25af..517f87eb98 100644 --- a/src/openprocurement/tender/openua/views/bid.py +++ b/src/openprocurement/tender/openua/views/bid.py @@ -7,6 +7,7 @@ validate_update_deleted_bid, validate_bid_operation_period, validate_bid_operation_not_in_tendering, + validate_bid_activate_criteria, ) from openprocurement.tender.core.utils import save_tender, apply_patch, optendersresource from openprocurement.tender.openua.validation import validate_update_bid_to_draft, validate_update_bid_to_active_status @@ -141,6 +142,7 @@ def collection_post(self): validate_update_deleted_bid, validate_update_bid_to_draft, validate_update_bid_to_active_status, + validate_bid_activate_criteria, ), ) def patch(self): diff --git a/src/openprocurement/tender/openua/views/bid_rr.py b/src/openprocurement/tender/openua/views/bid_rr.py new file mode 100644 index 0000000000..6f5006005e --- /dev/null +++ b/src/openprocurement/tender/openua/views/bid_rr.py @@ -0,0 +1,14 @@ +# -*- coding: utf-8 -*- +from openprocurement.tender.core.views.bid_rr import BaseBidRequirementResponseResource +from openprocurement.tender.core.utils import optendersresource + + +@optendersresource( + name="aboveThresholdUA:Bid Requirement Response", + collection_path="/tenders/{tender_id}/bids/{bid_id}/requirement_responses", + path="/tenders/{tender_id}/bids/{bid_id}/requirement_responses/{requirement_response_id}", + procurementMethodType="aboveThresholdUA", + description="Tender UA bidder requirement responses", +) +class BidRequirementResponseResource(BaseBidRequirementResponseResource): + pass diff --git a/src/openprocurement/tender/openua/views/bid_rr_evidence.py b/src/openprocurement/tender/openua/views/bid_rr_evidence.py new file mode 100644 index 0000000000..c10c58c3d8 --- /dev/null +++ b/src/openprocurement/tender/openua/views/bid_rr_evidence.py @@ -0,0 +1,16 @@ +# -*- coding: utf-8 -*- +from openprocurement.tender.core.views.bid_rr_evidence import BaseBidRequirementResponseEvidenceResource +from openprocurement.tender.core.utils import optendersresource + + +@optendersresource( + name="aboveThresholdUA:Bid Requirement Response Evidence", + collection_path="/tenders/{tender_id}/bids/{bid_id}/requirement_responses/{requirement_response_id}/evidences", + path="/tenders/{tender_id}/bids/{bid_id}/requirement_responses/{requirement_response_id}/evidences/{evidence_id}", + procurementMethodType="aboveThresholdUA", + description="Tender UA bidder evidences", +) +class BidRequirementResponseEvidenceResource( + BaseBidRequirementResponseEvidenceResource +): + pass diff --git a/src/openprocurement/tender/openua/views/criterion.py b/src/openprocurement/tender/openua/views/criterion.py new file mode 100644 index 0000000000..849c3860d6 --- /dev/null +++ b/src/openprocurement/tender/openua/views/criterion.py @@ -0,0 +1,15 @@ +# -*- coding: utf-8 -*- +from openprocurement.tender.core.utils import optendersresource +from openprocurement.tender.core.views.criterion import BaseTenderCriteriaResource + + +@optendersresource( + name="aboveThresholdUA:Tender Criteria", + collection_path="/tenders/{tender_id}/criteria", + path="/tenders/{tender_id}/criteria/{criterion_id}", + procurementMethodType="aboveThresholdUA", + description="Tender criteria", +) +class TenderUaCriteriaResource(BaseTenderCriteriaResource): + pass + diff --git a/src/openprocurement/tender/openua/views/criterion_rg.py b/src/openprocurement/tender/openua/views/criterion_rg.py new file mode 100644 index 0000000000..b41fa66659 --- /dev/null +++ b/src/openprocurement/tender/openua/views/criterion_rg.py @@ -0,0 +1,14 @@ +# -*- coding: utf-8 -*- +from openprocurement.tender.core.utils import optendersresource +from openprocurement.tender.core.views.criterion_rg import BaseTenderCriteriaRGResource + + +@optendersresource( + name="aboveThresholdUA:Criteria Requirement Group", + collection_path="/tenders/{tender_id}/criteria/{criterion_id}/requirement_groups", + path="/tenders/{tender_id}/criteria/{criterion_id}/requirement_groups/{requirement_group_id}", + procurementMethodType="aboveThresholdUA", + description="Tender criteria requirement group", +) +class TenderUaCriteriaRGResource(BaseTenderCriteriaRGResource): + pass diff --git a/src/openprocurement/tender/openua/views/criterion_rg_requirement.py b/src/openprocurement/tender/openua/views/criterion_rg_requirement.py new file mode 100644 index 0000000000..9894da1245 --- /dev/null +++ b/src/openprocurement/tender/openua/views/criterion_rg_requirement.py @@ -0,0 +1,15 @@ +# -*- coding: utf-8 -*- +from openprocurement.tender.core.utils import optendersresource +from openprocurement.tender.core.views.criterion_rg_requirement import BaseTenderCriteriaRGRequirementResource + + +@optendersresource( + name="aboveThresholdUA:Requirement Group Requirement", + collection_path="/tenders/{tender_id}/criteria/{criterion_id}/requirement_groups/{requirement_group_id}/requirements", + path="/tenders/{tender_id}/criteria/{criterion_id}/" + "requirement_groups/{requirement_group_id}/requirements/{requirement_id}", + procurementMethodType="aboveThresholdUA", + description="Tender requirement group requirement", +) +class TenderUaCriteriaRGRequirementResource(BaseTenderCriteriaRGRequirementResource): + pass diff --git a/src/openprocurement/tender/openua/views/criterion_rg_requirement_evidence.py b/src/openprocurement/tender/openua/views/criterion_rg_requirement_evidence.py new file mode 100644 index 0000000000..1f00bb0bb1 --- /dev/null +++ b/src/openprocurement/tender/openua/views/criterion_rg_requirement_evidence.py @@ -0,0 +1,17 @@ +# -*- coding: utf-8 -*- +from openprocurement.tender.core.utils import optendersresource +from openprocurement.tender.core.views.criterion_rg_requirement_evidence import ( + BaseTenderCriteriaRGRequirementEvidenceResource, +) + + +@optendersresource( + name="aboveThresholdUA:Requirement Eligible Evidence", + collection_path="/tenders/{tender_id}/criteria/{criterion_id}/requirement_groups/{requirement_group_id}/requirements/{requirement_id}/evidences", + path="/tenders/{tender_id}/criteria/{criterion_id}/" + "requirement_groups/{requirement_group_id}/requirements/{requirement_id}/evidences/{evidence_id}", + procurementMethodType="aboveThresholdUA", + description="Tender requirement evidence", +) +class TenderUaCriteriaRGRequirementEvidenceResource(BaseTenderCriteriaRGRequirementEvidenceResource): + pass diff --git a/src/openprocurement/tender/openua/views/tender.py b/src/openprocurement/tender/openua/views/tender.py index 31752d677e..65b99d9594 100644 --- a/src/openprocurement/tender/openua/views/tender.py +++ b/src/openprocurement/tender/openua/views/tender.py @@ -2,7 +2,8 @@ from openprocurement.tender.core.validation import ( validate_tender_period_extension, validate_tender_not_in_terminated_status, - validate_tender_change_status_with_cancellation_lot_pending + validate_tender_change_status_with_cancellation_lot_pending, + validate_tender_activate_with_criteria, ) from openprocurement.tender.belowthreshold.views.tender import TenderResource from openprocurement.tender.openua.validation import validate_patch_tender_ua_data @@ -30,7 +31,8 @@ class TenderUAResource(TenderResource): validators=( validate_patch_tender_ua_data, validate_tender_not_in_terminated_status, - validate_tender_change_status_with_cancellation_lot_pending + validate_tender_change_status_with_cancellation_lot_pending, + validate_tender_activate_with_criteria, ), permission="edit_tender", ) diff --git a/src/openprocurement/tender/openuadefense/adapters.py b/src/openprocurement/tender/openuadefense/adapters.py index e9e5a81c14..770cab464b 100644 --- a/src/openprocurement/tender/openuadefense/adapters.py +++ b/src/openprocurement/tender/openuadefense/adapters.py @@ -2,7 +2,7 @@ from openprocurement.tender.openua.adapters import TenderAboveThresholdUAConfigurator from openprocurement.tender.openuadefense.models import Tender from openprocurement.tender.openuadefense.constants import ( - TENDER_PERIOD, + TENDERING_DURATION, TENDERING_EXTRA_PERIOD, CLAIM_SUBMIT_TIME, COMPLAINT_SUBMIT_TIME, @@ -16,7 +16,7 @@ class TenderAboveThresholdUADefConfigurator(TenderAboveThresholdUAConfigurator): model = Tender # Duration of tendering period. timedelta object. - tendering_period_duration = TENDER_PERIOD + tendering_period_duration = TENDERING_DURATION # Duration of tender period extension. timedelta object tendering_period_extra = TENDERING_EXTRA_PERIOD diff --git a/src/openprocurement/tender/openuadefense/constants.py b/src/openprocurement/tender/openuadefense/constants.py index 921ffe3244..fb423fd073 100644 --- a/src/openprocurement/tender/openuadefense/constants.py +++ b/src/openprocurement/tender/openuadefense/constants.py @@ -2,12 +2,13 @@ from datetime import timedelta, datetime from openprocurement.api.constants import TZ +TENDERING_DAYS = 6 +TENDERING_DURATION = timedelta(days=TENDERING_DAYS) STAND_STILL_TIME = timedelta(days=4) ENQUIRY_STAND_STILL_TIME = timedelta(days=2) CLAIM_SUBMIT_TIME = timedelta(days=3) COMPLAINT_SUBMIT_TIME = timedelta(days=2) COMPLAINT_OLD_SUBMIT_TIME = timedelta(days=3) COMPLAINT_OLD_SUBMIT_TIME_BEFORE = datetime(2016, 7, 5, tzinfo=TZ) -TENDER_PERIOD = timedelta(days=6) ENQUIRY_PERIOD_TIME = timedelta(days=3) TENDERING_EXTRA_PERIOD = timedelta(days=2) diff --git a/src/openprocurement/tender/openuadefense/models.py b/src/openprocurement/tender/openuadefense/models.py index ceb357a621..0b8e04de5e 100644 --- a/src/openprocurement/tender/openuadefense/models.py +++ b/src/openprocurement/tender/openuadefense/models.py @@ -1,29 +1,35 @@ # -*- coding: utf-8 -*- from datetime import timedelta, datetime, time from schematics.exceptions import ValidationError -from schematics.types import StringType +from schematics.types import StringType, BooleanType from schematics.types.compound import ModelType from schematics.types.serializable import serializable from zope.interface import implementer from openprocurement.api.utils import get_now -from openprocurement.api.models import Period, ListType, ContactPoint as BaseContactPoint +from openprocurement.api.models import ( + Period, + ListType, + ContactPoint as BaseContactPoint, + SifterListType, +) from openprocurement.tender.core.models import ( ProcuringEntity as BaseProcuringEntity, EnquiryPeriod, - Lot as BaseLot, + LotWithMinimalStepLimitsValidation as BaseLot, validate_lots_uniq, get_tender, ) from openprocurement.tender.openua.models import ( Tender as BaseTender, Cancellation as BaseCancellation, - IAboveThresholdUATender + IAboveThresholdUATender, + BaseUaBid, ) from openprocurement.tender.core.utils import ( calc_auction_end_time, ) from openprocurement.tender.openuadefense.constants import ( - TENDER_PERIOD, + TENDERING_DURATION, ENQUIRY_STAND_STILL_TIME, ENQUIRY_PERIOD_TIME, COMPLAINT_SUBMIT_TIME, @@ -32,9 +38,10 @@ ) from openprocurement.tender.openuadefense.utils import ( calculate_tender_business_date, - calculate_clarifications_business_date, + calculate_clarif_business_date, calculate_complaint_business_date, ) +from openprocurement.tender.openuadefense.validation import validate_tender_period_duration class IAboveThresholdUADefTender(IAboveThresholdUATender): @@ -50,7 +57,8 @@ def shouldStartAfter(self): return tender = get_tender(self) lot = self.__parent__ - if tender.status not in ["active.tendering", "active.auction"] or lot.status != "active": + statuses = ["active.tendering", "active.auction"] + if tender.status not in statuses or lot.status != "active": return if tender.status == "active.auction" and lot.numberOfBids < 2: return @@ -91,6 +99,10 @@ class Options: _after_release_reasonType_choices = ["noDemand", "unFixable", "expensesCut"] +class Bid(BaseUaBid): + selfEligible = BooleanType(choices=[True], required=True) + + @implementer(IAboveThresholdUADefTender) class Tender(BaseTender): """Data regarding tender process - publicly inviting prospective contractors to submit bids for evaluation and selecting a winner or winners.""" @@ -102,29 +114,37 @@ class Tender(BaseTender): procurementMethodType = StringType(default="aboveThresholdUA.defense") procuring_entity_kinds = ["defense"] + bids = SifterListType( + ModelType(Bid, required=True), default=list(), filter_by="status", filter_in_values=["invalid", "deleted"] + ) + cancellations = ListType(ModelType(Cancellation, required=True), default=list()) + def validate_tenderPeriod(self, data, period): + if period: + validate_tender_period_duration(data, period, TENDERING_DURATION, working_days=True) + @serializable(serialized_name="enquiryPeriod", type=ModelType(EnquiryPeriod)) def tender_enquiryPeriod(self): - endDate = calculate_tender_business_date(self.tenderPeriod.endDate, -ENQUIRY_PERIOD_TIME, self, True) - clarificationsUntil = calculate_clarifications_business_date(endDate, ENQUIRY_STAND_STILL_TIME, self, True) + end_date = calculate_tender_business_date(self.tenderPeriod.endDate, -ENQUIRY_PERIOD_TIME, self, True) + clarifications_until = calculate_clarif_business_date(end_date, ENQUIRY_STAND_STILL_TIME, self, True) return EnquiryPeriod( dict( startDate=self.tenderPeriod.startDate, - endDate=endDate, + endDate=end_date, invalidationDate=self.enquiryPeriod and self.enquiryPeriod.invalidationDate, - clarificationsUntil=clarificationsUntil, + clarificationsUntil=clarifications_until, ) ) - def validate_tenderPeriod(self, data, period): - if period and calculate_tender_business_date(period.startDate, TENDER_PERIOD, data, True) > period.endDate: - raise ValidationError(u"tenderPeriod should be greater than {0.days} working days".format(TENDER_PERIOD)) - @serializable(type=ModelType(Period)) def complaintPeriod(self): if self.tenderPeriod.startDate < COMPLAINT_OLD_SUBMIT_TIME_BEFORE: - endDate = calculate_tender_business_date(self.tenderPeriod.endDate, -COMPLAINT_OLD_SUBMIT_TIME, self) + end_date = calculate_tender_business_date(self.tenderPeriod.endDate, -COMPLAINT_OLD_SUBMIT_TIME, self) else: - endDate = calculate_complaint_business_date(self.tenderPeriod.endDate, -COMPLAINT_SUBMIT_TIME, self) - return Period(dict(startDate=self.tenderPeriod.startDate, endDate=endDate)) + end_date = calculate_complaint_business_date(self.tenderPeriod.endDate, -COMPLAINT_SUBMIT_TIME, self, True) + return Period(dict(startDate=self.tenderPeriod.startDate, endDate=end_date)) + + def validate_criteria(self, data, value): + if value: + raise ValidationError("Rogue field") diff --git a/src/openprocurement/tender/openuadefense/subscribers.py b/src/openprocurement/tender/openuadefense/subscribers.py index a8fdedcb5c..ec58bc8175 100644 --- a/src/openprocurement/tender/openuadefense/subscribers.py +++ b/src/openprocurement/tender/openuadefense/subscribers.py @@ -7,7 +7,7 @@ from openprocurement.tender.openuadefense.constants import ENQUIRY_STAND_STILL_TIME, ENQUIRY_PERIOD_TIME from openprocurement.tender.openuadefense.utils import ( calculate_tender_business_date, - calculate_clarifications_business_date, + calculate_clarif_business_date, ) @@ -15,14 +15,14 @@ def tender_init_handler(event): """ initialization handler for openuadefence tenders """ tender = event.tender - endDate = calculate_tender_business_date(tender.tenderPeriod.endDate, -ENQUIRY_PERIOD_TIME, tender, True) - clarificationsUntil = calculate_clarifications_business_date(endDate, ENQUIRY_STAND_STILL_TIME, tender, True) + end_date = calculate_tender_business_date(tender.tenderPeriod.endDate, -ENQUIRY_PERIOD_TIME, tender, True) + clarifications_until = calculate_clarif_business_date(end_date, ENQUIRY_STAND_STILL_TIME, tender, True) tender.enquiryPeriod = EnquiryPeriod( dict( startDate=tender.tenderPeriod.startDate, - endDate=endDate, + endDate=end_date, invalidationDate=tender.enquiryPeriod and tender.enquiryPeriod.invalidationDate, - clarificationsUntil=clarificationsUntil, + clarificationsUntil=clarifications_until, ) ) now = get_now() diff --git a/src/openprocurement/tender/openuadefense/tests/auction.py b/src/openprocurement/tender/openuadefense/tests/auction.py index eadf9f236e..78d86981e1 100644 --- a/src/openprocurement/tender/openuadefense/tests/auction.py +++ b/src/openprocurement/tender/openuadefense/tests/auction.py @@ -26,7 +26,7 @@ post_tender_lots_auction_features, ) -from openprocurement.tender.openua.tests.base import test_bids +from openprocurement.tender.openuadefense.tests.base import test_bids from openprocurement.tender.openuadefense.tests.base import ( BaseTenderUAContentWebTest, diff --git a/src/openprocurement/tender/openuadefense/tests/award.py b/src/openprocurement/tender/openuadefense/tests/award.py index 7ea4121947..ecd15b5c92 100644 --- a/src/openprocurement/tender/openuadefense/tests/award.py +++ b/src/openprocurement/tender/openuadefense/tests/award.py @@ -41,7 +41,7 @@ ) from openprocurement.tender.core.tests.base import change_auth -from openprocurement.tender.openua.tests.base import test_bids +from openprocurement.tender.openuadefense.tests.base import test_bids from openprocurement.tender.openua.tests.award_blanks import ( # TenderAwardResourceTest create_tender_award, diff --git a/src/openprocurement/tender/openuadefense/tests/award_milestone.py b/src/openprocurement/tender/openuadefense/tests/award_milestone.py index 0ee792f370..e2e9dfa211 100644 --- a/src/openprocurement/tender/openuadefense/tests/award_milestone.py +++ b/src/openprocurement/tender/openuadefense/tests/award_milestone.py @@ -1,6 +1,5 @@ from openprocurement.tender.openuadefense.tests.award import TenderAwardPendingResourceTestCase -from openprocurement.tender.openuadefense.tests.base import BaseTenderUAContentWebTest -from openprocurement.tender.openua.tests.base import test_bids +from openprocurement.tender.openuadefense.tests.base import test_bids, BaseTenderUAContentWebTest from openprocurement.tender.core.tests.base import change_auth from openprocurement.tender.belowthreshold.tests.base import test_lots from openprocurement.tender.core.tests.qualification_milestone import ( diff --git a/src/openprocurement/tender/openuadefense/tests/base.py b/src/openprocurement/tender/openuadefense/tests/base.py index bb4a4e2762..a8f9e371dd 100644 --- a/src/openprocurement/tender/openuadefense/tests/base.py +++ b/src/openprocurement/tender/openuadefense/tests/base.py @@ -1,10 +1,13 @@ # -*- coding: utf-8 -*- import os from datetime import timedelta +from copy import deepcopy from openprocurement.api.tests.base import BaseWebTest from openprocurement.api.utils import get_now, apply_data_patch from openprocurement.api.constants import SANDBOX_MODE +from openprocurement.tender.openuadefense.models import Tender +from openprocurement.tender.openuadefense.tests.periods import PERIODS from openprocurement.tender.openua.tests.base import ( now, test_features_tender_data, @@ -15,6 +18,7 @@ test_tender_data as test_tender_data_api, ) from openprocurement.api.utils import apply_data_patch +from openprocurement.tender.belowthreshold.tests.base import test_bids as base_test_bids test_tender_data = test_tender_ua_data = test_tender_data_api.copy() @@ -61,6 +65,13 @@ test_features_tender_ua_data["items"][0]["deliveryDate"] = test_tender_data["items"][0]["deliveryDate"] test_features_tender_ua_data["items"][0]["deliveryAddress"] = test_tender_data["items"][0]["deliveryAddress"] +test_bids = deepcopy(base_test_bids) + +bid_update_data = {"selfQualified": True, "selfEligible": True} + +for i in test_bids: + i.update(bid_update_data) + class BaseApiWebTest(BaseWebTest): relative_to = os.path.dirname(__file__) @@ -76,164 +87,14 @@ class BaseTenderUAWebTest(BaseTenderWebTest): "active.auction" ) # status, in which operations with tender lots (adding, updating, deleting) are forbidden + periods = PERIODS + tender_class = Tender + def set_enquiry_period_end(self): - now = get_now() - self.set_status( - "active.tendering", - { - "enquiryPeriod": { - "startDate": (now - timedelta(days=13)).isoformat(), - "endDate": (now - (timedelta(minutes=1) if SANDBOX_MODE else timedelta(days=1))).isoformat(), - }, - "tenderPeriod": { - "startDate": (now - timedelta(days=13)).isoformat(), - "endDate": (now + (timedelta(minutes=2) if SANDBOX_MODE else timedelta(days=2))).isoformat(), - }, - "auctionPeriod": {"startDate": (now + timedelta(days=2)).isoformat()}, - }, - ) + self.set_status("active.tendering", startend="enquiry_end") def set_complaint_period_end(self): - now = get_now() - self.set_status( - "active.tendering", - { - "enquiryPeriod": { - "startDate": (now - timedelta(days=12)).isoformat(), - "endDate": now.isoformat(), - }, - "tenderPeriod": { - "startDate": (now - timedelta(days=12)).isoformat(), - "endDate": (now + (timedelta(minutes=1) if SANDBOX_MODE else timedelta(days=1))).isoformat(), - }, - "auctionPeriod": {"startDate": (now + timedelta(days=2)).isoformat()}, - }, - ) - - def update_status(self, status, extra=None): - now = get_now() - data = {"status": status} - if status == "active.tendering": - data.update( - { - "enquiryPeriod": { - "startDate": (now).isoformat(), - "endDate": (now + timedelta(days=13)).isoformat(), - }, - "tenderPeriod": {"startDate": (now).isoformat(), "endDate": (now + timedelta(days=16)).isoformat()}, - } - ) - elif status == "active.auction": - data.update( - { - "enquiryPeriod": { - "startDate": (now - timedelta(days=16)).isoformat(), - "endDate": (now - timedelta(days=3)).isoformat(), - }, - "tenderPeriod": {"startDate": (now - timedelta(days=16)).isoformat(), "endDate": (now).isoformat()}, - "auctionPeriod": {"startDate": (now).isoformat()}, - } - ) - if self.initial_lots: - data.update({"lots": [{"auctionPeriod": {"startDate": (now).isoformat()}} for i in self.initial_lots]}) - elif status == "active.qualification": - data.update( - { - "enquiryPeriod": { - "startDate": (now - timedelta(days=17)).isoformat(), - "endDate": (now - timedelta(days=4)).isoformat(), - }, - "tenderPeriod": { - "startDate": (now - timedelta(days=17)).isoformat(), - "endDate": (now - timedelta(days=1)).isoformat(), - }, - "auctionPeriod": {"startDate": (now - timedelta(days=1)).isoformat(), "endDate": (now).isoformat()}, - "awardPeriod": {"startDate": (now).isoformat()}, - } - ) - if self.initial_lots: - data.update( - { - "lots": [ - { - "auctionPeriod": { - "startDate": (now - timedelta(days=1)).isoformat(), - "endDate": (now).isoformat(), - } - } - for i in self.initial_lots - ] - } - ) - elif status == "active.awarded": - data.update( - { - "enquiryPeriod": { - "startDate": (now - timedelta(days=17)).isoformat(), - "endDate": (now - timedelta(days=4)).isoformat(), - }, - "tenderPeriod": { - "startDate": (now - timedelta(days=17)).isoformat(), - "endDate": (now - timedelta(days=1)).isoformat(), - }, - "auctionPeriod": {"startDate": (now - timedelta(days=1)).isoformat(), "endDate": (now).isoformat()}, - "awardPeriod": {"startDate": (now).isoformat(), "endDate": (now).isoformat()}, - } - ) - if self.initial_lots: - data.update( - { - "lots": [ - { - "auctionPeriod": { - "startDate": (now - timedelta(days=1)).isoformat(), - "endDate": (now).isoformat(), - } - } - for i in self.initial_lots - ] - } - ) - elif status == "complete": - data.update( - { - "enquiryPeriod": { - "startDate": (now - timedelta(days=25)).isoformat(), - "endDate": (now - timedelta(days=11)).isoformat(), - }, - "tenderPeriod": { - "startDate": (now - timedelta(days=25)).isoformat(), - "endDate": (now - timedelta(days=8)).isoformat(), - }, - "auctionPeriod": { - "startDate": (now - timedelta(days=8)).isoformat(), - "endDate": (now - timedelta(days=7)).isoformat(), - }, - "awardPeriod": { - "startDate": (now - timedelta(days=7)).isoformat(), - "endDate": (now - timedelta(days=7)).isoformat(), - }, - } - ) - if self.initial_lots: - data.update( - { - "lots": [ - { - "auctionPeriod": { - "startDate": (now - timedelta(days=8)).isoformat(), - "endDate": (now - timedelta(days=7)).isoformat(), - } - } - for i in self.initial_lots - ] - } - ) - - self.tender_document_patch = data - if extra: - self.tender_document_patch.update(extra) - self.save_changes() + self.set_status("active.tendering", startend="complaint_end") class BaseTenderUAContentWebTest(BaseTenderUAWebTest): diff --git a/src/openprocurement/tender/openuadefense/tests/bid.py b/src/openprocurement/tender/openuadefense/tests/bid.py index ac4f6aa333..be5f940559 100644 --- a/src/openprocurement/tender/openuadefense/tests/bid.py +++ b/src/openprocurement/tender/openuadefense/tests/bid.py @@ -1,5 +1,6 @@ # -*- coding: utf-8 -*- import unittest +from copy import deepcopy from openprocurement.api.tests.base import snitch @@ -15,7 +16,7 @@ patch_tender_with_bids_lots_none, ) -from openprocurement.tender.openua.tests.base import test_bids + from openprocurement.tender.openua.tests.bid import TenderBidResourceTestMixin, TenderBidDocumentResourceTestMixin from openprocurement.tender.openua.tests.bid_blanks import ( # TenderBidFeaturesResourceTest @@ -27,7 +28,11 @@ tender_bidder_confidential_document, ) -from openprocurement.tender.openuadefense.tests.base import BaseTenderUAContentWebTest, test_features_tender_ua_data +from openprocurement.tender.openuadefense.tests.base import ( + BaseTenderUAContentWebTest, + test_features_tender_ua_data, + test_bids, +) class TenderBidResourceTest(BaseTenderUAContentWebTest, TenderBidResourceTestMixin): @@ -47,6 +52,7 @@ class Tender2LotBidResourceTest(BaseTenderUAContentWebTest): class TenderBidFeaturesResourceTest(BaseTenderUAContentWebTest): initial_data = test_features_tender_ua_data initial_status = "active.tendering" + test_bids_data = test_bids test_features_bidder = snitch(features_bidder) test_features_bidder_invalid = snitch(features_bidder_invalid) @@ -59,17 +65,13 @@ class TenderBidDocumentResourceTest(BaseTenderUAContentWebTest, TenderBidDocumen def setUp(self): super(TenderBidDocumentResourceTest, self).setUp() + + bid_data = deepcopy(self.test_bids_data[0]) + bid_data["value"] = {"amount": 500} # Create bid response = self.app.post_json( "/tenders/{}/bids".format(self.tender_id), - { - "data": { - "tenderers": [test_organization], - "value": {"amount": 500}, - "selfEligible": True, - "selfQualified": True, - } - }, + {"data": bid_data}, ) bid = response.json["data"] self.bid_id = bid["id"] @@ -78,16 +80,12 @@ def setUp(self): test_not_found = snitch(not_found) def test_create_tender_bidder_document_nopending(self): + bid_data = deepcopy(self.test_bids_data[0]) + bid_data["value"] = {"amount": 500} + response = self.app.post_json( "/tenders/{}/bids".format(self.tender_id), - { - "data": { - "selfEligible": True, - "selfQualified": True, - "tenderers": [self.test_bids_data[0]["tenderers"][0]], - "value": {"amount": 500}, - } - }, + {"data": bid_data}, ) bid = response.json["data"] bid_id = bid["id"] diff --git a/src/openprocurement/tender/openuadefense/tests/cancellation.py b/src/openprocurement/tender/openuadefense/tests/cancellation.py index b93e1e4d48..7bf4943402 100644 --- a/src/openprocurement/tender/openuadefense/tests/cancellation.py +++ b/src/openprocurement/tender/openuadefense/tests/cancellation.py @@ -23,7 +23,6 @@ create_tender_lots_cancellation, patch_tender_lots_cancellation, ) -from openprocurement.tender.openua.tests.base import test_bids from openprocurement.tender.openua.tests.cancellation import ( TenderCancellationResourceNewReleaseTestMixin, TenderCancellationComplaintResourceTestMixin, @@ -34,7 +33,7 @@ create_tender_cancellation_with_cancellation_lots, ) -from openprocurement.tender.openuadefense.tests.base import BaseTenderUAContentWebTest +from openprocurement.tender.openuadefense.tests.base import BaseTenderUAContentWebTest, test_bids class TenderCancellationResourceTest( diff --git a/src/openprocurement/tender/openuadefense/tests/chronograph.py b/src/openprocurement/tender/openuadefense/tests/chronograph.py index a7d0e5a125..ed2fa0a1c4 100644 --- a/src/openprocurement/tender/openuadefense/tests/chronograph.py +++ b/src/openprocurement/tender/openuadefense/tests/chronograph.py @@ -11,7 +11,6 @@ switch_to_qualification as not_switch_to_unsuccessful, ) -from openprocurement.tender.openua.tests.base import test_bids from openprocurement.tender.openua.tests.chronograph import ( TenderSwitchAuctionResourceTestMixin, TenderLotSwitchAuctionResourceTestMixin, @@ -24,7 +23,7 @@ set_auction_period_0bid, ) -from openprocurement.tender.openuadefense.tests.base import BaseTenderUAContentWebTest +from openprocurement.tender.openuadefense.tests.base import BaseTenderUAContentWebTest, test_bids from openprocurement.tender.openuadefense.tests.chronograph_blanks import ( # TenderSwitchAuctionResourceTest switch_to_auction, diff --git a/src/openprocurement/tender/openuadefense/tests/contract.py b/src/openprocurement/tender/openuadefense/tests/contract.py index 60826cf057..f9ba119182 100644 --- a/src/openprocurement/tender/openuadefense/tests/contract.py +++ b/src/openprocurement/tender/openuadefense/tests/contract.py @@ -9,14 +9,13 @@ TenderContractDocumentResourceTestMixin, ) -from openprocurement.tender.openua.tests.base import test_bids from openprocurement.tender.openua.tests.contract_blanks import ( # TenderContractResourceTest create_tender_contract, patch_tender_contract, ) -from openprocurement.tender.openuadefense.tests.base import BaseTenderUAContentWebTest +from openprocurement.tender.openuadefense.tests.base import BaseTenderUAContentWebTest, test_bids from openprocurement.tender.belowthreshold.tests.contract_blanks import ( patch_tender_contract_value_vat_not_included, diff --git a/src/openprocurement/tender/openuadefense/tests/lot.py b/src/openprocurement/tender/openuadefense/tests/lot.py index 13707fc236..a9b8189542 100644 --- a/src/openprocurement/tender/openuadefense/tests/lot.py +++ b/src/openprocurement/tender/openuadefense/tests/lot.py @@ -9,9 +9,12 @@ TenderLotFeatureResourceTestMixin, TenderLotProcessTestMixin, ) -from openprocurement.tender.belowthreshold.tests.lot_blanks import tender_lot_milestones +from openprocurement.tender.belowthreshold.tests.lot_blanks import ( + tender_lot_milestones, + create_tender_lot_minimalstep_validation, + patch_tender_lot_minimalstep_validation, +) -from openprocurement.tender.openua.tests.base import test_bids from openprocurement.tender.openua.tests.lot import TenderUALotResourceTestMixin, TenderUALotProcessTestMixin from openprocurement.tender.openua.tests.lot_blanks import ( # TenderLotFeatureResourceTest @@ -22,7 +25,11 @@ create_tender_bidder_feature, ) -from openprocurement.tender.openuadefense.tests.base import BaseTenderUAContentWebTest, test_tender_data +from openprocurement.tender.openuadefense.tests.base import ( + BaseTenderUAContentWebTest, + test_tender_data, + test_bids, +) from openprocurement.tender.openuadefense.tests.lot_blanks import ( # TenderLotEdgeCasesTest question_blocking, @@ -42,6 +49,8 @@ class TenderLotResourceTest(BaseTenderUAContentWebTest, TenderLotResourceTestMixin, TenderUALotResourceTestMixin): test_lots_data = test_lots test_tender_lot_milestones = snitch(tender_lot_milestones) + test_create_tender_lot_minimalstep_validation = snitch(create_tender_lot_minimalstep_validation) + test_patch_tender_lot_minimalstep_validation = snitch(patch_tender_lot_minimalstep_validation) class TenderLotEdgeCasesTest(BaseTenderUAContentWebTest): @@ -65,6 +74,7 @@ class TenderLotFeatureResourceTest(BaseTenderUAContentWebTest, TenderLotFeatureR class TenderLotBidderResourceTest(BaseTenderUAContentWebTest): # initial_status = 'active.tendering' initial_lots = test_lots + test_bids_data = test_bids test_create_tender_bidder_invalid = snitch(create_tender_bidder_invalid) test_patch_tender_bidder = snitch(patch_tender_bidder) @@ -72,6 +82,7 @@ class TenderLotBidderResourceTest(BaseTenderUAContentWebTest): class TenderLotFeatureBidderResourceTest(BaseTenderUAContentWebTest): initial_lots = test_lots + test_bids_data = test_bids def setUp(self): super(TenderLotFeatureBidderResourceTest, self).setUp() @@ -117,6 +128,7 @@ def setUp(self): class TenderLotProcessTest(BaseTenderUAContentWebTest, TenderLotProcessTestMixin, TenderUALotProcessTestMixin): setUp = BaseTenderUAContentWebTest.setUp initial_data = test_tender_data + test_bids_data = test_bids days_till_auction_starts = 6 diff --git a/src/openprocurement/tender/openuadefense/tests/lot_blanks.py b/src/openprocurement/tender/openuadefense/tests/lot_blanks.py index 62be374c44..483e342345 100644 --- a/src/openprocurement/tender/openuadefense/tests/lot_blanks.py +++ b/src/openprocurement/tender/openuadefense/tests/lot_blanks.py @@ -419,7 +419,7 @@ def two_lot_1bid_2com_1win(self): self.set_status("complete", {"status": "active.awarded"}) # time travel tender = self.db.get(tender_id) - now = (get_now() - timedelta(seconds=1)).isoformat() + now = (get_now() - timedelta(minutes=1)).isoformat() for i in tender.get("awards", []): i["complaintPeriod"] = {"startDate": now, "endDate": now} self.db.save(tender) diff --git a/src/openprocurement/tender/openuadefense/tests/periods.py b/src/openprocurement/tender/openuadefense/tests/periods.py new file mode 100644 index 0000000000..479e9ade4b --- /dev/null +++ b/src/openprocurement/tender/openuadefense/tests/periods.py @@ -0,0 +1,96 @@ +from datetime import timedelta + +PERIODS = { + "active.tendering": { + "start": { + "enquiryPeriod": { + "startDate": timedelta(), + "endDate": timedelta() + timedelta(days=13), + }, + "tenderPeriod": { + "startDate": timedelta(), + "endDate": timedelta() + timedelta(days=16) + }, + }, + "enquiry_end": { + "enquiryPeriod": { + "startDate": -timedelta(days=13), + "endDate": -timedelta(days=1), + }, + "tenderPeriod": { + "startDate": -timedelta(days=13), + "endDate": timedelta(days=1), + }, + "auctionPeriod": {"startDate": timedelta(days=2)}, + }, + "complaint_end": { + "enquiryPeriod": { + "startDate": -timedelta(days=12), + "endDate": timedelta(), + }, + "tenderPeriod": { + "startDate": -timedelta(days=12), + "endDate": timedelta(days=1), + }, + "auctionPeriod": {"startDate": timedelta(days=2)} + }, + }, + "active.auction": { + "start": { + "enquiryPeriod": { + "startDate": -timedelta(days=16), + "endDate": -timedelta(days=3), + }, + "tenderPeriod": {"startDate": -timedelta(days=16), "endDate": timedelta()}, + "auctionPeriod": {"startDate": timedelta()}, + } + }, + "active.qualification": { + "start": { + "enquiryPeriod": { + "startDate": -timedelta(days=17), + "endDate": -timedelta(days=4), + }, + "tenderPeriod": { + "startDate": -timedelta(days=17), + "endDate": -timedelta(days=1), + }, + "auctionPeriod": {"startDate": -timedelta(days=1), "endDate": timedelta()}, + "awardPeriod": {"startDate": timedelta()}, + } + }, + "active.awarded": { + "start": { + "enquiryPeriod": { + "startDate": -timedelta(days=17), + "endDate": -timedelta(days=4), + }, + "tenderPeriod": { + "startDate": -timedelta(days=17), + "endDate": -timedelta(days=1), + }, + "auctionPeriod": {"startDate": -timedelta(days=1), "endDate": timedelta()}, + "awardPeriod": {"startDate": timedelta(), "endDate": timedelta()}, + } + }, + "complete": { + "start": { + "enquiryPeriod": { + "startDate": -timedelta(days=25), + "endDate": -timedelta(days=11), + }, + "tenderPeriod": { + "startDate": -timedelta(days=25), + "endDate": -timedelta(days=8), + }, + "auctionPeriod": { + "startDate": -timedelta(days=8), + "endDate": -timedelta(days=7), + }, + "awardPeriod": { + "startDate": -timedelta(days=7), + "endDate": -timedelta(days=7), + }, + } + } +} diff --git a/src/openprocurement/tender/openuadefense/tests/post.py b/src/openprocurement/tender/openuadefense/tests/post.py index 212bada8b7..92e00ec580 100644 --- a/src/openprocurement/tender/openuadefense/tests/post.py +++ b/src/openprocurement/tender/openuadefense/tests/post.py @@ -6,7 +6,6 @@ test_cancellation, ) from openprocurement.tender.core.tests.base import change_auth -from openprocurement.tender.openua.tests.base import test_bids from openprocurement.tender.openua.tests.post import ( ComplaintPostResourceMixin, TenderComplaintPostResourceMixin, @@ -14,7 +13,7 @@ TenderCancellationComplaintPostResourceMixin, date_after_2020_04_19, ) -from openprocurement.tender.openuadefense.tests.base import BaseTenderUAContentWebTest +from openprocurement.tender.openuadefense.tests.base import BaseTenderUAContentWebTest, test_bids class TenderComplaintPostResourceTest( diff --git a/src/openprocurement/tender/openuadefense/tests/tender.py b/src/openprocurement/tender/openuadefense/tests/tender.py index dff18ba38b..0b70947c9c 100644 --- a/src/openprocurement/tender/openuadefense/tests/tender.py +++ b/src/openprocurement/tender/openuadefense/tests/tender.py @@ -12,6 +12,8 @@ create_tender_with_inn_before, tender_milestones_required, patch_tender_lots_none, + tender_minimalstep_validation, + patch_tender_minimalstep_validation, ) from openprocurement.tender.openua.tests.tender import TenderUaProcessTestMixin @@ -23,7 +25,12 @@ tender_finance_milestones, ) -from openprocurement.tender.openuadefense.tests.base import BaseTenderUAWebTest, test_tender_data, BaseApiWebTest +from openprocurement.tender.openuadefense.tests.base import ( + BaseTenderUAWebTest, + test_tender_data, + test_bids, + BaseApiWebTest, +) from openprocurement.tender.openuadefense.tests.tender_blanks import ( # TenderUATest simple_add_tender, @@ -58,10 +65,13 @@ class TenderUAResourceTest(BaseTenderUAWebTest, TenderResourceTestMixin): test_create_tender_with_inn_before = snitch(create_tender_with_inn_before) test_tender_milestones_required = snitch(tender_milestones_required) test_patch_tender_lots_none = snitch(patch_tender_lots_none) + test_tender_minimalstep_validation = snitch(tender_minimalstep_validation) + test_patch_tender_minimalstep_validation = snitch(patch_tender_minimalstep_validation) class TenderUAProcessTest(BaseTenderUAWebTest, TenderUaProcessTestMixin): initial_data = test_tender_data + test_bids_data = test_bids test_invalid_tender_conditions = snitch(invalid_tender_conditions) test_one_valid_bid_tender_ua = snitch(one_valid_bid_tender_ua) diff --git a/src/openprocurement/tender/openuadefense/tests/tender_blanks.py b/src/openprocurement/tender/openuadefense/tests/tender_blanks.py index 3864a00ec6..ae1f4224f9 100644 --- a/src/openprocurement/tender/openuadefense/tests/tender_blanks.py +++ b/src/openprocurement/tender/openuadefense/tests/tender_blanks.py @@ -4,8 +4,8 @@ from iso8601 import parse_date from openprocurement.tender.belowthreshold.tests.base import test_organization -from openprocurement.api.constants import NOT_REQUIRED_ADDITIONAL_CLASSIFICATION_FROM -from openprocurement.tender.core.models import get_now, CPV_ITEMS_CLASS_FROM +from openprocurement.api.constants import NOT_REQUIRED_ADDITIONAL_CLASSIFICATION_FROM, CPV_ITEMS_CLASS_FROM +from openprocurement.tender.core.models import get_now from openprocurement.tender.openuadefense.models import Tender @@ -472,7 +472,7 @@ def patch_tender(self): { "location": "body", "name": "tenderPeriod", - "description": ["tenderPeriod should be greater than 6 working days"], + "description": ["tenderPeriod must be at least 6 full business days long"], } ], ) @@ -631,21 +631,21 @@ def patch_tender_ua(self): self.assertEqual(response.status, "403 Forbidden") self.assertEqual(response.content_type, "application/json") self.assertEqual(response.json["errors"][0]["description"], "tenderPeriod should be extended by 2 working days") - tenderPeriod_endDate = get_now() + timedelta(days=7, seconds=10) - # enquiryPeriod_endDate = tenderPeriod_endDate - timedelta(days=2) + tender_period_end_date = calculate_tender_business_date( + get_now(), timedelta(days=7), tender + ) + timedelta(seconds=10) response = self.app.patch_json( "/tenders/{}?acc_token={}".format(tender["id"], owner_token), { "data": { "value": {"amount": 501, "currency": u"UAH"}, - "tenderPeriod": {"endDate": tenderPeriod_endDate.isoformat()}, + "tenderPeriod": {"endDate": tender_period_end_date.isoformat()}, } }, ) self.assertEqual(response.status, "200 OK") self.assertEqual(response.content_type, "application/json") - self.assertEqual(response.json["data"]["tenderPeriod"]["endDate"], tenderPeriod_endDate.isoformat()) - # self.assertEqual(response.json['data']['enquiryPeriod']['endDate'], enquiryPeriod_endDate.isoformat()) + self.assertEqual(response.json["data"]["tenderPeriod"]["endDate"], tender_period_end_date.isoformat()) # TenderUAProcessTest diff --git a/src/openprocurement/tender/openuadefense/utils.py b/src/openprocurement/tender/openuadefense/utils.py index 904297ed86..124b2a0faa 100644 --- a/src/openprocurement/tender/openuadefense/utils.py +++ b/src/openprocurement/tender/openuadefense/utils.py @@ -1,11 +1,6 @@ from logging import getLogger from openprocurement.api.constants import TZ -from openprocurement.tender.openua.utils import check_complaint_status, add_next_award, check_cancellation_status -from openprocurement.tender.belowthreshold.utils import check_tender_status, add_contract from openprocurement.tender.core.utils import ( - calculate_tender_business_date as calculate_tender_business_date_base, - calculate_clarifications_business_date as calculate_clarifications_business_date_base, - calculate_complaint_business_date as calculate_complaint_business_date_base, check_complaint_statuses_at_complaint_period_end, context_unpack, get_now, @@ -13,6 +8,13 @@ has_unanswered_complaints, block_tender, ) +from openprocurement.tender.openua.utils import check_complaint_status, add_next_award, check_cancellation_status +from openprocurement.tender.belowthreshold.utils import check_tender_status, add_contract +from openprocurement.tender.core.utils import ( + calculate_tender_business_date as calculate_tender_business_date_base, + calculate_clarif_business_date as calculate_clarif_business_date_base, + calculate_complaint_business_date as calculate_complaint_business_date_base +) LOGGER = getLogger("openprocurement.tender.openuadefense") @@ -41,8 +43,8 @@ def calculate_complaint_business_date(date_obj, timedelta_obj, tender=None, work date_obj, timedelta_obj, tender=tender, working_days=working_days, calendar=WORKING_DAYS ) -def calculate_clarifications_business_date(date_obj, timedelta_obj, tender=None, working_days=False): - return calculate_clarifications_business_date_base( +def calculate_clarif_business_date(date_obj, timedelta_obj, tender=None, working_days=False): + return calculate_clarif_business_date_base( date_obj, timedelta_obj, tender=tender, working_days=working_days, calendar=WORKING_DAYS ) diff --git a/src/openprocurement/tender/openuadefense/validation.py b/src/openprocurement/tender/openuadefense/validation.py index 30892dbe32..f90baafe23 100644 --- a/src/openprocurement/tender/openuadefense/validation.py +++ b/src/openprocurement/tender/openuadefense/validation.py @@ -1,6 +1,12 @@ # -*- coding: utf-8 -*- from openprocurement.api.utils import get_now, raise_operation_error -from openprocurement.tender.openuadefense.utils import calculate_tender_business_date +from openprocurement.tender.openua.validation import ( + validate_tender_period_duration as validate_tender_period_duration_base, +) +from openprocurement.tender.openua.validation import ( + validate_complaint_post_review_date as validate_complaint_post_review_date_base +) +from openprocurement.tender.openuadefense.utils import calculate_tender_business_date, WORKING_DAYS def validate_tender_period_extension_with_working_days(request): @@ -17,7 +23,11 @@ def validate_submit_claim_time(request): claim_end_date = calculate_tender_business_date(tender.tenderPeriod.endDate, -claim_submit_time, tender, True) if get_now() > claim_end_date: raise_operation_error( - request, "Can submit claim not later than {0.days} days before tenderPeriod end".format(claim_submit_time) + request, + "Can submit claim not later than {duration.days} " + "full business days before tenderPeriod ends".format( + duration=claim_submit_time + ) ) @@ -25,3 +35,17 @@ def validate_update_tender(request): status = request.validated["tender_status"] if status == "active.tendering": validate_tender_period_extension_with_working_days(request) + + +def validate_complaint_post_review_date(request, calendar=WORKING_DAYS): + validate_complaint_post_review_date_base(request, calendar=calendar) + + +def validate_tender_period_duration(data, period, duration, working_days=False, calendar=WORKING_DAYS): + validate_tender_period_duration_base( + data=data, + period=period, + duration=duration, + working_days=working_days, + calendar=calendar + ) diff --git a/src/openprocurement/tender/openuadefense/views/award.py b/src/openprocurement/tender/openuadefense/views/award.py index 34adc44796..848655c5d8 100644 --- a/src/openprocurement/tender/openuadefense/views/award.py +++ b/src/openprocurement/tender/openuadefense/views/award.py @@ -122,7 +122,7 @@ def patch(self): for i in tender.awards: if i.lotID != award.lotID: continue - if not i.complaintPeriod.endDate or i.complaintPeriod.endDate > now: + if i.complaintPeriod and (not i.complaintPeriod.endDate or i.complaintPeriod.endDate > now): i.complaintPeriod.endDate = now i.status = "cancelled" cancelled_awards.append(i.id) @@ -156,7 +156,7 @@ def patch(self): for i in tender.awards: if i.lotID != award.lotID: continue - if not i.complaintPeriod.endDate or i.complaintPeriod.endDate > now: + if i.complaintPeriod and (not i.complaintPeriod.endDate or i.complaintPeriod.endDate > now): i.complaintPeriod.endDate = now i.status = "cancelled" cancelled_awards.append(i.id) diff --git a/src/openprocurement/tender/openuadefense/views/award_complaint_post.py b/src/openprocurement/tender/openuadefense/views/award_complaint_post.py index 06e90a0af5..fcd900760a 100644 --- a/src/openprocurement/tender/openuadefense/views/award_complaint_post.py +++ b/src/openprocurement/tender/openuadefense/views/award_complaint_post.py @@ -1,8 +1,15 @@ # -*- coding: utf-8 -*- +from openprocurement.api.utils import json_view from openprocurement.tender.core.utils import optendersresource +from openprocurement.tender.openua.validation import ( + validate_award_complaint_post_data, + validate_complaint_post, + validate_complaint_post_complaint_status, +) from openprocurement.tender.openua.views.award_complaint_post import ( TenderAwardComplaintPostResource as BaseTenderAwardComplaintPostResource ) +from openprocurement.tender.openuadefense.validation import validate_complaint_post_review_date @optendersresource( @@ -13,4 +20,15 @@ description="Tender award complaint posts", ) class TenderAwardComplaintPostResource(BaseTenderAwardComplaintPostResource): - pass + @json_view( + content_type="application/json", + validators=( + validate_award_complaint_post_data, + validate_complaint_post, + validate_complaint_post_complaint_status, + validate_complaint_post_review_date, + ), + permission="edit_complaint", + ) + def collection_post(self): + return super(TenderAwardComplaintPostResource, self).collection_post() diff --git a/src/openprocurement/tender/openuadefense/views/bid.py b/src/openprocurement/tender/openuadefense/views/bid.py index a4244b2d1d..ce3d31d567 100644 --- a/src/openprocurement/tender/openuadefense/views/bid.py +++ b/src/openprocurement/tender/openuadefense/views/bid.py @@ -1,6 +1,14 @@ # -*- coding: utf-8 -*- from openprocurement.tender.core.utils import optendersresource from openprocurement.tender.openua.views.bid import TenderUABidResource as TenderBidResource +from openprocurement.tender.core.validation import ( + validate_patch_bid_data, + validate_update_deleted_bid, + validate_bid_operation_period, + validate_bid_operation_not_in_tendering, +) +from openprocurement.api.utils import json_view +from openprocurement.tender.openua.validation import validate_update_bid_to_draft, validate_update_bid_to_active_status @optendersresource( @@ -11,4 +19,17 @@ description="Tender UA.defense bids", ) class TenderUABidResource(TenderBidResource): - """ """ + @json_view( + content_type="application/json", + permission="edit_bid", + validators=( + validate_patch_bid_data, + validate_bid_operation_not_in_tendering, + validate_bid_operation_period, + validate_update_deleted_bid, + validate_update_bid_to_draft, + validate_update_bid_to_active_status, + ), + ) + def patch(self): + return super(TenderUABidResource, self).patch() diff --git a/src/openprocurement/tender/openuadefense/views/cancellation_complaint.py b/src/openprocurement/tender/openuadefense/views/cancellation_complaint.py index 7c1a6c545f..662efda943 100644 --- a/src/openprocurement/tender/openuadefense/views/cancellation_complaint.py +++ b/src/openprocurement/tender/openuadefense/views/cancellation_complaint.py @@ -3,7 +3,8 @@ from datetime import timedelta from openprocurement.tender.core.views.cancellation_complaint import TenderCancellationComplaintResource -from openprocurement.tender.core.utils import optendersresource, calculate_tender_business_date, calculate_date_diff +from openprocurement.tender.core.utils import optendersresource, calculate_date_diff +from openprocurement.tender.openuadefense.utils import calculate_tender_business_date @optendersresource( diff --git a/src/openprocurement/tender/openuadefense/views/tender.py b/src/openprocurement/tender/openuadefense/views/tender.py index f39e295b42..cbdcd7562d 100644 --- a/src/openprocurement/tender/openuadefense/views/tender.py +++ b/src/openprocurement/tender/openuadefense/views/tender.py @@ -7,7 +7,8 @@ ) from openprocurement.tender.core.validation import ( validate_tender_not_in_terminated_status, - validate_tender_change_status_with_cancellation_lot_pending + validate_tender_change_status_with_cancellation_lot_pending, + validate_tender_activate_with_criteria, ) from openprocurement.tender.belowthreshold.views.tender import TenderResource from openprocurement.tender.openua.validation import validate_patch_tender_ua_data diff --git a/src/openprocurement/tender/pricequotation/__init__.py b/src/openprocurement/tender/pricequotation/__init__.py new file mode 100644 index 0000000000..8b13789179 --- /dev/null +++ b/src/openprocurement/tender/pricequotation/__init__.py @@ -0,0 +1 @@ + diff --git a/src/openprocurement/tender/pricequotation/adapters.py b/src/openprocurement/tender/pricequotation/adapters.py new file mode 100644 index 0000000000..3e2b8faf92 --- /dev/null +++ b/src/openprocurement/tender/pricequotation/adapters.py @@ -0,0 +1,10 @@ +# -*- coding: utf-8 -*- +from openprocurement.tender.core.adapters import TenderConfigurator +from openprocurement.tender.pricequotation.models import PriceQuotationTender + + +class PQTenderConfigurator(TenderConfigurator): + """ Price Quotation Tender configuration adapter """ + + name = "Price Quotation Tender configurator" + model = PriceQuotationTender diff --git a/src/openprocurement/tender/pricequotation/constants.py b/src/openprocurement/tender/pricequotation/constants.py new file mode 100644 index 0000000000..cdb7c76ea0 --- /dev/null +++ b/src/openprocurement/tender/pricequotation/constants.py @@ -0,0 +1,11 @@ +# -*- coding: utf-8 -*- +import re +from datetime import timedelta + + +PMT = "priceQuotation" +TENDERING_DAYS = 2 +TENDERING_DURATION = timedelta(days=TENDERING_DAYS) +QUALIFICATION_DURATION = timedelta(days=2) +PROFILE_PATTERN = re.compile(r"^\d{6}-\d{8}-\d{6}-\d{8}") +PQ_KINDS = ["general", "special", "defense", "other", "social", "authority"] diff --git a/src/openprocurement/tender/pricequotation/includeme.py b/src/openprocurement/tender/pricequotation/includeme.py new file mode 100644 index 0000000000..ee5cee9ea5 --- /dev/null +++ b/src/openprocurement/tender/pricequotation/includeme.py @@ -0,0 +1,28 @@ +# -*- coding: utf-8 -*- +import os +import openprocurement.tender.pricequotation + +from logging import getLogger +from pyramid.interfaces import IRequest +from openprocurement.api.interfaces import IContentConfigurator +from openprocurement.tender.pricequotation.interfaces import\ + IPriceQuotationTender +from openprocurement.tender.pricequotation.models.tender import\ + PriceQuotationTender +from openprocurement.tender.pricequotation.adapters import\ + PQTenderConfigurator + + +LOGGER = getLogger("openprocurement.tender.pricequotation") + + +def includeme(config): + LOGGER.info("Init tender.pricequotation plugin.") + config.add_tender_procurementMethodType(PriceQuotationTender) + config.scan("openprocurement.tender.pricequotation.views") + config.scan("openprocurement.tender.pricequotation.subscribers") + config.registry.registerAdapter( + PQTenderConfigurator, + (IPriceQuotationTender, IRequest), + IContentConfigurator + ) diff --git a/src/openprocurement/tender/pricequotation/interfaces.py b/src/openprocurement/tender/pricequotation/interfaces.py new file mode 100644 index 0000000000..1f03bdf39b --- /dev/null +++ b/src/openprocurement/tender/pricequotation/interfaces.py @@ -0,0 +1,5 @@ +from openprocurement.tender.core.models import ITender + + +class IPriceQuotationTender(ITender): + """ PriceQuotation Tender marker interface """ diff --git a/src/openprocurement/tender/pricequotation/models/__init__.py b/src/openprocurement/tender/pricequotation/models/__init__.py new file mode 100644 index 0000000000..6340024740 --- /dev/null +++ b/src/openprocurement/tender/pricequotation/models/__init__.py @@ -0,0 +1,5 @@ +from openprocurement.tender.pricequotation.models.cancellation import Cancellation +from openprocurement.tender.pricequotation.models.award import Award +from openprocurement.tender.pricequotation.models.document import Document +from openprocurement.tender.pricequotation.models.bid import Bid +from openprocurement.tender.pricequotation.models.tender import PriceQuotationTender diff --git a/src/openprocurement/tender/pricequotation/models/award.py b/src/openprocurement/tender/pricequotation/models/award.py new file mode 100644 index 0000000000..06e32789e8 --- /dev/null +++ b/src/openprocurement/tender/pricequotation/models/award.py @@ -0,0 +1,47 @@ +from schematics.transforms import whitelist, blacklist +from schematics.types import MD5Type +from openprocurement.api.models import\ + schematics_default_role, schematics_embedded_role +from openprocurement.tender.core.models import BaseAward +from openprocurement.tender.pricequotation.utils import get_bid_owned_award_acl + + +class Award(BaseAward): + """ An award for the given procurement. There may be more than one award + per contracting process e.g. because the contract is split amongst + different providers, or because it is a standing offer. + """ + + class Options: + roles = { + "create": blacklist("id", "status", "date", "documents"), + "edit": whitelist( + "status", "title", "title_en", "title_ru", + "description", "description_en", "description_ru" + ), + "edit_tender_owner": whitelist( + "status", "title", "title_en", "title_ru", + "description", "description_en", "description_ru" + ), + "edit_bid_owner": whitelist( + "status", "title", "title_en", "title_ru", + "description", "description_en", "description_ru" + ), + "embedded": schematics_embedded_role, + "view": schematics_default_role, + "Administrator": whitelist(), + } + + bid_id = MD5Type(required=True) + + def __acl__(self): + return get_bid_owned_award_acl(self) + + def get_role(self): + root = self.get_root() + request = root.request + if request.authenticated_role in ("tender_owner", "bid_owner"): + role = "edit_{}".format(request.authenticated_role) + else: + role = request.authenticated_role + return role diff --git a/src/openprocurement/tender/pricequotation/models/bid.py b/src/openprocurement/tender/pricequotation/models/bid.py new file mode 100644 index 0000000000..5c85246025 --- /dev/null +++ b/src/openprocurement/tender/pricequotation/models/bid.py @@ -0,0 +1,112 @@ +from uuid import uuid4 + +from pyramid.security import Allow +from schematics.types import MD5Type, StringType +from schematics.types.compound import ModelType +from schematics.transforms import whitelist + +from openprocurement.api.utils import get_now +from openprocurement.api.models import BusinessOrganization +from openprocurement.api.models import ( + ListType, Value, IsoDateTimeType + ) +from openprocurement.tender.core.models import Model +from openprocurement.tender.core.models import ( + Administrator_bid_role, + view_bid_role, +) +from openprocurement.tender.pricequotation.models.document import\ + Document +from openprocurement.tender.pricequotation.validation import\ + validate_bid_value, validate_requirement_responses + + +class RequirementReference(Model): + id = StringType(required=True) + title = StringType() + + +class RequirementResponse(Model): + id = MD5Type(required=True, default=lambda: uuid4().hex) + requirement = ModelType(RequirementReference, required=True) + value = StringType(required=True) + + +class Bid(Model): + class Options: + roles = { + "Administrator": Administrator_bid_role, + "embedded": view_bid_role, + "view": view_bid_role, + "create": whitelist( + "value", + "status", + "tenderers", + "parameters", + "documents", + "requirementResponses" + ), + "edit": whitelist("value", "status", "tenderers"), + "active.tendering": whitelist(), + "active.qualification": view_bid_role, + "active.awarded": view_bid_role, + "complete": view_bid_role, + "unsuccessful": view_bid_role, + "cancelled": view_bid_role, + } + + def __local_roles__(self): + return dict([("{}_{}".format(self.owner, self.owner_token), + "bid_owner")]) + + tenderers = ListType( + ModelType(BusinessOrganization, required=True), + required=True, + min_size=1, + max_size=1 + ) + date = IsoDateTimeType(default=get_now) + id = MD5Type(required=True, default=lambda: uuid4().hex) + status = StringType(choices=["active", "draft"], default="active") + value = ModelType(Value) + documents = ListType(ModelType(Document, required=True), default=list()) + owner_token = StringType() + transfer_token = StringType() + owner = StringType() + requirementResponses = ListType( + ModelType(RequirementResponse), + required=True, + min_size=1, + ) + + def import_data(self, raw_data, **kw): + """ + Converts and imports the raw data into the instance of the model + according to the fields in the model. + + :param raw_data: + The data to be imported. + """ + data = self.convert(raw_data, **kw) + del_keys = [k for k in data.keys() if k != "value" and data[k] is None] + for k in del_keys: + del data[k] + + self._data.update(data) + return self + + def __acl__(self): + return [ + (Allow, "{}_{}".format(self.owner, self.owner_token), "edit_bid") + ] + + def validate_value(self, data, value): + parent = data["__parent__"] + if isinstance(parent, Model): + validate_bid_value(parent, value) + + def validate_requirementResponses(self, data, value): + criterion = data["__parent__"]['criteria'] + validate_requirement_responses( + criterion, value + ) diff --git a/src/openprocurement/tender/pricequotation/models/cancellation.py b/src/openprocurement/tender/pricequotation/models/cancellation.py new file mode 100644 index 0000000000..b4616d0f86 --- /dev/null +++ b/src/openprocurement/tender/pricequotation/models/cancellation.py @@ -0,0 +1,45 @@ +from uuid import uuid4 +from schematics.types import MD5Type, StringType +from schematics.transforms import whitelist +from schematics.types.compound import ModelType + +from openprocurement.api.utils import get_now +from openprocurement.api.models import IsoDateTimeType, ListType +from openprocurement.tender.core.models import Model +from openprocurement.api.models import\ + schematics_default_role, schematics_embedded_role +from openprocurement.tender.pricequotation.models.document import\ + Document + + +class Cancellation(Model): + class Options: + roles = { + "create": whitelist( + "reason", + "reasonType", + "cancellationOf", + ), + "edit": whitelist("status", "reasonType"), + "embedded": schematics_embedded_role, + "view": schematics_default_role, + } + + id = MD5Type(required=True, default=lambda: uuid4().hex) + reason = StringType(required=True) + reason_en = StringType() + reason_ru = StringType() + date = IsoDateTimeType(default=get_now) + status = StringType( + choices=["draft", "unsuccessful", "active"], + default='draft' + ) + documents = ListType(ModelType(Document, required=True), default=list()) + cancellationOf = StringType( + required=True, + choices=["tender"], + default="tender" + ) + reasonType = StringType( + choices=["noDemand", "unFixable", "forceMajeure", "expensesCut"], + ) diff --git a/src/openprocurement/tender/pricequotation/models/criterion.py b/src/openprocurement/tender/pricequotation/models/criterion.py new file mode 100644 index 0000000000..8b082cd66c --- /dev/null +++ b/src/openprocurement/tender/pricequotation/models/criterion.py @@ -0,0 +1,21 @@ +from schematics.types import StringType +from schematics.types.compound import ModelType + +from openprocurement.api.models import ListType, Model +from openprocurement.tender.pricequotation.models.requirement import Requirement +from openprocurement.tender.core.validation import validate_requirement_groups + + +class RequirementGroup(Model): + id = StringType(required=True) + description = StringType(required=True) + requirements = ListType(ModelType(Requirement, required=True), default=list()) + + +class Criterion(Model): + id = StringType(required=True) + title = StringType(required=True) + description = StringType(required=True) + requirementGroups = ListType(ModelType(RequirementGroup), + required=True, + validators=[validate_requirement_groups]) diff --git a/src/openprocurement/tender/pricequotation/models/document.py b/src/openprocurement/tender/pricequotation/models/document.py new file mode 100644 index 0000000000..3c8a644dfe --- /dev/null +++ b/src/openprocurement/tender/pricequotation/models/document.py @@ -0,0 +1,21 @@ +from schematics.types import StringType +from schematics.exceptions import ValidationError +from openprocurement.tender.core.models import BaseDocument, Model, get_tender + + +class Document(BaseDocument): + documentOf = StringType( + required=True, + choices=["tender", "item"], + default="tender" + ) + + def validate_relatedItem(self, data, relatedItem): + if not relatedItem and data.get("documentOf") in ["item"]: + raise ValidationError(u"This field is required.") + parent = data["__parent__"] + if relatedItem and isinstance(parent, Model): + tender = get_tender(parent) + items = [i.id for i in tender.items if i] + if data.get("documentOf") == "item" and relatedItem not in items: + raise ValidationError(u"relatedItem should be one of items") diff --git a/src/openprocurement/tender/pricequotation/models/requirement.py b/src/openprocurement/tender/pricequotation/models/requirement.py new file mode 100644 index 0000000000..caca91a029 --- /dev/null +++ b/src/openprocurement/tender/pricequotation/models/requirement.py @@ -0,0 +1,32 @@ +from schematics.types import BaseType, BooleanType, FloatType, IntType, StringType, BaseType +from schematics.types.compound import ModelType +from schematics.exceptions import ValidationError + +from openprocurement.api.models import DecimalType, IsoDateTimeType, ListType, Model +from openprocurement.api.models import Unit as BaseUnit +from openprocurement.tender.core.validation import validate_value_type + + +class Unit(BaseUnit): + name = StringType(required=True) + + +class Requirement(Model): + id = StringType(required=True) + title = StringType(required=True) + description = StringType() + dataType = StringType(required=True, + choices=["string", "number", "integer", "boolean"]) + unit = ModelType(Unit) + minValue = StringType() + maxValue = StringType() + expectedValue = StringType() + + def validate_minValue(self, data, value): + validate_value_type(value, data['dataType']) + + def validate_maxValue(self, data, value): + validate_value_type(value, data['dataType']) + + def validate_expectedValue(self, data, value): + validate_value_type(value, data['dataType']) diff --git a/src/openprocurement/tender/pricequotation/models/tender.py b/src/openprocurement/tender/pricequotation/models/tender.py new file mode 100644 index 0000000000..1c80afaeef --- /dev/null +++ b/src/openprocurement/tender/pricequotation/models/tender.py @@ -0,0 +1,359 @@ +# -*- coding: utf-8 -*- +from schematics.exceptions import ValidationError +from schematics.transforms import whitelist +from schematics.types import IntType, StringType +from schematics.types.compound import ModelType +from schematics.types.serializable import serializable +from pyramid.security import Allow +from zope.interface import implementer +from openprocurement.api.constants import TZ +from openprocurement.api.models import ( + BusinessOrganization, + CPVClassification, + Guarantee, + IsoDateTimeType, +) +from openprocurement.api.models import Item as BaseItem +from openprocurement.api.models import ListType, Period, Value +from openprocurement.api.utils import get_now +from openprocurement.api.validation import ( + validate_classification_id, + validate_cpv_group, + validate_items_uniq, +) +from openprocurement.tender.core.utils import calculate_tender_business_date +from openprocurement.tender.core.models import ( + Contract as BaseContract, + PeriodEndRequired, + ProcuringEntity, + Tender, + Model, +) +from openprocurement.tender.openua.validation import validate_tender_period_duration +from openprocurement.tender.pricequotation.constants import ( + PMT, + QUALIFICATION_DURATION, + PQ_KINDS, + PROFILE_PATTERN, + TENDERING_DURATION, +) +from openprocurement.tender.pricequotation.interfaces import IPriceQuotationTender + +from openprocurement.tender.pricequotation.models import ( + Cancellation, + Bid, + Document, + Award, +) +from openprocurement.tender.pricequotation.models.criterion import Criterion + + +class ShortlistedFirm(BusinessOrganization): + id = StringType() + status = StringType() + + +class Item(BaseItem): + class Options: + roles = { + 'create': whitelist( + 'id', + 'description', + 'description_en', + 'description_ru', + 'quantity', + 'deliveryDate', + 'deliveryAddress', + 'deliveryLocation' + ), + 'edit': whitelist( + 'description', + 'description_en', + 'description_ru', + 'quantity', + 'deliveryDate', + 'deliveryAddress', + 'deliveryLocation', + ), + 'bots': whitelist( + 'classification', + 'additionalClassifications', + 'unit' + ), + "edit_contract": whitelist("unit") + } + + """A good, service, or work to be contracted.""" + classification = ModelType(CPVClassification) + + +class Contract(BaseContract): + documents = ListType(ModelType(Document, required=True), default=list()) + + def validate_dateSigned(self, data, value): + parent = data["__parent__"] + if value and isinstance(parent, Model): + if value > get_now(): + raise ValidationError(u"Contract signature date can't be in the future") + + + +@implementer(IPriceQuotationTender) +class PriceQuotationTender(Tender): + """ + Data regarding tender process - publicly inviting prospective contractors + to submit bids for evaluation and selecting a winner or winners. + """ + + class Options: + namespace = "Tender" + _core_roles = Tender.Options.roles + # without _serializable_fields they won't be calculated + # (even though serialized_name is in the role) + _serializable_fields = whitelist( + "tender_guarantee", + "tender_value", + "tender_minimalStep" + ) + _edit_fields = _serializable_fields + whitelist( + "next_check", + "numberOfBidders", + "items", + "tenderPeriod", + "procuringEntity", + "guarantee", + "minimalStep", + ) + _edit_role = _core_roles["edit"] \ + + _edit_fields + whitelist( + "contracts", + "numberOfBids", + "status", + "value", + "profile" + ) + _create_role = _core_roles["create"] \ + + _core_roles["edit"] \ + + _edit_fields \ + + whitelist("contracts", + "numberOfBids", + "value", + "profile") + _edit_pq_bot_role = whitelist( + "items", "shortlistedFirms", + "status", "criteria", "value", "unsuccessfulReason" + ) + _view_tendering_role = ( + _core_roles["view"] + + _edit_fields + + whitelist( + "awards", + 'value', + "awardPeriod", + "cancellations", + "contracts", + "profile", + "shortlistedFirms", + "criteria", + "noticePublicationDate", + "unsuccessfulReason" + ) + ) + _view_role = _view_tendering_role + whitelist("bids", "numberOfBids") + _all_forbidden = whitelist() + roles = { + "create": _create_role, + "edit": _edit_role, + "edit_draft": _edit_role, + "edit_draft.unsuccessful": _edit_role, + "edit_draft.publishing": _edit_pq_bot_role, + "edit_active.tendering": _all_forbidden, + "edit_active.qualification": _all_forbidden, + "edit_active.awarded": _all_forbidden, + "edit_complete": _all_forbidden, + "edit_unsuccessful": _all_forbidden, + "edit_cancelled": _all_forbidden, + "draft": _view_tendering_role, + "draft.unsuccessful": _view_tendering_role, + "draft.publishing": _view_tendering_role, + "active.tendering": _view_tendering_role, + "view": _view_role, + "active.qualification": _view_role, + "active.awarded": _view_role, + "complete": _view_role, + "unsuccessful": _view_role, + "cancelled": _view_role, + "chronograph": _core_roles["chronograph"], + "chronograph_view": _core_roles["chronograph_view"], + "Administrator": _core_roles["Administrator"], + "plain": _core_roles["plain"], + "listing": _core_roles["listing"], + "contracting": _core_roles["contracting"], + "default": _core_roles["default"], + "bots": _edit_pq_bot_role, + } + + status = StringType(choices=["draft", + "draft.publishing", + "draft.unsuccessful", + "active.tendering", + "active.qualification", + "active.awarded", + "complete", + "cancelled", + "unsuccessful"], + default="draft") + + # The goods and services to be purchased, + # broken into line items wherever possible. + # Items should not be duplicated, but a quantity of 2 specified instead. + items = ListType( + ModelType(Item, required=True), + required=True, + min_size=1, + validators=[validate_items_uniq], + ) + # The total estimated value of the procurement. + value = ModelType(Value, required=True) + # The period when the tender is open for submissions. + # The end date is the closing date for tender submissions. + tenderPeriod = ModelType( + PeriodEndRequired, required=True + ) + # The date or period on which an award is anticipated to be made. + awardPeriod = ModelType(Period) + # The number of unique tenderers who participated in the tender + numberOfBidders = IntType() + # A list of all the companies who entered submissions for the tender. + bids = ListType( + ModelType(Bid, required=True), default=list() + ) + # The entity managing the procurement, + # which may be different from the buyer + # who is paying / using the items being procured. + procuringEntity = ModelType(ProcuringEntity, required=True) + awards = ListType(ModelType(Award, required=True), default=list()) + contracts = ListType(ModelType(Contract, required=True), default=list()) + cancellations = ListType( + ModelType(Cancellation, required=True), + default=list() + ) + documents = ListType( + ModelType(Document, required=True), default=list() + ) # All documents and attachments related to the tender. + guarantee = ModelType(Guarantee) + procurementMethod = StringType( + choices=["selective"], default="selective" + ) + procurementMethodType = StringType(default=PMT) + profile = StringType(required=True) + shortlistedFirms = ListType(ModelType(ShortlistedFirm), default=list()) + criteria = ListType(ModelType(Criterion), default=list()) + noticePublicationDate = IsoDateTimeType() + unsuccessfulReason = ListType(StringType) + + procuring_entity_kinds = PQ_KINDS + + def validate_buyers(self, data, value): + pass + + def validate_milestones(self, data, value): + # a hack to avoid duplicating all bese model fields + if value: + raise ValidationError("Milestones are not applicable to pricequotation") + + def get_role(self): + root = self.__parent__ + request = root.request + if request.authenticated_role in\ + ("Administrator", "chronograph", "contracting", "bots"): + role = request.authenticated_role + else: + role = "edit_{}".format(request.context.status) + return role + + @serializable(serialize_when_none=False) + def next_check(self): + checks = [] + if self.status == "active.tendering" and self.tenderPeriod.endDate: + checks.append(self.tenderPeriod.endDate.astimezone(TZ)) + + if self.status.startswith("active"): + for award in self.awards: + if award.status == 'pending': + checks.append( + calculate_tender_business_date(award.date, QUALIFICATION_DURATION, self) + ) + if award.status == "active" and not\ + any([i.awardID == award.id for i in self.contracts]): + checks.append(award.date) + return min(checks).isoformat() if checks else None + + @serializable + def numberOfBids(self): + """A property that is serialized by schematics exports.""" + return len(self.bids) + + def validate_items(self, data, items): + if data["status"] in ("draft", "draft.publishing", "draft.unsuccessful"): + return + if not all((i.classification for i in items)): + return + cpv_336_group = items[0].classification.id[:3] == "336"\ + if items else False + if ( + not cpv_336_group + and items + and len(set([i.classification.id[:4] for i in items])) != 1 + ): + raise ValidationError(u"CPV class of items should be identical") + else: + validate_cpv_group(items) + validate_classification_id(items) + + def validate_awardPeriod(self, data, period): + if ( + period + and period.startDate + and data.get("tenderPeriod") + and data.get("tenderPeriod").endDate + and period.startDate < data.get("tenderPeriod").endDate + ): + raise ValidationError(u"period should begin after tenderPeriod") + + def validate_tenderPeriod(self, data, period): + if period and period.startDate and period.endDate: + validate_tender_period_duration(data, period, TENDERING_DURATION, working_days=True) + + + def validate_profile(self, data, profile): + result = PROFILE_PATTERN.findall(profile) + if len(result) != 1: + raise ValidationError(u"The profile value doesn't match id pattern") + + def __local_roles__(self): + roles = dict([("{}_{}".format(self.owner, self.owner_token), "tender_owner")]) + for i in self.bids: + roles["{}_{}".format(i.owner, i.owner_token)] = "bid_owner" + return roles + + def _acl_contract(self, acl): + acl.extend([ + (Allow, "{}_{}".format(self.owner, self.owner_token), "edit_contract"), + (Allow, "{}_{}".format(self.owner, self.owner_token), "upload_contract_documents"), + ]) + + def _acl_cancellation(self, acl): + acl.extend([ + (Allow, "{}_{}".format(self.owner, self.owner_token), "edit_cancellation"), + (Allow, "{}_{}".format(self.owner, self.owner_token), "edit_tender"), + (Allow, "{}_{}".format(self.owner, self.owner_token), "upload_tender_documents"), + ]) + + def __acl__(self): + acl = [ + (Allow, "g:bots", "upload_award_documents"), + ] + self._acl_cancellation(acl) + self._acl_contract(acl) + return acl diff --git a/src/openprocurement/tender/pricequotation/subscribers.py b/src/openprocurement/tender/pricequotation/subscribers.py new file mode 100644 index 0000000000..80aeceb85c --- /dev/null +++ b/src/openprocurement/tender/pricequotation/subscribers.py @@ -0,0 +1,17 @@ +# -*- coding: utf-8 -*- +from pyramid.events import subscriber +from openprocurement.tender.core.events import TenderInitializeEvent +from openprocurement.api.utils import get_now +from openprocurement.tender.pricequotation.constants import\ + PMT + + +@subscriber(TenderInitializeEvent, procurementMethodType=PMT) +def tender_init_handler(event): + """ Initialization handler for Price Quotation tenders """ + tender = event.tender + now = get_now() + + if not tender.tenderPeriod.startDate: + tender.tenderPeriod.startDate = now + tender.date = now diff --git a/src/openprocurement/tender/pricequotation/tests/__init__.py b/src/openprocurement/tender/pricequotation/tests/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/openprocurement/tender/pricequotation/tests/award.py b/src/openprocurement/tender/pricequotation/tests/award.py new file mode 100644 index 0000000000..0354e9d0a0 --- /dev/null +++ b/src/openprocurement/tender/pricequotation/tests/award.py @@ -0,0 +1,99 @@ +# -*- coding: utf-8 -*- +import unittest +from copy import deepcopy + +from openprocurement.api.tests.base import snitch +from openprocurement.tender.pricequotation.adapters import\ + PQTenderConfigurator as TenderBelowThersholdConfigurator +from openprocurement.tender.pricequotation.tests.base import ( + TenderContentWebTest, + test_bids, + test_organization, +) +from openprocurement.tender.pricequotation.tests.award_blanks import ( + check_tender_award, + create_tender_award_invalid, + check_tender_award_disqualification, + create_tender_award, + patch_tender_award, + tender_award_transitions, + check_tender_award_cancellation +) +from openprocurement.tender.belowthreshold.tests.award import ( + TenderAwardDocumentResourceTestMixin, + TenderAwardResourceTestMixin +) +from openprocurement.tender.belowthreshold.tests.award_blanks import ( + get_tender_award, + create_tender_award_with_scale_not_required, + create_tender_award_no_scale, + create_tender_award_no_scale_invalid, + patch_tender_award_Administrator_change, + create_tender_award_no_scale_invalid, +) + +class TenderAwardResourceTestMixin(object): + test_create_tender_award_invalid = snitch(create_tender_award_invalid) + test_create_tender_award_no_scale_invalid = snitch(create_tender_award_no_scale_invalid) + test_get_tender_award = snitch(get_tender_award) + + +class TenderAwardResourceTest(TenderContentWebTest, TenderAwardResourceTestMixin): + initial_status = "active.qualification" + initial_bids = test_bids + reverse = False + maxAwards = 1 + # init_awards = False + + test_create_tender_award = snitch(create_tender_award) + test_patch_tender_award = snitch(patch_tender_award) + test_tender_award_transitions = snitch(tender_award_transitions) + test_check_tender_award = snitch(check_tender_award) + test_check_tender_award_disqualification = snitch(check_tender_award_disqualification) + test_check_tender_award_cancellation = snitch(check_tender_award_cancellation) + + +class TenderAwardResourceScaleTest(TenderContentWebTest): + initial_status = "active.qualification" + initial_bids = test_bids + reverse = False + + test_create_tender_award_no_scale = snitch(create_tender_award_no_scale) + test_create_tender_award_no_scale_invalid = snitch( + create_tender_award_no_scale_invalid + ) + test_create_tender_award_with_scale_not_required = snitch( + create_tender_award_with_scale_not_required + ) + + +class TenderAwardDocumentResourceTest(TenderContentWebTest, TenderAwardDocumentResourceTestMixin): + initial_status = "active.qualification" + initial_bids = test_bids + + def setUp(self): + super(TenderAwardDocumentResourceTest, self).setUp() + response = self.app.get("/tenders/{}/awards".format(self.tender_id)) + self.awards_ids = [award["id"] for award in response.json["data"]] + + @property + def award_id(self): + data = self.db.get(self.tender_id) + return data['awards'][-1]['id'] if data.get('awards') else None + + +class TenderAwardDocumentWithDSResourceTest(TenderAwardDocumentResourceTest): + docservice = True + + +def suite(): + suite = unittest.TestSuite() + suite.addTest(unittest.makeSuite(TenderAwardDocumentResourceTest)) + suite.addTest(unittest.makeSuite(TenderAwardDocumentWithDSResourceTest)) + suite.addTest(unittest.makeSuite(TenderAwardResourceTest)) + suite.addTest(unittest.makeSuite(TenderAwardResourceScaleTest)) + return suite + + +if __name__ == "__main__": + unittest.main(defaultTest="suite") diff --git a/src/openprocurement/tender/pricequotation/tests/award_blanks.py b/src/openprocurement/tender/pricequotation/tests/award_blanks.py new file mode 100644 index 0000000000..9b8bf0b590 --- /dev/null +++ b/src/openprocurement/tender/pricequotation/tests/award_blanks.py @@ -0,0 +1,598 @@ +# -*- coding: utf-8 -*- +from datetime import timedelta +from webtest import AppError +import mock + +from openprocurement.api.utils import get_now +from openprocurement.tender.core.tests.base import change_auth +from openprocurement.tender.core.utils import calculate_tender_business_date +from openprocurement.tender.pricequotation.constants import QUALIFICATION_DURATION +from openprocurement.tender.pricequotation.tests.base import test_organization + + +def create_tender_award_invalid(self): + self.app.authorization = ("Basic", ("token", "")) + request_path = "/tenders/{}/awards?acc_token={}".format(self.tender_id, self.tender_token) + response = self.app.post(request_path, "data", status=415) + self.assertEqual(response.status, "415 Unsupported Media Type") + self.assertEqual(response.content_type, "application/json") + self.assertEqual(response.json["status"], "error") + self.assertEqual( + response.json["errors"], + [ + { + u"description": u"Content-Type header should be one of ['application/json']", + u"location": u"header", + u"name": u"Content-Type", + } + ], + ) + + response = self.app.post(request_path, "data", content_type="application/json", status=422) + self.assertEqual(response.status, "422 Unprocessable Entity") + self.assertEqual(response.content_type, "application/json") + self.assertEqual(response.json["status"], "error") + self.assertEqual( + response.json["errors"], + [{u"description": u"No JSON object could be decoded", u"location": u"body", u"name": u"data"}], + ) + + response = self.app.post_json(request_path, "data", status=422) + self.assertEqual(response.status, "422 Unprocessable Entity") + self.assertEqual(response.content_type, "application/json") + self.assertEqual(response.json["status"], "error") + self.assertEqual( + response.json["errors"], [{u"description": u"Data not available", u"location": u"body", u"name": u"data"}] + ) + + response = self.app.post_json(request_path, {"not_data": {}}, status=422) + self.assertEqual(response.status, "422 Unprocessable Entity") + self.assertEqual(response.content_type, "application/json") + self.assertEqual(response.json["status"], "error") + self.assertEqual( + response.json["errors"], [{u"description": u"Data not available", u"location": u"body", u"name": u"data"}] + ) + + response = self.app.post_json(request_path, {"data": {"invalid_field": "invalid_value"}}, status=422) + self.assertEqual(response.status, "422 Unprocessable Entity") + self.assertEqual(response.content_type, "application/json") + self.assertEqual(response.json["status"], "error") + self.assertEqual( + response.json["errors"], [{u"description": u"Rogue field", u"location": u"body", u"name": u"invalid_field"}] + ) + + response = self.app.post_json(request_path, {"data": {"suppliers": [{"identifier": "invalid_value"}]}}, status=422) + self.assertEqual(response.status, "422 Unprocessable Entity") + self.assertEqual(response.content_type, "application/json") + self.assertEqual(response.json["status"], "error") + self.assertEqual( + response.json["errors"], + [ + { + u"description": { + u"identifier": [u"Please use a mapping for this field or Identifier instance instead of unicode."] + }, + u"location": u"body", + u"name": u"suppliers", + } + ], + ) + + response = self.app.post_json(request_path, {"data": {"suppliers": [{"identifier": {"id": 0}}]}}, status=422) + self.assertEqual(response.status, "422 Unprocessable Entity") + self.assertEqual(response.content_type, "application/json") + self.assertEqual(response.json["status"], "error") + self.assertEqual( + response.json["errors"], + [ + { + u"description": [ + { + u"contactPoint": [u"This field is required."], + u"identifier": {u"scheme": [u"This field is required."]}, + u"name": [u"This field is required."], + u"address": [u"This field is required."], + } + ], + u"location": u"body", + u"name": u"suppliers", + }, + {u"description": [u"This field is required."], u"location": u"body", u"name": u"bid_id"}, + ], + ) + + response = self.app.post_json( + request_path, {"data": {"suppliers": [{"name": "name", "identifier": {"uri": "invalid_value"}}]}}, status=422 + ) + self.assertEqual(response.status, "422 Unprocessable Entity") + self.assertEqual(response.content_type, "application/json") + self.assertEqual(response.json["status"], "error") + self.assertEqual( + response.json["errors"], + [ + { + u"description": [ + { + u"contactPoint": [u"This field is required."], + u"identifier": { + u"scheme": [u"This field is required."], + u"id": [u"This field is required."], + u"uri": [u"Not a well formed URL."], + }, + u"address": [u"This field is required."], + } + ], + u"location": u"body", + u"name": u"suppliers", + }, + {u"description": [u"This field is required."], u"location": u"body", u"name": u"bid_id"}, + ], + ) + + response = self.app.post_json( + "/tenders/some_id/awards", + {"data": {"suppliers": [test_organization], "bid_id": self.initial_bids[0]["id"]}}, + status=404, + ) + self.assertEqual(response.status, "404 Not Found") + self.assertEqual(response.content_type, "application/json") + self.assertEqual(response.json["status"], "error") + self.assertEqual( + response.json["errors"], [{u"description": u"Not Found", u"location": u"url", u"name": u"tender_id"}] + ) + + response = self.app.get("/tenders/some_id/awards", status=404) + self.assertEqual(response.status, "404 Not Found") + self.assertEqual(response.content_type, "application/json") + self.assertEqual(response.json["status"], "error") + self.assertEqual( + response.json["errors"], [{u"description": u"Not Found", u"location": u"url", u"name": u"tender_id"}] + ) + + self.set_status("complete") + + response = self.app.post_json( + "/tenders/{}/awards".format(self.tender_id), + {"data": {"suppliers": [test_organization], "status": "pending", "bid_id": self.initial_bids[0]["id"]}}, + status=403, + ) + self.assertEqual(response.status, "403 Forbidden") + self.assertEqual(response.content_type, "application/json") + self.assertEqual( + response.json["errors"][0]["description"], "Can't create award in current (complete) tender status" + ) + + + +def create_tender_award(self): + with change_auth(self.app, ("Basic", ("token", ""))): + request_path = "/tenders/{}/awards".format(self.tender_id) + response = self.app.post_json( + request_path, + {"data": {"suppliers": [test_organization], "status": "pending", "bid_id": self.initial_bids[0]["id"]}}, + ) + self.assertEqual(response.status, "201 Created") + self.assertEqual(response.content_type, "application/json") + award = response.json["data"] + self.assertEqual(award["suppliers"][0]["name"], test_organization["name"]) + self.assertIn("id", award) + self.assertIn(award["id"], response.headers["Location"]) + + response = self.app.get(request_path) + self.assertEqual(response.status, "200 OK") + self.assertEqual(response.content_type, "application/json") + self.assertEqual(response.json["data"][-1], award) + + award_request_path = "/tenders/{}/awards/{}?acc_token={}".format(self.tender_id, award["id"], self.tender_token) + + response = self.app.patch_json(award_request_path, {"data": {"status": "active"}}, status=403) + self.assertEqual(response.status, "403 Forbidden") + self.assertEqual(response.content_type, "application/json") + self.assertEqual(response.json['status'], "error") + self.assertEqual( + response.json['errors'], + [{ + u'description': u"Can't change award status to active from pending", + u'location': u'body', + u'name': u'data' + }] + ) + + response = self.app.patch_json(award_request_path, {"data": {"status": "unsuccessful"}}) + self.assertEqual(response.status, "200 OK") + self.assertEqual(response.content_type, "application/json") + self.assertEqual(response.json["data"]["status"], "unsuccessful") + + response = self.app.get("/tenders/{}".format(self.tender_id)) + self.assertEqual(response.status, "200 OK") + self.assertEqual(response.content_type, "application/json") + self.assertEqual(response.json["data"]["status"], u"unsuccessful") + + +def patch_tender_award(self): + request_path = "/tenders/{}/awards".format(self.tender_id) + response = self.app.patch_json( + "/tenders/{}/awards/some_id?acc_token={}".format(self.tender_id, self.tender_token), + {"data": {"status": "unsuccessful"}}, + status=404, + ) + self.assertEqual(response.status, "404 Not Found") + self.assertEqual(response.content_type, "application/json") + self.assertEqual(response.json["status"], "error") + self.assertEqual( + response.json["errors"], [{u"description": u"Not Found", u"location": u"url", u"name": u"award_id"}] + ) + + response = self.app.patch_json( + "/tenders/some_id/awards/some_id?acc_token={}".format(self.tender_token), + {"data": {"status": "unsuccessful"}}, + status=404, + ) + self.assertEqual(response.status, "404 Not Found") + self.assertEqual(response.content_type, "application/json") + self.assertEqual(response.json["status"], "error") + self.assertEqual( + response.json["errors"], [{u"description": u"Not Found", u"location": u"url", u"name": u"tender_id"}] + ) + award_id = self.award_ids[0] + token = self.initial_bids_tokens[0] + response = self.app.patch_json( + "/tenders/{}/awards/{}?acc_token={}".format(self.tender_id, award_id, token), + {"data": {"awardStatus": "unsuccessful"}}, + status=422, + ) + self.assertEqual(response.status, "422 Unprocessable Entity") + self.assertEqual(response.content_type, "application/json") + self.assertEqual( + response.json["errors"], [{"location": "body", "name": "awardStatus", "description": "Rogue field"}] + ) + + token = self.initial_bids_tokens[0] + response = self.app.patch_json( + "/tenders/{}/awards/{}?acc_token={}".format(self.tender_id, award_id, token), + {"data": {"status": "unsuccessful"}}, + ) + self.assertEqual(response.status, "200 OK") + self.assertEqual(response.content_type, "application/json") + + response = self.app.patch_json( + "/tenders/{}/awards/{}?acc_token={}".format(self.tender_id, award_id, token), + {"data": {"status": "pending"}}, + status=403, + ) + self.assertEqual(response.status, "403 Forbidden") + self.assertEqual(response.content_type, "application/json") + self.assertEqual(response.json["errors"][0]["description"], "Forbidden") + + response = self.app.get(request_path) + self.assertEqual(response.status, "200 OK") + self.assertEqual(response.content_type, "application/json") + self.assertEqual(len(response.json["data"]), 2) + new_award = response.json["data"][-1] + + token = self.initial_bids_tokens[1] + response = self.app.patch_json( + "/tenders/{}/awards/{}?acc_token={}".format(self.tender_id, new_award["id"], token), + {"data": {"title": "title", "description": "description"}}, + ) + self.assertEqual(response.status, "200 OK") + self.assertEqual(response.content_type, "application/json") + self.assertEqual(response.json["data"]["title"], "title") + self.assertEqual(response.json["data"]["description"], "description") + + response = self.app.patch_json( + "/tenders/{}/awards/{}?acc_token={}".format(self.tender_id, new_award["id"], token), + {"data": {"status": "active"}}, + ) + self.assertEqual(response.status, "200 OK") + self.assertEqual(response.content_type, "application/json") + + response = self.app.get(request_path) + self.assertEqual(response.status, "200 OK") + self.assertEqual(response.content_type, "application/json") + self.assertEqual(len(response.json["data"]), 2) + + response = self.app.patch_json( + "/tenders/{}/awards/{}?acc_token={}".format(self.tender_id, new_award["id"], self.tender_token), + {"data": {"status": "cancelled"}}, + ) + self.assertEqual(response.status, "200 OK") + self.assertEqual(response.content_type, "application/json") + self.assertIn("Location", response.headers) + + response = self.app.get(request_path) + self.assertEqual(response.status, "200 OK") + self.assertEqual(response.content_type, "application/json") + self.assertEqual(len(response.json["data"]), 3) + + self.set_status("complete") + + response = self.app.get("/tenders/{}/awards/{}".format(self.tender_id, award_id)) + self.assertEqual(response.status, "200 OK") + self.assertEqual(response.content_type, "application/json") + self.assertEqual(response.json["data"]["value"]["amount"], 469.0) + + response = self.app.patch_json( + "/tenders/{}/awards/{}?acc_token={}".format(self.tender_id, award_id, self.tender_token), + {"data": {"status": "unsuccessful"}}, + status=403, + ) + self.assertEqual(response.status, "403 Forbidden") + self.assertEqual(response.content_type, "application/json") + self.assertEqual( + response.json["errors"][0]["description"], "Can't update award in current (complete) tender status" + ) + + +def tender_award_transitions(self): + award_id = self.award_ids[0] + tender_token = self.db.get(self.tender_id)['owner_token'] + bid_token = self.initial_bids_tokens[0] + # pending -> cancelled + for token_ in (tender_token, bid_token): + response = self.app.patch_json( + "/tenders/{}/awards/{}?acc_token={}".format(self.tender_id, award_id, token_), + {"data": {"status": "cancelled"}}, + status=403, + ) + self.assertEqual(response.status, "403 Forbidden") + self.assertEqual(response.content_type, "application/json") + + # first award: tender_owner: forbidden + for status in ('active', 'unsuccessful'): + response = self.app.patch_json( + "/tenders/{}/awards/{}?acc_token={}".format(self.tender_id, award_id, tender_token), + {"data": {"status": status}}, + status=403, + ) + self.assertEqual(response.status, "403 Forbidden") + self.assertEqual(response.content_type, "application/json") + self.assertEqual( + response.json["errors"], [{ + "location": "url", + "name": "permission", + "description": "Forbidden" + }] + ) + response = self.app.patch_json( + "/tenders/{}/awards/{}?acc_token={}".format(self.tender_id, award_id, bid_token), + {"data": {"status": 'unsuccessful'}}, + ) + self.assertEqual(response.status, "200 OK") + # bidOwner: unsuccessful -> ('active', 'cancelled', 'pending') must be forbidden + for status in ('active', 'cancelled', 'pending'): + response = self.app.patch_json( + "/tenders/{}/awards/{}?acc_token={}".format(self.tender_id, award_id, bid_token), + {"data": {"status": status}}, + status=403 + ) + self.assertEqual(response.status, "403 Forbidden") + self.assertEqual(response.content_type, "application/json") + self.assertEqual( + response.json["errors"], [{ + "location": "url", + "name": "permission", + "description": "Forbidden" + }] + ) + # tenderOwner: unsuccessful -> ('active', 'cancelled', 'pending') must be forbidden + for status in ('active', 'cancelled', 'pending'): + response = self.app.patch_json( + "/tenders/{}/awards/{}?acc_token={}".format(self.tender_id, award_id, tender_token), + {"data": {"status": status}}, + status=403 + ) + self.assertEqual(response.status, "403 Forbidden") + self.assertEqual(response.content_type, "application/json") + self.assertEqual( + response.json["errors"], [{ + "location": "body", + "name": "data", + "description": "Can't update award in current (unsuccessful) status" + }] + ) + tender = self.app.get("/tenders/{}".format(self.tender_id)).json['data'] + + award_id = tender['awards'][-1]['id'] + bid_token = self.initial_bids_tokens[1] + response = self.app.patch_json( + "/tenders/{}/awards/{}?acc_token={}".format(self.tender_id, award_id, tender_token), + {"data": {"status": 'active'}}, + status=403 + ) + self.assertEqual(response.status, "403 Forbidden") + response = self.app.patch_json( + "/tenders/{}/awards/{}?acc_token={}".format(self.tender_id, award_id, bid_token), + {"data": {"status": 'active'}}, + ) + self.assertEqual(response.status, "200 OK") + for status in ('unsuccessful', 'cancelled', 'pending'): + response = self.app.patch_json( + "/tenders/{}/awards/{}?acc_token={}".format(self.tender_id, award_id, bid_token), + {"data": {"status": status}}, + status=403 + ) + self.assertEqual(response.status, "403 Forbidden") + for status in ('unsuccessful', 'pending'): + response = self.app.patch_json( + "/tenders/{}/awards/{}?acc_token={}".format(self.tender_id, award_id, tender_token), + {"data": {"status": status}}, + status=403 + ) + self.assertEqual(response.status, "403 Forbidden") + response = self.app.patch_json( + "/tenders/{}/awards/{}?acc_token={}".format(self.tender_id, award_id, tender_token), + {"data": {"status": 'cancelled'}}, + ) + self.assertEqual(response.status, "200 OK") + tender = self.app.get("/tenders/{}".format(self.tender_id)).json['data'] + award_id = tender['awards'][-1]['id'] + for status in ('unsuccessful', 'cancelled', 'active'): + response = self.app.patch_json( + "/tenders/{}/awards/{}?acc_token={}".format(self.tender_id, award_id, bid_token), + {"data": {"status": status}}, + status=403 + ) + self.assertEqual(response.status, "403 Forbidden") + response = self.app.patch_json( + "/tenders/{}/awards/{}?acc_token={}".format(self.tender_id, award_id, tender_token), + {"data": {"status": 'cancelled'}}, + status=403 + ) + self.assertEqual(response.status, "403 Forbidden") + response = self.app.patch_json( + "/tenders/{}/awards/{}?acc_token={}".format(self.tender_id, award_id, tender_token), + {"data": {"status": 'unsuccessful'}}, + ) + self.assertEqual(response.status, "200 OK") + + +def check_tender_award(self): + # get bids + response = self.app.get("/tenders/{}/bids".format(self.tender_id)) + self.assertEqual(response.status, "200 OK") + bids = response.json["data"] + sorted_bids = sorted(bids, key=lambda bid: bid["value"]['amount']) + + # get awards + response = self.app.get("/tenders/{}/awards".format(self.tender_id)) + # get pending award + award_id = [i["id"] for i in response.json["data"] if i["status"] == "pending"][0] + # check award + response = self.app.get("/tenders/{}/awards/{}".format(self.tender_id, award_id)) + self.assertEqual(response.status, "200 OK") + self.assertEqual(response.json["data"]["suppliers"][0]["name"], sorted_bids[0]["tenderers"][0]["name"]) + self.assertEqual( + response.json["data"]["suppliers"][0]["identifier"]["id"], sorted_bids[0]["tenderers"][0]["identifier"]["id"] + ) + self.assertEqual(response.json["data"]["bid_id"], sorted_bids[0]["id"]) + + # cancel award + token = self.initial_bids_tokens[0] + self.app.authorization = ("Basic", ("broker", "")) + response = self.app.patch_json( + "/tenders/{}/awards/{}?acc_token={}".format(self.tender_id, award_id, token), + {"data": {"status": "unsuccessful"}}, + ) + self.assertEqual(response.status, "200 OK") + + # get awards + response = self.app.get("/tenders/{}/awards".format(self.tender_id)) + # get pending award + award_id = [i["id"] for i in response.json["data"] if i["status"] == "pending"][0] + # check new award + response = self.app.get("/tenders/{}/awards/{}".format(self.tender_id, award_id)) + self.assertEqual(response.status, "200 OK") + self.assertEqual(response.json["data"]["suppliers"][0]["name"], sorted_bids[1]["tenderers"][0]["name"]) + self.assertEqual( + response.json["data"]["suppliers"][0]["identifier"]["id"], sorted_bids[1]["tenderers"][0]["identifier"]["id"] + ) + self.assertEqual(response.json["data"]["bid_id"], sorted_bids[1]["id"]) + + + +def check_tender_award_disqualification(self): + # get bids + response = self.app.get("/tenders/{}/bids".format(self.tender_id)) + self.assertEqual(response.status, "200 OK") + bids = response.json["data"] + sorted_bids = sorted(bids, key=lambda bid: bid["value"]['amount']) + + # get awards + response = self.app.get("/tenders/{}/awards".format(self.tender_id)) + # get pending award + award = [i for i in response.json["data"] if i["status"] == "pending"][0] + award_id = award['id'] + # check award + response = self.app.get("/tenders/{}/awards/{}".format(self.tender_id, award_id)) + self.assertEqual(response.status, "200 OK") + self.assertEqual(response.json["data"]["suppliers"][0]["name"], sorted_bids[0]["tenderers"][0]["name"]) + self.assertEqual( + response.json["data"]["suppliers"][0]["identifier"]["id"], sorted_bids[0]["tenderers"][0]["identifier"]["id"] + ) + self.assertEqual(response.json["data"]["bid_id"], sorted_bids[0]["id"]) + + # wait 2 days + date = calculate_tender_business_date(get_now(), -QUALIFICATION_DURATION).isoformat() + self.tender_document_patch = self.db.get(self.tender_id) + self.tender_document_patch['awards'][0]['date'] = date + self.save_changes() + self.check_chronograph() + + # get awards + response = self.app.get("/tenders/{}/awards".format(self.tender_id)) + # # get pending award + awards = response.json['data'] + self.assertEqual(len(awards), 2) + self.assertEqual(awards[0]['status'], "unsuccessful") + award_id = [i["id"] for i in response.json["data"] if i["status"] == "pending"][0] + # check new award + response = self.app.get("/tenders/{}/awards/{}".format(self.tender_id, award_id)) + self.assertEqual(response.status, "200 OK") + self.assertEqual(response.json["data"]["suppliers"][0]["name"], sorted_bids[1]["tenderers"][0]["name"]) + self.assertEqual( + response.json["data"]["suppliers"][0]["identifier"]["id"], sorted_bids[1]["tenderers"][0]["identifier"]["id"] + ) + self.assertEqual(response.json["data"]["bid_id"], sorted_bids[1]["id"]) + + +def check_tender_award_cancellation(self): + # get bids + response = self.app.get("/tenders/{}/bids".format(self.tender_id)) + bids = response.json["data"] + bid_token = self.initial_bids_tokens[0] + tender_token = self.db.get(self.tender_id)['owner_token'] + sorted_bids = sorted(bids, key=lambda bid: bid["value"]['amount']) + + # get awards + response = self.app.get("/tenders/{}/awards".format(self.tender_id)) + # get pending award + award = [i for i in response.json["data"] if i["status"] == "pending"][0] + award_id = award['id'] + response = self.app.patch_json( + "/tenders/{}/awards/{}?acc_token={}".format(self.tender_id, award_id, bid_token), + {"data": {"status": "active"}}, + ) + self.assertEqual(response.status, "200 OK") + self.assertEqual(response.content_type, "application/json") + self.assertEqual(response.json['data']['status'], "active") + + response = self.app.patch_json( + "/tenders/{}/awards/{}?acc_token={}".format(self.tender_id, award_id, tender_token), + {"data": {"status": "cancelled"}}, + ) + + self.assertEqual(response.status, "200 OK") + self.assertEqual(response.content_type, "application/json") + self.assertEqual(response.json['data']['status'], "cancelled") + old_award = response.json['data'] + + response = self.app.get("/tenders/{}/awards".format(self.tender_id)) + + award = [i for i in response.json["data"] if i["status"] == "pending"][-1] + award_id = award['id'] + self.assertEqual(old_award['bid_id'], award['bid_id']) + + response = self.app.patch_json( + "/tenders/{}/awards/{}?acc_token={}".format(self.tender_id, award_id, bid_token), + {"data": {"status": "active"}}, + status=403 + ) + self.assertEqual(response.status, "403 Forbidden") + self.assertEqual(response.content_type, "application/json") + self.assertEqual(response.json['status'], "error") + + for status in ('active', 'cancelled'): + response = self.app.patch_json( + "/tenders/{}/awards/{}?acc_token={}".format(self.tender_id, award_id, tender_token), + {"data": {"status": status}}, + status=403 + ) + self.assertEqual(response.status, "403 Forbidden") + self.assertEqual(response.content_type, "application/json") + self.assertEqual(response.json['status'], "error") + self.assertEqual(response.json['errors'], [{ + u'description': u"Can't change award status to {} from pending".format(status), + u'location': u'body', + u'name': u'data' + }]) diff --git a/src/openprocurement/tender/pricequotation/tests/base.py b/src/openprocurement/tender/pricequotation/tests/base.py new file mode 100644 index 0000000000..586766a4ed --- /dev/null +++ b/src/openprocurement/tender/pricequotation/tests/base.py @@ -0,0 +1,213 @@ +# -*- coding: utf-8 -*- +import os + +from datetime import datetime +from uuid import uuid4 + +from openprocurement.api.tests.base import BaseWebTest +from openprocurement.tender.core.tests.base import BaseCoreWebTest +from openprocurement.api.constants import TZ +from openprocurement.tender.belowthreshold.constants import MIN_BIDS_NUMBER +from openprocurement.tender.pricequotation.models import PriceQuotationTender +from openprocurement.tender.pricequotation.tests.data import * + + +class BaseApiWebTest(BaseWebTest): + relative_to = os.path.dirname(__file__) + + +class BaseTenderWebTest(BaseCoreWebTest): + relative_to = os.path.dirname(__file__) + initial_data = test_tender_data + initial_status = None + maxDiff = None + + initial_bids = None + initial_auth = ("Basic", ("broker", "")) + docservice = False + min_bids_number = MIN_BIDS_NUMBER + # Statuses for test, that will be imported from others procedures + primary_tender_status = "draft.publishing" # status, to which tender should be switched from 'draft' + forbidden_document_modification_actions_status = ( + "active.qualification" + ) # status, in which operations with tender documents (adding, updating) are forbidden + forbidden_question_modification_actions_status = ( + "active.tendering" + ) # status, in which adding/updating tender questions is forbidden + forbidden_contract_document_modification_actions_status = ( + "unsuccessful" + ) # status, in which operations with tender's contract documents (adding, updating) are forbidden + forbidden_auction_document_create_actions_status = ( + "active.tendering" + ) # status, in which adding document to tender auction is forbidden + maxAwards = 2 + periods = PERIODS + meta_initial_bids = test_bids + init_awards = True + tender_class = PriceQuotationTender + + def generate_awards(self, status, startend): + bids = self.tender_document.get("bids", []) or self.tender_document_patch.get("bids", []) + awardPeriod_startDate = (self.now + self.periods[status][startend]["awardPeriod"]["startDate"]).isoformat() + if "awards" not in self.tender_document and self.init_awards: + self.award_ids = [] + self.tender_document_patch["awards"] = [] + for bid in bids: + id_ = uuid4().hex + award = { + "status": "pending", + "suppliers": bid["tenderers"], + "bid_id": bid["id"], + "value": bid["value"], + 'items': self.tender_document['items'], + "date": awardPeriod_startDate, + "documents": [], + "id": id_, + } + self.tender_document_patch["awards"].append(award) + self.award_ids.append(id_) + if len(self.tender_document_patch["awards"]) == self.maxAwards: + break + self.save_changes() + + def activate_awards(self): + awards = self.tender_document.get("awards", []) + if awards: + for award in awards: + if award["status"] == "pending": + award.update({"status": "active"}) + self.tender_document_patch.update({"awards": awards}) + self.save_changes() + + def generate_bids(self, status, startend): + tenderPeriod_startDate = self.now + self.periods[status][startend]["tenderPeriod"]["startDate"] + bids = self.tender_document.get("bids", []) + if self.initial_bids and not bids: + self.tender_document_patch["bids"] = [] + self.initial_bids_tokens = [] + for position, bid in enumerate(test_bids): + bid = deepcopy(bid) + token = uuid4().hex + bid.update( + { + "id": uuid4().hex, + "date": (tenderPeriod_startDate + timedelta(seconds=(position + 1))).isoformat(), + "owner_token": token, + "status": "draft", + "owner": "broker", + } + ) + self.tender_document_patch["bids"].append(bid) + self.initial_bids_tokens.append(token) + self.save_changes() + response = self.app.get('/tenders/{}/bids'.format(self.tender_id)) + self.assertEqual(response.status, "200 OK") + self.assertEqual(response.content_type, "application/json") + self.initial_bids = response.json["data"] + + def generate_contract(self): + awards = self.tender_document.get("awards", []) + contracts = self.tender_document.get("contracts", []) + + if not contracts: + for award in reversed(awards): + if award["status"] == "active": + if award["value"]["valueAddedTaxIncluded"]: + amount_net = float(award["value"]["amount"]) - 1 + else: + amount_net = award["value"]["amount"] + contract = { + "id": uuid4().hex, + "title": "contract title", + "description": "contract description", + "awardID": award["id"], + "value": { + "amount": award["value"]["amount"], + "amountNet": amount_net, + "currency": award["value"]["currency"], + "valueAddedTaxIncluded": award["value"]["valueAddedTaxIncluded"], + }, + "suppliers": award["suppliers"], + "status": "pending", + "contractID": "UA-2017-06-21-000001-1", + "date": datetime.now(TZ).isoformat(), + "items": self.tender_document["items"], + } + self.contract_id = contract["id"] + self.tender_document_patch.update({"contracts": [contract]}) + self.save_changes() + + def set_status(self, status, startend="start", extra=None): + self.now = get_now() + self.tender_document = self.db.get(self.tender_id) + self.tender_document_patch = {"status": status} + self.patch_tender_bot() + if status == "active.tendering": + self.update_periods(status, startend) + elif status == "active.qualification": + self.update_periods(status, startend) + self.generate_bids(status, startend) + self.generate_awards(status, startend) + elif status == "active.awarded": + self.update_periods(status, startend) + self.generate_bids(status, startend) + self.generate_awards(status, startend) + self.activate_awards() + self.generate_contract() + elif status == "complete": + self.update_periods(status, startend) + self.generate_bids(status, startend) + self.generate_awards(status, startend) + self.activate_awards() + self.generate_contract() + self.save_changes() + return self.get_tender("chronograph") + + def patch_tender_bot(self): + items = deepcopy(self.initial_data["items"]) + for item in items: + item.update({ + "classification": test_short_profile["classification"], + "unit": test_short_profile["unit"] + }) + value = deepcopy(test_short_profile['value']) + amount = sum([item["quantity"] for item in items]) * test_short_profile['value']['amount'] + value["amount"] = amount + criteria = getattr(self, "test_criteria", test_short_profile['criteria']) + self.tender_document_patch.update({ + "shortlistedFirms": test_shortlisted_firms, + 'criteria': criteria, + "items": items, + 'value': value + }) + self.save_changes() + + @property + def tender_token(self): + data = self.db.get(self.tender_id) + award = data['awards'][-1] if data.get('awards') else None + if award and award['status'] == 'pending': + bid = [b for b in data['bids'] if b['id'] == award['bid_id']][0] + return bid['owner_token'] + else: + return data['owner_token'] + + def create_tender(self): + data = deepcopy(self.initial_data) + response = self.app.post_json("/tenders", {"data": data}) + tender = response.json["data"] + self.tender_id = tender["id"] + status = tender["status"] + if self.initial_status and self.initial_status != status: + self.set_status(self.initial_status) + + +class TenderContentWebTest(BaseTenderWebTest): + initial_data = test_tender_data + initial_status = None + initial_bids = None + need_tender = True + def setUp(self): + super(TenderContentWebTest, self).setUp() + if self.need_tender: + self.create_tender() diff --git a/src/openprocurement/tender/pricequotation/tests/bid.py b/src/openprocurement/tender/pricequotation/tests/bid.py new file mode 100644 index 0000000000..7e11c12f33 --- /dev/null +++ b/src/openprocurement/tender/pricequotation/tests/bid.py @@ -0,0 +1,146 @@ +# -*- coding: utf-8 -*- +import unittest + +from openprocurement.api.tests.base import snitch +from openprocurement.tender.pricequotation.tests.base import ( + TenderContentWebTest, + test_organization, + test_bids, + test_requirement_response_valid, +) +from openprocurement.tender.pricequotation.tests.data import ( + test_criteria_1, + test_criteria_2, + test_criteria_3, + test_criteria_4 + ) +from openprocurement.tender.belowthreshold.tests.bid_blanks import ( + create_tender_bid_with_document_invalid, + create_tender_bid_with_document, + create_tender_bid_with_documents, + create_tender_bid_with_document_invalid, + create_tender_bid_with_document, + create_tender_bid_with_documents, + create_tender_bid_document_json, + put_tender_bid_document_json, + not_found, + create_tender_bid_document, + put_tender_bid_document, + ) +from openprocurement.tender.pricequotation.tests.bid_blanks import ( + create_tender_bid, + create_tender_bid_document_nopending, + create_tender_bid_invalid, + patch_tender_bid, + get_tender_bid, + delete_tender_bid, + get_tender_tenderers, + bid_Administrator_change, + patch_tender_bid_document, + requirement_response_validation_multiple_criterias, + requirement_response_validation_multiple_groups, + requirement_response_validation_multiple_groups_multiple_requirements, + requirement_response_validation_one_group_multiple_requirements +) + + +class TenderBidResourceTest(TenderContentWebTest): + initial_status = "active.tendering" + + test_create_tender_bid_invalid = snitch(create_tender_bid_invalid) + test_create_tender_bid = snitch(create_tender_bid) + test_patch_tender_bid = snitch(patch_tender_bid) + test_get_tender_bid = snitch(get_tender_bid) + test_delete_tender_bid = snitch(delete_tender_bid) + test_get_tender_tenderers = snitch(get_tender_tenderers) + test_bid_Administrator_change = snitch(bid_Administrator_change) + + +class TenderBidCriteriaTest(TenderContentWebTest): + initial_status = "active.tendering" + test_criteria = test_criteria_1 + + test_multiple_criterias = snitch( + requirement_response_validation_multiple_criterias + ) + + +class TenderBidCriteriaGroupTest(TenderContentWebTest): + initial_status = "active.tendering" + test_criteria = test_criteria_2 + + test_multiple_groups = snitch( + requirement_response_validation_multiple_groups + ) + + +class TenderBidCriteriaMultipleGroupTest(TenderContentWebTest): + initial_status = "active.tendering" + test_criteria = test_criteria_3 + + test_multiple_groups_multiple_requirements = snitch( + requirement_response_validation_multiple_groups_multiple_requirements + ) + + +class TenderBidCriteriaOneGroupMultipleRequirementsTest(TenderContentWebTest): + initial_status = "active.tendering" + test_criteria = test_criteria_4 + + test_multiple_groups_multiple_requirements = snitch( + requirement_response_validation_one_group_multiple_requirements + ) + + +class TenderBidDocumentResourceTest(TenderContentWebTest): + + initial_status = "active.tendering" + + def setUp(self): + super(TenderBidDocumentResourceTest, self).setUp() + # Create bid + response = self.app.post_json( + "/tenders/{}/bids".format(self.tender_id), + {"data": {"tenderers": [test_organization], "value": {"amount": 500}, + "requirementResponses": test_requirement_response_valid}}, + ) + bid = response.json["data"] + self.bid = bid + self.bid_id = bid["id"] + self.bid_token = response.json["access"]["token"] + + test_not_found = snitch(not_found) + test_create_tender_bid_document = snitch(create_tender_bid_document) + test_put_tender_bid_document = snitch(put_tender_bid_document) + test_patch_tender_bid_document = snitch(patch_tender_bid_document) + test_create_tender_bid_document_nopending = snitch(create_tender_bid_document_nopending) + + +class TenderBidDocumentWithDSResourceTest(TenderBidDocumentResourceTest): + docservice = True + + test_create_tender_bid_document_json = snitch(create_tender_bid_document_json) + test_put_tender_bid_document_json = snitch(put_tender_bid_document_json) + + +class TenderBidBatchDocumentWithDSResourceTest(TenderContentWebTest): + docservice = True + initial_status = "active.tendering" + bid_data_wo_docs = {"tenderers": [test_organization], "value": {"amount": 500}, "documents": [], "requirementResponses": test_requirement_response_valid} + + test_create_tender_bid_with_document_invalid = snitch(create_tender_bid_with_document_invalid) + test_create_tender_bid_with_document = snitch(create_tender_bid_with_document) + test_create_tender_bid_with_documents = snitch(create_tender_bid_with_documents) + + +def suite(): + suite = unittest.TestSuite() + suite.addTest(unittest.makeSuite(TenderBidDocumentResourceTest)) + suite.addTest(unittest.makeSuite(TenderBidDocumentWithDSResourceTest)) + suite.addTest(unittest.makeSuite(TenderBidFeaturesResourceTest)) + suite.addTest(unittest.makeSuite(TenderBidResourceTest)) + return suite + + +if __name__ == "__main__": + unittest.main(defaultTest="suite") diff --git a/src/openprocurement/tender/pricequotation/tests/bid_blanks.py b/src/openprocurement/tender/pricequotation/tests/bid_blanks.py new file mode 100644 index 0000000000..f781f29e19 --- /dev/null +++ b/src/openprocurement/tender/pricequotation/tests/bid_blanks.py @@ -0,0 +1,825 @@ +# -*- coding: utf-8 -*- +from copy import deepcopy + +import mock +from datetime import timedelta + +from openprocurement.api.utils import get_now +from openprocurement.tender.pricequotation.tests.data import\ + test_criteria_1, test_criteria_2, test_criteria_3, test_criteria_4 +from openprocurement.tender.pricequotation.tests.base import \ + test_organization, test_requirement_response_valid, test_response_1,\ + test_response_2_1, test_response_2_2, test_response_3_1,\ + test_response_3_2, test_response_4 + + +def create_tender_bid_invalid(self): + response = self.app.post_json( + "/tenders/some_id/bids", {"data": {"tenderers": [test_organization], "value": {"amount": 500}}}, status=404 + ) + self.assertEqual(response.status, "404 Not Found") + self.assertEqual(response.content_type, "application/json") + self.assertEqual(response.json["status"], "error") + self.assertEqual( + response.json["errors"], [{u"description": u"Not Found", u"location": u"url", u"name": u"tender_id"}] + ) + + request_path = "/tenders/{}/bids".format(self.tender_id) + response = self.app.post(request_path, "data", status=415) + self.assertEqual(response.status, "415 Unsupported Media Type") + self.assertEqual(response.content_type, "application/json") + self.assertEqual(response.json["status"], "error") + self.assertEqual( + response.json["errors"], + [ + { + u"description": u"Content-Type header should be one of ['application/json']", + u"location": u"header", + u"name": u"Content-Type", + } + ], + ) + + response = self.app.post(request_path, "data", content_type="application/json", status=422) + self.assertEqual(response.status, "422 Unprocessable Entity") + self.assertEqual(response.content_type, "application/json") + self.assertEqual(response.json["status"], "error") + self.assertEqual( + response.json["errors"], + [{u"description": u"No JSON object could be decoded", u"location": u"body", u"name": u"data"}], + ) + + response = self.app.post_json(request_path, "data", status=422) + self.assertEqual(response.status, "422 Unprocessable Entity") + self.assertEqual(response.content_type, "application/json") + self.assertEqual(response.json["status"], "error") + self.assertEqual( + response.json["errors"], [{u"description": u"Data not available", u"location": u"body", u"name": u"data"}] + ) + + response = self.app.post_json(request_path, {"not_data": {}}, status=422) + self.assertEqual(response.status, "422 Unprocessable Entity") + self.assertEqual(response.content_type, "application/json") + self.assertEqual(response.json["status"], "error") + self.assertEqual( + response.json["errors"], [{u"description": u"Data not available", u"location": u"body", u"name": u"data"}] + ) + + response = self.app.post_json(request_path, {"data": {"invalid_field": "invalid_value"}}, status=422) + self.assertEqual(response.status, "422 Unprocessable Entity") + self.assertEqual(response.content_type, "application/json") + self.assertEqual(response.json["status"], "error") + self.assertEqual( + response.json["errors"], [{u"description": u"Rogue field", u"location": u"body", u"name": u"invalid_field"}] + ) + + response = self.app.post_json(request_path, {"data": {"tenderers": [{"identifier": "invalid_value"}]}}, status=422) + self.assertEqual(response.status, "422 Unprocessable Entity") + self.assertEqual(response.content_type, "application/json") + self.assertEqual(response.json["status"], "error") + self.assertEqual( + response.json["errors"], + [ + { + u"description": { + u"identifier": [u"Please use a mapping for this field or Identifier instance instead of unicode."] + }, + u"location": u"body", + u"name": u"tenderers", + } + ], + ) + + response = self.app.post_json(request_path, {"data": {"tenderers": [{"identifier": {}}], "requirementResponses": test_requirement_response_valid}}, status=422) + self.assertEqual(response.status, "422 Unprocessable Entity") + self.assertEqual(response.content_type, "application/json") + self.assertEqual(response.json["status"], "error") + self.assertEqual( + response.json["errors"], + [ + { + u"description": [ + { + u"contactPoint": [u"This field is required."], + u"identifier": {u"scheme": [u"This field is required."], u"id": [u"This field is required."]}, + u"name": [u"This field is required."], + u"address": [u"This field is required."], + } + ], + u"location": u"body", + u"name": u"tenderers", + } + ], + ) + + response = self.app.post_json( + request_path, {"data": {"tenderers": [{"name": "name", "identifier": {"uri": "invalid_value"}}], "requirementResponses": test_requirement_response_valid}}, status=422 + ) + self.assertEqual(response.status, "422 Unprocessable Entity") + self.assertEqual(response.content_type, "application/json") + self.assertEqual(response.json["status"], "error") + self.assertEqual( + response.json["errors"], + [ + { + u"description": [ + { + u"contactPoint": [u"This field is required."], + u"identifier": { + u"scheme": [u"This field is required."], + u"id": [u"This field is required."], + u"uri": [u"Not a well formed URL."], + }, + u"address": [u"This field is required."], + } + ], + u"location": u"body", + u"name": u"tenderers", + } + ], + ) + + response = self.app.post_json(request_path, {"data": {"tenderers": [test_organization], "requirementResponses": test_requirement_response_valid}}, status=422) + self.assertEqual(response.status, "422 Unprocessable Entity") + self.assertEqual(response.content_type, "application/json") + self.assertEqual(response.json["status"], "error") + self.assertEqual( + response.json["errors"], + [{u"description": [u"This field is required."], u"location": u"body", u"name": u"value"}], + ) + + response = self.app.post_json( + request_path, + {"data": {"tenderers": [test_organization], "value": {"amount": 500, "valueAddedTaxIncluded": False}, "requirementResponses": test_requirement_response_valid}}, + status=422, + ) + self.assertEqual(response.status, "422 Unprocessable Entity") + self.assertEqual(response.content_type, "application/json") + self.assertEqual(response.json["status"], "error") + self.assertEqual( + response.json["errors"], + [ + { + u"description": [ + u"valueAddedTaxIncluded of bid should be identical to valueAddedTaxIncluded of value of tender" + ], + u"location": u"body", + u"name": u"value", + } + ], + ) + + response = self.app.post_json( + request_path, + {"data": {"tenderers": [test_organization], "value": {"amount": 500, "currency": "USD"}, "requirementResponses": test_requirement_response_valid}}, + status=422, + ) + self.assertEqual(response.status, "422 Unprocessable Entity") + self.assertEqual(response.content_type, "application/json") + self.assertEqual(response.json["status"], "error") + self.assertEqual( + response.json["errors"], + [ + { + u"description": [u"currency of bid should be identical to currency of value of tender"], + u"location": u"body", + u"name": u"value", + } + ], + ) + + response = self.app.post_json( + request_path, {"data": {"tenderers": test_organization, "value": {"amount": 500}}}, status=422 + ) + self.assertEqual(response.status, "422 Unprocessable Entity") + self.assertEqual(response.content_type, "application/json") + self.assertEqual(response.json["status"], "error") + self.assertIn(u"invalid literal for int() with base 10", response.json["errors"][0]["description"]) + + response = self.app.post_json( + request_path, {"data": {"tenderers": [test_organization], "value": {"amount": 500}}}, status=422 + ) + self.assertEqual(response.status, "422 Unprocessable Entity") + self.assertEqual(response.content_type, "application/json") + self.assertEqual(response.json["status"], "error") + self.assertEqual( + response.json["errors"], + [{u"description": [u"This field is required."], u"location": u"body", u"name": u"requirementResponses"}], + ) + + +def create_tender_bid(self): + dateModified = self.db.get(self.tender_id).get("dateModified") + + # Revert tender to statuses ('draft', 'draft.unsuccessful', 'draft.publishing') + data = self.db.get(self.tender_id) + current_status = data.get('status') + criteria = data.pop('criteria') + + for status in ('draft', 'draft.publishing', 'draft.unsuccessful'): + data['status'] = status + self.db.save(data) + response = self.app.post_json( + "/tenders/{}/bids".format(self.tender_id), + { + "data": { + "tenderers": [test_organization], + "value": {"amount": 500}, + "requirementResponses": test_requirement_response_valid + } + }, + status=403 + ) + self.assertEqual(response.status, "403 Forbidden") + self.assertEqual(response.json['errors'], + [{"location": "body", + "name": "data", + "description": "Can't add bid in current ({}) tender status".format(status)}]) + + # Restore tender to 'active.tendering' status + data['status'] = current_status + data['criteria'] = criteria + self.db.save(data) + + response = self.app.post_json( + "/tenders/{}/bids".format(self.tender_id), + {"data": {"tenderers": [test_organization], "value": {"amount": 500}, "requirementResponses": test_requirement_response_valid }}, + ) + self.assertEqual(response.status, "201 Created") + self.assertEqual(response.content_type, "application/json") + bid = response.json["data"] + self.assertEqual(bid["tenderers"][0]["name"], test_organization["name"]) + self.assertIn("id", bid) + self.assertIn(bid["id"], response.headers["Location"]) + + self.assertEqual(self.db.get(self.tender_id).get("dateModified"), dateModified) + + self.set_status("complete") + + response = self.app.post_json( + "/tenders/{}/bids".format(self.tender_id), + {"data": {"tenderers": [test_organization], "value": {"amount": 500}, "requirementResponses": test_requirement_response_valid}}, + status=403, + ) + self.assertEqual(response.status, "403 Forbidden") + self.assertEqual(response.content_type, "application/json") + self.assertEqual(response.json["errors"][0]["description"], "Can't add bid in current (complete) tender status") + + +def requirement_response_validation_multiple_criterias(self): + response = self.app.post_json( + "/tenders/{}/bids".format(self.tender_id), + {"data": { + "tenderers": [test_organization], + "value": {"amount": 500}, + "requirementResponses": test_response_1 + }}, + ) + self.assertEqual(response.status, "201 Created") + self.assertEqual(response.content_type, "application/json") + test_response = deepcopy(test_response_1) + test_response[0]['value'] = 'ivalid' + response = self.app.post_json( + "/tenders/{}/bids".format(self.tender_id), + {"data": { + "tenderers": [test_organization], + "value": {"amount": 500}, + "requirementResponses": test_response + }}, + status=422 + ) + self.assertEqual(response.status, '422 Unprocessable Entity') + self.assertEqual(response.content_type, "application/json") + data = response.json + self.assertEqual(data['status'], "error") + self.assertEqual( + data['errors'], [{ + u'description': [u'Value "ivalid" does not match expected value "Розчин для інфузій" in reqirement 400496-0001-001-01'], + u'location': u'body', + u'name': u'requirementResponses' + }] + ) + + test_response = deepcopy(test_response_1) + test_response[1]['value'] = '4' + response = self.app.post_json( + "/tenders/{}/bids".format(self.tender_id), + {"data": { + "tenderers": [test_organization], + "value": {"amount": 500}, + "requirementResponses": test_response + }}, + status=422 + ) + self.assertEqual(response.status, '422 Unprocessable Entity') + self.assertEqual(response.content_type, "application/json") + data = response.json + self.assertEqual(data['status'], "error") + self.assertEqual( + data['errors'], [{ + u'description': [u'Value 4 is lower then minimal required 5 in reqirement 400496-0002-001-01'], + u'location': u'body', + u'name': u'requirementResponses' + }] + ) + + test_response = deepcopy(test_response_1) + test_response.pop() + response = self.app.post_json( + "/tenders/{}/bids".format(self.tender_id), + {"data": { + "tenderers": [test_organization], + "value": {"amount": 500}, + "requirementResponses": test_response + }}, + status=422 + ) + self.assertEqual(response.status, '422 Unprocessable Entity') + self.assertEqual(response.content_type, "application/json") + data = response.json + self.assertEqual(data['status'], "error") + self.assertEqual( + data['errors'], [{ + u'description': [u"Missing references for criterias: [u'400496-0002']"], + u'location': u'body', + u'name': u'requirementResponses' + }] + ) + + +def requirement_response_validation_multiple_groups(self): + response = self.app.post_json( + "/tenders/{}/bids".format(self.tender_id), + {"data": { + "tenderers": [test_organization], + "value": {"amount": 500}, + "requirementResponses": test_response_2_1 + }}, + ) + self.assertEqual(response.status, "201 Created") + self.assertEqual(response.content_type, "application/json") + + response = self.app.post_json( + "/tenders/{}/bids".format(self.tender_id), + {"data": { + "tenderers": [test_organization], + "value": {"amount": 500}, + "requirementResponses": test_response_2_2 + }}, + ) + self.assertEqual(response.status, "201 Created") + self.assertEqual(response.content_type, "application/json") + + test_response = deepcopy(test_response_2_2) + test_response.extend(test_response_2_1) + + response = self.app.post_json( + "/tenders/{}/bids".format(self.tender_id), + {"data": { + "tenderers": [test_organization], + "value": {"amount": 500}, + "requirementResponses": test_response + }}, + status=422 + ) + self.assertEqual(response.status, '422 Unprocessable Entity') + self.assertEqual(response.content_type, "application/json") + data = response.json + self.assertEqual(data['status'], "error") + self.assertEqual( + data['errors'], [{ + u'description': [u"Provided groups [u'400496-0001-002', u'400496-0001-001'] conflicting in criteria 400496-0001"], + u'location': u'body', + u'name': u'requirementResponses' + }] + ) + + +def requirement_response_validation_multiple_groups_multiple_requirements(self): + response = self.app.post_json( + "/tenders/{}/bids".format(self.tender_id), + {"data": { + "tenderers": [test_organization], + "value": {"amount": 500}, + "requirementResponses": test_response_3_1 + }}, + ) + self.assertEqual(response.status, "201 Created") + self.assertEqual(response.content_type, "application/json") + + response = self.app.post_json( + "/tenders/{}/bids".format(self.tender_id), + {"data": { + "tenderers": [test_organization], + "value": {"amount": 500}, + "requirementResponses": test_response_3_2 + }}, + ) + self.assertEqual(response.status, "201 Created") + self.assertEqual(response.content_type, "application/json") + + test_response = deepcopy(test_response_3_1) + test_response.extend(test_response_3_2) + + response = self.app.post_json( + "/tenders/{}/bids".format(self.tender_id), + {"data": { + "tenderers": [test_organization], + "value": {"amount": 500}, + "requirementResponses": test_response + }}, + status=422 + ) + self.assertEqual(response.status, '422 Unprocessable Entity') + self.assertEqual(response.content_type, "application/json") + data = response.json + self.assertEqual(data['status'], "error") + self.assertEqual( + data['errors'], [{ + u'description': [u"Provided groups [u'400496-0001-002', u'400496-0001-001'] conflicting in criteria 400496-0001"], + u'location': u'body', + u'name': u'requirementResponses' + }] + ) + + +def requirement_response_validation_one_group_multiple_requirements(self): + response = self.app.post_json( + "/tenders/{}/bids".format(self.tender_id), + {"data": { + "tenderers": [test_organization], + "value": {"amount": 500}, + "requirementResponses": test_response_4 + }}, + status=422 + ) + self.assertEqual(response.status, '422 Unprocessable Entity') + self.assertEqual(response.content_type, "application/json") + data = response.json + self.assertEqual(data['status'], "error") + self.assertEqual( + data['errors'], [{ + u'description': [u'Value "Порошок" does not match expected value "Розчин" in reqirement 400496-0001-001-01'], + u'location': u'body', + u'name': u'requirementResponses' + }] + ) + + test_response = deepcopy(test_response_4) + test_response[0]['value'] = u'Розчин' + response = self.app.post_json( + "/tenders/{}/bids".format(self.tender_id), + {"data": { + "tenderers": [test_organization], + "value": {"amount": 500}, + "requirementResponses": test_response + }}, + ) + self.assertEqual(response.status, "201 Created") + self.assertEqual(response.content_type, "application/json") + + +def patch_tender_bid(self): + response = self.app.post_json( + "/tenders/{}/bids".format(self.tender_id), + {"data": {"tenderers": [test_organization], "status": "draft", "value": {"amount": 500}, "requirementResponses": test_requirement_response_valid}}, + ) + self.assertEqual(response.status, "201 Created") + self.assertEqual(response.content_type, "application/json") + bid = response.json["data"] + token = response.json["access"]["token"] + + response = self.app.patch_json( + "/tenders/{}/bids/{}?acc_token={}".format(self.tender_id, bid["id"], token), + {"data": {"value": {"amount": 60000}}}, + status=422, + ) + self.assertEqual(response.status, "422 Unprocessable Entity") + self.assertEqual(response.content_type, "application/json") + self.assertEqual(response.json["status"], "error") + self.assertEqual( + response.json["errors"], + [ + { + u"description": [u"value of bid should be less than value of tender"], + u"location": u"body", + u"name": u"value", + } + ], + ) + + response = self.app.patch_json( + "/tenders/{}/bids/{}?acc_token={}".format(self.tender_id, bid["id"], token), + {"data": {"tenderers": [{"name": u"Державне управління управлінням справами"}]}}, + ) + self.assertEqual(response.status, "200 OK") + self.assertEqual(response.content_type, "application/json") + self.assertEqual(response.json["data"]["date"], bid["date"]) + self.assertNotEqual(response.json["data"]["tenderers"][0]["name"], bid["tenderers"][0]["name"]) + + response = self.app.patch_json( + "/tenders/{}/bids/{}?acc_token={}".format(self.tender_id, bid["id"], token), + {"data": {"value": {"amount": 500}, "tenderers": [test_organization]}}, + ) + self.assertEqual(response.status, "200 OK") + self.assertEqual(response.content_type, "application/json") + self.assertEqual(response.json["data"]["date"], bid["date"]) + self.assertEqual(response.json["data"]["tenderers"][0]["name"], bid["tenderers"][0]["name"]) + + response = self.app.patch_json( + "/tenders/{}/bids/{}?acc_token={}".format(self.tender_id, bid["id"], token), + {"data": {"value": {"amount": 400}}}, + ) + self.assertEqual(response.status, "200 OK") + self.assertEqual(response.content_type, "application/json") + self.assertEqual(response.json["data"]["value"]["amount"], 400) + self.assertNotEqual(response.json["data"]["date"], bid["date"]) + + response = self.app.patch_json( + "/tenders/{}/bids/{}?acc_token={}".format(self.tender_id, bid["id"], token), {"data": {"status": "active"}} + ) + self.assertEqual(response.status, "200 OK") + self.assertEqual(response.content_type, "application/json") + self.assertEqual(response.json["data"]["status"], "active") + self.assertNotEqual(response.json["data"]["date"], bid["date"]) + + response = self.app.patch_json( + "/tenders/{}/bids/{}?acc_token={}".format(self.tender_id, bid["id"], token), + {"data": {"status": "draft"}}, + status=403, + ) + self.assertEqual(response.status, "403 Forbidden") + self.assertEqual(response.content_type, "application/json") + self.assertEqual(response.json["errors"][0]["description"], "Can't update bid to (draft) status") + + response = self.app.patch_json( + "/tenders/{}/bids/some_id".format(self.tender_id), {"data": {"value": {"amount": 400}}}, status=404 + ) + self.assertEqual(response.status, "404 Not Found") + self.assertEqual(response.content_type, "application/json") + self.assertEqual(response.json["status"], "error") + self.assertEqual(response.json["errors"], [{u"description": u"Not Found", u"location": u"url", u"name": u"bid_id"}]) + + response = self.app.patch_json("/tenders/some_id/bids/some_id", {"data": {"value": {"amount": 400}}}, status=404) + self.assertEqual(response.status, "404 Not Found") + self.assertEqual(response.content_type, "application/json") + self.assertEqual(response.json["status"], "error") + self.assertEqual( + response.json["errors"], [{u"description": u"Not Found", u"location": u"url", u"name": u"tender_id"}] + ) + + self.set_status("complete") + + response = self.app.get("/tenders/{}/bids/{}".format(self.tender_id, bid["id"])) + self.assertEqual(response.status, "200 OK") + self.assertEqual(response.content_type, "application/json") + self.assertEqual(response.json["data"]["value"]["amount"], 400) + + response = self.app.patch_json( + "/tenders/{}/bids/{}?acc_token={}".format(self.tender_id, bid["id"], token), + {"data": {"value": {"amount": 400}}}, + status=403, + ) + self.assertEqual(response.status, "403 Forbidden") + self.assertEqual(response.content_type, "application/json") + self.assertEqual(response.json["errors"][0]["description"], "Can't update bid in current (complete) tender status") + + +def get_tender_bid(self): + response = self.app.post_json( + "/tenders/{}/bids".format(self.tender_id), + {"data": {"tenderers": [test_organization], "value": {"amount": 500}, "requirementResponses": test_requirement_response_valid}}, + ) + self.assertEqual(response.status, "201 Created") + self.assertEqual(response.content_type, "application/json") + bid = response.json["data"] + bid_token = response.json["access"]["token"] + + response = self.app.get("/tenders/{}/bids/{}".format(self.tender_id, bid["id"]), status=403) + self.assertEqual(response.status, "403 Forbidden") + self.assertEqual(response.content_type, "application/json") + self.assertEqual( + response.json["errors"][0]["description"], "Can't view bid in current (active.tendering) tender status" + ) + + response = self.app.get("/tenders/{}/bids/{}?acc_token={}".format(self.tender_id, bid["id"], bid_token)) + self.assertEqual(response.status, "200 OK") + self.assertEqual(response.content_type, "application/json") + self.assertEqual(response.json["data"], bid) + + self.set_status("active.qualification") + + response = self.app.get("/tenders/{}/bids/{}".format(self.tender_id, bid["id"])) + self.assertEqual(response.status, "200 OK") + self.assertEqual(response.content_type, "application/json") + bid_data = response.json["data"] + self.assertEqual(bid_data, bid) + + response = self.app.get("/tenders/{}/bids/some_id".format(self.tender_id), status=404) + self.assertEqual(response.status, "404 Not Found") + self.assertEqual(response.content_type, "application/json") + self.assertEqual(response.json["status"], "error") + self.assertEqual(response.json["errors"], [{u"description": u"Not Found", u"location": u"url", u"name": u"bid_id"}]) + + response = self.app.get("/tenders/some_id/bids/some_id", status=404) + self.assertEqual(response.status, "404 Not Found") + self.assertEqual(response.content_type, "application/json") + self.assertEqual(response.json["status"], "error") + self.assertEqual( + response.json["errors"], [{u"description": u"Not Found", u"location": u"url", u"name": u"tender_id"}] + ) + + response = self.app.delete( + "/tenders/{}/bids/{}?acc_token={}".format(self.tender_id, bid["id"], bid_token), status=403 + ) + self.assertEqual(response.status, "403 Forbidden") + self.assertEqual(response.content_type, "application/json") + self.assertEqual( + response.json["errors"][0]["description"], "Can't delete bid in current (active.qualification) tender status" + ) + + +def delete_tender_bid(self): + response = self.app.post_json( + "/tenders/{}/bids".format(self.tender_id), + {"data": {"tenderers": [test_organization], "value": {"amount": 500}, "requirementResponses": test_requirement_response_valid}}, + ) + self.assertEqual(response.status, "201 Created") + self.assertEqual(response.content_type, "application/json") + bid = response.json["data"] + bid_token = response.json["access"]["token"] + + response = self.app.delete( + "/tenders/{}/bids/{}?acc_token={}".format(self.tender_id, bid["id"], bid_token), + status=403 + ) + self.assertEqual(response.status, "403 Forbidden") + self.assertEqual(response.content_type, "application/json") + self.assertEqual(response.json["status"], 'error') + self.assertEqual(response.json["errors"], [ + {"location": "body", "name": "data", "description": "Can't delete bid in Price Quotation tender"} + ]) + + response = self.app.delete("/tenders/{}/bids/some_id".format(self.tender_id), status=404) + self.assertEqual(response.status, "404 Not Found") + self.assertEqual(response.content_type, "application/json") + self.assertEqual(response.json["status"], "error") + self.assertEqual(response.json["errors"], [{u"description": u"Not Found", u"location": u"url", u"name": u"bid_id"}]) + + response = self.app.delete("/tenders/some_id/bids/some_id", status=404) + self.assertEqual(response.status, "404 Not Found") + self.assertEqual(response.content_type, "application/json") + self.assertEqual(response.json["status"], "error") + self.assertEqual( + response.json["errors"], [{u"description": u"Not Found", u"location": u"url", u"name": u"tender_id"}] + ) + + +def get_tender_tenderers(self): + response = self.app.post_json( + "/tenders/{}/bids".format(self.tender_id), + {"data": {"tenderers": [test_organization], "value": {"amount": 500}, "requirementResponses": test_requirement_response_valid}}, + ) + self.assertEqual(response.status, "201 Created") + self.assertEqual(response.content_type, "application/json") + bid = response.json["data"] + + response = self.app.get("/tenders/{}/bids".format(self.tender_id), status=403) + self.assertEqual(response.status, "403 Forbidden") + self.assertEqual(response.content_type, "application/json") + self.assertEqual( + response.json["errors"][0]["description"], "Can't view bids in current (active.tendering) tender status" + ) + + self.set_status("active.qualification") + + response = self.app.get("/tenders/{}/bids".format(self.tender_id)) + self.assertEqual(response.status, "200 OK") + self.assertEqual(response.content_type, "application/json") + self.assertEqual(response.json["data"][0], bid) + + response = self.app.get("/tenders/some_id/bids", status=404) + self.assertEqual(response.status, "404 Not Found") + self.assertEqual(response.content_type, "application/json") + self.assertEqual(response.json["status"], "error") + self.assertEqual( + response.json["errors"], [{u"description": u"Not Found", u"location": u"url", u"name": u"tender_id"}] + ) + + +def bid_Administrator_change(self): + response = self.app.post_json( + "/tenders/{}/bids".format(self.tender_id), + {"data": {"tenderers": [test_organization], "value": {"amount": 500}, "requirementResponses": test_requirement_response_valid}}, + ) + self.assertEqual(response.status, "201 Created") + self.assertEqual(response.content_type, "application/json") + bid = response.json["data"] + + self.app.authorization = ("Basic", ("administrator", "")) + response = self.app.patch_json( + "/tenders/{}/bids/{}".format(self.tender_id, bid["id"]), + {"data": {"tenderers": [{"identifier": {"id": "00000000"}}], "value": {"amount": 400}}}, + ) + self.assertEqual(response.status, "200 OK") + self.assertEqual(response.content_type, "application/json") + self.assertNotEqual(response.json["data"]["value"]["amount"], 400) + self.assertEqual(response.json["data"]["tenderers"][0]["identifier"]["id"], "00000000") + + +def patch_tender_bid_document(self): + response = self.app.post( + "/tenders/{}/bids/{}/documents?acc_token={}".format(self.tender_id, self.bid_id, self.bid_token), + upload_files=[("file", "name.doc", "content")], + ) + self.assertEqual(response.status, "201 Created") + self.assertEqual(response.content_type, "application/json") + doc_id = response.json["data"]["id"] + self.assertIn(doc_id, response.headers["Location"]) + + + response = self.app.patch_json( + "/tenders/{}/bids/{}/documents/{}?acc_token={}".format(self.tender_id, self.bid_id, doc_id, self.bid_token), + {"data": {"description": "document description"}}, + ) + self.assertEqual(response.status, "200 OK") + self.assertEqual(response.content_type, "application/json") + self.assertEqual(doc_id, response.json["data"]["id"]) + + response = self.app.get( + "/tenders/{}/bids/{}/documents/{}?acc_token={}".format(self.tender_id, self.bid_id, doc_id, self.bid_token) + ) + self.assertEqual(response.status, "200 OK") + self.assertEqual(response.content_type, "application/json") + self.assertEqual(doc_id, response.json["data"]["id"]) + self.assertEqual("document description", response.json["data"]["description"]) + + self.set_status("active.awarded") + + response = self.app.patch_json( + "/tenders/{}/bids/{}/documents/{}?acc_token={}".format(self.tender_id, self.bid_id, doc_id, self.bid_token), + {"data": {"description": "document description"}}, + status=403, + ) + self.assertEqual(response.status, "403 Forbidden") + self.assertEqual(response.content_type, "application/json") + self.assertEqual( + response.json["errors"][0]["description"], "Can't update document in current (active.awarded) tender status" + ) + + +def create_tender_bid_document_nopending(self): + response = self.app.post_json( + "/tenders/{}/bids".format(self.tender_id), + {"data": {"tenderers": [test_organization], "value": {"amount": 500}, + "requirementResponses": test_requirement_response_valid}}, + ) + bid = response.json['data'] + token = response.json['access']['token'] + bid_id = bid['id'] + + response = self.app.post( + "/tenders/{}/bids/{}/documents?acc_token={}".format(self.tender_id, bid_id, token), + upload_files=[("file", "name.doc", "content")], + ) + self.assertEqual(response.status, "201 Created") + self.assertEqual(response.content_type, "application/json") + doc_id = response.json["data"]["id"] + self.assertIn(doc_id, response.headers["Location"]) + + self.set_status("active.tendering", 'end') + response = self.check_chronograph() + self.assertEqual(response.json["data"]["status"], "active.qualification") + response = self.app.patch_json( + "/tenders/{}/bids/{}/documents/{}?acc_token={}".format(self.tender_id, bid_id, doc_id, token), + {"data": {"description": "document description"}}, + status=403, + ) + self.assertEqual(response.status, "403 Forbidden") + self.assertEqual(response.content_type, "application/json") + self.assertEqual( + response.json["errors"][0]["description"], "Can't update document because award of bid is not in pending state" + ) + + response = self.app.put( + "/tenders/{}/bids/{}/documents/{}?acc_token={}".format(self.tender_id, bid_id, doc_id, token), + "content3", + content_type="application/msword", + status=403, + ) + self.assertEqual(response.status, "403 Forbidden") + self.assertEqual(response.content_type, "application/json") + self.assertEqual( + response.json["errors"][0]["description"], "Can't update document because award of bid is not in pending state" + ) + + response = self.app.post( + "/tenders/{}/bids/{}/documents?acc_token={}".format(self.tender_id, bid_id, token), + upload_files=[("file", "name.doc", "content")], + status=403, + ) + self.assertEqual(response.status, "403 Forbidden") + self.assertEqual(response.content_type, "application/json") + self.assertEqual( + response.json["errors"][0]["description"], "Can't add document because award of bid is not in pending state" + ) diff --git a/src/openprocurement/tender/pricequotation/tests/cancellation.py b/src/openprocurement/tender/pricequotation/tests/cancellation.py new file mode 100644 index 0000000000..f3fa0d9acc --- /dev/null +++ b/src/openprocurement/tender/pricequotation/tests/cancellation.py @@ -0,0 +1,86 @@ +# -*- coding: utf-8 -*- +import unittest + +from openprocurement.api.tests.base import snitch + +from openprocurement.tender.pricequotation.tests.base import ( + TenderContentWebTest, test_bids, + test_cancellation, +) +from openprocurement.tender.belowthreshold.tests.cancellation import\ + TenderCancellationDocumentResourceTestMixin +from openprocurement.tender.belowthreshold.tests.cancellation_blanks import ( + get_tender_cancellation, + get_tender_cancellations, + ) +from openprocurement.tender.pricequotation.tests.cancellation_blanks import ( + create_tender_cancellation, + create_tender_cancellation_invalid, + patch_tender_cancellation, +) + + +class TenderCancellationResourceTestMixin(object): + initial_status = 'active.tendering' + + test_create_tender_cancellation_invalid = snitch(create_tender_cancellation_invalid) + test_create_tender_cancellation = snitch(create_tender_cancellation) + test_patch_tender_cancellation = snitch(patch_tender_cancellation) + test_get_tender_cancellation = snitch(get_tender_cancellation) + test_get_tender_cancellations = snitch(get_tender_cancellations) + + + + +class TenderCancellationActiveTenderingResourceTest( + TenderContentWebTest, + TenderCancellationResourceTestMixin, +): + initial_status = "active.tendering" + initial_bids = test_bids + valid_reasonType_choices = ["noDemand", "unFixable", "expensesCut"] + + @property + def tender_token(self): + data = self.db.get(self.tender_id) + return data['owner_token'] + + +class TenderCancellationActiveQualificationResourceTest(TenderCancellationActiveTenderingResourceTest): + initial_status = "active.qualification" + initial_bids = test_bids + valid_reasonType_choices = ["noDemand", "unFixable", "expensesCut"] + + +class TenderCancellationActiveAwardedResourceTest(TenderCancellationActiveTenderingResourceTest): + initial_status = "active.awarded" + initial_bids = test_bids + valid_reasonType_choices = ["noDemand", "unFixable", "expensesCut"] + + +class TenderCancellationDocumentResourceTest(TenderContentWebTest, TenderCancellationDocumentResourceTestMixin): + def setUp(self): + super(TenderCancellationDocumentResourceTest, self).setUp() + # Create cancellation + cancellation = dict(**test_cancellation) + cancellation.update({ + "reasonType": "noDemand" + }) + + response = self.app.post_json( + "/tenders/{}/cancellations?acc_token={}".format(self.tender_id, self.tender_token), + {"data": cancellation}, + ) + cancellation = response.json["data"] + self.cancellation_id = cancellation["id"] + + +def suite(): + suite = unittest.TestSuite() + suite.addTest(unittest.makeSuite(TenderCancellationDocumentResourceTest)) + suite.addTest(unittest.makeSuite(TenderCancellationActiveTenderingResourceTest)) + return suite + + +if __name__ == "__main__": + unittest.main(defaultTest="suite") diff --git a/src/openprocurement/tender/pricequotation/tests/cancellation_blanks.py b/src/openprocurement/tender/pricequotation/tests/cancellation_blanks.py new file mode 100644 index 0000000000..299c0ea796 --- /dev/null +++ b/src/openprocurement/tender/pricequotation/tests/cancellation_blanks.py @@ -0,0 +1,196 @@ +# -*- coding: utf-8 -*- +from openprocurement.tender.pricequotation.tests.base import test_cancellation + + +def create_tender_cancellation_invalid(self): + cancellation = dict(**test_cancellation) + response = self.app.post_json( + "/tenders/some_id/cancellations", {"data": cancellation}, status=404 + ) + self.assertEqual(response.status, "404 Not Found") + self.assertEqual(response.content_type, "application/json") + self.assertEqual(response.json["status"], "error") + self.assertEqual( + response.json["errors"], [{u"description": u"Not Found", u"location": u"url", u"name": u"tender_id"}] + ) + + request_path = "/tenders/{}/cancellations?acc_token={}".format(self.tender_id, self.tender_token) + + response = self.app.post(request_path, "data", status=415) + self.assertEqual(response.status, "415 Unsupported Media Type") + self.assertEqual(response.content_type, "application/json") + self.assertEqual(response.json["status"], "error") + self.assertEqual( + response.json["errors"], + [ + { + u"description": u"Content-Type header should be one of ['application/json']", + u"location": u"header", + u"name": u"Content-Type", + } + ], + ) + + response = self.app.post(request_path, "data", content_type="application/json", status=422) + self.assertEqual(response.status, "422 Unprocessable Entity") + self.assertEqual(response.content_type, "application/json") + self.assertEqual(response.json["status"], "error") + self.assertEqual( + response.json["errors"], + [{u"description": u"No JSON object could be decoded", u"location": u"body", u"name": u"data"}], + ) + + response = self.app.post_json(request_path, "data", status=422) + self.assertEqual(response.status, "422 Unprocessable Entity") + self.assertEqual(response.content_type, "application/json") + self.assertEqual(response.json["status"], "error") + self.assertEqual( + response.json["errors"], [{u"description": u"Data not available", u"location": u"body", u"name": u"data"}] + ) + + response = self.app.post_json(request_path, {"not_data": {}}, status=422) + self.assertEqual(response.status, "422 Unprocessable Entity") + self.assertEqual(response.content_type, "application/json") + self.assertEqual(response.json["status"], "error") + self.assertEqual( + response.json["errors"], [{u"description": u"Data not available", u"location": u"body", u"name": u"data"}] + ) + + response = self.app.post_json(request_path, {"data": {}}, status=422) + self.assertEqual(response.status, "422 Unprocessable Entity") + self.assertEqual(response.content_type, "application/json") + self.assertEqual(response.json["status"], "error") + self.assertEqual( + response.json["errors"], + [ + {u"description": [u"This field is required."], u"location": u"body", u"name": u"reason"}, + ], + ) + + response = self.app.post_json(request_path, {"data": {"invalid_field": "invalid_value"}}, status=422) + self.assertEqual(response.status, "422 Unprocessable Entity") + self.assertEqual(response.content_type, "application/json") + self.assertEqual(response.json["status"], "error") + self.assertEqual( + response.json["errors"], [{u"description": u"Rogue field", u"location": u"body", u"name": u"invalid_field"}] + ) + + + +def create_tender_cancellation(self): + cancellation = dict(**test_cancellation) + + request_path = "/tenders/{}/cancellations?acc_token={}".format(self.tender_id, self.tender_token) + response = self.app.post_json(request_path, {"data": cancellation}) + self.assertEqual(response.status, "201 Created") + self.assertEqual(response.content_type, "application/json") + cancellation = response.json["data"] + self.assertEqual(cancellation["reason"], "cancellation reason") + self.assertIn("id", cancellation) + self.assertIn("date", cancellation) + self.assertIn(cancellation["id"], response.headers["Location"]) + + response = self.app.get("/tenders/{}".format(self.tender_id)) + self.assertEqual(response.status, "200 OK") + self.assertEqual(response.content_type, "application/json") + self.assertEqual(response.json["data"]["status"], self.initial_status) + response = self.app.post( + "/tenders/{}/cancellations/{}/documents?acc_token={}".format( + self.tender_id, cancellation["id"], self.tender_token + ), + upload_files=[("file", "name.doc", "content")], + ) + + cancellation.update({ + "status": "active" + }) + response = self.app.patch_json( + "/tenders/{}/cancellations/{}?acc_token={}".format(self.tender_id, cancellation['id'], self.tender_token), + {"data": cancellation}, + ) + self.assertEqual(response.status, "200 OK") + self.assertEqual(response.content_type, "application/json") + cancellation = response.json["data"] + self.assertEqual(cancellation["reason"], "cancellation reason") + self.assertEqual(cancellation["status"], "active") + self.assertIn("id", cancellation) + + response = self.app.get("/tenders/{}".format(self.tender_id)) + self.assertEqual(response.status, "200 OK") + self.assertEqual(response.content_type, "application/json") + self.assertEqual(response.json["data"]["status"], "cancelled") + if self.initial_status == "active.tendering": + self.assertNotIn("bids", response.json["data"]) + + response = self.app.post_json( + "/tenders/{}/cancellations?acc_token={}".format(self.tender_id, self.tender_token), + {"data": test_cancellation}, + status=403, + ) + self.assertEqual(response.status, "403 Forbidden") + self.assertEqual(response.content_type, "application/json") + self.assertEqual( + response.json["errors"][0]["description"], "Can't update tender in current (cancelled) status" + ) + + + +def patch_tender_cancellation(self): + tender = self.app.get('/tenders/{}'.format(self.tender_id)).json['data'] + status = tender['status'] + cancellation = dict(**test_cancellation) + + response = self.app.post_json( + "/tenders/{}/cancellations?acc_token={}".format(self.tender_id, self.tender_token), + {"data": cancellation}, + ) + self.assertEqual(response.status, "201 Created") + self.assertEqual(response.content_type, "application/json") + cancellation = response.json["data"] + + response = self.app.post( + "/tenders/{}/cancellations/{}/documents?acc_token={}".format( + self.tender_id, cancellation['id'], self.tender_token + ), + upload_files=[("file", "name.doc", "content")], + ) + + + response = self.app.patch_json( + "/tenders/{}/cancellations/{}?acc_token={}".format(self.tender_id, cancellation["id"], self.tender_token), + {"data": {"status": "active"}}, + ) + self.assertEqual(response.status, "200 OK") + self.assertEqual(response.content_type, "application/json") + self.assertEqual(response.json["data"]["status"], "active") + + response = self.app.get("/tenders/{}".format(self.tender_id)) + self.assertEqual(response.status, "200 OK") + self.assertEqual(response.content_type, "application/json") + self.assertEqual(response.json["data"]["status"], "cancelled") + if status == 'active.tendering': + self.assertNotIn("bids", response.json["data"]) + + response = self.app.patch_json( + "/tenders/{}/cancellations/some_id".format(self.tender_id), {"data": {"status": "active"}}, status=404 + ) + self.assertEqual(response.status, "404 Not Found") + self.assertEqual(response.content_type, "application/json") + self.assertEqual(response.json["status"], "error") + self.assertEqual( + response.json["errors"], [{u"description": u"Not Found", u"location": u"url", u"name": u"cancellation_id"}] + ) + + response = self.app.patch_json("/tenders/some_id/cancellations/some_id", {"data": {"status": "active"}}, status=404) + self.assertEqual(response.status, "404 Not Found") + self.assertEqual(response.content_type, "application/json") + self.assertEqual(response.json["status"], "error") + self.assertEqual( + response.json["errors"], [{u"description": u"Not Found", u"location": u"url", u"name": u"tender_id"}] + ) + + response = self.app.get("/tenders/{}/cancellations/{}".format(self.tender_id, cancellation["id"])) + self.assertEqual(response.status, "200 OK") + self.assertEqual(response.content_type, "application/json") + self.assertEqual(response.json["data"]["status"], "active") + self.assertEqual(response.json["data"]["reason"], "cancellation reason") diff --git a/src/openprocurement/tender/pricequotation/tests/chronograph.py b/src/openprocurement/tender/pricequotation/tests/chronograph.py new file mode 100644 index 0000000000..78a9fa03fb --- /dev/null +++ b/src/openprocurement/tender/pricequotation/tests/chronograph.py @@ -0,0 +1,28 @@ +# -*- coding: utf-8 -*- +import unittest + +from openprocurement.api.tests.base import snitch + +from openprocurement.tender.pricequotation.tests.base import TenderContentWebTest +from openprocurement.tender.pricequotation.tests.chronograph_blanks import ( + switch_to_qualification, + switch_to_unsuccessful, +) + + +class TenderChronographResourceTest(TenderContentWebTest): + initial_status = "active.tendering" + + test_switch_to_qualification = snitch(switch_to_qualification) + test_switch_to_unsuccessful = snitch(switch_to_unsuccessful) + + + +def suite(): + suite = unittest.TestSuite() + suite.addTest(unittest.makeSuite(TenderChronographResourceTest)) + return suite + + +if __name__ == "__main__": + unittest.main(defaultTest="suite") diff --git a/src/openprocurement/tender/pricequotation/tests/chronograph_blanks.py b/src/openprocurement/tender/pricequotation/tests/chronograph_blanks.py new file mode 100644 index 0000000000..34fff2fd4c --- /dev/null +++ b/src/openprocurement/tender/pricequotation/tests/chronograph_blanks.py @@ -0,0 +1,37 @@ +# -*- coding: utf-8 -*- +from openprocurement.tender.pricequotation.tests.data import ( + test_organization, + test_requirement_response_valid +) + + +# TenderSwitchQualificationResourceTest +def switch_to_qualification(self): + response = self.app.post_json( + "/tenders/{}/bids".format(self.tender_id), + {"data": { + "tenderers": [test_organization], "value": {"amount": 500}, + "requirementResponses": test_requirement_response_valid + }}, + ) + + bid = response.json["data"] + bid_id = bid["id"] + self.set_status("active.tendering", 'end') + + response = self.check_chronograph() + self.assertEqual(response.json["data"]["status"], "active.qualification") + self.assertEqual(len(response.json["data"]["awards"]), 1) + self.assertEqual(response.json["data"]["awards"][0]['bid_id'], bid_id) + + +# TenderSwitchUnsuccessfulResourceTest +def switch_to_unsuccessful(self): + self.set_status("active.tendering", 'end') + response = self.check_chronograph() + self.assertEqual(response.json["data"]["status"], "unsuccessful") + if self.initial_lots: + self.assertEqual( + set([i["status"] for i in response.json["data"]["lots"]]), + set(["unsuccessful"]) + ) diff --git a/src/openprocurement/tender/pricequotation/tests/contract.py b/src/openprocurement/tender/pricequotation/tests/contract.py new file mode 100644 index 0000000000..4102a1c646 --- /dev/null +++ b/src/openprocurement/tender/pricequotation/tests/contract.py @@ -0,0 +1,85 @@ +# -*- coding: utf-8 -*- +import unittest +from openprocurement.api.tests.base import snitch +from openprocurement.tender.pricequotation.tests.base import ( + TenderContentWebTest, + test_bids, + ) +from openprocurement.tender.belowthreshold.tests.contract import ( + TenderContractResourceTestMixin, + TenderContractDocumentResourceTestMixin + ) +from openprocurement.tender.belowthreshold.tests.contract_blanks import ( + create_tender_contract, + create_tender_contract_in_complete_status, + patch_tender_contract_value, + ) +from openprocurement.tender.pricequotation.tests.contract_blanks import ( + patch_tender_contract, + patch_tender_contract_value_vat_not_included, + ) + + +class TenderContractResourceTest(TenderContentWebTest, + TenderContractResourceTestMixin): + initial_status = "active.awarded" + initial_bids = test_bids + + def setUp(self): + super(TenderContractResourceTest, self).setUp() + self.award_id = self.award_ids[-1] + resp = self.app.get( + "/tenders/{}/awards/{}".format(self.tender_id, self.award_id), + ) + award = resp.json["data"] + self.award_value = award["value"] + self.award_suppliers = award["suppliers"] + self.award_items = award["items"] + + test_create_tender_contract = snitch(create_tender_contract) + test_create_tender_contract_in_complete_status = snitch( + create_tender_contract_in_complete_status + ) + test_patch_tender_contract = snitch(patch_tender_contract) + test_patch_tender_contract_value = snitch(patch_tender_contract_value) + + +class TenderContractVATNotIncludedResourceTest(TenderContentWebTest, + TenderContractResourceTestMixin): + initial_status = "active.awarded" + initial_bids = test_bids + + def setUp(self): + super(TenderContractVATNotIncludedResourceTest, self).setUp() + self.award_id = self.award_ids[-1] + resp = self.app.get( + "/tenders/{}/awards/{}".format(self.tender_id, self.award_id), + ) + award = resp.json["data"] + self.award_value = award["value"] + self.award_suppliers = award["suppliers"] + self.award_items = award["items"] + + test_patch_tender_contract_value_vat_not_included = snitch( + patch_tender_contract_value_vat_not_included + ) + + +class TenderContractDocumentResourceTest(TenderContentWebTest, + TenderContractDocumentResourceTestMixin): + initial_status = "active.awarded" + initial_bids = test_bids + + def setUp(self): + super(TenderContractDocumentResourceTest, self).setUp() + + +def suite(): + suite = unittest.TestSuite() + suite.addTest(unittest.makeSuite(TenderContractResourceTest)) + suite.addTest(unittest.makeSuite(TenderContractDocumentResourceTest)) + return suite + + +if __name__ == "__main__": + unittest.main(defaultTest="suite") diff --git a/src/openprocurement/tender/pricequotation/tests/contract_blanks.py b/src/openprocurement/tender/pricequotation/tests/contract_blanks.py new file mode 100644 index 0000000000..e1784b923d --- /dev/null +++ b/src/openprocurement/tender/pricequotation/tests/contract_blanks.py @@ -0,0 +1,211 @@ +# -*- coding: utf-8 -*- +from datetime import timedelta +from openprocurement.api.utils import get_now + + +def patch_tender_contract(self): + self.app.authorization = ("Basic", ("token", "")) + response = self.app.get("/tenders/{}/contracts".format(self.tender_id)) + contract = response.json["data"][0] + + response = self.app.patch_json( + "/tenders/{}/contracts/{}?acc_token={}".format(self.tender_id, contract["id"], self.tender_token), + {"data": {"value": {"amountNet": contract["value"]["amount"] - 1}}}, + ) + self.assertEqual(response.status, "200 OK") + + self.app.patch_json( + "/tenders/{}/contracts/{}?acc_token={}".format(self.tender_id, contract["id"], self.tender_token), + { + "data": { + "contractID": "myselfID", + "items": [{"description": "New Description"}], + "suppliers": [{"name": "New Name"}], + } + }, + ) + + response = self.app.get("/tenders/{}/contracts/{}".format(self.tender_id, contract["id"])) + self.assertEqual(response.json["data"]["contractID"], contract["contractID"]) + self.assertEqual(response.json["data"]["items"], contract["items"]) + self.assertEqual(response.json["data"]["suppliers"], contract["suppliers"]) + + response = self.app.patch_json( + "/tenders/{}/contracts/{}?acc_token={}".format(self.tender_id, contract["id"], self.tender_token), + {"data": {"value": {"currency": "USD"}}}, + status=403, + ) + self.assertEqual(response.status, "403 Forbidden") + self.assertEqual(response.json["errors"][0]["description"], "Can't update currency for contract value") + + one_hour_in_furure = (get_now() + timedelta(hours=1)).isoformat() + response = self.app.patch_json( + "/tenders/{}/contracts/{}?acc_token={}".format(self.tender_id, contract["id"], self.tender_token), + {"data": {"dateSigned": one_hour_in_furure}}, + status=422, + ) + self.assertEqual(response.status, "422 Unprocessable Entity") + self.assertEqual( + response.json["errors"], + [ + { + u"description": [u"Contract signature date can't be in the future"], + u"location": u"body", + u"name": u"dateSigned", + } + ], + ) + + custom_signature_date = get_now().isoformat() + response = self.app.patch_json( + "/tenders/{}/contracts/{}?acc_token={}".format(self.tender_id, contract["id"], self.tender_token), + {"data": {"dateSigned": custom_signature_date}}, + ) + self.assertEqual(response.status, "200 OK") + + response = self.app.patch_json( + "/tenders/{}/contracts/{}?acc_token={}".format(self.tender_id, contract["id"], self.tender_token), + {"data": {"status": "active"}}, + ) + self.assertEqual(response.status, "200 OK") + self.assertEqual(response.content_type, "application/json") + self.assertEqual(response.json["data"]["status"], "active") + + response = self.app.patch_json( + "/tenders/{}/contracts/{}?acc_token={}".format(self.tender_id, contract["id"], self.tender_token), + {"data": {"value": {"amount": 232}}}, + status=403, + ) + self.assertEqual(response.status, "403 Forbidden") + self.assertEqual( + response.json["errors"][0]["description"], "Can't update contract in current (complete) tender status" + ) + + response = self.app.patch_json( + "/tenders/{}/contracts/{}?acc_token={}".format(self.tender_id, contract["id"], self.tender_token), + {"data": {"contractID": "myselfID"}}, + status=403, + ) + self.assertEqual(response.status, "403 Forbidden") + self.assertEqual( + response.json["errors"][0]["description"], "Can't update contract in current (complete) tender status" + ) + + response = self.app.patch_json( + "/tenders/{}/contracts/{}?acc_token={}".format(self.tender_id, contract["id"], self.tender_token), + {"data": {"items": [{"description": "New Description"}]}}, + status=403, + ) + self.assertEqual(response.status, "403 Forbidden") + self.assertEqual( + response.json["errors"][0]["description"], "Can't update contract in current (complete) tender status" + ) + + response = self.app.patch_json( + "/tenders/{}/contracts/{}?acc_token={}".format(self.tender_id, contract["id"], self.tender_token), + {"data": {"suppliers": [{"name": "New Name"}]}}, + status=403, + ) + self.assertEqual(response.status, "403 Forbidden") + self.assertEqual( + response.json["errors"][0]["description"], "Can't update contract in current (complete) tender status" + ) + + response = self.app.patch_json( + "/tenders/{}/contracts/{}?acc_token={}".format(self.tender_id, contract["id"], self.tender_token), + {"data": {"status": "active"}}, + status=403, + ) + self.assertEqual(response.status, "403 Forbidden") + self.assertEqual(response.content_type, "application/json") + self.assertEqual( + response.json["errors"][0]["description"], "Can't update contract in current (complete) tender status" + ) + + response = self.app.patch_json( + "/tenders/{}/contracts/some_id?acc_token={}".format(self.tender_id, self.tender_token), + {"data": {"status": "active"}}, + status=404, + ) + self.assertEqual(response.status, "404 Not Found") + self.assertEqual(response.content_type, "application/json") + self.assertEqual(response.json["status"], "error") + self.assertEqual( + response.json["errors"], [{u"description": u"Not Found", u"location": u"url", u"name": u"contract_id"}] + ) + + response = self.app.patch_json( + "/tenders/some_id/contracts/some_id?acc_token={}".format(self.tender_token), + {"data": {"status": "active"}}, + status=404, + ) + self.assertEqual(response.status, "404 Not Found") + self.assertEqual(response.content_type, "application/json") + self.assertEqual(response.json["status"], "error") + self.assertEqual( + response.json["errors"], [{u"description": u"Not Found", u"location": u"url", u"name": u"tender_id"}] + ) + + response = self.app.get("/tenders/{}/contracts/{}".format(self.tender_id, contract["id"])) + self.assertEqual(response.status, "200 OK") + self.assertEqual(response.content_type, "application/json") + self.assertEqual(response.json["data"]["status"], "active") + self.assertEqual(response.json["data"]["contractID"], contract["contractID"]) + self.assertEqual(response.json["data"]["items"], contract["items"]) + self.assertEqual(response.json["data"]["suppliers"], contract["suppliers"]) + self.assertEqual(response.json["data"]["dateSigned"], custom_signature_date) + + +def patch_tender_contract_value_vat_not_included(self): + response = self.app.get("/tenders/{}/contracts".format(self.tender_id)) + contract = response.json["data"][0] + + response = self.app.patch_json( + "/tenders/{}/contracts/{}?acc_token={}".format(self.tender_id, contract["id"], self.tender_token), + {"data": {"value": {"valueAddedTaxIncluded": False, 'amountNet': contract['value']['amount']}}}, + ) + self.assertEqual(response.status, "200 OK") + + + response = self.app.patch_json( + "/tenders/{}/contracts/{}?acc_token={}".format(self.tender_id, contract["id"], self.tender_token), + {"data": {"value": {"currency": "USD"}}}, + status=403, + ) + self.assertEqual(response.status, "403 Forbidden") + self.assertEqual(response.json["errors"][0]["description"], "Can't update currency for contract value") + + response = self.app.patch_json( + "/tenders/{}/contracts/{}?acc_token={}".format(self.tender_id, contract["id"], self.tender_token), + {"data": {"value": {"amount": 467}}}, + status=403, + ) + self.assertEqual(response.status, "403 Forbidden") + self.assertEqual(response.json["errors"][0]["description"], "Amount and amountNet should be equal") + + response = self.app.patch_json( + "/tenders/{}/contracts/{}?acc_token={}".format(self.tender_id, contract["id"], self.tender_token), + {"data": {"value": {"amount": 22600, "amountNet": 22600}}}, + status=403, + ) + self.assertEqual(response.status, "403 Forbidden") + self.assertEqual(response.json["errors"][0]["description"], "Amount should be less or equal to awarded amount") + + response = self.app.patch_json( + "/tenders/{}/contracts/{}?acc_token={}".format(self.tender_id, contract["id"], self.tender_token), + {"data": {"value": {"amount": 400, "amountNet": 400}}}, + ) + self.assertEqual(response.status, "200 OK") + self.assertEqual(response.json["data"]["value"]["amount"], 400) + self.assertEqual(response.json["data"]["value"]["amountNet"], 400) + + response = self.app.patch_json( + "/tenders/{}/contracts/{}?acc_token={}".format(self.tender_id, contract["id"], self.tender_token), + {"data": {"value": {"valueAddedTaxIncluded": True}}}, + status=403, + ) + self.assertEqual(response.status, "403 Forbidden") + self.assertEqual( + response.json["errors"][0]["description"], + "Amount should be greater than amountNet and differ by no more than 20.0%", + ) diff --git a/src/openprocurement/tender/pricequotation/tests/data.py b/src/openprocurement/tender/pricequotation/tests/data.py new file mode 100644 index 0000000000..d48c462f7e --- /dev/null +++ b/src/openprocurement/tender/pricequotation/tests/data.py @@ -0,0 +1,758 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals +from copy import deepcopy +from datetime import timedelta +from openprocurement.api.utils import get_now +from openprocurement.tender.pricequotation.constants import PMT +from openprocurement.api.constants import SANDBOX_MODE + + +now = get_now() + + +PERIODS = { + "active.tendering": { + "start": { + "tenderPeriod": { + "startDate": -timedelta(), + "endDate": timedelta(days=6) + }, + }, + "end": { + "tenderPeriod": { + "startDate": - timedelta(days=6), + "endDate": timedelta() + }, + }, + }, + "active.qualification": { + "start": { + "tenderPeriod": { + "startDate": - timedelta(days=10), + "endDate": - timedelta(days=1), + }, + "awardPeriod": {"startDate": timedelta()}, + }, + "end": { + "tenderPeriod": { + "startDate": - timedelta(days=10), + "endDate": - timedelta(days=1), + }, + "awardPeriod": {"startDate": timedelta()}, + }, + }, + "active.awarded": { + "start": { + "tenderPeriod": { + "startDate": - timedelta(days=10), + "endDate": - timedelta(days=1), + }, + "awardPeriod": {"startDate": timedelta(), "endDate": timedelta()}, + }, + "end": { + "tenderPeriod": { + "startDate": - timedelta(days=10), + "endDate": - timedelta(days=2), + }, + "awardPeriod": { + "startDate": - timedelta(days=1), + "endDate": - timedelta(days=1), + }, + }, + }, + "complete": { + "start": { + "tenderPeriod": { + "startDate": - timedelta(days=10), + "endDate": - timedelta(days=1) + }, + "awardPeriod": { + "startDate": - timedelta(days=1), + "endDate": -timedelta(), + }, + } + }, +} + + +test_requirement_response_valid = [ + { + "value": "23.8", + 'requirement': { + 'id': "655360-0001-001-01" + } + }, + { + "value": "1920x1080", + 'requirement': { + 'id': "655360-0002-001-01" + } + }, + { + "value": "16:9", + 'requirement': { + 'id': "655360-0003-001-01" + } + }, + { + "value": 250, + 'requirement': { + 'id': "655360-0004-001-01" + } + }, + { + "value": "1000:1", + 'requirement': { + 'id': "655360-0005-001-01" + } + }, + { + "value": 1, + 'requirement': { + 'id': "655360-0006-001-01" + } + }, + { + "value": 1, + 'requirement': { + 'id': "655360-0007-001-01" + } + }, + { + "value": "HDMI", + 'requirement': { + 'id': "655360-0008-001-01" + } + }, + { + "value": 36, + 'requirement': { + 'id': "655360-0009-001-01" + } + } +] + +test_organization = { + "name": u"Державне управління справами", + "identifier": {"scheme": u"UA-EDR", "id": u"00037256", "uri": u"http://www.dus.gov.ua/"}, + "address": { + "countryName": u"Україна", + "postalCode": u"01220", + "region": u"м. Київ", + "locality": u"м. Київ", + "streetAddress": u"вул. Банкова, 11, корпус 1", + }, + "contactPoint": {"name": u"Державне управління справами", "telephone": u"0440000000"}, + "scale": "micro", +} + + +test_milestones = [ + { + "id": "a" * 32, + "title": "signingTheContract", + "code": "prepayment", + "type": "financing", + "duration": {"days": 2, "type": "banking"}, + "sequenceNumber": 0, + "percentage": 45.55, + }, + { + "title": "deliveryOfGoods", + "code": "postpayment", + "type": "financing", + "duration": {"days": 900, "type": "calendar"}, + "sequenceNumber": 0, + "percentage": 54.45, + }, +] + +test_author = test_organization.copy() +del test_author["scale"] + +test_procuringEntity = test_author.copy() +test_procuringEntity["kind"] = "general" + +test_item = { + "description": u"Комп’ютерне обладнання", + "classification": {"scheme": u"ДК021", "id": u"44617100-9", "description": u"Cartons"}, + "additionalClassifications": [ + {"scheme": u"INN", "id": u"17.21.1", "description": u"папір і картон гофровані, паперова й картонна тара"} + ], + "quantity": 1, + "deliveryDate": { + "startDate": (now + timedelta(days=2)).isoformat(), + "endDate": (now + timedelta(days=5)).isoformat(), + }, + "deliveryAddress": { + "countryName": u"Україна", + "postalCode": "79000", + "region": u"м. Київ", + "locality": u"м. Київ", + "streetAddress": u"вул. Банкова 1", + }, +} + +test_tender_data = { + "title": u"Комп’ютерне обладнання", + "profile": "655360-30230000-889652-40000777", + "mainProcurementCategory": "goods", + "procuringEntity": test_procuringEntity, + "items": [deepcopy(test_item)], + "value": {"amount": 22000, "currency": "UAH"}, + "tenderPeriod": {"endDate": (now + timedelta(days=14)).isoformat()}, + "procurementMethodType": PMT, + "procurementMethod": 'selective', +} +if SANDBOX_MODE: + test_tender_data["procurementMethodDetails"] = "quick, accelerator=1440" + +test_bids = [ + {"tenderers": [test_organization], "value": {"amount": 469, "currency": "UAH", "valueAddedTaxIncluded": True}, "requirementResponses": test_requirement_response_valid}, + {"tenderers": [test_organization], "value": {"amount": 479, "currency": "UAH", "valueAddedTaxIncluded": True}, "requirementResponses": test_requirement_response_valid}, +] +bid_with_docs = deepcopy(test_bids[1]) +bid_with_docs["documents"] = [ + { + 'title': u'Proposal_part1.pdf', + 'url': u"http://broken1.ds", + 'hash': 'md5:' + '0' * 32, + 'format': 'application/pdf', + }, + { + 'title': u'Proposal_part2.pdf', + 'url': u"http://broken2.ds", + 'hash': 'md5:' + '0' * 32, + 'format': 'application/pdf', + } +] + +test_cancellation = { + "reason": "cancellation reason", + "reasonType": "noDemand", + "cancellationOf": "tender", +} + + +test_shortlisted_firms = [ + { + "address": { + "countryName": u"Україна", + "locality": u"м.Київ", + "postalCode": "01100", + "region": u"Київська область", + "streetAddress": u"бул.Дружби Народів, 8" + }, + "contactPoint": { + "email": "contact@pixel.pix", + "name": u"Оксана Піксель", + "telephone": "(067) 123-45-67" + }, + "id": "UA-EDR-12345678", + "identifier": { + "id": "12345678", + "legalName": u"Товариство з обмеженою відповідальністю «Пікселі»", + "scheme": "UA-EDR" + }, + "name": u"Товариство з обмеженою відповідальністю «Пікселі»", + "scale": "large", + "status": "active" + }, + { + "address": { + "countryName": u"Україна", + "locality": u"м.Тернопіль", + "postalCode": "46000", + "region": u"Тернопільська область", + "streetAddress": u"вул. Кластерна, 777-К" + }, + "contactPoint": { + "email": "info@shteker.pek", + "name": u"Олег Штекер", + "telephone": "(095) 123-45-67" + }, + "id": "UA-EDR-87654321", + "identifier": { + "id": "87654321", + "legalName": u"Товариство з обмеженою відповідальністю «Штекер-Пекер»", + "scheme": "UA-EDR" + }, + "name": u"Товариство з обмеженою відповідальністю «Штекер-Пекер»", + "scale": "large", + "status": "active" + } +] + +test_short_profile = { + "classification": { + "description": u"Комп’ютерне обладнанн", + "id": "30230000-0", + "scheme": u"ДК021" + }, + "id": "655360-30230000-889652-40000777", + "unit": { + "code": "H87", + "name": u"штук" + }, + "criteria": [ + { + "description": u"Діагональ екрану", + "id": "655360-0001", + "requirementGroups": [ + { + "description": u"Діагональ екрану, не менше 23.8 дюймів", + "id": "655360-0001-001", + "requirements": [ + { + "dataType": "number", + "id": "655360-0001-001-01", + "minValue": "23.8", + "title": u"Діагональ екрану", + "unit": { + "code": "INH", + "name": u"дюйм" + } + } + ] + } + ], + "title": u"Діагональ екрану" + }, + { + "description": u"Роздільна здатність", + "id": "655360-0002", + "requirementGroups": [ + { + "description": u"Роздільна здатність - 1920x1080", + "id": "655360-0002-001", + "requirements": [ + { + "dataType": "string", + "expectedValue": "1920x1080", + "id": "655360-0002-001-01", + "title": u"Роздільна здатність" + } + ] + } + ], + "title": u"Роздільна здатність" + }, + { + "description": u"Співвідношення сторін", + "id": "655360-0003", + "requirementGroups": [ + { + "description": u"Співвідношення сторін", + "id": "655360-0003-001", + "requirements": [ + { + "dataType": "string", + "expectedValue": "16:9", + "id": "655360-0003-001-01", + "title": u"Співвідношення сторін" + } + ] + } + ], + "title": u"Співвідношення сторін" + }, + { + "description": u"Яскравість дисплея", + "id": "655360-0004", + "requirementGroups": [ + { + "description": u"Яскравість дисплея, не менше 250 кд/м²", + "id": "655360-0004-001", + "requirements": [ + { + "dataType": "integer", + "id": "655360-0004-001-01", + "maxValue": 250, + "title": "Яскравість дисплея", + "unit": { + "code": "A24", + "name": u"кд/м²" + } + } + ] + } + ], + "title": u"Яскравість дисплея" + }, + { + "description": u"Контрастність (статична)", + "id": "655360-0005", + "requirementGroups": [ + { + "description": u"Контрастність (статична) - 1000:1", + "id": "655360-0005-001", + "requirements": [ + { + "dataType": "string", + "expectedValue": "1000:1", + "id": "655360-0005-001-01", + "title": u"Контрастність (статична)" + } + ] + }, + { + "description": u"Контрастність (статична) - 3000:1", + "id": "655360-0005-002", + "requirements": [ + { + "dataType": "string", + "expectedValue": "3000:1", + "id": "655360-0005-002-01", + "title": u"Контрастність (статична)" + } + ] + } + ], + "title": u"Контрастність (статична)" + }, + { + "description": u"Кількість портів HDMI", + "id": "655360-0006", + "requirementGroups": [ + { + "description": u"Кількість портів HDMI, не менше 1 шт.", + "id": "655360-0006-001", + "requirements": [ + { + "dataType": "integer", + "id": "655360-0006-001-01", + "minValue": 1, + "title": u"Кількість портів HDMI", + "unit": { + "code": "H87", + "name": u"штук" + } + } + ] + } + ], + "title": u"Кількість портів HDMI" + }, + { + "description": u"Кількість портів D-sub", + "id": "655360-0007", + "requirementGroups": [ + { + "description": u"Кількість портів D-sub, не менше 1 шт.", + "id": "655360-0007-001", + "requirements": [ + { + "dataType": "integer", + "id": "655360-0007-001-01", + "minValue": 1, + "title": u"Кількість портів D-sub", + "unit": { + "code": "H87", + "name": u"штук" + } + } + ] + } + ], + "title": u"Кількість портів D-sub" + }, + { + "description": u"Кабель для під’єднання", + "id": "655360-0008", + "requirementGroups": [ + { + "description": u"Кабель для під’єднання", + "id": "655360-0008-001", + "requirements": [ + { + "dataType": "string", + "expectedValue": "HDMI", + "id": "655360-0008-001-01", + "title": u"Кабель для під’єднання" + } + ] + } + ], + "title": u"Кабель для під’єднання" + }, + { + "description": u"Строк дії гарантії", + "id": "655360-0009", + "requirementGroups": [ + { + "description": u"Гарантія, не менше 36 місяців", + "id": "655360-0009-001", + "requirements": [ + { + "dataType": "integer", + "id": "655360-0009-001-01", + "minValue": 36, + "title": u"Гарантія", + "unit": { + "code": "MON", + "name": u"місяців" + } + } + ] + } + ], + "title": u"Гарантія" + } + ], + "value": { + "amount": 500, + "currency": "UAH", + "valueAddedTaxIncluded": True + } +} + + +test_criteria_1 = [ + { + "description": u"Форма випуску", + "id": "400496-0001", + "requirementGroups": [ + { + "description": u"Форма випуску", + "id": "400496-0001-001", + "requirements": [ + { + "dataType": "string", + "expectedValue": u"Розчин для інфузій", + "id": "400496-0001-001-01", + "title": u"Форма випуску" + } + ] + } + ], + "title": u"Форма випуску" + }, + { + "description": u"Доза діючої речовини", + "id": "400496-0002", + "requirementGroups": [ + { + "description": u"Доза діючої речовини", + "id": "400496-0002-001", + "requirements": [ + { + "dataType": "integer", + "minValue": 5, + "id": "400496-0002-001-01", + "title": u"Доза діючої речовини", + "unit": { + "code": "GL", + "name": "г/л" + } + } + ] + } + ], + "title": u"Доза діючої речовини" + } +] + +test_criteria_2 = [ + { + "description": u"Форма випуску", + "id": "400496-0001", + "requirementGroups": [ + { + "description": u"Форма випуску", + "id": "400496-0001-001", + "requirements": [ + { + "dataType": "string", + "expectedValue": u"Розчин", + "id": "400496-0001-001-01", + "title": u"Форма випуску" + } + ] + }, + { + "description": u"Форма випуску", + "id": "400496-0001-002", + "requirements": [ + { + "dataType": "string", + "expectedValue": u"Порошок", + "id": "400496-0001-002-01", + "title": u"Форма випуску" + } + ] + } + ], + "title": u"Форма випуску" + } +] + + +test_criteria_3 = [ + { + "description": u"Форма випуску", + "id": "400496-0001", + "requirementGroups": [ + { + "description": u"Форма випуску", + "id": "400496-0001-001", + "requirements": [ + { + "dataType": "string", + "expectedValue": u"Розчин", + "id": "400496-0001-001-01", + "title": u"Форма випуску" + }, + { + "dataType": "integer", + "expectedValue": 500, + "id": "400496-0001-001-02", + "title": u"Форма випуску", + "unit": { + "code": "MLT", + "name": u"мл" + } + } + ] + }, + { + "description": u"Форма випуску", + "id": "400496-0001-002", + "requirements": [ + { + "dataType": "string", + "expectedValue": u"Порошок", + "id": "400496-0001-002-01", + "title": u"Форма випуску" + } + ] + } + ], + "title": u"Форма випуску" + }] + + +test_criteria_4 = [ + { + "description": u"Форма випуску", + "title": u"Форма випуску", + "id": "400496-0001", + "requirementGroups": [ + { + "description": u"Форма випуску", + "id": "400496-0001-001", + "requirements": [ + { + "dataType": "string", + "expectedValue": u"Розчин", + "id": "400496-0001-001-01", + "title": u"Форма випуску" + }, + { + "dataType": "integer", + "expectedValue": 500, + "id": "400496-0001-001-02", + "title": u"Форма випуску", + "unit": { + "code": "MLT", + "name": u"мл" + }, + }, + { + "dataType": "integer", + "expectedValue": 1, + "id": "400496-0001-001-03", + "title": u"Форма випуску", + "unit": { + "code": "H87", + "name": u"ШТ" + } + } + ] + } + ] + } +] + + +test_response_1 = [ + { + "requirement": { + "id": "400496-0001-001-01" + }, + "value": u"Розчин для інфузій" + }, + { + "requirement": { + "id": "400496-0002-001-01" + }, + "value": 5 + } +] + + +test_response_2_1 = [ + { + "requirement": { + "id": "400496-0001-001-01" + }, + "value": u"Розчин" + } +] + + +test_response_2_2 = [ + { + "requirement": { + "id": "400496-0001-002-01" + }, + "value": u"Порошок" + } +] + + +test_response_3_1 = [ + { + "requirement": { + "id": "400496-0001-001-01" + }, + "value": u"Розчин" + }, + { + "requirement": { + "id": "400496-0001-001-02" + }, + "value": 500 + } +] + + +test_response_3_2 = [ + { + "requirement": { + "id": "400496-0001-002-01" + }, + "value": u"Порошок" + } +] + + +test_response_4 = [ + { + "requirement": { + "id": "400496-0001-001-01" + }, + "value": u"Порошок" + }, + { + "requirement": { + "id": "400496-0001-001-02" + }, + "value": 500 + }, + { + "requirement": { + "id": "400496-0001-001-03" + }, + "value": 1 + } +] diff --git a/src/openprocurement/tender/pricequotation/tests/document.py b/src/openprocurement/tender/pricequotation/tests/document.py new file mode 100644 index 0000000000..43595f9b56 --- /dev/null +++ b/src/openprocurement/tender/pricequotation/tests/document.py @@ -0,0 +1,37 @@ +# -*- coding: utf-8 -*- +import unittest + +from openprocurement.api.tests.base import snitch + +from openprocurement.tender.pricequotation.tests.base import TenderContentWebTest +from openprocurement.tender.belowthreshold.tests.document import ( + TenderDocumentResourceTestMixin, + TenderDocumentWithDSResourceTestMixin +) +from openprocurement.tender.belowthreshold.tests.document_blanks import\ + create_tender_document_error +from openprocurement.tender.pricequotation.tests.document_blanks import ( + create_document_active_tendering_status, +) + + +class TenderDocumentResourceTest(TenderContentWebTest, TenderDocumentResourceTestMixin): + """""" + test_create_document_active_tendering_status = snitch(create_document_active_tendering_status) + + +class TenderDocumentWithDSResourceTest(TenderDocumentResourceTest, TenderDocumentWithDSResourceTestMixin): + docservice = True + + test_create_tender_document_error = snitch(create_tender_document_error) + + +def suite(): + suite = unittest.TestSuite() + suite.addTest(unittest.makeSuite(TenderDocumentResourceTest)) + suite.addTest(unittest.makeSuite(TenderDocumentWithDSResourceTest)) + return suite + + +if __name__ == "__main__": + unittest.main(defaultTest="suite") diff --git a/src/openprocurement/tender/pricequotation/tests/document_blanks.py b/src/openprocurement/tender/pricequotation/tests/document_blanks.py new file mode 100644 index 0000000000..55c17762b9 --- /dev/null +++ b/src/openprocurement/tender/pricequotation/tests/document_blanks.py @@ -0,0 +1,23 @@ +# -*- coding: utf-8 -*- +from email.header import Header + +# TenderDocumentResourceTest +from mock import patch +from openprocurement.tender.core.tests.base import bad_rs_request, srequest + + +def create_document_active_tendering_status(self): + + self.set_status("active.tendering") + # TODO: check if document should not be updated in this |\ status, + # because now there is no status validation + + response = self.app.post( + "/tenders/{}/documents?acc_token={}".format(self.tender_id, self.tender_token), + upload_files=[("file", u"укр.doc", "content")], + ) + self.assertEqual(response.status, "201 Created") + self.assertEqual(response.content_type, "application/json") + # self.assertEqual( + # response.json["errors"][0]["description"], "Can't add document in current (active.tendering) tender status" + # ) diff --git a/src/openprocurement/tender/pricequotation/tests/main.py b/src/openprocurement/tender/pricequotation/tests/main.py new file mode 100644 index 0000000000..51e5b87d45 --- /dev/null +++ b/src/openprocurement/tender/pricequotation/tests/main.py @@ -0,0 +1,19 @@ +# -*- coding: utf-8 -*- + +import unittest + +from openprocurement.tender.pricequotation.tests import\ + award, bid, document, tender + + +def suite(): + suite = unittest.TestSuite() + suite.addTest(award.suite()) + suite.addTest(bid.suite()) + suite.addTest(document.suite()) + suite.addTest(tender.suite()) + return suite + + +if __name__ == "__main__": + unittest.main(defaultTest="suite") diff --git a/src/openprocurement/tender/pricequotation/tests/tender.py b/src/openprocurement/tender/pricequotation/tests/tender.py new file mode 100644 index 0000000000..1baff78bd2 --- /dev/null +++ b/src/openprocurement/tender/pricequotation/tests/tender.py @@ -0,0 +1,127 @@ +# -*- coding: utf-8 -*- +import os +import unittest + +from openprocurement.api.tests.base import snitch +from openprocurement.tender.pricequotation.tests.base import ( + BaseTenderWebTest, + TenderContentWebTest, + test_tender_data, + BaseApiWebTest, +) + +from openprocurement.tender.pricequotation.tests.tender_blanks import ( + simple_add_tender, + + listing, + listing_draft, + listing_changes, + + one_valid_bid_tender, + one_invalid_bid_tender, + first_bid_tender, + + create_tender, + create_tender_draft, + create_tender_generated, + create_tender_invalid, + create_tender_with_inn, + + invalid_tender_conditions, + patch_tender, + patch_tender_by_pq_bot, + tender_owner_can_change_in_draft, + tender_owner_cannot_change_in_draft, + required_field_deletion, + tender_Administrator_change, + tender_fields, + lost_contract_for_active_award, + create_tender_in_not_draft_status, +) +from openprocurement.tender.belowthreshold.tests.tender_blanks import ( + guarantee, + create_tender_with_inn_before, + tender_milestones_required, + coordinates_reg_exp, + get_tender, + tender_not_found, + dateModified_tender, + patch_not_author, + tender_items_float_quantity, + patch_tender_jsonpatch, + tender_funders, + tender_with_main_procurement_category, + create_tender_with_inn_before, + tender_token_invalid, +) + +class TenderResourceTestMixin(object): + test_listing_changes = snitch(listing_changes) + test_listing_draft = snitch(listing_draft) + test_listing = snitch(listing) + test_create_tender_draft = snitch(create_tender_draft) + test_tender_owner_can_change_in_draft = snitch(tender_owner_can_change_in_draft) + test_tender_owner_cannot_change_in_draft = snitch(tender_owner_cannot_change_in_draft) + test_create_tender = snitch(create_tender) + test_get_tender = snitch(get_tender) + test_dateModified_tender = snitch(dateModified_tender) + test_tender_not_found = snitch(tender_not_found) + test_tender_Administrator_change = snitch(tender_Administrator_change) + test_patch_not_author = snitch(patch_not_author) + test_tender_funders = snitch(tender_funders) + test_tender_with_main_procurement_category = snitch(tender_with_main_procurement_category) + test_tender_token_invalid = snitch(tender_token_invalid) + test_create_tender_in_not_draft_status = snitch(create_tender_in_not_draft_status) + + +class TenderTest(BaseApiWebTest): + initial_data = test_tender_data + + test_simple_add_tender = snitch(simple_add_tender) + + +class TestCoordinatesRegExp(unittest.TestCase): + + test_coordinates_reg_exp = snitch(coordinates_reg_exp) + + +class TenderResourceTest(BaseTenderWebTest, TenderResourceTestMixin): + initial_data = test_tender_data + initial_auth = ("Basic", ("broker", "")) + + Test_guarantee = snitch(guarantee) + test_create_tender_invalid = snitch(create_tender_invalid) + test_create_tender_generated = snitch(create_tender_generated) + test_tender_fields = snitch(tender_fields) + test_tender_items_float_quantity = snitch(tender_items_float_quantity) + test_patch_tender_jsonpatch = snitch(patch_tender_jsonpatch) + test_patch_tender = snitch(patch_tender) + test_required_field_deletion = snitch(required_field_deletion) + test_create_tender_with_inn = snitch(create_tender_with_inn) + test_create_tender_with_inn_before = snitch(create_tender_with_inn_before) + test_patch_tender_by_pq_bot = snitch(patch_tender_by_pq_bot) + test_invalid_tender_conditions = snitch(invalid_tender_conditions) + + +class TenderProcessTest(TenderContentWebTest): + initial_auth = ("Basic", ("broker", "")) + initial_data = test_tender_data + initial_status = 'active.tendering' + need_tender = True + + test_one_valid_bid_tender = snitch(one_valid_bid_tender) + test_one_invalid_bid_tender = snitch(one_invalid_bid_tender) + test_first_bid_tender = snitch(first_bid_tender) + test_lost_contract_for_active_award = snitch(lost_contract_for_active_award) + + +def suite(): + suite = unittest.TestSuite() + suite.addTest(unittest.makeSuite(TenderProcessTest)) + suite.addTest(unittest.makeSuite(TenderResourceTest)) + suite.addTest(unittest.makeSuite(TenderTest)) + return suite + + +if __name__ == "__main__": + unittest.main(defaultTest="suite") diff --git a/src/openprocurement/tender/pricequotation/tests/tender_blanks.py b/src/openprocurement/tender/pricequotation/tests/tender_blanks.py new file mode 100644 index 0000000000..43e2109403 --- /dev/null +++ b/src/openprocurement/tender/pricequotation/tests/tender_blanks.py @@ -0,0 +1,1658 @@ +# -*- coding: utf-8 -*- +import mock +from uuid import uuid4 +from copy import deepcopy +from datetime import timedelta + +from openprocurement.api.utils import get_now +from openprocurement.api.constants import ( + ROUTE_PREFIX, + CPV_BLOCK_FROM, + NOT_REQUIRED_ADDITIONAL_CLASSIFICATION_FROM, + SANDBOX_MODE, + CPV_ITEMS_CLASS_FROM, +) +from openprocurement.tender.pricequotation.models import PriceQuotationTender as Tender +from openprocurement.tender.pricequotation.tests.base import ( + test_organization, + test_cancellation, + test_shortlisted_firms, + test_short_profile, + test_requirement_response_valid, +) +from openprocurement.tender.pricequotation.tests.data import test_milestones +# TenderTest +from openprocurement.tender.core.tests.base import change_auth +from openprocurement.tender.pricequotation.constants import PMT, PQ_KINDS + + +def simple_add_tender(self): + + u = Tender(self.initial_data) + u.tenderID = "UA-X" + + assert u.id is None + assert u.rev is None + + u.store(self.db) + + assert u.id is not None + assert u.rev is not None + + fromdb = self.db.get(u.id) + + assert u.tenderID == fromdb["tenderID"] + assert u.doc_type == "Tender" + + u.delete_instance(self.db) + + +def listing(self): + response = self.app.get("/tenders") + self.assertEqual(response.status, "200 OK") + self.assertEqual(len(response.json["data"]), 0) + + tenders = [] + + for i in range(3): + offset = get_now().isoformat() + response = self.app.post_json("/tenders", {"data": self.initial_data}) + self.assertEqual(response.status, "201 Created") + self.assertEqual(response.content_type, "application/json") + self.tender_id = response.json['data']['id'] + self.set_status('active.tendering') + tender = self.app.get("/tenders/{}".format(self.tender_id)).json['data'] + tenders.append(tender) + + ids = ",".join([i["id"] for i in tenders]) + + while True: + response = self.app.get("/tenders") + self.assertTrue(ids.startswith(",".join([i["id"] for i in response.json["data"]]))) + if len(response.json["data"]) == 3: + break + self.assertEqual(len(response.json["data"]), 3) + self.assertEqual(set(response.json["data"][0]), set([u"id", u"dateModified"])) + self.assertEqual(set([i["id"] for i in response.json["data"]]), set([i["id"] for i in tenders])) + self.assertEqual(set([i["dateModified"] for i in response.json["data"]]), set([i["dateModified"] for i in tenders])) + self.assertEqual([i["dateModified"] for i in response.json["data"]], sorted([i["dateModified"] for i in tenders])) + + response = self.app.get("/tenders?limit=2") + self.assertEqual(response.status, "200 OK") + self.assertNotIn("prev_page", response.json) + self.assertEqual(len(response.json["data"]), 2) + + response = self.app.get(response.json["next_page"]["path"].replace(ROUTE_PREFIX, "")) + self.assertEqual(response.status, "200 OK") + self.assertIn("descending=1", response.json["prev_page"]["uri"]) + self.assertEqual(len(response.json["data"]), 1) + + response = self.app.get(response.json["next_page"]["path"].replace(ROUTE_PREFIX, "")) + self.assertEqual(response.status, "200 OK") + self.assertIn("descending=1", response.json["prev_page"]["uri"]) + self.assertEqual(len(response.json["data"]), 0) + + response = self.app.get("/tenders", params=[("opt_fields", "status")]) + self.assertEqual(response.status, "200 OK") + self.assertEqual(len(response.json["data"]), 3) + self.assertEqual(set(response.json["data"][0]), set([u"id", u"dateModified", u"status"])) + self.assertIn("opt_fields=status", response.json["next_page"]["uri"]) + + response = self.app.get("/tenders", params=[("opt_fields", "status")]) + self.assertEqual(response.status, "200 OK") + self.assertEqual(len(response.json["data"]), 3) + self.assertEqual(set(response.json["data"][0]), set([u"id", u"dateModified", u"status"])) + self.assertIn("opt_fields=status", response.json["next_page"]["uri"]) + + response = self.app.get("/tenders?descending=1") + self.assertEqual(response.status, "200 OK") + self.assertEqual(response.content_type, "application/json") + self.assertEqual(len(response.json["data"]), 3) + self.assertEqual(set(response.json["data"][0]), set([u"id", u"dateModified"])) + self.assertEqual(set([i["id"] for i in response.json["data"]]), set([i["id"] for i in tenders])) + self.assertEqual( + [i["dateModified"] for i in response.json["data"]], sorted([i["dateModified"] for i in tenders], reverse=True) + ) + + response = self.app.get("/tenders?descending=1&limit=2") + self.assertEqual(response.status, "200 OK") + self.assertNotIn("descending=1", response.json["prev_page"]["uri"]) + self.assertEqual(len(response.json["data"]), 2) + + response = self.app.get(response.json["next_page"]["path"].replace(ROUTE_PREFIX, "")) + self.assertEqual(response.status, "200 OK") + self.assertNotIn("descending=1", response.json["prev_page"]["uri"]) + self.assertEqual(len(response.json["data"]), 1) + + response = self.app.get(response.json["next_page"]["path"].replace(ROUTE_PREFIX, "")) + self.assertEqual(response.status, "200 OK") + self.assertNotIn("descending=1", response.json["prev_page"]["uri"]) + self.assertEqual(len(response.json["data"]), 0) + + test_tender_data2 = self.initial_data.copy() + test_tender_data2["mode"] = "test" + response = self.app.post_json("/tenders", {"data": test_tender_data2}) + self.assertEqual(response.status, "201 Created") + self.assertEqual(response.content_type, "application/json") + + +def listing_changes(self): + response = self.app.get("/tenders?feed=changes") + self.assertEqual(response.status, "200 OK") + self.assertEqual(len(response.json["data"]), 0) + + tenders = [] + + for i in range(3): + response = self.app.post_json("/tenders", {"data": self.initial_data}) + self.assertEqual(response.status, "201 Created") + self.assertEqual(response.content_type, "application/json") + self.tender_id = response.json['data']['id'] + self.set_status('active.tendering') + tender = self.app.get("/tenders/{}".format(self.tender_id)).json['data'] + tenders.append(tender) + ids = ",".join([i["id"] for i in tenders]) + + while True: + response = self.app.get("/tenders?feed=changes") + self.assertTrue(ids.startswith(",".join([i["id"] for i in response.json["data"]]))) + if len(response.json["data"]) == 3: + break + + self.assertEqual(",".join([i["id"] for i in response.json["data"]]), ids) + self.assertEqual(response.status, "200 OK") + self.assertEqual(len(response.json["data"]), 3) + self.assertEqual(set(response.json["data"][0]), set([u"id", u"dateModified"])) + self.assertEqual(set([i["id"] for i in response.json["data"]]), set([i["id"] for i in tenders])) + self.assertEqual(set([i["dateModified"] for i in response.json["data"]]), set([i["dateModified"] for i in tenders])) + self.assertEqual([i["dateModified"] for i in response.json["data"]], sorted([i["dateModified"] for i in tenders])) + + response = self.app.get("/tenders?feed=changes&limit=2") + self.assertEqual(response.status, "200 OK") + self.assertNotIn("prev_page", response.json) + self.assertEqual(len(response.json["data"]), 2) + + response = self.app.get(response.json["next_page"]["path"].replace(ROUTE_PREFIX, "")) + self.assertEqual(response.status, "200 OK") + self.assertIn("descending=1", response.json["prev_page"]["uri"]) + self.assertEqual(len(response.json["data"]), 1) + + response = self.app.get(response.json["next_page"]["path"].replace(ROUTE_PREFIX, "")) + self.assertEqual(response.status, "200 OK") + self.assertIn("descending=1", response.json["prev_page"]["uri"]) + self.assertEqual(len(response.json["data"]), 0) + + response = self.app.get("/tenders?feed=changes", params=[("opt_fields", "status")]) + self.assertEqual(response.status, "200 OK") + self.assertEqual(len(response.json["data"]), 3) + self.assertEqual(set(response.json["data"][0]), set([u"id", u"dateModified", u"status"])) + self.assertIn("opt_fields=status", response.json["next_page"]["uri"]) + + response = self.app.get("/tenders?feed=changes", params=[("opt_fields", "status")]) + self.assertEqual(response.status, "200 OK") + self.assertEqual(len(response.json["data"]), 3) + self.assertEqual(set(response.json["data"][0]), set([u"id", u"dateModified", u"status"])) + self.assertIn("opt_fields=status", response.json["next_page"]["uri"]) + + response = self.app.get("/tenders?feed=changes&descending=1") + self.assertEqual(response.status, "200 OK") + self.assertEqual(response.content_type, "application/json") + self.assertEqual(len(response.json["data"]), 3) + self.assertEqual(set(response.json["data"][0]), set([u"id", u"dateModified"])) + self.assertEqual(set([i["id"] for i in response.json["data"]]), set([i["id"] for i in tenders])) + self.assertEqual( + [i["dateModified"] for i in response.json["data"]], sorted([i["dateModified"] for i in tenders], reverse=True) + ) + + response = self.app.get("/tenders?feed=changes&descending=1&limit=2") + self.assertEqual(response.status, "200 OK") + self.assertNotIn("descending=1", response.json["prev_page"]["uri"]) + self.assertEqual(len(response.json["data"]), 2) + + response = self.app.get(response.json["next_page"]["path"].replace(ROUTE_PREFIX, "")) + self.assertEqual(response.status, "200 OK") + self.assertNotIn("descending=1", response.json["prev_page"]["uri"]) + self.assertEqual(len(response.json["data"]), 1) + + response = self.app.get(response.json["next_page"]["path"].replace(ROUTE_PREFIX, "")) + self.assertEqual(response.status, "200 OK") + self.assertNotIn("descending=1", response.json["prev_page"]["uri"]) + self.assertEqual(len(response.json["data"]), 0) + + test_tender_data2 = self.initial_data.copy() + test_tender_data2["mode"] = "test" + response = self.app.post_json("/tenders", {"data": test_tender_data2}) + self.assertEqual(response.status, "201 Created") + self.assertEqual(response.content_type, "application/json") + + +def listing_draft(self): + response = self.app.get("/tenders") + self.assertEqual(response.status, "200 OK") + self.assertEqual(len(response.json["data"]), 0) + + tenders = [] + data = self.initial_data.copy() + data.update({"status": "draft"}) + for i in range(3): + response = self.app.post_json("/tenders", {"data": self.initial_data}) + self.assertEqual(response.status, "201 Created") + self.assertEqual(response.content_type, "application/json") + self.tender_id = response.json['data']['id'] + self.set_status('active.tendering') + tender = self.app.get("/tenders/{}".format(self.tender_id)).json['data'] + tenders.append(tender) + + response = self.app.post_json("/tenders", {"data": data}) + self.assertEqual(response.status, "201 Created") + self.assertEqual(response.content_type, "application/json") + + ids = ",".join([i["id"] for i in tenders]) + + while True: + response = self.app.get("/tenders") + self.assertTrue(ids.startswith(",".join([i["id"] for i in response.json["data"]]))) + if len(response.json["data"]) == 3: + break + + self.assertEqual(len(response.json["data"]), 3) + self.assertEqual(set(response.json["data"][0]), set([u"id", u"dateModified"])) + self.assertEqual(set([i["id"] for i in response.json["data"]]), set([i["id"] for i in tenders])) + self.assertEqual(set([i["dateModified"] for i in response.json["data"]]), set([i["dateModified"] for i in tenders])) + self.assertEqual([i["dateModified"] for i in response.json["data"]], sorted([i["dateModified"] for i in tenders])) + + +def create_tender_invalid(self): + request_path = "/tenders" + response = self.app.post(request_path, "data", status=415) + self.assertEqual(response.status, "415 Unsupported Media Type") + self.assertEqual(response.content_type, "application/json") + self.assertEqual(response.json["status"], "error") + self.assertEqual( + response.json["errors"], + [ + { + u"description": u"Content-Type header should be one of ['application/json']", + u"location": u"header", + u"name": u"Content-Type", + } + ], + ) + + response = self.app.post(request_path, "data", content_type="application/json", status=422) + self.assertEqual(response.status, "422 Unprocessable Entity") + self.assertEqual(response.content_type, "application/json") + self.assertEqual(response.json["status"], "error") + self.assertEqual( + response.json["errors"], + [{u"description": u"No JSON object could be decoded", u"location": u"body", u"name": u"data"}], + ) + + response = self.app.post_json(request_path, "data", status=422) + self.assertEqual(response.status, "422 Unprocessable Entity") + self.assertEqual(response.content_type, "application/json") + self.assertEqual(response.json["status"], "error") + self.assertEqual( + response.json["errors"], [{u"description": u"Data not available", u"location": u"body", u"name": u"data"}] + ) + + response = self.app.post_json(request_path, {"not_data": {}}, status=422) + self.assertEqual(response.status, "422 Unprocessable Entity") + self.assertEqual(response.content_type, "application/json") + self.assertEqual(response.json["status"], "error") + self.assertEqual( + response.json["errors"], [{u"description": u"Data not available", u"location": u"body", u"name": u"data"}] + ) + + response = self.app.post_json(request_path, {"data": []}, status=422) + self.assertEqual(response.status, "422 Unprocessable Entity") + self.assertEqual(response.content_type, "application/json") + self.assertEqual(response.json["status"], "error") + self.assertEqual( + response.json["errors"], [{u"description": u"Data not available", u"location": u"body", u"name": u"data"}] + ) + + response = self.app.post_json(request_path, {"data": {"procurementMethodType": "invalid_value"}}, status=415) + self.assertEqual(response.status, "415 Unsupported Media Type") + self.assertEqual(response.content_type, "application/json") + self.assertEqual(response.json["status"], "error") + self.assertEqual( + response.json["errors"], + [{u"description": u"Not implemented", u"location": u"data", u"name": u"procurementMethodType"}], + ) + + response = self.app.post_json(request_path, {"data": {"invalid_field": "invalid_value", "procurementMethodType": PMT}}, status=422) + self.assertEqual(response.status, "422 Unprocessable Entity") + self.assertEqual(response.content_type, "application/json") + self.assertEqual(response.json["status"], "error") + self.assertEqual( + response.json["errors"], [{u"description": u"Rogue field", u"location": u"body", u"name": u"invalid_field"}] + ) + + response = self.app.post_json(request_path, {"data": {"value": "invalid_value", "procurementMethodType": PMT}}, status=422) + self.assertEqual(response.status, "422 Unprocessable Entity") + self.assertEqual(response.content_type, "application/json") + self.assertEqual(response.json["status"], "error") + self.assertEqual( + response.json["errors"], + [ + { + u"description": [u"Please use a mapping for this field or Value instance instead of unicode."], + u"location": u"body", + u"name": u"value", + } + ], + ) + + response = self.app.post_json(request_path, {"data": {"procurementMethod": "invalid_value", "procurementMethodType": PMT }}, status=422) + self.assertEqual(response.status, "422 Unprocessable Entity") + self.assertEqual(response.content_type, "application/json") + self.assertEqual(response.json["status"], "error") + + self.assertIn( + { + u"description": [u"Value must be one of ['selective']."], + u"location": u"body", + u"name": u"procurementMethod", + }, + response.json["errors"], + ) + + self.assertIn( + {u"description": [u"This field is required."], u"location": u"body", u"name": u"tenderPeriod"}, + response.json["errors"], + ) + + self.assertIn( + {u"description": [u"This field is required."], u"location": u"body", u"name": u"items"}, response.json["errors"] + ) + + data = self.initial_data["tenderPeriod"] + self.initial_data["tenderPeriod"] = {"startDate": "2014-10-31T00:00:00", "endDate": "2014-10-01T00:00:00"} + response = self.app.post_json(request_path, {"data": self.initial_data}, status=422) + self.initial_data["tenderPeriod"] = data + self.assertEqual(response.status, "422 Unprocessable Entity") + self.assertEqual(response.content_type, "application/json") + self.assertEqual(response.json["status"], "error") + self.assertEqual( + response.json["errors"], + [ + { + u"description": {u"startDate": [u"period should begin before its end"]}, + u"location": u"body", + u"name": u"tenderPeriod", + } + ], + ) + + now = get_now() + self.initial_data["awardPeriod"] = {"startDate": now.isoformat(), "endDate": now.isoformat()} + response = self.app.post_json(request_path, {"data": self.initial_data}, status=422) + del self.initial_data["awardPeriod"] + self.assertEqual(response.status, "422 Unprocessable Entity") + self.assertEqual(response.content_type, "application/json") + self.assertEqual(response.json["status"], "error") + self.assertEqual( + response.json["errors"], + [{u"description": [u"period should begin after tenderPeriod"], u"location": u"body", u"name": u"awardPeriod"}], + ) + + data = self.initial_data["items"][0].pop("additionalClassifications") + if get_now() > CPV_ITEMS_CLASS_FROM: + cpv_code = self.initial_data["items"][0]["classification"]["id"] + self.initial_data["items"][0]["classification"]["id"] = "99999999-9" + + status = 422 if get_now() < NOT_REQUIRED_ADDITIONAL_CLASSIFICATION_FROM else 201 + response = self.app.post_json(request_path, {"data": self.initial_data}, status=status) + self.initial_data["items"][0]["additionalClassifications"] = data + if get_now() > CPV_ITEMS_CLASS_FROM: + self.initial_data["items"][0]["classification"]["id"] = cpv_code + if status == 201: + self.assertEqual(response.content_type, "application/json") + self.assertEqual(response.status, "201 Created") + else: + self.assertEqual(response.status, "422 Unprocessable Entity") + self.assertEqual(response.content_type, "application/json") + self.assertEqual(response.json["status"], "error") + self.assertEqual( + response.json["errors"], + [ + { + u"description": [{u"additionalClassifications": [u"This field is required."]}], + u"location": u"body", + u"name": u"items", + } + ], + ) + + data = test_organization["contactPoint"]["telephone"] + del test_organization["contactPoint"]["telephone"] + response = self.app.post_json(request_path, {"data": self.initial_data}, status=422) + test_organization["contactPoint"]["telephone"] = data + self.assertEqual(response.status, "422 Unprocessable Entity") + self.assertEqual(response.content_type, "application/json") + self.assertEqual(response.json["status"], "error") + self.assertEqual( + response.json["errors"], + [ + { + u"description": {u"contactPoint": {u"email": [u"telephone or email should be present"]}}, + u"location": u"body", + u"name": u"procuringEntity", + } + ], + ) + + cpv = self.initial_data["items"][0]["classification"]["id"] + self.initial_data["items"][0]["classification"]["id"] = u"160173000-1" + response = self.app.post_json(request_path, {"data": self.initial_data}, status=422) + self.initial_data["items"][0]["classification"]["id"] = cpv + self.assertEqual(response.status, "422 Unprocessable Entity") + self.assertEqual(response.content_type, "application/json") + self.assertEqual(response.json["status"], "error") + self.assertIn(u"classification", response.json["errors"][0][u"description"][0]) + self.assertIn(u"id", response.json["errors"][0][u"description"][0][u"classification"]) + self.assertIn("Value must be one of [u", response.json["errors"][0][u"description"][0][u"classification"][u"id"][0]) + + cpv = self.initial_data["items"][0]["classification"]["id"] + if get_now() < CPV_BLOCK_FROM: + self.initial_data["items"][0]["classification"]["scheme"] = u"CPV" + self.initial_data["items"][0]["classification"]["id"] = u"00000000-0" + response = self.app.post_json(request_path, {"data": self.initial_data}, status=422) + if get_now() < CPV_BLOCK_FROM: + self.initial_data["items"][0]["classification"]["scheme"] = u"CPV" + self.initial_data["items"][0]["classification"]["id"] = cpv + self.assertEqual(response.status, "422 Unprocessable Entity") + self.assertEqual(response.content_type, "application/json") + self.assertEqual(response.json["status"], "error") + self.assertIn(u"classification", response.json["errors"][0][u"description"][0]) + self.assertIn(u"id", response.json["errors"][0][u"description"][0][u"classification"]) + self.assertIn("Value must be one of [u", response.json["errors"][0][u"description"][0][u"classification"][u"id"][0]) + + procuringEntity = self.initial_data["procuringEntity"] + data = self.initial_data["procuringEntity"].copy() + del data["kind"] + self.initial_data["procuringEntity"] = data + response = self.app.post_json(request_path, {"data": self.initial_data}, status=403) + self.initial_data["procuringEntity"] = procuringEntity + self.assertEqual(response.status, "403 Forbidden") + self.assertEqual(response.content_type, "application/json") + self.assertEqual(response.json["status"], "error") + self.assertEqual( + response.json["errors"], + [ + { + u"description": u"'' procuringEntity cannot publish this type of procedure. " + u"Only general, special, defense, other, social, authority are allowed.", + u"location": u"procuringEntity", + u"name": u"kind", + } + ], + ) + + data = deepcopy(self.initial_data) + data['milestones'] = test_milestones + response = self.app.post_json(request_path, {"data": data}, status=422) + self.assertEqual(response.status, "422 Unprocessable Entity") + self.assertEqual(response.content_type, "application/json") + self.assertEqual(response.json["status"], "error") + self.assertEqual( + response.json["errors"], [{ + u"description": [u"Milestones are not applicable to pricequotation"], + u"location": u"body", + u"name": u"milestones" + }], + ) + + data = deepcopy(self.initial_data) + data["procuringEntity"]['kind'] = 'central' + response = self.app.post_json(request_path, {"data": data}, status=403) + self.assertEqual(response.status, '403 Forbidden') + self.assertEqual(response.content_type, "application/json") + self.assertEqual(response.json["status"], "error") + self.assertEqual( + response.json["errors"], [{ + u"description": "u'central' procuringEntity cannot publish this type of procedure. Only general, special, defense, other, social, authority are allowed.", + u"location": u"procuringEntity", + u"name": u"kind" + }], + ) + + +def create_tender_with_inn(self): + request_path = "/tenders" + + addit_classif = [ + {"scheme": "INN", "id": "17.21.1", "description": "папір і картон гофровані, паперова й картонна тара"} + ] + data = self.initial_data["items"][0]["classification"]["id"] + self.initial_data["items"][0]["classification"]["id"] = u"33611000-6" + orig_addit_classif = self.initial_data["items"][0]["additionalClassifications"] + self.initial_data["items"][0]["additionalClassifications"] = addit_classif + response = self.app.post_json(request_path, {"data": self.initial_data}) + self.initial_data["items"][0]["additionalClassifications"] = orig_addit_classif + self.initial_data["items"][0]["classification"]["id"] = data + self.assertEqual(response.status, "201 Created") + + addit_classif = [ + {"scheme": "NotINN", "id": "17.21.1", "description": "папір і картон гофровані, паперова й картонна тара"}, + {"scheme": "NotINN", "id": "17.21.1", "description": "папір і картон гофровані, паперова й картонна тара"}, + ] + data = self.initial_data["items"][0]["classification"]["id"] + self.initial_data["items"][0]["classification"]["id"] = u"33652000-5" + orig_addit_classif = self.initial_data["items"][0]["additionalClassifications"] + self.initial_data["items"][0]["additionalClassifications"] = addit_classif + response = self.app.post_json(request_path, {"data": self.initial_data}) + self.initial_data["items"][0]["additionalClassifications"] = orig_addit_classif + self.initial_data["items"][0]["classification"]["id"] = data + self.assertEqual(response.status, "201 Created") + + +def create_tender_generated(self): + data = self.initial_data.copy() + data.update({"id": "hash", "doc_id": "hash2", "tenderID": "hash3"}) + response = self.app.post_json("/tenders", {"data": data}) + self.assertEqual(response.status, "201 Created") + self.assertEqual(response.content_type, "application/json") + tender = response.json["data"] + if "procurementMethodDetails" in tender: + tender.pop("procurementMethodDetails") + self.assertEqual( + set(tender), + set( + [ + u"procurementMethodType", + u"id", + u"date", + u"dateModified", + u"tenderID", + u"status", + u"tenderPeriod", + u"items", + u"procuringEntity", + u"procurementMethod", + u"awardCriteria", + u"submissionMethod", + u"title", + u"owner", + u"mainProcurementCategory", + u"profile", + u"value" + ] + ), + ) + self.assertNotEqual(data["id"], tender["id"]) + self.assertNotEqual(data["doc_id"], tender["id"]) + self.assertNotEqual(data["tenderID"], tender["tenderID"]) + + +def create_tender_draft(self): + data = self.initial_data.copy() + data.update({"status": "draft"}) + response = self.app.post_json("/tenders", {"data": data}) + self.assertEqual(response.status, "201 Created") + self.assertEqual(response.content_type, "application/json") + tender = response.json["data"] + token = response.json["access"]["token"] + self.assertEqual(tender["status"], "draft") + self.assertNotIn("noticePublicationDate", tender) + self.assertNotIn("unsuccessfulReason", tender) + + if SANDBOX_MODE: + period = { + 'endDate': (get_now() + timedelta(minutes=1)).isoformat() + } + else: + period = { + 'endDate': (get_now() + timedelta(days=1)).isoformat() + } + + response = self.app.patch_json( + "/tenders/{}?acc_token={}".format(tender["id"], token), + {"data": {"status": self.primary_tender_status, "tenderPeriod": period}}, + status=422 + ) + + self.assertEqual( + response.json["errors"], + [{u'description': [u'tenderPeriod must be at least 2 full business days long'], + u'location': u'body', + u'name': u'tenderPeriod'}] + ) + + forbidden_statuses = ("draft.unsuccessful", "active.tendering", "active.qualification", "active.awarded", + "complete", "cancelled", "unsuccessful") + current_status = tender["status"] + for forbidden_status in forbidden_statuses: + response = self.app.patch_json( + "/tenders/{}?acc_token={}".format(tender["id"], token), + {"data": {"status": forbidden_status}}, + status=403 + ) + self.assertEqual(response.status, "403 Forbidden") + self.assertEqual(response.json['status'], "error") + self.assertEqual( + response.json['errors'], + [{u'description': u"tender_owner can't switch tender from status ({}) to ({})".format(current_status, + forbidden_status), + u'location': u'body', + u'name': u'data'}] + ) + + response = self.app.patch_json( + "/tenders/{}?acc_token={}".format(tender["id"], token), + {"data": {"procuringEntity": {"kind": 'central'}}}, + status=403 + ) + self.assertEqual(response.status, "403 Forbidden") + self.assertEqual(response.content_type, "application/json") + self.assertEqual(response.json['status'], 'error') + self.assertEqual( + response.json['errors'], + [{ + u'description': u"u'central' procuringEntity cannot publish this type of procedure. Only general, special, defense, other, social, authority are allowed.", + u'location': u'procuringEntity', + u'name': u'kind' + }] + ) + response = self.app.patch_json( + "/tenders/{}?acc_token={}".format(tender["id"], token), + {"data": {"status": self.primary_tender_status, "unsuccessfulReason": ["some value from buyer"]}} + ) + self.assertEqual(response.status, "200 OK") + self.assertEqual(response.content_type, "application/json") + tender = response.json["data"] + self.assertEqual(tender["status"], self.primary_tender_status) + self.assertEqual(tender["noticePublicationDate"], tender["tenderPeriod"]["startDate"]) + self.assertNotIn("unsuccessfulReason", tender) + + response = self.app.get("/tenders/{}".format(tender["id"])) + self.assertEqual(response.status, "200 OK") + self.assertEqual(response.content_type, "application/json") + tender = response.json["data"] + self.assertEqual(tender["status"], self.primary_tender_status) + + +def create_tender_in_not_draft_status(self): + data = self.initial_data.copy() + forbidden_statuses = ("draft.unsuccessful", "active.tendering", "active.qualification", "active.awarded", + "complete", "cancelled", "unsuccessful") + for forbidden_status in forbidden_statuses: + data.update({"status": forbidden_status}) + response = self.app.post_json("/tenders", {"data": data}) + self.assertEqual(response.status, "201 Created") + self.assertEqual(response.content_type, "application/json") + tender = response.json["data"] + token = response.json["access"]["token"] + self.assertEqual(tender["status"], "draft") + + +def tender_owner_can_change_in_draft(self): + data = self.initial_data.copy() + data.update({"status": "draft"}) + response = self.app.post_json("/tenders", {"data": data}) + self.assertEqual(response.status, "201 Created") + self.assertEqual(response.content_type, "application/json") + tender = response.json["data"] + token = response.json["access"]["token"] + self.assertEqual(tender["status"], "draft") + + general = { + "numberOfBidders": 1, + "tenderPeriod": {"endDate": (get_now() + timedelta(days=14)).isoformat()}, + "procuringEntity": {"name": u"Національне управління справами"}, + "mainProcurementCategory": u"services", + "guarantee": {"amount": 50}, + } + descriptions = { + "description": u"Some text 1", + "description_en": u"Some text 2", + "description_ru": u"Some text 3", + "procurementMethodRationale": u"Some text 4", + "procurementMethodRationale_en": u"Some text 5", + "procurementMethodRationale_ru": u"Some text 6", + "submissionMethodDetails": u"Some text 7", + "submissionMethodDetails_en": u"Some text 8", + "submissionMethodDetails_ru": u"Some text 9" + } + titles = { + "title": u"Test title 1", + "title_en": u"Test title 2", + "title_ru": u"Test title 3" + } + criterias = { + "eligibilityCriteria": u"Test criteria 1", + "eligibilityCriteria_en": u"Test criteria 2", + "eligibilityCriteria_ru": u"Test criteria 3", + "awardCriteriaDetails": u"Test criteria 4", + "awardCriteriaDetails_en": u"Test criteria 5", + "awardCriteriaDetails_ru": u"Test criteria 6" + } + lists = { + "buyers": [ + { + "name": u"John Doe", + "identifier": { + "scheme": u"AE-DCCI", + "id": u"AE1" + } + } + ], + "funders": [ + { + "name": u"First funder", + "identifier": { + "scheme": u"XM-DAC", + "id": u"44000" + }, + "address": { + "countryName": u"Японія" + }, + "contactPoint": { + "name": u"Funder name", + "email": u"fake_japan_email@gmail.net" + } + } + ], + "items": [ + { + "description": u"New description" + } + ] + } + status = { + "status": "draft.publishing" + } + + # general + response = self.app.patch_json( + "/tenders/{}?acc_token={}".format(tender["id"], token), {"data": general} + ) + self.assertEqual(response.status, "200 OK") + self.assertEqual(response.content_type, "application/json") + tender = response.json["data"] + + self.assertEqual(tender["numberOfBidders"], general["numberOfBidders"]) + self.assertNotEqual(tender["numberOfBidders"], data.get("numberOfBidders")) + self.assertEqual(tender["mainProcurementCategory"], general["mainProcurementCategory"]) + self.assertNotEqual(tender["mainProcurementCategory"], data.get("mainProcurementCategory")) + self.assertEqual(tender["tenderPeriod"]["endDate"], general["tenderPeriod"]["endDate"]) + self.assertNotEqual(tender["tenderPeriod"]["endDate"], data.get("tenderPeriod", {}).get("endDate")) + self.assertEqual(tender["procuringEntity"]["name"], general["procuringEntity"]["name"]) + self.assertNotEqual(tender["procuringEntity"]["name"], data.get("procuringEntity", {}).get("name")) + self.assertEqual(tender["guarantee"]["amount"], general["guarantee"]["amount"]) + self.assertNotEqual(tender["guarantee"]["amount"], data.get("guarantee", {}).get("amount")) + + # descriptions + response = self.app.patch_json( + "/tenders/{}?acc_token={}".format(tender["id"], token), {"data": descriptions} + ) + self.assertEqual(response.status, "200 OK") + self.assertEqual(response.content_type, "application/json") + tender = response.json["data"] + + self.assertEqual(tender["description"], descriptions["description"]) + self.assertNotEqual(tender["description"], data.get("description")) + self.assertEqual(tender["description_en"], descriptions["description_en"]) + self.assertNotEqual(tender["description_en"], data.get("description_en")) + self.assertEqual(tender["description_ru"], descriptions["description_ru"]) + self.assertNotEqual(tender["description_ru"], data.get("description_ru")) + self.assertEqual(tender["procurementMethodRationale"], descriptions["procurementMethodRationale"]) + self.assertNotEqual(tender["procurementMethodRationale"], data.get("procurementMethodRationale")) + self.assertEqual(tender["procurementMethodRationale_en"], descriptions["procurementMethodRationale_en"]) + self.assertNotEqual(tender["procurementMethodRationale_en"], data.get("procurementMethodRationale_en")) + self.assertEqual(tender["procurementMethodRationale_ru"], descriptions["procurementMethodRationale_ru"]) + self.assertNotEqual(tender["procurementMethodRationale_ru"], data.get("procurementMethodRationale_ru")) + self.assertEqual(tender["submissionMethodDetails"], descriptions["submissionMethodDetails"]) + self.assertNotEqual(tender["submissionMethodDetails"], data.get("submissionMethodDetails")) + self.assertEqual(tender["submissionMethodDetails_en"], descriptions["submissionMethodDetails_en"]) + self.assertNotEqual(tender["submissionMethodDetails_en"], data.get("submissionMethodDetails_en")) + self.assertEqual(tender["submissionMethodDetails_ru"], descriptions["submissionMethodDetails_ru"]) + self.assertNotEqual(tender["submissionMethodDetails_ru"], data.get("submissionMethodDetails_ru")) + + # titles + response = self.app.patch_json( + "/tenders/{}?acc_token={}".format(tender["id"], token), {"data": titles} + ) + self.assertEqual(response.status, "200 OK") + self.assertEqual(response.content_type, "application/json") + tender = response.json["data"] + + self.assertEqual(tender["title"], titles["title"]) + self.assertNotEqual(tender["title"], data.get("title")) + self.assertEqual(tender["title_en"], titles["title_en"]) + self.assertNotEqual(tender["title_en"], data.get("title_en")) + self.assertEqual(tender["title_ru"], titles["title_ru"]) + self.assertNotEqual(tender["title_ru"], data.get("title_ru")) + + # criterias + response = self.app.patch_json( + "/tenders/{}?acc_token={}".format(tender["id"], token), {"data": criterias} + ) + self.assertEqual(response.status, "200 OK") + self.assertEqual(response.content_type, "application/json") + tender = response.json["data"] + + self.assertEqual(tender["eligibilityCriteria"], criterias["eligibilityCriteria"]) + self.assertNotEqual(tender["eligibilityCriteria"], data.get("eligibilityCriteria")) + self.assertEqual(tender["eligibilityCriteria_en"], criterias["eligibilityCriteria_en"]) + self.assertNotEqual(tender["eligibilityCriteria_en"], data.get("eligibilityCriteria_en")) + self.assertEqual(tender["eligibilityCriteria_ru"], criterias["eligibilityCriteria_ru"]) + self.assertNotEqual(tender["eligibilityCriteria_ru"], data.get("eligibilityCriteria_ru")) + self.assertEqual(tender["awardCriteriaDetails"], criterias["awardCriteriaDetails"]) + self.assertNotEqual(tender["awardCriteriaDetails"], data.get("awardCriteriaDetails")) + self.assertEqual(tender["awardCriteriaDetails_en"], criterias["awardCriteriaDetails_en"]) + self.assertNotEqual(tender["awardCriteriaDetails_en"], data.get("awardCriteriaDetails_en")) + self.assertEqual(tender["awardCriteriaDetails_ru"], criterias["awardCriteriaDetails_ru"]) + self.assertNotEqual(tender["awardCriteriaDetails_ru"], data.get("awardCriteriaDetails_ru")) + + # lists + response = self.app.patch_json( + "/tenders/{}?acc_token={}".format(tender["id"], token), {"data": lists} + ) + self.assertEqual(response.status, "200 OK") + self.assertEqual(response.content_type, "application/json") + tender = response.json["data"] + + self.assertEqual(tender["funders"], lists["funders"]) + self.assertEqual(tender["buyers"], lists["buyers"]) + + self.assertEqual(tender["items"][0]["description"], lists["items"][0]["description"]) + + # status + response = self.app.patch_json( + "/tenders/{}?acc_token={}".format(tender["id"], token), {"data": status} + ) + self.assertEqual(response.status, "200 OK") + self.assertEqual(response.content_type, "application/json") + tender = response.json["data"] + + self.assertEqual(tender["status"], status["status"]) + self.assertNotEqual(tender["status"], data["status"]) + + +def tender_owner_cannot_change_in_draft(self): + data = self.initial_data.copy() + data.update({"status": "draft"}) + response = self.app.post_json("/tenders", {"data": data}) + self.assertEqual(response.status, "201 Created") + self.assertEqual(response.content_type, "application/json") + tender = response.json["data"] + token = response.json["access"]["token"] + self.assertEqual(tender["status"], "draft") + + general = { + "tenderID": u"Some id", + "procurementMethodType": u"belowThreshold", + "procurementMethod": u"selective", + "submissionMethod": u"written", + "awardCriteria": u"bestProposal", + "mode": u"test" + } + owner = { + "owner": u"Test owner", + "transfer_token": u"17bc682ec79245bca7d9cdbabbfce8f8", + "owner_token": u"17bc682ec79245bca7d9cdbabbfce8f7" + } + time = { + "awardPeriod": {"endDate": (get_now() + timedelta(days=14)).isoformat()}, + "date": (get_now() + timedelta(days=1)).isoformat(), + "dateModified": (get_now() + timedelta(days=1)).isoformat(), + } + lists = { + "revisions": [{"author": "Some author"}], + "plans": [{"id": uuid4().hex}], + "cancellations": [ + { + "reason": u"Some reason", + "reasonType": u"noDemand" + } + ], + } + + # general + response = self.app.patch_json( + "/tenders/{}?acc_token={}".format(tender["id"], token), {"data": general} + ) + self.assertEqual(response.status, "200 OK") + self.assertEqual(response.content_type, "application/json") + tender = response.json["data"] + + self.assertNotEqual(tender.get("tenderID"), general["tenderID"]) + self.assertNotEqual(tender.get("procurementMethodType"), general["procurementMethodType"]) + self.assertEqual(tender.get("procurementMethod"), general["procurementMethod"]) + self.assertNotEqual(tender.get("submissionMethod"), general["submissionMethod"]) + self.assertNotEqual(tender.get("awardCriteria"), general["awardCriteria"]) + self.assertNotEqual(tender.get("mode"), general["mode"]) + + # owner + response = self.app.patch_json( + "/tenders/{}?acc_token={}".format(tender["id"], token), {"data": owner} + ) + self.assertEqual(response.status, "200 OK") + self.assertEqual(response.content_type, "application/json") + tender = response.json["data"] + + self.assertNotEqual(tender.get("owner"), owner["owner"]) + self.assertNotEqual(tender.get("transfer_token"), owner["transfer_token"]) + self.assertNotEqual(tender.get("owner_token"), owner["owner_token"]) + + # time + response = self.app.patch_json( + "/tenders/{}?acc_token={}".format(tender["id"], token), {"data": time} + ) + self.assertEqual(response.status, "200 OK") + self.assertEqual(response.content_type, "application/json") + tender = response.json["data"] + + self.assertNotEqual(tender.get("awardPeriod", {}).get("endDate"), time["awardPeriod"]["endDate"]) + self.assertNotEqual(tender.get("date"), time["date"]) + self.assertNotEqual(tender.get("dateModified"), time["dateModified"]) + + # lists + response = self.app.patch_json( + "/tenders/{}?acc_token={}".format(tender["id"], token), {"data": lists} + ) + self.assertEqual(response.status, "200 OK") + self.assertEqual(response.content_type, "application/json") + tender = response.json["data"] + + self.assertEqual(tender.get("revisions", []), []) + self.assertEqual(tender.get("plans", []), []) + self.assertEqual(tender.get("cancellations", []), []) + + +def create_tender(self): + response = self.app.get("/tenders") + self.assertEqual(response.status, "200 OK") + self.assertEqual(len(response.json["data"]), 0) + + response = self.app.post_json("/tenders", {"data": self.initial_data}) + self.assertEqual(response.status, "201 Created") + self.assertEqual(response.content_type, "application/json") + tender = response.json["data"] + + response = self.app.get("/tenders/{}".format(tender["id"])) + self.assertEqual(response.status, "200 OK") + self.assertEqual(response.content_type, "application/json") + self.assertEqual(set(response.json["data"]), set(tender)) + self.assertEqual(response.json["data"], tender) + + response = self.app.post_json("/tenders?opt_jsonp=callback", {"data": self.initial_data}) + self.assertEqual(response.status, "201 Created") + self.assertEqual(response.content_type, "application/javascript") + self.assertIn('callback({"', response.body) + + response = self.app.post_json("/tenders?opt_pretty=1", {"data": self.initial_data}) + self.assertEqual(response.status, "201 Created") + self.assertEqual(response.content_type, "application/json") + self.assertIn('{\n "', response.body) + + response = self.app.post_json("/tenders", {"data": self.initial_data, "options": {"pretty": True}}) + self.assertEqual(response.status, "201 Created") + self.assertEqual(response.content_type, "application/json") + self.assertIn('{\n "', response.body) + + tender_data = deepcopy(self.initial_data) + tender_data["guarantee"] = {"amount": 100500, "currency": "USD"} + response = self.app.post_json("/tenders", {"data": tender_data}) + self.assertEqual(response.status, "201 Created") + self.assertEqual(response.content_type, "application/json") + data = response.json["data"] + self.assertIn("guarantee", data) + self.assertEqual(data["guarantee"]["amount"], 100500) + self.assertEqual(data["guarantee"]["currency"], "USD") + + data = deepcopy(self.initial_data) + del data["items"][0]["deliveryAddress"]["postalCode"] + del data["items"][0]["deliveryAddress"]["locality"] + del data["items"][0]["deliveryAddress"]["streetAddress"] + del data["items"][0]["deliveryAddress"]["region"] + response = self.app.post_json("/tenders", {"data": data}) + self.assertEqual(response.status, "201 Created") + self.assertEqual(response.content_type, "application/json") + self.assertNotIn("postalCode", response.json["data"]["items"][0]["deliveryAddress"]) + self.assertNotIn("locality", response.json["data"]["items"][0]["deliveryAddress"]) + self.assertNotIn("streetAddress", response.json["data"]["items"][0]["deliveryAddress"]) + self.assertNotIn("region", response.json["data"]["items"][0]["deliveryAddress"]) + + for kind in PQ_KINDS: + data = deepcopy(self.initial_data) + data['procuringEntity']['kind'] = kind + response = self.app.post_json("/tenders", {"data": data}) + self.assertEqual(response.status, "201 Created") + self.assertEqual(response.content_type, "application/json") + self.assertEqual( + response.json['data']['procuringEntity']['kind'], + kind + ) + + +def tender_fields(self): + response = self.app.post_json("/tenders", {"data": self.initial_data}) + self.assertEqual(response.status, "201 Created") + self.assertEqual(response.content_type, "application/json") + tender = response.json["data"] + self.assertEqual( + set(tender) - set(self.initial_data), + set( + [ + u"id", + u"dateModified", + u"tenderID", + u"date", + u"status", + u"awardCriteria", + u"submissionMethod", + u"owner", + ] + ), + ) + self.assertIn(tender["id"], response.headers["Location"]) + + +def patch_tender(self): + data = self.initial_data.copy() + data["procuringEntity"]["contactPoint"]["faxNumber"] = u"0440000000" + response = self.app.get("/tenders") + self.assertEqual(response.status, "200 OK") + self.assertEqual(len(response.json["data"]), 0) + + response = self.app.post_json("/tenders", {"data": data}) + self.assertEqual(response.status, "201 Created") + tender = response.json["data"] + owner_token = response.json["access"]["token"] + dateModified = tender.pop("dateModified") + + + response = self.app.patch_json( + "/tenders/{}?acc_token={}".format(tender["id"], owner_token), + {"data": {"milestones": test_milestones}}, + status=422 + ) + self.assertEqual(response.status, "422 Unprocessable Entity") + self.assertEqual(response.content_type, "application/json") + self.assertEqual(response.json["status"], "error") + self.assertEqual( + response.json["errors"], [{ + u"description": [u"Milestones are not applicable to pricequotation"], + u"location": u"body", + u"name": u"milestones" + }], + ) + + response = self.app.patch_json( + "/tenders/{}?acc_token={}".format(tender["id"], owner_token), {"data": {"procuringEntity": {"kind": "defense"}}} + ) + self.assertEqual(response.status, "200 OK") + self.assertEqual(response.content_type, "application/json") + self.assertEqual(response.json["data"]["procuringEntity"]["kind"], "defense") + tender[u"procuringEntity"]['kind'] = u"defense" + + response = self.app.patch_json( + "/tenders/{}?acc_token={}".format(tender["id"], owner_token), + {"data": {"procuringEntity": {"contactPoint": {"faxNumber": None}}}}, + ) + self.assertEqual(response.status, "200 OK") + self.assertEqual(response.content_type, "application/json") + self.assertNotIn("faxNumber", response.json["data"]["procuringEntity"]["contactPoint"]) + + response = self.app.patch_json( + "/tenders/{}?acc_token={}".format(tender["id"], owner_token), + {"data": {"procuringEntity": {"contactPoint": {"faxNumber": u"0440000000"}}}}, + ) + self.assertEqual(response.status, "200 OK") + self.assertEqual(response.content_type, "application/json") + self.assertIn("startDate", response.json["data"]["tenderPeriod"]) + + response = self.app.patch_json( + "/tenders/{}?acc_token={}".format(tender["id"], owner_token), {"data": {"procurementMethodRationale": "Open"}} + ) + self.assertEqual(response.status, "200 OK") + self.assertEqual(response.content_type, "application/json") + new_tender = response.json["data"] + new_dateModified = new_tender.pop("dateModified") + tender[u"procurementMethodRationale"] = u"Open" + self.assertEqual(tender, new_tender) + self.assertNotEqual(dateModified, new_dateModified) + + response = self.app.patch_json( + "/tenders/{}?acc_token={}".format(tender["id"], owner_token), {"data": {"dateModified": new_dateModified}} + ) + self.assertEqual(response.status, "200 OK") + self.assertEqual(response.content_type, "application/json") + new_tender2 = response.json["data"] + new_dateModified2 = new_tender2.pop("dateModified") + self.assertEqual(new_tender, new_tender2) + self.assertEqual(new_dateModified, new_dateModified2) + + revisions = self.db.get(tender["id"]).get("revisions") + self.assertEqual(revisions[-1][u"changes"][0]["op"], u"remove") + self.assertEqual(revisions[-1][u"changes"][0]["path"], u"/procurementMethodRationale") + + response = self.app.patch_json( + "/tenders/{}?acc_token={}".format(tender["id"], owner_token), {"data": {"items": [data["items"][0]]}} + ) + self.assertEqual(response.status, "200 OK") + self.assertEqual(response.content_type, "application/json") + + response = self.app.patch_json( + "/tenders/{}?acc_token={}".format(tender["id"], owner_token), {"data": {"items": [{}, data["items"][0]]}} + ) + self.assertEqual(response.status, "200 OK") + self.assertEqual(response.content_type, "application/json") + item0 = response.json["data"]["items"][0] + item1 = response.json["data"]["items"][1] + self.assertNotEqual(item0.pop("id"), item1.pop("id")) + self.assertEqual(item0, item1) + + response = self.app.patch_json( + "/tenders/{}?acc_token={}".format(tender["id"], owner_token), {"data": {"items": [{}]}} + ) + self.assertEqual(response.status, "200 OK") + self.assertEqual(response.content_type, "application/json") + self.assertEqual(len(response.json["data"]["items"]), 1) + + response = self.app.patch_json( + "/tenders/{}?acc_token={}".format(tender["id"], owner_token), + { + "data": { + "items": [ + { + "classification": { + "scheme": "ДК021", + "id": "55523100-3", + "description": "Послуги з харчування у школах", + } + } + ] + } + }, + ) + self.assertEqual(response.status, "200 OK") + self.assertEqual(response.content_type, "application/json") + + response = self.app.patch_json( + "/tenders/{}?acc_token={}".format(tender["id"], owner_token), + {"data": {"guarantee": {"amount": 12, "valueAddedTaxIncluded": True}}}, + status=422, + ) + self.assertEqual(response.status, "422 Unprocessable Entity") + self.assertEqual( + response.json["errors"][0], + {u"description": {u"valueAddedTaxIncluded": u"Rogue field"}, u"location": u"body", u"name": u"guarantee"}, + ) + + response = self.app.patch_json( + "/tenders/{}?acc_token={}".format(tender["id"], owner_token), {"data": {"guarantee": {"amount": 12}}} + ) + self.assertEqual(response.status, "200 OK") + self.assertIn("guarantee", response.json["data"]) + self.assertEqual(response.json["data"]["guarantee"]["amount"], 12) + self.assertEqual(response.json["data"]["guarantee"]["currency"], "UAH") + + response = self.app.patch_json( + "/tenders/{}?acc_token={}".format(tender["id"], owner_token), {"data": {"guarantee": {"currency": "USD"}}} + ) + self.assertEqual(response.status, "200 OK") + self.assertEqual(response.json["data"]["guarantee"]["currency"], "USD") + + # response = self.app.patch_json('/tenders/{}'.format(tender['id']), {'data': {'status': 'active.auction'}}) + # self.assertEqual(response.status, '200 OK') + + # response = self.app.get('/tenders/{}'.format(tender['id'])) + # self.assertEqual(response.status, '200 OK') + # self.assertEqual(response.content_type, 'application/json') + + tender_data = self.db.get(tender["id"]) + tender_data["status"] = "complete" + self.db.save(tender_data) + + +@mock.patch("openprocurement.tender.core.models.CANT_DELETE_PERIOD_START_DATE_FROM", get_now() - timedelta(days=1)) +def required_field_deletion(self): + response = self.app.post_json("/tenders", {"data": self.initial_data}) + self.assertEqual(response.status, "201 Created") + tender = response.json["data"] + token = response.json["access"]["token"] + + response = self.app.patch_json( + "/tenders/{}?acc_token={}".format(tender["id"], token), + {"data": {"tenderPeriod": {"startDate": None}}}, + status=422, + ) + self.assertEqual(response.status, "422 Unprocessable Entity") + self.assertEqual(response.content_type, "application/json") + self.assertEqual(response.json["status"], "error") + self.assertEqual( + response.json["errors"], + [ + { + u"description": {u"startDate": [u"This field cannot be deleted"]}, + u"location": u"body", + u"name": u"tenderPeriod", + } + ], + ) + + +def tender_Administrator_change(self): + self.create_tender() + self.set_status('active.tendering') + cancellation = dict(**test_cancellation) + cancellation.update({ + "reasonType": "noDemand", + "status": "active", + }) + response = self.app.post_json( + "/tenders/{}/cancellations?acc_token={}".format(self.tender_id, self.tender_token), + {"data": cancellation}, + ) + self.assertEqual(response.status, "201 Created") + self.assertEqual(response.content_type, "application/json") + + self.app.authorization = ("Basic", ("administrator", "")) + response = self.app.patch_json("/tenders/{}".format(self.tender_id), {"data": {"mode": u"test"}}) + self.assertEqual(response.status, "200 OK") + self.assertEqual(response.content_type, "application/json") + self.assertEqual(response.json["data"]["mode"], u"test") + + +def patch_tender_by_pq_bot(self): + response = self.app.post_json("/tenders", {"data": deepcopy(self.initial_data)}) + self.assertEqual(response.status, "201 Created") + tender_id = response.json["data"]["id"] + owner_token = response.json["access"]["token"] + tender = response.json["data"] + + self.assertEqual(tender["status"], "draft") + self.assertEqual(len(tender["items"]), 1) + self.assertNotIn("shortlistedFirms", tender) + self.assertNotIn("classification", tender["items"][0]) + self.assertNotIn("unit", tender["items"][0]) + + data = {"data": { + "status": "draft.publishing", + "profile": test_short_profile["id"]} + } + response = self.app.patch_json("/tenders/{}?acc_token={}".format(tender_id, owner_token), data) + self.assertEqual(response.status, "200 OK") + tender = response.json["data"] + self.assertEqual(tender["status"], "draft.publishing") + self.assertEqual(tender["profile"], test_short_profile["id"]) + + items = deepcopy(tender["items"]) + items[0]["classification"] = test_short_profile["classification"] + items[0]["unit"] = test_short_profile["unit"] + amount = sum([item["quantity"] for item in items]) * test_short_profile["value"]["amount"] + value = deepcopy(test_short_profile["value"]) + value["amount"] = amount + criteria = deepcopy(test_short_profile["criteria"]) + data = { + "data": { + "status": "active.tendering", + "items": items, + "shortlistedFirms": test_shortlisted_firms, + "criteria": criteria, + "value": value + } + } + + # try to patch by user + for patch in ({'data': {'status': 'active.tendering'}}, data): + with change_auth(self.app, ("Basic", ("broker", ""))) as app: + resp = app.patch_json("/tenders/{}?acc_token={}".format(tender_id, owner_token), patch, status=403) + self.assertEqual(resp.status, "403 Forbidden") + self.assertEqual(resp.json['status'], "error") + self.assertEqual(resp.json['errors'], [ + {'description': "tender_owner can't switch tender from status (draft.publishing) to (active.tendering)", + 'location': 'body', + 'name': 'data'} + ]) + + # patch by bot + with change_auth(self.app, ("Basic", ("pricequotation", ""))) as app: + resp = app.patch_json("/tenders/{}".format(tender_id), data) + response = self.app.get("/tenders/{}".format(tender_id)) + self.assertEqual(response.status, "200 OK") + tender = response.json["data"] + self.assertEqual(tender["status"], data["data"]["status"]) + self.assertIn("classification", tender["items"][0]) + self.assertIn("unit", tender["items"][0]) + self.assertEqual(len(tender["shortlistedFirms"]), len(test_shortlisted_firms)) + self.assertEqual(len(tender["criteria"]), len(test_short_profile["criteria"])) + self.assertEqual(tender["value"], value) + + # switch tender to `draft.unsuccessful` + response = self.app.post_json("/tenders", {"data": deepcopy(self.initial_data)}) + self.assertEqual(response.status, "201 Created") + tender_id = response.json["data"]["id"] + owner_token = response.json["access"]["token"] + tender = response.json["data"] + + self.assertEqual(tender["status"], "draft") + self.assertEqual(len(tender["items"]), 1) + self.assertNotIn("shortlistedFirms", tender) + self.assertNotIn("classification", tender["items"][0]) + self.assertNotIn("unit", tender["items"][0]) + + data = {"data": {"status": "draft.publishing", "profile": "a1b2c3-a1b2c3e4-f1g2i3-h1g2k3l4"}} + response = self.app.patch_json("/tenders/{}?acc_token={}".format(tender_id, owner_token), data, status=422) + self.assertEqual( + response.json["errors"], + [{"location": "body", "name": "profile", "description": ["The profile value doesn't match id pattern"]}] + ) + + # set not existed profile id + data["data"]["profile"] = "123456-12345678-123456-12345678" + response = self.app.patch_json("/tenders/{}?acc_token={}".format(tender_id, owner_token), data) + self.assertEqual(response.status, "200 OK") + tender = response.json["data"] + self.assertEqual(tender["status"], "draft.publishing") + self.assertEqual(tender["profile"], "123456-12345678-123456-12345678") + + with change_auth(self.app, ("Basic", ("pricequotation", ""))) as app: + self.app.patch_json( + "/tenders/{}".format(tender_id), + {"data": {"status": "draft.unsuccessful", "unsuccessfulReason": ["Profile not found in catalogue"]}} + ) + + response = self.app.get("/tenders/{}".format(tender_id)) + self.assertEqual(response.status, "200 OK") + tender = response.json["data"] + self.assertEqual(tender["status"], "draft.unsuccessful") + self.assertEqual(tender["unsuccessfulReason"], ["Profile not found in catalogue"]) + self.assertNotIn("classification", tender["items"][0]) + self.assertNotIn("unit", tender["items"][0]) + self.assertNotIn("shortlistedFirms", tender) + +# TenderProcessTest + + +def invalid_tender_conditions(self): + # create tender + response = self.app.post_json("/tenders", {"data": self.initial_data}) + tender_id = self.tender_id = response.json["data"]["id"] + owner_token = response.json["access"]["token"] + # switch to active.tendering + self.set_status("active.tendering") + # cancellation + cancellation = dict(**test_cancellation) + cancellation.update({ + "reason": "invalid conditions", + "reasonType": "noDemand", + }) + response = self.app.post_json( + "/tenders/{}/cancellations?acc_token={}".format(tender_id, owner_token), + {"data": cancellation}, + ) + cancellation_id = response.json["data"]["id"] + response = self.app.post( + "/tenders/{}/cancellations/{}/documents?acc_token={}".format( + self.tender_id, cancellation_id, self.tender_token + ), + upload_files=[("file", "name.doc", "content")], + ) + + response = self.app.patch_json( + "/tenders/{}/cancellations/{}?acc_token={}".format(tender_id, cancellation_id, owner_token), + {"data": {"status": "active"}}, + ) + + # check status + response = self.app.get("/tenders/{}".format(self.tender_id)) + self.assertEqual(response.json["data"]["status"], "cancelled") + + +def one_valid_bid_tender(self): + tender_id = self.tender_id + owner_token = self.tender_token + # create bid + self.app.authorization = ("Basic", ("broker", "")) + resp = self.app.post_json( + "/tenders/{}/bids".format(tender_id), {"data": { + "tenderers": [test_organization], + "value": {"amount": 500}, + "requirementResponses": test_requirement_response_valid + }} + ) + token = resp.json['access']['token'] + # switch to active.qualification + self.set_status("active.qualification") + self.app.authorization = ("Basic", ("chronograph", "")) + response = self.app.patch_json("/tenders/{}".format(tender_id), {"data": {"id": tender_id}}) + # get awards + self.app.authorization = ("Basic", ("broker", "")) + response = self.app.get("/tenders/{}/awards?acc_token={}".format(tender_id, owner_token)) + # get pending award + award_id = [i["id"] for i in response.json["data"] if i["status"] == "pending"][0] + award_date = [i["date"] for i in response.json["data"] if i["status"] == "pending"][0] + # set award as active + response = self.app.patch_json( + "/tenders/{}/awards/{}?acc_token={}".format(tender_id, award_id, token), + {"data": {"status": "active"}} + ) + self.assertNotEqual(response.json["data"]["date"], award_date) + + # get contract id + response = self.app.get("/tenders/{}".format(tender_id)) + contract_id = response.json["data"]["contracts"][-1]["id"] + # after stand slill period + self.set_status("active.awarded", 'end') + # sign contract + self.app.authorization = ("Basic", ("broker", "")) + self.app.patch_json( + "/tenders/{}/contracts/{}?acc_token={}".format(tender_id, contract_id, owner_token), + {"data": {"status": "active", "value": {"valueAddedTaxIncluded": False}}}, + ) + # check status + self.app.authorization = ("Basic", ("broker", "")) + response = self.app.get("/tenders/{}".format(tender_id)) + self.assertEqual(response.json["data"]["status"], "complete") + + +def one_invalid_bid_tender(self): + tender_id = self.tender_id + owner_token = self.tender_token + # create bid + self.app.authorization = ("Basic", ("broker", "")) + resp = self.app.post_json( + "/tenders/{}/bids".format(tender_id), {"data": {"tenderers": [test_organization], "value": {"amount": 500}, "requirementResponses": test_requirement_response_valid}} + ) + token = resp.json['access']['token'] + # switch to active.qualification + self.set_status('active.tendering', 'end') + resp = self.check_chronograph() + self.assertEqual(resp.json['data']['status'], 'active.qualification') + # get awards + self.app.authorization = ("Basic", ("broker", "")) + response = self.app.get("/tenders/{}/awards?acc_token={}".format(tender_id, owner_token)) + # get pending award + award_id = [i["id"] for i in response.json["data"] if i["status"] == "pending"][0] + # set award as unsuccessful + self.app.patch_json( + "/tenders/{}/awards/{}?acc_token={}".format(tender_id, award_id, token), + {"data": {"status": "unsuccessful"}}, + ) + # check status + self.app.authorization = ("Basic", ("broker", "")) + response = self.app.get("/tenders/{}".format(tender_id)) + self.assertEqual(response.json["data"]["status"], "unsuccessful") + + +def first_bid_tender(self): + tender_id = self.tender_id + owner_token = self.tender_token + # create bid + response = self.app.post_json( + "/tenders/{}/bids".format(tender_id), + {"data": { + "tenderers": [test_organization], + "value": {"amount": 450}, + "requirementResponses": test_requirement_response_valid + }} + ) + bid_1 = response.json["data"]["id"] + bid_token1 = response.json["access"]["token"] + + # create second bid + response = self.app.post_json( + "/tenders/{}/bids".format(tender_id), + {"data": { + "tenderers": [test_organization], + "value": {"amount": 300}, + "requirementResponses": test_requirement_response_valid + }} + ) + bid_2 = response.json["data"]["id"] + bid_token2 = response.json["access"]["token"] + self.set_status('active.tendering', 'end') + resp = self.check_chronograph() + self.assertEqual(resp.json['data']['status'], 'active.qualification') + # get awards + self.app.authorization = ("Basic", ("broker", "")) + response = self.app.get("/tenders/{}/awards?acc_token={}".format(tender_id, owner_token)) + # get pending award + award = [i for i in response.json["data"] if i["status"] == "pending"][0] + award_id = award['id'] + self.assertEqual(award['bid_id'], bid_2) + self.assertEqual(award['value']['amount'], 300) + # set award as unsuccessful + self.app.patch_json( + "/tenders/{}/awards/{}?acc_token={}".format(tender_id, award_id, bid_token2), + {"data": {"status": "unsuccessful"}}, + ) + # get awards + self.app.authorization = ("Basic", ("broker", "")) + response = self.app.get("/tenders/{}/awards?acc_token={}".format(tender_id, owner_token)) + # get pending award + award = [i for i in response.json["data"] if i["status"] == "pending"][0] + award2_id = award['id'] + self.assertEqual(award['bid_id'], bid_1) + self.assertEqual(award['value']['amount'], 450) + self.assertNotEqual(award_id, award2_id) + + # get awards + self.app.authorization = ("Basic", ("broker", "")) + response = self.app.get("/tenders/{}/awards?acc_token={}".format(tender_id, owner_token)) + # get pending award + award_id = [i["id"] for i in response.json["data"] if i["status"] == "pending"][0] + # set award as active + self.app.patch_json( + "/tenders/{}/awards/{}?acc_token={}".format(tender_id, award_id, bid_token1), + {"data": {"status": "active"}} + ) + # get contract id + response = self.app.get("/tenders/{}".format(tender_id)) + contract_id = response.json["data"]["contracts"][-1]["id"] + # create tender contract document for test + response = self.app.post( + "/tenders/{}/contracts/{}/documents?acc_token={}".format(tender_id, contract_id, owner_token), + upload_files=[("file", "name.doc", "content")], + status=201, + ) + self.assertEqual(response.status, "201 Created") + self.assertEqual(response.content_type, "application/json") + doc_id = response.json["data"]["id"] + self.assertIn(doc_id, response.headers["Location"]) + + # sign contract + self.app.authorization = ("Basic", ("broker", "")) + self.app.patch_json( + "/tenders/{}/contracts/{}?acc_token={}".format(tender_id, contract_id, owner_token), + {"data": {"status": "active", "value": {"valueAddedTaxIncluded": False}}}, + ) + # check status + self.app.authorization = ("Basic", ("broker", "")) + response = self.app.get("/tenders/{}".format(tender_id)) + self.assertEqual(response.json["data"]["status"], "complete") + + response = self.app.post( + "/tenders/{}/contracts/{}/documents?acc_token={}".format(tender_id, contract_id, owner_token), + upload_files=[("file", "name.doc", "content")], + status=403, + ) + self.assertEqual(response.status, "403 Forbidden") + self.assertEqual(response.content_type, "application/json") + self.assertEqual( + response.json["errors"][0]["description"], "Can't add document in current (complete) tender status" + ) + + response = self.app.patch_json( + "/tenders/{}/contracts/{}/documents/{}?acc_token={}".format(tender_id, contract_id, doc_id, owner_token), + {"data": {"description": "document description"}}, + status=403, + ) + self.assertEqual(response.status, "403 Forbidden") + self.assertEqual(response.content_type, "application/json") + self.assertEqual( + response.json["errors"][0]["description"], "Can't update document in current (complete) tender status" + ) + + response = self.app.put( + "/tenders/{}/contracts/{}/documents/{}?acc_token={}".format(tender_id, contract_id, doc_id, owner_token), + upload_files=[("file", "name.doc", "content3")], + status=403, + ) + self.assertEqual(response.status, "403 Forbidden") + self.assertEqual(response.content_type, "application/json") + self.assertEqual( + response.json["errors"][0]["description"], "Can't update document in current (complete) tender status" + ) + + +def lost_contract_for_active_award(self): + tender_id = self.tender_id + owner_token = self.tender_token + # create bid + self.app.authorization = ("Basic", ("broker", "")) + resp = self.app.post_json( + "/tenders/{}/bids".format(tender_id), {"data": { + "tenderers": [test_organization], + "value": {"amount": 500}, + "requirementResponses": test_requirement_response_valid + }} + ) + token = resp.json['access']['token'] + # switch to active.qualification + self.set_status("active.tendering", 'end') + resp = self.check_chronograph().json + self.assertEqual(resp['data']['status'], 'active.qualification') + + # get awards + self.app.authorization = ("Basic", ("broker", "")) + response = self.app.get("/tenders/{}/awards?acc_token={}".format(tender_id, owner_token)) + # get pending award + award_id = [i["id"] for i in response.json["data"] if i["status"] == "pending"][0] + # set award as active + self.app.patch_json( + "/tenders/{}/awards/{}?acc_token={}".format(tender_id, award_id, token), {"data": {"status": "active"}} + ) + # lost contract + tender = self.db.get(tender_id) + tender["contracts"] = None + self.db.save(tender) + # check tender + response = self.app.get("/tenders/{}".format(tender_id)) + self.assertEqual(response.json["data"]["status"], "active.awarded") + self.assertNotIn("contracts", response.json["data"]) + self.assertIn("next_check", response.json["data"]) + # create lost contract + self.app.authorization = ("Basic", ("chronograph", "")) + response = self.app.patch_json("/tenders/{}".format(tender_id), {"data": {"id": tender_id}}) + self.assertEqual(response.json["data"]["status"], "active.awarded") + self.assertIn("contracts", response.json["data"]) + self.assertNotIn("next_check", response.json["data"]) + contract_id = response.json["data"]["contracts"][-1]["id"] + # sign contract + self.app.authorization = ("Basic", ("broker", "")) + self.app.patch_json( + "/tenders/{}/contracts/{}?acc_token={}".format(tender_id, contract_id, owner_token), + {"data": {"status": "active", "value": {"valueAddedTaxIncluded": False}}}, + ) + # check status + self.app.authorization = ("Basic", ("broker", "")) + response = self.app.get("/tenders/{}".format(tender_id)) + self.assertEqual(response.json["data"]["status"], "complete") + + diff --git a/src/openprocurement/tender/pricequotation/tests/tests.ini b/src/openprocurement/tender/pricequotation/tests/tests.ini new file mode 100644 index 0000000000..207b95f1f7 --- /dev/null +++ b/src/openprocurement/tender/pricequotation/tests/tests.ini @@ -0,0 +1,28 @@ +[app:main] +use = egg:openprocurement.api + +couchdb.db_name = tests_tender_pricequotation +couchdb.url = http://op:op@couchdb:5984/ + +auth.file = %(here)s/../../../api/tests/auth.ini + +pyramid.reload_templates = true +pyramid.debug_authorization = true +pyramid.debug_notfound = false +pyramid.debug_routematch = false +pyramid.debug_templates = true +pyramid.default_locale_name = en +plugins = + api, + tender.core, + tender.pricequotation +update_after = false + +dockey = 480310b588d10049d4a1199c37c258ecc9e2d15fde6851cbe8eaf35210fbefc0 +dockeys = a8968c4682ffa921c91caab5b60c84fbd089311549e5c3defd48f413c89337b6 + +[server:main] +use = egg:chaussette +host = 0.0.0.0 +port = 6543 +backend = gevent diff --git a/src/openprocurement/tender/pricequotation/utils.py b/src/openprocurement/tender/pricequotation/utils.py new file mode 100644 index 0000000000..804ff794e8 --- /dev/null +++ b/src/openprocurement/tender/pricequotation/utils.py @@ -0,0 +1,198 @@ +# -*- coding: utf-8 -*- +from collections import defaultdict +from logging import getLogger +from pyramid.security import Allow +from openprocurement.api.utils import get_now, context_unpack +from openprocurement.tender.core.utils import ( + remove_draft_bids, + calculate_tender_business_date, +) + +from openprocurement.tender.belowthreshold.utils import add_contract +from openprocurement.tender.pricequotation.constants import QUALIFICATION_DURATION + + +LOGGER = getLogger("openprocurement.tender.pricequotation") + + +def check_bids(request): + tender = request.validated["tender"] + pending_cancellations = [ + i.status not in ["active", "unsuccessful"] + for i in tender.cancellations + ] + if any(pending_cancellations): + return + if tender.numberOfBids == 0: + tender.status = "unsuccessful" + else: + add_next_award(request) + + +def cancel_tender(request): + tender = request.validated["tender"] + if tender.status in ["active.tendering"]: + tender.bids = [] + tender.status = "cancelled" + + +def check_award_status(request): + tender = request.validated["tender"] + now = get_now() + awards = tender.awards + for award in awards: + if award.status == 'pending' and \ + calculate_tender_business_date(award.date, QUALIFICATION_DURATION, tender) <= now: + award.status = 'unsuccessful' + add_next_award(request) + if award.status == "active" and not any([i.awardID == award.id for i in tender.contracts]): + add_contract(request, award, now) + add_next_award(request) + + +def check_status(request): + + check_award_status(request) + + tender = request.validated["tender"] + now = get_now() + + if tender.status == "active.tendering" and tender.tenderPeriod.endDate <= now: + tender.status = "active.qualification" + remove_draft_bids(request) + check_bids(request) + status = tender.status + LOGGER.info( + "Switched tender {} to {}".format(tender["id"], status), + extra=context_unpack(request, + {"MESSAGE_ID": "switched_tender_{}".format(status)}), + ) + return + elif tender.status == "active.awarded": + check_tender_status(request) + + +def check_tender_status(request): + tender = request.validated["tender"] + last_award_status = tender.awards[-1].status if tender.awards else "" + if last_award_status == "unsuccessful": + LOGGER.info( + "Switched tender {} to {}".format(tender.id, "unsuccessful"), + extra=context_unpack( + request, + {"MESSAGE_ID": "switched_tender_unsuccessful"} + ), + ) + tender.status = "unsuccessful" + if tender.contracts and tender.contracts[-1].status == "active": + tender.status = "complete" + + +def add_next_award(request): + tender = request.validated["tender"] + now = get_now() + if not tender.awardPeriod: + tender.awardPeriod = type(tender).awardPeriod({}) + if not tender.awardPeriod.startDate: + tender.awardPeriod.startDate = now + if not tender.awards or tender.awards[-1].status not in ["pending", "active"]: + unsuccessful_awards = [ + a.bid_id for a in tender.awards + if a.status == "unsuccessful" + ] + bids = sorted([ + bid for bid in tender.bids + if bid.id not in unsuccessful_awards + ], key=lambda bid: bid.value.amount) + if bids: + bid = bids[0].serialize() + award = type(tender).awards.model_class( + { + "bid_id": bid["id"], + "status": "pending", + "date": get_now(), + "value": bid["value"], + "suppliers": bid["tenderers"], + } + ) + award.__parent__ = tender + tender.awards.append(award) + request.response.headers["Location"] = request.route_url( + "{}:Tender Awards".format(tender.procurementMethodType), + tender_id=tender.id, + award_id=award["id"] + ) + else: + tender.status = 'unsuccessful' + return + if tender.awards[-1].status == "pending": + tender.awardPeriod.endDate = None + tender.status = "active.qualification" + else: + tender.awardPeriod.endDate = now + tender.status = "active.awarded" + + +def get_bid_owned_award_acl(award): + acl = [] + if not hasattr(award, "__parent__") or 'bids' not in award.__parent__: + return acl + tender = award.__parent__ + awarded_bid = [bid for bid in tender.bids if bid.id == award.bid_id][0] + prev_awards = [ + a for a in tender.awards + if a.bid_id == awarded_bid.id and + a.id != award.id and + a['status'] != 'pending' + ] + bid_acl = "_".join((awarded_bid.owner, awarded_bid.owner_token)) + owner_acl = "_".join((tender.owner, tender.owner_token)) + + if prev_awards or award.status != 'pending': + acl.extend([ + (Allow, owner_acl, "upload_award_documents"), + (Allow, owner_acl, "edit_award") + ]) + else: + acl.extend([ + (Allow, bid_acl, "upload_award_documents"), + (Allow, bid_acl, "edit_award") + ]) + return acl + + +def find_parent(id_): + parts = id_.split('-') + return '-'.join(parts[:-1]) + + +def requirements_to_tree(requirements): + return { + requirement['id']: requirement + for requirement in requirements + } + + +def group_to_tree(groups): + return { + group['id']: requirements_to_tree(group['requirements']) + for group in groups + } + + +def criteria_to_tree(criterias): + return { + criteria['id']: group_to_tree(criteria['requirementGroups']) + for criteria in criterias + } + + +def responses_to_tree(responses): + groups = defaultdict(dict) + for response in responses: + groups[find_parent(response.requirement.id)][response['requirement']['id']] = response + + criterias = defaultdict(dict) + for group_id, group in groups.items(): + criterias[find_parent(group_id)][group_id] = group + return criterias diff --git a/src/openprocurement/tender/pricequotation/validation.py b/src/openprocurement/tender/pricequotation/validation.py new file mode 100644 index 0000000000..74552b3bf0 --- /dev/null +++ b/src/openprocurement/tender/pricequotation/validation.py @@ -0,0 +1,193 @@ +# -*- coding: utf-8 -*- +from schematics.exceptions import ValidationError + +from openprocurement.api.utils import error_handler, raise_operation_error +from openprocurement.api.validation import\ + validate_data, OPERATIONS, validate_json_data +from openprocurement.tender.pricequotation.utils import\ + responses_to_tree, criteria_to_tree +from openprocurement.tender.core.validation import TYPEMAP + + +# tender documents +def validate_document_operation_in_not_allowed_period(request): + if request.validated["tender_status"] not in ["active.tendering", "draft"]: + raise_operation_error( + request, + "Can't {} document in current ({}) tender status".format( + OPERATIONS.get(request.method), request.validated["tender_status"] + ), + ) + + +# award +def validate_create_award_not_in_allowed_period(request): + tender = request.validated["tender"] + if tender.status != "active.qualification": + raise_operation_error( + request, + "Can't create award in current ({}) tender status".format( + tender.status + ) + ) + + +def validate_award_update_in_terminal_status(request): + award_status = request.validated['award'].status + if award_status in ('cancelled', 'unsuccessful'): + raise_operation_error( + request, + "Can't update award in current ({}) status".format( + award_status + ) + ) + + +# contract document +def validate_contract_document(request): + operation = OPERATIONS.get(request.method) + if request.validated["tender_status"] not in\ + ["active.qualification", "active.awarded"]: + raise_operation_error( + request, + "Can't {} document in current ({}) tender status".format( + operation, request.validated["tender_status"] + ), + ) + if request.validated["contract"].status not in ["pending", "active"]: + raise_operation_error( + request, + "Can't {} document in current contract status".format(operation) + ) + return True + + +def validate_patch_tender_data(request): + model = type(request.tender) + data = validate_data(request, model, True, validate_json_data(request)) + validate_kind_update(request, model) + return data + + +def validate_kind_update(request, model): + data = request.validated["data"] + kind = data.get("procuringEntity", {}).get("kind", "") + if kind and kind not in model.procuring_entity_kinds: + request.errors.add( + "procuringEntity", "kind", + "{kind!r} procuringEntity cannot publish this type of procedure. Only {kinds} are allowed.".format( + kind=kind, kinds=", ".join(model.procuring_entity_kinds) + ) + ) + request.errors.status = 403 + + +def validate_bid_value(tender, value): + if not value: + raise ValidationError(u"This field is required.") + if tender.value.amount < value.amount: + raise ValidationError(u"value of bid should be less than value of tender") + if tender.get("value").currency != value.currency: + raise ValidationError(u"currency of bid should be identical to currency of value of tender") + if tender.get("value").valueAddedTaxIncluded != value.valueAddedTaxIncluded: + raise ValidationError( + u"valueAddedTaxIncluded of bid should be identical " u"to valueAddedTaxIncluded of value of tender" + ) + + +def validate_requirement_responses(criterias, req_responses): + criterias = criteria_to_tree(criterias) + responses = responses_to_tree(req_responses) + # top level criterias. all required + diff = set(criterias).difference(responses) + if diff: + raise ValidationError(u'Missing references for criterias: {}'.format( + list(diff) + )) + + for criteria_id, group_response in responses.items(): + # OR for requirementGroup + if len(group_response) > 1: + raise ValidationError( + u'Provided groups {} conflicting in criteria {}'.format( + group_response.keys(), criteria_id + )) + criteria_groups = criterias[criteria_id] + for group_id, requirements in criteria_groups.items(): + if group_id not in group_response: + continue + # response satisfies requirement + responses = group_response.get(group_id, set()) + diff = set(requirements).difference(responses) + if diff: + raise ValidationError( + u'Missing references for reqirements: {}'.format( + list(diff) + )) + for response_id, response in responses.items(): + matches(requirements[response_id], response) + + +def matches(criteria, response): + datatype = TYPEMAP[criteria['dataType']] + # validate value + value = datatype.to_native(response['value']) + + expected = criteria.get('expectedValue') + min_value = criteria.get('minValue') + max_value = criteria.get('maxValue') + + if expected: + expected = datatype.to_native(expected) + if datatype.to_native(expected) != value: + raise ValidationError( + u'Value "{}" does not match expected value "{}" in reqirement {}'.format( + value, expected, criteria['id'] + ) + ) + if min_value and max_value: + min_value = datatype.to_native(min_value) + max_value = datatype.to_native(max_value) + if value < min_value or value > max_value: + raise ValidationError( + u'Value "{}" does not match range from "{}" to "{}" in reqirement {}'.format( + value, + min_value, + max_value, + criteria['id'] + ) + ) + + if min_value and not max_value: + min_value = datatype.to_native(min_value) + if value < min_value: + raise ValidationError( + u'Value {} is lower then minimal required {} in reqirement {}'.format( + value, + min_value, + criteria['id'] + ) + ) + if not min_value and max_value: + if value > datatype.to_native(max_value): + raise ValidationError( + u'Value {} is higher then required {} in reqirement {}'.format( + value, + max_value, + criteria['id'] + ) + ) + return response + + +def validate_tender_publish(request): + current_status = request.validated['tender'].status + tender_status = request.validated['data'].get('status', current_status) + if tender_status == current_status: + return + if request.authenticated_role not in ("bots", "Administrator", "chronograph") \ + and tender_status != "draft.publishing": + raise_operation_error(request, + "{} can't switch tender from status ({}) to ({})".format(request.authenticated_role, + current_status, + tender_status)) diff --git a/src/openprocurement/tender/pricequotation/views/__init__.py b/src/openprocurement/tender/pricequotation/views/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/openprocurement/tender/pricequotation/views/award.py b/src/openprocurement/tender/pricequotation/views/award.py new file mode 100644 index 0000000000..7671fe5469 --- /dev/null +++ b/src/openprocurement/tender/pricequotation/views/award.py @@ -0,0 +1,114 @@ +# -*- coding: utf-8 -*- +from openprocurement.api.utils import\ + get_now, json_view, context_unpack, raise_operation_error +from openprocurement.tender.core.utils import\ + optendersresource, save_tender, apply_patch +from openprocurement.tender.belowthreshold.views.award import\ + TenderAwardResource +from openprocurement.tender.pricequotation.utils import\ + add_next_award, add_contract +from openprocurement.tender.pricequotation.constants import PMT +from openprocurement.tender.core.validation import ( + validate_award_data, + validate_patch_award_data, + validate_update_award_in_not_allowed_status, +) +from openprocurement.tender.pricequotation.validation import ( + validate_create_award_not_in_allowed_period, + validate_award_update_in_terminal_status, +) + + +@optendersresource( + name="{}:Tender Awards".format(PMT), + collection_path="/tenders/{tender_id}/awards", + path="/tenders/{tender_id}/awards/{award_id}", + description="Tender awards", + procurementMethodType=PMT, +) +class PQTenderAwardResource(TenderAwardResource): + """ PriceQuotation award resource """ + @json_view( + content_type="application/json", + permission="create_award", + validators=( + validate_award_data, + validate_create_award_not_in_allowed_period, + ), + ) + def collection_post(self): + tender = self.request.validated["tender"] + award = self.request.validated["award"] + tender.awards.append(award) + if save_tender(self.request): + self.LOGGER.info( + "Created tender award {}".format(award.id), + extra=context_unpack( + self.request, + {"MESSAGE_ID": "tender_award_create"}, + {"award_id": award.id} + ), + ) + self.request.response.status = 201 + self.request.response.headers["Location"] = self.request.route_url( + "{}:Tender Awards".format(tender.procurementMethodType), + tender_id=tender.id, award_id=award["id"] + ) + + return {"data": award.serialize("view")} + + @json_view( + content_type="application/json", + permission="edit_award", + validators=( + validate_patch_award_data, + validate_update_award_in_not_allowed_status, + validate_award_update_in_terminal_status + ), + ) + def patch(self): + tender = self.request.validated["tender"] + award = self.request.context + is_awarded = [ + a for a in tender.awards + if a.bid_id == award.bid_id and a.id != award.id + ] + award_status = award.status + apply_patch(self.request, save=False, src=self.request.context.serialize()) + + now = get_now() + if is_awarded and award.status != 'unsuccessful': + raise_operation_error( + self.request, + "Can't change award status to {} from {}".format(award.status, award_status) + ) + + if award_status == "pending" and award.status == "active": + add_contract(self.request, award, now) + add_next_award(self.request) + elif award_status == "active" and award.status == "cancelled": + for i in tender.contracts: + if i.awardID == award.id: + i.status = "cancelled" + add_next_award(self.request) + elif award_status == "pending" and award.status == "unsuccessful": + if is_awarded: + tender.status = 'unsuccessful' + else: + add_next_award(self.request) + elif self.request.authenticated_role != "Administrator" and not ( + award_status == "pending" and award.status == "pending" + ): + raise_operation_error( + self.request, + "Can't update award in current ({}) status".format(award_status) + ) + if save_tender(self.request): + self.LOGGER.info( + "Updated tender award {}".format(self.request.context.id), + extra=context_unpack( + self.request, + {"MESSAGE_ID": "tender_award_patch"} + ), + ) + return {"data": award.serialize("view")} diff --git a/src/openprocurement/tender/pricequotation/views/award_document.py b/src/openprocurement/tender/pricequotation/views/award_document.py new file mode 100644 index 0000000000..6dfc0c71cf --- /dev/null +++ b/src/openprocurement/tender/pricequotation/views/award_document.py @@ -0,0 +1,59 @@ +# -*- coding: utf-8 -*- +from openprocurement.api.utils import json_view +from openprocurement.api.validation import ( + validate_file_update, + validate_file_upload, + validate_patch_document_data, +) +from openprocurement.tender.core.validation import ( + validate_award_document_tender_not_in_allowed_status_base, + validate_award_document_author, +) +from openprocurement.tender.core.utils import optendersresource +from openprocurement.tender.belowthreshold.views.award_document import TenderAwardDocumentResource +from openprocurement.tender.pricequotation.constants import PMT + + +@optendersresource( + name="{}:Tender Award Documents".format(PMT), + collection_path="/tenders/{tender_id}/awards/{award_id}/documents", + path="/tenders/{tender_id}/awards/{award_id}/documents/{document_id}", + procurementMethodType=PMT, + description="Tender award documents", +) +class PQTenderAwardDocumentResource(TenderAwardDocumentResource): + """ PriceQuotation award document resource """ + + @json_view( + validators=( + validate_file_upload, + validate_award_document_tender_not_in_allowed_status_base, + validate_award_document_author, + ), + permission="upload_award_documents" + ) + def collection_post(self): + return super(TenderAwardDocumentResource, self).collection_post() + + @json_view( + validators=( + validate_file_update, + validate_award_document_tender_not_in_allowed_status_base, + validate_award_document_author, + ), + permission="upload_award_documents" + ) + def put(self): + return super(TenderAwardDocumentResource, self).put() + + @json_view( + content_type="application/json", + validators=( + validate_patch_document_data, + validate_award_document_tender_not_in_allowed_status_base, + validate_award_document_author, + ), + permission="upload_award_documents", + ) + def patch(self): + return super(TenderAwardDocumentResource, self).patch() diff --git a/src/openprocurement/tender/pricequotation/views/bid.py b/src/openprocurement/tender/pricequotation/views/bid.py new file mode 100644 index 0000000000..cfa1cca2a8 --- /dev/null +++ b/src/openprocurement/tender/pricequotation/views/bid.py @@ -0,0 +1,68 @@ +# -*- coding: utf-8 -*- +from openprocurement.api.validation import OPERATIONS +from openprocurement.api.utils import\ + get_now, json_view, context_unpack, raise_operation_error +from openprocurement.tender.core.utils import optendersresource, apply_patch +from openprocurement.tender.core.validation import ( + validate_patch_bid_data, + validate_bid_operation_period, + validate_bid_operation_not_in_tendering, +) + +from openprocurement.tender.belowthreshold.views.bid import\ + TenderBidResource as BaseTenderBidResource +from openprocurement.tender.belowthreshold.validation import\ + validate_update_bid_status +from openprocurement.tender.pricequotation.constants import PMT + + +@optendersresource( + name="{}:Tender Bids".format(PMT), + collection_path="/tenders/{tender_id}/bids", + path="/tenders/{tender_id}/bids/{bid_id}", + procurementMethodType=PMT, + description="Tender bids", +) +class TenderBidResource(BaseTenderBidResource): + """ PriceQuotation tender bid resource """ + @json_view( + content_type="application/json", + permission="edit_bid", + validators=( + validate_patch_bid_data, + validate_bid_operation_not_in_tendering, + validate_bid_operation_period, + validate_update_bid_status, + ), + ) + def patch(self): + value = self.request.validated["data"].get("value") and self.request.validated["data"]["value"].get("amount") + if value and value != self.request.context.get("value", {}).get("amount"): + self.request.validated["data"]["date"] = get_now().isoformat() + self.request.validated["tender"].modified = False + if apply_patch(self.request, src=self.request.context.serialize()): + self.LOGGER.info( + "Updated tender bid {}".format(self.request.context.id), + extra=context_unpack(self.request, {"MESSAGE_ID": "tender_bid_patch"}), + ) + return {"data": self.request.context.serialize("view")} + + @json_view( + permission="edit_bid", + validators=( + validate_bid_operation_not_in_tendering, + validate_bid_operation_period + ) + ) + def delete(self): + """ + Cancelling the proposal. + Forbidden for price quotation tender. + """ + request = self.request + raise_operation_error( + request, + "Can't {} bid in Price Quotation tender".format( + OPERATIONS.get(request.method), + ), + ) diff --git a/src/openprocurement/tender/pricequotation/views/bid_document.py b/src/openprocurement/tender/pricequotation/views/bid_document.py new file mode 100644 index 0000000000..0c6660953d --- /dev/null +++ b/src/openprocurement/tender/pricequotation/views/bid_document.py @@ -0,0 +1,16 @@ +# -*- coding: utf-8 -*- +from openprocurement.tender.core.views.bid_document import\ + TenderBidDocumentResource +from openprocurement.tender.core.utils import optendersresource +from openprocurement.tender.pricequotation.constants import PMT + + +@optendersresource( + name="{}:Tender Bid Documents".format(PMT), + collection_path="/tenders/{tender_id}/bids/{bid_id}/documents", + path="/tenders/{tender_id}/bids/{bid_id}/documents/{document_id}", + procurementMethodType=PMT, + description="Tender bidder documents", +) +class PQTenderBidDocumentResource(TenderBidDocumentResource): + pass diff --git a/src/openprocurement/tender/pricequotation/views/cancellation.py b/src/openprocurement/tender/pricequotation/views/cancellation.py new file mode 100644 index 0000000000..27eded2f83 --- /dev/null +++ b/src/openprocurement/tender/pricequotation/views/cancellation.py @@ -0,0 +1,81 @@ +# -*- coding: utf-8 -*- +from openprocurement.api.utils import json_view, get_now,\ + context_unpack +from openprocurement.tender.core.utils import\ + optendersresource, save_tender, apply_patch +from openprocurement.tender.belowthreshold.views.cancellation import\ + TenderCancellationResource +from openprocurement.tender.core.validation import ( + validate_tender_not_in_terminated_status, + validate_cancellation_data, + validate_patch_cancellation_data, + validate_cancellation_status_without_complaints +) +from openprocurement.tender.pricequotation.utils import cancel_tender +from openprocurement.tender.pricequotation.constants import PMT + + +@optendersresource( + name="{}:Tender Cancellations".format(PMT), + collection_path="/tenders/{tender_id}/cancellations", + path="/tenders/{tender_id}/cancellations/{cancellation_id}", + procurementMethodType=PMT, + description="Tender cancellations", +) +class PQTenderCancellationResource(TenderCancellationResource): + """PriceQuotation cancellation""" + + @json_view( + content_type="application/json", + validators=( + validate_tender_not_in_terminated_status, + validate_cancellation_data, + ), + permission="edit_tender" + ) + def collection_post(self): + cancellation = self.request.validated["cancellation"] + cancellation.date = get_now() + + self.request.context.cancellations.append(cancellation) + if save_tender(self.request): + self.LOGGER.info( + "Created tender cancellation {}".format(cancellation.id), + extra=context_unpack( + self.request, {"MESSAGE_ID": "tender_cancellation_create"}, {"cancellation_id": cancellation.id} + ), + ) + self.request.response.status = 201 + self.request.response.headers["Location"] = self.request.route_url( + "{}:Tender Cancellations".format(self.request.validated["tender"].procurementMethodType), + tender_id=self.request.validated["tender_id"], + cancellation_id=cancellation.id, + ) + return {"data": cancellation.serialize("view")} + + @json_view( + content_type="application/json", + validators=( + validate_patch_cancellation_data, + validate_cancellation_status_without_complaints, + validate_tender_not_in_terminated_status, + ), + permission="edit_cancellation" + ) + def patch(self): + cancellation = self.request.context + prev_status = cancellation.status + apply_patch(self.request, save=False, src=cancellation.serialize()) + + if cancellation.status == "active" and prev_status != "active": + cancel_tender(self.request) + + if save_tender(self.request): + self.LOGGER.info( + "Updated tender cancellation {}".format(cancellation.id), + extra=context_unpack( + self.request, + {"MESSAGE_ID": "tender_cancellation_patch"} + ), + ) + return {"data": cancellation.serialize("view")} diff --git a/src/openprocurement/tender/pricequotation/views/cancellation_document.py b/src/openprocurement/tender/pricequotation/views/cancellation_document.py new file mode 100644 index 0000000000..4a70a13d28 --- /dev/null +++ b/src/openprocurement/tender/pricequotation/views/cancellation_document.py @@ -0,0 +1,17 @@ +# -*- coding: utf-8 -*- +from openprocurement.tender.core.utils import optendersresource +from openprocurement.tender.belowthreshold.views.cancellation_document import\ + TenderCancellationDocumentResource + +from openprocurement.tender.pricequotation.constants import PMT + + +@optendersresource( + name="{}:Tender Cancellation Documents".format(PMT), + collection_path="/tenders/{tender_id}/cancellations/{cancellation_id}/documents", + path="/tenders/{tender_id}/cancellations/{cancellation_id}/documents/{document_id}", + procurementMethodType=PMT, + description="Tender cancellation documents", +) +class TenderCancellationDocumentResource(TenderCancellationDocumentResource): + """ PriceQuotation cancellation document """ diff --git a/src/openprocurement/tender/pricequotation/views/contract.py b/src/openprocurement/tender/pricequotation/views/contract.py new file mode 100644 index 0000000000..2193c2148c --- /dev/null +++ b/src/openprocurement/tender/pricequotation/views/contract.py @@ -0,0 +1,60 @@ +# -*- coding: utf-8 -*- +from openprocurement.api.utils import\ + json_view, raise_operation_error, context_unpack, get_now +from openprocurement.tender.core.utils import optendersresource,\ + apply_patch, save_tender +from openprocurement.tender.core.validation import ( + validate_patch_contract_data, + validate_update_contract_value, + validate_contract_operation_not_in_allowed_status, + validate_update_contract_value_with_award, + validate_update_contract_value_amount, + validate_update_contract_value_net_required, + validate_update_contract_status_by_supplier +) +from openprocurement.tender.belowthreshold.views.contract\ + import TenderAwardContractResource +from openprocurement.tender.pricequotation.constants import PMT +from openprocurement.tender.pricequotation.utils import check_tender_status + + +@optendersresource( + name="{}:Tender Contracts".format(PMT), + collection_path="/tenders/{tender_id}/contracts", + procurementMethodType=PMT, + path="/tenders/{tender_id}/contracts/{contract_id}", + description="Tender contracts", +) +class PQTenderAwardContractResource(TenderAwardContractResource): + """""" + @json_view( + content_type="application/json", + permission="edit_contract", + validators=( + validate_patch_contract_data, + validate_contract_operation_not_in_allowed_status, + validate_update_contract_status_by_supplier, + validate_update_contract_value, + validate_update_contract_value_net_required, + validate_update_contract_value_with_award, + validate_update_contract_value_amount, + ), + ) + def patch(self): + """Update of contract + """ + contract_status = self.request.context.status + apply_patch(self.request, save=False, src=self.request.context.serialize()) + if contract_status != self.request.context.status and \ + (contract_status not in ("pending", "pending.winner-signing",) or \ + self.request.context.status not in ("active", "pending", "pending.winner-signing",)): + raise_operation_error(self.request, "Can't update contract status") + if self.request.context.status == "active" and not self.request.context.dateSigned: + self.request.context.dateSigned = get_now() + check_tender_status(self.request) + if save_tender(self.request): + self.LOGGER.info( + "Updated tender contract {}".format(self.request.context.id), + extra=context_unpack(self.request, {"MESSAGE_ID": "tender_contract_patch"}), + ) + return {"data": self.request.context.serialize()} diff --git a/src/openprocurement/tender/pricequotation/views/contract_document.py b/src/openprocurement/tender/pricequotation/views/contract_document.py new file mode 100644 index 0000000000..2185870b99 --- /dev/null +++ b/src/openprocurement/tender/pricequotation/views/contract_document.py @@ -0,0 +1,101 @@ +# -*- coding: utf-8 -*- +from openprocurement.api.utils import ( + upload_file, + update_file_content_type, + json_view, + context_unpack, +) +from openprocurement.api.validation import\ + validate_file_update, validate_patch_document_data, validate_file_upload +from openprocurement.tender.core.utils import\ + save_tender, optendersresource, apply_patch +from openprocurement.tender.core.validation import\ + validate_role_for_contract_document_operation +from openprocurement.tender.belowthreshold.views.contract_document\ + import TenderAwardContractDocumentResource +from openprocurement.tender.pricequotation.constants import PMT +from openprocurement.tender.pricequotation.validation import\ + validate_contract_document + + +@optendersresource( + name="{}:Tender Contract Documents".format(PMT), + collection_path="/tenders/{tender_id}/contracts/{contract_id}/documents", + path="/tenders/{tender_id}/contracts/{contract_id}/documents/{document_id}", + procurementMethodType=PMT, + description="Tender contract documents", +) +class PQTenderAwardContractDocumentResource(TenderAwardContractDocumentResource): + + @json_view( + permission="upload_contract_documents", + validators=( + validate_file_upload, + validate_role_for_contract_document_operation, + validate_contract_document, + ) + ) + def collection_post(self): + """Tender Contract Document Upload + """ + document = upload_file(self.request) + self.context.documents.append(document) + if save_tender(self.request): + self.LOGGER.info( + "Created tender contract document {}".format(document.id), + extra=context_unpack( + self.request, + {"MESSAGE_ID": "tender_contract_document_create"}, + {"document_id": document.id} + ), + ) + self.request.response.status = 201 + document_route = self.request.matched_route.name.replace("collection_", "") + self.request.response.headers["Location"] = self.request.current_route_url( + _route_name=document_route, document_id=document.id, _query={} + ) + return {"data": document.serialize("view")} + + @json_view( + validators=( + validate_file_update, + validate_role_for_contract_document_operation, + validate_contract_document, + ), + permission="upload_contract_documents" + ) + def put(self): + """Tender Contract Document Update""" + document = upload_file(self.request) + self.request.validated["contract"].documents.append(document) + if save_tender(self.request): + self.LOGGER.info( + "Updated tender contract document {}".format(self.request.context.id), + extra=context_unpack( + self.request, + {"MESSAGE_ID": "tender_contract_document_put"} + ), + ) + return {"data": document.serialize("view")} + + @json_view( + content_type="application/json", + validators=( + validate_patch_document_data, + validate_role_for_contract_document_operation, + validate_contract_document, + ), + permission="upload_contract_documents" + ) + def patch(self): + """Tender Contract Document Update""" + if apply_patch(self.request, src=self.request.context.serialize()): + update_file_content_type(self.request) + self.LOGGER.info( + "Updated tender contract document {}".format(self.request.context.id), + extra=context_unpack( + self.request, + {"MESSAGE_ID": "tender_contract_document_patch"} + ), + ) + return {"data": self.request.context.serialize("view")} diff --git a/src/openprocurement/tender/pricequotation/views/tender.py b/src/openprocurement/tender/pricequotation/views/tender.py new file mode 100644 index 0000000000..446b020416 --- /dev/null +++ b/src/openprocurement/tender/pricequotation/views/tender.py @@ -0,0 +1,51 @@ +# -*- coding: utf-8 -*- +from datetime import timedelta +from openprocurement.api.utils import context_unpack, json_view, get_now +from openprocurement.tender.core.utils import\ + save_tender, optendersresource, apply_patch +from openprocurement.tender.core.validation import\ + validate_tender_not_in_terminated_status + +from openprocurement.tender.belowthreshold.views.tender import TenderResource +from openprocurement.tender.pricequotation.constants import PMT +from openprocurement.tender.pricequotation.utils import check_status +from openprocurement.tender.pricequotation.validation import\ + validate_patch_tender_data, validate_tender_publish + + +@optendersresource( + name="{}:Tender".format(PMT), + path="/tenders/{tender_id}", + procurementMethodType=PMT, +) +class PriceQuotationTenderResource(TenderResource): + """ + PriceQuotation tender creation and updation + """ + @json_view( + content_type="application/json", + validators=( + validate_patch_tender_data, + validate_tender_publish, + validate_tender_not_in_terminated_status, + ), + permission="edit_tender", + ) + def patch(self): + tender = self.context + if self.request.authenticated_role == "chronograph": + apply_patch(self.request, save=False, src=self.request.validated["tender_src"]) + check_status(self.request) + save_tender(self.request) + else: + new_status = self.request.validated["data"].get("status", "") + data = self.request.validated["data"] + if tender.status == "draft" and new_status == "draft.publishing" and not tender.noticePublicationDate: + now = get_now() + self.request.validated["data"]["noticePublicationDate"] = now.isoformat() + self.request.validated["data"]["tenderPeriod"]["startDate"] = now.isoformat() + apply_patch(self.request, src=self.request.validated["tender_src"]) + self.LOGGER.info( + "Updated tender {}".format(tender.id), extra=context_unpack(self.request, {"MESSAGE_ID": "tender_patch"}) + ) + return {"data": tender.serialize(tender.status)} diff --git a/src/openprocurement/tender/pricequotation/views/tender_document.py b/src/openprocurement/tender/pricequotation/views/tender_document.py new file mode 100644 index 0000000000..2497a04b3d --- /dev/null +++ b/src/openprocurement/tender/pricequotation/views/tender_document.py @@ -0,0 +1,56 @@ +# -*- coding: utf-8 -*- +from openprocurement.api.utils import json_view +from openprocurement.api.validation import validate_patch_document_data,\ + validate_file_upload, validate_file_update +from openprocurement.tender.belowthreshold.views.tender_document import\ + TenderDocumentResource +from openprocurement.tender.core.utils import optendersresource +from openprocurement.tender.pricequotation.constants import PMT +from openprocurement.tender.core.validation import\ + validate_tender_document_update_not_by_author_or_tender_owner +from openprocurement.tender.pricequotation.validation import validate_document_operation_in_not_allowed_period + + +@optendersresource( + name="{}:Tender Documents".format(PMT), + collection_path="/tenders/{tender_id}/documents", + path="/tenders/{tender_id}/documents/{document_id}", + procurementMethodType=PMT, + description="Tender related binary files (PDFs, etc.)", +) +class PQTenderDocumentResource(TenderDocumentResource): + + @json_view( + permission="upload_tender_documents", + validators=( + validate_file_upload, + validate_document_operation_in_not_allowed_period + ), + ) + def collection_post(self): + return super(PQTenderDocumentResource, self).collection_post() + + @json_view( + permission="upload_tender_documents", + validators=( + validate_file_update, + validate_document_operation_in_not_allowed_period, + validate_tender_document_update_not_by_author_or_tender_owner + ), + ) + def put(self): + """Tender Document Update""" + return super(PQTenderDocumentResource, self).put() + + @json_view( + content_type="application/json", + permission="upload_tender_documents", + validators=( + validate_patch_document_data, + validate_document_operation_in_not_allowed_period, + validate_tender_document_update_not_by_author_or_tender_owner + ), + ) + def patch(self): + """Tender Document Update""" + return super(PQTenderDocumentResource, self).patch()