PABX da Simples IP
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

375 lines
17 KiB

<?php
/*
* carregar controles prepara relatório
*/
//variaveis para manter o estado
$listaContrato = 0;
$dataIni = date('d/m/Y');
$dataFim = date('d/m/Y');
$agrup = true;
$refaturar = false;
$numRefatura = 0;
if (IsPostBack()) {
//print "listaAgente: " . $_SESSION["listaSites"] ." - ". $_POST["listaSites"];
$dataIni = $_POST["dataIni"] ? $_POST["dataIni"] : date('d/m/Y');
$dataFim = $_POST["dataFim"] ? $_POST["dataFim"] : date('d/m/Y');
$listaContrato = $_POST['listaContrato'];
$agrup = isset($_POST['agrup']);
$refaturar = isset($_POST['btRetarifa']);
}
$isValid = 1;
if (IsPostBack() && !is_date($dataIni)) {
$isValid = 0;
$msg = "Data inicial inválida!";
} else if (IsPostBack() && !is_date($dataFim)) {
$isValid = 0;
$msg = "Data final inválida!";
}
$imp = 0;
//executa consulta somente com post
if (IsPostBack() && $isValid) {
$linhas = GetDadosRefatura($refaturar);
$somaDuration = 0;
$somaValor = 0;
$somaValorRefaturado = 0;
$linha = '';
foreach ($linhas as $row) {
$str = GetLinhaTRefat($agrup);
foreach ($row as $key => $value) {
$str = str_replace('{' . $key . '}', $value, $str);
}
$linha .= $str;
$somaValor += $row['trr_valor_orig'];
$somaDuration += $row['trr_duracao_orig'];
$somaValorRefaturado += $row['trr_valor_retarifa_orig'];
}
}
if (empty($linha)) {
if ($isValid && pg_last_error($dbcon)) {
$noData = "Erro ao realizar a consulta!"; // Erro: " . pg_last_error($dbcon);
} else {
$noData = IsPostBack() ? ($isValid ? "Nenhum registro encontrado!" : $msg) : "Informa as datas inicial,final, ramal e clique em consultar!";
}
$linha = " <tr><td colspan=\"10\" align=\"left\" class=\"headData\">$noData</td>";
}
$corRefat = $somaValor == $somaValorRefaturado ? '#000' : ($somaValorRefaturado > $somaValor ? '#00f' : '#f00');
$fontRefat = $somaValor != $somaValorRefaturado ? 'bold' : 'normal';
$somaDuration = SecondToStrTime($somaDuration);
$somaValor = FormataValor(round($somaValor, 2));
$somaValorRefaturado = FormataValor(round($somaValorRefaturado, 2));
$colspan = $agrup ? 3 : 7;
$linhaTotal = " <tr>
<th colspan=\"1\" align=\"left\" class=\"headColun\">Chamadas: $imp</th>
<th align=\"center\" class=\"headColun\" colspan=\"$colspan\">Total</th>
<th align=\"center\" class=\"headColun\">$somaDuration</th>";
if ($agrup) {
$linhaTotal .= "<th align=\"right\" class=\"headColun\">$somaValor</th>
<th align=\"right\" class=\"headColun\"><span style=\"color:$corRefat; font-weight:$fontRefat;\">$somaValorRefaturado</span></th>
</tr>";
} else {
$linhaTotal .= "<th align=\"center\" class=\"headColun\">-</th>
<th align=\"right\" class=\"headColun\">$somaValor</th>
<th align=\"center\" class=\"headColun\">-</th>
<th align=\"right\" class=\"headColun\"><span style=\"color:$corRefat; font-weight:$fontRefat;\">$somaValorRefaturado</span></th>
</tr>";
}
$linha .= $linhaTotal;
if (!$isValid)
$jsStartup[] = "alert('$msg');";
$jsJQuery[] = "\$('#dataIni').keypress(function(){formataDataHora(this);}) ";
$jsJQuery[] = "\$('#dataFim').keypress(function(){formataDataHora(this);}) ";
$contratos = PbxContratos($listaContrato);
$smarty->assign("contratos", $contratos);
$smarty->assign('dtIni', $dataIni);
$smarty->assign('dtFim', $dataFim);
$smarty->assign('imp', $numRefatura);
$smarty->assign('agrup', $agrup);
$smarty->assign('linhas', $linha);
GetTemplate($smarty, 'cadastros/tarifacao/tarifaRefatura.htm');
function GetQuery($ordem = 0) {
global $dataIni, $dataFim, $listaContrato;
$dataI = FormatDtMssql($dataIni);
$dataF = FormatDtMssql($dataFim);
$dddDef = GetDddPadrao();
$sql = "select a.contr_id,h.contr_descricao, i.prc_vigencia, a.trr_id, a.oper_id_dest, a.oper_numero_dest, a.uniqueid, a.trr_link, a.trr_data, a.trr_origem, a.trr_destino, a.trr_inicio, a.trr_fim, a.trr_duracao, a.trr_preco,
a.trr_vc, a.trr_preco_tipo, a.trr_tipo_opera, a.trr_sentido_chamada, a.trr_tarifa_zero, a.trr_conta_senha, a.trr_conta, a.trr_vc_cad, a.trr_vc_ext,
a.trr_preco_total, b.oper_nome, g.ttp_descricao,
(a.trr_duracao / 60)::int as duracao_mininuto, (a.trr_duracao % 60) as duracao_segundo, a.trr_franquia, h.contr_tipo_franquia, a.trr_duracao as duracao,
a.trr_tipo_chamada, a.trr_duracao_transf, h.contr_dia_fechamento,
j.prc_tipo, j.prc_preco_vc1, j.prc_preco_vc2, j.prc_preco_vc3, j.prc_preco_vc4, j.prc_preco_vc5, j.prc_preco_vc6, j.prc_preco_vc1_cad, j.prc_preco_vc2_cad, j.prc_preco_vc3_cad, j.prc_preco_vc4_cad,
j.prc_preco_vc5_cad, j.prc_preco_vc6_cad, j.prc_preco_vc1_ext, j.prc_preco_vc2_ext, j.prc_preco_vc3_ext, j.prc_preco_vc4_ext, j.prc_preco_vc5_ext, j.prc_preco_vc6_ext
from pbx_tarif_registra a
inner join pbx_operadoras b on b.oper_id = a.oper_id_dest
inner join pbx_tarif_contrato h on h.contr_id = a.contr_id
inner join pbx_tarif_contrato_preco i on i.prc_id = a.prc_id
inner join pbx_tarif_contrato_preco j on j.contr_id = a.contr_id and j.prc_id = (select max(prc_id) as prc_id from pbx_tarif_contrato_preco where contr_id = a.contr_id and prc_vigencia <= a.trr_data)
left join pbx_tarifa_tipo_preco g on g.ttp_id = a.trr_vc
where length(trr_destino) >= 8
and a.trr_duracao > 3
and a.trr_data >= '$dataI'
and a.trr_data <= '$dataF'\n";
$sql .= " and a.contr_id <> 0 and trr_tarifa_zero = 0 and gettipoligacao(a.trr_destino, $dddDef) <> 'Gratuita'\n";
if ($listaContrato) {
$sql .= " and a.contr_id = '$listaContrato'\n";
}
$sql .= " order by h.contr_descricao, i.prc_vigencia, a.trr_data, a.trr_inicio\n";
//if(IsAdmin ())echo $sql . "\n";
return $sql;
}
function GetLinhaTRefat($agrup) {
$linha = "<tr>
<td align=\"left\" class=\"headData\">{contr_descricao}</td>
<td align=\"left\" class=\"headData\">{prc_vigencia}</td>
<td align=\"left\" class=\"headData\">{oper_nome}</td>
<td align=\"left\" class=\"headData\">{ttp_descricao}</td>\n";
if (!$agrup)
$linha .= "<td align=\"right\" class=\"headData\">{trr_origem}</td>\n";
if (!$agrup)
$linha .= "<td align=\"right\" class=\"headData\">{trr_conta}</td>\n";
if (!$agrup)
$linha .= "<td align=\"right\" class=\"headData\">{trr_destino}</td>\n";
if (!$agrup)
$linha .= "<td align=\"center\" class=\"headData\">{trr_data}</td>\n";
$linha .= "<td align=\"center\" class=\"headData\">{trr_duracao}</td>\n";
if (!$agrup)
$linha .= "<td align=\"right\" class=\"headData\">{trr_preco}</td>\n";
$linha .= "<td align=\"right\" class=\"headData\"><span title=\"{TITLE_VALOR}\">{trr_valor}</span></td>\n";
if (!$agrup)
$linha .= "<td align=\"right\" class=\"headData\">{trr_preco_retarifa}</td>\n";
$linha .= "<td align=\"right\" class=\"headData\"><span title=\"{TITLE_VALOR_REFAT}\" style=\"color:{COR_VALOR_REFAT}; font-weight:{FONT_BOLD_REFAT};\">{trr_valor_retarifa}</span></td>\n";
$linha .= "</tr>\n";
return $linha;
}
function GetRetarifa(&$row) {
$vc = $row['trr_vc'];
switch ($vc) {
case 'vc1' : $trrPreco = $row['prc_preco_vc1'];
$trrVcCad = $row['prc_preco_vc1_cad'];
$trrVcCadExt = $row['prc_preco_vc1_ext'];
break;
case 'vc2' : $trrPreco = $row['prc_preco_vc2'];
$trrVcCad = $row['prc_preco_vc2_cad'];
$trrVcCadExt = $row['prc_preco_vc2_ext'];
break;
case 'vc3' : $trrPreco = $row['prc_preco_vc3'];
$trrVcCad = $row['prc_preco_vc3_cad'];
$trrVcCadExt = $row['prc_preco_vc3_ext'];
break;
case 'vc4' : $trrPreco = $row['prc_preco_vc4'];
$trrVcCad = $row['prc_preco_vc4_cad'];
$trrVcCadExt = $row['prc_preco_vc4_ext'];
break;
case 'vc5' : $trrPreco = $row['prc_preco_vc5'];
$trrVcCad = $row['prc_preco_vc5_cad'];
$trrVcCadExt = $row['prc_preco_vc5_ext'];
break;
case 'vc6' : $trrPreco = $row['prc_preco_vc6'];
$trrVcCad = $row['prc_preco_vc6_cad'];
$trrVcCadExt = $row['prc_preco_vc6_ext'];
break;
}
$row["trr_preco_tipo_retarifa"] = $row['prc_tipo'];
$row["trr_preco_retarifa"] = $trrPreco;
$row["trr_vc_cad_retarifa"] = $trrVcCad;
$row["trr_vc_ext_retarifa"] = $trrVcCadExt;
}
function GetDadosRefatura($refaturar = false, $msg = '') {
global $imp, $agrup, $dbcon, $jsStartup, $numRefatura;
$numRefatura = 0;
$arOrdem = GetOrdenacaoRelatorio($dbcon, REL_SAINTES_RAMAL);
$ordem = $arOrdem[0];
$ordem = empty($ordem) ? "a.src" : $ordem;
$linhas = array();
$idxAgp = 0;
$agv = array();
$agd = array();
$agr = array();
$queryIns = array();
$queryUpd = array();
$colunas = array('contr_descricao', 'prc_vigencia', 'oper_nome', 'ttp_descricao', 'trr_origem', 'trr_conta', 'trr_destino', 'trr_data', 'trr_duracao', 'trr_valor', 'trr_valor_orig', 'trr_duracao_orig', 'trr_?reco', 'trr_preco_retarifa', 'trr_valor_retarifa', 'COR_VALOR_REFAT', 'FONT_BOLD_REFAT', 'TITLE_VALOR', 'TITLE_VALOR_REFAT');
$result = pg_query($dbcon, GetQuery());
while ($row = @pg_fetch_array($result)) {
$tipoFranquia = $row["contr_tipo_franquia"];
$tarifaZero = $row["trr_tarifa_zero"] > 0;
$franquia = ($row["trr_franquia"] > 0) && ($tipoFranquia > 0);
$franquiaParcial = $franquia && ($row["trr_franquia"] != $row["trr_duracao"]);
$tarifaZero = ($tarifaZero || $franquia) && (!$franquiaParcial);
$row["prc_vigencia"] = FormataDBDataHora($row["prc_vigencia"]);
$row["trr_origem"] = $agrup ? '' : $row["trr_origem"];
$row["trr_conta"] = $agrup ? '' : ($row["trr_conta_senha"] ? $row["trr_conta"] : "-");
$row["trr_destino"] = $agrup ? '' : ( ($tarifaZero ? '#' : ($franquia ? ($franquiaParcial ? '*' : '**') : '') ) . $row["trr_destino"] );
$row["trr_data"] = $agrup ? '' : FormataDBDataHora($row["trr_inicio"]);
$row["trr_destino"] = ocultarTelefone($row["trr_destino"]);
/*
* Calcula hash para agrupamento.
*/
$idxAgp = md5($row["contr_descricao"] . $row["prc_vigencia"] . $row["oper_nome"] . $row["ttp_descricao"] . $row["trr_origem"] . $row["trr_conta"] . $row["trr_data"]);
/*
* Duração total da chamada.
*/
$row["trr_duracao"] = $franquiaParcial ? $row["trr_franquia"] : (int) $row["trr_duracao"];
/*
* Parametrização do preco, tabela pbx_tarif_contrato_preco -> preco, cadencia, quebra da cadencia.
* correspondente na tabela pbx_tarif_registra -> trr_preco, trr_vc_cad, trr_vc_ext
* Fixo Local....: prc_preco_vc1, prc_preco_vc1_cad, prc_preco_vc1_ext
* Fixo DDD......: prc_preco_vc2, prc_preco_vc2_cad, prc_preco_vc2_ext
* Fixo DDI......: prc_preco_vc5, prc_preco_vc5_cad, prc_preco_vc5_ext
* Móvel Local...: prc_preco_vc3, prc_preco_vc3_cad, prc_preco_vc3_ext
* Móvel DDD.....: prc_preco_vc4, prc_preco_vc4_cad, prc_preco_vc4_ext
* Móvel DDI.....: prc_preco_vc6, prc_preco_vc6_cad, prc_preco_vc6_ext
* Tarifa por chamada = 1 ou Minuto = 2, tabela pbx_tarif_contrato_preco -> prc_tipo, pbx_tarif_registra -> trr_preco_tipo
*/
if (!$tarifaZero) {
$row["contr_descricao"] = sprintf("<a href=\"javaScript:NovaJanela('index.php?idProg=198&acao=preco&contr_id=%s&contr_descricao=%s&oper_id=%s&oper_nome=%s&contr_tipo_franquia=%s&contr_dia_fechamento=%s', 'jnCadPreco', '800', '600', 'resizable=NO,scrollbars=NO');\" style=\"color: #000\">%s</a>", $row["contr_id"], $row["contr_descricao"], $row["oper_numero_dest"], $row["oper_nome"], $row["contr_tipo_franquia"], $row["contr_dia_fechamento"], $row["contr_descricao"]
);
$disp = 1;
$imp++;
$row["trr_valor"] = TarifaChamada($row["trr_preco_tipo"], $row["trr_duracao"], $row["trr_preco"], $row["trr_vc_cad"], $row["trr_vc_ext"]);
$row['TITLE_VALOR'] = $agrup ? '' : sprintf('Tipo: %s Preço: %s Cadência: %s X %s', ($row["trr_preco_tipo"] == 1 ? 'Minuto' : 'Chamada'), $row["trr_preco"], $row["trr_vc_cad"], $row["trr_vc_ext"]);
/*
* Retarifa a chamada pelo valores atuais da vigencia do contrato obtidos pela trr_data
*/
GetRetarifa($row);
$row["trr_valor_retarifa"] = TarifaChamada($row["trr_preco_tipo_retarifa"], $row["trr_duracao"], $row["trr_preco_retarifa"], $row["trr_vc_cad_retarifa"], $row["trr_vc_ext_retarifa"]);
$row['TITLE_VALOR_REFAT'] = $agrup ? '' : sprintf('Tipo: %s Preço: %s Cadência: %s X %s', ($row["trr_preco_tipo_retarifa"] == 1 ? 'Minuto' : 'Chamada'), $row["trr_preco_retarifa"], $row["trr_vc_cad_retarifa"], $row["trr_vc_ext_retarifa"]);
/*
* Para habilitar a refaturação deve haver ao menos 1 registro divergente;
*/
if (!$numRefatura && ($row["trr_valor"] != $row["trr_valor_retarifa"])) {
$numRefatura++;
}
$incRefat = $refaturar && (($row["trr_valor"] != $row["trr_valor_retarifa"]) || ($row["trr_preco"] != $row["trr_preco_retarifa"] ) || ($row["trr_vc_cad"] != $row["trr_vc_cad_retarifa"]) || ($row["trr_vc_ext"] != $row["trr_vc_ext_retarifa"]));
if ($refaturar && $incRefat) {
$sql = "update pbx_tarif_registra set trr_preco_tipo = %s, trr_preco = %s, trr_vc_cad = %s, trr_vc_ext = %s where trr_id = %s;\n";
$queryUpd[] = sprintf($sql, $row["trr_preco_tipo_retarifa"], $row["trr_preco_retarifa"], $row["trr_vc_cad_retarifa"], $row["trr_vc_ext_retarifa"], $row["trr_id"]);
$sql = "insert into pbx_tarif_retarifa values(now(),'%s','%s','%s','%s','%s','%s');\n";
$queryIns[] = sprintf($sql, $row["trr_id"], $row["trr_preco_tipo"], $row["trr_preco"], $row["trr_vc_cad"], $row["trr_vc_ext"], GetLogin());
}
/*
* Valores agrupados
*/
$agv[$idxAgp] = isset($agv[$idxAgp]) ? ($agv[$idxAgp] + $row["trr_valor"]) : $row["trr_valor"];
$agr[$idxAgp] = isset($agv[$idxAgp]) ? ($agr[$idxAgp] + $row["trr_valor_retarifa"]) : $row["trr_valor_retarifa"];
$agd[$idxAgp] = isset($agd[$idxAgp]) ? ($agd[$idxAgp] + $row["trr_duracao"]) : $row["trr_duracao"];
$row["trr_valor"] = FormataValor($agv[$idxAgp]);
$row["trr_valor_retarifa"] = FormataValor($agr[$idxAgp]);
$row["trr_duracao"] = SecondToStrTime($agd[$idxAgp]);
$row["trr_valor_orig"] = $agv[$idxAgp];
$row["trr_valor_retarifa_orig"] = $agr[$idxAgp];
$row["trr_duracao_orig"] = $agd[$idxAgp];
$row["COR_VALOR_REFAT"] = ($row["trr_valor_retarifa_orig"] == $row["trr_valor_orig"]) ? '#000' : (($row["trr_valor_retarifa_orig"] > $row["trr_valor_orig"]) ? '#00f' : '#f00');
$row["FONT_BOLD_REFAT"] = ($row["trr_valor_retarifa_orig"] == $row["trr_valor_orig"]) ? 'normal' : 'bold';
$linhas[$idxAgp] = $row;
}
}
if (!$refaturar && $msg) {
$jsStartup[] = "alert('$msg');";
}
return $refaturar ? GetDadosRefatura(false, Refatura($dbcon, $queryIns, $queryUpd)) : $linhas;
}
function Refatura($dbcon, $queryIns, $queryUpd) {
$intran = false;
try {
$tamQuery = 500;
$result = pg_query($dbcon, 'begin');
if (!$result) {
throw new Exception("Não foi possível iniciar a retarifação!");
}
$intran = true;
/*
* gravando o log da retarifação.
*/
$query = '';
$numLinhas = 0;
foreach ($queryIns as $sql) {
$query .= $sql;
if (++$numLinhas >= $tamQuery) {
if (!$result = ($result && pg_query($dbcon, $query))) {
break;
}
$numLinhas = 0;
$query = '';
}
}
if ($query && $result) {
$result = pg_query($dbcon, $query);
}
if (!$result) {
throw new Exception("Não foi possível registrar a retarifação!");
}
/*
* Atualizando os registros da tarifação.
*/
$query = '';
$numLinhas = 0;
foreach ($queryUpd as $sql) {
$query .= $sql;
if (++$numLinhas >= $tamQuery) {
if (!$result = ($result && pg_query($dbcon, $query))) {
break;
}
$numLinhas = 0;
$query = '';
}
}
if ($query && $result) {
$result = pg_query($dbcon, $query);
}
if (!$result) {
throw new Exception("Não foi possível retarifar os registros!");
}
$result = pg_query($dbcon, 'commit');
if (!$result) {
throw new Exception("Não foi possível concluir a retarifação!");
}
return 'Operação realizada com sucesso!';
} catch (Exception $ex) {
if ($intran)
pg_query($dbcon, 'rollback');
return $ex->getMessage();
}
}
?>