Commit e5a6ff38 authored by dmitry.mashoshin's avatar dmitry.mashoshin Committed by mashony
Browse files

Merge branch 'fix-dgf-bank-accounts' into 'master'

Fix dgf protocols

See merge request !104
parent 7102c4c4
Pipeline #36553 failed with stages
in 2 minutes and 11 seconds
......@@ -6,7 +6,7 @@ from jinja2 import Template, exceptions as jinja2_exceptions
from prozorro_sale.protocol_service.utils import (localize_time, get_auction, standardize_amount, SUCCESS_STATUSES_MAP,
parse_duration)
from prozorro_sale.protocol_service.serializers import Procedure
from prozorro_sale.protocol_service.serializers import get_procedure_serializer
from prozorro_sale.protocol_service.errors import TemplateNotFound, TemplateError
......@@ -14,7 +14,7 @@ class ProtocolBuilder:
templates_path = f'{os.path.join(os.path.dirname(__file__))}/templates'
def __init__(self, auction_id):
self.procedure = Procedure(auction_id)
self.procedure = get_procedure_serializer(auction_id)
self.auction = {}
self.auction_id = auction_id
......
......@@ -3,8 +3,12 @@ from prozorro_sale.auth import get_user_legal_name_by_name
class Procedure:
def __init__(self, auction_id):
self.proc_obj = self.get_procedure(auction_id)
def __init__(self, auction_id, procedure=None):
self.proc_obj = procedure
if not self.proc_obj:
self.proc_obj = get_procedure(auction_id)
self._prepare_proc_obj()
self.winner_award = self.get_winner_award()
self.winner_bid = self.get_winner_bid()
self.next_to_winner_bid = self.get_next_to_winner_bid()
......@@ -36,10 +40,8 @@ class Procedure:
def get_user_legal_name(self, name):
return get_user_legal_name_by_name(name) or name
def get_procedure(self, auction_id):
procedure = get_procedure(auction_id)
procedure['owner_legal_name'] = self.get_user_legal_name(name=procedure.get('owner'))
return procedure
def _prepare_proc_obj(self):
self.proc_obj['owner_legal_name'] = self.get_user_legal_name(name=self.proc_obj.get('owner'))
def has_unsuccessful_winner_award(self):
return self.proc_obj['awards'][0]['status'] in {'unsuccessful', 'cancelled'}
......@@ -105,3 +107,40 @@ class Procedure:
def __getitem__(self, item):
return self.proc_obj.get(item)
class DGFProcedure(Procedure):
def _format_participant_description(self, bidder):
return f"Учасник {bidder['name']['uk_UA']}, #{bidder['identifier']['id']}"
def get_bidder_description(self, bid_id):
bidder = self.bids[bid_id]['bidders'][0]
return self._format_participant_description(bidder)
def get_actual_winner_description(self):
if self.winner_award:
buyer = self.winner_award['buyers'][0]
return self._format_participant_description(buyer)
if self.winner_bid:
bidder = self.winner_bid['bidders'][0]
return self._format_participant_description(bidder)
def get_disqualified_winner_description(self):
if list(self.awards.values())[0]['status'] == 'unsuccessful':
disqualified_buyer = list(self.awards.values())[0]['buyers'][0]
return self._format_participant_description(disqualified_buyer)
PROCEDURE_SERIALIZER_MAPPING = {
"dgf": DGFProcedure,
"__default__": Procedure
}
def get_procedure_serializer(auction_id):
procedure = get_procedure(auction_id)
selling_method = procedure["sellingMethod"].split("-")
selling_type = selling_method[0]
default_serializer_class = PROCEDURE_SERIALIZER_MAPPING["__default__"]
serializer_class = PROCEDURE_SERIALIZER_MAPPING.get(selling_type, default_serializer_class)
return serializer_class(auction_id, procedure)
......@@ -43,16 +43,8 @@
</div>
<br>
<div>
<strong>Найменування оператора електронного майданчика, через якого переможцем електронного аукціону подано цінову
пропозицію/найбільшу закриту цінову пропозицію/ставку:
</strong> {{ procedure.winner_bid.owner_legal_name if procedure.winner_bid else "_" * 10 }}
</div>
<br>
<div>
<strong>
Найменування оператора, через електронний майданчик якого надано наступну за розміром цінову пропозицію після
цінової пропозиції переможця електронного аукціону:
</strong> {{ procedure.next_to_winner_bid.owner_legal_name if procedure.next_to_winner_bid else "_" * 10 }}
<strong>Найменування оператора, через електронний майданчик якого переможець електронних торгів набув право участі в електронних торгах:</strong>
{{ procedure.winner_bid.owner_legal_name if procedure.winner_bid else "_" * 10 }}
</div>
<br>
<div>
......@@ -60,7 +52,7 @@
</div>
<br>
<div>
<strong>Організатор аукціону:</strong> {{ procedure.sellingEntity.identifier.legalName.uk_UA if
<strong>Власник активів (майна) <i>(найменування банку - замовника)</i>:</strong> {{ procedure.sellingEntity.identifier.legalName.uk_UA if
procedure.sellingEntity.identifier else "_" * 10 }}
</div>
<br>
......@@ -80,7 +72,7 @@
</div>
<br>
<div>
<strong>Найменування активів (майна)/права лоту (склад лоту):</strong> {{ procedure.title.uk_UA }}
<strong>Найменування активів (майна) лота (склад лота):</strong>
{% if procedure.items %}
{% for item in procedure.items %}
<div>
......@@ -93,7 +85,7 @@
</div>
<br>
<div>
<strong>Стартова ціна лота/Стартовий розмір орендної плати</strong> {{ standardize_amount(procedure.value.amount) }}
<strong>Початкова (стартова) ціна лота:</strong> {{ standardize_amount(procedure.value.amount) }}
грн.
{% if procedure.value.valueAddedTaxIncluded %}
з ПДВ
......@@ -103,7 +95,11 @@
</div>
<br>
<div>
<strong>Ціна реалізації/орендна плата на місяць</strong>
<strong>Мінімальна ціна лота:</strong> __________ грн.
</div>
<br>
<div>
<strong>Ціна продажу лота</strong>
{{ standardize_amount(procedure.winner_bid.value.amount) if procedure.winner_bid else "_" * 10 }} грн.
{% if procedure.value.valueAddedTaxIncluded %}
з ПДВ
......@@ -113,7 +109,7 @@
</div>
<br>
<div>
<strong>Крок аукціону:</strong> {{ standardize_amount(procedure.minimalStep.amount) }} грн.
<strong>Крок:</strong> {{ standardize_amount(procedure.minimalStep.amount) }} грн.
</div>
<br>
<div>
......@@ -169,42 +165,48 @@
</div>
<br>
<div>
<strong>Учасник, якого дискваліфіковано відповідно до п.__ Регламенту (якому відмовлено у затвердженні
протоколу)</strong> {{ procedure.get_disqualified_winner_description() or "_" * 10 }}
<strong>Учасник, якого дискваліфіковано відповідно до п. _____ Регламенту:</strong>
</div>
<br>
<br>
<div>{{ procedure.get_disqualified_winner_description() or "" }}</div>
<div style="border-bottom:1px solid #000;"></div>
<div><small>заповнюється Оператором електронного майданчика, через який надано найвищу цінову пропозицію</small></div>
<br>
<div>
<strong>Реквізити банку для сплати коштів за придбані активи (майно) вказано за посиланням:</strong>
<a href="http://www.fg.gov.ua/banki-v-upravlinni-fondu/banki-shcho-likviduyutsya">http://www.fg.gov.ua/banki-v-upravlinni-fondu/banki-shcho-likviduyutsya</a>
</div>
<br>
<div>
<strong>Реєстраційний внесок, який стягується з кожного учасника в електронному аукціоні:</strong> {{
standardize_amount(procedure.registrationFee.amount) if procedure.registrationFee else "_" * 10 }} грн.
</div>
<br>
<div>
<strong>Винагорода оператора, через електронний майданчик якого опубліковано оголошення про проведення електронного
аукціону:</strong> __________ грн.
</div>
<div style="border-bottom:1px solid #000;"></div>
<br>
<div>
<strong>Винагорода оператора, через електронний майданчик якого подано цінову пропозицію/найбільшу закриту цінову
пропозицію/ставку: </strong> __________ грн.
<strong>Винагорода оператора, через електронний майданчик якого переможець набув право участі в електронному аукціоні: </strong>
</div>
<br>
<br>
<div style="border-bottom:1px solid #000;"></div>
<div><small>заповнюється Оператором електронного майданчика, через який надано найвищу цінову пропозицію</small></div>
<br>
<div>
<strong>Сума, що підлягає перерахуванню __________
<small><i>(організатору/переможцю електронного аукціону)</i></small>
від оператора, через електронний майданчик якого подано цінову пропозицію/найбільшу закриту цінову
пропозицію/ставку: </strong> __________ грн.
від оператора, через електронний майданчик якого переможець набув право участі в електронному аукціоні: </strong>
</div>
<br>
<br>
<div style="border-bottom:1px solid #000;"></div>
<div><small>заповнюється Оператором електронного майданчика, через який надано найвищу цінову пропозицію</small></div>
<br>
<div>
<strong>Сума, яка підлягає сплаті переможцем електронного аукціону (у випадку продажу)/сума яку необхідно сплачувати
щомісячно (у випадку оренди): </strong> __________ грн.коп.
<strong>Сума, яка підлягає сплаті переможцем банку: </strong>
</div>
<br>
<br>
<div style="border-bottom:1px solid #000;"></div>
<div><small>заповнюється Оператором електронного майданчика, через який надано найвищу цінову пропозицію</small></div>
<br>
<div>
<strong>Протокол електронного аукціону сформовано:</strong> {{ generated_at }}
</div>
......@@ -214,24 +216,24 @@
<ul class="dashed_ul">
<li>
<small><i>
підписати в (3) трьох оригінальних примірниках протокол електронного аукціону у строки передбачені цим
Регламентом або іншим нормативно-правовим актом та направити його на підписання оператору,
через який таким переможцем електронного аукціону подано найвищу цінову пропозицію
здійснити повну оплату коштів за лот, які повинні надійти на рахунок банку (банків) я не пізніше кінця 18 (вісімнадцятого) робочого дня з дати формування ЦБД протоколу електронних торгів
</i></small>
</li>
<li>
<small><i>
провести розрахунок відповідно до договору та Регламенту (іншого нормативно-правового акту),
та підписати договір у строки передбачені цим Регламентом або іншим нормативно-правовим актом.
та підписати договір (договори) купівлі-продажу/відступлення права вимоги придбаного активу(ів)(майна) протягом 20 (двадцять) робочих днів з дня, наступного за днем формування протоколу електронних торгів.
</i></small>
</li>
</ul>
</div>
<br>
<div>
<strong>Переможець електронного аукціону:</strong>
<strong>Переможець електронних торгів:</strong>
</div>
<br>
<br>
<br>
<br>
<table cellpadding="0" cellspacing="0" border="0" width="100%">
<tbody>
<tr>
......@@ -258,11 +260,14 @@
</tbody>
</table>
<br>
<br>
<div>
<strong>Найменування оператора, через електронний майданчик якого надано цінову пропозицію/найбільшу закриту цінову
пропозицію/ставку (найбільшу суму орендної плати в місяць):</strong>
<strong>Найменування оператора, через електронний майданчик якого переможець набув право участі в електронних торгах:</strong>
</div>
<br>
<br>
<br>
<br>
<table cellpadding="0" cellspacing="0" border="0" width="100%">
<tbody>
<tr>
......@@ -289,8 +294,16 @@
</tbody>
</table>
<br>
<br>
<div>
<strong>Найменування банку - замовника:</strong> {{ procedure.sellingEntity.name.uk_UA or "_" * 10 }}
</div>
<br>
<br>
<br>
<br>
<div>
<strong>Найменування організатора:</strong> {{ procedure.sellingEntity.name.uk_UA or "_" * 10 }}
Уповноважена особа Фонду на ліквідацію банку:
</div>
<br>
<table cellpadding="0" cellspacing="0" border="0" width="100%">
......@@ -319,6 +332,7 @@
</tbody>
</table>
<br>
<br>
<div>
<small><i>*Зазначаються тільки для осіб, які через свої релігійні або інші переконання відмовилися від прийняття
реєстраційного номера облікової картки платника податків та мають відмітку в паспорті.</i></small>
......
......@@ -59,7 +59,7 @@
</div>
<br>
<div>
<strong>Організатор аукціону:</strong> {{ procedure.sellingEntity.identifier.legalName.uk_UA if
<strong>Власник активів (майна) <i>(найменування банку - замовника)</i>:</strong> {{ procedure.sellingEntity.identifier.legalName.uk_UA if
procedure.sellingEntity.identifier else "_" * 10 }}
</div>
<br>
......@@ -79,7 +79,7 @@
</div>
<br>
<div>
<strong>Найменування лота (склад лота):</strong>
<strong>Найменування активів (майна) лота (склад лота):</strong>
{% if procedure.items %}
{% for item in procedure.items %}
<div>
......@@ -92,7 +92,7 @@
</div>
<br>
<div>
<strong>Стартова ціна лота:</strong> {{standardize_amount(procedure.value.amount)}} грн.
<strong>Початкова ціна / ціна реалізації:</strong> {{standardize_amount(procedure.value.amount)}} грн.
{% if procedure.value.valueAddedTaxIncluded %}
з ПДВ
{% else %}
......@@ -101,12 +101,13 @@
</div>
<br>
<div>
<strong>Ціна реалізації лота:</strong> {{standardize_amount(procedure.winner_bid.value.amount) if procedure.winner_bid else "_" * 10}} грн.
<strong>Ціна продажу:</strong> {{standardize_amount(procedure.winner_bid.value.amount) if procedure.winner_bid else "_" * 10}} грн.
{% if procedure.value.valueAddedTaxIncluded %}
з ПДВ
{% else %}
без ПДВ
{% endif %}
</div>
<br>
<div>
<strong>Крок аукціону:</strong> {{standardize_amount(procedure.minimalStep.amount)}} грн.
......@@ -180,65 +181,86 @@
<br>
<div>
<strong>Учасник, якого дискваліфіковано відповідно до п. _____ Регламенту:</strong>
<small><u><i>{{ procedure.get_disqualified_winner_description() or "_" * 10}}</i></u></small>
</div>
<br>
<br>
<div>{{ procedure.get_disqualified_winner_description() or ""}}</div>
<div style="border-bottom:1px solid #000;"></div>
<div><small>заповнюється Оператором електронного майданчика, через який надано найвищу цінову пропозицію</small></div>
<br>
<div>
<strong>Реквізити банку для сплати коштів за придбані активи (майно) вказано за посиланням:</strong>
<a href="http://www.fg.gov.ua/banki-v-upravlinni-fondu/banki-shcho-likviduyutsya">http://www.fg.gov.ua/banki-v-upravlinni-fondu/banki-shcho-likviduyutsya</a>
</div>
<br>
<div>
<strong>Реєстраційний внесок, який стягується з кожного учасника в електронному аукціоні:</strong> __________ грн.
</div>
<br>
<div style="border-bottom:1px solid #000;"></div>
<br>
<div>
<strong>Винагорода оператора, через електронний майданчик якого опубліковано оголошення про проведення електронного
аукціону:</strong> __________ грн.
<strong>Винагорода оператора, через електронний майданчик якого заведено інформацію про лот в ЕТС:</strong>
</div>
<br>
<br>
<div style="border-bottom:1px solid #000;"></div>
<div><small>заповнюється Оператором електронного майданчика, через який надано найвищу цінову пропозицію</small></div>
<br>
<div>
<strong>Винагорода оператора, через електронний майданчик якого подано найвищу цінову пропозицію (подано заяву від
одного учасника):</strong> __________ грн.
одного учасника):</strong>
</div>
<br>
<br>
<div style="border-bottom:1px solid #000;"></div>
<div><small>заповнюється Оператором електронного майданчика, через який надано найвищу цінову пропозицію</small></div>
<br>
<div>
<strong>Сума, що підлягає перерахуванню __________ <small><i>(організатору/переможцю електронного аукціону)</i></small>
від оператора, через електронний майданчик якого подано найвищу цінову пропозицію:</strong> __________ грн.
від оператора, через електронний майданчик якого подано найвищу цінову пропозицію:</strong>
</div>
<br>
<br>
<div style="border-bottom:1px solid #000;"></div>
<div><small>заповнюється Оператором електронного майданчика, через який надано найвищу цінову пропозицію</small></div>
<br>
<div>
<strong>Сума, яка підлягає сплаті переможцем електронного аукціону/учасником, що подав єдину заяву (у випадку
продажу):</strong> __________ грн.
продажу) банку:</strong>
</div>
<br>
<br>
<div style="border-bottom:1px solid #000;"></div>
<div><small>заповнюється Оператором електронного майданчика, через який надано найвищу цінову пропозицію</small></div>
<br>
<div>
<strong>Протокол електронного аукціону сформовано:</strong> {{generated_at}}
</div>
<br>
<div>
<small><i>Переможець електронного аукціону (учасник, що подав єдину заяву) зобов'язується:</i></small>
<small><i>Переможець зобов'язується:</i></small>
<ul class="dashed_ul">
<li>
<small><i>
підписати протокол електронного аукціону в день його публікації в ЕТС, за допомогою кваліфікованого
електронного підпису уповноваженої особи або кваліфікованого цифрового підпису спеціально призначеного
для таких цілей.
здійснити повну оплату коштів за лот, які повинні надійти на рахунок банку (банків) не пізніше кінця 18 (вісімнадцятого) робочого дня з дати формування ЦБД протоколу електронного аукціону.
</i></small>
</li>
<li>
<small><i>
підписати договір у строки передбачені цим Регламентом або іншим нормативно-правовим актом
та провести розрахунки відповідно до цього договору та Регламенту.
підписати договір купівлі-продажу/відступлення права вимоги придбаного активу(вів)(майна) протягом 20 (двадцяти) робочих днів з дня, наступного за днем формування протоколу електронного аукціону, з урахуванням п. 7.21 Регламенту ЕТС.
</i></small>
</li>
</ul>
</div>
<br>
<br>
<br>
<br>
<div>
<strong>Переможець електронного аукціону (учасник, що подав єдину заяву):</strong> {{ procedure.get_actual_winner_description()}}
<strong>Переможець електронних торгів:</strong> {{ procedure.get_actual_winner_description()}}
</div>
<br>
<br>
<br>
<br>
<table cellpadding="0" cellspacing="0" border="0" width="100%">
<tbody>
<tr>
......@@ -265,11 +287,14 @@
</tbody>
</table>
<br>
<br>
<div>
<strong>Найменування оператора, через електронний майданчик якого надано найвищу цінову пропозицію (подано заяву від
одного учасника):</strong> {{ procedure.winner_bid.owner_legal_name if procedure.winner_bid }}
<strong>Найменування оператора, через електронний майданчик якого переможець набув право участі в електронних торгах:</strong> {{ procedure.winner_bid.owner_legal_name if procedure.winner_bid }}
</div>
<br>
<br>
<br>
<br>
<table cellpadding="0" cellspacing="0" border="0" width="100%">
<tbody>
<tr>
......@@ -296,10 +321,18 @@
</tbody>
</table>
<br>
<br>
<div>
<strong>Найменування банку - замовника:</strong> {{ procedure.sellingEntity.name.uk_UA or "_" * 10 }}
</div>
<br>
<div>
<strong>Найменування організатора:</strong> {{ procedure.sellingEntity.name.uk_UA or "_" * 10 }}
Уповноважена особа Фонду на ліквідацію банку:
</div>
<br>
<br>
<br>
<br>
<table cellpadding="0" cellspacing="0" border="0" width="100%">
<tbody>
<tr>
......@@ -326,6 +359,7 @@
</tbody>
</table>
<br>
<br>
<div>
<small><i>*Зазначаються тільки для осіб, які через свої релігійні або інші переконання відмовилися від прийняття
реєстраційного номера облікової картки платника податків та мають відмітку в паспорті.</i></small>
......
from aiohttp import test_utils
from prozorro_sale.protocol_service.serializers import Procedure
from prozorro_sale.protocol_service.serializers import get_procedure_serializer
from prozorro_sale.auth import load_auth
AUTH_PATH = '/secrets/auth.yml'
......@@ -11,7 +11,7 @@ class TestProcedure:
with test_utils.mock.patch('prozorro_sale.protocol_service.serializers.get_procedure',
return_value=procedure_obj):
procedure = Procedure(procedure_obj['auctionId'])
procedure = get_procedure_serializer(procedure_obj['auctionId'])
assert procedure.proc_obj['owner_legal_name'] == 'Тестовий брокер 1'
assert procedure.winner_bid['owner_legal_name'] == 'Тестовий брокер 2'
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment