Skip to content

Instantly share code, notes, and snippets.

@dairdr
Created December 11, 2014 21:25
Show Gist options
  • Save dairdr/be9d49bf9d0f21ec365d to your computer and use it in GitHub Desktop.
Save dairdr/be9d49bf9d0f21ec365d to your computer and use it in GitHub Desktop.
pagos
public function paymentRegistered($valor, $reglasProgramacionPago)
{
$em = $this->container->get('doctrine')->getManager();
if (!empty($reglasProgramacionPago)) {
$movimientoPago = $em->getRepository('TimPagosBundle:MovimientoPago')->findOneByReglasProgramacionPago($reglasProgramacionPago);
$facturasDetalle = $em->getRepository('TimPagosBundle:FacturaDetalle')->findByReglasProgramacionPagoAndDate($reglasProgramacionPago);
// Validamos que encontramos las facturas detalle y movimiento pago de la obligación.
if (!empty($movimientoPago) && !empty($facturasDetalle)) {
$now = new \DateTime();
// Registramos el movimiento.
$movimientoCreditoCab = new MovimientoCreditoCab();
$movimientoCreditoCab->setFecha($now);
$oficina = $em->getRepository('TimPagosBundle:Oficina')->find($this->container->getParameter('oficina.default.id'));
$movimientoCreditoCab->setOficina($oficina);
$movimientoCreditoCab->setCodigoTransaccion(311);
$numeroTransaccion = sha1(uniqid());
$movimientoCreditoCab->setNumeroTransaccion($numeroTransaccion);
$movimientoCreditoCab->setValorTransaccion($valor);
$canalPago = $em->getRepository('TimPagosBundle:TipoCanalesPago')->find($this->container->getParameter('tipo_canales_pago.default.id'));
$movimientoCreditoCab->setTipoCanalesPago($canalPago);
$movimientoCreditoCab->setDiasMoraAnterior($movimientoPago->getDiasMora());
$movimientoCreditoCab->setFechaPago($now);
$movimientoCreditoCab->setSaldoCapital($movimientoPago->getSaldoCapital());
$movimientoCreditoCab->setInteresCorriente($movimientoPago->getInteresCorriente());
$movimientoCreditoCab->setDificilCobroInteresMora($movimientoPago->getDificilCobroInteresMora());
$movimientoCreditoCab->setInteresDificilCobro($movimientoPago->getInteresDificilCobro());
$movimientoCreditoCab->setSaldoInteresMora($movimientoPago->getSaldoInteresMora());
$movimientoCreditoCab->setObservacion('pago');
$movimientoCreditoCab->setAcumuladoCapital($movimientoPago->getAcumuladoCapital());
$movimientoCreditoCab->setAcumuladoInteres($movimientoPago->getAcumuladoInteres());
$movimientoCreditoCab->setSaldoInteresPagado($movimientoPago->getSaldoInteresPagado());
$movimientoCreditoCab->setSaldoProyectado($movimientoPago->getSaldoProyectado());
$movimientoCreditoCab->setAcumuladoCapitalPagado($movimientoPago->getAcumuladoCapitalPagado());
$movimientoCreditoCab->setFechaRealPago($now);
$movimientoCreditoCab->setUsuario($this->container->get('security.context')->getToken()->getUser());
$movimientoCreditoCab->setReglasProgramacionPago($reglasProgramacionPago);
$em->persist($movimientoCreditoCab);
$em->flush();
// Recorremos todas las facturas detalle para ir descontando valores
// pendiente por cobrar.
foreach ($facturasDetalle as $fd) {
if ($movimientoPago->getDificilCobroInteresMora() > 0) {
if ($fd->getContabilidadInteresMoraDificilCobro() > 0) {
if ($valor >= $fd->getContabilidadInteresMoraDificilCobro()) {
$valor -= $fd->getContabilidadInteresMoraDificilCobro();
$this->createMovimientoDet($movimientoCreditoCab, 311, $numeroTransaccion, 1000, $fd->getContabilidadInteresMoraDificilCobro(), $movimientoPago->getSaldoCapital(), $now, $em);
$dificilCobroInteresMora = $this->processFloat($movimientoPago->getDificilCobroInteresMora() - $fd->getContabilidadInteresMoraDificilCobro());
$movimientoPago->setDificilCobroInteresMora($dificilCobroInteresMora);
$fd->setContabilidadInteresMoraDificilCobro(0);
} else {
$fd->setContabilidadInteresMoraDificilCobro($this->processFloat($fd->getContabilidadInteresMoraDificilCobro() - $valor));
$this->createMovimientoDet($movimientoCreditoCab, 311, $numeroTransaccion, 1000, $valor, $movimientoPago->getSaldoCapital(), $now, $em);
$valor = 0;
break;
}
}
}
// Limpiamos residuo de valor.
$valor = $this->processFloat($valor);
if ($movimientoPago->getSaldoInteresMora() > 0) {
if ($fd->getContabilidadInteresMora() > 0) {
if ($valor >= $fd->getContabilidadInteresMora()) {
$valor -= $fd->getContabilidadInteresMora();
$movimientoPago->setSaldoInteresMora($this->processFloat($movimientoPago->getSaldoInteresMora() - $fd->getContabilidadInteresMora()));
$this->createMovimientoDet($movimientoCreditoCab, 311, $numeroTransaccion, 1003, $fd->getContabilidadInteresMora(), $movimientoPago->getSaldoCapital(), $now, $em);
$fd->setContabilidadInteresMora(0);
} else {
$contabilidadInteresMora = $fd->getContabilidadInteresMora() - $valor;
$fd->setContabilidadInteresMora($this->processFloat($contabilidadInteresMora));
$movimientoPago->setSaldoInteresMora($this->processFloat($movimientoPago->getSaldoInteresMora() - $valor));
$this->createMovimientoDet($movimientoCreditoCab, 311, $numeroTransaccion, 1003, $valor, $movimientoPago->getSaldoCapital(), $now, $em);
$valor = 0;
break;
}
}
}
// Limpiamos residuo de valor.
$valor = $this->processFloat($valor);
// mdb Sept 19/2014 para aplicar pagos de interes corriente y dificil cobro
if ($valor >= ($movimientoPago->getInteresCorriente() + $movimientoPago->getInteresDificilCobro())) {
if ($valor >= $fd->getContabilidadInteresCorriente()) {
$wintanti = $fd->getContabilidadInteresCorriente() - ($movimientoPago->getInteresCorriente() + $movimientoPago->getInteresDificilCobro());
// el valor facturado es mayor que el interes corriente causado
if ($wintanti > 0) {
if ($movimientoPago->getInteresDificilCobro() > 0) {
$interescorrientedifcob = $movimientoPago->getInteresDificilCobro();
$this->createMovimientoDet($movimientoCreditoCab, 311, $numeroTransaccion, 1001, $interescorrientedifcob, $movimientoPago->getSaldoCapital(), $now, $em);
$movimientoPago->setSaldoInteresPagado($movimientoPago->getSaldoInteresPagado() + $interescorrientedifcob);
$valor -= $interescorrientedifcob;
$movimientoPago->setInteresDificilCobro($this->processFloat($movimientoPago->getInteresDificilCobro() - $interescorrientedifcob));
}
if ($movimientoPago->getInteresCorriente() > 0) {
$interesCorriente = $movimientoPago->getInteresCorriente();
$this->createMovimientoDet($movimientoCreditoCab, 311, $numeroTransaccion, 1004, $interesCorriente, $movimientoPago->getSaldoCapital(), $now, $em);
$movimientoPago->setSaldoInteresPagado($movimientoPago->getSaldoInteresPagado() + $interesCorriente);
$movimientoPago->setInteresCorriente($this->processFloat($movimientoPago->getInteresCorriente() - $interesCorriente));
$valor -= $interesCorriente;
}
$this->createMovimientoDet($movimientoCreditoCab, 311, $numeroTransaccion, 1009, $this->processFloat($wintanti), $movimientoPago->getSaldoCapital(), $now, $em);
$movimientoPago->setInteresAnticipado($this->processFloat($wintanti));
$valor -= $wintanti;
$fd->setContabilidadInteresCorriente(0);
} else {
if ($movimientoPago->getInteresDificilCobro() > 0) {
if ($fd->getContabilidadInteresCorriente() > 0) { // preguntar si hay valor faltante facturado x aplicar
if ($fd->getContabilidadInteresCorriente() >= $movimientoPago->getInteresDificilCobro()) {
$interescorrientedifcob = $movimientoPago->getInteresDificilCobro();
$this->createMovimientoDet($movimientoCreditoCab, 311, $numeroTransaccion, 1001, $interescorrientedifcob, $movimientoPago->getSaldoCapital(), $now, $em);
$movimientoPago->setSaldoInteresPagado($movimientoPago->getSaldoInteresPagado() + $interescorrientedifcob);
$movimientoPago->setInteresDificilCobro($this->processFloat($movimientoPago->getInteresDificilCobro() - $interescorrientedifcob));
$fd->setContabilidadInteresCorriente($this->processFloat($fd->getContabilidadInteresCorriente() - $interescorrientedifcob));
$valor -= $interescorrientedifcob;
} else {
//alcanza a pagar los int corrientes facturados
$interescorrientedifcob = $fd->getContabilidadInteresCorriente();
$this->createMovimientoDet($movimientoCreditoCab, 311, $numeroTransaccion, 1001, $interescorrientedifcob, $movimientoPago->getSaldoCapital(), $now, $em);
$movimientoPago->setSaldoInteresPagado($movimientoPago->getSaldoInteresPagado() + $interescorrientedifcob);
$movimientoPago->setInteresDificilCobro($this->processFloat($movimientoPago->getInteresDificilCobro() - $interescorrientedifcob));
$fd->setContabilidadInteresCorriente(0);
$valor -= $interescorrientedifcob;
}
}
} // fin geinteresdificilcobro
if ($valor > 0) {
if ($fd->getContabilidadInteresCorriente() > 0) {
if ($fd->getContabilidadInteresCorriente() >= $movimientoPago->getInteresCorriente()) {
$interescorriente = $movimientoPago->getInteresCorriente();
$this->createMovimientoDet($movimientoCreditoCab, 311, $numeroTransaccion, 1004, $interescorriente, $movimientoPago->getSaldoCapital(), $now, $em);
$movimientoPago->setSaldoInteresPagado($movimientoPago->getSaldoInteresPagado() + $interescorriente);
$movimientoPago->setInteresCorriente($this->processFloat($movimientoPago->getInteresCorriente() - $interescorriente));
$fd->setContabilidadInteresCorriente($this->processFloat($fd->getContabilidadInteresCorriente() - $interescorriente));
$valor -= $interescorriente;
} else {
//alcanza a pagar los int corrientes facturados
$interescorriente = $fd->getContabilidadInteresCorriente();
$this->createMovimientoDet($movimientoCreditoCab, 311, $numeroTransaccion, 1004, $interescorriente, $movimientoPago->getSaldoCapital(), $now, $em);
$movimientoPago->setSaldoInteresPagado($movimientoPago->getSaldoInteresPagado() + $interescorriente);
$movimientoPago->setInteresCorriente($this->processFloat($movimientoPago->getInteresCorriente() - $interescorriente));
$fd->setContabilidadInteresCorriente(0);
$valor -= $interescorriente;
}
} // fin get interes corriente
}
}
} else { // lo pagado es menor que lo que tiene contabilizado int corr, en movpago.intcorriente esta agotado
$wintanti = $this->processFloat($fd->getContabilidadInteresCorriente() - ($movimientoPago->getInteresCorriente() + $movimientoPago->getInteresDificilCobro()));
if ($wintanti == $fd->getContabilidadInteresCorriente()) {
// son int que los paga anticipadamente
$movimientoPago->setInteresAnticipado($this->processFloat($valor));
$fd->setContabilidadInteresCorriente($this->processFloat($fd->getContabilidadInteresCorriente() - $valor));
$this->createMovimientoDet($movimientoCreditoCab, 311, $numeroTransaccion, 1009, $valor, $movimientoPago->getSaldoCapital(), $now, $em);
$valor = 0;
break;
}
}
} else { //el valor es menor que valor de int corrientes + int difi cobro de movimientopago.
// averiguo si el valor es mayor o igual al interes corriente contabilizado,
if ($valor >= $fd->getContabilidadInteresCorriente()) {
// hay que serciorarse si el interes facturado es mayor que cero para realizar transacciones
if ($movimientoPago->getContabilidadInteresCorriente() > 0) {
if ($valor >= $movimientoPago->getInteresDificilCobro()) {
$interescorrientedifcob = $movimientoPago->getInteresDificilCobro();
$this->createMovimientoDet($movimientoCreditoCab, 311, $numeroTransaccion, 1001, $interescorrientedifcob, $movimientoPago->getSaldoCapital(), $now, $em);
$movimientoPago->setSaldoInteresPagado($movimientoPago->getSaldoInteresPagado() + $interescorrientedifcob);
$movimientoPago->setInteresDificilCobro($this->processFloat($movimientoPago->getInteresDificilCobro() - $interescorrientedifcob));
$fd->setContabilidadInteresCorriente($this->processFloat($fd->getContabilidadInteresCorriente() - $interescorrientedifcob));
$valor -= $interescorrientedifcob;
} else {
//es mayor el dificil cobro, se agota el pago
$movimientoPago->setSaldoInteresPagado($movimientoPago->getSaldoInteresPagado() + $valor);
$movimientoPago->setInteresDificilCobro($this->processFloat($movimientoPago->getInteresDificilCobro() - $valor));
$fd->setContabilidadInteresCorriente($this->processFloat($fd->getContabilidadInteresCorriente() - $valor));
$this->createMovimientoDet($movimientoCreditoCab, 311, $numeroTransaccion, 1001, $valor, $movimientoPago->getSaldoCapital(), $now, $em);
$valor = 0;
break;
}
}
// si tiene dinero continua aplicando pago
if ($valor > 0) {
// hay que serciorarse si el interes facturado es mayor que cero para realizar transacciones
if ($movimientoPago->getContabilidadInteresCorriente() > 0) {
if ($valor >= $movimientoPago->getContabilidadInteresCorriente()) {
$interescorriente = $movimientoPago->getContabilidadInteresCorriente();
$this->createMovimientoDet($movimientoCreditoCab, 311, $numeroTransaccion, 1004, $interescorriente, $movimientoPago->getSaldoCapital(), $now, $em);
$movimientoPago->setSaldoInteresPagado($movimientoPago->getSaldoInteresPagado() + $interescorriente);
$movimientoPago->setInteresCorriente($this->processFloat($movimientoPago->getInteresCorriente() - $interescorriente));
$fd->setContabilidadInteresCorriente($this->processFloat($fd->getContabilidadInteresCorriente() - $interescorriente));
$valor -= $interescorriente;
} else {
//es mayor el interes corriente, se agota el pago
$movimientoPago->setSaldoInteresPagado($movimientoPago->getSaldoInteresPagado() + $valor);
$movimientoPago->setInteresCorriente($this->processFloat($movimientoPago->getInteresCorriente() - $valor));
$fd->setContabilidadInteresCorriente($this->processFloat($fd->getContabilidadInteresCorriente() - $valor));
$this->createMovimientoDet($movimientoCreditoCab, 311, $numeroTransaccion, 1004, $valor, $now, $movimientoPago->getSaldoCapital(), $em);
$valor = 0;
break;
}
}
}
} // fin si $valor es mayor que contabilidad interes corriente
else {
// el valor es menor que lo que esta en fd.contabilidadintcorriente
if ($valor > 0) {
if ($fd->getContabilidadInteresCorriente() > 0) {
if ($movimientoPago->getInteresDificilCobro() > 0) {
if ($valor >= $movimientoPago->getInteresDificilCobro()) {
$interescorrientedifcob = $movimientoPago->getInteresDificilCobro();
$this->createMovimientoDet($movimientoCreditoCab, 311, $numeroTransaccion, 1001, $interescorrientedifcob, $movimientoPago->getSaldoCapital(), $now, $em);
$movimientoPago->setSaldoInteresPagado($movimientoPago->getSaldoInteresPagado() + $interescorrientedifcob);
$movimientoPago->setInteresDificilCobro($this->processFloat($movimientoPago->getInteresDificilCobro() - $interescorrientedifcob));
$fd->setContabilidadInteresCorriente($this->processFloat($fd->getContabilidadInteresCorriente() - $interescorrientedifcob));
$valor -= $interescorrientedifcob;
} else {
//es mayor el dificil cobro, se agota el pago
$movimientoPago->setSaldoInteresPagado($movimientoPago->getSaldoInteresPagado() + $valor);
$movimientoPago->setInteresDificilCobro($this->processFloat($movimientoPago->getInteresDificilCobro() - $valor));
$fd->setContabilidadInteresCorriente($this->processFloat($fd->getContabilidadInteresCorriente() - $valor));
$this->createMovimientoDet($movimientoCreditoCab, 311, $numeroTransaccion, 1001, $valor, $movimientoPago->getSaldoCapital(), $now, $em);
$valor = 0;
break;
}
}
}
} // de $valor
if ($valor > 0) {
// hay que serciorarse si el interes facturado es mayor que cero para realizar transacciones
if ($fd->getContabilidadInteresCorriente() > 0) {
if ($valor >= $fd->getContabilidadInteresCorriente()) {
$interescorriente = $fd->getContabilidadInteresCorriente();
$this->createMovimientoDet($movimientoCreditoCab, 311, $numeroTransaccion, 1004, $interescorriente, $movimientoPago->getSaldoCapital(), $now, $em);
$movimientoPago->setSaldoInteresPagado($movimientoPago->getSaldoInteresPagado() + $interescorriente);
$movimientoPago->setInteresCorriente($this->processFloat($movimientoPago->getInteresCorriente() - $interescorriente));
$fd->setContabilidadInteresCorriente($this->processFloat($fd->getContabilidadInteresCorriente() - $interescorriente));
$valor -= $interescorriente;
} else {
//es mayor el interes corriente, se agota el pago
$movimientoPago->setSaldoInteresPagado($movimientoPago->getSaldoInteresPagado() + $valor);
$movimientoPago->setInteresCorriente($this->processFloat($movimientoPago->getInteresCorriente() - $valor));
$fd->setContabilidadInteresCorriente($this->processFloat($fd->getContabilidadInteresCorriente() - $valor));
$this->createMovimientoDet($movimientoCreditoCab, 311, $numeroTransaccion, 1004, $valor, $movimientoPago->getSaldoCapital(), $now, $em);
$valor = 0;
break;
}
}
} //de $valor
} // fin else si $valor es mayor que contabilidad interes corriente
}
if ($valor <= 0) {
$valor = 0;
$em->flush();
break;
}
if ($valor > 0) { //mdb sept 19/2014
if ($movimientoPago->getSaldoCapital() > 0) {
if ($fd->getContabilidadCuotaCapital() > 0) {
if ($valor >= $fd->getContabilidadCuotaCapital()) {
$this->createMovimientoDet($movimientoCreditoCab, 311, $numeroTransaccion, 1005, $fd->getContabilidadCuotaCapital(), $movimientoPago->getSaldoCapital(), $now, $em);
$valor -= $fd->getContabilidadCuotaCapital();
$saldoCapital = $movimientoPago->getSaldoCapital() - $fd->getContabilidadCuotaCapital();
$movimientoPago->setSaldoCapital($this->processFloat($saldoCapital));
$movimientoPago->setAcumuladoCapitalPagado($movimientoPago->getAcumuladoCapitalPagado() + $fd->getContabilidadCuotaCapital());
$fd->setContabilidadCuotaCapital(0);
} else {
$saldoCapital = $movimientoPago->getSaldoCapital() - $valor;
$movimientoPago->setAcumuladoCapitalPagado($movimientoPago->getAcumuladoCapitalPagado() + $valor);
$movimientoPago->setSaldoCapital($this->processFloat($saldoCapital));
$fd->setContabilidadCuotaCapital($this->processFloat($fd->getContabilidadCuotaCapital() - $valor));
if ($this->isPayed($fd)) {
$fd->setEsPagado(1);
$movimientoPago->setCuotasPagadas($movimientoPago->getCuotasPagadas() + 1);
}
$this->createMovimientoDet($movimientoCreditoCab, 311, $numeroTransaccion, 1005, $valor, $movimientoPago->getSaldoCapital(), $now, $em);
$valor = 0;
break;
}
}
}
} // end de la pregunta si hay valor pagado
if ($valor <= 0) {
$valor = 0;
}
if ($this->isPayed($fd)) {
$fd->setEsPagado(1);
$movimientoPago->setCuotasPagadas($movimientoPago->getCuotasPagadas() + 1);
}
$em->flush();
}
$facturaDetalle = $em->getRepository('TimPagosBundle:FacturaDetalle')->findOneByReglasProgramacionPagoAndEsPagado($reglasProgramacionPago, 0);
if (!empty($facturaDetalle)) {
// Se encontró una próxima factura a pagar.
$movimientoPago->setFechaPago($facturaDetalle[0]->getFechaFacturaInicial());
// Recalibrar la calificación de la póliza.
$now = new \DateTime();
if ($now > $movimientoPago->getFechaPago()) {
$diasDesactivacion = $movimientoPago->getNegocio()->getContratoProducto()->getProducto()->getDiasDesactivacion();
$diasCancelacion = $movimientoPago->getNegocio()->getContratoProducto()->getProducto()->getDiasCancelacion();
$diferencia = $now->diff($movimientoPago->getFechaPago());
$diasMora = (int) $diferencia->format('%a');
$movimientoPago->setDiasMora($diasMora);
$this->recalibrateMora($diasMora, $diasDesactivacion, $diasCancelacion, $em, $reglasProgramacionPago);
}
}
$movimientoPago->setFechaUltimoPago(new \DateTime());
// Revisar si quedo dinero.
$estadoNegocioId = $this->container->getParameter('tipo_estado_negocio.finalizado.id');
$tipoEstadoNegocio = $em->getRepository('TimPagosBundle:TipoEstadoNegocio')->find($estadoNegocioId);
if ($valor > 0) {
if ($movimientoPago->getSaldoCapital() >= $valor) {
$movimientoPago->setSaldoCapital($movimientoPago->getSaldoCapital() - $valor);
$valor = 0;
} else {
// Aun pagando el saldo capital, queda dinero, hay que regresarlo al cliente.
$valor -= $movimientoPago->getSaldoCapital();
$movimientoPago->setSaldoCapital(0);
$movimientoPago->setSaldoFavor($valor);
// Además hay que dejar la deuda saldada y desactivar el crédito.
$estadoObligacionId = $this->container->getParameter('tipo_estado_obligacion.desactivado.id');
$tipoEstadoObligacion = $em->getRepository('TimPagosBundle:TipoEstadoObligacion')->find($estadoObligacionId);
$reglasProgramacionPago->setTipoEstadoObligacion($tipoEstadoObligacion);
}
}
// registrar el cambio de estado del negocio.
$cen = new CambioEstadoNegocio();
$cen->setUsuario($this->container->get('security.context')->getToken()->getUser());
$cen->setFromTipoEstadoNegocio($reglasProgramacionPago->getTipoEstadoNegocio());
$cen->setToTipoEstadoNegocio($tipoEstadoNegocio);
$cen->setFecha(new \DateTime());
$cen->setDescripcion('Se pagó de manera completa la póliza');
$em->persist($cen);
$em->flush();
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment