Freightquote_com_Shipping_Module - Version 1.2.1

Version Notes

Added debug logging option to help with installations

Download this release

Release Info

Developer Freightquote
Extension Freightquote_com_Shipping_Module
Version 1.2.1
Comparing to
See all releases


Code changes from version 1.2.0 to 1.2.1

app/code/community/Freightquote/Shipping/Helper/Data.php ADDED
@@ -0,0 +1,13 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /*
3
+ Freightquote.com Shipping Module for Magento Commerce
4
+
5
+ Copyright (c) 2015 Freightquote.com
6
+
7
+ Released under the Open Software License (OSL 3.0)
8
+ */
9
+
10
+ class Freightquote_Shipping_Helper_Data extends Mage_Core_Helper_Abstract {
11
+
12
+ }
13
+ ?>
app/code/community/Freightquote/Shipping/Model/Carrier/Shipping.php ADDED
@@ -0,0 +1,614 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /*
3
+ Freightquote.com Shipping Module for Magento Commerce
4
+
5
+ Copyright (c) 2015 Freightquote.com
6
+
7
+ Released under the Open Software License (OSL 3.0)
8
+ */
9
+
10
+ class Freightquote_Shipping_Model_Carrier_Shipping
11
+ extends Mage_Shipping_Model_Carrier_Abstract {
12
+
13
+ protected $_code = 'freightquote';
14
+ protected $_request = null;
15
+ protected $_response = null;
16
+ protected $_result = null;
17
+ protected $_gatewayUrl = 'https://b2b.Freightquote.com/WebService/QuoteService.asmx';
18
+ //protected $_gatewayUrl = '10.40.1.130:8081/QuoteService.asmx';
19
+
20
+ public function collectRates(Mage_Shipping_Model_Rate_Request $request) {
21
+ if (!$this->getConfigData('active')) {
22
+ Mage::log('The ' . $this->_code . ' shipping method is not active.');
23
+
24
+ return false;
25
+ }
26
+
27
+ $this->_request = $this->setRequest($request);
28
+
29
+ $this->_getQuotes();
30
+
31
+ //$this->_updateFreeMethodQuote($request);
32
+
33
+ return $this->_result;
34
+ }
35
+
36
+ public function setRequest(Mage_Shipping_Model_Rate_Request $request) {
37
+ $r = new Varien_Object();
38
+
39
+ if ($request->getLimitMethod()) {
40
+ $r->setService($request->getLimitMethod());
41
+ }
42
+
43
+ $storeId = Mage::app()->getStore()->getId();
44
+ $websiteId = Mage::app()->getStore($storeId)->getWebsiteId();
45
+
46
+ $store = new Mage_Adminhtml_Model_System_Store();
47
+ $storeName = strtolower($store->getStoreName($storeId));
48
+
49
+ unset($store, $storeId, $websiteId);
50
+
51
+ $r->setOrigName($storeName);
52
+
53
+ $r->setUsername($this->getConfigData('username'));
54
+ $r->setPassword($this->getConfigData('password'));
55
+
56
+ if ($request->getFreightquotePackaging()) {
57
+ $packaging = $request->getFreightquotePackaging();
58
+ }
59
+
60
+ //$r->setPackaging($packaging);
61
+ $r->setServiceType($this->getConfigData('service_type'));
62
+
63
+ $r->setOrigLocationType($this->getConfigData('origin_location_type'));
64
+ $r->setOrigLiftgate(($this->getConfigData('origin_liftgate') == 1 ? 'true' : 'false'));
65
+
66
+ $r->setDestLocationType($this->getConfigData('destination_location_type'));
67
+ $r->setDestLiftgate(($this->getConfigData('destination_liftgate') == 1 ? 'true' : 'false'));
68
+
69
+ $r->setOrigName(Mage::getStoreConfig('design/head/default_title'));
70
+ if ($request->getOrigPostcode()) {
71
+ $r->setOrigPostcode($request->getOrigPostcode());
72
+ } else {
73
+ $r->setOrigPostcode(Mage::getStoreConfig('shipping/origin/postcode', $this->getStore()));
74
+ }
75
+
76
+ if ($request->getOrigCountry()) {
77
+ $origCountry = $request->getOrigCountry();
78
+ } else {
79
+ $origCountry = Mage::getStoreConfig('shipping/origin/country_id', $this->getStore());
80
+ }
81
+ $r->setOrigCountry(Mage::getModel('directory/country')->load($origCountry)->getIso2Code());
82
+
83
+ $r->setOrigDock(($this->getConfigData('origin_dock') ? 'true' : 'false'));
84
+ $r->setOrigConstruction(($this->getConfigData('origin_construction') ? 'true' : 'false'));
85
+ $r->setOrigResidence(($this->getConfigData('origin_residence') ? 'true' : 'false'));
86
+
87
+
88
+ if ($request->getDestCountryId()) {
89
+ $destCountry = $request->getDestCountryId();
90
+ } else {
91
+ $destCountry = self::USA_COUNTRY_ID;
92
+ }
93
+
94
+ $r->setDestCountry($destCountry);
95
+
96
+ if ($request->getDestPostcode()) {
97
+ if ($destCountry == 'US') {
98
+ $destPostcode = preg_replace('/[^0-9]/', '', $request->getDestPostcode());
99
+ $destPostcode = substr($destPostcode, 0, 5);
100
+ } elseif ($destCountry == 'CA') {
101
+ $destPostcode = preg_replace('/[^0-9A-Z]/', '', strtoupper($request->getDestPostcode()));
102
+ $destPostcode = substr($destPostcode, 0, 6);
103
+ }
104
+ $r->setDestPostcode($destPostcode);
105
+ } else {
106
+ Mage::log('Freightquote.com Shipping Module missing destination postcode.');
107
+ return false;
108
+ }
109
+
110
+ $r->setDestResidence(($this->getConfigData('destination_residence') == 1 ? 'true' : 'false'));
111
+ $r->setDestConstruction(($this->getConfigData('destination_construction') == 1 ? 'true' : 'false'));
112
+ $r->setDestDock(($this->getConfigData('destination_dock') == 1 ? 'true' : 'false'));
113
+
114
+ $weight = $this->getTotalNumOfBoxes($request->getPackageWeight());
115
+ $r->setWeight($weight);
116
+
117
+ if ($request->getFreeMethodWeight()!= $request->getPackageWeight()) {
118
+ $r->setFreeMethodWeight($request->getFreeMethodWeight());
119
+ }
120
+
121
+ $r->setValue($request->getPackageValue());
122
+ $r->setValueWithDiscount($request->getPackageValueWithDiscount());
123
+
124
+ return $r;
125
+ }
126
+
127
+ protected function _getQuotes() {
128
+ $r =& $this->_request;
129
+
130
+ $customerName = trim(Mage::getSingleton('customer/session')->getCustomer()->getName());
131
+
132
+ /* Set up initial XML structure */
133
+ $requestXml = array(
134
+ 'GetRatingEngineQuote' => array(
135
+ 'request' => array(
136
+ 'CustomerId' => (int)$r->getUserId(),
137
+ 'QuoteType' => 'B2B',
138
+ 'ServiceType' => $r->getServiceType(),
139
+ 'QuoteShipment' => array(
140
+ 'ShipmentLabel' => $this->getConfigData('shipment_label'),
141
+ 'IsBlind' => ($this->getConfigData('blind_ship') ? 'true' : 'false'),
142
+ 'ShipmentLocations' => array(
143
+ 'Location' => array(
144
+ array(
145
+ 'LocationName' => $r->getOrigName(),
146
+ 'LocationType' => $r->getOrigLocationType(),
147
+ 'HasLoadingDock' => $r->getOrigDock(),
148
+ 'RequiresLiftgate' => $r->getOrigLiftgate(),
149
+ 'IsConstructionSite' => $r->getOrigConstruction(),
150
+ 'IsResidential' => $r->getOrigResidence(),
151
+ 'LocationAddress' => array(
152
+ 'PostalCode' => $r->getOrigPostcode(),
153
+ 'CountryCode' => $r->getOrigCountry()
154
+ )
155
+ ),
156
+ array(
157
+ 'LocationName' => ($customerName == '' ? 'Guest' : $customerName),
158
+ 'LocationType' => $r->getDestLocationType(),
159
+ 'HasLoadingDock' => $r->getDestDock(),
160
+ 'RequiresLiftgate' => $r->getDestLiftgate(),
161
+ 'IsConstructionSite' => $r->getDestConstruction(),
162
+ 'IsResidential' => $r->getDestResidence(),
163
+ 'LocationAddress' => array(
164
+ 'PostalCode' => $r->getDestPostcode(),
165
+ 'CountryCode' => $r->getDestCountry()
166
+ )
167
+ )
168
+ )
169
+ ),
170
+ 'ShipmentProducts' => array(
171
+ 'Product' => array()
172
+ )
173
+ )
174
+ ),
175
+ 'user' => array(
176
+ 'Name' => $r->getUsername(),
177
+ 'Password' => $r->getPassword()
178
+ )
179
+ )
180
+ );
181
+
182
+ /* Process cart items */
183
+ $cartItems = Mage::getModel('checkout/session')->getQuote()->getAllItems();
184
+ $shipmentProducts = array();
185
+ $counter = 1;
186
+ $excluded = 0;
187
+
188
+ foreach ($cartItems as $item) {
189
+ $product = $item->getProduct();
190
+
191
+ if ($product->getData('freightquote_enable') == 1) {
192
+ $shipmentProducts[] = array(
193
+ 'Class' => $product->getData('freightquote_class'),
194
+ 'ProductDescription' => $item->getName(),
195
+ 'Weight' => ceil($item->getQty() * (int)$item->getWeight()),
196
+ 'Length' => ceil($product->getData('freightquote_length')),
197
+ 'Width' => ceil($product->getData('freightquote_width')),
198
+ 'Height' => ceil($product->getData('freightquote_height')),
199
+ 'PackageType' => ($product->getData('freightquote_packaging') ? $product->getData('freightquote_packaging') : 'Boxes'),
200
+ 'DeclaredValue' => round($item->getPrice()),
201
+ 'CommodityType' => ($product->getData('freightquote_commodity') ? $product->getData('freightquote_commodity') : 'GeneralMerchandise'),
202
+ 'ContentType' => ($product->getData('freightquote_content') ? $product->getData('freightquote_content') : 'NewCommercialGoods'),
203
+ 'IsHazardousMaterial' => ($product->getData('freightquote_hzmt') == 1 ? 'true' : 'false'),
204
+ 'NMFC' => $product->getData('freightquote_nmfc'),
205
+ 'PieceCount' => $item->getQty(),
206
+ 'ItemNumber' => $counter
207
+ );
208
+ $counter++;
209
+ } else {
210
+ $excluded++;
211
+ }
212
+ }
213
+
214
+ $totalProducts = count($shipmentProducts);
215
+
216
+ /* Don't continue if there are no valid products */
217
+ if ($totalProducts < 1) {
218
+ return false;
219
+ }
220
+
221
+ /* Maximum 6 products allowed per query, so repeat the query multiple times if necessary */
222
+ $responses = array();
223
+
224
+ /* Only 6 items allowed per query */
225
+ for ($x = 0; $x < $totalProducts; $x+=6) {
226
+ $productRequest = array();
227
+
228
+ for ($n = 1; $n <= 6; $n++) {
229
+ $ret = ($n + $x) - 1;
230
+ if (isset($shipmentProducts[$ret])) {
231
+ $productRequest[] = $shipmentProducts[$ret];
232
+ }
233
+ }
234
+
235
+ $requestXml['GetRatingEngineQuote']['request']['QuoteShipment']['ShipmentProducts']['Product'] = $productRequest;
236
+
237
+ $response = $this->_executeRequest($requestXml);
238
+
239
+ if (!$response) {
240
+ Mage::log('Freightquote.com: Invalid response from Freightquote.com');
241
+ return false;
242
+ }
243
+
244
+ if (isset($response['GetRatingEngineQuoteResponse'])) {
245
+ $responses[] = $response['GetRatingEngineQuoteResponse'][0]['GetRatingEngineQuoteResult'][0];
246
+ }
247
+ }
248
+
249
+ $totalShippingPrice = array(
250
+ 'rate' => 0,
251
+ 'shipment_id' => ''
252
+ );
253
+
254
+ $errors = array();
255
+
256
+ foreach ($responses as $quote) {
257
+
258
+
259
+ if (@is_array($quote['QuoteCarrierOptions'])) {
260
+ if ($totalShippingPrice['shipment_id'] != '') $totalShippingPrice['shipment_id'] .= ' & ';
261
+ $totalShippingPrice['shipment_id'] .= $quote['QuoteId'];
262
+
263
+ $totalShippingPrice['rate'] += preg_replace('/[^0-9\.]/', '', $quote['QuoteCarrierOptions'][0]['CarrierOption'][0]['QuoteAmount']);
264
+ } elseif (@count($quote['ValidationErrors']) > 0) {
265
+ foreach ($quote['ValidationErrors'][0]['B2BError'] as $errorMsg) {
266
+
267
+ if ($this->getConfigData('debug')){
268
+ Mage::log('Freightquote.com - response: ' . $errorMsg['ErrorMessage']);
269
+ }
270
+
271
+ $errors[] = $errorMsg['ErrorMessage'];
272
+ }
273
+ }
274
+ }
275
+
276
+ /* If there are any validation errors, don't display this shipping option */
277
+ if (count($errors) > 0) {
278
+ Mage::log('Freightquote.com: Validation errors. No rate was returned.');
279
+ return false;
280
+ }
281
+
282
+
283
+ /* If the shipping price is 0 and no errors were returned, don't display this shipping option */
284
+ if ($totalShippingPrice['rate'] <= 0 && count($errors) < 1) {
285
+ Mage::log('Freightquote.com: Total shipping price returned was 0');
286
+ return false;
287
+ }
288
+
289
+ //Add price modifier
290
+ if ($this->getConfigData('rate_modifier') > 0) {
291
+ $totalShippingPrice['rate'] = $totalShippingPrice['rate'] * $this->getConfigData('rate_modifier');
292
+ }
293
+
294
+ //Add handling charges
295
+ if ($this->getConfigData('handling_fee') > 0) {
296
+ if ($this->getConfigData('handling_action') == 'O') {
297
+ $totalShippingPrice['rate'] += $this->getConfigData('handling_fee');
298
+ } elseif ($this->getConfigData('handling_action') == 'P') {
299
+ $totalShippingPrice['rate'] += $this->getConfigData('handling_fee') * $totalProducts;
300
+ }
301
+ }
302
+
303
+ $this->_result = Mage::getModel('shipping/rate_result');
304
+
305
+ $method = Mage::getModel('shipping/rate_result_method');
306
+ $method->setCarrier($this->_code);
307
+ $method->setCarrierTitle($this->getConfigData('title'));
308
+ $method->setMethod('default');
309
+ $method->setMethodTitle('Quote #: ' . $totalShippingPrice['shipment_id']);
310
+ $method->setPrice($totalShippingPrice['rate']);
311
+
312
+ $this->_result->append($method);
313
+
314
+ return true;
315
+ }
316
+
317
+ protected function _executeRequest($arr) {
318
+ //Make sure cURL exists
319
+ if (!function_exists('curl_init')) {
320
+ Mage::log('Freightquote.com: cURL not found on the server.');
321
+ return false;
322
+ }
323
+
324
+ //XML template file used for request
325
+ $xml = $this->_arrayToXml($arr);
326
+
327
+ //Initialize curl
328
+ $ch = curl_init();
329
+
330
+ $headers = array(
331
+ 'Content-Type: text/xml; charset=utf-8',
332
+ 'Content-Length: ' . strlen($xml),
333
+ 'SOAPAction: "http://tempuri.org/GetRatingEngineQuote"'
334
+ );
335
+
336
+ curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
337
+ curl_setopt($ch, CURLOPT_HEADER, 0);
338
+ curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
339
+ curl_setopt($ch, CURLOPT_TIMEOUT, 180);
340
+ curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
341
+ curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
342
+ curl_setopt($ch, CURLOPT_POST, 1);
343
+ curl_setopt($ch, CURLOPT_URL, $this->_gatewayUrl);
344
+ curl_setopt($ch, CURLOPT_POSTFIELDS, $xml);
345
+
346
+ $this->_response = curl_exec($ch);
347
+
348
+ if ($this->getConfigData('debug')){
349
+ Mage::log('Freightquote.com request: ' . $xml);
350
+ Mage::log('Freightquote.com response: ' . $this->_response);
351
+ }
352
+
353
+ if (curl_errno($ch) == 0) {
354
+ curl_close($ch);
355
+
356
+ //Simple check to make sure that this is a valid XML response
357
+ if (strpos(strtolower($this->_response), 'soap:envelope') === false) {
358
+ Mage::log('Freightquote.com: Invalid response from server.');
359
+ return false;
360
+ }
361
+
362
+ if ($this->_response) {
363
+ //Convert the XML into an easy-to-use associative array
364
+ $this->_response = $this->_parseXml($this->_response);
365
+ }
366
+
367
+ return $this->_response;
368
+ } else {
369
+ //Collect the error returned
370
+ $curlErrors = curl_error($ch) . ' (Error No. ' . curl_errno($ch) . ')';
371
+
372
+ curl_close($ch);
373
+
374
+ Mage::log('Freightquote.com: ' . $curlErrors);
375
+ return false;
376
+ }
377
+ }
378
+
379
+ protected function _getPickupDate() {
380
+ $nextDate = date("U")+86400;
381
+
382
+ $workDay = date("w", $nextDate);
383
+
384
+ if ($workDay > 0 && $workDay < 6) {
385
+ while ($this->_isHoliday($nextDate)) {
386
+ $nextDate += 86400;
387
+ $workDay = date("w", $nextDate);
388
+ }
389
+ return date(DATE_ATOM, $nextDate);
390
+ } else {
391
+ while ($workDay < 1 || $workDay > 5) {
392
+ $nextDate += 86400;
393
+ $workDay = date("w", $nextDate);
394
+ if ($workDay > 0 && $workDay < 6) {
395
+ while ($this->_isHoliday($nextDate)) {
396
+ $nextDate += 86400;
397
+ $workDay = date("w", $nextDate);
398
+ }
399
+ return date(DATE_ATOM, $nextDate);
400
+ }
401
+ }
402
+ }
403
+ }
404
+
405
+ protected function _isHoliday($date) {
406
+ $fed_holidays = array(
407
+ "2010-01-01", "2010-01-18", "2010-02-15", "2010-05-31",
408
+ "2010-07-05", "2010-09-06", "2010-10-11", "2010-11-11",
409
+ "2010-11-25", "2010-12-24",
410
+
411
+ "2010-12-31", "2011-01-17", "2011-02-21", "2011-05-30",
412
+ "2011-07-04", "2011-09-05", "2011-10-10", "2011-11-11",
413
+ "2011-11-24", "2011-12-26",
414
+
415
+ "2012-01-02", "2012-01-16", "2012-02-20", "2012-05-28",
416
+ "2012-07-04", "2012-09-03", "2012-10-08", "2012-11-12",
417
+ "2012-11-22", "2012-12-25"
418
+ );
419
+
420
+ if (in_array(date("Y-m-d", $date), $fed_holidays)) {
421
+ return true;
422
+ }
423
+
424
+ return false;
425
+ }
426
+
427
+ protected function _arrayToXml($array, $wrapper = true) {
428
+ $xml = '';
429
+
430
+ if ($wrapper) {
431
+ $xml = '<?xml version="1.0" encoding="utf-8"?>' . "\n" .
432
+ '<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"' . "\n" .
433
+ 'xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">' . "\n" .
434
+ '<soap:Body>' . "\n";
435
+ }
436
+
437
+ $first_key = true;
438
+
439
+ foreach ($array as $key => $value) {
440
+ $position = 0;
441
+
442
+ if (is_array($value)) {
443
+ $is_value_assoc = $this->_isAssoc($value);
444
+ $xml .= "<$key" . ($first_key && $wrapper ? ' xmlns="http://tempuri.org/"' : '') . ">\n";
445
+ $first_key = false;
446
+
447
+ foreach ($value as $key2 => $value2) {
448
+ if (is_array($value2)) {
449
+ if ($is_value_assoc) {
450
+ $xml .= "<$key2>\n" . $this->_arrayToXml($value2, false) . "</$key2>\n";
451
+ } elseif (is_array($value2)) {
452
+ $xml .= $this->_arrayToXml($value2, false);
453
+ $position++;
454
+
455
+ if ($position < count($value) && count($value) > 1) $xml .= "</$key>\n<$key>\n";
456
+ }
457
+ } else {
458
+ $xml .= "<$key2>" . $this->_xmlSafe($value2) . "</$key2>\n";
459
+ }
460
+ }
461
+ $xml .= "</$key>\n";
462
+ } else {
463
+
464
+ $xml .= "<$key>" . $this->_xmlSafe($value) . "</$key>\n";
465
+ }
466
+ }
467
+
468
+ if ($wrapper) {
469
+ $xml .= '</soap:Body>' . "\n" .
470
+ '</soap:Envelope>';
471
+ }
472
+
473
+ return $xml;
474
+ }
475
+
476
+ protected function _isAssoc($array) {
477
+ return (is_array($array) && 0 !== count(array_diff_key($array, array_keys(array_keys($array)))));
478
+ }
479
+
480
+ protected function _parseXml($text) {
481
+ $reg_exp = '/<(\w+)[^>]*>(.*?)<\/\\1>/s';
482
+ preg_match_all($reg_exp, $text, $match);
483
+ foreach ($match[1] as $key=>$val) {
484
+ if ( preg_match($reg_exp, $match[2][$key]) ) {
485
+ $array[$val][] = $this->_parseXml($match[2][$key]);
486
+ } else {
487
+ $array[$val] = $match[2][$key];
488
+ }
489
+ }
490
+ return $array;
491
+ }
492
+
493
+ protected function _xmlSafe($str) {
494
+ //The 5 evil characters in XML
495
+ $str = str_replace('<', '&lt;', $str);
496
+ $str = str_replace('>', '&gt;', $str);
497
+ $str = str_replace('&', '&amp;', $str);
498
+ $str = str_replace("'", '&apos;', $str);
499
+ $str = str_replace('"', '&quot;', $str);
500
+
501
+ return $str;
502
+ }
503
+
504
+ public function getCode($type, $code = '') {
505
+ $codes = array(
506
+ 'classes' => array(
507
+ array('value' => '50', 'label' => '50'),
508
+ array('value' => '55', 'label' => '55'),
509
+ array('value' => '60', 'label' => '60'),
510
+ array('value' => '65', 'label' => '65'),
511
+ array('value' => '70', 'label' => '70'),
512
+ array('value' => '77.5', 'label' => '77.5'),
513
+ array('value' => '85', 'label' => '85'),
514
+ array('value' => '92.5', 'label' => '92.5'),
515
+ array('value' => '100', 'label' => '100'),
516
+ array('value' => '110', 'label' => '110'),
517
+ array('value' => '125', 'label' => '125'),
518
+ array('value' => '150', 'label' => '150'),
519
+ array('value' => '175', 'label' => '175'),
520
+ array('value' => '200', 'label' => '200'),
521
+ array('value' => '250', 'label' => '250'),
522
+ array('value' => '300', 'label' => '300'),
523
+ array('value' => '400', 'label' => '400'),
524
+ array('value' => '500', 'label' => '500')
525
+ ),
526
+
527
+ 'packaging' => array(
528
+ array('value' => 'Bags', 'label' => 'Bags'),
529
+ array('value' => 'Bales', 'label' => 'Bales'),
530
+ array('value' => 'Boxes', 'label' => 'Boxes'),
531
+ array('value' => 'Bundles', 'label' => 'Bundles'),
532
+ array('value' => 'Carpets', 'label' => 'Carpets'),
533
+ array('value' => 'Coils', 'label' => 'Coils'),
534
+ array('value' => 'Crates', 'label' => 'Crates'),
535
+ array('value' => 'Cylinders', 'label' => 'Cylinders'),
536
+ array('value' => 'Drums', 'label' => 'Drums'),
537
+ array('value' => 'Pails', 'label' => 'Pails'),
538
+ array('value' => 'Reels', 'label' => 'Reels'),
539
+ array('value' => 'Rolls', 'label' => 'Rolls'),
540
+ array('value' => 'TubesPipes', 'label' => 'Tubes/Pipes'),
541
+ array('value' => 'Motorcycle', 'label' => 'Motorcycle'),
542
+ array('value' => 'ATV', 'label' => 'ATV'),
543
+ array('value' => 'Pallets_48x40', 'label' => 'Pallets 48x40'),
544
+ array('value' => 'Pallets_other', 'label' => 'Pallets Other'),
545
+ array('value' => 'Pallets_120x120', 'label' => 'Pallets 120x120'),
546
+ array('value' => 'Pallets_120x100', 'label' => 'Pallets 120x100'),
547
+ array('value' => 'Pallets_120x80', 'label' => 'Pallets 120x80'),
548
+ array('value' => 'Pallets_europe', 'label' => 'Pallets Europe'),
549
+ array('value' => 'Pallets_48x48', 'label' => 'Pallets 48x48'),
550
+ array('value' => 'Pallets_60x48', 'label' => 'Pallets 60x48')
551
+ ),
552
+
553
+ 'commodities' => array(
554
+ array('value' => 'GeneralMerchandise', 'label' => 'General Merchandise'),
555
+ array('value' => 'Machinery', 'label' => 'Machinery'),
556
+ array('value' => 'HouseholdGoods', 'label' => 'Household Goods'),
557
+ array('value' => 'FragileGoods', 'label' => 'Fragile Goods'),
558
+ array('value' => 'ComputerHardware', 'label' => 'Computer Hardware'),
559
+ array('value' => 'BottledProducts', 'label' => 'Bottled Products'),
560
+ array('value' => 'BottleBeverages', 'label' => 'Bottle Beverages'),
561
+ array('value' => 'NonPerishableFood', 'label' => 'Non Perishable Food'),
562
+ array('value' => 'SteelSheet', 'label' => 'Steel Sheet'),
563
+ array('value' => 'BrandedGoods', 'label' => 'Branded Goods'),
564
+ array('value' => 'PrecisionInstruments', 'label' => 'Precision Instruments'),
565
+ array('value' => 'ChemicalsHazardous', 'label' => 'Chemicals Hazardous'),
566
+ array('value' => 'FineArt', 'label' => 'Fine Art'),
567
+ array('value' => 'Automobiles', 'label' => 'Automobiles'),
568
+ array('value' => 'CellPhones', 'label' => 'Cell Phones'),
569
+ array('value' => 'NewMachinery', 'label' => 'New Machinery'),
570
+ array('value' => 'UsedMachinery', 'label' => 'Used Machinery'),
571
+ array('value' => 'HotTubs', 'label' => 'Hot Tubs')
572
+ ),
573
+
574
+ 'contents' => array(
575
+ array('value' => 'NewCommercialGoods', 'label' => 'New Commercial Goods'),
576
+ array('value' => 'UsedCommercialGoods', 'label' => 'Used Commercial Goods'),
577
+ array('value' => 'HouseholdGoods', 'label' => 'Household Goods'),
578
+ array('value' => 'FragileGoods', 'label' => 'Fragile Goods'),
579
+ array('value' => 'Automobile', 'label' => 'Automobile'),
580
+ array('value' => 'Motorcycle', 'label' => 'Motorcycle'),
581
+ array('value' => 'AutoOrMotorcycle', 'label' => 'Auto or Motorcycle')
582
+ ),
583
+
584
+ 'location_type' => array(
585
+ array('value' => 'Origin', 'label' => 'Origin'),
586
+ array('value' => 'Destination', 'label' => 'Destination'),
587
+ array('value' => 'StopoffPickupDelivery', 'label' => 'Stopoff Pickup Delivery'),
588
+ array('value' => 'StopoffDelivery', 'label' => 'Stopoff Delivery'),
589
+ array('value' => 'StopoffPickup', 'label' => 'Stopoff Pickup'),
590
+ ),
591
+
592
+ 'service_type' => array(
593
+ array('value' => 'LTL', 'label' => 'LTL'),
594
+ array('value' => 'Truckload', 'label' => 'Truckload')
595
+ //array('value' => 'Europe', 'label' => 'Europe'),
596
+ //array('value' => 'Groupage', 'label' => 'Groupage'),
597
+ //array('value' => 'Haulage', 'label' => 'Haulage')
598
+ )
599
+ );
600
+
601
+ if (!isset($codes[$type])) {
602
+ return false;
603
+ } elseif ('' === $code) {
604
+ return $codes[$type];
605
+ }
606
+
607
+ if (!isset($codes[$type][$code])) {
608
+ return false;
609
+ } else {
610
+ return $codes[$type][$code];
611
+ }
612
+ }
613
+ }
614
+ ?>
app/code/community/Freightquote/Shipping/Model/Carrier/Source/Class.php ADDED
@@ -0,0 +1,23 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /*
3
+ Freightquote.com Shipping Module for Magento Commerce
4
+
5
+ Copyright (c) 2015 Freightquote.com
6
+
7
+ Released under the Open Software License (OSL 3.0)
8
+ */
9
+
10
+ class Freightquote_Shipping_Model_Carrier_Source_Class extends Mage_Eav_Model_Entity_Attribute_Source_Abstract {
11
+ public function toOptionArray() {
12
+ $freightquote = Mage::getSingleton('freightquote/carrier_shipping');
13
+
14
+ $arr = $freightquote->getCode('classes');
15
+
16
+ return $arr;
17
+ }
18
+
19
+ public function getAllOptions() {
20
+ return $this->toOptionArray();
21
+ }
22
+ }
23
+ ?>
app/code/community/Freightquote/Shipping/Model/Carrier/Source/Commodity.php ADDED
@@ -0,0 +1,23 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /*
3
+ Freightquote.com Shipping Module for Magento Commerce
4
+
5
+ Copyright (c) 2015 Freightquote.com
6
+
7
+ Released under the Open Software License (OSL 3.0)
8
+ */
9
+
10
+ class Freightquote_Shipping_Model_Carrier_Source_Commodity extends Mage_Eav_Model_Entity_Attribute_Source_Abstract {
11
+ public function toOptionArray() {
12
+ $freightquote = Mage::getSingleton('freightquote/carrier_shipping');
13
+
14
+ $arr = $freightquote->getCode('commodities');
15
+
16
+ return $arr;
17
+ }
18
+
19
+ public function getAllOptions() {
20
+ return $this->toOptionArray();
21
+ }
22
+ }
23
+ ?>
app/code/community/Freightquote/Shipping/Model/Carrier/Source/Content.php ADDED
@@ -0,0 +1,23 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /*
3
+ Freightquote.com Shipping Module for Magento Commerce
4
+
5
+ Copyright (c) 2015 Freightquote.com
6
+
7
+ Released under the Open Software License (OSL 3.0)
8
+ */
9
+
10
+ class Freightquote_Shipping_Model_Carrier_Source_Content extends Mage_Eav_Model_Entity_Attribute_Source_Abstract {
11
+ public function toOptionArray() {
12
+ $freightquote = Mage::getSingleton('freightquote/carrier_shipping');
13
+
14
+ $arr = $freightquote->getCode('contents');
15
+
16
+ return $arr;
17
+ }
18
+
19
+ public function getAllOptions() {
20
+ return $this->toOptionArray();
21
+ }
22
+ }
23
+ ?>
app/code/community/Freightquote/Shipping/Model/Carrier/Source/Locationtype.php ADDED
@@ -0,0 +1,23 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /*
3
+ Freightquote.com Shipping Module for Magento Commerce
4
+
5
+ Copyright (c) 2015 Freightquote.com
6
+
7
+ Released under the Open Software License (OSL 3.0)
8
+ */
9
+
10
+ class Freightquote_Shipping_Model_Carrier_Source_Locationtype extends Mage_Eav_Model_Entity_Attribute_Source_Abstract {
11
+ public function toOptionArray() {
12
+ $freightquote = Mage::getSingleton('freightquote/carrier_shipping');
13
+
14
+ $arr = $freightquote->getCode('location_type');
15
+
16
+ return $arr;
17
+ }
18
+
19
+ public function getAllOptions() {
20
+ return $this->toOptionArray();
21
+ }
22
+ }
23
+ ?>
app/code/community/Freightquote/Shipping/Model/Carrier/Source/Packaging.php ADDED
@@ -0,0 +1,23 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /*
3
+ Freightquote.com Shipping Module for Magento Commerce
4
+
5
+ Copyright (c) 2015 Freightquote.com
6
+
7
+ Released under the Open Software License (OSL 3.0)
8
+ */
9
+
10
+ class Freightquote_Shipping_Model_Carrier_Source_Packaging extends Mage_Eav_Model_Entity_Attribute_Source_Abstract {
11
+ public function toOptionArray() {
12
+ $freightquote = Mage::getSingleton('freightquote/carrier_shipping');
13
+
14
+ $arr = $freightquote->getCode('packaging');
15
+
16
+ return $arr;
17
+ }
18
+
19
+ public function getAllOptions() {
20
+ return $this->toOptionArray();
21
+ }
22
+ }
23
+ ?>
app/code/community/Freightquote/Shipping/Model/Carrier/Source/Servicetype.php ADDED
@@ -0,0 +1,23 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /*
3
+ Freightquote.com Shipping Module for Magento Commerce
4
+
5
+ Copyright (c) 2015 Freightquote.com
6
+
7
+ Released under the Open Software License (OSL 3.0)
8
+ */
9
+
10
+ class Freightquote_Shipping_Model_Carrier_Source_Servicetype extends Mage_Eav_Model_Entity_Attribute_Source_Abstract {
11
+ public function toOptionArray() {
12
+ $freightquote = Mage::getSingleton('freightquote/carrier_shipping');
13
+
14
+ $arr = $freightquote->getCode('service_type');
15
+
16
+ return $arr;
17
+ }
18
+
19
+ public function getAllOptions() {
20
+ return $this->toOptionArray();
21
+ }
22
+ }
23
+ ?>
app/code/community/Freightquote/Shipping/Model/Resource/Eav/Mysql4/Setup.php ADDED
@@ -0,0 +1,237 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /*
3
+ Freightquote.com Shipping Module for Magento Commerce
4
+
5
+ Copyright (c) 2015 Freightquote.com
6
+
7
+ Released under the Open Software License (OSL 3.0)
8
+ */
9
+
10
+ class Freightquote_Shipping_Model_Resource_Eav_Mysql4_Setup extends Mage_Eav_Model_Entity_Setup {
11
+
12
+ public function getDefaultEntities() {
13
+ return array(
14
+ 'catalog_product' => array(
15
+ 'entity_model' => 'catalog/product',
16
+ 'attribute_model' => 'catalog/resource_eav_attribute',
17
+ 'table' => 'catalog/product',
18
+ 'additional_attribute_table' => 'catalog/eav_attribute',
19
+ 'entity_attribute_collection' => 'catalog/product_attribute_collection',
20
+ 'attributes' => array(
21
+ 'freightquote_enable' => array(
22
+ 'group' => 'Freightquote.com',
23
+ 'type' => 'int',
24
+ 'backend' => '',
25
+ 'frontend' => '',
26
+ 'label' => 'Ship with Freightquote.com',
27
+ 'input' => 'select',
28
+ 'class' => '',
29
+ 'source' => 'eav/entity_attribute_source_boolean',
30
+ 'global' => Mage_Catalog_Model_Resource_Eav_Attribute::SCOPE_GLOBAL,
31
+ 'visible' => true,
32
+ 'required' => true,
33
+ 'user_defined' => false,
34
+ 'default' => '0',
35
+ 'searchable' => false,
36
+ 'filterable' => false,
37
+ 'comparable' => false,
38
+ 'visible_on_front' => false,
39
+ 'unique' => false,
40
+ 'apply_to' => 'simple'
41
+ ),
42
+ 'freightquote_class' => array(
43
+ 'group' => 'Freightquote.com',
44
+ 'type' => 'varchar',
45
+ 'backend' => '',
46
+ 'frontend' => '',
47
+ 'label' => 'Freight Class',
48
+ 'input' => 'select',
49
+ 'class' => '',
50
+ 'source' => 'Freightquote_Shipping_Model_Carrier_Source_Class',
51
+ 'global' => Mage_Catalog_Model_Resource_Eav_Attribute::SCOPE_GLOBAL,
52
+ 'visible' => true,
53
+ 'required' => true,
54
+ 'user_defined' => false,
55
+ 'default' => '50',
56
+ 'searchable' => false,
57
+ 'filterable' => false,
58
+ 'comparable' => false,
59
+ 'visible_on_front' => false,
60
+ 'unique' => false,
61
+ 'apply_to' => 'simple'
62
+ ),
63
+ 'freightquote_length' => array(
64
+ 'group' => 'Freightquote.com',
65
+ 'type' => 'int',
66
+ 'backend' => '',
67
+ 'frontend' => '',
68
+ 'label' => 'Length (inches)',
69
+ 'input' => 'text',
70
+ 'width' => '50',
71
+ 'class' => '',
72
+ 'source' => '',
73
+ 'global' => Mage_Catalog_Model_Resource_Eav_Attribute::SCOPE_GLOBAL,
74
+ 'visible' => true,
75
+ 'required' => true,
76
+ 'user_defined' => false,
77
+ 'default' => '0',
78
+ 'searchable' => false,
79
+ 'filterable' => false,
80
+ 'comparable' => false,
81
+ 'visible_on_front' => false,
82
+ 'unique' => false,
83
+ 'apply_to' => 'simple'
84
+ ),
85
+ 'freightquote_width' => array(
86
+ 'group' => 'Freightquote.com',
87
+ 'type' => 'int',
88
+ 'backend' => '',
89
+ 'frontend' => '',
90
+ 'label' => 'Width (inches)',
91
+ 'input' => 'text',
92
+ 'class' => '',
93
+ 'source' => '',
94
+ 'global' => Mage_Catalog_Model_Resource_Eav_Attribute::SCOPE_GLOBAL,
95
+ 'visible' => true,
96
+ 'required' => true,
97
+ 'user_defined' => false,
98
+ 'default' => '0',
99
+ 'searchable' => false,
100
+ 'filterable' => false,
101
+ 'comparable' => false,
102
+ 'visible_on_front' => false,
103
+ 'unique' => false,
104
+ 'apply_to' => 'simple'
105
+ ),
106
+ 'freightquote_height' => array(
107
+ 'group' => 'Freightquote.com',
108
+ 'type' => 'int',
109
+ 'backend' => '',
110
+ 'frontend' => '',
111
+ 'label' => 'Height (inches)',
112
+ 'input' => 'text',
113
+ 'class' => '',
114
+ 'source' => '',
115
+ 'global' => Mage_Catalog_Model_Resource_Eav_Attribute::SCOPE_GLOBAL,
116
+ 'visible' => true,
117
+ 'required' => true,
118
+ 'user_defined' => false,
119
+ 'default' => '0',
120
+ 'searchable' => false,
121
+ 'filterable' => false,
122
+ 'comparable' => false,
123
+ 'visible_on_front' => false,
124
+ 'unique' => false,
125
+ 'apply_to' => 'simple'
126
+ ),
127
+ 'freightquote_nmfc' => array(
128
+ 'group' => 'Freightquote.com',
129
+ 'type' => 'varchar',
130
+ 'backend' => '',
131
+ 'frontend' => '',
132
+ 'label' => 'NMFC (optional)',
133
+ 'input' => 'text',
134
+ 'class' => '',
135
+ 'source' => '',
136
+ 'global' => Mage_Catalog_Model_Resource_Eav_Attribute::SCOPE_GLOBAL,
137
+ 'visible' => true,
138
+ 'required' => false,
139
+ 'user_defined' => false,
140
+ 'default' => '',
141
+ 'searchable' => false,
142
+ 'filterable' => false,
143
+ 'comparable' => false,
144
+ 'visible_on_front' => false,
145
+ 'unique' => false,
146
+ 'apply_to' => 'simple'
147
+ ),
148
+ 'freightquote_hzmt' => array(
149
+ 'group' => 'Freightquote.com',
150
+ 'type' => 'int',
151
+ 'backend' => '',
152
+ 'frontend' => '',
153
+ 'label' => 'Hazardous Material',
154
+ 'input' => 'select',
155
+ 'class' => '',
156
+ 'source' => 'eav/entity_attribute_source_boolean',
157
+ 'global' => Mage_Catalog_Model_Resource_Eav_Attribute::SCOPE_GLOBAL,
158
+ 'visible' => true,
159
+ 'required' => true,
160
+ 'user_defined' => false,
161
+ 'default' => '0',
162
+ 'searchable' => false,
163
+ 'filterable' => false,
164
+ 'comparable' => false,
165
+ 'visible_on_front' => false,
166
+ 'unique' => false,
167
+ 'apply_to' => 'simple'
168
+ ),
169
+ 'freightquote_packaging' => array(
170
+ 'group' => 'Freightquote.com',
171
+ 'type' => 'varchar',
172
+ 'backend' => '',
173
+ 'frontend' => '',
174
+ 'label' => 'Packaging Type',
175
+ 'input' => 'select',
176
+ 'class' => '',
177
+ 'source' => 'Freightquote_Shipping_Model_Carrier_Source_Packaging',
178
+ 'global' => Mage_Catalog_Model_Resource_Eav_Attribute::SCOPE_GLOBAL,
179
+ 'visible' => true,
180
+ 'required' => true,
181
+ 'user_defined' => false,
182
+ 'default' => 'Boxes',
183
+ 'searchable' => false,
184
+ 'filterable' => false,
185
+ 'comparable' => false,
186
+ 'visible_on_front' => false,
187
+ 'unique' => false,
188
+ 'apply_to' => 'simple'
189
+ ),
190
+ 'freightquote_commodity' => array(
191
+ 'group' => 'Freightquote.com',
192
+ 'type' => 'varchar',
193
+ 'backend' => '',
194
+ 'frontend' => '',
195
+ 'label' => 'Commodity Type',
196
+ 'input' => 'select',
197
+ 'class' => '',
198
+ 'source' => 'Freightquote_Shipping_Model_Carrier_Source_Commodity',
199
+ 'global' => Mage_Catalog_Model_Resource_Eav_Attribute::SCOPE_GLOBAL,
200
+ 'visible' => true,
201
+ 'required' => true,
202
+ 'user_defined' => false,
203
+ 'default' => 'GeneralMerchandise',
204
+ 'searchable' => false,
205
+ 'filterable' => false,
206
+ 'comparable' => false,
207
+ 'visible_on_front' => false,
208
+ 'unique' => false,
209
+ 'apply_to' => 'simple'
210
+ ),
211
+ 'freightquote_content' => array(
212
+ 'group' => 'Freightquote.com',
213
+ 'type' => 'varchar',
214
+ 'backend' => '',
215
+ 'frontend' => '',
216
+ 'label' => 'Contents Type',
217
+ 'input' => 'select',
218
+ 'class' => '',
219
+ 'source' => 'Freightquote_Shipping_Model_Carrier_Source_Content',
220
+ 'global' => Mage_Catalog_Model_Resource_Eav_Attribute::SCOPE_GLOBAL,
221
+ 'visible' => true,
222
+ 'required' => true,
223
+ 'user_defined' => false,
224
+ 'default' => 'NewCommercialGoods',
225
+ 'searchable' => false,
226
+ 'filterable' => false,
227
+ 'comparable' => false,
228
+ 'visible_on_front' => false,
229
+ 'unique' => false,
230
+ 'apply_to' => 'simple'
231
+ )
232
+ )
233
+ )
234
+ );
235
+ }
236
+ }
237
+ ?>
app/code/community/Freightquote/Shipping/etc/config.xml ADDED
@@ -0,0 +1,83 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0"?>
2
+ <!--
3
+ Freightquote.com Shipping Module for Magento Commerce
4
+
5
+ Copyright (c) 2015 Freightquote.com
6
+
7
+ Released under the Open Software License (OSL 3.0)
8
+ -->
9
+ <config>
10
+ <modules>
11
+ <Freightquote_Shipping>
12
+ <version>1.2.1</version>
13
+ </Freightquote_Shipping>
14
+ </modules>
15
+ <global>
16
+ <models>
17
+ <freightquote>
18
+ <class>Freightquote_Shipping_Model</class>
19
+ </freightquote>
20
+ </models>
21
+ <helpers>
22
+ <freightquote>
23
+ <class>Freightquote_Shipping_Helper</class>
24
+ </freightquote>
25
+ </helpers>
26
+ <resources>
27
+ <freightquote_setup>
28
+ <setup>
29
+ <module>Freightquote_Shipping</module>
30
+ <class>Freightquote_Shipping_Model_Resource_Eav_Mysql4_Setup</class>
31
+ </setup>
32
+ <connection>
33
+ <use>core_setup</use>
34
+ </connection>
35
+ </freightquote_setup>
36
+ <freightquote_write>
37
+ <connection>
38
+ <use>core_write</use>
39
+ </connection>
40
+ </freightquote_write>
41
+ <freightquote_read>
42
+ <connection>
43
+ <use>core_read</use>
44
+ </connection>
45
+ </freightquote_read>
46
+ </resources>
47
+ <sales>
48
+ <quote>
49
+ <item>
50
+ <product_attributes>
51
+ <freightquote_enable/>
52
+ <freightquote_class/>
53
+ <freightquote_length/>
54
+ <freightquote_width/>
55
+ <freightquote_height/>
56
+ <freightquote_nmfc/>
57
+ <freightquote_hzmt/>
58
+ <freightquote_packaging/>
59
+ <freightquote_commodity/>
60
+ <freightquote_content/>
61
+ </product_attributes>
62
+ </item>
63
+ </quote>
64
+ </sales>
65
+ </global>
66
+ <default>
67
+ <carriers>
68
+ <freightquote>
69
+ <active>1</active>
70
+ <sort_order>10</sort_order>
71
+ <model>Freightquote_Shipping_Model_Carrier_Shipping</model>
72
+ <title>Freightquote.com</title>
73
+ <username>jholland@freightquote.com</username>
74
+ <password>xana7798</password>
75
+ <shipment_label>Thank you for shopping with us!</shipment_label>
76
+ <origin_country>US</origin_country>
77
+ <origin_location_type>Origin</origin_location_type>
78
+ <destination_location_type>Destination</destination_location_type>
79
+ <rate_modifier>1</rate_modifier>
80
+ </freightquote>
81
+ </carriers>
82
+ </default>
83
+ </config>
app/code/community/Freightquote/Shipping/etc/system.xml ADDED
@@ -0,0 +1,260 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0"?>
2
+ <!--
3
+ Freightquote.com Shipping Module for Magento Commerce
4
+
5
+ Copyright (c) 2015 Freightquote.com
6
+
7
+ Released under the Open Software License (OSL 3.0)
8
+ -->
9
+ <config>
10
+ <sections>
11
+ <carriers>
12
+ <groups>
13
+ <freightquote translate="label" module="shipping">
14
+ <label>Freightquote.com</label>
15
+ <frontend_type>text</frontend_type>
16
+ <sort_order>13</sort_order>
17
+ <show_in_default>1</show_in_default>
18
+ <show_in_website>1</show_in_website>
19
+ <show_in_store>1</show_in_store>
20
+ <fields>
21
+ <active translate="label">
22
+ <label>Enabled</label>
23
+ <frontend_type>select</frontend_type>
24
+ <source_model>adminhtml/system_config_source_yesno</source_model>
25
+ <sort_order>1</sort_order>
26
+ <show_in_default>1</show_in_default>
27
+ <show_in_website>1</show_in_website>
28
+ <show_in_store>0</show_in_store>
29
+ </active>
30
+ <title translate="label">
31
+ <label>Title</label>
32
+ <frontend_type>text</frontend_type>
33
+ <sort_order>2</sort_order>
34
+ <show_in_default>1</show_in_default>
35
+ <show_in_website>1</show_in_website>
36
+ <show_in_store>1</show_in_store>
37
+ <comment>This is the shipping method title your customers will see.</comment>
38
+ </title>
39
+ <username translate="label">
40
+ <label>Username</label>
41
+ <frontend_type>text</frontend_type>
42
+ <sort_order>3</sort_order>
43
+ <show_in_default>1</show_in_default>
44
+ <show_in_website>1</show_in_website>
45
+ <show_in_store>0</show_in_store>
46
+ <comment>Enter the e-mail address used to log into Freightquote.com.</comment>
47
+ </username>
48
+ <password translate="label">
49
+ <label>Password</label>
50
+ <frontend_type>text</frontend_type>
51
+ <sort_order>4</sort_order>
52
+ <show_in_default>1</show_in_default>
53
+ <show_in_website>1</show_in_website>
54
+ <show_in_store>0</show_in_store>
55
+ <comment>Enter the password used to log into Freightquote.com.</comment>
56
+ </password>
57
+ <shipment_label translate="label">
58
+ <label>Shipping Label</label>
59
+ <frontend_type>text</frontend_type>
60
+ <sort_order>5</sort_order>
61
+ <show_in_default>1</show_in_default>
62
+ <show_in_website>1</show_in_website>
63
+ <show_in_store>0</show_in_store>
64
+ <comment>This can be used to assign a label to the shipment that will be meaningful to the end user.</comment>
65
+ </shipment_label>
66
+ <service_type translate="label">
67
+ <label>Service Type</label>
68
+ <frontend_type>select</frontend_type>
69
+ <source_model>Freightquote_Shipping_Model_Carrier_Source_Servicetype</source_model>
70
+ <sort_order>6</sort_order>
71
+ <show_in_default>1</show_in_default>
72
+ <show_in_website>1</show_in_website>
73
+ <show_in_store>0</show_in_store>
74
+ <comment>Select the service type you will use for your shipments.</comment>
75
+ </service_type>
76
+ <origin_location_type translate="label">
77
+ <label><![CDATA[<b>ORIGIN:</b> Location Type]]></label>
78
+ <frontend_type>select</frontend_type>
79
+ <source_model>Freightquote_Shipping_Model_Carrier_Source_Locationtype</source_model>
80
+ <sort_order>7</sort_order>
81
+ <show_in_default>1</show_in_default>
82
+ <show_in_website>1</show_in_website>
83
+ <show_in_store>0</show_in_store>
84
+ <comment>Choose the location type that best fits. (Recommended: "Origin")</comment>
85
+ </origin_location_type>
86
+ <origin_dock translate="label">
87
+ <label><![CDATA[<b>ORIGIN:</b> Loading Dock]]></label>
88
+ <frontend_type>select</frontend_type>
89
+ <source_model>adminhtml/system_config_source_yesno</source_model>
90
+ <sort_order>8</sort_order>
91
+ <show_in_default>1</show_in_default>
92
+ <show_in_website>1</show_in_website>
93
+ <show_in_store>0</show_in_store>
94
+ <comment>Does your shipping location have a loading dock?</comment>
95
+ </origin_dock>
96
+ <origin_liftgate translate="label">
97
+ <label><![CDATA[<b>ORIGIN:</b> Liftgate Required?]]></label>
98
+ <frontend_type>select</frontend_type>
99
+ <source_model>adminhtml/system_config_source_yesno</source_model>
100
+ <sort_order>9</sort_order>
101
+ <show_in_default>1</show_in_default>
102
+ <show_in_website>1</show_in_website>
103
+ <show_in_store>0</show_in_store>
104
+ <comment>Do you require a liftgate?</comment>
105
+ </origin_liftgate>
106
+ <origin_residence translate="label">
107
+ <label><![CDATA[<b>ORIGIN:</b> Residential]]></label>
108
+ <frontend_type>select</frontend_type>
109
+ <source_model>adminhtml/system_config_source_yesno</source_model>
110
+ <sort_order>10</sort_order>
111
+ <show_in_default>1</show_in_default>
112
+ <show_in_website>1</show_in_website>
113
+ <show_in_store>0</show_in_store>
114
+ <comment>Is your shipping location a residence?</comment>
115
+ </origin_residence>
116
+ <origin_construction translate="label">
117
+ <label><![CDATA[<b>ORIGIN:</b> Construction Site]]></label>
118
+ <frontend_type>select</frontend_type>
119
+ <source_model>adminhtml/system_config_source_yesno</source_model>
120
+ <sort_order>11</sort_order>
121
+ <show_in_default>1</show_in_default>
122
+ <show_in_website>1</show_in_website>
123
+ <show_in_store>0</show_in_store>
124
+ <comment>Is your shipping location a construction site?</comment>
125
+ </origin_construction>
126
+ <destination_location_type translate="label">
127
+ <label><![CDATA[<b>DESTINATION:</b> Location Type]]></label>
128
+ <frontend_type>select</frontend_type>
129
+ <source_model>Freightquote_Shipping_Model_Carrier_Source_Locationtype</source_model>
130
+ <sort_order>12</sort_order>
131
+ <show_in_default>1</show_in_default>
132
+ <show_in_website>1</show_in_website>
133
+ <show_in_store>0</show_in_store>
134
+ <comment>Choose the location type that best fits. (Recommended: "Destination")</comment>
135
+ </destination_location_type>
136
+ <destination_dock translate="label">
137
+ <label><![CDATA[<b>DESTINATION:</b> Loading Dock]]></label>
138
+ <frontend_type>select</frontend_type>
139
+ <source_model>adminhtml/system_config_source_yesno</source_model>
140
+ <sort_order>13</sort_order>
141
+ <show_in_default>1</show_in_default>
142
+ <show_in_website>1</show_in_website>
143
+ <show_in_store>0</show_in_store>
144
+ <comment>Do your recipients typically have loading docks?</comment>
145
+ </destination_dock>
146
+ <destination_liftgate translate="label">
147
+ <label><![CDATA[<b>DESTINATION:</b> Liftgate Required?]]></label>
148
+ <frontend_type>select</frontend_type>
149
+ <source_model>adminhtml/system_config_source_yesno</source_model>
150
+ <sort_order>14</sort_order>
151
+ <show_in_default>1</show_in_default>
152
+ <show_in_website>1</show_in_website>
153
+ <show_in_store>0</show_in_store>
154
+ <comment>Do your customers typically require a liftgate?</comment>
155
+ </destination_liftgate>
156
+ <destination_residence translate="label">
157
+ <label><![CDATA[<b>DESTINATION:</b> Residential]]></label>
158
+ <frontend_type>select</frontend_type>
159
+ <source_model>adminhtml/system_config_source_yesno</source_model>
160
+ <sort_order>15</sort_order>
161
+ <show_in_default>1</show_in_default>
162
+ <show_in_website>1</show_in_website>
163
+ <show_in_store>0</show_in_store>
164
+ <comment>Do you typically ship to residences? (Prices will be higher)</comment>
165
+ </destination_residence>
166
+ <destination_construction translate="label">
167
+ <label><![CDATA[<b>DESTINATION:</b> Construction Site]]></label>
168
+ <frontend_type>select</frontend_type>
169
+ <source_model>adminhtml/system_config_source_yesno</source_model>
170
+ <sort_order>16</sort_order>
171
+ <show_in_default>1</show_in_default>
172
+ <show_in_website>1</show_in_website>
173
+ <show_in_store>0</show_in_store>
174
+ <comment>Do you typically ship to construction sites?</comment>
175
+ </destination_construction>
176
+ <blind_ship translate="label">
177
+ <label>Blind Ship</label>
178
+ <frontend_type>select</frontend_type>
179
+ <source_model>adminhtml/system_config_source_yesno</source_model>
180
+ <sort_order>17</sort_order>
181
+ <show_in_default>1</show_in_default>
182
+ <show_in_website>1</show_in_website>
183
+ <show_in_store>0</show_in_store>
184
+ <comment>Blind shipping prevents the recipient of the shipment from seeing the address of the place of origin.</comment>
185
+ </blind_ship>
186
+ <handling_action translate="label">
187
+ <label>Handling Applied</label>
188
+ <frontend_type>select</frontend_type>
189
+ <source_model>shipping/source_handlingAction</source_model>
190
+ <sort_order>18</sort_order>
191
+ <show_in_default>1</show_in_default>
192
+ <show_in_website>1</show_in_website>
193
+ <show_in_store>0</show_in_store>
194
+ </handling_action>
195
+ <handling_fee translate="label">
196
+ <label>Handling Fee</label>
197
+ <frontend_type>text</frontend_type>
198
+ <sort_order>19</sort_order>
199
+ <show_in_default>1</show_in_default>
200
+ <show_in_website>1</show_in_website>
201
+ <show_in_store>0</show_in_store>
202
+ <can_be_empty>1</can_be_empty>
203
+ </handling_fee>
204
+ <rate_modifier translate="label">
205
+ <label>Rate Modifier</label>
206
+ <frontend_type>text</frontend_type>
207
+ <sort_order>20</sort_order>
208
+ <show_in_default>1</show_in_default>
209
+ <show_in_website>1</show_in_website>
210
+ <show_in_store>0</show_in_store>
211
+ <can_be_empty>1</can_be_empty>
212
+ <comment>If you'd like to increase or decrease the rate returned, enter a number that will be multiplied with the rate. e.g. For a 10% rate increase, enter "1.1" or for a 30% decrease in the rate, enter "0.7"</comment>
213
+ </rate_modifier>
214
+ <!--
215
+ <sallowspecific translate="label">
216
+ <label>Ship to applicable countries</label>
217
+ <frontend_type>select</frontend_type>
218
+ <sort_order>19</sort_order>
219
+ <frontend_class>shipping-applicable-country</frontend_class>
220
+ <source_model>adminhtml/system_config_source_shipping_allspecificcountries</source_model>
221
+ <show_in_default>1</show_in_default>
222
+ <show_in_website>1</show_in_website>
223
+ <show_in_store>1</show_in_store>
224
+ </sallowspecific>
225
+ <specificcountry translate="label">
226
+ <label>Ship to Specific countries</label>
227
+ <frontend_type>multiselect</frontend_type>
228
+ <sort_order>20</sort_order>
229
+ <source_model>adminhtml/system_config_source_country</source_model>
230
+ <show_in_default>1</show_in_default>
231
+ <show_in_website>1</show_in_website>
232
+ <show_in_store>1</show_in_store>
233
+ </specificcountry>
234
+ -->
235
+ <sort_order translate="label">
236
+ <label>Sort Order</label>
237
+ <frontend_type>text</frontend_type>
238
+ <sort_order>21</sort_order>
239
+ <show_in_default>1</show_in_default>
240
+ <show_in_website>1</show_in_website>
241
+ <show_in_store>0</show_in_store>
242
+ <can_be_empty>1</can_be_empty>
243
+ <comment>Entering a numeric value here will move this module higher or lower in the selection of shipping methods presented to the customer.</comment>
244
+ </sort_order>
245
+ <debug translate="label">
246
+ <label>Debug</label>
247
+ <frontend_type>select</frontend_type>
248
+ <source_model>adminhtml/system_config_source_yesno</source_model>
249
+ <sort_order>22</sort_order>
250
+ <show_in_default>1</show_in_default>
251
+ <show_in_website>1</show_in_website>
252
+ <show_in_store>0</show_in_store>
253
+ <comment>Turn on to capture quoting calls and errors in the system.log. Turn off when done.</comment>
254
+ </debug>
255
+ </fields>
256
+ </freightquote>
257
+ </groups>
258
+ </carriers>
259
+ </sections>
260
+ </config>
app/code/community/Freightquote/Shipping/sql/freightquote_setup/mysql4-install-1.0.0.php ADDED
@@ -0,0 +1,12 @@
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /*
3
+ Freightquote.com Shipping Module for Magento Commerce
4
+
5
+ Copyright (c) 2015 Freightquote.com
6
+
7
+ Released under the Open Software License (OSL 3.0)
8
+ */
9
+
10
+ $installer = $this;
11
+ $installer->installEntities();
12
+ ?>
app/etc/modules/Freightquote_Shipping.xml ADDED
@@ -0,0 +1,19 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0"?>
2
+ <!--
3
+ Freightquote.com Shipping Module for Magento Commerce
4
+
5
+ Copyright (c) 2015 Freightquote.com
6
+
7
+ Released under the Open Software License (OSL 3.0)
8
+ -->
9
+ <config>
10
+ <modules>
11
+ <Freightquote_Shipping>
12
+ <active>true</active>
13
+ <codePool>community</codePool>
14
+ <depends>
15
+ <Mage_Shipping />
16
+ </depends>
17
+ </Freightquote_Shipping>
18
+ </modules>
19
+ </config>
package.xml CHANGED
@@ -1,7 +1,7 @@
1
  <?xml version="1.0"?>
2
  <package>
3
  <name>Freightquote_com_Shipping_Module</name>
4
- <version>1.2.0</version>
5
  <stability>stable</stability>
6
  <license uri="http://opensource.org/licenses/osl-3.0.php">Open Software License (OSL)</license>
7
  <channel>community</channel>
@@ -11,9 +11,9 @@
11
  &lt;p&gt;Note: This is the only shipping module maintained by Freightquote&lt;/p&gt;</description>
12
  <notes>Added debug logging option to help with installations</notes>
13
  <authors><author><name>Freightquote</name><user>MAG000030254</user><email>fqconnect@freightquote.com</email></author></authors>
14
- <date>2015-09-14</date>
15
- <time>14:22:00</time>
16
- <contents><target name="mageetc"><dir name="."><dir name="app"><dir name="etc"><file name="modules" hash=""/></dir></dir></dir></target></contents>
17
  <compatible/>
18
- <dependencies><required><php><min>5.1.0</min><max>6.0.0</max></php></required></dependencies>
19
  </package>
1
  <?xml version="1.0"?>
2
  <package>
3
  <name>Freightquote_com_Shipping_Module</name>
4
+ <version>1.2.1</version>
5
  <stability>stable</stability>
6
  <license uri="http://opensource.org/licenses/osl-3.0.php">Open Software License (OSL)</license>
