Commit a84129fa4f4b933aa40d08b0a0a7f6a4bdc3e584

Authored by Playtenders
1 parent a0f412c6

esco provider value, filling plan budget period dates, getting plan.procuringEnt…

…ity.identifier.legalName + python lib: procuring_entity_name func
... ... @@ -954,6 +954,7 @@ Load Sign Data
954 954
955 955 Recursion
956 956 Reload Page
  957 + Click Button xpath=//*[text()='Накласти ЕЦП']
957 958 Load Sign Data
958 959
959 960 Wait user action
... ... @@ -1367,16 +1368,18 @@ Save Tender
1367 1368 ${proposal_id} = Set Variable If '-1' == '${proposal_id}' 1 ${proposal_id}
1368 1369 ${proposal_id} = Set Variable If '-2' == '${proposal_id}' 2 ${proposal_id}
1369 1370
1370   - Відкрити форму прекваліфікації і потрібну кваліфікацію ${proposal_id}
1371   - Click Element id=prequalificationform-decision
1372   - Click Element jquery=#prequalificationform-decision option[value='decline']
1373   - Wait Until Page Contains Element id=prequalificationform-description
1374   - Click Element jquery=#prequalificationform-title option.js-decline:first
1375   - Input text id=prequalificationform-description GenerateFakeText
1376   - ${doc_name}= Завантажити збережений документ у форму кваліфікації ${proposal_id}
1377   - Завантажити рішення кваліфікації і накласти ЕЦП і повернутися на перегляд закупівлі
1378   - Remove File ${doc_name}
1379   -
  1371 + # handle sign not loaded
  1372 + : FOR ${INDEX} IN RANGE 0 3
  1373 + \ Відкрити форму прекваліфікації і потрібну кваліфікацію ${proposal_id}
  1374 + \ Select From List By Label xpath=//select[@id='prequalificationform-decision'] Підтвердити
  1375 + \ ${doc_name}= Завантажити збережений документ у форму кваліфікації ${proposal_id}
  1376 + \ Click Element id=prequalificationform-eligible
  1377 + \ Click Element id=prequalificationform-qualified
  1378 + \ ${passed}= run keyword and return status Завантажити рішення кваліфікації і накласти ЕЦП і повернутися на перегляд закупівлі
  1379 + \ run keyword if ${passed} == True Remove File ${doc_name}
  1380 + \ run keyword if ${passed} == False sleep 10
  1381 + \ exit for loop if ${passed} == True
  1382 +
1380 1383 Скасувати кваліфікацію
1381 1384 [Arguments] ${username} ${tender_uaid} ${proposal_id}
1382 1385 Switch browser ${username}
... ... @@ -1410,7 +1413,7 @@ Save Tender
1410 1413
1411 1414 Open Tender
1412 1415 Click Element xpath=//div[contains(@class, 'aside-menu ')]//a[contains(@href, '/tender/prequalification?id=')]
1413   - Wait Until Page Contains Прекваліфікація 10
  1416 + Wait Until Page Contains Element id=tender-prequalification-form 10
1414 1417
1415 1418 Click Element id=prequalificationform-qualification
1416 1419 Click Element jquery=select#prequalificationform-qualification option:eq(${proposal_index})
... ... @@ -1716,9 +1719,8 @@ Wait For Complaints Sync
1716 1719
1717 1720 ${bid_data_keys}= Get Dictionary Keys ${bid.data}
1718 1721
1719   - Run Keyword If 'lotValues' in ${bid_data_keys} and '${mode}' != 'open_esco' Подати цінову пропозицію Lots ${username} ${tender_uaid} ${bid} ${lots_ids} ${features_ids}
  1722 + Run Keyword If 'lotValues' in ${bid_data_keys} Подати цінову пропозицію Lots ${username} ${tender_uaid} ${bid} ${lots_ids} ${features_ids}
