this repo has no description
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

Add charge item and account change account API

+88 -2
+44 -1
care/emr/api/viewsets/charge_item.py
··· 4 4 from django.db import transaction 5 5 from django_filters import rest_framework as filters 6 6 from drf_spectacular.utils import extend_schema 7 - from pydantic import UUID4, BaseModel, model_validator 7 + from pydantic import UUID4, BaseModel, Field, model_validator 8 + from rest_framework import status 8 9 from rest_framework.decorators import action 9 10 from rest_framework.exceptions import PermissionDenied, ValidationError 10 11 from rest_framework.filters import OrderingFilter ··· 31 32 InternalQuestionnaireRegistry, 32 33 ) 33 34 from care.emr.resources.account.default_account import get_default_account 35 + from care.emr.resources.account.sync_items import rebalance_account_task 34 36 from care.emr.resources.charge_item.apply_charge_item_definition import ( 35 37 apply_charge_item_definition, 36 38 ) ··· 96 98 if self.service_resource and not self.service_resource_id: 97 99 raise ValueError("Service resource id is required.") 98 100 return self 101 + 102 + 103 + class ChargeItemAccountChangeRequest(BaseModel): 104 + charge_items: list[UUID4] = Field(min_length=1, max_length=100) 105 + target_account: UUID4 99 106 100 107 101 108 class ApplyMultipleChargeItemDefinitionRequest(BaseModel): ··· 396 403 charge_item.updated_by = request.user 397 404 charge_item.save() 398 405 return Response({}) 406 + 407 + @extend_schema( 408 + request=ChargeItemAccountChangeRequest, 409 + ) 410 + @action(methods=["POST"], detail=False) 411 + def change_account(self, request, *args, **kwargs): 412 + """ 413 + Change accounts related to a charge item. 414 + """ 415 + facility = self.get_facility_obj() 416 + if not AuthorizationController.call( 417 + "can_create_charge_item_in_facility", 418 + self.request.user, 419 + facility, 420 + ): 421 + raise PermissionDenied("Access Denied to Charge Item") 422 + request_params = ChargeItemAccountChangeRequest(**request.data) 423 + target_account = get_object_or_404( 424 + Account, external_id=request_params.target_account, facility=facility 425 + ) 426 + source_accounts = [target_account.id] # For Rebalancing all related accounts 427 + with transaction.atomic(): 428 + for charge_item_request in request_params.charge_items: 429 + charge_item = get_object_or_404( 430 + ChargeItem, 431 + external_id=charge_item_request, 432 + facility=facility, 433 + patient=target_account.patient, 434 + ) 435 + source_accounts.append(charge_item.account_id) 436 + charge_item.account = target_account 437 + charge_item.save(update_fields=["account"]) 438 + 439 + for account_id in list(set(source_accounts)): 440 + rebalance_account_task(account_id) 441 + return Response({}, status=status.HTTP_201_CREATED) 399 442 400 443 401 444 InternalQuestionnaireRegistry.register(ChargeItemViewSet)
+44 -1
care/emr/api/viewsets/payment_reconciliation.py
··· 1 1 from datetime import timedelta 2 2 3 3 from django.conf import settings 4 + from django.db import transaction 4 5 from django_filters import rest_framework as filters 5 - from pydantic import BaseModel 6 + from drf_spectacular.utils import extend_schema 7 + from pydantic import UUID4, BaseModel, Field 8 + from rest_framework import status 6 9 from rest_framework.decorators import action 7 10 from rest_framework.exceptions import PermissionDenied, ValidationError 8 11 from rest_framework.filters import OrderingFilter ··· 47 50 method = filters.CharFilter(lookup_expr="iexact") 48 51 created_by = filters.UUIDFilter(field_name="created_by__external_id") 49 52 created_date = filters.DateTimeFromToRangeFilter(field_name="created_date") 53 + 54 + 55 + class PaymentReconciliationAccountChangeRequest(BaseModel): 56 + payment_reconciliations: list[UUID4] = Field(min_length=1, max_length=100) 57 + target_account: UUID4 50 58 51 59 52 60 class PaymentReconciliationViewSet( ··· 168 176 instance.save() 169 177 rebalance_account_task(instance.account.id) 170 178 return Response(PaymentReconciliationReadSpec.serialize(instance).to_json()) 179 + 180 + @extend_schema( 181 + request=PaymentReconciliationAccountChangeRequest, 182 + ) 183 + @action(methods=["POST"], detail=False) 184 + def change_account(self, request, *args, **kwargs): 185 + facility = self.get_facility_obj() 186 + if not AuthorizationController.call( 187 + "can_write_payment_reconciliation_in_facility", 188 + self.request.user, 189 + facility, 190 + ): 191 + raise PermissionDenied("Access Denied to Charge Item") 192 + request_params = PaymentReconciliationAccountChangeRequest(**request.data) 193 + target_account = get_object_or_404( 194 + Account, external_id=request_params.target_account, facility=facility 195 + ) 196 + source_accounts = [target_account.id] # For Rebalancing all related accounts 197 + # Switch to sets maybe to optimize memory 198 + with transaction.atomic(): 199 + for ( 200 + payment_reconciliation_request 201 + ) in request_params.payment_reconciliations: 202 + payment_reconciliation = get_object_or_404( 203 + PaymentReconciliation, 204 + external_id=payment_reconciliation_request, 205 + facility=facility, 206 + ) 207 + source_accounts.append(payment_reconciliation.account_id) 208 + payment_reconciliation.account = target_account 209 + payment_reconciliation.save(update_fields=["account"]) 210 + 211 + for account_id in list(set(source_accounts)): 212 + rebalance_account_task(account_id) 213 + return Response({}, status=status.HTTP_201_CREATED)