====== wtPrestamo ======

La librería wtPrestamo encapsula todos los procesos de serialización y extracción de datos de préstamos.

===== Dependencias =====
genesisEmpleado


===== Objetos =====
==== wtPrestamo ====
Objeto creado sobre el controles desde el que es cargada la librería wtPrestamo.\\ Debe ser accesado mediante la sintaxis controller->wtPrestamo
  * abrePrestamos\\ Crea un objeto wtXMLPrestamo \\ Sintaxis: wtPrestamo->abrePrestamos($idPersona); \\ejemplo <code php>
$nomina = $this->controller->wtPrestamo->abrePrestamos($objEmpleado->id);
</code>
==== wtXMLPrestamo ====
  * clonar\\ Permite clonar el XML
  * XMLToStr\\ Representación del XML en string
  * traeEstado\\ Trae el estado de la última acción ejecutada (ok, error)\\ sintaxis: traeEstado();\\ ejemplo: <code php>
if ($prestamo->traeEstado() == 'ok')
{
} //Entra a la condición si el estado está en ok.</code>
=== Registros de préstamos ===
  * primerRegistro\\ Trae el primer registro del objeto seleccionado con abrePrestamos. Regresa true en caso de éxito y false si ya no existen registros disponibles.\\ sintaxis: primerRegistro()\\ ejemplo: <code php>
$prestamos->wtPrestamoPrestamo->primerRegistro();
 </code>
  * siguienteRegistro\\ Trae el siguiente registro del objeto seleccionado con abrePrestamo. Regresa true en caso de éxito y false si ya no existen registros disponibles.\\ sintaxis: primerRegistro()\\ ejemplo: <code php>
$prestamo->wtPrestamoPrestamo->->primerRegistro();
While ($prestamo->wtPrestamoPrestamo->->siguienteRegistro())
{
}
 </code>
  * ultimoRegistro\\ Trae el siguiente registro de objeto seleccionado con abrePrestamo. Regresa true en caso de éxito y false si ya no existen registros disponibles.\\ sintaxis: ultimoRegistro()\\ ejemplo: <code php>
$prestamo->wtPrestamoPrestamo->ultimoRegistro();
$prestamo->wtPrestamoPrestamo->wtPrestamoPrestamo->wtPrestamoAbono->ultimoRegistro();
 </code>
  * traeRegistroActualId\\ Trae el número de registro actualmente cargado en el objeto de préstamos.\\ sintaxis: traeRegistroActualId()\\ ejemplo: <code php>
$id = $prestamo->wtPrestamoPrestamo->traeRegistroActualId();
 </code>
  * agregaPrestamo\\ Agrega un préstamo al empleado actual. \\ sintaxis: agregaPrestamo($fecha, $idWtPrestamoTipo, $monto, $descuentoPorPeriodo, $comentario, $extras=[]). \\ Nota: El formato de la fecha deberá ser Y-m-d. \\ ejemplo: <code php>
$prestamos->agregaPrestamo(date('Y-m-d'), '0', 1500, 100, 'Algún comentario', ['propiedad1'=>'valor propiedad1']);
 </code>
  * eliminaPrestamo\\ Elimina el registro de préstamo actual. Además ejecuta primerRegistro de manera automática regresando el valor devuelto por esta función.\\ En caso de forzar sea igual a false, no se podrán borrar aquellos préstamos con abonos sellados.\\ sintaxis: eliminaPrestamo($forzar=false)\\ ejemplo: <code php>
$prestamo->eliminaPrestamo();
 </code>
  * agregaAbono\\ Agrega un abono al préstamo actual. \\ sintaxis: agregaAbono($idPeriodoNomina, $fecha, $monto, $comentario='', $abonoManual=true, $estadoAbono = 'promesa'). \\ Nota: El formato de la fecha deberá ser Y-m-d. \\ El idPeriodoNomina debe existir, caso contrario no se agregará el abono.\\ El monto del abono debe ser menor o igual al saldo del préstamo, si se indica otra cantidad y aún se tiene saldo, se corregirá el monto dejando el monto máximo a descontar. Si el monto máximo es igual a 0 no se agregará el abono.\\ ejemplo: <code php>
$prestamos->agregaAbono(1, date('Y-m-d'), '100', 'Algún comentario del abono');
 </code>
  * eliminaAbono\\ Elimina el registro de abono actual. Además ejecuta primerRegistro de manera automática regresando el valor devuelto por esta función.\\ En caso de forzar sea igual a false, no se podrán borrar aquellos abonos sellados.\\ sintaxis: eliminaAbono($forzar=false)\\ ejemplo: <code php>
