<?php
include_once 'bd_config_interno.php';

function getCodConta() {
    include 'conecta.inc.php';
    
    $select = "SELECT codcon FROM contas WHERE conta = 'VendasOS'";

    $qry = ibase_query($con, $select); //cria o id q recebe o select
    $result = ibase_fetch_row($qry); //pega a unica linha que o select retorna
    
    return $result[0];
}



function generateCodFin() {
    include 'conecta.inc.php';
    
    $select = "SELECT GEN_ID(GNCODFIN,1) from rdb\$database ";

    $qry = ibase_query($con, $select); //cria o id q recebe o select
    $result = ibase_fetch_row($qry); //pega a unica linha que o select retorna
    
    return $result[0];
}

function generateCodPar() {
    include 'conecta.inc.php';
    
    $select = "SELECT GEN_ID(GNPAGAMENTOS,1) from rdb\$database ";

    $qry = ibase_query($con, $select); //cria o id q recebe o select
    $result = ibase_fetch_row($qry); //pega a unica linha que o select retorna
    
    return $result[0];
}




function getForma($codForma) {
    include 'conecta.inc.php';
    include_once 'funcoes.inc';
    
    $select = "SELECT * FROM formas WHERE codforma = $codForma";

    $query = qry($con, $select, $a_campos); //cria o id q recebe o select
    
    if (cria_matriz_campos($query, $a_campos, $result)) {
        ibase_close($con); //fecha a conexao
        return $result[0];
    }
}

function getTipoPagamento($codTipo) {
    include 'conecta.inc.php';
    include_once 'funcoes.inc';
    
    $select = "SELECT * FROM tipospag WHERE codTipo = $codTipo";

    $query = qry($con, $select, $a_campos); //cria o id q recebe o select
    
    if (cria_matriz_campos($query, $a_campos, $result)) {
        ibase_close($con); //fecha a conexao
        return $result[0];
    }
}


function geraNumDup($numeroParcela, $totalDeParcelas) {
    return "$numeroParcela/$totalDeParcelas";
}

function geraDupLetra($numeroParcela) {
    $alphabet = range('A', 'Z');
    return $alphabet[$numeroParcela-1];
}

function geraNumpar() {
    return time() - strtotime(date('Y-m-d'));
}

function geraDataVencimento($forma, $numeroParcela) {
    $date = new DateTime(date("Y-m-d"));
    
    // $dias = $numeroParcela*30;
    $campoOrdinal = "";
    switch ($numeroParcela) {
        case 1:
            $campoOrdinal = "primeira";
            break;
        case 2:
            $campoOrdinal = "segunda";
            break;
        case 3:
            $campoOrdinal = "terceira";
            break;
        case 4:
            $campoOrdinal = "quarta";
            break;
        case 5:
            $campoOrdinal = "quinta";
            break;
        case 6:
            $campoOrdinal = "sexta";
            break;
        case 7:
            $campoOrdinal = "setima";
            break;
        case 8:
            $campoOrdinal = "oitava";
            break;
        case 9:
            $campoOrdinal = "nona";
            break;
        case 10:
            $campoOrdinal = "decima";
            break;
        case 11:
            $campoOrdinal = "decprimeira";
            break;
        case 12:
            $campoOrdinal = "decsegunda";
            break;
        case 13:
            $campoOrdinal = "p13";
            break;
        case 14:
            $campoOrdinal = "p14";
            break;
        case 15:
            $campoOrdinal = "p15";
            break;
        case 16:
            $campoOrdinal = "p16";
            break;
        case 17:
            $campoOrdinal = "p17";
            break;
        case 18:
            $campoOrdinal = "p18";
            break;
        case 19:
            $campoOrdinal = "p19";
            break;
        case 20:
            $campoOrdinal = "p20";
            break;
        case 21:
            $campoOrdinal = "p21";
            break;
        case 22:
            $campoOrdinal = "p22";
            break;
        case 23:
            $campoOrdinal = "p23";
            break;
        case 24:
            $campoOrdinal = "p24";
            break;
        
        default:
            $campoOrdinal = "";
            break;
    }

    $dias = $forma[$campoOrdinal];

 
    //regra copiada do business (delphi) - procedure TfrmParcelas.btCalcFormasClick
    if ( is_null($forma['diafixo'] ) || ( $forma['diafixo'] == 0 ) ) { // não é para dia fixo
        $date->modify("$dias day");
    }elseif ($forma['iniproximomes'] == 1 ) { // dia fixo, começando no próximo mês
        $date = new DateTime(date("Y-m-" . $forma['diafixo']) );
        $date->modify( $numeroParcela . " month");
    }else{ // dia fixo, começando no próprio mês  (mas se a data já passou então começa no próximo mês tbm)

        if ($forma['diafixo'] > date("j")) {
            $aux_n = 1; 
        }else{
            $aux_n = 0;
        }
               
        if ( ($forma['diafixo'] > 28) && (date("n") == 2) ) {
            $date = new DateTime(date("Y-m-28" ) );
            $date->modify( ($numeroParcela  - $aux_n ) . " month");
            $date->modify('last day of this month');
        }

        if  ($forma['diafixo'] > 30)  {
            $date = new DateTime(date("Y-m-30" ) );
            $date->modify( ($numeroParcela  - $aux_n ) . " month");
            $date->modify('last day of this month');
        }else{
            $date = new DateTime(date("Y-m-" . $forma['diafixo']) );
            $date->modify( ($numeroParcela  - $aux_n ) . " month");
       
        }
          
    }

    if ($forma['igualadiasprimparc'] == 1) {
        $diaRef = (int)($dias/30);
        $date = new DateTime(date("Y-m-d"));
        $date->modify( $diaRef . " month");
    }
     


    $date = validarDataVencimento($date);

    return $date->format("m-d-Y");
}

function validarDataVencimento($data){
        
    if ( ( getConfig('PARC_DTVENC_APNS_SEG_SEX') == 1 ) || ( getConfig('FinVenctoParaDiaUtil') == 'S' ) ) {
        if (date('w', $data) == 0 ){
            $data->modify("+1 day");
        }elseif (date('w', $data) == 6 ){
            $data->modify("+2 day");
        }
    }
 
    return $data;
}

function getCodBan($codTipo) {
    include '../auxiliar/parametros.inc';
    include_once 'conecta.inc.php';
    include_once 'funcoes.inc';
    
    $tipo = getTipoPagamento($codTipo);

    if(isset($tipo["codban"]) && $tipo["codban"] != "")
        return $tipo["codban"];

    return $p_codban_padrao_das_parcelas;

}


function lancaFaturamento($codOS) {
    include '../auxiliar/parametros.inc';
    include_once 'conecta.inc.php';
    include_once 'funcoes.inc';
    include_once 'bd_os.inc';

    $codfin = generateCodFin();
    $os = getOsByCodos($codOS);
    $codCon = getCodConta();
    $tipospag = getTipoPagamento($os["codtipo"]);

    $insert = "INSERT INTO FINAN (
            codfin,
            dtemi,
            codos,
            codaux,
            codcli,
            codloja,
            numlanc,
            datacria,
            os,
            codforma,
            codcon
        ) VALUES (
            $codfin,
            current_date,
            " . $os["codos"] . ",
            " . $os["codos"] . ",
            " . $os["codcli"] . ",
            " . $os["codloja"] . ",
            " . $os["os"] . ",
            current_date,
            " . $os["os"] . ",
            " . $os["codforma"] . ",
            " . $codCon . "
        )

    ";
    
    if(!exec_sql_simples($con, $insert)) {
        return false;
    }

    $forma = getForma($os['codforma']);
    $numeroDeParcelas = (int)$forma["quant"];

    $totalItems = $os["totnf"];
    if(is_null($totalItems) || $totalItems == 0 )  {
        $totalItems = $os["total"];
    }

    $valorParcela = number_format($totalItems / $numeroDeParcelas, 2);

    $valorDaUltimaParcela = $valorParcela + ($totalItems - $numeroDeParcelas*$valorParcela);


    for ($i=0; $i < $numeroDeParcelas; $i++) {

        $valorfinalParcela = (($i+1 == $numeroDeParcelas) ? $valorDaUltimaParcela : $valorParcela);
        $valorTAXA = $tipospag["pcttaxa"] * $valorfinalParcela / 100;
        $valorAdic = $tipospag["adic"] ;
        
               
        if ($tipospag["somasub"] != 2) {
            $valorpago = $valorfinalParcela + $valorTAXA + $valorAdic;
        }else{
            $valorpago = $valorfinalParcela - $valorTAXA - $valorAdic;
        }
    
       
        sleep(1);
        $insert = "INSERT INTO PARCELAS (
            codfin, 
            dtemi, 
            valor, 
            valorpg,
            codcon, 
            pago, 
            dthoraemirel, 
            datacria, 
            codtipo, 
            codban, 
            numdup, 
            duplletra, 
            numpar, 
            dtvencto,
            codpar,
            taxa,
            pcttaxa
        ) VALUES (
            $codfin,
            current_date,
            " . number_format( $valorfinalParcela , 2, ".", "" ). ",
            " . number_format( $valorpago , 2, ".", "" ). ",
            $codCon,
            'N',
            current_date,
            current_date,
            " . $os["codtipo"] . ",
            " . getCodBan($os["codtipo"]) . ",
            '" . geraNumDup($i+1, $numeroDeParcelas) . "',
            '" . geraDupLetra($i+1) . "',
            " . geraNumpar() . ",
            '" . geraDataVencimento($forma, $i+1) . "',
            '" . generateCodPar() . "',
            " . number_format( $valorTAXA , 2, ".", "" ). ",
            " . number_format( $tipospag["pcttaxa"] , 2, ".", "" ). "

        )
        ";

        if(!exec_sql_simples($con, $insert)) {
            return false;
        }

    }

    return true;

}








function relancaFaturamento($codOS) {
    include '../auxiliar/parametros.inc';
    include_once 'conecta.inc.php';
    include_once 'funcoes.inc';
    include_once 'bd_os.inc';


    $finan = getFinanByOs($codOS);
    if(!$finan)
        return lancaFaturamento($codOS);

    $codfin = $finan["codfin"];
    $os = getOsByCodos($codOS);
    $codCon = getCodConta();

    $cancelaParcelas = "UPDATE parcelas set cancelado =1 where codfin = $codfin";
    
    if(!exec_sql_simples($con, $cancelaParcelas)) {
        return false;
    }

    $forma = getForma($os['codforma']);
    $numeroDeParcelas = (int)$forma["quant"];

    $totalItems = $os["totnf"];
    if(is_null($totalItems)) {
        $totalItems = 0;
    }

    $valorParcela = number_format($totalItems / $numeroDeParcelas, 2);

    $valorDaUltimaParcela = $valorParcela + ($totalItems - $numeroDeParcelas*$valorParcela);


    for ($i=0; $i < $numeroDeParcelas; $i++) {
        
        sleep(1);
        $insert = "INSERT INTO PARCELAS (
            codfin, 
            dtemi, 
            valor, 
            codcon, 
            pago, 
            dthoraemirel, 
            datacria, 
            codtipo, 
            codban, 
            numdup, 
            duplletra, 
            numpar, 
            dtvencto,
            codpar
        ) VALUES (
            $codfin,
            current_date,
            " . number_format( (($i+1 == $numeroDeParcelas) ? $valorDaUltimaParcela : $valorParcela), 2, ".", "" ). ",
            $codCon,
            'N',
            current_date,
            current_date,
            " . $os["codtipo"] . ",
            " . getCodBan($os["codtipo"]) . ",
            '" . geraNumDup($i+1, $numeroDeParcelas) . "',
            '" . geraDupLetra($i+1) . "',
            " . geraNumpar() . ",
            '" . geraDataVencimento($forma, $i+1) . "',
            '" . generateCodPar() . "'

        )
        ";

        if(!exec_sql_simples($con, $insert)) {
            return false;
        }

    }

    return true;

}











function setaNFFinan($codos, $numNota) {
    include '../auxiliar/parametros.inc';
    include_once 'conecta.inc.php';
    include_once 'funcoes.inc';
    
    $update = "UPDATE finan SET nf=$numNota where codos = $codos";
    
    if(!exec_sql_simples($con, $update)) {
        return false;
    }
}


function getFaturamentoByCodos($codOs) {
    include '../auxiliar/parametros.inc';
    include 'conecta.inc.php';
    include_once 'funcoes.inc';

    $select = "SELECT 
                    codfin,
                    dtemi,
                    codos,
                    codaux,
                    codcli,
                    codloja,
                    numlanc,
                    datacria,
                    os,
                    codforma,
                    codcon
            FROM finan WHERE codos = $codOs";

    
    $query = qry($con, $select, $a_campos); //cria o id q recebe o select
    
    if (cria_matriz_campos($query, $a_campos, $result)) {
        ibase_close($con); //fecha a conexao
        return $result[0];
    }
}



function getParcelasByCodFin($codfin) {
    include '../auxiliar/parametros.inc';
    include 'conecta.inc.php';
    include_once 'funcoes.inc';

    $select = "SELECT 
                    p.codfin, 
                    p.dtemi, 
                    p.valor, 
                    p.codcon, 
                    p.pago, 
                    p.dthoraemirel, 
                    p.datacria, 
                    p.codtipo, 
                    p.codban, 
                    p.numdup, 
                    p.duplletra, 
                    p.numpar, 
                    p.dtvencto,
                    p.istefintegrado,
                    p.codbandeiracartao,
                    p.nautorizacaocartao,
                    nfc.cnpj,

                    tp.codnfcetipospag as tipoPagamentoNF
                    
            FROM parcelas p
            JOIN tipospag tp ON tp.codtipo = p.codtipo
            LEFT JOIN nfcecartoes nfc ON nfc.codnfcecartao = tp.codnfcecartao
            WHERE p.codfin = $codfin AND p.cancelado is NULL";

    
    $query = qry($con, $select, $a_campos); //cria o id q recebe o select
    
    if (cria_matriz_campos($query, $a_campos, $result)) {
        ibase_close($con); //fecha a conexao
        return $result;
    }
}


function getFinanByOs($codOS) {
    include '../auxiliar/parametros.inc';
    include 'conecta.inc.php';
    include_once 'funcoes.inc';

    $select = "SELECT *
            FROM finan
            WHERE codos = $codOS";

    
    $query = qry($con, $select, $a_campos); 
    
    if (cria_matriz_campos($query, $a_campos, $result)) {
        ibase_close($con); //fecha a conexao
        return $result[0];
    }
}


//Finan
// CodFin = FireBirdDBService.RetornaChaveMestra("GNCODFIN"),
// DtEmi = DateTime.Now,
// CodOs = os.Codos,
// CodAux = os.Codos,
// CodCli = os.CodCli,
// CodLoja = os.CodLoja,
// NumLanc = Convert.ToInt32(os.Os),
// DataCria = DateTime.Now,
// OS = Convert.ToInt32(os.Os),
// CodForma = formaPagamento.CodForma,
// CodCon = CodConMercadolibre


//Parcelas
// CodFin = finan.CodFin,
// DTEmi = DateTime.Now.Date,
// Valor = valorParcelaTaxa,
// CodCon = CodConTaxaMercadolibre,
// Pago = "N",
// DTHoraEmiRel = DateTime.Now,
// DataCria = DateTime.Now,
// CodTipo = tipoPag.CodTipo,
// CodBan = CodBan

// parcelaTaxa.GeraNumDup(numParcela, payment.Installments*2);
// parcelaTaxa.GeraDupLetra(numParcela, true);
// parcelaTaxa.GeraNumPar();
// parcelaTaxa.CalculaDataVencimento(i + 1);