app.controller('fichaCliente', ['$scope', '$http', '$window', '$stateParams', '$location', '$templateRequest', '$compile', 'Filters', 'Generals', '$timeout',
  function ($scope, $http, $window, $stateParams, $location, $templateRequest, $compile, Filters, Generals, $timeout) {

    $scope.des_login = $stateParams.des_login;
    $scope.cod_mascota = $stateParams.cod_mascota;
    $scope.fecha = false;
    $scope.videoactivo = false;
    $scope.mostrar_inputs_receta = false
    $scope.bool_video = false;
    $scope.bool_buscar = true;
    $scope.bool_nota_receta = false;
    $scope.bool_crear_mascota = false;
    $scope.anos = [];
    $scope.boolMostrarTSS = false;
    let textoRecetaOriginal = '';
    let textoNotaRecetaOriginal = ''
    let textoNotaVideoRecetaOriginal = ''

    var fecha = new Date();
    var ano = fecha.getFullYear() + 1;

    for (var i = ano; i >= 2008; i--) {
      var ano = {};
      ano.nro_ano = i.toString();
      ano.des_ano = i.toString();
      $scope.anos.push(ano);
    }

    $("#modal").modal({
      dismissible: false
    });

    activate();

    Filters.consultarEstados().then(msg => { $scope.States = msg })

    if ($location.search().fecha) {
      $scope.fecha = $location.search().fecha;
    }

    if ($location.search().id_solicitud) {
      $scope.id_solicitud = $location.search().id_solicitud;
      $scope.bool_video = true;
    }

    $scope.actualizaModeloReceta = function () {
      console.log("aa");
    }


    $scope.tinymceOptions = {
      inline: false,
      plugins: 'advlist autolink link image lists charmap paste',
      skin: 'lightgray',
      theme: 'modern',
      menubar: false,
      schema: 'html5-strict',
      toolbar: ['bold, italic, underline, strikethrough | alignleft, aligncenter, alignright, alignjustify | fontselect, fontsizeselect | bullist, numlist, outdent, indent'],
      statusbar: true,
      min_height: 250,
      // init_instance_callback: function (editor) {
      //   editor.on('Dirty', function (e) {
      //   });
      // }
    };

    function activate() {
    //  consultarDosisMedidas()

      $http.post('app/ws/ws_api.php', JSON.stringify({ cual: 'consultarMascotaEspecie' })).then(function (msg) {
        $scope.especies = msg.data.especies
      });

      $http.post('app/ws/ws_api.php', JSON.stringify({ cual: 'consultarMascotaMedidasEdad' })).then(function (msg) {
        $scope.medidasEdad = msg.data.medidas_edad
      });

      var parametros = {};
      parametros["cual"] = "consultarTipoMascota";
      parametros["bool_otro"] = 0;
      parametros["bool_activo"] = 1;

      $http.post('app/ws/ws_ficha_cliente.php', JSON.stringify(parametros)).then(function (msg) {

        $scope.tipos = msg.data.tipos;
      });

      var parametros = {};
      parametros["cual"] = "consultarTipoRaza";
      parametros["bool_otro"] = 1;

      $http.post('app/ws/ws_ficha_cliente.php', JSON.stringify(parametros)).then(function (msg) {

        $scope.razas = msg.data.razas;
      });

      var parametros = {};
      parametros["cual"] = "traerEstados";

      $http.post('app/ws/ws_dashboarddr.php', JSON.stringify(parametros)).then(function (msg) {

        $scope.estados = msg.data.estados;
      });

      var parametros = {};
      parametros["cual"] = "traerClinics";

      $http.post('app/ws/ws_dashboarddr.php', JSON.stringify(parametros)).then(function (msg) {
        $scope.clinics = msg.data.clinics
      });

      var parametros = {};

      parametros["cual"] = "consultarTipoDocumento";
      parametros["bool_activo"] = "1";

      $http.post('app/ws/ws_documento.php', JSON.stringify(parametros)).then(function (msg) {

        $scope.tipoDocumentos = msg.data.tipos;
      });

      var parametros = {};
      parametros["cual"] = "traeTextoReceta";
      parametros["cod_receta"] = 1;

      $http.post('app/ws/ws_ficha_cliente.php', JSON.stringify(parametros)).then(function (msg) {

        $scope.texto = msg.data;
      });

      var parametros = {};

      parametros["cual"] = "consultarGeneroMascota";
      $http.post('app/ws/ws_ficha_cliente.php', JSON.stringify(parametros)).then(function (msg) {

        $scope.genero = msg.data.generos;
      });

      var parametros = {};
      parametros["cual"] = "consultarPesoMascota";

      $http.post('app/ws/ws_ficha_cliente.php', JSON.stringify(parametros)).then(function (msg) {

        $scope.peso = msg.data.pesos;
      });
    }

    $scope.buscarNuevo = function () {
      $scope.bool_video = {};
      $location.path('/ficha_cliente');
    }

    $scope.searchAPI = function (des_busqueda, timeoutPromise) {

      var parametros = {};
      parametros["cual"] = "traerCliente";
      parametros["des_busqueda"] = des_busqueda;

      return $http.post('app/ws/ws_ficha_cliente.php', JSON.stringify(parametros), { timeout: timeoutPromise });
    }

    $scope.buscarCliente = function () {
      if ($scope.des_busqueda != undefined) {
        $scope.cliente = $scope.des_busqueda.originalObject;

        $location.path('/ficha_cliente/' + $scope.cliente.des_login);
      }
    }

    $scope.volverFichaCliente = function () {

      $scope.cod_mascota = {};
      $scope.bool_mascota = false;
    }

    $scope.traeFichaMascota = function (mascota) {

      $scope.bool_mascota = true;
      $scope.cod_mascota = mascota.cod_mascota;

      var parametros = {};
      parametros["cod_mascota"] = mascota.cod_mascota;
      parametros["cual"] = "consultarMascota";

      $http.post('app/ws/ws_ficha_cliente.php', JSON.stringify(parametros)).then(function (msg) {
        $scope.mascotas = msg.data.mascotas[0];
        // Template de informacion personal
        //$templateRequest('app/templates/doctors/ficha_cliente/ficha_mascota.html').then(function(html){
        //  var template = angular.element(html);
        //  $("#tab_cliente").html(template);
        //  $compile(template)($scope);
        //});

        spinner("ventanaInfoMascota", "l");
        // Template Notas
        $templateRequest('app/templates/doctors/ficha_cliente/ventana_datos_mascota.html').then(function (html) {
          var template = angular.element(html);
          $("#ventanaInfoMascota").html(template);
          $compile(template)($scope);
        });

        $scope.ventanaSesionMascotas(mascota.cod_mascota);
        $scope.ventanaDocumentosMascota(mascota.cod_mascota);
        $scope.ventanaEnfermedadMascotas(mascota.cod_mascota);
        $scope.ventanaFichaClinica(mascota.cod_mascota);
      });

    }

    $scope.recargar = function () {

      $scope.bool_buscar = false;
      $scope.bool_mascota = false;
      $scope.modificar = {};

      //$scope.ventanaInfoCliente();
      spinner("ventanaInfoCliente", "l");

      var parametros = {};
      parametros["des_login"] = $scope.des_login;
      parametros["cual"] = "consultarCliente";

      $http.post('app/ws/ws_ficha_cliente.php', JSON.stringify(parametros)).then(function (msg) {

        $scope.cliente = msg.data;
        $scope.browser = msg.data.browser[0];

        consultarRecetaGrupos()
        consultarPlantillaDosis()

        // Template de informacion personal
        $templateRequest('app/templates/doctors/ficha_cliente/ventana_datos_cliente.html').then(function (html) {
          var template = angular.element(html);
          $("#ventanaInfoCliente").html(template);
          $compile(template)($scope);
        });

        spinner("ventanaMascotas", "l");
        // Template Notas
        $templateRequest('app/templates/doctors/ficha_cliente/ventana_mascotas.html').then(function (html) {
          var template = angular.element(html);
          $("#ventanaMascotas").html(template);
          $compile(template)($scope);
        });

        spinner("ventanaSesiones", "l");
        // Template Notas
        $templateRequest('app/templates/doctors/ficha_cliente/ventana_sesiones.html').then(function (html) {
          var template = angular.element(html);
          $("#ventanaSesiones").html(template);
          $compile(template)($scope);
        });

        spinner("ventanaDocumentos", "l");
        // Template Notas
        $templateRequest('app/templates/doctors/ficha_cliente/ventana_documentos.html').then(function (html) {
          var template = angular.element(html);
          $("#ventanaDocumentos").html(template);
          $compile(template)($scope);
        });

        spinner("ventanaFichaClinicaCliente", "l");
        // Template Notas
        $templateRequest('app/templates/doctors/ficha_cliente/ventana_ficha_clinica_cliente.html').then(function (html) {
          var template = angular.element(html);
          $("#ventanaFichaClinicaCliente").html(template);
          $compile(template)($scope);
        });

        spinner("ventanaEnfermedadCliente", "l");
        // Template Notas
        $templateRequest('app/templates/doctors/ficha_cliente/ventana_enfermedad_cliente.html').then(function (html) {
          var template = angular.element(html);
          $("#ventanaEnfermedadCliente").html(template);
          $compile(template)($scope);
        });

      });
    }

    $scope.recargar();

    $scope.setTokens = function(cantidad){

    var parametros={};
    parametros["cual"]="setTokens";
  
    parametros["des_login"]=$scope.cliente.des_login;
    parametros["cantidad"]=cantidad;
  
    $http.post('app/ws/ws_api.php',JSON.stringify(parametros)).then(function(msg){
      $scope.recargar();
  
    });
  }

    $scope.ventanaMascotaFicha = function (mascota) {

      var parametros = {};
      parametros["cod_mascota"] = mascota.cod_mascota;
      parametros["cual"] = "consultarMascota";

      $http.post('app/ws/ws_ficha_cliente.php', JSON.stringify(parametros)).then(function (msg) {
        $scope.mascotas = msg.data.mascotas[0];

        // Template de informacion personal
        spinner("ventanaInfoMascota", "l");
        // Template Notas
        $templateRequest('app/templates/doctors/ficha_cliente/ventana_datos_mascota.html').then(function (html) {
          var template = angular.element(html);
          $("#ventanaInfoMascota").html(template);
          $compile(template)($scope);
        });
      });
    }

    $scope.ventanaSesionMascotas = function (cod_mascota) {

      spinner("ventanaSesionMascotas", "l");

      var parametros = {};
      parametros["cod_mascota"] = cod_mascota;
      parametros["cual"] = "consultaDoctor";

      // Template Notas
      $http.post('app/ws/ws_dashboarddr.php', JSON.stringify(parametros)).then(function (msg) {

        $scope.sesionMascotas = msg.data.doctores;

        $templateRequest('app/templates/doctors/ficha_cliente/ventana_sesion_mascotas.html').then(function (html) {
          var template = angular.element(html);
          $("#ventanaSesionMascotas").html(template);
          $compile(template)($scope);
        });
      });
    }

    $scope.ventanaEnfermedadMascotas = function (cod_mascota) {

      spinner("ventanaEnfermedad", "l");

      var parametros = {};
      parametros["cod_mascota"] = cod_mascota;
      parametros["bool_activo"] = 1;
      parametros["cual"] = "consultarEnfermedadMascota";

      // Template Notas
      $http.post('app/ws/ws_ficha_cliente.php', JSON.stringify(parametros)).then(function (msg) {
        $scope.enfermedades = msg.data.enfermedades;

        $templateRequest('app/templates/doctors/ficha_cliente/ventana_enfermedad.html').then(function (html) {

          var template = angular.element(html);
          $("#ventanaEnfermedad").html(template);
          $compile(template)($scope);
        });
      });
    }

    $scope.ventanaFichaClinica = function (cod_mascota) {

      spinner("ventanaFichaClinica", "l");

      var parametros = {};
      parametros["cod_mascota"] = cod_mascota;
      parametros["bool_activo"] = 1;
      parametros["cual"] = "consultarMascotaReceta";

      $http.post('app/ws/ws_ficha_cliente.php', JSON.stringify(parametros)).then(function (msg) {

        $scope.recetas = msg.data.recetas;

        $templateRequest('app/templates/doctors/ficha_cliente/ventana_ficha_clinica.html').then(function (html) {
          var template = angular.element(html);
          $("#ventanaFichaClinica").html(template);
          $compile(template)($scope);
        });
      });
    }

    $scope.ventanaFichaClinicaCliente = function (cod_mascota) {

      spinner("ventanaFichaClinicaCliente", "l");

      var parametros = {};
      parametros["cod_mascota"] = cod_mascota;
      parametros["bool_activo"] = 1;
      parametros["cual"] = "consultarMascotaReceta";

      $http.post('app/ws/ws_ficha_cliente.php', JSON.stringify(parametros)).then(function (msg) {

        $scope.recetas = msg.data.recetas;

        $templateRequest('app/templates/doctors/ficha_cliente/ventana_ficha_clinica_cliente.html').then(function (html) {

          var template = angular.element(html);
          $("#ventanaFichaClinica").html(template);
          $compile(template)($scope);
        });
      });
    }

    $scope.ventanaDocumentosMascota = function (cod_mascota) {

      spinner("ventanaDocumentosMascota", "l");

      var parametros = {};
      parametros["cod_mascota"] = cod_mascota;
      parametros["cual"] = "consultarDocumentoCliente";

      $http.post('app/ws/ws_dashboarddr.php', JSON.stringify(parametros)).then(function (msg) {
        $scope.documentoMascota = msg.data.documentos;

        $templateRequest('app/templates/doctors/ficha_cliente/ventana_documento_mascotas.html').then(function (html) {

          var template = angular.element(html);
          $("#ventanaDocumentosMascota").html(template);
          $compile(template)($scope);
        });
      });
    }

    $scope.recargarMascota = function () {

      $scope.bool_buscar = false;
      $scope.modificar = {};

      spinner("ventanaInfoCliente", "l");

      var parametros = {};
      parametros["des_login"] = $scope.des_login;
      parametros["cual"] = "consultarCliente";

      $http.post('app/ws/ws_ficha_cliente.php', JSON.stringify(parametros)).then(function (msg) {

        $scope.cliente = msg.data;

        $templateRequest('app/templates/doctors/ficha_cliente/ventana_datos_cliente.html').then(function (html) {

          var template = angular.element(html);
          $("#ventanaInfoCliente").html(template);
          $compile(template)($scope);
        });

        spinner("ventanaMascotas", "l");
        // Template Notas
        $templateRequest('app/templates/doctors/ficha_cliente/ventana_mascotas.html').then(function (html) {

          var template = angular.element(html);
          $("#ventanaMascotas").html(template);
          $compile(template)($scope);
        });
      });
    }

    $scope.recargarRaza = function () {

      parametros["cual"] = "consultarTipoRaza";
      parametros["cod_tipo"] = $scope.mascota.cod_tipo;
      parametros["bool_otro"] = 1;

      $http.post('app/ws/ws_ficha_cliente.php', JSON.stringify(parametros)).then(function (msg) {

        $scope.razas = msg.data.razas;
      });
    }

    $scope.ventanaInfoCliente = function () {

      var parametros = {};
      parametros["des_login"] = $scope.des_login;
      parametros["cual"] = "consultarCliente";

      $http.post('app/ws/ws_ficha_cliente.php', JSON.stringify(parametros)).then(function (msg) {

        $scope.cliente = msg.data;

        $templateRequest('app/templates/doctors/ficha_cliente/ventana_datos_cliente.html').then(function (html) {
          var template = angular.element(html);
          $("#ventanaInfoCliente").html(template);
          $compile(template)($scope);
        });
      });
    }

    $scope.ventanaMascotas = function () {
      spinner("ventanaMascotas", "l");

      var parametros = {};
      parametros["des_login"] = $scope.des_login;
      parametros["cual"] = "consultarMascota";

      $http.post('app/ws/ws_ficha_cliente.php', JSON.stringify(parametros)).then(function (msg) {

        $scope.mascotas = msg.data;

        $templateRequest('app/templates/doctors/ficha_cliente/ventana_mascotas.html').then(function (html) {
          var template = angular.element(html);
          $("#ventanaMascotas").html(template);
          $compile(template)($scope);
        });
      });
    }

    $scope.ventanaSesiones = function () {
      spinner("ventanaSesiones", "l");

      var parametros = {};
      parametros["des_login"] = $scope.des_login;
      parametros["cual"] = "consultarMascota";

      $http.post('app/ws/ws_ficha_cliente.php', JSON.stringify(parametros)).then(function (msg) {

        $scope.mascotas = msg.data;

        $templateRequest('app/templates/doctors/ficha_cliente/ventana_sesiones.html').then(function (html) {
          var template = angular.element(html);
          $("#ventanaMascotas").html(template);
          $compile(template)($scope);
        });
      });
    }

    $scope.guardarMascota = function () {
      spinner("ventanaMascotas", "l");

      var parametros = {};
      parametros["des_nombre"] = $scope.mascota.des_nombre;
      parametros["cod_tipo"] = $scope.mascota.cod_tipo;
      parametros["cod_raza"] = $scope.mascota.cod_raza;
      parametros["ind_sexo"] = $scope.mascota.ind_sexo;
      parametros["fec_nacimiento"] = $scope.mascota.fec_nacimiento;
      parametros["nro_peso"] = $scope.mascota.nro_peso;
      parametros["des_login"] = $scope.des_login;
      parametros["des_edad"] = $scope.mascota.des_edad;
      parametros["nro_ano"] = $scope.mascota.nro_ano;
      parametros["nro_mes"] = $scope.mascota.nro_mes;
      parametros["nro_semana"] = $scope.mascota.nro_semana;
      parametros["des_tipo_mascota"] = $scope.mascota.des_tipo_mascota;
      parametros["des_raza"] = $scope.mascota.des_raza;
      parametros["des_sexo"] = $scope.mascota.des_sexo;
      parametros["cod_peso"] = $scope.mascota.cod_peso;
      parametros["cual"] = "guardarMascota";

      var puede = true;
      var mensaje = "";

      if ($scope.mascota.cod_tipo == null || $scope.mascota.cod_tipo == "") {
        puede = false;
        mensaje += "No Species\n";
      }

      if (puede) {
        spinner("ventanaMascotas", "l");

        $http.post('app/ws/ws_ficha_cliente.php', JSON.stringify(parametros)).then(function (msg) {

          $scope.notas = msg.data;

          $http.post('app/templates/doctors/ficha_cliente/ventana_mascotas.html', JSON.stringify(parametros)).then(function (msg) {
            if (msg.data.bool_error)
              notificacion(msg.data.mensaje);
            else {
              Materialize.toast('Saved successfully', 1200);
              $scope.recargar();
              $scope.recargarTodo();
              $("#modal").modal('close');
            }
            $scope.bool_guardando = false;
          });
        });
      }
      else {
        Materialize.toast(mensaje, 1200);
      }
    }

    $scope.recargaSesiones = function () {
      var parametros = {};
      parametros["des_login"] = $scope.des_login;
      parametros["cual"] = "consultarCliente";

      $http.post('app/ws/ws_ficha_cliente.php', JSON.stringify(parametros)).then(function (msg) {

        $scope.sesionNuevo = msg.data.sesiones;

        $scope.cliente.sesiones = $scope.sesionNuevo;
      });
    }

    $scope.recargaSesionesMascota = function () {
      var parametros = {};
      parametros["cod_mascota"] = $scope.cod_mascota;
      parametros["cual"] = "consultaDoctor";

      // Template Notas
      $http.post('app/ws/ws_dashboarddr.php', JSON.stringify(parametros)).then(function (msg) {
        $scope.sesionMascotas = msg.data.doctores;



      });

    }

    $scope.modalMascotaSesion = function (solicitud) {
      $scope.id_solicitudCliente = solicitud.id_solicitud;
      $scope.solicitudCliente = angular.copy(solicitud);

      $scope.mascota = {};

      spinner('modal', 'l');

      $("#modal").modal({
        dismissible: false
      });

      $("#modal").modal('open');

      var parametros = {};
      parametros["des_login"] = $scope.des_login;
      parametros["bool_activo"] = 1;
      parametros["bool_nuevo"] = 1;
      parametros["cual"] = "consultarMascota";

      $http.post('app/ws/ws_ficha_cliente.php', JSON.stringify(parametros)).then(function (msg) {

        $scope.mascotas = msg.data.mascotas;
        $scope.mascotas.mascotasLargo = $scope.mascotas.length
        $scope.mascota.cod_peso = "1";

        $templateRequest('app/templates/doctors/ficha_cliente/modalClienteMascota.html').then(function (html) {

          var template = angular.element(html);
          $("#modal").html(template);
          $compile(template)($scope);
        });
      });
    }

    $scope.modificarMascota = function (mascota) {
      spinner("ventanaMascotas", "l");

      var parametros = {};
      parametros["des_nombre"] = mascota.des_nombre;
      parametros["cod_tipo"] = mascota.cod_tipo;
      parametros["cod_raza"] = mascota.cod_raza;
      parametros["ind_sexo"] = mascota.ind_sexo;
      parametros["nro_peso"] = mascota.nro_peso;
      parametros["cod_mascota"] = mascota.cod_mascota;
      parametros["des_login"] = $scope.des_login;
      parametros["des_edad"] = mascota.des_edad;
      parametros["nro_ano"] = $scope.mascota.nro_ano;
      parametros["nro_mes"] = $scope.mascota.nro_mes;
      parametros["nro_semana"] = $scope.mascota.nro_semana;
      parametros["des_tipo_mascota"] = $scope.mascota.des_tipo_mascota;
      parametros["des_raza"] = $scope.mascota.des_raza;
      parametros["cod_peso"] = $scope.mascota.cod_peso;
      parametros["des_sexo"] = $scope.mascota.des_sexo;
      parametros["cual"] = "modificarMascota";

      $http.post('app/ws/ws_ficha_cliente.php', JSON.stringify(parametros)).then(function (msg) {

        $http.post('app/templates/doctors/ficha_cliente/ventana_mascotas.html', JSON.stringify(parametros)).then(function (msg) {
          if (msg.data.bool_error)
            notificacion(msg.data.mensaje);
          else {
            $scope.cerrarModalFicha('modal-medium');
            Materialize.toast('Saved successfully', 1200);
            $scope.recargar();

          }
          $scope.bool_guardando = false;
        });
      });
    }

    $scope.recetaPDF = function (receta) {

      $window.open(`app/pdf/fichaClinica.php?cod_receta=${receta.cod_receta}&cod_idioma=${$scope.cliente.cod_idioma}`);


      $window.close();

      Materialize.toast("Summary downloaded.", 1200);
    }

    $scope.guardarMascotaCliente = function () {

      var parametros = {};
      if ($scope.mascota.cod_mascota != 0) {
        parametros["id_solicitud"] = $scope.id_solicitudCliente;
        parametros["cod_mascota"] = $scope.mascota.cod_mascota;
        parametros["cual"] = "guardarClienteMascota";

        $http.post('app/ws/ws_ficha_cliente.php', JSON.stringify(parametros)).then(function (msg) {

          Materialize.toast('Saved successfully', 1200);

          $scope.recargar();
          $scope.recargarClienteSesion($scope.id_solicitudCliente);
        });
      }
      else {

        parametros["des_nombre"] = $scope.mascota.des_nombre;
        parametros["cod_tipo"] = $scope.mascota.cod_tipo;
        parametros["cod_raza"] = $scope.mascota.cod_raza;
        parametros["ind_sexo"] = $scope.mascota.ind_sexo;
        parametros["nro_peso"] = $scope.mascota.nro_peso;
        parametros["des_login"] = $scope.des_login;
        parametros["des_edad"] = $scope.mascota.des_edad;
        parametros["id_solicitud"] = $scope.id_solicitudCliente;
        parametros["nro_ano"] = $scope.mascota.nro_ano;
        parametros["nro_mes"] = $scope.mascota.nro_mes;
        parametros["nro_semana"] = $scope.mascota.nro_semana;
        parametros["des_tipo_mascota"] = $scope.mascota.des_tipo_mascota;
        parametros["des_raza"] = $scope.mascota.des_raza;
        parametros["des_sexo"] = $scope.mascota.des_sexo;
        parametros["cod_peso"] = $scope.mascota.cod_peso;
        parametros["cual"] = "guardarMascota";

        var puede = true;
        var mensaje = "";

        if ($scope.mascota.cod_tipo == null || $scope.mascota.cod_tipo == "") {
          puede = false;
          mensaje += "No Species\n";
        }

        if (puede) {
          $http.post('app/ws/ws_ficha_cliente.php', JSON.stringify(parametros)).then(function (msg) {
            $scope.notas = msg.data;


            $http.post('app/templates/doctors/ficha_cliente/ventana_mascotas.html', JSON.stringify(parametros)).then(function (msg) {
              if (msg.data.bool_error)
                notificacion(msg.data.mensaje);
              else {
                Materialize.toast('Saved successfully', 1200);
                $scope.recargarTodo();
                $scope.recargar();
                $scope.recargaSesiones();
                $scope.recargarClienteSesion($scope.id_solicitudCliente);

                $scope.mascota.cod_mascota = "";
                //$scope.traeFichaMascota($scope.mascota);
                //$("#modal").modal('close');
              }
              $scope.bool_guardando = false;
            });
          });
        }
        else {
          
          Materialize.toast(mensaje, 1200);
        }
      }
    }

    $scope.ventanaModificarEnfermedades = function (mascota) {
      spinner('modal', 'l');
      //$scope.mascota={};

      $scope.bool_nuevo = true;

      $("#modal").modal({
        dismissible: false
      });

      $("#modal").modal('open');

      $templateRequest('app/templates/doctors/ficha_cliente/modalEnfermedad.html').then(function (html) {
        var template = angular.element(html);
        $("#modal").html(template);
        $compile(template)($scope);

      });
    }

    $scope.guardarMascotaEnfermedad = function () {
      $scope.bool_guardando_enfermedad = true;

      var parametros = {};
      parametros["cod_mascota"] = $scope.mascotas.cod_mascota;
      parametros["des_enfermedad"] = $scope.des_enfermedad;
      parametros["cual"] = "guardarMascotaEnfermedad";

      $http.post('app/ws/ws_ficha_cliente.php', JSON.stringify(parametros)).then(function (msg) {
        if (msg.data.bool_error == '1') {
          $scope.bool_guardando_enfermedad = false;
          notificacion(msg.data.mensaje);
        }
        else {
          $scope.bool_guardando_enfermedad = false;
          Materialize.toast('Saved successfully', 1200);
          $scope.consultarMascotaEnfermedad($scope.mascotas.cod_mascota);
          $scope.recargarEnfermedadCliente();
          //$scope.recargar();
          $scope.des_enfermedad = "";
        }
      });
    }

    $scope.borrarEnfermedad = function (enfermedad) {
      var parametros = {};
      parametros["cod_mascota"] = enfermedad.cod_mascota;
      parametros["des_enfermedad"] = enfermedad.des_enfermedad;
      parametros["cual"] = "borrarEnfermedadMascota";

      // Template Notas
      $http.post('app/ws/ws_ficha_cliente.php', JSON.stringify(parametros)).then(function (msg) {

        $scope.bool_guardando_enfermedad = false;
        Materialize.toast('Saved successfully', 1200);
        $scope.consultarMascotaEnfermedad(enfermedad.cod_mascota);
        $scope.recargarEnfermedadCliente();
        $scope.des_enfermedad = "";
      });
    }

    $scope.recargarRecetaCliente = function () {
      var parametros = {};
      parametros["des_login"] = $scope.des_login;
      parametros["bool_activo"] = 1;
      parametros["cual"] = "consultarMascotaReceta";

      $http.post('app/ws/ws_ficha_cliente.php', JSON.stringify(parametros)).then(function (msg) {
        $scope.cliente.recetas = msg.data.recetas;
        //$scope.cliente.enfermedades=msg.data.enfermedades;
      });
    }

    $scope.recargarEnfermedadCliente = function () {
      var parametros = {};
      parametros["des_login"] = $scope.des_login;
      parametros["bool_activo"] = 1;
      parametros["cual"] = "consultarEnfermedadMascota";

      $http.post('app/ws/ws_ficha_cliente.php', JSON.stringify(parametros)).then(function (msg) {
        //$scope.enfermedades=msg.data.enfermedades;
        $scope.cliente.enfermedades = msg.data.enfermedades;
      });
    }

    $scope.consultarMascotaEnfermedad = function (cod_mascota) {
      var parametros = {};
      parametros["cod_mascota"] = cod_mascota;
      parametros["bool_activo"] = 1;
      parametros["cual"] = "consultarEnfermedadMascota";

      $http.post('app/ws/ws_ficha_cliente.php', JSON.stringify(parametros)).then(function (msg) {
        $scope.enfermedades = msg.data.enfermedades;
      });
    }

    $scope.ventanaModificarFichaClinica = async (mascota) => {
      $scope.summaries_con_input = []
      $scope.bool_obtuvo_receta_final = false
      if ($scope.id_solicitud == null) delete $scope.id_solicitud;

      let pasoActualTSS = 1
      // $scope.pasosModificarTSS = [1, 0, 0, 0, 0, 0, 0, 0, 0]
      // $scope.pasosCompletadosTSS = [1, 0, 0, 0, 0, 0, 0, 0, 0]
      $scope.arrayCodRecetasSeleccionadas = []
      $scope.arrayInputsRecetasSeleccionadas = []
      $scope.summariesNoIncluidosConInput = []
      $scope.bundlesSeleccionadosOriginal = []
      $scope.busquedaReceta = ''
      $scope.boolMostrarDatosMascota = false
      $scope.boolTxtPersonalizado = 0

      await consultarRecetaPlantillas()
      await consultarPlantillasSummary()

      $scope.mascotaReceta = angular.copy(mascota)
      textoRecetaOriginal = angular.copy(mascota?.des_receta)
      textoNotaRecetaOriginal = angular.copy(mascota?.des_nota)
      textoNotaVideoRecetaOriginal = angular.copy(mascota?.des_comentario_video)

      let textoEmergenciaOriginal = $scope.plantilla[23].des_receta_plantilla
      let nroDiasEmergencia = mascota?.nro_dias

      // reemplazar '#[number]#' por el número de días de emergencia
      $scope.textoEmergenciaOriginal = textoEmergenciaOriginal.replace('#[number]#', nroDiasEmergencia)

      $scope.textoRecetaOriginal = textoRecetaOriginal
      $scope.textoNotaRecetaOriginal = textoNotaRecetaOriginal
      $scope.textoNotaVideoRecetaOriginal = textoNotaVideoRecetaOriginal

      $scope.bool_nota_receta = mascota?.des_nota !== undefined
      $scope.bool_nuevo = false;
      $scope.bool_nueva_clinica = false
      $scope.new_clinic = {
        des_clinic_nueva: '',
        cod_sigla: ''
      }

      $scope.TSSInfo = {
        des_cliente: $scope.cliente.des_nombre + ' ' + $scope.cliente.des_apellido,
        des_doctor: '',
        des_telefono: $scope.cliente.des_telefono,
        des_email: $scope.cliente.des_email,
        cod_clinic: $scope.cliente.cod_sigla,
        des_clinic: '',
        des_doctor_complemento: $scope.mascotaReceta?.des_doctor_complemento,
        des_doctor_complemento_orig: $scope.mascotaReceta?.des_doctor_complemento
      }

      $scope.mascota = {
        cod_peso: undefined,
        cod_raza: undefined,
        cod_especie: $scope?.cliente?.cod_tipo_mascota.toString() ?? '1',
        des_edad: undefined,
        cod_edad_medida: undefined,
        des_nombre: undefined,
        des_raza: undefined,
        des_sexo: undefined,
        ind_sexo: undefined,
        nro_ano: undefined,
        nro_mes: undefined,
        nro_peso: undefined,
        nro_semana: undefined
      }

      $scope.busqueda = { cod_grupo_receta: undefined }

      if (mascota == null) {
        $scope.bool_nuevo = true;
        pasoActualTSS = 2
        $scope.pasosCompletadosTSS = [1, 1, 0, 0, 0, 0, 0, 0]

        $scope.mascotaReceta = {
          des_receta: undefined,
          des_nota: undefined,
          bool_activo: undefined,
          id_solicitud: undefined,
          des_grupos: undefined,
          bool_emergencia: undefined,
          bool_cliente_acepta: undefined,
          bool_recomendacion_adicional: undefined,
          bool_nueva_version: 1 // desde la introducción de TSS editables, todos son "nueva versión"
        }

        $scope.emergenciaRecomendacion = {
          nro_dias: undefined,
          boolEmergencia: '0',
          boolClienteAcepta: '1',
          boolRecomendacionAdicional: 0,
          des_texto: ''
        }

        $scope.bundlesSeleccionados = []
      } else {
        $scope.mascotaReceta = angular.copy(mascota)
        if ($scope.mascotaReceta.mascota !== null) {
          if (Object.hasOwn($scope.mascotaReceta.mascota, 'des_nombre')) {
            $scope.boolMostrarDatosMascota = true
          }
        }
        const stringGrupos = $scope.mascotaReceta.des_grupos
        $scope.bundlesSeleccionados = stringGrupos.split(',').map(String)
        $scope.bundlesSeleccionadosOriginal = structuredClone($scope.bundlesSeleccionados)

        // si TSSInfo.cod_clinic no está indefinido, obtener el des_clinic de $scope.clinics y asignarlo a TSSInfo.des_clinic
        if ($scope.TSSInfo.cod_clinic !== undefined) {
          const clinic = $scope.clinics.find(clinic => {
            return clinic.cod_clinic === $scope.TSSInfo.cod_clinic
          })
          $scope.TSSInfo.des_clinic = clinic.des_clinic
        }

        textoRecetaOriginal = angular.copy(mascota?.des_receta)
        textoNotaRecetaOriginal = angular.copy(mascota?.des_nota)
        $scope.textoRecetaOriginal = textoRecetaOriginal
        $scope.textoNotaRecetaOriginal = textoNotaRecetaOriginal

        if (textoNotaRecetaOriginal !== '') {
          $scope.textoNotaRecetaOriginalNumerada = textoNotaRecetaOriginal.replace('<p>', `<p>${$scope.mascotaReceta.inputs.length + 1}. `)
        }

        $scope.bool_nota_receta = mascota?.des_nota !== undefined
        $scope.bool_nuevo = false;
        $scope.pasosCompletadosTSS = [1, 1, 1, 1, 1, 1, 1, 1]

        for (let i = 0; i < mascota.inputs.length; i++) {
          const receta = mascota.inputs[i]

          $scope.arrayCodRecetasSeleccionadas.push(parseInt(receta.cod_receta_idioma))

          for (let j = 0; j < receta.array_inputs.length; j++) {
            const input = receta.array_inputs[j]

            $scope.arrayInputsRecetasSeleccionadas.push(parseInt(input))
          }
        }

        $scope.summaries_con_input = $scope.summaries.filter(receta => {
          if ($scope.arrayCodRecetasSeleccionadas.includes(parseInt(receta.cod_receta))) {
            return receta
          } else {
            $scope.summariesNoIncluidosConInput.push(receta)
          }
        })

        // si la receta es antigua, se revisan inmediatamente todas sus plantillas para
        // dejarlas disponibles en el paso 6: "armar TSS"
        await $scope.filtrarRecetaPlantillasPorGrupo()

        // campos correspondientes al paso 4 para crear un TSS
        $scope.emergenciaRecomendacion = {
          nro_dias: parseInt($scope.mascotaReceta.nro_dias),
          boolEmergencia: $scope.mascotaReceta.bool_emergencia,
          boolClienteAcepta: $scope.mascotaReceta.bool_cliente_acepta,
          boolRecomendacionAdicional: parseInt($scope.mascotaReceta.bool_recomendacion_adicional),
          des_texto: '' /////////////////////////////////////////////////////////////////////////////////////
        }

        $scope.mascota = mascota.mascota
      }

      // si el cliente no tiene mascotas, se muestra inmediatamente la ventana para crear los datos básicos de una
      if ($scope.cliente.mascotas.length === 0) { $scope.bool_crear_mascota = true }

      const parametros = { cual: 'consultaDoctor' };

      if ($scope.cod_mascota == null) {
        parametros.des_login_cli = $scope.des_login;
      } else {
        parametros.cod_mascota = $scope.cod_mascota;
      }

      $http.post('app/ws/ws_api.php', JSON.stringify(parametros)).then(function (msg) {
        $scope.sesionMascotas = msg.data.doctores;
        $scope.TSSInfo.des_doctor = $scope.sesionMascotas[0].des_doctor
        $scope.id_solicitud = $scope.sesionMascotas[0].id_solicitud
        $scope.saltarPasoTSS(pasoActualTSS, 1)
        $scope.boolMostrarTSS = true

        $('#cod_especie').select2()
        $('#cod_clinic').select2()
      });
    }

    $scope.guardarFichaClinica = async function () {
      $scope.bool_guardando_enfermedad = true

      const cod_mascota = await guardarMascotaTSS()

      if ($scope.id_solicitud == undefined) {
        $scope.id_solicitud = 0;
      }

     /* if ($scope.bool_nueva_clinica) {
        // guardar nueva clínica
        const newClinic = await guardarClinica()
        // agregar la nueva clínica al array de clínicas
        $scope.clinics.push(newClinic)
        $scope.TSSInfo.cod_clinic = newClinic.cod_sigla
        $scope.$digest()
      }*/

      const parametros = Generals.quitarPropiedadesIndefinidas({
        cual: 'guardarMascotaReceta',
        array_grupos: $scope.bundlesSeleccionados,
        array_inputs_recetas: $scope.arrayInputsRecetasSeleccionadas,
        array_recetas: $scope.arrayCodRecetasSeleccionadas,
        bool_activo: $scope.mascotaReceta.bool_activo,
        bool_cliente_acepta: $scope.emergenciaRecomendacion.boolClienteAcepta,
        bool_emergencia: $scope.emergenciaRecomendacion.boolEmergencia,
        bool_recomendacion_adicional: $scope.emergenciaRecomendacion.boolRecomendacionAdicional,
        cod_mascota,
        des_comentario_video: $scope.mascotaReceta.des_comentario_video,
        des_login: $scope.cliente.des_login,
        des_nota_interna: $scope.mascotaReceta.des_nota_interna,
        des_nota: $scope.mascotaReceta.des_nota,
        des_receta: $scope.mascotaReceta.des_receta,
        id_solicitud: $scope.id_solicitud,
        nro_dias: $scope.emergenciaRecomendacion.nro_dias,
        des_doctor_complemento: $scope.TSSInfo.des_doctor_complemento,
      });

      // considerar el guardado de la información del cliente, como telefono, correo y clínica
      const parametrosUsuario =  Generals.quitarPropiedadesIndefinidas({
        cual: 'modificarUsuario',
        des_telefono: $scope.cliente.des_telefono !== $scope.TSSInfo.des_telefono ? $scope.TSSInfo.des_telefono : undefined,
        cod_sigla: $scope.cliente.cod_sigla !== $scope.TSSInfo.cod_clinic ? $scope.TSSInfo.cod_clinic : undefined,
        des_email: $scope.cliente.des_email !== $scope.TSSInfo.des_email ? $scope.TSSInfo.des_email : undefined
      })

      // si parametrosUsuario tiene la propiedad 'cual' y al menos una más,
      // entonces se agrega el usuario y se hace la llamada a la api
      if (Object.keys(parametrosUsuario).length > 1) {
        parametrosUsuario.des_login = $scope.cliente.des_login
        $http.post('app/ws/ws_api.php', JSON.stringify(parametrosUsuario)).then(() => {
          // si lo actualizamos, se recarga la información visible en el dashboard cliente
          $scope.ventanaInfoCliente()
        })
      }

      $http.post('app/ws/ws_api.php', JSON.stringify(parametros)).then(function (msg) {
        if (msg.data.bool_error == '1') {
          $scope.bool_guardando_enfermedad = false;
          notificacion(msg.data.mensaje);
        } else {
          $scope.bool_guardando_enfermedad = false;
          Materialize.toast('Saved successfully', 1200);
          $scope.boolMostrarTSS = false
          $scope.des_enfermedad = "";
          $scope.recargarRecetaCliente();
          $scope.ventanaFichaClinica($scope.mascotas.cod_mascota);
        }
      });
    }

    $scope.modificarFichaClinica = async function () {
      $scope.bool_guardando_enfermedad = true;

     /* if ($scope.bool_nueva_clinica) {
        // guardar nueva clínica
        const newClinic = await guardarClinica()
        // agregar la nueva clínica al array de clínicas
        $scope.clinics.push(newClinic)
        $scope.TSSInfo.cod_clinic = newClinic.cod_sigla
        $scope.$digest()
      }*/

      const parametros = {
        cual: "modificarMascotaReceta",
        des_receta: $scope.mascotaReceta.des_receta,
        id_solicitud: $scope.mascotaReceta.id_solicitud,
        cod_receta: $scope.mascotaReceta.cod_receta,
        bool_activo: $scope.mascotaReceta.bool_activo,
        des_nota: $scope.mascotaReceta.des_nota,
        array_grupos: $scope.bundlesSeleccionados,
        bool_emergencia: $scope.emergenciaRecomendacion.boolEmergencia,
        bool_cliente_acepta: $scope.emergenciaRecomendacion.boolClienteAcepta,
        bool_recomendacion_adicional: $scope.emergenciaRecomendacion.boolRecomendacionAdicional,
        array_recetas: $scope.arrayCodRecetasSeleccionadas,
        array_inputs_recetas: $scope.arrayInputsRecetasSeleccionadas,
        nro_dias: $scope.emergenciaRecomendacion.nro_dias,
        des_comentario_video: $scope.mascotaReceta.des_comentario_video,
        des_nota_interna: $scope.mascotaReceta.des_nota_interna,
        des_doctor_complemento: $scope.TSSInfo.des_doctor_complemento,
      };

      $scope.emergenciaRecomendacion.boolRecomendacionAdicional && (parametos.nro_dias = $scope.emergenciaRecomendacion.nro_dias)

      // considerar el guardado de la información del cliente, como telefono, correo y clínica
      const parametrosUsuario =  Generals.quitarPropiedadesIndefinidas({
        cual: 'modificarUsuario',
        des_telefono: $scope.cliente.des_telefono !== $scope.TSSInfo.des_telefono ? $scope.TSSInfo.des_telefono : undefined,
        cod_sigla: $scope.cliente.cod_sigla !== $scope.TSSInfo.cod_clinic ? $scope.TSSInfo.cod_clinic : undefined,
        des_email: $scope.cliente.des_email !== $scope.TSSInfo.des_email ? $scope.TSSInfo.des_email : undefined
      })

      // si parametrosUsuario tiene la propiedad 'cual' y al menos una más,
      // entonces se agrega el usuario y se hace la llamada a la api
      if (Object.keys(parametrosUsuario).length > 1) {
        parametrosUsuario.des_login = $scope.cliente.des_login
        $http.post('app/ws/ws_api.php', JSON.stringify(parametrosUsuario)).then(() => {
          // si lo actualizamos, se recarga la información visible en el dashboard cliente
          $scope.ventanaInfoCliente()
        })
      }

      // considerar modificación de la mascota guardada
      const parametrosMascota = Generals.quitarPropiedadesIndefinidas({
        cual: 'modificarMascota',
        cod_mascota: $scope.mascotaReceta.cod_mascota,
        des_nombre_mascota: $scope.mascota.des_nombre_mascota,
        cod_especie: $scope.mascota.cod_especie,
        des_especie_otra: $scope.mascota.des_especie_otra,
        des_raza: $scope.mascota.des_raza,
        ind_sexo: $scope.mascota.ind_sexo,
        nro_peso: $scope.mascota.nro_peso,
        des_edad: $scope.mascota.des_edad,
        cod_edad_medida: $scope.mascota.cod_edad_medida,
        nro_ano: $scope.mascota.nro_ano,
        nro_mes: $scope.mascota.nro_mes,
        nro_semana: $scope.mascota.nro_semana,
        des_sexo: $scope.mascota.des_sexo,
        cod_peso: $scope.mascota.cod_peso
      })

      $http.post('app/ws/ws_api.php', JSON.stringify(parametrosMascota))

      $http.post('app/ws/ws_ficha_cliente.php', JSON.stringify(parametros)).then(function (msg) {
        if (msg.data.bool_error == '1') {
          $scope.bool_guardando_enfermedad = false;
          notificacion(msg.data.mensaje);
        }
        else {
          $scope.bool_guardando_enfermedad = false;
          Materialize.toast('Saved successfully', 1200);
          $scope.des_enfermedad = "";
          $scope.boolMostrarTSS = false
          $scope.recargarRecetaCliente();
          $scope.ventanaFichaClinica($scope.mascotas.cod_mascota);
        }
      });
    }

    $scope.ventanaAgregarMascota = function () {
      spinner('modal', 'l');
      $scope.mascota = {};

      $scope.bool_nuevo = true;

      $("#modal").modal({
        dismissible: false
      });

      $("#modal").modal('open');

      $templateRequest('app/templates/doctors/ficha_cliente/modalMascota.html').then(function (html) {
        
        $scope.mascota.cod_peso = "1";
        var template = angular.element(html);
        $("#modal").html(template);
        $compile(template)($scope);
      });
    }

    $scope.ventanaModificarNotas = function (sesion) {

      $scope.sesiones = angular.copy(sesion);

      spinner('modal', 'l');

      $scope.bool_nuevo = true;

      $("#modal").modal({
        dismissible: false
      });

      $("#modal").modal('open');

      $templateRequest('app/templates/doctors/ficha_cliente/modalNotas.html').then(function (html) {

        var template = angular.element(html);
        $("#modal").html(template);

        $('#des_nota').focus();

        $compile(template)($scope);
      });
    }

    $scope.guardarNota = function () {
      
      $scope.bool_guardando_nota = true;

      var parametros = {};
      parametros["id_solicitud"] = $scope.sesiones.id_solicitud;
      parametros["bool_problema"] = $scope.sesiones.bool_problema;
      parametros["des_problema"] = $scope.sesiones.des_problema;
      parametros["cod_tipo"] = $scope.sesiones.cod_tipo;
      parametros["des_tipo_mascota"] = $scope.sesiones.des_tipo_mascota;
      parametros["cod_raza"] = $scope.sesiones.cod_raza;
      parametros["des_raza"] = $scope.sesiones.des_raza;
      parametros["ind_sexo"] = $scope.sesiones.ind_sexo;
      parametros["des_sexo"] = $scope.sesiones.des_sexo;
      parametros["nro_peso"] = $scope.sesiones.nro_peso;
      parametros["cod_peso"] = $scope.sesiones.cod_peso;
      parametros["des_zip"] = $scope.sesiones.des_zip;
      parametros["des_nota"] = $scope.sesiones.des_nota;
      parametros["des_login"] = $scope.des_login;
      parametros["cod_mascota"] = $scope.sesiones.cod_mascota;
      parametros["cual"] = "ingresaNota";

      $http.post('app/ws/ws_dashboarddr.php', JSON.stringify(parametros)).then(function (msg) {
        if (msg.data.bool_error == '1') {
          $scope.bool_guardando_nota = false;
          notificacion(msg.data.mensaje);
        }
        else {
          $scope.bool_guardando_nota = false;
          Materialize.toast('Saved successfully', 1200);
          $scope.consultarClienteNota($scope.sesiones.id_solicitud);
          $scope.recargaSesiones();
          $scope.recargar();
          $scope.recargaSesionesMascota();
          $scope.cerrarModalFicha('modal');
          $scope.des_nota = "";
        }
      });
    }

    $scope.consultarClienteNota = function (id_solicitud) {

      var parametros = {};
      parametros["id_solicitud"] = id_solicitud;
      parametros["cual"] = "traeInfoPaciente";

      $http.post('app/ws/ws_dashboarddr.php', JSON.stringify(parametros)).then(function (msg) {

        $scope.notas = msg.data.traeinfopaciente.nota;
      });
    }

    $scope.ventanaModificarCliente = function (cliente) {

      $scope.clientes = angular.copy(cliente);
      $scope.bool_nuevo = false;

      $("#modal-medium").modal({
        dismissible: false
      });

      $("#modal-medium").modal('open');
      spinner('modal-medium', 'l');


      $templateRequest('app/templates/doctors/ficha_cliente/modalCliente.html').then(function (html) {
        var template = angular.element(html);
        $("#modal-medium").html(template);
        $compile(template)($scope);
        $(".select2").select2()
      });
    }

    $scope.ventanaModificarMascotaFicha = function () {
      $scope.mascota = angular.copy($scope.mascotas);
      $scope.bool_ficha = true;

      $("#modal-medium").modal({
        dismissible: false
      });

      $("#modal-medium").modal('open');
      spinner('modal-medium', 'l');

      //$scope.programa.nro_ano=$scope.programa.nro_ano.toString();

      $templateRequest('app/templates/doctors/ficha_cliente/modalMascota.html').then(function (html) {
        var template = angular.element(html);
        $("#modal-medium").html(template);
        $compile(template)($scope);
      });
    }

    $scope.modificarMascotaFicha = function (mascota) {
      spinner("ventanaMascotas", "l");

      var parametros = {};
      parametros["des_nombre"] = mascota.des_nombre;
      parametros["cod_tipo"] = mascota.cod_tipo;
      parametros["cod_raza"] = mascota.cod_raza;
      parametros["ind_sexo"] = mascota.ind_sexo;
      parametros["nro_peso"] = mascota.nro_peso;
      parametros["cod_mascota"] = mascota.cod_mascota;
      parametros["des_login"] = $scope.des_login;
      parametros["des_edad"] = mascota.des_edad;
      parametros["nro_ano"] = $scope.mascota.nro_ano;
      parametros["nro_mes"] = $scope.mascota.nro_mes;
      parametros["nro_semana"] = $scope.mascota.nro_semana;
      parametros["des_tipo_mascota"] = $scope.mascota.des_tipo_mascota;
      parametros["des_raza"] = $scope.mascota.des_raza;
      parametros["cod_peso"] = $scope.mascota.cod_peso;
      parametros["des_sexo"] = $scope.mascota.des_sexo;
      parametros["cual"] = "modificarMascota";

      $http.post('app/ws/ws_ficha_cliente.php', JSON.stringify(parametros)).then(function (msg) {
        //$scope.notas=msg.data;    

        $http.post('app/templates/doctors/ficha_cliente/ventana_mascotas.html', JSON.stringify(parametros)).then(function (msg) {
          if (msg.data.bool_error)
            notificacion(msg.data.mensaje);
          else {
            $scope.cerrarModalFicha('modal-medium');
            Materialize.toast('Saved successfully', 1200);
            $scope.ventanaMascotaFicha(mascota);
            $scope.recargarMascota();
          }
          $scope.bool_guardando = false;
        });
      });
    }

    $scope.ventanaModificarMascota = function (mascota) {

      $scope.mascota = angular.copy(mascota);
      $scope.bool_nuevo = false;

      $("#modal-medium").modal({
        dismissible: false
      });

      $("#modal-medium").modal('open');
      spinner('modal-medium', 'l');

      //$scope.programa.nro_ano=$scope.programa.nro_ano.toString();

      $templateRequest('app/templates/doctors/ficha_cliente/modalMascota.html').then(function (html) {
        var template = angular.element(html);
        $("#modal-medium").html(template);
        $compile(template)($scope);
      });
    }

    $scope.ventanaBorrarMascota = function (mascota) {
      $scope.mascotas = angular.copy(mascota);

      $("#modal").modal();
      $("#modal").modal('open');

      $("#modal").width('300px');
      $("#modal").height('200px');

      $templateRequest('app/templates/doctors/ficha_cliente/modalConfirmarBorrarMascota.html').then(function (html) {
        var template = angular.element(html);
        $("#modal").html(template);
        $compile(template)($scope);
      });
    }

    $scope.borrarMascota = function () {

      $scope.bool_guardando = true;

      if ($scope.mascotas.bool_activo == 0) { $scope.mascotas.bool_activo = 1; }
      if ($scope.mascotas.bool_activo == 1) { $scope.mascotas.bool_activo = 0; }

      var parametros = {};
      parametros["cod_mascota"] = $scope.mascotas.cod_mascota;
      parametros["bool_activo"] = $scope.mascotas.bool_activo;
      parametros["cual"] = "modificarMascota";

      $http.post('app/ws/ws_ficha_cliente.php', JSON.stringify(parametros)).then(function (msg) {
        Materialize.toast('Successfully removed', 1000);
        $scope.bool_guardando = false;
        $("#modal").modal('close');

        $scope.recargar();
      });

    }

    $scope.ventanaBorrarReceta = function (receta) {
      $scope.Borrarrecetas = angular.copy(receta);

      $("#modal").modal();
      $("#modal").modal('open');

      $("#modal").width('300px');
      $("#modal").height('200px');

      $templateRequest('app/templates/doctors/ficha_cliente/modalConfirmarBorrarReceta.html').then(function (html) {
        var template = angular.element(html);
        $("#modal").html(template);
        $compile(template)($scope);
      });
    }

    $scope.ventanaBorrarDocumento = function (documento) {
      $scope.Borrardocumentos = angular.copy(documento);

      $("#modal").modal();
      $("#modal").modal('open');

      $("#modal").width('300px');
      $("#modal").height('200px');

      $templateRequest('app/templates/doctors/ficha_cliente/modalConfirmarBorrarDocumento.html').then(function (html) {
        var template = angular.element(html);
        $("#modal").html(template);
        $compile(template)($scope);
      });
    }

    $scope.borrarReceta = function () {

      $scope.bool_guardando = true;

      if ($scope.Borrarrecetas.bool_activo == 0) { $scope.Borrarrecetas.bool_activo = 1; }
      if ($scope.Borrarrecetas.bool_activo == 1) { $scope.Borrarrecetas.bool_activo = 0; }

      var parametros = {};
      parametros["cod_receta"] = $scope.Borrarrecetas.cod_receta;
      parametros["bool_activo"] = $scope.Borrarrecetas.bool_activo;
      parametros["id_solicitud"] = $scope.Borrarrecetas.id_solicitud;
      parametros["des_receta"] = $scope.Borrarrecetas.des_receta;
      parametros["cual"] = "modificarMascotaReceta";

      $http.post('app/ws/ws_ficha_cliente.php', JSON.stringify(parametros)).then(function (msg) {
        Materialize.toast('Successfully removed', 1000);
        $scope.bool_guardando = false;
        $("#modal").modal('close');
        //$scope.recargar();
        $scope.recargarRecetaCliente();
        $scope.ventanaFichaClinica($scope.cod_mascota);
      });

    }

    $scope.borrarDocumento = function () {

      $scope.bool_guardando = true;

      var parametros = {};

      parametros["cod_documento"] = $scope.Borrardocumentos.cod_documento;
      parametros["cod_tipo"] = $scope.Borrardocumentos.cod_tipo;
      parametros["des_documento"] = $scope.Borrardocumentos.des_documento;
      //parametros["bool_activo"]=$scope.Borrardocumentos.bool_activo;


      parametros["cual"] = "borrarDocumento";

      $http.post('app/ws/ws_documento.php', JSON.stringify(parametros)).then(function (msg) {

        Materialize.toast('Successfully removed', 1000);
        $scope.bool_guardando = false;
        $("#modal").modal('close');
        $scope.recargarDocumentoMascota($scope.Borrardocumentos.cod_mascota);
        $scope.recargarDocumento();
      });

    }

    $scope.modificarCliente = function (cliente) {

      var parametros = {};
      parametros["cual"] = "modificarUsuario";
      parametros["des_nombre"] = cliente.des_nombre;
      parametros["des_apellido"] = cliente.des_apellido;
      parametros["des_email"] = cliente.des_email;
      parametros["des_telefono"] = cliente.des_telefono;
      parametros["cod_estado"] = cliente.cod_estado;
      parametros["des_login"] = cliente.des_login;
      parametros["des_zip"] = cliente.des_zip;
      parametros["cod_sigla"] = cliente.cod_sigla;
      parametros["cod_tipo_mascota"] = cliente.cod_tipo_mascota;

      $http.post('app/ws/ws_dashboarddr.php', JSON.stringify(parametros)).then(function (msg) {

        $http.post('app/templates/doctors/ficha_cliente/ventana_datos_cliente.html', JSON.stringify(parametros)).then(function (msg) {

          if (msg.data.bool_error)
            notificacion(msg.data.mensaje);
          else {
            $scope.cerrarModalFicha('modal-medium');
            Materialize.toast('Saved successfully', 1200);
            $scope.recargar();

          }
          $scope.bool_guardando = false;
        });
      });
    }

    $scope.borrarMascotaSolicitud = function (solicitud) {
      $scope.bool_guardando_enfermedad = true;

      var parametros = {};
      parametros["cod_mascota"] = solicitud.cod_mascota;
      parametros["id_solicitud"] = solicitud.id_solicitud;

      parametros["cual"] = "borrarMascotaSolicitud";

      $http.post('app/ws/ws_ficha_cliente.php', JSON.stringify(parametros)).then(function (msg) {
        if (msg.data.bool_error == '1') {
          $scope.bool_guardando_enfermedad = false;
          notificacion(msg.data.mensaje);
        }
        else {
          $scope.bool_guardando_enfermedad = false;
          Materialize.toast('Saved successfully', 1200);
          $scope.recargar();
          $scope.recargarClienteSesion(solicitud.id_solicitud);
          $scope.des_enfermedad = "";
        }
      });
    }

    $scope.recargarClienteSesion = function (id_solicitud) {
      parametros["id_solicitud"] = id_solicitud;
      parametros["cual"] = "consultarMascotaCliente";

      $http.post('app/ws/ws_ficha_cliente.php', JSON.stringify(parametros)).then(function (msg) {
        $scope.solicitudCliente = msg.data;
      });
    }

    $scope.ventanaModificarEnfermedadesCliente = function () {
      spinner('modal', 'l');
      $scope.mascotas = {};

      $scope.bool_nuevo = true;

      $("#modal").modal({
        dismissible: false
      });

      $("#modal").modal('open');

      var parametros = {};
      parametros["des_login"] = $scope.des_login;
      parametros["cual"] = "consultarMascota";

      $http.post('app/ws/ws_ficha_cliente.php', JSON.stringify(parametros)).then(function (msg) {
        $scope.mascotasCli = msg.data.mascotas;

        $templateRequest('app/templates/doctors/ficha_cliente/modalEnfermedadCliente.html').then(function (html) {
          var template = angular.element(html);
          $("#modal").html(template);
          $compile(template)($scope);
        });
      });
    }

    $scope.recargarDocumentoFichaAlumno = function () {

      var parametros = {};
      parametros["cual"] = "consultarDocumentos";
      parametros["cod_alurut"] = $scope.cod_alurut;
      parametros["nro_ano"] = $scope.modalAlumnoDocumento.nro_ano;
      parametros["nro_semestre"] = $scope.modalAlumnoDocumento.nro_semestre;
      parametros["cod_programa"] = $scope.modalAlumnoDocumento.cod_programa;
      parametros["cod_categoria"] = $scope.modalAlumnoDocumento.cod_categoria;

      $http.post('app/ws/administracion/ws_documento.php', JSON.stringify(parametros)).then(function (msg) {

        $scope.documentoAlumno = msg.data.documentos;
      });
    }

   $scope.enviarReceta = async function (cod_receta) {
      $scope.bool_enviando = true

      // separar contenidos de $scope.recetaEmail por ;
      const lista_emails = $scope.recetaEmail.split(';')

      // quitar espacios de los correos electrónicos
      for (let i = 0; i < lista_emails.length; i++) {
        lista_emails[i] = lista_emails[i].trim()
      }

      // validar que los correos ingresados en emails sean correos electrónicos válidos
      const validEmails = lista_emails.filter(email => {
        const regex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/
        return regex.test(email)
      })

      for (const email of lista_emails) {
        if (!validEmails.includes(email)) {
          Materialize.toast(`Invalid email address: ${email}`, 5000, 'red');
          $scope.bool_enviando = false
          return
        }
      }

      const stringEmails = validEmails.join(',')

      const ruta = `app/pdf/fichaClinica_email.php?cod_receta=${cod_receta}&emails=${stringEmails}&cod_idioma=${$scope.cliente.cod_idioma}`

      try {
            const response = await fetch(ruta);
            console.log(response)
            if (!response.ok) {
              throw new Error('Network response was not ok.');
            }
            const res = await response.json();
            console.log(res)

            Materialize.toast(res.mensaje, 3000);
             if (res.bool_enviado === 1) {
              $scope.cerrarModalFicha('modal');
            }
            $scope.bool_enviando = false
          } catch (err) {
            console.log(err);
          }

    }

    $scope.registroDiarioPDF = function () {

      var parametros = {};
      parametros["cod_alurut"] = $scope.cod_alurut;

      $window.open("app/pdf/registroDiario.php?cod_alurut=" + c$scope.cod_alurut);

    }

    $scope.videoCall = function (des_login, fecha, id_solicitud) {
      var parametros = {};
      parametros["cual"] = "videoCall";
      parametros["des_login"] = des_login;
      parametros["fecha"] = fecha;
      parametros["id_solicitud"] = id_solicitud;

      $des_login = des_login;
      $fecha = fecha;
      $id_solicitud = id_solicitud;

      $scope.fechaSolicitud = fecha;

      $scope.ventanaVideo = $window.open('', "VetTriage", 'toolbar=1,scrollbars=1,menubar=1,resizable=1,width=650, height=550,left = 300,top=100');

      var parametros2 = {};
      parametros2["cual"] = "sesionTomada";
      parametros2["des_login"] = des_login;
      parametros2["fecha"] = fecha;
      parametros2["id_solicitud"] = id_solicitud;

      $http.post('app/ws/ws_api.php', JSON.stringify(parametros2)).then(function (msg) {

        $scope.sesiontomada = msg.data.sesiontomada;

        if ($scope.sesiontomada == 1) {
          Materialize.toast("Session already taken by another doctor.", 3000);
          $scope.ventanaVideo.close();
        }
        else {

          $http.post('app/ws/ws_dashboarddr.php', JSON.stringify(parametros)).then(function (msg) {

            $scope.video = msg.data.video;

            $fecha_llamada = msg.data.fecha_llamada;
            $scope.room = msg.data.room;

            $scope.traeinicioLlamada($des_login, $fecha);
            $scope.traeVideoactivoDoctor();
            $scope.llamaVideo($scope.room);
            $scope.recargar();
            //$scope.solicitudesPendientes();
            //$scope.traeNota($id_solicitud);
            //$scope.traeInfoPaciente($id_solicitud);

            //window.open("http://10.0.1.28/vet/videochat.html");
            //window.open("http://10.0.1.28/vet/intranet/videochat.html?room="+msg.data.room);

          });
        }
      });
    }

    $scope.traeinicioLlamada = function (des_login, fecha) {

      var parametros = {};
      parametros["cual"] = "traeinicioLlamada";
      parametros["des_login"] = des_login;
      parametros["fecha"] = fecha;

      $http.post('app/ws/ws_dashboarddr.php', JSON.stringify(parametros)).then(function (msg) {

        $scope.inicio = msg.data.inicio;
      });
    }

    $scope.traeVideoactivoDoctor = function () {

      var parametros = {};
      parametros["cual"] = "traeVideoactivoDoctor";

      $http.post('app/ws/ws_dashboarddr.php', JSON.stringify(parametros)).then(function (msg) {

        $scope.videoactivo = msg.data.videoactivo;
      });
    }

    $scope.llamaVideo = function (room) {

      var parametros = {};
      parametros["cual"] = "llamaVideo";
      parametros["room"] = room;

      $http.post('app/ws/ws_dashboarddr.php', JSON.stringify(parametros)).then(function (msg) {

        $scope.llamavideo = msg.data.llamavideo;
        $scope.ventanaVideo.location.href = msg.data.llamavideo.videourl;
      });
    }

    $scope.traerModificarDocumento = function (documento) {

      $scope.documento = angular.copy(documento);

      if ($scope.documento == undefined)
        $scope.documento = {};

      $scope.modalTitulo = "Edit Document";
      $scope.boolNuevo = 0;

      if (documento == null) {
        $scope.modalTitulo = "Add Document";
        $scope.boolNuevo = 1;
        $scope.modalDocumento = {};
      }

      spinner("modal", "l");

      $("#modal").modal();
      $("#modal").modal('open');

      $("#modal").width('600px');
      $("#modal").height('480px');

      $("#modal").html("");

      var parametros = {};
      parametros["des_login"] = $scope.des_login;
      parametros["cual"] = "consultarMascota";

      $http.post('app/ws/ws_ficha_cliente.php', JSON.stringify(parametros)).then(function (msg) {

        $scope.mascotasDoc = msg.data.mascotas;

        $templateRequest('app/templates/doctors/ficha_cliente/modalDocumento.html').then(function (html) {

          var template = angular.element(html);
          $("#modal").html(template);
          $compile(template)($scope);
        });
      });
    }

    $scope.cargaArchivoAlumno = function () {

      var des_url_logo = $('#doc_alumno')[0].files[0];
      $scope.doc_alumno = des_url_logo.name;
      $scope.$apply()

      var extension = des_url_logo.name.split('.').pop().toLowerCase();
      var size = des_url_logo.size / (1024 * 1024);
      var mensaje = "";
      var error = false;

      /*
          if($.inArray(extension, ['pdf']) == -1) {
            mensaje += "El formato del archivo no corresponde<br>";
            error = true;
          }
          */
      if (size > 15) {
        mensaje += "File size limit exceeded";
        error = true;
      }

      if (error)
        Materialize.toast(mensaje, 3000);

      return true;
    }

    $scope.guardarDocumento = function () {

      $scope.bool_guardando = true;

      var puede = true;
      var mensaje = "";
      var doc_alumno = $('#doc_alumno')[0].files[0];

      if (doc_alumno == undefined || doc_alumno == '') {
        puede = false;
        mensaje += "No Document";
      }

      if (puede) {
        var data = new FormData();

        if ($scope.cod_mascota) {
          data.append("cod_mascota", $scope.cod_mascota);
        }
        else {
          data.append("cod_mascota", $scope.modalDocumento.cod_mascota);
        }

        data.append("cod_tipo", $scope.modalDocumento.cod_tipo);
        data.append("des_login", $scope.des_login);
        data.append("doc_alumno", doc_alumno);

        for (var pair of data.entries()) {
        }

        $http.post('app/ws/ws_subir_documento.php', data, {
          transformRequest: angular.identity,
          headers: { 'Content-Type': undefined }
        }).then(function (msg) {
          if (msg.data.status == "success") {
            $scope.bool_guardando = false;
            $scope.cerrarModalFicha('modal');
            //$scope.recargaProgramaAsignatura(programaAsignatura);
            $scope.recargarDocumento();
            $scope.recargarDocumentoMascota($scope.cod_mascota);

            Materialize.toast("Uploaded Successfully", 3000);
          }
          else {
            //notificacion(msg.data.mensaje);
            Materialize.toast(mensaje, 3000);
          }
        })
      }
      else{
        $scope.bool_guardando = false;
        Materialize.toast("No Document", 3000);
      }
    }

    $scope.recargarDocumento = function () {
      var parametros = {};
      parametros["des_login"] = $scope.des_login;
      parametros["cual"] = "consultarCliente";

      $http.post('app/ws/ws_ficha_cliente.php', JSON.stringify(parametros)).then(function (msg) {
        $scope.cliente = msg.data;
      });
      // Template de informacion personal
    }

    $scope.recargarDocumentoMascota = function (cod_mascota) {

      var parametros = {};
      parametros["cod_mascota"] = cod_mascota;
      parametros["cual"] = "consultarDocumentoCliente";

      // Template Notas
      $http.post('app/ws/ws_dashboarddr.php', JSON.stringify(parametros)).then(function (msg) {
        $scope.documentoMascota = msg.data.documentos;
      });
    }

    $scope.terminarSolicitud = function (fecha, id_solicitud) {

      var parametros = {};
      parametros["cual"] = "terminarSolicitud";
      parametros["des_login"] = $scope.des_login;
      parametros["fecha"] = fecha;
      parametros["id_solicitud"] = id_solicitud;

      $http.post('app/ws/ws_dashboarddr.php', JSON.stringify(parametros)).then(function (msg) {

        $scope.cliente.id_solicitud = 0;
        $scope.cliente.estadoVideo = 0;

        if ($scope.ventanaVideo !== undefined)
          $scope.ventanaVideo.close();
        // $location.path('/ficha_cliente/'+$scope.des_login);
        // $scope.cuantosTokens();      
        // $scope.traeVideoactivo();

      });
    }

    $scope.modalLinkSesion = function (id_solicitud) {

      var parametros = {};
      parametros["cual"] = "traeVideoactivo";
      parametros["id_solicitud"] = id_solicitud;
      console.log(parametros);
      $http.post('app/ws/ws_dashboarddr.php', JSON.stringify(parametros)).then(function (msg) {
        $("#modal").modal();
        $("#modal").modal('open');
  
        $("#modal").width('550px');
        $("#modal").height('300px');
        $scope.videoactivo = msg.data.videoactivo;
        $templateRequest('app/templates/doctors/ficha_cliente/modalLinkSesion.html').then(function (html) {
          var template = angular.element(html);
          $("#modal").html(template);
          $compile(template)($scope);
        });
        
      });
    }

    $scope.copyToClipboard = function() {
      const url = $scope.videoactivo.videourl;
      
      navigator.clipboard.writeText(url).then(function() {
        console.log('URL copied to clipboard successfully!');
      }).catch(function(err) {
        console.error('Could not copy text: ', err);
      });
    };

    $scope.descargarFichaAlumno = function () {

      location.href = 'app/excel/bbdd_ficha_alumnos.php';
    }

    $scope.descargarDocumento = function (documento) {

      var cod_documento = documento.cod_documento;

      location.href = 'app/ws/ws_descargar_documento.php?cod_documento=' + cod_documento;

    }

    $scope.traeVentanaEmail = function (cod_receta) {
      $scope.receta = cod_receta;
      $scope.recetaEmail = $scope.cliente.des_email;


      $("#modal").modal();
      $("#modal").modal('open');

      $("#modal").width('350px');
      $("#modal").height('200px');

      $templateRequest('app/templates/doctors/ficha_cliente/modalConfirmarEmail.html').then(function (html) {
        var template = angular.element(html);
        $("#modal").html(template);
        $compile(template)($scope);
      });
    }

    $scope.recargarTodo = function () {
      var parametros = {};
      parametros["cual"] = "consultarTipoMascota";
      parametros["bool_otro"] = 0;
      parametros["bool_activo"] = 1;
      $http.post('app/ws/ws_ficha_cliente.php', JSON.stringify(parametros)).then(function (msg) {
        $scope.tipos = msg.data.tipos;
      });

      var parametros = {};
      parametros["cual"] = "consultarTipoRaza";
      parametros["bool_otro"] = 1;
      $http.post('app/ws/ws_ficha_cliente.php', JSON.stringify(parametros)).then(function (msg) {
        $scope.razas = msg.data.razas;
      });

      var parametros = {};
      parametros["cual"] = "traerEstados";
      $http.post('app/ws/ws_dashboarddr.php', JSON.stringify(parametros)).then(function (msg) {
        $scope.estados = msg.data.estados;
      });

      var parametros = {};
      parametros["cual"] = "consultarTipoDocumento";
      parametros["bool_activo"] = "1";
      $http.post('app/ws/ws_documento.php', JSON.stringify(parametros)).then(function (msg) {
        $scope.tipoDocumentos = msg.data.tipos;
        //$scope.estados_academicos=msg.data.estados_academicos;
      });

      var parametros = {};
      parametros["cual"] = "traeTextoReceta";
      parametros["cod_receta"] = 1;
      $http.post('app/ws/ws_ficha_cliente.php', JSON.stringify(parametros)).then(function (msg) {
        $scope.texto = msg.data.textos;
        //$scope.estados_academicos=msg.data.estados_academicos;
      });
    }

    $scope.oncallProcedure = function () {
      $scope.cod_sigla = $scope.cliente["cod_sigla"];
      var parametros = {};
      parametros["cod_sigla"] = $scope.cod_sigla;
      parametros["cual"] = "oncallProcedure";

      $http.post('app/ws/ws_api.php', JSON.stringify(parametros)).then(function (msg) {
        $scope.des_procedure = msg.data.des_procedure;
        window.open('app/oncall_procedures/' + $scope.des_procedure, '_blank');

      });

      //window.open('app/oncall_procedures/Prince George, British Columbia Canadian Province Clinic Protocol.pdf', '_blank');
    }

    $scope.cerrarModalFicha = function (id) {
      $('#' + id).modal('close');
      $("#" + id).html("");
    }

    // CREACIÓN DE TSS

    $scope.bundlesSeleccionados = []
    $scope.vistaPrevia = true
    $scope.vistaPreviaRecetaModificada = false
    $scope.bool_receta_opciones = false
    $scope.arrayCodRecetasSeleccionadas = []
    $scope.arrayInputsRecetasSeleccionadas = []
    $scope.estiloPasoSeleccionado = {}

    //   0: 'Vista Previa TSS Actual',
    //   1: 'Información general de mascota y usuario',
    //   2: 'Seleccionar emergencia y recomendación adicional',
    //   3: 'Seleccionar Bundles para Modificar TSS',
    //   4: 'Modificar TSS',
    //   5: 'Texto personalizado que se incluye en TSS',
    //   6: 'Vista Previa TSS Modificada',
    //   7: 'Comentarios privados del TSS',

    $scope.pasosModificarTSS = [1, 0, 0, 0, 0, 0, 0, 0]
    $scope.pasosCompletadosTSS = [1, 1, 0, 0, 0, 0, 0, 0]
    // todo esto esta malo. solo funciona si pensamos que solo podemos ir hacia adelante, por eso de raiz esta malo.
   // Cuando me muevo digo adonde, pero tengo que sber donde estaba. Si no, podemos estar guardando los bundles al estar en el custom advice!!
    //primero, definamos el donde estoy. si creo uno nuevo estoy en el 2, si lo modifico parto en el 1.

    $scope.saltarPasoTSS = (nroPaso, saltarValidacion = 0) => {
      // si $scope.bool_nuevo es verdadero y el índice de $scope.pasosCompletadosTSS equivalente a nroPaso - 1 es 0, retornar
      if (!saltarValidacion) {
        if ($scope.bool_nuevo) {
          if (nroPaso === 1) {
            Materialize.toast('There is no TSS saved yet...', 3000)
            return
          }
        }
      }

      console.log($scope.mascotaReceta)
      console.log($scope.TSSInfo)
      console.log($scope.mascota)
      console.log($scope.summariesNoIncluidosConInput)

      let boolPuedeAvanzar
      let mensaje = ''
      let res

      // Se validan los pasos de atrás para adelante,
      // entendiendo que cada paso 'siguiente' requiere que el paso anterior esté validado antes de proseguir.
      // Cada función llamada representa uno de los pasos del TSS, y valida que la información existente sea correcta,
      // retornando un objeto que contiene 'boolPuedeAvanzar' y un 'mensaje', en caso de tener algún dato faltante.
      switch (nroPaso) {
        case 7:
          res = guardarTextoAdicional()
                    console.log(res)

          boolPuedeAvanzar = res.boolPuedeAvanzar
          if (!res.boolPuedeAvanzar) {
            mensaje = res.mensaje
            break
          }
        case 6:
          res = guardarTSS()
                    console.log(res)

          boolPuedeAvanzar = res.boolPuedeAvanzar
          if (!res.boolPuedeAvanzar) {
            break
          }
        case 5:
          res = guardarGrupo()
                    console.log(res)

          boolPuedeAvanzar = res.boolPuedeAvanzar
          if (!res.boolPuedeAvanzar) {
            mensaje = res.mensaje
            break
          }
        case 4:
          res = guardarConsideracionesPrevias()
                    console.log(res)

          boolPuedeAvanzar = res.boolPuedeAvanzar
          if (!res.boolPuedeAvanzar) {
            mensaje = res.mensaje
            break
          }
        case 3:
          res = guardarInfoGeneral()
          console.log(res)
          boolPuedeAvanzar = res.boolPuedeAvanzar
          if (!res.boolPuedeAvanzar) {
            mensaje = res.mensaje
            break
          }
        default:
          boolPuedeAvanzar = 1
          break;
      }

      console.log(boolPuedeAvanzar)
      if (boolPuedeAvanzar) {
        if ($scope.bool_nuevo) {
          if (validarPasoCompletado(nroPaso)) {
            saltarPasoValidado(nroPaso)
          } else {
            Materialize.toast('You must complete all previous steps before continuing', 3000, 'red')
            return
          }
        }

        $scope.pasosModificarTSS = [0, 0, 0, 0, 0, 0, 0, 0]
        $scope.pasosModificarTSS[nroPaso - 1] = 1

        const indice = document.getElementsByName('indice')
        for (const paso of indice) {
          paso.classList.remove('paso-tss-seleccionado')

          if (parseInt(paso.id.split('_')[1]) === (nroPaso - 1)) {
            paso.classList.add('paso-tss-seleccionado')
          }
        }
      } else {
        if (mensaje) {
          Materialize.toast(mensaje, 3000, 'orange')
        }
        Materialize.toast('Something is wrong with this step', 3000, 'red')
        return
      }

      console.log($scope.mascotaReceta)
      console.log($scope.TSSInfo)
      console.log($scope.mascota)
      console.log($scope.bundlesSeleccionados)
      console.log($scope.arrayCodRecetasSeleccionadas)
    }

    function validarPasoCompletado (nroPaso) {
      // todos los pasos anteriores a nroPaso son 1?
      const pasosAnteriores = $scope.pasosCompletadosTSS.slice(0, nroPaso - 1)
      return pasosAnteriores.every(v => v === 1)
    }

    function saltarPasoValidado (nroPaso) {
      $scope.pasosCompletadosTSS = [0, 0, 0, 0, 0, 0, 0, 0]
      for (let i = 0; i < nroPaso; i++) {
        $scope.pasosCompletadosTSS[i] = 1
      }
    }

    // PASO 0: botón para pasar de la vista previa a la información de cliente y mascota
    function editarTemplate () { }

    // PASO 1: Información general del TSS
    function guardarInfoGeneral () {
      let respuesta = {
        boolPuedeAvanzar: 1,
        mensaje: ''
      }

      // seleccionar fecha de la sesión
      // Al crear un nuevo Summary, es obligatorio seleccionar una fecha,
      // y esta se saca de la solicitud
      const id_solicitud = parseInt(document.getElementById('id_solicitud').value.replace('string:', '')) || undefined

      if ($scope.bool_nuevo && id_solicitud === undefined) {
        respuesta.boolPuedeAvanzar = 0
        respuesta.mensaje = 'You must specify the session date'
        const id = document.getElementById('id_solicitud_id')
        id.scrollIntoView({ behavior: 'smooth', block: 'center' })
        id.querySelector('label').classList.add('red-text')
        return respuesta
      } else if ($scope.bool_nuevo && id_solicitud !== undefined) {
        const id = document.getElementById('id_solicitud_id')
        id.querySelector('label').classList.remove('red-text')
      }

      $scope.mascotaReceta.id_solicitud = id_solicitud

      if (parseInt($scope.mascotaReceta.bool_nueva_version)) {
        if (!$scope.TSSInfo.cod_clinic || $scope.TSSInfo.cod_clinic == '') {
          respuesta.boolPuedeAvanzar = 0
          respuesta.mensaje = 'You must select a Clinic'
          const id = document.getElementById('cod_clinic_id')
          id.scrollIntoView({ behavior: 'smooth', block: 'center' })
          id.querySelector('label').classList.add('red-text')
          return respuesta
        } else if ($scope.TSSInfo.cod_clinic) {
          const id = document.getElementById('cod_clinic_id')
          id.querySelector('label').classList.remove('red-text')
        }

        if (!$scope.mascota.cod_especie) {
          respuesta.boolPuedeAvanzar = 0
          respuesta.mensaje = 'You must select a Species'
          const id = document.getElementById('cod_especie_id')
          id.scrollIntoView({ behavior: 'smooth', block: 'center' })
          id.querySelector('label').classList.add('red-text')
          return respuesta
        } else if ($scope.mascota.des_especie) {
          const id = document.getElementById('cod_especie_id')
          id.querySelector('label').classList.remove('red-text')
        }

        if (Number($scope.mascota.cod_especie) === 0) {
          if (!$scope.mascota.des_especie_otra) {
            respuesta.boolPuedeAvanzar = 0
            respuesta.mensaje = 'You must enter the Species\'s name'
            const id = document.getElementById('des_especie_otra_id')
            id.scrollIntoView({ behavior: 'smooth', block: 'center' })
            id.querySelector('label').classList.add('red-text')
            return respuesta
          } else if ($scope.mascota.des_especie_otra) {
            const id = document.getElementById('des_especie_otra_id')
            id.querySelector('label').classList.remove('red-text')
          }
        }

        if (!$scope.mascota.nro_peso || Number($scope.mascota.nro_peso) === 0) {
          respuesta.boolPuedeAvanzar = 0
          respuesta.mensaje = 'You must provide the weight'
          const id = document.getElementById('nro_peso_id')
          id.scrollIntoView({ behavior: 'smooth', block: 'center' })
          id.querySelector('label').classList.add('red-text')
          return respuesta
        } else if (Number($scope.mascota.nro_peso) !== 0) {
          const id = document.getElementById('nro_peso_id')
          id.querySelector('label').classList.remove('red-text')
        }

        if (!$scope.mascota.cod_peso || Number($scope.mascota.cod_peso) === 0) {
          respuesta.boolPuedeAvanzar = 0
          respuesta.mensaje = 'You must provide the weight unit'
          const id = document.getElementById('cod_peso_id')
          id.scrollIntoView({ behavior: 'smooth', block: 'center' })
          id.querySelector('label').classList.add('red-text')
          return respuesta
        } else if (Number($scope.mascota.cod_peso) !== 0) {
          const id = document.getElementById('cod_peso_id')
          id.querySelector('label').classList.remove('red-text')
        }

        if (parseInt($scope.mascota.des_edad) && !$scope.mascota.cod_edad_medida) {
          respuesta.boolPuedeAvanzar = 0
          respuesta.mensaje = 'You must enter the age unit'
          const id = document.getElementById('cod_edad_medida_id')
          id.scrollIntoView({ behavior: 'smooth', block: 'center' })
          id.querySelector('label').classList.add('red-text')
          return respuesta
        } else if ($scope.mascota.cod_edad_medida) {
          const id = document.getElementById('cod_edad_medida_id')
          id.querySelector('label').classList.remove('red-text')
        }

        if ($scope.TSSInfo.cod_clinic == 666) {
          if ($scope.new_clinic.des_clinic_nueva == '') {
            respuesta.boolPuedeAvanzar = 0
            respuesta.mensaje = 'You must enter the Clinic\'s name'
            const id = document.getElementById('des_clinic_nueva_id')
            id.scrollIntoView({ behavior: 'smooth', block: 'center' })
            id.querySelector('label').classList.add('red-text')
            return respuesta
          } else if ($scope.new_clinic.des_clinic_nueva) {
            const id = document.getElementById('des_clinic_nueva_id')
            id.querySelector('label').classList.remove('red-text')
          }

          if ($scope.new_clinic.cod_sigla == '') {
            respuesta.boolPuedeAvanzar = 0
            respuesta.mensaje = 'You must enter the Clinic\'s initials'
            const id = document.getElementById('cod_sigla_id')
            id.scrollIntoView({ behavior: 'smooth', block: 'center' })
            id.querySelector('label').classList.add('red-text')
            return respuesta
          } else if ($scope.new_clinic.cod_sigla) {
            const id = document.getElementById('cod_sigla_id')
            id.querySelector('label').classList.remove('red-text')
          }

          $scope.bool_nueva_clinica = true
        }

        const clinic = $scope.clinics.find(clinic => {
          return clinic.cod_clinic === $scope.TSSInfo.cod_clinic
        })
        $scope.TSSInfo.des_clinic = clinic.des_clinic

        // get des_tipo from $scope.tipos where cod_tipo equals $scope.mascota.cod_tipo
        for (let i = 0; i < $scope.especies.length; i++) {
          const especie = $scope.especies[i]

          if (parseInt(especie.cod_especie) === parseInt($scope.mascota.cod_especie)) {
            $scope.mascota.des_tipo = especie.des_especie
          }
        }

        // get des_raza from $scope.razas where cod_raza equals $scope.mascota.cod_raza
        for (let i = 0; i < $scope.razas.length; i++) {
          const raza = $scope.razas[i]

          if (parseInt(raza.cod_raza) === parseInt($scope.mascota.cod_raza)) {
            $scope.mascota.des_raza = raza.des_raza
          }
        }

        // woo hoo loops de informacion que ya sabiamos de antes!!!
        for (let i = 0; i < $scope.genero.length; i++) {
          const genero = $scope.genero[i]

          if (parseInt(genero.cod_sexo) === parseInt($scope.mascota.ind_sexo)) {
            $scope.mascota.des_sexo = genero.des_sexo
          }
        }

        // get des_edad from $scope.medidasEdad where cod_edad equals $scope.mascota.cod_edad
        for (let i = 0; i < $scope.medidasEdad.length; i++) {
          const medidaEdad = $scope.medidasEdad[i]

          if (parseInt(medidaEdad.cod_edad_medida) === parseInt($scope.mascota.cod_edad_medida)) {
            $scope.mascota.des_edad_medida = medidaEdad.des_edad_medida
          }
        }

        // get des_peso from $scope.peso where cod_peso equals $scope.mascota.cod_peso
        for (let i = 0; i < $scope.peso.length; i++) {
          const peso = $scope.peso[i]

          if (parseInt(peso.cod_peso) === parseInt($scope.mascota.cod_peso)) {
            $scope.mascota.des_peso = peso.des_peso
          }
        }

        for (let i = 0; i < $scope.cliente.mascotas.length; i++) {
          const mascota = $scope.cliente.mascotas[i]

          if (parseInt(mascota.cod_mascota) === parseInt($scope.mascotaReceta.cod_mascota)) {
            $scope.mascotaReceta.mascota = mascota
          }
        }

        return respuesta
      } else {
        Materialize.toast('This TSS is from an older version, and no Pet was associated with it', 10000)
        return respuesta
      }
    }

    // PASO 2: Asignar emergencia y recomendación adicional
    function guardarConsideracionesPrevias () {
      let respuesta = {
        boolPuedeAvanzar: 1,
        mensaje: ''
      }
      // $scope.emergenciaRecomendacion y sus contenidos están inicializados en la función $scope.ventanaModificarFichaClinica
      const boolOpcionEmergencia = document.getElementsByName('boolOpcionEmergencia')
      for (const opcion of boolOpcionEmergencia) {
        if (opcion.checked) {
          $scope.emergenciaRecomendacion.boolEmergencia = opcion.value
        }
      }

      const boolOpcionClienteAcepta = document.getElementsByName('boolOpcionClienteAcepta')
      for (const opcion of boolOpcionClienteAcepta) {
        if (opcion.checked) {
          $scope.emergenciaRecomendacion.boolClienteAcepta = opcion.value
        }
      }

      // obtenido con js puro, con ng-model no me resultó a la primera
      const opcionRecomendacionAdicional = document.getElementById('boolRecomendacionAdicional')
      $scope.emergenciaRecomendacion.boolRecomendacionAdicional = opcionRecomendacionAdicional?.checked ? 1 : 0

      // validación de nro_dias, dependiente de si boolRecomendacionAdicional es verdadero
      if (!parseInt($scope.emergenciaRecomendacion.boolEmergencia) ||
        (parseInt($scope.emergenciaRecomendacion.boolEmergencia) && !parseInt($scope.emergenciaRecomendacion.boolClienteAcepta))) {
        if (!$scope.emergenciaRecomendacion?.nro_dias) {
          respuesta.boolPuedeAvanzar = 0
          respuesta.mensaje = 'You must state the number of days for additional advice'
          const id = document.getElementById('nro_dias_id')
          id.scrollIntoView({ behavior: 'smooth', block: 'center' })
          setTimeout(() => id.focus(), 500)
        } else {
          const texto = $scope.plantilla[23].des_receta_plantilla.replace('#[number]#', $scope.emergenciaRecomendacion.nro_dias)
          $scope.emergenciaRecomendacion.des_texto = texto
        }
      } else {
        $scope.emergenciaRecomendacion.nro_dias = undefined
      }

      return respuesta
    }

    // PASO 3: Seleccionar Bundles para modificar TSS
    function guardarGrupo () {
      let respuesta = {
        boolPuedeAvanzar: 1,
        mensaje: ''
      }

      $scope.gruposRecetas = []
      const nok = seleccionarBundles()
      if (nok) {
        respuesta.boolPuedeAvanzar = 0
        respuesta.mensaje = 'You must select at least one Bundle'
      }

      $scope.filtrarRecetaPlantillasPorGrupo()

      return respuesta
    }

    // PASO 4: Construir TSS
    function guardarTSS () {
      let respuesta = {
        boolPuedeAvanzar: 0,
        mensaje: ''
      }

      const stringReceta = obtenerRecetaFinalizada()
      console.log(stringReceta);

      // Se verifica que la receta ingresada no tenga los placeholders de números sin reemplazar
      if (typeof stringReceta === 'string') {
        const arrayPalabrasEnReceta = stringReceta.split(' ')
        console.log(arrayPalabrasEnReceta)
        // si se encuentra el placeholder, se detiene el proceso, y no se muestra aún la previsualización
        if (!arrayPalabrasEnReceta.includes('#[number]#')) {
          respuesta.boolPuedeAvanzar = 1
        }
      }

      $scope.stringReceta = stringReceta

      return respuesta
    }

    // PASO 5: Incluir texto adicional en la receta
    function guardarTextoAdicional () {
      let respuesta = {
        boolPuedeAvanzar: 1,
        mensaje: ''
      }

      // Se guarda el texto ingresado en esta etapa para mantenerlo en scope.
      // Esto con la finalidad de poder volver a escribir el texto sin modificar después de modificarlo con las opciones seleccionadas
      const customText = tinymce.get('ui-tinymce-2')?.getContent()
      if (customText !== null &&
          customText !== undefined &&
          customText !== '') {
        $scope.mascotaReceta.des_nota = customText

        $scope.textoRecetaTSSTransitorio = $scope.mascotaReceta.des_nota.replace('<p>', `<p>${$scope.nroRecetasTSS}. `)
      }

      // Aquí se obtiene la fecha de la solicitud seleccionada, y posteriormente se asigna (si es una creación de receta)
      const [solicitud] = $scope.sesionMascotas.filter(s => parseInt(s.id_solicitud) === $scope.mascotaReceta.id_solicitud)
      $scope.bool_nuevo && ($scope.mascotaReceta.fec_creacion = solicitud?.fecha_llamada)

      // REVISAR:
      $scope.mascotaReceta.des_receta = $scope.stringReceta ? $scope.stringReceta : textoRecetaOriginal;
      $scope.bool_receta_opciones = false;

      return respuesta
    }

    // PASO 6: Validar Vista Previa TSS
    function guardarVistaPrevia () {
      let respuesta = {
        boolPuedeAvanzar: 1,
        mensaje: ''
      }

      return respuesta
    }

    // PASO 7: Texto privado
    function guardarTextoPrivado () {
      $scope.bool_nuevo ? $scope.guardarFichaClinica() : $scope.modificarFichaClinica()
    }

    $scope.guardarTextoPrivado = guardarTextoPrivado

    function guardarClinica () {
      return new Promise (async (resolve, reject) => {
        const parametros = {
          cual: 'guardarClinica',
          des_clinic: $scope.new_clinic.des_clinic_nueva,
          cod_sigla: $scope.new_clinic.cod_sigla
        }
        const { data } = await $http.post('app/ws/ws_api.php', JSON.stringify(parametros))
        resolve(data.clinic)
      })
    }

    function vistaOpcionesReceta () {
      // La variable $scope.mascotaReceta.des_receta se usa para guardar el texto final
      // Cuando se regresa desde la vista previa a ver las opciones, se deja el texto anterior.
      $scope.mascotaReceta.des_receta = $scope.texto_libre_receta;
      $scope.bool_receta_opciones = true;
      $scope.pasosCompletadosTSS[2] = 1

      if ($scope.pasosCompletadosTSS.slice(0, 2).every(v => v === 1)) {
        $scope.saltarPasoTSS(3)
        $scope.pasosModificarTSS = [0, 0, 1, 0, 0, 0, 0, 0]
      } else {
        Materialize.toast('You must complete all previous steps before continue', 3000)
      }
    }

    /**
     * Al seleccionar los 'Bundles' que se utilizaran para crear el TSS, los códigos de los bundles se agregan o quitan al array bundlesSeleccionables.
     * Esto sirve para extraer los textos de las recetas contenidos en los grupos seleccionados en este paso.
     * @returns {1|0} 0 si la selección no tuvo problemas, 1 si los tuvo.
     */
    function seleccionarBundles() {
      const bundles = document.getElementsByName('bundlesSeleccionado')

      for (let i = 0; i < bundles.length; i++) {
        const element = bundles[i];

        if (element.checked && !$scope.bundlesSeleccionados.includes(element.id)) {
          $scope.bundlesSeleccionados.push(element.id)
        }

        if (!element.checked && $scope.bundlesSeleccionados.includes(element.id)) {
          $scope.bundlesSeleccionados = $scope.bundlesSeleccionados.filter(b => b !== element.id)
        }
      }

      if ($scope.bundlesSeleccionados.length === 0) {
        return 1
      }

      return 0
    }

    // se traen los textos de las recetas que se pueden añadir/quitar, y vienen dados de acuerdo al idioma del paciente
    async function consultarPlantillasSummary() {
      const cod_idioma = $scope?.cliente?.cod_idioma
      const parametros = {
        cual: "consultarRecetas",
        cod_idioma
      };

      const msg = await $http.post('app/ws/ws_api.php', JSON.stringify(parametros))
      $scope.summaries = msg.data.recetas
      $scope.recetas_obligatorias = obtenerRecetasObligatorias($scope.summaries)
      $scope.array_recetas_obligatorias = []
      obtenerRecetasObligatorias($scope.summaries).forEach(r => {
        $scope.array_recetas_obligatorias.push(parseInt(r.cod_receta))
      })
    }

    function obtenerRecetasObligatorias(arrayRecetas) {
      return arrayRecetas.filter(r => r.bool_obligatoria && r)
    }

    /**
     * Función para recorrer y obtener las recetas con el texto de la misma, pero con inputs en lugar de texto "#[number]#"
     * @param {Array} arrayRecetas Todas las recetas que se recorrerán.
     * @returns {Array} Array de objetos con recetas
     */
    function obtenerRecetasConInput(arrayRecetas) {
      // arrayRecetas son todas las recetas existentes para revisar
      return arrayRecetas.map(r => {
        return { ...r, recetas: [{ des_receta: cambiarPlaceholdersPorInput(r.cod_receta) }] }
      })
    }

    function cambiarPlaceholdersPorInput(cod_receta) {
      try {
        let [textoReceta, bool_dosis] = obtenerTextoReceta({ cod_receta, summaries: $scope.summaries })

        // VARIABLES NUMÉRICAS
        if (!bool_dosis || true) {
          let cuenta = 0
          textoReceta.split(' ').forEach(w => w === '#[number]#' && cuenta++)

          if (cuenta > 0) {
            // se recorre cada input de una receta dada
            for (let i = 0; i < cuenta; i++) {
              let valor = ''

              // si la receta ya tenía valores, se les colocan en este momento
              if (!$scope.bool_nuevo && $scope.arrayRecetasIncluidasPreviamente.includes(parseInt(cod_receta))) {
                // se filtran las recetas que correspondan a la receta que está siendo revisada en este ciclo
                const [inputsReceta] = $scope.mascotaReceta.inputs.filter(ir => ir.cod_receta_idioma === cod_receta && ir)

                // si no tiene inputs asociados, se salta todo lo que venga
                if (!inputsReceta || inputsReceta.array_inputs.length === 0) return

                // si tiene inputs asociados, se asigna el valor del índice del ciclo superior,
                // que representa el índice en que fue guardado el input la primera vez (cuando se guardó esta receta)
                valor = inputsReceta.array_inputs[i]
              }

              const inputReceta = `<input type="number" id="receta_${cod_receta}_input_${i}" name="lista_inputs_summary" min="0" size="2" style="width:50px;margin:0px" value="${valor}">`

              textoReceta = textoReceta.replace('#[number]#', inputReceta)
            }
          }
        } else {
          // Si la receta corresponde a una Dosis, se muestra el template para dosis
          textoReceta = $scope.plantillaDosis.replace('#[des_titulo_receta]#', textoReceta).replaceAll('#[cod_receta]#', cod_receta)
        }

        return textoReceta
      } catch (error) {
        console.error(error)
      }
    }

    /** recibe el cod_receta del que se quiere saber si tiene inputs en su texto.
     * @param {number} cod_receta - el código de la receta de la que se quiere saber si tiene inputs
     * @param {boolean} bool_dosis - si la receta es una dosis o no, para aplicar una validación diferente
     * @return array donde el primer elemento es un bool que indica si tiene o no inputs, y,
     * de tenerlos, el segundo elemento del array es un array con los inputs
     */
    function recetaTieneInputs(cod_receta, bool_dosis = false) {
      cod_receta = parseInt(cod_receta)

      let res = [false, []]
      let arrayInputs = []
      let boolTieneInputs = false

      if (bool_dosis) {
        // si es una dosis, la lista de sus inputs esta en el elemento con id 'lista_inputs_dosis'
        const idInputsDosis = $scope.idInputsDosis.map(id => {
          return `${id}_${cod_receta}`
        })

        // recorrer los id de los inputs de la dosis
        for (let i = 0; i < idInputsDosis.length; i++) {
          const input = document.getElementById(idInputsDosis[i])
          arrayInputs.push(input)
        }

        res = [true, arrayInputs]

      } else if (!bool_dosis) {
        // se toman los inputs de la receta que se está revisando
        const inputs = document.getElementsByName('lista_inputs_summary')

        let recetaSeleccionada
        // buscamos entre los inputs el que corresponde a la receta que se está revisando
        //esto solo funciona para un input. por la cresta.
        for (let i = 0; i < inputs.length; i++) {
          const input = inputs[i]

          if (parseInt(input.id.split('_')[1]) === parseInt(cod_receta)) {
            recetaSeleccionada = input
          }
        }

        if (recetaSeleccionada !== undefined) {
          if (inputs.length > 0) {
            let arrayIdsRecetasRevisadas = []
            for (let i = 0; i < inputs.length; i++) {
              const input = inputs[i]

              // comparamos el id del input con el cod_receta que se está revisando, para retornar sólo los inputs de esa receta
              if (parseInt(input.id.split('_')[1]) === parseInt(cod_receta)) {
                arrayIdsRecetasRevisadas.push(parseInt(input.id))
                arrayInputs.push(input)
                boolTieneInputs = true
              }
            }
            res = [boolTieneInputs, arrayInputs]
          }
        }
      }

      return res
    }

    function obtenerTextoReceta(params) {
      let receta = ''
      let bool_dosis = false
      const cod_receta = parseInt(params?.cod_receta)
      const summaries = params?.summaries
      try {
        for (let i = 0; i < summaries.length; i++) {
          const s = summaries[i]
          if (s.recetas.length > 0) {
            if (s.recetas[0]?.cod_receta === cod_receta) {
              if (s.recetas[0]?.des_receta === null && s.bool_dosis) {
                // si es una dosis, se retorna como texto el título de la receta
                receta = s.des_titulo
                bool_dosis = true
              } else {
                receta = s.recetas[0].des_receta
              }
            }
          }
        }
        return [receta, bool_dosis]
      } catch (error) {
        console.error(error)
      }
    }

    function obtenerRecetaFinalizada() {
      const listaRecetas = document.getElementsByName('input_summary')
      const arrayRecetas = []
      let respuesta
      let textoDosis = ''
      let arrayCodRecetas = []
      let textoNotaModificado = false
      let boolRecetaContieneDosis = false
      let boolDosisOK = true
      let boolRecetaOK = true

      $scope.arrayInputsRecetasSeleccionadas = []
      $scope.arrayCodRecetasSeleccionadas = []

      // Se integra el texto libre a la receta final
      const textoNotaReceta = $scope.mascotaReceta.des_nota
      if (textoNotaReceta !== '' && textoNotaReceta !== undefined) {
        textoNotaModificado = textoNotaReceta !== textoNotaRecetaOriginal
      }

      let contadorRecetas = 1

      for (let i = 0; i < listaRecetas.length; i++) {
        const receta = listaRecetas[i];
        const cod_receta = receta.id.split('_')[2];
        arrayCodRecetas.push(parseInt(cod_receta))

        if (!$scope.arrayCodRecetasSeleccionadas.includes(cod_receta)) {
          $scope.arrayCodRecetasSeleccionadas.push(parseInt(cod_receta))
        }
        // saber si tiene inputs, y obtener la lista de ellos
        let [texto, boolContieneDosis] = obtenerTextoReceta({ cod_receta, summaries: $scope.summaries })
        if (!boolRecetaContieneDosis && boolContieneDosis) {
          boolRecetaContieneDosis = true
        }

        // si es dosis, el texto para rellenar viene desde una plantilla
        if (boolContieneDosis) {
          textoDosis = `<p>${texto} ${$scope.plantillaDosesReemplazo}`
        }

        // en el caso de las recetas normales, se valida si tienen inputs
        // las dosis por su lado siempre tienen inputs
        const res = recetaTieneInputs(cod_receta, boolContieneDosis);
        const [tieneInputs, inputs] = res

        if (tieneInputs) {
          const arrayInput = []
          let contadorAlertasDosis = 0
          console.log(inputs,inputs.length)
          for (let i = 0; i < inputs.length; i++) {
            const input = inputs[i];
            console.log(boolContieneDosis,Number(input.value))
            // validación de inputs que tiene un texto
            if (!boolContieneDosis && Number(input.value) <= 0) {
              boolRecetaOK = false
              let contador = 0
              if (contador === 0) {
                const id = document.getElementById(input.id)
                id.scrollIntoView({ behavior: 'smooth', block: 'center' })
                setTimeout(() => id.focus(), 500)
                setTimeout(() => contador = 0, 3000)

                // para las recetas que no son dosis, se revisa que no tengan inputs vacíos, representados por un '#[number]#' en el texto
                if (texto.includes('#[number]#')) {
                  const inputAncestro = input.parentNode.parentNode.parentNode
                  const nroOrden = inputAncestro.getAttribute('data-nro-orden')
                  const nroInput = Number(id.id.split('_')[3]) + 1

                  Materialize.toast(`You must fill the input number ${nroInput} from the Advice number ${nroOrden}`, 5000, 'red')
                }

                contador++
              }
            } else if (!boolContieneDosis && Number(input.value) > 0) {
              // se reemplaza la primera coincidencia con el valor del input
              console.log(texto)
              texto = texto.replace('#[number]#', input.value.toString())
              console.log(texto)

              const objeto_input = {
                cod_receta: parseInt(cod_receta),
                nro_orden: i + 1,
                des_input: input.value.toString()
              }
              // arrayInput.push(parseInt(input.value))
              arrayInput.push(objeto_input)
            }

            // para las dosis, se revisa que no tengan inputs vacíos, por lo que cada elemento del array de inputs se revisa y debe tener un valor válido
            if (boolContieneDosis) {
              // si el tipo de input es un select, se revisa que tenga un valor seleccionado
              if (input.tagName === 'SELECT') {
                if (input.value === '' || input.value === undefined) {
                  boolDosisOK = false
                  const id = document.getElementById(input.id)
                  id.scrollIntoView({ behavior: 'smooth', block: 'center' })
                  setTimeout(() => id.focus(), 500)
                  setTimeout(() => contadorAlertasDosis = 0, 3000)

                  Materialize.toast(`You must select a measurement for the ${texto} dosage`, 5000, 'red')
                  contadorAlertasDosis++
                } else {
                  textoDosis = textoDosis.replace('#[des_dosis_medida]#', input.options[input.selectedIndex].text)
                }
              }

              // si el tipo de input es texto, se revisa que no esté vacío
              if (input.tagName === 'INPUT') {
                if (input.type === 'text') {
                  if (input.value === '' || input.value === undefined) {
                    boolDosisOK = false
                    const id = document.getElementById(input.id)
                    id.scrollIntoView({ behavior: 'smooth', block: 'center' })
                    setTimeout(() => id.focus(), 500)
                    setTimeout(() => contadorAlertasDosis = 0, 3000)

                    let textoToast = ''
                    if (input.id.includes('des_dosis_frecuencia')) {
                      textoToast = 'Frequency'
                    } else if (input.id.includes('des_dosis_duracion')) {
                      textoToast = 'Duration'
                    } else if (input.id.includes('des_dosis_instruccion')) {
                      textoToast = 'Instructions'
                    }

                    Materialize.toast(`You must fill the ${textoToast} input for the ${texto} dosage`, 5000, 'red')
                    contadorAlertasDosis++
                  } else {
                    // revisar cuál input se está llenando, y reemplazar el texto correspondiente
                    if (input.id.includes('des_dosis_frecuencia')) {
                      textoDosis = textoDosis.replace('#[des_dosis_frecuencia]#', input.value)
                    } else if (input.id.includes('des_dosis_duracion')) {
                      textoDosis = textoDosis.replace('#[des_dosis_duracion]#', input.value)
                    } else if (input.id.includes('des_dosis_instruccion')) {
                      textoDosis = textoDosis.replace('#[des_dosis_instrucciones]#', input.value)
                    }
                  }
                } else if (input.type === 'number') {
                  if (Number(input.value) === 0) {
                    boolDosisOK = false
                    const id = document.getElementById(input.id)
                    id.scrollIntoView({ behavior: 'smooth', block: 'center' })
                    setTimeout(() => id.focus(), 500)
                    setTimeout(() => contadorAlertasDosis = 0, 3000)

                    Materialize.toast(`You must fill the numeric input from the ${texto} dosage`, 5000, 'red')
                    contadorAlertasDosis++
                  } else {
                    textoDosis = textoDosis.replace('#[nro_dosis_cantidad]#', input.value)
                  }
                }
              }
            }
          }

          $scope.arrayInputsRecetasSeleccionadas.push(arrayInput)
        } else {
          $scope.arrayInputsRecetasSeleccionadas.push([])
        }

        if (boolContieneDosis) {
          texto = textoDosis.replace('<p>', `<p>${contadorRecetas}. `)
        } else {
          texto = texto.replace('<p>', `<p>${contadorRecetas}. `)
        }

        arrayRecetas.push(texto)
        contadorRecetas++
      }

      // número usado para asignarle el número siguiente a la nota escrita por el doctor
      $scope.nroRecetasTSS = contadorRecetas

      console.log(boolRecetaOK,boolDosisOK);
      if (boolRecetaOK && boolDosisOK) {
        $scope.bool_obtuvo_receta_final = true
        return arrayRecetas.join(' <br>')
      } else {
        return false
      }
    }

    // estos son los textos básicos que cambian solo el idioma, dependiendo del idioma del paciente que está siendo revisado
    async function consultarRecetaPlantillas() {
      const cod_idioma = $scope?.cliente?.cod_idioma
      const parametros = {
        cual: 'consultarRecetaPlantilla',
        cod_idioma: cod_idioma
      }

      const msg = await $http.post('app/ws/ws_api.php', JSON.stringify(parametros))
      $scope.plantilla = msg.data.plantillas
      $scope.$digest()
    }

    async function consultarRecetaGrupos() {
      let cod_idioma = $scope?.cliente?.cod_idioma === undefined ? 1 : $scope.cliente.cod_idioma
      $scope?.cliente?.cod_idioma === 'en' && (cod_idioma = 1)
      const parametros = { cual: 'consultarRecetaGrupo', cod_idioma, cod_tipo_mascota: $scope.cliente.cod_tipo_mascota }
      const msg = await $http.post('app/ws/ws_api.php', JSON.stringify(parametros))
      $scope.grupo_receta = msg.data.grupos

      // crear un nuevo array que contenga todas las recetas disponibles dentro de $scope.grupo_receta
      let summaries = []
      $scope.grupo_receta.forEach(g => {
        g.grupo_recetas.forEach(receta => {
          receta.recetas.forEach(r => {
            // receta que venga solo con el texto en el idioma correspondiente
            const receta_a_insertar = receta.recetas.filter(ri => parseInt(ri.cod_idioma) === parseInt(cod_idioma) && r)
            summaries.push(receta_a_insertar[0])
          })
        })
      })

      $scope.$digest()
    }

    async function consultarDosisMedidas() {
      $scope.dosis_medidas = await Filters.consultarDosisMedidas()
      $scope.$digest()
  }

    /**
     * Se filtran las recetas disponibles que están en los bundles seleccionados
     */
    $scope.filtrarRecetaPlantillasPorGrupo = () => {
      let recetas = []
      let recetasNoIncluidas = []
      let arrayCodigosRecetasIncluidasGrupo = []
      /**
       * arrayCodigosRecetasIncluidas: array que contiene los códigos de las recetas que ya han sido incluidas en el TSS
       */
      let arrayCodigosRecetasIncluidas = []

      // ***********
      // podemos saber si es primera vez que se agregan recetas revisando si el $scope.summaries_con_input está vacío
      let boolRecetaIncluida = false
      if ($scope.summaries_con_input.length !== 0) {
        boolRecetaIncluida = true
        for (let i = 0; i < $scope.summaries_con_input.length; i++) {
          const receta = $scope.summaries_con_input[i]
          recetas.push(receta)
          arrayCodigosRecetasIncluidas.push(parseInt(receta.cod_receta))
        }
      }
      // ***********

      // SOLO SI ES NUEVO Y POR PRIMERA VEZ:
      // SE REVISAN LOS GRUPOS SELECCIONADOS EN ESTA ITERACIÓN
        if ($scope.bool_nuevo && !boolRecetaIncluida) {
          for (const grupo of $scope.grupo_receta) {
            if ($scope.bundlesSeleccionados.includes(grupo.cod_grupo_receta)) {
              console.log(grupo.cod_grupo_receta)
              for (const receta of grupo.grupo_recetas) {
                console.log(receta)
                if (!arrayCodigosRecetasIncluidasGrupo.includes(parseInt(receta.cod_receta))) {
                  recetas.push(receta)
                  arrayCodigosRecetasIncluidasGrupo.push(parseInt(receta.cod_receta))
                  $scope.arrayCodRecetasSeleccionadas.push(parseInt(receta.cod_receta))
                }
              }
            }
          }
          console.log($scope.bundlesSeleccionados,recetas,$scope.arrayCodRecetasSeleccionadas)
          // que tal si seleccionamos los advices para que no se caiga todo? buena idea verdad?
          // en este desastre llamado tss , se guardan en     $scope.arrayCodRecetasSeleccionadas
         // $scope.arrayCodRecetasSeleccionadas = cargarAdvicesporBundle($scope.bundlesSeleccionados);

        }

        // SIEMPRE:
        // SE FILTRAN LAS RECETAS QUE NO ESTÁN INCLUIDAS EN LA SELECCIÓN ACTUAL
        for (const receta of $scope.summaries) {
          // Se filtran ya que la misma receta puede existir en diferentes grupos de recetas
          if (!$scope.arrayCodRecetasSeleccionadas.includes(parseInt(receta.cod_receta))) {
            recetasNoIncluidas.push(receta)
            // arrayCodigosRecetasNoIncluidas.push(parseInt(receta.cod_receta))
          }
        }

        // ordenar arrayRecetas no incluidas de acuerdo a su cod_receta
        recetasNoIncluidas.sort((a, b) => a.cod_receta - b.cod_receta)
        console.log(recetasNoIncluidas)
        // SIEMPRE:
        // A LAS RECETAS SELECCIONADAS SE LE AÑADEN LAS OBLIGATORIAS
        for (const receta of $scope.recetas_obligatorias) {
          if (!arrayCodigosRecetasIncluidasGrupo.includes(parseInt(receta.cod_receta))) {
            recetas.push(receta)
            arrayCodigosRecetasIncluidasGrupo.push(parseInt(receta.cod_receta))
          }
        }

        $scope.arrayRecetasIncluidasPreviamente = []
        const arrayRecetasIncluidas = []
        let gruposSeleccionadosAnterior = []
        if (!$scope.bool_nuevo) {
          if ($scope.mascotaReceta?.inputs !== undefined) {
            for (let x = 0; x < $scope.mascotaReceta.inputs.length; x++) {
              const receta = $scope.mascotaReceta.inputs[x]
              $scope.arrayRecetasIncluidasPreviamente.push(parseInt(receta.cod_receta_idioma))
            }
          }

          for (let i = 0; i < $scope.summaries.length; i++) {
            const receta = $scope.summaries[i]
            if ($scope.arrayRecetasIncluidasPreviamente.includes(parseInt(receta.cod_receta))) {
              arrayRecetasIncluidas.push(receta)
            }
          }

          if ($scope?.mascotaReceta?.des_grupos !== undefined) {
            const gruposSeleccionados = $scope.mascotaReceta.des_grupos.split(',')
            gruposSeleccionadosAnterior = gruposSeleccionados.map(g => parseInt(g)).sort((a, b) => a - b)
          }

        }

        const gruposSeleccionadosActual = $scope.bundlesSeleccionados.map(g => parseInt(g)).sort((a, b) => a - b)

        // si esta es la primera vez que seleccionan grupos, se asignan los grupos seleccionados a la variable $scope.bundlesSeleccionadosOriginal
        if ($scope.bundlesSeleccionadosOriginal.length === 0) {
          $scope.bundlesSeleccionadosOriginal = structuredClone(gruposSeleccionadosActual)
        }

        let recetasParaObtener
        if ($scope.bool_nuevo) {
          recetasParaObtener = recetas
          const recetasNuevas = []
          if ($scope.bundlesSeleccionadosOriginal.toString() !== gruposSeleccionadosActual.toString()) {
            for (const grupo of $scope.grupo_receta) {
              if ($scope.bundlesSeleccionados.includes(grupo.cod_grupo_receta)) {
                for (const receta of grupo.grupo_recetas) {
                  if (!arrayCodigosRecetasIncluidasGrupo.includes(parseInt(receta.cod_receta))) {
                    recetasNuevas.push(receta)
                    arrayCodigosRecetasIncluidasGrupo.push(parseInt(receta.cod_receta))
                  }
                }
              }
            }

            recetasParaObtener = recetasNuevas
          }
        } else {
          // si no es nuevo, y cambia el grupo seleccionado, recetasParaObtener queda igual a summaries
          // si no cambia el grupo seleccionado, se mantiene el array de recetas que fueron guardadas anteriormente
          if (gruposSeleccionadosAnterior.toString() === gruposSeleccionadosActual.toString()) {
            if (!$scope.bool_obtuvo_receta_final) {
              recetasParaObtener = arrayRecetasIncluidas
            } else {
              recetasParaObtener = $scope.summaries_con_input
            }
          } else {
            recetasParaObtener = recetas
          }
        }

        // $scope.summaries_con_inpus representa la lista a la izquierda (TSS Build), que son las recetas que han sido seleccionadas
        // estas pueden o no estar en las recetas incluidas en el grupo seleccionado, por lo que se filtran desde los
        // summaries generales
        // Para el caso de las Dosis, es necesario recompilar para que las etiquetas `<select>` se muestren correctamente

        $scope.summaries_con_input = obtenerRecetasConInput(recetasParaObtener)
        $scope.summariesNoIncluidosConInputSinFiltrar = obtenerRecetasConInput(recetasNoIncluidas)
        $scope.summariesNoIncluidosConInput = structuredClone($scope.summariesNoIncluidosConInputSinFiltrar)
        $timeout(() => {
          $compile(document.getElementsByName('lista_inputs_dosis'))($scope)
        }, 500)
      // }
    }

    function cargarAdvicesporBundle(bundles)
    {
      return [];
    }


    function consultarDoctores () {
      const parametros = { cual: 'consultaUsuarioDoctor' }

      $http.post('app/ws/ws_api.php', JSON.stringify(parametros)).then(function (msg) {
        $scope.doctors = msg.data.doctors
      })
    }

    function consultarPlantillaDosis() {
      $scope.idInputsDosis = [
        'nro_dosis_cantidad',
        'des_dosis_medida',
        'des_dosis_frecuencia',
        'des_dosis_duracion',
        'des_dosis_instrucciones'
      ]

      const parametros = {
        cual: 'consultarRecetaPlantillaDosis',
        cod_idioma: $scope.cliente?.cod_idioma === 'en' || $scope.cliente?.cod_idioma === undefined ? 1 : 2
      }

      $http.post('app/ws/ws_api.php', JSON.stringify(parametros)).then(function (msg) {
        // plantilla HTML
        $scope.plantillaDosis = msg.data.plantilla.des_plantilla_dosis
        // plantilla para reemplazar en el texto de dosis
        $scope.plantillaDosesReemplazo = msg.data.plantilla.des_plantilla_dosis_reemplazo
      })
    }

    $scope.modificarUsuarioSesion = async () => {
      const parametros = {
        cual: 'modificarFichaSolicitudSesion',
        id_solicitud: $scope.sesion.id_solicitud,
        des_doctorlogin: $scope.sesion.des_doctorlogin,
        bool_valido: $scope.sesion.bool_valido
      }
      console.log($scope.sesion)
      console.log(parametros) 
      const msg = await $http.post('app/ws/ws_api.php', JSON.stringify(parametros))
      Materialize.toast(msg.data.mensaje, 3000)
      if (msg.data.bool_error === 0) {
        console.log(msg.data)
        $scope.cerrarModalFicha('modal');
        $scope.recargaSesiones()
      }
    }

    $scope.ventanaModificarSesion = function (sesion) {
      $scope.sesion = { ...sesion }
      console.log($scope.sesion)
      consultarDoctores()

      spinner('modal', 'l')
      $scope.bool_nuevo = true

      $("#modal").modal({ dismissible: false })
      $("#modal").modal('open')

      $templateRequest('app/templates/doctors/ficha_cliente/modalModificarSesion.html').then(function (html) {
        const template = angular.element(html)
        $("#modal").html(template)
        $compile(template)($scope)
      })
    }

       // variable para controlar la cantidad de mensajes de "error" al intentar mover una receta obligatoria
   let = boolMensajeErrorAlMoverRecetaObligatoria = 1

   $scope.reordenar = {
     containment: '#sortable-horizontal',
     accept: (sourceItemHandleScope, destSortableScope) => {
       const puede = sourceItemHandleScope.itemScope.s.bool_obligatoria === 0
       if (!puede) {
         if (boolMensajeErrorAlMoverRecetaObligatoria) {
           Materialize.toast("This advice cannot be moved", 3000, 'red')
         }

         boolMensajeErrorAlMoverRecetaObligatoria = 0
         // cuando desaparece el toast con el mensaje de error, se vuelve a permitir mostrar el mismo mensaje
         setTimeout(() => { boolMensajeErrorAlMoverRecetaObligatoria = 1 }, 3000)
       }
       return puede
     },
     itemMoved: (event) => { // aquí están los eventos cuando se cambia de columna
       // event.source.itemScope.modelValue.status = event.dest.sortableScope.$parent.column.name;
     },
     orderChanged: async (event) => { // eventos cuando cambia de orden
       // let recetas = []
       // for (const [key, value] of Object.entries($scope.summaries_con_input)) {
       //     const key_plus = parseInt(key) + 1
       //     recetas.push({ nro_orden: key_plus, cod_receta: parseInt(value.cod_receta) })
       // }

       // const parametros = {
       //     cual: 'modificarAdministracionRecetaOrden',
       //     recetas
       // }

       // await $http.post('app/ws/ws_api.php', JSON.stringify(parametros))
     }
   };

   $scope.buscarReceta = () => {
     const desBusqueda = document.getElementById('busquedaReceta').value
     let summariesPorFiltrar = []

     if (desBusqueda?.length === 0 || desBusqueda === undefined) {
       $scope.summariesNoIncluidosConInput = structuredClone($scope.summariesNoIncluidosConInputSinFiltrar)
       return
     }

     if (desBusqueda?.length > 2) {
       const res = $scope.summariesNoIncluidosConInputSinFiltrar.filter(s => {
         const expresion = new RegExp(desBusqueda, 'i')
         const arrayPalabrasTitulo = s.des_titulo.toLowerCase().split(' ')
         for (const palabra of arrayPalabrasTitulo) {
           if (palabra.match(expresion)) {
             return s
           }
         }

         if (s.recetas[0].des_receta) {
           const arrayPalabrasReceta = s.recetas[0].des_receta.toLowerCase().split(' ')
           for (const palabraReceta of arrayPalabrasReceta) {
             if (palabraReceta.match(expresion)) {
               return s
             }
           }
         }
       })

       $scope.summariesNoIncluidosConInput = res
     }
   }
   
   async function guardarMascotaTSS () {
     const parametros = Generals.quitarPropiedadesIndefinidas({
       cual: 'guardarMascota',
       cod_acogida: $scope.mascota.cod_acogida,
       cod_peso: $scope.mascota.cod_peso,
       cod_raza: $scope.mascota.cod_raza,
       des_raza: $scope.mascota.des_raza,
       cod_edad_medida: $scope.mascota.cod_edad_medida,
       cod_especie: $scope.mascota.cod_especie,
       des_edad: $scope.mascota.des_edad,
       des_login: $scope.des_login,
       des_nombre_mascota: $scope.mascota.des_nombre_mascota,
       des_raza_otra: $scope.mascota.des_raza,
       des_sexo: $scope.mascota.des_sexo,
       des_especie_otra: $scope.mascota.des_especie_otra,
       ind_sexo: $scope.mascota.ind_sexo,
       nro_ano: $scope.mascota.nro_ano,
       nro_mes: $scope.mascota.nro_mes,
       nro_peso: $scope.mascota.nro_peso,
       nro_semana: $scope.mascota.nro_semana
     })

     if (parametros.cod_especie === '0') {
       if (!parametros.des_especie_otra) {
         Materialize.toast('You must enter a Species for this pet', 3000, 'red')
         return
       } else if (!parametros.des_raza_otra) {
         Materialize.toast('You must enter a Breed for this pet', 3000, 'red')
         return
       }
     }

     const msg = await $http.post('app/ws/ws_api.php', JSON.stringify(parametros))
     Materialize.toast(msg.data.mensaje, 3000)
     if (msg.data.bool_error === 0) {
       $scope.cliente.mascotas = msg.data.mascotas

       // asignar mascota recién creada en mascotaReceta.cod_mascota
       // $scope.mascotaReceta.cod_mascota = msg.data.cod_mascota_nueva
       $scope.bool_crear_mascota = false
       $scope.$digest()
       return msg.data.cod_mascota_nueva
     }
   }

   $scope.seleccionarGruposBusqueda = () => {
     // si $scope.busqueda.cod_grupo_receta está vacío, $scope.summariesNoIncluidosConInput tiene todos las recetas disponibles
     if ($scope.busqueda.cod_grupo_receta.length === 0) {
       $scope.summariesNoIncluidosConInput = structuredClone($scope.summariesNoIncluidosConInputSinFiltrar)
       return
     }

     /*
     1 filtrar los grupos seleccionados
     2 obtener las recetas de los grupos seleccionados
     3 filtrar las recetas de los grupos seleccionados para que no se repitan
     4 asignar a $scope.summariesNoIncluidosConInput
     */

     // 1
     const gruposSeleccionados = $scope.grupo_receta.filter(gr => {
       if ($scope.busqueda.cod_grupo_receta.length > 0) {
         if ($scope.busqueda.cod_grupo_receta.includes(gr.cod_grupo_receta)) {
           return gr
         }
       }
     })

     // 2
     let recetasDeGruposSeleccionados = []
     for (const grupo of gruposSeleccionados) {
       for (const receta of grupo.grupo_recetas) {
         recetasDeGruposSeleccionados.push(receta)
       }
     }

     // 3
     let arrayrecetasDeGruposSeleccionadosSinRepetir = []
     let recetasDeGruposSeleccionadosSinRepetir = []
     for (const receta of recetasDeGruposSeleccionados) {
       if (!arrayrecetasDeGruposSeleccionadosSinRepetir.includes(receta.cod_receta)) {
         const recetaConInput = { ...receta, recetas: [{ des_receta: cambiarPlaceholdersPorInput(receta.cod_receta)}]}
         recetasDeGruposSeleccionadosSinRepetir.push(recetaConInput)
         arrayrecetasDeGruposSeleccionadosSinRepetir.push(receta.cod_receta)
       }
     }

     // ordenar arrayRecetas no incluidas de acuerdo a su cod_receta
     recetasDeGruposSeleccionadosSinRepetir.sort((a, b) => a.cod_receta - b.cod_receta)

     // 4
     $scope.summariesNoIncluidosConInput = recetasDeGruposSeleccionadosSinRepetir
   }

   $scope.volverVerListaTSS = () => {
     $scope.boolMostrarTSS = false
   }

   $scope.considerarTextoPersonalizado = () => {
     $scope.boolTxtPersonalizado = !$scope.boolTxtPersonalizado
   }

   $scope.agregarQuitarReceta = (boolAgregar, receta) => {
     let mensajeRespuesta = ''
     if (boolAgregar) {
       $scope.summaries_con_input.push(receta)
       $scope.summariesNoIncluidosConInput = $scope.summariesNoIncluidosConInput.filter(r => r.cod_receta !== receta.cod_receta)
       mensajeRespuesta = 'Advice added'
       
       // las dosis, al tener un <select> traido por BD, deben recompilarse cada vez que son movidas
       // se hace solo al agregar recetas, ya que las que no están incluidas no requieren mostrar el select
       $timeout(() => {
         $compile(document.getElementsByName('lista_inputs_dosis'))($scope)
        }, 500)
      } else {
        $scope.summaries_con_input = $scope.summaries_con_input.filter(r => r.cod_receta !== receta.cod_receta)
        $scope.summariesNoIncluidosConInput.push(receta)
        mensajeRespuesta = 'Advice removed'
      }

     Materialize.toast(`${receta.des_titulo}: ${mensajeRespuesta}`, 3000)
   }

   $scope.saltarPasoFlotanteTSS = (bool_avanzar) => {
    // obtener nro indice de valor 1 en $scope.pasosModificarTSS
    let nro_paso = $scope.pasosModificarTSS.indexOf(1) + 1

    bool_avanzar ? nro_paso++ : nro_paso--

    // dependiendo del paso en el que se encuentre, obtenido desde el array pasosModificarTSS, se avanza o retrocede al paso correspondiente
    $scope.saltarPasoTSS(nro_paso)
   }

    $scope.cerrarModal = function (id) {
      console.log(id);
      $('#' + id).modal('close');
      $("#" + id).html("");
    }

    if ($scope.des_login) {
      $scope.recargar();
    }

    
    $scope.modalMensajePrivado = function (summary) {
      $scope.mensajePrivado = structuredClone(summary)
      $("#modal").modal({dismissible: false});
      $("#modal").modal('open');

      $templateRequest('app/templates/doctors/ficha_cliente/modalMensajePrivadoTSS.html').then(function (html) {
        const template = angular.element(html);
        $("#modal").html(template);
        $compile(template)($scope);
      });
    }

    $scope.modificarMensajePrivado = async () => {
      const parametros = {
        cual: "modificarMascotaReceta",
        cod_receta: $scope.mensajePrivado.cod_receta,
        id_solicitud: $scope.mensajePrivado.id_solicitud,
        des_nota_interna: $scope.mensajePrivado.des_nota_interna
      }

      const { data } = await $http.post('app/ws/ws_api.php', JSON.stringify(parametros))
      Materialize.toast(data.mensaje, 3000)

      if (data.bool_error === 0) {
        $scope.cerrarModal('modal')
        $scope.recargarRecetaCliente()
      }
    }
  }]);
