Created
December 11, 2014 21:24
-
-
Save dairdr/0fc0a37059296a25d6d4 to your computer and use it in GitHub Desktop.
liquidacion
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
public function updateMovement($reglasProgramacionPago) | |
{ | |
$em = $this->container->get('doctrine')->getManager(); | |
$calificacionObligacion = $em->getRepository('TimPagosBundle:TipoCalificacionObligacion')->findAll(); | |
if (is_array($reglasProgramacionPago)) { | |
foreach ($reglasProgramacionPago as $reglas) { | |
$movimientoPago = $em->getRepository('TimPagosBundle:MovimientoPago')->findOneByReglasProgramacionPago($reglas); | |
if (!empty($movimientoPago)) { | |
// Actualizamos movimiento pago. | |
$tasaDiaria = 0; | |
if ($movimientoPago->getReglasProgramacionPago()->getTipoPeriodoPago()->getDias() > 0) { | |
$tasaDiaria = ($movimientoPago->getReglasProgramacionPago()->getTasaNominalPeriodica() / $movimientoPago->getReglasProgramacionPago()->getTipoPeriodoPago()->getDias()) / 100; | |
} | |
// En este punto cambia la base de liquidacion, significa esto que hasta una parte liquido con una base | |
if ($movimientoPago->getSaldoCapital() < $movimientoPago->getSaldoProyectado()) { | |
$movimientoPago->setSaldoProyectado($movimientoPago->getSaldoCapital()); | |
} | |
$interesCorriente = $movimientoPago->getSaldoProyectado() * $tasaDiaria; | |
$movimientoPago->setDebidoPagarInteresPeriodo($movimientoPago->getDebidoPagarInteresPeriodo() + $interesCorriente); | |
$acumuladoInteresCorriente = $interesCorriente + $movimientoPago->getInteresCorriente(); | |
// Verificar si hay mora. | |
$now = new \DateTime(); | |
$tasaMora = $movimientoPago->getNegocio()->getContratoProducto()->getProducto()->getTasaMora(); | |
$diasDesactivacion = $movimientoPago->getNegocio()->getContratoProducto()->getProducto()->getDiasDesactivacion(); | |
$diasCancelacion = $movimientoPago->getNegocio()->getContratoProducto()->getProducto()->getDiasCancelacion(); | |
$diasInteresDificilCobro = $movimientoPago->getNegocio()->getContratoProducto()->getProducto()->getDiasDificilCobro(); | |
if ($now > $movimientoPago->getFechaPago()) { | |
$diferencia = $now->diff($movimientoPago->getFechaPago()); | |
$diasMora = (int) $diferencia->format('%a'); | |
$moraDiaria = $tasaMora / 30;// Sujeto al estatutos del gobierno (siempre mensual) | |
$capitalAtrasado = $this->processFloat($movimientoPago->getAcumuladoCapital() - $movimientoPago->getAcumuladoCapitalPagado()); | |
$saldoInteresMora = $movimientoPago->getSaldoInteresMora(); | |
$saldoInteresMora += ($capitalAtrasado * ($moraDiaria / 100)); | |
$movimientoPago->setSaldoInteresMora($saldoInteresMora); | |
$movimientoPago->setDiasMora($diasMora); | |
// Recalificar al usuario moroso. | |
$calificacion = $this->getCalificacion($calificacionObligacion, $diasMora, $calificacionObligacion[count($calificacionObligacion) - 1]); | |
$movimientoPago->setCalificacionObligacion($calificacion); | |
$movimientoPago->setFechaCalificacion($now); | |
$this->recalibrateMora($diasMora, $diasDesactivacion, $diasCancelacion, $em, $reglas); | |
// Verificamos los días para setear interes de dificil cobro. | |
if ($diasMora >= $diasInteresDificilCobro) { | |
$movimientoPago->setInteresDificilCobro($movimientoPago->getInteresDificilCobro() + $interesCorriente); | |
} | |
} | |
if ($movimientoPago->getInteresAnticipado() > 0) { | |
$movimientoPago->setInteresAnticipado($this->processFloat($movimientoPago->getInteresAnticipado() - $interesCorriente)); | |
$movimientoPago->setSaldoInteresPagado($movimientoPago->getSaldoInteresPagado() + $interesCorriente); | |
} else { | |
$movimientoPago->setInteresCorriente($acumuladoInteresCorriente); | |
} | |
$movimientoPago->setInteresCorriente($acumuladoInteresCorriente); | |
$movimientoPago->setInteresDiario($interesCorriente); | |
$movimientoPago->setInteresCorrienteAno($movimientoPago->getInteresCorrienteAno() + $interesCorriente); | |
// Verificar si es primero de enero. | |
$year = new \DateTime(date('Y') . '-01-01'); | |
if ($now->format('Y-m-d') == $year->format('Y-m-d')) { | |
$movimientoPago->setInteresCorrienteAnoAnterior($movimientoPago->getInteresCorrienteAno()); | |
$movimientoPago->setInteresCorrienteAno(0); | |
} | |
// Verificamos si en 24 horas se cumple algúna cuota | |
// buscando la próxima fecha de pago. | |
$programacionPago = $em->getRepository('TimPagosBundle:ProgramacionPago')->findOneBy( | |
array( | |
'esFacturado'=>0, | |
'reglasProgramacionPago'=>$movimientoPago->getReglasProgramacionPago() | |
) | |
); | |
$tomorrow = $now->modify('+12 hours'); | |
if ($movimientoPago->getReglasProgramacionPago()->getTipoPeriodoPago()->getId() != $this->container->getParameter('formaPago.contado')) { | |
// Verificar si mañana se cumple cuota para enviar factura. | |
$facturaDetalleAnterior = $em->getRepository('TimPagosBundle:FacturaDetalle')->findUltimaFactura($movimientoPago->getReglasProgramacionPago()); | |
if (!empty($programacionPago) && $programacionPago->getFechaMinima()->format('Y-m-d') == $tomorrow->format('Y-m-d')) { | |
$facturaDetalle = new FacturaDetalle(); | |
$facturaDetalle->setReglasProgramacionPago($movimientoPago->getReglasProgramacionPago()); | |
$facturaDetalle->setFechaFacturaInicial($facturaDetalleAnterior->getFechaFacturaFinal()); | |
if ($this->container->getParameter('fecha_maxima_inicio_mora')) { | |
$facturaDetalle->setFechaFacturaFinal($programacionPago->getFechaMaxima()); | |
} else { | |
$facturaDetalle->setFechaFacturaFinal($programacionPago->getFechaMinima()); | |
} | |
$facturaDetalle->setFechaMinima($facturaDetalleAnterior->getFechaFacturaFinal()); | |
$acumuladoInteres = $movimientoPago->getAcumuladoInteres(); | |
$acumuladoInteres += $movimientoPago->getDebidoPagarInteresPeriodo(); | |
$acumuladoCapital = $movimientoPago->getAcumuladoCapital(); | |
$acumuladoCapital += $this->processFloat($movimientoPago->getReglasProgramacionPago()->getValorCuota() - $movimientoPago->getDebidoPagarInteresPeriodo()); | |
$saldoProyectado = $movimientoPago->getSaldoProyectado(); | |
$saldoProyectado -= $this->processFloat($movimientoPago->getReglasProgramacionPago()->getValorCuota() - $movimientoPago->getDebidoPagarInteresPeriodo()); | |
$saldoProyectado = $this->processFloat($saldoProyectado); | |
$interesMoraAnterior = $movimientoPago->getInteresMoraAnterior(); | |
$movimientoPago->setInteresMoraAnterior($movimientoPago->getSaldoInteresMora()); | |
$movimientoPago->setAcumuladoInteres($acumuladoInteres); | |
// verificamos si hay un pago extra. | |
$pagoExtra = $em->getRepository('TimPagosBundle:PagoExtra')->findOneBy(array( | |
'fecha'=>$facturaDetalle->getFechaFacturaInicial(), | |
'reglasProgramacionPago'=>$movimientoPago->getReglasProgramacionPago() | |
)); | |
$movimientoPago->setAcumuladoCapital((!empty($pagoExtra))? $acumuladoCapital + $pagoExtra->getMonto(): $acumuladoCapital); | |
$movimientoPago->setSaldoProyectado($saldoProyectado); | |
// Reseteamos el valor del acumulado del interes en el periodo. | |
$movimientoPago->setDebidoPagarInteresPeriodo(0); | |
$facturaDetalle->setInteresCorriente($acumuladoInteresCorriente); | |
$facturaDetalle->setSaldoCapital($movimientoPago->getSaldoCapital()); | |
$facturaDetalle->setInteresMora($movimientoPago->getSaldoInteresMora()); | |
$facturaDetalle->setSaldoProyectado($saldoProyectado); | |
// CXC | |
$cxcInteresCorriente = $saldoProyectado * ($movimientoPago->getReglasProgramacionPago()->getTasaNominalPeriodica() / 100); | |
$facturaDetalle->setCxcInteresCorriente($cxcInteresCorriente); | |
$cxcCuotaCapital = $this->processFloat($movimientoPago->getReglasProgramacionPago()->getValorCuota() - $cxcInteresCorriente); | |
$facturaDetalle->setCxcCuotaCapital($cxcCuotaCapital); | |
$facturaDetalle->setCxcInteresMora($this->processFloat($movimientoPago->getInteresMoraAnterior() - $interesMoraAnterior)); | |
// Contabilidad | |
$facturaDetalle->setContabilidadInteresCorriente($cxcInteresCorriente); | |
$facturaDetalle->setContabilidadCuotaCapital($cxcCuotaCapital); | |
$facturaDetalle->setContabilidadInteresMora($this->processFloat($movimientoPago->getInteresMoraAnterior() - $interesMoraAnterior)); | |
$facturaDetalle->setEsPagado(0); | |
$em->persist($facturaDetalle); | |
$programacionPago->setEsFacturado(1); | |
$em->flush(); | |
// Enviar factura por correo. | |
$facturas = $em->getRepository('TimPagosBundle:FacturaDetalle')->findBy(array( | |
'reglasProgramacionPago'=>$movimientoPago->getReglasProgramacionPago(), | |
'esPagado'=>0 | |
)); | |
// Verificamos si segun la configuración del producto | |
// es necesario enviar un correo con la nueva factura al cliente. | |
if($movimientoPago->getNegocio()->getContratoProducto()->getProducto()->getNotificacionPostprogramacion() == 1) { | |
if ($this->getTotalFactura($facturaDetalle) > $movimientoPago->getNegocio()->getContratoProducto()->getProducto()->getMargenFinalizacion()) { | |
$this->sendFacturaEmail($movimientoPago->getReglasProgramacionPago(), $em, $facturas); | |
} | |
} | |
} else { | |
// Se ha completado el ciclo de facturación y aun hay deuda pendiente, | |
// por eso, de ahora en adelante se va a generar una factura detalle por cada dia que pase para | |
// registrar la mora pendiente. | |
$this->createFacturaDetalle($em, $movimientoPago, $facturaDetalleAnterior, $acumuladoInteresCorriente); | |
} | |
} else { | |
// La póliza es de contado, se va a generar una factura detalle. | |
$this->createFacturaDetalle($em, $movimientoPago, $facturaDetalleAnterior, $acumuladoInteresCorriente); | |
} | |
$em->flush(); | |
} | |
// Revisar y cambiar estadol negocio. | |
$idInactivo = $this->container->getParameter('tipo_estado_negocio.inactivo.id'); | |
$idActivo = $this->container->getParameter('tipo_estado_negocio.aceptado.id'); | |
$tipoEstadoNegocioAceptado = $em->getRepository('TimPagosBundle:TipoEstadoNegocio')->find($idActivo); | |
if ($movimientoPago->getDiasMora() == 0 && $reglas->getEstadoNegocio()->getId() == $idInactivo) { | |
$reglas->setEstadoNegocio($tipoEstadoNegocioAceptado); | |
$em->flush(); | |
} | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment