2020-04-16 15:28:18 +02:00
# This file is part of Tryton. The COPYRIGHT file at the top level of
# this repository contains the full copyright notices and license terms.
from __future__ import with_statement
from datetime import datetime , timedelta , time
from trytond . model import Workflow , ModelView , ModelSQL , fields
from trytond . pyson import Eval , If , In , Get , Or , Bool , Not
from trytond . transaction import Transaction
from trytond . pool import Pool , PoolMeta
from trytond . wizard import Wizard , StateView , Button , StateReport , StateTransition
from trytond . report import Report
__all__ = [ ' CustomerService ' , ' RegionDepartment ' ,
2020-05-09 05:10:52 +02:00
' ReceiverService ' , ' DepartmentEmail ' , ' HealthProvider ' ]
2020-04-16 15:28:18 +02:00
STATES = {
' readonly ' : ( Eval ( ' state ' ) != ' draft ' ) ,
}
class ReceiverService ( ModelSQL , ModelView ) :
' Receicer Service '
__name__ = ' crm.receiver_service '
_rec_name = ' name '
name = fields . Char ( ' Name ' , required = True )
def get_rec_name ( self , name ) :
self . _rec_name = self . name
return ( self . _rec_name )
@classmethod
def search_rec_name ( cls , name , clause ) :
if clause [ 1 ] . startswith ( ' ! ' ) or clause [ 1 ] . startswith ( ' not ' ) :
bool_op = ' AND '
else :
bool_op = ' OR '
return [ bool_op ,
( ' name ' , ) + tuple ( clause [ 1 : ] ) ,
]
class HealthProvider ( ModelSQL , ModelView ) :
' Health Provider '
__name__ = ' crm.health_provider '
_rec_name = ' party '
name = fields . Function ( fields . Char ( ' Name ' ) , ' get_rec_name ' )
party = fields . Many2One ( ' party.party ' , ' Party ' )
city = fields . Many2One ( ' party.city_code ' , ' City ' )
def get_rec_name ( self , name ) :
self . _rec_name = self . party . name
return ( self . _rec_name )
@classmethod
def search_rec_name ( cls , name , clause ) :
if clause [ 1 ] . startswith ( ' ! ' ) or clause [ 1 ] . startswith ( ' not ' ) :
bool_op = ' AND '
else :
bool_op = ' OR '
return [ bool_op ,
( ' party.name ' , ) + tuple ( clause [ 1 : ] ) ,
]
class CustomerService ( metaclass = PoolMeta ) :
__name__ = ' crm.customer_service '
receiver = fields . Many2One ( ' crm.receiver_service ' , ' Receiver ' , states = {
' required ' : ( Eval ( ' state ' ) == ' open ' ) ,
} )
region = fields . Many2One ( ' crm.region_fiduprevisora ' , ' Region ' )
department_region = fields . Many2One ( ' party.department_code ' , ' Department ' , domain = [
( ' region ' , ' = ' , Eval ( ' region ' ) )
] )
2020-06-25 14:46:11 +02:00
city_region = fields . Many2One ( ' party.city_code ' , ' City ' , depends = [ ' party ' ] ,
# domain=[
# ('department', '=', Eval('department_region'))
# ]
)
2020-04-16 15:28:18 +02:00
other_city = fields . Char ( ' Other City ' , states = {
' required ' : ( Not ( Bool ( Eval ( ' city_region ' ) ) ) ) ,
' invisible ' : ( Bool ( Eval ( ' city_region ' ) ) ) ,
} )
health_provider = fields . Many2One ( ' crm.health_provider ' , ' Health Provider ' , domain = [
( ' city ' , ' = ' , Eval ( ' city_region ' ) )
] )
id_document = fields . Char ( ' Document ' )
email = fields . Char ( ' Email ' )
sended_mail = fields . Boolean ( ' Sended Email ' )
2020-06-25 05:02:43 +02:00
attach_customer_1 = fields . Char ( ' Attach Customer ... ' , readonly = True )
attach_customer_2 = fields . Char ( ' Attach Customer ... ' , readonly = True )
attachments = fields . One2Many ( ' crm.fiduprevisora.attachments ' ,
' service ' , ' Attachments ' )
2020-04-16 15:28:18 +02:00
@classmethod
def __setup__ ( cls ) :
super ( CustomerService , cls ) . __setup__ ( )
cls . party . required = True
new_sel = [
( ' ' , ' ' ) ,
( ' sede ' , ' Sede ' ) ,
( ' web ' , ' Web ' ) ,
( ' supersalud ' , ' Supersalud ' ) ,
]
if new_sel not in cls . media . selection :
cls . media . selection = new_sel
cls . _buttons . update ( {
' send_email ' : {
' invisible ' : Or (
Eval ( ' state ' ) != ' open ' ,
Bool ( Eval ( ' sended_mail ' ) ) ,
) } ,
} )
cls . _error_messages . update ( {
' message ' : ' %s ' ,
} )
@classmethod
@ModelView.button
def send_email ( cls , records ) :
for service in records :
2020-06-25 05:02:43 +02:00
if not service . response :
service . get_message ( ' Debe existir una respuesta. ' )
2020-04-16 15:28:18 +02:00
service . send_email_customer ( )
@staticmethod
def default_region ( ) :
Configuration = Pool ( ) . get ( ' crm.configuration ' )
config = Configuration ( 1 )
if config and config . region_defect :
return config . region_defect . id
@fields.depends ( ' party ' , ' address ' , ' phone ' )
def on_change_party ( self ) :
super ( CustomerService , self ) . on_change_party ( )
if self . party :
self . email = self . party . email
self . phone = self . party . phone
self . address = self . party . street
2020-06-25 05:02:43 +02:00
if self . party . city_attention :
self . city_region = self . party . city_attention . id
self . department_region = self . party . city_attention . department . id
2020-04-16 15:28:18 +02:00
@fields.depends ( ' effective_date ' , ' response ' )
def on_change_with_effective_date ( self ) :
if self . response :
return datetime . now ( )
@classmethod
def create ( cls , services ) :
services = super ( CustomerService , cls ) . create ( services )
for service in services :
if not service . department_region and service . city_region :
cls . write ( [ service ] , { ' department_region ' : service . city_region . department } )
return services
@classmethod
def open ( cls , services ) :
res = cls . validate_service ( services )
2020-05-09 05:10:52 +02:00
if res [ ' status ' ] == ' success ' :
2020-04-16 15:28:18 +02:00
super ( CustomerService , cls ) . open ( services )
for service in services :
2020-06-10 00:46:31 +02:00
if service . email or service . party . email :
2020-06-15 23:22:03 +02:00
service . send_email_notification (
service . email or service . party . email
)
2020-04-16 15:28:18 +02:00
service . send_emails_department ( )
2020-05-09 19:33:39 +02:00
else :
2020-06-15 23:22:03 +02:00
cls . write ( services , { ' state ' : ' cancelled ' , ' notes ' : res [ ' msg ' ] } )
2020-05-09 19:31:00 +02:00
return res
2020-04-16 15:28:18 +02:00
@classmethod
def validate_service ( cls , services ) :
2020-06-15 23:22:03 +02:00
res = {
' status ' : ' success ' ,
' msg ' : ' Requerimiento enviado satifactoriamente !! ' ,
# 'state': 'draft'
}
2020-05-09 19:31:00 +02:00
if not services :
return res
service = services [ 0 ]
if service . party and service . party . affiliation_state == ' retirado ' :
2020-06-15 23:22:03 +02:00
message = ' El proceso no se pudo completar, el usuario: ' + service . party . name + ' Se encuentra en estado retirado '
2020-05-09 19:31:00 +02:00
res [ ' status ' ] = ' error '
2020-06-15 23:22:03 +02:00
res [ ' msg ' ] = message
if service . media != ' web ' :
service . get_message ( message )
return res
if service . media != ' supersalud ' :
attach = service . attach_customer_1 or service . attach_customer_2 or None
if service . case . required_attach and not attach :
message = ' El proceso no se pudo completar, por favor adjuntar: \n ' + service . case . attach_description
res [ ' status ' ] = ' info '
res [ ' msg ' ] = message
if service . media != ' web ' :
service . get_message ( message )
return res
date_ = service . cs_date - timedelta ( days = 30 )
services_ = cls . search ( [
( ' id ' , ' != ' , service . id ) ,
( ' cs_date ' , ' >= ' , date_ ) ,
( ' case ' , ' = ' , service . case . id ) ,
( ' party.id_number ' , ' = ' , service . party . id_number ) ,
( ' state ' , ' = ' , ' open ' ) ,
] )
if services_ :
message = ' El proceso no se pudo completar, ya existe un PQR para el usuario: ' + service . party . name + ' con el caso: ' + service . case . name + ' en los últimos 30 días '
res [ ' status ' ] = ' error '
res [ ' msg ' ] = message
if service . media != ' web ' :
service . get_message ( message )
2020-05-09 19:31:00 +02:00
return res
2020-05-06 02:15:27 +02:00
2020-04-16 15:28:18 +02:00
def get_extension ( self , string_ ) :
ext_ = ' '
if string_ . find ( ' PDF ' ) > 0 :
ext_ = ' PDF '
elif string_ . find ( ' PNG ' ) > 0 :
ext_ = ' PNG '
elif string_ . find ( ' JPEG ' ) > 0 :
ext_ = ' JPEG '
elif string_ . find ( ' JPG ' ) > 0 :
ext_ = ' JPG '
elif string_ . find ( ' DOC ' ) > 0 :
ext_ = ' DOC '
elif string_ . find ( ' ODS ' ) > 0 :
ext_ = ' ODS '
elif string_ . find ( ' ODT ' ) > 0 :
ext_ = ' ODT '
return ext_
def send_email_customer ( self , file_name = ' respuesta ' ) :
pool = Pool ( )
config = pool . get ( ' crm.configuration ' ) ( 1 )
template = config . response_mail_template
if template :
template . subject = template . subject + self . company . party . name
2020-06-25 05:02:43 +02:00
if self . attachments :
_attachments = [ ]
for att in self . attachments :
q = str ( att . attach_response ) [ 1 : 10 ]
ext_ = self . get_extension ( q )
_attachments . append ( {
' attachment ' : att . attach_response ,
' file_name ' : file_name ,
' extension ' : ext_ ,
} )
response = self . _send_mails ( template , self , self . email or self . party . email , True , _attachments )
2020-04-16 15:28:18 +02:00
else :
2020-06-25 05:02:43 +02:00
response = self . _send_mails ( template , self , self . email or self . party . email , False , [ ] )
2020-04-16 15:28:18 +02:00
if response . status_code == 202 :
2020-06-25 05:02:43 +02:00
self . write ( [ self ] , { ' sended_mail ' : True } )
2020-04-16 15:28:18 +02:00
else :
self . get_message ( ' Error de Envío. ' )
else :
self . get_message ( ' No se ha definido una plantilla para el envío del correo. ' )
def send_email_notification ( self , email ) :
pool = Pool ( )
Template = pool . get ( ' email.template ' )
config = pool . get ( ' crm.configuration ' ) ( 1 )
template = config . notification_mail_template
if template :
attach_dict = { }
template . subject = template . subject + self . company . party . name
response = Template . send ( template , self , email ,
attach = False , attachments = [ ] )
if response . status_code != 202 :
self . write ( { self } , { ' notes ' : ' Fallo envio al correo: ' + email } )
def send_emails_department ( self ) :
if self . department_region :
for email in self . department_region . emails :
self . send_email_notification ( email . email )
def send_emails_receivers ( self , email ) :
if email :
pool = Pool ( )
config = pool . get ( ' crm.configuration ' ) ( 1 )
template = config . response_mail_template
if template :
template . subject = template . subject + self . company . party . name
response = self . _send_mails ( template , self , email , False , [ ] )
if response . status_code != 202 :
self . write ( { self } , { ' notes ' : ' Fallo envio al correo: ' + email } )
def _send_mails ( self , template , crm , email , attach , attachments ) :
Template = Pool ( ) . get ( ' email.template ' )
response = Template . send ( template , crm , email ,
attach = attach , attachments = attachments )
return response
def get_message ( self , message ) :
self . raise_user_error ( ' message ' , message )
@classmethod
def dash_on_change_user ( cls , args , ctx ) :
if not args . get ( ' party ' ) :
return { }
Party = Pool ( ) . get ( ' party.party ' )
parties = Party . browse ( [ args [ ' party ' ] [ ' id ' ] ] )
if not parties :
return { }
res = {
' customer ' : parties [ 0 ] . name ,
' media ' : ' web ' ,
' city_region ' : {
' id ' : parties [ 0 ] . city_attention . id ,
' name ' : parties [ 0 ] . city_attention . name ,
} ,
' state ' : ' draft ' ,
}
return res
2020-06-25 05:02:43 +02:00
class FiduprevisoraAttachments ( ModelSQL , ModelView ) :
' Fiduprevisora - Attachments '
__name__ = ' crm.fiduprevisora.attachments '
service = fields . Many2One ( ' crm.customer_service ' , ' Service ' , required = True )
attach_response = fields . Binary ( ' Attach Response ' , required = True )
2020-04-16 15:28:18 +02:00
class FiduprevisoraReportStart ( ModelView ) :
' Fiduprevisora Report Start '
__name__ = ' crm_fiduprevisora.fiduprevisora_report.start '
company = fields . Many2One ( ' company.company ' , ' Company ' , required = True )
start_date = fields . Date ( ' Start Date ' )
end_date = fields . Date ( ' End Date ' )
party = fields . Many2One ( ' party.party ' , ' Party ' )
region = fields . Many2One ( ' crm.region_fiduprevisora ' , ' Region ' )
receiver_service = fields . Many2One ( ' crm.receiver_service ' , ' Receiver ' )
2020-06-25 05:02:43 +02:00
department_region = fields . Many2One ( ' party.department_code ' , ' Department ' , domain = [
( ' region ' , ' = ' , Eval ( ' region ' ) )
] )
city_region = fields . Many2One ( ' party.city_code ' , ' City ' , domain = [
( ' department ' , ' = ' , Eval ( ' department_region ' ) )
] )
2020-04-16 15:28:18 +02:00
@staticmethod
def default_company ( ) :
return Transaction ( ) . context . get ( ' company ' )
2020-06-25 05:02:43 +02:00
@staticmethod
def default_region ( ) :
Configuration = Pool ( ) . get ( ' crm.configuration ' )
config = Configuration ( 1 )
if config and config . region_defect :
return config . region_defect . id
2020-04-16 15:28:18 +02:00
@staticmethod
def default_end ( ) :
Date = Pool ( ) . get ( ' ir.date ' )
return Date . today ( )
class FiduprevisoraReportWizard ( Wizard ) :
' Fiduprevisora Report Wizard '
__name__ = ' crm_fiduprevisora.fiduprevisora_report.wizard '
start = StateView ( ' crm_fiduprevisora.fiduprevisora_report.start ' ,
' crm_fiduprevisora.fiduprevisora_report_start_view_form ' , [
Button ( ' Cancel ' , ' end ' , ' tryton-cancel ' ) ,
Button ( ' Print ' , ' print_ ' , ' tryton-ok ' , default = True ) ,
] )
print_ = StateReport ( ' crm_fiduprevisora.fiduprevisora_report ' )
def do_print_ ( self , action ) :
party_id = self . start . party . id if self . start . party else None
region_id = self . start . region . id if self . start . region else None
2020-06-25 05:02:43 +02:00
department_id = self . start . department_region . id if self . start . department_region else None
city_id = self . start . city_region . id if self . start . city_region else None
2020-04-16 15:28:18 +02:00
receiver_service_id = self . start . receiver_service . id if self . start . receiver_service else None
data = {
' company ' : self . start . company . id ,
' start_date ' : self . start . start_date ,
' end_date ' : self . start . end_date ,
' party ' : party_id ,
' region ' : region_id ,
2020-06-25 05:02:43 +02:00
' department ' : department_id ,
' city ' : city_id ,
2020-04-16 15:28:18 +02:00
' receiver_service ' : receiver_service_id ,
}
return action , data
def transition_print_ ( self ) :
return ' end '
class FiduprevisoraReport ( Report ) :
' Fiduprevisora Report '
__name__ = ' crm_fiduprevisora.fiduprevisora_report '
@classmethod
def get_context ( cls , records , data ) :
report_context = super ( FiduprevisoraReport , cls ) . get_context ( records , data )
pool = Pool ( )
Company = pool . get ( ' company.company ' )
Service = pool . get ( ' crm.customer_service ' )
company = Company ( data [ ' company ' ] )
start_date = data [ ' start_date ' ]
end_date = data [ ' end_date ' ]
party = data [ ' party ' ]
region = data [ ' region ' ]
receiver_service = data [ ' receiver_service ' ]
2020-06-25 05:02:43 +02:00
department_region = data [ ' department ' ]
city_region = data [ ' city ' ]
2020-04-16 15:28:18 +02:00
records = { }
dom_service = [
( ' company ' , ' = ' , data [ ' company ' ] ) ,
( ' state ' , ' != ' , ' cancelled ' ) ,
]
if start_date :
start_date = datetime . combine ( start_date , time ( 0 , 0 ) )
2020-06-25 05:02:43 +02:00
dom_service . append (
( ' cs_date ' , ' >= ' , start_date ) ,
)
2020-04-16 15:28:18 +02:00
if end_date :
end_date = datetime . combine ( end_date , time ( 23 , 59 ) )
dom_service . append (
2020-06-25 05:02:43 +02:00
( ' cs_date ' , ' <= ' , end_date ) ,
2020-04-16 15:28:18 +02:00
)
if party :
dom_service . append (
2020-06-25 05:02:43 +02:00
( ' party ' , ' = ' , party ) ,
2020-04-16 15:28:18 +02:00
)
if region :
dom_service . append (
2020-06-25 05:02:43 +02:00
( ' region ' , ' = ' , region ) ,
2020-04-16 15:28:18 +02:00
)
if receiver_service :
dom_service . append (
2020-06-25 05:02:43 +02:00
( ' receiver ' , ' = ' , receiver_service ) ,
)
if department_region :
dom_service . append (
( ' department_region ' , ' = ' , department_region ) ,
)
if city_region :
dom_service . append (
( ' city_region ' , ' = ' , city_region ) ,
2020-04-16 15:28:18 +02:00
)
services = Service . search ( dom_service )
report_context [ ' records ' ] = services
report_context [ ' start_date ' ] = start_date
report_context [ ' end_date ' ] = end_date
report_context [ ' company ' ] = company . party . name
return report_context