Skip to content
This repository has been archived by the owner on Dec 13, 2022. It is now read-only.

Commit

Permalink
CPA-254 Implementation of Red Flag after contract import
Browse files Browse the repository at this point in the history
- [x] Run red_flag after contract import
- [x] Created a new management command to run the contract_value_usd and other fields for Contract
  • Loading branch information
Suyoj Man Tamrakar committed Apr 20, 2021
1 parent 1109ec0 commit c584ed5
Show file tree
Hide file tree
Showing 5 changed files with 99 additions and 69 deletions.
4 changes: 2 additions & 2 deletions country/admin.py
Original file line number Diff line number Diff line change
Expand Up @@ -93,8 +93,8 @@ def import_status(self):
return format_html("""<a class="button" disabled="True">Import</a>&nbsp;""")
else:
return format_html(
f"""<a class="button" href="/data_import?country={str(self.country)}
&data_import_id={str(self.page_ptr_id)}"""
f"""<a class="button"
href="/data_import?country={str(self.country)}&data_import_id={str(self.page_ptr_id)}"""
f"""&validated={validated}">Import</a>&nbsp;"""
)

Expand Down
12 changes: 12 additions & 0 deletions country/management/commands/fill_contract_values.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
from django.core.management.base import BaseCommand

from country.models import Tender
from country.tasks import fill_contract_values


class Command(BaseCommand):
def handle(self, *args, **kwargs):
tenders = Tender.objects.all()
print("Created task: fill_contract_values")
for tender in tenders:
fill_contract_values.apply_async(args=(tender.id,), queue="covid19")
43 changes: 0 additions & 43 deletions country/management/commands/fix_contract_fields.py

This file was deleted.

