Skip to content

Commit

Permalink
Merge pull request #44 from mngoe/checque-sante-to-merge
Browse files Browse the repository at this point in the history
OP-1199 - Voucher Scheme new features (Subservices and subitems)
  • Loading branch information
delcroip committed Feb 16, 2024
2 parents e3a9ff0 + 4597537 commit b1145ee
Show file tree
Hide file tree
Showing 11 changed files with 347 additions and 102 deletions.
Binary file added .DS_Store
Binary file not shown.
41 changes: 0 additions & 41 deletions .github/workflows/codeql.yml

This file was deleted.

2 changes: 0 additions & 2 deletions medical/admin.py
Original file line number Diff line number Diff line change
@@ -1,3 +1 @@
from django.contrib import admin

# Register your models here.
116 changes: 79 additions & 37 deletions medical/gql_mutations.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,16 +4,18 @@

import django.db.models.base
import graphene
from graphene import InputObjectType
from core import assert_string_length, PATIENT_CATEGORY_MASK_ADULT, PATIENT_CATEGORY_MASK_MALE, \
PATIENT_CATEGORY_MASK_MINOR, PATIENT_CATEGORY_MASK_FEMALE
from core.schema import OpenIMISMutation
from core.schema import OpenIMISMutation, TinyInt
from medical.exceptions import CodeAlreadyExistsError
from django.contrib.auth.models import AnonymousUser
from django.core.exceptions import ValidationError, PermissionDenied
from medical.apps import MedicalConfig
from medical.models import Service, ServiceMutation, Item, ItemMutation
from medical.models import Service, ServiceMutation, Item, ItemMutation, ServiceService, ServiceItem
from medical.services import set_item_or_service_deleted

from django.db import models
from medical.utils import process_items_relations, process_services_relations

class ServiceCodeInputType(graphene.String):
@staticmethod
Expand All @@ -30,38 +32,6 @@ def parse_literal(ast):
assert_string_length(result, 6)
return result

# The following Enums would be more GraphQL friendly than the current String types but they are less configurable
# and actually make the frontend work harder, so leaving them here for illustration purpose, feel free to remove.
#
# SVC_TYPE_PREVENTATIVE = "PREVENTATIVE"
# SVC_TYPE_CURATIVE = "CURATIVE"
# ServiceTypeEnum = graphene.Enum("ServiceTypes", [
# (SVC_TYPE_PREVENTATIVE, Service.TYPE_PREVENTATIVE),
# (SVC_TYPE_CURATIVE, Service.TYPE_CURATIVE),
# ])
#
#
# CARE_TYPE_IN_PATIENT = "IN"
# CARE_TYPE_OUT_PATIENT = "OUT"
# CARE_TYPE_BOTH = "BOTH"
# CareTypeEnum = graphene.Enum("CareTypes", [
# (CARE_TYPE_IN_PATIENT, Service.CARE_TYPE_IN_PATIENT),
# (CARE_TYPE_OUT_PATIENT, Service.CARE_TYPE_OUT_PATIENT),
# (CARE_TYPE_BOTH, Service.CARE_TYPE_BOTH),
# ])


# SERVICE_LEVEL_DAY_HOSPITAL = "DAY_HOSPITAL"
# SERVICE_LEVEL_VISIT = "VISIT"
# SERVICE_LEVEL_SIMPLE_SERVICE = "SIMPLE_SERVICE"
# SERVICE_LEVEL_HOSPITAL_CARE = "HOSPITAL_CARE"
# ServiceLevelEnum = graphene.Enum("ServiceLevels", [
# (SERVICE_LEVEL_DAY_HOSPITAL, Service.LEVEL_DAY_HOSPITAL),
# (SERVICE_LEVEL_VISIT, Service.LEVEL_VISIT),
# (SERVICE_LEVEL_SIMPLE_SERVICE, Service.LEVEL_SIMPLE_SERVICE),
# (SERVICE_LEVEL_HOSPITAL_CARE, Service.LEVEL_HOSPITAL_CARE),
# ])
#

PATIENT_CATEGORY_ADULT = "ADULT"
PATIENT_CATEGORY_MINOR = "MINOR"
Expand All @@ -75,6 +45,25 @@ def parse_literal(ast):
])



class ServiceItemInputType(InputObjectType):
id = graphene.Int(required=False)
item_id = graphene.Int(required=True)
status = TinyInt(required=True)
qty_provided = graphene.Decimal(
max_digits=18, decimal_places=2, required=False)
price_asked = graphene.Decimal(
max_digits=18, decimal_places=2, required=False)

class ServiceServiceInputType(InputObjectType):
id = graphene.Int(required=False)
service_id = graphene.Int(required=True)
status = TinyInt(required=True)
qty_provided = graphene.Decimal(
max_digits=18, decimal_places=2, required=False)
price_asked = graphene.Decimal(
max_digits=18, decimal_places=2, required=False)

class ItemOrServiceInputType(OpenIMISMutation.Input):
id = graphene.Int(required=False, read_only=True)
uuid = graphene.String(required=False)
Expand All @@ -91,7 +80,11 @@ class ItemOrServiceInputType(OpenIMISMutation.Input):

class ServiceInputType(ItemOrServiceInputType):
level = graphene.String(required=True)
packagetype = graphene.String(required=False)
manualPrice = graphene.String(required=False)
category = graphene.String(required=False)
items = graphene.List(ServiceItemInputType, required=False)
services = graphene.List(ServiceServiceInputType, required=False)


def reset_item_or_service_before_update(item_service):
Expand All @@ -110,13 +103,17 @@ def reset_item_or_service_before_update(item_service):
"category", # service only
"package", # item only
"quantity", # item only
"packagetype", #service only
"manualPrice", #service only
]
for field in fields:
if hasattr(item_service, field):
setattr(item_service, field, None)


def update_or_create_item_or_service(data, user, item_service_model):
items = data.pop('items') if 'items' in data else None
services = data.pop('services') if 'services' in data else None
client_mutation_id = data.pop('client_mutation_id', None)
data.pop('client_mutation_label', None)
item_service_uuid = data.pop('uuid') if 'uuid' in data else None
Expand All @@ -131,12 +128,56 @@ def update_or_create_item_or_service(data, user, item_service_model):
check_if_code_already_exists(data, item_service_model)

if item_service_uuid:
item_service = item_service_model.objects.get(uuid=item_service_uuid)
if items:
# Delete Service present in the Database and absent in the list sent by FE
# Means that user click on delete button and old Service is not sent
serviceExisting = list()
serviceSent = list()
for ServiceList in ServiceService.objects.filter(servicelinkedService=item_service.id).all() :
serviceExisting.append(ServiceList.id)

for ServiceList in services:
serviceSent.append(ServiceList.id)

serviceToDelete = list(set(serviceExisting) - set(serviceSent))
for serviceToDeleteId in serviceToDelete:
ServiceService.objects.filter(
id=serviceToDeleteId,
).delete()

if services:
# Delete Item present in the Database and absent in the list sent by FE
# Means that user click on delete button and old Ites is not sent
itemExisting = list()
itemSent = list()
for ItemList in ServiceItem.objects.filter(servicelinkedItem=item_service.id).all() :
itemExisting.append(ItemList.id)

for ItemList in items:
itemSent.append(ItemList.id)

itemToDelete = list(set(itemExisting) - set(itemSent))
for itemToDeleteId in itemToDelete:
ServiceItem.objects.filter(
id=itemToDeleteId,
).delete()
reset_item_or_service_before_update(item_service)
[setattr(item_service, key, data[key]) for key in data]
else:
item_service = item_service_model.objects.create(**data)


item_service_sub = 0
item_service_sub += process_items_relations(user, item_service, items)
service_service_sub = 0
service_service_sub += process_services_relations(user, item_service, services)

print(" -- Item service Price")
print(item_service)
print(item_service.price)
item_service.save()
print(item_service.price)

if client_mutation_id:
if isinstance(item_service, Service):
ServiceMutation.object_mutated(user, client_mutation_id=client_mutation_id, service=item_service)
Expand Down Expand Up @@ -172,6 +213,8 @@ def do_mutate(cls, perms, user, **data):
data['audit_user_id'] = user.id_for_audit
from core.utils import TimeUtils
data['validity_from'] = TimeUtils.now()
print("Create or Update Item or Service Mutation")
print(data)
update_or_create_item_or_service(data, user, cls.item_service_model)
return None

Expand Down Expand Up @@ -245,7 +288,6 @@ class ItemInputType(ItemOrServiceInputType):
package = graphene.String()
quantity = graphene.Decimal()


class CreateItemMutation(CreateOrUpdateItemOrServiceMutation):
_mutation_module = "medical"
_mutation_class = "CreateItemMutation"
Expand Down
38 changes: 38 additions & 0 deletions medical/gql_queries.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
import graphene
from core import prefix_filterset, ExtendedConnection, filter_validity
from graphene.utils.deduplicator import deflate
from graphene_django import DjangoObjectType
from .models import Service, ServiceItem, ServiceService

class ServiceGQLType(DjangoObjectType):
attachments_count = graphene.Int()
client_mutation_id = graphene.String()

class Meta:
model = Service
interfaces = (graphene.relay.Node,)
filter_fields = {
'uuid': ['exact'],
'code': ['exact', 'icontains', 'istartswith'],
'name': ['exact', 'icontains', 'istartswith'],
'type': ['exact'],
'packagetype': ['exact', 'in'],
'care_type': ['exact'],
'category': ['exact'],
}
connection_class = ExtendedConnection

@classmethod
def get_queryset(cls, queryset, info):
service_ids = Service.get_queryset(queryset, info).values('uuid').all()
return Service.objects.filter(uuid__in=service_ids)


class ServiceItemGQLType(DjangoObjectType):
class Meta:
model = ServiceItem


class ServiceServiceGQLType(DjangoObjectType):
class Meta:
model = ServiceService
67 changes: 67 additions & 0 deletions medical/migrations/0008_auto_20220804_1112.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
# Generated by Django 3.0.14 on 2022-08-04 11:12

from django.db import migrations, models
import django.db.models.deletion
import django.utils.timezone


class Migration(migrations.Migration):

dependencies = [
('medical', '0007_alter_item_maximum_amount_alter_item_quantity_and_more'),
]

operations = [
migrations.AlterModelOptions(
name='service',
options={'managed': True},
),
migrations.CreateModel(
name='ServiceService',
fields=[
('id', models.AutoField(db_column='idSCP', primary_key=True, serialize=False)),
('qty_provided', models.IntegerField(blank=True, db_column='qty', null=True)),
('scpDate', models.DateTimeField(blank=True, db_column='created_date', default=django.utils.timezone.now, null=True)),
('price_asked', models.DecimalField(blank=True, db_column='price', decimal_places=2, max_digits=18, null=True)),
('service', models.ForeignKey(db_column='ServiceId', on_delete=django.db.models.deletion.DO_NOTHING, related_name='servicesServices', to='medical.Service')),
('servicelinkedService', models.ForeignKey(db_column='ServiceLinked', on_delete=django.db.models.deletion.DO_NOTHING, to='medical.service')),
('status', models.BooleanField(default=True)),
],
options={
'db_table': 'tblServiceContainedPackage',
'managed': True,
},
),
migrations.CreateModel(
name='ServiceItem',
fields=[
('id', models.AutoField(db_column='idPCP', primary_key=True, serialize=False)),
('qty_provided', models.IntegerField(blank=True, db_column='qty', null=True)),
('pcpDate', models.DateTimeField(blank=True, db_column='created_date', default=django.utils.timezone.now, null=True)),
('price_asked', models.DecimalField(blank=True, db_column='price', decimal_places=2, max_digits=18, null=True)),
('item', models.ForeignKey(db_column='ItemID', on_delete=django.db.models.deletion.DO_NOTHING, related_name='itemsServices', to='medical.Item')),
('servicelinkedItem', models.ForeignKey(db_column='ServiceID', on_delete=django.db.models.deletion.DO_NOTHING, related_name='servicesLinked', to='medical.Service')),
('status', models.BooleanField(default=True)),
],
options={
'db_table': 'tblProductContainedPackage',
'managed': True,
},
),
migrations.AddField(
model_name='service',
name='manualPrice',
field=models.BooleanField(default=False),
),
migrations.AddField(
model_name='service',
name='packagetype',
field=models.CharField(choices=[('P', 'P'), ('S', 'S'), ('F', 'F')], db_column='ServPackageType', default='S', max_length=1),
),

migrations.AlterField(
model_name='service',
name='patient_category',
field=models.SmallIntegerField(db_column='ServPatCat', default='15'),
),
]

0 comments on commit b1145ee

Please sign in to comment.