public function carrito2albaran(&$albaran, $des_stock, $lineas, &$error)
 {
     $mis_articulos = new articulos();
     $mis_clientes = new clientes();
     $retorno = true;
     if ($albaran['codcliente'] != '') {
         /// obtenemos los datos del cliente
         $cliente = $mis_clientes->get($albaran['codcliente']);
         $direccion = $mis_clientes->get_direccion($albaran['codcliente']);
         if ($direccion['id'] == '') {
             $retorno = false;
             $error = "El cliente no tiene una dirección conocida";
         }
     } else {
         $retorno = false;
         $error = "Debes especificar un cliente";
     }
     $nfecha = explode('-', $albaran['fecha']);
     if (!is_numeric($nfecha[0]) or !is_numeric($nfecha[1]) or !is_numeric($nfecha[2])) {
         $retorno = false;
         $error = "Debes escribir una fecha válida";
     }
     if ($albaran['codalmacen'] == '') {
         $retorno = false;
         $error = "No hay ningún almacén predeterminado";
     }
     if (empty($lineas)) {
         $retorno = false;
         $error = "No hay artículos en tu carrito";
     }
     if ($albaran['codagente'] == '') {
         $retorno = false;
         $error = "Tu usuario no está vinculado a ningún agente";
     }
     if ($retorno and $albaran['codejercicio'] != '' and $albaran['codserie'] != '') {
         /// obtenemos el numero de albaran
         $consulta = "SELECT s.valorout,s.id FROM secuencias s,secuenciasejercicios e\n            WHERE s.nombre='nalbarancli' AND s.id=e.id AND e.codserie='{$albaran['codserie']}'\n            AND e.codejercicio='{$albaran['codejercicio']}';";
         $resultado = $this->bd->select($consulta);
         if ($resultado) {
             $albaran['numero'] = $resultado[0]['valorout'];
             $albaran['secuenciaid'] = $resultado[0]['id'];
         } else {
             $retorno = false;
             $error = "Error al obtener el número de albarán";
         }
         /// comprobamos si el ejercicio sigue abierto
         if (!$this->ejercicios->abierto($albaran['codejercicio'])) {
             $retorno = false;
             $error = "Ejercicio Cerrado";
         }
         /// comprobamos si la serie es sin iva
         $sin_iva = $this->serires->sin_iva($albaran['codserie']);
     } else {
         if ($retorno) {
             $retorno = false;
             $error = "Ejercicio o serie vacíos";
         }
     }
     if ($retorno) {
         /// generamos el codigo del albaran
         $albaran['codigo'] = $albaran['codejercicio'];
         $albaran['codigo'] .= sprintf('%02s', $albaran['codserie']);
         $albaran['codigo'] .= sprintf('%06s', $albaran['numero']);
         /// obtenemos el idalbaran
         $resultado = $this->bd->select("SELECT last_value FROM albaranescli_idalbaran_seq;");
         if ($resultado) {
             $albaran['idalbaran'] = $resultado[0]['last_value'] + 1;
             /// actualizamos la secuencia
             if (!$this->bd->exec("SELECT setval('\"albaranescli_idalbaran_seq\"',{$albaran['idalbaran']},'t');")) {
                 $retorno = false;
                 $error = "Error al actualizar la secuencia";
             }
         } else {
             $retorno = false;
             $error = "Error al obtener el nuevo id del albarán";
         }
         /// si tenemos los datos necesarios
         if ($albaran['idalbaran'] != '') {
             /// insertamos el albaran
             $consulta = "set datestyle = dmy;\n               INSERT INTO albaranescli (idalbaran,codigo,fecha,nombrecliente,cifnif,codcliente,observaciones,coddivisa,numero,\n               codserie,codpago,codagente,codalmacen,coddir,direccion,codpostal,ciudad,provincia,apartado,codpais,codejercicio,numero2)\n               VALUES ('{$albaran['idalbaran']}','{$albaran['codigo']}','{$albaran['fecha']}','{$cliente['nombre']}','{$cliente['cifnif']}','{$cliente['codcliente']}',\n               '{$albaran['observaciones']}','{$albaran['coddivisa']}','{$albaran['numero']}','{$albaran['codserie']}','{$albaran['codpago']}',\n               '{$albaran['codagente']}','{$albaran['codalmacen']}','{$direccion['id']}','{$direccion['direccion']}','{$direccion['codpostal']}',\n               '{$direccion['ciudad']}','{$direccion['provincia']}','{$direccion['apartado']}','{$direccion['codpais']}','{$albaran['codejercicio']}','{$albaran['numero2']}');";
             $neto = 0;
             $iva = 0;
             $total = 0;
             /// insertamos las lineas
             foreach ($lineas as $linea) {
                 /// calculamos el importe
                 $importe = ($linea['pvpunitario'] - $linea['pvpunitario'] * $linea['dtopor'] / 100) * $linea['cantidad'];
                 $importe_sdto = $linea['pvpunitario'] * $linea['cantidad'];
                 $consulta .= "INSERT INTO lineasalbaranescli (idalbaran,referencia,descripcion,pvpunitario,cantidad,pvpsindto,pvptotal,codimpuesto,iva,dtopor)\n                  VALUES ('{$albaran['idalbaran']}','{$linea['referencia']}',";
                 if ($linea['descripcion2'] == "") {
                     $consulta .= "'" . htmlspecialchars($linea['descripcion'], ENT_QUOTES) . "',";
                 } else {
                     $consulta .= "'" . htmlspecialchars($linea['descripcion2'], ENT_QUOTES) . "',";
                 }
                 if ($sin_iva) {
                     $consulta .= "'{$linea['pvpunitario']}','{$linea['cantidad']}','{$importe_sdto}','{$importe}',NULL,'0','{$linea['dtopor']}');";
                     $neto += $importe;
                     $total += $importe;
                 } else {
                     $consulta .= "'{$linea['pvpunitario']}','{$linea['cantidad']}','{$importe_sdto}','{$importe}','{$linea['codimpuesto']}','{$linea['iva']}','{$linea['dtopor']}');";
                     $neto += $importe;
                     $iva += $importe * $linea['iva'] / 100;
                     $total += $importe + $importe * $linea['iva'] / 100;
                 }
             }
             /// actualizamos el albaran
             $consulta .= "UPDATE albaranescli SET neto='{$neto}',totaliva='{$iva}',totaleuros='{$total}',total='{$total}' WHERE idalbaran='{$albaran['idalbaran']}';";
             /// actualizamos la secuencia
             $albaran['nuevonumero'] = $albaran['numero'] + 1;
             $consulta .= "UPDATE secuencias SET valorout='{$albaran['nuevonumero']}' WHERE nombre='nalbarancli' AND id='{$albaran['secuenciaid']}';";
             /// Ejecutamos la sentencia
             if ($this->bd->exec($consulta)) {
                 /// descontamos de stock
                 if ($des_stock) {
                     foreach ($lineas as $linea) {
                         $mis_articulos->sum_stock($linea['referencia'], $albaran['codalmacen'], 0 - $linea['cantidad'], $error);
                     }
                 }
             } else {
                 $retorno = false;
                 $error = "Error al guardar el albarán: " . $consulta;
             }
         }
     }
     return $retorno;
 }