Commit 2e875deb authored by John Red Medrano's avatar John Red Medrano

Merge branch 'RMSv2' of http://42.61.118.105:7990/scm/rms/api-main-service into red-develop

parents 7a8bddaa de9e7054
...@@ -47,7 +47,7 @@ class AllowedCompanyViewSet(viewsets.ModelViewSet): ...@@ -47,7 +47,7 @@ class AllowedCompanyViewSet(viewsets.ModelViewSet):
'list of Users found', 'list of Users found',
serializer.data serializer.data
) )
return self.get_paginated_response(message) return self.get_paginated_response(message)
serializer = self.get_serializer(queryset, many=True) serializer = self.get_serializer(queryset, many=True)
......
...@@ -10,11 +10,14 @@ from django.conf import settings ...@@ -10,11 +10,14 @@ from django.conf import settings
from datetime import timedelta from datetime import timedelta
from app.helper.email_service import sender from app.helper.email_service import sender
from app.applicationlayer.utils import main_threading from app.applicationlayer.utils import main_threading
from rest_framework.permissions import AllowAny
CR_FRONT_LINK = settings.CR_FRONT_LINK CR_FRONT_LINK = settings.CR_FRONT_LINK
class CancelTriggerAPIView(views.APIView): class CancelTriggerAPIView(views.APIView):
permission_classes = (AllowAny,)
def get(self, request): def get(self, request):
date_now = datetime.now() date_now = datetime.now()
today_mail = models.CancelTrigger.objects.filter( today_mail = models.CancelTrigger.objects.filter(
...@@ -53,7 +56,7 @@ class CancelTriggerAPIView(views.APIView): ...@@ -53,7 +56,7 @@ class CancelTriggerAPIView(views.APIView):
cancel = models.ChangeRequestFormHeader.objects.filter( cancel = models.ChangeRequestFormHeader.objects.filter(
form_code=data.form_code form_code=data.form_code
).update(status='Cancelled') ).update(status='Cancelled')
list_of_emails.append(data.form_code.form_code) list_of_emails.append(data.form_code.form_code)
today_mail.update(is_sent=True) today_mail.update(is_sent=True)
......
...@@ -10,28 +10,32 @@ from django.conf import settings ...@@ -10,28 +10,32 @@ from django.conf import settings
from datetime import timedelta from datetime import timedelta
from app.helper.email_service import sender from app.helper.email_service import sender
from app.applicationlayer.utils import main_threading from app.applicationlayer.utils import main_threading
from rest_framework.permissions import AllowAny
CR_FRONT_LINK = settings.CR_FRONT_LINK CR_FRONT_LINK = settings.CR_FRONT_LINK
class OverdueTriggerAPIView(views.APIView): class OverdueTriggerAPIView(views.APIView):
permission_classes = (AllowAny,)
def get(self, request): def get(self, request):
date_now = datetime.now() date_now = datetime.now()
today_mail = models.CancelTrigger.objects.filter( today_mail = models.OverdueTrigger.objects.filter(
Q(auto_cancel_date=date_now.strftime('%Y-%m-%d 00:00:00.000')) Q(overdue_date=date_now.strftime('%Y-%m-%d 00:00:00.000')) &
Q(is_sent=False)
) )
list_of_emails = [] list_of_emails = []
for data in today_mail: for data in today_mail:
if data.is_sent == False and data.form_code.status == 'Pending' and data.frm_approver.is_action == True: if data.is_sent == False and (data.form_code.status == 'Pending' or
data.form_code.status == 'Approved' or
data.form_code.status == 'Rejected'):
cr_link = f'{CR_FRONT_LINK}/{data.form_code}' cr_link = f'{CR_FRONT_LINK}/{data.form_code}'
requestor_name = data.form_code.requested_by_user.name requestor_name = data.form_code.requested_by_user.name
auto_cancel_date = data.auto_cancel_date.strftime('%B %d, %Y') target_date = data.form_code.requested_to_target_date.strftime('%B %d, %Y')
date_submitted_last_approver = data.date_submitted_last_approver.strftime('%B %d, %Y')
approver_pending_action = data.frm_approver.user.name
cr_number = data.form_code.requested_to_template_id cr_number = data.form_code.requested_to_template_id
cr_name = data.form_code.requested_to_template_name cr_name = data.form_code.requested_to_template_name
company_requestedto = data.form_code.requested_to_company.name company_requestedto = data.form_code.requested_to_company.name
...@@ -42,17 +46,12 @@ class OverdueTriggerAPIView(views.APIView): ...@@ -42,17 +46,12 @@ class OverdueTriggerAPIView(views.APIView):
requestor_recipient = data.form_code.requested_by_user.email requestor_recipient = data.form_code.requested_by_user.email
admin = 'Test' admin = 'Test'
args_requestor = [requestor_name, auto_cancel_date, args_requestor = [requestor_name, target_date,
date_submitted_last_approver, approver_pending_action,
cr_number, cr_name, company_requestedto, cr_number, cr_name, company_requestedto,
department_requestedto, priority_level, form_status, url, department_requestedto, priority_level, form_status, url,
requestor_recipient, admin] requestor_recipient, admin]
main_threading(args_requestor, sender.routing_table_cancelled) main_threading(args_requestor, sender.routing_table_overdue)
cancel = models.ChangeRequestFormHeader.objects.filter(
form_code=data.form_code
).update(status='Cancelled')
list_of_emails.append(data.form_code.form_code) list_of_emails.append(data.form_code.form_code)
......
...@@ -10,11 +10,14 @@ from django.conf import settings ...@@ -10,11 +10,14 @@ from django.conf import settings
from datetime import timedelta from datetime import timedelta
from app.helper.email_service import sender from app.helper.email_service import sender
from app.applicationlayer.utils import main_threading from app.applicationlayer.utils import main_threading
from rest_framework.permissions import AllowAny
CR_FRONT_LINK = settings.CR_FRONT_LINK CR_FRONT_LINK = settings.CR_FRONT_LINK
class ReminderTriggerAPIView(views.APIView): class ReminderTriggerAPIView(views.APIView):
permission_classes = (AllowAny,)
def get(self, request): def get(self, request):
date_now = datetime.now() date_now = datetime.now()
next_day = date_now + timedelta(days=1) next_day = date_now + timedelta(days=1)
...@@ -26,7 +29,7 @@ class ReminderTriggerAPIView(views.APIView): ...@@ -26,7 +29,7 @@ class ReminderTriggerAPIView(views.APIView):
# print(today_mail) # print(today_mail)
list_of_emails = [] list_of_emails = []
for data in today_mail: for data in today_mail:
if data.frm_approver.is_action == True: if data.frm_approver.is_action == True and data.form_code.status == 'Pending':
# common details # common details
cr_link = f'{CR_FRONT_LINK}/{data.frm_approver.form_code}' cr_link = f'{CR_FRONT_LINK}/{data.frm_approver.form_code}'
......
...@@ -28,32 +28,44 @@ class ChangeRequestFormApproversSerializer( ...@@ -28,32 +28,44 @@ class ChangeRequestFormApproversSerializer(
"contact_no": instance.user.contact_no "contact_no": instance.user.contact_no
} }
ret['user'] = user_object ret['user'] = user_object
ret['delegation'] = {
"id": instance.delegation.id,
"code": instance.delegation.code,
"name": instance.delegation.name
}
if instance.form_code.status == 'Draft': if instance.form_code.status == 'Draft':
if instance.tmp_approver: if instance.tmp_approver:
if instance.tmp_approver.user or instance.tmp_approver.delegation.lower() == 'requestor': if instance.tmp_approver.user or instance.tmp_approver.delegation.name.lower() == 'requestor':
ret['editable_user'] = False ret['editable_user'] = False
else: else:
ret['editable_user'] = True ret['editable_user'] = True
if instance.tmp_approver.company or instance.tmp_approver.delegation.lower() == 'requestor': if instance.tmp_approver.company or instance.tmp_approver.delegation.name.lower() == 'requestor':
ret['editable_comp'] = False ret['editable_comp'] = False
else: else:
ret['editable_comp'] = True ret['editable_comp'] = True
if instance.tmp_approver.department or instance.tmp_approver.delegation.lower() == 'requestor': if instance.tmp_approver.department or instance.tmp_approver.delegation.name.lower() == 'requestor':
ret['editable_dept'] = False ret['editable_dept'] = False
else: else:
ret['editable_dept'] = True ret['editable_dept'] = True
if instance.tmp_approver.delegation or instance.tmp_approver.delegation.name.lower() == 'requestor':
ret['editable_deleg'] = False
else:
ret['editable_deleg'] = True
else: else:
ret['editable_user'] = True ret['editable_user'] = True
ret['editable_comp'] = True ret['editable_comp'] = True
ret['editable_dept'] = True ret['editable_dept'] = True
ret['editable_deleg'] = True
else: else:
ret['editable_user'] = False ret['editable_user'] = False
ret['editable_comp'] = False ret['editable_comp'] = False
ret['editable_dept'] = False ret['editable_dept'] = False
ret['editable_deleg'] = False
return ret return ret
...@@ -61,13 +73,13 @@ class ChangeRequestFormApproversSerializer( ...@@ -61,13 +73,13 @@ class ChangeRequestFormApproversSerializer(
if instance.form_code.status == 'Draft': if instance.form_code.status == 'Draft':
if instance.tmp_approver: if instance.tmp_approver:
if instance.tmp_approver.user or instance.tmp_approver.delegation.lower() == 'requestor': if instance.tmp_approver.user or instance.tmp_approver.delegation.name.lower() == 'requestor':
ret['editable_user'] = False ret['editable_user'] = False
else: else:
ret['user'] = None ret['user'] = None
ret['editable_user'] = True ret['editable_user'] = True
if instance.tmp_approver.company or instance.tmp_approver.delegation.lower() == 'requestor': if instance.tmp_approver.company or instance.tmp_approver.delegation.name.lower() == 'requestor':
ret['company'] = { ret['company'] = {
"id": instance.tmp_approver.company.id, "id": instance.tmp_approver.company.id,
"code": instance.tmp_approver.company.code, "code": instance.tmp_approver.company.code,
...@@ -79,7 +91,7 @@ class ChangeRequestFormApproversSerializer( ...@@ -79,7 +91,7 @@ class ChangeRequestFormApproversSerializer(
ret['company'] = None ret['company'] = None
ret['editable_comp'] = True ret['editable_comp'] = True
if instance.tmp_approver.department or instance.tmp_approver.delegation.lower() == 'requestor': if instance.tmp_approver.department or instance.tmp_approver.delegation.name.lower() == 'requestor':
ret['department'] = { ret['department'] = {
"id": instance.tmp_approver.department.id, "id": instance.tmp_approver.department.id,
"code": instance.tmp_approver.department.code, "code": instance.tmp_approver.department.code,
...@@ -90,6 +102,17 @@ class ChangeRequestFormApproversSerializer( ...@@ -90,6 +102,17 @@ class ChangeRequestFormApproversSerializer(
ret['department'] = None ret['department'] = None
ret['editable_dept'] = True ret['editable_dept'] = True
if instance.tmp_approver.delegation or instance.tmp_approver.delegation.name.lower() == 'requestor':
ret['delegation'] = {
"id": instance.tmp_approver.delegation.id,
"code": instance.tmp_approver.delegation.code,
"name": instance.tmp_approver.delegation.name
}
ret['editable_deleg'] = False
else:
ret['delegation'] = None
ret['editable_deleg'] = True
else: else:
ret['editable_user'] = True ret['editable_user'] = True
ret['editable_comp'] = True ret['editable_comp'] = True
......
...@@ -30,7 +30,9 @@ from app.applicationlayer.cms.utils_cr import (number_generator, ...@@ -30,7 +30,9 @@ from app.applicationlayer.cms.utils_cr import (number_generator,
generate_template_id, generate_template_id,
crhistory_create_save, crhistory_create_save,
entity_log_bulk, entity_log_bulk,
reminder_trigger_save) reminder_trigger_save,
overdue_trigger_save,
reset_autoemail_tables)
from app.entities import enums from app.entities import enums
from app.applicationlayer.utils import model_to_dict from app.applicationlayer.utils import model_to_dict
...@@ -227,7 +229,7 @@ class ChangeRequestFormsViewset(viewsets.ModelViewSet): ...@@ -227,7 +229,7 @@ class ChangeRequestFormsViewset(viewsets.ModelViewSet):
id_number = self.request.user.code id_number = self.request.user.code
self.queryset = change_request.list_by_user(id_number) self.queryset = change_request.list_by_user(id_number)
self.queryset = change_request.filter_status( self.queryset = change_request.filter_status(
self.queryset, self.queryset,
request.query_params.get('status') request.query_params.get('status')
...@@ -493,100 +495,6 @@ class ChangeRequestFormsViewset(viewsets.ModelViewSet): ...@@ -493,100 +495,6 @@ class ChangeRequestFormsViewset(viewsets.ModelViewSet):
except Exception as e: except Exception as e:
return Response(e, return Response(e,
status=status.HTTP_500_INTERNAL_SERVER_ERROR) status=status.HTTP_500_INTERNAL_SERVER_ERROR)
@transaction.atomic()
@action(
methods=['PATCH'], detail=True,
url_path='re_route', url_name='re_route'
)
def re_route(self, request, *args, **kwargs):
# generate batchno history
batchno = get_max_batchno("batch")
# partial update
partial = kwargs.pop('partial', True)
instance = self.get_object()
form_code = kwargs['form_code']
status_update = {"status": 'Pending'}
serializer = self.get_serializer(instance,
data=status_update,
partial=partial)
serializer.is_valid(raise_exception=True)
old_instance = model_to_dict(instance)
self.perform_update(serializer)
form_header = get_object_or_404(models.ChangeRequestFormHeader,
pk=instance.id)
new_instance = model_to_dict(form_header)
# save history in form header
crhistory_save(
batchno,
enums.CREnum.REROUTE.value,
enums.CREnum.UPDATE.value,
enums.CREntitiesEnum.CR_FRM_HEADER.value,
form_code,
old_instance,
new_instance
)
approver_data = []
# get all approvers of form
approvers = models.ChangeRequestFormApprovers.objects.filter(
form_code=form_code)
for approver in approvers:
approver_add = {
'id': approver.id,
'action': None,
'remarks': None,
'date_sent': None,
'action_date': None,
'is_action': False
}
approver_data.append(approver_add)
change_request.form_add_edit_delete(
approver_data,
models.ChangeRequestFormApprovers,
enums.CREntitiesEnum.CR_FRM_APPROVER.value,
ChangeRequestFormApproversSerializer,
partial,
self,
form_code,
batchno,
enums.CREnum.REROUTE.value
)
min_level = models.ChangeRequestFormApprovers.objects.filter(
form_code=form_code
).aggregate(Min('level'))
min_level = min_level.get('level__min')
next_approver_email(form_code, min_level)
# update next approver details
models.ChangeRequestFormApprovers.objects.filter(
Q(form_code=form_code) & Q(level=int(min_level))
).update(
date_sent=datetime.now()
)
message = status_message_response(
200, 'success',
'Change request form successfully re routed',
serializer.data
)
return Response(message, status=status.HTTP_200_OK)
@transaction.atomic() @transaction.atomic()
@action( @action(
...@@ -688,15 +596,13 @@ class ChangeRequestFormsViewset(viewsets.ModelViewSet): ...@@ -688,15 +596,13 @@ class ChangeRequestFormsViewset(viewsets.ModelViewSet):
def actions(self, request, *args, **kwargs): def actions(self, request, *args, **kwargs):
current_user = self.request.user.code current_user = self.request.user.code
action_body = request.data action_body = request.data
id = action_body.get('id', False) id = action_body.get('id', False)
form_code = action_body.get('form_code', False) form_code = action_body.get('form_code', False)
delegation = action_body.get('delegation', False) # delegation = action_body.get('delegation', False)
action = action_body.get('action', False) action = action_body.get('action', False)
level = action_body.get('level', False) # level = action_body.get('level', False)
next_level = int(level) + 1 # next_level = int(level) + 1
remarks = action_body.get('remarks', False) remarks = action_body.get('remarks', False)
# generate batchno history # generate batchno history
...@@ -724,8 +630,6 @@ class ChangeRequestFormsViewset(viewsets.ModelViewSet): ...@@ -724,8 +630,6 @@ class ChangeRequestFormsViewset(viewsets.ModelViewSet):
self.perform_update(serializer) self.perform_update(serializer)
new_instance = serializer.data new_instance = serializer.data
print(new_instance['action'])
crhistory_save( crhistory_save(
batchno, batchno,
enums.CREnum.ACTION.value, enums.CREnum.ACTION.value,
...@@ -736,248 +640,8 @@ class ChangeRequestFormsViewset(viewsets.ModelViewSet): ...@@ -736,248 +640,8 @@ class ChangeRequestFormsViewset(viewsets.ModelViewSet):
new_instance new_instance
) )
if action.lower() == 'approved': change_request.cr_routing_actions(new_instance, current_user)
# ---------------- removed code
the_next_vendor = models.ChangeRequestFormApprovers.objects.filter(
form_code=form_code, level=int(next_level),
delegation='Vendor/Implementor'
).first()
if the_next_vendor:
the_last_vendor = models.ChangeRequestFormApprovers.objects.filter(
form_code=form_code, delegation='Vendor/Implementor'
).order_by('level').last()
if the_next_vendor == the_last_vendor:
models.ChangeRequestFormHeader.objects.filter(
form_code=form_code
).update(status='Approved')
# NOTIF MSG FOR REQUESTOR
requestor_notification_msg = REQUESTOR_MESSAGE.split(';')[0]
# NOTIF MSG FOR NEXT APPROVER
notification_msg = APPROVER_MESSAGE.split(';')[0]
# SEND EMAIL AND NOTIF TO REQUESTOR
send_mail_requestor(
current_user, form_code, delegation,
requestor_notification_msg, action,
remarks, level
)
next_approver_email(form_code, next_level)
date_now = datetime.now()
# update next approver details
models.ChangeRequestFormApprovers.objects.filter(
Q(form_code=form_code) & Q(level=int(next_level))
).update(
date_sent=date_now,
is_action=True
)
# update current approver details
models.ChangeRequestFormApprovers.objects.filter(
Q(form_code=form_code) & Q(level=int(level))
).update(
is_action=False
)
reminder_trigger_save(form_code, date_now,
approver_instance.date_sent)
elif action.lower() == 'rejected':
# send email to vendor
if delegation.lower() == 'requestor':
notification_msg = VENDOR_REJECT_MESSAGE.split(';')[0]
send_mail_vendor(
current_user, form_code, delegation,
notification_msg, action,
remarks, level
)
prev_level = int(level) - 1
# reset last vendor details
models.ChangeRequestFormApprovers.objects.filter(
Q(form_code=form_code) &
Q(level=int(prev_level))
).update(
is_action=True,
action='Acknowledged',
action_date=datetime.now(),
date_sent=datetime.now()
)
else:
prev_vendor = models.ChangeRequestFormApprovers.objects.filter(
Q(form_code=form_code) &
Q(action='Completed') &
Q(delegation='Vendor/Implementor') &
Q(level__lte=int(level))
)
if not prev_vendor.count() > 0:
models.ChangeRequestFormHeader.objects.filter(
form_code=form_code
).update(status='Rejected')
# EMAIL CODE FOR REQUESTOR
requestor_notification_msg = REQUESTOR_REJECT_MESSAGE.split(';')[0]
# SEND EMAIL AND NOTIF TO REQUESTOR
send_mail_requestor(
current_user, form_code, delegation,
requestor_notification_msg, action,
remarks, level
)
else:
# EMAIL CODE FOR REQUESTOR
requestor_notification_msg = REQUESTOR_REJECT_MESSAGE.split(';')[0]
# SEND EMAIL AND NOTIF TO REQUESTOR
send_mail_requestor(
current_user, form_code, delegation,
requestor_notification_msg, action,
remarks, level
)
notification_msg = VENDOR_REJECT_MESSAGE.split(';')[0]
send_mail_vendor(
current_user, form_code, 'others',
notification_msg, action,
remarks, level
)
last_action_vendor = prev_vendor.last()
models.ChangeRequestFormApprovers.objects.filter(
code=last_action_vendor
).update(
is_action=True,
action='Acknowledged',
action_date=datetime.now(),
date_sent=datetime.now()
)
level = last_action_vendor.level + 1
models.ChangeRequestFormApprovers.objects.filter(
Q(form_code=form_code) & Q(level__gte=int(level))
).update(
is_action=False,
action=None,
remarks=None,
action_date=None,
date_sent=None
)
elif action.lower() == 'completed':
the_last_vendor = models.ChangeRequestFormApprovers.objects.filter(
form_code=form_code, delegation='Vendor/Implementor'
).order_by('level').last()
if (current_user == the_last_vendor.user.code and
level == the_last_vendor.level):
models.ChangeRequestFormHeader.objects.filter(
form_code=form_code
).update(status='Approved')
else:
the_next_vendor = models.ChangeRequestFormApprovers.objects.filter(
form_code=form_code, level=int(next_level),
delegation='Vendor/Implementor'
).first()
if the_next_vendor:
if the_next_vendor.user.code == the_last_vendor.user.code:
models.ChangeRequestFormHeader.objects.filter(
form_code=form_code
).update(status='Approved')
else:
models.ChangeRequestFormHeader.objects.filter(
form_code=form_code
).update(status='Pending')
next_approver_email(form_code, next_level)
models.ChangeRequestFormApprovers.objects.filter(
Q(level=int(next_level))
).update(
date_sent=datetime.now(),
is_action=True
)
# update current approver details
models.ChangeRequestFormApprovers.objects.filter(
Q(form_code=form_code) & Q(level=int(level))
).update(
is_action=False
)
# EMAIL CODE FOR REQUESTOR
requestor_notification_msg = REQUESTOR_COMPLETION_MESSAGE.split(';')[0]
send_mail_requestor(
current_user, form_code, delegation,
requestor_notification_msg, action,
remarks, level
)
elif action.lower() == 'acknowledged':
# EMAIL CODE FOR REQUESTOR
requestor_notification_msg = REQUESTOR_ACKNOWLEDGE_MESSAGE.split(';')[0]
send_mail_requestor(
current_user, form_code, delegation,
requestor_notification_msg, action,
remarks, level
)
elif action.lower() == 'accepted':
models.ChangeRequestFormHeader.objects.filter(
form_code=form_code
).update(status='Completed & Accepted')
# EMAIL CODE FOR VENDOR
requestor_notification_msg = VENDOR_ACCEPTANCE_MESSAGE.split(';')[0]
send_mail_vendor(
current_user, form_code, delegation,
requestor_notification_msg, action,
remarks, level
)
# update is_action for current level
models.ChangeRequestFormApprovers.objects.filter(
Q(form_code=form_code) & Q(level=int(level))
).update(
is_action=False
)
elif action.lower() == 'cancelled':
# changed form status to cancelled
models.ChangeRequestFormHeader.objects.filter(
form_code=form_code).update(status='Cancelled')
# update is_action for current level
models.ChangeRequestFormApprovers.objects.filter(
Q(form_code=form_code) & Q(level=int(level))
).update(
is_action=False
)
message = status_message_response( message = status_message_response(
200, 'success', 200, 'success',
'Action performed', 'Action performed',
...@@ -1155,7 +819,7 @@ class ChangeRequestFormsViewset(viewsets.ModelViewSet): ...@@ -1155,7 +819,7 @@ class ChangeRequestFormsViewset(viewsets.ModelViewSet):
new_instance = model_to_dict(form_header) new_instance = model_to_dict(form_header)
print(serializer.errors) # print(serializer.errors)
# save history in form header # save history in form header
crhistory_create_save( crhistory_create_save(
...@@ -1225,6 +889,8 @@ class ChangeRequestFormsViewset(viewsets.ModelViewSet): ...@@ -1225,6 +889,8 @@ class ChangeRequestFormsViewset(viewsets.ModelViewSet):
next_approver_email(form_code, min_level) next_approver_email(form_code, min_level)
date_now = datetime.now()
# update next approver details # update next approver details
models.ChangeRequestFormApprovers.objects.filter( models.ChangeRequestFormApprovers.objects.filter(
Q(form_code=form_code) & Q(level=int(min_level)) Q(form_code=form_code) & Q(level=int(min_level))
...@@ -1232,7 +898,14 @@ class ChangeRequestFormsViewset(viewsets.ModelViewSet): ...@@ -1232,7 +898,14 @@ class ChangeRequestFormsViewset(viewsets.ModelViewSet):
date_sent=datetime.now(), date_sent=datetime.now(),
is_action=True is_action=True
) )
# save details for overdue and auto cancellation
overdue_trigger_save(form_code)
# save details for reminder for first approver
reminder_trigger_save(form_code, date_now,
date_now)
serializer = self.get_serializer(instance) serializer = self.get_serializer(instance)
message = status_message_response( message = status_message_response(
...@@ -1544,13 +1217,22 @@ class ChangeRequestFormPost(APIView): ...@@ -1544,13 +1217,22 @@ class ChangeRequestFormPost(APIView):
next_approver_email(frm_id, min_level) next_approver_email(frm_id, min_level)
date_now = datetime.now()
# update next approver details # update next approver details
models.ChangeRequestFormApprovers.objects.filter( models.ChangeRequestFormApprovers.objects.filter(
Q(form_code=frm_id) & Q(level=int(min_level)) Q(form_code=frm_id) & Q(level=int(min_level))
).update( ).update(
date_sent=datetime.now(), date_sent=date_now,
is_action=True is_action=True
) )
# save details for overdue and auto cancellation
overdue_trigger_save(frm_id)
# save details for reminder for first approver
reminder_trigger_save(frm_id, date_now,
date_now)
message = { message = {
'code': 201, 'code': 201,
......
...@@ -15,4 +15,4 @@ class AdminDepartmentSerializer(serializers.ModelSerializer): ...@@ -15,4 +15,4 @@ class AdminDepartmentSerializer(serializers.ModelSerializer):
fields = '__all__' fields = '__all__'
read_only_fields = ( read_only_fields = (
'created', 'createdby', 'modified', 'modifiedby', 'code', 'created', 'createdby', 'modified', 'modifiedby', 'code',
) )
\ No newline at end of file
...@@ -3,7 +3,7 @@ from rest_framework.response import Response ...@@ -3,7 +3,7 @@ from rest_framework.response import Response
from app.applicationlayer.utils import model_to_dict from app.applicationlayer.utils import model_to_dict
from rest_framework.filters import SearchFilter, OrderingFilter from rest_framework.filters import SearchFilter, OrderingFilter
from django_filters import rest_framework as filters from django_filters import rest_framework as filters
from app.entities.models import Department, AllowedCompany from app.entities.models import Department, AllowedCompany, Delegation
from app.applicationlayer.utils import ( from app.applicationlayer.utils import (
CustomPagination, status_message_response CustomPagination, status_message_response
) )
...@@ -39,7 +39,7 @@ class ChangeRequestDepartmentFormViewSet(viewsets.ModelViewSet): ...@@ -39,7 +39,7 @@ class ChangeRequestDepartmentFormViewSet(viewsets.ModelViewSet):
).values('group_pivots') ).values('group_pivots')
queryset = queryset.filter(code__in=allowed) queryset = queryset.filter(code__in=allowed)
page = self.paginate_queryset(queryset) page = self.paginate_queryset(queryset)
if page is not None: if page is not None:
serializer = self.get_serializer(page, many=True) serializer = self.get_serializer(page, many=True)
...@@ -53,3 +53,8 @@ class ChangeRequestDepartmentFormViewSet(viewsets.ModelViewSet): ...@@ -53,3 +53,8 @@ class ChangeRequestDepartmentFormViewSet(viewsets.ModelViewSet):
serializer = self.get_serializer(queryset, many=True) serializer = self.get_serializer(queryset, many=True)
return Response(serializer.data) return Response(serializer.data)
...@@ -48,18 +48,31 @@ class ChangeRequestTemplateApproversSerializer( ...@@ -48,18 +48,31 @@ class ChangeRequestTemplateApproversSerializer(
else: else:
ret['editable_user'] = True ret['editable_user'] = True
if instance.delegation.lower() == 'requestor': if instance.delegation:
ret['delegation'] = {
"id": instance.delegation.id,
"code": instance.delegation.code,
"name": instance.delegation.name
}
ret['editable_deleg'] = False
else:
ret['editable_deleg'] = True
if instance.delegation.name.lower() == 'requestor':
ret['editable_user'] = False ret['editable_user'] = False
ret['editable_comp'] = False ret['editable_comp'] = False
ret['editable_dept'] = False ret['editable_dept'] = False
ret['editable_deleg'] = False
return ret return ret
except Exception as e: except Exception as e:
ret['editable_user'] = True ret['editable_user'] = True
ret['editable_comp'] = True ret['editable_comp'] = True
ret['editable_dept'] = True ret['editable_dept'] = True
ret['editable_deleg'] = True
return ret return ret
......
...@@ -361,6 +361,12 @@ class ChangeRequestTemplatePost(APIView): ...@@ -361,6 +361,12 @@ class ChangeRequestTemplatePost(APIView):
} }
sp1 = transaction.savepoint() # nothing will save to db sp1 = transaction.savepoint() # nothing will save to db
# cr_prefix = request.data['requested_to_template_id'])
# models.ChangeRequestTemplateHeader.objects.filter(
# requested_to_template_id=cr_prefix
# )
serializer = ChangeRequestTemplatesSerializer( serializer = ChangeRequestTemplatesSerializer(
data=template_header_data) data=template_header_data)
......
...@@ -86,7 +86,8 @@ urlpatterns = [ ...@@ -86,7 +86,8 @@ urlpatterns = [
path('template-user-list/', UserListTemplate.as_view(), name="User List"), path('template-user-list/', UserListTemplate.as_view(), name="User List"),
# filter endpoints under Allowed Companies table # filter endpoints under Allowed Companies table
path('reminder/', reminder.ReminderTriggerAPIView.as_view()), path('reminder/', reminder.ReminderTriggerAPIView.as_view()),
# path('cancelled/', cancel.CancelTriggerAPIView.as_view()), path('cancelled/', cancel.CancelTriggerAPIView.as_view()),
path('overdue/', overdue.OverdueTriggerAPIView.as_view()),
] ]
# urlpatterns += format_suffix_patterns(urlpatterns) # urlpatterns += format_suffix_patterns(urlpatterns)
......
...@@ -219,7 +219,7 @@ def send_mail_vendor(requestor, ...@@ -219,7 +219,7 @@ def send_mail_vendor(requestor,
# create notification # create notification
notification_create(form_code, message, vendor_code, notification_create(form_code, message, vendor_code,
sender_code) sender_code, 'cms')
def send_mail_requestor(current_user, def send_mail_requestor(current_user,
...@@ -287,7 +287,7 @@ def send_mail_requestor(current_user, ...@@ -287,7 +287,7 @@ def send_mail_requestor(current_user,
# create notification # create notification
notification_create(form_code, message, requestor_code, notification_create(form_code, message, requestor_code,
current_user) current_user, 'cms')
def next_approver_email(form_code, next_level): def next_approver_email(form_code, next_level):
...@@ -361,7 +361,7 @@ def next_approver_email(form_code, next_level): ...@@ -361,7 +361,7 @@ def next_approver_email(form_code, next_level):
# create notification # create notification
notification_create(form_code, message, receiver_code, notification_create(form_code, message, receiver_code,
sender_code) sender_code, 'cms')
def cancel_overdue(request): def cancel_overdue(request):
...@@ -551,7 +551,8 @@ def reminder_trigger_save(form_code, ...@@ -551,7 +551,8 @@ def reminder_trigger_save(form_code,
date_to_send=date_from.strftime('%Y-%m-%d 00:00:00.000'), date_to_send=date_from.strftime('%Y-%m-%d 00:00:00.000'),
auto_cancel_date=auto_cancel_date.strftime('%Y-%m-%d 00:00:00.000'), auto_cancel_date=auto_cancel_date.strftime('%Y-%m-%d 00:00:00.000'),
date_submitted_last_approver=date_submitted_last_approver, date_submitted_last_approver=date_submitted_last_approver,
is_sent=False is_sent=False,
form_code=form_instance
) )
if counter == 0: if counter == 0:
...@@ -560,8 +561,55 @@ def reminder_trigger_save(form_code, ...@@ -560,8 +561,55 @@ def reminder_trigger_save(form_code,
auto_cancel_date=auto_cancel_date.strftime('%Y-%m-%d 00:00:00.000'), auto_cancel_date=auto_cancel_date.strftime('%Y-%m-%d 00:00:00.000'),
date_submitted_last_approver=date_submitted_last_approver, date_submitted_last_approver=date_submitted_last_approver,
is_sent=False, is_sent=False,
frm_approver=approver frm_approver=approver,
cancel_type='from_approval'
) )
counter = counter + 1 counter = counter + 1
return True return True
def overdue_trigger_save(form_code):
form_instance = models.ChangeRequestFormHeader.objects.get(
form_code=form_code)
requested_to_target_date = form_instance.requested_to_target_date
overdue_date = requested_to_target_date + timedelta(days=1)
auto_cancel_date = overdue_date + timedelta(days=30)
models.OverdueTrigger.objects.create(
form_code=form_instance,
overdue_date=overdue_date.strftime('%Y-%m-%d 00:00:00.000'),
is_sent=False
)
models.CancelTrigger.objects.create(
form_code=form_instance,
auto_cancel_date=auto_cancel_date.strftime('%Y-%m-%d 00:00:00.000'),
date_submitted_last_approver=None,
is_sent=False,
frm_approver=None,
cancel_type='from_target_date'
)
return True
def reset_autoemail_tables(form_code):
models.ReminderTrigger.objects.filter(
form_code=form_code
).delete()
models.CancelTrigger.objects.filter(
form_code=form_code
).delete()
models.OverdueTrigger.objects.filter(
form_code=form_code
).delete()
return True
\ No newline at end of file
...@@ -29,7 +29,7 @@ class ApplicationViewSet(viewsets.ModelViewSet): ...@@ -29,7 +29,7 @@ class ApplicationViewSet(viewsets.ModelViewSet):
@decorators.rms.application_crate @decorators.rms.application_crate
@transaction.atomic @transaction.atomic
def create(self, request, *args, **kwargs): def create(self, request, *args, **kwargs):
serializer = self.get_serializer(data=request.data) serializer = self.get_serializer(data=request.data)
serializer.is_valid(raise_exception=True) serializer.is_valid(raise_exception=True)
self.perform_create(serializer) self.perform_create(serializer)
......
from rest_framework import serializers
from app.entities.models import Delegation
class DelegationSerializer(serializers.ModelSerializer):
class Meta:
model = Delegation
fields = '__all__'
read_only_fields = (
'created', 'createdby', 'modified', 'modifiedby', 'code',
)
from django_filters import rest_framework as filters
from app.entities.models import Delegation
class DelegationFilterSet(filters.FilterSet):
class Meta:
model = Delegation
fields = '__all__'
from app.entities import enums
from django.db import transaction
from rest_framework import viewsets, status
from rest_framework.response import Response
from app.applicationlayer.utils import model_to_dict
from rest_framework.filters import SearchFilter, OrderingFilter
from django_filters import rest_framework as filters
from app.entities.models import Delegation
from app.applicationlayer.utils import (
CustomPagination, status_message_response, log_save
)
from django_filters.rest_framework import DjangoFilterBackend
from app.applicationlayer.management.delegation import serializer
from app.applicationlayer.management.delegation.table_filters import DelegationFilterSet
from app.helper import decorators
class DelegationViewSet(viewsets.ModelViewSet):
queryset = Delegation.objects.all().order_by('-created')
serializer_class = serializer.DelegationSerializer
pagination_class = CustomPagination
lookup_field = 'code'
filter_backends = (DjangoFilterBackend, SearchFilter, OrderingFilter)
filterset_class = DelegationFilterSet
ordering_fields = '__all__'
search_fields = ('name')
@transaction.atomic
def create(self, request, *args, **kwargs):
serializer = self.get_serializer(data=request.data)
serializer.is_valid(raise_exception=True)
self.perform_create(serializer)
message = status_message_response(
201, 'success',
'New Delegation created', serializer.data
)
return Response(
message
)
def list(self, request, *args, **kwargs):
queryset = self.filter_queryset(self.get_queryset())
page = self.paginate_queryset(queryset)
if page is not None:
serializer = self.get_serializer(page, many=True)
message = status_message_response(
200,
'success',
'list of Delegation found',
serializer.data
)
return self.get_paginated_response(message)
serializer = self.get_serializer(queryset, many=True)
return Response(serializer.data)
@decorators.error_safe
@transaction.atomic
def destroy(self, request, *args, **kwargs):
instance = self.get_object()
new_instance = model_to_dict(instance)
# restrictions
if (new_instance['name'].lower() == 'head of department' or
new_instance['name'].lower() == 'sd/od' or
new_instance['name'].lower() == 'change control board' or
new_instance['name'].lower() == 'approver' or
new_instance['name'].lower() == 'vendor/implementor' or
new_instance['name'].lower() == 'requestor'):
print("hello")
self.perform_destroy(instance)
log_save(
enums.LogEnum.DELETED.value,
enums.LogEntitiesEnum.DELEGATION.value,
new_instance['id'],
new_instance,
''
)
return Response(status=status.HTTP_204_NO_CONTENT)
@transaction.atomic
def update(self, request, *args, **kwargs):
partial = kwargs.pop('partial', False)
instance = self.get_object()
serializer = self.get_serializer(instance, data=request.data, partial=partial)
serializer.is_valid(raise_exception=True)
old_instance = model_to_dict(instance)
self.perform_update(serializer)
new_instance = serializer.data
log_save(
enums.LogEnum.DELETED.value,
enums.LogEntitiesEnum.DELEGATION.value,
old_instance['id'],
old_instance,
new_instance
)
return Response(serializer.data)
...@@ -16,7 +16,7 @@ class SubModuleField(serializers.Field): ...@@ -16,7 +16,7 @@ class SubModuleField(serializers.Field):
class ModuleSerializer(serializers.ModelSerializer): class ModuleSerializer(serializers.ModelSerializer):
sub_module = SubModuleField(source='*', read_only=True) sub_module = SubModuleField(source='*', read_only=True)
def to_representation(self, instance): def to_representation(self, instance):
application_name = Application.objects.filter( application_name = Application.objects.filter(
id=instance.application.id id=instance.application.id
......
...@@ -93,7 +93,7 @@ class UsersManagementViewSet(viewsets.ModelViewSet): ...@@ -93,7 +93,7 @@ class UsersManagementViewSet(viewsets.ModelViewSet):
createdUser = models.User.objects.filter(id=pk).first() createdUser = models.User.objects.filter(id=pk).first()
createdUser.set_password(settings.USER_DEFAULT_PASSWORD) createdUser.set_password(settings.USER_DEFAULT_PASSWORD)
createdUser.save() createdUser.save()
# LOG ADD # LOG ADD
log_save.log_save( log_save.log_save(
enums.LogEnum.ADD.value, enums.LogEnum.ADD.value,
......
from rest_framework import serializers from rest_framework import serializers
from app.entities.models import Department from app.entities.models import Department, Delegation
from app.applicationlayer.utils import model_to_dict from app.applicationlayer.utils import model_to_dict
...@@ -16,3 +16,12 @@ class AdminDepartmentSerializer(serializers.ModelSerializer): ...@@ -16,3 +16,12 @@ class AdminDepartmentSerializer(serializers.ModelSerializer):
read_only_fields = ( read_only_fields = (
'created', 'createdby', 'modified', 'modifiedby', 'code', 'created', 'createdby', 'modified', 'modifiedby', 'code',
) )
class DelegationSerializer(serializers.ModelSerializer):
class Meta:
model = Delegation
fields = '__all__'
read_only_fields = (
'created', 'createdby', 'modified', 'modifiedby', 'code',
)
\ No newline at end of file
...@@ -3,20 +3,23 @@ from rest_framework.response import Response ...@@ -3,20 +3,23 @@ from rest_framework.response import Response
from app.applicationlayer.utils import model_to_dict from app.applicationlayer.utils import model_to_dict
from rest_framework.filters import SearchFilter, OrderingFilter from rest_framework.filters import SearchFilter, OrderingFilter
from django_filters import rest_framework as filters from django_filters import rest_framework as filters
from app.entities.models import Department from app.entities.models import Department, Delegation
from app.applicationlayer.utils import ( from app.applicationlayer.utils import (
CustomPagination, status_message_response CustomPagination, status_message_response
) )
from django_filters.rest_framework import DjangoFilterBackend from django_filters.rest_framework import DjangoFilterBackend
from app.applicationlayer.master.department import serializer from app.applicationlayer.master.department.serializer import (
AdminDepartmentSerializer,
DelegationSerializer)
from app.applicationlayer.management.department.table_filters import DepartmentFilterSet from app.applicationlayer.management.department.table_filters import DepartmentFilterSet
from app.helper.decorators import rms from app.helper.decorators import rms
from rest_framework.decorators import action
class AdminDepartmentViewSet(viewsets.ModelViewSet): class AdminDepartmentViewSet(viewsets.ModelViewSet):
queryset = Department.objects.all().order_by('-created') queryset = Department.objects.all().order_by('-created')
serializer_class = serializer.AdminDepartmentSerializer serializer_class = AdminDepartmentSerializer
pagination_class = CustomPagination pagination_class = CustomPagination
lookup_field = 'code' lookup_field = 'code'
filter_backends = (DjangoFilterBackend, SearchFilter, OrderingFilter) filter_backends = (DjangoFilterBackend, SearchFilter, OrderingFilter)
...@@ -44,7 +47,6 @@ class AdminDepartmentViewSet(viewsets.ModelViewSet): ...@@ -44,7 +47,6 @@ class AdminDepartmentViewSet(viewsets.ModelViewSet):
) )
return self.get_paginated_response(message) return self.get_paginated_response(message)
except Exception as e: except Exception as e:
# serializer = self.get_serializer(queryset, many=True)
message = status_message_response( message = status_message_response(
400, 400,
'failed', 'failed',
...@@ -52,3 +54,34 @@ class AdminDepartmentViewSet(viewsets.ModelViewSet): ...@@ -52,3 +54,34 @@ class AdminDepartmentViewSet(viewsets.ModelViewSet):
'' ''
) )
return Response(message) return Response(message)
@action(detail=True,
methods=['get'],
url_path='delegations',
name="Delegation Filtered List")
def delegations(self, request, *args, **kwargs):
try:
dept_code = kwargs['code']
queryset = Delegation.objects.filter(department__code=dept_code)
page = self.paginate_queryset(queryset)
if page is not None:
self.serializer_class = DelegationSerializer
serializer = self.get_serializer(page, many=True)
message = status_message_response(
200,
'success',
'list of filtered delegations found',
serializer.data
)
return self.get_paginated_response(message)
except Exception as e:
message = status_message_response(
400,
'failed',
str(e),
''
)
return Response(message)
\ No newline at end of file
...@@ -9,6 +9,7 @@ from app.applicationlayer.management.module.views import ModuleViewSet ...@@ -9,6 +9,7 @@ from app.applicationlayer.management.module.views import ModuleViewSet
from app.applicationlayer.management.account.views import UserViewSet from app.applicationlayer.management.account.views import UserViewSet
from app.businesslayer.company.views import AdminCompanyViewSet from app.businesslayer.company.views import AdminCompanyViewSet
from app.applicationlayer.management.notification.views import NotificationsViewset from app.applicationlayer.management.notification.views import NotificationsViewset
from app.applicationlayer.management.delegation.views import DelegationViewSet
from app.applicationlayer.download.accounts.views import UserDownloadRequest from app.applicationlayer.download.accounts.views import UserDownloadRequest
from app.applicationlayer.download.department.views import DepartmentDownloadRequest from app.applicationlayer.download.department.views import DepartmentDownloadRequest
...@@ -26,6 +27,7 @@ router.register(r'notifications', NotificationsViewset) ...@@ -26,6 +27,7 @@ router.register(r'notifications', NotificationsViewset)
router.register(r'user-download', UserDownloadRequest) router.register(r'user-download', UserDownloadRequest)
router.register(r'department-download', DepartmentDownloadRequest) router.register(r'department-download', DepartmentDownloadRequest)
router.register(r'company-download', CompanyDownloadRequest) router.register(r'company-download', CompanyDownloadRequest)
router.register(r'delegations', DelegationViewSet)
urlpatterns = ( urlpatterns = (
path('', include(router.urls)), path('', include(router.urls)),
......
...@@ -20,7 +20,7 @@ REALTIMESERVER_IP = settings.REALTIMESERVER_IP ...@@ -20,7 +20,7 @@ REALTIMESERVER_IP = settings.REALTIMESERVER_IP
def model_to_dict(instance): def model_to_dict(instance):
try: try:
mySerializer = copy.deepcopy(DynamicSerializer) mySerializer = copy.deepcopy(DynamicSerializer)
mySerializer.Meta.model = instance.__class__ mySerializer.Meta.model = instance.__class__
return mySerializer(instance).data return mySerializer(instance).data
...@@ -161,7 +161,8 @@ def send_broadcast_message(room_name, sender, message): ...@@ -161,7 +161,8 @@ def send_broadcast_message(room_name, sender, message):
ws.close() ws.close()
def notification_create(form_code, message, account_no, sender_account_no): def notification_create(form_code, message, account_no,
sender_account_no, app):
try: try:
...@@ -170,7 +171,7 @@ def notification_create(form_code, message, account_no, sender_account_no): ...@@ -170,7 +171,7 @@ def notification_create(form_code, message, account_no, sender_account_no):
notif_type='TASK', notif_type='TASK',
message=message, message=message,
is_read=False, is_read=False,
app='APP-20190909-0000002', app=app,
account_no=account_no, account_no=account_no,
sender_account_no=sender_account_no sender_account_no=sender_account_no
) )
...@@ -184,12 +185,6 @@ def notification_create(form_code, message, account_no, sender_account_no): ...@@ -184,12 +185,6 @@ def notification_create(form_code, message, account_no, sender_account_no):
'NEW NOTIFICATIONS' 'NEW NOTIFICATIONS'
) )
# message = {
# 'code': 200,
# 'status': 'success',
# 'message': 'Notification successfully created!',
# }
# return Response(message, status=status.HTTP_200_OK)
return True return True
except Exception as e: except Exception as e:
......
...@@ -13,14 +13,33 @@ from django.http import Http404 ...@@ -13,14 +13,33 @@ from django.http import Http404
from django.db.models import Q from django.db.models import Q
from app.applicationlayer.cms.utils_cr import ( from app.applicationlayer.cms.utils_cr import (
number_generator, crhistory_save, entity_log_bulk, number_generator,
crhistory_log_bulk_delete crhistory_save,
entity_log_bulk,
crhistory_log_bulk_delete,
send_mail_requestor,
next_approver_email,
send_mail_vendor,
crhistory_create_save,
reminder_trigger_save,
overdue_trigger_save,
reset_autoemail_tables
) )
from app.applicationlayer.utils import model_to_dict from app.applicationlayer.utils import model_to_dict
from app.entities import enums, models from app.entities import enums, models
from app.applicationlayer.utils import log_save, CustomPagination from app.applicationlayer.utils import log_save, CustomPagination
from app.applicationlayer.cms.template import serializers from app.applicationlayer.cms.template import serializers
from django.db.models import Min from django.db.models import Min
from django.conf import settings
APPROVER_MESSAGE = settings.APPROVER_MESSAGE
REQUESTOR_MESSAGE = settings.REQUESTOR_MESSAGE
REQUESTOR_REJECT_MESSAGE = settings.REQUESTOR_REJECT_MESSAGE
VENDOR_ACKNOWLEDGE_MESSAGE = settings.VENDOR_ACKNOWLEDGE_MESSAGE
REQUESTOR_ACKNOWLEDGE_MESSAGE = settings.REQUESTOR_ACKNOWLEDGE_MESSAGE
REQUESTOR_COMPLETION_MESSAGE = settings.REQUESTOR_COMPLETION_MESSAGE
VENDOR_ACCEPTANCE_MESSAGE = settings.VENDOR_ACCEPTANCE_MESSAGE
VENDOR_REJECT_MESSAGE = settings.VENDOR_REJECT_MESSAGE
def list_by_user(user_id_number): def list_by_user(user_id_number):
...@@ -443,7 +462,9 @@ def check_vendor_level(position, routing_level, form_code): ...@@ -443,7 +462,9 @@ def check_vendor_level(position, routing_level, form_code):
form_code=form_code, form_code=form_code,
level=int(routing_level), level=int(routing_level),
delegation='Vendor/Implementor' delegation='Vendor/Implementor'
) ).first()
return query
elif position == 'last': elif position == 'last':
...@@ -451,6 +472,8 @@ def check_vendor_level(position, routing_level, form_code): ...@@ -451,6 +472,8 @@ def check_vendor_level(position, routing_level, form_code):
form_code=form_code, form_code=form_code,
delegation='Vendor/Implementor' delegation='Vendor/Implementor'
).order_by('level').last() ).order_by('level').last()
return query
elif position == 'prev': elif position == 'prev':
...@@ -458,9 +481,267 @@ def check_vendor_level(position, routing_level, form_code): ...@@ -458,9 +481,267 @@ def check_vendor_level(position, routing_level, form_code):
Q(form_code=form_code) & Q(form_code=form_code) &
Q(action='Completed') & Q(action='Completed') &
Q(delegation='Vendor/Implementor') & Q(delegation='Vendor/Implementor') &
Q(level__lte=int(level)) Q(level__lte=int(routing_level))
)
return query
def update_form_approver(form_code, level, apprv_type, date_now):
if apprv_type == 'next':
# update next approver details
models.ChangeRequestFormApprovers.objects.filter(
Q(form_code=form_code) & Q(level=int(level))
).update(
date_sent=date_now,
is_action=True
)
elif apprv_type == 'current':
# update current approver details
models.ChangeRequestFormApprovers.objects.filter(
Q(form_code=form_code) & Q(level=int(level))
).update(
is_action=False
)
def update_form_header_status(form_code, status):
models.ChangeRequestFormHeader.objects.filter(
form_code=form_code
).update(status=status)
return True
def cr_routing_actions(approver_instance, current_user):
form_code = approver_instance['form_code']
delegation = approver_instance['delegation']
action = approver_instance['action'].lower()
level = approver_instance['level']
next_level = int(approver_instance['level']) + 1
remarks = approver_instance['remarks']
if approver_instance['action'].lower() == 'approved':
the_next_vendor = check_vendor_level(
'next', next_level, form_code)
if the_next_vendor:
the_last_vendor = check_vendor_level(
'last', level, form_code)
# changed form status to Approved
if the_next_vendor == the_last_vendor:
update_form_header_status(form_code, 'Approved')
# NOTIF MSG FOR REQUESTOR
requestor_notification_msg = REQUESTOR_MESSAGE.split(';')[0]
# SEND EMAIL AND NOTIF TO REQUESTOR
send_mail_requestor(
current_user, form_code, delegation,
requestor_notification_msg, action,
remarks, level
)
next_approver_email(form_code, next_level)
date_now = datetime.now()
# update next approver details
update_form_approver(form_code, next_level, 'next', date_now)
# update current approver details
update_form_approver(form_code, level, 'current', date_now)
#save details for reminder trigger
reminder_trigger_save(form_code, date_now, date_now)
elif approver_instance['action'].lower() == 'rejected':
# send email to vendor
if delegation.lower() == 'requestor':
notification_msg = VENDOR_REJECT_MESSAGE.split(';')[0]
# send reject email to vendor
send_mail_vendor(
current_user, form_code, delegation,
notification_msg, action,
remarks, level
)
prev_level = int(level) - 1
# reset last vendor details
models.ChangeRequestFormApprovers.objects.filter(
Q(form_code=form_code) &
Q(level=int(prev_level))
).update(
is_action=True,
action='Acknowledged',
action_date=datetime.now(),
date_sent=datetime.now()
)
else:
prev_vendor = check_vendor_level(
'prev', level, form_code)
if not prev_vendor.count() > 0:
update_form_header_status(form_code, 'Rejected')
# EMAIL CODE FOR REQUESTOR
requestor_notification_msg = REQUESTOR_REJECT_MESSAGE.split(';')[0]
# SEND EMAIL AND NOTIF TO REQUESTOR
send_mail_requestor(
current_user, form_code, delegation,
requestor_notification_msg, action,
remarks, level
)
else:
# EMAIL CODE FOR REQUESTOR
requestor_notification_msg = REQUESTOR_REJECT_MESSAGE.split(';')[0]
# SEND EMAIL AND NOTIF TO REQUESTOR
send_mail_requestor(
current_user, form_code, delegation,
requestor_notification_msg, action,
remarks, level
) )
# def cr_routing_actions(approver_instance): notification_msg = VENDOR_REJECT_MESSAGE.split(';')[0]
send_mail_vendor(
current_user, form_code, 'others',
notification_msg, action,
remarks, level
)
last_action_vendor = prev_vendor.last()
models.ChangeRequestFormApprovers.objects.filter(
code=last_action_vendor
).update(
is_action=True,
action='Acknowledged',
action_date=datetime.now(),
date_sent=datetime.now()
)
level = last_action_vendor.level + 1
models.ChangeRequestFormApprovers.objects.filter(
Q(form_code=form_code) & Q(level__gte=int(level))
).update(
is_action=False,
action=None,
remarks=None,
action_date=None,
date_sent=None
)
elif approver_instance['action'].lower() == 'completed':
the_last_vendor = check_vendor_level(
'last', level, form_code)
if (current_user == the_last_vendor.user.code and
level == the_last_vendor.level):
update_form_header_status(form_code, 'Approved')
else:
the_next_vendor = check_vendor_level(
'next', next_level, form_code)
if the_next_vendor:
if the_next_vendor.user.code == the_last_vendor.user.code:
update_form_header_status(form_code, 'Approved')
else:
update_form_header_status(form_code, 'Pending')
next_approver_email(form_code, next_level)
date_now = datetime.now()
# update next approver details
update_form_approver(form_code, next_level, 'next', date_now)
# update current approver details
update_form_approver(form_code, level, 'current', date_now)
# EMAIL CODE FOR REQUESTOR
requestor_notification_msg = REQUESTOR_COMPLETION_MESSAGE.split(';')[0]
send_mail_requestor(
current_user, form_code, delegation,
requestor_notification_msg, action,
remarks, level
)
elif action.lower() == 'acknowledged':
# EMAIL CODE FOR REQUESTOR
requestor_notification_msg = REQUESTOR_ACKNOWLEDGE_MESSAGE.split(';')[0]
send_mail_requestor(
current_user, form_code, delegation,
requestor_notification_msg, action,
remarks, level
)
elif action.lower() == 'accepted':
update_form_header_status(form_code, 'Completed & Accepted')
# EMAIL CODE FOR VENDOR
requestor_notification_msg = VENDOR_ACCEPTANCE_MESSAGE.split(';')[0]
send_mail_vendor(
current_user, form_code, delegation,
requestor_notification_msg, action,
remarks, level
)
date_now = datetime.now()
# update current approver details
update_form_approver(form_code, level, 'current', date_now)
elif action.lower() == 'cancelled':
# changed form status to cancelled
update_form_header_status(form_code, 'Cancelled')
date_now = datetime.now()
# update is_action for current level
update_form_approver(form_code, level, 'current', date_now)
reset_autoemail_tables(form_code)
return True
...@@ -8,4 +8,4 @@ class AdminDepartmentSerializer(serializers.ModelSerializer): ...@@ -8,4 +8,4 @@ class AdminDepartmentSerializer(serializers.ModelSerializer):
fields = '__all__' fields = '__all__'
read_only_fields = ( read_only_fields = (
'created', 'createdby', 'modified', 'modifiedby', 'code', 'created', 'createdby', 'modified', 'modifiedby', 'code',
) )
\ No newline at end of file
...@@ -41,4 +41,4 @@ class AdminDepartmentViewSet(viewsets.ModelViewSet): ...@@ -41,4 +41,4 @@ class AdminDepartmentViewSet(viewsets.ModelViewSet):
return self.get_paginated_response(message) return self.get_paginated_response(message)
serializer = self.get_serializer(queryset, many=True) serializer = self.get_serializer(queryset, many=True)
return Response(serializer.data) return Response(serializer.data)
\ No newline at end of file
...@@ -29,6 +29,7 @@ class GenerateCode(Enum): ...@@ -29,6 +29,7 @@ class GenerateCode(Enum):
COMPANY = 'COMPANY' COMPANY = 'COMPANY'
DEPARTMENT = 'DEPARTMENT' DEPARTMENT = 'DEPARTMENT'
USER = 'USER' USER = 'USER'
DELEGATION = 'DELEGATION'
NOTIFICATION = 'NOTIF' NOTIFICATION = 'NOTIF'
TEMPLATE = 'TMP' TEMPLATE = 'TMP'
TMP_APPROVER = 'TMPAPR' TMP_APPROVER = 'TMPAPR'
...@@ -62,6 +63,7 @@ class LogEntitiesEnum(Enum): ...@@ -62,6 +63,7 @@ class LogEntitiesEnum(Enum):
COMPANY = "COMPANY" COMPANY = "COMPANY"
DEPARTMENT = "DEPARTMENT" DEPARTMENT = "DEPARTMENT"
MODULE = "MODULE" MODULE = "MODULE"
DELEGATION = "DELEGATION"
ChangeRequestTemplateHeader = "ChangeRequestTemplateHeader" ChangeRequestTemplateHeader = "ChangeRequestTemplateHeader"
ChangeRequestTemplateApprovers = "ChangeRequestTemplateApprovers" ChangeRequestTemplateApprovers = "ChangeRequestTemplateApprovers"
ChangeRequestTemplateStakeHolders = "ChangeRequestTemplateStakeHolders" ChangeRequestTemplateStakeHolders = "ChangeRequestTemplateStakeHolders"
......
# Generated by Django 2.2 on 2019-10-29 15:13
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('entities', '0027_assetgroup'),
]
operations = [
migrations.AddField(
model_name='canceltrigger',
name='cancel_type',
field=models.CharField(blank=True, max_length=255, null=True),
),
migrations.AddField(
model_name='remindertrigger',
name='form_code',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to='entities.ChangeRequestFormHeader', to_field='form_code'),
),
migrations.AlterField(
model_name='canceltrigger',
name='frm_approver',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to='entities.ChangeRequestFormApprovers', to_field='code'),
),
]
# Generated by Django 2.2 on 2019-11-04 12:28
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('entities', '0028_auto_20191029_1513'),
]
operations = [
migrations.AlterModelTable(
name='canceltrigger',
table='trigger_cancel',
),
migrations.AlterModelTable(
name='overduetrigger',
table='trigger_overdue',
),
migrations.AlterModelTable(
name='remindertrigger',
table='trigger_reminder',
),
]
# Generated by Django 2.2 on 2019-11-04 15:07
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('entities', '0029_auto_20191104_1228'),
]
operations = [
migrations.AlterModelOptions(
name='assetgroup',
options={'ordering': ['-created']},
),
]
# Generated by Django 2.2 on 2019-11-07 12:39
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('entities', '0030_auto_20191104_1507'),
]
operations = [
migrations.CreateModel(
name='Delegation',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('created', models.DateTimeField(auto_now_add=True)),
('createdby', models.CharField(max_length=255)),
('modified', models.DateTimeField(auto_now=True)),
('modifiedby', models.CharField(max_length=255)),
('code', models.CharField(max_length=255, unique=True)),
('name', models.CharField(max_length=255, unique=True)),
],
options={
'db_table': 'delegations',
},
),
migrations.AlterField(
model_name='changerequestformapprovers',
name='delegation',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to='entities.Delegation', to_field='code'),
),
migrations.AlterField(
model_name='changerequesttemplateapprovers',
name='delegation',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to='entities.Delegation', to_field='code'),
),
migrations.AddField(
model_name='department',
name='delegation',
field=models.ManyToManyField(to='entities.Delegation'),
),
]
# Generated by Django 2.2 on 2019-11-08 11:09
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('entities', '0031_auto_20191107_1239'),
]
operations = [
migrations.AddField(
model_name='allowedcompany',
name='approve_cr',
field=models.BooleanField(default=True),
),
migrations.AlterField(
model_name='entitylog',
name='entity',
field=models.CharField(choices=[('USER', 'USER'), ('APPLICATION', 'APPLICATION'), ('COMPANY', 'COMPANY'), ('DEPARTMENT', 'DEPARTMENT'), ('MODULE', 'MODULE'), ('DELEGATION', 'DELEGATION'), ('ChangeRequestTemplateHeader', 'ChangeRequestTemplateHeader'), ('ChangeRequestTemplateApprovers', 'ChangeRequestTemplateApprovers'), ('ChangeRequestTemplateStakeHolders', 'ChangeRequestTemplateStakeHolders'), ('ChangeRequestTemplateAttachments', 'ChangeRequestTemplateAttachments'), ('ChangeRequestTemplateDetails', 'ChangeRequestTemplateDetails'), ('ChangeRequestFormHeader', 'ChangeRequestFormHeader'), ('ChangeRequestFormApprovers', 'ChangeRequestFormApprovers'), ('ChangeRequestFormStakeHolders', 'ChangeRequestFormStakeHolders'), ('ChangeRequestFormAttachments', 'ChangeRequestFormAttachments'), ('ChangeRequestFormDetails', 'ChangeRequestFormDetails')], default='Add', max_length=50),
),
]
...@@ -9,7 +9,6 @@ from . import enums ...@@ -9,7 +9,6 @@ from . import enums
from django.utils.text import slugify from django.utils.text import slugify
from datetime import timedelta from datetime import timedelta
# ********************* AUTH TABLES ********************* # ********************* AUTH TABLES *********************
...@@ -86,6 +85,26 @@ class Module(AuditClass): ...@@ -86,6 +85,26 @@ class Module(AuditClass):
Module.objects.filter(id=self.id).update(code=code) Module.objects.filter(id=self.id).update(code=code)
class Delegation(AuditClass):
code = models.CharField(
unique=True,
max_length=255
)
name = models.CharField(unique=True, max_length=255)
class Meta:
db_table = 'delegations'
def __str__(self):
return f'{self.name}'
def save(self, *args, **kwargs):
super(Delegation, self).save(*args, **kwargs)
code = enums.GenerateCode.DELEGATION.value
code = number_generator(enums.GenerateCode.DELEGATION.value, self.id)
Delegation.objects.filter(id=self.id).update(code=code)
class Company(AuditClass): class Company(AuditClass):
code = models.CharField( code = models.CharField(
unique=True, unique=True,
...@@ -129,6 +148,9 @@ class Department(AuditClass): ...@@ -129,6 +148,9 @@ class Department(AuditClass):
default='dept' default='dept'
) )
name = models.CharField(max_length=255) name = models.CharField(max_length=255)
delegation = models.ManyToManyField(
Delegation
)
class Meta: class Meta:
db_table = 'departments' db_table = 'departments'
...@@ -427,7 +449,13 @@ class BaseApprover(models.Model): ...@@ -427,7 +449,13 @@ class BaseApprover(models.Model):
on_delete=models.PROTECT, on_delete=models.PROTECT,
to_field='code') to_field='code')
delegation = models.CharField(max_length=50, blank=True, null=True) # delegation = models.CharField(max_length=50, blank=True, null=True)
delegation = models.ForeignKey(
Delegation,
blank=True,
null=True,
on_delete=models.PROTECT,
to_field='code')
created = models.DateTimeField( created = models.DateTimeField(
blank=True, blank=True,
null=True) null=True)
...@@ -535,7 +563,7 @@ class ChangeRequestTemplateHeader(BaseHeader): ...@@ -535,7 +563,7 @@ class ChangeRequestTemplateHeader(BaseHeader):
on_delete=models.PROTECT, on_delete=models.PROTECT,
to_field='code', to_field='code',
related_name='created_by_user') related_name='created_by_user')
created_by_department = models.ForeignKey( created_by_department = models.ForeignKey(
Department, Department,
on_delete=models.PROTECT, on_delete=models.PROTECT,
...@@ -1034,9 +1062,10 @@ class AllowedCompany(models.Model): ...@@ -1034,9 +1062,10 @@ class AllowedCompany(models.Model):
create_change_request = models.BooleanField(default=True) create_change_request = models.BooleanField(default=True)
create_change_request_template = models.BooleanField(default=True) create_change_request_template = models.BooleanField(default=True)
view_all_change_request = models.BooleanField(default=True) view_all_change_request = models.BooleanField(default=True)
approve_cr = models.BooleanField(default=True)
created_at = models.DateTimeField(auto_now_add=True) created_at = models.DateTimeField(auto_now_add=True)
deleted_at = models.DateTimeField(null=True, blank=True) deleted_at = models.DateTimeField(null=True, blank=True)
class Meta: class Meta:
db_table = 'allowed_company' db_table = 'allowed_company'
unique_together = ['company_pivot', 'group_pivots', 'id_number'] unique_together = ['company_pivot', 'group_pivots', 'id_number']
...@@ -1064,9 +1093,15 @@ class ReminderTrigger(models.Model): ...@@ -1064,9 +1093,15 @@ class ReminderTrigger(models.Model):
blank=True) blank=True)
is_sent = models.BooleanField( is_sent = models.BooleanField(
default=False) default=False)
form_code = models.ForeignKey(
ChangeRequestFormHeader,
on_delete=models.PROTECT,
to_field='form_code',
null=True,
blank=True)
class Meta: class Meta:
db_table = 'reminder_trigger' db_table = 'trigger_reminder'
class CancelTrigger(models.Model): class CancelTrigger(models.Model):
...@@ -1077,7 +1112,9 @@ class CancelTrigger(models.Model): ...@@ -1077,7 +1112,9 @@ class CancelTrigger(models.Model):
frm_approver = models.ForeignKey( frm_approver = models.ForeignKey(
ChangeRequestFormApprovers, ChangeRequestFormApprovers,
on_delete=models.PROTECT, on_delete=models.PROTECT,
to_field='code') to_field='code',
blank=True,
null=True)
auto_cancel_date = models.DateTimeField( auto_cancel_date = models.DateTimeField(
null=True, null=True,
blank=True) blank=True)
...@@ -1086,9 +1123,13 @@ class CancelTrigger(models.Model): ...@@ -1086,9 +1123,13 @@ class CancelTrigger(models.Model):
date_submitted_last_approver = models.DateTimeField( date_submitted_last_approver = models.DateTimeField(
null=True, null=True,
blank=True) blank=True)
cancel_type = models.CharField(
null=True,
blank=True,
max_length=255)
class Meta: class Meta:
db_table = 'cancel_trigger' db_table = 'trigger_cancel'
class OverdueTrigger(models.Model): class OverdueTrigger(models.Model):
...@@ -1103,7 +1144,7 @@ class OverdueTrigger(models.Model): ...@@ -1103,7 +1144,7 @@ class OverdueTrigger(models.Model):
default=False) default=False)
class Meta: class Meta:
db_table = 'overdue_trigger' db_table = 'trigger_overdue'
""" """
...@@ -1128,6 +1169,7 @@ class AssetGroup(models.Model): ...@@ -1128,6 +1169,7 @@ class AssetGroup(models.Model):
class Meta: class Meta:
db_table = 'asset_groups' db_table = 'asset_groups'
ordering = ['-created']
def __str__(self): def __str__(self):
return f'{self.code}' return f'{self.code}'
......
...@@ -5,7 +5,6 @@ from app.entities import models ...@@ -5,7 +5,6 @@ from app.entities import models
from django.conf import settings from django.conf import settings
# def account_created(args, username, password, receiver) :
def account_created(args): def account_created(args):
name = args[0] name = args[0]
username = args[1] username = args[1]
...@@ -51,20 +50,7 @@ def account_created(args): ...@@ -51,20 +50,7 @@ def account_created(args):
def cronjob(args): def cronjob(args):
# name = args[0]
# username = args[1]
# password = args[2]
# recipient = args[3]
# admin = args[4]
# F = open(os.path.join(settings.EMAIL_TEMPLATES_ROOT, 'RMS-NEWUSER.html'), 'r')
# FC = F.read()
# FC = FC.replace('{name}', name)
# FC = FC.replace('{username}', username)
# FC = FC.replace('{password}', password)
# FC = FC.replace('{url}', settings.FRONT_END_URL + '/cms/profile') #changed
try: try:
send_mail( send_mail(
subject='Resource Management System: Welcome!', subject='Resource Management System: Welcome!',
...@@ -145,24 +131,6 @@ def forgot_password(args): ...@@ -145,24 +131,6 @@ def forgot_password(args):
) )
# def password_changed(username, date, receiver) :
# F = open(os.path.join(settings.EMAIL_TEMPLATES_ROOT, 'password-changed.html'), 'r')
# FC = F.read()
# FC = FC.replace('[Username]', username)
# FC = FC.replace('[Datetime]', date)
# FC = FC.replace('[URL]', settings.FRONT_END_URL)
# send_mail(
# subject='OB RMS: Password Changed!',
# message='',
# from_email=settings.EMAIL_DEFAULT_SENDER,
# recipient_list=[receiver,],
# html_message=FC
# )
def admin_changepassword(args): def admin_changepassword(args):
name = args[0] name = args[0]
username = args[1] username = args[1]
...@@ -188,342 +156,6 @@ def admin_changepassword(args): ...@@ -188,342 +156,6 @@ def admin_changepassword(args):
) )
# def account_created(username, password, receiver) :
# F = open(os.path.join(settings.EMAIL_TEMPLATES_ROOT, 'account-created.html'), 'r')
# FC = F.read()
# FC = FC.replace('[Username]', username)
# FC = FC.replace('[Password]', password)
# FC = FC.replace('[URL]', settings.FRONT_END_URL)
# send_mail(
# subject='OB IMS: Welcome!',
# message='',
# from_email=settings.EMAIL_DEFAULT_SENDER,
# recipient_list=[receiver,],
# html_message=FC
# )
# def stock_requisition_new(sr_id,
# sr_no,
# requestor,
# requested_on,
# project,
# remarks,
# receiver,
# requested_items=[],
# purchase_items=[],
# required_date=None):
# F = open(os.path.join(settings.EMAIL_TEMPLATES_ROOT, 'stock-requisition.html'), 'r')
# FC = F.read()
# FC = FC.replace('[SR No]', sr_no)
# FC = FC.replace('[Requestor]', requestor)
# FC = FC.replace('[Requested On]', requested_on)
# FC = FC.replace('[Project]', project)
# FC = FC.replace('[Remarks]', remarks)
# # PRINT SR ITEMS
# if requested_items and len(requested_items) > 0:
# appendedList = ''
# for item in requested_items :
# prodNo = str(item.product.product_no)
# prodName = str(item.product.name)
# brand = str(item.product.brand.name)
# qty = str(item.quantity)
# unit = str(item.product.unit_material.name)
# appendedList += '\t\t\t\t \
# <tr bgcolor="#FFFFFF"> \
# <td>' + prodNo + '</td> \
# <td>' + prodName + '</td> \
# <td>' + brand + '</td> \
# <td>' + qty + '</td> \
# <td>' + unit + '</td> \
# </tr>'
# FC = FC.replace('<tr bgcolor="#FFFFFF" id="sr">\n <td>&nbsp;</td>\n <td>&nbsp;</td>\n <td>&nbsp;</td>\n <td>&nbsp;</td>\n <td>&nbsp;</td>\n </tr>', appendedList)
# # PRINT PR ITEMS
# if purchase_items and len(purchase_items) > 0 :
# FC = FC.replace('[Required Date]', required_date)
# appendedList = ''
# for item in purchase_items :
# prodNo = str(item.product.product_no)
# prodName = str(item.product.name)
# brand = str(item.product.brand.name)
# qty = str(item.quantity)
# unit = str(item.product.unit_material.name)
# appendedList += '\t\t\t\t \
# <tr bgcolor="#FFFFFF"> \
# <td>' + prodNo + '</td> \
# <td>' + prodName + '</td> \
# <td>' + brand + '</td> \
# <td>' + qty + '</td> \
# <td>' + unit + '</td> \
# </tr>'
# FC = FC.replace('<tr bgcolor="#FFFFFF" id="pr">\n <td>&nbsp;</td>\n <td>&nbsp;</td>\n <td>&nbsp;</td>\n <td>&nbsp;</td>\n <td>&nbsp;</td>\n </tr>', appendedList)
# urlApprove = f"{settings.FRONT_END_URL}/{'transaction/requisition/approve'}/{sr_id}/basic"
# urlReject = f"{settings.FRONT_END_URL}/{'transaction/requisition/reject'}/{sr_id}/basic"
# FC = FC.replace('ApproveToken', urlApprove)
# FC = FC.replace('RejectToken', urlReject)
# send_mail(
# subject='OB IMS: '+ sr_no +' by ' + requestor,
# message='',
# from_email=settings.EMAIL_DEFAULT_SENDER,
# recipient_list=[receiver,],
# html_message=FC
# )
# def stock_requisition_approve(sr_no,
# requestor,
# requestor_email,
# requested_on,
# requestor_contact,
# project,
# remarks,
# approved_by,
# approved_date,
# requested_items=[],
# purchase_items=[],
# required_date=None):
# # requested_items
# # LIST OF "RequisitionApproveItem"
# # purchase_items
# # LIST OF "PurchaseRequestApproveItem"
# F = open(os.path.join(settings.EMAIL_TEMPLATES_ROOT, 'stock-requisition-approved.html'), 'r')
# FC = F.read()
# FC = FC.replace('[SR No]', sr_no)
# FC = FC.replace('[Requestor]', requestor)
# FC = FC.replace('[Requested On]', requested_on)
# FC = FC.replace('[Project]', project)
# FC = FC.replace('[Remarks]', remarks)
# FC = FC.replace('[Approved By]', approved_by)
# FC = FC.replace('[Approved On]', approved_date)
# # PRINT SR ITEMS
# if len(requested_items) > 0 :
# appendedList = ''
# for item in requested_items :
# prodNo = item.requisition_product.product.product_no
# prodName = item.requisition_product.product.name
# brand = item.requisition_product.product.brand.name
# qty = str(item.quantity)
# unit = item.requisition_product.product.unit_material.name
# appendedList += '\t\t\t\t \
# <tr bgcolor="#FFFFFF"> \
# <td>' + prodNo + '</td> \
# <td>' + prodName + '</td> \
# <td>' + brand + '</td> \
# <td>' + qty + '</td> \
# <td>' + unit + '</td> \
# </tr>'
# FC = FC.replace('<tr bgcolor="#FFFFFF" id="sr">\n <td>&nbsp;</td>\n <td>&nbsp;</td>\n <td>&nbsp;</td>\n <td>&nbsp;</td>\n <td>&nbsp;</td>\n </tr>', appendedList)
# # PRINT PR ITEMS
# if len(purchase_items) > 0 :
# FC = FC.replace('[Required Date]', required_date)
# appendedList = ''
# for item in purchase_items :
# prodNo = item.purchase_request_item.product.product_no
# prodName = item.purchase_request_item.product.name
# brand = item.purchase_request_item.product.brand.name
# qty = str(item.quantity)
# unit = item.purchase_request_item.product.unit_material.name
# appendedList += '\t\t\t\t \
# <tr bgcolor="#FFFFFF"> \
# <td>' + prodNo + '</td> \
# <td>' + prodName + '</td> \
# <td>' + brand + '</td> \
# <td>' + qty + '</td> \
# <td>' + unit + '</td> \
# </tr>'
# FC = FC.replace('<tr bgcolor="#FFFFFF" id="pr">\n <td>&nbsp;</td>\n <td>&nbsp;</td>\n <td>&nbsp;</td>\n <td>&nbsp;</td>\n <td>&nbsp;</td>\n </tr>', appendedList)
# approver_emails = []
# # roles_receives = ['Receive Stock Requisition Authorization Email',
# # 'Allow Purchase Requests Authorisation',
# # 'Receive Stock Request Email',
# # 'Receive Purchase Request Email']
# # qry = models.User.objects.filter(user_roles__role__code__in=roles_receives).values('email').distinct()
# # for item in qry:
# # approver_emails.append(item['email'])
# approver_emails.append(requestor_email)
# if len(approver_emails) > 0:
# send_mail(
# subject='OB IMS Stock Request: '+ sr_no,
# message='',
# from_email=settings.EMAIL_DEFAULT_SENDER,
# recipient_list=approver_emails,
# html_message=FC
# )
# def stock_requisition_reject(sr_no,
# requestor,
# requestor_email,
# requested_on,
# project,
# remarks,
# rejected_reason,
# rejected_by,
# rejected_date,
# requested_items=[],
# purchase_items=[],
# required_date=None):
# # requested_items
# # LIST OF "RequisitionRejectItem"
# # purchase_items
# # LIST OF "PurchaseRequestRejectItem"
# F = open(os.path.join(settings.EMAIL_TEMPLATES_ROOT, 'stock-requisition-rejected.html'), 'r')
# FC = F.read()
# FC = FC.replace('[SR No]', sr_no)
# FC = FC.replace('[Requestor]', requestor)
# FC = FC.replace('[Requested On]', requested_on)
# FC = FC.replace('[Project]', project)
# FC = FC.replace('[Remarks]', remarks)
# FC = FC.replace('[Rejected By]', rejected_by)
# FC = FC.replace('[Rejected On]', rejected_date)
# FC = FC.replace('[Rejected Reason]', rejected_reason)
# # PRINT SR ITEMS
# if len(requested_items) > 0 :
# appendedList = ''
# for item in requested_items :
# prodNo = item.requisition_product.product.product_no
# prodName = item.requisition_product.product.name
# brand = item.requisition_product.product.brand.name
# qty = str(item.quantity)
# unit = item.requisition_product.product.unit_material.name
# appendedList += '\t\t\t\t \
# <tr bgcolor="#FFFFFF"> \
# <td>' + prodNo + '</td> \
# <td>' + prodName + '</td> \
# <td>' + brand + '</td> \
# <td>' + qty + '</td> \
# <td>' + unit + '</td> \
# </tr>'
# FC = FC.replace('<tr bgcolor="#FFFFFF" id="sr">\n <td>&nbsp;</td>\n <td>&nbsp;</td>\n <td>&nbsp;</td>\n <td>&nbsp;</td>\n <td>&nbsp;</td>\n </tr>', appendedList)
# # PRINT PR ITEMS
# if len(purchase_items) > 0 :
# FC = FC.replace('[Required Date]', required_date)
# appendedList = ''
# for item in purchase_items :
# prodNo = item.purchase_request_item.product.product_no
# prodName = item.purchase_request_item.product.name
# brand = item.purchase_request_item.product.brand.name
# qty = str(item.quantity)
# unit = item.purchase_request_item.product.unit_material.name
# appendedList += '\t\t\t\t \
# <tr bgcolor="#FFFFFF"> \
# <td>' + prodNo + '</td> \
# <td>' + prodName + '</td> \
# <td>' + brand + '</td> \
# <td>' + qty + '</td> \
# <td>' + unit + '</td> \
# </tr>'
# FC = FC.replace('<tr bgcolor="#FFFFFF" id="pr">\n <td>&nbsp;</td>\n <td>&nbsp;</td>\n <td>&nbsp;</td>\n <td>&nbsp;</td>\n <td>&nbsp;</td>\n </tr>', appendedList)
# approver_emails = []
# # roles_receives = ['Receive Stock Requisition Authorization Email', 'Allow Purchase Requests Authorisation', 'Receive Stock Request Email', 'Receive Purchase Request Email']
# # qry = models.User.objects.filter(user_roles__role__code__in=roles_receives).values('email').distinct()
# # for item in qry :
# # approver_emails.append(item['email'])
# approver_emails.append(requestor_email)
# if len(approver_emails) > 0:
# send_mail(
# subject='OB IMS: '+ sr_no +' by ' + requestor,
# message='',
# from_email=settings.EMAIL_DEFAULT_SENDER,
# recipient_list=approver_emails,
# html_message=FC
# )
# # def account_password_reset(username, password, receiver, date_reset) :
# # F = open(os.path.join(EMAIL_TEMPLATES_ROOT, 'reset-password.html'), 'r')
# # FC = F.read()
# # FC = FC.replace('[Username]', username)
# # FC = FC.replace('[Password]', password)
# # FC = FC.replace('[Reset Datetime]', date_reset)
# # send_mail(
# # subject='OB IMS: Password Reset!',
# # message='',
# # from_email=EMAIL_DEFAULT_SENDER,
# # recipient_list=[receiver,],
# # html_message=FC
# # )
# RMS-CRAPPROVED ; RMS-CRACKNOWLEDGE ; RMS-CRCOMPLETED ; RMS-CRACCEPTED ; # RMS-CRAPPROVED ; RMS-CRACKNOWLEDGE ; RMS-CRCOMPLETED ; RMS-CRACCEPTED ;
# RMS-CRREJECTED ; RMS-CRREJECTED-VENDOR # RMS-CRREJECTED ; RMS-CRREJECTED-VENDOR
......
...@@ -497,7 +497,7 @@ ...@@ -497,7 +497,7 @@
], ],
"body": { "body": {
"mode": "raw", "mode": "raw",
"raw": "{\n \"name\": \"Business Develsopment\",\n \"company\": \"COMPANY-20190923-0000001\"\n}" "raw": "{\n \"name\": \"Product Dept\",\n \"company\": \"COMPANY-20190923-0000001\",\n \"delegation\":[2, 3]\n}"
}, },
"url": { "url": {
"raw": "{{baseurl}}/management/departments/", "raw": "{{baseurl}}/management/departments/",
...@@ -1111,6 +1111,143 @@ ...@@ -1111,6 +1111,143 @@
], ],
"protocolProfileBehavior": {}, "protocolProfileBehavior": {},
"_postman_isSubFolder": true "_postman_isSubFolder": true
},
{
"name": "Delegation Management",
"item": [
{
"name": "List of Delegations",
"request": {
"method": "GET",
"header": [],
"url": {
"raw": "{{baseurl}}/management/delegations/",
"host": [
"{{baseurl}}"
],
"path": [
"management",
"delegations",
""
]
}
},
"response": []
},
{
"name": "View Delegation",
"request": {
"method": "GET",
"header": [],
"url": {
"raw": "{{baseurl}}/management/delegations/DELEGATION-20191107-0000002/",
"host": [
"{{baseurl}}"
],
"path": [
"management",
"delegations",
"DELEGATION-20191107-0000002",
""
]
}
},
"response": []
},
{
"name": "Create Delegation",
"request": {
"method": "POST",
"header": [
{
"key": "Content-Type",
"name": "Content-Type",
"value": "application/json",
"type": "text"
}
],
"body": {
"mode": "raw",
"raw": "{\n\t\"name\": \"Head of Department\"\n}",
"options": {
"raw": {
"language": "json"
}
}
},
"url": {
"raw": "{{baseurl}}/management/delegations/",
"host": [
"{{baseurl}}"
],
"path": [
"management",
"delegations",
""
]
}
},
"response": []
},
{
"name": "Edit Delegation",
"request": {
"method": "PUT",
"header": [
{
"key": "Content-Type",
"name": "Content-Type",
"value": "application/json",
"type": "text"
}
],
"body": {
"mode": "raw",
"raw": "{\n\t\"name\": \"SOD/ODs\"\n}",
"options": {
"raw": {
"language": "json"
}
}
},
"url": {
"raw": "{{baseurl}}/management/delegations/DELEGATION-20191107-0000002/",
"host": [
"{{baseurl}}"
],
"path": [
"management",
"delegations",
"DELEGATION-20191107-0000002",
""
]
}
},
"response": []
},
{
"name": "Delete Delegation",
"request": {
"method": "DELETE",
"header": [],
"url": {
"raw": "{{baseurl}}/management/delegations/DELEGATION-20191107-0000001/",
"host": [
"{{baseurl}}"
],
"path": [
"management",
"delegations",
"DELEGATION-20191107-0000001",
""
]
}
},
"response": []
}
],
"protocolProfileBehavior": {},
"_postman_isSubFolder": true
} }
], ],
"protocolProfileBehavior": {}, "protocolProfileBehavior": {},
...@@ -1158,7 +1295,7 @@ ...@@ -1158,7 +1295,7 @@
"formdata": [ "formdata": [
{ {
"key": "username", "key": "username",
"value": "ryu", "value": "ob-rita",
"type": "text" "type": "text"
}, },
{ {
...@@ -1323,7 +1460,7 @@ ...@@ -1323,7 +1460,7 @@
"response": [] "response": []
}, },
{ {
"name": "Form Dashboard Copy", "name": "Form Dashboard w/ Filter",
"protocolProfileBehavior": { "protocolProfileBehavior": {
"disableBodyPruning": true "disableBodyPruning": true
}, },
...@@ -1499,66 +1636,6 @@ ...@@ -1499,66 +1636,6 @@
} }
}, },
"response": [] "response": []
},
{
"name": "Form History",
"protocolProfileBehavior": {
"disableBodyPruning": true
},
"request": {
"auth": {
"type": "oauth2",
"oauth2": [
{
"key": "accessToken",
"value": "cJeBxXT2KVtu7yPUQ5HlESDqTmss8G6m",
"type": "string"
},
{
"key": "tokenType",
"type": "any"
},
{
"key": "addTokenTo",
"value": "header",
"type": "string"
}
]
},
"method": "GET",
"header": [
{
"key": "Content-Type",
"name": "Content-Type",
"type": "text",
"value": "application/json"
}
],
"body": {
"mode": "raw",
"raw": ""
},
"url": {
"raw": "{{baseurl}}/change-request-service/form/FRM-20190823-0000002/history/?page=2",
"host": [
"{{baseurl}}"
],
"path": [
"change-request-service",
"form",
"FRM-20190823-0000002",
"history",
""
],
"query": [
{
"key": "page",
"value": "2"
}
]
}
},
"response": []
} }
], ],
"protocolProfileBehavior": {}, "protocolProfileBehavior": {},
...@@ -1581,7 +1658,7 @@ ...@@ -1581,7 +1658,7 @@
], ],
"body": { "body": {
"mode": "raw", "mode": "raw",
"raw": "{\r\n \"requested_to_template_name\": \"XXXXXXX\",\r\n \"requested_to_objective\": \"tesa\",\r\n \"requested_to_target_date\": \"2020-05-24T04:37:36.611000\",\r\n \"requested_to_priority\": \"Normal\",\r\n \"description\": \"test\",\r\n \"status\": \"Pending\",\r\n \"company_desc\": null,\r\n \"department_desc\": null,\r\n \"requested_desc\": null,\r\n \"requested_to_template_id\": \"test555\",\r\n \"requested_to_company\": \"COMPANY-20190923-0000001\",\r\n \"requested_to_department\": \"DEPARTMENT-20191004-0000026\",\r\n \"requested_to_user\": \"USER-20191004-0000087\",\r\n \"requested_by_user\": \"USER-20191004-0000087\",\r\n \"requested_by_department\": \"DEPARTMENT-20191004-0000026\",\r\n \"template_no\": \"TMP-20191004-0000044\",\r\n \"frm_approvers\": [\r\n \t{\r\n \"level\": 1,\r\n \"delegation\": \"Head of Department\",\r\n \"user\": \"USER-20191004-0000082\"\r\n \t}\r\n ],\r\n \"frm_stakes\": [],\r\n \"frm_attachments\": [],\r\n \"frm_details\": []\r\n}" "raw": "{\r\n \"requested_to_template_name\": \"XXXXXXX\",\r\n \"requested_to_objective\": \"tesa\",\r\n \"requested_to_target_date\": \"2020-05-24T04:37:36.611000\",\r\n \"requested_to_priority\": \"Normal\",\r\n \"description\": \"test\",\r\n \"status\": \"Pending\",\r\n \"company_desc\": null,\r\n \"department_desc\": null,\r\n \"requested_desc\": null,\r\n \"requested_to_template_id\": \"test555\",\r\n \"requested_to_company\": \"COMPANY-20191025-0000017\",\r\n \"requested_to_department\": \"DEPARTMENT-20191025-0000050\",\r\n \"requested_to_user\": \"USER-20191025-0000150\",\r\n \"requested_by_user\": \"USER-20191025-0000151\",\r\n \"requested_by_department\": \"DEPARTMENT-20191025-0000050\",\r\n \"template_no\": \"TMP-20191025-0000032\",\r\n \"frm_approvers\": [\r\n \t{\r\n \"level\": 1,\r\n \"delegation\": \"Head of Department\",\r\n \"user\": \"USER-20191025-0000149\"\r\n \t}\r\n ],\r\n \"frm_stakes\": [],\r\n \"frm_attachments\": [],\r\n \"frm_details\": []\r\n}"
}, },
"url": { "url": {
"raw": "{{baseurl}}/change-request/form-post/", "raw": "{{baseurl}}/change-request/form-post/",
...@@ -1603,26 +1680,7 @@ ...@@ -1603,26 +1680,7 @@
"method": "GET", "method": "GET",
"header": [], "header": [],
"url": { "url": {
"raw": "{{baseurl}}/change-request/form/", "raw": "{{baseurl}}/change-request/form/?company_requested_to=COMPANY-20191004-0000011&department_requested_to=DEPARTMENT-20191004-0000029&form_type=closed&date_modified_from=2019-10-11&date_modified_to=2019-10-11",
"host": [
"{{baseurl}}"
],
"path": [
"change-request",
"form",
""
]
}
},
"response": []
},
{
"name": "List of Forms Copy",
"request": {
"method": "GET",
"header": [],
"url": {
"raw": "{{baseurl}}/change-request/form/?date_modified_from=2019-10-11&date_modified_to=2019-10-11",
"host": [ "host": [
"{{baseurl}}" "{{baseurl}}"
], ],
...@@ -1634,18 +1692,15 @@ ...@@ -1634,18 +1692,15 @@
"query": [ "query": [
{ {
"key": "company_requested_to", "key": "company_requested_to",
"value": "COMPANY-20191004-0000011", "value": "COMPANY-20191004-0000011"
"disabled": true
}, },
{ {
"key": "department_requested_to", "key": "department_requested_to",
"value": "DEPARTMENT-20191004-0000029", "value": "DEPARTMENT-20191004-0000029"
"disabled": true
}, },
{ {
"key": "form_type", "key": "form_type",
"value": "closed", "value": "closed"
"disabled": true
}, },
{ {
"key": "date_modified_from", "key": "date_modified_from",
...@@ -1680,27 +1735,6 @@ ...@@ -1680,27 +1735,6 @@
}, },
"response": [] "response": []
}, },
{
"name": "Re Route for Approval",
"request": {
"method": "PATCH",
"header": [],
"url": {
"raw": "{{baseurl}}/change-request/form/FRM-20190930-0000035/re_route/",
"host": [
"{{baseurl}}"
],
"path": [
"change-request",
"form",
"FRM-20190930-0000035",
"re_route",
""
]
}
},
"response": []
},
{ {
"name": "Resubmit", "name": "Resubmit",
"request": { "request": {
...@@ -1736,7 +1770,7 @@ ...@@ -1736,7 +1770,7 @@
], ],
"body": { "body": {
"mode": "raw", "mode": "raw",
"raw": "{\r\n \"id\": 530,\r\n \"form_code\": \"FRM-20191017-0000135\",\r\n \"delegation\": \"Head of Department\",\r\n \"action\": \"Rejected\",\r\n \"level\": \"1\",\r\n \"remarks\": \"This is rejected by approver before vendor\"\r\n}", "raw": "{\r\n \"id\": 369,\r\n \"form_code\": \"FRM-20191025-0000041\",\r\n \"delegation\": \"Vendor/Implementor\",\r\n \"action\": \"Completed\",\r\n \"level\": \"2\",\r\n \"remarks\": \"\"\r\n}",
"options": { "options": {
"raw": { "raw": {
"language": "json" "language": "json"
...@@ -1947,14 +1981,14 @@ ...@@ -1947,14 +1981,14 @@
"raw": "" "raw": ""
}, },
"url": { "url": {
"raw": "{{baseurl}}/change-request/form/FRM-20191007-0000078/history/", "raw": "{{baseurl}}/change-request/form/FRM-20191025-0000040/history/",
"host": [ "host": [
"{{baseurl}}" "{{baseurl}}"
], ],
"path": [ "path": [
"change-request", "change-request",
"form", "form",
"FRM-20191007-0000078", "FRM-20191025-0000040",
"history", "history",
"" ""
] ]
...@@ -1976,7 +2010,7 @@ ...@@ -1976,7 +2010,7 @@
], ],
"body": { "body": {
"mode": "raw", "mode": "raw",
"raw": "{\r\n\t\"attachments\": [\r\n\t\t{\r\n\t\t\t\"id\": 2,\r\n\t\t\t\"attachment_type\": \"Before\",\r\n\t\t\t\"attachment_name\": \"we\",\r\n\t\t\t\"file_name\": \"logo_oneberry.png\",\r\n\t\t\t\"description\": \"we\",\r\n\t\t\t\"file_upload\": 140,\r\n\t\t\t\"uploaded_by\": \"USER-20191004-0000098\"\r\n\t\t},\r\n\t\t{\r\n\t\t\t\"attachment_type\": \"hello\",\r\n\t\t\t\"attachment_name\": \"hello name\",\r\n\t\t\t\"file_name\": \"logo_oneberry.png\",\r\n\t\t\t\"description\": \"hello desc\",\r\n\t\t\t\"file_upload\": 139,\r\n\t\t\t\"attachment_no\": \"\",\r\n\t\t\t\"date_uploaded\": \"\",\r\n\t\t\t\"file\": \"\",\r\n\t\t\t\"template_no\": \"\",\r\n\t\t\t\"upload_no\": \"\"\r\n\t\t}\r\n\t]\r\n}\r\n", "raw": "{\r\n\t\"attachments\": [\r\n\t\t{\r\n\t\t\t\"attachment_type\": \"Before\",\r\n\t\t\t\"attachment_name\": \"we\",\r\n\t\t\t\"file_name\": \"logo_oneberry.png\",\r\n\t\t\t\"description\": \"we\",\r\n\t\t\t\"file_upload\": 302,\r\n\t\t\t\"uploaded_by\": \"USER-20191004-0000098\"\r\n\t\t},\r\n\t\t{\r\n\t\t\t\"attachment_type\": \"hello\",\r\n\t\t\t\"attachment_name\": \"hello name\",\r\n\t\t\t\"file_name\": \"logo_oneberry.png\",\r\n\t\t\t\"description\": \"hello desc\",\r\n\t\t\t\"file_upload\": 63,\r\n\t\t\t\"attachment_no\": \"\",\r\n\t\t\t\"date_uploaded\": \"\",\r\n\t\t\t\"file\": \"\",\r\n\t\t\t\"template_no\": \"\",\r\n\t\t\t\"upload_no\": \"\"\r\n\t\t}\r\n\t]\r\n}\r\n",
"options": { "options": {
"raw": { "raw": {
"language": "json" "language": "json"
...@@ -1984,14 +2018,14 @@ ...@@ -1984,14 +2018,14 @@
} }
}, },
"url": { "url": {
"raw": "{{baseurl}}/change-request/form/FRM-20191004-0000072/file_upload/", "raw": "{{baseurl}}/change-request/form/FRM-20191029-0000171/file_upload/",
"host": [ "host": [
"{{baseurl}}" "{{baseurl}}"
], ],
"path": [ "path": [
"change-request", "change-request",
"form", "form",
"FRM-20191004-0000072", "FRM-20191029-0000171",
"file_upload", "file_upload",
"" ""
] ]
...@@ -2272,14 +2306,14 @@ ...@@ -2272,14 +2306,14 @@
"method": "GET", "method": "GET",
"header": [], "header": [],
"url": { "url": {
"raw": "{{baseurl}}/change-request/template/TMP-20191022-0000092/", "raw": "{{baseurl}}/change-request/template/TMP-20191025-0000032/",
"host": [ "host": [
"{{baseurl}}" "{{baseurl}}"
], ],
"path": [ "path": [
"change-request", "change-request",
"template", "template",
"TMP-20191022-0000092", "TMP-20191025-0000032",
"" ""
] ]
} }
...@@ -2805,7 +2839,7 @@ ...@@ -2805,7 +2839,7 @@
"raw": "" "raw": ""
}, },
"url": { "url": {
"raw": "{{baseurl}}/management/notifications/?account_no=USER-20190927-0000011", "raw": "{{baseurl}}/management/notifications/?account_no=USER-20191025-0000155&app=ams",
"host": [ "host": [
"{{baseurl}}" "{{baseurl}}"
], ],
...@@ -2817,7 +2851,11 @@ ...@@ -2817,7 +2851,11 @@
"query": [ "query": [
{ {
"key": "account_no", "key": "account_no",
"value": "USER-20190927-0000011" "value": "USER-20191025-0000155"
},
{
"key": "app",
"value": "ams"
} }
] ]
} }
...@@ -3070,6 +3108,25 @@ ...@@ -3070,6 +3108,25 @@
} }
}, },
"response": [] "response": []
},
{
"name": "List Asset Group",
"request": {
"method": "GET",
"header": [],
"url": {
"raw": "{{baseurl}}/asset-management/asset-group/",
"host": [
"{{baseurl}}"
],
"path": [
"asset-management",
"asset-group",
""
]
}
},
"response": []
} }
], ],
"protocolProfileBehavior": {}, "protocolProfileBehavior": {},
...@@ -3084,7 +3141,7 @@ ...@@ -3084,7 +3141,7 @@
"bearer": [ "bearer": [
{ {
"key": "token", "key": "token",
"value": "1e3ef7cc7a343b5fa0b54bd2d1699cfee6ca6afe", "value": "76b9d1a5c987488501f106346dee80e1dc4afeb1",
"type": "string" "type": "string"
} }
] ]
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment