Pessoal,
Estou desenvolvendo uma loja de eletrônicos para um cliente, e logo posto o link aqui. Porém tive alguns avanços que gostaria de dividir com quem precisa de cálculo para mais de um sistema de pagamento. Resolvi criando uma função com base no código do Dênis, e dividindo os cálculos em Tabs utilizando o jQuery UI do OC. Para isso basta fazer o seguinte no template product.tpl:
Abaixo de:
Adicione os estilos para adequar a classe "parcelamento":
Código: Selecionar todos.product-info .parcelamento {
padding: 10px 5px 10px 5px;
line-height: 20px;
color: #4D4D4D;
border-bottom: 1px solid #E7E7E7;
}
.product-info .parcelamento span {
color: #7f8c99;
display:inline-block;
margin-bottom:8px;
}
</style>
No local onde quiser colocar a DIV do parcelamento adicione:
Código: Selecionar todos<!-- exibe parcelamento -->
<div class="parcelamento"><span>Parcelamento no Cartão:</span>
<div id="parcelamento" class="htabs" style="margin-bottom:0;padding-bottom:0;"><a href="#tab-pagseguro">PagSeguro</a>
<a href="#tab-pagamentodigital">PagamentoDigital</a>
</div>
<div id="tab-pagseguro" class="tab-content" style="margin-bottom:0;padding-bottom:0;">
<?php echo mostraParcelamento($price,$special,2); ?>
</div>
<div id="tab-pagamentodigital" class="tab-content" style="margin-bottom:0;padding-bottom:0;">
<?php echo mostraParcelamento($price,$special,1); ?>
</div>
</div>
<!-- fim exibe parcelamento -->
Lá no final após:
Adicione:
E por fim, acima de:
Adicione:
Código: Selecionar todos<?php
/*****************************************************************************************
* Função para exibir simulação de parcelamento
* Sedisoft Informática LTDA
* http://www.sedisoft.com.br/
* contato@sedisoft.com.br
* Setembro de 2012
*
* Variáveis:
* precoProduto - Valor normal do produto
* precoPromo - Valor do produto em promoção
* tipoCalculo - Permite escolher juros simples (0), tabela price (1) ou fator (2)
* maxParcelas - Define a quantidade máxima de parcelas para simulação
* parcelasSemJuros - Define quantas parcelas não terão juros
* parcelaMinima - Valor mínimo da parcela aceito pela loja
* taxaJuros - Taxa mensal de juros
* moedaLoja - String de moeda a ser removido do preço do produto para cálculos
*
* Referências:
* Cálculo de Parcelamento Direto - Dênis Gomes
* - https://forum.opencartbrasil.com.br/viewtopic.php?f=41&t=171
* Simulador de Parcelas PagSeguro - Tiarê Balbi
* - http://code.imasters.com.br/index.php?/topic/182-simulador-de-parcelas-pagseguro/
*****************************************************************************************/
function mostraParcelamento($precoProduto,$precoPromo,$tipoCalculo=0,$maxParcelas=12,$parcelasSemJuros=1,$parcelaMinima=5,$taxaJuros=1.99,$moedaLoja='R$') {
$fator = array(
'1'=>'1',
'2'=>'0.51875',
'3'=>'0.35007',
'4'=>'0.26575',
'5'=>'0.21518',
'6'=>'0.18148',
'7'=>'0.15743',
'8'=>'0.13941',
'9'=>'0.12540',
'10'=>'0.11420',
'11'=>'0.10505',
'12'=>'0.09743',
'13'=>'0.09099',
'14'=>'0.08548',
'15'=>'0.08071',
'16'=>'0.07654',
'17'=>'0.07287',
'18'=>'0,06961'
);
if($precoPromo) {
$precoCalculo = str_replace(',','.',str_replace('.','', str_replace($moedaLoja,"",strip_tags($precoPromo))));
} else {
if($precoProduto) {
$precoCalculo = str_replace(',','.',str_replace('.','', str_replace($moedaLoja,"",strip_tags($precoProduto))));
} else {
return "Não foi possível calcular o parcelamento";
}
}
// Inicia a primeira coluna
$retorno = '<div style="width: 50%; float:left; font-size:11px;">';
// Exibicao das parcelas
if($maxParcelas > count($fator) && $tipoCalculo==2) {
$maxParcelas = count($fator); // Se o cálculo for tipo Fator e maxParcelas maior que o arry de fatores, redefine o valor
}
for ($p = 2; $p <= $maxParcelas; $p++) {
// Se a parcela nao tiver juros
if ($p <= $parcelasSemJuros) {
$valorParcela = $precoCalculo / $p;
} else {
// Se a parcela tiver juros
switch($tipoCalculo) {
case 2: // Fator
$valorParcela = $precoCalculo * $fator[$p];
break;
case 1: // Tabela price
$valorParcela = ($precoCalculo * ($taxaJuros/100))/(1-(1/(pow(1+($taxaJuros/100), $p))));
break;
default: // Juros simples
$valorParcela = ($precoCalculo * pow(1+($taxaJuros/100), $p))/$p;
}
}
// Escreve a parcela se ela for maior do que a parcela minima
if ($valorParcela >= $parcelaMinima) {
$valorParcela = number_format($valorParcela, 2, ',', '.');
if ($p <= $parcelasSemJuros) {
$retorno.= '<span style="color: #1AA1D9;">' . $p . 'x de ' . $moedaLoja . $valorParcela . ' sem juros</span><br />';
} else {
$retorno.= $p . 'x de ' . $moedaLoja . $valorParcela . ' com juros<br />';
}
}
// Fecha a primeira coluna e inicia a segunda
if ($p == intval($maxParcelas/2)+1) {
$retorno.= '</div><div style="width: 50%; float:right; font-size:11px;">';
}
}
// Fecha a segunda coluna
$retorno.= '</div>';
// Exibe informações sobre o parcelamento
$retorno.= '<div style="font-size:9px; padding-top:6px; line-height:normal; clear:both;"><span>Esta é apenas uma simulação, os valores reais serão apresentados no pagamento.';
// Exibe os juros utilizados e o valor minimo da parcela se esta for maior que zero
if ($parcelasSemJuros < $maxParcelas) {
$taxaJuros = number_format($taxaJuros, 2, ',', '.');
$retorno.= ' Juros de ' . $taxaJuros . '% ao mês.';
}
if ($parcelaMinima > 0) {
$parcelaMinima = number_format($parcelaMinima, 2, ',', '.');
$retorno.= ' Parcela mínima de ' . $moedaLoja . $parcelaMinima.'.';
}
$retorno.= '</span></div>';
return $retorno;
}
?>
Para cada forma de pagamento, basta criar um novo <a> dentro da DIV "parcelamento" e linka-la a uma nova DIV com a chamada da função formatada (tipo de cálculo, valor dos juros, quantidade de parcelas, etc.).
Espero que a contribuição seja válida e que não tenha problema em citar a referência de outro fórum, porém seria injusto não informar de onde partiu o array de fator.
Abraços a todos,
Ivan Vieira