1720 1723 Run Keyword If 'lotValues' not in ${bid_data_keys} Подати цінову пропозицію No Lots ${username} ${tender_uaid} ${bid} ${lots_ids} ${features_ids}
1721   - Run Keyword If '${mode}' == 'open_esco' Подати цінову пропозицію esco ${username} ${tender_uaid} ${bid} ${lots_ids} ${features_ids}
1722 1724
1723 1725 Click Element xpath=//button[contains(text(), 'Подати пропозицію')]
1724 1726 Sleep 1
... ... @@ -1744,46 +1746,26 @@ Wait For Complaints Sync
1744 1746 reload page
1745 1747 sleep 2
1746 1748
1747   -Подати цінову пропозицію esco
1748   - [Arguments] ${username} ${tender_uaid} ${bid} ${lots_ids} ${features_ids}
1749   - Switch browser ${username}
1750   -
1751   - ${tender_id}= Get From Dictionary ${USERS.users['${playtender_LOGIN_USER}']} TENDER_ID
1752   - ${bid_data_keys}= Get Dictionary Keys ${bid.data}
1753   - ${lots}= Get From Dictionary ${bid.data} lotValues
1754   - ${lots_length}= Get Length ${lots}
1755   -
1756   - Open Tender
1757   - ${procurementMethodType}= Отримати інформацію із тендера procurementMethodType
1758   -
1759   - : FOR ${INDEX} IN RANGE 0 ${lots_length}
1760   - \ Set To Dictionary ${USERS.users['${playtender_LOGIN_USER}']} last_proposal_lotid=${lots[${INDEX}].relatedLot}
1761   - \ Go To ${BROKERS['playtender'].basepage}/tender/bid?id=${tender_id}\#showlotbykey:${lots[${INDEX}].relatedLot}
1762   - \ Sleep 2
1763   - \ Run Keyword And Ignore Error Подати цінову пропозицію Amount_esco ${lots[${INDEX}].value}
1764   - \ Run Keyword If '${procurementMethodType}' != 'belowThreshold' Input text xpath=//div[contains(@class, 'active')]//textarea[contains(@id, '-subcontracting_details')] ${bid.data.tenderers[0].name}
1765   - \ Run Keyword If '${procurementMethodType}' != 'belowThreshold' Click Element xpath=//div[contains(@class, 'active')]//input[contains(@id, '-self_eligible')]
1766   - \ Run Keyword If '${procurementMethodType}' != 'belowThreshold' Click Element xpath=//div[contains(@class, 'active')]//input[contains(@id, '-self_qualified')]
1767   - \ Run Keyword If 'parameters' in ${bid_data_keys} Подати цінову пропозицію Features ${bid.data.parameters}
1768   - \ Run Keyword If '${procurementMethodType}' != 'belowThreshold' Run Keyword If '${procurementMethodType}' != 'aboveThresholdUA' Подати цінову пропозицію FakeDocs
1769   -
1770 1749 Подати цінову пропозицію Lots
1771 1750 [Arguments] ${username} ${tender_uaid} ${bid} ${lots_ids} ${features_ids}
1772 1751 Switch browser ${username}
1773 1752
1774   - ${tender_id}= Get From Dictionary ${USERS.users['${playtender_LOGIN_USER}']} TENDER_ID
  1753 + ${tender_id}= Get From Dictionary ${USERS.users['${PZO_LOGIN_USER}']} TENDER_ID
1775 1754 ${bid_data_keys}= Get Dictionary Keys ${bid.data}
1776 1755 ${lots}= Get From Dictionary ${bid.data} lotValues
1777 1756 ${lots_length}= Get Length ${lots}
1778 1757
1779 1758 Open Tender
1780 1759 ${procurementMethodType}= Отримати інформацію із тендера procurementMethodType
  1760 + Go To ${BROKERS['playtender'].basepage}/tender/bid?id=${tender_id}
  1761 + sleep 1
1781 1762
1782 1763 : FOR ${INDEX} IN RANGE 0 ${lots_length}
1783   - \ Set To Dictionary ${USERS.users['${playtender_LOGIN_USER}']} last_proposal_lotid=${lots[${INDEX}].relatedLot}
1784   - \ Go To ${BROKERS['playtender'].basepage}/tender/bid?id=${tender_id}\#showlotbykey:${lots[${INDEX}].relatedLot}
1785   - \ Sleep 2
  1764 + \ Set To Dictionary ${USERS.users['${PZO_LOGIN_USER}']} last_proposal_lotid=${lots[${INDEX}].relatedLot}
  1765 + \ execute javascript robottesthelpfunctions.showlotbykey("${lots[${INDEX}].relatedLot}")
  1766 + \ Sleep 1
