コード例 #1
0
 def post(self):
     """Report auction results for lot.
     """
     apply_patch(self.request,
                 save=False,
                 src=self.request.validated['auction_src'])
     auction = self.request.validated['auction']
     adapter = self.request.registry.getAdapter(auction, IAuctionManager)
     if (all([
             i.auctionPeriod and i.auctionPeriod.endDate
             for i in auction.lots
             if i.numberOfBids > 1 and i.status == 'active'
     ])):
         cleanup_bids_for_cancelled_lots(auction)
         invalidate_bids_under_threshold(auction)
         if any([i.status == 'active' for i in auction.bids]):
             self.request.content_configurator.start_awarding()
         else:
             adapter.pendify_auction_status('unsuccessful')
     if save_auction(self.request):
         self.LOGGER.info('Report auction results',
                          extra=context_unpack(
                              self.request,
                              {'MESSAGE_ID': 'auction_lot_auction_post'}))
         return {
             'data':
             self.request.validated['auction'].serialize(
                 self.request.validated['auction'].status)
         }
コード例 #2
0
 def collection_post(self):
     apply_patch(self.request, save=False, src=self.request.validated['auction_src'])
     auction = self.request.validated['auction']
     adapter = self.request.registry.getAdapter(auction, IAuctionManager)
     invalidate_bids_under_threshold(auction)
     if any([i.status == 'active' for i in auction.bids]):
         self.request.content_configurator.start_awarding()
     else:
         adapter.pendify_auction_status('unsuccessful')
     if save_auction(self.request):
         self.LOGGER.info('Report auction results', extra=context_unpack(self.request, {'MESSAGE_ID': 'auction_auction_post'}))
         return {'data': self.request.validated['auction'].serialize(self.request.validated['auction'].status)}
コード例 #3
0
    def test_invalidate_bids_under_threshold(self):
        def get_auction(value, minimal_step, bids):
            return {
                'value': {
                    'amount': value
                },
                'minimalStep': {
                    'amount': minimal_step
                },
                'bids': bids
            }

        need_bid_statuses = ('valid', 'invalid')
        amount = random.randint(50, 100)
        small_amount = random.randint(1, (amount - 1) / 2)
        big_amount = random.randint(amount, (amount * 2))
        bid = munch.Munch({
            'value': {
                'amount': amount
            },
            'status': need_bid_statuses[0]
        })

        auction = get_auction(small_amount, small_amount, [])
        invalidate_bids_under_threshold(auction)
        self.assertEqual(bid.status, need_bid_statuses[0])

        auction = get_auction(small_amount, small_amount, [bid])
        invalidate_bids_under_threshold(auction)
        self.assertEqual(bid.status, need_bid_statuses[0])

        auction = get_auction(big_amount, big_amount, [bid])
        invalidate_bids_under_threshold(auction)
        self.assertEqual(bid.status, need_bid_statuses[1])
コード例 #4
0
    def collection_post(self):
        """Report auction results.

        Report auction results
        ----------------------

        Example request to report auction results:

        .. sourcecode:: http

            POST /auctions/4879d3f8ee2443169b5fbbc9f89fa607/auction HTTP/1.1
            Host: example.com
            Accept: application/json

            {
                "data": {
                    "dateModified": "2014-10-27T08:06:58.158Z",
                    "bids": [
                        {
                            "value": {
                                "amount": 400,
                                "currency": "UAH"
                            }
                        },
                        {
                            "value": {
                                "amount": 385,
                                "currency": "UAH"
                            }
                        }
                    ]
                }
            }

        This is what one should expect in response:

        .. sourcecode:: http

            HTTP/1.1 200 OK
            Content-Type: application/json

            {
                "data": {
                    "dateModified": "2014-10-27T08:06:58.158Z",
                    "bids": [
                        {
                            "value": {
                                "amount": 400,
                                "currency": "UAH",
                                "valueAddedTaxIncluded": true
                            }
                        },
                        {
                            "value": {
                                "amount": 385,
                                "currency": "UAH",
                                "valueAddedTaxIncluded": true
                            }
                        }
                    ],
                    "minimalStep":{
                        "amount": 35,
                        "currency": "UAH"
                    },
                    "tenderPeriod":{
                        "startDate": "2014-11-04T08:00:00"
                    }
                }
            }

        """
        apply_patch(self.request,
                    save=False,
                    src=self.request.validated['auction_src'])
        auction = self.request.validated['auction']
        adapter = self.request.registry.getAdapter(auction, IAuctionManager)
        invalidate_bids_under_threshold(auction)
        if any([i.status == 'active' for i in auction.bids]):
            self.request.content_configurator.start_awarding()
        else:
            adapter.pendify_auction_status('unsuccessful')
        if save_auction(self.request):
            self.LOGGER.info(
                'Report auction results',
                extra=context_unpack(self.request,
                                     {'MESSAGE_ID': 'auction_auction_post'}))
            return {
                'data':
                self.request.validated['auction'].serialize(
                    self.request.validated['auction'].status)
            }
コード例 #5
0
def migrate_awarding_1_0_to_awarding_2_0(auction):
    if auction['procurementMethodType'] not in ['dgfOtherAssets', 'dgfFinancialAssets'] \
                or auction['status'] not in ['active.qualification', 'active.awarded'] \
                or 'awards' not in auction:
        return
    now = get_now().isoformat()
    awards = auction["awards"]
    unique_awards = len(set([a['bid_id'] for a in awards]))

    if unique_awards > 2:
        switch_auction_to_unsuccessful(auction)
    else:
        invalidate_bids_under_threshold(auction)
        award = [a for a in awards if a['status'] in ['active', 'pending']][0]
        for bid in auction['bids']:
            if bid['id'] == award['bid_id'] and bid['status'] == 'invalid':
                switch_auction_to_unsuccessful(auction)

    if auction['status'] != 'unsuccessful':
        award = [a for a in awards if a['status'] in ['active', 'pending']][0]

        award_create_date = award['complaintPeriod']['startDate']

        award.update({
            'verificationPeriod': {
                'startDate': award_create_date,
                'endDate': award_create_date
            },
            'paymentPeriod': {
                'startDate': award_create_date,
            },
            'signingPeriod': {
                'startDate': award_create_date,
            }
        })

        if award['status'] == 'pending':
            award['status'] = 'pending.payment'

        elif award['status'] == 'active':
            award['verificationPeriod']['endDate'] = award['paymentPeriod'][
                'endDate'] = now

        if unique_awards == 1:
            bid = chef(auction['bids'], auction.get('features'), [], True)[1]

            award = {
                'id': uuid4().hex,
                'bid_id': bid['id'],
                'status': 'pending.waiting',
                'date': awards[0]['date'],
                'value': bid['value'],
                'suppliers': bid['tenderers'],
                'complaintPeriod': {
                    'startDate': awards[0]['date']
                }
            }
            if bid['status'] == 'invalid':
                award['status'] = 'unsuccessful'
                award['complaintPeriod']['endDate'] = now

            awards.append(award)