Fórum OpenCart Brasil

Por um e-commerce livre, confiável e profissional

#26766
fiz a alteração e minha loja 1.5.4.1, mas ao tentar colocar na pagina de descrição do produto aparece o seguinte erro:

Preço: R$ 269,00
Notice: Undefined variable: product in /home/centrald/public_html/catalog/view/theme/sina/parcelamento.php on line 19Notice: Undefined variable: product in /home/centrald/public_html/catalog/view/theme/sina/parcelamento.php on line 20
ou 12x de R$ 0,00
com juros de 1.99% ao mês
#26781
Certamente houve alguma alteração na forma como o OpenCart 1.5.4 exibe os preços dos produtos. Aliás, isso pode afetar também os templates para OpenCart. É preciso ver no template padrão do OpenCart como ele está buscando o preço do produto, e então atualizar o código.
#27743
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:
Código: Selecionar todos
<?php echo $header; ?>
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:
Código: Selecionar todos
$('#tabs a').tabs();
Adicione:
Código: Selecionar todos
$('#parcelamento a').tabs();
E por fim, acima de:
Código: Selecionar todos
<?php echo $footer; ?>
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&ecirc;s.';
	}
	if ($parcelaMinima > 0) {
		$parcelaMinima = number_format($parcelaMinima, 2, ',', '.');
		$retorno.= ' Parcela m&iacute;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
#27744
Ivan, o array de fator não dificultaria alterações caso os juros cobrados sejam diferentes? Cada forma de pagamento pode ter juros diferentes. Por exemplo: o Paypal cobra uma taxa de parcelamento maior que o PagSeguro.
#27747
denisgomes escreveu:Ivan, o array de fator não dificultaria alterações caso os juros cobrados sejam diferentes? Cada forma de pagamento pode ter juros diferentes. Por exemplo: o Paypal cobra uma taxa de parcelamento maior que o PagSeguro.
Bem observado, Dênis! Passou batido... Será melhor eu renomear então esse cálculo usando o array para PagSeguro especificamente, ou utilizar um sistema de subarrays com um índice para PagSeguro, Paypal, etc desmembrando em valores.

Abraço!
#28285
Olá,

Estou aqui para relatar uma das possíveis causas de aparecer zerado o valor do parcelamento (R$ 0,00).

Em alguns casos (meu caso foi assim) percebi que a função que retirava o 'R$ ' do preço original para calcular o valor da parcela não estava funcionando. Depois de alguns testes percebi que o código não reconhecia o espaço dado no final do cifrão. Para corrigir isso troque o valor da variável $moeda_da_loja adicionando o código html de espaço '&nbsp;'

no lugar de
Código: Selecionar todos
$moeda_da_loja = 'R$ ';
trocar para
Código: Selecionar todos
$moeda_da_loja = 'R$&nbsp;';
É isso. E obrigado ao dono do tópico por disponibilizar o código.

Flw
#28802
Aqui deu certo mais quando um valor de 1.000,00 para coma ele soma

ou 12x de R$ 97,42
com juros de 1.31% ao mês
= 1.169,04

fui ver no Parcelamento com acréscimo do pagseguro e não bate
no simulador do pagseguro da um total de = R$ 1.169,10

qual a a taxa de juros que o pagseguro usa? só para lembrar eu configurei corretamente para usar tabela price adicionando 1
  • 1
  • 6
  • 7
  • 8
  • 9
  • 10
  • 19