Commit 43208a3b authored by Gladys Forte's avatar Gladys Forte

initial cr template api

parent 2f4006c7
...@@ -9,7 +9,7 @@ class ChangeRequestTemplatesSerializer( ...@@ -9,7 +9,7 @@ class ChangeRequestTemplatesSerializer(
class Meta: class Meta:
model = models.ChangeRequestTemplateHeader model = models.ChangeRequestTemplateHeader
fields = '__all__' fields = '__all__'
read_only_fields = ['created', 'deleted_at'] read_only_fields = ['created', 'deleted_at', 'template_no']
class ChangeRequestTemplateApproversSerializer( class ChangeRequestTemplateApproversSerializer(
...@@ -18,7 +18,7 @@ class ChangeRequestTemplateApproversSerializer( ...@@ -18,7 +18,7 @@ class ChangeRequestTemplateApproversSerializer(
class Meta: class Meta:
model = models.ChangeRequestTemplateApprovers model = models.ChangeRequestTemplateApprovers
fields = '__all__' fields = '__all__'
read_only_fields = ['created', 'deleted_at'] read_only_fields = ['created', 'deleted_at', 'code']
class ChangeRequestTemplateStakeHoldersSerializer( class ChangeRequestTemplateStakeHoldersSerializer(
...@@ -27,7 +27,7 @@ class ChangeRequestTemplateStakeHoldersSerializer( ...@@ -27,7 +27,7 @@ class ChangeRequestTemplateStakeHoldersSerializer(
class Meta: class Meta:
model = models.ChangeRequestTemplateStakeHolders model = models.ChangeRequestTemplateStakeHolders
fields = '__all__' fields = '__all__'
read_only_fields = ['created', 'deleted_at'] read_only_fields = ['created', 'deleted_at', 'code']
class ChangeRequestTemplateAttachmentsSerializer( class ChangeRequestTemplateAttachmentsSerializer(
...@@ -36,7 +36,7 @@ class ChangeRequestTemplateAttachmentsSerializer( ...@@ -36,7 +36,7 @@ class ChangeRequestTemplateAttachmentsSerializer(
class Meta: class Meta:
model = models.ChangeRequestTemplateAttachments model = models.ChangeRequestTemplateAttachments
fields = '__all__' fields = '__all__'
read_only_fields = ['created', 'deleted_at'] read_only_fields = ['created', 'deleted_at', 'code']
class ChangeRequestTemplateDetailsSerializer( class ChangeRequestTemplateDetailsSerializer(
......
from datetime import datetime
from django.db.models.functions import Lower
from functools import wraps
from django.conf import settings
import requests
from app.entities import models
from datetime import timedelta
from django.db.models import Q
from dateutil import parser
# EMAIL = settings.EMAIL
# ACCOUNTS = settings.ACCOUNTS
# GROUPS = settings.GROUPS
# COMPANIES = settings.COMPANIES
# ALLOWED_COMPANY = settings.ALLOWED_COMPANY
# CR_FRONT_LINK = settings.CR_FRONT_LINK
# NOTIFICATION = settings.NOTIFICATION
def get_group_details(group_no):
return requests.get(f'{GROUPS}?group_no={group_no}').json()['results'][0]
def get_companies_details(slug):
return requests.get(f'{COMPANIES}?slug={slug}').json()['results'][0]
def get_account_details(id_number):
return requests.get(f'{ACCOUNTS}?id_number={id_number}').json()['results'][0]
def get_allowed_company(id_number):
return requests.get(f'{ALLOWED_COMPANY}?id_number={id_number}')
class QuerySetHelper:
@staticmethod
def Sort(context):
sort_field = context.request.query_params.get('sort_field')
sort_order = context.request.query_params.get('sort_order')
if sort_field and sort_order:
if sort_order.lower() == 'asc':
context.queryset = context.queryset.order_by(sort_field)
else:
context.queryset = context.queryset.order_by(f"-{sort_field}")
return context.queryset
@staticmethod
def Search(context):
search_field = context.request.query_params.get('search-field')
search_key = context.request.query_params.get('search-key')
if search_field and search_key:
context.queryset = context.queryset(
__raw__={f"{search_field}" : {"$regex" : f".*{search_key.lower()}.*"}}
)
return context.queryset
@staticmethod
def SearchDynamic(base_queryset,
):
search_field = context.request.query_params.get('search-field')
search_key = context.request.query_params.get('search-key')
if search_field and search_key:
context.queryset = context.queryset(
__raw__={f"{search_field}" : {"$regex" : f".*{search_key.lower()}.*"}}
)
return context.queryset
# if self.request.query_params.get('search'):
# search_key = self.request.query_params.get('search')
# self.queryset = self.queryset.filter(
# Q(requested_to_template_name__icontains=search_key.lower()) |
# Q(requested_to_template_id__icontains=search_key.lower())
# )
# self.queryset = QuerySetHelper.Sort(self)
@staticmethod
def Filter(context):
if int(len(context.request.query_params)) > 0:
filtering_kwargs = {}
with_params = []
common_params = (
'page', 'page-size', 'page_size', 'sort_order', 'sort_field'
)
for field, value in context.request.GET.items():
filtering_kwargs = {}
if value and field.lower() not in common_params:
filtering_kwargs[field] = {"$regex" : f".*{value.lower()}.*"}
filtering_kwargs[field] = {"$regex" : f".*{value}.*"}
# filtering_kwargs[field] = {"$regex" : f".*{value.lower()}.*"}
with_params.append(filtering_kwargs)
raw_query = {"$or": with_params}
context.queryset = context.queryset(__raw__=raw_query)
return context.queryset
def ApproverStatus(status):
choices = ["pending", "rejected", "approved", "completed", "cancelled", 'acknowledged', 'accepted']
if status not in choices:
return False
else:
return True
def number_generator(prefix, id):
date = '{:%Y%m%d}'.format(datetime.now())
id_num = '{:07}'.format(id)
autogenerated_no = prefix + '-' + date + '-' + id_num
return autogenerated_no
def logged_user(self):
return self.request.META.get('HTTP_ACCOUNT_NO')
def receiver_body(
sender_account_no, receiver_account_no,
email_code, email_recipient,
app, sent, name, routing_level,
status, cr_number, cr_name,
company_requestedto,
department_requestedto,
priority_level, url
):
receiver_data = {
"sender_account_no": sender_account_no,
"receiver_account_no": receiver_account_no,
"email_code": email_code,
"email_recipient": email_recipient,
"app": app,
"sent": "False",
"name": name,
"routing_level": routing_level,
"status": status,
"cr_number": cr_number,
"cr_name": cr_name,
"company_requestedto": company_requestedto,
"department_requestedto": department_requestedto,
"priority_level": priority_level,
"url": url
}
return receiver_data
def get_template_instance(form_code):
template_instance = models.ChangeRequestFormHeader.objects.filter(
Q(form_code=form_code) &
Q(deleted_at=None)
).first()
return template_instance
def send_notification(
form_code, cr_number, user_id_number,
user_name, message, app,
sender_id_number, sender_name
):
notification_data = {
"slug": form_code,
"change_request_template_code": cr_number,
# (OPENING TAG) receiver credential
"account_no": user_id_number,
"user": user_name,
# (CLOSING TAG) receiver credential
"notif_type": "ACTIVITY",
"message": message,
"is_read": False,
"app": app,
"sender_account_no": sender_id_number,
"createdby": sender_name
}
notification = requests.post(NOTIFICATION, data=notification_data)
# return notification.status
return notification
def send_mail_vendor(receiver,
form_code,
delegation,
msg,
action,
code,
remarks,
routing_level):
app = 'cms'
cr_link = f'{CR_FRONT_LINK}/{form_code}'
template_instance = get_template_instance(form_code)
cr_number = template_instance.requested_to_template_id
template_name = template_instance.requested_to_template_name
requested_to_company = template_instance.requested_to_company
requested_to_department = template_instance.requested_to_department
requested_by_user = template_instance.requested_by_user
created = template_instance.created
requested_to_priority = template_instance.requested_to_priority
vendor_instance = models.ChangeRequestFormApprovers.objects.filter(
Q(delegation="Vendor/Implementor") &
Q(form_code=form_code)
).first()
# receiver details
vendor = get_account_details(vendor_instance.user)
requestor_name = vendor['name']
requestor_email = vendor['email']
requestor_account_id = vendor['id_number']
# sender details
sender_instance = get_account_details(receiver)
sender_account_username = sender_instance['username']
sender_account_id = sender_instance['id_number']
sender_name = sender_instance['name']
group = get_group_details(requested_to_department)
group_name = group['name']
company = get_companies_details(requested_to_company)
company_name = company['name']
container = receiver_body(
sender_account_id, requestor_account_id, code,
requestor_email, app, "False", requestor_name, routing_level,
action, cr_number, template_name, company_name, group_name,
requested_to_priority, cr_link
)
if action.lower() == 'rejected':
new_body = {"rejected_by": requestor_name,
"remarks": remarks}
elif action.lower() == 'accepted':
new_body = {"approved_by": requestor_name}
data = {**container, **new_body}
email_status = requests.post(EMAIL, data=data)
message = f"{sender_name} {msg} ({template_name})"
send_notification(
form_code, cr_number,
requestor_account_id, requestor_name,
message, app,
sender_account_id, sender_account_username
)
def send_mail_requestor(receiver,
form_code,
delegation,
msg,
action,
code,
remarks,
routing_level):
cr_link = f'{CR_FRONT_LINK}/{form_code}'
template_instance = get_template_instance(form_code)
app = 'cms'
cr_number = template_instance.requested_to_template_id
template_name = template_instance.requested_to_template_name
requested_to_company = template_instance.requested_to_company
requested_to_department = template_instance.requested_to_department
requested_by_user = template_instance.requested_by_user
created = template_instance.created
requested_to_priority = template_instance.requested_to_priority
# receiver details --------------------------------------------------
requestor_instance = get_account_details(requested_by_user)
requestor_name = requestor_instance['name']
requestor_email = requestor_instance['email']
requestor_account_id = requestor_instance['id_number']
# sender details --------------------------------------------------
sender_instance = get_account_details(receiver)
sender_account_username = sender_instance['username']
sender_account_id = sender_instance['id_number']
sender_name = sender_instance['name']
group = get_group_details(requested_to_department)
group_name = group['name']
company = get_companies_details(requested_to_company)
company_name = company['name']
data = receiver_body(
sender_account_id, requestor_account_id, code,
requestor_email, app, "False", requestor_name, routing_level,
action, cr_number, template_name, company_name, group_name,
requested_to_priority, cr_link
)
if action.lower() == 'approved':
new_body = {"approved_by": sender_name}
elif action.lower() == 'rejected':
new_body = {"rejected_by": sender_name,
"remarks": remarks}
elif action.lower() == 'completed':
new_body = {"completed_by": sender_name}
elif action.lower() == 'acknowledged':
new_body = {"acknowledge_by": sender_name}
data = {**data, **new_body}
email_status = requests.post(EMAIL, data=data)
message = f"{sender_name} {msg} ({template_name})"
notif = send_notification(
form_code, cr_number,
requestor_account_id, requestor_name,
message, app,
sender_account_id, sender_account_username
)
def next_appover_email(receiver, form_code, delegation, msg, action, code):
cr_link = f'{CR_FRONT_LINK}/{form_code}'
template_instance = get_template_instance(form_code)
app = 'cms'
cr_number = template_instance.requested_to_template_id
template_name = template_instance.requested_to_template_name
requested_to_company = template_instance.requested_to_company
requested_to_department = template_instance.requested_to_department
requested_by_user = template_instance.requested_by_user
created = template_instance.created
requested_to_priority = template_instance.requested_to_priority
# for rec in receiver:
# receiver details
# if action == 'initial':
receiver_instance = get_account_details(receiver)
# else:
# receiver_instance = get_account_details(receiver.user)
receiver_name = receiver_instance['name']
receiver_email = receiver_instance['email']
receiver_account_id = receiver_instance['id_number']
# sender details
sender_instance = get_account_details(requested_by_user)
sender_account_username = sender_instance['username']
sender_account_id = sender_instance['id_number']
sender_name = sender_instance['name']
group = get_group_details(requested_to_department)
group_name = group['name']
company = get_companies_details(requested_to_company)
company_name = company['name']
data = receiver_body(
sender_account_id, receiver_account_id, code,
receiver_email, app, "False", receiver_name, 1,
"Pending", cr_number, template_name, company_name, group_name,
requested_to_priority, cr_link
)
email_status = requests.post(EMAIL, data=data)
print(email_status)
print("next_appover 3")
message = f"{sender_name} {msg} ({template_name})"
notif = send_notification(
form_code, cr_number,
receiver_account_id, receiver_name,
message, app,
sender_account_id, sender_account_username
)
return True
def cancel_overdue(request):
date_submitted = datetime.now()
requestor = request.data['requested_by_user']
requestor = requests.get(f'{ACCOUNTS}{requestor}/')
requestor = requestor.json()['results']
cancel_date = date_submitted + timedelta(days=30)
cancel_date = cancel_date.strftime('%Y-%m-%d 00:00:00.000')
request.data['date_submitted'] = date_submitted
request.data['cancel_date'] = cancel_date
email_content_cancel = {
"sender_account_no": requestor['id_number'],
"receiver_account_no": requestor['id_number'],
"email_code": "RMS-CRCANCELLED",
"email_recipient": requestor['email'],
"app": "CMS",
"sent": "False",
"name": requestor['name'],
"status": "Pending",
"auto_cancel_date": cancel_date,
"cr_number": request.data['requested_to_template_id'],
"cr_name": request.data['requested_to_template_name'],
"company_requestedto": request.data['requested_to_company'],
"department_requestedto": request.data['requested_to_department'],
"priority_level": request.data['requested_to_priority'],
"url": "http://devweb.rms.oneberrysystem.com/login"
}
exist_cancel_template = models.CancelDateCR.objects.filter(
cr_number=request.data['requested_to_template_id']
)
if exist_cancel_template:
exist_cancel_template.delete()
models.CancelDateCR.objects.create(
cr_number=request.data['requested_to_template_id'],
trigger_date=cancel_date,
email_content=email_content_cancel
)
requested_to_target_date = parser.parse(
request.data['requested_to_target_date']
)
email_content_cancel['email_code'] = "RMS-CROVERDUE"
email_content_cancel['target_date'] = requested_to_target_date
overdue = requested_to_target_date + timedelta(days=30)
overdue = overdue.strftime('%Y-%m-%d 00:00:00.000')
models.TargetDateOverdue.objects.create(
cr_number=form_code,
trigger_date=overdue,
email_content=email_content_cancel
)
return True
from django.shortcuts import render from django.shortcuts import render
from rest_framework import viewsets as meviewsets from rest_framework import viewsets as meviewsets
from rest_framework.views import APIView
from app.applicationlayer.management.changerequest import serializers from app.applicationlayer.management.changerequest import serializers
from app.entities import models from app.entities import models
from app.applicationlayer import paginators from app.applicationlayer import paginators
from datetime import datetime from datetime import datetime
from datetime import timedelta
from rest_framework.response import Response from rest_framework.response import Response
from rest_framework import status, views
from rest_framework.decorators import action
from django.http import Http404 from django.http import Http404
from django.db.models import Q from django.db.models import Q
import requests import requests
from rest_framework.views import APIView from django.conf import settings
from rest_framework.exceptions import ValidationError
# from app.applicationlayer.management.changerequest.utilities import (
# logged_user, number_generator,
# QuerySetHelper, get_group_details,
# get_account_details, get_companies_details,
# cancel_overdue,
# send_mail_requestor, send_mail_vendor,
# get_allowed_company, next_appover_email
# )
class ChangeRequestTemplatesViewset(meviewsets.ModelViewSet):
queryset = models.ChangeRequestTemplateHeader.objects.all()
lookup_field = 'template_no'
serializer_class = serializers.ChangeRequestTemplatesSerializer
pagination_class = paginators.SimplePageNumberPagination
def list(self, request, *args, **kwargs):
self.queryset = self.queryset.filter(
deleted_at=None
)
self.queryset = self.queryset.order_by('-created')
return super(ChangeRequestTemplatesViewset, self).list(request)
def retrieve(self, request, *args, **kwargs):
instance = self.queryset.filter(
deleted_at=None,
template_no=str(self.kwargs.get('template_no'))
).first()
serializer = self.get_serializer(instance)
return Response(serializer.data)
def destroy(self, request, *args, **kwargs):
try:
# instance = self.get_object()
template_no = self.kwargs['template_no']
instance = models.ChangeRequestTemplateHeader.objects.filter(
Q(template_no=template_no) &
Q(deleted_at=None)
).update(deleted_at=datetime.utcnow())
return Response({"message": "Deleted"}, status=status.HTTP_200_OK)
except Exception as e:
return Response(e,
status=status.HTTP_500_INTERNAL_SERVER_ERROR)
def partial_update(self, request, *args, **kwargs):
try:
kwargs['partial'] = True
# instance = self.get_object()
template_no = self.kwargs['template_no']
instance = models.ChangeRequestTemplateHeader.objects.filter(
template_no=template_no
).order_by('-deleted_at')
instance.update(deleted_at=None)
message = "Archived Change Request restored"
return Response(message, status=status.HTTP_200_OK)
except Exception as e:
message = {
500, 'failed',
'Request was not able to process' + str(e), []
}
return Response(message,
status=status.HTTP_500_INTERNAL_SERVER_ERROR)
# @transaction.atomic
def create(self, request, *args, **kwargs):
serializer = self.get_serializer(data=request.data)
serializer.is_valid(raise_exception=True)
if not template_no.lower() == 'tmp':
print('not tmp')
form = request.data['template_no']
prefix = request.data['requested_to_template_id']
instance = models.ChangeRequestTemplateHeader.objects.filter(
Q(requested_to_template_id=prefix) &
Q(deleted_at=None)
).first()
if instance and instance.template_no != request.data['template_no']:
return Response(
{'message': "CR number prefix already exist"},
status=status.HTTP_400_BAD_REQUEST
)
else:
models.ChangeRequestTemplateHeader.objects.filter(
template_no=template_no
).update(
deleted_at=datetime.now()
)
models.ChangeRequestTemplateStakeHolders.objects.filter(
template_no=template_no
).update(
deleted_at=datetime.now()
)
models.ChangeRequestTemplateAttachments.objects.filter(
template_no=template_no
).update(
deleted_at=datetime.now()
)
models.ChangeRequestTemplateDetails.objects.filter(
template_no=template_no
).update(
deleted_at=datetime.now()
)
models.ChangeRequestTemplateApprovers.objects.filter(
template_no=template_no
).update(
deleted_at=datetime.now()
)
series = template_no
template_id = request.data['requested_to_template_id']
check_prefix = models.ChangeRequestTemplateHeader.objects.filter(
Q(requested_to_template_id=template_id) &
Q(deleted_at=None)
)
if check_prefix.count() > 0 and template_no.lower() == 'tmp':
return Response(
{'message': "CR number prefix already exist"},
status=status.HTTP_400_BAD_REQUEST
)
self.perform_create(serializer)
if template_no.lower() == 'tmp':
id = serializer.data['id']
db_counter = models.ChangeRequestTemplateHeader.objects.filter(
deleted_at=None
).count()
db_counter = db_counter + 2
db_counter = db_counter - 1
models.ChangeRequestTemplateHeader.objects.filter(id=id).update(
set__template_no=number_generator("TMP", db_counter)
)
series = number_generator("TMP", db_counter)
headers = self.get_success_headers(serializer.data)
return Response(
data={"code": series},
status=status.HTTP_201_CREATED, headers=headers
)
class ChangeRequestTemplatePost(APIView): class ChangeRequestTemplatePost(APIView):
# @transaction.atomic() # @transaction.atomic()
def post(self, request): def post(self, request):
visitor_info = request.data template_header = request.data
try: try:
data_list_inte = [] data_list_approver = []
data_list_anse = [] data_list_stake = []
data_list_attach = []
time = timezone.now()
template_header_data = {
data_log = { 'requested_to_template_name': template_header['requested_to_template_name'],
'title': visitor_info['title'], 'requested_to_template_id': template_header['requested_to_template_id'],
'first_name': visitor_info['first_name'], 'requested_to_objective': template_header['requested_to_objective'],
'last_name': visitor_info['last_name'], 'requested_to_target_date': template_header['requested_to_target_date'],
'badge_name': visitor_info['badge_name'], 'requested_to_priority': template_header['requested_to_priority'],
'jobtitle': visitor_info['jobtitle'], 'description': template_header['description'],
'email': visitor_info['email'], 'created_by_department': template_header['created_by_department'],
'telno': visitor_info['telno'], 'created_by_user': template_header['created_by_user'],
'mobileno': visitor_info['mobileno'], 'requested_to_company': template_header['requested_to_company'],
'pdpa_accepted': visitor_info['pdpa_accepted'], 'requested_to_department': template_header['requested_to_department'],
'qrcode': "None", 'requested_to_user': template_header['requested_to_user']
'reg_mode': 'STANDARD',
'reg_type': 'WALKIN',
'category': visitor_info['category'],
'created_at': time,
'updated_at': time
} }
add = visitor_info['address'] tmp_approvers = template_header['tmp_approvers']
comp = visitor_info['company'] tmp_stakes = template_header['tmp_stakes']
inte = visitor_info['interests'] tmp_attachments = template_header['tmp_attachments']
answer = visitor_info['survey_answers']
sp1 = transaction.savepoint() # nothing will save to db
# create visitorinfo # sp1 = transaction.savepoint() # nothing will save to db
serializer = VisitorsInfoSerializer(data=data_log)
serializer = serializers.ChangeRequestTemplatesSerializer(
data=template_header_data)
if serializer.is_valid(raise_exception=True): if serializer.is_valid(raise_exception=True):
serializer.save() serializer.save()
tmp_id = serializer.data['template_no']
x = serializer.data['visitor_id'] # create template approvers
print(x)
for tmp_approver in tmp_approvers:
add['visitor'] = x tmp_approver['template_no'] = tmp_id
add['created_at'] = time data_list_approver.append(tmp_approver)
add['updated_at'] = time
comp['visitor'] = x serializerApprover = serializers.ChangeRequestTemplateApproversSerializer(
comp['created_at'] = time data=data_list_approver, many=True)
comp['updated_at'] = time
if serializerApprover.is_valid(raise_exception=True):
# create visitoraddressinfo serializerApprover.save()
serializerAdd = VisitorsAddressInfoSerializer(data=add)
if serializerAdd.is_valid(raise_exception=True):
serializerAdd.save()
# create visitorcompanyinfo
serializerComp = VisitorsCompanyInfoSerializer(data=comp)
if serializerComp.is_valid(raise_exception=True):
serializerComp.save()
# create interest
for i in inte:
i['visitor'] = x
i['created_at'] = time
i['updated_at'] = time
data_list_inte.append(i)
# inte returns list of interest needs many=True
serializerInte = InterestSerializer(data=data_list_inte, many=True)
if serializerInte.is_valid(raise_exception=True):
serializerInte.save()
# create survey_answer
for a in answer:
a['visitor'] = x
a['created_at'] = time
a['updated_at'] = time
data_list_anse.append(a)
serializerAns = SurveyAnswerSerializer(data=data_list_anse,
many=True)
if serializerAns.is_valid(raise_exception=True):
serializerAns.save()
# create qr code
qrcode_formatted = qr_code_generator(visitor_info['first_name'],
visitor_info['last_name'],
visitor_info['title'],
add['company_name'],
visitor_info['telno'],
visitor_info['email'], x)
mystring = qrcode_formatted.replace('\n', '')
# print(mystring)
VisitorsInfo.objects.filter(
visitor_id=x).update(qrcode_vcard=qrcode_formatted,
qrcode=mystring)
# save qrdata with new line
get_qr_blob(qrcode_formatted, x)
# response data
res = []
response = {
'visitor_id': x,
'first_name': visitor_info['first_name'],
'last_name': visitor_info['last_name'],
'badge_name': visitor_info['badge_name'],
'jobtitle': visitor_info['jobtitle'],
'qrcode': mystring,
'position': comp['position'],
'company': add['company_name']
}
res.append(response) # create template stakes
for tmp_stake in tmp_stakes:
tmp_stake['template_no'] = tmp_id
data_list_stake.append(tmp_stake)
serializerStake = serializers.ChangeRequestTemplateStakeHoldersSerializer(
data=data_list_stake, many=True)
if serializerStake.is_valid(raise_exception=True):
serializerStake.save()
# create template attachments
for tmp_attachment in tmp_attachments:
tmp_attachment['template_no'] = tmp_id
data_list_attach.append(tmp_attachment)
serializerAttach = serializers.ChangeRequestTemplateAttachmentsSerializer(
data=data_list_attach, many=True)
if serializerAttach.is_valid(raise_exception=True):
serializerAttach.save()
message = { message = {
'code': 201, 'code': 201,
'status': 'success', 'status': 'success',
'message': 'Visitor information successfully registered.', 'message': 'Template Details successfully saved!',
'results': res 'results': serializer.data
} }
# remove this on master API
# perform syncing here
# thread = threading.Thread(target=upload_visitors_to_master())
# thread.daemon = True # Daemonize thread
# thread.start()
# print("Threaded: Sync Visitors")
return Response(message, status=status.HTTP_201_CREATED) return Response(message, status=status.HTTP_201_CREATED)
except ValidationError as e: except ValidationError as e:
transaction.savepoint_rollback(sp1) # transaction.savepoint_rollback(sp1)
message = { message = {
'code': 400, 'code': 400,
'status': 'failed', 'status': 'failed',
...@@ -167,11 +260,11 @@ class ChangeRequestTemplatePost(APIView): ...@@ -167,11 +260,11 @@ class ChangeRequestTemplatePost(APIView):
return Response(message, status=status.HTTP_400_BAD_REQUEST) return Response(message, status=status.HTTP_400_BAD_REQUEST)
except Exception as e: except Exception as e:
transaction.savepoint_rollback(sp1) # transaction.savepoint_rollback(sp1)
message = { message = {
'code': 500, 'code': 500,
'status': 'failed', 'status': 'failed',
'message': 'Request was not able to process' + str(e), 'message': 'Request was not able to process' + str(e),
} }
return Response(message, return Response(message,
status=status.HTTP_500_INTERNAL_SERVER_ERROR) status=status.HTTP_500_INTERNAL_SERVER_ERROR)
\ No newline at end of file
...@@ -43,4 +43,7 @@ class ChatConsumer(AsyncWebsocketConsumer): ...@@ -43,4 +43,7 @@ class ChatConsumer(AsyncWebsocketConsumer):
# Send message to WebSocket # Send message to WebSocket
await self.send(text_data=json.dumps({ await self.send(text_data=json.dumps({
'message': message 'message': message
})) }))
\ No newline at end of file
...@@ -6,6 +6,7 @@ from app.applicationlayer.management.department.views import DepartmentViewSet ...@@ -6,6 +6,7 @@ from app.applicationlayer.management.department.views import DepartmentViewSet
from app.applicationlayer.management.module.views import ModuleViewSet from app.applicationlayer.management.module.views import ModuleViewSet
# from app.applicationlayer.management.user.views import UsersManagementViewSet # from app.applicationlayer.management.user.views import UsersManagementViewSet
from app.applicationlayer.management.notification.views import NotificationsViewset from app.applicationlayer.management.notification.views import NotificationsViewset
from app.applicationlayer.management.changerequest import views as crviews
router = routers.DefaultRouter() router = routers.DefaultRouter()
...@@ -17,7 +18,21 @@ router.register(r'modules', ModuleViewSet) ...@@ -17,7 +18,21 @@ router.register(r'modules', ModuleViewSet)
# router.register(r'users', UsersManagementViewSet) # router.register(r'users', UsersManagementViewSet)
router.register(r'notifications', NotificationsViewset) router.register(r'notifications', NotificationsViewset)
router.register(r'template', crviews.ChangeRequestTemplatesViewset)
# router.register(r'template-approvers', crviews.ChangeRequestTemplateApproversViewset)
# router.register(r'template-stakeholders', crviews.ChangeRequestTemplateStakeHoldersViewset)
# router.register(r'template-attachments', crviews.ChangeRequestTemplateAttachmentsViewset)
# router.register(r'template-details', crviews.ChangeRequestTemplateDetailsViewset)
# router.register(r'form', crviews.ChangeRequestFormsViewset)
# router.register(r'form-approvers', crviews.ChangeRequestFormApproversViewset)
# router.register(r'form-stakeholders', crviews.ChangeRequestFormStakeHoldersViewset)
# router.register(r'form-attachments', crviews.ChangeRequestFormAttachmentsViewset)
# router.register(r'form-details', crviews.ChangeRequestFormDetailsViewset)
urlpatterns = ( urlpatterns = (
path('', include(router.urls)), path('', include(router.urls)),
path('template-post/', crviews.ChangeRequestTemplatePost.as_view()),
) )
# Generated by Django 2.2 on 2019-09-05 15:30
import datetime
from django.db import migrations, models
import django.utils.timezone
class Migration(migrations.Migration):
dependencies = [
('entities', '0006_auto_20190904_1855'),
]
operations = [
migrations.RemoveField(
model_name='changerequesttemplateapprovers',
name='action',
),
migrations.AddField(
model_name='changerequestformapprovers',
name='action',
field=models.CharField(blank=True, max_length=50, null=True),
),
migrations.AlterField(
model_name='changerequestformheader',
name='created',
field=models.DateTimeField(auto_now_add=True, default=django.utils.timezone.now),
preserve_default=False,
),
migrations.AlterField(
model_name='changerequesttemplateheader',
name='created',
field=models.DateTimeField(auto_now_add=True, default=datetime.datetime(2019, 9, 5, 15, 30, 4, 918778)),
preserve_default=False,
),
]
# Generated by Django 2.2 on 2019-09-05 16:02
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('entities', '0007_auto_20190905_1530'),
]
operations = [
migrations.RemoveField(
model_name='changerequesttemplateapprovers',
name='date_sent',
),
migrations.AddField(
model_name='changerequestformapprovers',
name='date_sent',
field=models.DateTimeField(blank=True, null=True),
),
]
# Generated by Django 2.2 on 2019-09-05 16:25
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('entities', '0008_auto_20190905_1602'),
]
operations = [
migrations.RemoveField(
model_name='changerequesttemplatestakeholders',
name='date_added',
),
]
# Generated by Django 2.2 on 2019-09-05 17:35
import datetime
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('entities', '0009_remove_changerequesttemplatestakeholders_date_added'),
]
operations = [
migrations.RenameField(
model_name='changerequestformattachments',
old_name='upload_no',
new_name='file_path',
),
migrations.RenameField(
model_name='changerequesttemplateattachments',
old_name='attachment_no',
new_name='code',
),
migrations.RenameField(
model_name='changerequesttemplateattachments',
old_name='upload_no',
new_name='file_path',
),
migrations.AlterField(
model_name='changerequestformattachments',
name='file_upload',
field=models.FileField(default=datetime.datetime(2019, 9, 5, 17, 35, 1, 41063), upload_to='uploads/'),
preserve_default=False,
),
migrations.AlterField(
model_name='changerequesttemplateattachments',
name='file_upload',
field=models.FileField(default=datetime.datetime(2019, 9, 5, 17, 35, 10, 500537), upload_to='uploads/'),
preserve_default=False,
),
]
# Generated by Django 2.2 on 2019-09-05 17:56
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('entities', '0010_auto_20190905_1735'),
]
operations = [
migrations.RemoveField(
model_name='changerequestformattachments',
name='file_path',
),
migrations.RemoveField(
model_name='changerequesttemplateattachments',
name='file_path',
),
migrations.AlterField(
model_name='changerequestformattachments',
name='file_upload',
field=models.FileField(blank=True, null=True, upload_to='uploads/'),
),
migrations.AlterField(
model_name='changerequesttemplateattachments',
name='file_upload',
field=models.FileField(blank=True, null=True, upload_to='uploads/'),
),
]
...@@ -371,9 +371,7 @@ class BaseHeader(models.Model): ...@@ -371,9 +371,7 @@ class BaseHeader(models.Model):
blank=True, blank=True,
null=True) null=True)
created = models.DateTimeField( created = models.DateTimeField(auto_now_add=True)
blank=True,
null=True)
deleted_at = models.DateTimeField( deleted_at = models.DateTimeField(
blank=True, blank=True,
...@@ -411,9 +409,6 @@ class BaseStakeholder(models.Model): ...@@ -411,9 +409,6 @@ class BaseStakeholder(models.Model):
User, User,
on_delete=models.DO_NOTHING, on_delete=models.DO_NOTHING,
to_field='code') to_field='code')
date_added = models.DateTimeField(
blank=True,
null=True)
delegation = models.CharField( delegation = models.CharField(
max_length=255, max_length=255,
blank=True, blank=True,
...@@ -430,10 +425,6 @@ class BaseStakeholder(models.Model): ...@@ -430,10 +425,6 @@ class BaseStakeholder(models.Model):
class BaseAttachment(models.Model): class BaseAttachment(models.Model):
upload_no = models.CharField(
max_length=255,
blank=True,
null=True)
attachment_type = models.CharField(max_length=255) attachment_type = models.CharField(max_length=255)
attachment_name = models.CharField(max_length=255) attachment_name = models.CharField(max_length=255)
...@@ -449,8 +440,8 @@ class BaseAttachment(models.Model): ...@@ -449,8 +440,8 @@ class BaseAttachment(models.Model):
User, User,
on_delete=models.DO_NOTHING, on_delete=models.DO_NOTHING,
to_field='code') to_field='code')
file_upload = models.CharField( file_upload = models.FileField(
max_length=255, upload_to='uploads/',
blank=True, blank=True,
null=True) null=True)
created = models.DateTimeField( created = models.DateTimeField(
...@@ -507,10 +498,17 @@ class ChangeRequestTemplateHeader(BaseHeader): ...@@ -507,10 +498,17 @@ class ChangeRequestTemplateHeader(BaseHeader):
class Meta: class Meta:
db_table = 'change_request_template_headers' db_table = 'change_request_template_headers'
def __str__(self):
return f'{self.requested_to_template_name}'
def save(self, *args, **kwargs): def save(self, *args, **kwargs):
super(ChangeRequestTemplateHeader, self).save(*args, **kwargs) super(ChangeRequestTemplateHeader, self).save(*args, **kwargs)
code = number_generator(enums.GenerateCode.TEMPLATE.value, self.id) code = number_generator(enums.GenerateCode.TEMPLATE.value, self.id)
ChangeRequestTemplateHeader.objects.filter(id=self.id).update(template_no=code) # ChangeRequestTemplateHeader.objects.filter(id=self.id).update(template_no=code)
if self.template_no == '':
self.template_no = code
self.save()
def delete(self): def delete(self):
self.deleted_at = datetime.utcnow self.deleted_at = datetime.utcnow
...@@ -526,13 +524,6 @@ class ChangeRequestTemplateApprovers(BaseApprover): ...@@ -526,13 +524,6 @@ class ChangeRequestTemplateApprovers(BaseApprover):
on_delete=models.DO_NOTHING, on_delete=models.DO_NOTHING,
to_field='template_no', to_field='template_no',
related_name='tmp_approvers') related_name='tmp_approvers')
date_sent = models.DateTimeField(
blank=True,
null=True)
action = models.CharField(
max_length=50,
blank=True,
null=True)
class Meta: class Meta:
db_table = 'change_request_template_approvers' db_table = 'change_request_template_approvers'
...@@ -540,10 +531,12 @@ class ChangeRequestTemplateApprovers(BaseApprover): ...@@ -540,10 +531,12 @@ class ChangeRequestTemplateApprovers(BaseApprover):
def save(self, *args, **kwargs): def save(self, *args, **kwargs):
super(ChangeRequestTemplateApprovers, self).save(*args, **kwargs) super(ChangeRequestTemplateApprovers, self).save(*args, **kwargs)
code = number_generator(enums.GenerateCode.TMP_APPROVER.value, self.id) code = number_generator(enums.GenerateCode.TMP_APPROVER.value, self.id)
ChangeRequestTemplateApprovers.objects.filter(id=self.id).update(code=code) # ChangeRequestTemplateApprovers.objects.filter(id=self.id).update(code=code)
pass
if self.code == '':
self.code = code
self.created = datetime.now()
self.save()
class ChangeRequestTemplateStakeHolders(BaseStakeholder): class ChangeRequestTemplateStakeHolders(BaseStakeholder):
code = models.CharField( code = models.CharField(
...@@ -554,20 +547,23 @@ class ChangeRequestTemplateStakeHolders(BaseStakeholder): ...@@ -554,20 +547,23 @@ class ChangeRequestTemplateStakeHolders(BaseStakeholder):
on_delete=models.DO_NOTHING, on_delete=models.DO_NOTHING,
to_field='template_no', to_field='template_no',
related_name='tmp_stakes') related_name='tmp_stakes')
class Meta: class Meta:
db_table = 'change_request_template_stakeholders' db_table = 'change_request_template_stakeholders'
def save(self, *args, **kwargs): def save(self, *args, **kwargs):
super(ChangeRequestTemplateStakeHolders, self).save(*args, **kwargs) super(ChangeRequestTemplateStakeHolders, self).save(*args, **kwargs)
code = number_generator(enums.GenerateCode.TMP_STAKE.value, self.id) code = number_generator(enums.GenerateCode.TMP_STAKE.value, self.id)
ChangeRequestTemplateStakeHolders.objects.filter(id=self.id).update(code=code) # ChangeRequestTemplateStakeHolders.objects.filter(id=self.id).update(code=code)
pass if self.code == '':
self.code = code
self.created = datetime.now()
self.save()
class ChangeRequestTemplateAttachments(BaseAttachment): class ChangeRequestTemplateAttachments(BaseAttachment):
attachment_no = models.CharField( code = models.CharField(
max_length=255, max_length=255,
unique=True) unique=True)
template_no = models.ForeignKey( template_no = models.ForeignKey(
...@@ -582,9 +578,12 @@ class ChangeRequestTemplateAttachments(BaseAttachment): ...@@ -582,9 +578,12 @@ class ChangeRequestTemplateAttachments(BaseAttachment):
def save(self, *args, **kwargs): def save(self, *args, **kwargs):
super(ChangeRequestTemplateAttachments, self).save(*args, **kwargs) super(ChangeRequestTemplateAttachments, self).save(*args, **kwargs)
code = number_generator(enums.GenerateCode.TMP_ATTACH.value, self.id) code = number_generator(enums.GenerateCode.TMP_ATTACH.value, self.id)
ChangeRequestTemplateAttachments.objects.filter(id=self.id).update(attachment_no=code) # ChangeRequestTemplateAttachments.objects.filter(id=self.id).update(attachment_no=code)
pass if self.code == '':
self.code = code
self.created = datetime.now()
self.save()
class ChangeRequestTemplateDetails(BaseDetails): class ChangeRequestTemplateDetails(BaseDetails):
...@@ -603,9 +602,12 @@ class ChangeRequestTemplateDetails(BaseDetails): ...@@ -603,9 +602,12 @@ class ChangeRequestTemplateDetails(BaseDetails):
def save(self, *args, **kwargs): def save(self, *args, **kwargs):
super(ChangeRequestTemplateDetails, self).save(*args, **kwargs) super(ChangeRequestTemplateDetails, self).save(*args, **kwargs)
code = number_generator(enums.GenerateCode.TMP_DETAIL.value, self.id) code = number_generator(enums.GenerateCode.TMP_DETAIL.value, self.id)
ChangeRequestTemplateDetails.objects.filter(id=self.id).update(code=code) # ChangeRequestTemplateDetails.objects.filter(id=self.id).update(code=code)
pass if self.code == '':
self.code = code
self.created = datetime.now()
self.save()
''' '''
***** *****
...@@ -675,6 +677,13 @@ class ChangeRequestFormApprovers(BaseApprover): ...@@ -675,6 +677,13 @@ class ChangeRequestFormApprovers(BaseApprover):
max_length=255, max_length=255,
null=True, null=True,
blank=True) blank=True)
action = models.CharField(
max_length=50,
blank=True,
null=True)
date_sent = models.DateTimeField(
blank=True,
null=True)
class Meta: class Meta:
db_table = 'change_request_form_approvers' db_table = 'change_request_form_approvers'
...@@ -717,6 +726,9 @@ class ChangeRequestFormStakeHolders(BaseStakeholder): ...@@ -717,6 +726,9 @@ class ChangeRequestFormStakeHolders(BaseStakeholder):
on_delete=models.DO_NOTHING, on_delete=models.DO_NOTHING,
to_field='form_code', to_field='form_code',
related_name='frm_stakes') related_name='frm_stakes')
date_added = models.DateTimeField(
blank=True,
null=True)
class Meta: class Meta:
db_table = 'change_request_form_stakeholders' db_table = 'change_request_form_stakeholders'
......
...@@ -28,4 +28,6 @@ urlpatterns = [ ...@@ -28,4 +28,6 @@ urlpatterns = [
url(r'^chat/$', notifview.index, name='index'), url(r'^chat/$', notifview.index, name='index'),
url(r'^chat/(?P<room_name>[^/]+)/$', notifview.room, name='room'), url(r'^chat/(?P<room_name>[^/]+)/$', notifview.room, name='room'),
] ]
{"_id":{"$oid":"5d41f222ce12462bb01a9bbf"},"level":"2","user":"Acct-20190613-0000019","date_sent":null,"action":null,"delegation":"Approver","created_at":{"$date":{"$numberLong":"1564631555517"}},"deleted_at":{"$date":{"$numberLong":"1564631757299"}},"form_code":"FRM-20190801-0000002"}
{"_id":{"$oid":"5d41f222ce12462bb01a9bc0"},"level":"1","user":"Acct-20190603-0000003","date_sent":null,"action":null,"delegation":"Mandatory Approver","created_at":{"$date":{"$numberLong":"1564631555517"}},"deleted_at":{"$date":{"$numberLong":"1564631757299"}},"form_code":"FRM-20190801-0000002"}
{"_id":{"$oid":"5d41f222ce12462bb01a9bc1"},"level":"4","user":"Acct-20190531-0000002","date_sent":null,"action":null,"delegation":"Vendor/Implementor","created_at":{"$date":{"$numberLong":"1564631555517"}},"deleted_at":null,"form_code":"FRM-20190801-0000002"}
{"_id":{"$oid":"5d41f222ce12462bb01a9bc2"},"level":"3","user":"Acct-20190529-0000001","date_sent":null,"action":null,"delegation":"Vendor/Implementor","created_at":{"$date":{"$numberLong":"1564631555517"}},"deleted_at":{"$date":{"$numberLong":"1564631757299"}},"form_code":"FRM-20190801-0000002"}
{"_id":{"$oid":"5d41f24cce12462bb01a9bcf"},"level":"1","user":"Acct-20190603-0000003","date_sent":null,"action":"Rejected","delegation":"Mandatory Approver","created_at":{"$date":{"$numberLong":"1564631555517"}},"deleted_at":{"$date":{"$numberLong":"1564631757299"}},"form_code":"FRM-20190801-0000002"}
{"_id":{"$oid":"5d41f24dce12462bb01a9bd2"},"level":"2","user":"Acct-20190613-0000019","date_sent":null,"action":null,"delegation":"Approver","created_at":{"$date":{"$numberLong":"1564631555517"}},"deleted_at":null,"form_code":"FRM-20190801-0000002"}
{"_id":{"$oid":"5d41f24dce12462bb01a9bd3"},"level":"1","user":"Acct-20190603-0000003","date_sent":null,"action":"Rejected","delegation":"Mandatory Approver","created_at":{"$date":{"$numberLong":"1564631555517"}},"deleted_at":null,"form_code":"FRM-20190801-0000002"}
{"_id":{"$oid":"5d41f24dce12462bb01a9bd4"},"level":"3","user":"Acct-20190529-0000001","date_sent":null,"action":null,"delegation":"Vendor/Implementor","created_at":{"$date":{"$numberLong":"1564631555517"}},"deleted_at":null,"form_code":"FRM-20190801-0000002"}
{"_id":{"$oid":"5d41f24dce12462bb01a9bd5"},"level":"4","user":"Acct-20190531-0000002","date_sent":null,"action":null,"delegation":"Requestor","created_at":{"$date":{"$numberLong":"1564631555517"}},"deleted_at":null,"form_code":"FRM-20190801-0000002"}
{"_id":{"$oid":"5d41f378ce12462bb01a9be3"},"level":"2","user":"Acct-20190613-0000019","date_sent":null,"action":null,"delegation":"Approver","created_at":{"$date":{"$numberLong":"1564631555517"}},"deleted_at":{"$date":{"$numberLong":"1564633127927"}},"form_code":"FRM-20190801-0000003"}
{"_id":{"$oid":"5d41f378ce12462bb01a9be4"},"level":"4","user":"Acct-20190531-0000002","date_sent":null,"action":null,"delegation":"Requestor","created_at":{"$date":{"$numberLong":"1564631555517"}},"deleted_at":{"$date":{"$numberLong":"1564633127927"}},"form_code":"FRM-20190801-0000003"}
{"_id":{"$oid":"5d41f378ce12462bb01a9be5"},"level":"1","user":"Acct-20190603-0000003","date_sent":null,"action":null,"delegation":"Mandatory Approver","created_at":{"$date":{"$numberLong":"1564631555517"}},"deleted_at":{"$date":{"$numberLong":"1564633127927"}},"form_code":"FRM-20190801-0000003"}
{"_id":{"$oid":"5d41f378ce12462bb01a9be6"},"level":"3","user":"Acct-20190529-0000001","date_sent":null,"action":null,"delegation":"Vendor/Implementor","created_at":{"$date":{"$numberLong":"1564631555517"}},"deleted_at":{"$date":{"$numberLong":"1564633127927"}},"form_code":"FRM-20190801-0000003"}
{"_id":{"$oid":"5d41f3e3ce12462bb01a9bf3"},"level":"1","user":"Acct-20190603-0000003","date_sent":null,"action":"Approved","delegation":"Mandatory Approver","created_at":{"$date":{"$numberLong":"1564631555517"}},"deleted_at":{"$date":{"$numberLong":"1564633127927"}},"form_code":"FRM-20190801-0000003"}
{"_id":{"$oid":"5d41f430ce12462bb01a9bf5"},"level":"2","user":"Acct-20190613-0000019","date_sent":null,"action":"Approved","delegation":"Approver","created_at":{"$date":{"$numberLong":"1564631555517"}},"deleted_at":{"$date":{"$numberLong":"1564633127927"}},"form_code":"FRM-20190801-0000003"}
{"_id":{"$oid":"5d41f431ce12462bb01a9bf8"},"level":"3","user":"Acct-20190529-0000001","date_sent":null,"action":null,"delegation":"Vendor/Implementor","created_at":{"$date":{"$numberLong":"1564631555517"}},"deleted_at":{"$date":{"$numberLong":"1564633127927"}},"form_code":"FRM-20190801-0000003"}
{"_id":{"$oid":"5d41f431ce12462bb01a9bf9"},"level":"4","user":"Acct-20190531-0000002","date_sent":null,"action":null,"delegation":"Requestor","created_at":{"$date":{"$numberLong":"1564631555517"}},"deleted_at":{"$date":{"$numberLong":"1564633127927"}},"form_code":"FRM-20190801-0000003"}
{"_id":{"$oid":"5d41f431ce12462bb01a9bfa"},"level":"2","user":"Acct-20190613-0000019","date_sent":null,"action":"Approved","delegation":"Approver","created_at":{"$date":{"$numberLong":"1564631555517"}},"deleted_at":{"$date":{"$numberLong":"1564633127927"}},"form_code":"FRM-20190801-0000003"}
{"_id":{"$oid":"5d41f431ce12462bb01a9bfb"},"level":"1","user":"Acct-20190603-0000003","date_sent":null,"action":"Approved","delegation":"Mandatory Approver","created_at":{"$date":{"$numberLong":"1564631555517"}},"deleted_at":{"$date":{"$numberLong":"1564633127927"}},"form_code":"FRM-20190801-0000003"}
{"_id":{"$oid":"5d41f7a6ce12462bb01a9c08"},"level":"3","user":"Acct-20190529-0000001","date_sent":null,"action":"Approved","delegation":"Vendor/Implementor","created_at":{"$date":{"$numberLong":"1564631555517"}},"deleted_at":{"$date":{"$numberLong":"1564633127927"}},"form_code":"FRM-20190801-0000003"}
{"_id":{"$oid":"5d41f7a8ce12462bb01a9c0b"},"level":"1","user":"Acct-20190603-0000003","date_sent":null,"action":"Approved","delegation":"Mandatory Approver","created_at":{"$date":{"$numberLong":"1564631555517"}},"deleted_at":null,"form_code":"FRM-20190801-0000003"}
{"_id":{"$oid":"5d41f7a8ce12462bb01a9c0c"},"level":"3","user":"Acct-20190529-0000001","date_sent":null,"action":"Approved","delegation":"Vendor/Implementor","created_at":{"$date":{"$numberLong":"1564631555517"}},"deleted_at":null,"form_code":"FRM-20190801-0000003"}
{"_id":{"$oid":"5d41f7a8ce12462bb01a9c0d"},"level":"2","user":"Acct-20190613-0000019","date_sent":null,"action":"Approved","delegation":"Approver","created_at":{"$date":{"$numberLong":"1564631555517"}},"deleted_at":null,"form_code":"FRM-20190801-0000003"}
{"_id":{"$oid":"5d41f7a8ce12462bb01a9c0e"},"level":"4","user":"Acct-20190531-0000002","date_sent":null,"action":null,"delegation":"Requestor","created_at":{"$date":{"$numberLong":"1564631555517"}},"deleted_at":null,"form_code":"FRM-20190801-0000003"}
{"_id":{"$oid":"5d41f89ace12462bb01a9c1c"},"level":"2","user":"Acct-20190613-0000019","date_sent":null,"action":null,"delegation":"Approver","created_at":{"$date":{"$numberLong":"1564631555517"}},"deleted_at":{"$date":{"$numberLong":"1564634249692"}},"form_code":"FRM-20190801-0000006"}
{"_id":{"$oid":"5d41f89ace12462bb01a9c1d"},"level":"3","user":"Acct-20190529-0000001","date_sent":null,"action":null,"delegation":"Vendor/Implementor","created_at":{"$date":{"$numberLong":"1564631555517"}},"deleted_at":{"$date":{"$numberLong":"1564634249692"}},"form_code":"FRM-20190801-0000006"}
{"_id":{"$oid":"5d41f89ace12462bb01a9c1e"},"level":"1","user":"Acct-20190603-0000003","date_sent":null,"action":null,"delegation":"Mandatory Approver","created_at":{"$date":{"$numberLong":"1564631555517"}},"deleted_at":{"$date":{"$numberLong":"1564634249692"}},"form_code":"FRM-20190801-0000006"}
{"_id":{"$oid":"5d41f89ace12462bb01a9c1f"},"level":"4","user":"Acct-20190531-0000002","date_sent":null,"action":null,"delegation":"Requestor","created_at":{"$date":{"$numberLong":"1564631555517"}},"deleted_at":{"$date":{"$numberLong":"1564634249692"}},"form_code":"FRM-20190801-0000006"}
{"_id":{"$oid":"5d41f8b0ce12462bb01a9c2c"},"level":"1","user":"Acct-20190603-0000003","date_sent":null,"action":"Approved","delegation":"Mandatory Approver","created_at":{"$date":{"$numberLong":"1564631555517"}},"deleted_at":{"$date":{"$numberLong":"1564634249692"}},"form_code":"FRM-20190801-0000006"}
{"_id":{"$oid":"5d41f8cfce12462bb01a9c2e"},"level":"2","user":"Acct-20190613-0000019","date_sent":null,"action":"Approved","delegation":"Approver","created_at":{"$date":{"$numberLong":"1564631555517"}},"deleted_at":{"$date":{"$numberLong":"1564634249692"}},"form_code":"FRM-20190801-0000006"}
{"_id":{"$oid":"5d41f8d1ce12462bb01a9c31"},"level":"1","user":"Acct-20190603-0000003","date_sent":null,"action":"Approved","delegation":"Mandatory Approver","created_at":{"$date":{"$numberLong":"1564631555517"}},"deleted_at":{"$date":{"$numberLong":"1564634249692"}},"form_code":"FRM-20190801-0000006"}
{"_id":{"$oid":"5d41f8d1ce12462bb01a9c32"},"level":"4","user":"Acct-20190531-0000002","date_sent":null,"action":null,"delegation":"Requestor","created_at":{"$date":{"$numberLong":"1564631555517"}},"deleted_at":{"$date":{"$numberLong":"1564634249692"}},"form_code":"FRM-20190801-0000006"}
{"_id":{"$oid":"5d41f8d1ce12462bb01a9c33"},"level":"3","user":"Acct-20190529-0000001","date_sent":null,"action":null,"delegation":"Vendor/Implementor","created_at":{"$date":{"$numberLong":"1564631555517"}},"deleted_at":{"$date":{"$numberLong":"1564634249692"}},"form_code":"FRM-20190801-0000006"}
{"_id":{"$oid":"5d41f8d1ce12462bb01a9c34"},"level":"2","user":"Acct-20190613-0000019","date_sent":null,"action":"Approved","delegation":"Approver","created_at":{"$date":{"$numberLong":"1564631555517"}},"deleted_at":{"$date":{"$numberLong":"1564634249692"}},"form_code":"FRM-20190801-0000006"}
{"_id":{"$oid":"5d41f942ce12462bb01a9c41"},"level":"3","user":"Acct-20190529-0000001","date_sent":null,"action":"Acknowledged","delegation":"Vendor/Implementor","created_at":{"$date":{"$numberLong":"1564631555517"}},"deleted_at":{"$date":{"$numberLong":"1564634249692"}},"form_code":"FRM-20190801-0000006"}
{"_id":{"$oid":"5d41fb10ce12462bb01a9c43"},"level":"3","user":"Acct-20190529-0000001","date_sent":null,"action":"Completed","delegation":"Vendor/Implementor","created_at":{"$date":{"$numberLong":"1564631555517"}},"deleted_at":{"$date":{"$numberLong":"1564634249692"}},"form_code":"FRM-20190801-0000006"}
{"_id":{"$oid":"5d41fb11ce12462bb01a9c46"},"level":"1","user":"Acct-20190603-0000003","date_sent":null,"action":"Approved","delegation":"Mandatory Approver","created_at":{"$date":{"$numberLong":"1564631555517"}},"deleted_at":{"$date":{"$numberLong":"1564634249692"}},"form_code":"FRM-20190801-0000006"}
{"_id":{"$oid":"5d41fb11ce12462bb01a9c47"},"level":"3","user":"Acct-20190529-0000001","date_sent":null,"action":"Completed","delegation":"Vendor/Implementor","created_at":{"$date":{"$numberLong":"1564631555517"}},"deleted_at":{"$date":{"$numberLong":"1564634249692"}},"form_code":"FRM-20190801-0000006"}
{"_id":{"$oid":"5d41fb11ce12462bb01a9c48"},"level":"4","user":"Acct-20190531-0000002","date_sent":null,"action":null,"delegation":"Requestor","created_at":{"$date":{"$numberLong":"1564631555517"}},"deleted_at":{"$date":{"$numberLong":"1564634249692"}},"form_code":"FRM-20190801-0000006"}
{"_id":{"$oid":"5d41fb11ce12462bb01a9c49"},"level":"2","user":"Acct-20190613-0000019","date_sent":null,"action":"Approved","delegation":"Approver","created_at":{"$date":{"$numberLong":"1564631555517"}},"deleted_at":{"$date":{"$numberLong":"1564634249692"}},"form_code":"FRM-20190801-0000006"}
{"_id":{"$oid":"5d41fc09ce12462bb01a9c56"},"level":"4","user":"Acct-20190531-0000002","date_sent":null,"action":"Accepted","delegation":"Requestor","created_at":{"$date":{"$numberLong":"1564631555517"}},"deleted_at":{"$date":{"$numberLong":"1564634249692"}},"form_code":"FRM-20190801-0000006"}
{"_id":{"$oid":"5d41fc09ce12462bb01a9c58"},"level":"3","user":"Acct-20190529-0000001","date_sent":null,"action":"Completed","delegation":"Vendor/Implementor","created_at":{"$date":{"$numberLong":"1564631555517"}},"deleted_at":null,"form_code":"FRM-20190801-0000006"}
{"_id":{"$oid":"5d41fc09ce12462bb01a9c59"},"level":"1","user":"Acct-20190603-0000003","date_sent":null,"action":"Approved","delegation":"Mandatory Approver","created_at":{"$date":{"$numberLong":"1564631555517"}},"deleted_at":null,"form_code":"FRM-20190801-0000006"}
{"_id":{"$oid":"5d41fc09ce12462bb01a9c5a"},"level":"4","user":"Acct-20190531-0000002","date_sent":null,"action":"Accepted","delegation":"Requestor","created_at":{"$date":{"$numberLong":"1564631555517"}},"deleted_at":null,"form_code":"FRM-20190801-0000006"}
{"_id":{"$oid":"5d41fc09ce12462bb01a9c5b"},"level":"2","user":"Acct-20190613-0000019","date_sent":null,"action":"Approved","delegation":"Approver","created_at":{"$date":{"$numberLong":"1564631555517"}},"deleted_at":null,"form_code":"FRM-20190801-0000006"}
{"_id":{"$oid":"5d41fc6fce12462bb01a9c69"},"level":"2","user":"Acct-20190613-0000019","date_sent":null,"action":null,"delegation":"Approver","created_at":{"$date":{"$numberLong":"1564631555517"}},"deleted_at":{"$date":{"$numberLong":"1564634491063"}},"form_code":"FRM-20190801-0000010"}
{"_id":{"$oid":"5d41fc6fce12462bb01a9c6a"},"level":"1","user":"Acct-20190603-0000003","date_sent":null,"action":null,"delegation":"Mandatory Approver","created_at":{"$date":{"$numberLong":"1564631555517"}},"deleted_at":{"$date":{"$numberLong":"1564634491063"}},"form_code":"FRM-20190801-0000010"}
{"_id":{"$oid":"5d41fc6fce12462bb01a9c6b"},"level":"4","user":"Acct-20190531-0000002","date_sent":null,"action":null,"delegation":"Requestor","created_at":{"$date":{"$numberLong":"1564631555517"}},"deleted_at":{"$date":{"$numberLong":"1564634491063"}},"form_code":"FRM-20190801-0000010"}
{"_id":{"$oid":"5d41fc6fce12462bb01a9c6c"},"level":"3","user":"Acct-20190529-0000001","date_sent":null,"action":null,"delegation":"Vendor/Implementor","created_at":{"$date":{"$numberLong":"1564631555517"}},"deleted_at":{"$date":{"$numberLong":"1564634491063"}},"form_code":"FRM-20190801-0000010"}
{"_id":{"$oid":"5d41fc7ece12462bb01a9c79"},"level":"1","user":"Acct-20190603-0000003","date_sent":null,"action":"Approved","delegation":"Mandatory Approver","created_at":{"$date":{"$numberLong":"1564631555517"}},"deleted_at":{"$date":{"$numberLong":"1564634491063"}},"form_code":"FRM-20190801-0000010"}
{"_id":{"$oid":"5d41fc9dce12462bb01a9c7b"},"level":"2","user":"Acct-20190613-0000019","date_sent":null,"action":"Approved","delegation":"Approver","created_at":{"$date":{"$numberLong":"1564631555517"}},"deleted_at":{"$date":{"$numberLong":"1564634491063"}},"form_code":"FRM-20190801-0000010"}
{"_id":{"$oid":"5d41fc9ece12462bb01a9c7f"},"level":"1","user":"Acct-20190603-0000003","date_sent":null,"action":"Approved","delegation":"Mandatory Approver","created_at":{"$date":{"$numberLong":"1564631555517"}},"deleted_at":{"$date":{"$numberLong":"1564634491063"}},"form_code":"FRM-20190801-0000010"}
{"_id":{"$oid":"5d41fc9ece12462bb01a9c7e"},"level":"3","user":"Acct-20190529-0000001","date_sent":null,"action":null,"delegation":"Vendor/Implementor","created_at":{"$date":{"$numberLong":"1564631555517"}},"deleted_at":{"$date":{"$numberLong":"1564634491063"}},"form_code":"FRM-20190801-0000010"}
{"_id":{"$oid":"5d41fc9ece12462bb01a9c80"},"level":"4","user":"Acct-20190531-0000002","date_sent":null,"action":null,"delegation":"Requestor","created_at":{"$date":{"$numberLong":"1564631555517"}},"deleted_at":{"$date":{"$numberLong":"1564634491063"}},"form_code":"FRM-20190801-0000010"}
{"_id":{"$oid":"5d41fc9ece12462bb01a9c81"},"level":"2","user":"Acct-20190613-0000019","date_sent":null,"action":"Approved","delegation":"Approver","created_at":{"$date":{"$numberLong":"1564631555517"}},"deleted_at":{"$date":{"$numberLong":"1564634491063"}},"form_code":"FRM-20190801-0000010"}
{"_id":{"$oid":"5d41fccbce12462bb01a9c8e"},"level":"3","user":"Acct-20190529-0000001","date_sent":null,"action":"Acknowledged","delegation":"Vendor/Implementor","created_at":{"$date":{"$numberLong":"1564631555517"}},"deleted_at":{"$date":{"$numberLong":"1564634491063"}},"form_code":"FRM-20190801-0000010"}
{"_id":{"$oid":"5d41fcd9ce12462bb01a9c90"},"level":"3","user":"Acct-20190529-0000001","date_sent":null,"action":"Completed","delegation":"Vendor/Implementor","created_at":{"$date":{"$numberLong":"1564631555517"}},"deleted_at":{"$date":{"$numberLong":"1564634491063"}},"form_code":"FRM-20190801-0000010"}
{"_id":{"$oid":"5d41fcdace12462bb01a9c93"},"level":"1","user":"Acct-20190603-0000003","date_sent":null,"action":"Approved","delegation":"Mandatory Approver","created_at":{"$date":{"$numberLong":"1564631555517"}},"deleted_at":{"$date":{"$numberLong":"1564634491063"}},"form_code":"FRM-20190801-0000010"}
{"_id":{"$oid":"5d41fcdace12462bb01a9c94"},"level":"3","user":"Acct-20190529-0000001","date_sent":null,"action":"Completed","delegation":"Vendor/Implementor","created_at":{"$date":{"$numberLong":"1564631555517"}},"deleted_at":{"$date":{"$numberLong":"1564634491063"}},"form_code":"FRM-20190801-0000010"}
{"_id":{"$oid":"5d41fcdace12462bb01a9c95"},"level":"2","user":"Acct-20190613-0000019","date_sent":null,"action":"Approved","delegation":"Approver","created_at":{"$date":{"$numberLong":"1564631555517"}},"deleted_at":{"$date":{"$numberLong":"1564634491063"}},"form_code":"FRM-20190801-0000010"}
{"_id":{"$oid":"5d41fcdace12462bb01a9c96"},"level":"4","user":"Acct-20190531-0000002","date_sent":null,"action":null,"delegation":"Requestor","created_at":{"$date":{"$numberLong":"1564631555517"}},"deleted_at":{"$date":{"$numberLong":"1564634491063"}},"form_code":"FRM-20190801-0000010"}
{"_id":{"$oid":"5d41fcface12462bb01a9ca3"},"level":"4","user":"Acct-20190531-0000002","date_sent":null,"action":"Rejected","delegation":"Requestor","created_at":{"$date":{"$numberLong":"1564631555517"}},"deleted_at":{"$date":{"$numberLong":"1564634491063"}},"form_code":"FRM-20190801-0000010"}
{"_id":{"$oid":"5d41fcfbce12462bb01a9ca6"},"level":"2","user":"Acct-20190613-0000019","date_sent":null,"action":"Approved","delegation":"Approver","created_at":{"$date":{"$numberLong":"1564631555517"}},"deleted_at":null,"form_code":"FRM-20190801-0000010"}
{"_id":{"$oid":"5d41fcfbce12462bb01a9ca7"},"level":"4","user":"Acct-20190531-0000002","date_sent":null,"action":"Rejected","delegation":"Requestor","created_at":{"$date":{"$numberLong":"1564631555517"}},"deleted_at":null,"form_code":"FRM-20190801-0000010"}
{"_id":{"$oid":"5d41fcfbce12462bb01a9ca5"},"level":"3","user":"Acct-20190529-0000001","date_sent":null,"action":"Completed","delegation":"Vendor/Implementor","created_at":{"$date":{"$numberLong":"1564631555517"}},"deleted_at":null,"form_code":"FRM-20190801-0000010"}
{"_id":{"$oid":"5d41fcfbce12462bb01a9ca8"},"level":"1","user":"Acct-20190603-0000003","date_sent":null,"action":"Approved","delegation":"Mandatory Approver","created_at":{"$date":{"$numberLong":"1564631555517"}},"deleted_at":null,"form_code":"FRM-20190801-0000010"}
{"_id":{"$oid":"5d41fd39ce12462bb01a9cb6"},"level":"1","user":"Acct-20190603-0000003","date_sent":null,"action":null,"delegation":"Mandatory Approver","created_at":{"$date":{"$numberLong":"1564631555517"}},"deleted_at":{"$date":{"$numberLong":"1564634819147"}},"form_code":"FRM-20190801-0000014"}
{"_id":{"$oid":"5d41fd39ce12462bb01a9cb7"},"level":"2","user":"Acct-20190613-0000019","date_sent":null,"action":null,"delegation":"Approver","created_at":{"$date":{"$numberLong":"1564631555517"}},"deleted_at":{"$date":{"$numberLong":"1564634819147"}},"form_code":"FRM-20190801-0000014"}
{"_id":{"$oid":"5d41fd39ce12462bb01a9cb8"},"level":"3","user":"Acct-20190529-0000001","date_sent":null,"action":null,"delegation":"Vendor/Implementor","created_at":{"$date":{"$numberLong":"1564631555517"}},"deleted_at":{"$date":{"$numberLong":"1564634819147"}},"form_code":"FRM-20190801-0000014"}
{"_id":{"$oid":"5d41fd39ce12462bb01a9cb9"},"level":"4","user":"Acct-20190531-0000002","date_sent":null,"action":null,"delegation":"Requestor","created_at":{"$date":{"$numberLong":"1564631555517"}},"deleted_at":{"$date":{"$numberLong":"1564634819147"}},"form_code":"FRM-20190801-0000014"}
{"_id":{"$oid":"5d41fd57ce12462bb01a9cc6"},"level":"1","user":"Acct-20190603-0000003","date_sent":null,"action":"Approved","delegation":"Mandatory Approver","created_at":{"$date":{"$numberLong":"1564631555517"}},"deleted_at":{"$date":{"$numberLong":"1564634819147"}},"form_code":"FRM-20190801-0000014"}
{"_id":{"$oid":"5d41fd6ece12462bb01a9cc8"},"level":"2","user":"Acct-20190613-0000019","date_sent":null,"action":"Approved","delegation":"Approver","created_at":{"$date":{"$numberLong":"1564631555517"}},"deleted_at":{"$date":{"$numberLong":"1564634819147"}},"form_code":"FRM-20190801-0000014"}
{"_id":{"$oid":"5d41fd70ce12462bb01a9ccb"},"level":"2","user":"Acct-20190613-0000019","date_sent":null,"action":"Approved","delegation":"Approver","created_at":{"$date":{"$numberLong":"1564631555517"}},"deleted_at":{"$date":{"$numberLong":"1564634819147"}},"form_code":"FRM-20190801-0000014"}
{"_id":{"$oid":"5d41fd70ce12462bb01a9ccc"},"level":"4","user":"Acct-20190531-0000002","date_sent":null,"action":null,"delegation":"Requestor","created_at":{"$date":{"$numberLong":"1564631555517"}},"deleted_at":{"$date":{"$numberLong":"1564634819147"}},"form_code":"FRM-20190801-0000014"}
{"_id":{"$oid":"5d41fd70ce12462bb01a9ccd"},"level":"3","user":"Acct-20190529-0000001","date_sent":null,"action":null,"delegation":"Vendor/Implementor","created_at":{"$date":{"$numberLong":"1564631555517"}},"deleted_at":{"$date":{"$numberLong":"1564634819147"}},"form_code":"FRM-20190801-0000014"}
{"_id":{"$oid":"5d41fd70ce12462bb01a9cce"},"level":"1","user":"Acct-20190603-0000003","date_sent":null,"action":"Approved","delegation":"Mandatory Approver","created_at":{"$date":{"$numberLong":"1564631555517"}},"deleted_at":{"$date":{"$numberLong":"1564634819147"}},"form_code":"FRM-20190801-0000014"}
{"_id":{"$oid":"5d41fdadce12462bb01a9cdb"},"level":"3","user":"Acct-20190529-0000001","date_sent":null,"action":"Acknowledged","delegation":"Vendor/Implementor","created_at":{"$date":{"$numberLong":"1564631555517"}},"deleted_at":{"$date":{"$numberLong":"1564634819147"}},"form_code":"FRM-20190801-0000014"}
{"_id":{"$oid":"5d41fdb9ce12462bb01a9cdd"},"level":"3","user":"Acct-20190529-0000001","date_sent":null,"action":"Completed","delegation":"Vendor/Implementor","created_at":{"$date":{"$numberLong":"1564631555517"}},"deleted_at":{"$date":{"$numberLong":"1564634819147"}},"form_code":"FRM-20190801-0000014"}
{"_id":{"$oid":"5d41fdbace12462bb01a9ce0"},"level":"2","user":"Acct-20190613-0000019","date_sent":null,"action":"Approved","delegation":"Approver","created_at":{"$date":{"$numberLong":"1564631555517"}},"deleted_at":{"$date":{"$numberLong":"1564634819147"}},"form_code":"FRM-20190801-0000014"}
{"_id":{"$oid":"5d41fdbace12462bb01a9ce1"},"level":"4","user":"Acct-20190531-0000002","date_sent":null,"action":null,"delegation":"Requestor","created_at":{"$date":{"$numberLong":"1564631555517"}},"deleted_at":{"$date":{"$numberLong":"1564634819147"}},"form_code":"FRM-20190801-0000014"}
{"_id":{"$oid":"5d41fdbace12462bb01a9ce2"},"level":"3","user":"Acct-20190529-0000001","date_sent":null,"action":"Completed","delegation":"Vendor/Implementor","created_at":{"$date":{"$numberLong":"1564631555517"}},"deleted_at":{"$date":{"$numberLong":"1564634819147"}},"form_code":"FRM-20190801-0000014"}
{"_id":{"$oid":"5d41fdbace12462bb01a9ce3"},"level":"1","user":"Acct-20190603-0000003","date_sent":null,"action":"Approved","delegation":"Mandatory Approver","created_at":{"$date":{"$numberLong":"1564631555517"}},"deleted_at":{"$date":{"$numberLong":"1564634819147"}},"form_code":"FRM-20190801-0000014"}
{"_id":{"$oid":"5d41fe42ce12462bb01a9cf0"},"level":"4","user":"Acct-20190531-0000002","date_sent":null,"action":"Cancelled","delegation":"Requestor","created_at":{"$date":{"$numberLong":"1564631555517"}},"deleted_at":{"$date":{"$numberLong":"1564634819147"}},"form_code":"FRM-20190801-0000014"}
{"_id":{"$oid":"5d41fe43ce12462bb01a9cf2"},"level":"3","user":"Acct-20190529-0000001","date_sent":null,"action":"Completed","delegation":"Vendor/Implementor","created_at":{"$date":{"$numberLong":"1564631555517"}},"deleted_at":null,"form_code":"FRM-20190801-0000014"}
{"_id":{"$oid":"5d41fe43ce12462bb01a9cf3"},"level":"1","user":"Acct-20190603-0000003","date_sent":null,"action":"Approved","delegation":"Mandatory Approver","created_at":{"$date":{"$numberLong":"1564631555517"}},"deleted_at":null,"form_code":"FRM-20190801-0000014"}
{"_id":{"$oid":"5d41fe43ce12462bb01a9cf4"},"level":"4","user":"Acct-20190531-0000002","date_sent":null,"action":"Cancelled","delegation":"Requestor","created_at":{"$date":{"$numberLong":"1564631555517"}},"deleted_at":null,"form_code":"FRM-20190801-0000014"}
{"_id":{"$oid":"5d41fe43ce12462bb01a9cf5"},"level":"2","user":"Acct-20190613-0000019","date_sent":null,"action":"Approved","delegation":"Approver","created_at":{"$date":{"$numberLong":"1564631555517"}},"deleted_at":null,"form_code":"FRM-20190801-0000014"}
{"_id":{"$oid":"5d4260e489680312ca562c07"},"level":"1","user":"Acct-20190603-0000003","date_sent":null,"action":null,"delegation":"Head of Department","created_at":{"$date":{"$numberLong":"1564654222656"}},"deleted_at":null,"form_code":"FRM-20190801-0000018"}
{"_id":{"$oid":"5d4260e489680312ca562c08"},"level":"2","user":"Acct-20190613-0000019","date_sent":null,"action":null,"delegation":"Approver","created_at":{"$date":{"$numberLong":"1564654222656"}},"deleted_at":null,"form_code":"FRM-20190801-0000018"}
{"_id":{"$oid":"5d4260e489680312ca562c09"},"level":"3","user":"Acct-20190531-0000002","date_sent":null,"action":null,"delegation":"Requestor","created_at":{"$date":{"$numberLong":"1564654222656"}},"deleted_at":null,"form_code":"FRM-20190801-0000018"}
{"_id":{"$oid":"5d428ebc89680312ca562c29"},"level":"4","user":"Acct-20190603-0000003","date_sent":null,"action":null,"delegation":"Mandatory Approver","created_at":{"$date":{"$numberLong":"1564654222656"}},"deleted_at":{"$date":{"$numberLong":"1564671938081"}},"form_code":"FRM-20190801-0000019"}
{"_id":{"$oid":"5d428ebc89680312ca562c2a"},"level":"1","user":"","date_sent":null,"action":null,"delegation":"Head of Department","created_at":{"$date":{"$numberLong":"1564654222656"}},"deleted_at":{"$date":{"$numberLong":"1564671938081"}},"form_code":"FRM-20190801-0000019"}
{"_id":{"$oid":"5d428ebc89680312ca562c2b"},"level":"5","user":"","date_sent":null,"action":null,"delegation":"Vendor/Implementor","created_at":{"$date":{"$numberLong":"1564654222656"}},"deleted_at":{"$date":{"$numberLong":"1564671938081"}},"form_code":"FRM-20190801-0000019"}
{"_id":{"$oid":"5d428ebc89680312ca562c2c"},"level":"3","user":"Acct-20190613-0000019","date_sent":null,"action":null,"delegation":"Mandatory Approver","created_at":{"$date":{"$numberLong":"1564654222656"}},"deleted_at":{"$date":{"$numberLong":"1564671938081"}},"form_code":"FRM-20190801-0000019"}
{"_id":{"$oid":"5d428ebc89680312ca562c2d"},"level":"5","user":"Acct-20190531-0000002","date_sent":null,"action":null,"delegation":"Requestor","created_at":{"$date":{"$numberLong":"1564654222656"}},"deleted_at":{"$date":{"$numberLong":"1564671938081"}},"form_code":"FRM-20190801-0000019"}
{"_id":{"$oid":"5d428ebc89680312ca562c2e"},"level":"2","user":"","date_sent":null,"action":null,"delegation":"Vendor/Implementor","created_at":{"$date":{"$numberLong":"1564654222656"}},"deleted_at":{"$date":{"$numberLong":"1564671938081"}},"form_code":"FRM-20190801-0000019"}
{"_id":{"$oid":"5d42901689680312ca562c37"},"level":"1","user":"","date_sent":null,"action":null,"delegation":"Head of Department","created_at":{"$date":{"$numberLong":"1564654222656"}},"deleted_at":null,"form_code":"FRM-20190801-0000020"}
{"_id":{"$oid":"5d42901689680312ca562c38"},"level":"5","user":"","date_sent":null,"action":null,"delegation":"Vendor/Implementor","created_at":{"$date":{"$numberLong":"1564654222656"}},"deleted_at":null,"form_code":"FRM-20190801-0000020"}
{"_id":{"$oid":"5d42901689680312ca562c39"},"level":"4","user":"Acct-20190603-0000003","date_sent":null,"action":null,"delegation":"Mandatory Approver","created_at":{"$date":{"$numberLong":"1564654222656"}},"deleted_at":null,"form_code":"FRM-20190801-0000020"}
{"_id":{"$oid":"5d42901689680312ca562c3a"},"level":"2","user":"","date_sent":null,"action":null,"delegation":"Vendor/Implementor","created_at":{"$date":{"$numberLong":"1564654222656"}},"deleted_at":null,"form_code":"FRM-20190801-0000020"}
{"_id":{"$oid":"5d42901689680312ca562c3b"},"level":"5","user":"Acct-20190531-0000002","date_sent":null,"action":null,"delegation":"Requestor","created_at":{"$date":{"$numberLong":"1564654222656"}},"deleted_at":null,"form_code":"FRM-20190801-0000020"}
{"_id":{"$oid":"5d42901689680312ca562c3c"},"level":"3","user":"Acct-20190613-0000019","date_sent":null,"action":null,"delegation":"Mandatory Approver","created_at":{"$date":{"$numberLong":"1564654222656"}},"deleted_at":null,"form_code":"FRM-20190801-0000020"}
{"_id":{"$oid":"5d42908d89680312ca562c46"},"level":"5","user":"","date_sent":null,"action":null,"delegation":"Vendor/Implementor","created_at":{"$date":{"$numberLong":"1564654222656"}},"deleted_at":null,"form_code":"FRM-20190801-0000021"}
{"_id":{"$oid":"5d42908d89680312ca562c45"},"level":"2","user":"","date_sent":null,"action":null,"delegation":"Vendor/Implementor","created_at":{"$date":{"$numberLong":"1564654222656"}},"deleted_at":null,"form_code":"FRM-20190801-0000021"}
{"_id":{"$oid":"5d42908d89680312ca562c47"},"level":"5","user":"Acct-20190531-0000002","date_sent":null,"action":null,"delegation":"Requestor","created_at":{"$date":{"$numberLong":"1564654222656"}},"deleted_at":null,"form_code":"FRM-20190801-0000021"}
{"_id":{"$oid":"5d42908d89680312ca562c49"},"level":"3","user":"Acct-20190613-0000019","date_sent":null,"action":null,"delegation":"Mandatory Approver","created_at":{"$date":{"$numberLong":"1564654222656"}},"deleted_at":null,"form_code":"FRM-20190801-0000021"}
{"_id":{"$oid":"5d42908d89680312ca562c48"},"level":"1","user":"","date_sent":null,"action":null,"delegation":"Head of Department","created_at":{"$date":{"$numberLong":"1564654222656"}},"deleted_at":null,"form_code":"FRM-20190801-0000021"}
{"_id":{"$oid":"5d42908d89680312ca562c4a"},"level":"4","user":"Acct-20190603-0000003","date_sent":null,"action":null,"delegation":"Mandatory Approver","created_at":{"$date":{"$numberLong":"1564654222656"}},"deleted_at":null,"form_code":"FRM-20190801-0000021"}
{"_id":{"$oid":"5d42a2467bbfb2cbb13345f2"},"level":"3","user":"Acct-20190531-0000002","date_sent":null,"action":null,"delegation":"Requestor","created_at":{"$date":{"$numberLong":"1564676454581"}},"deleted_at":{"$date":{"$numberLong":"1564676890555"}},"form_code":"FRM-20190801-0000022"}
{"_id":{"$oid":"5d42a2467bbfb2cbb13345f3"},"level":"1","user":"Acct-20190603-0000003","date_sent":null,"action":null,"delegation":"Head of Department","created_at":{"$date":{"$numberLong":"1564676454581"}},"deleted_at":{"$date":{"$numberLong":"1564676890555"}},"form_code":"FRM-20190801-0000022"}
{"_id":{"$oid":"5d42a29a7bbfb2cbb1334604"},"level":"1","user":"Acct-20190603-0000003","date_sent":null,"action":"Approved","delegation":"Head of Department","created_at":{"$date":{"$numberLong":"1564676454581"}},"deleted_at":{"$date":{"$numberLong":"1564676890555"}},"form_code":"FRM-20190801-0000022"}
{"_id":{"$oid":"5d42a29a7bbfb2cbb1334606"},"level":"3","user":"Acct-20190531-0000002","date_sent":null,"action":null,"delegation":"Requestor","created_at":{"$date":{"$numberLong":"1564676454581"}},"deleted_at":null,"form_code":"FRM-20190801-0000022"}
{"_id":{"$oid":"5d42a29a7bbfb2cbb1334607"},"level":"1","user":"Acct-20190603-0000003","date_sent":null,"action":"Approved","delegation":"Head of Department","created_at":{"$date":{"$numberLong":"1564676454581"}},"deleted_at":null,"form_code":"FRM-20190801-0000022"}
{"_id":{"$oid":"5d42a3287bbfb2cbb1334611"},"level":"1","user":"Acct-20190603-0000003","date_sent":null,"action":null,"delegation":"Approver","created_at":{"$date":{"$numberLong":"1564676454581"}},"deleted_at":null,"form_code":"FRM-20190801-0000024"}
{"_id":{"$oid":"5d42a3287bbfb2cbb1334610"},"level":"2","user":"Acct-20190531-0000002","date_sent":null,"action":null,"delegation":"Head of Department","created_at":{"$date":{"$numberLong":"1564676454581"}},"deleted_at":null,"form_code":"FRM-20190801-0000024"}
{"_id":{"$oid":"5d42a3287bbfb2cbb1334612"},"level":"3","user":"Acct-20190613-0000019","date_sent":null,"action":null,"delegation":"Mandatory Approver","created_at":{"$date":{"$numberLong":"1564676454581"}},"deleted_at":null,"form_code":"FRM-20190801-0000024"}
{"_id":{"$oid":"5d42a4217bbfb2cbb1334622"},"level":"1","user":"Acct-20190603-0000003","date_sent":null,"action":null,"delegation":"Approver","created_at":{"$date":{"$numberLong":"1564676454581"}},"deleted_at":{"$date":{"$numberLong":"1564677341874"}},"form_code":"FRM-20190801-0000025"}
{"_id":{"$oid":"5d42a4217bbfb2cbb1334623"},"level":"2","user":"Acct-20190531-0000002","date_sent":null,"action":null,"delegation":"Requestor","created_at":{"$date":{"$numberLong":"1564676454581"}},"deleted_at":{"$date":{"$numberLong":"1564677341874"}},"form_code":"FRM-20190801-0000025"}
{"_id":{"$oid":"5d42a4327bbfb2cbb1334625"},"level":"1","user":"","date_sent":null,"action":null,"delegation":"Head of Department","created_at":{"$date":{"$numberLong":"1564676454581"}},"deleted_at":null,"form_code":"FRM-20190801-0000026"}
{"_id":{"$oid":"5d42a4327bbfb2cbb1334626"},"level":"5","user":"","date_sent":null,"action":null,"delegation":"Vendor/Implementor","created_at":{"$date":{"$numberLong":"1564676454581"}},"deleted_at":null,"form_code":"FRM-20190801-0000026"}
{"_id":{"$oid":"5d42a4327bbfb2cbb1334627"},"level":"2","user":"","date_sent":null,"action":null,"delegation":"Vendor/Implementor","created_at":{"$date":{"$numberLong":"1564676454581"}},"deleted_at":null,"form_code":"FRM-20190801-0000026"}
{"_id":{"$oid":"5d42a4327bbfb2cbb1334628"},"level":"4","user":"Acct-20190531-0000002","date_sent":null,"action":null,"delegation":"Requestor","created_at":{"$date":{"$numberLong":"1564676454581"}},"deleted_at":null,"form_code":"FRM-20190801-0000026"}
{"_id":{"$oid":"5d42a4327bbfb2cbb1334629"},"level":"4","user":"Acct-20190603-0000003","date_sent":null,"action":null,"delegation":"Mandatory Approver","created_at":{"$date":{"$numberLong":"1564676454581"}},"deleted_at":null,"form_code":"FRM-20190801-0000026"}
{"_id":{"$oid":"5d42a4327bbfb2cbb133462a"},"level":"3","user":"Acct-20190613-0000019","date_sent":null,"action":null,"delegation":"Mandatory Approver","created_at":{"$date":{"$numberLong":"1564676454581"}},"deleted_at":null,"form_code":"FRM-20190801-0000026"}
{"_id":{"$oid":"5d42a45c7bbfb2cbb1334631"},"level":"1","user":"Acct-20190603-0000003","date_sent":null,"action":"Approved","delegation":"Approver","created_at":{"$date":{"$numberLong":"1564676454581"}},"deleted_at":{"$date":{"$numberLong":"1564677341874"}},"form_code":"FRM-20190801-0000025"}
{"_id":{"$oid":"5d42a45e7bbfb2cbb1334634"},"level":"1","user":"Acct-20190603-0000003","date_sent":null,"action":"Approved","delegation":"Approver","created_at":{"$date":{"$numberLong":"1564676454581"}},"deleted_at":null,"form_code":"FRM-20190801-0000025"}
{"_id":{"$oid":"5d42a45e7bbfb2cbb1334635"},"level":"2","user":"Acct-20190531-0000002","date_sent":null,"action":null,"delegation":"Requestor","created_at":{"$date":{"$numberLong":"1564676454581"}},"deleted_at":null,"form_code":"FRM-20190801-0000025"}
{"_id":{"$oid":"5d42a715757bc4f7d6842492"},"level":"1","user":"Acct-20190603-0000003","date_sent":null,"action":null,"delegation":"Mandatory Approver","created_at":{"$date":{"$numberLong":"1564677867590"}},"deleted_at":{"$date":{"$numberLong":"1564678215818"}},"form_code":"FRM-20190801-0000028"}
{"_id":{"$oid":"5d42a715757bc4f7d6842493"},"level":"4","user":"Acct-20190531-0000002","date_sent":null,"action":null,"delegation":"Requestor","created_at":{"$date":{"$numberLong":"1564677867590"}},"deleted_at":{"$date":{"$numberLong":"1564678215818"}},"form_code":"FRM-20190801-0000028"}
{"_id":{"$oid":"5d42a76a757bc4f7d68424a1"},"level":"4","user":"Acct-20190531-0000002","date_sent":null,"action":null,"delegation":"Requestor","created_at":{"$date":{"$numberLong":"1564677867590"}},"deleted_at":{"$date":{"$numberLong":"1564678231959"}},"form_code":"FRM-20190801-0000029"}
{"_id":{"$oid":"5d42a76a757bc4f7d68424a2"},"level":"1","user":"Acct-20190603-0000003","date_sent":null,"action":null,"delegation":"Mandatory Approver","created_at":{"$date":{"$numberLong":"1564677867590"}},"deleted_at":{"$date":{"$numberLong":"1564678231959"}},"form_code":"FRM-20190801-0000029"}
{"_id":{"$oid":"5d42a7c7757bc4f7d68424af"},"level":"1","user":"Acct-20190603-0000003","date_sent":null,"action":"Approved","delegation":"Mandatory Approver","created_at":{"$date":{"$numberLong":"1564677867590"}},"deleted_at":{"$date":{"$numberLong":"1564678215818"}},"form_code":"FRM-20190801-0000028"}
{"_id":{"$oid":"5d42a7c8757bc4f7d68424b1"},"level":"4","user":"Acct-20190531-0000002","date_sent":null,"action":null,"delegation":"Requestor","created_at":{"$date":{"$numberLong":"1564677867590"}},"deleted_at":null,"form_code":"FRM-20190801-0000028"}
{"_id":{"$oid":"5d42a7c8757bc4f7d68424b2"},"level":"1","user":"Acct-20190603-0000003","date_sent":null,"action":"Approved","delegation":"Mandatory Approver","created_at":{"$date":{"$numberLong":"1564677867590"}},"deleted_at":null,"form_code":"FRM-20190801-0000028"}
{"_id":{"$oid":"5d42a7d7757bc4f7d68424bf"},"level":"1","user":"Acct-20190603-0000003","date_sent":null,"action":"Approved","delegation":"Mandatory Approver","created_at":{"$date":{"$numberLong":"1564677867590"}},"deleted_at":{"$date":{"$numberLong":"1564678231959"}},"form_code":"FRM-20190801-0000029"}
{"_id":{"$oid":"5d42a7d8757bc4f7d68424c1"},"level":"4","user":"Acct-20190531-0000002","date_sent":null,"action":null,"delegation":"Requestor","created_at":{"$date":{"$numberLong":"1564677867590"}},"deleted_at":null,"form_code":"FRM-20190801-0000029"}
{"_id":{"$oid":"5d42a7d8757bc4f7d68424c2"},"level":"1","user":"Acct-20190603-0000003","date_sent":null,"action":"Approved","delegation":"Mandatory Approver","created_at":{"$date":{"$numberLong":"1564677867590"}},"deleted_at":null,"form_code":"FRM-20190801-0000029"}
{"_id":{"$oid":"5d42bc28757bc4f7d68424d0"},"level":"2","user":"Acct-20190531-0000002","date_sent":null,"action":null,"delegation":"Requestor","created_at":{"$date":{"$numberLong":"1564677867590"}},"deleted_at":{"$date":{"$numberLong":"1564683523658"}},"form_code":"FRM-20190801-0000032"}
{"_id":{"$oid":"5d42bc28757bc4f7d68424d1"},"level":"1","user":"Acct-20190603-0000003","date_sent":null,"action":null,"delegation":"Approver","created_at":{"$date":{"$numberLong":"1564677867590"}},"deleted_at":{"$date":{"$numberLong":"1564683523658"}},"form_code":"FRM-20190801-0000032"}
{"_id":{"$oid":"5d42bc82757bc4f7d68424d2"},"level":"1","user":"Acct-20190603-0000003","date_sent":null,"action":"Approved","delegation":"Approver","created_at":{"$date":{"$numberLong":"1564677867590"}},"deleted_at":{"$date":{"$numberLong":"1564683523658"}},"form_code":"FRM-20190801-0000032"}
{"_id":{"$oid":"5d42bc83757bc4f7d68424d5"},"level":"2","user":"Acct-20190531-0000002","date_sent":null,"action":null,"delegation":"Requestor","created_at":{"$date":{"$numberLong":"1564677867590"}},"deleted_at":null,"form_code":"FRM-20190801-0000032"}
{"_id":{"$oid":"5d42bc83757bc4f7d68424d6"},"level":"1","user":"Acct-20190603-0000003","date_sent":null,"action":"Approved","delegation":"Approver","created_at":{"$date":{"$numberLong":"1564677867590"}},"deleted_at":null,"form_code":"FRM-20190801-0000032"}
...@@ -6,9 +6,11 @@ async-timeout==3.0.1 ...@@ -6,9 +6,11 @@ async-timeout==3.0.1
attrs==19.1.0 attrs==19.1.0
autobahn==19.9.2 autobahn==19.9.2
Automat==0.7.0 Automat==0.7.0
certifi==2019.6.16
cffi==1.12.3 cffi==1.12.3
channels==2.2.0 channels==2.2.0
channels-redis==2.4.0 channels-redis==2.4.0
chardet==3.0.4
colorama==0.4.1 colorama==0.4.1
constantly==15.1.0 constantly==15.1.0
cryptography==2.7 cryptography==2.7
...@@ -35,11 +37,13 @@ pycparser==2.19 ...@@ -35,11 +37,13 @@ pycparser==2.19
PyHamcrest==1.9.0 PyHamcrest==1.9.0
pylint==2.3.1 pylint==2.3.1
pytz==2018.9 pytz==2018.9
requests==2.22.0
six==1.12.0 six==1.12.0
sqlparse==0.3.0 sqlparse==0.3.0
Twisted==19.7.0 Twisted==19.7.0
txaio==18.8.1 txaio==18.8.1
typed-ast==1.3.1 typed-ast==1.3.1
urllib3==1.25.3
websocket==0.2.1 websocket==0.2.1
websocket-client==0.54.0 websocket-client==0.54.0
wrapt==1.11.1 wrapt==1.11.1
......
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