7
  <channel>community</channel>
11
  &lt;p&gt;Note: This is the only shipping module maintained by Freightquote&lt;/p&gt;</description>
12
  <notes>Added debug logging option to help with installations</notes>
13
  <authors><author><name>Freightquote</name><user>MAG000030254</user><email>fqconnect@freightquote.com</email></author></authors>
14
+ <date>2015-09-24</date>
15
+ <time>13:30:05</time>
16
+ <contents><target name="magecommunity"><dir name="Freightquote"><dir name="Shipping"><dir name="Helper"><file name="Data.php" hash="749a0471c52b7cede4e73991d2157cbc"/></dir><dir name="Model"><dir name="Carrier"><file name="Shipping.php" hash="3daaafcb5d86eed9243554736e2dfeb2"/><dir name="Source"><file name="Class.php" hash="8b010b6933bd957442512aa167c5012b"/><file name="Commodity.php" hash="a51fc911fb0aa8709c6dfe98b384a918"/><file name="Content.php" hash="184d212febb2c3c4ce76aeba47b29708"/><file name="Locationtype.php" hash="02d459f8e95d449c8b9d59b4089bef88"/><file name="Packaging.php" hash="9b3051552a611c0861ba1833aa0eab7d"/><file name="Servicetype.php" hash="07a57461b49eb7670144b5f36a6ad339"/></dir></dir><dir name="Resource"><dir name="Eav"><dir name="Mysql4"><file name="Setup.php" hash="21392cf6d0d43c33ae23d9cceddb02d7"/></dir></dir></dir></dir><dir name="etc"><file name="config.xml" hash="0ebc6491a642d625bcd54f5dbc0ed1f9"/><file name="system.xml" hash="4ccf1ff41af2ac095cca3163eaa034d2"/></dir><dir name="sql"><dir name="freightquote_setup"><file name="mysql4-install-1.0.0.php" hash="d03c1c4b8679200418dc321a2e123b23"/></dir></dir></dir></dir></target><target name="mageetc"><dir name="modules"><file name="Freightquote_Shipping.xml" hash="80e189a151b894aa53ad9c7323f6b9e1"/></dir></target></contents>
17
  <compatible/>
18
+ <dependencies><required><php><min>5.1.0</min><max>6.0.0</max></php><package><name/><channel>connect.magentocommerce.com/core</channel><min/><max/></package></required></dependencies>
19
  </package>