Skip to content

Commit

Permalink
Merge pull request #162 from fccn/153-dates-ISO-format
Browse files Browse the repository at this point in the history
Dates using ISO format 153
  • Loading branch information
Tiago-da-silva23 authored Nov 6, 2023
2 parents e789f5a + e6693a9 commit fead603
Show file tree
Hide file tree
Showing 7 changed files with 58 additions and 45 deletions.
9 changes: 7 additions & 2 deletions apps/billing/factories.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
import random
import string
from decimal import Decimal

import factory
Expand Down Expand Up @@ -48,8 +50,11 @@ class Meta:
vat_tax = factory.Faker("pydecimal", min_value=1, max_value=100, left_digits=3, right_digits=2)
amount_exclude_vat = factory.Faker("pydecimal", min_value=1, max_value=100, left_digits=5, right_digits=2)
organization_code = factory.LazyAttribute(lambda obj: slugify(obj.description))
product_code = factory.Faker("ean13")
product_id = factory.Faker("uuid4")
product_code = "".join([random.choice(string.ascii_uppercase) for _ in range(5)])

@factory.lazy_attribute
def product_id(self):
return f"course-v1:{self.organization_code}+{self.product_code}+2023_T3"

# Assuming 20% VAT
@factory.lazy_attribute
Expand Down
2 changes: 1 addition & 1 deletion apps/shared_revenue/factories.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ class Meta:
f"course-v1:UPorto+CBN{random.choice(string.ascii_uppercase)}{random.choice(string.ascii_uppercase)}F+2023_T3"
)
start_date = factory.Faker(
"date_time_between", start_date="now", end_date="+30d", tzinfo=timezone.get_current_timezone()
"date_time_between", start_date="-10d", end_date="+30d", tzinfo=timezone.get_current_timezone()
)
end_date = factory.Faker(
"date_time_between", start_date="+40d", end_date="+70d", tzinfo=timezone.get_current_timezone()
Expand Down
14 changes: 5 additions & 9 deletions apps/shared_revenue/management/commands/export_split_revenue.py
Original file line number Diff line number Diff line change
Expand Up @@ -37,17 +37,13 @@ def handle(self, *args, **options) -> str | None:
try:
start = time.time()
self.stdout.write("\nStarting file export...\n")
start_date = datetime.strptime(options["start_date"], "%d/%m/%Y")
end_date = datetime.strptime(options["end_date"], "%d/%m/%Y") + (
timedelta(days=1) - timedelta(milliseconds=1)
)
start_date = datetime.strptime(options["start_date"], "%Y/%m/%d").isoformat()
end_date = (
datetime.strptime(options["end_date"], "%Y/%m/%d") + (timedelta(days=1) - timedelta(milliseconds=1))
).isoformat()
product_id = options.get("product_id")
organization_code = options.get("organization_code")
kwargs = {
k: v
for k, v in {"product_id": product_id, "organization_code": organization_code}.items()
if v not in ["", None]
}
kwargs = {k: v for k, v in {"product_id": product_id, "organization_code": organization_code}.items() if v}
SplitExportService().export_split_to_xlsx(
start_date=start_date,
end_date=end_date,
Expand Down
2 changes: 1 addition & 1 deletion apps/shared_revenue/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@ def check_each_configuration(
configuration,
) -> bool:

id = self.id if self.id is not None else -1
id = self.id
if configuration.id == id:
return True

Expand Down
27 changes: 19 additions & 8 deletions apps/shared_revenue/services/split_execution.py
Original file line number Diff line number Diff line change
Expand Up @@ -36,8 +36,9 @@ def _filter_transaction_items(self, **kwargs) -> list[TransactionItem]:
transactions = Transaction.objects.filter(transaction_date__range=[self.start_date, self.end_date])
transaction_items: list[TransactionItem] = []
for transaction in transactions:
kwargs["transaction"] = transaction
transaction_items += TransactionItem.objects.filter(**kwargs)
items = transaction.transaction_items.all()
if items:
transaction_items.append(items[0])

return transaction_items
except Exception as e:
Expand All @@ -53,7 +54,9 @@ def _filter_revenue_configurations(self, **kwargs) -> list[RevenueConfiguration]

try:
configurations = RevenueConfiguration.objects.filter(
Q(start_date__isnull=True) | Q(end_date__isnull=True) | Q(end_date__gte=self.start_date),
Q(start_date__isnull=True)
| Q(end_date__isnull=True)
| Q(start_date__lte=self.end_date) & Q(end_date__gte=self.start_date)
)
if kwargs:
new_kwargs = kwargs
Expand Down Expand Up @@ -90,12 +93,15 @@ def _assembly_each_result(

return {
"product_name": item.description,
"transaction_date": item.transaction.transaction_date,
"transaction_date": item.transaction.transaction_date.isoformat(),
"total_amount_include_vat": item.transaction.total_amount_include_vat,
"total_amount_exclude_vat": item.transaction.total_amount_exclude_vat,
"organization_code": configuration.organization.short_name,
"organization_code": item.organization_code,
"amount_for_nau": item.transaction.total_amount_include_vat * (1 - configuration.partner_percentage),
"amount_for_organization": item.transaction.total_amount_include_vat * configuration.partner_percentage,
"partner_percentage": configuration.partner_percentage,
"configuration_start_date": configuration.start_date,
"configuration_end_date": configuration.end_date,
}

def _calculate_transactions(
Expand All @@ -118,8 +124,13 @@ def _calculate_transactions(

for item in transaction_items:
for configuration in configurations:
result = self._assembly_each_result(item=item, configuration=configuration)
split_results.append(result)
if item.organization_code == configuration.organization.short_name:
if None not in [configuration.start_date, configuration.end_date]:
if not configuration.start_date <= item.transaction.transaction_date <= configuration.end_date:
continue

result = self._assembly_each_result(item=item, configuration=configuration)
split_results.append(result)

return split_results

Expand All @@ -131,8 +142,8 @@ def execute_split_steps(self, **kwargs) -> list[Dict]:
list[Dict]: All the calculated split results
"""
try:
transaction_items: list[TransactionItem] = self._filter_transaction_items(**kwargs)
configurations: list[RevenueConfiguration] = self._filter_revenue_configurations(**kwargs)
transaction_items: list[TransactionItem] = self._filter_transaction_items(**kwargs)
split_results = self._calculate_transactions(
transaction_items=transaction_items,
configurations=configurations,
Expand Down
3 changes: 3 additions & 0 deletions apps/shared_revenue/services/split_export.py
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,9 @@ def export_split_to_xlsx(
"organization_code",
"amount_for_nau",
"amount_for_organization",
"partner_percentage",
"configuration_start_date",
"configuration_end_date",
],
)
except Exception as e:
Expand Down
46 changes: 22 additions & 24 deletions apps/util/populate_db.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,42 +11,37 @@
from apps.billing.factories import TransactionFactory, TransactionItemFactory


def generate_revenue_configuration(
organization,
) -> RevenueConfigurationFactory:
"""
Generates and populates RevenueConfiguration model.

def populate_shared_revenue(organization, product_ids: list[str]) -> None:
"""
Populates shared_revenue module, creates RevenueConfiguration
"""

revenue_configuration = RevenueConfigurationFactory.create(
for product_id in product_ids:
RevenueConfigurationFactory.create(
organization=organization,
product_id=product_id,
partner_percentage=0.70
)

return revenue_configuration


def populate_shared_revenue(organization) -> None:
"""
Starts populate of shared_revenue module, creates RevenueConfiguration and ShareExecution
"""

revenue_configuration = generate_revenue_configuration(
organization,
)
return revenue_configuration


def populate_billing(organization) -> None:
def populate_billing(organization) -> list[str]:
"""
Populates billing module, creates five transactions per organization and one TransactionItem per Transaction
"""

amount_of_transactions = 5
transactions = TransactionFactory.create_batch(amount_of_transactions)
product_ids = []
for transaction in transactions:
TransactionItemFactory.create(transaction=transaction)
item: TransactionItemFactory = TransactionItemFactory.create(
transaction=transaction,
organization_code=organization.short_name,
)
if not item.product_id in product_ids:
product_ids.append(item.product_id)

return product_ids


def populate():
Expand All @@ -60,8 +55,11 @@ def populate():
for organization in organizations:
OrganizationContactFactory.create(organization=organization)
OrganizationAddressFactory.create(organization=organization)
populate_shared_revenue(organization=organization)
populate_billing(organization=organization)
product_ids = populate_billing(organization=organization)
populate_shared_revenue(
product_ids=product_ids,
organization=organization,
)
except Exception as e:
raise e

Expand Down

0 comments on commit fead603

Please sign in to comment.