this repo has no description
0
fork

Configure Feed

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

Add global components to billing

+59 -5
+3 -1
care/emr/models/product.py
··· 17 17 expiration_date = models.DateTimeField(default=None, null=True, blank=True) 18 18 extensions = models.JSONField(default=dict) 19 19 standard_pack_size = models.IntegerField(null=True, blank=True, default=None) 20 - purchase_price = models.DecimalField(null=True, blank=True, max_digits=20, decimal_places=6) 20 + purchase_price = models.DecimalField( 21 + null=True, blank=True, max_digits=20, decimal_places=6 22 + )
+4 -1
care/emr/models/supply_delivery.py
··· 31 31 blank=True, 32 32 ) 33 33 extensions = models.JSONField(default=dict) 34 - total_purchase_price = models.DecimalField(null=True, blank=True, max_digits=20, decimal_places=6) 34 + total_purchase_price = models.DecimalField( 35 + null=True, blank=True, max_digits=20, decimal_places=6 36 + ) 37 + 35 38 36 39 class DeliveryOrder(EMRBaseModel): 37 40 name = models.CharField(max_length=255)
+18
care/emr/resources/charge_item/apply_charge_item_definition.py
··· 3 3 from care.emr.resources.account.default_account import get_default_account 4 4 from care.emr.resources.charge_item.spec import ChargeItemStatusOptions 5 5 from care.emr.resources.charge_item.sync_charge_item_costs import sync_charge_item_costs 6 + from care.facility.models.facility import Facility 6 7 from care.utils.evaluators.interpretation_evaluator import InterpretationEvaluator 7 8 from care.utils.rounding.covert_type import convert_to_decimal 8 9 ··· 12 13 if component.get("amount"): 13 14 component["amount"] = str(-convert_to_decimal(component["amount"])) 14 15 return components 16 + 17 + 18 + def compute_global_components(charge_item_definition, price_components): 19 + facility = charge_item_definition.facility 20 + components_override = Facility.get_monetory_component(facility.id) 21 + price_components_new = [] 22 + for component in price_components: 23 + if component.get("global_component", None): 24 + component_key = Facility.get_component_key(component) 25 + if component_key in components_override: 26 + price_components_new.append(components_override[component_key]) 27 + else: 28 + price_components_new.append(component) 29 + return price_components_new 15 30 16 31 17 32 def apply_charge_item_definition( ··· 39 54 charge_item_definition.category.calculated_monetary_components, 40 55 price_components, 41 56 ) 57 + price_components = compute_global_components( 58 + charge_item_definition, price_components 59 + ) 42 60 for component in price_components: 43 61 if component.get("conditions"): 44 62 evaluator = InterpretationEvaluator({}, metrics_cache)
+3
care/emr/resources/common/monetary_component.py
··· 23 23 tax_included_amount: Decimal | None = Field( 24 24 default=None, max_digits=20, decimal_places=6 25 25 ) 26 + global_component: bool = False 26 27 conditions: list[EvaluatorConditionSpec] = [] 27 28 28 29 @model_validator(mode="after") ··· 62 63 63 64 @model_validator(mode="after") 64 65 def check_amount_or_factor(self): 66 + if self.global_component and self.code: 67 + return self 65 68 if not ((self.amount is not None) or self.factor): 66 69 raise ValueError("Either 'amount' or 'factor' must be present.") 67 70 return self
+1 -2
care/emr/resources/inventory/product/spec.py
··· 40 40 expiration_date: datetime.datetime | None = None 41 41 extensions: dict 42 42 standard_pack_size: int | None = None 43 - purchase_price: Decimal | None = Field(None,max_digits=20, decimal_places=6) 44 - 43 + purchase_price: Decimal | None = Field(None, max_digits=20, decimal_places=6) 45 44 46 45 @field_validator("extensions") 47 46 @classmethod
+1 -1
care/emr/resources/inventory/supply_delivery/spec.py
··· 50 50 51 51 status: SupplyDeliveryStatusOptions 52 52 supplied_item_condition: SupplyDeliveryConditionOptions | None = None 53 - total_purchase_price: Decimal | None = Field(None,max_digits=20, decimal_places=6) 53 + total_purchase_price: Decimal | None = Field(None, max_digits=20, decimal_places=6) 54 54 55 55 56 56 class SupplyDeliveryUpdateSpec(ExtensionValidator, BaseSupplyDeliverySpec):
+29
care/facility/models/facility.py
··· 1 1 from django.conf import settings 2 2 from django.contrib.auth import get_user_model 3 3 from django.contrib.postgres.fields import ArrayField 4 + from django.core.cache import cache 4 5 from django.db import models 5 6 from django.db.models import IntegerChoices 6 7 from django.utils.translation import gettext_lazy as _ ··· 218 219 class Meta: 219 220 verbose_name_plural = "Facilities" 220 221 222 + @classmethod 223 + def get_component_key(cls, component): 224 + return component.get("code" , {}).get("system" , "") + "/" + component.get("code" , {}).get("code","") 225 + 226 + @classmethod 227 + def get_monetory_component_cache_key(cls , facility_id): 228 + return f"facility:{facility_id}:monetory_component" 229 + 230 + 231 + @classmethod 232 + def calculate_monetory_components(cls , components): 233 + component_cache = {} 234 + for component in components: 235 + component_cache[cls.get_component_key(component)] = component 236 + return component_cache 237 + 238 + @classmethod 239 + def get_monetory_component(cls , facility_id): 240 + cached_data = cache.get(cls.get_monetory_component_cache_key(facility_id)) 241 + if cached_data: 242 + return cached_data 243 + else: 244 + facility = cls.objects.get(id=facility_id) 245 + monetory_component = cls.calculate_monetory_components(facility.discount_monetary_components) 246 + cache.set(cls.get_monetory_component_cache_key(facility_id), monetory_component) 247 + return monetory_component 248 + 221 249 def read_cover_image_url(self): 222 250 if self.cover_image_url: 223 251 if settings.FACILITY_CDN: ··· 252 280 253 281 def save(self, *args, **kwargs) -> None: 254 282 is_create = self.pk is None 283 + cache.delete(self.get_monetory_component_cache_key(self.id)) 255 284 super().save(*args, **kwargs) 256 285 257 286 if is_create: