Skip to content

Commit

Permalink
Merge b164c4a into ed218d6
Browse files Browse the repository at this point in the history
  • Loading branch information
tarasvaskiv committed Dec 4, 2017
2 parents ed218d6 + b164c4a commit b668035
Show file tree
Hide file tree
Showing 3 changed files with 84 additions and 3 deletions.
17 changes: 14 additions & 3 deletions openprocurement/tender/esco/models.py
Expand Up @@ -229,10 +229,21 @@ def validate_annualCostsReduction(self, data, value):

@bids_validation_wrapper
def validate_yearlyPaymentsPercentage(self, data, value):
if get_tender(data['__parent__']).fundingKind == 'other' and (value < Decimal('0.8') or value > Decimal('1')):
tender = get_tender(data['__parent__'])

if tender.fundingKind == 'other' and value < Decimal('0.8'):
raise ValidationError('yearlyPaymentsPercentage should be greater than 0.8 and less than 1')
if get_tender(data['__parent__']).fundingKind == 'budget'and (value < Decimal('0') or value > get_tender(data['__parent__']).yearlyPaymentsPercentageRange):
raise ValidationError('yearlyPaymentsPercentage should be greater than 0 and less than {}'.format(get_tender(data['__parent__']).yearlyPaymentsPercentageRange))
if tender.fundingKind == 'budget':
if tender.lots:
lots = [i for i in tender.lots if i.id == data['__parent__']['relatedLot']]

if lots and value > lots[0].yearlyPaymentsPercentageRange:
raise ValidationError('yearlyPaymentsPercentage should be greater than 0 and less than {}'.format(
lots[0].yearlyPaymentsPercentageRange))
else:
if value > tender.yearlyPaymentsPercentageRange:
raise ValidationError('yearlyPaymentsPercentage should be greater than 0 and less than {}'.format(
tender.yearlyPaymentsPercentageRange))


class LotValue(BaseLotValue):
Expand Down
3 changes: 3 additions & 0 deletions openprocurement/tender/esco/tests/lot.py
Expand Up @@ -47,6 +47,7 @@
get_tender_lots,
tender_min_value,
lot_minimal_step_invalid,
lot_yppr_validation,
tender_minimal_step_percentage,
tender_lot_funding_kind,
tender_1lot_fundingKind_default,
Expand Down Expand Up @@ -86,10 +87,12 @@ class TenderLotResourceTest(BaseESCOContentWebTest):

initial_auth = ('Basic', ('broker', ''))
test_lots_data = test_lots # TODO: change attribute identifier
test_bids = test_bids
initial_data = test_tender_data

test_create_tender_lot_invalid = snitch(create_tender_lot_invalid)
test_create_tender_lot = snitch(create_tender_lot)
test_lot_yppr_validation = snitch(lot_yppr_validation)
test_patch_tender_lot = snitch(patch_tender_lot)
test_patch_tender_lot_minValue = snitch(patch_tender_lot_minValue)
test_delete_tender_lot = snitch(delete_tender_lot)
Expand Down
67 changes: 67 additions & 0 deletions openprocurement/tender/esco/tests/lot_blanks.py
Expand Up @@ -342,6 +342,73 @@ def tender_1lot_fundingKind_default(self):
self.assertEqual(response.json['data']['lots'][0]['fundingKind'], 'budget')


def lot_yppr_validation(self):
data = deepcopy(self.initial_data)
data['fundingKind'] = 'budget' # for tender

lot = deepcopy(self.test_lots_data[0])
del lot['fundingKind']

data['lots'] = []
lot['yearlyPaymentsPercentageRange'] = 0.8 # first lot yearlyPaymentsPercentageRange = 0.8
data['lots'].append(deepcopy(lot))
lot['yearlyPaymentsPercentageRange'] = 0.6 # second lot yearlyPaymentsPercentageRange = 0.6
data['lots'].append(deepcopy(lot))

response = self.app.post_json('/tenders', {'data': data})
self.assertEqual(response.status, '201 Created')
self.assertEqual(response.content_type, 'application/json')
self.assertEqual(response.json['data']['fundingKind'], 'budget')
self.assertIn('lots', response.json['data'])
self.assertIn('fundingKind', response.json['data']['lots'][0])
self.assertEqual(response.json['data']['lots'][0]['fundingKind'], 'budget')
self.assertEqual(response.json['data']['lots'][0]['yearlyPaymentsPercentageRange'], 0.8)
self.assertIn('fundingKind', response.json['data']['lots'][1])
self.assertEqual(response.json['data']['lots'][1]['fundingKind'], 'budget')
self.assertEqual(response.json['data']['lots'][1]['yearlyPaymentsPercentageRange'], 0.6)
self.assertEqual(response.json['data']['yearlyPaymentsPercentageRange'], 0.6)
owner_token = response.json['access']['token']
tender_id = response.json['data']['id']
lot_id1 = response.json['data']['lots'][0]['id']
lot_id2 = response.json['data']['lots'][1]['id']

bid = deepcopy(self.test_bids[0])
del bid['value']
bid['lotValues'] = [
{"value": {'annualCostsReduction': [700] + [1600] * 20,
'yearlyPaymentsPercentage': 0.65,
'contractDuration': {
"years": 7
}
},
'relatedLot': lot_id1},
{"subcontractingDetails": "ДКП «Укр Прінт», Україна",
"value": {'annualCostsReduction': [600] + [1200] * 20,
'yearlyPaymentsPercentage': 0.7,
'contractDuration': {
"years": 9
}
},
'relatedLot': lot_id2}
]

response = self.app.post_json('/tenders/{}/bids?acc_token={}'.format(tender_id, owner_token), {'data': bid},
status=422)
self.assertEqual(response.status, '422 Unprocessable Entity')
self.assertEqual(response.content_type, 'application/json')
self.assertEqual(response.json['status'], 'error')
self.assertEqual(response.json['errors'], [{u'description': [{u'value': {
u'yearlyPaymentsPercentage': [u'yearlyPaymentsPercentage should be greater than 0 and less than 0.6']}}],
u'location': u'body', u'name': u'lotValues'}])

bid['lotValues'][1]['value']['yearlyPaymentsPercentage'] = 0.4
response = self.app.post_json('/tenders/{}/bids?acc_token={}'.format(tender_id, owner_token), {'data': bid})
self.assertEqual(response.status, '201 Created')
self.assertEqual(response.json['data']['status'], 'pending')
self.assertEqual(response.json['data']['lotValues'][0]['value']['yearlyPaymentsPercentage'], 0.65)
self.assertEqual(response.json['data']['lotValues'][1]['value']['yearlyPaymentsPercentage'], 0.4)


def tender_2lot_fundingKind_default(self):
data = deepcopy(self.initial_data)
lot = deepcopy(self.test_lots_data[0])
Expand Down

0 comments on commit b668035

Please sign in to comment.