<?php
function Cargar_mensaje_titulo_descripcion($titulo, $descripcion, $color='warning', $icono='envelope-open')
{
    PCO_Mensaje($titulo, $descripcion, '', "fa fa-$icono fa-3x", "alert alert-$color alert-dismissible $PCO_ErrorEstilo");
}

function consultarConfig()
{
    return PCO_EjecutarSQL("SELECT dia_mes_sin_recargo, dias_despues_recargo, (porcentaje_valor_recargo/100) as porcentaje_valor_recargo FROM app_config WHERE id = 1 ")->fetch();
}

function redondearPesoColombiano($number) { return ceil($number / 50) * 50; }


function calcularSaldoPendienteFactura($factAnt) //Lo que se devuelve aca se debe sumar a la fecha sin recargo el proximo mes
{
    //No tiene factura anterior
    if(!$factAnt)
        return 0;

    $valor_pagado = $factAnt["valor_pagado"];
    $valor_sin_recargo = $factAnt["valor_sin_recargo"];
    $valor_con_recargo = $factAnt["valor_con_recargo"];
    if(is_nan($factAnt["saldo_pendiente"]))
        $factAnt["saldo_pendiente"] = 0;

    if(is_nan($factAnt["valor_pagado"]))
        $valor_pagado = 0;

    /*if($valor_pagado == 0 || !$valor_pagado)
        return $factAnt["saldo_pendiente"] + $factAnt["valor_con_recargo"] - $valor_pagado;*/

    //$fecha_sin_recargo  = strtotime($factAnt["fecha_sin_recargo"]);
    $fecha_con_recargo  = strtotime($factAnt["fecha_con_recargo"]);
    $fecha_pago         = strtotime($factAnt["fecha_pago"]);

    if($fecha_pago < $fecha_con_recargo && $valor_pagado >= $valor_sin_recargo) {
        return $factAnt["saldo_pendiente"] + $valor_sin_recargo - $valor_pagado;
    }
    else { //pago con valor recargo
        /*if($valor_pagado >= $factAnt["valor_con_recargo"]) //pago a tiempo
            return $valor_pagado - ($factAnt["valor_con_recargo"] + $factAnt["saldo_pendiente"]);
        else*/
            return $factAnt["saldo_pendiente"] + $valor_con_recargo - $valor_pagado;
    }
}

function dateDiffBetween2Dates($date1, $date2)
{
    $datetime1 = new DateTime($date1);
    $datetime2 = new DateTime($date2);
    $interval = $datetime1->diff($datetime2);
    //echo $interval->format('%R%a days');
    return $interval->format('%a');
}


/*function. calcularSaldoPendienteALaFecha($idContrato) //Lo que se devuelve aca se debe sumar a la fecha sin recargo el proximo mes
{
    //No tiene factura anterior
    if(!$idContrato) 
        return 0;
    $config = consultarConfig();

    $facturas = PCO_EjecutarSQL("SELECT * FROM app_facturas WHERE id_contrato = '$idContrato' AND estado = 0 ")->fetchAll();

    $saldo_pendiente = 0;
    foreach ($facturas as $factura) {

        $valor_pagado = $factura["valor_pagado"];
        $valorTotalPagarSinRecargo = $factura["valor_sin_recargo"];
        $valorTotalPagarConRecargo = $factura["valor_con_recargo"];

        $fecha_sin_recargo  = strtotime($factura["fecha_sin_recargo"]);
        $fecha_con_recargo  = strtotime($factura["fecha_con_recargo"]);
        $fecha_pago         = strtotime($factura["fecha_pago"]);

        if($fecha_pago < $fecha_con_recargo) {
            if($valor_pagado == $valorTotalPagarSinRecargo) {//pago a tiempo
            }
            else
                $saldo_pendiente .= redondearPesoColombiano(($valorTotalPagarSinRecargo - $valor_pagado) * (1 + $config['porcentaje_valor_recargo']));
        }
        else { //pago con valor recargo
            if($valor_pagado == $valorTotalPagarConRecargo) {//pago a tiempo
            }
            else
                $saldo_pendiente .= redondearPesoColombiano($valorTotalPagarConRecargo - $valor_pagado);// * (1 + $config['porcentaje_valor_recargo']));
        }
    }

    return $saldo_pendiente;
}*/

