Skip to content

Instantly share code, notes, and snippets.

@dairdr
Created December 11, 2014 21:24
Show Gist options
  • Save dairdr/0fc0a37059296a25d6d4 to your computer and use it in GitHub Desktop.
Save dairdr/0fc0a37059296a25d6d4 to your computer and use it in GitHub Desktop.
liquidacion
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