$prestamo->eliminaAbono(true);
 </code>
  * eliminaAbonosEnNomina\\ Elimina todos los abonos del periodo de nómina indicado y de todos los empleados, si se indica forzar se borrarán incluso aquellos con estado de sellado.\\ Para cada préstamo afectado se recalcará el saldo del mismo.\\ Para aquellos periodos de nómina eliminados y no timbrados, es necesario mandar llamar esta función para recalcar los saldos de todos los prestamos afectados.\\ sintaxis: eliminaAbonosEnNomina($idPeriodoNomina, $forzar=false)\\ ejemplo: <code php>
$prestamo->eliminaAbonosEnNomina(1);
 </code>
  * sellaAbono\\ Sella el abono actual.\\ sintaxis: sellaAbono()\\ ejemplo: <code php>
$prestamo->sellaAbono();
 </code>
  * sellaAbonosEnNomina\\ Sella todos los abonos del empleado actual del periodo de nómina indicado.\\ sintaxis: sellaAbonosEnNomina($idPeriodoNomina)\\ ejemplo: <code php>
$prestamo->sellaAbonosEnNomina(1);
 </code>
  * generaAbono\\ Genera el abono del préstamo tipo idWtPrestamoTipo, regresando el monto a descontar. Si ya existe el abono, no agregará uno nuevo. Si el abono supera el montoMaximo este será limitado\\ sintaxis:  generaAbono($idPeriodoNomina, $idWtPrestamoTipo, $montoMaximo)\\ ejemplo: <code php>
$prestamo->generaAbono(1, 1, $percepciones-$deducciones);
 </code>

=== Constantes ===

=== Estructuras ===

===== Ejemplos =====
  * [[ejemploWtPrestamo|Ejemplo de uso de métodos de objeto wtPrestamo]]

===== Tablas requeridas =====

-- phpMyAdmin SQL Dump
-- version 4.9.0.1
-- https://www.phpmyadmin.net/
--
-- Servidor: localhost:8889
-- Tiempo de generación: 16-09-2021 a las 01:37:48
-- Versión del servidor: 5.7.26
-- Versión de PHP: 7.2.21

SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
SET time_zone = "+00:00";

--
-- Base de datos: `haztuapp_wtrecal`
--

-- --------------------------------------------------------

--
-- Estructura de tabla para la tabla `wtPrestamoAbono`
--

CREATE TABLE `wtPrestamoAbono` (
  `id` int(11) NOT NULL,
  `idWtPrestamoPrestamo` int(11) NOT NULL,
  `idPeriodoNomina` int(11) DEFAULT NULL,
  `fecha` date NOT NULL,
  `estadoAbono` enum('promesa','sellado') NOT NULL,
  `abonoManual` tinyint(1) NOT NULL DEFAULT '0',
  `montoOriginal` decimal(10,2) DEFAULT NULL,
  `monto` decimal(10,2) NOT NULL,
  `comentario` text NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

-- --------------------------------------------------------

--
-- Estructura de tabla para la tabla `wtPrestamoPrestamo`
--

CREATE TABLE `wtPrestamoPrestamo` (
  `id` int(11) NOT NULL,
  `idPersona` int(11) NOT NULL,
  `fecha` date NOT NULL,
  `activo` tinyint(1) NOT NULL DEFAULT '1',
  `idWtPrestamoTipo` int(11) NOT NULL,
  `monto` decimal(10,2) NOT NULL,
  `descuentoPorPeriodo` decimal(10,2) NOT NULL,
  `saldo` decimal(10,2) NOT NULL,
  `tablaAmortizaciones` json NOT NULL,
  `comentario` text NOT NULL,
  `JSONextras` json NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

-- --------------------------------------------------------

--
-- Estructura de tabla para la tabla `wtPrestamoTipo`
--

CREATE TABLE `wtPrestamoTipo` (
  `id` int(11) NOT NULL,
  `descripcion` varchar(50) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

--
-- Índices para tablas volcadas
--

--
-- Indices de la tabla `wtPrestamoAbono`
--
ALTER TABLE `wtPrestamoAbono`
  ADD UNIQUE KEY `unique` (`id`,`idWtPrestamoPrestamo`,`idPeriodoNomina`,`fecha`) USING BTREE;

--
-- Indices de la tabla `wtPrestamoPrestamo`
--
ALTER TABLE `wtPrestamoPrestamo`
  ADD UNIQUE KEY `UNIQUE` (`id`,`idPersona`) USING BTREE;

--
-- Indices de la tabla `wtPrestamoTipo`
--
ALTER TABLE `wtPrestamoTipo`
  ADD PRIMARY KEY (`id`);

--
-- AUTO_INCREMENT de las tablas volcadas
--

--
-- AUTO_INCREMENT de la tabla `wtPrestamoAbono`
--
ALTER TABLE `wtPrestamoAbono`
  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;

--
-- AUTO_INCREMENT de la tabla `wtPrestamoPrestamo`
--
ALTER TABLE `wtPrestamoPrestamo`
  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;

--
-- AUTO_INCREMENT de la tabla `wtPrestamoTipo`
--
ALTER TABLE `wtPrestamoTipo`
  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;




