Commit cd53b8c4f696781564fbd9a548605e0ee034301a

Authored by alexdiatlov
Committed by GitHub
2 parents df90c8df 6f2acdee

Merge pull request #137 from ProzorroUKR/dev_prozorro

Dev prozorro
@@ -23,6 +23,8 @@ ${ERROR_MESSAGE}= Calling method 'get_tender' failed: ResourceGone: {"status": @@ -23,6 +23,8 @@ ${ERROR_MESSAGE}= Calling method 'get_tender' failed: ResourceGone: {"status":
23 ... api_host_url=${API_HOST_URL} 23 ... api_host_url=${API_HOST_URL}
24 ... moz_integration=${${MOZ_INTEGRATION}} 24 ... moz_integration=${${MOZ_INTEGRATION}}
25 ... vat_included=${${VAT_INCLUDED}} 25 ... vat_included=${${VAT_INCLUDED}}
  26 + ... road_index=${${ROAD_INDEX}}
  27 + ... gmdn_index=${${GMDN_INDEX}}
26 ${DIALOGUE_TYPE}= Get Variable Value ${DIALOGUE_TYPE} 28 ${DIALOGUE_TYPE}= Get Variable Value ${DIALOGUE_TYPE}
27 ${FUNDING_KIND}= Get Variable Value ${FUNDING_KIND} 29 ${FUNDING_KIND}= Get Variable Value ${FUNDING_KIND}
28 Run keyword if '${DIALOGUE_TYPE}' != '${None}' Set to dictionary ${tender_parameters} dialogue_type=${DIALOGUE_TYPE} 30 Run keyword if '${DIALOGUE_TYPE}' != '${None}' Set to dictionary ${tender_parameters} dialogue_type=${DIALOGUE_TYPE}
@@ -46,6 +48,8 @@ ${ERROR_MESSAGE}= Calling method 'get_tender' failed: ResourceGone: {"status": @@ -46,6 +48,8 @@ ${ERROR_MESSAGE}= Calling method 'get_tender' failed: ResourceGone: {"status":
46 ... item_meat=${${ITEM_MEAT}} 48 ... item_meat=${${ITEM_MEAT}}
47 ... api_host_url=${API_HOST_URL} 49 ... api_host_url=${API_HOST_URL}
48 ... moz_integration=${${MOZ_INTEGRATION}} 50 ... moz_integration=${${MOZ_INTEGRATION}}
  51 + ... road_index=${${ROAD_INDEX}}
  52 + ... gmdn_index=${${GMDN_INDEX}}
49 ${submissionMethodDetails}= Get Variable Value ${submissionMethodDetails} 53 ${submissionMethodDetails}= Get Variable Value ${submissionMethodDetails}
50 ${period_intervals}= compute_intrs ${BROKERS} ${used_brokers} 54 ${period_intervals}= compute_intrs ${BROKERS} ${used_brokers}
51 ${first_stage}= Run As ${provider2} Пошук тендера по ідентифікатору ${TENDER['TENDER_UAID']} 55 ${first_stage}= Run As ${provider2} Пошук тендера по ідентифікатору ${TENDER['TENDER_UAID']}
@@ -72,6 +76,8 @@ ${ERROR_MESSAGE}= Calling method 'get_tender' failed: ResourceGone: {"status": @@ -72,6 +76,8 @@ ${ERROR_MESSAGE}= Calling method 'get_tender' failed: ResourceGone: {"status":
72 ... item_meat=${${ITEM_MEAT}} 76 ... item_meat=${${ITEM_MEAT}}
73 ... api_host_url=${API_HOST_URL} 77 ... api_host_url=${API_HOST_URL}
74 ... moz_integration=${${MOZ_INTEGRATION}} 78 ... moz_integration=${${MOZ_INTEGRATION}}
  79 + ... road_index=${${ROAD_INDEX}}
  80 + ... gmdn_index=${${GMDN_INDEX}}
75 ${DIALOGUE_TYPE}= Get Variable Value ${DIALOGUE_TYPE} 81 ${DIALOGUE_TYPE}= Get Variable Value ${DIALOGUE_TYPE}
76 ${FUNDING_KIND}= Get Variable Value ${FUNDING_KIND} 82 ${FUNDING_KIND}= Get Variable Value ${FUNDING_KIND}
77 Run keyword if '${DIALOGUE_TYPE}' != '${None}' Set to dictionary ${tender_parameters} dialogue_type=${DIALOGUE_TYPE} 83 Run keyword if '${DIALOGUE_TYPE}' != '${None}' Set to dictionary ${tender_parameters} dialogue_type=${DIALOGUE_TYPE}
@@ -85,6 +91,66 @@ ${ERROR_MESSAGE}= Calling method 'get_tender' failed: ResourceGone: {"status": @@ -85,6 +91,66 @@ ${ERROR_MESSAGE}= Calling method 'get_tender' failed: ResourceGone: {"status":
85 Set To Dictionary ${TENDER} TENDER_UAID=${TENDER_UAID} 91 Set To Dictionary ${TENDER} TENDER_UAID=${TENDER_UAID}
86 92
87 93
  94 +Можливість оголосити тендер з використанням валідації Індекс автомобільних доріг
  95 + [Arguments] ${data_version}
  96 + ${NUMBER_OF_LOTS}= Convert To Integer ${NUMBER_OF_LOTS}
  97 + ${NUMBER_OF_ITEMS}= Convert To Integer ${NUMBER_OF_ITEMS}
  98 + ${NUMBER_OF_MILESTONES}= Convert To Integer ${NUMBER_OF_MILESTONES}
  99 + ${tender_parameters}= Create Dictionary
  100 + ... mode=${MODE}
  101 + ... number_of_items=${NUMBER_OF_ITEMS}
  102 + ... number_of_lots=${NUMBER_OF_LOTS}
  103 + ... number_of_milestones=${NUMBER_OF_MILESTONES}
  104 + ... tender_meat=${${TENDER_MEAT}}
  105 + ... lot_meat=${${LOT_MEAT}}
  106 + ... item_meat=${${ITEM_MEAT}}
  107 + ... api_host_url=${API_HOST_URL}
  108 + ... moz_integration=${${MOZ_INTEGRATION}}
  109 + ... road_index=${${ROAD_INDEX}}
  110 + ... gmdn_index=${${GMDN_INDEX}}
  111 + ${DIALOGUE_TYPE}= Get Variable Value ${DIALOGUE_TYPE}
  112 + ${FUNDING_KIND}= Get Variable Value ${FUNDING_KIND}
  113 + Run keyword if '${DIALOGUE_TYPE}' != '${None}' Set to dictionary ${tender_parameters} dialogue_type=${DIALOGUE_TYPE}
  114 + Run keyword if '${FUNDING_KIND}' != '${None}' Set to dictionary ${tender_parameters} fundingKind=${FUNDING_KIND}
  115 + ${tender_data}= Підготувати дані для створення тендера ${tender_parameters}
  116 + ${adapted_data}= Адаптувати дані для оголошення тендера ${tender_data}
  117 + ${adapted_data_cost}= edit_tender_data_for_cost ${adapted_data} ${MODE} ${data_version}
  118 + Log ${adapted_data_cost}
  119 + ${TENDER_UAID}= Run As ${tender_owner} Створити тендер ${adapted_data_cost}
  120 + Set To Dictionary ${USERS.users['${tender_owner}']} initial_data=${adapted_data_cost}
  121 + Set To Dictionary ${TENDER} TENDER_UAID=${TENDER_UAID}
  122 +
  123 +
  124 +Можливість оголосити тендер з використанням валідації класифікатор медичних виробів
  125 + [Arguments] ${data_version}
  126 + ${NUMBER_OF_LOTS}= Convert To Integer ${NUMBER_OF_LOTS}
  127 + ${NUMBER_OF_ITEMS}= Convert To Integer ${NUMBER_OF_ITEMS}
  128 + ${NUMBER_OF_MILESTONES}= Convert To Integer ${NUMBER_OF_MILESTONES}
  129 + ${tender_parameters}= Create Dictionary
  130 + ... mode=${MODE}
  131 + ... number_of_items=${NUMBER_OF_ITEMS}
  132 + ... number_of_lots=${NUMBER_OF_LOTS}
  133 + ... number_of_milestones=${NUMBER_OF_MILESTONES}
  134 + ... tender_meat=${${TENDER_MEAT}}
  135 + ... lot_meat=${${LOT_MEAT}}
  136 + ... item_meat=${${ITEM_MEAT}}
  137 + ... api_host_url=${API_HOST_URL}
  138 + ... moz_integration=${${MOZ_INTEGRATION}}
  139 + ... road_index=${${ROAD_INDEX}}
  140 + ... gmdn_index=${${GMDN_INDEX}}
  141 + ${DIALOGUE_TYPE}= Get Variable Value ${DIALOGUE_TYPE}
  142 + ${FUNDING_KIND}= Get Variable Value ${FUNDING_KIND}
  143 + Run keyword if '${DIALOGUE_TYPE}' != '${None}' Set to dictionary ${tender_parameters} dialogue_type=${DIALOGUE_TYPE}
  144 + Run keyword if '${FUNDING_KIND}' != '${None}' Set to dictionary ${tender_parameters} fundingKind=${FUNDING_KIND}
  145 + ${tender_data}= Підготувати дані для створення тендера ${tender_parameters}
  146 + ${adapted_data}= Адаптувати дані для оголошення тендера ${tender_data}
  147 + ${adapted_data_gmdn}= edit_tender_data_for_gmdn ${adapted_data} ${MODE} ${data_version}
  148 + Log ${adapted_data_gmdn}
  149 + ${TENDER_UAID}= Run As ${tender_owner} Створити тендер ${adapted_data_gmdn}
  150 + Set To Dictionary ${USERS.users['${tender_owner}']} initial_data=${adapted_data_gmdn}
  151 + Set To Dictionary ${TENDER} TENDER_UAID=${TENDER_UAID}
  152 +
  153 +
88 Можливість створити об'єкт моніторингу 154 Можливість створити об'єкт моніторингу
89 ${period_intervals}= compute_intrs ${BROKERS} ${used_brokers} 155 ${period_intervals}= compute_intrs ${BROKERS} ${used_brokers}
90 ${accelerator}= Get Variable Value ${accelerator} 156 ${accelerator}= Get Variable Value ${accelerator}
@@ -8,7 +8,8 @@ Suite Teardown Test Suite Teardown @@ -8,7 +8,8 @@ Suite Teardown Test Suite Teardown
8 ${MOZ_INTEGRATION} ${False} 8 ${MOZ_INTEGRATION} ${False}
9 ${VAT_INCLUDED} ${True} 9 ${VAT_INCLUDED} ${True}
10 ${NUMBER_OF_MILESTONES} ${0} 10 ${NUMBER_OF_MILESTONES} ${0}
11 - 11 +${ROAD_INDEX} ${False}
  12 +${GMDN_INDEX} ${False}
12 13
13 *** Test Cases *** 14 *** Test Cases ***
14 Можливість оголосити тендер 15 Можливість оголосити тендер
@@ -17,6 +17,8 @@ ${ITEM_MEAT} ${0} @@ -17,6 +17,8 @@ ${ITEM_MEAT} ${0}
17 ${LOT_MEAT} ${0} 17 ${LOT_MEAT} ${0}
18 ${lot_index} ${0} 18 ${lot_index} ${0}
19 ${award_index} ${0} 19 ${award_index} ${0}
  20 +${ROAD_INDEX} ${False}
  21 +${GMDN_INDEX} ${False}
20 22
21 *** Test Cases *** 23 *** Test Cases ***
22 24
@@ -217,6 +217,10 @@ def test_tender_data(params, @@ -217,6 +217,10 @@ def test_tender_data(params,
217 data.update(period_dict) 217 data.update(period_dict)
218 if params.get('moz_integration'): 218 if params.get('moz_integration'):
219 cpv_group = 336 219 cpv_group = 336
  220 + elif params.get('road_index'):
  221 + cpv_group = 'road'
  222 + elif params.get('gmdn_index'):
  223 + cpv_group = 'gmdn'
220 else: 224 else:
221 cpv_group = fake.cpv()[:4] 225 cpv_group = fake.cpv()[:4]
222 if params.get('number_of_lots'): 226 if params.get('number_of_lots'):
@@ -911,3 +915,19 @@ def invalid_INN_data(): @@ -911,3 +915,19 @@ def invalid_INN_data():
911 }) 915 })
912 916
913 917
  918 +def invalid_cost_data():
  919 + return munchify({
  920 + "scheme": "UA-ROAD",
  921 + "id": "М-15",
  922 + "description": "Одеса - Рені (на м. Бухарест)"
  923 + })
  924 +
  925 +
  926 +def invalid_gmdn_data():
  927 + return munchify({
  928 + "scheme": "GMDN",
  929 + "id": "33110",
  930 + "description": "Коліматор радіонуклідної системи, високоенергетичний"
  931 + })
  932 +
  933 +
@@ -17,6 +17,8 @@ ${LOT_MEAT} ${True} @@ -17,6 +17,8 @@ ${LOT_MEAT} ${True}
17 ${ITEM_MEAT} ${True} 17 ${ITEM_MEAT} ${True}
18 ${MOZ_INTEGRATION} ${False} 18 ${MOZ_INTEGRATION} ${False}
19 ${VAT_INCLUDED} ${True} 19 ${VAT_INCLUDED} ${True}
  20 +${ROAD_INDEX} ${False}
  21 +${GMDN_INDEX} ${False}
20 22
21 *** Test Cases *** 23 *** Test Cases ***
22 Можливість оголосити тендер 24 Можливість оголосити тендер
@@ -16,6 +16,8 @@ ${LOT_MEAT} ${False} @@ -16,6 +16,8 @@ ${LOT_MEAT} ${False}
16 ${ITEM_MEAT} ${False} 16 ${ITEM_MEAT} ${False}
17 ${MOZ_INTEGRATION} ${False} 17 ${MOZ_INTEGRATION} ${False}
18 ${VAT_INCLUDED} ${True} 18 ${VAT_INCLUDED} ${True}
  19 +${ROAD_INDEX} ${False}
  20 +${GMDN_INDEX} ${False}
19 21
20 *** Test Cases *** 22 *** Test Cases ***
21 ############################################################################################## 23 ##############################################################################################
@@ -16,6 +16,8 @@ ${LOT_MEAT} ${False} @@ -16,6 +16,8 @@ ${LOT_MEAT} ${False}
16 ${ITEM_MEAT} ${False} 16 ${ITEM_MEAT} ${False}
17 ${MOZ_INTEGRATION} ${False} 17 ${MOZ_INTEGRATION} ${False}
18 ${VAT_INCLUDED} ${True} 18 ${VAT_INCLUDED} ${True}
  19 +${ROAD_INDEX} ${False}
  20 +${GMDN_INDEX} ${False}
19 21
20 *** Test Cases *** 22 *** Test Cases ***
21 ############################################################################################## 23 ##############################################################################################
@@ -27,6 +27,8 @@ class OP_Provider(BaseProvider): @@ -27,6 +27,8 @@ class OP_Provider(BaseProvider):
27 classifications = _fake_data.classifications 27 classifications = _fake_data.classifications
28 cpvs = _fake_data.cpvs 28 cpvs = _fake_data.cpvs
29 moz_cpvs = _fake_data.moz_cpvs 29 moz_cpvs = _fake_data.moz_cpvs
  30 + road_cpvs = _fake_data.road_cpvs
  31 + gmdn_cpvs = _fake_data.gmdn_cpvs
30 items_base_data = _fake_data.items_base_data 32 items_base_data = _fake_data.items_base_data
31 rationale_types = _fake_data.rationale_types 33 rationale_types = _fake_data.rationale_types
32 title_of_milestones = _fake_data.title_of_milestones 34 title_of_milestones = _fake_data.title_of_milestones
@@ -119,6 +121,28 @@ class OP_Provider(BaseProvider): @@ -119,6 +121,28 @@ class OP_Provider(BaseProvider):
119 return self.random_element(self.cpvs) 121 return self.random_element(self.cpvs)
120 122
121 @classmethod 123 @classmethod
  124 + def road_cpv(self, cpv_group=None):
  125 + if cpv_group:
  126 + road_cpvs = []
  127 + for cpv_element in self.road_cpvs:
  128 + if cpv_element.startswith(cpv_group):
  129 + road_cpvs.append(road_cpvs)
  130 + return self.random_element(road_cpvs)
  131 + else:
  132 + return self.random_element(self.road_cpvs)
  133 +
  134 + @classmethod
  135 + def gmdn_cpv(self, cpv_group=None):
  136 + if cpv_group:
  137 + gmdn_cpvs = []
  138 + for cpv_element in self.gmdn_cpvs:
  139 + if cpv_element.startswith(cpv_group):
  140 + gmdn_cpvs.append(gmdn_cpvs)
  141 + return self.random_element(gmdn_cpvs)
  142 + else:
  143 + return self.random_element(self.gmdn_cpvs)
  144 +
  145 + @classmethod
122 def fake_item(self, cpv_group=None): 146 def fake_item(self, cpv_group=None):
123 """ 147 """
124 Generate a random item for openprocurement tenders 148 Generate a random item for openprocurement tenders
@@ -133,6 +157,10 @@ class OP_Provider(BaseProvider): @@ -133,6 +157,10 @@ class OP_Provider(BaseProvider):
133 cpv = self.random_element(self.cpvs) 157 cpv = self.random_element(self.cpvs)
134 elif cpv_group == 336: 158 elif cpv_group == 336:
135 cpv = self.random_element(self.moz_cpvs) 159 cpv = self.random_element(self.moz_cpvs)
  160 + elif cpv_group == 'road':
  161 + cpv = self.random_element(self.road_cpvs)
  162 + elif cpv_group == 'gmdn':
  163 + cpv = self.random_element(self.gmdn_cpvs)
136 else: 164 else:
137 cpv_group = str(cpv_group) 165 cpv_group = str(cpv_group)
138 similar_cpvs = [] 166 similar_cpvs = []
@@ -7872,6 +7872,259 @@ @@ -7872,6 +7872,259 @@
7872 "id": "33600000-6", 7872 "id": "33600000-6",
7873 "description": "Фармацевтична продукція" 7873 "description": "Фармацевтична продукція"
7874 } 7874 }
  7875 + },
  7876 + {
  7877 + "additionalClassifications": [
  7878 + {
  7879 + "scheme": "UA-ROAD",
  7880 + "id": "М-15",
  7881 + "description": "Одеса - Рені (на м. Бухарест)"
  7882 + }
  7883 + ],
  7884 + "classification": {
  7885 + "scheme": "ДК021",
  7886 + "id": "34920000-2",
  7887 + "description": "Дорожнє обладнання"
  7888 + }
  7889 + },
  7890 + {
  7891 + "additionalClassifications": [
  7892 + {
  7893 + "scheme": "GMDN",
  7894 + "id": "33110",
  7895 + "description": "Коліматор радіонуклідної системи, високоенергетичний"
  7896 + }
  7897 + ],
  7898 + "classification": {
  7899 + "scheme": "ДК021",
  7900 + "id": "33110000-4",
  7901 + "description": "Візуалізаційне обладнання для потреб медицини, стоматології та ветеринарної медицини"
  7902 + }
  7903 + },
  7904 + {
  7905 + "additionalClassifications": [
  7906 + {
  7907 + "scheme": "UA-ROAD",
  7908 + "id": "М-05",
  7909 + "description": "Київ - Одеса"
  7910 + }
  7911 + ],
  7912 + "classification": {
  7913 + "scheme": "ДК021",
  7914 + "id": "71246000-4",
  7915 + "description": "Здійснення та документування необхідних будівельних розрахунків"
  7916 + }
  7917 + },
  7918 + {
  7919 + "additionalClassifications": [
  7920 + {
  7921 + "scheme": "GMDN",
  7922 + "id": "10098",
  7923 + "description": "Відкривач для ампул"
  7924 + }
  7925 + ],
  7926 + "classification": {
  7927 + "scheme": "ДК021",
  7928 + "id": "33792000-8",
  7929 + "description": "Скляний посуд фармацевтичного призначення"
  7930 + }
  7931 + },
  7932 + {
  7933 + "additionalClassifications": [
  7934 + {
  7935 + "scheme": "UA-ROAD",
  7936 + "id": "М-10",
  7937 + "description": "Львів - Краковець (на м. Краків)"
  7938 + }
  7939 + ],
  7940 + "classification": {
  7941 + "scheme": "ДК021",
  7942 + "id": "63712310-9",
  7943 + "description": "Послуги з експлуатації мостів"
  7944 + }
  7945 + },
  7946 + {
  7947 + "additionalClassifications": [
  7948 + {
  7949 + "scheme": "GMDN",
  7950 + "id": "17437",
  7951 + "description": "Опромінювач крові йонізівним промінням"
  7952 + }
  7953 + ],
  7954 + "classification": {
  7955 + "scheme": "ДК021",
  7956 + "id": "38945000-7",
  7957 + "description": "Лічильники гамма-частинок"
  7958 + }
  7959 + },
  7960 + {
  7961 + "additionalClassifications": [
  7962 + {
  7963 + "scheme": "UA-ROAD",
  7964 + "id": "М-01",
  7965 + "description": "Київ - Чернігів - Нові Яриловичі (на м. Гомель)"
  7966 + }
  7967 + ],
  7968 + "classification": {
  7969 + "scheme": "ДК021",
  7970 + "id": "34921000-9",
  7971 + "description": "Дорожньо-експлуатаційне обладнання"
  7972 + }
  7973 + },
  7974 + {
  7975 + "additionalClassifications": [
  7976 + {
  7977 + "scheme": "UA-ROAD",
  7978 + "id": "М-02",
  7979 + "description": "Кіпті - Глухів - Бачівськ (на м. Брянськ)"
  7980 + }
  7981 + ],
  7982 + "classification": {
  7983 + "scheme": "ДК021",
  7984 + "id": "34921100-0",
  7985 + "description": "Підмітально-прибиральні машини"
  7986 + }
  7987 + },
  7988 + {
  7989 + "additionalClassifications": [
  7990 + {
  7991 + "scheme": "UA-ROAD",
  7992 + "id": "М-03",
  7993 + "description": "Київ - Харків - Довжанський (на м. Ростов-на-Дону)"
  7994 + }
  7995 + ],
  7996 + "classification": {
  7997 + "scheme": "ДК021",
  7998 + "id": "71247000-1",
  7999 + "description": "Нагляд за будівельними роботами"
  8000 + }
  8001 + },
  8002 + {
  8003 + "additionalClassifications": [
  8004 + {
  8005 + "scheme": "UA-ROAD",
  8006 + "id": "М-04",
  8007 + "description": "Знам’янка - Луганськ - Ізварине (на м. Волгоград через мм. Дніпро, Донецьк)"
  8008 +
  8009 + }
  8010 + ],
  8011 + "classification": {
  8012 + "scheme": "ДК021",
  8013 + "id": "71248000-8",
  8014 + "description": "Технічний нагляд за проектами та документацією"
  8015 + }
  8016 + },
  8017 + {
  8018 + "additionalClassifications": [
  8019 + {
  8020 + "scheme": "UA-ROAD",
  8021 + "id": "М-19",
  8022 + "description": "Доманове (на м. Брест) - Ковель - Чернівці - Тереблече (на м. Бухарест)"
  8023 + }
  8024 + ],
  8025 + "classification": {
  8026 + "scheme": "ДК021",
  8027 + "id": "63712311-6",
  8028 + "description": "Послуги зі стягнення плати за користування мостами"
  8029 + }
  8030 + },
  8031 + {
  8032 + "additionalClassifications": [
  8033 + {
  8034 + "scheme": "UA-ROAD",
  8035 + "id": "М-27",
  8036 + "description": "Одеса - Чорноморськ"
  8037 + }
  8038 + ],
  8039 + "classification": {
  8040 + "scheme": "ДК021",
  8041 + "id": "63712320-2",
  8042 + "description": "Послуги зі стягнення плати за користування мостами"
  8043 + }
  8044 + },
  8045 + {
  8046 + "additionalClassifications": [
  8047 + {
  8048 + "scheme": "GMDN",
  8049 + "id": "10058",
  8050 + "description": "Пінцети обструкції дихальних шляхів"
  8051 + }
  8052 + ],
  8053 + "classification": {
  8054 + "scheme": "ДК021",
  8055 + "id": "33111000-1",
  8056 + "description": "Рентгенологічне обладнання"
  8057 + }
  8058 + },
  8059 + {
  8060 + "additionalClassifications": [
  8061 + {
  8062 + "scheme": "GMDN",
  8063 + "id": "10184",
  8064 + "description": "Багаторазовий каркас"
  8065 + }
  8066 + ],
  8067 + "classification": {
  8068 + "scheme": "ДК021",
  8069 + "id": "33111100-2",
  8070 + "description": "Рентгенівські столи"
  8071 + }
  8072 + },
  8073 + {
  8074 + "additionalClassifications": [
  8075 + {
  8076 + "scheme": "GMDN",
  8077 + "id": "10298",
  8078 + "description": "Стенд для чаші, таза"
  8079 + }
  8080 + ],
  8081 + "classification": {
  8082 + "scheme": "ДК021",
  8083 + "id": "33793000-5",
  8084 + "description": "Скляний посуд лабораторного призначення"
  8085 + }
  8086 + },
  8087 + {
  8088 + "additionalClassifications": [
  8089 + {
  8090 + "scheme": "GMDN",
  8091 + "id": "10531",
  8092 + "description": "Приліжкова шафа"
  8093 + }
  8094 + ],
  8095 + "classification": {
  8096 + "scheme": "ДК021",
  8097 + "id": "33791000-1",
  8098 + "description": "Скляний посуд санітарно-гігієнічного призначення"
  8099 + }
  8100 + },
  8101 + {
  8102 + "additionalClassifications": [
  8103 + {
  8104 + "scheme": "GMDN",
  8105 + "id": "10729",
  8106 + "description": "Центральний венозний катетер"
  8107 + }
  8108 + ],
  8109 + "classification": {
  8110 + "scheme": "ДК021",
  8111 + "id": "38946000-7",
  8112 + "description": "Вимірювачі пікової напруги в кіловольтах"
  8113 + }
  8114 + },
  8115 + {
  8116 + "additionalClassifications": [
  8117 + {
  8118 + "scheme": "GMDN",
  8119 + "id": "13201",
  8120 + "description": "Помпа для розведення барвника"
  8121 + }
  8122 + ],
  8123 + "classification": {
  8124 + "scheme": "ДК021",
  8125 + "id": "38947000-7",
  8126 + "description": "Рентгенологічні мікроаналізатори"
  8127 + }
7875 } 8128 }
7876 ], 8129 ],
7877 "units": [ 8130 "units": [
@@ -7970,7 +8223,13 @@ @@ -7970,7 +8223,13 @@
7970 "30192130-1", 8223 "30192130-1",
7971 "30197600-2", 8224 "30197600-2",
7972 "30199000-0", 8225 "30199000-0",
7973 - "99999999-9" 8226 + "99999999-9",
  8227 + "34920000-2",
  8228 + "71246000-4",
  8229 + "63712320-2",
  8230 + "33110000-4",
  8231 + "33792000-8",
  8232 + "38945000-7"
7974 ], 8233 ],
7975 "moz_cpvs": [ 8234 "moz_cpvs": [
7976 "33615100-5", 8235 "33615100-5",
@@ -7981,6 +8240,29 @@ @@ -7981,6 +8240,29 @@
7981 "33692100-8", 8240 "33692100-8",
7982 "33600000-6" 8241 "33600000-6"
7983 ], 8242 ],
  8243 + "road_cpvs": [
  8244 + "34920000-2",
  8245 + "34921000-9",
  8246 + "34921100-0",
  8247 + "71246000-4",
  8248 + "71247000-1",
  8249 + "71248000-8",
  8250 + "63712310-9",
  8251 + "63712311-6",
  8252 + "63712320-2"
  8253 + ],
  8254 + "gmdn_cpvs": [
  8255 + "33110000-4",
  8256 + "33111000-1",
  8257 + "33111100-2",
  8258 + "33792000-8",
  8259 + "33793000-5",
  8260 + "33791000-1",
  8261 + "38945000-7",
  8262 + "38946000-7",
  8263 + "38947000-7"
  8264 + ],
  8265 +
7984 "items_base_data": [ 8266 "items_base_data": [
7985 { 8267 {
7986 "cpv_id": "99999999-9", 8268 "cpv_id": "99999999-9",
@@ -8201,6 +8483,204 @@ @@ -8201,6 +8483,204 @@
8201 "code": "VI", 8483 "code": "VI",
8202 "name": "Флакон" 8484 "name": "Флакон"
8203 } 8485 }
  8486 + },
  8487 + {
  8488 + "cpv_id": "34920000-2",
  8489 + "description": "Дорожнє обладнання",
  8490 + "description_ru": "Дорожное оборудование",
  8491 + "description_en": "Road Equipment",
  8492 + "quantity": 15,
  8493 + "unit": {
  8494 + "code": "H87",
  8495 + "name": "Штуки"
  8496 + }
  8497 + },
  8498 + {
  8499 + "cpv_id": "33110000-4",
  8500 + "description": "Візуалізаційне обладнання для потреб медицини, стоматології та ветеринарної медицини",
  8501 + "description_ru": "Визуализационное оборудование",
  8502 + "description_en": "Visual Equipment",
  8503 + "quantity": 15,
  8504 + "unit": {
  8505 + "code": "H87",
  8506 + "name": "Штуки"
  8507 + }
  8508 + },
  8509 + {
  8510 + "cpv_id": "71246000-4",
  8511 + "description": "Здійснення та документування необхідних будівельних розрахунків",
  8512 + "description_ru": "Здійснення та документування необхідних будівельних розрахунків",
  8513 + "description_en": "Implementation and documentation of necessary construction calculations",
  8514 + "quantity": 15,
  8515 + "unit": {
  8516 + "code": "H87",
  8517 + "name": "Штуки"
  8518 + }
  8519 + },
  8520 + {
  8521 + "cpv_id": "33792000-8",
  8522 + "description": "Скляний посуд фармацевтичного призначення",
  8523 + "description_ru": "Скляний посуд фармацевтичного призначення",
  8524 + "description_en": "Glass Dishes for Pharmaceutical Purposes",
  8525 + "quantity": 15,
  8526 + "unit": {
  8527 + "code": "H87",
  8528 + "name": "Штуки"
  8529 + }
  8530 + },
  8531 + {
  8532 + "cpv_id": "63712310-9",
  8533 + "description": "Послуги з експлуатації мостів",
  8534 + "description_ru": "Послуги з експлуатації мостів",
  8535 + "description_en": "Bridges service",
  8536 + "quantity": 15,
  8537 + "unit": {
  8538 + "code": "H87",
  8539 + "name": "Штуки"
  8540 + }
  8541 + },
  8542 + {
  8543 + "cpv_id": "38945000-7",
  8544 + "description": "Лічильники гамма-частинок",
  8545 + "description_ru": "Лічильники гамма-частинок",
  8546 + "description_en": "Gamma Particle Counters",
  8547 + "quantity": 15,
  8548 + "unit": {
  8549 + "code": "H87",
  8550 + "name": "Штуки"
  8551 + }
  8552 + },
  8553 + {
  8554 + "cpv_id": "34921000-9",
  8555 + "description": "Дорожньо-експлуатаційне обладнання",
  8556 + "description_ru": "Дорожньо-експлуатаційне обладнання",
  8557 + "description_en": "Road-maintenance equipment",
  8558 + "quantity": 15,
  8559 + "unit": {
  8560 + "code": "H87",
  8561 + "name": "Штуки"
  8562 + }
  8563 + },
  8564 + {
  8565 + "cpv_id": "34921100-0",
  8566 + "description": "Підмітально-прибиральні машини",
  8567 + "description_ru": "Підмітально-прибиральні машини",
  8568 + "description_en": "Sweepers",
  8569 + "quantity": 15,
  8570 + "unit": {
  8571 + "code": "H87",
  8572 + "name": "Штуки"
  8573 + }
  8574 + },
  8575 + {
  8576 + "cpv_id": "71247000-1",
  8577 + "description": "Нагляд за будівельними роботами",
  8578 + "description_ru": "Нагляд за будівельними роботами",
  8579 + "description_en": "Construction supervision",
  8580 + "quantity": 15,
  8581 + "unit": {
  8582 + "code": "H87",
  8583 + "name": "Штуки"
  8584 + }
  8585 + },
  8586 + {
  8587 + "cpv_id": "71248000-8",
  8588 + "description": "Технічний нагляд за проектами та документацією",
  8589 + "description_ru": "Технічний нагляд за проектами та документацією",
  8590 + "description_en": "Technical supervision of projects and documentation",
  8591 + "quantity": 15,
  8592 + "unit": {
  8593 + "code": "H87",
  8594 + "name": "Штуки"
  8595 + }
  8596 + },
  8597 + {
  8598 + "cpv_id": "63712311-6",
  8599 + "description": "Послуги зі стягнення плати за користування мостами",
  8600 + "description_ru": "Послуги зі стягнення плати за користування мостами",
  8601 + "description_en": "Services for charging for the use of bridges",
  8602 + "quantity": 15,
  8603 + "unit": {
  8604 + "code": "H87",
  8605 + "name": "Штуки"
  8606 + }
  8607 + },
  8608 + {
  8609 + "cpv_id": "63712320-2",
  8610 + "description": "Послуги з експлуатації тунелів",
  8611 + "description_ru": "Послуги з експлуатації тунелів",
  8612 + "description_en": "Operation of tunnels",
  8613 + "quantity": 15,
  8614 + "unit": {
  8615 + "code": "H87",
  8616 + "name": "Штуки"
  8617 + }
  8618 + },
  8619 + {
  8620 + "cpv_id": "33111000-1",
  8621 + "description": "Рентгенологічне обладнання",
  8622 + "description_ru": "Рентгенологічне обладнання",
  8623 + "description_en": "X-ray equipment",
  8624 + "quantity": 15,
  8625 + "unit": {
  8626 + "code": "H87",
  8627 + "name": "Штуки"
  8628 + }
  8629 + },
  8630 + {
  8631 + "cpv_id": "33111100-2",
  8632 + "description": "Рентгенівські столи",
  8633 + "description_ru": "Рентгенівські столи",
  8634 + "description_en": "X-ray tables",
  8635 + "quantity": 15,
  8636 + "unit": {
  8637 + "code": "H87",
  8638 + "name": "Штуки"
  8639 + }
  8640 + },
  8641 + {
  8642 + "cpv_id": "33793000-5",
  8643 + "description": "Скляний посуд лабораторного призначення",
  8644 + "description_ru": "Скляний посуд лабораторного призначення",
  8645 + "description_en": "Glassware for laboratory purposes",
  8646 + "quantity": 15,
  8647 + "unit": {
  8648 + "code": "H87",
  8649 + "name": "Штуки"
  8650 + }
  8651 + },
  8652 + {
  8653 + "cpv_id": "33791000-1",
  8654 + "description": "Скляний посуд санітарно-гігієнічного призначення",
  8655 + "description_ru": "Скляний посуд санітарно-гігієнічного призначення",
  8656 + "description_en": "Glassware for sanitary purposes",
  8657 + "quantity": 15,
  8658 + "unit": {
  8659 + "code": "H87",
  8660 + "name": "Штуки"
  8661 + }
  8662 + },
  8663 + {
  8664 + "cpv_id": "38946000-7",
  8665 + "description": "Вимірювачі пікової напруги в кіловольтах",
  8666 + "description_ru": "Вимірювачі пікової напруги в кіловольтах",
  8667 + "description_en": "Measuring Peak Volts in Kilowatts",
  8668 + "quantity": 15,
  8669 + "unit": {
  8670 + "code": "H87",
  8671 + "name": "Штуки"
  8672 + }
  8673 + },
  8674 + {
  8675 + "cpv_id": "38947000-7",
  8676 + "description": "Рентгенологічні мікроаналізатори",
  8677 + "description_ru": "Рентгенологічні мікроаналізатори",
  8678 + "description_en": "X-ray Microanalysers",
  8679 + "quantity": 15,
  8680 + "unit": {
  8681 + "code": "H87",
  8682 + "name": "Штуки"
  8683 + }
8204 } 8684 }
8205 ], 8685 ],
8206 "rationale_types": [ 8686 "rationale_types": [
@@ -18,6 +18,8 @@ ${LOT_MEAT} ${True} @@ -18,6 +18,8 @@ ${LOT_MEAT} ${True}
18 ${ITEM_MEAT} ${True} 18 ${ITEM_MEAT} ${True}
19 ${MOZ_INTEGRATION} ${False} 19 ${MOZ_INTEGRATION} ${False}
20 ${VAT_INCLUDED} ${True} 20 ${VAT_INCLUDED} ${True}
  21 +${ROAD_INDEX} ${False}
  22 +${GMDN_INDEX} ${False}
21 23
22 *** Test Cases *** 24 *** Test Cases ***
23 Можливість оголосити тендер 25 Можливість оголосити тендер
@@ -110,6 +112,116 @@ ${VAT_INCLUDED} ${True} @@ -110,6 +112,116 @@ ${VAT_INCLUDED} ${True}
110 Можливість оголосити тендер з використанням валідації для MNN ${8} 112 Можливість оголосити тендер з використанням валідації для MNN ${8}
111 113
112 114
  115 +Опублікувати тендер на закупівлю дорожніх робіт без додаткового класифікатора
  116 + [Tags] ${USERS.users['${tender_owner}'].broker}: Оголошення тендера
  117 + ... tender_owner
  118 + ... ${USERS.users['${tender_owner}'].broker}
  119 + ... create_tender_cost_no_addclass level1
  120 + ... critical
  121 + [Teardown] Оновити LAST_MODIFICATION_DATE
  122 + Можливість оголосити тендер з використанням валідації Індекс автомобільних доріг ${1}
  123 +
  124 +
  125 +Неможливість опублікувати тендер на закупівлю дорожніх робіт з 2-ма додатковими класифікаторами
  126 + [Tags] ${USERS.users['${tender_owner}'].broker}: Оголошення тендера
  127 + ... tender_owner
  128 + ... ${USERS.users['${tender_owner}'].broker}
  129 + ... create_tender_cost_2_addclass level1
  130 + ... critical
  131 + [Teardown] Оновити LAST_MODIFICATION_DATE
  132 + Run Keyword And Expect Error * Можливість оголосити тендер з використанням валідації Індекс автомобільних доріг ${2}
  133 +
  134 +
  135 +Неможливість опублікувати тендер на закупівлю дорожніх робіт з невалідним id дороги
  136 + [Tags] ${USERS.users['${tender_owner}'].broker}: Оголошення тендера
  137 + ... tender_owner
  138 + ... ${USERS.users['${tender_owner}'].broker}
  139 + ... create_tender_cost_invalid_addclass_id level1
  140 + ... critical
  141 + [Teardown] Оновити LAST_MODIFICATION_DATE
  142 + Run Keyword And Expect Error * Можливість оголосити тендер з використанням валідації Індекс автомобільних доріг ${3}
  143 +
  144 +
  145 +Неможливість опублікувати тендер на закупівлю дорожніх робіт з невалідним description дороги
  146 + [Tags] ${USERS.users['${tender_owner}'].broker}: Оголошення тендера
  147 + ... tender_owner
  148 + ... ${USERS.users['${tender_owner}'].broker}
  149 + ... create_tender_cost_invalid_addclass_description level1
  150 + ... critical
  151 + [Teardown] Оновити LAST_MODIFICATION_DATE
  152 + Run Keyword And Expect Error * Можливість оголосити тендер з використанням валідації Індекс автомобільних доріг ${4}
  153 +
  154 +
  155 +Неможливість опублікувати тендер cpv не відповідає додатковому класифікатору UA-ROAD
  156 + [Tags] ${USERS.users['${tender_owner}'].broker}: Оголошення тендера
  157 + ... tender_owner
  158 + ... ${USERS.users['${tender_owner}'].broker}
  159 + ... create_tender_cost_invalid_addclass level1
  160 + ... critical
  161 + [Teardown] Оновити LAST_MODIFICATION_DATE
  162 + Run Keyword And Expect Error * Можливість оголосити тендер з використанням валідації Індекс автомобільних доріг ${5}
  163 +
  164 +
  165 +Опублікувати тендер на закупівлю медичних виробів без додаткового класифікатора
  166 + [Tags] ${USERS.users['${tender_owner}'].broker}: Оголошення тендера
  167 + ... tender_owner
  168 + ... ${USERS.users['${tender_owner}'].broker}
  169 + ... create_tender_gmdn_no_addclass level1
  170 + ... critical
  171 + [Teardown] Оновити LAST_MODIFICATION_DATE
  172 + Можливість оголосити тендер з використанням валідації класифікатор медичних виробів ${1}
  173 +
  174 +
  175 +Неможливість опублікувати на закупівлю медичних виробів з 2-ма додатковими класифікаторами
  176 + [Tags] ${USERS.users['${tender_owner}'].broker}: Оголошення тендера
  177 + ... tender_owner
  178 + ... ${USERS.users['${tender_owner}'].broker}
  179 + ... create_tender_gmdn_2_addclass level1
  180 + ... critical
  181 + [Teardown] Оновити LAST_MODIFICATION_DATE
  182 + Run Keyword And Expect Error * Можливість оголосити тендер з використанням валідації класифікатор медичних виробів ${2}
  183 +
  184 +
  185 +Неможливість опублікувати на закупівлю медичних виробів з невалідним id виробу
  186 + [Tags] ${USERS.users['${tender_owner}'].broker}: Оголошення тендера
  187 + ... tender_owner
  188 + ... ${USERS.users['${tender_owner}'].broker}
  189 + ... create_tender_gmdn_invalid_addclass_id level1
  190 + ... critical
  191 + [Teardown] Оновити LAST_MODIFICATION_DATE
  192 + Run Keyword And Expect Error * Можливість оголосити тендер з використанням валідації класифікатор медичних виробів ${3}
  193 +
  194 +
  195 +Неможливість опублікувати на закупівлю медичних виробів з невалідним description виробу
  196 + [Tags] ${USERS.users['${tender_owner}'].broker}: Оголошення тендера
  197 + ... tender_owner
  198 + ... ${USERS.users['${tender_owner}'].broker}
  199 + ... create_tender_gmdn_invalid_addclass_description level1
  200 + ... critical
  201 + [Teardown] Оновити LAST_MODIFICATION_DATE
  202 + Run Keyword And Expect Error * Можливість оголосити тендер з використанням валідації класифікатор медичних виробів ${4}
  203 +
  204 +
  205 +Неможливість опублікувати тендер cpv не відповідає додатковому класифікатору GMDN
  206 + [Tags] ${USERS.users['${tender_owner}'].broker}: Оголошення тендера
  207 + ... tender_owner
  208 + ... ${USERS.users['${tender_owner}'].broker}
  209 + ... create_tender_gmdn_invalid_addclass level1
  210 + ... critical
  211 + [Teardown] Оновити LAST_MODIFICATION_DATE
  212 + Run Keyword And Expect Error * Можливість оголосити тендер з використанням валідації класифікатор медичних виробів ${5}
  213 +
  214 +
  215 +Неможливість опублікувати тендер на закупівлю медичних виробів з INN
  216 + [Tags] ${USERS.users['${tender_owner}'].broker}: Оголошення тендера
  217 + ... tender_owner
  218 + ... ${USERS.users['${tender_owner}'].broker}
  219 + ... create_tender_gmdn_inn_addclass level1
  220 + ... critical
  221 + [Teardown] Оновити LAST_MODIFICATION_DATE
  222 + Run Keyword And Expect Error * Можливість оголосити тендер з використанням валідації класифікатор медичних виробів ${6}
  223 +
  224 +
113 Можливість знайти тендер по ідентифікатору 225 Можливість знайти тендер по ідентифікатору
114 [Tags] ${USERS.users['${viewer}'].broker}: Пошук тендера 226 [Tags] ${USERS.users['${viewer}'].broker}: Пошук тендера
115 ... viewer tender_owner provider provider1 227 ... viewer tender_owner provider provider1
@@ -16,6 +16,8 @@ ${LOT_MEAT} ${False} @@ -16,6 +16,8 @@ ${LOT_MEAT} ${False}
16 ${ITEM_MEAT} ${False} 16 ${ITEM_MEAT} ${False}
17 ${MOZ_INTEGRATION} ${False} 17 ${MOZ_INTEGRATION} ${False}
18 ${VAT_INCLUDED} ${True} 18 ${VAT_INCLUDED} ${True}
  19 +${ROAD_INDEX} ${False}
  20 +${GMDN_INDEX} ${False}
19 21
20 *** Test Cases *** 22 *** Test Cases ***
21 ############################################################################################## 23 ##############################################################################################
@@ -15,6 +15,8 @@ ${TENDER_MEAT} ${True} @@ -15,6 +15,8 @@ ${TENDER_MEAT} ${True}
15 ${LOT_MEAT} ${False} 15 ${LOT_MEAT} ${False}
16 ${ITEM_MEAT} ${False} 16 ${ITEM_MEAT} ${False}
17 ${MOZ_INTEGRATION} ${False} 17 ${MOZ_INTEGRATION} ${False}
  18 +${ROAD_INDEX} ${False}
  19 +${GMDN_INDEX} ${False}
18 20
19 *** Test Cases *** 21 *** Test Cases ***
20 Можливість оголосити тендер другого етапу 22 Можливість оголосити тендер другого етапу
@@ -75,7 +75,9 @@ from .initial_data import ( @@ -75,7 +75,9 @@ from .initial_data import (
75 convert_amount, 75 convert_amount,
76 get_number_of_minutes, 76 get_number_of_minutes,
77 get_hash, 77 get_hash,
78 - invalid_INN_data 78 + invalid_INN_data,
  79 + invalid_cost_data,
  80 + invalid_gmdn_data
79 ) 81 )
80 from barbecue import chef 82 from barbecue import chef
81 from restkit import request 83 from restkit import request
@@ -698,3 +700,53 @@ def edit_tender_data_for_mnn(data, mode, data_version): @@ -698,3 +700,53 @@ def edit_tender_data_for_mnn(data, mode, data_version):
698 return munchify(dict_data) 700 return munchify(dict_data)
699 701
700 702
  703 +def edit_tender_data_for_cost(data, mode, data_version):
  704 + test_data = {3: 'PQ-17', 4: 'Дорога'}
  705 + dict_data = unmunchify(data)
  706 +
  707 + if data_version is 1:
  708 + dict_data['data']['items'][0].pop('additionalClassifications', None)
  709 +
  710 + if data_version is 2:
  711 + add_cost = invalid_cost_data()
  712 + dict_data['data']['items'][0]['additionalClassifications'].append(add_cost)
  713 +
  714 + if data_version is 3:
  715 + dict_data['data']['items'][0]['additionalClassifications'][0]['id'] = test_data[data_version]
  716 +
  717 + if data_version is 4:
  718 + dict_data['data']['items'][0]['additionalClassifications'][0]['description'] = test_data[data_version]
  719 +
  720 + if data_version is 5:
  721 + add_cost = invalid_cost_data()
  722 + dict_data['data']['items'][0]['additionalClassifications'][0] = add_cost
  723 + return munchify(dict_data)
  724 +
  725 +
  726 +def edit_tender_data_for_gmdn(data, mode, data_version):
  727 + gmdn_test_data = {3: '9999', 4: 'Виріб'}
  728 + dict_data = unmunchify(data)
  729 +
  730 + if data_version is 1:
  731 + dict_data['data']['items'][0].pop('additionalClassifications', None)
  732 +
  733 + if data_version is 2:
  734 + add_gmdn = invalid_gmdn_data()
  735 + dict_data['data']['items'][0]['additionalClassifications'].append(add_gmdn)
  736 +
  737 + if data_version is 3:
  738 + dict_data['data']['items'][0]['additionalClassifications'][0]['id'] = gmdn_test_data[data_version]
  739 +
  740 + if data_version is 4:
  741 + dict_data['data']['items'][0]['additionalClassifications'][0]['description'] = gmdn_test_data[data_version]
  742 +
  743 + if data_version is 5:
  744 + add_gmdn = invalid_gmdn_data()
  745 + dict_data['data']['items'][0]['additionalClassifications'][0] = add_gmdn
  746 +
  747 + if data_version is 6:
  748 + add_INN = invalid_INN_data()
  749 + dict_data['data']['items'][0]['additionalClassifications'].append(add_INN)
  750 + return munchify(dict_data)
  751 +
  752 +
  1 +-v MODE:belowThreshold
  2 +
  3 +-v NUMBER_OF_ITEMS:1
  4 +-v NUMBER_OF_LOTS:1
  5 +
  6 +-v TENDER_MEAT:True
  7 +-v ITEM_MEAT:True
  8 +-v LOT_MEAT:True
  9 +-v ROAD_INDEX:True
  10 +
  11 +-i create_tender_cost_no_addclass
  12 +
  13 +-i create_tender_cost_2_addclass
  14 +
  15 +-i create_tender_cost_invalid_addclass_id
  16 +
  17 +-i create_tender_cost_invalid_addclass_description
  1 +-v MODE:belowThreshold
  2 +
  3 +-v NUMBER_OF_ITEMS:1
  4 +-v NUMBER_OF_LOTS:1
  5 +
  6 +-v TENDER_MEAT:True
  7 +-v ITEM_MEAT:True
  8 +-v LOT_MEAT:True
  9 +-v GMDN_INDEX:True
  10 +
  11 +-i create_tender_gmdn_no_addclass
  12 +
  13 +-i create_tender_gmdn_2_addclass
  14 +
  15 +-i create_tender_gmdn_invalid_addclass_id
  16 +
  17 +-i create_tender_gmdn_invalid_addclass_description
  18 +
  19 +-i create_tender_gmdn_inn_addclass
  20 +
Please register or login to post a comment