Proyecto

General

Perfil

Funcionalidad #5229

Actualizado por Oscar Abad hace 10 meses

h1. Especificación 

 Cuando un usuario cambie el estado de un contrato a uno con metaestado 'Revisión jurídico', se debe enviar un correo a todos los usuarios con rol 'Autorizador Jurídico'. 

 h1. Análisis 

 Localizar el punto del código donde se cambia de estado un contrato para poder enviar el correo correspondiente. 

 h1. Implementación 

 app/views/contratos_mailer/aviso_revision_juridico_contrato.html.erb 
 <pre> 
     <p><%= _("El contrato '%{nombre}' ha pasado a estado de revisión jurídico.")%{nombre: @contrato.codigo_nombre} %></p> 
     <p><ul> 
       <% @info_contrato.each do |k,v| %> 
         <li><strong><%= k %>: </strong><%= v %></li> 
       <% end %> 
     </ul></p> 
 </pre> 

 app/views/contratos_mailer/aviso_revision_juridico_contrato.text.erb 
 <pre> 
 <%= _("El contrato '%{nombre}' ha pasado a estado de revisión jurídico.")%{nombre: @contrato.codigo_nombre} %>: 

 <% @info_contrato.each do |k,v| -%> 
   * <%= k %>: <%= v %> 
 <% end -%> 
 </pre> 

 app/mailers/contratos_mailer.rb 
 <pre><code class="ruby"> 
   def aviso_revision_juridico_contrato destinatario, contrato 
     @usuario = destinatario 
     @contrato = contrato 
     @info_contrato = info_contrato contrato 
     if contrato.proyecto 
       @url = default_url_values.merge( seccion: 'proyectos', proyecto_id: contrato.proyecto_id, 
                                        menu: 'ejecucion_economica', controller: 'contrato' )  
     else 
       @url = default_url_values.merge( seccion: 'agentes', agente_id: contrato.agente_id, 
                                        menu: 'economico_agente', controller: 'contrato' ) 
     end 
     texto_subject = _('El contrato %{contrato} ha pasado a estado de revisión jurídico')%{contrato: contrato.codigo} 
     subject = "[#{INSTANCIA}][AVISO][Contrato] #{texto_subject}"  
     # Envia el correo al usuario 
     logger.info "=========== Enviando mail de aviso de revisión jurídica del contrato '#{contrato.codigo_nombre}' a '#{@usuario.nombre_completo}'" 
     mail to: "#{@usuario.nombre_completo} <#{@usuario.correoe}>", subject: subject 
   end 
 </code></pre> 

 app/models/contrato.rb 
 <pre><code class="ruby"> 
   # Devolver todos los usuarios con rol de autorizador jurídico 
   def usuarios_autorizador_juridico 
     destinatarios = [] 
     usuarios = UsuarioXAgente.joins(:rol_asignado).joins(:usuario). 
                               where(:agente_id => agente_id, "usuario.bloqueado" => false, "rol.nombre" => "Autorizador Jurídico") 
     usuarios.each do |elem| 
       usuario_correo = Usuario.find_by_id elem.usuario_id 
       destinatarios.push(usuario_correo) if usuario_correo 
     end 
     return destinatarios 
   end 
 </code></pre> 

 app/controllers/estado_contrato_controller.rb 
 <pre><code class="ruby"> 
   # en gestion de estados de un contrato: cambia el estado 
   def modificar_crear 
     @contrato = (@proyecto||@agente).contrato.find_by_id params[:id] 
     estado_anterior = @contrato.estado_contrato.find_by_id params[:estado_anterior_id] 
     # PENDIENTE: Debemos validar que "estado_anterior" tenga el "estado_actual" a true 
     @estado = EstadoContrato.create(contrato_id: @contrato.id, fecha_inicio: Date.today, usuario_id: @usuario_identificado.id, 
                                     estado_actual: true, workflow_contrato_id: params[:nuevo_estado][:id]) 
     if @estado.errors.empty? 
       if params[:selector] && params[:selector][:detalle] == '1' 
         errores_docu = sube_documento_detalle_contrato 
         logger.error "----------> ERROR: " + errores_docu.inspect unless errores_docu.empty? 
       end 
       # Eliminamos al estado anterior como "estado_actual" 
       estado_anterior.update_attributes(estado_actual: false, observaciones: params[:estado_anterior][:observaciones], fecha_fin: Date.today) if estado_anterior 

       # Enviar correo a usuarios con rol 'Autorizador Jurídico' cuando 
       # se pasa a un estado con metaestado 'revision_juridico' 
       if @estado.workflow_contrato.revision_juridico 
         usuarios_correo = @contrato.usuarios_autorizador_juridico 
         usuarios_correo.each do |destinatario| 
           Rails.logger.debug '[EstadoContratoController.modificar_crear] Enviando correo rol Autorizador Jurídico a ' + destinatario.correoe 
           begin 
             ContratosMailer.aviso_revision_juridico_contrato(destinatario, @contrato).deliver 
           rescue => e 
             Rails.logger.error '[EstadoContratoController.modificar_crear] Error enviando correo rol Autorizador Jurídico a ' + destinatario.correoe 
             Rails.logger.error e.inspect 
           end 
         end 
       end 

       @estados = @contrato.estado_contrato.reorder('id desc') 
       # Y luego actualizamos el listado de estados 
       render(:update) { |page| page.replace_html params[:update_listado], partial: 'estado_contrato/listado', locals: {update_listado: params[:update_listado]} } 
     else 
       datos_formulario 
       render(:update) { |page| page.recargar_formulario partial: 'estado_contrato/formulario_cambiar_estado', update: params[:update], mensaje: {errors: @estado.errors} } 
     end 
   end 
 </code></pre> 

Atrás