1786 1767 \ Run Keyword And Ignore Error Подати цінову пропозицію Amount ${lots[${INDEX}].value.amount}
  1768 + \ Run Keyword If '${procurementMethodType}' == 'esco' Подати цінову пропозицію Esco ${lots[${INDEX}].value}
1787 1769 \ Run Keyword If '${procurementMethodType}' != 'belowThreshold' Input text xpath=//div[contains(@class, 'active')]//textarea[contains(@id, '-subcontracting_details')] ${bid.data.tenderers[0].name}
1788 1770 \ Run Keyword If '${procurementMethodType}' != 'belowThreshold' Click Element xpath=//div[contains(@class, 'active')]//input[contains(@id, '-self_eligible')]
1789 1771 \ Run Keyword If '${procurementMethodType}' != 'belowThreshold' Click Element xpath=//div[contains(@class, 'active')]//input[contains(@id, '-self_qualified')]
... ... @@ -1807,83 +1789,23 @@ Wait For Complaints Sync
1807 1789 ${amount}= convert_float_to_string ${amount}
1808 1790 Input text xpath=//div[contains(@class, 'active')]//input[contains(@id, '-value_amount')] ${amount}
1809 1791
1810   -Подати цінову пропозицію Amount_esco
1811   - [Arguments] ${bid}
1812   - Log Many CAT777 ${bid}
1813   -# ${amount}= convert_float_to_string ${amount}
1814   -# Input text xpath=//div[contains(@class, 'active')]//input[contains(@id, '-value_amount')] ${amount}
1815   -
1816   - ${yearlyPaymentsPercentage}= convert_float_to_string ${bid.yearlyPaymentsPercentage}
1817   - Sleep 1
1818   - Input Text xpath=//input[contains(@name,'percentage]')] ${yearlyPaymentsPercentage}
1819   - Input Text xpath=//input[contains(@name,'years]')] ${bid.contractDuration.years}
1820   - Input Text xpath=//input[contains(@name,'days]')] ${bid.contractDuration.days}
1821   -
1822   - ${reduction][0]}= multiply_hundred ${bid.annualCostsReduction[0]}
1823   - ${reduction][0]}= Convert To Integer ${reduction][0]}
1824   -# ${reduction][0]}= convert_float_to_string ${reduction][0]}
1825   - Input Text xpath=//input[@class='form-control js-annual-costs-reduction-input js-period-1'] ${reduction][0]}
1826   - ${reduction][1]}= multiply_hundred ${bid.annualCostsReduction[1]}
1827   - ${reduction][1]}= Convert To Integer ${reduction][1]}
1828   - Input Text xpath=//input[@class='form-control js-annual-costs-reduction-input js-period-2'] ${reduction][1]}
1829   - ${reduction][2]}= multiply_hundred ${bid.annualCostsReduction[2]}
1830   - ${reduction][2]}= Convert To Integer ${reduction][2]}
1831   - Input Text xpath=//input[@class='form-control js-annual-costs-reduction-input js-period-3'] ${reduction][2]}
1832   - ${reduction][3]}= multiply_hundred ${bid.annualCostsReduction[3]}
1833   - ${reduction][3]}= Convert To Integer ${reduction][3]}
1834   - Input Text xpath=//input[@class='form-control js-annual-costs-reduction-input js-period-4'] ${reduction][3]}
1835   - ${reduction][4]}= multiply_hundred ${bid.annualCostsReduction[4]}
1836   - ${reduction][4]}= Convert To Integer ${reduction][4]}
1837   - Input Text xpath=//input[@class='form-control js-annual-costs-reduction-input js-period-5'] ${reduction][4]}
1838   - ${reduction][5]}= multiply_hundred ${bid.annualCostsReduction[5]}
1839   - ${reduction][5]}= Convert To Integer ${reduction][5]}
1840   - Input Text xpath=//input[@class='form-control js-annual-costs-reduction-input js-period-6'] ${reduction][5]}
1841   - ${reduction][6]}= multiply_hundred ${bid.annualCostsReduction[6]}
1842   - ${reduction][6]}= Convert To Integer ${reduction][6]}
1843   - Input Text xpath=//input[@class='form-control js-annual-costs-reduction-input js-period-7'] ${reduction][6]}
1844   - ${reduction][7]}= multiply_hundred ${bid.annualCostsReduction[7]}
1845   - ${reduction][7]}= Convert To Integer ${reduction][7]}
1846   - Input Text xpath=//input[@class='form-control js-annual-costs-reduction-input js-period-8'] ${reduction][7]}
1847   - ${reduction][8]}= multiply_hundred ${bid.annualCostsReduction[8]}
1848   - ${reduction][8]}= Convert To Integer ${reduction][8]}
1849   - Input Text xpath=//input[@class='form-control js-annual-costs-reduction-input js-period-9'] ${reduction][8]}
1850   - ${reduction][9]}= multiply_hundred ${bid.annualCostsReduction[9]}
1851   - ${reduction][9]}= Convert To Integer ${reduction][9]}
1852   - Input Text xpath=//input[@class='form-control js-annual-costs-reduction-input js-period-10'] ${reduction][9]}
1853   - ${reduction][10]}= multiply_hundred ${bid.annualCostsReduction[10]}
1854   - ${reduction][10]}= Convert To Integer ${reduction][10]}
1855   - Input Text xpath=//input[@class='form-control js-annual-costs-reduction-input js-period-11'] ${reduction][10]}
1856   - ${reduction][11]}= multiply_hundred ${bid.annualCostsReduction[11]}
1857   - ${reduction][11]}= Convert To Integer ${reduction][11]}
1858   - Input Text xpath=//input[@class='form-control js-annual-costs-reduction-input js-period-12'] ${reduction][11]}
1859   - ${reduction][12]}= multiply_hundred ${bid.annualCostsReduction[12]}
1860   - ${reduction][12]}= Convert To Integer ${reduction][12]}
1861   - Input Text xpath=//input[@class='form-control js-annual-costs-reduction-input js-period-13'] ${reduction][12]}
1862   - ${reduction][13]}= multiply_hundred ${bid.annualCostsReduction[13]}
1863   - ${reduction][13]}= Convert To Integer ${reduction][13]}
1864   - Input Text xpath=//input[@class='form-control js-annual-costs-reduction-input js-period-14'] ${reduction][13]}
1865   - ${reduction][14]}= multiply_hundred ${bid.annualCostsReduction[14]}
1866   - ${reduction][14]}= Convert To Integer ${reduction][14]}
1867   - Input Text xpath=//input[@class='form-control js-annual-costs-reduction-input js-period-15'] ${reduction][14]}
1868   - ${reduction][15]}= multiply_hundred ${bid.annualCostsReduction[15]}
1869   - ${reduction][15]}= Convert To Integer ${reduction][15]}
1870   - Input Text xpath=//input[@class='form-control js-annual-costs-reduction-input js-period-16'] ${reduction][15]}
1871   - ${reduction][16]}= multiply_hundred ${bid.annualCostsReduction[16]}
1872   - ${reduction][16]}= Convert To Integer ${reduction][16]}
1873   - Input Text xpath=//input[@class='form-control js-annual-costs-reduction-input js-period-17'] ${reduction][16]}
1874   - ${reduction][17]}= multiply_hundred ${bid.annualCostsReduction[17]}
1875   - ${reduction][17]}= Convert To Integer ${reduction][17]}
1876   - Input Text xpath=//input[@class='form-control js-annual-costs-reduction-input js-period-18'] ${reduction][17]}
1877   - ${reduction][18]}= multiply_hundred ${bid.annualCostsReduction[18]}
1878   - ${reduction][18]}= Convert To Integer ${reduction][18]}
1879   - Input Text xpath=//input[@class='form-control js-annual-costs-reduction-input js-period-19'] ${reduction][18]}
1880   - ${reduction][19]}= multiply_hundred ${bid.annualCostsReduction[19]}
1881   - ${reduction][19]}= Convert To Integer ${reduction][19]}
1882   - Input Text xpath=//input[@class='form-control js-annual-costs-reduction-input js-period-20'] ${reduction][19]}
1883   - ${reduction][20]}= multiply_hundred ${bid.annualCostsReduction[20]}
1884   - ${reduction][20]}= Convert To Integer ${reduction][20]}
1885   - Input Text xpath=//input[@class='form-control js-annual-costs-reduction-input js-period-21'] ${reduction][20]}
1886   -
  1792 +Подати цінову пропозицію Esco
  1793 + [Arguments] ${value}
  1794 + ${value_keys}= Get Dictionary Keys ${value}
  1795 +
  1796 + run keyword and ignore error input text jquery=.tab-pane.js-lot-tab.active [id$='-contract_duration_years'] ${value.contractDuration.years}
  1797 + run keyword and ignore error input text jquery=.tab-pane.js-lot-tab.active [id$='-contract_duration_days'] ${value.contractDuration.days}
  1798 + run keyword if 'yearlyPaymentsPercentage' in ${value_keys} input float multiply100 .tab-pane.js-lot-tab.active [id$='-yearly_payments_percentage'] ${value.yearlyPaymentsPercentage}
  1799 + run keyword if 'annualCostsReduction' in ${value_keys} Подати цінову пропозицію Esco AnnualCostsReduction ${value.annualCostsReduction}
  1800 +
  1801 + Подати цінову пропозицію Esco AnnualCostsReduction
  1802 + [Arguments] ${values}
  1803 +
  1804 + ${input_index}= set variable 1
  1805 + : FOR ${value} IN @{values}
  1806 + \ input float .tab-pane.js-lot-tab.active [id$='-annual_costs_reduction_${input_index}'] ${value}
  1807 + \ ${input_index}= evaluate ${input_index} + 1
  1808 +
1887 1809 Подати цінову пропозицію Features
1888 1810 [Arguments] ${features}
1889 1811 ${tender_id}= Get From Dictionary ${USERS.users['${playtender_LOGIN_USER}']} TENDER_ID
... ... @@ -3239,6 +3161,7 @@ Switch To Complaints
3239 3161 ${data}= Get From Dictionary ${plan_data} data
3240 3162 ${data_keys}= Get Dictionary Keys ${data}
3241 3163 ${start_date}= convert_isodate_to_site_date ${data.tender.tenderPeriod.startDate}
  3164 + ${budget_keys}= Get Dictionary Keys ${data.budget}
3242 3165 ${budget_amount}= Convert To String ${data.budget.amount}
3243 3166 ${classificationWrapper}= Set Variable \#collapseGeneral
3244 3167 ${itemsWrapper}= Set Variable a[href='#collapseItems']
... ... @@ -3253,6 +3176,8 @@ Switch To Complaints
3253 3176
3254 3177 ## filling form
3255 3178 Select From List By Value id=planform-procurement_method_type ${data.tender.procurementMethodType}
  3179 + Run Keyword If 'period' in ${budget_keys} input datetime \#planform-period_start_date ${data.budget.period.startDate}
  3180 + Run Keyword If 'period' in ${budget_keys} input datetime \#planform-period_end_date ${data.budget.period.endDate}
