feat(projects): add project-specific member rates
This commit is contained in:
@@ -1,10 +1,11 @@
|
||||
from datetime import timedelta
|
||||
from decimal import Decimal
|
||||
|
||||
from django.test import TestCase
|
||||
from django.utils import timezone
|
||||
from rest_framework.exceptions import ValidationError
|
||||
|
||||
from apps.projects.models import Project
|
||||
from apps.projects.models import Project, ProjectAccess, ProjectUserRate
|
||||
from apps.tags.models import Tag
|
||||
from apps.time_entries.services.time_entries import (
|
||||
create_time_entry,
|
||||
@@ -12,14 +13,21 @@ from apps.time_entries.services.time_entries import (
|
||||
update_time_entry,
|
||||
)
|
||||
from apps.users.models import User
|
||||
from apps.workspaces.models import Workspace
|
||||
from apps.workspaces.models import Workspace, WorkspaceMembership, WorkspaceUserRate
|
||||
|
||||
|
||||
class TimeEntryServiceTests(TestCase):
|
||||
@classmethod
|
||||
def setUpTestData(cls):
|
||||
cls.user = User.objects.create_user(mobile="09121111111", password="secret123")
|
||||
cls.member = User.objects.create_user(mobile="09121111112", password="secret123")
|
||||
cls.workspace = Workspace.objects.create(name="Core", owner=cls.user)
|
||||
WorkspaceMembership.objects.create(
|
||||
workspace=cls.workspace,
|
||||
user=cls.member,
|
||||
role=WorkspaceMembership.Role.MEMBER,
|
||||
is_active=True,
|
||||
)
|
||||
|
||||
def test_create_time_entry_allows_only_one_running_timer_per_workspace(self):
|
||||
create_time_entry(
|
||||
@@ -97,3 +105,36 @@ class TimeEntryServiceTests(TestCase):
|
||||
),
|
||||
[tag.id],
|
||||
)
|
||||
|
||||
def test_create_billable_time_entry_uses_project_user_rate_override(self):
|
||||
project = Project.objects.create(workspace=self.workspace, name="Override project")
|
||||
ProjectAccess.objects.create(project=project, user=self.member)
|
||||
WorkspaceUserRate.objects.create(
|
||||
workspace=self.workspace,
|
||||
user=self.member,
|
||||
hourly_rate=Decimal("10.00"),
|
||||
currency="USD",
|
||||
effective_from=self.workspace.created_at,
|
||||
is_active=True,
|
||||
)
|
||||
ProjectUserRate.objects.create(
|
||||
project=project,
|
||||
user=self.member,
|
||||
hourly_rate=Decimal("20.00"),
|
||||
currency="EUR",
|
||||
effective_from=self.workspace.created_at,
|
||||
is_active=True,
|
||||
)
|
||||
|
||||
entry = create_time_entry(
|
||||
user=self.member,
|
||||
workspace_id=self.workspace.id,
|
||||
start_time=timezone.now() - timedelta(minutes=30),
|
||||
end_time=timezone.now(),
|
||||
project=project,
|
||||
description="Billable work",
|
||||
is_billable=True,
|
||||
)
|
||||
|
||||
self.assertEqual(entry.hourly_rate, Decimal("20.00"))
|
||||
self.assertEqual(entry.currency, "EUR")
|
||||
|
||||
Reference in New Issue
Block a user