def create_context(email_template_name, feedback_obj, comment_obj=None):
    ''' feedback due date not defined when ticket is created'''
    if comment_obj:
        comment = comment_obj.comment
    else:
        comment = ""
    created_date = convert_utc_to_local_time(feedback_obj.created_date, True)
    try:
        assignee = feedback_obj.assignee.user_profile.user.username
    except:
        assignee = ""
    try:
        due_date = feedback_obj.due_date.strftime(DATE_FORMAT)
    except:
        due_date = ""
    if settings.BRAND == 'bajaj':
        type = feedback_obj.type
    else:
        type = "feedback"
    data = get_email_template(email_template_name, settings.BRAND)
    data['newsubject'] = data['subject'].format(id = feedback_obj.id)
    data['content'] = data['body'].format(id=feedback_obj.id, type = type, reporter = feedback_obj.reporter.user_profile.user.username, 
                                          message = feedback_obj.description, created_date = created_date, 
                                          assign_to = assignee ,  priority =  feedback_obj.priority, comment = comment,
                                          root_cause = feedback_obj.root_cause, resolution = feedback_obj.resolution,
                                          due_date = due_date, resolution_time=total_time_spent(feedback_obj))

    return data
def format_product_object(product_obj):
    purchase_date = convert_utc_to_local_time(product_obj.purchase_date).strftime('%d/%m/%Y')
    return {'id': product_obj.customer_id,
            'phone': get_phone_number_format(str(product_obj.customer_phone_number)), 
            'name': product_obj.customer_name, 
            'purchased': purchase_date,
            'vin': product_obj.product_id}
def set_wait_time(feedback_data):
    start_date = feedback_data.pending_from
    end_date = datetime.datetime.now()
    start_date = convert_utc_to_local_time(start_date)
    start_date = start_date.strftime(TIME_FORMAT)
    end_date = end_date.strftime(TIME_FORMAT)
    start_date = datetime.datetime.strptime(start_date, TIME_FORMAT)
    end_date = datetime.datetime.strptime(end_date, TIME_FORMAT)
    wait = end_date - start_date
    wait_time = wait.total_seconds()
    previous_wait = feedback_data.wait_time
    get_model('Feedback').objects.filter(id = feedback_data.id).update(wait_time = wait_time+previous_wait)
def total_time_spent(feedback_obj):
    wait_time = feedback_obj.wait_time
    if feedback_obj.resolved_date:
        start_date = convert_utc_to_local_time(feedback_obj.created_date)
        end_date = feedback_obj.resolved_date
        start_date, end_date = get_start_and_end_date(start_date,
                                                     end_date, TIME_FORMAT)
        wait = end_date - start_date
        wait_time = wait.total_seconds() 
        wait_time = wait_time - feedback_obj.wait_time
        minutes, seconds = divmod(wait_time, 60)
        hours, minutes = divmod(minutes, 60)
        days, hours = divmod(hours, 24)
        weeks, days = divmod(days, 7)
        return " {0} days ,{1}:{2}:{3}" .format(int(days),int(hours),int(minutes),int(seconds))
def send_feedback_sms(template_name, phone_number, feedback_obj, comment_obj=None):
    created_date = convert_utc_to_local_time(feedback_obj.created_date)
    try:
        message = templates.get_template(template_name).format(
                                        type=feedback_obj.type,
                                        reporter=feedback_obj.reporter,
                                        message=feedback_obj.message,
                                        created_date=created_date,
                                        assign_to=feedback_obj.assign_to,
                                        priority=feedback_obj.priority)
        if comment_obj and template_name == 'SEND_MSG_TO_ASSIGNEE':
            message = message + 'Note :' + comment_obj.comments
    except Exception as ex:
        message = templates.get_template('SEND_INVALID_MESSAGE')
    finally:
        LOG.info("Send complain message received successfully with {0}".format(message))
        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})
    return {'status': True, 'message': message}
def send_sms(template_name, phone_number, feedback_obj, comment_obj=None, brand=None):
    created_date = convert_utc_to_local_time(feedback_obj.created_date, True)
    try:
        assignee = feedback_obj.assignee.user_profile.user.username
    except:
        assignee = ""
    try:
        due_date = feedback_obj.due_date.strftime(DATE_FORMAT)
    except:
        due_date = ""
    reporter = None
    try:
        if feedback_obj.reporter:
            reporter = feedback_obj.reporter.user_profile
        message = templates.get_template(template_name, brand).format(
            type=feedback_obj.type,
            reporter=reporter,
            message=feedback_obj.description,
            created_date=created_date,
            assign_to=assignee,
            priority=feedback_obj.priority,
            due_date=due_date,
            id=feedback_obj.id,
        )
        if comment_obj and template_name == "SEND_MSG_TO_ASSIGNEE":
            message = message + "Note :" + comment_obj.comment
    except Exception as ex:
        logger.info("send_sms: {0}".format(ex))
        message = templates.get_template("SEND_INVALID_MESSAGE", brand)
    finally:
        logger.info("Send complain message received successfully with %s" % message)
        phone_number = utils.get_phone_number_format(phone_number)
        sms_log(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},
        )
    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