Difference between revisions of "Script para el proceso de préstamos"

From ABCD Wiki
Jump to: navigation, search
 
(5 intermediate revisions by the same user not shown)
Line 7: Line 7:
 
* include("ec_include.php");  
 
* include("ec_include.php");  
 
: Este procedimiento utiliza el código del usuario que viene de la página '''prestar.php''' para leer los préstamos pendientes y las sanciones y generar la variable '''$ec_output''' con la información del usuario y sus préstamos y sanciones.  Si el usuario está sancionado ('''$sanctions_output!=""''') borra los números de inventario solicitados ('''unset($arrHttp["inventory"])''') y ademas coloca '''$continuar="N"''' para indicar que no se van a procesar préstamos para el usuario.   
 
: Este procedimiento utiliza el código del usuario que viene de la página '''prestar.php''' para leer los préstamos pendientes y las sanciones y generar la variable '''$ec_output''' con la información del usuario y sus préstamos y sanciones.  Si el usuario está sancionado ('''$sanctions_output!=""''') borra los números de inventario solicitados ('''unset($arrHttp["inventory"])''') y ademas coloca '''$continuar="N"''' para indicar que no se van a procesar préstamos para el usuario.   
 +
 
: Si el usuario tiene préstamos pendientes ('''count($prestamos)>''') se agrega a la variable '''$ec_output''' el enlace que permitirá devolver o renovar los préstamos
 
: Si el usuario tiene préstamos pendientes ('''count($prestamos)>''') se agrega a la variable '''$ec_output''' el enlace que permitirá devolver o renovar los préstamos
  
Line 16: Line 17:
  
 
* Se localiza el número de inventario ('''$res=LocalizarInventario($arrHttp["inventory"]);''')
 
* Se localiza el número de inventario ('''$res=LocalizarInventario($arrHttp["inventory"]);''')
 +
 
::'''LocalizarInventario'''
 
::'''LocalizarInventario'''
::Esta rutina determina si se está prestando desde loanobjects o desde el catálogo. Si se está prestando desde el catálogo se construye el formato a aplicar para extraer el inventario ($formato_ex) utilizando los parámetros establecidos en los archivos de configuración. Si se presta desde '''loanobjects''' se construye el formato usando la estructura con la cual se almacena la información de las copias.
 
::Con el formato construido se lee la base de datos del catalogo o loanobjects, según sea el caso. El primer valor devuelto por esta lectura es el número de control del registro
 
