<?php

require '../conexao/conexao.php';


class PerformanceVendedores
{


    private $connection;

    public function __construct()
    {
        global  $connection; // Acesso às conexões globais

        $this->connection = $connection;
    }

    public function consultaManipulado($ano, $mes, $filial, $codvendedor)
    {
        $sql = "SELECT EXTRACT(YEAR FROM A1.aviada_dt) AS ano,
            A1.codigo_empresa_padrao AS cdcon, 
            iif(A1.STATUS_MOV = 0,A1.CADASTRO_CF,A1.AVIADA_CF) as CDFUNRE,
            FU.NOMEFUNCIONARIO as NOMEFUN,
            cast(coalesce(sum(A2.VALORFORMULA_VENDA_DESC),0) as numeric (18,2)) as VALOR_MANIPULADO,
            CAST(SUM(CASE WHEN EXTRACT(MONTH FROM A1.aviada_dt) = 1 THEN A2.VALORFORMULA_VENDA_DESC ELSE 0 END) AS DECIMAL(10,2)) AS valor_recebido_janeiro,
            CAST(SUM(CASE WHEN EXTRACT(MONTH FROM A1.aviada_dt) = 2 THEN A2.VALORFORMULA_VENDA_DESC ELSE 0 END) AS DECIMAL(10,2)) AS valor_recebido_fevereiro,
            CAST(SUM(CASE WHEN EXTRACT(MONTH FROM A1.aviada_dt) = 3 THEN A2.VALORFORMULA_VENDA_DESC ELSE 0 END) AS DECIMAL(10,2)) AS valor_recebido_marco,
            CAST(SUM(CASE WHEN EXTRACT(MONTH FROM A1.aviada_dt) = 4 THEN A2.VALORFORMULA_VENDA_DESC ELSE 0 END) AS DECIMAL(10,2)) AS valor_recebido_abril,
            CAST(SUM(CASE WHEN EXTRACT(MONTH FROM A1.aviada_dt) = 5 THEN A2.VALORFORMULA_VENDA_DESC ELSE 0 END) AS DECIMAL(10,2)) AS valor_recebido_maio,
            CAST(SUM(CASE WHEN EXTRACT(MONTH FROM A1.aviada_dt) = 6 THEN A2.VALORFORMULA_VENDA_DESC ELSE 0 END) AS DECIMAL(10,2)) AS valor_recebido_junho,
            CAST(SUM(CASE WHEN EXTRACT(MONTH FROM A1.aviada_dt) = 7 THEN A2.VALORFORMULA_VENDA_DESC ELSE 0 END) AS DECIMAL(10,2)) AS valor_recebido_julho,
            CAST(SUM(CASE WHEN EXTRACT(MONTH FROM A1.aviada_dt) = 8 THEN A2.VALORFORMULA_VENDA_DESC ELSE 0 END) AS DECIMAL(10,2)) AS valor_recebido_agosto,
            CAST(SUM(CASE WHEN EXTRACT(MONTH FROM A1.aviada_dt) = 9 THEN A2.VALORFORMULA_VENDA_DESC ELSE 0 END) AS DECIMAL(10,2)) AS valor_recebido_setembro,
            CAST(SUM(CASE WHEN EXTRACT(MONTH FROM A1.aviada_dt) = 10 THEN A2.VALORFORMULA_VENDA_DESC ELSE 0 END) AS DECIMAL(10,2)) AS valor_recebido_outubro,
            CAST(SUM(CASE WHEN EXTRACT(MONTH FROM A1.aviada_dt) = 11 THEN A2.VALORFORMULA_VENDA_DESC ELSE 0 END) AS DECIMAL(10,2)) AS valor_recebido_novembro,
            CAST(SUM(CASE WHEN EXTRACT(MONTH FROM A1.aviada_dt) = 12 THEN A2.VALORFORMULA_VENDA_DESC ELSE 0 END) AS DECIMAL(10,2)) AS valor_recebido_dezembro
            FROM ATENDIMENTO_A2 A2
            INNER JOIN ATENDIMENTO_A1 A1 ON A2.CODIGO_ATEND_A1 = A1.CODIGO
            INNER JOIN FORMAFARMACEUTICA FF ON A2.CODIGO_FORMAFARMACEUTICA = FF.CODIGO
            INNER JOIN FUNCIONARIO FU ON FU.CODIGO = iif(A1.STATUS_MOV = 0, A1.CADASTRO_CF, A1.AVIADA_CF)
            INNER JOIN EMPRESA EMP ON EMP.CODIGO = iif(A1.STATUS_MOV = 0, A1.CADASTRO_LJ, A1.AVIADA_LJ)
            WHERE A1.TIPO_ATENDIMENTO = 1
            AND A1.status_mov = '-1'
            AND A2.concluidoformula = '-1'
            AND A1.CANCELAMENTO_CF IS NULL
            AND A1.DESCARTE_CF IS NULL ";

        // Filtro por ano
        if ($ano && $ano != "Selecione") {
            $anoArray = array_map('intval', (array)$ano);
            $anoList = implode(',', $anoArray);
            $minAno = min($anoArray);
            $previousYear = $minAno - 1;
            if (!in_array($previousYear, $anoArray)) {
                $anoList .= ",$previousYear";
            }
            $sql .= " AND EXTRACT(YEAR FROM A1.aviada_dt) IN ($anoList)";
        }

        // Filtro por mês
        if ($mes && $mes != "Selecione") {
            $sql .= " AND EXTRACT(MONTH FROM A1.aviada_dt) = " . intval($mes);
        }

        // Filtro por filial
        if (!empty($filial) && $filial !== "Todos") {
            $filialList = (is_array($filial)) ? implode(",", $filial) : $filial;
            $sql .= " AND A1.codigo_empresa_padrao IN ($filialList)";
        }

        // Filtro por vendedor
        if ($codvendedor && $codvendedor != "Selecione") {
            $sql .= " AND iif(A1.STATUS_MOV = 0,A1.CADASTRO_CF,A1.AVIADA_CF) = " . intval($codvendedor);
        }

        // Filtro de tipo de operação
        $sql .= " AND A1.codigo_tipooperacao NOT IN (5, 159, 174, 184, 185, 186, 187, 188, 190, 216, 221, 234, 235, 236, 237, 242, 246, 261, 296, 297)
              GROUP BY ano, A1.codigo_empresa_padrao, NOMEFUN ,CDFUNRE";

        return ibase_query($this->connection, $sql);
    }

    public function consultaMarcaPropria($ano, $mes, $filial, $codvendedor)
    {
        $sql = "SELECT EXTRACT(YEAR FROM A1.entregue_dt) AS ano,
            A1.AVIADA_LJ as cdconre, 
            IIF(AG.AG1_OP = 1, A1.CODIGO_FUNCIONARIO_COMISSAO, A1.AVIADA_CF) as CDFUNRE,
            FU.NOMEFUNCIONARIO as NOMEFUN,
            cast(sum(a3.valorvenda_desc) as numeric (18,2)) AS VALOR_MARCA_PROPRIA,
            CAST(SUM(CASE WHEN EXTRACT(MONTH FROM A1.entregue_dt) = 1 THEN a3.valorvenda_desc ELSE 0 END) AS DECIMAL(10,2)) AS valor_recebido_janeiro,
            CAST(SUM(CASE WHEN EXTRACT(MONTH FROM A1.entregue_dt) = 2 THEN a3.valorvenda_desc ELSE 0 END) AS DECIMAL(10,2)) AS valor_recebido_fevereiro,
            CAST(SUM(CASE WHEN EXTRACT(MONTH FROM A1.entregue_dt) = 3 THEN a3.valorvenda_desc ELSE 0 END) AS DECIMAL(10,2)) AS valor_recebido_marco,
            CAST(SUM(CASE WHEN EXTRACT(MONTH FROM A1.entregue_dt) = 4 THEN a3.valorvenda_desc ELSE 0 END) AS DECIMAL(10,2)) AS valor_recebido_abril,
            CAST(SUM(CASE WHEN EXTRACT(MONTH FROM A1.entregue_dt) = 5 THEN a3.valorvenda_desc ELSE 0 END) AS DECIMAL(10,2)) AS valor_recebido_maio,
            CAST(SUM(CASE WHEN EXTRACT(MONTH FROM A1.entregue_dt) = 6 THEN a3.valorvenda_desc ELSE 0 END) AS DECIMAL(10,2)) AS valor_recebido_junho,
            CAST(SUM(CASE WHEN EXTRACT(MONTH FROM A1.entregue_dt) = 7 THEN a3.valorvenda_desc ELSE 0 END) AS DECIMAL(10,2)) AS valor_recebido_julho,
            CAST(SUM(CASE WHEN EXTRACT(MONTH FROM A1.entregue_dt) = 8 THEN a3.valorvenda_desc ELSE 0 END) AS DECIMAL(10,2)) AS valor_recebido_agosto,
            CAST(SUM(CASE WHEN EXTRACT(MONTH FROM A1.entregue_dt) = 9 THEN a3.valorvenda_desc ELSE 0 END) AS DECIMAL(10,2)) AS valor_recebido_setembro,
            CAST(SUM(CASE WHEN EXTRACT(MONTH FROM A1.entregue_dt) = 10 THEN a3.valorvenda_desc ELSE 0 END) AS DECIMAL(10,2)) AS valor_recebido_outubro,
            CAST(SUM(CASE WHEN EXTRACT(MONTH FROM A1.entregue_dt) = 11 THEN a3.valorvenda_desc ELSE 0 END) AS DECIMAL(10,2)) AS valor_recebido_novembro,
            CAST(SUM(CASE WHEN EXTRACT(MONTH FROM A1.entregue_dt) = 12 THEN a3.valorvenda_desc ELSE 0 END) AS DECIMAL(10,2)) AS valor_recebido_dezembro
        FROM atendimento_a3 a3
        INNER JOIN atendimento_a1 a1 ON a3.codigo_atend_a1 = a1.codigo
        LEFT JOIN UTIL_REL_AG1 (1) AG ON AG.AG1_OP > 0
        INNER JOIN estoque_geral eg ON a3.codigo_produto = eg.codigo
        INNER JOIN medico md ON md.codigo = a1.codigo_medico
        LEFT JOIN medico_cr cr ON cr.codigo = md.codigo_conselho_regional
        INNER JOIN FUNCIONARIO FU ON FU.CODIGO = IIF(AG.AG1_OP = 1, A1.CODIGO_FUNCIONARIO_COMISSAO, A1.AVIADA_CF)
        WHERE a1.tipo_atendimento = 2
        AND a3.excluirproduto_cf IS NULL
        AND a1.cancelamento_lj IS NULL
        AND A3.QUANTIDADE > 0
        AND A1.PAGAR_COMISSAO_FUNCIONARIO = '-1'
        AND A1.STATUS_MOV = '-1'";

        // Filtro por ano
        if ($ano && $ano != "Selecione") {
            $anoArray = array_map('intval', (array)$ano);
            $anoList = implode(',', $anoArray);
            $minAno = min($anoArray);
            $previousYear = $minAno - 1;
            if (!in_array($previousYear, $anoArray)) {
                $anoList .= ",$previousYear";
            }
            $sql .= " AND EXTRACT(YEAR FROM A1.entregue_dt) IN ($anoList)";
        }

        // Filtro por mês
        if ($mes && $mes != "Selecione") {
            $sql .= " AND EXTRACT(MONTH FROM A1.entregue_dt) = " . intval($mes);
        }

        // Filtro por filial
        if (!empty($filial) && $filial !== "Todos") {
            $filialList = (is_array($filial)) ? implode(",", $filial) : $filial;
            $sql .= " AND A1.AVIADA_LJ IN ($filialList)";
        }

        // Filtro por vendedor
        if ($codvendedor && $codvendedor != "Selecione") {
            $sql .= " AND IIF(AG.AG1_OP = 1, A1.CODIGO_FUNCIONARIO_COMISSAO, A1.AVIADA_CF) = " . intval($codvendedor);
        }


        // Filtro de tipo de operação
        $sql .= " AND A1.codigo_tipooperacao NOT IN (5, 159, 174, 184, 185, 186, 187, 188, 190, 216, 221, 234, 235, 236, 237, 242, 246, 261, 296, 297)
              GROUP BY ano, A1.AVIADA_LJ, NOMEFUN, CDFUNRE";

        return ibase_query($this->connection, $sql);
    }

    public function consultaRevenda($ano, $mes, $filial, $codvendedor)
    {
        $sql = "SELECT EXTRACT(YEAR FROM A1.entregue_dt) AS ano,
                   A1.AVIADA_LJ as cdconre,
                   IIF(AG.AG1_OP = 1, A1.CODIGO_FUNCIONARIO_COMISSAO, A1.AVIADA_CF) as CDFUNRE,
                   FU.NOMEFUNCIONARIO as NOMEFUN, 
                   cast(sum(a3.valorvenda_desc) as numeric (18,2)) AS VALOR_REVENDA,
                   CAST(SUM(CASE WHEN EXTRACT(MONTH FROM A1.entregue_dt) = 1 THEN a3.valorvenda_desc ELSE 0 END) AS DECIMAL(10,2)) AS valor_recebido_janeiro,
                   CAST(SUM(CASE WHEN EXTRACT(MONTH FROM A1.entregue_dt) = 2 THEN a3.valorvenda_desc ELSE 0 END) AS DECIMAL(10,2)) AS valor_recebido_fevereiro,
                   CAST(SUM(CASE WHEN EXTRACT(MONTH FROM A1.entregue_dt) = 3 THEN a3.valorvenda_desc ELSE 0 END) AS DECIMAL(10,2)) AS valor_recebido_marco,
                   CAST(SUM(CASE WHEN EXTRACT(MONTH FROM A1.entregue_dt) = 4 THEN a3.valorvenda_desc ELSE 0 END) AS DECIMAL(10,2)) AS valor_recebido_abril,
                   CAST(SUM(CASE WHEN EXTRACT(MONTH FROM A1.entregue_dt) = 5 THEN a3.valorvenda_desc ELSE 0 END) AS DECIMAL(10,2)) AS valor_recebido_maio,
                   CAST(SUM(CASE WHEN EXTRACT(MONTH FROM A1.entregue_dt) = 6 THEN a3.valorvenda_desc ELSE 0 END) AS DECIMAL(10,2)) AS valor_recebido_junho,
                   CAST(SUM(CASE WHEN EXTRACT(MONTH FROM A1.entregue_dt) = 7 THEN a3.valorvenda_desc ELSE 0 END) AS DECIMAL(10,2)) AS valor_recebido_julho,
                   CAST(SUM(CASE WHEN EXTRACT(MONTH FROM A1.entregue_dt) = 8 THEN a3.valorvenda_desc ELSE 0 END) AS DECIMAL(10,2)) AS valor_recebido_agosto,
                   CAST(SUM(CASE WHEN EXTRACT(MONTH FROM A1.entregue_dt) = 9 THEN a3.valorvenda_desc ELSE 0 END) AS DECIMAL(10,2)) AS valor_recebido_setembro,
                   CAST(SUM(CASE WHEN EXTRACT(MONTH FROM A1.entregue_dt) = 10 THEN a3.valorvenda_desc ELSE 0 END) AS DECIMAL(10,2)) AS valor_recebido_outubro,
                   CAST(SUM(CASE WHEN EXTRACT(MONTH FROM A1.entregue_dt) = 11 THEN a3.valorvenda_desc ELSE 0 END) AS DECIMAL(10,2)) AS valor_recebido_novembro,
                   CAST(SUM(CASE WHEN EXTRACT(MONTH FROM A1.entregue_dt) = 12 THEN a3.valorvenda_desc ELSE 0 END) AS DECIMAL(10,2)) AS valor_recebido_dezembro
            from atendimento_a3 a3
            inner join atendimento_a1 a1 on a3.codigo_atend_a1 = a1.codigo
            LEFT JOIN UTIL_REL_AG1 (1) AG ON AG.AG1_OP > 0
            inner join estoque_geral eg on a3.codigo_produto = eg.codigo
            inner join medico md on (md.codigo = a1.codigo_medico)
            left join medico_cr cr on (cr.codigo = md.codigo_conselho_regional)
            INNER JOIN FUNCIONARIO FU ON FU.CODIGO = IIF(AG.AG1_OP = 1, A1.CODIGO_FUNCIONARIO_COMISSAO, A1.AVIADA_CF)
            where a1.tipo_atendimento = 2
            and a3.excluirproduto_cf is null and a1.cancelamento_lj is null and A3.QUANTIDADE > 0
            AND A1.PAGAR_COMISSAO_FUNCIONARIO = '-1'
            AND A1.STATUS_MOV = '-1'";

        if ($ano && $ano != "Selecione") {
            // Convertendo os anos para inteiros e encontrando o menor ano
            $anoArray = array_map('intval', (array)$ano);
            $anoList = implode(',', $anoArray);
            $minAno = min($anoArray);

            // Adicionando o ano anterior ao menor ano
            $previousYear = $minAno - 1;
            if (!in_array($previousYear, $anoArray)) {
                $anoList .= ",$previousYear";
            }

            $sql .= " AND EXTRACT(YEAR FROM A1.entregue_dt) IN ($anoList)";
        }

        if ($mes && $mes != "Selecione") {
            $sql .= " AND EXTRACT(MONTH FROM A1.entregue_dt) = " . intval($mes);
        }

        // Verifica se $filial é um array antes de usar implode
        // Aplicação da condição no SQL, com verificação para a variável $filial
        if (!empty($filial) && $filial !== "Todos") {
            $filialList = (is_array($filial)) ? implode(",", $filial) : $filial; // Converte para string se for um array
            $sql .= " AND A1.AVIADA_LJ IN ($filialList)";
        }

        if ($codvendedor && $codvendedor != "Selecione") {
            $sql .= " AND IIF(AG.AG1_OP = 1, A1.CODIGO_FUNCIONARIO_COMISSAO, A1.AVIADA_CF) = " . intval($codvendedor);
        }

        // Finaliza a query SQL
        $sql .= " AND A1.PAGAR_COMISSAO_FUNCIONARIO = '-1'
       AND A1.STATUS_MOV = '-1'
       AND A1.codigo_tipooperacao NOT IN (5, 159, 174, 184, 185, 186, 187, 188, 190, 216, 221, 234, 235, 236, 237, 242, 246, 261, 296, 297)
       GROUP BY ano, A1.AVIADA_LJ, NOMEFUN ,CDFUNRE";

        // Debug: mostrar o SQL completo
        //echo $sql;

        return ibase_query($this->connection, $sql);
    }
}


// Função para adicionar valores ao array de totais
function adicionarValores(&$totais, $row, $tipo)
{
    $ano = $row['ANO'];

    // Inicializa o ano se não existir
    if (!isset($totais[$ano])) {
        $totais[$ano] = [
            'VALOR_MANIPULADO' => 0,
            'VALOR_MARCA_PROPRIA' => 0,
            'VALOR_REVENDA' => 0,
            'VALOR_TOTAL' => 0,
            'VALOR_RECEBIDO_JANEIRO' => 0,
            'VALOR_RECEBIDO_FEVEREIRO' => 0,
            'VALOR_RECEBIDO_MARCO' => 0,
            'VALOR_RECEBIDO_ABRIL' => 0,
            'VALOR_RECEBIDO_MAIO' => 0,
            'VALOR_RECEBIDO_JUNHO' => 0,
            'VALOR_RECEBIDO_JULHO' => 0,
            'VALOR_RECEBIDO_AGOSTO' => 0,
            'VALOR_RECEBIDO_SETEMBRO' => 0,
            'VALOR_RECEBIDO_OUTUBRO' => 0,
            'VALOR_RECEBIDO_NOVEMBRO' => 0,
            'VALOR_RECEBIDO_DEZEMBRO' => 0,
        ];
    }

    // Adiciona os valores conforme o tipo
    if ($tipo === 'manipulado') {
        $totais[$ano]['VALOR_MANIPULADO'] += $row['VALOR_MANIPULADO'];
    } elseif ($tipo === 'marca') {
        $totais[$ano]['VALOR_MARCA_PROPRIA'] += $row['VALOR_MARCA_PROPRIA'];
    } elseif ($tipo === 'revenda') {
        $totais[$ano]['VALOR_REVENDA'] += $row['VALOR_REVENDA'];
    }

    // Soma os valores recebidos por mês ao total
    $meses = [
        'JANUARIO' => 'VALOR_RECEBIDO_JANEIRO',
        'FEVEREIRO' => 'VALOR_RECEBIDO_FEVEREIRO',
        'MARCO' => 'VALOR_RECEBIDO_MARCO',
        'ABRIL' => 'VALOR_RECEBIDO_ABRIL',
        'MAIO' => 'VALOR_RECEBIDO_MAIO',
        'JUNHO' => 'VALOR_RECEBIDO_JUNHO',
        'JULHO' => 'VALOR_RECEBIDO_JULHO',
        'AGOSTO' => 'VALOR_RECEBIDO_AGOSTO',
        'SETEMBRO' => 'VALOR_RECEBIDO_SETEMBRO',
        'OUTUBRO' => 'VALOR_RECEBIDO_OUTUBRO',
        'NOVEMBRO' => 'VALOR_RECEBIDO_NOVEMBRO',
        'DEZEMBRO' => 'VALOR_RECEBIDO_DEZEMBRO',
    ];

    foreach ($meses as $mes => $key) {
        if (isset($row[$key])) {
            $totais[$ano][$key] += $row[$key];
        }
    }

    // Atualiza o valor total consolidado
    $totais[$ano]['VALOR_TOTAL'] = $totais[$ano]['VALOR_MANIPULADO'] + $totais[$ano]['VALOR_MARCA_PROPRIA'] + $totais[$ano]['VALOR_REVENDA'];
}
