def send_reminders_for_servicedesk(*args, **kwargs):
    manager_obj = User.objects.get(groups__name="sdm")
    time = datetime.now()
    """
    send mail when reminder_date is less than current date or when due date is less than current date
    """
    brand = kwargs.get("brand", None)
    feedback_obj = get_model("Feedback", brand).objects.filter(
        reminder_date__lte=time, reminder_flag=False
    ) or get_model("Feedback", brand).objects.filter(due_date__lte=time, resolution_flag=False)
    for feedback in feedback_obj:
        if not feedback.reminder_flag:
            context = utils.create_context("DUE_DATE_EXCEEDED_MAIL_TO_AGENT", feedback)
            send_due_date_reminder(context, feedback.assignee.user_profile.user.email)
            context = utils.create_context("DUE_DATE_REMINDER_MAIL_TO_MANAGER", feedback)
            send_due_date_reminder(context, manager_obj.email)
            feedback.reminder_flag = False

        if not feedback.resolution_flag:
            context = utils.create_context("DUE_DATE_EXCEEDED_MAIL_TO_MANAGER", feedback)
            escalation_list = get_model("UserProfile", brand).objects.filter(user__groups__name=Roles.SDESCALATION)
            escalation_list_detail = utils.get_escalation_mailing_list(escalation_list)
            send_due_date_exceeded(context, escalation_list_detail["mail"])
            for phone_number in escalation_list_detail["sms"]:
                send_sms("DUE_DATE_EXCEEDED_ESCALATION", phone_number, feedback, brand)
            feedback.resolution_flag = False
        feedback.save()
def create_feedback(sms_dict, phone_number, email, name, dealer_email, with_detail=False):
    ''' Save the feedback or complain from SA and sends SMS for successfully receive '''
    manager_obj = User.objects.get(groups__name=Roles.SDMANAGERS)
    try:
        servicedesk_user = create_servicedesk_user(name, phone_number, email)
        if with_detail:
            gladminds_feedback_object = models.Feedback(reporter=servicedesk_user,
                                                            type=sms_dict['type'],
                                                            summary=sms_dict['summary'], description=sms_dict['description'],
                                                            status="Open", created_date=datetime.datetime.now()
                                                            )
        else:
            gladminds_feedback_object = models.Feedback(reporter=servicedesk_user,
                                                            message=sms_dict['message'], status="Open",
                                                            created_date=datetime.datetime.now()                                                            
                                                        ) 
        gladminds_feedback_object.save()
        if sms_dict['file_location']:
            file_obj = sms_dict['file_location']
            filename_prefix = gladminds_feedback_object.id
            filename_suffix = str(uuid.uuid4())
            ext = file_obj.name.split('.')[-1]
            file_obj.name = 'GM'+str(filename_prefix)+'_'+'_'+filename_suffix+'.'+ext
            destination = settings.SDFILE_DIR.format(settings.ENV)
            bucket = settings.SDFILE_BUCKET
            path = utils.upload_file(destination, bucket, file_obj, logger_msg="SDFile")
            gladminds_feedback_object.file_location = path
            gladminds_feedback_object.save()
        message = templates.get_template('SEND_RCV_FEEDBACK').format(type=gladminds_feedback_object.type)
    except Exception as ex:
        LOG.error(ex)
        message = templates.get_template('SEND_INVALID_MESSAGE')
    finally:
        LOG.info("Send complain message received successfully with %s" % message)
        if phone_number:
            phone_number = utils.get_phone_number_format(phone_number)
            sms_log(settings.BRAND, receiver=phone_number, action=AUDIT_ACTION, message=message)
            send_job_to_queue(send_servicedesk_feedback_detail, {"phone_number":phone_number, "message":message, "sms_client":settings.SMS_CLIENT})
        if dealer_email:
            context = utils.create_context('FEEDBACK_DETAIL_TO_DEALER', gladminds_feedback_object)
            send_dealer_feedback(context, dealer_email)
        context = utils.create_context('FEEDBACK_DETAIL_TO_ADIM', gladminds_feedback_object)
        send_feedback_received(context, manager_obj.email)
        context = utils.create_context('FEEDBACK_CONFIRMATION', gladminds_feedback_object)
        send_servicedesk_feedback(context, get_reporter_details(gladminds_feedback_object.reporter, "email"))
    return {'status': True, 'message': message}
def modify_feedback(feedback_obj, data, user, host):
    try:
        status = get_list_from_set(FEEDBACK_STATUS)
        comment_object = None
        assign_status = False
        pending_status = False
        reporter_email_id = get_reporter_details(feedback_obj.reporter, "email")
        reporter_phone_number = get_reporter_details(feedback_obj.reporter)
        previous_status = feedback_obj.status
        dealer_asc_obj = get_dealer_asc_email(feedback_obj)
        
        # check if status is pending
        if feedback_obj.status == status[4]:
            pending_status = True
     
        if feedback_obj.assignee:
            assign_number = feedback_obj.assignee.user_profile.phone_number
        else:
            assign_number = None
        assign = feedback_obj.assignee
        
        if data['status'] == status[0] and previous_status == (status[1] or status[2]):
            feedback_obj.fcr = False
    
        if feedback_obj.due_date:
            due_date = convert_utc_to_local_time(feedback_obj.due_date)
            feedback_obj.due_date = data['due_date']
            feedback_obj.due_date = datetime.datetime.strptime(data['due_date'], '%Y-%m-%d %H:%M:%S')
            feedback_obj.save(using=settings.BRAND)
            if due_date != feedback_obj.due_date:
                update_feedback_activities(feedback_obj, SDActions.DUE_DATE, due_date, feedback_obj.due_date, user)
                if reporter_email_id:
                    send_mail_to_reporter(reporter_email_id, feedback_obj, 'DUE_DATE_MAIL_TO_INITIATOR')
                else:
                    LOG.info("Reporter emailId not found.")
                    
                    if dealer_asc_obj.user.email:
                        send_mail_to_dealer(feedback_obj, dealer_asc_obj.user.email, 'DUE_DATE_MAIL_TO_DEALER')
                    else:
                        LOG.info("Dealer / Asc emailId not found.")
                if reporter_phone_number:
                    send_sms('INITIATOR_FEEDBACK_DUE_DATE_CHANGE', reporter_phone_number,
                     feedback_obj)
        
        if feedback_obj.priority:
            priority = feedback_obj.priority
            feedback_obj.priority = data['Priority']
            feedback_obj.save(using=settings.BRAND)
            if priority != feedback_obj.priority:
                due_date = feedback_obj.due_date
                date = set_due_date(data['Priority'], feedback_obj)
                feedback_obj.due_date = date['due_date']
                feedback_obj.reminder_date = date['reminder_date'] 
                feedback_obj.save(using=settings.BRAND)
                update_feedback_activities(feedback_obj, SDActions.PRIORITY, priority, feedback_obj.priority, user)
                update_feedback_activities(feedback_obj, SDActions.DUE_DATE, due_date, feedback_obj.due_date, user)
                if due_date != convert_utc_to_local_time(feedback_obj.due_date):
                    if reporter_email_id:
                        send_mail_to_reporter(reporter_email_id, feedback_obj, 'DUE_DATE_MAIL_TO_INITIATOR')
                else:
                    LOG.info("Reporter emailId not found.")
                    if dealer_asc_obj.user.email:
                        send_mail_to_dealer(feedback_obj, dealer_asc_obj.user.email, 'DUE_DATE_MAIL_TO_DEALER')
                    else:
                        LOG.info("Dealer / Asc emailId not found.")
                if reporter_phone_number:
                    send_sms('INITIATOR_FEEDBACK_DUE_DATE_CHANGE', reporter_phone_number,
                     feedback_obj)
            
        if assign is None:
            assign_status = True
        if data['assign_to'] == '':
            feedback_obj.status = data['status']
            feedback_obj.priority = data['Priority']
            feedback_obj.assignee = None
         
        else:
            if json.loads(data.get('reporter_status')):
                feedback_obj.previous_assignee = feedback_obj.assignee
                feedback_obj.assign_to_reporter = True
                feedback_obj.assignee = feedback_obj.reporter
                
            else:
                if data['assign_to'] :
                    servicedesk_user = get_model('ServiceDeskUser').objects.filter(user_profile__user__username=str(data['assign_to']))
                    feedback_obj.assignee = servicedesk_user[0]
                    feedback_obj.assign_to_reporter = False
            feedback_obj.status = data['status']
            feedback_obj.priority = data['Priority']
    
        # check if status is pending
        if data['status'] == status[4]:
            feedback_obj.pending_from = datetime.datetime.now()
        
        # check if status is progress
        if data['status'] == status[3]:
            if previous_status == 'Pending':
                feedback_obj.assignee = feedback_obj.previous_assignee
        
        # check if status is closed
        if data['status'] == status[1]:
            feedback_obj.closed_date = datetime.datetime.now()
        feedback_obj.save(using=settings.BRAND)
    
        if assign_status and feedback_obj.assignee:
            feedback_obj.previous_assignee = feedback_obj.assignee
            feedback_obj.assignee_created_date = datetime.datetime.now()
            date = set_due_date(data['Priority'], feedback_obj)
            feedback_obj.due_date = date['due_date']
            feedback_obj.reminder_date = date['reminder_date'] 
            feedback_obj.save(using=settings.BRAND)
            update_feedback_activities(feedback_obj, SDActions.STATUS, None, data['status'], user)
            context = create_context('INITIATOR_FEEDBACK_MAIL_DETAIL',
                                     feedback_obj)
            if reporter_email_id:
                mail.send_email_to_initiator_after_issue_assigned(context,
                                                             reporter_email_id)
            else:
                LOG.info("Reporter emailId not found.")
                if dealer_asc_obj.user.email:
                    context = create_context('INITIATOR_FEEDBACK_MAIL_DETAIL_TO_DEALER',
                                     feedback_obj)
                    mail.send_email_to_dealer_after_issue_assigned(context,
                                                             dealer_asc_obj.user.email)
                else:
                    LOG.info("Dealer / Asc emailId not found.")
            if reporter_phone_number:
                send_sms('INITIATOR_FEEDBACK_DETAILS', reporter_phone_number,
                     feedback_obj)
    
        if data['comments']:
            comment_object = get_model('Comment')(
                                            comment=data['comments'],
                                            user=user, created_date=datetime.datetime.now(),
                                            modified_date=datetime.datetime.now(),
                                            feedback_object=feedback_obj)
            comment_object.save(using=settings.BRAND)
            update_feedback_activities(feedback_obj, SDActions.COMMENT, None, data['comments'], user)
    
    # check if status is resolved
        if feedback_obj.status == status[2]:
            if previous_status == status[0]:
                feedback_obj.fcr = True
            servicedesk_obj_all = User.objects.filter(groups__name=Roles.SDMANAGERS)
            feedback_obj.resolved_date = datetime.datetime.now()
            feedback_obj.resolved_date = datetime.datetime.now()
            feedback_obj.root_cause = data['rootcause']
            feedback_obj.resolution = data['resolution']
            feedback_obj.save(using=settings.BRAND)
            comments = get_model('Comment').objects.filter(feedback_object=feedback_obj.id).order_by('-created_date')
            if reporter_email_id:
                context = create_context('INITIATOR_FEEDBACK_RESOLVED_MAIL_DETAIL',
                                      feedback_obj, comments[0])
                mail.send_email_to_initiator_after_issue_resolved(context,
                                                              feedback_obj, host, reporter_email_id)
            else:
                LOG.info("Reporter emailId not found.")
                if dealer_asc_obj.user.email:
                    context = create_context('FEEDBACK_RESOLVED_MAIL_TO_DEALER',
                                     feedback_obj)
                    mail.send_email_to_dealer_after_issue_assigned(context,
                                                             dealer_asc_obj.user.email)
                else:
                    LOG.info("Dealer / Asc emailId not found.")
    
            context = create_context('TICKET_RESOLVED_DETAIL_TO_BAJAJ',
                                     feedback_obj)
            mail.send_email_to_brand_after_issue_resolved(context)
            context = create_context('TICKET_RESOLVED_DETAIL_TO_MANAGER',
                                     feedback_obj)
            mail.send_email_to_manager_after_issue_resolved(context, servicedesk_obj_all[0])
            if reporter_phone_number:
                send_sms('INITIATOR_FEEDBACK_STATUS', reporter_phone_number,
                     feedback_obj)
        
        if previous_status != feedback_obj.status:
            update_feedback_activities(feedback_obj, SDActions.STATUS, previous_status, feedback_obj.status, user)
            
        if pending_status:
            set_wait_time(feedback_obj)
     
        if feedback_obj.assignee:
            if assign_number != feedback_obj.assignee.user_profile.phone_number:
                update_feedback_activities(feedback_obj, SDActions.ASSIGNEE, assign_number,
                                           feedback_obj.assignee.user_profile.phone_number, user)
                context = create_context('ASSIGNEE_FEEDBACK_MAIL_DETAIL',
                                          feedback_obj)
                mail.send_email_to_assignee(context, feedback_obj.assignee.user_profile.user.email)
                send_sms('SEND_MSG_TO_ASSIGNEE',
                         feedback_obj.assignee.user_profile.phone_number,
                         feedback_obj, comment_object)
        return True

    except Exception as ex:
        exc_type, exc_obj, exc_tb = sys.exc_info()
        fname = os.path.split(exc_tb.tb_frame.f_code.co_filename)[1]
        error = "{0} {1} {2}".format(exc_type, fname, exc_tb.tb_lineno)
        LOG.error('Exception while modifying ticket details : {0} {1}'.format(ex, error))
        return False
