Commit 0a9746f1e315ee836f9782d958be412e94da3b41

Authored by alexdiatlov
Committed by GitHub
2 parents 496570b4 8ebc4e85

Merge pull request #252 from ProzorroUKR/24_hours

24 hours
@@ -2023,6 +2023,21 @@ ${ERROR_PLAN_MESSAGE}= Calling method 'get_plan' failed: ResourceGone: {"status @@ -2023,6 +2023,21 @@ ${ERROR_PLAN_MESSAGE}= Calling method 'get_plan' failed: ResourceGone: {"status
2023 Run As ${username} Подати цінову пропозицію ${TENDER['TENDER_UAID']} ${bid} ${lots_ids} ${features_ids} 2023 Run As ${username} Подати цінову пропозицію ${TENDER['TENDER_UAID']} ${bid} ${lots_ids} ${features_ids}
2024 2024
2025 2025
  2026 +Можливість подати цінову пропозицію на суму ${amount} користувачем ${username}
  2027 + ${bid}= Підготувати дані для подання пропозиції
  2028 + ${bidresponses}= Create Dictionary bid=${bid}
  2029 + Set To Dictionary ${USERS.users['${username}']} bidresponses=${bidresponses}
  2030 + Set To Dictionary ${USERS.users['${username}'].bidresponses.bid.data.lotValues[0].value} amount=${amount}
  2031 + ${lots}= Get Variable Value ${USERS.users['${tender_owner}'].initial_data.data.lots} ${None}
  2032 + ${lots_ids}= Run Keyword IF ${lots}
  2033 + ... Отримати ідентифікатори об’єктів ${username} lots
  2034 + ... ELSE Set Variable ${None}
  2035 + ${features}= Get Variable Value ${USERS.users['${tender_owner}'].initial_data.data.features} ${None}
  2036 + ${features_ids}= Run Keyword IF ${features}
  2037 + ... Отримати ідентифікатори об’єктів ${username} features
  2038 + ... ELSE Set Variable ${None}
  2039 + Run As ${username} Подати цінову пропозицію ${TENDER['TENDER_UAID']} ${bid} ${lots_ids} ${features_ids}
  2040 +
2026 Можливість подати цінову пропозицію на другому етапі рамкової угоди користувачем 2041 Можливість подати цінову пропозицію на другому етапі рамкової угоди користувачем
2027 [Arguments] ${username} ${index}=${0} 2042 [Arguments] ${username} ${index}=${0}
2028 ${bid}= Підготувати дані для подання пропозиції другого етапу рамкової угоди ${index} 2043 ${bid}= Підготувати дані для подання пропозиції другого етапу рамкової угоди ${index}
@@ -2085,6 +2100,18 @@ ${ERROR_PLAN_MESSAGE}= Calling method 'get_plan' failed: ResourceGone: {"status @@ -2085,6 +2100,18 @@ ${ERROR_PLAN_MESSAGE}= Calling method 'get_plan' failed: ResourceGone: {"status
2085 Remove File ${file_path} 2100 Remove File ${file_path}
2086 2101
2087 2102
  2103 +Можливість завантажити документ для усунення невідповідності в пропозиції в ${object} ${object_index} користувачем ${username}
  2104 + ${file_path} ${file_name} ${file_content}= create_fake_doc
  2105 + ${doc_id}= get_id_from_string ${file_name}
  2106 + ${bid_document_data}= Create Dictionary
  2107 + ... doc_name=${file_name}
  2108 + ... doc_content=${file_content}
  2109 + ... doc_id=${doc_id}
  2110 + Run As ${username} Завантажити документ в ставку для усунення невідповідності в пропозиції ${file_path} ${TENDER['TENDER_UAID']} ${object} ${object_index}
  2111 + Set To Dictionary ${USERS.users['${username}']} bid_document=${bid_document_data}
  2112 + Remove File ${file_path}
  2113 +
  2114 +
2088 Можливість змінити документацію цінової пропозиції користувачем ${username} 2115 Можливість змінити документацію цінової пропозиції користувачем ${username}
2089 ${file_path} ${file_name} ${file_content}= create_fake_doc 2116 ${file_path} ${file_name} ${file_content}= create_fake_doc
2090 ${doc_id}= get_id_from_string ${file_name} 2117 ${doc_id}= get_id_from_string ${file_name}
@@ -2096,6 +2123,18 @@ ${ERROR_PLAN_MESSAGE}= Calling method 'get_plan' failed: ResourceGone: {"status @@ -2096,6 +2123,18 @@ ${ERROR_PLAN_MESSAGE}= Calling method 'get_plan' failed: ResourceGone: {"status
2096 Set To Dictionary ${USERS.users['${username}']} bid_document_modified=${bid_document_modified_data} 2123 Set To Dictionary ${USERS.users['${username}']} bid_document_modified=${bid_document_modified_data}
2097 Remove File ${file_path} 2124 Remove File ${file_path}
2098 2125
  2126 +
  2127 +Можливість змінити документацію цінової пропозиції при усуненні невідповідності користувачем ${username}
  2128 + ${file_path} ${file_name} ${file_content}= create_fake_doc
  2129 + ${doc_id}= get_id_from_string ${file_name}
  2130 + ${bid_document_modified_data}= Create Dictionary
  2131 + ... doc_name=${file_name}
  2132 + ... doc_content=${file_content}
  2133 + ... doc_id=${doc_id}
  2134 + Run As ${username} Змінити документ в ставці при усуненні невідповідності ${TENDER['TENDER_UAID']} ${file_path} ${USERS.users['${username}']['bid_document']['doc_id']}
  2135 + Set To Dictionary ${USERS.users['${username}']} bid_document_modified=${bid_document_modified_data}
  2136 + Remove File ${file_path}
  2137 +
2099 ############################################################################################## 2138 ##############################################################################################
2100 # Cancellations 2139 # Cancellations
2101 ############################################################################################## 2140 ##############################################################################################
@@ -2171,6 +2210,16 @@ ${ERROR_PLAN_MESSAGE}= Calling method 'get_plan' failed: ResourceGone: {"status @@ -2171,6 +2210,16 @@ ${ERROR_PLAN_MESSAGE}= Calling method 'get_plan' failed: ResourceGone: {"status
2171 ... ${0} 2210 ... ${0}
2172 Run Keyword And Ignore Error Remove From Dictionary ${USERS.users['${viewer}'].tender_data.data.contracts[0]} status 2211 Run Keyword And Ignore Error Remove From Dictionary ${USERS.users['${viewer}'].tender_data.data.contracts[0]} status
2173 2212
  2213 +
  2214 +Повідомлення в ${object} про невіповідність пропозиції ${object_index}
  2215 + ${24h_data}= Підготувати дані для повідомлення про невідповідність пропозиції
  2216 + Run as ${tender_owner} Створити повідомлення по невідповідність
  2217 + ... ${TENDER['TENDER_UAID']}
  2218 + ... ${object}
  2219 + ... ${object_index}
  2220 + ... ${24h_data}
  2221 +
  2222 +
2174 ############################################################################################## 2223 ##############################################################################################
2175 # Pre-Qualifications 2224 # Pre-Qualifications
2176 ############################################################################################## 2225 ##############################################################################################
@@ -1663,7 +1663,28 @@ Library openprocurement_client.utils @@ -1663,7 +1663,28 @@ Library openprocurement_client.utils
1663 ... filepath=${path} 1663 ... filepath=${path}
1664 ... upload_response=${response} 1664 ... upload_response=${response}
1665 Log object data ${uploaded_file} 1665 Log object data ${uploaded_file}
1666 - [return] ${uploaded_file} 1666 + [Return] ${uploaded_file}
  1667 +
  1668 +
  1669 +Завантажити документ в ставку для усунення невідповідності в пропозиції
  1670 + [Arguments] ${username} ${path} ${tender_uaid} ${object} ${object_index} ${doc_name}=documents ${doc_type}=${None}
  1671 + ${tender}= openprocurement_client.Пошук тендера по ідентифікатору ${username} ${tender_uaid}
  1672 + ${bid_id}= run keyword if '${object}' == 'awards' set variable ${tender.data.awards[${object_index}].bid_id}
  1673 + ... ELSE set variable ${tender.data.qualifications[${object_index}].bidID}
  1674 + #${bid_id}= openprocurement_client.Отримати інформацію із пропозиції ${username} ${tender_uaid} id
  1675 + ${tender}= set_access_key ${tender} ${USERS.users['${username}']['access_token']}
  1676 + ${response}= Call Method ${USERS.users['${username}'].client} upload_bid_document
  1677 + ... ${path}
  1678 + ... ${tender.data.id}
  1679 + ... ${bid_id}
  1680 + ... doc_type=${doc_type}
  1681 + ... access_token=${tender.access.token}
  1682 + ... subitem_name=${doc_name}
  1683 + ${uploaded_file} = Create Dictionary
  1684 + ... filepath=${path}
  1685 + ... upload_response=${response}
  1686 + Log object data ${uploaded_file}
  1687 + [Return] ${uploaded_file}
1667 1688
1668 1689
1669 Змінити документ в ставці 1690 Змінити документ в ставці
@@ -1683,7 +1704,27 @@ Library openprocurement_client.utils @@ -1683,7 +1704,27 @@ Library openprocurement_client.utils
1683 ... filepath=${path} 1704 ... filepath=${path}
1684 ... upload_response=${response} 1705 ... upload_response=${response}
1685 Log object data ${uploaded_file} 1706 Log object data ${uploaded_file}
1686 - [return] ${uploaded_file} 1707 + [Return] ${uploaded_file}
  1708 +
  1709 +
  1710 +Змінити документ в ставці при усуненні невідповідності
  1711 + [Arguments] ${username} ${tender_uaid} ${path} ${doc_id} ${doc_type}=documents
  1712 + ${bid_id}= openprocurement_client.Отримати інформацію із пропозиції ${username} ${tender_uaid} id
  1713 + ${tender}= openprocurement_client.Пошук тендера по ідентифікатору ${username} ${tender_uaid}
  1714 + ${tender}= set_access_key ${tender} ${USERS.users['${username}']['access_token']}
  1715 + ${bid}= openprocurement_client.Отримати пропозицію ${username} ${tender_uaid}
  1716 + ${bid_doc}= get_document_by_id ${bid.data} ${doc_id}
  1717 + ${response}= Call Method ${USERS.users['${username}'].client} update_bid_document
  1718 + ... ${path}
  1719 + ... ${tender.data.id}
  1720 + ... ${bid_id}
  1721 + ... ${bid_doc['id']}
  1722 + ... access_token=${tender.access.token}
  1723 + ${uploaded_file} = Create Dictionary
  1724 + ... filepath=${path}
  1725 + ... upload_response=${response}
  1726 + Log object data ${uploaded_file}
  1727 + [Return] ${uploaded_file}
1687 1728
1688 1729
1689 Змінити документацію в ставці 1730 Змінити документацію в ставці
@@ -1867,6 +1908,22 @@ Library openprocurement_client.utils @@ -1867,6 +1908,22 @@ Library openprocurement_client.utils
1867 ... access_token=${tender.access.token} 1908 ... access_token=${tender.access.token}
1868 Log ${reply} 1909 Log ${reply}
1869 1910
  1911 +
  1912 +Створити повідомлення по невідповідність
  1913 + [Arguments] ${username} ${tender_uaid} ${object} ${object_index} ${24h_data}
  1914 + ${tender}= openprocurement_client.Пошук тендера по ідентифікатору ${username} ${tender_uaid}
  1915 + ${reply}= run keyword if '${object}' == 'awards' Call Method ${USERS.users['${username}'].client} create_award_milestone
  1916 + ... ${tender.data.id}
  1917 + ... ${24h_data}
  1918 + ... ${tender.data.${object}[${object_index}].id}
  1919 + ... access_token=${tender.access.token}
  1920 + ... ELSE Call Method ${USERS.users['${username}'].client} create_qualification_milestone
  1921 + ... ${tender.data.id}
  1922 + ... ${24h_data}
  1923 + ... ${tender.data.${object}[${object_index}].id}
  1924 + ... access_token=${tender.access.token}
  1925 + Log ${reply}
  1926 +
1870 ############################################################################## 1927 ##############################################################################
1871 # Limited procurement 1928 # Limited procurement
1872 ############################################################################## 1929 ##############################################################################
@@ -1093,3 +1093,12 @@ def test_cancellation_data(procurement_method_type): @@ -1093,3 +1093,12 @@ def test_cancellation_data(procurement_method_type):
1093 else: 1093 else:
1094 result = random.choice(["noDemand", "unFixable", "forceMajeure", "expensesCut"]) 1094 result = random.choice(["noDemand", "unFixable", "forceMajeure", "expensesCut"])
1095 return munchify({"reasonType": result}) 1095 return munchify({"reasonType": result})
  1096 +
  1097 +
  1098 +def test_24_hours_data():
  1099 + return munchify({
  1100 + "data": {
  1101 + "code": "24h",
  1102 + "description": create_fake_sentence()
  1103 + }
  1104 + })
@@ -423,6 +423,11 @@ Get Broker Property By Username @@ -423,6 +423,11 @@ Get Broker Property By Username
423 [Return] ${modification_data} 423 [Return] ${modification_data}
424 424
425 425
  426 +Підготувати дані для повідомлення про невідповідність пропозиції
  427 + ${24h_data}= test_24_hours_data
  428 + [Return] ${24h_data}
  429 +
  430 +
426 Адаптувати дані для оголошення тендера 431 Адаптувати дані для оголошення тендера
427 [Arguments] ${tender_data} 432 [Arguments] ${tender_data}
428 # munchify is used to make deep copy of ${tender_data} 433 # munchify is used to make deep copy of ${tender_data}
@@ -2036,6 +2036,17 @@ ${PLAN_TENDER} ${True} @@ -2036,6 +2036,17 @@ ${PLAN_TENDER} ${True}
2036 Можливість подати цінову пропозицію користувачем ${provider} 2036 Можливість подати цінову пропозицію користувачем ${provider}
2037 2037
2038 2038
  2039 +Можливість подати пропозицію з фіксованою сумою першим учасником
  2040 + [Tags] ${USERS.users['${provider}'].broker}: Подання пропозиції
  2041 + ... provider
  2042 + ... ${USERS.users['${provider}'].broker}
  2043 + ... make_bid_fixed_amount_by_provider level1
  2044 + ... critical
  2045 + [Setup] Дочекатись дати початку прийому пропозицій ${provider} ${TENDER['TENDER_UAID']}
  2046 + [Teardown] Оновити LAST_MODIFICATION_DATE
  2047 + Можливість подати цінову пропозицію на суму 500 користувачем ${provider}
  2048 +
  2049 +
2039 Можливість зменшити пропозицію на 5% першим учасником 2050 Можливість зменшити пропозицію на 5% першим учасником
2040 [Tags] ${USERS.users['${provider}'].broker}: Подання пропозиції 2051 [Tags] ${USERS.users['${provider}'].broker}: Подання пропозиції
2041 ... provider 2052 ... provider
@@ -2077,6 +2088,17 @@ ${PLAN_TENDER} ${True} @@ -2077,6 +2088,17 @@ ${PLAN_TENDER} ${True}
2077 Можливість подати цінову пропозицію користувачем ${provider1} 2088 Можливість подати цінову пропозицію користувачем ${provider1}
2078 2089
2079 2090
  2091 +Можливість подати пропозицію з фіксованою сумою другим учасником
  2092 + [Tags] ${USERS.users['${provider}'].broker}: Подання пропозиції
  2093 + ... provider
  2094 + ... ${USERS.users['${provider}'].broker}
  2095 + ... make_bid_fixed_amount_by_provider1 level1
  2096 + ... critical
  2097 + [Setup] Дочекатись дати початку прийому пропозицій ${provider} ${TENDER['TENDER_UAID']}
  2098 + [Teardown] Оновити LAST_MODIFICATION_DATE
  2099 + Можливість подати цінову пропозицію на суму 1000 користувачем ${provider1}
  2100 +
  2101 +
2080 Можливість зменшити пропозицію на 5% другим учасником 2102 Можливість зменшити пропозицію на 5% другим учасником
2081 [Tags] ${USERS.users['${provider1}'].broker}: Подання пропозиції 2103 [Tags] ${USERS.users['${provider1}'].broker}: Подання пропозиції
2082 ... provider1 2104 ... provider1
@@ -2096,6 +2118,17 @@ ${PLAN_TENDER} ${True} @@ -2096,6 +2118,17 @@ ${PLAN_TENDER} ${True}
2096 [Teardown] Оновити LAST_MODIFICATION_DATE 2118 [Teardown] Оновити LAST_MODIFICATION_DATE
2097 Можливість подати цінову пропозицію користувачем ${provider2} 2119 Можливість подати цінову пропозицію користувачем ${provider2}
2098 2120
  2121 +
  2122 +Можливість подати пропозицію з фіксованою сумою третім учасником
  2123 + [Tags] ${USERS.users['${provider}'].broker}: Подання пропозиції
  2124 + ... provider
  2125 + ... ${USERS.users['${provider}'].broker}
  2126 + ... make_bid_fixed_amount_by_provider2 level1
  2127 + ... critical
  2128 + [Setup] Дочекатись дати початку прийому пропозицій ${provider} ${TENDER['TENDER_UAID']}
  2129 + [Teardown] Оновити LAST_MODIFICATION_DATE
  2130 + Можливість подати цінову пропозицію на суму 1500 користувачем ${provider2}
  2131 +
2099 ############################################################################################## 2132 ##############################################################################################
2100 # ABOVETRHESHOLD BIDDING 2133 # ABOVETRHESHOLD BIDDING
2101 ############################################################################################## 2134 ##############################################################################################
@@ -2393,6 +2426,42 @@ ${PLAN_TENDER} ${True} @@ -2393,6 +2426,42 @@ ${PLAN_TENDER} ${True}
2393 Run Keyword And Expect Error * Можливість додати документацію до 0 лоту 2426 Run Keyword And Expect Error * Можливість додати документацію до 0 лоту
2394 2427
2395 2428
  2429 +Дочекатись початку періоду пре-кваліфікації
  2430 + [Tags] ${USERS.users['${tender_owner}'].broker}: Очікування початку періоду пре-кваліфікації учасників
  2431 + ... tender_owner
  2432 + ... ${USERS.users['${tender_owner}'].broker}
  2433 + ... wait_active_pre-qualification_start
  2434 + Дочекатись дати початку періоду прекваліфікації ${tender_owner} ${TENDER['TENDER_UAID']}
  2435 +
  2436 +
  2437 +Повідомити учасника про невідповідність в тендерній пропозиції
  2438 + [Tags] ${USERS.users['${tender_owner}'].broker}:
  2439 + ... tender_owner
  2440 + ... ${USERS.users['${tender_owner}'].broker}
  2441 + ... create_24h_milestone_pre-qualification
  2442 + Повідомлення в qualifications про невіповідність пропозиції 0
  2443 +
  2444 +
  2445 +Можливість завантажити документ в пропозицію першим учасником
  2446 + [Tags] ${USERS.users['${provider}'].broker}: Подання пропозиції
  2447 + ... provider
  2448 + ... ${USERS.users['${provider}'].broker}
  2449 + ... add_doc_to_bid_by_provider_24h_pre-qualification
  2450 + ... critical
  2451 + [Teardown] Оновити LAST_MODIFICATION_DATE
  2452 + Можливість завантажити документ для усунення невідповідності в пропозиції в qualifications 0 користувачем ${provider}
  2453 +
  2454 +
  2455 +Можливість змінити документацію цінової пропозиції першим учасником
  2456 + [Tags] ${USERS.users['${provider}'].broker}: Подання пропозиції
  2457 + ... provider
  2458 + ... ${USERS.users['${provider}'].broker}
  2459 + ... add_doc_to_bid_by_provider_24h_pre-qualification
  2460 + ... critical
  2461 + [Teardown] Оновити LAST_MODIFICATION_DATE
  2462 + Можливість змінити документацію цінової пропозиції при усуненні невідповідності користувачем ${provider}
  2463 +
  2464 +
2396 Відображення статусу першої пропозиції кваліфікації 2465 Відображення статусу першої пропозиції кваліфікації
2397 [Tags] ${USERS.users['${tender_owner}'].broker}: Кваліфікація 2466 [Tags] ${USERS.users['${tender_owner}'].broker}: Кваліфікація
2398 ... tender_owner 2467 ... tender_owner
@@ -212,6 +212,41 @@ ${award_index} ${0} @@ -212,6 +212,41 @@ ${award_index} ${0}
212 ############################################################################################## 212 ##############################################################################################
213 # QUALIFICATION 213 # QUALIFICATION
214 ############################################################################################## 214 ##############################################################################################
  215 +Дочекатись початку періоду кваліфікації
  216 + [Tags] ${USERS.users['${tender_owner}'].broker}: Очікування початку періоду кваліфікації учасників
  217 + ... tender_owner
  218 + ... ${USERS.users['${tender_owner}'].broker}
  219 + ... wait_active_qualification_start
  220 + Дочекатись дати початку періоду кваліфікації ${tender_owner} ${TENDER['TENDER_UAID']}
  221 +
  222 +
  223 +Повідомити учасника про невідповідність в тендерній пропозиції
  224 + [Tags] ${USERS.users['${tender_owner}'].broker}:
  225 + ... tender_owner
  226 + ... ${USERS.users['${tender_owner}'].broker}
  227 + ... create_24h_milestone_qualification
  228 + Повідомлення в awards про невіповідність пропозиції 0
  229 +
  230 +
  231 +Можливість завантажити документ в пропозицію першим учасником
  232 + [Tags] ${USERS.users['${provider}'].broker}: Подання пропозиції
  233 + ... provider
  234 + ... ${USERS.users['${provider}'].broker}
  235 + ... add_doc_to_bid_by_provider_24h_qualification
  236 + ... critical
  237 + [Teardown] Оновити LAST_MODIFICATION_DATE
  238 + Можливість завантажити документ для усунення невідповідності в пропозиції в awards 0 користувачем ${provider}
  239 +
  240 +
  241 +Можливість змінити документацію цінової пропозиції першим учасником
  242 + [Tags] ${USERS.users['${provider}'].broker}: Подання пропозиції
  243 + ... provider
  244 + ... ${USERS.users['${provider}'].broker}
  245 + ... add_doc_to_bid_by_provider_24h_qualification
  246 + ... critical
  247 + [Teardown] Оновити LAST_MODIFICATION_DATE
  248 + Можливість змінити документацію цінової пропозиції при усуненні невідповідності користувачем ${provider}
  249 +
215 250
216 Можливість дочекатися перевірки переможців по ЄДРПОУ 251 Можливість дочекатися перевірки переможців по ЄДРПОУ
217 [Tags] ${USERS.users['${tender_owner}'].broker}: Перевірка користувача по ЄДРПОУ 252 [Tags] ${USERS.users['${tender_owner}'].broker}: Перевірка користувача по ЄДРПОУ
@@ -85,7 +85,8 @@ from .initial_data import ( @@ -85,7 +85,8 @@ from .initial_data import (
85 test_reject_complaint_data, 85 test_reject_complaint_data,
86 test_cancellation_data, 86 test_cancellation_data,
87 test_cancel_pending_data, 87 test_cancel_pending_data,
88 - test_payment_data 88 + test_payment_data,
  89 + test_24_hours_data
89 ) 90 )
90 from barbecue import chef 91 from barbecue import chef
91 from restkit import request 92 from restkit import request
  1 +-v MODE:openua
  2 +
  3 +-v NUMBER_OF_ITEMS:1
  4 +-v NUMBER_OF_LOTS:1
  5 +
  6 +-v TENDER_MEAT:False
  7 +-v ITEM_MEAT:False
  8 +-v LOT_MEAT:False
  9 +
  10 +-i create_tender
  11 +-i find_tender
  12 +
  13 +-i make_bid_fixed_amount_by_provider
  14 +-i make_bid_fixed_amount_by_provider1
  15 +-i make_bid_fixed_amount_by_provider2
  16 +
  17 +-i wait_active_qualification_start
  18 +-i create_24h_milestone_qualification
  19 +-i add_doc_to_bid_by_provider_24h_qualification
  20 +
  21 +-i qualification_add_doc_to_first_award
  22 +-i qualification_approve_first_award
  1 +-v MODE:openeu
  2 +
  3 +-v NUMBER_OF_ITEMS:1
  4 +-v NUMBER_OF_LOTS:1
  5 +
  6 +-v TENDER_MEAT:False
  7 +-v ITEM_MEAT:False
  8 +-v LOT_MEAT:False
  9 +
  10 +-i create_tender
  11 +-i find_tender
  12 +
  13 +-i make_bid_fixed_amount_by_provider
  14 +-i make_bid_fixed_amount_by_provider1
  15 +-i make_bid_fixed_amount_by_provider2
  16 +
  17 +-i wait_active_pre-qualification_start
  18 +-i create_24h_milestone_pre-qualification
  19 +-i add_doc_to_bid_by_provider_24h_pre-qualification
  20 +
  21 +-i pre-qualification_approve_first_bid
  22 +-i pre-qualification_approve_second_bid
  23 +-i pre-qualification_approve_third_bid
  24 +-i pre-qualification_approve_qualifications
Please register or login to post a comment