Commit d5358ce959d78912ae29460c0369c91912f70cca
Merge branch 'upstream/master' into pq
# Conflicts: # op_robot_tests/tests_files/brokers/openprocurement_client.robot
Showing
9 changed files
with
277 additions
and
5 deletions
... | ... | @@ -2027,6 +2027,21 @@ ${ERROR_PLAN_MESSAGE}= Calling method 'get_plan' failed: ResourceGone: {"status |
2027 | 2027 | Run As ${username} Подати цінову пропозицію ${TENDER['TENDER_UAID']} ${bid} ${lots_ids} ${features_ids} |
2028 | 2028 | |
2029 | 2029 | |
2030 | +Можливість подати цінову пропозицію на суму ${amount} користувачем ${username} | |
2031 | + ${bid}= Підготувати дані для подання пропозиції | |
2032 | + ${bidresponses}= Create Dictionary bid=${bid} | |
2033 | + Set To Dictionary ${USERS.users['${username}']} bidresponses=${bidresponses} | |
2034 | + Set To Dictionary ${USERS.users['${username}'].bidresponses.bid.data.lotValues[0].value} amount=${amount} | |
2035 | + ${lots}= Get Variable Value ${USERS.users['${tender_owner}'].initial_data.data.lots} ${None} | |
2036 | + ${lots_ids}= Run Keyword IF ${lots} | |
2037 | + ... Отримати ідентифікатори об’єктів ${username} lots | |
2038 | + ... ELSE Set Variable ${None} | |
2039 | + ${features}= Get Variable Value ${USERS.users['${tender_owner}'].initial_data.data.features} ${None} | |
2040 | + ${features_ids}= Run Keyword IF ${features} | |
2041 | + ... Отримати ідентифікатори об’єктів ${username} features | |
2042 | + ... ELSE Set Variable ${None} | |
2043 | + Run As ${username} Подати цінову пропозицію ${TENDER['TENDER_UAID']} ${bid} ${lots_ids} ${features_ids} | |
2044 | + | |
2030 | 2045 | Можливість подати цінову пропозицію на другому етапі рамкової угоди користувачем |
2031 | 2046 | [Arguments] ${username} ${index}=${0} |
2032 | 2047 | ${bid}= Підготувати дані для подання пропозиції другого етапу рамкової угоди ${index} |
... | ... | @@ -2100,6 +2115,18 @@ ${ERROR_PLAN_MESSAGE}= Calling method 'get_plan' failed: ResourceGone: {"status |
2100 | 2115 | Remove File ${file_path} |
2101 | 2116 | |
2102 | 2117 | |
2118 | +Можливість завантажити документ для усунення невідповідності в пропозиції в ${object} ${object_index} користувачем ${username} | |
2119 | + ${file_path} ${file_name} ${file_content}= create_fake_doc | |
2120 | + ${doc_id}= get_id_from_string ${file_name} | |
2121 | + ${bid_document_data}= Create Dictionary | |
2122 | + ... doc_name=${file_name} | |
2123 | + ... doc_content=${file_content} | |
2124 | + ... doc_id=${doc_id} | |
2125 | + Run As ${username} Завантажити документ в ставку для усунення невідповідності в пропозиції ${file_path} ${TENDER['TENDER_UAID']} ${object} ${object_index} | |
2126 | + Set To Dictionary ${USERS.users['${username}']} bid_document=${bid_document_data} | |
2127 | + Remove File ${file_path} | |
2128 | + | |
2129 | + | |
2103 | 2130 | Можливість змінити документацію цінової пропозиції користувачем ${username} |
2104 | 2131 | ${file_path} ${file_name} ${file_content}= create_fake_doc |
2105 | 2132 | ${doc_id}= get_id_from_string ${file_name} |
... | ... | @@ -2111,6 +2138,18 @@ ${ERROR_PLAN_MESSAGE}= Calling method 'get_plan' failed: ResourceGone: {"status |
2111 | 2138 | Set To Dictionary ${USERS.users['${username}']} bid_document_modified=${bid_document_modified_data} |
2112 | 2139 | Remove File ${file_path} |
2113 | 2140 | |
2141 | + | |
2142 | +Можливість змінити документацію цінової пропозиції при усуненні невідповідності користувачем ${username} | |
2143 | + ${file_path} ${file_name} ${file_content}= create_fake_doc | |
2144 | + ${doc_id}= get_id_from_string ${file_name} | |
2145 | + ${bid_document_modified_data}= Create Dictionary | |
2146 | + ... doc_name=${file_name} | |
2147 | + ... doc_content=${file_content} | |
2148 | + ... doc_id=${doc_id} | |
2149 | + Run As ${username} Змінити документ в ставці при усуненні невідповідності ${TENDER['TENDER_UAID']} ${file_path} ${USERS.users['${username}']['bid_document']['doc_id']} | |
2150 | + Set To Dictionary ${USERS.users['${username}']} bid_document_modified=${bid_document_modified_data} | |
2151 | + Remove File ${file_path} | |
2152 | + | |
2114 | 2153 | ############################################################################################## |
2115 | 2154 | # Cancellations |
2116 | 2155 | ############################################################################################## |
... | ... | @@ -2186,6 +2225,16 @@ ${ERROR_PLAN_MESSAGE}= Calling method 'get_plan' failed: ResourceGone: {"status |
2186 | 2225 | ... ${0} |
2187 | 2226 | Run Keyword And Ignore Error Remove From Dictionary ${USERS.users['${viewer}'].tender_data.data.contracts[0]} status |
2188 | 2227 | |
2228 | + | |
2229 | +Повідомлення в ${object} про невіповідність пропозиції ${object_index} | |
2230 | + ${24h_data}= Підготувати дані для повідомлення про невідповідність пропозиції | |
2231 | + Run as ${tender_owner} Створити повідомлення по невідповідність | |
2232 | + ... ${TENDER['TENDER_UAID']} | |
2233 | + ... ${object} | |
2234 | + ... ${object_index} | |
2235 | + ... ${24h_data} | |
2236 | + | |
2237 | + | |
2189 | 2238 | ############################################################################################## |
2190 | 2239 | # Pre-Qualifications |
2191 | 2240 | ############################################################################################## | ... | ... |
1 | +coding: utf-8 | |
1 | 2 | *** Settings *** |
2 | 3 | Library openprocurement_client_helper.py |
3 | 4 | Library openprocurement_client.utils |
... | ... | @@ -1587,8 +1588,8 @@ Library openprocurement_client.utils |
1587 | 1588 | |
1588 | 1589 | Подати цінову пропозицію |
1589 | 1590 | [Arguments] ${username} ${tender_uaid} ${bid} ${lots_ids}=${None} ${features_ids}=${None} |
1590 | -# ${verify_response}= Run As ${username} Перевірити учасника за ЄДРПОУ ${bid.data.tenderers[0].identifier.id} | |
1591 | -# Log ${verify_response} | |
1591 | + ${verify_response}= Run As ${username} Перевірити учасника за ЄДРПОУ ${bid.data.tenderers[0].identifier.id} | |
1592 | + Log ${verify_response} | |
1592 | 1593 | ${tender}= openprocurement_client.Пошук тендера по ідентифікатору ${username} ${tender_uaid} |
1593 | 1594 | ${lots_ids}= Run Keyword IF ${lots_ids} Set Variable ${lots_ids} |
1594 | 1595 | ... ELSE Create List |
... | ... | @@ -1663,7 +1664,28 @@ Library openprocurement_client.utils |
1663 | 1664 | ... filepath=${path} |
1664 | 1665 | ... upload_response=${response} |
1665 | 1666 | Log object data ${uploaded_file} |
1666 | - [return] ${uploaded_file} | |
1667 | + [Return] ${uploaded_file} | |
1668 | + | |
1669 | + | |
1670 | +Завантажити документ в ставку для усунення невідповідності в пропозиції | |
1671 | + [Arguments] ${username} ${path} ${tender_uaid} ${object} ${object_index} ${doc_name}=documents ${doc_type}=${None} | |
1672 | + ${tender}= openprocurement_client.Пошук тендера по ідентифікатору ${username} ${tender_uaid} | |
1673 | + ${bid_id}= run keyword if '${object}' == 'awards' set variable ${tender.data.awards[${object_index}].bid_id} | |
1674 | + ... ELSE set variable ${tender.data.qualifications[${object_index}].bidID} | |
1675 | + #${bid_id}= openprocurement_client.Отримати інформацію із пропозиції ${username} ${tender_uaid} id | |
1676 | + ${tender}= set_access_key ${tender} ${USERS.users['${username}']['access_token']} | |
1677 | + ${response}= Call Method ${USERS.users['${username}'].client} upload_bid_document | |
1678 | + ... ${path} | |
1679 | + ... ${tender.data.id} | |
1680 | + ... ${bid_id} | |
1681 | + ... doc_type=${doc_type} | |
1682 | + ... access_token=${tender.access.token} | |
1683 | + ... subitem_name=${doc_name} | |
1684 | + ${uploaded_file} = Create Dictionary | |
1685 | + ... filepath=${path} | |
1686 | + ... upload_response=${response} | |
1687 | + Log object data ${uploaded_file} | |
1688 | + [Return] ${uploaded_file} | |
1667 | 1689 | |
1668 | 1690 | |
1669 | 1691 | Змінити документ в ставці |
... | ... | @@ -1683,7 +1705,27 @@ Library openprocurement_client.utils |
1683 | 1705 | ... filepath=${path} |
1684 | 1706 | ... upload_response=${response} |
1685 | 1707 | Log object data ${uploaded_file} |
1686 | - [return] ${uploaded_file} | |
1708 | + [Return] ${uploaded_file} | |
1709 | + | |
1710 | + | |
1711 | +Змінити документ в ставці при усуненні невідповідності | |
1712 | + [Arguments] ${username} ${tender_uaid} ${path} ${doc_id} ${doc_type}=documents | |
1713 | + ${bid_id}= openprocurement_client.Отримати інформацію із пропозиції ${username} ${tender_uaid} id | |
1714 | + ${tender}= openprocurement_client.Пошук тендера по ідентифікатору ${username} ${tender_uaid} | |
1715 | + ${tender}= set_access_key ${tender} ${USERS.users['${username}']['access_token']} | |
1716 | + ${bid}= openprocurement_client.Отримати пропозицію ${username} ${tender_uaid} | |
1717 | + ${bid_doc}= get_document_by_id ${bid.data} ${doc_id} | |
1718 | + ${response}= Call Method ${USERS.users['${username}'].client} update_bid_document | |
1719 | + ... ${path} | |
1720 | + ... ${tender.data.id} | |
1721 | + ... ${bid_id} | |
1722 | + ... ${bid_doc['id']} | |
1723 | + ... access_token=${tender.access.token} | |
1724 | + ${uploaded_file} = Create Dictionary | |
1725 | + ... filepath=${path} | |
1726 | + ... upload_response=${response} | |
1727 | + Log object data ${uploaded_file} | |
1728 | + [Return] ${uploaded_file} | |
1687 | 1729 | |
1688 | 1730 | |
1689 | 1731 | Змінити документацію в ставці |
... | ... | @@ -1868,6 +1910,22 @@ Library openprocurement_client.utils |
1868 | 1910 | Log ${reply} |
1869 | 1911 | |
1870 | 1912 | |
1913 | +Створити повідомлення по невідповідність | |
1914 | + [Arguments] ${username} ${tender_uaid} ${object} ${object_index} ${24h_data} | |
1915 | + ${tender}= openprocurement_client.Пошук тендера по ідентифікатору ${username} ${tender_uaid} | |
1916 | + ${reply}= run keyword if '${object}' == 'awards' Call Method ${USERS.users['${username}'].client} create_award_milestone | |
1917 | + ... ${tender.data.id} | |
1918 | + ... ${24h_data} | |
1919 | + ... ${tender.data.${object}[${object_index}].id} | |
1920 | + ... access_token=${tender.access.token} | |
1921 | + ... ELSE Call Method ${USERS.users['${username}'].client} create_qualification_milestone | |
1922 | + ... ${tender.data.id} | |
1923 | + ... ${24h_data} | |
1924 | + ... ${tender.data.${object}[${object_index}].id} | |
1925 | + ... access_token=${tender.access.token} | |
1926 | + Log ${reply} | |
1927 | + | |
1928 | + | |
1871 | 1929 | Отримати інформацію із рішення |
1872 | 1930 | [Arguments] ${username} ${tender_uaid} ${field_name} ${award_index}=${None} |
1873 | 1931 | openprocurement_client.Пошук тендера по ідентифікатору ${username} ${tender_uaid} | ... | ... |
... | ... | @@ -1133,3 +1133,12 @@ def test_cancellation_data(procurement_method_type): |
1133 | 1133 | else: |
1134 | 1134 | result = random.choice(["noDemand", "unFixable", "forceMajeure", "expensesCut"]) |
1135 | 1135 | return munchify({"reasonType": result}) |
1136 | + | |
1137 | + | |
1138 | +def test_24_hours_data(): | |
1139 | + return munchify({ | |
1140 | + "data": { | |
1141 | + "code": "24h", | |
1142 | + "description": create_fake_sentence() | |
1143 | + } | |
1144 | + }) | ... | ... |
... | ... | @@ -430,6 +430,11 @@ Get Broker Property By Username |
430 | 430 | [Return] ${modification_data} |
431 | 431 | |
432 | 432 | |
433 | +Підготувати дані для повідомлення про невідповідність пропозиції | |
434 | + ${24h_data}= test_24_hours_data | |
435 | + [Return] ${24h_data} | |
436 | + | |
437 | + | |
433 | 438 | Адаптувати дані для оголошення тендера |
434 | 439 | [Arguments] ${tender_data} |
435 | 440 | # munchify is used to make deep copy of ${tender_data} | ... | ... |
... | ... | @@ -2036,6 +2036,17 @@ ${PLAN_TENDER} ${True} |
2036 | 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 | 2050 | Можливість зменшити пропозицію на 5% першим учасником |
2040 | 2051 | [Tags] ${USERS.users['${provider}'].broker}: Подання пропозиції |
2041 | 2052 | ... provider |
... | ... | @@ -2077,6 +2088,17 @@ ${PLAN_TENDER} ${True} |
2077 | 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 | 2102 | Можливість зменшити пропозицію на 5% другим учасником |
2081 | 2103 | [Tags] ${USERS.users['${provider1}'].broker}: Подання пропозиції |
2082 | 2104 | ... provider1 |
... | ... | @@ -2096,6 +2118,17 @@ ${PLAN_TENDER} ${True} |
2096 | 2118 | [Teardown] Оновити LAST_MODIFICATION_DATE |
2097 | 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 | 2133 | # ABOVETRHESHOLD BIDDING |
2101 | 2134 | ############################################################################################## |
... | ... | @@ -2393,6 +2426,42 @@ ${PLAN_TENDER} ${True} |
2393 | 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 | 2466 | [Tags] ${USERS.users['${tender_owner}'].broker}: Кваліфікація |
2398 | 2467 | ... tender_owner | ... | ... |
... | ... | @@ -212,6 +212,41 @@ ${award_index} ${0} |
212 | 212 | ############################################################################################## |
213 | 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 | 252 | [Tags] ${USERS.users['${tender_owner}'].broker}: Перевірка користувача по ЄДРПОУ | ... | ... |
... | ... | @@ -87,7 +87,8 @@ from .initial_data import ( |
87 | 87 | test_reject_complaint_data, |
88 | 88 | test_cancellation_data, |
89 | 89 | test_cancel_pending_data, |
90 | - test_payment_data | |
90 | + test_payment_data, | |
91 | + test_24_hours_data | |
91 | 92 | ) |
92 | 93 | from barbecue import chef |
93 | 94 | from restkit import request | ... | ... |
robot_tests_arguments/24_hours_award.txt
0 → 100644
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 | |
\ No newline at end of file | ... | ... |
robot_tests_arguments/24_hours_qual.txt
0 → 100644
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 | |
\ No newline at end of file | ... | ... |
Please
register
or
login
to post a comment