def send_mail_to_dealer(feedback_obj, email_id, template):
    context = create_context(template, feedback_obj)
    mail.send_email_to_dealer_after_issue_assigned(context, email_id)
def send_mail_to_reporter(reporter_email_id, feedback_obj, template):
    context = create_context(template, feedback_obj)
    mail.send_email_to_initiator_when_due_date_is_changed(context, reporter_email_id)
def create_feedback(sms_dict, phone_number, email, name, dealer_email, user, with_detail=False):
    ''' Save the feedback or complain from SA and sends SMS for successfully receive '''
    manager_obj = User.objects.get(groups__name=Roles.SDMANAGERS)
    try:
        servicedesk_user = create_servicedesk_user(name, phone_number, email)
        sub_category = get_model('DepartmentSubCategories').objects.get(id=sms_dict['sub-department'])
        
        if json.loads(sms_dict['sub-department-assignee']):
            sub_department_assignee = get_model('ServiceDeskUser').objects.filter(id=sms_dict['sub-department-assignee']) 
        
        else:
            sub_department_assignee = ''
             
        if len(sub_department_assignee)>0:
            gladminds_feedback_object = get_model('Feedback')(reporter=servicedesk_user,
                                                            type=sms_dict['type'],
                                                            summary=sms_dict['summary'], description=sms_dict['description'],
                                                            status="Open", created_date=datetime.datetime.now(), priority=sms_dict['priority'],
                                                            sub_department = sub_category, assignee=sub_department_assignee[0]
                                                            )
        else:
            gladminds_feedback_object = get_model('Feedback')(reporter=servicedesk_user,
                                                            type=sms_dict['type'],
                                                            summary=sms_dict['summary'], description=sms_dict['description'],
                                                            status="Open", created_date=datetime.datetime.now(), priority=sms_dict['priority'],
                                                            sub_department = sub_category                                                            
                                                            )
        gladminds_feedback_object.save(using=settings.BRAND)
        update_feedback_activities(gladminds_feedback_object, SDActions.STATUS, None,
                                   gladminds_feedback_object.status, user)
        if gladminds_feedback_object.assignee:
            date = set_due_date(sms_dict['priority'], gladminds_feedback_object)
            gladminds_feedback_object.due_date = date['due_date']
            gladminds_feedback_object.reminder_date = date['reminder_date'] 
            gladminds_feedback_object.save(using=settings.BRAND)

        if sms_dict['file_location']:
            file_obj = sms_dict['file_location']
            filename_prefix = gladminds_feedback_object.id
            filename_suffix = str(uuid.uuid4())
            ext = file_obj.name.split('.')[-1]
            file_obj.name = 'GM'+str(filename_prefix)+'_'+'_'+filename_suffix+'.'+ext
            destination = settings.SDFILE_DIR.format(settings.ENV)
            bucket = settings.SDFILE_BUCKET
            path = utils.upload_file(destination, bucket, file_obj, logger_msg="SDFile")
            gladminds_feedback_object.file_location = path
            gladminds_feedback_object.save(using=settings.BRAND)
        message = templates.get_template('SEND_RCV_FEEDBACK').format(type="feedback")
    except Exception as ex:
        LOG.error(ex)
        message = templates.get_template('SEND_INVALID_MESSAGE')
    finally:
        LOG.info("Send complain message received successfully with %s" % message)
        if phone_number:
            phone_number = utils.get_phone_number_format(phone_number)
            sms_log(settings.BRAND, receiver=phone_number, action=AUDIT_ACTION, message=message)
            LOG.info("[create_feedback]: {0}".format(settings.SMS_CLIENT))
            send_job_to_queue(send_servicedesk_feedback_detail, {"phone_number":phone_number, "message":message, "sms_client":settings.SMS_CLIENT})
        if dealer_email:
            context = utils.create_context('FEEDBACK_DETAIL_TO_DEALER', gladminds_feedback_object)
            send_dealer_feedback(context, dealer_email)
        context = utils.create_context('FEEDBACK_DETAIL_TO_ADIM', gladminds_feedback_object)
        send_feedback_received(context, manager_obj.email)
        context = utils.create_context('FEEDBACK_CONFIRMATION', gladminds_feedback_object)
        send_servicedesk_feedback(context, get_reporter_details(gladminds_feedback_object.reporter, "email"))
    return {'status': True, 'message': message}