5 changes: 4 additions & 1 deletion country/red_flag.py
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,10 @@ def flag8(self, contract_id):
)
contract_value = tender_instance["contract_value"]
tender_value = tender_instance["tender_value"]
percentage_increase = ((contract_value - tender_value) / tender_value) * 100
try:
percentage_increase = ((contract_value - tender_value) / tender_value) * 100
except Exception:
percentage_increase = 0
if (
percentage_increase > 20
): # the difference between the expected purchase price and the final (contract) value exceeds 20 percent;
Expand Down
104 changes: 81 additions & 23 deletions country/tasks.py
Original file line number Diff line number Diff line change
Expand Up @@ -128,6 +128,7 @@ def fix_contract_name_value(tender_id, country):
tender_list = tender_id
for tender in tender_list:
tender_instance = Tender.objects.get(id=tender)
tender_instance.red_flag.clear() # Clearing red-flag
goods_services = list(
tender_instance.goods_services.all().values(
"contract_title",
Expand Down Expand Up @@ -181,6 +182,10 @@ def fix_contract_name_value(tender_id, country):
print(category)
instance = EquityCategory.objects.get(category_name=category)
tender_instance.equity_category.add(instance)
print("Hereeeee")
process_redflag7.apply_async(args=(tender_instance.id,), queue="covid19")
process_redflag6.apply_async(args=(tender_instance.id,), queue="covid19")
process_redflag.apply_async(args=(tender_instance.id,), queue="covid19")


@app.task(name="import_tender_from_batch_id")
Expand Down Expand Up @@ -477,35 +482,44 @@ def clear_redflag(id):


@app.task(name="process_red_flag7")
def process_redflag7(id, tender):
flag7_obj = RedFlag.objects.get(function_name="flag7")
concentration = Tender.objects.filter(
buyer__buyer_name=tender["buyer__buyer_name"], supplier__supplier_name=tender["supplier__supplier_name"]
def process_redflag7(id):
print("redflag77")
tenders = Tender.objects.filter(id=id).values(
"id", "buyer__buyer_name", "supplier__supplier_name", "supplier__supplier_address"
)
# supplier who has signed X(10) percent or more of their contracts with the same buyer
# (wins tenders from the same buyer)
if len(concentration) > 10:
for i in concentration:
obj = Tender.objects.get(id=i.id)
obj.red_flag.add(flag7_obj)
flag7_obj = RedFlag.objects.get(function_name="flag7")
for tender in tenders:
concentration = Tender.objects.filter(
buyer__buyer_name=tender["buyer__buyer_name"], supplier__supplier_name=tender["supplier__supplier_name"]
)
# supplier who has signed X(10) percent or more of their contracts with the same buyer
# (wins tenders from the same buyer)
if len(concentration) > 10:
for i in concentration:
obj = Tender.objects.get(id=i.id)
obj.red_flag.add(flag7_obj)


@app.task(name="process_red_flag6")
def process_redflag6(id, tender):
def process_redflag6(id):
flag6_obj = RedFlag.objects.get(function_name="flag6")
a = (
Tender.objects.values("buyer__buyer_name")
.filter(
supplier__supplier_name=tender["supplier__supplier_name"],
supplier__supplier_address=tender["supplier__supplier_address"],
)
.distinct("buyer__buyer_name")
tenders = Tender.objects.filter(id=id).values(
"id", "buyer__buyer_name", "supplier__supplier_name", "supplier__supplier_address"
)
if len(a) > 2:
if a[0]["buyer__buyer_name"] == a[1]["buyer__buyer_name"]:
for obj in a:
objs = Tender.objects.get(id=obj.id)
objs.red_flag.add(flag6_obj)
for tender in tenders:
a = (
Tender.objects.values("buyer__buyer_name")
.filter(
supplier__supplier_name=tender["supplier__supplier_name"],
supplier__supplier_address=tender["supplier__supplier_address"],
)
.distinct("buyer__buyer_name")
)
if len(a) > 2:
if a[0]["buyer__buyer_name"] == a[1]["buyer__buyer_name"]:
for obj in a:
objs = Tender.objects.get(id=obj.id)
objs.red_flag.add(flag6_obj)


@app.task(name="store_in_temp_table")
Expand Down Expand Up @@ -959,3 +973,47 @@ def delete_dataset(data_import_id):
print("Done for temp data " + str(temp_data_id))
import_batch.delete()
return "Done"


@app.task(name="fill_contract_values")
def fill_contract_values(tender_id):
tender_instance = Tender.objects.get(id=tender_id)
goods_services = list(
tender_instance.goods_services.all().values(
"contract_title",
"contract_value_usd",
"award_value_usd",
"tender_value_usd",
"contract_value_local",
"award_value_local",
"tender_value_local",
)
)
contract_title = [i.get("contract_title") for i in goods_services if i.get("contract_title") is not None]
contract_title.append(tender_instance.contract_title)
contract_names = ", ".join(set(contract_title))
contract_value_usd = sum(
[i.get("contract_value_usd") for i in goods_services if i.get("contract_value_usd") is not None]
)
award_value_usd = sum([i.get("award_value_usd") for i in goods_services if i.get("award_value_usd") is not None])
tender_value_usd = sum(
[i.get("tender_value_usd") for i in goods_services if i.get("tender_value_usd") is not None]
)
contract_value_local = sum(
[i.get("contract_value_local") for i in goods_services if i.get("contract_value_local") is not None]
)
award_value_local = sum(
[i.get("award_value_local") for i in goods_services if i.get("award_value_local") is not None]
)
tender_value_local = sum(
[i.get("tender_value_local") for i in goods_services if i.get("tender_value_local") is not None]
)
tender_instance.contract_title = contract_names
tender_instance.contract_value_usd = contract_value_usd
tender_instance.contract_value_local = contract_value_local
tender_instance.tender_value_local = tender_value_local
tender_instance.tender_value_usd = tender_value_usd
tender_instance.award_value_local = award_value_local
tender_instance.award_value_usd = award_value_usd
tender_instance.save()
print("Done for tender id : " + str(tender_id))

0 comments on commit c584ed5

Please sign in to comment.