Version Notes
Primeira versão do módulo Preço Parcelado.
Download this release
Release Info
| Developer | Francisco Prado |
| Extension | FranciscoPrado_PrecoParcelado |
| Version | 1.0.0.0 |
| Comparing to | |
| See all releases | |
Version 1.0.0.0
- app/code/community/FranciscoPrado/PrecoParcelado/Helper/Data.php +104 -0
- app/code/community/FranciscoPrado/PrecoParcelado/etc/config.xml +74 -0
- app/code/community/FranciscoPrado/PrecoParcelado/etc/system.xml +120 -0
- app/design/frontend/base/default/layout/franciscoprado_precoparcelado.xml +25 -0
- app/design/frontend/base/default/template/precoparcelado/jsdata.phtml +27 -0
- app/design/frontend/base/default/template/precoparcelado/table.phtml +48 -0
- app/etc/modules/FranciscoPrado_PrecoParcelado.xml +9 -0
- app/locale/pt_BR/FranciscoPrado_PrecoParcelado.csv +10 -0
- package.xml +18 -0
- skin/frontend/base/default/css/precoparcelado.css +12 -0
- skin/frontend/base/default/js/precoparcelado.js +85 -0
app/code/community/FranciscoPrado/PrecoParcelado/Helper/Data.php
ADDED
|
@@ -0,0 +1,104 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<?php
|
| 2 |
+
|
| 3 |
+
class FranciscoPrado_PrecoParcelado_Helper_Data extends Mage_Core_Helper_Abstract {
|
| 4 |
+
|
| 5 |
+
const XML_PATH_ACTIVE = 'sales/franciscoprado_precoparcelado/active';
|
| 6 |
+
const XML_PATH_SHOW_TABLE = 'sales/franciscoprado_precoparcelado/show_table';
|
| 7 |
+
const XML_PATH_TABLE_TITLE = 'sales/franciscoprado_precoparcelado/table_title';
|
| 8 |
+
const XML_PATH_SHOW_PRICE_IN_PARCELS = 'sales/franciscoprado_precoparcelado/show_price_in_parcels';
|
| 9 |
+
const XML_PATH_MIN_PARCEL_VALUE = 'sales/franciscoprado_precoparcelado/min_quote_value';
|
| 10 |
+
const XML_PATH_MAX_NUMBER_MONTHS = 'sales/franciscoprado_precoparcelado/max_number_months';
|
| 11 |
+
const XML_PATH_INTEREST_VALUE = 'sales/franciscoprado_precoparcelado/interest_value';
|
| 12 |
+
const XML_PATH_USE_COMPOUND = 'sales/franciscoprado_precoparcelado/use_compound';
|
| 13 |
+
const XML_PATH_TEXT_PATTERN = 'sales/franciscoprado_precoparcelado/text_pattern';
|
| 14 |
+
const XML_PATH_TABLE_TEXT_PATTERN = 'sales/franciscoprado_precoparcelado/text_table_pattern';
|
| 15 |
+
|
| 16 |
+
public function isModuleEnabled($moduleName = null) {
|
| 17 |
+
if ((int) Mage::getStoreConfig(self::XML_PATH_ACTIVE, Mage::app()->getStore()) != 1) {
|
| 18 |
+
return false;
|
| 19 |
+
}
|
| 20 |
+
return parent::isModuleEnabled($moduleName);
|
| 21 |
+
}
|
| 22 |
+
|
| 23 |
+
public function showTable($store = null) {
|
| 24 |
+
return Mage::getStoreConfig(self::XML_PATH_SHOW_TABLE, $store);
|
| 25 |
+
}
|
| 26 |
+
|
| 27 |
+
public function getTableTitle($store = null) {
|
| 28 |
+
return Mage::getStoreConfig(self::XML_PATH_TABLE_TITLE, $store);
|
| 29 |
+
}
|
| 30 |
+
|
| 31 |
+
public function showPriceInParcels($store = null) {
|
| 32 |
+
return Mage::getStoreConfig(self::XML_PATH_SHOW_PRICE_IN_PARCELS, $store);
|
| 33 |
+
}
|
| 34 |
+
|
| 35 |
+
public function getMinParcelValue($store = null) {
|
| 36 |
+
return (int) Mage::getStoreConfig(self::XML_PATH_MIN_PARCEL_VALUE, $store);
|
| 37 |
+
}
|
| 38 |
+
|
| 39 |
+
public function getMaxNumberMonths($store = null) {
|
| 40 |
+
return (int) Mage::getStoreConfig(self::XML_PATH_MAX_NUMBER_MONTHS, $store);
|
| 41 |
+
}
|
| 42 |
+
|
| 43 |
+
public function getInterest($store = null) {
|
| 44 |
+
return (int) Mage::getStoreConfig(self::XML_PATH_INTEREST_VALUE, $store);
|
| 45 |
+
}
|
| 46 |
+
|
| 47 |
+
public function useCompound($store = null) {
|
| 48 |
+
return (int) Mage::getStoreConfig(self::XML_PATH_USE_COMPOUND, $store);
|
| 49 |
+
}
|
| 50 |
+
|
| 51 |
+
public function getText($store = null) {
|
| 52 |
+
return Mage::getStoreConfig(self::XML_PATH_TEXT_PATTERN, $store);
|
| 53 |
+
}
|
| 54 |
+
|
| 55 |
+
public function getTableText($store = null) {
|
| 56 |
+
return Mage::getStoreConfig(self::XML_PATH_TABLE_TEXT_PATTERN, $store);
|
| 57 |
+
}
|
| 58 |
+
|
| 59 |
+
public function getSimpleInterest($value, $interest, $parcels) {
|
| 60 |
+
$interest = $interest / 100;
|
| 61 |
+
$m = $value * (1 + $interest * $parcels);
|
| 62 |
+
$parcelValue = $m / $parcels;
|
| 63 |
+
|
| 64 |
+
return $parcelValue;
|
| 65 |
+
}
|
| 66 |
+
|
| 67 |
+
public function getCompoundInterest($value, $interest, $parcels) {
|
| 68 |
+
$interest = $interest / 100;
|
| 69 |
+
$parcelValue = $value * pow((1 + $interest), $parcels);
|
| 70 |
+
$parcelValue = $parcelValue / $parcels;
|
| 71 |
+
|
| 72 |
+
return $parcelValue;
|
| 73 |
+
}
|
| 74 |
+
|
| 75 |
+
public function getPrice($value) {
|
| 76 |
+
if ($this->isModuleEnabled() && $this->showPriceInParcels()) {
|
| 77 |
+
|
| 78 |
+
if ($value > $this->getMinParcelValue()) {
|
| 79 |
+
$finalText = '';
|
| 80 |
+
|
| 81 |
+
for ($i = 2; $i <= $this->getMaxNumberMonths(); $i++) {
|
| 82 |
+
if ($this->useCompound()) {
|
| 83 |
+
$parcel = $this->getCompoundInterest($value, $this->getInterest(), $i);
|
| 84 |
+
} else {
|
| 85 |
+
$parcel = $this->getSimpleInterest($value, $this->getInterest(), $i);
|
| 86 |
+
}
|
| 87 |
+
|
| 88 |
+
if ($parcel >= $this->getMinParcelValue()) {
|
| 89 |
+
$price = Mage::helper('core')->currency($parcel, true, false);
|
| 90 |
+
$replaceText = str_replace('{parcelas}', $i, $this->getText());
|
| 91 |
+
$finalText = str_replace('{preco}', $price, $replaceText);
|
| 92 |
+
}
|
| 93 |
+
}
|
| 94 |
+
|
| 95 |
+
$returnHtml = sprintf('<span class="precoparcelado-parcels">%s</span>', $finalText);
|
| 96 |
+
|
| 97 |
+
return $returnHtml;
|
| 98 |
+
}
|
| 99 |
+
}
|
| 100 |
+
|
| 101 |
+
return null;
|
| 102 |
+
}
|
| 103 |
+
|
| 104 |
+
}
|
app/code/community/FranciscoPrado/PrecoParcelado/etc/config.xml
ADDED
|
@@ -0,0 +1,74 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<?xml version="1.0" encoding="UTF-8"?>
|
| 2 |
+
<config>
|
| 3 |
+
<modules>
|
| 4 |
+
<FranciscoPrado_PrecoParcelado>
|
| 5 |
+
<version>1.0.0.0</version>
|
| 6 |
+
</FranciscoPrado_PrecoParcelado>
|
| 7 |
+
</modules>
|
| 8 |
+
<global>
|
| 9 |
+
<models>
|
| 10 |
+
<franciscoprado_precoparcelado>
|
| 11 |
+
<class>FranciscoPrado_PrecoParcelado_Model</class>
|
| 12 |
+
</franciscoprado_precoparcelado>
|
| 13 |
+
</models>
|
| 14 |
+
<helpers>
|
| 15 |
+
<franciscoprado_precoparcelado>
|
| 16 |
+
<class>FranciscoPrado_PrecoParcelado_Helper</class>
|
| 17 |
+
</franciscoprado_precoparcelado>
|
| 18 |
+
</helpers>
|
| 19 |
+
</global>
|
| 20 |
+
<frontend>
|
| 21 |
+
<layout>
|
| 22 |
+
<updates>
|
| 23 |
+
<franciscoprado_precoparcelado module="franciscoprado_precoparcelado">
|
| 24 |
+
<file>franciscoprado_precoparcelado.xml</file>
|
| 25 |
+
</franciscoprado_precoparcelado>
|
| 26 |
+
</updates>
|
| 27 |
+
</layout>
|
| 28 |
+
<routers>
|
| 29 |
+
<franciscoprado_precoparcelado>
|
| 30 |
+
<use>standard</use>
|
| 31 |
+
<args>
|
| 32 |
+
<module>FranciscoPrado_PrecoParcelado</module>
|
| 33 |
+
<frontName>precoparcelado</frontName>
|
| 34 |
+
</args>
|
| 35 |
+
</franciscoprado_precoparcelado>
|
| 36 |
+
</routers>
|
| 37 |
+
<translate>
|
| 38 |
+
<modules>
|
| 39 |
+
<FranciscoPrado_PrecoParcelado>
|
| 40 |
+
<files>
|
| 41 |
+
<default>FranciscoPrado_PrecoParcelado.csv</default>
|
| 42 |
+
</files>
|
| 43 |
+
</FranciscoPrado_PrecoParcelado>
|
| 44 |
+
</modules>
|
| 45 |
+
</translate>
|
| 46 |
+
</frontend>
|
| 47 |
+
<adminhtml>
|
| 48 |
+
<translate>
|
| 49 |
+
<modules>
|
| 50 |
+
<FranciscoPrado_PrecoParcelado>
|
| 51 |
+
<files>
|
| 52 |
+
<default>FranciscoPrado_PrecoParcelado.csv</default>
|
| 53 |
+
</files>
|
| 54 |
+
</FranciscoPrado_PrecoParcelado>
|
| 55 |
+
</modules>
|
| 56 |
+
</translate>
|
| 57 |
+
</adminhtml>
|
| 58 |
+
<default>
|
| 59 |
+
<sales>
|
| 60 |
+
<franciscoprado_precoparcelado>
|
| 61 |
+
<active>1</active>
|
| 62 |
+
<show_table>1</show_table>
|
| 63 |
+
<table_title>Valor das Parcelas</table_title>
|
| 64 |
+
<show_price_in_parcels>1</show_price_in_parcels>
|
| 65 |
+
<min_quote_value>50</min_quote_value>
|
| 66 |
+
<max_number_months>12</max_number_months>
|
| 67 |
+
<interest_value>1</interest_value>
|
| 68 |
+
<use_compound>1</use_compound>
|
| 69 |
+
<text_pattern>ou em {parcelas} vezes de {preco}</text_pattern>
|
| 70 |
+
<text_table_pattern>{parcelas}x de</text_table_pattern>
|
| 71 |
+
</franciscoprado_precoparcelado>
|
| 72 |
+
</sales>
|
| 73 |
+
</default>
|
| 74 |
+
</config>
|
app/code/community/FranciscoPrado/PrecoParcelado/etc/system.xml
ADDED
|
@@ -0,0 +1,120 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<?xml version="1.0" encoding="UTF-8"?>
|
| 2 |
+
<config>
|
| 3 |
+
<sections>
|
| 4 |
+
<sales module="sales">
|
| 5 |
+
<groups>
|
| 6 |
+
<franciscoprado_precoparcelado>
|
| 7 |
+
<label>Preço Parcelado</label>
|
| 8 |
+
<sort_order>10</sort_order>
|
| 9 |
+
<show_in_default>1</show_in_default>
|
| 10 |
+
<show_in_website>1</show_in_website>
|
| 11 |
+
<show_in_store>1</show_in_store>
|
| 12 |
+
<fields>
|
| 13 |
+
<active>
|
| 14 |
+
<label>Enable</label>
|
| 15 |
+
<sort_order>10</sort_order>
|
| 16 |
+
<frontend_type>select</frontend_type>
|
| 17 |
+
<source_model>adminhtml/system_config_source_yesno</source_model>
|
| 18 |
+
<show_in_default>1</show_in_default>
|
| 19 |
+
<show_in_website>1</show_in_website>
|
| 20 |
+
<show_in_store>0</show_in_store>
|
| 21 |
+
</active>
|
| 22 |
+
<show_price_in_parcels>
|
| 23 |
+
<label>Show Price In Parcels</label>
|
| 24 |
+
<sort_order>20</sort_order>
|
| 25 |
+
<frontend_type>select</frontend_type>
|
| 26 |
+
<source_model>adminhtml/system_config_source_yesno</source_model>
|
| 27 |
+
<show_in_default>1</show_in_default>
|
| 28 |
+
<show_in_website>1</show_in_website>
|
| 29 |
+
<show_in_store>0</show_in_store>
|
| 30 |
+
<comment>
|
| 31 |
+
Ativa a exibição do texto quando inserido no template, usando como base o valor do campo Padrão de Texto.
|
| 32 |
+
</comment>
|
| 33 |
+
</show_price_in_parcels>
|
| 34 |
+
<show_table>
|
| 35 |
+
<label>Show Parcel Table</label>
|
| 36 |
+
<sort_order>30</sort_order>
|
| 37 |
+
<frontend_type>select</frontend_type>
|
| 38 |
+
<source_model>adminhtml/system_config_source_yesno</source_model>
|
| 39 |
+
<show_in_default>1</show_in_default>
|
| 40 |
+
<show_in_website>1</show_in_website>
|
| 41 |
+
<show_in_store>0</show_in_store>
|
| 42 |
+
<comment>
|
| 43 |
+
Exibirá uma tabela com a projeção das parcelas, mês a mês, ao lado do produto.
|
| 44 |
+
</comment>
|
| 45 |
+
</show_table>
|
| 46 |
+
<table_title>
|
| 47 |
+
<label>Table Title</label>
|
| 48 |
+
<frontend_type>text</frontend_type>
|
| 49 |
+
<sort_order>40</sort_order>
|
| 50 |
+
<show_in_default>1</show_in_default>
|
| 51 |
+
<show_in_website>1</show_in_website>
|
| 52 |
+
<show_in_store>0</show_in_store>
|
| 53 |
+
</table_title>
|
| 54 |
+
<min_quote_value>
|
| 55 |
+
<label>Minimal Value of the Parcel</label>
|
| 56 |
+
<frontend_type>text</frontend_type>
|
| 57 |
+
<sort_order>50</sort_order>
|
| 58 |
+
<show_in_default>1</show_in_default>
|
| 59 |
+
<show_in_website>1</show_in_website>
|
| 60 |
+
<show_in_store>0</show_in_store>
|
| 61 |
+
<validate>validate-greater-than-zero</validate>
|
| 62 |
+
</min_quote_value>
|
| 63 |
+
<max_number_months>
|
| 64 |
+
<label>Maximum Number of Months</label>
|
| 65 |
+
<frontend_type>text</frontend_type>
|
| 66 |
+
<sort_order>60</sort_order>
|
| 67 |
+
<show_in_default>1</show_in_default>
|
| 68 |
+
<show_in_website>1</show_in_website>
|
| 69 |
+
<show_in_store>0</show_in_store>
|
| 70 |
+
<validate>validate-greater-than-zero</validate>
|
| 71 |
+
</max_number_months>
|
| 72 |
+
<interest_value>
|
| 73 |
+
<label>Interest Value</label>
|
| 74 |
+
<frontend_type>text</frontend_type>
|
| 75 |
+
<sort_order>70</sort_order>
|
| 76 |
+
<show_in_default>1</show_in_default>
|
| 77 |
+
<show_in_website>1</show_in_website>
|
| 78 |
+
<show_in_store>0</show_in_store>
|
| 79 |
+
<validate>validate-zero-or-greater</validate>
|
| 80 |
+
</interest_value>
|
| 81 |
+
<use_compound>
|
| 82 |
+
<label>Use Compound Interest?</label>
|
| 83 |
+
<sort_order>80</sort_order>
|
| 84 |
+
<frontend_type>select</frontend_type>
|
| 85 |
+
<source_model>adminhtml/system_config_source_yesno</source_model>
|
| 86 |
+
<show_in_default>1</show_in_default>
|
| 87 |
+
<show_in_website>1</show_in_website>
|
| 88 |
+
<show_in_store>0</show_in_store>
|
| 89 |
+
<comment>
|
| 90 |
+
Se Sim, usará fórmula de juros compostos. Se Não, usará a de juros simples.
|
| 91 |
+
</comment>
|
| 92 |
+
</use_compound>
|
| 93 |
+
<text_pattern>
|
| 94 |
+
<label>Text Pattern</label>
|
| 95 |
+
<frontend_type>text</frontend_type>
|
| 96 |
+
<sort_order>90</sort_order>
|
| 97 |
+
<show_in_default>1</show_in_default>
|
| 98 |
+
<show_in_website>1</show_in_website>
|
| 99 |
+
<show_in_store>0</show_in_store>
|
| 100 |
+
<comment>
|
| 101 |
+
Insira {parcelas} para exibir o número de parcelas, e {preco} para exibir o seu valor.
|
| 102 |
+
</comment>
|
| 103 |
+
</text_pattern>
|
| 104 |
+
<text_table_pattern>
|
| 105 |
+
<label>Table Text Pattern</label>
|
| 106 |
+
<frontend_type>text</frontend_type>
|
| 107 |
+
<sort_order>100</sort_order>
|
| 108 |
+
<show_in_default>1</show_in_default>
|
| 109 |
+
<show_in_website>1</show_in_website>
|
| 110 |
+
<show_in_store>0</show_in_store>
|
| 111 |
+
<comment>
|
| 112 |
+
O {parcelas} é necessário e substituirá pela quantidade de parcelas na apresentação.
|
| 113 |
+
</comment>
|
| 114 |
+
</text_table_pattern>
|
| 115 |
+
</fields>
|
| 116 |
+
</franciscoprado_precoparcelado>
|
| 117 |
+
</groups>
|
| 118 |
+
</sales>
|
| 119 |
+
</sections>
|
| 120 |
+
</config>
|
app/design/frontend/base/default/layout/franciscoprado_precoparcelado.xml
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<?xml version="1.0"?>
|
| 2 |
+
<layout version="0.1.0">
|
| 3 |
+
<catalog_product_view>
|
| 4 |
+
<reference name="head">
|
| 5 |
+
<action method="addItem">
|
| 6 |
+
<type>skin_css</type>
|
| 7 |
+
<script>css/precoparcelado.css</script>
|
| 8 |
+
<params><![CDATA[media="all"]]></params>
|
| 9 |
+
</action>
|
| 10 |
+
</reference>
|
| 11 |
+
<reference name="head">
|
| 12 |
+
<action method="addItem">
|
| 13 |
+
<type>skin_js</type>
|
| 14 |
+
<script>js/precoparcelado.js</script>
|
| 15 |
+
<params><![CDATA[name="precoparcelado"]]></params>
|
| 16 |
+
</action>
|
| 17 |
+
</reference>
|
| 18 |
+
<reference name="product.info.extrahint">
|
| 19 |
+
<block type="core/template" name="precoparcelado.table" template="precoparcelado/table.phtml" before="-" />
|
| 20 |
+
</reference>
|
| 21 |
+
<reference name="content">
|
| 22 |
+
<block type="core/template" name="precoparcelado.jsdata" template="precoparcelado/jsdata.phtml" before="-" />
|
| 23 |
+
</reference>
|
| 24 |
+
</catalog_product_view>
|
| 25 |
+
</layout>
|
app/design/frontend/base/default/template/precoparcelado/jsdata.phtml
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<?php
|
| 2 |
+
|
| 3 |
+
/* Suporte JS para preços configuráveis */
|
| 4 |
+
|
| 5 |
+
$helper = Mage::helper('franciscoprado_precoparcelado');
|
| 6 |
+
$isActive = $helper->isModuleEnabled();
|
| 7 |
+
$showTable = $helper->showTable();
|
| 8 |
+
$minParcel = Mage::helper('franciscoprado_precoparcelado')->getMinParcelValue();
|
| 9 |
+
$maxNumberMonths = Mage::helper('franciscoprado_precoparcelado')->getMaxNumberMonths();
|
| 10 |
+
$useCompound = Mage::helper('franciscoprado_precoparcelado')->useCompound();
|
| 11 |
+
$interest = Mage::helper('franciscoprado_precoparcelado')->getInterest();
|
| 12 |
+
$text = Mage::helper('franciscoprado_precoparcelado')->getText();
|
| 13 |
+
$tableText = Mage::helper('franciscoprado_precoparcelado')->getTableText();
|
| 14 |
+
|
| 15 |
+
if ($isActive): ?>
|
| 16 |
+
<script>
|
| 17 |
+
/* preco parcelado */
|
| 18 |
+
var showTable = <?php echo $showTable ? 'true' : 'false'; ?>;
|
| 19 |
+
var minParcel = <?php echo $minParcel ?>;
|
| 20 |
+
var maxNumberMonths = <?php echo $maxNumberMonths ?>;
|
| 21 |
+
var useCompound = <?php echo $useCompound ? 'true' : 'false' ?>;
|
| 22 |
+
var interest = <?php echo $interest ?>;
|
| 23 |
+
var ppText = '<?php echo $text ?>';
|
| 24 |
+
var ppTableText = '<?php echo $tableText ?>';
|
| 25 |
+
var ppId = '<?php echo Mage::registry('current_product')->getId() ?>';
|
| 26 |
+
</script>
|
| 27 |
+
<?php endif; ?>
|
app/design/frontend/base/default/template/precoparcelado/table.phtml
ADDED
|
@@ -0,0 +1,48 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<?php
|
| 2 |
+
|
| 3 |
+
$helper = Mage::helper('franciscoprado_precoparcelado');
|
| 4 |
+
$isActive = $helper->isModuleEnabled();
|
| 5 |
+
$showTable = $helper->showTable();
|
| 6 |
+
|
| 7 |
+
if ($isActive && $showTable):
|
| 8 |
+
$maxNumberMonths = $helper->getMaxNumberMonths();
|
| 9 |
+
$minParcelValue = $helper->getMinParcelValue();
|
| 10 |
+
$interest = $helper->getInterest();
|
| 11 |
+
$productPrice = Mage::registry('current_product')->getPrice();
|
| 12 |
+
|
| 13 |
+
?>
|
| 14 |
+
<table class="precoparcelado-table">
|
| 15 |
+
<thead>
|
| 16 |
+
<tr>
|
| 17 |
+
<th colspan="2"><?php echo $helper->getTableTitle() ?></th>
|
| 18 |
+
</tr>
|
| 19 |
+
</thead>
|
| 20 |
+
<tbody>
|
| 21 |
+
<?php
|
| 22 |
+
if ($productPrice > $minParcelValue):
|
| 23 |
+
for ($i = 2; $i <= $maxNumberMonths; $i++):
|
| 24 |
+
|
| 25 |
+
if ($helper->useCompound()):
|
| 26 |
+
$parcel = $helper->getCompoundInterest($productPrice, $interest, $i);
|
| 27 |
+
else:
|
| 28 |
+
$parcel = $helper->getSimpleInterest($productPrice, $interest, $i);
|
| 29 |
+
endif;
|
| 30 |
+
|
| 31 |
+
$tableText = str_replace('{parcelas}', $i, $helper->getTableText());
|
| 32 |
+
$parcelPrice = Mage::helper('core')->currency($parcel, true, false);
|
| 33 |
+
|
| 34 |
+
if ($parcel >= $minParcelValue):
|
| 35 |
+
?>
|
| 36 |
+
<tr>
|
| 37 |
+
<td><?php echo $tableText ?></td>
|
| 38 |
+
<td><?php echo $parcelPrice ?></td>
|
| 39 |
+
<tr>
|
| 40 |
+
<?php
|
| 41 |
+
endif;
|
| 42 |
+
endfor;
|
| 43 |
+
endif;
|
| 44 |
+
?>
|
| 45 |
+
</tbody>
|
| 46 |
+
</table>
|
| 47 |
+
<?php
|
| 48 |
+
endif;
|
app/etc/modules/FranciscoPrado_PrecoParcelado.xml
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<?xml version="1.0" encoding="UTF-8"?>
|
| 2 |
+
<config>
|
| 3 |
+
<modules>
|
| 4 |
+
<FranciscoPrado_PrecoParcelado>
|
| 5 |
+
<active>true</active>
|
| 6 |
+
<codePool>community</codePool>
|
| 7 |
+
</FranciscoPrado_PrecoParcelado>
|
| 8 |
+
</modules>
|
| 9 |
+
</config>
|
app/locale/pt_BR/FranciscoPrado_PrecoParcelado.csv
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
"Parcels Value", "Valor das Parcelas"
|
| 2 |
+
"Show Parcel Table", "Mostrar Tabela de Parcelas"
|
| 3 |
+
"Table Title", "Título da Tabela"
|
| 4 |
+
"Show Price In Parcels", "Mostrar Preço em Parcela"
|
| 5 |
+
"Minimal Value of the Parcel", "Valor Mínimo da Parcela"
|
| 6 |
+
"Maximum Number of Months", "Número Máximo de Meses"
|
| 7 |
+
"Interest Value", "Valor do Juros"
|
| 8 |
+
"Use Compound Interest?", "Usar Juros Compostos?"
|
| 9 |
+
"Text Pattern", "Padrão do Texto"
|
| 10 |
+
"Table Text Pattern", "Padrão do Texto da Tabela"
|
package.xml
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<?xml version="1.0"?>
|
| 2 |
+
<package>
|
| 3 |
+
<name>FranciscoPrado_PrecoParcelado</name>
|
| 4 |
+
<version>1.0.0.0</version>
|
| 5 |
+
<stability>stable</stability>
|
| 6 |
+
<license>OSL v3.0</license>
|
| 7 |
+
<channel>community</channel>
|
| 8 |
+
<extends/>
|
| 9 |
+
<summary>Extensão para exibir o preço do produto em parcelas.</summary>
|
| 10 |
+
<description>Extensão para exibir o preço do produto em parcelas. É possível alterar a configuração, como o tipo de exibição (em tabelas e ao lado do preço), taxa de juros, fórmula de juros, valor mínimo da parcela, número de meses, entre outros.</description>
|
| 11 |
+
<notes>Primeira versão do módulo Preço Parcelado.</notes>
|
| 12 |
+
<authors><author><name>Francisco Prado</name><user>fr_prado</user><email>franciscontato@gmail.com</email></author></authors>
|
| 13 |
+
<date>2014-07-18</date>
|
| 14 |
+
<time>18:49:07</time>
|
| 15 |
+
<contents><target name="magecommunity"><dir name="FranciscoPrado"><dir name="PrecoParcelado"><dir name="Helper"><file name="Data.php" hash="16d18971431f3704effdcb7169b996a9"/></dir><dir name="etc"><file name="config.xml" hash="c070d790f9c5c3dd0ac5e5d02fa3fcfb"/><file name="system.xml" hash="c1fe5af2a805155827a2d2e25c1d2ce4"/></dir></dir></dir></target><target name="magedesign"><dir name="frontend"><dir name="base"><dir name="default"><dir name="layout"><file name="franciscoprado_precoparcelado.xml" hash="87ff7075401208ff78a9d8bc115a9970"/></dir><dir name="template"><dir name="precoparcelado"><file name="jsdata.phtml" hash="dc3f3dcd822fb2389324eae6e23cccc2"/><file name="table.phtml" hash="5375174d15dc910bf48cff5f55c88eed"/></dir></dir></dir></dir></dir></target><target name="mageetc"><dir name="modules"><file name="FranciscoPrado_PrecoParcelado.xml" hash="ff2352dd5dcf370b98b77782ac230e5f"/></dir></target><target name="magelocale"><dir name="pt_BR"><file name="FranciscoPrado_PrecoParcelado.csv" hash="aa2537735fc8e2225a78db58767e719a"/></dir></target><target name="mageskin"><dir name="frontend"><dir name="base"><dir name="default"><dir name="css"><file name="precoparcelado.css" hash="8b127443908efc0529ff9953e4d1402e"/></dir><dir name="js"><file name="precoparcelado.js" hash="de65fa886a758dfb00caafba5b577bed"/></dir></dir></dir></dir></target></contents>
|
| 16 |
+
<compatible/>
|
| 17 |
+
<dependencies><required><php><min>5.2.0</min><max>6.0.0</max></php></required></dependencies>
|
| 18 |
+
</package>
|
skin/frontend/base/default/css/precoparcelado.css
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
.precoparcelado-table {
|
| 2 |
+
width: 200px;
|
| 3 |
+
}
|
| 4 |
+
|
| 5 |
+
.precoparcelado-table thead th {
|
| 6 |
+
border: solid 1px;
|
| 7 |
+
text-align: center;
|
| 8 |
+
}
|
| 9 |
+
|
| 10 |
+
.precoparcelado-table tbody td {
|
| 11 |
+
border: solid 1px;
|
| 12 |
+
}
|
skin/frontend/base/default/js/precoparcelado.js
ADDED
|
@@ -0,0 +1,85 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
$pp = jQuery.noConflict();
|
| 2 |
+
|
| 3 |
+
$pp(document).ready(function() {
|
| 4 |
+
|
| 5 |
+
Number.prototype.formatMoney = function(c, d, t) {
|
| 6 |
+
var n = this,
|
| 7 |
+
c = isNaN(c = Math.abs(c)) ? 2 : c,
|
| 8 |
+
d = d == undefined ? "." : d,
|
| 9 |
+
t = t == undefined ? "," : t,
|
| 10 |
+
s = n < 0 ? "-" : "",
|
| 11 |
+
i = parseInt(n = Math.abs(+n || 0).toFixed(c)) + "",
|
| 12 |
+
j = (j = i.length) > 3 ? j % 3 : 0;
|
| 13 |
+
|
| 14 |
+
return s + (j ? i.substr(0, j) + t : "") + i.substr(j).replace(/(\d{3})(?=\d)/g, "$1" + t) + (c ? d + Math.abs(n - i).toFixed(c).slice(2) : "");
|
| 15 |
+
};
|
| 16 |
+
|
| 17 |
+
var getSimpleInterest = function(value, interest, parcels) {
|
| 18 |
+
interest = interest / 100;
|
| 19 |
+
var m = value * (1 + interest * parcels);
|
| 20 |
+
var parcelValue = m / parcels;
|
| 21 |
+
|
| 22 |
+
return parcelValue;
|
| 23 |
+
};
|
| 24 |
+
|
| 25 |
+
var getCompoundInterest = function(value, interest, parcels) {
|
| 26 |
+
interest = interest / 100;
|
| 27 |
+
var parcelValue = value * Math.pow((1 + interest), parcels);
|
| 28 |
+
var parcelValue = parcelValue / parcels;
|
| 29 |
+
|
| 30 |
+
return parcelValue;
|
| 31 |
+
};
|
| 32 |
+
|
| 33 |
+
var getPrice = function(value) {
|
| 34 |
+
if (value > minParcel) {
|
| 35 |
+
var finalText = '';
|
| 36 |
+
var ppDecimalSymbol = optionsPrice.priceFormat.decimalSymbol;
|
| 37 |
+
var ppCurrencyFormat = optionsPrice.priceFormat.pattern.replace('%s', '');
|
| 38 |
+
var ppGroupSymbol = optionsPrice.priceFormat.groupSymbol;
|
| 39 |
+
var finalText = '';
|
| 40 |
+
var tableText = '';
|
| 41 |
+
|
| 42 |
+
for (var i = 2; i <= maxNumberMonths; i++) {
|
| 43 |
+
var parcel = 0;
|
| 44 |
+
|
| 45 |
+
if (useCompound) {
|
| 46 |
+
parcel = getCompoundInterest(value, interest, i);
|
| 47 |
+
} else {
|
| 48 |
+
parcel = getSimpleInterest(value, interest, i);
|
| 49 |
+
}
|
| 50 |
+
|
| 51 |
+
if (parcel >= minParcel) {
|
| 52 |
+
var parcelToCurrency = ppCurrencyFormat + (parcel).formatMoney(2, ppDecimalSymbol, ppGroupSymbol);
|
| 53 |
+
finalText = ppText.replace('{preco}', parcelToCurrency);
|
| 54 |
+
finalText = finalText.replace('{parcelas}', i);
|
| 55 |
+
|
| 56 |
+
if (showTable) {
|
| 57 |
+
tableText += '<tr>';
|
| 58 |
+
tableText += '<td>' + ppTableText.replace('{parcelas}', i) + '</td>';
|
| 59 |
+
tableText += '<td>' + parcelToCurrency + '</td>';
|
| 60 |
+
tableText += '</tr>';
|
| 61 |
+
}
|
| 62 |
+
}
|
| 63 |
+
}
|
| 64 |
+
|
| 65 |
+
$pp('.precoparcelado-parcels').html(finalText);
|
| 66 |
+
$pp('.precoparcelado-table tbody').html(tableText);
|
| 67 |
+
}
|
| 68 |
+
|
| 69 |
+
return null;
|
| 70 |
+
};
|
| 71 |
+
|
| 72 |
+
var onPriceChange = function(e) {
|
| 73 |
+
var ppTotalPrice = $pp('#product-price-' + ppId + ' span').html();
|
| 74 |
+
var ppCurrencyFormat = optionsPrice.priceFormat.pattern.replace('%s', '');
|
| 75 |
+
var ppDecimalSymbol = optionsPrice.priceFormat.decimalSymbol;
|
| 76 |
+
var ppGroupSymbol = optionsPrice.priceFormat.groupSymbol;
|
| 77 |
+
var ppCurrent = new Number(
|
| 78 |
+
ppTotalPrice.replace(ppCurrencyFormat, '').replace(ppDecimalSymbol, '.').replace(ppGroupSymbol, ''));
|
| 79 |
+
|
| 80 |
+
getPrice(ppCurrent);
|
| 81 |
+
};
|
| 82 |
+
|
| 83 |
+
$pp('*[name^=super_attribute], *[name^=options]').on('change', onPriceChange);
|
| 84 |
+
|
| 85 |
+
});
|
