# -*- coding: utf-8 -*-

from odoo import fields, http, _
from odoo.http import request
from odoo.addons.portal.controllers.portal import CustomerPortal, pager as portal_pager
from odoo.tools import date_utils, groupby as groupbyelem
from odoo.osv.expression import AND
from dateutil.relativedelta import relativedelta
from operator import itemgetter
from collections import OrderedDict
from odoo.exceptions import AccessError, MissingError, UserError
from odoo.addons.portal.controllers.mail import _message_post_helper
from datetime import datetime, date, timedelta
import json
import base64
import werkzeug
import logging
_logger = logging.getLogger(__name__)
from odoo.addons.sh_all_in_one_helpdesk.controllers.portal import PortalHelpdesk
FORMAT = '%d/%m/%Y'

class PortalCustomerMaintenence(CustomerPortal):

    def _prepare_home_portal_values(self):
        
        return {}
    
    def prepare_maintenance(self):
        domain = [('team_id.id','=',request.env.ref('helpdesk_maintenance.maintenance').id)]
        return domain
    
    def prepare_maintenance_emergency(self):
        domain = self.prepare_maintenance()
        domain.append(('maintenance_type_id.id','=',request.env.ref('helpdesk_maintenance.emergency').id))
        return domain

    def _prepare_portal_layout_values(self):
        values = super(PortalHelpdesk, self)._prepare_portal_layout_values()
        stage_close = request.env.ref('sh_all_in_one_helpdesk.close_stage').id
        stage_done = request.env.ref('sh_all_in_one_helpdesk.done_stage').id
        stage_cancel = request.env.ref('sh_all_in_one_helpdesk.cancel_stage').id

        ticket_domain = [('stage_id.id','not in',[stage_close,stage_done,stage_cancel])]

        
        if request.env.user.sh_portal_user_access and request.env.user.sh_portal_user_access == 'user':
            ticket_domain.append(('|'))
            ticket_domain.append(('|'))
            ticket_domain.append(('user_id', '=', request.env.user.id))
            ticket_domain.append(('sh_user_ids', 'in', [request.env.user.id]))
            ticket_domain.append(
                ('partner_id', '=', request.env.user.partner_id.id))
        elif request.env.user.sh_portal_user_access and request.env.user.sh_portal_user_access == 'leader':
            ticket_domain.append(('|'))
            ticket_domain.append(('|'))
            ticket_domain.append(('|'))
            ticket_domain.append(('sh_user_ids', 'in', [request.env.user.id]))
            ticket_domain.append(('user_id', '=', request.env.user.id))
            ticket_domain.append(
                ('partner_id', '=', request.env.user.partner_id.id))
            ticket_domain.append(('team_head', '=', request.env.user.id))
        elif request.env.user.sh_portal_user_access and request.env.user.sh_portal_user_access == 'manager':
            ticket_domain.append(('|'))
            ticket_domain.append(('|'))
            ticket_domain.append(('|'))
            ticket_domain.append(('|'))
            ticket_domain.append(('|'))
            ticket_domain.append(('|'))
            ticket_domain.append(('user_id', '=', request.env.user.id))
            ticket_domain.append(('user_id', '=', False))
            ticket_domain.append(('sh_user_ids', 'in', [request.env.user.id]))
            ticket_domain.append(('sh_user_ids', '=', False))
            ticket_domain.append(
                ('partner_id', '=', request.env.user.partner_id.id))
            ticket_domain.append(('team_head', '=', request.env.user.id))
            ticket_domain.append(('team_head', '=', False))
        else:
            ticket_domain.append(('|'))
            ticket_domain.append(('|'))
            ticket_domain.append(('sh_user_ids', 'in', [request.env.user.id]))
            ticket_domain.append(('user_id', '=', request.env.user.id))
            ticket_domain.append(('partner_id', '=', request.env.user.partner_id.id))

        new_domain_sup = AND([self.prepare_maintenance(), ticket_domain])

        maintenance_count = len(request.env['helpdesk.ticket'].sudo().search(new_domain_sup))
        tickets = request.env['helpdesk.ticket'].sudo().search(ticket_domain)
        values['tickets'] = tickets
        values['maintenance_count'] = maintenance_count
        return values


    @http.route('/my/mantenimiento',type='http',auth="user",website=True)
    def prepare_portal_maintenance(self,**kw):
        values = self._prepare_home_portal_values()
        return request.render("helpdesk_maintenance.portal_my_maintenance",{})
    

    @http.route(['/my/mantenimientos', '/my/mantenimientos/page/<int:page>'],type='http',auth="user",website=True)
    def portal_my_maintenance(self,ctr='show',page=1,sortby=None,filterby=None,search=None,search_in='all',groupby='status',**kw):
        values = self._prepare_portal_layout_values()
        HelpdeskTicket = request.env['helpdesk.ticket'].sudo()
        searchbar_sortings = {
            'create_date': {
                'label': _('Newest'),
                'order': 'create_date desc'
            },
            'name': {
                'label': _('Name'),
                'order': 'name'
            },
        }
        searchbar_inputs = {
            'all': {
                'input': 'all',
                'label': _('Search in All')
            },
        }

        searchbar_groupby = {
        
            'status': {
                'input': 'status',
                'label': _('Status')
            },
            
            'maintenance_type': {
                'input': 'maintenance_type',
                'label': _('Tipo de mantenimiento')
            },
            
            
            'severity_type': {
                'input': 'severity_type',
                'label': _('Gravedad')
            },
            'state': {
                'input': 'state',
                'label': _('Reply Status')
            },
            
        }

        today = fields.Date.today()
        quarter_start, quarter_end = date_utils.get_quarter(today)
        last_week = today + relativedelta(weeks=-1)
        last_month = today + relativedelta(months=-1)
        last_year = today + relativedelta(years=-1)

        searchbar_filters = {
            'all': {
                'label': _('All'),
                'domain': []
            },
            'today': {
                'label': _('Today'),
                'domain': [("create_date", "=", today)]
            },
            'week': {
                'label':
                _('This week'),
                'domain':
                [('create_date', '>=', date_utils.start_of(today, "week")),
                 ('create_date', '<=', date_utils.end_of(today, 'week'))]
            },
            'month': {
                'label':
                _('This month'),
                'domain':
                [('create_date', '>=', date_utils.start_of(today, 'month')),
                 ('create_date', '<=', date_utils.end_of(today, 'month'))]
            },
            'year': {
                'label':
                _('This year'),
                'domain':
                [('create_date', '>=', date_utils.start_of(today, 'year')),
                 ('create_date', '<=', date_utils.end_of(today, 'year'))]
            },
            'quarter': {
                'label':
                _('This Quarter'),
                'domain': [('create_date', '>=', quarter_start),
                           ('create_date', '<=', quarter_end)]
            },
            'last_week': {
                'label':
                _('Last week'),
                'domain':
                [('create_date', '>=', date_utils.start_of(last_week, "week")),
                 ('create_date', '<=', date_utils.end_of(last_week, 'week'))]
            },
            'last_month': {
                'label':
                _('Last month'),
                'domain':
                [('create_date', '>=',
                  date_utils.start_of(last_month, 'month')),
                 ('create_date', '<=', date_utils.end_of(last_month, 'month'))]
            },
            'last_year': {
                'label':
                _('Last year'),
                'domain':
                [('create_date', '>=', date_utils.start_of(last_year, 'year')),
                 ('create_date', '<=', date_utils.end_of(last_year, 'year'))]
            },
        }
        # default sort by value
        if not sortby:
            sortby = 'create_date'
        order = searchbar_sortings[sortby]['order']
        # default filter by value
        if not filterby:
            filterby = 'all'
        domain = AND([searchbar_filters[filterby]['domain']])

        if search and search_in:
            domain = AND([domain, [('name', 'ilike', search)]])
        ticket_domain = self.prepare_maintenance()
        if request.env.user.sh_portal_user_access and request.env.user.sh_portal_user_access == 'user':
            ticket_domain.append(('|'))
            ticket_domain.append(('|'))
            ticket_domain.append(('user_id', '=', request.env.user.id))
            ticket_domain.append(('sh_user_ids', 'in', [request.env.user.id]))
            ticket_domain.append(
                ('partner_id', '=', request.env.user.partner_id.id))
        elif request.env.user.sh_portal_user_access and request.env.user.sh_portal_user_access == 'leader':
            ticket_domain.append(('|'))
            ticket_domain.append(('|'))
            ticket_domain.append(('|'))
            ticket_domain.append(('sh_user_ids', 'in', [request.env.user.id]))
            ticket_domain.append(('user_id', '=', request.env.user.id))
            ticket_domain.append(
                ('partner_id', '=', request.env.user.partner_id.id))
            ticket_domain.append(('team_head', '=', request.env.user.id))
        elif request.env.user.sh_portal_user_access and request.env.user.sh_portal_user_access == 'manager':
            ticket_domain.append(('|'))
            ticket_domain.append(('|'))
            ticket_domain.append(('|'))
            ticket_domain.append(('|'))
            ticket_domain.append(('|'))
            ticket_domain.append(('|'))
            ticket_domain.append(('sh_user_ids', 'in', [request.env.user.id]))
            ticket_domain.append(('sh_user_ids', '=', False))
            ticket_domain.append(('user_id', '=', request.env.user.id))
            ticket_domain.append(('user_id', '=', False))
            ticket_domain.append(
                ('partner_id', '=', request.env.user.partner_id.id))
            ticket_domain.append(('team_head', '=', request.env.user.id))
            ticket_domain.append(('team_head', '=', False))
        else:
            ticket_domain.append(('|'))
            ticket_domain.append(('|'))
            ticket_domain.append(('user_id', '=', request.env.user.id))
            ticket_domain.append(('sh_user_ids', 'in', [request.env.user.id]))
            ticket_domain.append(
                ('partner_id', '=', request.env.user.partner_id.id))
        stage_close = request.env.ref('sh_all_in_one_helpdesk.close_stage').id
        stage_done = request.env.ref('sh_all_in_one_helpdesk.done_stage').id
        stage_cancel = request.env.ref('sh_all_in_one_helpdesk.cancel_stage').id
        ticket_domain.append(('stage_id.id','not in',[stage_close,stage_done,stage_cancel]))

        domain = AND([domain, ticket_domain])
        
    
       
        maintenance_count = len(HelpdeskTicket.search(domain).filtered(lambda h: h.team_id.id == request.env.ref('helpdesk_maintenance.maintenance').id))
        
        # pager
        pager = portal_pager(url="/my/mantenimientos",url_args={'sortby': sortby,'search_in': search_in,'search': search,'filterby': filterby},total=maintenance_count,page=page,step=self._items_per_page)
        
     
        if groupby == 'status':
            order = "stage_id, %s" % order
        
        elif groupby == 'state':
            order = 'state,%s' % order

        elif groupby == 'maintenance_type':
            order = "maintenance_type_id, %s" % order

        elif groupby == 'severity_type':
            order = "severity_type, %s" % order

        tickets = HelpdeskTicket.search(domain,order=order,limit=self._items_per_page,offset=pager['offset'])
        
        request.session['my_tickets_history'] = tickets.ids[:100]
        
       
        if groupby == 'status':
            grouped_tickets = [
                HelpdeskTicket.concat(*g)
                for k, g in groupbyelem(tickets, itemgetter('stage_id'))
            ]
       
        elif groupby == 'state':
            grouped_tickets = [
                HelpdeskTicket.concat(*g)
                for k, g in groupbyelem(tickets, itemgetter('state'))
            ]

        elif groupby == 'maintenance_type':
            grouped_tickets = [
                HelpdeskTicket.concat(*g)
                for k, g in groupbyelem(tickets, itemgetter('maintenance_type_id'))
            ]

        elif groupby == 'severity_type':
            grouped_tickets = [
                HelpdeskTicket.concat(*g)
                for k, g in groupbyelem(tickets, itemgetter('severity_type'))
            ]
        # content according to pager and archive selected
        values.update({
            'created': ctr,
            'tickets':tickets,
            'grouped_tickets':grouped_tickets,
            'page_name':'maintenance',
            'default_url':'/my/mantenimientos',
            'maintenance_count':maintenance_count,
            'pager':pager,
            'searchbar_sortings':searchbar_sortings,
            'search_in':search_in,
            'sortby':sortby,
            'groupby':groupby,
            'searchbar_inputs':searchbar_inputs,
            'searchbar_groupby':searchbar_groupby,
            'searchbar_filters':OrderedDict(sorted(searchbar_filters.items())),
            'filterby':filterby,
        })
        return request.render("helpdesk_maintenance.portal_my_maitenance",values)
    
    @http.route('/portal-create-ticket-maintenance', type='http', auth='public', csrf=False)
    def portal_create_ticket_maintenance(self, **kw):
        try:
            login_user = request.env.user
            if login_user and login_user.login != 'public':
                partner_id = False
                if kw.get('partner_id') and kw.get('partner_id') != '':
                    partner_id = request.env['res.partner'].sudo().search(
                        [('id', '=', int(kw.get('partner_id')))]).filtered(lambda user: len(user.user_ids) > 0 )
                else:
                    partner_id = request.env['res.partner'].sudo().search(
                        [('email', '=', kw.get('portal_email'))]).filtered(lambda user: len(user.user_ids) > 0 )
                if partner_id and len(partner_id) > 1: 
                    partner_id = request.env.user.partner_id
                   
                if not partner_id:
                    return json.dumps({"resp":"Error","message":"Colaborador no encontrado, favor de verificar que haya agregado uno"}) 
                if partner_id:
                    unvalued_tickets = len(
                        request.env['helpdesk.ticket'].sudo().search([
                            ('stage_id','=',request.env.ref('sh_all_in_one_helpdesk.done_stage').id),
                            ('priority_new','=',False)])
                        )
                    if unvalued_tickets >= 3:
                        return json.dumps({"resp":"Error","message":"Tienes demasiados tickets sin evaluar, favor de evaluarlos"})
                    ticket_dic = {
                        'partner_id': partner_id.id,
                        'ticket_from_portal': True
                    }
                   
                    if kw.get('portal_phone'):
                        partner_id.update({'phone': kw.get('portal_phone')})
                        ticket_dic.update({
                            'mobile_no':kw.get('portal_phone')
                        })
        
                    if kw.get('portal_contact_name'):
                        ticket_dic.update({
                            'person_name':
                            kw.get('portal_contact_name'),
                        })

                    if kw.get('portal_email'):
                        ticket_dic.update({
                            'email': kw.get('portal_email'),
                        })
                    
                    
                    team_id = request.env['helpdesk.team'].sudo().browse(request.env.ref('helpdesk_maintenance.maintenance').id)
                    if team_id:
                        ticket_dic.update({
                        'team_id': team_id.id,
                        'team_head': team_id.team_head.id,
                    })
                        
                    if kw.get('portal_description'):
                        ticket_dic.update({
                            'description':
                            kw.get('portal_description'),
                        })

                    if kw.get('portal_main_type'):
                        ticket_dic.update({
                            'maintenance_type_id': kw.get('portal_main_type')
                        })

                    if kw.get('portal_severity'):
                        ticket_dic.update({
                            'severity_type': str(kw.get('portal_severity')),
                        })

                    if kw.get('portal_date_fail'):
                        ticket_dic.update({
                            'date_fail': datetime.strptime(kw.get('portal_date_fail'),"%d-%m-%Y").date(),
                        })

                    if kw.get('portal_fail_type'):
                        ticket_dic.update({
                            'fail_type': kw.get('portal_fail_type'),
                        })
                    
                    ticket_id = request.env['helpdesk.ticket'].sudo().create(ticket_dic)

                    if 'portal_file' in request.params:
                        attached_files = request.httprequest.files.getlist('portal_file')
                       
                        attachment_ids = []
                        for attachment in attached_files:
                            result = base64.b64encode(attachment.read())
                            attachment_id = request.env['ir.attachment'].sudo(
                            ).create({
                                'name': attachment.filename,
                                'res_model': 'helpdesk.ticket',
                                'res_id': ticket_id.id,
                                'display_name': attachment.filename,
                                'datas': result,
                            })
                            attachment_ids.append(attachment_id.id)
                        ticket_id.attachment_ids = [(6, 0, attachment_ids)]
                  
                        
            return request.redirect("/my/mantenimientos?ctr=False")
        except Exception as e:
            _logger.exception('Something went wrong %s',str(e))

    @http.route(['/my/manteniminetos/<int:ticket_id>'],type='http',auth="public",website=True)
    def portal_my_ticket_detail_maintenance(self,ticket_id,access_token=None,report_type=None,message=False,download=False,**kw):
        try:
            ticket_sudo = self._document_check_access('helpdesk.ticket', ticket_id, access_token=access_token)
        except (AccessError, MissingError):
            return request.redirect('/my')
        if report_type in ('html', 'pdf', 'text'):
            return self._show_report(model=ticket_sudo,report_type=report_type,report_ref='sh_all_in_one_helpdesk.action_portal_report_helpdesk_ticket',download=download)
        if ticket_sudo:
            if request.env.company.sh_receive_email_seeing_ticket:
                body = _('Ticket visto por el cliente %s',ticket_sudo.partner_id.name)
                _message_post_helper(
                    "helpdesk.ticket",
                    ticket_sudo.id,
                    body,
                    token=ticket_sudo.access_token,
                    message_type="notification",
                    subtype_xmlid="mail.mt_note",
                    partner_ids=ticket_sudo.user_id.sudo().partner_id.ids,
                )
        values = {
            'token': access_token,
            'maintenance': ticket_sudo,
            'message': message,
            'bootstrap_formatting': True,
            'partner_id': ticket_sudo.partner_id.id,
            'report_type': 'html',
        }

        if ticket_sudo.maintenance_type_id.id == request.env.ref('helpdesk_maintenance.emergency').id and ticket_sudo.severity_type == '3':
            values = {
                'token': access_token,
                'm_emergency': ticket_sudo,
                'message': message,
                'bootstrap_formatting': True,
                'partner_id': ticket_sudo.partner_id.id,
                'report_type': 'html',
            }
            return request.render("helpdesk_maintenance.portal_ticket_page_maintenance_emergency",values)
        return request.render("helpdesk_maintenance.portal_ticket_page_maintenance",values)
    
    #apartado de emergencia
    @http.route(['/my/mantenimientos/emergencias', '/my/mantenimientos/emergencias/page/<int:page>'],type='http',auth="user",website=True)
    def portal_my_maintenance_emergency(self,ctr='show',page=1,sortby=None,filterby=None,search=None,search_in='all',groupby='status',**kw):
        values = self._prepare_portal_layout_values()
        HelpdeskTicket = request.env['helpdesk.ticket'].sudo()
        searchbar_sortings = {
            'create_date': {
                'label': _('Newest'),
                'order': 'create_date desc'
            },
            'name': {
                'label': _('Name'),
                'order': 'name'
            },
        }
        searchbar_inputs = {
            'all': {
                'input': 'all',
                'label': _('Search in All')
            },
        }

        searchbar_groupby = {
        
            'status': {
                'input': 'status',
                'label': _('Status')
            },
            
            'maintenance_type': {
                'input': 'maintenance_type',
                'label': _('Tipo de mantenimiento')
            },
            
            
            'severity_type': {
                'input': 'severity_type',
                'label': _('Gravedad')
            },
            
        }

        today = fields.Date.today()
        quarter_start, quarter_end = date_utils.get_quarter(today)
        last_week = today + relativedelta(weeks=-1)
        last_month = today + relativedelta(months=-1)
        last_year = today + relativedelta(years=-1)

        searchbar_filters = {
            'all': {
                'label': _('All'),
                'domain': []
            },
            'today': {
                'label': _('Today'),
                'domain': [("create_date", "=", today)]
            },
            'week': {
                'label':
                _('This week'),
                'domain':
                [('create_date', '>=', date_utils.start_of(today, "week")),
                 ('create_date', '<=', date_utils.end_of(today, 'week'))]
            },
            'month': {
                'label':
                _('This month'),
                'domain':
                [('create_date', '>=', date_utils.start_of(today, 'month')),
                 ('create_date', '<=', date_utils.end_of(today, 'month'))]
            },
            'year': {
                'label':
                _('This year'),
                'domain':
                [('create_date', '>=', date_utils.start_of(today, 'year')),
                 ('create_date', '<=', date_utils.end_of(today, 'year'))]
            },
            'quarter': {
                'label':
                _('This Quarter'),
                'domain': [('create_date', '>=', quarter_start),
                           ('create_date', '<=', quarter_end)]
            },
            'last_week': {
                'label':
                _('Last week'),
                'domain':
                [('create_date', '>=', date_utils.start_of(last_week, "week")),
                 ('create_date', '<=', date_utils.end_of(last_week, 'week'))]
            },
            'last_month': {
                'label':
                _('Last month'),
                'domain':
                [('create_date', '>=',
                  date_utils.start_of(last_month, 'month')),
                 ('create_date', '<=', date_utils.end_of(last_month, 'month'))]
            },
            'last_year': {
                'label':
                _('Last year'),
                'domain':
                [('create_date', '>=', date_utils.start_of(last_year, 'year')),
                 ('create_date', '<=', date_utils.end_of(last_year, 'year'))]
            },
        }
        # default sort by value
        if not sortby:
            sortby = 'create_date'
        order = searchbar_sortings[sortby]['order']
        # default filter by value
        if not filterby:
            filterby = 'all'
        domain = AND([searchbar_filters[filterby]['domain']])

        if search and search_in:
            domain = AND([domain, [('name', 'ilike', search)]])
        ticket_domain = self.prepare_maintenance_emergency()
        if request.env.user.sh_portal_user_access and request.env.user.sh_portal_user_access == 'user':
            ticket_domain.append(('|'))
            ticket_domain.append(('|'))
            ticket_domain.append(('user_id', '=', request.env.user.id))
            ticket_domain.append(('sh_user_ids', 'in', [request.env.user.id]))
            ticket_domain.append(
                ('partner_id', '=', request.env.user.partner_id.id))
        elif request.env.user.sh_portal_user_access and request.env.user.sh_portal_user_access == 'leader':
            ticket_domain.append(('|'))
            ticket_domain.append(('|'))
            ticket_domain.append(('|'))
            ticket_domain.append(('sh_user_ids', 'in', [request.env.user.id]))
            ticket_domain.append(('user_id', '=', request.env.user.id))
            ticket_domain.append(
                ('partner_id', '=', request.env.user.partner_id.id))
            ticket_domain.append(('team_head', '=', request.env.user.id))
        elif request.env.user.sh_portal_user_access and request.env.user.sh_portal_user_access == 'manager':
            ticket_domain.append(('|'))
            ticket_domain.append(('|'))
            ticket_domain.append(('|'))
            ticket_domain.append(('|'))
            ticket_domain.append(('|'))
            ticket_domain.append(('|'))
            ticket_domain.append(('sh_user_ids', 'in', [request.env.user.id]))
            ticket_domain.append(('sh_user_ids', '=', False))
            ticket_domain.append(('user_id', '=', request.env.user.id))
            ticket_domain.append(('user_id', '=', False))
            ticket_domain.append(
                ('partner_id', '=', request.env.user.partner_id.id))
            ticket_domain.append(('team_head', '=', request.env.user.id))
            ticket_domain.append(('team_head', '=', False))
        else:
            ticket_domain.append(('|'))
            ticket_domain.append(('|'))
            ticket_domain.append(('user_id', '=', request.env.user.id))
            ticket_domain.append(('sh_user_ids', 'in', [request.env.user.id]))
            ticket_domain.append(
                ('partner_id', '=', request.env.user.partner_id.id))
        stage_close = request.env.ref('sh_all_in_one_helpdesk.close_stage').id
        stage_done = request.env.ref('sh_all_in_one_helpdesk.done_stage').id
        stage_cancel = request.env.ref('sh_all_in_one_helpdesk.cancel_stage').id
        ticket_domain.append(('stage_id.id','not in',[stage_close,stage_done,stage_cancel]))

        domain = AND([domain, ticket_domain])
        
        maintenance_count = len(HelpdeskTicket.search(domain).filtered(lambda h: h.team_id.id == request.env.ref('helpdesk_maintenance.maintenance').id and h.maintenance_type_id.id == request.env.ref('helpdesk_maintenance.emergency').id)) 
    
        # pager
        pager = portal_pager(url="/my/mantenimientos/emergencias",url_args={'sortby': sortby,'search_in': search_in,'search': search,'filterby': filterby},total=maintenance_count,page=page,step=self._items_per_page)
        if groupby == 'create_by':
            order = "create_uid, %s" % order
        elif groupby == 'ticket_type':
            order = "ticket_type, %s" % order
        elif groupby == 'status':
            order = "stage_id, %s" % order
        elif groupby == 'customer':
            order = "partner_id, %s" % order
        elif groupby == 'category':
            order = "category_id, %s" % order
        elif groupby == 'subcategory':
            order = "sub_category_id, %s" % order
        elif groupby == 'subject':
            order = "subject_id, %s" % order
        elif groupby == 'priority':
            order = "priority, %s" % order
        elif groupby == 'state':
            order = 'state,%s' % order
        elif groupby == 'maintenance_type':
            order = "maintenance_type_id, %s" % order
        elif groupby == 'severity_type':
            order = "severity_type, %s" % order

        tickets = HelpdeskTicket.search(domain,order=order,limit=self._items_per_page,offset=pager['offset'])
        
        request.session['my_tickets_history'] = tickets.ids[:100]
        if groupby == 'create_by':
            grouped_tickets = [
                HelpdeskTicket.concat(*g)
                for k, g in groupbyelem(tickets, itemgetter('create_uid'))
            ]
        elif groupby == 'ticket_type':
            grouped_tickets = [
                HelpdeskTicket.concat(*g)
                for k, g in groupbyelem(tickets, itemgetter('ticket_type'))
            ]
        elif groupby == 'status':
            grouped_tickets = [
                HelpdeskTicket.concat(*g)
                for k, g in groupbyelem(tickets, itemgetter('stage_id'))
            ]
        elif groupby == 'customer':
            grouped_tickets = [
                HelpdeskTicket.concat(*g)
                for k, g in groupbyelem(tickets, itemgetter('partner_id'))
            ]
        elif groupby == 'category':
            grouped_tickets = [
                HelpdeskTicket.concat(*g)
                for k, g in groupbyelem(tickets, itemgetter('category_id'))
            ]
        elif groupby == 'subcategory':
            grouped_tickets = [
                HelpdeskTicket.concat(*g)
                for k, g in groupbyelem(tickets, itemgetter('sub_category_id'))
            ]
        elif groupby == 'subject':
            grouped_tickets = [
                HelpdeskTicket.concat(*g)
                for k, g in groupbyelem(tickets, itemgetter('subject_id'))
            ]
        elif groupby == 'priority':
            grouped_tickets = [
                HelpdeskTicket.concat(*g)
                for k, g in groupbyelem(tickets, itemgetter('priority'))
            ]
        elif groupby == 'state':
            grouped_tickets = [
                HelpdeskTicket.concat(*g)
                for k, g in groupbyelem(tickets, itemgetter('state'))
            ]
        elif groupby == 'maintenance_type':
            grouped_tickets = [
                HelpdeskTicket.concat(*g)
                for k, g in groupbyelem(tickets, itemgetter('maintenance_type_id'))
            ]
        elif groupby == 'severity_type':
            grouped_tickets = [
                HelpdeskTicket.concat(*g)
                for k, g in groupbyelem(tickets, itemgetter('severity_type'))
            ]
        # content according to pager and archive selected
        values.update({
            'created': ctr,
            'tickets':tickets,
            'grouped_tickets':grouped_tickets,
            'page_name':'m_emergency',
            'default_url':'/my/mantenimientos/emergencias',
            'maintenance_count':maintenance_count,
            'pager':pager,
            'searchbar_sortings':searchbar_sortings,
            'search_in':search_in,
            'sortby':sortby,
            'groupby':groupby,
            'searchbar_inputs':searchbar_inputs,
            'searchbar_groupby':searchbar_groupby,
            'searchbar_filters':OrderedDict(sorted(searchbar_filters.items())),
            'filterby':filterby,
        })
        return request.render("helpdesk_maintenance.portal_my_maitenance_emergency",values)

    @http.route('/portal-create-ticket-maintenance-emergency', type='http', auth='public', csrf=False)
    def portal_create_ticket_maintenance_emergency(self, **kw):
        try:
            login_user = request.env.user
            if login_user and login_user.login != 'public':
                partner_id = False
                if kw.get('partner_id') and kw.get('partner_id') != '':
                    partner_id = request.env['res.partner'].sudo().search(
                        [('id', '=', int(kw.get('partner_id')))]).filtered(lambda user: len(user.user_ids) > 0 )
                else:
                    partner_id = request.env['res.partner'].sudo().search(
                        [('email', '=', kw.get('portal_email'))]).filtered(lambda user: len(user.user_ids) > 0 )
                if partner_id and len(partner_id) > 1: 
                    partner_id = request.env.user.partner_id
                   
                if not partner_id:
                    return json.dumps({"resp":"Error","message":"Colaborador no encontrado, favor de verificar que haya agregado uno"}) 
                if partner_id:
                   
                    ticket_dic = {
                        'partner_id': partner_id.id,
                        'ticket_from_portal': True
                    }
                   
                    if kw.get('portal_phone'):
                        partner_id.update({'phone': kw.get('portal_phone')})
                        ticket_dic.update({
                            'mobile_no':kw.get('portal_phone')
                        })
        
                    if kw.get('portal_contact_name'):
                        ticket_dic.update({
                            'person_name':
                            kw.get('portal_contact_name'),
                        })

                    if kw.get('portal_email'):
                        ticket_dic.update({
                            'email': kw.get('portal_email'),
                        })
                    
                    team_id = request.env['helpdesk.team'].sudo().browse(request.env.ref('helpdesk_maintenance.maintenance').id)
                    if team_id:
                        ticket_dic.update({
                        'team_id': team_id.id,
                        'team_head': team_id.team_head.id,
                    })
                        
                    if kw.get('portal_description'):
                        ticket_dic.update({
                            'description':
                            kw.get('portal_description'),
                        })

                    ticket_dic.update({
                        'maintenance_type_id': request.env.ref('helpdesk_maintenance.emergency').id,
                        'severity_type':'3',
                    })

                    if kw.get('portal_date_fail'):
                        
                        ticket_dic.update({
                            'date_fail': datetime.strptime(kw.get('portal_date_fail'),"%d-%m-%Y").date(),
                        })

                    if kw.get('portal_fail_type'):
                        ticket_dic.update({
                            'fail_type': kw.get('portal_fail_type'),
                        })
                    
                    ticket_id = request.env['helpdesk.ticket'].sudo().create(ticket_dic)

                    if 'portal_file' in request.params:
                        attached_files = request.httprequest.files.getlist('portal_file')
                       
                        attachment_ids = []
                        for attachment in attached_files:
                            result = base64.b64encode(attachment.read())
                            attachment_id = request.env['ir.attachment'].sudo(
                            ).create({
                                'name': attachment.filename,
                                'res_model': 'helpdesk.ticket',
                                'res_id': ticket_id.id,
                                'display_name': attachment.filename,
                                'datas': result,
                            })
                            attachment_ids.append(attachment_id.id)
                        ticket_id.attachment_ids = [(6, 0, attachment_ids)]
                  
                        
            return request.redirect("/my/mantenimientos?ctr=False")
        except Exception as e:
            _logger.exception('Something went wrong %s',str(e))