::Como el campo de los ejemplares es repetible, localiza a través del número de inventario la copia exacta que se está prestando y la información de la misma se almacena en la variable $ítem  ('''<Font face=Courier>if (strtoupper($inventory)==strtoupper(trim($t[2]))) $item=$linea;</Font>'''.
 
::Todas las copias recuperadas se almacenan en el arreglo '''$copies_title''' el cual está definido en forma global
 
::La función devuelve el total de copias y la información del ítem que se desea prestar
 
  
*De vuelta al cuerpo principal del script se analiza el resultdo de '''LocalizarInventario'''
+
:::Esta rutina determina si se está prestando desde loanobjects o desde el catálogo. Si se está prestando desde el catálogo se construye el formato a aplicar para extraer el inventario ($formato_ex) utilizando los parámetros establecidos en los archivos de configuración. Si se presta desde '''loanobjects''' se construye el formato usando la estructura con la cual se almacena la información de las copias.
::Si el total de copias es cero, entonces no se localizó el número de inventario en el catálogo o en loanobjects
+
 
::Si el total de copias no es cero se trabaja con la variable '''$item''' que contiene todas las copias localizadas para el objeto. La primera posición del arreglo obtenido contiene el '''Número de control del objeto''', la segunda posición contiene el '''nombre de la base de datos''' donde está descrito el objeto y la tercera posición contiene el '''tipo de objeto''' de la copia que se quiere prestar
+
:::Con el formato construido se lee la base de datos del catalogo o loanobjects, según sea el caso. El primer valor devuelto por esta lectura es el número de control del registro
::Con el nombre de la base de datos se leen los archivos de configuración que están almacenados en la carpeta '''loans''' de la base de datos catalográfica ('''require_once("databases_configure_read.php");''')  
+
 
::Con el tipo de usuario y el tipo de objeto se determina la política a aplicar para el préstamo del objeto la cual se almacena en la variable '''$ppres'''.
+
:::Como el campo de los ejemplares es repetible, localiza a través del número de inventario la copia exacta que se está prestando y la información de la misma se almacena en la variable $ítem  ('''<Font face=Courier>if (strtoupper($inventory)==strtoupper(trim($t[2]))) $item=$linea;</Font>'''.
::Se analiza si el usuario cumple con las condiciones establecidas en la política y en caso negativo se suspende el préstamo
+
 
::Si cumple las condiciones se lee la información catalográfica del objeto que se desea prestar
+
:::Todas las copias recuperadas se almacenan en el arreglo '''$copies_title''' el cual está definido en forma global
::Se localiza si existen transacciones de préstamo (LocalizarTransacciones) y se determina si ya ese número de invertado está prestado. En caso afirmativo se suspende el préstamo
+
 
::Se verifica si el usuario ya tiene un objeto prestado de ese mismo número de control (PrestamoMismoObjeto) y si la política lo permite continúa con el préstamo
+
:::La función devuelve el total de copias y la información del ítem que se desea prestar
::A continuación se procede a analizar las reservas que tiene el título ('''LocalizarReservas''')
+
 
 +
*De vuelta al cuerpo principal del script se analiza el resultado de '''LocalizarInventario'''
 +
 
 +
:::Si el total de copias es cero, entonces no se localizó el número de inventario en el catálogo o en loanobjects
 +
 
 +
:::Si el total de copias no es cero se trabaja con la variable '''$item''' que contiene todas las copias localizadas para el objeto. La primera posición del arreglo obtenido contiene el '''Número de control del objeto''', la segunda posición contiene el '''nombre de la base de datos''' donde está descrito el objeto y la tercera posición contiene el '''tipo de objeto''' de la copia que se quiere prestar
 +
 
 +
:::Con el nombre de la base de datos se leen los archivos de configuración que están almacenados en la carpeta '''loans''' de la base de datos catalográfica ('''require_once("databases_configure_read.php");''')  
 +
 
 +
:::Con el tipo de usuario y el tipo de objeto se determina la política a aplicar para el préstamo del objeto la cual se almacena en la variable '''$ppres'''.
 +
 
 +
:::Se analiza si el usuario cumple con las condiciones establecidas en la política y en caso negativo se suspende el préstamo
 +
 
 +
:::Si cumple las condiciones se lee la información catalográfica del objeto que se desea prestar
 +
 
 +
:::Se localiza si existen transacciones de préstamo (LocalizarTransacciones) y se determina si ya ese número de invertado está prestado. En caso afirmativo se suspende el préstamo
 +
 
 +
:::Se verifica si el usuario ya tiene un objeto prestado de ese mismo número de control (PrestamoMismoObjeto) y si la política lo permite continúa con el préstamo
 +
:::A continuación se procede a analizar las reservas que tiene el título ('''LocalizarReservas''')
  
 
*'''LocalizarReservas'''
 
*'''LocalizarReservas'''
::Esta función recibe:
+
 
 +
:Esta función recibe:
 
         $control_number    Número de control del objeto
 
         $control_number    Número de control del objeto
 
         $catalog_db        Nombre de la base de datos catalográfica que contiene al objeto
 
         $catalog_db        Nombre de la base de datos catalográfica que contiene al objeto
Line 43: Line 59:
 
         $copies            Indicativo si trabaja o no con copias
 
         $copies            Indicativo si trabaja o no con copias
 
         $pft_ni            Pft para extraer el número de inventario
 
         $pft_ni            Pft para extraer el número de inventario
::Se construye el formato de extracción de la información de las reservas
+
 
 +
:Se construye el formato de extracción de la información de las reservas
 
         $Pft="f(mfn,6,0)'|'v10'|'v30'|'v31'|'v40'|'v60'|'v130'|'v200,'|',v1/";
 
         $Pft="f(mfn,6,0)'|'v10'|'v30'|'v31'|'v40'|'v60'|'v130'|'v200,'|',v1/";
::que contiene:
+
:que contiene:
        Mfn
+
            Mfn
 
         10  codigo de usuario
 
         10  codigo de usuario
 
         30  Fecha reserva
 
         30  Fecha reserva
Line 60: Line 77:
 
             3 Copia asignada
 
             3 Copia asignada
 
             4 Copia prestada
 
             4 Copia prestada
::Se construye la expresión de búsqueda para extraer para el número de control las reservas que están en espera o que tienen la copia asignada
+
 
 +
:Se construye la expresión de búsqueda para extraer para el número de control las reservas que están en espera o que tienen la copia asignada
 
         $Expresion="CN_".$catalog_db."_".$control_number." AND (ST_3 or ST_0)";
 
         $Expresion="CN_".$catalog_db."_".$control_number." AND (ST_3 or ST_0)";
 +
 +
:Se ejecuta la búsqueda sobre la base de datos y cada registro de reserva recuperado se somete al siguiente análisis:
 +
 +
:::::Si tiene fecha de cancelación se descarta (<Font face=Courier>if ($fecha_cancelacion!=""  or $fecha_prestamo!="") continue;</Font>)
 +
 +
:::::Si ya ha sigo asignada a un usuario y no se venció la fecha límite para retirarla, se descarta
 +
        if ($fecha_limite!=""){
 +
              if ($fecha_limite<date("Ymd")) continue;
 +
        }
 +
 +
:::::Si no se cumplen las dos condiciones anteriores entonces la reserva se almacena en el arreglo '''$reservas_3''', si ya está asignada pero se venció la fecha límite para retiro de la copia, o en '''reservas_0''' si está en espera. El índice para estos arreglos se forma utilizando la fecha y el Mfn del registro para poder luego ordenarlos por órden ascendente, es decir, que la primera reserva quede en el primer elemento del arreglo.
 +
 +
:::::Se clasifican los dos arreglos
 +
 +
:::::Si hay reservas asignadas (<Font face=Courier>count($reservas_3)>0</Font>) se toma el primer elemento del arreglo '''$reservas_3''' que contiene la primera reserva asignada a un usuario. Si no hay reservas asignadas se toma entonces el primer elemento del arreglo de reservas en espera. Se almacena en la variable $value;
 +
 +
:::::Si hay alguna reserva por atender (<Font face=Courier>$value!=""</Font> se compara el código del usuario de la reserva con el código del usuario que solicita el préstamo. Si es el mismo se devuelve el mfn del registro de la reserva con el indicativo "continuar" en señal de que el préstamo puede ser otorgado.
 +
 +
::::Si no hay reservas pendientes (<Font face=Courier>count($reservas_3)==0 and count($reservas_0)==0</Font>) se devuelve el indicativo "continuar" y el valor 0 en señal que no hay ninguna reserva pendiente y se puede otorgar el préstamo
 +
 +
::::Si el libro tiene reservas pero el usuario no está de primero en ninguna de las colas pasamos a analizar el número de ejemplares disponibles que tiene el título para ver si hay disponibilidad aún restándole las reservas que están en cola
 +
 +
::::Para ello obtenemos el número de ejemplares que tiene el título y le restamos el total de ejemplares prestados
 +
              $disponibilidad=count($obj)-$items_prestados;
 +
 +
::::Si restando 1 a la disponibilidad todavía nos queda un valor positivo, entonces vemos si el usuario está en algún lugar de la cola de reservas asignadas o de la cola de reservas pendientes y si lo conseguimos entonces procedemos a prestarle el título
 +
 +
::::Si el usuario no está en ninguna de las colas de reserva restamos a la variable '''$disponibilidad''' (calculada anteriormente) el número de elementos que están en la cola de reservas asignadas y en la cola de reservas pendientes
 +
          $disponibilidad=$disponibilidad-count($reservas_3)-count($reservas_0);
 +
::::Si el valor es mayor que 0, procedemos a otorgarle el préstamo al usuario
 +
 +
*La salida de '''LocalizarReservas''' nos devuelve un arreglo donde el primer elemento tiene el valor "continuar", indicando que se puede continuar con el préstamo, o "no-continuar" indicando que no se puede prestar. El segundo elemento del arreglo contiene el Mfn del registro donde está localizada la reserva que va a ser atendida o 0 si no hay reserva por atender.
 +
 +
*Para grabar el préstamo se llama a la función '''ProcesarPrestamo''', la cual
 +
 +
::Calcula la fecha de devolución de acuerdo a la política
 +
 +
::Construye el string para grabar el registro en el archivo de transacciones
 +
 +
::Si está implementada la base de datos '''logtrans''' que lleva el log de todas las transacciones que se realizan en el sistema, prepara el string para grabar el registro en esta base de datos
 +
 +
::Si el préstamo está atendiendo alguna reserva, prepara el string para cambiar el campo v1 del registro de la reserva y agregarle la fecha en que fué atendida
 +
 +
::Ejecuta el wxis utilizando el script '''crear_registro.xis''' que está preparado para actualizar en forma consecutiva las bases de datos trans, logtrans y reserve  (para esto es necesario que el syspar.par tenga las rutas a estas bases de datos)
 +
 +
::Prepara la información para la impresión de recibos (si procede)
 +
 +
::Muestra por pantalla el resultado del proceso

Latest revision as of 10:16, 9 August 2014

La rutina para otorgar préstamos se realiza mediante el script usuarios_prestamos_presentar.php localizado en la carpeta central/circulation. El flujo que se sigue en el proceso es el siguiente:

  • A partir de los valores leídos en la página prestar.php se determina si se está trabajando con copias o sin copias. Para estos efectos, si desde la página viene la variable db_inven se asume que se está trabajando sin copias y por lo tanto hay que utilizar el archivo de configuración de la base de datos catalográfica para determinar el prefijo de acceso al número de inventario y el tag del campo donde están las existencias. Si se trabaja con copias ya estos valores están fijos por la configuración de ésta base de datos. Como resultado de eelste análisis obtendremos:
       $prefix_in      con el prefijo a utilizar para leer el número de inventario
       $from_copies    Y/N según se esté trabajando con copias o sin copias
  • include("ec_include.php");
Este procedimiento utiliza el código del usuario que viene de la página prestar.php para leer los préstamos pendientes y las sanciones y generar la variable $ec_output con la información del usuario y sus préstamos y sanciones. Si el usuario está sancionado ($sanctions_output!="") borra los números de inventario solicitados (unset($arrHttp["inventory"])) y ademas coloca $continuar="N" para indicar que no se van a procesar préstamos para el usuario.
Si el usuario tiene préstamos pendientes (count($prestamos)>) se agrega a la variable $ec_output el enlace que permitirá devolver o renovar los préstamos
  • Se obtiene el código, tipo y vigencia del usuario construyendo un formato con los valores que han sido previamente leídos al inicio del script desde el archivo de configuración. Se lee el usuario y si no regresa información entonces se asume que el usuario no existe y se suspende el proceso
  • Si el usuario existe y no tiene suspensiones se analiza la fecha de vigencia del usuario leida en el paso anterior. Si está vigene se continúa con el préstamo.
  • Si el usuario pasa todos los controles de validación se entra a procesar cada uno de los ejemplares solicitados ( foreach ($invent as $arrHttp["inventory"]){)
  • Se localiza el número de inventario ($res=LocalizarInventario($arrHttp["inventory"]);)
LocalizarInventario
Esta rutina determina si se está prestando desde loanobjects o desde el catálogo. Si se está prestando desde el catálogo se construye el formato a aplicar para extraer el inventario ($formato_ex) utilizando los parámetros establecidos en los archivos de configuración. Si se presta desde loanobjects se construye el formato usando la estructura con la cual se almacena la información de las copias.
Con el formato construido se lee la base de datos del catalogo o loanobjects, según sea el caso. El primer valor devuelto por esta lectura es el número de control del registro
Como el campo de los ejemplares es repetible, localiza a través del número de inventario la copia exacta que se está prestando y la información de la misma se almacena en la variable $ítem (if (strtoupper($inventory)==strtoupper(trim($t[2]))) $item=$linea;.
Todas las copias recuperadas se almacenan en el arreglo $copies_title el cual está definido en forma global
La función devuelve el total de copias y la información del ítem que se desea prestar
  • De vuelta al cuerpo principal del script se analiza el resultado de LocalizarInventario
Si el total de copias es cero, entonces no se localizó el número de inventario en el catálogo o en loanobjects
Si el total de copias no es cero se trabaja con la variable $item que contiene todas las copias localizadas para el objeto. La primera posición del arreglo obtenido contiene el Número de control del objeto, la segunda posición contiene el nombre de la base de datos donde está descrito el objeto y la tercera posición contiene el tipo de objeto de la copia que se quiere prestar
Con el nombre de la base de datos se leen los archivos de configuración que están almacenados en la carpeta loans de la base de datos catalográfica (require_once("databases_configure_read.php");)
Con el tipo de usuario y el tipo de objeto se determina la política a aplicar para el préstamo del objeto la cual se almacena en la variable $ppres.
Se analiza si el usuario cumple con las condiciones establecidas en la política y en caso negativo se suspende el préstamo
Si cumple las condiciones se lee la información catalográfica del objeto que se desea prestar
Se localiza si existen transacciones de préstamo (LocalizarTransacciones) y se determina si ya ese número de invertado está prestado. En caso afirmativo se suspende el préstamo
Se verifica si el usuario ya tiene un objeto prestado de ese mismo número de control (PrestamoMismoObjeto) y si la política lo permite continúa con el préstamo
A continuación se procede a analizar las reservas que tiene el título (LocalizarReservas)
  • LocalizarReservas
Esta función recibe:
       $control_number    Número de control del objeto
       $catalog_db        Nombre de la base de datos catalográfica que contiene al objeto
       $usuario           Código del usuario
       $ítems_prestados   Arreglo con préstamos que tiene el usuario, obtenido desde PrestamoMismoObjeto
       $prefix_cn         Prefijo que se utiliza para localizar el número de control
       $copies            Indicativo si trabaja o no con copias
       $pft_ni            Pft para extraer el número de inventario
Se construye el formato de extracción de la información de las reservas
       $Pft="f(mfn,6,0)'|'v10'|'v30'|'v31'|'v40'|'v60'|'v130'|'v200,'|',v1/";
que contiene:
            Mfn
       10   codigo de usuario
       30   Fecha reserva
       31   Hora de reserva
       40   Fecha límite de retiro (si la reserva ya ha sido asignada)
       60   Fecha de asignacion de la reserva (cuando se asigna a una reserva un objeto devuelto
       130  Fecha de cancelación de la reserva (si la reserva ha sido cancelada por un operador o por el usuario
       200  Fecha en que se ejecutó la reserva y se prestó el item al usuario
       1    Situación de la reserva:
            0 En espera
            1 Cancelada por el supervisor
            2 Cancelada por el usuario
            3 Copia asignada
            4 Copia prestada
Se construye la expresión de búsqueda para extraer para el número de control las reservas que están en espera o que tienen la copia asignada
       $Expresion="CN_".$catalog_db."_".$control_number." AND (ST_3 or ST_0)";
Se ejecuta la búsqueda sobre la base de datos y cada registro de reserva recuperado se somete al siguiente análisis:
Si tiene fecha de cancelación se descarta (if ($fecha_cancelacion!="" or $fecha_prestamo!="") continue;)
Si ya ha sigo asignada a un usuario y no se venció la fecha límite para retirarla, se descarta
        if ($fecha_limite!=""){
             if ($fecha_limite<date("Ymd")) continue;
        }
Si no se cumplen las dos condiciones anteriores entonces la reserva se almacena en el arreglo $reservas_3, si ya está asignada pero se venció la fecha límite para retiro de la copia, o en reservas_0 si está en espera. El índice para estos arreglos se forma utilizando la fecha y el Mfn del registro para poder luego ordenarlos por órden ascendente, es decir, que la primera reserva quede en el primer elemento del arreglo.
Se clasifican los dos arreglos
Si hay reservas asignadas (count($reservas_3)>0) se toma el primer elemento del arreglo $reservas_3 que contiene la primera reserva asignada a un usuario. Si no hay reservas asignadas se toma entonces el primer elemento del arreglo de reservas en espera. Se almacena en la variable $value;
Si hay alguna reserva por atender ($value!="" se compara el código del usuario de la reserva con el código del usuario que solicita el préstamo. Si es el mismo se devuelve el mfn del registro de la reserva con el indicativo "continuar" en señal de que el préstamo puede ser otorgado.
Si no hay reservas pendientes (count($reservas_3)==0 and count($reservas_0)==0) se devuelve el indicativo "continuar" y el valor 0 en señal que no hay ninguna reserva pendiente y se puede otorgar el préstamo
Si el libro tiene reservas pero el usuario no está de primero en ninguna de las colas pasamos a analizar el número de ejemplares disponibles que tiene el título para ver si hay disponibilidad aún restándole las reservas que están en cola
Para ello obtenemos el número de ejemplares que tiene el título y le restamos el total de ejemplares prestados
             $disponibilidad=count($obj)-$items_prestados;
Si restando 1 a la disponibilidad todavía nos queda un valor positivo, entonces vemos si el usuario está en algún lugar de la cola de reservas asignadas o de la cola de reservas pendientes y si lo conseguimos entonces procedemos a prestarle el título
Si el usuario no está en ninguna de las colas de reserva restamos a la variable $disponibilidad (calculada anteriormente) el número de elementos que están en la cola de reservas asignadas y en la cola de reservas pendientes
         $disponibilidad=$disponibilidad-count($reservas_3)-count($reservas_0);
Si el valor es mayor que 0, procedemos a otorgarle el préstamo al usuario
  • La salida de LocalizarReservas nos devuelve un arreglo donde el primer elemento tiene el valor "continuar", indicando que se puede continuar con el préstamo, o "no-continuar" indicando que no se puede prestar. El segundo elemento del arreglo contiene el Mfn del registro donde está localizada la reserva que va a ser atendida o 0 si no hay reserva por atender.
  • Para grabar el préstamo se llama a la función ProcesarPrestamo, la cual
Calcula la fecha de devolución de acuerdo a la política
Construye el string para grabar el registro en el archivo de transacciones
Si está implementada la base de datos logtrans que lleva el log de todas las transacciones que se realizan en el sistema, prepara el string para grabar el registro en esta base de datos
Si el préstamo está atendiendo alguna reserva, prepara el string para cambiar el campo v1 del registro de la reserva y agregarle la fecha en que fué atendida
Ejecuta el wxis utilizando el script crear_registro.xis que está preparado para actualizar en forma consecutiva las bases de datos trans, logtrans y reserve (para esto es necesario que el syspar.par tenga las rutas a estas bases de datos)
Prepara la información para la impresión de recibos (si procede)
Muestra por pantalla el resultado del proceso