<?php

Yii::import('application.modules.contable.models.*', true);
Yii::import('application.modules.contable.models.comprobantes.*', true);

class LiquidacionMasivo extends Utilidades
{
    protected $nomina;
    public $escenario = 10;
    protected $datos = null;
    protected $tipo_unidad = 1;
    protected $tipo_prestamo = 3;
    protected $titulo_proceso = 3;
    protected $pago_liquidacion = 10;

    public function __construct($nomina)
    {
        $this->nomina = $nomina;
        $this->queryFichas();
    }

    private function queryFichas()
    {
        if ($this->datos !== null) {
            return;
        }

        $this->datos = [
            'asignaciones' => $this->asignaciones(),
            'retiro_deducciones' => $this->deducciones(),
            'capital_cartera_prestamos' => $this->capitalNoAfectado(),
            'capital_afectado_prenomina' => $this->capitalAfectado(),
            'interes_afectado_prenomina' => $this->interesAfectado(),
            'totales' => $this->totales(),
        ];
    }

    public function contabilizar()
    {
        if (! ParamEscenarios::conectado($this->escenario)) {
            return;
        }

        ////////////////////////////////// COMPROBANTE /////////////////////////////////
        $comprobante = $this->comprobante();

        $this->seguimientoComprobante(
            $comprobante->id,
            $this->nomina->id,
            $this->nomina->getIdComprobantePago(),
            $this->titulo_proceso
        );
        ////////////////////////// MOVIMIENTOS DEL COMPROBANTE /////////////////////////
        $this->movimientos($comprobante);
    }

    private function movimientos($comprobante)
    {
        $movimiento = new Movimiento(
            $comprobante,
            $this->nomina->fecha_referencia
        );

        $saldos = $this->saldos();

        $aporteSocio = (new Warp($saldos))->get('debe.cta_liquid_aporte_socio', []);
        if ($this->configuracionAuxiliar('cta_liquid_aporte_socio')) {
            foreach ((new Group([
                'by' => 'cta_liquid_aporte_socio',
                'column' => 'monto',
                'proceso' => 'unidad',
                'escenario' => $this->pago_liquidacion,
                'tipo_parametro' => $this->tipo_unidad,
                'data' => $aporteSocio,
            ]))->get() as $aporte) {
                $movimiento->crear(
                    $aporte['cuenta_contable'],
                    $aporte['monto']
                );
            }
        } else {
            $monto = (new Warp($aporteSocio))->sum('monto');
            if ($monto > 0) {
                $movimiento->crear(
                    Parametros::getCuentaContable([
                        'clave' => 'cta_liquid_aporte_socio',
                        'escenario' => null,
                        'tipo_parametro' => null,
                        'proceso' => null,
                    ]),
                    $monto
                );
            }
        }

        $aportePatrono = (new Warp($saldos))->get('debe.cta_liquid_aporte_patrono', []);
        if ($this->configuracionAuxiliar('cta_liquid_aporte_patrono')) {
            foreach ((new Group([
                'by' => 'cta_liquid_aporte_patrono',
                'column' => 'monto',
                'proceso' => 'unidad',
                'escenario' => $this->pago_liquidacion,
                'tipo_parametro' => $this->tipo_unidad,
                'data' => $aportePatrono,
            ]))->get() as $aporte) {
                $movimiento->crear(
                    $aporte['cuenta_contable'],
                    $aporte['monto']
                );
            }
        } else {
            $monto = (new Warp($aportePatrono))->sum('monto');
            if ($monto > 0) {
                $movimiento->crear(
                    Parametros::getCuentaContable([
                        'clave' => 'cta_liquid_aporte_patrono',
                        'escenario' => null,
                        'tipo_parametro' => null,
                        'proceso' => null,
                    ]),
                    $monto
                );
            }
        }

        $liquidacionAportevoluntarioSocio = (new Warp($saldos))->get('debe.cta_liquid_aporte_vol_socio', []);
        if ($this->configuracionAuxiliar('cta_liquid_aporte_vol_socio')) {
            foreach ((new Group([
                'by' => 'cta_liquid_aporte_vol_socio',
                'column' => 'monto',
                'proceso' => 'unidad',
                'escenario' => $this->pago_liquidacion,
                'tipo_parametro' => $this->tipo_unidad,
                'data' => $liquidacionAportevoluntarioSocio,
            ]))->get() as $aporte) {
                $movimiento->crear(
                    $aporte['cuenta_contable'],
                    $aporte['monto']
                );
            }
        } else {
            $monto = (new Warp($liquidacionAportevoluntarioSocio))->sum('monto');
            if ($monto > 0) {
                $movimiento->crear(
                    Parametros::getCuentaContable([
                        'clave' => 'cta_liquid_aporte_vol_socio',
                        'escenario' => null,
                        'tipo_parametro' => null,
                        'proceso' => null,
                    ]),
                    $monto
                );
            }
        }

        $liquidacionAporteVoluntarioPatrono = (new Warp($saldos))->get('debe.cta_liquid_aporte_vol_patrono', []);
        if ($this->configuracionAuxiliar('cta_liquid_aporte_vol_patrono')) {
            foreach ((new Group([
                'by' => 'cta_liquid_aporte_vol_patrono',
                'column' => 'monto',
                'proceso' => 'unidad',
                'escenario' => $this->pago_liquidacion,
                'tipo_parametro' => $this->tipo_unidad,
                'data' => $liquidacionAporteVoluntarioPatrono,
            ]))->get() as $aporte) {
                $movimiento->crear(
                    $aporte['cuenta_contable'],
                    $aporte['monto']
                );
            }
        } else {
            $monto = (new Warp($liquidacionAporteVoluntarioPatrono))->sum('monto');
            if ($monto > 0) {
                $movimiento->crear(
                    Parametros::getCuentaContable([
                        'clave' => 'cta_liquid_aporte_vol_patrono',
                        'escenario' => null,
                        'tipo_parametro' => null,
                        'proceso' => null,
                    ]),
                    $monto
                );
            }
        }

        $liquidacionRetiroParcial = (new Warp($saldos))->get('haber.cta_liquid_retiro_parcial', []);
        if ($this->configuracionAuxiliar('cta_liquid_retiro_parcial')) {
            foreach ((new Group([
                'by' => 'cta_liquid_retiro_parcial',
                'column' => 'monto',
                'proceso' => 'unidad',
                'escenario' => $this->pago_liquidacion,
                'tipo_parametro' => $this->tipo_unidad,
                'data' => $liquidacionRetiroParcial,
            ]))->get() as $aporte) {
                $movimiento->crear(
                    $aporte['cuenta_contable'],
                    0,
                    $aporte['monto']
                );
            }
        } else {
            $monto = (new Warp($liquidacionRetiroParcial))->sum('monto');
            if ($monto > 0) {
                $movimiento->crear(
                    Parametros::getCuentaContable([
                        'clave' => 'cta_liquid_retiro_parcial',
                        'escenario' => null,
                        'tipo_parametro' => null,
                        'proceso' => null,
                    ]),
                    0,
                    $monto
                );
            }
        }

        foreach ((new Group([
            'by' => 'cta_liquid_plazo_prestamo',
            'column' => 'monto',
            'proceso' => 'id_tipo_credito',
            'escenario' => $this->pago_liquidacion,
            'tipo_parametro' => $this->tipo_prestamo,
            'data' => (new Warp($saldos))->get('haber.cta_liquid_plazo_prestamo', []),
        ]))->get() as $aporte) {
            $movimiento->crear(
                $aporte['cuenta_contable'],
                0,
                $aporte['monto']
            );
        }

        foreach ((new Group([
            'by' => 'cta_liquid_x_cobrar_capital',
            'column' => 'monto',
            'proceso' => 'id_tipo_credito',
            'escenario' => $this->pago_liquidacion,
            'tipo_parametro' => $this->tipo_prestamo,
            'data' => (new Warp($saldos))->get('haber.cta_liquid_x_cobrar_capital', []),
        ]))->get() as $aporte) {
            $movimiento->crear(
                $aporte['cuenta_contable'],
                0,
                $aporte['monto']
            );
        }

        foreach ((new Group([
            'by' => 'cta_liquid_x_cobrar_interes',
            'column' => 'monto',
            'proceso' => 'id_tipo_credito',
            'escenario' => $this->pago_liquidacion,
            'tipo_parametro' => $this->tipo_prestamo,
            'data' => (new Warp($saldos))->get('haber.cta_liquid_x_cobrar_interes', []),
        ]))->get() as $aporte) {
            $movimiento->crear(
                $aporte['cuenta_contable'],
                0,
                $aporte['monto']
            );
        }

        foreach ((new Group([
            'by' => 'cta_liquid_ingreso_interes',
            'column' => 'monto',
            'proceso' => 'id_tipo_credito',
            'escenario' => $this->pago_liquidacion,
            'tipo_parametro' => $this->tipo_prestamo,
            'data' => (new Warp($saldos))->get('haber.cta_liquid_ingreso_interes', []),
        ]))->get() as $aporte) {
            $movimiento->crear(
                $aporte['cuenta_contable'],
                0,
                $aporte['monto']
            );
        }

        foreach ((new Group([
            'by' => 'cta_liquid_ingreso_diferido',
            'column' => 'monto',
            'proceso' => 'id_tipo_credito',
            'escenario' => $this->pago_liquidacion,
            'tipo_parametro' => $this->tipo_prestamo,
            'data' => (new Warp($saldos))->get('debe.cta_liquid_ingreso_diferido', []),
        ]))->get() as $aporte) {
            $movimiento->crear(
                $aporte['cuenta_contable'],
                $aporte['monto']
            );
        }

        $datos = $this->cuentaXCobrarYComisionAdministrativaWithUnidad();
        if ($this->configuracionAuxiliar('cta_liquid_com_administrativa')) {
            foreach ((new Group([
                'by' => 'cta_liquid_com_administrativa',
                'column' => 'comision_administrativa',
                'proceso' => 'unidad',
                'escenario' => $this->pago_liquidacion,
                'tipo_parametro' => $this->tipo_unidad,
                'data' => $datos,
            ]))->get() as $aporte) {
                $movimiento->crear(
                    $aporte['cuenta_contable'],
                    0,
                    $aporte['monto']
                );
            }
        } else {
            $movimiento->crear(
                Parametros::getCuentaContable([
                    'clave' => 'cta_liquid_com_administrativa',
                    'escenario' => null,
                    'tipo_parametro' => null,
                    'proceso' => null,
                ]),
                0,
                (new Warp($datos))->sum('comision_administrativa')
            );
        }

        $movimiento->crear(
            $this->nomina->bancoCuentaContable($this->nomina->id_param_banco),
            0,
            (new Warp($saldos))->get('haber.cta_liquid_com_bancaria', 0)
        );

        $movimiento->crear(
            $this->nomina->bancoCuentaContable($this->nomina->id_param_banco),
            0,
            (new Warp($saldos))->get('haber.cta_liquid_rebaja_banco', 0)
        );

        if ($this->configuracionAuxiliar('cta_liquid_cuenta_cobrar')) {
            foreach ((new Group([
                'by' => 'cta_liquid_cuenta_cobrar',
                'column' => 'cuenta_x_cobrar',
                'proceso' => 'unidad',
                'escenario' => $this->pago_liquidacion,
                'tipo_parametro' => $this->tipo_unidad,
                'data' => $datos,
            ]))->get() as $aporte) {
                $movimiento->crear(
                    $aporte['cuenta_contable'],
                    $aporte['monto']
                );
            }
        } else {
            $monto = (new Warp($datos))->sum('cuenta_x_cobrar');
            if ($monto > 0) {
                $movimiento->crear(
                    Parametros::getCuentaContable([
                        'clave' => 'cta_liquid_cuenta_cobrar',
                        'escenario' => null,
                        'tipo_parametro' => null,
                        'proceso' => null,
                    ]),
                    $monto
                );
            }
        }
    }

    private function saldos()
    {
        $debe = (new Warp([
            'cta_liquid_aporte_socio' => $this->aporteAsociado(),
            'cta_liquid_aporte_patrono' => $this->aportePatrono(),
            'cta_liquid_aporte_vol_socio' => $this->aporteVoluntarioSocio(),
            'cta_liquid_aporte_vol_patrono' => $this->aporteVoluntarioPatrono(),
            'cta_liquid_ingreso_diferido' => $this->datos('interes_afectado_prenomina.conceptos', 'cta_liquid_ingreso_diferido'),
            'cta_liquid_cuenta_cobrar' => $this->datos('totales.cuenta_x_cobrar'),
        ]))->flatten();

        $haber = (new Warp([
            'cta_liquid_retiro_parcial' => $this->retirosParciales(),
            'cta_liquid_plazo_prestamo' => $this->datos('capital_cartera_prestamos.conceptos', 'cta_liquid_plazo_prestamo'),
            'cta_liquid_x_cobrar_capital' => $this->datos('capital_afectado_prenomina.conceptos', 'cta_liquid_x_cobrar_capital'),
            'cta_liquid_x_cobrar_interes' => $this->datos('interes_afectado_prenomina.conceptos', 'cta_liquid_x_cobrar_interes'),
            'cta_liquid_ingreso_interes' => $this->datos('interes_afectado_prenomina.conceptos', 'cta_liquid_ingreso_interes'),
            'cta_liquid_com_administrativa' => $this->datos('totales.comision_administrativa'),
            'cta_liquid_com_bancaria' => $this->datos('totales.comision_bancaria'),
            'cta_liquid_rebaja_banco' => $this->datos('totales.total_a_depositar'),
        ]))->flatten();

        // $this->debug($debe, $haber);

        $this->validate($debe, $haber);

        return [
            'debe' => [
                'cta_liquid_aporte_socio' => $this->aporteAsociadoWithUnidad(),
                'cta_liquid_aporte_patrono' => $this->aportePatronoWithUnidad(),
                'cta_liquid_aporte_vol_socio' => $this->aporteVoluntarioSocioWithUnidad(),
                'cta_liquid_aporte_vol_patrono' => $this->aporteVoluntarioPatronoWithUnidad(),
                'cta_liquid_ingreso_diferido' => $this->datos('interes_afectado_prenomina.conceptos'),
                'cta_liquid_cuenta_cobrar' => $this->datos('totales.cuenta_x_cobrar'),
            ],
            'haber' => [
                'cta_liquid_retiro_parcial' => $this->retirosParcialesWithUnidad(),
                'cta_liquid_plazo_prestamo' => $this->datos('capital_cartera_prestamos.conceptos'),
                'cta_liquid_x_cobrar_capital' => $this->datos('capital_afectado_prenomina.conceptos'),
                'cta_liquid_x_cobrar_interes' => $this->datos('interes_afectado_prenomina.conceptos'),
                'cta_liquid_ingreso_interes' => $this->datos('interes_afectado_prenomina.conceptos'),
                'cta_liquid_com_administrativa' => $this->datos('totales.comision_administrativa'),
                'cta_liquid_com_bancaria' => $this->datos('totales.comision_bancaria'),
                'cta_liquid_rebaja_banco' => $this->datos('totales.total_a_depositar'),
            ],
        ];
    }

    private function comprobante()
    {
        $this->setProceso($this->nomina);

        $comprobante = new Comprobante('crea');
        $comprobante->fecha_comprobante = $this->fechaComprobante();
        $comprobante->descripcion = "Pago masivo liquidaciones {$this->nomina->descripcion}";
        $comprobante->status = 1;
        $comprobante->nro_documento = $this->nomina->num_comprobante;

        if (! $comprobante->save()) {
            throw new Exception('Error al generar comprobante contable.', $this->codigo_error);
        }

        return $comprobante;
    }

    protected function datos($path = null, $key = null)
    {
        $datos = (new Warp($this->datos))->get($path, 0);

        if ($key !== null) {
            return (new Warp($datos))->flatMap(function ($concepto) use ($key) {
                return [
                    "{$key}_{$concepto['id_tipo_credito']}" => $concepto['monto'],
                ];
            });
        }

        return $datos;
    }

    protected function aporteAsociado()
    {
        $aportes = (new Warp($this->datos('asignaciones.conceptos')))->groupBy('id_unidad');
        $deducciones = (new Warp($this->datos('retiro_deducciones.conceptos')))->groupBy('id_unidad');

        return (new Warp($aportes))->flatMap(function ($aporte) use ($deducciones) {
            $unidad = (new Warp($aporte))->get('0.id_unidad');

            $monto_aporte = (new Warp($aporte))->get('0.monto');
            $asignacion = (new Warp($aporte))->get('4.monto');
            $deduccion = (new Warp($deducciones[$unidad]))->get('0.monto');

            return [
                 "cta_liquid_aporte_socio_{$unidad}" => ($monto_aporte + $asignacion) - $deduccion
            ];
        });
    }

    protected function aporteAsociadoWithUnidad()
    {
        $aportes = (new Warp($this->datos('asignaciones.conceptos')))->groupBy('id_unidad');
        $deducciones = (new Warp($this->datos('retiro_deducciones.conceptos')))->groupBy('id_unidad');

        return (new Warp($aportes))->map(function ($aporte) use ($deducciones) {
            $unidad = (new Warp($aporte))->get('0.id_unidad');

            $monto_aporte = (new Warp($aporte))->get('0.monto');
            $asignacion = (new Warp($aporte))->get('4.monto');
            $deduccion = (new Warp($deducciones[$unidad]))->get('0.monto');

            return [
                'unidad' => $unidad,
                'monto' => ($monto_aporte + $asignacion) - $deduccion
            ];
        });
    }

    protected function aportePatrono()
    {
        $aportes = (new Warp($this->datos('asignaciones.conceptos')))->groupBy('id_unidad');
        $deducciones = (new Warp($this->datos('retiro_deducciones.conceptos')))->groupBy('id_unidad');

        return (new Warp($aportes))->flatMap(function ($aporte) use ($deducciones) {
            $unidad = (new Warp($aporte))->get('1.id_unidad');

            $monto_aporte = (new Warp($aporte))->get('1.monto');
            $asignacion = (new Warp($aporte))->get('5.monto');
            $deduccion = (new Warp($deducciones[$unidad]))->get('1.monto');

            return [
                 "cta_liquid_aporte_patrono_{$unidad}" => ($monto_aporte + $asignacion) - $deduccion
            ];
        });
    }

    protected function aportePatronoWithUnidad()
    {
        $aportes = (new Warp($this->datos('asignaciones.conceptos')))->groupBy('id_unidad');
        $deducciones = (new Warp($this->datos('retiro_deducciones.conceptos')))->groupBy('id_unidad');

        return (new Warp($aportes))->map(function ($aporte) use ($deducciones) {
            $unidad = (new Warp($aporte))->get('1.id_unidad');

            $monto_aporte = (new Warp($aporte))->get('1.monto');
            $asignacion = (new Warp($aporte))->get('5.monto');
            $deduccion = (new Warp($deducciones[$unidad]))->get('1.monto');

            return [
                'unidad' => $unidad,
                'monto' => ($monto_aporte + $asignacion) - $deduccion
            ];
        });
    }

    protected function aporteVoluntarioSocio()
    {
        $aportes = (new Warp($this->datos('asignaciones.conceptos')))->groupBy('id_unidad');

        return (new Warp($aportes))->flatMap(function ($aporte) {
            $unidad = (new Warp($aporte))->get('1.id_unidad');

            $a = (new Warp($aporte))->get('2.monto');
            $b = (new Warp($aporte))->get('6.monto');

            return [
                 "cta_liquid_aporte_vol_socio_{$unidad}" => $a + $b
            ];
        });
    }

    protected function aporteVoluntarioSocioWithUnidad()
    {
        $aportes = (new Warp($this->datos('asignaciones.conceptos')))->groupBy('id_unidad');

        return (new Warp($aportes))->map(function ($aporte) {
            $unidad = (new Warp($aporte))->get('1.id_unidad');

            $a = (new Warp($aporte))->get('2.monto');
            $b = (new Warp($aporte))->get('6.monto');

            return [
                'unidad' => $unidad,
                'monto' => $a + $b
            ];
        });
    }

    protected function aporteVoluntarioPatrono()
    {
        $aportes = (new Warp($this->datos('asignaciones.conceptos')))->groupBy('id_unidad');

        return (new Warp($aportes))->flatMap(function ($aporte) {
            $unidad = (new Warp($aporte))->get('1.id_unidad');

            return [
                 "cta_liquid_aporte_vol_patrono_{$unidad}" => (new Warp($aporte))->get('3.monto')
            ];
        });
    }

    protected function aporteVoluntarioPatronoWithUnidad()
    {
        $aportes = (new Warp($this->datos('asignaciones.conceptos')))->groupBy('id_unidad');

        return (new Warp($aportes))->map(function ($aporte) {
            $unidad = (new Warp($aporte))->get('1.id_unidad');

            return [
                'unidad' => $unidad,
                'monto' => (new Warp($aporte))->get('3.monto')
            ];
        });
    }

    protected function retirosParciales()
    {
        $deducciones = (new Warp($this->datos('retiro_deducciones.conceptos')))->groupBy('id_unidad');

        return (new Warp($deducciones))->flatMap(function ($deduccion) {
            $unidad = (new Warp($deduccion))->get('0.id_unidad');

            return [
                 "cta_liquid_retiro_parcial_{$unidad}" => (new Warp($deduccion))->get('2.monto')
            ];
        });
    }

    protected function retirosParcialesWithUnidad()
    {
        $deducciones = (new Warp($this->datos('retiro_deducciones.conceptos')))->groupBy('id_unidad');

        return (new Warp($deducciones))->map(function ($deduccion) {
            $unidad = (new Warp($deduccion))->get('0.id_unidad');

            return [
                'unidad' => $unidad,
                'monto' => (new Warp($deduccion))->get('2.monto')
            ];
        });
    }

    protected function asignaciones()
    {
        $asignaciones = Yii::app()->getDb()->createCommand("
            select fichas->>'type' as tipo,
                id_unidad,
                sum(cast(fichas->>'monto' as numeric)) as monto
            from (
                select a.idunidad as id_unidad, json_array_elements(l.ficha_liquidacion->'asignaciones'->'conceptos') as fichas
                from pagos.pagos_masivos_detalle pmd
                inner join retiro.liquidacion l on l.id=pmd.id_proceso
                inner join asociado a on a.idasociado=l.idasociado
                where pmd.id_pagos_masivos=:id
            ) d
            group by fichas->>'index', fichas->>'type', id_unidad
            order by id_unidad, fichas->>'index'
        ")->bindValue('id', $this->nomina->id)->queryAll();

        return ['conceptos' => $asignaciones];
    }

    protected function deducciones()
    {
        $deducciones = Yii::app()->getDb()->createCommand("
            select fichas->>'type' as tipo,
                id_unidad,
                sum(cast(fichas->>'monto' as numeric)) as monto
            from (
                select a.idunidad as id_unidad, json_array_elements(l.ficha_liquidacion->'retiro_deducciones'->'conceptos') as fichas
                from pagos.pagos_masivos_detalle pmd
                inner join retiro.liquidacion l on l.id=pmd.id_proceso
                inner join asociado a on a.idasociado=l.idasociado
                where pmd.id_pagos_masivos=:id
            ) d
            group by fichas->>'index', fichas->>'type', id_unidad
            order by id_unidad, fichas->>'index'
        ")->bindValue('id', $this->nomina->id)->queryAll();

        return ['conceptos' => $deducciones];
    }

    protected function capitalNoAfectado()
    {
        $capitalNoAfectado = Yii::app()->getDb()->createCommand("
            select fichas->>'id_tipo_credito' as id_tipo_credito
                  ,sum(cast(fichas->>'monto' as numeric)) as monto
            from (
                select json_array_elements(l.ficha_liquidacion->'capital_cartera_prestamos'->'conceptos') as fichas
                from pagos.pagos_masivos_detalle pmd
                inner join retiro.liquidacion l on l.id=pmd.id_proceso
                where pmd.id_pagos_masivos=:id
            ) d
            group by  fichas->>'id_tipo_credito'
        ")->bindValue('id', $this->nomina->id)->queryAll();

        return ['conceptos' => $capitalNoAfectado];
    }

    public function capitalAfectado()
    {
        $capitalAfectado = Yii::app()->getDb()->createCommand("
            select fichas->>'id_tipo_credito' as id_tipo_credito,
                   sum(cast(fichas->>'monto' as numeric)) as monto
            from (
                select json_array_elements(l.ficha_liquidacion->'capital_afectado_prenomina'->'conceptos') as fichas
                from pagos.pagos_masivos_detalle pmd
                inner join retiro.liquidacion l on l.id=pmd.id_proceso
                where pmd.id_pagos_masivos=:id
            ) d
            group by fichas->>'id_tipo_credito'
        ")->bindValue('id', $this->nomina->id)->queryAll();

        return ['conceptos' => $capitalAfectado];
    }
    
    protected function interesAfectado()
    {
        $interesAfectado = Yii::app()->getDb()->createCommand("
            select fichas->>'id_tipo_credito' as id_tipo_credito,
                   sum(cast(fichas->>'monto' as numeric)) as monto
            from (
                select json_array_elements(l.ficha_liquidacion->'interes_afectado_prenomina'->'conceptos') as fichas
                from pagos.pagos_masivos_detalle pmd
                inner join retiro.liquidacion l on l.id=pmd.id_proceso
                where pmd.id_pagos_masivos=:id
            ) d
            group by fichas->>'id_tipo_credito'
        ")->bindValue('id', $this->nomina->id)->queryAll();

        return ['conceptos' => $interesAfectado];
    }

    protected function totales()
    {
        return Yii::app()->getDb()->createCommand("
            select sum(cast(ficha->>'asignaciones' as numeric(20,2))) as asignaciones,
                sum(cast(ficha->>'deducciones' as numeric(20,2))) as deducciones,
                sum(cast(ficha->>'subtotal' as numeric(20,2))) as subtotal,
                sum(cast(ficha->>'comision_administrativa' as numeric(20,2))) as comision_administrativa,
                sum(cast(ficha->>'comision_bancaria' as numeric(20,2))) as comision_bancaria,
                sum(cast(ficha->>'total_a_depositar' as numeric(20,2))) as total_a_depositar,
                sum(cast(ficha->>'cuenta_x_cobrar' as numeric(20,2))) as cuenta_x_cobrar
            from (
                select l.ficha_liquidacion->'totales' as ficha
                from pagos.pagos_masivos_detalle pmd
                inner join retiro.liquidacion l on l.id=pmd.id_proceso
                where pmd.id_pagos_masivos=:id
            ) d
        ")->bindValue('id', $this->nomina->id)->queryRow();
    }

    protected function cuentaXCobrarYComisionAdministrativaWithUnidad()
    {
        return Yii::app()->getDb()->createCommand("
            select a.idunidad as unidad,
                sum(cast(l.ficha_liquidacion->'totales'->>'cuenta_x_cobrar' as numeric(20,2))) as cuenta_x_cobrar,
                sum(cast(l.ficha_liquidacion->'totales'->>'comision_administrativa' as numeric(20,2))) as comision_administrativa
            from pagos.pagos_masivos_detalle pmd
            inner join retiro.liquidacion l on l.id=pmd.id_proceso
            inner join asociado a on a.idasociado=l.idasociado
            where pmd.id_pagos_masivos=:id
            group by a.idunidad
        ")->bindValue('id', $this->nomina->id)->queryAll();
    }
}
