admin_nyelvi_javítas

This commit is contained in:
Roo
2026-07-25 10:22:03 +00:00
parent 33c4d793db
commit c9118bf52f
29 changed files with 4474 additions and 943 deletions

View File

@@ -1,7 +1,7 @@
# /opt/docker/dev/service_finder/backend/app/api/v1/endpoints/admin_commission.py
"""
Admin API endpoints for CommissionRule CRUD, Priority Resolution Engine,
and 2-Level MLM Commission Distribution.
2-Level MLM Commission Distribution, and Conflict Detection.
THOUGHT PROCESS:
- All endpoints are prefixed with /admin/commission-rules (registered in api.py).
@@ -13,6 +13,10 @@ THOUGHT PROCESS:
- POST /distribute implements the 2-Level MLM commission distribution:
Gen1 (direct referrer) gets commission_percent, Gen2 (upline) gets
upline_commission_percent from the same rule.
- Phase 3: Conflict Detection — POST (create) and PUT (update) now check
for overlapping active rules. If a conflict is found and force_override
is False, a 409 Conflict response is returned with the conflicting rule's
details. If force_override is True, the conflicting rule is deactivated.
"""
import logging
@@ -37,6 +41,8 @@ from app.schemas.commission import (
CommissionRuleListResponse,
CommissionDistributionRequest,
CommissionDistributionResponse,
ConflictResponse,
ConflictingRuleInfo,
)
from app.services import commission_service
@@ -163,16 +169,52 @@ async def get_commission_rule(
response_model=CommissionRuleResponse,
status_code=status.HTTP_201_CREATED,
tags=["Admin Commission Rules"],
responses={
409: {
"description": "Conflict — an active rule with the same tier/region/campaign already exists",
"model": ConflictResponse,
}
},
)
async def create_commission_rule(
data: CommissionRuleCreate,
db: AsyncSession = Depends(get_db),
current_user: User = Depends(get_current_staff),
):
"""Create a new commission rule."""
"""
Create a new commission rule with conflict detection.
If an active rule with the same tier/region/is_campaign combination exists
and force_override is False, a 409 Conflict is returned with the details
of the conflicting rule.
If force_override is True, the conflicting rule is deactivated and the
new rule is created.
"""
rule = await commission_service.create_commission_rule(
db, data=data, admin_user_id=current_user.id,
)
# Phase 3: Detect conflict — the service returns the conflicting rule
# when force_override is False and a conflict exists. We detect this by
# checking if the returned rule's name differs from the input data.
if rule.name != data.name:
raise HTTPException(
status_code=status.HTTP_409_CONFLICT,
detail={
"message": "A conflicting active rule already exists for this combination.",
"conflicting_rule": ConflictingRuleInfo(
id=rule.id,
name=rule.name,
rule_type=CommissionRuleType(rule.rule_type.value),
tier=CommissionTier(rule.tier.value),
region_code=rule.region_code,
is_campaign=rule.is_campaign,
is_active=rule.is_active,
).model_dump(),
},
)
return CommissionRuleResponse.model_validate(rule)
@@ -185,6 +227,12 @@ async def create_commission_rule(
"/{rule_id}",
response_model=CommissionRuleResponse,
tags=["Admin Commission Rules"],
responses={
409: {
"description": "Conflict — an active rule with the same tier/region/campaign already exists",
"model": ConflictResponse,
}
},
)
async def update_commission_rule(
rule_id: int,
@@ -192,13 +240,43 @@ async def update_commission_rule(
db: AsyncSession = Depends(get_db),
current_user: User = Depends(get_current_staff),
):
"""Update an existing commission rule (partial update)."""
"""
Update an existing commission rule (partial update) with conflict detection.
If the update would create a conflict with another active rule and
force_override is False, a 409 Conflict is returned with the details
of the conflicting rule.
If force_override is True, the conflicting rule is deactivated and the
update proceeds.
"""
rule = await commission_service.update_commission_rule(db, rule_id, data)
if not rule:
raise HTTPException(
status_code=status.HTTP_404_NOT_FOUND,
detail=f"Commission rule with id={rule_id} not found.",
)
# Phase 3: Detect conflict — the service returns the conflicting rule
# when force_override is False and a conflict exists. We detect this by
# checking if the returned rule's ID differs from the requested rule_id.
if rule.id != rule_id:
raise HTTPException(
status_code=status.HTTP_409_CONFLICT,
detail={
"message": "A conflicting active rule already exists for this combination.",
"conflicting_rule": ConflictingRuleInfo(
id=rule.id,
name=rule.name,
rule_type=CommissionRuleType(rule.rule_type.value),
tier=CommissionTier(rule.tier.value),
region_code=rule.region_code,
is_campaign=rule.is_campaign,
is_active=rule.is_active,
).model_dump(),
},
)
return CommissionRuleResponse.model_validate(rule)