3256 3181 JsInputHiddenText \#planform-budget_id ${data.budget.id}
3257 3182 Input text id=planform-title ${data.budget.description}
3258 3183 Input text id=planform-value_amount ${budget_amount}
... ... @@ -3343,6 +3268,7 @@ Switch To Complaints
3343 3268 ${budget}= get_invisible_text jquery=#general-info .budget-amount
3344 3269
3345 3270 PlanOpenByUAID ${uaid}
  3271 + JsSetScrollToElementBySelector \#general-info
3346 3272 Run Keyword And Return If '${key}' == 'tender.procurementMethodType' get_invisible_text jquery=#general-info .procurement-method-type
3347 3273 Run Keyword And Return If '${key}' == 'budget.amount' Convert To Number ${budget}
3348 3274 Run Keyword And Return If '${key}' == 'budget.description' get_text jquery=#general-info .budget-description .value
... ... @@ -3350,13 +3276,16 @@ Switch To Complaints
3350 3276 Run Keyword And Return If '${key}' == 'budget.id' get_text jquery=#general-info .budget-id .value
3351 3277 Run Keyword And Return If '${key}' == 'budget.project.id' get_invisible_text jquery=#general-info .budget-project-id
3352 3278 Run Keyword And Return If '${key}' == 'budget.project.name' get_invisible_text jquery=#general-info .budget-project-name
3353   - Run Keyword And Return If '${key}' == 'procuringEntity.name' get_invisible_text jquery=#procuring-entity-info .name
3354   - Run Keyword And Return If '${key}' == 'procuringEntity.identifier.scheme' get_invisible_text jquery=#procuring-entity-info .identifier-scheme
3355   - Run Keyword And Return If '${key}' == 'procuringEntity.identifier.id' get_invisible_text jquery=#procuring-entity-info .identifier-code
3356 3279 Run Keyword And Return If '${key}' == 'classification.description' get_invisible_text jquery=#general-info .main-classification-description
3357 3280 Run Keyword And Return If '${key}' == 'classification.scheme' get_invisible_text jquery=#general-info .main-classification-scheme
3358 3281 Run Keyword And Return If '${key}' == 'classification.id' get_invisible_text jquery=#general-info .main-classification-code
3359 3282 Run Keyword And Return If '${key}' == 'tender.tenderPeriod.startDate' get_invisible_text jquery=#general-info .tender-start-date-source
  3283 + ${procuringEntityNeedToBeVisible}= Run Keyword And Return Status Should Start With ${key} procuringEntity
  3284 + Run Keyword If ${procuringEntityNeedToBeVisible} JsSetScrollToElementBySelector \#procuring-entity-info
  3285 + Run Keyword And Return If '${key}' == 'procuringEntity.name' get_invisible_text jquery=#procuring-entity-info .name
  3286 + Run Keyword And Return If '${key}' == 'procuringEntity.identifier.scheme' get_invisible_text jquery=#procuring-entity-info .identifier-scheme
  3287 + Run Keyword And Return If '${key}' == 'procuringEntity.identifier.id' get_invisible_text jquery=#procuring-entity-info .identifier-code
  3288 + Run Keyword And Return If '${key}' == 'procuringEntity.identifier.legalName' get_invisible_text jquery=#procuring-entity-info .identifier-code
