<?php
    $I = new AcceptanceTester($scenario);
    $I->expect('Calcular horas atividades pendências');

    function calcularHoras($I, $pendencia){
        $I->amOnPage(Url::create("FasesSolicitacao/calcularhoras&solicitacao={$pendencia->SOL_IDPENDENCIA}"));

        $html = $I->grabPageSource();

        $dom = new domDocument('1.0', 'iso-8859-1'); 
        $dom->loadHTML($html); 
        $dom->preserveWhiteSpace = false; 
        $body = $dom->getElementsByTagName('body'); // here u use your desired tag
        $json = $body->item(0)->nodeValue; 
        return json_decode($json, true);
    }

    function geraLancamentos($pendencia, $usuario, $datainicio, $datafim){
        if ($usuario->FUN_PRM_PRIVILEGIO == 2) { // privilegio=desenvolvedor 
            $inicio = 1;
            $fim = 2;
        } else if ($usuario->FUN_PRM_PRIVILEGIO == 3) { // privilegio=analista de negocios
            $inicio = 3;
            $fim = 4;
        } else if ($usuario->FUN_PRM_PRIVILEGIO == 15) { // privilegio=tester
            $inicio = 5;
            $fim = 6;
        } else if(in_array($usuario->FUN_PRM_PRIVILEGIO, array(5, 20))) { // privilegio= suporte a revendas
            $inicio = 7;
            $fim = 8;
        } else {
            return false;
        }

        $lancamentoInicio = new FasesSolicitacao();
        $lancamentoInicio->FAS_IDSOLICITACAO = $pendencia->SOL_IDPENDENCIA;
        $lancamentoInicio->FAS_IDFASE = $inicio;
        $lancamentoInicio->FAS_DATA = $datainicio;
        $lancamentoInicio->FAS_IDUSUARIO = $usuario->FUN_IDFUNCIONARIO;
        $lancamentoInicio->FAS_HORAUSADA = 0;
        $lancamentoInicio->save();

        $lancamentoFim = new FasesSolicitacao();
        $lancamentoFim->FAS_IDSOLICITACAO = $pendencia->SOL_IDPENDENCIA;
        $lancamentoFim->FAS_IDFASE = $fim;
        $lancamentoFim->FAS_DATA = $datafim;
        $lancamentoFim->FAS_IDUSUARIO = $usuario->FUN_IDFUNCIONARIO;
        $lancamentoFim->FAS_HORAUSADA = 0;
        $lancamentoFim->save();
    }

    function deletaLancamentos($pendencia, $usuario){
        if ($usuario->FUN_PRM_PRIVILEGIO == 2) { // privilegio=desenvolvedor 
            $inicio = 1;
            $fim = 2;
        } else if ($usuario->FUN_PRM_PRIVILEGIO == 3) { // privilegio=analista de negocios
            $inicio = 3;
            $fim = 4;
        } else if ($usuario->FUN_PRM_PRIVILEGIO == 15) { // privilegio=tester
            $inicio = 5;
            $fim = 6;
        } else if(in_array($usuario->FUN_PRM_PRIVILEGIO, array(5, 20))) { // privilegio= suporte a revendas
            $inicio = 7;
            $fim = 8;
        } else {
            return false;
        }

        $lancamentosInicio = FasesSolicitacao::model()->findAll("FAS_IDUSUARIO = {$usuario->FUN_IDFUNCIONARIO} AND FAS_IDFASE = {$inicio} AND FAS_IDSOLICITACAO = {$pendencia->SOL_IDPENDENCIA} AND FAS_HORAUSADA = 0");
        $lancamentosFim = FasesSolicitacao::model()->findAll("FAS_IDUSUARIO = {$usuario->FUN_IDFUNCIONARIO} AND FAS_IDFASE = {$fim} AND FAS_IDSOLICITACAO = {$pendencia->SOL_IDPENDENCIA} AND FAS_HORAUSADA = 0");

        foreach ($lancamentosInicio as $lancamento) {
            $lancamento->delete();
        }
        
        foreach ($lancamentosFim as $lancamento) {
            $lancamento->delete();
        }
    }

    $usuario = Auth::loginByPrivilegio($I, 2);

    $pendencia = ModelFind::getRand("Solicitacoes");
    $tempo = calcularHoras($I, $pendencia);

    if (isset($tempo['code']) && $tempo['code'] == 0) {
        deletaLancamentos($pendencia, $usuario);
    }

    $datainicio = "2017-07-10 13:30";
    $datafim =    "2017-07-10 18:30";
    geraLancamentos($pendencia, $usuario, $datainicio, $datafim);
    $tempo = calcularHoras($I, $pendencia);
    $I->assertEquals("05:00", $tempo['horas']);
    deletaLancamentos($pendencia, $usuario);

    $datainicio = "2017-07-10 10:48";
    $datafim =    "2017-07-10 18:30";
    geraLancamentos($pendencia, $usuario, $datainicio, $datafim);
    $tempo = calcularHoras($I, $pendencia);
    $I->assertEquals("06:00", $tempo['horas']);
    deletaLancamentos($pendencia, $usuario);

    $datainicio = "2017-07-07 18:00";
    $datafim =    "2017-07-10 08:30";
    geraLancamentos($pendencia, $usuario, $datainicio, $datafim);
    $tempo = calcularHoras($I, $pendencia);
    $I->assertEquals("01:00", $tempo['horas']);
    deletaLancamentos($pendencia, $usuario);

    $datainicio = "2017-07-07 15:33";
    $datafim =    "2017-07-10 15:33";
    geraLancamentos($pendencia, $usuario, $datainicio, $datafim);
    $tempo = calcularHoras($I, $pendencia);
    $I->assertEquals("08:48", $tempo['horas']);
    deletaLancamentos($pendencia, $usuario);

    $datainicio = "2017-07-06 09:18";
    $datafim =    "2017-07-07 08:30";
    geraLancamentos($pendencia, $usuario, $datainicio, $datafim);
    $tempo = calcularHoras($I, $pendencia);
    $I->assertEquals("08:00", $tempo['horas']);
    deletaLancamentos($pendencia, $usuario);
    
    $datainicio =  "2017-07-06 13:30";
    $datafim    =  "2017-07-07 18:12";
    geraLancamentos($pendencia, $usuario, $datainicio, $datafim);
    $tempo = calcularHoras($I, $pendencia);
    $I->assertEquals("13:30", $tempo['horas']);
    deletaLancamentos($pendencia, $usuario);

    $datainicio =  "2017-07-07 08:35";
    $datafim    =  "2017-07-10 15:48";
    geraLancamentos($pendencia, $usuario, $datainicio, $datafim);
    $tempo = calcularHoras($I, $pendencia);
    $I->assertEquals("14:19", $tempo['horas']);
    deletaLancamentos($pendencia, $usuario);

    $datainicio =  "2017-07-04 08:35";
    $datafim    =  "2017-07-07 15:48";
    geraLancamentos($pendencia, $usuario, $datainicio, $datafim);
    $tempo = calcularHoras($I, $pendencia);
    $I->assertEquals("31:55", $tempo['horas']);
    deletaLancamentos($pendencia, $usuario);

    $datainicio =  "2017-07-04 08:35";
    $datafim    =  "2017-07-10 15:48";
    geraLancamentos($pendencia, $usuario, $datainicio, $datafim);
    $tempo = calcularHoras($I, $pendencia);
    $I->assertEquals("40:43", $tempo['horas']);
    deletaLancamentos($pendencia, $usuario);

    $datainicio =  "2017-07-07 08:32";
    $datafim    =  "2017-07-10 11:42";
    geraLancamentos($pendencia, $usuario, $datainicio, $datafim);
    $tempo = calcularHoras($I, $pendencia);
    $I->assertEquals("11:58", $tempo['horas']);
    deletaLancamentos($pendencia, $usuario);

    $datainicio =  "2017-07-07 08:32";
    $datafim    =  "2017-07-10 13:35";
    geraLancamentos($pendencia, $usuario, $datainicio, $datafim);
    $tempo = calcularHoras($I, $pendencia);
    $I->assertEquals("12:09", $tempo['horas']);
    deletaLancamentos($pendencia, $usuario);

    $datainicio = "2017-07-07 13:30";
    $datafim =    "2017-07-07 18:30";
    geraLancamentos($pendencia, $usuario, $datainicio, $datafim);
    $datainicio = "2017-07-10 13:30";
    $datafim =    "2017-07-10 18:30";
    geraLancamentos($pendencia, $usuario, $datainicio, $datafim);
    $tempo = calcularHoras($I, $pendencia);
    $I->assertEquals("10:00", $tempo['horas']);
    deletaLancamentos($pendencia, $usuario);

    $datainicio = "2017-07-10 07:20";
    $datafim =    "2017-07-10 11:49";
    geraLancamentos($pendencia, $usuario, $datainicio, $datafim);
    $datainicio = "2017-07-07 12:20";
    $datafim =    "2017-07-07 18:40";
    geraLancamentos($pendencia, $usuario, $datainicio, $datafim);
    $tempo = calcularHoras($I, $pendencia);
    $I->assertEquals("08:48", $tempo['horas']);
    deletaLancamentos($pendencia, $usuario);

    $datainicio = "2017-07-07 07:20";
    $datafim =    "2017-07-10 11:49"; 
    geraLancamentos($pendencia, $usuario, $datainicio, $datafim);
    $datainicio = "2017-07-10 12:20";
    $datafim =    "2017-07-10 14:00";
    geraLancamentos($pendencia, $usuario, $datainicio, $datafim);
    $tempo = calcularHoras($I, $pendencia);
    $I->assertEquals("13:06", $tempo['horas']);
    deletaLancamentos($pendencia, $usuario);

    $datainicio = "2017-06-30 18:30";
    $datafim =    "2017-07-31 18:30"; 
    geraLancamentos($pendencia, $usuario, $datainicio, $datafim);
    $tempo = calcularHoras($I, $pendencia);
    $I->assertEquals("184:48", $tempo['horas']);
    deletaLancamentos($pendencia, $usuario);

    $datainicio = "2017-07-01 07:20";
    $datafim =    "2017-07-31 18:30"; 
    geraLancamentos($pendencia, $usuario, $datainicio, $datafim);
    $tempo = calcularHoras($I, $pendencia);
    $I->assertEquals("184:48", $tempo['horas']);
    deletaLancamentos($pendencia, $usuario);

    $datainicio =  "2017-07-07 08:00";
    $datafim    =  "2017-07-07 12:00";
    geraLancamentos($pendencia, $usuario, $datainicio, $datafim);
    $tempo = calcularHoras($I, $pendencia);
    $I->assertEquals("03:48", $tempo['horas']);
    deletaLancamentos($pendencia, $usuario);

    $datainicio =  "2017-07-08 08:00";
    $datafim    =  "2017-07-08 12:00";
    geraLancamentos($pendencia, $usuario, $datainicio, $datafim);
    $tempo = calcularHoras($I, $pendencia);
    $I->assertEquals("00:00", $tempo['horas']);
    deletaLancamentos($pendencia, $usuario);