1: <?php
2:
3: 4: 5: 6: 7: 8: 9: 10:
11:
12: 13: 14:
15: class IllApps_Shipsync_IndexController extends Mage_Adminhtml_Controller_Action
16: {
17:
18: 19: 20:
21: public function indexAction()
22: {
23: $this->loadLayout();
24:
25: $this->_setActiveMenu('sales');
26:
27: $this->_addBreadcrumb($this->__('Sales'), $this->__('Sales'));
28: $this->_addBreadcrumb($this->__('Orders'), $this->__('Orders'));
29: $this->_addBreadcrumb($this->__('ShipSync'), $this->__('ShipSync'));
30:
31: $this->renderLayout();
32: }
33:
34: 35: 36:
37: public function optionAction()
38: {
39:
40: $post = $this->getRequest()->getPost();
41:
42:
43: $this->loadLayout();
44:
45: $layout = $this->getLayout();
46:
47:
48: $block = $layout->getBlock('shipsync_option');
49:
50: $block->setData('i', $post['i']);
51: $block->setData('z', $post['i']);
52:
53: echo $block->toHtml();
54: }
55:
56: 57: 58:
59: public function packagesAction()
60: {
61: $id = $this->getRequest()->getParam('shipment_id');
62:
63: Mage::register('current_shipment', Mage::getModel('sales/order_shipment')->load($id));
64:
65: $this->loadLayout();
66:
67: Mage::getSingleton('shipsync/sales_order_shipment_package')->setShipmentId($id);
68:
69: $this->renderLayout();
70: }
71:
72: 73: 74: 75: 76: 77: 78: 79:
80: public function attributesAction()
81: {
82:
83: $post = $this->getRequest()->getPost();
84:
85:
86: $defaultPackages = Mage::getModel('shipsync/shipping_package')->getDefaultPackages(array(
87: 'fedex'
88: ));
89:
90: foreach ($post['packages'] as $num => $package) {
91: foreach ($defaultPackages as $defaultPackage) {
92: if ($package['value'] == $defaultPackage['value']) {
93: foreach ($defaultPackage as $key => $element) {
94: $key = 'packages_' . $num . '_' . $key;
95:
96: $returnArray[$key] = $element;
97: }
98:
99: echo json_encode($returnArray);
100: }
101: }
102: }
103: }
104:
105: 106: 107: 108: 109: 110: 111:
112: public function rateAction()
113: {
114:
115: $post = $this->getRequest()->getPost();
116:
117:
118: $fedex = Mage::getModel('usa/shipping_carrier_fedex');
119:
120:
121: $rateRequest = Mage::getModel('shipping/rate_request');
122:
123:
124: $order = Mage::getModel('sales/order')->loadByIncrementId($post['order_id']);
125:
126:
127: $rateRequest->setOrder($order);
128:
129:
130: $rateRequest->setAllItems($order->getAllItems());
131:
132:
133: $streets[] = $post['recipient_street1'];
134:
135: if ($post['recipient_street2'] != '') {
136: $streets[] = $post['recipient_street2'];
137: }
138: if ($post['recipient_street3'] != '') {
139: $streets[] = $post['recipient_street3'];
140: }
141:
142:
143: $rateRequest->setDestStreet($streets);
144: $rateRequest->setDestCity($post['recipient_city']);
145: $rateRequest->setDestPostcode($post['recipient_postcode']);
146: $rateRequest->setDestRegionCode($post['recipient_region']);
147: $rateRequest->setDestCountryId($post['recipient_country']);
148:
149:
150: if (isset($post['insure_shipment']) && ($post['insure_shipment'] == 'on')) {
151: $rateRequest->setInsureShipment(true)->setInsureAmount($post['insure_amount']);
152: } else {
153: $rateRequest->setInsureShipment(false);
154: }
155:
156: $rateRequest->setResidenceDelivery($post['residence_delivery']);
157: $rateRequest->setAddressValidation($post['address_validation']);
158:
159:
160: $items = Mage::getModel('shipsync/shipping_package')->getParsedItems($rateRequest->getAllItems(), true);
161:
162:
163: foreach ($items as $item) {
164: $_itemsBySku[$item['sku']] = $item;
165: }
166:
167:
168: foreach ($post['packages'] as $package) {
169: $error = false;
170:
171: unset($_items);
172:
173: $itemsToPack = explode(',', $package['items']);
174:
175: foreach ($itemsToPack as $key => $itemToPack) {
176: $_items[] = $_itemsBySku[$post['items'][$itemToPack - 1]['sku']];
177: }
178:
179: $_packages[] = array(
180: 'volume' => $package['width'] * $package['height'] * $package['length'],
181: 'value' => $package['value'],
182: 'label' => $package['value'],
183: 'items' => $_items,
184: 'weight' => $package['weight'],
185: 'length' => $package['length'],
186: 'width' => $package['width'],
187: 'height' => $package['height']
188: );
189: }
190:
191: $rateRequest->setPackages($_packages);
192:
193: $rateResult = Mage::getModel('shipsync/shipping_carrier_fedex_rate')->collectRates($rateRequest);
194:
195: $possibleMethods = $rateResult->asArray();
196:
197: $methods = $possibleMethods['fedex']['methods'];
198:
199: if ($rateResult->getError()) {
200: unset($post);
201:
202: $post['error'] = $rateResult->getRateById(0)->getErrorMessage();
203: } else {
204: if (isset($post['method'])) {
205: $arrResult = $rateResult->asArray();
206:
207: if (isset($arrResult['fedex']['methods'][$post['method']]['price_formatted'])) {
208: $post['shipping_amount'] = $arrResult['fedex']['methods'][$post['method']]['price_formatted'];
209: } else {
210: $post['shipping_amount'] = null;
211: $post['shipping_allowed_methods'] = $arrResult;
212: }
213: } else {
214: unset($post);
215: $post['error'] = 'Invalid Request';
216: }
217: }
218: $encoded = json_encode($post);
219:
220: $this->getResponse()->setBody($encoded);
221: }
222:
223:
224: 225: 226: 227: 228:
229: public function postAction()
230: {
231: $message = "";
232:
233:
234: $post = $this->getRequest()->getPost();
235:
236:
237: if (empty($post)) {
238: Mage::throwException($this->__('Invalid form data.'));
239: }
240:
241:
242: $order = Mage::getModel('sales/order')->loadByIncrementId($post['order_id']);
243:
244:
245: if ($order->getEntityId() == null) {
246:
247: Mage::getSingleton('adminhtml/session')->addError("Error: Invalid Order ID");
248:
249:
250: $this->_redirectReferer();
251:
252: return $this;
253: }
254:
255:
256: if (!$order->canShip()) {
257:
258: Mage::getSingleton('adminhtml/session')->addError("Error: Order unable to be shipped");
259:
260:
261: $this->_redirectReferer();
262:
263: return $this;
264: }
265:
266: $i = 0;
267:
268:
269:
270: $items = Mage::getModel('shipsync/shipping_package')->getParsedItems($order->getAllItems(), true);
271:
272:
273: foreach ($items as $item) {
274: $_itemsById[$item['id']] = $item;
275: }
276:
277:
278: foreach ($post['packages'] as $package) {
279: unset($_items);
280:
281: $itemsToPack = explode(',', $package['items']);
282:
283: foreach ($itemsToPack as $key => $itemToPack) {
284: $_items[] = $_itemsById[$post['items'][$itemToPack - 1]['item_id']];
285: }
286:
287: $package['dangerous'] = false;
288: $package['cod'] = false;
289: $package['cod_amount'] = null;
290: $package['confirmation'] = false;
291: $package['saturday'] = false;
292:
293:
294: if (isset($post['cod']) && ($post['cod'] == 'on')) {
295: $package['cod'] = true;
296: $package['cod_amount'] = $post['cod_amount'];
297: }
298:
299: if (isset($post['confirmation']) && ($post['confirmation'] == 'on')) {
300: $package['confirmation'] = true;
301: }
302:
303: if (isset($post['saturday']) && $post['saturday'] == 'on') {
304: $package['saturday'] = true;
305: }
306:
307: $itemIds = $package['items'];
308: $package['items'] = $_items;
309:
310: foreach ($package['items'] as $items) {
311: if (isset($item['dangerous']) && $item['dangerous']) {
312: $package['dangerous'] = true;
313: }
314: }
315:
316:
317: if (isset($package['items'])) {
318:
319: $_package = Mage::getModel('shipping/shipment_package')
320: ->setPackageNumber($i)
321: ->setItems($package['items'])
322: ->setCod($package['cod'])
323: ->setCodAmount($package['cod_amount'])
324: ->setConfirmation($package['confirmation'])
325: ->setSaturdayDelivery($package['saturday'])
326: ->setDangerous($package['dangerous'])
327: ->setWeight($package['weight'])
328: ->setDescription('Package ' . $i + 1 . ' for order id ' . $post['order_id'])
329: ->setContainerCode(Mage::getModel('usa/shipping_carrier_fedex_package')
330: ->isFedexPackage($package['value']) ? $package['value'] : 'YOUR_PACKAGING')
331: ->setContainerDescription('')
332: ->setWeightUnitCode($post['weight_units'])
333: ->setDimensionUnitCode($post['dimension_units'])
334: ->setHeight($package['height'])
335: ->setWidth($package['width'])
336: ->setLength($package['length'])
337: ->setOrigin($package['altOrigin'])
338: ->setIsChild($package['isChild'])
339: ->setPackageItemIds($itemIds);
340:
341:
342: $packages[] = $_package;
343: }
344:
345: else {
346:
347: Mage::getSingleton('adminhtml/session')->addError("Error: Please include all ordered items when creating shipments.");
348:
349:
350: $this->_redirectReferer();
351:
352: return $this;
353: }
354:
355: $i++;
356:
357: }
358:
359:
360: $carrier = Mage::getModel('usa/shipping_carrier_fedex');
361:
362: $order->setShippingDescription("Federal Express - " . $carrier->getCode('method', $post['method']));
363: $order->setShippingMethod("fedex_" . $post['method'])->save();
364:
365: $recipientAddress = new Varien_Object();
366:
367: $streets[] = $post['recipient_street1'];
368:
369: if ($post['recipient_street2'] != '') {
370: $streets[] = $post['recipient_street2'];
371: }
372: if ($post['recipient_street3'] != '') {
373: $streets[] = $post['recipient_street3'];
374: }
375:
376: $recipientAddress->setName($post['recipient_name']);
377: $recipientAddress->setCompany($post['recipient_company']);
378: $recipientAddress->setStreet($streets);
379: $recipientAddress->setCity($post['recipient_city']);
380: $recipientAddress->setRegionCode($post['recipient_region']);
381: $recipientAddress->setPostcode($post['recipient_postcode']);
382: $recipientAddress->setCountryId($post['recipient_country']);
383: $recipientAddress->setTelephone($post['recipient_telephone']);
384:
385: if (isset($post['insure_shipment']) && ($post['insure_shipment'] == 'on')) {
386: $insureShipment = true;
387: } else {
388: $insureShipment = false;
389: }
390:
391: if (isset($post['insure_amount']) && ($post['insure_amount'] != "")) {
392: $insureAmount = $post['insure_amount'];
393: } else {
394: $insureAmount = 0.0;
395: }
396:
397: $request = new Varien_Object();
398:
399: $request->setOrderId($post['order_id'])
400: ->setMethodCode($post['method'])
401: ->setRecipientAddress($recipientAddress)
402: ->setPackages($packages)
403: ->setInsureShipment($insureShipment)
404: ->setInsureAmount($insureAmount)
405: ->setSaturdayDelivery($package['saturday'])
406: ->setCod($package['cod'])
407: ->setResidenceDelivery($post['residence_delivery'])
408: ->setAddressValidation($post['address_validation'])
409: ->setShipperCompany($post['shipper_company'])
410: ->setLabelStockType($post['label_stock_type'])
411: ->setLabelImageType($post['label_image_type'])
412: ->setLabelPrintingOrientation($post['label_printing_orientation'])
413: ->setEnableJavaPrinting($post['enable_java_printing'])
414: ->setPrinterName($post['printer_name'])
415: ->setPackingList($post['packing_list'])
416: ->setSignature($post['signature'])
417: ->setReturnLabel($post['return_label']);
418:
419: try {
420: $results = $carrier->createShipment($request);
421: }
422:
423: catch (Exception $e) {
424:
425: Mage::getSingleton('adminhtml/session')->addError($e->getMessage());
426:
427:
428: $this->_redirectReferer();
429:
430: return $this;
431: }
432:
433:
434: if (empty($results)) {
435:
436: Mage::getSingleton('adminhtml/session')->addError("Error: Empty API response");
437:
438:
439: $this->_redirectReferer();
440:
441: return $this;
442: }
443:
444: $tracks = array();
445: $packageids = '';
446:
447:
448: $i = 0;
449: foreach ($results as $res) {
450:
451: $tracks[$i]['number'] = $res->getTrackingNumber();
452:
453:
454: $tracks[$i]['url'] = '<a target="shipping_label" href="' . Mage::getSingleton('adminhtml/url')->getUrl('shipsync/index/label/', array(
455: 'id' => $res->getPackageId()
456: )) . '">Print Shipping Label</a>';
457:
458:
459: $tracks[$i]['id'] = $res->getPackageId();
460:
461: $i++;
462: }
463:
464:
465: $message = '<p>SUCCESS: ' . $i . ' shipment(s) created</p>';
466:
467:
468: foreach ($tracks as $track) {
469:
470: $message .= "<p>Package ID: " . $track['id'] . "<br /> Tracking Number: " . $track['number'] . "<br />" . $track['url'] . "</p>";
471:
472: if ($post['return_label'])
473: {
474: $message .= '<p><a target="_blank" href="' . Mage::getSingleton('adminhtml/url')->getUrl('shipsync/index/returnlabel/', array(
475: 'id' => $res->getPackageId()
476: )) . '">Print Return Label</a></p>';
477: }
478: }
479:
480:
481: Mage::getSingleton('adminhtml/session')->addSuccess($message);
482:
483:
484: $url = $this->getUrl('adminhtml/sales_order/view', array(
485: 'order_id' => $order->getId()
486: ));
487:
488:
489: $this->_redirectUrl($url);
490:
491: return $this;
492: }
493:
494:
495:
496: 497: 498:
499: public function labelAction()
500: {
501: if ($packageId = $this->getRequest()->getParam('id')) {
502: $package = Mage::getModel('shipping/shipment_package')->load($packageId);
503:
504: $carrier = strtoupper($package->getCarrier());
505:
506: $labelFormat = strtolower($package->getLabelFormat());
507: $labelImage = $package->getLabelImage();
508:
509: $this->labelPrint($labelImage, $labelFormat, $carrier, $package);
510: }
511: }
512:
513:
514: 515: 516:
517: public function codlabelAction()
518: {
519: if ($packageId = $this->getRequest()->getParam('id')) {
520: $package = Mage::getModel('shipping/shipment_package')->load($packageId);
521: $carrier = strtoupper($package->getCarrier());
522:
523: $labelFormat = strtolower($package->getLabelFormat());
524: $labelImage = $package->getCodLabelImage();
525:
526: $this->labelPrint($labelImage, $labelFormat, $carrier . '_COD_', $package);
527: }
528: }
529:
530:
531: 532: 533:
534: public function returnLabelAction()
535: {
536: if ($packageId = $this->getRequest()->getParam('id')) {
537: $package = Mage::getModel('shipping/shipment_package')->load($packageId);
538: $carrier = strtoupper($package->getCarrier());
539:
540: $labelFormat = strtolower($package->getLabelFormat());
541: $labelImage = $package->getReturnLabelImage();
542:
543: $this->labelPrint($labelImage, $labelFormat, $carrier . '_RETURN_', $package);
544: }
545: }
546:
547:
548: public function labelPrint($labelImage, $labelFormat, $carrier, $package)
549: {
550: switch ($labelFormat) {
551: case 'pdf':
552:
553: $labelImage = mb_convert_encoding($labelImage, 'UTF-8', 'BASE64');
554: $labelPath = $carrier . $package->getTrackingNumber() . '.' . substr($labelFormat, 0, 3);
555:
556: $this->getResponse()->setHeader('Content-type', 'application/pdf', true)->setHeader('Content-Disposition', 'inline' . '; filename="' . $labelPath . '"')->setBody($labelImage);
557:
558: break;
559:
560: case 'png':
561:
562: $labelImage = mb_convert_encoding($labelImage, 'UTF-8', 'BASE64');
563: $labelPath = $carrier . '_COD_' . $package->getTrackingNumber() . '.' . substr($labelFormat, 0, 3);
564: $this->getResponse()->setHeader('Content-type', 'application/octet-stream', true)->setHeader('Content-Disposition', 'inline' . '; filename="' . $labelPath . '"')->setBody($labelImage);
565:
566: break;
567:
568:
569: default:
570: $this->thermalPrint($labelImage, $labelFormat);
571: break;
572: }
573: }
574:
575:
576: public function thermalPrint($labelImage, $labelFormat)
577: {
578: $jsUrl = Mage::getBaseUrl(Mage_Core_Model_Store::URL_TYPE_WEB) . 'js/illapps/shipsync/jzebra.js';
579:
580: $javaUrl = Mage::getBaseUrl(Mage_Core_Model_Store::URL_TYPE_WEB) . 'java/jZebra/';
581:
582: $printerName = Mage::getStoreConfig('carriers/fedex/printer_name');
583:
584: $htmlBody = '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
585: <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
586: <head>
587: <script type="text/javascript">
588: var label = "' . $labelImage . '";
589: </script>
590: <script type="text/javascript" src="' . $jsUrl . '"></script>
591: </head>
592: <body style="background-color: #ccc; padding: 20px;">
593: <p><strong>ShipSync Thermal Printing</strong></p>
594: <div style="border: 1px #000 solid; padding: 10px; background-color: #fff; margin: 20px; ">
595: <applet name="jZebra" code="jzebra.PrintApplet.class" archive="' . $javaUrl . 'jzebra.jar" width="0" height="0">
596: <param name="sleep" value="200">
597: <param name="printer" value="' . $printerName . '">
598: </applet><br />
599: <input type=button onClick="findPrinter()" value="Detect Printer"><br />
600: <input type=button onClick="useDefaultPrinter()" value="Use Default Printer"><br />
601: <input type=button onClick="print()" value="Print">
602: </div>
603: </body>
604: </html>';
605:
606: $this->getResponse()->setBody($htmlBody);
607:
608: }
609:
610:
611:
612: public function deleteAction()
613: {
614: $console = Mage::helper('shipsync');
615:
616: $orderId = $this->getRequest()->getParam('order_id');
617:
618: $order = Mage::getModel('sales/order');
619:
620: $order->loadByIncrementId($orderId);
621:
622: $items = Mage::getResourceModel('sales/order_item_collection')->setOrderFilter($orderId)->load();
623:
624: foreach ($items as $item) {
625: if ($item->getQtyShipped() > 0) {
626: $item->setQtyShipped(0)->save();
627: }
628: }
629:
630: $shipments = Mage::getResourceModel('sales/order_shipment_collection')->setOrderFilter($orderId)->load();
631:
632: foreach ($shipments as $shipment) {
633:
634: $shipment->delete();
635: }
636:
637: $shipments->save();
638:
639: $this->_getSession()->addSuccess($this->__('Shipment successfully deleted.'));
640:
641: $this->_redirect('adminhtml/sales_order/view', array(
642: 'order_id' => $orderId
643: ));
644: }
645: }
646: