<?php

class Masivo extends Utilidades
{
    protected $nomina;
    protected $escenario = 8;
    protected $titulo_proceso = 10;

    public function __construct($nomina)
    {
        $this->nomina = $nomina;
        Yii::import('application.modules.contable.models.*', true);
        Yii::import('application.modules.contable.models.comprobantes.*', true);
    }

    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);
    }

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

        $monto_aporte = $this->getMontos();

        foreach ($this->montoRebajaOrdenProveedor() as $proveedor) {
            if (is_null($proveedor['id_cuenta'])) {
                throw new Exception("El proveedor <strong>{$proveedor['razon_social']}</strong> no tiene cuenta auxiliar definida.");
            }

            $movimiento->crear(
                $proveedor['id_cuenta'],
                $monto_aporte["cta_rebaja_orden_proveedor_{$proveedor['id']}"]
            );
        }

        if (array_key_exists('cta_rebaja_orden_asociado', $monto_aporte)) {
            $movimiento->crear(
                Parametros::getCuentaContable([
                    'clave' => 'cta_rebaja_orden_asociado',
                    'escenario' => null,
                    'tipo_parametro' => null,
                    'proceso' => null
                ]),
                $monto_aporte['cta_rebaja_orden_asociado']
            );
        }

        $movimiento->crear(
            $this->nomina->bancoCuentaContable($this->nomina->id_param_banco),
            0,
            $monto_aporte['cta_rebaja_orden_banco']
        );
    }

    protected function getMontos()
    {
        $debe = $this->array_flatten([
            'cta_rebaja_orden_proveedor' => $this->getMontoRebajaOrdenProveedor(),
            'cta_rebaja_orden_asociado'  => $this->montoRebajaOrdenAsociado(),
        ]);
        $haber = [
            'cta_rebaja_orden_banco' => $this->nomina->total_pago
        ];

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

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

        return array_merge([], $debe, $haber);
    }

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

        $comprobante = new Comprobante('crea');
        $comprobante->fecha_comprobante = $this->fechaComprobante();
        $comprobante->descripcion = "Pago masivo órden de pago {$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 getMontoRebajaOrdenProveedor()
    {
        $monto = [];
        foreach ($this->montoRebajaOrdenProveedor() as $proveedor) {
            $monto["cta_rebaja_orden_proveedor_{$proveedor['id']}"] = $proveedor['monto'];
        }

        return $monto;
    }

    protected function getMontoRebajaOrdenAsociado()
    {
        $monto = [];
        foreach ($this->montoRebajaOrdenAsociado() as $asociado) {
            $monto["cta_rebaja_orden_asociado_{$asociado['id']}"] = $asociado['monto'];
        }

        return $monto;
    }

    private function montoRebajaOrdenProveedor()
    {
        return Yii::app()->getDb()->createCommand('
            SELECT op.idproveedor as id, op.id_tipo_orden, p.id_cuenta, p.razon_social, sum(op.monto_pago) as monto
            FROM pagos.pagos_masivos_detalle pmd
            INNER JOIN pagos.orden_pago op ON pmd.id_proceso=op.id and op.id_tipo_orden=1
            inner join pagos.orden_pago_seguimiento ops on ops.id_orden_pago=op.id
                and ops.id_estatus_orden_pago=2
            inner join proveedor p on p.id=op.idproveedor
            WHERE pmd.id_pagos_masivos=:id
              AND pmd.id_estatus_detalle=2
              AND pmd.blnborrado is false
            group by idproveedor, id_tipo_orden, id_cuenta, p.razon_social;
        ')->bindValues([
            'id' => $this->nomina->id
        ])->queryAll();
    }

    private function montoRebajaOrdenAsociado()
    {
        return Yii::app()->getDb()->createCommand('
            SELECT sum(op.monto_pago) as monto
            FROM pagos.pagos_masivos_detalle pmd
            INNER JOIN pagos.orden_pago op ON pmd.id_proceso=op.id and op.id_tipo_orden=2
            inner join pagos.orden_pago_seguimiento ops on ops.id_orden_pago=op.id
                and ops.id_estatus_orden_pago=2
            WHERE pmd.id_pagos_masivos=:id
                AND pmd.id_estatus_detalle=2
                AND pmd.blnborrado is false;
        ')->bindValues([
            'id' => $this->nomina->id
        ])->queryRow()['monto'];
    }
}
