Chaordic_Base - Version 1.0.0

Version Notes

Versão com suporte a recursos do produto Onsite e Search:
- Integração do Loader Chaordic.
- Integração dos modelos de dados de produtos, categorias, carrinho, transações e usuários.
- Página de modelo Search.

Download this release

Release Info

Developer Chaordic
Extension Chaordic_Base
Version 1.0.0
Comparing to
See all releases


Version 1.0.0

app/code/community/Chaordic/.DS_Store ADDED
Binary file
app/code/community/Chaordic/.gitignore ADDED
@@ -0,0 +1 @@
 
1
+ !*
app/code/community/Chaordic/Base/.DS_Store ADDED
Binary file
app/code/community/Chaordic/Base/Block/Loader.php ADDED
@@ -0,0 +1,27 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * @category Chaordic
4
+ * @package Chaordic_Base
5
+ * @version 1.0.0
6
+ * @copyright Copyright (c) 2014 Chaordic Systems (http://www.chaordicsystems.com)
7
+ */
8
+
9
+ class Chaordic_Base_Block_Loader extends Mage_Core_Block_Template
10
+ {
11
+ public function _toHtml()
12
+ {
13
+ if (! Mage::helper('chaordic_base')->enabled()) {
14
+ return null;
15
+ }
16
+
17
+ $apiKey = Mage::helper('chaordic_base')->getApiKey();
18
+
19
+ return sprintf(
20
+ '<script async defer src="%1$s" data-apikey="%2$s"></script>',
21
+ '//static.chaordicsystems.com/static/loader.js',
22
+ $apiKey
23
+ );
24
+ }
25
+ }
26
+
27
+ ?>
app/code/community/Chaordic/Base/Block/Meta.php ADDED
@@ -0,0 +1,69 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * @category Chaordic
4
+ * @package Chaordic_Base
5
+ * @version 1.0.0
6
+ * @copyright Copyright (c) 2014 Chaordic Systems (http://www.chaordicsystems.com)
7
+ */
8
+
9
+ class Chaordic_Base_Block_Meta extends Mage_Core_Block_Template
10
+ {
11
+ private $model;
12
+
13
+ public function routeModel()
14
+ {
15
+ if (! Mage::helper('chaordic_base')->enabled()) {
16
+ return null;
17
+ }
18
+
19
+ $context = $this->getData('context');
20
+ $modelProps = null;
21
+
22
+ switch ($context) {
23
+ case 'user':
24
+ $modelProps = Chaordic_Base_Model_User::getRouteProps();
25
+ break;
26
+
27
+ case 'customer':
28
+ $modelProps = Chaordic_Base_Model_Customer::getRouteProps();
29
+ break;
30
+
31
+ case 'cms_page':
32
+ case 'home':
33
+ $modelProps = Chaordic_Base_Model_Cms::getRouteProps();
34
+ break;
35
+
36
+ case 'catalog':
37
+ $modelProps = Chaordic_Base_Model_Catalog::getRouteProps();
38
+ break;
39
+
40
+ case 'product':
41
+ $modelProps = Chaordic_Base_Model_Product::getRouteProps();
42
+ break;
43
+
44
+ case 'cart':
45
+ case 'checkout':
46
+ case 'confirmation':
47
+ $modelProps = Chaordic_Base_Model_Checkout::getRouteProps($context);
48
+ break;
49
+
50
+ case 'search':
51
+ $modelProps = Chaordic_Base_Model_Search::getRouteProps();
52
+ break;
53
+
54
+ case 'customer':
55
+ $modelProps = Chaordic_Base_Model_Customer::getRouteProps();
56
+ break;
57
+ }
58
+
59
+ if ( ! empty($modelProps) ) {
60
+ $meta = Mage::getSingleton('chaordic_base/meta');
61
+ foreach ($modelProps as $key => $value) {
62
+ $meta->addProp($key, $value);
63
+ }
64
+ }
65
+ }
66
+
67
+ }
68
+
69
+ ?>
app/code/community/Chaordic/Base/Helper/Data.php ADDED
@@ -0,0 +1,224 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * @category Chaordic
4
+ * @package Chaordic_Base
5
+ * @version 1.0.0
6
+ * @copyright Copyright (c) 2014 Chaordic Systems (http://www.chaordicsystems.com)
7
+ */
8
+
9
+ class Chaordic_Base_Helper_Data extends Mage_Core_Helper_Abstract
10
+ {
11
+
12
+ const DEFAULT_INSTALLMENT_COUNT = 6;
13
+ const DEFAULT_INSTALLMENT_PRICE = 20;
14
+
15
+ public function enabled()
16
+ {
17
+ $apiKey = Mage::helper('chaordic_base')->getApiKey();
18
+ if (empty($apiKey)) {
19
+ return false;
20
+ }
21
+
22
+ return true;
23
+ }
24
+
25
+ public function setConfig($path, $value)
26
+ {
27
+ $model = Mage::getModel('core/config');
28
+ return $model->saveConfig($path, $value);
29
+ }
30
+
31
+ public function getApikey()
32
+ {
33
+ $config = Mage::getStoreConfig('chaordic_base/options/api_key');
34
+
35
+ if (empty($config)) {
36
+ return null;
37
+ }
38
+
39
+ return $config;
40
+ }
41
+
42
+ public function getSecretKey()
43
+ {
44
+ $config = Mage::getStoreConfig('chaordic_onsite/options/secret_key');
45
+
46
+ if (empty($config)) {
47
+ return null;
48
+ }
49
+
50
+ return $config;
51
+ }
52
+
53
+ public function getMaxInstallmentCount()
54
+ {
55
+ $config = Mage::getStoreConfig('chaordic_base/methods/installment_count');
56
+
57
+ if (empty($config)) {
58
+ $config = Mage::helper('chaordic_base/helper')->DEFAULT_INSTALLMENT_COUNT;
59
+ Mage::setStoreConfig('chaordic_base/methods/installment_count', $config);
60
+ }
61
+
62
+ return $config;
63
+ }
64
+
65
+ public function getMinInstallmentPrice()
66
+ {
67
+ $config = Mage::getStoreConfig('chaordic_base/methods/installment_price');
68
+
69
+ if (empty($config)) {
70
+ $config = Mage::helper('chaordic_base/helper')->DEFAULT_INSTALLMENT_PRICE;
71
+ Mage::setStoreConfig('chaordic_base/methods/installment_price', $config);
72
+ }
73
+
74
+ return $config;
75
+ }
76
+
77
+ /**
78
+ * Recebe um código de método de pagamento e retorna o nome da forma
79
+ * de pagamento para a integração.
80
+ * @param [type] $method [description]
81
+ * @return [type] [description]
82
+ */
83
+ public function getPaymentMethodRelation($method)
84
+ {
85
+ $paymentMethods = Mage::getSingleton('payment/config')->getActiveMethods();
86
+ $chaordicMethods = array(
87
+ 'bankslip' => 'Bank Slip',
88
+ 'creditcard' => 'Credit Card',
89
+ 'bankdeposit' => 'Bank Deposit',
90
+ 'money' => 'Money',
91
+ 'onlinepayment' => 'Online Payment',
92
+ 'directdebit' => 'Direct Debit'
93
+ );
94
+
95
+ $methodName = null;
96
+
97
+ foreach ($chaordicMethods as $chaordicMethod => $title) {
98
+ $config = Mage::getStoreConfig('chaordic_base/methods/'.$chaordicMethod);
99
+
100
+ // Config for $method is not set
101
+ if (empty($config)) {
102
+ continue;
103
+ }
104
+
105
+ if (in_array($method, explode(',', $config))) {
106
+ $methodName = $title;
107
+ break;
108
+ }
109
+ }
110
+
111
+ return (!empty($methodName)) ? $methodName : 'Not Set';
112
+ }
113
+
114
+ /**
115
+ * Retorna o ID da página de referência para o produto Search
116
+ * @return [type] [description]
117
+ */
118
+ public function getSearchPageId()
119
+ {
120
+ $config = Mage::getStoreConfig('chaordic_base/search/pageid');
121
+ return $config;
122
+ }
123
+
124
+ public function setSearchPageId($id)
125
+ {
126
+ self::setConfig('chaordic_base/search/pageid', $id);
127
+ return $id;
128
+ }
129
+
130
+ /**
131
+ * Retorna lista de códigos de atributos relacionados a um set de atributos.
132
+ */
133
+ public function getCustomSetAttributes($attributeSetId)
134
+ {
135
+ // Carrega os atributos do set padrão.
136
+ $defaultSetId = Mage::getModel('catalog/product')->getDefaultAttributeSetId();
137
+ $defaultSetAttributes = array_map(function($at) {
138
+ return $at['code'];
139
+ }, Mage::getModel('catalog/product_attribute_api')->items($defaultSetId));
140
+
141
+ // Retorna os atributos do set, excluindo os atributos padrão.
142
+ return array_map(function($attr) {
143
+ if (!in_array($attr['code'], $defaultSetAttributes)) {
144
+ return $attr['code'];
145
+ }
146
+ }, Mage::getModel('catalog/product_attribute_api')->items($attributeSetId));
147
+ }
148
+
149
+ public function float($number, $decimal=2)
150
+ {
151
+ return (float) number_format($number, $decimal, '.', '');
152
+ }
153
+
154
+ public function protocol($url)
155
+ {
156
+ return str_replace(array('http:', 'https:'), '', $url);
157
+ }
158
+
159
+ public function date($str, $format='d/m/Y')
160
+ {
161
+ return date($format, strtotime($str));
162
+ }
163
+
164
+ public function locale()
165
+ {
166
+ $lang = null;
167
+ $header = $_SERVER['HTTP_ACCEPT_LANGUAGE'];
168
+
169
+ /**
170
+ * Se o cabeçalho ACCEPT_LANGUAGE não for informado não podemos
171
+ * determinar a língua preferida.
172
+ */
173
+ if (empty($header)) {
174
+ $lang = null;
175
+
176
+ /**
177
+ * Utiliza a classe Locale do pacote intl para determinar
178
+ * a língua preferida do usuário.
179
+ */
180
+ } elseif (class_exists('Locale')) {
181
+ $lang = Locale::acceptFromHttp($header);
182
+
183
+ /**
184
+ * Por padrão retorna a primeira representação encontrada no
185
+ * cabeçalho. Não é o procedimento ideal, mas como fallback serve,
186
+ * pois retornará a primeira língua da lista de linguagens aceitas.
187
+ */
188
+ } else {
189
+ $langs = explode(',', $header);
190
+ $lang = (!empty($langs[0])) ? $langs[0] : null;
191
+ }
192
+
193
+ return $lang;
194
+ }
195
+
196
+ public function remote($remote, $params)
197
+ {
198
+ $baseUrl = Mage::getBaseUrl(Mage_Core_Model_Store::URL_TYPE_WEB);
199
+ $urlFormat = $baseUrl . 'index.php/chaordic/remote/%s/?%s';
200
+
201
+ return self::protocol(sprintf($urlFormat, $remote, http_build_query($params, '', '&amp;')));
202
+ }
203
+
204
+
205
+ /**
206
+ * Cria a página de referência para o produto Search.
207
+ * @return [type] [description]
208
+ */
209
+ public function createSearchPage()
210
+ {
211
+ $data = array(
212
+ 'title' => 'Chaordic Systems search page template',
213
+ 'root_template' => 'one_column',
214
+ 'identifier' => 'chaordic_search_page',
215
+ 'stores' => array(0),
216
+ 'content' => '<div id="chaordic_search_block"></div>'
217
+ );
218
+
219
+ $page = Mage::getModel('cms/page')->setData($data)->save();
220
+
221
+ return $page->getId();
222
+ }
223
+
224
+ }
app/code/community/Chaordic/Base/Model/Catalog.php ADDED
@@ -0,0 +1,116 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * @category Chaordic
4
+ * @package Chaordic_Base
5
+ * @version 1.0.0
6
+ * @copyright Copyright (c) 2014 Chaordic Systems (http://www.chaordicsystems.com)
7
+ */
8
+
9
+ class Chaordic_Base_Model_Catalog
10
+ {
11
+ public function getRouteProps()
12
+ {
13
+ $helper = Mage::helper('chaordic_base');
14
+ $categories = array();
15
+
16
+ /**
17
+ * Identificamos a categoria atual, para a partir dela coletarmos
18
+ * informações das categorias pai.
19
+ * @var integer
20
+ */
21
+ $category = Mage::registry('current_category');
22
+ $categories = self::getCategoryTree($category->getEntityId(), 'immediate');
23
+
24
+ /**
25
+ * Matriz de informações da categoria para composição
26
+ * da Chaordic Meta.
27
+ * @var array
28
+ */
29
+ $catalog = array(
30
+ 'name' => 'category'
31
+ , 'timestamp' => $helper->date('now', 'r')
32
+ , 'categories' => $categories
33
+ );
34
+
35
+ return array( 'page'=>$catalog );
36
+ }
37
+
38
+ /**
39
+ * Retorna árvore de categorias de uma determinada categoria
40
+ * @param integer $categoryId ID da categoria
41
+ * @param string $deep all para todas, immediate para os parents imediatos
42
+ * @return array
43
+ */
44
+ public function getCategoryTree($categoryId, $deep='all')
45
+ {
46
+ $_category = Mage::getModel('catalog/category')->load($categoryId);
47
+ $categories = array();
48
+
49
+ // root category
50
+ $rootCategory = Mage::getModel('catalog/category')->load(
51
+ Mage::app()->getStore()->getRootCategoryId()
52
+ );
53
+
54
+ /**
55
+ * Adiciona a Root Category ao retorno.
56
+ *
57
+ * Até a versão 0.8.1 a Root aparecia no retorno.
58
+ * A partir da versão 0.8.2 omitimos a root category. Omitimos também
59
+ * o parent da categoria que possuir a root category como parent.
60
+ */
61
+ // if (! empty($rootCategory)) {
62
+ // array_push($categories, array(
63
+ // 'name' => $rootCategory->getName()
64
+ // , 'id' => $rootCategory->getEntityId()
65
+ // ));
66
+ // } else {
67
+ // return;
68
+ // }
69
+
70
+ if (! empty($rootCategory)) {
71
+ $rootCategoryId = $rootCategory->getEntityId();
72
+ } else {
73
+ return null;
74
+ }
75
+
76
+ if ( ! empty($_category) ) {
77
+ $parents = $_category->getParentCategories();
78
+ foreach ($parents as $_parent) {
79
+ $parent = array(
80
+ 'name' => $_parent->getName()
81
+ , 'id' => $_parent->getEntityId()
82
+ );
83
+
84
+ /**
85
+ * Informa toda a árvore de parents até a categoria root.
86
+ */
87
+ if ($deep == 'all') {
88
+ $parentParents = $_parent->getParentCategories();
89
+ if ( ! empty($parentParents) ) {
90
+ foreach ($parentParents as $pp) {
91
+ if ($pp->getEntityId() != $parent['id']) {
92
+ $parent['parents'][] = $pp->getEntityId();
93
+ }
94
+ }
95
+ }
96
+
97
+ /**
98
+ * Informa apenas a categoria pai imediata
99
+ */
100
+ } elseif ($deep == 'immediate') {
101
+ $_parentId = $_parent->getParentId();
102
+
103
+ // Omite o índice parents se este for a Root Category
104
+ if ($_parentId != $rootCategoryId) {
105
+ $parent['parents'] = array($_parentId);
106
+ }
107
+ }
108
+
109
+ array_push($categories, $parent);
110
+ }
111
+ }
112
+
113
+ return $categories;
114
+ }
115
+
116
+ }
app/code/community/Chaordic/Base/Model/Checkout.php ADDED
@@ -0,0 +1,289 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * @category Chaordic
4
+ * @package Chaordic_Base
5
+ * @version 1.0.0
6
+ * @copyright Copyright (c) 2014 Chaordic Systems (http://www.chaordicsystems.com)
7
+ */
8
+
9
+ class Chaordic_Base_Model_Checkout
10
+ {
11
+ public function getRouteProps($context=null)
12
+ {
13
+ $helper = Mage::helper('chaordic_base');
14
+ $props = array();
15
+
16
+ /**
17
+ * Chama o método correspondente ao contexto informado na definição
18
+ * dos blocos em chaordic_onsite.xml.
19
+ */
20
+ switch ($context) {
21
+ case "cart":
22
+ $props['cart'] = self::cartRoute();
23
+ // $props['transaction'] = self::confirmationRoute("100000010");
24
+ break;
25
+
26
+ case "checkout":
27
+ break;
28
+
29
+ case "confirmation":
30
+ $props['transaction'] = self::confirmationRoute();
31
+ break;
32
+ }
33
+
34
+ /**
35
+ * Informações padrão da página
36
+ */
37
+ $props['page'] = array(
38
+ 'name' => $context,
39
+ 'timestamp' => $helper->date('now', 'r')
40
+ );
41
+
42
+ return $props;
43
+ }
44
+
45
+ /**
46
+ * Processa as informações da rota cart.
47
+ * @return void
48
+ */
49
+ public function cartRoute()
50
+ {
51
+ $helper = Mage::helper('chaordic_base');
52
+ $items = array();
53
+
54
+ // $quote = $this->_getModel('sales/quote')->loadByIdWithoutStore($quoteId);
55
+ // $cart = $this->_getModel('comprasecundaria/cart')->setQuote($quote)->getQuote();
56
+
57
+ /**
58
+ * Carrega model do carrinho da sessão.
59
+ */
60
+ $session = Mage::getSingleton('checkout/session');
61
+ $quote = $session->getQuote();
62
+ $cartId = $session->getQuoteId();
63
+ $cartItems = $quote->getAllVisibleItems();
64
+
65
+ $items = self::getCartItemsList($cartItems);
66
+
67
+ return array(
68
+ 'id' => $cartId
69
+ , 'items' => $items
70
+ );
71
+
72
+ }
73
+
74
+ public function confirmationRoute($orderId=null)
75
+ {
76
+ $helper = Mage::helper('chaordic_base');
77
+ $transaction = array();
78
+
79
+ /**
80
+ * Identificamos a compra que acabou de ser feita, para então
81
+ * carregarmos todos os dados relacionados a ela.
82
+ */
83
+ if ($orderId === null) {
84
+ $orderId = Mage::getSingleton('checkout/session')->getLastRealOrderId();
85
+ }
86
+
87
+ $order = Mage::getModel('sales/order')->loadByIncrementId($orderId);
88
+ $orderData = $order->getData();
89
+
90
+ $payment = $order->getPayment();
91
+ $paymentData = $payment->getData();
92
+ $paymentAdditionalInfo = $payment->getAdditionalInformation();
93
+
94
+ $shipmentCollection = $order->getShipmentsCollection();
95
+
96
+ /**
97
+ * Order items.
98
+ */
99
+ $orderItems = $order->getAllVisibleItems();
100
+ $items = self::getCartItemsList($orderItems);
101
+
102
+ /**
103
+ * Order payment.
104
+ */
105
+ $orderCurrencyCode = $orderData['base_currency_code'];
106
+ $orderPaymentType = $helper->getPaymentMethodRelation($paymentData['method']);
107
+
108
+ /**
109
+ * Informações do tipo podem e vão variar conforme o método de pagamento
110
+ * selecionado. Não vejo outra forma senão programar os métodos de captura
111
+ * dessas informações para cada método conhecido. Caso algum cliente utilize
112
+ * um método diferente, teremos que atualizar o módulo para suportar o mesmo.
113
+ */
114
+ $orderInstallmentCount = 1;
115
+
116
+ /**
117
+ * Order prices.
118
+ */
119
+ $orderTotalPrice = $helper->float($orderData['grand_total'], 2);
120
+ $orderDiscount = $helper->float($orderData['discount_amount'], 2);
121
+ $orderServices = 0.00; // Como identificar? Quais serviços?
122
+
123
+ /**
124
+ * Order Shipping
125
+ */
126
+ $orderTrackingNumbers = array();
127
+ foreach ($shipmentCollection as $shipment) {
128
+ foreach ($shipment->getAllTracks() as $track) {
129
+ array_push($orderTrackingNumbers, $track->getNumber());
130
+ }
131
+ }
132
+
133
+ $orderShipping = array(
134
+ 'costs' => $helper->float($orderData['shipping_amount'])
135
+ // , 'method' => $orderData['shipping_description']
136
+ // , 'delivery_date' => '' // Informação futura, como informar?
137
+ // , 'tracking' => implode(', ', $orderTrackingNumbers)
138
+ );
139
+
140
+ /**
141
+ * Order Signature
142
+ */
143
+ $orderSignature = self::transactionSignature($orderId, $items);
144
+
145
+ return array(
146
+ 'id' => $orderId
147
+ , 'installment_count' => $orderInstallmentCount
148
+ , 'shipping' => $orderShipping
149
+ , 'services' => $orderServices
150
+ , 'discount' => $orderDiscount
151
+ , 'payment_type' => $orderPaymentType
152
+ // , 'payment_currency' => $orderCurrencyCode
153
+ , 'items' => $items
154
+ , 'signature' => $orderSignature
155
+ );
156
+
157
+ }
158
+
159
+ public function getCartItemsList($cartItems)
160
+ {
161
+ $helper = Mage::helper('chaordic_base');
162
+ $items = array();
163
+ $products = array();
164
+
165
+ /**
166
+ * Iteração pelos itens do carrinho, agrupando todos os ids de produtos
167
+ * para obter dados dos mesmos. Na mesma matriz armazenamos a quantidade
168
+ * do produto no carrinho, assim não precisaremos mais de $carItems.
169
+ */
170
+ foreach ($cartItems as $item) {
171
+ $entityId = $item->getProductId();
172
+ $qty = ($item->getQty() !== null) ? $item->getQty() : $item->getQtyOrdered();
173
+ $type = $item->getProductType();
174
+
175
+ $itemId = null;
176
+ $itemSku = null;
177
+ $itemPrice = $item->getRowTotalInclTax() / $qty;
178
+
179
+ switch ($type) {
180
+ case 'configurable':
181
+ $itemProduct = $item->getProduct();
182
+ $options = $itemProduct->getTypeInstance(true)->getOrderOptions($itemProduct);
183
+
184
+ if (isset($options['info_buyRequest'])) {
185
+ $itemId = $options['info_buyRequest']['product'];
186
+ $itemSku = $options['simple_sku'];
187
+ } else {
188
+ $itemId = $entityId;
189
+ $itemSku = $item->getSku();
190
+ }
191
+ break;
192
+
193
+ case 'simple':
194
+ case 'grouped':
195
+ default:
196
+ $itemId = $entityId;
197
+ $itemSku = $item->getSku();
198
+ break;
199
+ }
200
+
201
+ $products[] = array(
202
+ 'product' => array(
203
+ 'id' => $itemId
204
+ , 'sku' => $itemSku
205
+ , 'price' => $helper->float($itemPrice)
206
+ // , 'type' => $type
207
+ ),
208
+ 'quantity' => $helper->float($qty)
209
+ );
210
+ }
211
+
212
+ // var_dump($products);
213
+ // exit;
214
+
215
+ // gc
216
+ unset($cartItems);
217
+
218
+ return $products;
219
+
220
+ /**
221
+ * Obtém informações dos produtos inseridos no carrinho.
222
+ */
223
+ // $productCollection = Mage::getModel('catalog/product')
224
+ // ->getCollection()
225
+ // ->addAttributeToSelect('*') // Melhorar - E MUITO - essa seleção
226
+ // ->addAttributeToFilter('entity_id', array('in' => array_keys($products)))
227
+ // ->getItems();
228
+
229
+ // foreach ($productCollection as $product) {
230
+ // $id = $product->getEntityId();
231
+
232
+ // array_push($items, array(
233
+ // 'product' => array(
234
+ // 'id' => $product->getSku() // SKU DO PRODUTO PAI
235
+ // , 'sku' => 'SKU VARIACAO' // SKU DA VARIACAO
236
+ // , 'price' => $helper->float($product->getFinalPrice(), 2)
237
+ // )
238
+ // , 'quantity' => $products[$id]['qty']
239
+ // // , 'tags' => $product->getTags() - Exibe as meta keywords?
240
+ // )
241
+ // );
242
+ // }
243
+ // var_dump($items);
244
+ // exit;
245
+ //
246
+ // return $items;
247
+ }
248
+
249
+ public function transactionSignature($orderId, $items)
250
+ {
251
+ $helper = Mage::helper('chaordic_base');
252
+ $pieces = array();
253
+
254
+ /**
255
+ * OrderId
256
+ */
257
+ array_push($pieces, $orderId);
258
+
259
+ /**
260
+ * Apikey
261
+ */
262
+ $secretkey = $helper->getSecretKey();
263
+ array_push($pieces, $secretkey);
264
+
265
+ /**
266
+ * Items
267
+ */
268
+ foreach ($items as $item) {
269
+ array_push(
270
+ $pieces,
271
+ implode(
272
+ ',',
273
+ array(
274
+ $item['product']['id'],
275
+ $item['product']['sku'],
276
+ $item['product']['price'],
277
+ $item['quantity']
278
+ )
279
+ )
280
+ );
281
+ }
282
+
283
+ // var_dump(implode(':', $pieces));
284
+
285
+ return md5(implode(':', $pieces));
286
+
287
+ }
288
+
289
+ }
app/code/community/Chaordic/Base/Model/Cms.php ADDED
@@ -0,0 +1,28 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * @category Chaordic
4
+ * @package Chaordic_Base
5
+ * @version 1.0.0
6
+ * @copyright Copyright (c) 2014 Chaordic Systems (http://www.chaordicsystems.com)
7
+ */
8
+
9
+ class Chaordic_Base_Model_Cms
10
+ {
11
+ public function getRouteProps()
12
+ {
13
+ $helper = Mage::helper('chaordic_base');
14
+
15
+ $cmsPageId = Mage::getSingleton('cms/page')->getIdentifier();
16
+ $homePageId = Mage::getStoreConfig(
17
+ 'web/default/cms_home_page'
18
+ , Mage::app()->getStore()->getId()
19
+ );
20
+
21
+ $props['page'] = array(
22
+ 'name' => ( $cmsPageId == $homePageId ) ? 'home' : 'other',
23
+ 'timestamp' => $helper->date('now', 'r')
24
+ );
25
+
26
+ return $props;
27
+ }
28
+ }
app/code/community/Chaordic/Base/Model/Customer.php ADDED
@@ -0,0 +1,39 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * @category Chaordic
4
+ * @package Chaordic_Base
5
+ * @version 1.0.0
6
+ * @copyright Copyright (c) 2014 Chaordic Systems (http://www.chaordicsystems.com)
7
+ */
8
+
9
+ class Chaordic_Base_Model_Customer
10
+ {
11
+
12
+ public function getRouteProps() {
13
+
14
+ $helper = Mage::helper('chaordic_base');
15
+
16
+ /**
17
+ * Rota atual do contexto My Account.
18
+ *
19
+ * No painel My Account várias telas de gestão da conta do usuário
20
+ * são agregadas, mesmo que nem todas sejam tratadas pelo modelo customer.
21
+ * Sales, Review, Tag, Wishlist, OAuth, Newsletter e Downloadable são as
22
+ * rotas possíveis.
23
+ *
24
+ * @todo Diferenciar tabs Account Information e Address Book, ambas identificadas
25
+ * como customer - a rota de fato é customer, podemos diferenciar a aba em si.
26
+ * @var [type]
27
+ */
28
+ $route = Mage::app()->getFrontController()->getRequest()->getRouteName();
29
+
30
+ $props['page'] = array(
31
+ 'name' => 'customer_' . $route,
32
+ 'timestamp' => $helper->date('now', 'r')
33
+ );
34
+
35
+ return $props;
36
+
37
+ }
38
+
39
+ }
app/code/community/Chaordic/Base/Model/Installment.php ADDED
@@ -0,0 +1,20 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * @category Chaordic
4
+ * @package Chaordic_Base
5
+ * @version 1.0.0
6
+ * @copyright Copyright (c) 2014 Chaordic Systems (http://www.chaordicsystems.com)
7
+ */
8
+
9
+ class Chaordic_Base_Model_Installment
10
+ {
11
+ public function toOptionArray() {
12
+ $installment_count = array();
13
+ for($i=1; $i<=12; $i++) {
14
+ array_push($installment_count, array('value'=>$i, 'label'=>$i.'x'));
15
+ }
16
+
17
+ return $installment_count;
18
+ }
19
+ }
20
+ ?>
app/code/community/Chaordic/Base/Model/Meta.php ADDED
@@ -0,0 +1,39 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * @category Chaordic
4
+ * @package Chaordic_Base
5
+ * @version 1.0.0
6
+ * @copyright Copyright (c) 2014 Chaordic Systems (http://www.chaordicsystems.com)
7
+ */
8
+
9
+ class Chaordic_Base_Model_Meta
10
+ {
11
+ private $props;
12
+
13
+ public function addProp($prop, $value)
14
+ {
15
+ $this->props[$prop] = $value;
16
+ }
17
+
18
+ public function getProp($prop)
19
+ {
20
+ if ( array_key_exists($prop, $this->props) ) {
21
+ return $this->props[$prop];
22
+ } else {
23
+ return null;
24
+ }
25
+ }
26
+
27
+ public function getProps()
28
+ {
29
+ return $this->props;
30
+ }
31
+
32
+ public function propExists($prop)
33
+ {
34
+ return array_key_exists($prop, $this->props);
35
+ }
36
+
37
+ }
38
+
39
+ ?>
app/code/community/Chaordic/Base/Model/PaymentMethods.php ADDED
@@ -0,0 +1,24 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * @category Chaordic
4
+ * @package Chaordic_Base
5
+ * @version 1.0.0
6
+ * @copyright Copyright (c) 2014 Chaordic Systems (http://www.chaordicsystems.com)
7
+ */
8
+
9
+ class Chaordic_Base_Model_Paymentmethods
10
+ {
11
+ public function toOptionArray()
12
+ {
13
+ $methods = array();
14
+ $payments = Mage::getSingleton('payment/config')->getActiveMethods();
15
+
16
+ foreach ($payments as $code => $model) {
17
+ $title = Mage::getStoreConfig('payment/'.$code.'/title');
18
+ array_push($methods, array('value'=>$code, 'label'=>$title));
19
+ }
20
+
21
+ return $methods;
22
+ }
23
+ }
24
+ ?>
app/code/community/Chaordic/Base/Model/Product.php ADDED
@@ -0,0 +1,379 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * @category Chaordic
4
+ * @package Chaordic_Base
5
+ * @version 1.0.0
6
+ * @copyright Copyright (c) 2014 Chaordic Systems (http://www.chaordicsystems.com)
7
+ */
8
+
9
+ class Chaordic_Base_Model_Product
10
+ {
11
+ public function getRouteProps($productId=null, $remote=false)
12
+ {
13
+ $helper = Mage::helper('chaordic_base');
14
+ $props = array();
15
+
16
+ /**
17
+ * Identificamos o produto acessado.
18
+ */
19
+ $productId = (is_null($productId)) ? Mage::app()->getRequest()->getParam('id') : $productId;
20
+ $product = Mage::getModel('catalog/product')->load($productId);
21
+ $productType = $product->getTypeId();
22
+
23
+ /**
24
+ * Retorna apenas a URL remota quando o acesso for pela página.
25
+ */
26
+ if ($remote === false) {
27
+
28
+ /**
29
+ * Carrega a declaração simples para obter as categorias
30
+ * da página.
31
+ */
32
+ $simple = self::getProductDeclaration($product);
33
+ $pageCategories = $simple['categories'];
34
+
35
+ $props['product'] = self::getProductRemoteDeclaration($productId);
36
+
37
+ } else {
38
+ /**
39
+ * Para todos os produtos, a declaração de produto
40
+ * simples deve ser enviada.
41
+ */
42
+ $simple = self::getProductDeclaration($product);
43
+
44
+ switch ($productType) {
45
+ case "configurable":
46
+ $configurable = self::getProductSpecsDeclaration($product);
47
+ break;
48
+
49
+ case "grouped":
50
+ $kit = self::getProductGroupedKitDeclaration($product);
51
+ break;
52
+ }
53
+
54
+ $props['product'] = $simple;
55
+ $pageCategories = $props['product']['categories'];
56
+
57
+ if ( ! empty($configurable) ) {
58
+ $props['product'] = array_merge($props['product'], $configurable);
59
+ }
60
+
61
+ if ( ! empty($kit) ) {
62
+ $props['product'] = array_merge($props['product'], $kit);
63
+ }
64
+ }
65
+
66
+ /**
67
+ * Informações da página
68
+ */
69
+ $props['page'] = array(
70
+ 'name' => 'product',
71
+ 'categories' => $pageCategories,
72
+ 'timestamp' => $helper->date('now', 'r')
73
+ );
74
+
75
+ return $props;
76
+ }
77
+
78
+ /**
79
+ * Retorna o JSON de informações de um produto.
80
+ * O método é reutilizado para composição de packs de informação de produtos
81
+ * agrupados, pois estes são compostos por dois ou mais produtos. Assim, tanto
82
+ * um produto simples, configurável ou agrupado podem ser gerados pelo mesmo
83
+ * método.
84
+ *
85
+ * @param Mage_Catalog_Model_Product $product Modelo de produto.
86
+ * @return array
87
+ */
88
+ public function getProductDeclaration(Mage_Catalog_Model_Product $product)
89
+ {
90
+ $helper = Mage::helper('chaordic_base');
91
+ $catalog = Mage::getSingleton('chaordic_onsite/catalog');
92
+ $model = Mage::getSingleton('chaordic_onsite/product');
93
+
94
+ $declaration = array();
95
+ $data = $product->getData();
96
+ $baseUrl = Mage::getBaseUrl(Mage_Core_Model_Store::URL_TYPE_WEB);
97
+ $mediaUrl = Mage::getBaseUrl(Mage_Core_Model_Store::URL_TYPE_MEDIA);
98
+
99
+ /**
100
+ * Informação básica
101
+ */
102
+ $declaration = array(
103
+ 'id' => $product->getEntityId()
104
+ , 'name' => $data['name']
105
+ , 'description' => $data['description']
106
+ , 'url' => $helper->protocol($baseUrl . $data['url_path'])
107
+ , 'published' => $helper->date($data['created_at'], 'Y-m-d')
108
+ );
109
+
110
+ /**
111
+ * Brand
112
+ */
113
+ $brand = $product->getAttributeText('manufacturer');
114
+ if (!empty($brand)) {
115
+ $declaration['brand'] = $brand;
116
+ }
117
+
118
+ /**
119
+ * Tags
120
+ */
121
+ $tags = explode(',', trim($data['meta_keywords'], ','));
122
+ if (!empty($tags) and !empty($tags[0])) {
123
+ $declaration['tags'] = $tags;
124
+ }
125
+
126
+ /**
127
+ * Declaração de preços
128
+ */
129
+ $prices = $model->getProductPricesDeclaration($product);
130
+ $declaration = array_merge($declaration, $prices);
131
+
132
+ /**
133
+ * Imagens
134
+ * Na documentação de integração não fica claro se devemos informar
135
+ * apenas a imagem principal ou toda a galeria de imagens, então
136
+ * informamos as imagens definidas como image, small_image e thumbnail.
137
+ *
138
+ * A partir da versão 0.8.2 optamos por informar apenas a imagem default.
139
+ */
140
+ if ( isset($data['image']) ) {
141
+ $declaration['images']['default'] = $helper->protocol($product->getImageUrl());
142
+ }
143
+
144
+
145
+ /**
146
+ * Atributos adicionais
147
+ * Exibe os atributos customizados do produto. Carrega os grupos de atributos
148
+ * relacionados ao attribute_set.
149
+ */
150
+ // Carrega informações do attribute set.
151
+ $attributeSetId = $product->getAttributeSetId();
152
+ $groupAttributesCodes = $helper->getCustomSetAttributes($attributeSetId);
153
+ $productAttributes = $product->getAttributes();
154
+
155
+ $declaration['details'] = array();
156
+ foreach ($productAttributes as $attr) {
157
+ if (
158
+ $attr->getIsVisibleOnFront() and
159
+ in_array($attr->getAttributeCode(), $groupAttributesCodes)
160
+ ) {
161
+ $declaration['details'][$attr->getAttributeCode()] = $attr->getFrontend()->getValue($product);
162
+ }
163
+ }
164
+
165
+ if (empty($declaration['details'])) {
166
+ unset($declaration['details']);
167
+ }
168
+
169
+ /**
170
+ * Estoque
171
+ */
172
+ $declaration['stock'] = $helper->float($product->getStockItem()->getQty());
173
+ $declaration['status'] = ( $product->getIsInStock() and $product->getIsSalable() ) ? 'available' : 'unavailable';
174
+
175
+ /**
176
+ * Categorias
177
+ */
178
+ $categoryCollection = $product->getCategoryCollection();
179
+ $categories = array();
180
+ $uniqueCategories = array();
181
+
182
+ foreach ($categoryCollection as $category) {
183
+ $categoryTree = $catalog->getCategoryTree($category->getEntityId());
184
+ foreach ($categoryTree as $index) {
185
+ if ( ! in_array($index['id'], $uniqueCategories) ) {
186
+ array_push($uniqueCategories, $index['id']);
187
+ array_push($categories, $index);
188
+ }
189
+ }
190
+ }
191
+
192
+ $declaration['categories'] = $categories;
193
+
194
+ return $declaration;
195
+ }
196
+
197
+ /**
198
+ * Retorna árvore de variações de atributos do produto - cor, tamanho...
199
+ * @param Mage_Catalog_Model_Product $product Modelo do produto
200
+ * @return array
201
+ */
202
+ public function getProductSpecsDeclaration($product)
203
+ {
204
+ $helper = Mage::helper('chaordic_base');
205
+ $model = Mage::getSingleton('chaordic_onsite/product');
206
+
207
+ $specs = array();
208
+ $skus = array();
209
+
210
+ if ($product->getTypeId() !== 'configurable') {
211
+ return false;
212
+ }
213
+
214
+ $productPrice = $model->getProductPricesDeclaration($product);
215
+
216
+ /**
217
+ * Identifica atributos utilizados para customização e reduz a matris
218
+ * para um objeto representável dos atributos que compões a customização
219
+ * do produto.
220
+ * Objeto specs.
221
+ */
222
+ $attributes = $product->getTypeInstance()->getConfigurableAttributesAsArray();
223
+ $usedAttributes = array();
224
+ $usedAttributesLabels = array();
225
+
226
+ foreach ($attributes as $att) {
227
+ $attributeSpecs = array_map(function($e){
228
+ return $e['store_label'];
229
+ }, $att['values']);
230
+
231
+ $specs[$att['label']] = $attributeSpecs;
232
+ array_push($usedAttributes, array(
233
+ 'label' => $att['label']
234
+ , 'code' => $att['attribute_code']
235
+ , 'values' => array_map(function($e){
236
+ return array($e['value_index'] => $e['store_label']);
237
+ }, $att['values'])
238
+ ));
239
+ }
240
+
241
+ /**
242
+ * Identifica produtos filhos para compor skus.
243
+ */
244
+ // $childs = $product->getTypeInstance()->getChildrenIds($product->getId());
245
+
246
+ // // Collection de produtos associados ao configurável
247
+ // $childCollection = $product
248
+ // ->getCollection()
249
+ // // ->addAttributeToSelect(implode(',', $attributesToSelect))
250
+ // ->addAttributeToSelect('*')
251
+ // ->addFieldToFilter('entity_id', array('in', $childs))
252
+ // ->load();
253
+
254
+ $configurable = Mage::getModel('catalog/product_type_configurable')->setProduct($product);
255
+ $childCollection = $configurable->getUsedProductCollection()
256
+ ->addAttributeToSelect('*')
257
+ ->addFilterByRequiredOptions();
258
+
259
+ foreach ($childCollection as $child) {
260
+ $_child = $child->getData();
261
+ $_specs = array();
262
+
263
+ foreach ($usedAttributes as $att) {
264
+ $attValueCode = $_child[$att['code']];
265
+ $attValue = array_reduce($att['values'], function($v, $e) use ($attValueCode) {
266
+ return ( isset($e[$attValueCode]) ) ? $e[$attValueCode] : $v;
267
+ });
268
+
269
+ $_specs[$att['label']] = $attValue;
270
+ }
271
+
272
+ $sku = array(
273
+ 'sku' => $_child['sku']
274
+ , 'specs' => $_specs
275
+ , 'status' => (
276
+ $_child['is_salable'] and
277
+ $_child['stock_item']->is_in_stock ) ? 'available' : 'unavailable'
278
+ );
279
+
280
+ /**
281
+ * Se o preço da variação for diferente do preço do produto,
282
+ * adiciona declaração de preços à declaração da variação.
283
+ */
284
+ $prices = $model->getProductPricesDeclaration($child);
285
+
286
+ if ($prices['price'] != $productPrice['price']) {
287
+ array_push($skus, array_merge($sku, $prices));
288
+
289
+ } else {
290
+ array_push($skus, $sku);
291
+ }
292
+ }
293
+
294
+ return array(
295
+ 'specs' => $specs,
296
+ 'skus' => $skus
297
+ );
298
+ }
299
+
300
+ /**
301
+ * Retorna árvore de produtos que compõe o kit.
302
+ * @param Mage_Catalog_Model_Product $product Modelo do produto
303
+ * @return array
304
+ */
305
+ public function getProductGroupedKitDeclaration($product)
306
+ {
307
+ $associated = $product->getTypeInstance(true)
308
+ ->getAssociatedProducts($product);
309
+
310
+ $kit = array();
311
+
312
+ if (!empty($associated)) foreach ($associated as $assoc) {
313
+ array_push($kit, self::getProductDeclaration($assoc));
314
+ }
315
+
316
+ return array(
317
+ 'kit_products' => $kit
318
+ );
319
+ }
320
+
321
+ public function getProductPricesDeclaration(Mage_Catalog_Model_Product $product)
322
+ {
323
+ $helper = Mage::helper('chaordic_base');
324
+ $prices = array();
325
+ $data = $product->getData();
326
+
327
+ /**
328
+ * Preços.
329
+ *
330
+ * O preço promocional é informado como 'price', enquanto o preço original
331
+ * é informado como old_price. Não existindo um preço promocional, o preço
332
+ * original é informado como price.
333
+ *
334
+ * Nota: base_price pode não aparecer em todos os produtos - na verdade
335
+ * é provável que não aparece de modo algum.
336
+ */
337
+ if ( isset($data['special_price']) ) {
338
+ $prices['price'] = $helper->float($data['special_price']);
339
+ $prices['old_price'] = $helper->float($data['price']);
340
+ } else {
341
+ $prices['price'] = $helper->float($data['price']);
342
+ }
343
+
344
+ $prices['base_price'] = $helper->float($data['cost']);
345
+
346
+ /**
347
+ * Parcelamento do produto, baseado em configurações do módulo
348
+ * (número de parcelas máximas e valor mínimo da parcela)
349
+ */
350
+ $maxInstallmentCount = $helper->getMaxInstallmentCount();
351
+ $minInstallmentPrice = $helper->getMinInstallmentPrice();
352
+
353
+ $installmentCount = floor($prices['price'] / $minInstallmentPrice);
354
+ $installmentCount = ($installmentCount < 1) ? 1 : $installmentCount;
355
+ $installmentCount = ($installmentCount > $maxInstallmentCount) ? $maxInstallmentCount : $installmentCount;
356
+
357
+ $prices['installment'] = array(
358
+ 'count' => (int) $installmentCount,
359
+ 'price' => $helper->float($prices['price'] / $installmentCount)
360
+ );
361
+
362
+ return $prices;
363
+ }
364
+
365
+ /**
366
+ * Retorna declaração de product contendo apenas a URL remota.
367
+ * @param [type] $productId [description]
368
+ * @return [type] [description]
369
+ */
370
+ public function getProductRemoteDeclaration($productId)
371
+ {
372
+ $helper = Mage::helper('chaordic_base');
373
+
374
+ return array(
375
+ 'remote_url' => $helper->remote('product', array('product_id' => $productId))
376
+ );
377
+ }
378
+
379
+ }
app/code/community/Chaordic/Base/Model/Search.php ADDED
@@ -0,0 +1,73 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * @category Chaordic
4
+ * @package Chaordic_Base
5
+ * @version 1.0.0
6
+ * @copyright Copyright (c) 2014 Chaordic Systems (http://www.chaordicsystems.com)
7
+ */
8
+
9
+ class Chaordic_Base_Model_Search
10
+ {
11
+ public function getRouteProps()
12
+ {
13
+ $helper = Mage::helper('chaordic_base');
14
+ $items = array();
15
+
16
+ /**
17
+ * Identificamos o termo pesquisado e os items retornados.
18
+ */
19
+ $searchQuery = Mage::helper('catalogsearch')->getQueryText();
20
+ $searchResults = Mage::getModel('catalogsearch/layer')->getProductCollection();
21
+
22
+ foreach ($searchResults as $item) {
23
+ $productId = $item->getEntityId();
24
+
25
+ /**
26
+ * Consulta a visibilidade do produto, incluindo na matriz $items
27
+ * somente aqueles visíveis nos resultados de busca.
28
+ *
29
+ * Nota: Como resultados de pesquisa são retornados todos os produtos
30
+ * relacionados ao termo, mesmo aqueles que não seriam acessados diretamente
31
+ * (como é o caso de produtos simples associados a produtos configuráveis).
32
+ *
33
+ * Nota: o campo visibility retornado é um inteiro de 1 a 4, cujo definições
34
+ * estão na classe /app/code/core/Mage/Catalog/Model/Product/Visibility.php.
35
+ * O inteiro 1 represente produtos não visíveis, portanto checamos aqui
36
+ * se o valor de visibility é maior que 1 - visível em busca (2), visível
37
+ * em cata'logo (3) ou visível em ambos (4).
38
+ */
39
+ $_product = Mage::getSingleton('catalog/product')
40
+ ->getCollection()
41
+ ->addAttributeToSelect('visibility')
42
+ ->addFilter('entity_id', array('eq'=>$productId))
43
+ ->getItems();
44
+
45
+ if ($_product[$productId]->getVisibility() > 1) {
46
+ array_push($items, array(
47
+ 'id' => $productId
48
+ , 'sku' => $item->getSku()
49
+ , 'price' => $helper->float($item->getFinalPrice(), 2)
50
+ ));
51
+ }
52
+ }
53
+
54
+ /**
55
+ * Informações padrão da página.
56
+ */
57
+ $props['page'] = array(
58
+ 'name' => 'search',
59
+ 'timestamp' => $helper->date('now', 'r')
60
+ );
61
+
62
+ /**
63
+ * Informações de search.
64
+ */
65
+ $props['search'] = array(
66
+ 'query' => $searchQuery,
67
+ 'items' => $items
68
+ );
69
+
70
+ return $props;
71
+ }
72
+
73
+ }
app/code/community/Chaordic/Base/Model/User.php ADDED
@@ -0,0 +1,200 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * @category Chaordic
4
+ * @package Chaordic_Base
5
+ * @version 1.0.0
6
+ * @copyright Copyright (c) 2014 Chaordic Systems (http://www.chaordicsystems.com)
7
+ */
8
+
9
+ class Chaordic_Base_Model_User
10
+ {
11
+ public static function getRouteProps()
12
+ {
13
+ $session = Mage::getSingleton('customer/session', array('name'=>'frontend'));
14
+
15
+ /**
16
+ * Identificação do cliente presente na sessão.
17
+ * Carregamos o cliente, endereço padrão e subscrições nas newsletters
18
+ * do Magento.
19
+ */
20
+ $customerId = $session->getId();
21
+ $customer = $session->getCustomer();
22
+ $customerEmail = $customer->getEmail();
23
+
24
+ // Zend_Debug::dump($customer);
25
+
26
+ /**
27
+ * Retorna apenas a URL remota quando estamos exibindo na página.
28
+ * A declaração completa do usuários só é retornada ao acessarmos
29
+ * pela URl remota.
30
+ */
31
+
32
+ if (! empty($customerEmail)) {
33
+ return self::getUserRemoteDeclaration($customerId);
34
+ // ->getUserDeclaration($customer, $session);
35
+ } else {
36
+ return;
37
+ }
38
+ }
39
+
40
+ public function getUserDeclaration($customer, $session=null)
41
+ {
42
+ $helper = Mage::helper('chaordic_base');
43
+
44
+ /**
45
+ * Se $customer for um ID, carrega o usuário associado.
46
+ * Se não for um ID e também não for um objeto, no caso uma
47
+ * instância do modelo Customer, retorna null.
48
+ */
49
+ if (is_int($customer)) {
50
+ $customer = Mage::getModel('customer/customer')->load($customer);
51
+ } elseif (! is_object($customer)) {
52
+ return null;
53
+ }
54
+
55
+ $customerId = $customer->getId();
56
+
57
+ $defaultAddress = $customer->getPrimaryBillingAddress();
58
+ $subscriptions = Mage::getModel('newsletter/subscriber')
59
+ ->loadByEmail($customer->getEmail());
60
+
61
+ /**
62
+ * Composição do nome completo do usuário.
63
+ * @var [type]
64
+ */
65
+ $customerName = implode(' ', array(
66
+ $customer->getFirstname(),
67
+ $customer->getLastname()
68
+ ));
69
+
70
+ /**
71
+ * Email principal do usuário.
72
+ * @var [type]
73
+ */
74
+ $customerEmail = $customer->getEmail();
75
+
76
+ /**
77
+ * Informação de subscrição nas newsletters do Magento.
78
+ * @var [type]
79
+ */
80
+ if ( ! empty($subscriptions) ) {
81
+ $customerSubscription = $subscriptions->isSubscribed();
82
+ } else {
83
+ $customerSubscription = false;
84
+ }
85
+
86
+
87
+ if ( ! empty($defaultAddress) ) {
88
+ /**
89
+ * CEP informado no endereço de cobrança padrão.
90
+ * Nota: esse endereço só fica disponível após a primeira compra
91
+ * do cliente ou se o mesmo atualizar seus endereços no dashboard.
92
+ * @var [type]
93
+ */
94
+ $customerDefaultZipcode = $defaultAddress->getPostcode();
95
+
96
+ /**
97
+ * País informado no endereço de cobrança padrão.
98
+ * Nota: esse endereço só fica disponível após a primeira compra
99
+ * do cliente ou se o mesmo atualizar seus endereços no dashboard.
100
+ * @var [type]
101
+ */
102
+ $customerDefaultCountry = $defaultAddress->getCountryId();
103
+
104
+ } else {
105
+ $customerDefaultZipcode = null;
106
+ $customerDefaultCountry = null;
107
+ }
108
+
109
+ /**
110
+ * Tax/Vat do cliente (documento utilizado para faturamento).
111
+ * Nota: normalmente lojas brasileiras utilizam esse atributo para
112
+ * armazenar o CPF, pois é a identificação do cliente para cobrança
113
+ * de impostos que lojas americanas utilizam.
114
+ * @var [type]
115
+ */
116
+ $customerTaxvat = str_replace(
117
+ array(' ', '.', '-', '/'),
118
+ '',
119
+ $customer->getTaxvat()
120
+ );
121
+
122
+ $customerTaxvat = ( empty($customerTaxvat) ) ? null : $customerTaxvat;
123
+
124
+ /**
125
+ * Gênero do cliente.
126
+ * Nota: Essa informação pode não estar disponível antes da primeira
127
+ * compra do cliente.
128
+ * @var [type]
129
+ */
130
+ $customerGender = $customer->getAttribute('gender')->getSource()->getOptionText($customer->getGender());
131
+ $customerGender = ($customerGender == 'Male') ? 'M'
132
+ : ( ($customerGender == 'Female') ? 'F' : null );
133
+
134
+ /**
135
+ * Data de nascimento do cliente.
136
+ * Nota: Essa informação pode não estar disponível antes da primeira
137
+ * compra do cliente.
138
+ * @var [type]
139
+ */
140
+ $customerDob = $helper->date($customer->getDob(), 'Y-m-d');
141
+
142
+ /**
143
+ * $authToken - chave pra obtenção de informações do usuário
144
+ * Informa o ID da sessão, pois embora não possamos retornar os dados
145
+ * do usuário a partir desse dado, podemos obter os dados do carrinho
146
+ * associado.
147
+ */
148
+ $authToken = (! empty($session)) ? $session->getEncryptedSessionId() : null;
149
+
150
+ /**
151
+ * Idioma preferido do usuário.
152
+ * Utilizamos o idioma informado pelo navegador.
153
+ */
154
+ $language = $helper->locale();
155
+
156
+
157
+ /**
158
+ * Matriz de informações do usuário para composição
159
+ * da Chaordic Meta.
160
+ * @var array
161
+ */
162
+ $user = array(
163
+ 'id' => $customerId
164
+ , 'name' => $customerName
165
+ , 'email' => $customerEmail
166
+ , 'allow_mail_marketing' => $customerSubscription
167
+ // , 'username' => $customerEmail
168
+ // , 'username' => $customerId
169
+ , 'nickname' => $customer->getFirstname()
170
+ , 'auth_token' => $authToken
171
+ );
172
+
173
+ // Informações condicionais
174
+ if (!empty($customerDob)) { $user['birthday'] = $customerDob; }
175
+ if (!empty($language)) { $user['language'] = $language; }
176
+ if (!empty($customerDefaultZipcode)) { $user['zipcode'] = $customerDefaultZipcode; }
177
+ if (!empty($customerDefaultCountry)) { $user['country'] = $customerDefaultCountry; }
178
+ if (!empty($customerGender)) { $user['gender'] = $customerGender; }
179
+ if (!empty($customerTaxvat)) { $user['document_id'] = $customerTaxvat; }
180
+
181
+ return array( 'user'=>$user );
182
+ }
183
+
184
+ /**
185
+ * Retorna declaração de user contendo apenas a URL remota.
186
+ * @param [type] $customerId [description]
187
+ * @return [type] [description]
188
+ */
189
+ public function getUserRemoteDeclaration($customerId)
190
+ {
191
+ $helper = Mage::helper('chaordic_base');
192
+
193
+ return array(
194
+ 'user' => array(
195
+ 'remote_url' => $helper->remote('user', array('user_id' => $customerId))
196
+ )
197
+ );
198
+ }
199
+
200
+ }
app/code/community/Chaordic/Base/controllers/RemoteController.php ADDED
@@ -0,0 +1,116 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * @category Chaordic
4
+ * @package Chaordic_Base
5
+ * @version 1.0.0
6
+ * @copyright Copyright (c) 2014 Chaordic Systems (http://www.chaordicsystems.com)
7
+ */
8
+
9
+ class Chaordic_Base_RemoteController extends Mage_Core_Controller_Front_Action
10
+ {
11
+ public function userAction()
12
+ {
13
+ $model = Mage::getModel('chaordic_base/user');
14
+
15
+ $requestParams = $this->getRequest()->getParams();
16
+
17
+ if (! empty($requestParams) and isset($requestParams['user_id'])) {
18
+ $userId = $requestParams['user_id'];
19
+
20
+ if (! is_numeric($userId)) {
21
+ return null;
22
+ }
23
+
24
+ $userDeclaration = $model->getUserDeclaration((int) $requestParams['user_id']);
25
+
26
+ } else {
27
+ $userDeclaration = $model->getRouteProps();
28
+ }
29
+
30
+ $this->getResponse()->setHeader('Content-type', 'application/json', true);
31
+ echo json_encode($userDeclaration['user']);
32
+ exit;
33
+ }
34
+
35
+ public function productAction()
36
+ {
37
+ $model = Mage::getModel('chaordic_base/product');
38
+
39
+ $requestParams = $this->getRequest()->getParams();
40
+
41
+ if (! empty($requestParams) and isset($requestParams['product_id'])) {
42
+ $userId = $requestParams['product_id'];
43
+
44
+ if (! is_numeric($userId)) {
45
+ return null;
46
+ }
47
+
48
+ $productDeclaration = $model->getRouteProps((int) $requestParams['product_id'], true);
49
+
50
+ } else {
51
+ exit;
52
+ }
53
+
54
+ $this->getResponse()->setHeader('Content-type', 'application/json', true);
55
+ echo json_encode($productDeclaration['product']);
56
+ exit;
57
+ }
58
+
59
+ public function cartAction()
60
+ {
61
+ $checkout = Mage::getModel('chaordic_base/checkout');
62
+
63
+ $this->getResponse()->setHeader('Content-type', 'application/json', true);
64
+ echo json_encode($checkout->getRouteProps('cart'));
65
+ exit;
66
+ }
67
+
68
+ public function searchAction()
69
+ {
70
+ $helper = Mage::helper('chaordic_base');
71
+ $pageId = $helper->getSearchPageId();
72
+
73
+
74
+ /**
75
+ * Se o Id de página não estiver configurado,
76
+ * cria a página e armazena o ID na option.
77
+ */
78
+
79
+ if (empty($pageId)) {
80
+ $pageId = $helper->createSearchPage();
81
+ $helper->setSearchPageId($pageId);
82
+ }
83
+
84
+
85
+ /**
86
+ * Carrega a URL da página configurada para o redirecionamento.
87
+ */
88
+
89
+ $pageUrl = Mage::Helper('cms/page')->getPageUrl($pageId);
90
+
91
+
92
+ /**
93
+ * Se a URL nào for encontrada, provavelmente a página não existe.
94
+ * Nesse caso a página será criada e a URL carregada.
95
+ */
96
+
97
+ if (empty($pageUrl)) {
98
+ $pageId = $helper->createSearchPage();
99
+ $helper->setSearchPageId($pageId);
100
+
101
+ $pageUrl = Mage::Helper('cms/page')->getPageUrl($pageId);
102
+ }
103
+
104
+
105
+ /**
106
+ * Redireciona para a página
107
+ */
108
+
109
+ $response = Mage::app()->getResponse();
110
+ $response->setRedirect($pageUrl, 301);
111
+ $response->sendResponse();
112
+ exit;
113
+ }
114
+ }
115
+
116
+ ?>
app/code/community/Chaordic/Base/etc/config.xml ADDED
@@ -0,0 +1,82 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0"?>
2
+ <config>
3
+ <modules>
4
+ <Chaordic_Base>
5
+ <version>1.0.0</version>
6
+ <platform>ce</platform>
7
+ </Chaordic_Base>
8
+ </modules>
9
+
10
+ <global>
11
+ <blocks>
12
+ <chaordic_base>
13
+ <class>Chaordic_Base_Block</class>
14
+ </chaordic_base>
15
+ </blocks>
16
+ <models>
17
+ <chaordic_base>
18
+ <class>Chaordic_Base_Model</class>
19
+ <resourceModel>chaordic_onsite_mysql4</resourceModel>
20
+ </chaordic_base>
21
+ <chaordic_base_mysql4>
22
+ <class>Chaordic_Base_Model_Mysql4</class>
23
+ </chaordic_base_mysql4>
24
+ </models>
25
+ <helpers>
26
+ <chaordic_base>
27
+ <class>Chaordic_Base_Helper</class>
28
+ </chaordic_base>
29
+ </helpers>
30
+ </global>
31
+
32
+ <frontend>
33
+ <layout>
34
+ <updates>
35
+ <chaordic_base module="Chaordic_Base">
36
+ <file>chaordic_base.xml</file>
37
+ </chaordic_base>
38
+ </updates>
39
+ </layout>
40
+ <routers>
41
+ <chaordic_base>
42
+ <use>standard</use>
43
+ <args>
44
+ <module>Chaordic_Base</module>
45
+ <frontName>chaordic</frontName>
46
+ </args>
47
+ </chaordic_base>
48
+ </routers>
49
+ </frontend>
50
+
51
+ <adminhtml>
52
+ <acl>
53
+ <resources>
54
+ <admin>
55
+ <children>
56
+ <system>
57
+ <children>
58
+ <config>
59
+ <children>
60
+ <chaordic_base>
61
+ <title>Chaordic Systems</title>
62
+ </chaordic_base>
63
+ </children>
64
+ </config>
65
+ </children>
66
+ </system>
67
+ </children>
68
+ </admin>
69
+ </resources>
70
+ </acl>
71
+ </adminhtml>
72
+
73
+ <default>
74
+ <chaordic_base>
75
+ <options>
76
+ <api_key>magento</api_key>
77
+ <installment_count>6</installment_count>
78
+ <installment_price>20</installment_price>
79
+ </options>
80
+ </chaordic_base>
81
+ </default>
82
+ </config>
app/code/community/Chaordic/Base/etc/system.xml ADDED
@@ -0,0 +1,168 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0"?>
2
+ <config>
3
+ <tabs>
4
+ <chaordic translate="label" module="chaordic_base">
5
+ <label>Chaordic Systems</label>
6
+ <sort_order>99999</sort_order>
7
+ </chaordic>
8
+ </tabs>
9
+
10
+ <sections>
11
+ <chaordic_base translate="label" module="chaordic_base">
12
+ <label>Configurar integração</label>
13
+ <tab>chaordic</tab>
14
+ <frontend_type>text</frontend_type>
15
+ <sort_order>1000</sort_order>
16
+ <show_in_default>1</show_in_default>
17
+ <show_in_website>1</show_in_website>
18
+ <show_in_store>1</show_in_store>
19
+
20
+ <groups>
21
+ <options translate="label">
22
+ <label>Chaves de integração</label>
23
+ <frontend_type>text</frontend_type>
24
+ <sort_order>1</sort_order>
25
+ <show_in_default>1</show_in_default>
26
+ <show_in_website>1</show_in_website>
27
+ <show_in_store>1</show_in_store>
28
+ <expanded>true</expanded>
29
+
30
+ <fields>
31
+ <api_key>
32
+ <label>API Key</label>
33
+ <comment>Sua chave de integração com a Chaordic</comment>
34
+ <frontend_type>text</frontend_type>
35
+ <sort_order>1</sort_order>
36
+ <show_in_default>1</show_in_default>
37
+ <show_in_website>1</show_in_website>
38
+ <show_in_store>1</show_in_store>
39
+ </api_key>
40
+ <secret_key>
41
+ <label>Secret Key</label>
42
+ <comment>Chave secreta para autenticação da API Key</comment>
43
+ <frontend_type>text</frontend_type>
44
+ <sort_order>2</sort_order>
45
+ <show_in_default>1</show_in_default>
46
+ <show_in_website>1</show_in_website>
47
+ <show_in_store>1</show_in_store>
48
+ </secret_key>
49
+ </fields>
50
+ </options>
51
+
52
+ <methods translate="label">
53
+ <label>Métodos de pagamento</label>
54
+ <frontend_type>text</frontend_type>
55
+ <sort_order>2</sort_order>
56
+ <show_in_default>1</show_in_default>
57
+ <show_in_website>1</show_in_website>
58
+ <show_in_store>1</show_in_store>
59
+ <expanded>true</expanded>
60
+
61
+ <fields>
62
+ <installment_count>
63
+ <label>Número máximo de parcelas</label>
64
+ <comment>Número máximo de parcelas disponíveis para sua loja. Desconsidere formas de pagamento, informe um número global para sua loja.</comment>
65
+ <frontend_type>select</frontend_type>
66
+ <source_model>chaordic_base/installment</source_model>
67
+ <sort_order>0</sort_order>
68
+ <show_in_default>1</show_in_default>
69
+ <show_in_website>1</show_in_website>
70
+ <show_in_store>1</show_in_store>
71
+ </installment_count>
72
+ <installment_price>
73
+ <label>Valor mínimo de cada parcela</label>
74
+ <comment>Valor mínimo para cada parcela. Desconsidere formas de pagamento, informe um valor global para sua loja.</comment>
75
+ <frontend_type>text</frontend_type>
76
+ <sort_order>1</sort_order>
77
+ <show_in_default>1</show_in_default>
78
+ <show_in_website>1</show_in_website>
79
+ <show_in_store>1</show_in_store>
80
+ </installment_price>
81
+
82
+ <bankslip>
83
+ <label>Bank Slip</label>
84
+ <comment>Selecione as formas de pagamento que correspondam ao 'Bank Slip'.</comment>
85
+ <frontend_type>multiselect</frontend_type>
86
+ <source_model>chaordic_base/paymentmethods</source_model>
87
+ <sort_order>2</sort_order>
88
+ <show_in_default>1</show_in_default>
89
+ <show_in_website>1</show_in_website>
90
+ <show_in_store>1</show_in_store>
91
+ </bankslip>
92
+ <creditcard>
93
+ <label>Credit Card</label>
94
+ <comment>Selecione as formas de pagamento que correspondam ao 'Credit Card'.</comment>
95
+ <frontend_type>multiselect</frontend_type>
96
+ <source_model>chaordic_base/paymentmethods</source_model>
97
+ <sort_order>3</sort_order>
98
+ <show_in_default>1</show_in_default>
99
+ <show_in_website>1</show_in_website>
100
+ <show_in_store>1</show_in_store>
101
+ </creditcard>
102
+ <bankdeposit>
103
+ <label>Bank Deposit</label>
104
+ <comment>Selecione as formas de pagamento que correspondam ao 'Bank Deposit'.</comment>
105
+ <frontend_type>multiselect</frontend_type>
106
+ <source_model>chaordic_base/paymentmethods</source_model>
107
+ <sort_order>4</sort_order>
108
+ <show_in_default>1</show_in_default>
109
+ <show_in_website>1</show_in_website>
110
+ <show_in_store>1</show_in_store>
111
+ </bankdeposit>
112
+ <money>
113
+ <label>Money</label>
114
+ <comment>Selecione as formas de pagamento que correspondam ao 'Money'.</comment>
115
+ <frontend_type>multiselect</frontend_type>
116
+ <source_model>chaordic_base/paymentmethods</source_model>
117
+ <sort_order>5</sort_order>
118
+ <show_in_default>1</show_in_default>
119
+ <show_in_website>1</show_in_website>
120
+ <show_in_store>1</show_in_store>
121
+ </money>
122
+ <onlinepayment>
123
+ <label>Online Payment</label>
124
+ <comment>Selecione as formas de pagamento que correspondam ao 'Online Payment'.</comment>
125
+ <frontend_type>multiselect</frontend_type>
126
+ <source_model>chaordic_base/paymentmethods</source_model>
127
+ <sort_order>6</sort_order>
128
+ <show_in_default>1</show_in_default>
129
+ <show_in_website>1</show_in_website>
130
+ <show_in_store>1</show_in_store>
131
+ </onlinepayment>
132
+ <directdebit>
133
+ <label>Direct Debit</label>
134
+ <comment>Selecione as formas de pagamento que correspondam ao 'Direct Debit'.</comment>
135
+ <frontend_type>multiselect</frontend_type>
136
+ <source_model>chaordic_base/paymentmethods</source_model>
137
+ <sort_order>7</sort_order>
138
+ <show_in_default>1</show_in_default>
139
+ <show_in_website>1</show_in_website>
140
+ <show_in_store>1</show_in_store>
141
+ </directdebit>
142
+ </fields>
143
+ </methods>
144
+
145
+ <search translate="label">
146
+ <label>Módulo Search</label>
147
+ <sort_order>3</sort_order>
148
+ <show_in_default>1</show_in_default>
149
+ <show_in_website>1</show_in_website>
150
+ <show_in_store>1</show_in_store>
151
+ <expanded>true</expanded>
152
+
153
+ <fields>
154
+ <pageid>
155
+ <label>ID da página Search</label>
156
+ <comment>ID da página de estrutura do search. A página será automaticamente criada no primeiro acesso do crawler. Se a opção estiver em branco a página ainda não foi criada. Se preferir você pode informar o ID de outra página.</comment>
157
+ <frontend_type>text</frontend_type>
158
+ <sort_order>1</sort_order>
159
+ <show_in_default>1</show_in_default>
160
+ <show_in_website>1</show_in_website>
161
+ <show_in_store>1</show_in_store>
162
+ </pageid>
163
+ </fields>
164
+ </search>
165
+ </groups>
166
+ </chaordic_base>
167
+ </sections>
168
+ </config>
app/design/frontend/base/default/layout/chaordic_base.xml ADDED
@@ -0,0 +1,176 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0"?>
2
+ <layout version="1.0">
3
+ <!-- Loader -->
4
+ <default>
5
+ <reference name="head">
6
+ <block type="chaordic_base/meta" name="chaordic.user">
7
+ <action method="setData">
8
+ <name>context</name>
9
+ <value>user</value>
10
+ </action>
11
+ <action method="routeModel"/>
12
+ </block>
13
+
14
+ <block type="chaordic_base/meta"
15
+ name="chaordic.meta"
16
+ template="chaordic/meta.phtml"
17
+ after="-"/>
18
+
19
+ <block type="chaordic_base/loader"
20
+ name="chaordic.loader"
21
+ template="chaordic/loader.phtml"
22
+ after="-" />
23
+ </reference>
24
+ </default>
25
+
26
+ <!-- Catalog -->
27
+ <catalog_category_default>
28
+ <reference name="head">
29
+ <block type="chaordic_base/meta" name="chaordic.catalog">
30
+ <action method="setData">
31
+ <name>context</name>
32
+ <value>catalog</value>
33
+ </action>
34
+ <action method="routeModel"/>
35
+ </block>
36
+ </reference>
37
+ </catalog_category_default>
38
+
39
+ <catalog_category_layered>
40
+ <reference name="head">
41
+ <block type="chaordic_base/meta" name="chaordic.catalog">
42
+ <action method="setData">
43
+ <name>context</name>
44
+ <value>catalog</value>
45
+ </action>
46
+ <action method="routeModel"/>
47
+ </block>
48
+ </reference>
49
+ </catalog_category_layered>
50
+
51
+ <catalog_product_view>
52
+ <reference name="head">
53
+ <block type="chaordic_base/meta" name="chaordic.product">
54
+ <action method="setData">
55
+ <name>context</name>
56
+ <value>product</value>
57
+ </action>
58
+ <action method="routeModel"/>
59
+ </block>
60
+ </reference>
61
+ </catalog_product_view>
62
+
63
+ <!-- Checkout -->
64
+ <checkout_cart_index>
65
+ <reference name="head">
66
+ <block type="chaordic_base/meta" name="chaordic.cart">
67
+ <action method="setData">
68
+ <name>context</name>
69
+ <value>cart</value>
70
+ </action>
71
+ <action method="routeModel"/>
72
+ </block>
73
+ </reference>
74
+ </checkout_cart_index>
75
+
76
+ <checkout_cart_configure>
77
+ <reference name="head">
78
+ <block type="chaordic_base/meta" name="chaordic.cart.configure">
79
+ <action method="setData">
80
+ <name>context</name>
81
+ <value>cart</value>
82
+ </action>
83
+ <action method="routeModel"/>
84
+ </block>
85
+ </reference>
86
+ </checkout_cart_configure>
87
+
88
+ <checkout_onepage_index>
89
+ <reference name="head">
90
+ <block type="chaordic_base/meta" name="chaordic.checkout">
91
+ <action method="setData">
92
+ <name>context</name>
93
+ <value>checkout</value>
94
+ </action>
95
+ <action method="routeModel"/>
96
+ </block>
97
+ </reference>
98
+ </checkout_onepage_index>
99
+
100
+ <checkout_onepage_success>
101
+ <reference name="head">
102
+ <block type="chaordic_base/meta" name="chaordic.confirmation">
103
+ <action method="setData">
104
+ <name>context</name>
105
+ <value>confirmation</value>
106
+ </action>
107
+ <action method="routeModel"/>
108
+ </block>
109
+ </reference>
110
+ </checkout_onepage_success>
111
+
112
+ <!-- Search -->
113
+ <catalogsearch_result_index>
114
+ <reference name="head">
115
+ <block type="chaordic_base/meta"
116
+ name="chaordic.search.result">
117
+ <action method="setData">
118
+ <name>context</name>
119
+ <value>search</value>
120
+ </action>
121
+ <action method="routeModel"/>
122
+ </block>
123
+ </reference>
124
+ </catalogsearch_result_index>
125
+
126
+ <catalogsearch_advanced_result>
127
+ <reference name="head">
128
+ <block type="chaordic_base/meta" name="chaordic.search.advancedresult">
129
+ <action method="setData">
130
+ <name>context</name>
131
+ <value>search</value>
132
+ </action>
133
+ <action method="routeModel"/>
134
+ </block>
135
+ </reference>
136
+ </catalogsearch_advanced_result>
137
+
138
+ <!-- CMS -->
139
+ <cms_index_index>
140
+ <reference name="head">
141
+ <block type="chaordic_base/meta" name="chaordic.cms.home">
142
+ <action method="setData">
143
+ <name>context</name>
144
+ <value>home</value>
145
+ </action>
146
+ <action method="routeModel"/>
147
+ </block>
148
+ </reference>
149
+ </cms_index_index>
150
+
151
+ <cms_page>
152
+ <reference name="head">
153
+ <block type="chaordic_base/meta" name="chaordic.cms.page">
154
+ <action method="setData">
155
+ <name>context</name>
156
+ <value>cms_page</value>
157
+ </action>
158
+ <action method="routeModel"/>
159
+ </block>
160
+ </reference>
161
+ </cms_page>
162
+
163
+ <!-- Customer -->
164
+ <customer_account>
165
+ <reference name="head">
166
+ <block type="chaordic_base/meta" name="chaordic.customer">
167
+ <action method="setData">
168
+ <name>context</name>
169
+ <value>customer</value>
170
+ </action>
171
+ <action method="routeModel"/>
172
+ </block>
173
+ </reference>
174
+ </customer_account>
175
+
176
+ </layout>
app/design/frontend/base/default/template/chaordic/loader.phtml ADDED
@@ -0,0 +1,10 @@
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * @category Chaordic
4
+ * @package Chaordic_Base
5
+ * @version 1.0.0
6
+ * @copyright Copyright (c) 2014 Chaordic Systems (http://www.chaordicsystems.com)
7
+ */
8
+ ?>
9
+
10
+ <?php echo $this->_toHtml(); ?>
app/design/frontend/base/default/template/chaordic/meta.phtml ADDED
@@ -0,0 +1,17 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * @category Chaordic
4
+ * @package Chaordic_Base
5
+ * @version 1.0.0
6
+ * @copyright Copyright (c) 2014 Chaordic Systems (http://www.chaordicsystems.com)
7
+ */
8
+
9
+ $props = Mage::getSingleton('chaordic_base/meta')->getProps();
10
+
11
+ ?>
12
+
13
+ <?php if ( ! empty($props) ) : ?>
14
+ <script type="text/javascript">
15
+ window.chaordic_meta = <?php echo json_encode($props) ?>;
16
+ </script>
17
+ <?php endif; ?>
app/etc/modules/Chaordic_Base.xml ADDED
@@ -0,0 +1,9 @@
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0"?>
2
+ <config>
3
+ <modules>
4
+ <Chaordic_Base>
5
+ <active>true</active>
6
+ <codePool>community</codePool>
7
+ </Chaordic_Base>
8
+ </modules>
9
+ </config>
package.xml ADDED
@@ -0,0 +1,21 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0"?>
2
+ <package>
3
+ <name>Chaordic_Base</name>
4
+ <version>1.0.0</version>
5
+ <stability>stable</stability>
6
+ <license>GPL</license>
7
+ <channel>community</channel>
8
+ <extends/>
9
+ <summary>M&#xF3;dulo de integra&#xE7;&#xE3;o Chaordic.</summary>
10
+ <description>Integra informa&#xE7;&#xF5;es da loja Magento aos servi&#xE7;os da Chaordic Systems.</description>
11
+ <notes>Vers&#xE3;o com suporte a recursos do produto Onsite e Search:&#xD;
12
+ - Integra&#xE7;&#xE3;o do Loader Chaordic.&#xD;
13
+ - Integra&#xE7;&#xE3;o dos modelos de dados de produtos, categorias, carrinho, transa&#xE7;&#xF5;es e usu&#xE1;rios.&#xD;
14
+ - P&#xE1;gina de modelo Search.</notes>
15
+ <authors><author><name>Chaordic Systems</name><user>chaordic</user><email>costa@chaordicsystems.com.br</email></author></authors>
16
+ <date>2015-01-08</date>
17
+ <time>16:51:31</time>
18
+ <contents><target name="mageetc"><dir name="modules"><file name="Chaordic_Base.xml" hash="c6efd2e90b8a8fc38f7ef1d92d51a57c"/></dir></target><target name="magecommunity"><dir name="Chaordic"><dir name="Base"><dir name="Block"><file name="Loader.php" hash="eca85c7647f1187b0309b5fade41dd5d"/><file name="Meta.php" hash="a63c9dcd7454c3ba7ad4a095ebe50806"/></dir><dir name="Helper"><file name="Data.php" hash="f64847c0ffa24a585837dfe19d2aba3b"/></dir><dir name="Model"><file name="Catalog.php" hash="7875b6dab0172b521b98517b0c33615c"/><file name="Checkout.php" hash="76bf634f513bc1cbddee5f7ed2493553"/><file name="Cms.php" hash="51b7f10cf52d10c7fde425ee609c4441"/><file name="Customer.php" hash="7be5f5749727be875c361c9a41504e5e"/><file name="Installment.php" hash="da2c100d8db9dd7dd5fbeb3a935c8a21"/><file name="Meta.php" hash="81fd78719a8bf3b6dbb20b716b87897c"/><file name="PaymentMethods.php" hash="2b091718ff97ec5fe0c5f81aba7c30c0"/><file name="Product.php" hash="80f4cb0cf5db13b42beb6184a6d691d4"/><file name="Search.php" hash="ca048a463d55b795305e0faea28b4301"/><file name="User.php" hash="51b39cffb0224946187af903d4f65b03"/></dir><dir name="controllers"><file name="RemoteController.php" hash="394e7eac5ef0af5608028305e29b79bf"/></dir><dir name="etc"><file name="config.xml" hash="9ca29fb667fb51df6bb5a65a55c72880"/><file name="system.xml" hash="7c1f10996ad9ed6e08d508c99888919c"/></dir><file name=".DS_Store" hash="9567c71fb3193ad25155b1c371035ddf"/></dir><file name=".DS_Store" hash="194577a7e20bdcc7afbb718f502c134c"/><file name=".gitignore" hash="2f0cd577d0e696bae6250e3681d0860a"/></dir></target><target name="magedesign"><dir name="frontend"><dir name="base"><dir name="default"><dir name="layout"><file name="chaordic_base.xml" hash="82f6c382942b84eb8138b28a4da700b7"/></dir><dir name="template"><dir name="chaordic"><file name="loader.phtml" hash="934137d2ff16abcb65b7af83a5db4e98"/><file name="meta.phtml" hash="454b125a3a80151355f365a6bd91eb07"/></dir></dir></dir></dir></dir></target></contents>
19
+ <compatible/>
20
+ <dependencies><required><php><min>5.4.0</min><max>6.0.0</max></php><package><name>Mage_Core_Modules</name><channel>community</channel><min>1.6.0.0</min><max>1.9.0.0</max></package></required></dependencies>
21
+ </package>