Busca de tarifa¶
Como o MagnusBilling seleciona a tarifa a ser usada?¶
Quando um cliente faz uma chamada externa, para um fixo ou celular, é disparado uma rotina de verificações que consiste em :
- Verifica o usuário e senha.
- Verifica se o cliente está ativo.
- Verifica se o número discado é um DID.
- Verifica se o número discado é uma Conta SIP.
- Verifica o plano do cliente.
- Buscar dentro das tarifas do plano qual a tarifa que mais se encaixa com o número discado.
- Busca os troncos que pertencem ao grupo de troncos da tarifa encontrada.
- Envia a chamada para o primeiro tronco, e se falhar envia para o próximo.
- No momento que a chamada é finalizada, é calculado o preço de compra e venda
- Adicionado a chamada no relatório CDR
- Descontado o valor da chamada no crédito do cliente.
Mais bem, como funciona o passo 6?
É realizado da seguinte forma. Digamos que o cliente XXXXX ligou para o número 551140045678
No passo 5, o sistema pega o plano do cliente, e então no passo 6 é feito um “SELECT” na tabela das tarifas assim.
$sql = "SELECT * FROM pkg_plan LEFT JOIN pkg_rate ON pkg_plan.id = pkg_rate.id_plan
LEFT JOIN pkg_prefix ON pkg_rate.id_prefix = pkg_prefix.id
LEFT JOIN pkg_trunk_group ON pkg_trunk_group.id = pkg_rate.id_trunk_group
WHERE pkg_plan.id=$MAGNUS->id_plan AND pkg_rate.status = 1
AND $MAGNUS->prefixclause ORDER BY LENGTH( prefix ) DESC LIMIT 1";
A variável $MAGNUS->id_plan é o id do plano do cliente, e a variável $MAGNUS->prefixclause é o filtro realizado para encontrar a tarifa.
Para facilitar o entendimento vamos explicar de outra forma.
Como o cliente ligou para 551140045678, o sistema vai buscar da seguinte forma.
Existe uma tarifa para o prefixo 551140045678?
- Se sim, usamos esta tarifa
- Se não, procuramos novamente retirando o último número, neste caso 55114004567 e assim até chegar somente no número 5. Se não encontrar nenhuma tarifa, o sistema vai retornar erro e não vai continuar a chamada.
Voltando ao “SELECT” ficaria assim.
$sql = "SELECT * FROM pkg_plan LEFT JOIN pkg_rate ON pkg_plan.id = pkg_rate.id_plan
LEFT JOIN pkg_prefix ON pkg_rate.id_prefix = pkg_prefix.id
LEFT JOIN pkg_trunk_group ON pkg_trunk_group.id = pkg_rate.id_trunk_group
WHERE pkg_plan.id=1 AND pkg_rate.status = 1 AND
(prefix = '551140045678' OR
prefix = '55114004567' OR
prefix = '5511400456' OR
prefix = '551140045' OR
prefix = '55114004' OR
prefix = '5511400' OR
prefix = '551140' OR
prefix = '55114' OR
prefix = '5511' OR
prefix = '551' OR
prefix = '55' OR
prefix = '5' )
ORDER BY LENGTH( prefix ) DESC LIMIT 1";
Digamos que você tem no plano do cliente, as seguintes 3 tarifas
55,Brasil Fixo Geral 55119,Brasil SP Celular 5511,Brasil SP Fixo
Neste exemplo, o “SELECT” retornaria a tarifa 5511,Brasil SP Fixo.
Mas você pode estar se perguntando se o cliente ligar para 5511988551234, o “SELECT” encontraria o prefixo 55119 e o 5511 e aí qual dos dois usaria? Usaria o 55119, pois no “SELECT” tem o parâmetro ORDER BY LENGTH( prefix ) DESC e também o parâmetro LIMIT 1. Ou seja, ele ordenará os resultados colocando em primeiro o prefixo que tiver a maior quantidade de dígitos.