3360 3289 ${item0NeedToBeVisible}= Run Keyword And Return Status Should Start With ${key} items[0]
3361 3290 Run Keyword If ${item0NeedToBeVisible} JsCollapseShowAndScroll ${item0Wrapper}
3362 3291 Run Keyword And Return If '${key}' == 'items[0].description' get_text jquery=${item0Wrapper} .item-info-wrapper .title .value
... ...
... ... @@ -39,15 +39,17 @@ def procuring_entity_name(tender_data):
39 39 tender_data.data.procuringEntity.identifier['id'] = u"1234567890"
40 40 tender_data.data.procuringEntity.identifier['legalName'] = u"ТОВ \"ПлейТендер\""
41 41 tender_data.data.procuringEntity.identifier['legalName_en'] = u"TOV \"playtender\""
42   - tender_data.data.procuringEntity.address['region'] = u"Житомирська область"
43   - tender_data.data.procuringEntity.address['postalCode'] = u"123123"
44   - tender_data.data.procuringEntity.address['locality'] = u"населений пункт"
45   - tender_data.data.procuringEntity.address['streetAddress'] = u"адреса"
46   - tender_data.data.procuringEntity.contactPoint['name'] = u"Замовник Тест"
47   - tender_data.data.procuringEntity.contactPoint['name_en'] = u"Test"
48   - tender_data.data.procuringEntity.contactPoint['email'] = u"zamovnuk@rambler.ru"
49   - tender_data.data.procuringEntity.contactPoint['telephone'] = u"+3801111111111"
50   - tender_data.data.procuringEntity.contactPoint['url'] = u"http://playtender.com.ua"
  42 + if 'address' in tender_data.data.procuringEntity:
  43 + tender_data.data.procuringEntity.address['region'] = u"Житомирська область"
  44 + tender_data.data.procuringEntity.address['postalCode'] = u"123123"
  45 + tender_data.data.procuringEntity.address['locality'] = u"населений пункт"
  46 + tender_data.data.procuringEntity.address['streetAddress'] = u"адреса"
  47 + if 'contactPoint' in tender_data.data.procuringEntity:
  48 + tender_data.data.procuringEntity.contactPoint['name'] = u"Замовник Тест"
  49 + tender_data.data.procuringEntity.contactPoint['name_en'] = u"Test"
  50 + tender_data.data.procuringEntity.contactPoint['email'] = u"zamovnuk@rambler.ru"
  51 + tender_data.data.procuringEntity.contactPoint['telephone'] = u"+3801111111111"
  52 + tender_data.data.procuringEntity.contactPoint['url'] = u"http://playtender.com.ua"
51 53 return tender_data
52 54
53 55 def split_take_item(value, separator, index):
... ...
Please register or login to post a comment