protected function private_core()
 {
     $this->share_extensions();
     $this->cliente = new cliente();
     $this->grupo = new grupo_clientes();
     // cargamos la configuración
     $fsvar = new fs_var();
     $this->nuevocli_setup = $fsvar->array_get(array('nuevocli_cifnif_req' => 0, 'nuevocli_direccion' => 0, 'nuevocli_direccion_req' => 0, 'nuevocli_codpostal' => 0, 'nuevocli_codpostal_req' => 0, 'nuevocli_pais' => 0, 'nuevocli_pais_req' => 0, 'nuevocli_provincia' => 0, 'nuevocli_provincia_req' => 0, 'nuevocli_ciudad' => 0, 'nuevocli_ciudad_req' => 0, 'nuevocli_telefono1' => 0, 'nuevocli_telefono1_req' => 0, 'nuevocli_telefono2' => 0, 'nuevocli_telefono2_req' => 0, 'nuevocli_codgrupo' => '', 'cal_inicio' => "09:00"), FALSE);
     $this->mostrar = 'todo';
     if (isset($_GET['mostrar'])) {
         $this->mostrar = $_GET['mostrar'];
     }
     $this->offset = 0;
     if (isset($_GET['offset'])) {
         $this->offset = intval($_GET['offset']);
     }
     $contrato = new contrato_servicio();
     if (isset($_POST['cliente'])) {
         $cliente_s = $this->cliente->get($_POST['cliente']);
         /**
          * Nuevo cliente
          */
         if (isset($_POST['nuevo_cliente'])) {
             if ($_POST['nuevo_cliente'] != '') {
                 $cliente_s = FALSE;
                 if ($_POST['nuevo_cifnif'] != '') {
                     $cliente_s = $this->cliente->get_by_cifnif($_POST['nuevo_cifnif']);
                     if ($cliente_s) {
                         $this->new_advice('Ya existe un cliente con ese ' . FS_CIFNIF . '. Se ha seleccionado.');
                     }
                 }
                 if (!$cliente_s) {
                     $cliente_s = new cliente();
                     $cliente_s->codcliente = $cliente_s->get_new_codigo();
                     $cliente_s->nombre = $cliente_s->razonsocial = $_POST['nuevo_cliente'];
                     $cliente_s->cifnif = $_POST['nuevo_cifnif'];
                     $cliente_s->codserie = $this->empresa->codserie;
                     if (isset($_POST['nuevo_grupo'])) {
                         if ($_POST['nuevo_grupo'] != '') {
                             $cliente_s->codgrupo = $_POST['nuevo_grupo'];
                         }
                     }
                     if (isset($_POST['nuevo_telefono1'])) {
                         $cliente_s->telefono1 = $_POST['nuevo_telefono1'];
                     }
                     if (isset($_POST['nuevo_telefono2'])) {
                         $cliente_s->telefono2 = $_POST['nuevo_telefono2'];
                     }
                     if ($cliente_s->save()) {
                         $dircliente = new direccion_cliente();
                         $dircliente->codcliente = $cliente_s->codcliente;
                         $dircliente->codpais = $this->empresa->codpais;
                         $dircliente->provincia = $this->empresa->provincia;
                         $dircliente->ciudad = $this->empresa->ciudad;
                         $dircliente->descripcion = 'Principal';
                         if (isset($_POST['nuevo_pais'])) {
                             $dircliente->codpais = $_POST['nuevo_pais'];
                         }
                         if (isset($_POST['nuevo_provincia'])) {
                             $dircliente->provincia = $_POST['nuevo_provincia'];
                         }
                         if (isset($_POST['nuevo_ciudad'])) {
                             $dircliente->ciudad = $_POST['nuevo_ciudad'];
                         }
                         if (isset($_POST['nuevo_codpostal'])) {
                             $dircliente->codpostal = $_POST['nuevo_codpostal'];
                         }
                         if (isset($_POST['nuevo_direccion'])) {
                             $dircliente->direccion = $_POST['nuevo_direccion'];
                         }
                         if ($dircliente->save()) {
                             $this->new_message('Cliente agregado correctamente.');
                         }
                     } else {
                         $this->new_error_msg("¡Imposible guardar la dirección del cliente!");
                     }
                 }
             }
         }
         $con = new contrato_servicio();
         $con->codcliente = $cliente_s->codcliente;
         $con->codagente = $this->user->codagente;
         $con->codpago = $cliente_s->codpago;
         if ($con->save()) {
             $this->new_message('Contrato guardado correctamente.');
             header('Location: ' . $con->url());
         } else {
             $this->new_error_msg('Error al guardar el contrato.');
         }
     } else {
         if (isset($_GET['test'])) {
             $cli0 = new cliente();
             foreach ($cli0->all(mt_rand(0, 1000)) as $cliente) {
                 $con = new contrato_servicio();
                 $con->codcliente = $cliente->codcliente;
                 $con->codagente = $this->user->codagente;
                 $con->codpago = $this->empresa->codpago;
                 $con->fecha_alta = date(mt_rand(1, 29) . '-3-Y');
                 $con->fecha_renovacion = date(mt_rand(1, 29) . '-11-Y');
                 $con->importe_anual = mt_rand(600, 60000);
                 $con->observaciones = $this->random_string();
                 $con->periodo = '+' . mt_rand(7, 120) . 'days';
                 $con->fsiguiente_servicio = date('d-m-Y', strtotime($con->fecha_alta . ' ' . $con->periodo));
                 $con->save();
             }
         } else {
             if (isset($_GET['delete'])) {
                 $con = $contrato->get($_GET['delete']);
                 if ($con) {
                     if ($con->delete()) {
                         $this->new_message('Contrato eliminado correctamente.');
                     } else {
                         $this->new_error_msg('Error al eliminar el contrato.');
                     }
                 } else {
                     $this->new_error_msg('Contrato no encontrado.');
                 }
             }
         }
     }
     if (isset($_REQUEST['buscar_cliente'])) {
         $this->buscar_cliente();
     } else {
         if (isset($_GET['minicron'])) {
             $this->minicron();
         } else {
             if ($this->mostrar == 'renovacion') {
                 $this->resultados = $contrato->all($this->offset, 'fecha_renovacion ASC');
             } else {
                 if ($this->mostrar == 'servicio') {
                     $this->resultados = $contrato->all($this->offset, 'fsiguiente_servicio ASC');
                 } else {
                     $this->resultados = $contrato->all($this->offset);
                 }
             }
         }
     }
     $this->total = $contrato->count();
 }
 private function importar_xml()
 {
     $import_step = 0;
     $this->importar_url = FALSE;
     if (isset($_POST['fuente'])) {
         if (file_exists('tmp/' . FS_TMP_NAME . 'ejercicio.xml')) {
             unlink('tmp/' . FS_TMP_NAME . 'ejercicio.xml');
         }
         if ($_POST['fuente'] == 'archivo' and isset($_POST['archivo'])) {
             if (copy($_FILES['farchivo']['tmp_name'], 'tmp/' . FS_TMP_NAME . 'ejercicio.xml')) {
                 $import_step = 1;
                 $this->importar_url = $this->url() . '&importar=' . (1 + $import_step);
             } else {
                 $this->new_error_msg('Error al copiar el archivo.');
             }
         } else {
             if ($_POST['fuente'] != '') {
                 if (copy($_POST['fuente'], 'tmp/' . FS_TMP_NAME . 'ejercicio.xml')) {
                     $import_step = 1;
                     $this->importar_url = $this->url() . '&importar=' . (1 + $import_step);
                 } else {
                     $this->new_error_msg('Error al copiar el archivo.');
                 }
             } else {
                 $this->new_error_msg('Has seleccionado importar desde un archivo externo,
            pero no has seleccionado ningún archivo.');
             }
         }
     } else {
         if (isset($_GET['importar'])) {
             $import_step = intval($_GET['importar']);
             if ($import_step < 7) {
                 $this->importar_url = $this->url() . '&importar=' . (1 + $import_step);
             } else {
                 $this->new_advice('Datos importados correctamente &nbsp; <span class="glyphicon glyphicon-ok" aria-hidden="true"></span>');
                 $import_step = 0;
             }
         }
     }
     if (file_exists('tmp/' . FS_TMP_NAME . 'ejercicio.xml') and $import_step > 0) {
         $offset = 0;
         if (isset($_GET['offset'])) {
             $offset = intval($_GET['offset']);
         }
         if ($offset == 0) {
             $this->new_message('Importando ejercicio: paso ' . $import_step . ' de 6 ...');
         } else {
             $this->new_message('Importando ejercicio: paso ' . $import_step . '.' . $offset / 1000 . ' de 6 ...');
         }
         $xml = simplexml_load_file('tmp/' . FS_TMP_NAME . 'ejercicio.xml');
         if ($xml) {
             if ($xml->balance and $import_step == 1) {
                 foreach ($xml->balance as $b) {
                     $balance = new balance();
                     if (!$balance->get($b->codbalance)) {
                         $balance->codbalance = $b->codbalance;
                         $balance->naturaleza = $b->naturaleza;
                         $balance->nivel1 = $b->nivel1;
                         $balance->descripcion1 = base64_decode($b->descripcion1);
                         $balance->nivel2 = $balance->intval($b->nivel2);
                         $balance->descripcion2 = base64_decode($b->descripcion2);
                         $balance->nivel3 = $b->nivel3;
                         $balance->descripcion3 = base64_decode($b->descripcion3);
                         $balance->orden3 = $b->orden3;
                         $balance->nivel4 = $b->nivel4;
                         $balance->descripcion4 = base64_decode($b->descripcion4);
                         $balance->descripcion4ba = base64_decode($b->descripcion4ba);
                         if (!$balance->save()) {
                             $this->importar_url = FALSE;
                         }
                     }
                 }
                 if ($xml->balance_cuenta) {
                     $balance_cuenta = new balance_cuenta();
                     $all_bcs = $balance_cuenta->all();
                     foreach ($xml->balance_cuenta as $bc) {
                         $encontrado = FALSE;
                         foreach ($all_bcs as $bc2) {
                             if ($bc2->codbalance == $bc->codbalance and $bc2->codcuenta == $bc->codcuenta) {
                                 $encontrado = TRUE;
                                 break;
                             }
                         }
                         if (!$encontrado) {
                             $new_bc = new balance_cuenta();
                             $new_bc->codbalance = $bc->codbalance;
                             $new_bc->codcuenta = $bc->codcuenta;
                             $new_bc->desccuenta = base64_decode($bc->descripcion);
                             if (!$new_bc->save()) {
                                 $this->importar_url = FALSE;
                             }
                         }
                     }
                 }
                 if ($xml->balance_cuenta_a) {
                     $balance_cuenta_a = new balance_cuenta_a();
                     $all_bcas = $balance_cuenta_a->all();
                     foreach ($xml->balance_cuenta_a as $bc) {
                         $encontrado = FALSE;
                         foreach ($all_bcas as $bc2) {
                             if ($bc2->codbalance == $bc->codbalance and $bc2->codcuenta == $bc->codcuenta) {
                                 $encontrado = TRUE;
                                 break;
                             }
                         }
                         if (!$encontrado) {
                             $new_bc = new balance_cuenta_a();
                             $new_bc->codbalance = $bc->codbalance;
                             $new_bc->codcuenta = $bc->codcuenta;
                             $new_bc->desccuenta = base64_decode($bc->descripcion);
                             if (!$new_bc->save()) {
                                 $this->importar_url = FALSE;
                             }
                         }
                     }
                 }
             }
             if ($import_step == 2) {
                 if ($xml->cuenta_especial) {
                     foreach ($xml->cuenta_especial as $ce) {
                         $cuenta_especial = new cuenta_especial();
                         if (!$cuenta_especial->get($ce->idcuentaesp)) {
                             $cuenta_especial->idcuentaesp = $ce->idcuentaesp;
                             $cuenta_especial->descripcion = base64_decode($ce->descripcion);
                             if (!$cuenta_especial->save()) {
                                 $this->importar_url = FALSE;
                             }
                         }
                     }
                 }
                 if ($xml->grupo_epigrafes) {
                     foreach ($xml->grupo_epigrafes as $ge) {
                         $grupo_epigrafes = new grupo_epigrafes();
                         if (!$grupo_epigrafes->get_by_codigo($ge->codgrupo, $this->ejercicio->codejercicio)) {
                             $grupo_epigrafes->codejercicio = $this->ejercicio->codejercicio;
                             $grupo_epigrafes->codgrupo = $ge->codgrupo;
                             $grupo_epigrafes->descripcion = base64_decode($ge->descripcion);
                             if (!$grupo_epigrafes->save()) {
                                 $this->importar_url = FALSE;
                             }
                         }
                     }
                 }
                 if ($xml->epigrafe) {
                     $grupo_epigrafes = new grupo_epigrafes();
                     foreach ($xml->epigrafe as $ep) {
                         $epigrafe = new epigrafe();
                         if (!$epigrafe->get_by_codigo($ep->codepigrafe, $this->ejercicio->codejercicio)) {
                             $ge = $grupo_epigrafes->get_by_codigo($ep->codgrupo, $this->ejercicio->codejercicio);
                             if ($ge) {
                                 /// si encuentra el grupo, lo añade con el grupo
                                 $epigrafe->idgrupo = $ge->idgrupo;
                                 $epigrafe->codgrupo = $ge->codgrupo;
                                 $epigrafe->codejercicio = $this->ejercicio->codejercicio;
                                 $epigrafe->codepigrafe = $ep->codepigrafe;
                                 $epigrafe->descripcion = base64_decode($ep->descripcion);
                                 if (!$epigrafe->save()) {
                                     $this->importar_url = FALSE;
                                 }
                             } else {
                                 if ($ep->codpadre) {
                                     $padre = $epigrafe->get_by_codigo($ep->codpadre, $this->ejercicio->codejercicio);
                                     if ($padre) {
                                         /// si encuentra al padre, lo añade con el padre
                                         $epigrafe->idpadre = $padre->idepigrafe;
                                         $epigrafe->codejercicio = $this->ejercicio->codejercicio;
                                         $epigrafe->codepigrafe = $ep->codepigrafe;
                                         $epigrafe->descripcion = base64_decode($ep->descripcion);
                                         if (!$epigrafe->save()) {
                                             $this->importar_url = FALSE;
                                         }
                                     }
                                 }
                             }
                         }
                     }
                 }
             }
             if ($xml->cuenta and $import_step == 3) {
                 $epigrafe = new epigrafe();
                 foreach ($xml->cuenta as $c) {
                     $cuenta = new cuenta();
                     if (!$cuenta->get_by_codigo($c->codcuenta, $this->ejercicio->codejercicio)) {
                         $ep = $epigrafe->get_by_codigo($c->codepigrafe, $this->ejercicio->codejercicio);
                         if ($ep) {
                             $cuenta->idepigrafe = $ep->idepigrafe;
                             $cuenta->codepigrafe = $ep->codepigrafe;
                             $cuenta->codcuenta = $c->codcuenta;
                             $cuenta->codejercicio = $this->ejercicio->codejercicio;
                             $cuenta->descripcion = base64_decode($c->descripcion);
                             $cuenta->idcuentaesp = $c->idcuentaesp;
                             if (!$cuenta->save()) {
                                 $this->importar_url = FALSE;
                             }
                         }
                     }
                 }
             }
             if ($xml->subcuenta and $import_step == 4) {
                 $cuenta = new cuenta();
                 foreach ($xml->subcuenta as $sc) {
                     $subcuenta = new subcuenta();
                     if (!$subcuenta->get_by_codigo($sc->codsubcuenta, $this->ejercicio->codejercicio)) {
                         $cu = $cuenta->get_by_codigo($sc->codcuenta, $this->ejercicio->codejercicio);
                         if ($cu) {
                             $subcuenta->idcuenta = $cu->idcuenta;
                             $subcuenta->codcuenta = $cu->codcuenta;
                             $subcuenta->coddivisa = $this->empresa->coddivisa;
                             if (isset($sc->coddivisa)) {
                                 $subcuenta->coddivisa = $sc->coddivisa;
                             }
                             $subcuenta->codejercicio = $this->ejercicio->codejercicio;
                             $subcuenta->codsubcuenta = $sc->codsubcuenta;
                             $subcuenta->descripcion = base64_decode($sc->descripcion);
                             if (!$subcuenta->save()) {
                                 $this->importar_url = FALSE;
                             }
                         }
                     }
                 }
             }
             if ($import_step == 5) {
                 $cliente = new cliente();
                 $clientes = $cliente->all($offset);
                 while ($clientes) {
                     foreach ($clientes as $cli) {
                         /// forzamos la generación y asociación de una subcuenta para el cliente
                         $cli->get_subcuenta($this->ejercicio->codejercicio);
                         $offset++;
                     }
                     if ($offset % 1000 == 0) {
                         /// cada 1000 clientes volvemos a recargar la página para continuar
                         $this->importar_url = $this->url() . '&importar=' . $import_step . '&offset=' . $offset;
                         break;
                     } else {
                         $clientes = $cliente->all($offset);
                     }
                 }
             }
             if ($import_step == 6) {
                 $proveedor = new proveedor();
                 $proveedores = $proveedor->all($offset);
                 while ($proveedores) {
                     foreach ($proveedores as $pro) {
                         /// forzamos la generación y asociación de una subcuenta para cada proveedor
                         $pro->get_subcuenta($this->ejercicio->codejercicio);
                         $offset++;
                     }
                     if ($offset % 1000 == 0) {
                         /// cada 1000 proveedores volvemos a recargar la página para continuar
                         $this->importar_url = $this->url() . '&importar=' . $import_step . '&offset=' . $offset;
                         break;
                     } else {
                         $proveedores = $proveedor->all($offset);
                     }
                 }
             }
         } else {
             $this->new_error("Imposible leer el archivo.");
         }
     }
 }