def patch_tender_ua(self): response = self.app.post_json("/tenders", {"data": self.initial_data}) self.assertEqual(response.status, "201 Created") tender = response.json["data"] owner_token = response.json["access"]["token"] dateModified = tender.pop("dateModified") self.tender_id = tender["id"] self.set_enquiry_period_end() response = self.app.patch_json( "/tenders/{}?acc_token={}".format(tender["id"], owner_token), {"data": {"value": {"amount": 501, "currency": "UAH"}}}, status=403, ) self.assertEqual(response.status, "403 Forbidden") self.assertEqual(response.content_type, "application/json") self.assertEqual(response.json["errors"][0]["description"], "tenderPeriod should be extended by 2 working days") tender_period_end_date = calculate_tender_business_date( get_now(), timedelta(days=7), tender ) + timedelta(seconds=10) response = self.app.patch_json( "/tenders/{}?acc_token={}".format(tender["id"], owner_token), { "data": { "value": {"amount": 501, "currency": "UAH"}, "tenderPeriod": {"endDate": tender_period_end_date.isoformat()}, } }, ) self.assertEqual(response.status, "200 OK") self.assertEqual(response.content_type, "application/json") self.assertEqual(response.json["data"]["tenderPeriod"]["endDate"], tender_period_end_date.isoformat())
def complaintPeriod(self): if self.tenderPeriod.startDate < COMPLAINT_OLD_SUBMIT_TIME_BEFORE: endDate = calculate_tender_business_date( self.tenderPeriod.endDate, -COMPLAINT_OLD_SUBMIT_TIME, self) else: endDate = calculate_complaint_business_date( self.tenderPeriod.endDate, -COMPLAINT_SUBMIT_TIME, self) return Period( dict(startDate=self.tenderPeriod.startDate, endDate=endDate))
def validate_submit_claim_time(request, **kwargs): tender = request.validated["tender"] claim_submit_time = request.content_configurator.tender_claim_submit_time claim_end_date = calculate_tender_business_date( tender.tenderPeriod.endDate, -claim_submit_time, tender, True) if get_now() > claim_end_date: raise_operation_error( request, "Can submit claim not later than {duration.days} " "full business days before tenderPeriod ends".format( duration=claim_submit_time))
def validate_tender_period_extension_with_working_days(request, **kwargs): tender = request.validated["tender"] extra_period = request.content_configurator.tendering_period_extra extra_end_date = calculate_tender_business_date(get_now(), extra_period, tender, True) if tender.tenderPeriod.endDate < extra_end_date: raise_operation_error( request, "tenderPeriod should be extended by {0.days} working days".format( extra_period))
def recalculate_tender_periods(self): tender = self.request.validated["tender"] cancellation = self.request.validated["cancellation"] tenderer_action_date = self.context.tendererActionDate enquiry_period = tender.enquiryPeriod complaint_period = tender.complaintPeriod tender_period = tender.tenderPeriod auction_period = tender.auctionPeriod date = cancellation.complaintPeriod.startDate diff = calculate_date_diff(tenderer_action_date, date) delta = diff.days delta_plus = 1 if diff.seconds > 3599 else 0 delta += delta_plus delta = timedelta(days=1 if not delta else delta) if tender.status == "active.tendering" and tender.enquiryPeriod: if enquiry_period.startDate < date <= tender_period.endDate: enquiry_period.endDate = calculate_tender_business_date( enquiry_period.endDate, delta, tender, True) enquiry_period.clarificationsUntil = calculate_tender_business_date( enquiry_period.clarificationsUntil, delta, tender, True) tender_period.endDate = calculate_tender_business_date( tender_period.endDate, delta, tender, True) complaint_period.endDate = calculate_tender_business_date( complaint_period.endDate, delta, tender, True) if auction_period.shouldStartAfter: auction_period.shouldStartAfter = calculate_tender_business_date( parse_date(auction_period.shouldStartAfter), delta, tender, True).isoformat() if auction_period.startDate: auction_period.startDate = calculate_tender_business_date( auction_period.startDate, delta, tender, True) elif auction_period and tender_period.endDate and auction_period.shouldStartAfter\ and tender_period.endDate < date <= parse_date(auction_period.shouldStartAfter): auction_period.shouldStartAfter = calculate_tender_business_date( auction_period.shouldStartAfter, delta, tender, True) auction_period.startDate = calculate_tender_business_date( auction_period.startDate, delta, tender, True)
def tender_enquiryPeriod(self): endDate = calculate_tender_business_date(self.tenderPeriod.endDate, -ENQUIRY_PERIOD_TIME, self, True) clarificationsUntil = calculate_clarifications_business_date( endDate, ENQUIRY_STAND_STILL_TIME, self, True) return EnquiryPeriod( dict( startDate=self.tenderPeriod.startDate, endDate=endDate, invalidationDate=self.enquiryPeriod and self.enquiryPeriod.invalidationDate, clarificationsUntil=clarificationsUntil, ))
def tender_init_handler(event): """ initialization handler for openuadefence tenders """ tender = event.tender end_date = calculate_tender_business_date(tender.tenderPeriod.endDate, -ENQUIRY_PERIOD_TIME, tender, True) clarifications_until = calculate_clarif_business_date(end_date, ENQUIRY_STAND_STILL_TIME, tender, True) tender.enquiryPeriod = EnquiryPeriod( dict( startDate=tender.tenderPeriod.startDate, endDate=end_date, invalidationDate=tender.enquiryPeriod and tender.enquiryPeriod.invalidationDate, clarificationsUntil=clarifications_until, ) ) now = get_now() tender.date = now if tender.lots: for lot in tender.lots: lot.date = now
def validate_tenderPeriod(self, data, period): if period and calculate_tender_business_date( period.startDate, TENDER_PERIOD, data, True) > period.endDate: raise ValidationError( u"tenderPeriod should be greater than {0.days} working days". format(TENDER_PERIOD))
def patch_tender(self): response = self.app.get("/tenders") self.assertEqual(response.status, "200 OK") self.assertEqual(len(response.json["data"]), 0) response = self.app.post_json("/tenders", {"data": self.initial_data}) self.assertEqual(response.status, "201 Created") tender = response.json["data"] self.tender_id = response.json["data"]["id"] owner_token = response.json["access"]["token"] dateModified = tender.pop("dateModified") response = self.app.patch_json( "/tenders/{}?acc_token={}".format(tender["id"], owner_token), {"data": {"status": "cancelled"}} ) self.assertEqual(response.status, "200 OK") self.assertEqual(response.content_type, "application/json") self.assertNotEqual(response.json["data"]["status"], "cancelled") response = self.app.patch_json( "/tenders/{}?acc_token={}".format(tender["id"], owner_token), {"data": {"procuringEntity": {"kind": "general"}}} ) self.assertEqual(response.status, "200 OK") self.assertEqual(response.content_type, "application/json") self.assertNotEqual(response.json["data"]["procuringEntity"]["kind"], "general") response = self.app.patch_json( "/tenders/{}?acc_token={}".format(tender["id"], owner_token), {"data": {"tenderPeriod": {"startDate": tender["enquiryPeriod"]["endDate"]}}}, status=422, ) self.assertEqual(response.status, "422 Unprocessable Entity") self.assertEqual(response.content_type, "application/json") self.assertEqual( response.json["errors"], [ { "location": "body", "name": "tenderPeriod", "description": ["tenderPeriod must be at least 6 full business days long"], } ], ) response = self.app.patch_json( "/tenders/{}?acc_token={}".format(tender["id"], owner_token), {"data": {"procurementMethodRationale": "Open"}} ) self.assertEqual(response.status, "200 OK") self.assertEqual(response.content_type, "application/json") self.assertIn("invalidationDate", response.json["data"]["enquiryPeriod"]) new_tender = response.json["data"] new_enquiryPeriod = new_tender.pop("enquiryPeriod") new_dateModified = new_tender.pop("dateModified") tender.pop("enquiryPeriod") tender["procurementMethodRationale"] = "Open" self.assertEqual(tender, new_tender) self.assertNotEqual(dateModified, new_dateModified) revisions = self.db.get(tender["id"]).get("revisions") self.assertTrue( any( [ i for i in revisions[-1]["changes"] if i["op"] == "remove" and i["path"] == "/procurementMethodRationale" ] ) ) response = self.app.patch_json( "/tenders/{}?acc_token={}".format(tender["id"], owner_token), {"data": {"dateModified": new_dateModified}} ) self.assertEqual(response.status, "200 OK") self.assertEqual(response.content_type, "application/json") new_tender2 = response.json["data"] new_enquiryPeriod2 = new_tender2.pop("enquiryPeriod") new_dateModified2 = new_tender2.pop("dateModified") self.assertEqual(new_tender, new_tender2) self.assertNotEqual(new_enquiryPeriod, new_enquiryPeriod2) self.assertNotEqual(new_dateModified, new_dateModified2) response = self.app.patch_json( "/tenders/{}?acc_token={}".format(tender["id"], owner_token), {"data": {"items": [self.initial_data["items"][0]]}}, ) self.assertEqual(response.status, "200 OK") self.assertEqual(response.content_type, "application/json") response = self.app.patch_json( "/tenders/{}?acc_token={}".format(tender["id"], owner_token), {"data": {"items": [{}, self.initial_data["items"][0]]}}, ) self.assertEqual(response.status, "200 OK") self.assertEqual(response.content_type, "application/json") item0 = response.json["data"]["items"][0] item1 = response.json["data"]["items"][1] self.assertNotEqual(item0.pop("id"), item1.pop("id")) self.assertEqual(item0, item1) response = self.app.patch_json( "/tenders/{}?acc_token={}".format(tender["id"], owner_token), {"data": {"items": [{}]}} ) self.assertEqual(response.status, "200 OK") self.assertEqual(response.content_type, "application/json") self.assertEqual(len(response.json["data"]["items"]), 1) response = self.app.patch_json( "/tenders/{}?acc_token={}".format(tender["id"], owner_token), {"data": {"items": [{"classification": {"scheme": "ДК021", "id": "44620000-2", "description": "Cartons 2"}}]}}, status=200, ) response = self.app.patch_json( "/tenders/{}?acc_token={}".format(tender["id"], owner_token), { "data": { "items": [ { "classification": { "scheme": "ДК021", "id": "55523100-3", "description": "Послуги з харчування у школах", } } ] } }, status=403, ) self.assertEqual(response.status, "403 Forbidden") self.assertEqual(response.content_type, "application/json") self.assertEqual(response.json["errors"][0]["description"], "Can't change classification") response = self.app.patch_json( "/tenders/{}?acc_token={}".format(tender["id"], owner_token), { "data": { "items": [ { "additionalClassifications": [ tender["items"][0]["additionalClassifications"][0] for i in range(3) ] } ] } }, ) self.assertEqual(response.status, "200 OK") self.assertEqual(response.content_type, "application/json") response = self.app.patch_json( "/tenders/{}?acc_token={}".format(tender["id"], owner_token), {"data": {"items": [{"additionalClassifications": tender["items"][0]["additionalClassifications"]}]}}, ) self.assertEqual(response.status, "200 OK") self.assertEqual(response.content_type, "application/json") response = self.app.patch_json( "/tenders/{}?acc_token={}".format(tender["id"], owner_token), {"data": {"enquiryPeriod": { "startDate": calculate_tender_business_date( parse_date(new_dateModified2), -timedelta(3), None, True ).isoformat(), "endDate": new_dateModified2 }}}, status=403, ) self.assertEqual(response.status, "403 Forbidden") self.assertEqual(response.content_type, "application/json") self.assertEqual(response.json["errors"][0]["description"], "Can't change enquiryPeriod") self.set_status("complete") response = self.app.patch_json( "/tenders/{}?acc_token={}".format(tender["id"], owner_token), {"data": {"status": "active.auction"}}, status=403 ) self.assertEqual(response.status, "403 Forbidden") self.assertEqual(response.content_type, "application/json") self.assertEqual(response.json["errors"][0]["description"], "Can't update tender in current (complete) status")