if($PCO_Accion == "FACTURAS_ImprimirFacturaWeb") {
    //include 'crear_pdf_factura.php';
    /*$factura = PCO_EjecutarSQL("SELECT z.nombre as zona, f.*, cl.nombres, cl.apellidos, cl.telefono, cl.celular, cl.correo, cl.direccion, cl.tipo_documento, cl.numero_documento, co.estrato, co.numero_medidor 
        FROM app_facturas f, app_contratos co, app_clientes cl, app_zona_cobertura z 
        WHERE cl.id = f.id_cliente AND co.id = f.id_contrato AND co.id_zona_cobertura = z.id AND f.id = '$PCO_Valor' ")->fetch();*/
    $factura = PCO_EjecutarSQL("SELECT z.nombre as zona, z.numero_cuenta_acueducto, z.imagen_qr, f.*, cl.nombres, cl.apellidos, cl.telefono, cl.celular, cl.correo, cl.direccion, cl.tipo_documento, cl.numero_documento, cl.estrato, t.tarifa_dinamica, co.numero_medidor
        FROM app_facturas f, app_clientes cl, app_zona_cobertura z, app_contratos co, app_tarifas t 
        WHERE f.id_contrato = co.id AND cl.id = f.id_cliente AND co.id_zona_cobertura = z.id AND t.id = co.id_tarifa AND f.id = '$PCO_Valor'
    ")->fetch();
    //include 'pdf_factura_descargar.php';
    if ($factura['tarifa_dinamica'] == 0)
        include 'pdf_factura_descargar.php';
    else
        include 'pdf_factura_descargar_tarifa_dinamica.php';
}

if($PCO_Accion == "FACTURAS_FacturarConsumoMes") {

    $config = consultarConfig();

    $mes = date("m");
    $year = date("Y");
    $existeMes = PCO_EjecutarSQL("SELECT COUNT(id) FROM app_facturacion_mes WHERE mes = '$mes' AND year = '$year' ")->fetchColumn();

    if($existeMes == 0) {
        $contratos = PCO_EjecutarSQL("
            SELECT co.id, co.id_cliente, t.nombre as tarifa_aplicada, '' cargo_fijo, t.tarifa_dinamica, t.porcentaje_subsidios, t.subsidio_m3, t.valor_metro_cubico, co.lectura_inicial_contador, (costo * (1 + " . $config['porcentaje_valor_recargo'] . ")) as valor_con_recargo, t.costo as valor_sin_recargo, '$year-$mes-" . $config["dia_mes_sin_recargo"] ."' AS fecha_sin_recargo
                FROM app_tarifas t, app_contratos co
                WHERE co.id_tarifa = t.id AND t.tarifa_dinamica = 0 AND co.activo = 1
            UNION
            SELECT co.id, co.id_cliente, t.nombre as tarifa_aplicada, t.costo cargo_fijo, t.tarifa_dinamica, t.porcentaje_subsidios, t.subsidio_m3, t.valor_metro_cubico, co.lectura_inicial_contador, '' valor_con_recargo, t.costo as valor_sin_recargo, '$year-$mes-" . $config["dia_mes_sin_recargo"] ."' AS fecha_sin_recargo
                FROM app_tarifas t, app_contratos co
                WHERE co.id_tarifa = t.id AND t.tarifa_dinamica = 1 AND co.activo = 1
        ")->fetchAll();
        /*$contratos = PCO_EjecutarSQL("
            SELECT co.id, co.id_cliente, t.nombre tarifa_aplicada, t.costo cargo_fijo, t.tarifa_dinamica, t.porcentaje_subsidios, t.subsidio_m3, t.valor_metro_cubico, co.lectura_inicial_contador, '' valor_con_recargo, t.costo as valor_sin_recargo, '$year-$mes-" . $config["dia_mes_sin_recargo"] ."' AS fecha_sin_recargo
                FROM app_tarifas t, app_contratos co
                WHERE co.id_tarifa = t.id AND co.activo = 1 AND t.tarifa_dinamica = 1 ORDER BY co.id
        ")->fetchAll();*/


        /*$mes_anterior = date('m', strtotime('-1 month'));
        $year_mes_anterior = date('Y', strtotime('-1 month'));*/
        $yearMes = date("Y-m", strtotime("-1 month"));

        $i=0;
        foreach($contratos as $contrato) {
//$i++;
            $fecha_con_recargo = date("Y-m-d", strtotime($contrato["fecha_sin_recargo"] . "+ " . $config["dias_despues_recargo"] . " days"));

            //$factura['fecha_inicio_facturacion'] = $fecha_inicio_facturacion;
            $factura_anterior = PCO_EjecutarSQL("
                SELECT valor_pagado, fecha_pago, valor_sin_recargo, valor_con_recargo, fecha_sin_recargo, fecha_con_recargo, saldo_pendiente
                    FROM app_facturas
                    WHERE id_contrato = '" . $contrato["id"] . "' ORDER BY id DESC LIMIT 1")->fetch();

            $saldo_pendiente = calcularSaldoPendienteFactura($factura_anterior);
            if($contrato["tarifa_dinamica"] == 0) {
                $fecha_inicio_facturacion = $yearMes . '-01';

                PCO_EjecutarSQLUnaria("
                    INSERT INTO app_facturas (id_cliente, id_contrato, fecha_sin_recargo, fecha_con_recargo, valor_sin_recargo, valor_con_recargo, saldo_pendiente, tarifa_aplicada, fecha_inicio_facturacion, fecha) 
                    VALUES (?,?,?,?,?,?,?,?,?,?)", 
                    $contrato['id_cliente'] . "$_SeparadorCampos_" . $contrato["id"] . "$_SeparadorCampos_" . $contrato["fecha_sin_recargo"] . "$_SeparadorCampos_$fecha_con_recargo$_SeparadorCampos_" . $contrato["valor_sin_recargo"] . "$_SeparadorCampos_" . $contrato["valor_con_recargo"] . "$_SeparadorCampos_$saldo_pendiente$_SeparadorCampos_" . $contrato["tarifa_aplicada"] . "$_SeparadorCampos_$fecha_inicio_facturacion$_SeparadorCampos_$PCO_FechaOperacionGuiones"
                );
            } else { //Tarifa dinamica
                $medidor = PCO_EjecutarSQL("
                    SELECT cm.lectura_actual, cm.fecha_lectura, cm.estado_medidor, cm.determinacion_consumo
                        FROM app_contratos co, app_consumo_medidor cm
                        WHERE co.id = cm.id_contrato AND co.id = " . $contrato["id"] . " ORDER BY cm.id DESC LIMIT 2
                ")->fetchAll();
                $determinacion_consumo = $medidor[0]['determinacion_consumo']; // app_consumo_medidor
                $fecha_fin_facturacion = $medidor[0]["fecha_lectura"];
                $estado_medidor = $medidor[0]['estado_medidor']; // app_consumo_medidor
                $lectura_actual = $medidor[0]['lectura_actual']; // app_consumo_medidor
                $lectura_anterior_medidor = $medidor[1]['lectura_actual']; // app_consumo_medidor
                $lectura_anterior = $lectura_anterior_medidor ? $lectura_anterior_medidor : $contrato['lectura_inicial_contador']; //factura anterior

                $consumo_actual = $lectura_actual - $lectura_anterior; //diferencia entre lectura actual - lectura anterior
                $fecha_inicio_facturacion = $medidor[1]['fecha_lectura'] ? $medidor[1]['fecha_lectura'] : date("Y-m-d", strtotime($medidor[0]["fecha_lectura"] . "-1 month"));

                $dias_facturados = dateDiffBetween2Dates($fecha_fin_facturacion, $fecha_inicio_facturacion); // resta lectura anterior
                
                $cantidadM3ConsumidosSubsidio = $consumo_actual >= $contrato['subsidio_m3'] ? $contrato['subsidio_m3'] : 0;
                
                $valor_subsidio = round($cantidadM3ConsumidosSubsidio * $contrato['valor_metro_cubico'] * $contrato['porcentaje_subsidios']/100, 2);

                $valor_sin_recargo = $consumo_actual * $contrato['valor_metro_cubico'] - $valor_subsidio + $contrato['cargo_fijo'];

                $valor_con_recargo = $valor_sin_recargo * (1 + $config["porcentaje_valor_recargo"]);

                //echo "INSERT INTO app_facturas (id_cliente, id_contrato, fecha_sin_recargo, fecha_con_recargo, valor_sin_recargo, valor_con_recargo, saldo_pendiente, tarifa_aplicada, fecha_inicio_facturacion, fecha_fin_facturacion, fecha, valor_subsidio, determinacion_consumo, lectura_actual, lectura_anterior, estado_medidor, consumo_actual, dias_facturados)<BR>";
                //echo $contrato['id_cliente'] . "$_SeparadorCampos_" . $contrato["id"] . "$_SeparadorCampos_" . $contrato["fecha_sin_recargo"] . "$_SeparadorCampos_$fecha_con_recargo$_SeparadorCampos_$valor_sin_recargo$_SeparadorCampos_$valor_con_recargo$_SeparadorCampos_$saldo_pendiente$_SeparadorCampos_" . $contrato["tarifa_aplicada"] . "$_SeparadorCampos_$fecha_inicio_facturacion$_SeparadorCampos_$fecha_fin_facturacion$_SeparadorCampos_$PCO_FechaOperacionGuiones$_SeparadorCampos_$valor_subsidio$_SeparadorCampos_$determinacion_consumo$_SeparadorCampos_$lectura_actual$_SeparadorCampos_$lectura_anterior$_SeparadorCampos_$estado_medidor$_SeparadorCampos_$consumo_actual$_SeparadorCampos_$dias_facturados<BR>";

                PCO_EjecutarSQLUnaria("
                    INSERT INTO app_facturas (id_cliente, id_contrato, fecha_sin_recargo, fecha_con_recargo, valor_sin_recargo, valor_con_recargo, saldo_pendiente, tarifa_aplicada, fecha_inicio_facturacion, fecha_fin_facturacion, fecha, valor_subsidio, determinacion_consumo, lectura_actual, lectura_anterior, estado_medidor, consumo_actual, dias_facturados)
                    VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)",
                    $contrato['id_cliente'] . "$_SeparadorCampos_" . $contrato["id"] . "$_SeparadorCampos_" . $contrato["fecha_sin_recargo"] . "$_SeparadorCampos_$fecha_con_recargo$_SeparadorCampos_$valor_sin_recargo$_SeparadorCampos_$valor_con_recargo$_SeparadorCampos_$saldo_pendiente$_SeparadorCampos_" . $contrato["tarifa_aplicada"] . "$_SeparadorCampos_$fecha_inicio_facturacion$_SeparadorCampos_$fecha_fin_facturacion$_SeparadorCampos_$PCO_FechaOperacionGuiones$_SeparadorCampos_$valor_subsidio$_SeparadorCampos_$determinacion_consumo$_SeparadorCampos_$lectura_actual$_SeparadorCampos_$lectura_anterior$_SeparadorCampos_$estado_medidor$_SeparadorCampos_$consumo_actual$_SeparadorCampos_$dias_facturados$_SeparadorCampos_"
                );
            }
        }
        PCO_EjecutarSQLUnaria("INSERT INTO app_facturacion_mes (mes, year) VALUES (?,?)", "$mes$_SeparadorCampos_$year");
        $titulo = '¡Facturación creada exitosamente!';
        $descripcion = 'Se ha generado la facturación del mes actual.';
        $color = 'success';
        $icono = 'check-square-o';
    }
    else {
        $titulo = 'Facturación';
        $descripcion = 'La facturación del mes actual ya ha sido generada!';
        $color = 'danger';
        $icono = 'fa fa-close';
    }
    Cargar_mensaje_titulo_descripcion($titulo, $descripcion, $color, $icono);
    PCO_CargarFormulario(7);
}

if($PCO_Accion == "FACTURAS_consultarFacturasMes") {

    $condiciones = "";
    
    if($zona)
        $condiciones = " AND c.id_zona_cobertura = $zona ";
    
    if($tipo_facturacion) {
        $cond = "=";
        if($tipo_facturacion != 1)
            $cond = "!=";
        $condiciones .= " AND f.determinacion_consumo $cond 1 ";
    }
        
    $result = PCO_EjecutarSQL("SELECT mes, year FROM app_facturacion_mes WHERE id = '$idMes' ")->fetch();

    echo json_encode(PCO_EjecutarSQL("SELECT f.id FROM app_facturas f, app_clientes c WHERE f.id_cliente = c.id AND YEAR(f.fecha) = '" . $result["year"] . "' AND MONTH(f.fecha) = '" . $result["mes"] . "' $condiciones ")->fetchAll());
    die();
}

if($PCO_Accion == "FACTURAS_descargarFactura") {
    $factura = PCO_EjecutarSQL("SELECT z.nombre as zona, z.numero_cuenta_acueducto, z.imagen_qr, f.*, cl.nombres, cl.apellidos, cl.telefono, cl.celular, cl.correo, cl.direccion, cl.tipo_documento, cl.numero_documento, cl.estrato, t.tarifa_dinamica, co.numero_medidor
        FROM app_facturas f, app_clientes cl, app_zona_cobertura z, app_contratos co, app_tarifas t 
        WHERE f.id_contrato = co.id AND cl.id = f.id_cliente AND co.id_zona_cobertura = z.id AND t.id = co.id_tarifa AND f.id = '$id_registro_datos'
    ")->fetch();
    //$factura['saldo_pendiente'] = calcularSaldoPendienteALaFecha($factura['id_contrato']);
    $PCO_Valor = $id_registro_datos;
    if ($factura['tarifa_dinamica'] == 0)
        include 'pdf_factura_descargar.php';
    else
        include 'pdf_factura_descargar_tarifa_dinamica.php';
}

/*if($PCO_Accion == "FACTURAS_sleep") {
    sleep(1);
    echo "Hola";
    die();
}*/

if($PCO_Accion == "FACTURAS_consultarInformacionFacturaPorCliente") {

    $config = consultarConfig();

        $yearMes = PCO_EjecutarSQL("SELECT CONCAT(year,'-',mes) FROM app_facturacion_mes WHERE id = '$idFactMes' ")->fetchColumn();
        $date = new DateTime("$yearMes-01");
        $date->modify('-1 month');
        $fecha_inicio_facturacion = date("Y-m-d", strtotime("-1 month"));

    $factura_anterior = PCO_EjecutarSQL("
        SELECT valor_pagado, fecha_pago, valor_sin_recargo, valor_con_recargo, fecha_sin_recargo, fecha_con_recargo, saldo_pendiente
            FROM app_facturas
            WHERE id_contrato = '$idContrato' ORDER BY id DESC LIMIT 1")->fetch();

    $factura = PCO_EjecutarSQL("
        SELECT t.nombre as tarifa_aplicada, t.costo as valor_sin_recargo, '$yearMes-" . $config["dia_mes_sin_recargo"] ."' AS fecha_sin_recargo 
            FROM app_contratos co, app_tarifas t 
            WHERE t.id = co.id_tarifa AND co.id = '$idContrato' ")->fetch();

    $fecha_con_recargo = date("Y-m-d", strtotime($factura["fecha_sin_recargo"] . "+ " . $config["dias_despues_recargo"] . " days"));
    $factura['fecha_con_recargo'] = $fecha_con_recargo;
    $factura['valor_con_recargo'] = redondearPesoColombiano($factura["valor_sin_recargo"] * (1 + $config['porcentaje_valor_recargo']));
    $factura['fecha_inicio_facturacion'] = $fecha_inicio_facturacion;
    $factura['saldo_pendiente'] = calcularSaldoPendienteFactura($factura_anterior, 0);
    echo json_encode($factura);
    die();
}

if($PCO_Accion == "FACTURAS_crearFacturaCliente") {

    /*$fechaSeleccionada = PCO_EjecutarSQL("SELECT CONCAT(year, '-', mes, '-01') FROM app_facturacion_mes WHERE id = '$mes_factura' ")->fetchColumn();
    $date = new DateTime($fechaSeleccionada);
    $date->modify('-1 month');
    $yearMes = date("Y-m", strtotime("-1 month"));
    $fecha_inicio_facturacion = $yearMes . '-01';*/
        $yearMes = PCO_EjecutarSQL("SELECT CONCAT(year,'-',mes) FROM app_facturacion_mes WHERE id = '$idFactMes' ")->fetchColumn();
        $date = new DateTime("$yearMes-01");
        $date->modify('-1 month');
        $fecha_inicio_facturacion = date("Y-m-d", strtotime("-1 month"));

    $existeFacturaMes = PCO_EjecutarSQL("SELECT COUNT(id) FROM app_facturas 
                                            WHERE id_contrato = '$id_contrato' AND MONTH(fecha_inicio_facturacion) = MONTH('$fecha_inicio_facturacion') ")->fetchColumn();

    if($existeFacturaMes == 0) {
        PCO_EjecutarSQLUnaria("INSERT INTO app_facturas (id_cliente, id_contrato, fecha_sin_recargo, fecha_con_recargo, valor_sin_recargo, valor_con_recargo, saldo_pendiente, tarifa_aplicada, fecha_inicio_facturacion) VALUES (?,?,?,?,?,?,?,?,?)", "$id_cliente$_SeparadorCampos_$id_contrato$_SeparadorCampos_$fecha_sin_recargo$_SeparadorCampos_$fecha_con_recargo$_SeparadorCampos_$valor_sin_recargo$_SeparadorCampos_$valor_con_recargo$_SeparadorCampos_$saldo_pendiente$_SeparadorCampos_$tarifa_aplicada$_SeparadorCampos_$fecha_inicio_facturacion" );
        $titulo = 'Factura';
        $descripcion = 'Se ha creado la factura exitosamente';
        $color = 'success';
        $icono = 'fa fa-close';
    } else {
        $titulo = 'Factura';
        $descripcion = 'Ya se ha generado una factura para ese contrato, en ese mes seleccionado';
        $color = 'danger';
        $icono = 'fa fa-close';
    }
    Cargar_mensaje_titulo_descripcion($titulo, $descripcion, $color, $icono);
    PCO_CargarFormulario(5);
}

if($PCO_Accion == "FACTURAS_consultarMesesFacturacion") {

    echo json_encode(PCO_EjecutarSQL("SELECT id, mes, year FROM app_facturacion_mes WHERE 1 ORDER BY id DESC LIMIT 12 ")->fetchAll());
    die();
}