Version Notes
- Allow to print orders
- Allow to print invoices
- Allow to print packingslips
- Allow to print credit memos
- Allow to attach order pdf in email
- Allow to attach invoice pdf in email
- Compatible with Aschroder_SMTPPro
Download this release
Release Info
Developer | Easy PDF Invoice |
Extension | Easy_PDF_Invoice |
Version | 1.2.0.1.24 |
Comparing to | |
See all releases |
Version 1.2.0.1.24
- app/code/community/VES/PdfPro/Block/Adminhtml/Key.php +11 -0
- app/code/community/VES/PdfPro/Block/Adminhtml/Key/Edit.php +37 -0
- app/code/community/VES/PdfPro/Block/Adminhtml/Key/Edit/Form.php +19 -0
- app/code/community/VES/PdfPro/Block/Adminhtml/Key/Edit/Tab/Form.php +84 -0
- app/code/community/VES/PdfPro/Block/Adminhtml/Key/Edit/Tabs.php +25 -0
- app/code/community/VES/PdfPro/Block/Adminhtml/Key/Grid.php +82 -0
- app/code/community/VES/PdfPro/Block/Adminhtml/Key/Grid/Renderer/Group.php +13 -0
- app/code/community/VES/PdfPro/Block/Adminhtml/Key/Grid/Renderer/Store.php +11 -0
- app/code/community/VES/PdfPro/Block/Adminhtml/Sales/Order/Creditmemo/View.php +44 -0
- app/code/community/VES/PdfPro/Block/Adminhtml/Sales/Order/Invoice/View.php +44 -0
- app/code/community/VES/PdfPro/Block/Adminhtml/Sales/Order/Shipment/View.php +44 -0
- app/code/community/VES/PdfPro/Block/Adminhtml/Sales/Order/View.php +41 -0
- app/code/community/VES/PdfPro/Block/Adminhtml/System/Config/Form/Fieldset.php +29 -0
- app/code/community/VES/PdfPro/Block/Adminhtml/Version.php +98 -0
- app/code/community/VES/PdfPro/Block/Checkout/Onepage/Success.php +35 -0
- app/code/community/VES/PdfPro/Block/Sales/Order/Creditmemo/Items.php +23 -0
- app/code/community/VES/PdfPro/Block/Sales/Order/Info.php +18 -0
- app/code/community/VES/PdfPro/Block/Sales/Order/Info/Buttons.php +22 -0
- app/code/community/VES/PdfPro/Block/Sales/Order/Invoice/Items.php +23 -0
- app/code/community/VES/PdfPro/Block/Sales/Order/Shipment/Items.php +21 -0
- app/code/community/VES/PdfPro/Controller/Abstract.php +248 -0
- app/code/community/VES/PdfPro/Helper/Data.php +103 -0
- app/code/community/VES/PdfPro/Helper/Giftmessage.php +39 -0
- app/code/community/VES/PdfPro/Model/Abstract.php +100 -0
- app/code/community/VES/PdfPro/Model/Communication/Method/Abstract.php +6 -0
- app/code/community/VES/PdfPro/Model/Communication/Method/Soap.php +14 -0
- app/code/community/VES/PdfPro/Model/Communication/Method/Xmlrpc.php +14 -0
- app/code/community/VES/PdfPro/Model/Email/Template.php +156 -0
- app/code/community/VES/PdfPro/Model/Email/Template/Mailer.php +38 -0
- app/code/community/VES/PdfPro/Model/Key.php +10 -0
- app/code/community/VES/PdfPro/Model/Mysql4/Key.php +10 -0
- app/code/community/VES/PdfPro/Model/Mysql4/Key/Collection.php +10 -0
- app/code/community/VES/PdfPro/Model/Observer.php +333 -0
- app/code/community/VES/PdfPro/Model/Order.php +290 -0
- app/code/community/VES/PdfPro/Model/Order/Creditmemo.php +240 -0
- app/code/community/VES/PdfPro/Model/Order/Creditmemo/Item.php +279 -0
- app/code/community/VES/PdfPro/Model/Order/Invoice.php +239 -0
- app/code/community/VES/PdfPro/Model/Order/Invoice/Item.php +280 -0
- app/code/community/VES/PdfPro/Model/Order/Item.php +277 -0
- app/code/community/VES/PdfPro/Model/Order/Shipment.php +146 -0
- app/code/community/VES/PdfPro/Model/Order/Shipment/Item.php +280 -0
- app/code/community/VES/PdfPro/Model/PdfPro.php +202 -0
- app/code/community/VES/PdfPro/Model/Processors/Easypdf.php +19 -0
- app/code/community/VES/PdfPro/Model/Sales/Order.php +285 -0
- app/code/community/VES/PdfPro/Model/Sales/Order/Invoice.php +294 -0
- app/code/community/VES/PdfPro/Model/Sales/Order/Pdf/Total/Default.php +19 -0
- app/code/community/VES/PdfPro/Model/Sales/Order/Shipment.php +286 -0
- app/code/community/VES/PdfPro/Model/Source/Attach.php +19 -0
- app/code/community/VES/PdfPro/Model/Source/Communication/Method.php +16 -0
- app/code/community/VES/PdfPro/Model/Source/Key.php +15 -0
- app/code/community/VES/PdfPro/Model/Source/Processor.php +15 -0
- app/code/community/VES/PdfPro/Model/System/Config/Backend/Easypdf.php +6 -0
- app/code/community/VES/PdfPro/controllers/Adminhtml/KeyController.php +101 -0
- app/code/community/VES/PdfPro/controllers/Adminhtml/PrintController.php +328 -0
- app/code/community/VES/PdfPro/controllers/GuestController.php +285 -0
- app/code/community/VES/PdfPro/controllers/PrintController.php +344 -0
- app/code/community/VES/PdfPro/etc/config.xml +258 -0
- app/code/community/VES/PdfPro/etc/system.xml +878 -0
- app/code/community/VES/PdfPro/sql/pdfpro_setup/mysql4-install-0.1.0.php +23 -0
- app/design/adminhtml/default/default/layout/ves_pdfpro.xml +39 -0
- app/design/adminhtml/default/default/template/ves_pdfpro/notifications.phtml +44 -0
- app/etc/modules/VES_PdfPro.xml +9 -0
- app/locale/en_US/VES_PdfPro.csv +23 -0
- app/locale/he_IL/VES_PdfPro.csv +20 -0
- app/locale/vi_VN/VES_PdfPro.csv +20 -0
- media/ves_pdfpro/logos/logo-200x50.jpg +0 -0
- media/ves_pdfpro/logos/logo.png +0 -0
- media/ves_pdfpro/logos/logo_1.png +0 -0
- media/ves_pdfpro/logos/logo_green.png +0 -0
- media/ves_pdfpro/logos/logo_red.png +0 -0
- media/ves_pdfpro/pdf.data +1 -0
- package.xml +24 -0
- skin/adminhtml/default/default/ves_pdfpro/easypdf.png +0 -0
- skin/adminhtml/default/default/ves_pdfpro/favicon.png +0 -0
- skin/adminhtml/default/default/ves_pdfpro/js.js +3 -0
- skin/adminhtml/default/default/ves_pdfpro/styles.css +3 -0
app/code/community/VES/PdfPro/Block/Adminhtml/Key.php
ADDED
@@ -0,0 +1,11 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
class VES_PdfPro_Block_Adminhtml_Key extends Mage_Adminhtml_Block_Widget_Grid_Container
|
3 |
+
{
|
4 |
+
public function __construct()
|
5 |
+
{
|
6 |
+
$this->_controller = 'adminhtml_key';
|
7 |
+
$this->_blockGroup = 'pdfpro';
|
8 |
+
$this->_headerText = Mage::helper('pdfpro')->__('API Key Manager');
|
9 |
+
parent::__construct();
|
10 |
+
}
|
11 |
+
}
|
app/code/community/VES/PdfPro/Block/Adminhtml/Key/Edit.php
ADDED
@@ -0,0 +1,37 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
class VES_PdfPro_Block_Adminhtml_Key_Edit extends Mage_Adminhtml_Block_Widget_Form_Container
|
4 |
+
{
|
5 |
+
public function __construct()
|
6 |
+
{
|
7 |
+
parent::__construct();
|
8 |
+
|
9 |
+
$this->_objectId = 'id';
|
10 |
+
$this->_blockGroup = 'pdfpro';
|
11 |
+
$this->_controller = 'adminhtml_key';
|
12 |
+
|
13 |
+
$this->_updateButton('save', 'label', Mage::helper('pdfpro')->__('Save API Key'));
|
14 |
+
$this->_updateButton('delete', 'label', Mage::helper('pdfpro')->__('Delete API Key'));
|
15 |
+
|
16 |
+
$this->_addButton('saveandcontinue', array(
|
17 |
+
'label' => Mage::helper('adminhtml')->__('Save And Continue Edit'),
|
18 |
+
'onclick' => 'submitAndContinueEdit()',
|
19 |
+
'class' => 'save',
|
20 |
+
), -100);
|
21 |
+
|
22 |
+
$this->_formScripts[] = "
|
23 |
+
function submitAndContinueEdit(){
|
24 |
+
editForm.submit($('edit_form').action+'back/edit/');
|
25 |
+
}
|
26 |
+
";
|
27 |
+
}
|
28 |
+
|
29 |
+
public function getHeaderText()
|
30 |
+
{
|
31 |
+
if( Mage::registry('key_data') && Mage::registry('key_data')->getId() ) {
|
32 |
+
return Mage::helper('pdfpro')->__("Edit API Key '%s'", $this->htmlEscape(Mage::registry('key_data')->getId()));
|
33 |
+
} else {
|
34 |
+
return Mage::helper('pdfpro')->__('Add API Key');
|
35 |
+
}
|
36 |
+
}
|
37 |
+
}
|
app/code/community/VES/PdfPro/Block/Adminhtml/Key/Edit/Form.php
ADDED
@@ -0,0 +1,19 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
class VES_PdfPro_Block_Adminhtml_Key_Edit_Form extends Mage_Adminhtml_Block_Widget_Form
|
4 |
+
{
|
5 |
+
protected function _prepareForm()
|
6 |
+
{
|
7 |
+
$form = new Varien_Data_Form(array(
|
8 |
+
'id' => 'edit_form',
|
9 |
+
'action' => $this->getUrl('*/*/save', array('id' => $this->getRequest()->getParam('id'))),
|
10 |
+
'method' => 'post',
|
11 |
+
'enctype' => 'multipart/form-data'
|
12 |
+
)
|
13 |
+
);
|
14 |
+
|
15 |
+
$form->setUseContainer(true);
|
16 |
+
$this->setForm($form);
|
17 |
+
return parent::_prepareForm();
|
18 |
+
}
|
19 |
+
}
|
app/code/community/VES/PdfPro/Block/Adminhtml/Key/Edit/Tab/Form.php
ADDED
@@ -0,0 +1,84 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
class VES_PdfPro_Block_Adminhtml_Key_Edit_Tab_Form extends Mage_Adminhtml_Block_Widget_Form
|
4 |
+
{
|
5 |
+
protected function _prepareForm()
|
6 |
+
{
|
7 |
+
$form = new Varien_Data_Form();
|
8 |
+
$this->setForm($form);
|
9 |
+
$fieldset = $form->addFieldset('apikey_form', array('legend'=>Mage::helper('pdfpro')->__('API Key information')));
|
10 |
+
Mage::dispatchEvent('ves_pdfpro_apikey_form_prepare_before',array('fieldset'=>$fieldset));
|
11 |
+
$fieldset->addField('api_key', 'text', array(
|
12 |
+
'label' => Mage::helper('pdfpro')->__('API Key'),
|
13 |
+
'class' => 'required-entry',
|
14 |
+
'required' => true,
|
15 |
+
'name' => 'api_key',
|
16 |
+
));
|
17 |
+
|
18 |
+
/**
|
19 |
+
* Check is single store mode
|
20 |
+
*/
|
21 |
+
if (!Mage::app()->isSingleStoreMode()) {
|
22 |
+
$field = $fieldset->addField('store_ids', 'multiselect', array(
|
23 |
+
'name' => 'store_ids[]',
|
24 |
+
'label' => Mage::helper('cms')->__('Store View'),
|
25 |
+
'title' => Mage::helper('cms')->__('Store View'),
|
26 |
+
'required' => true,
|
27 |
+
'values' => Mage::getSingleton('adminhtml/system_store')->getStoreValuesForForm(false, true),
|
28 |
+
));
|
29 |
+
//$renderer = $this->getLayout()->createBlock('adminhtml/store_switcher_form_renderer_fieldset_element');
|
30 |
+
//$field->setRenderer($renderer);
|
31 |
+
}
|
32 |
+
else {
|
33 |
+
$fieldset->addField('store_ids', 'hidden', array(
|
34 |
+
'name' => 'store_ids[]',
|
35 |
+
'value' => Mage::app()->getStore(true)->getId()
|
36 |
+
));
|
37 |
+
Mage::registry('key_data')->setStoreIds(Mage::app()->getStore(true)->getId());
|
38 |
+
}
|
39 |
+
|
40 |
+
|
41 |
+
$customerGroups = Mage::getResourceModel('customer/group_collection')->load()->toOptionArray();
|
42 |
+
$found = false;
|
43 |
+
|
44 |
+
foreach ($customerGroups as $group) {
|
45 |
+
if ($group['value']==0) {
|
46 |
+
$found = true;
|
47 |
+
}
|
48 |
+
}
|
49 |
+
if (!$found) {
|
50 |
+
array_unshift($customerGroups, array(
|
51 |
+
'value' => 0,
|
52 |
+
'label' => Mage::helper('salesrule')->__('NOT LOGGED IN'))
|
53 |
+
);
|
54 |
+
}
|
55 |
+
|
56 |
+
$fieldset->addField('customer_group_ids', 'multiselect', array(
|
57 |
+
'name' => 'customer_group_ids[]',
|
58 |
+
'label' => Mage::helper('salesrule')->__('Customer Groups'),
|
59 |
+
'title' => Mage::helper('salesrule')->__('Customer Groups'),
|
60 |
+
'required' => true,
|
61 |
+
'values' => Mage::getResourceModel('customer/group_collection')->toOptionArray(),
|
62 |
+
));
|
63 |
+
$fieldset->addField('comment', 'editor', array(
|
64 |
+
'label' => Mage::helper('pdfpro')->__('Comment'),
|
65 |
+
'required' => false,
|
66 |
+
'name' => 'comment',
|
67 |
+
));
|
68 |
+
$fieldset->addField('priority', 'text', array(
|
69 |
+
'label' => Mage::helper('pdfpro')->__('Priority'),
|
70 |
+
'class' => 'required-entry',
|
71 |
+
'required' => true,
|
72 |
+
'name' => 'priority',
|
73 |
+
));
|
74 |
+
Mage::dispatchEvent('ves_pdfpro_apikey_form_prepare_after',array('fieldset'=>$fieldset));
|
75 |
+
if ( Mage::getSingleton('adminhtml/session')->getFormData() )
|
76 |
+
{
|
77 |
+
$form->setValues(Mage::getSingleton('adminhtml/session')->getFormData());
|
78 |
+
Mage::getSingleton('adminhtml/session')->setFormData(null);
|
79 |
+
} elseif ( Mage::registry('key_data') ) {
|
80 |
+
$form->setValues(Mage::registry('key_data')->getData());
|
81 |
+
}
|
82 |
+
return parent::_prepareForm();
|
83 |
+
}
|
84 |
+
}
|
app/code/community/VES/PdfPro/Block/Adminhtml/Key/Edit/Tabs.php
ADDED
@@ -0,0 +1,25 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
class VES_PdfPro_Block_Adminhtml_Key_Edit_Tabs extends Mage_Adminhtml_Block_Widget_Tabs
|
4 |
+
{
|
5 |
+
|
6 |
+
public function __construct()
|
7 |
+
{
|
8 |
+
parent::__construct();
|
9 |
+
$this->setId('apikey_tabs');
|
10 |
+
$this->setDestElementId('edit_form');
|
11 |
+
$this->setTitle(Mage::helper('pdfpro')->__('API Key Information'));
|
12 |
+
}
|
13 |
+
|
14 |
+
protected function _beforeToHtml()
|
15 |
+
{
|
16 |
+
Mage::dispatchEvent('ves_pdfpro_apikey_tabs_before',array('block'=>$this));
|
17 |
+
$this->addTab('form', array(
|
18 |
+
'label' => Mage::helper('pdfpro')->__('API Key Information'),
|
19 |
+
'title' => Mage::helper('pdfpro')->__('API Key Information'),
|
20 |
+
'content' => $this->getLayout()->createBlock('pdfpro/adminhtml_key_edit_tab_form')->toHtml(),
|
21 |
+
));
|
22 |
+
Mage::dispatchEvent('ves_pdfpro_apikey_tabs_after',array('block'=>$this));
|
23 |
+
return parent::_beforeToHtml();
|
24 |
+
}
|
25 |
+
}
|
app/code/community/VES/PdfPro/Block/Adminhtml/Key/Grid.php
ADDED
@@ -0,0 +1,82 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
class VES_PdfPro_Block_Adminhtml_Key_Grid extends Mage_Adminhtml_Block_Widget_Grid
|
4 |
+
{
|
5 |
+
public function __construct()
|
6 |
+
{
|
7 |
+
parent::__construct();
|
8 |
+
$this->setId('apiKeyGrid');
|
9 |
+
$this->setSaveParametersInSession(true);
|
10 |
+
$this->setDefaultSort('priority');
|
11 |
+
$this->setDefaultDir('ASC');
|
12 |
+
}
|
13 |
+
|
14 |
+
protected function _prepareCollection()
|
15 |
+
{
|
16 |
+
$collection = Mage::getModel('pdfpro/key')->getCollection();
|
17 |
+
$this->setCollection($collection);
|
18 |
+
return parent::_prepareCollection();
|
19 |
+
}
|
20 |
+
|
21 |
+
protected function _prepareColumns()
|
22 |
+
{
|
23 |
+
$this->addColumn('entity_id', array(
|
24 |
+
'header' => Mage::helper('pdfpro')->__('ID'),
|
25 |
+
'align' =>'left',
|
26 |
+
'index' => 'entity_id',
|
27 |
+
'width' => '50px',
|
28 |
+
));
|
29 |
+
$this->addColumn('api_key', array(
|
30 |
+
'header' => Mage::helper('pdfpro')->__('API Key'),
|
31 |
+
'align' =>'left',
|
32 |
+
'index' => 'api_key',
|
33 |
+
));
|
34 |
+
/**
|
35 |
+
* Check is single store mode
|
36 |
+
*/
|
37 |
+
if (!Mage::app()->isSingleStoreMode()) {
|
38 |
+
$this->addColumn('store_id', array(
|
39 |
+
'header' => Mage::helper('cms')->__('Store View'),
|
40 |
+
'index' => 'store_ids',
|
41 |
+
'type' => 'store',
|
42 |
+
'store_all' => true,
|
43 |
+
'store_view' => true,
|
44 |
+
'sortable' => false,
|
45 |
+
'filter' => false,
|
46 |
+
'renderer' => new VES_PdfPro_Block_Adminhtml_Key_Grid_Renderer_Store(),
|
47 |
+
));
|
48 |
+
}
|
49 |
+
$this->addColumn('customer_group_ids', array(
|
50 |
+
'header' => Mage::helper('cms')->__('Customer Group'),
|
51 |
+
'index' => 'customer_group_ids',
|
52 |
+
'type' => 'store',
|
53 |
+
'store_all' => true,
|
54 |
+
'store_view' => true,
|
55 |
+
'sortable' => false,
|
56 |
+
'filter' => false,
|
57 |
+
'renderer' => new VES_PdfPro_Block_Adminhtml_Key_Grid_Renderer_Group(),
|
58 |
+
));
|
59 |
+
$this->addColumn('comment', array(
|
60 |
+
'header' => Mage::helper('pdfpro')->__('Comment'),
|
61 |
+
'align' =>'left',
|
62 |
+
'index' => 'comment',
|
63 |
+
'width' => '400px',
|
64 |
+
));
|
65 |
+
|
66 |
+
$this->addColumn('priority', array(
|
67 |
+
'header' => Mage::helper('pdfpro')->__('Priority'),
|
68 |
+
'align' =>'center',
|
69 |
+
'index' => 'priority',
|
70 |
+
'width' => '50px',
|
71 |
+
));
|
72 |
+
return parent::_prepareColumns();
|
73 |
+
}
|
74 |
+
public function getRowUrl($row)
|
75 |
+
{
|
76 |
+
return $this->getUrl('*/*/edit', array('id' => $row->getId()));
|
77 |
+
}
|
78 |
+
protected function _prepareMassaction()
|
79 |
+
{
|
80 |
+
return $this;
|
81 |
+
}
|
82 |
+
}
|
app/code/community/VES/PdfPro/Block/Adminhtml/Key/Grid/Renderer/Group.php
ADDED
@@ -0,0 +1,13 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
class VES_PdfPro_Block_Adminhtml_Key_Grid_Renderer_Group extends Mage_Adminhtml_Block_Widget_Grid_Column_Renderer_Abstract
|
3 |
+
{
|
4 |
+
public function render(Varien_Object $row)
|
5 |
+
{
|
6 |
+
$value = $row->getData($this->getColumn()->getIndex());
|
7 |
+
$groups = Mage::getModel('customer/group')->getCollection()->addFieldToFilter('customer_group_id',array('in'=>explode(',', $value)));
|
8 |
+
$result = '';
|
9 |
+
foreach($groups as $group){$result.=$group->getCustomerGroupCode()."<br />";}
|
10 |
+
return $result;
|
11 |
+
}
|
12 |
+
|
13 |
+
}
|
app/code/community/VES/PdfPro/Block/Adminhtml/Key/Grid/Renderer/Store.php
ADDED
@@ -0,0 +1,11 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
class VES_PdfPro_Block_Adminhtml_Key_Grid_Renderer_Store extends Mage_Adminhtml_Block_Widget_Grid_Column_Renderer_Store
|
3 |
+
{
|
4 |
+
public function render(Varien_Object $row)
|
5 |
+
{
|
6 |
+
$value = $row->getData($this->getColumn()->getIndex());
|
7 |
+
$row->setData($this->getColumn()->getIndex(),explode(',', $value));
|
8 |
+
return parent::render($row);
|
9 |
+
}
|
10 |
+
|
11 |
+
}
|
app/code/community/VES/PdfPro/Block/Adminhtml/Sales/Order/Creditmemo/View.php
ADDED
@@ -0,0 +1,44 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* VES_PdfPro_Block_Adminhtml_Sales_Order_Creditmemo_View
|
4 |
+
*
|
5 |
+
* @author VnEcoms Team <support@vnecoms.com>
|
6 |
+
* @website http://www.vnecoms.com
|
7 |
+
*/
|
8 |
+
class VES_PdfPro_Block_Adminhtml_Sales_Order_Creditmemo_View extends Mage_Adminhtml_Block_Template
|
9 |
+
{
|
10 |
+
/**
|
11 |
+
* Retrieve invoice model instance
|
12 |
+
*
|
13 |
+
* @return Mage_Sales_Model_Order_Invoice
|
14 |
+
*/
|
15 |
+
public function getCreditmemo()
|
16 |
+
{
|
17 |
+
return Mage::registry('current_creditmemo');
|
18 |
+
}
|
19 |
+
/**
|
20 |
+
* Get Print Url
|
21 |
+
* @return string
|
22 |
+
*/
|
23 |
+
public function getPrintUrl(){
|
24 |
+
return $this->getUrl('pdfpro_cp/adminhtml_print/creditmemo',array('creditmemo_id'=>$this->getCreditmemo()->getId()));
|
25 |
+
}
|
26 |
+
|
27 |
+
/**
|
28 |
+
* Add PDF Pro Print button to view invoice page
|
29 |
+
* @see Mage_Core_Block_Abstract::_prepareLayout()
|
30 |
+
*/
|
31 |
+
protected function _prepareLayout(){
|
32 |
+
if(!Mage::getStoreConfig('pdfpro/config/enabled')) return;
|
33 |
+
$block = $this->getLayout()->getBlock('sales_creditmemo_view');
|
34 |
+
if(Mage::getStoreConfig('pdfpro/config/remove_default_print')){
|
35 |
+
$block->removeButton('print');
|
36 |
+
}
|
37 |
+
$block->addButton('pdfpro_print', array(
|
38 |
+
'label' => 'Easy PDF - '.Mage::helper('sales')->__('Print Credit Memo'),
|
39 |
+
'class' => 'save',
|
40 |
+
'onclick' => 'setLocation(\''.$this->getPrintUrl().'\')'
|
41 |
+
)
|
42 |
+
);
|
43 |
+
}
|
44 |
+
}
|
app/code/community/VES/PdfPro/Block/Adminhtml/Sales/Order/Invoice/View.php
ADDED
@@ -0,0 +1,44 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* VES_PdfPro_Block_Adminhtml_Sales_Order_Invoice_View
|
4 |
+
*
|
5 |
+
* @author VnEcoms Team <support@vnecoms.com>
|
6 |
+
* @website http://www.vnecoms.com
|
7 |
+
*/
|
8 |
+
class VES_PdfPro_Block_Adminhtml_Sales_Order_Invoice_View extends Mage_Adminhtml_Block_Template
|
9 |
+
{
|
10 |
+
/**
|
11 |
+
* Retrieve invoice model instance
|
12 |
+
*
|
13 |
+
* @return Mage_Sales_Model_Order_Invoice
|
14 |
+
*/
|
15 |
+
public function getInvoice()
|
16 |
+
{
|
17 |
+
return Mage::registry('current_invoice');
|
18 |
+
}
|
19 |
+
/**
|
20 |
+
* Get Print Url
|
21 |
+
* @return string
|
22 |
+
*/
|
23 |
+
public function getPrintUrl(){
|
24 |
+
return $this->getUrl('pdfpro_cp/adminhtml_print/invoice',array('invoice_id'=>$this->getInvoice()->getId()));
|
25 |
+
}
|
26 |
+
|
27 |
+
/**
|
28 |
+
* Add PDF Pro Print button to view invoice page
|
29 |
+
* @see Mage_Core_Block_Abstract::_prepareLayout()
|
30 |
+
*/
|
31 |
+
protected function _prepareLayout(){
|
32 |
+
if(!Mage::getStoreConfig('pdfpro/config/enabled')) return;
|
33 |
+
$block = $this->getLayout()->getBlock('sales_invoice_view');
|
34 |
+
if(Mage::getStoreConfig('pdfpro/config/remove_default_print')){
|
35 |
+
$block->removeButton('print');
|
36 |
+
}
|
37 |
+
$block->addButton('pdfpro_print', array(
|
38 |
+
'label' => 'Easy PDF - '.Mage::helper('sales')->__('Print Invoice'),
|
39 |
+
'class' => 'save',
|
40 |
+
'onclick' => 'setLocation(\''.$this->getPrintUrl().'\')'
|
41 |
+
)
|
42 |
+
);
|
43 |
+
}
|
44 |
+
}
|
app/code/community/VES/PdfPro/Block/Adminhtml/Sales/Order/Shipment/View.php
ADDED
@@ -0,0 +1,44 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* VES_PdfPro_Block_Adminhtml_Sales_Order_Shipment_View
|
4 |
+
*
|
5 |
+
* @author VnEcoms Team <support@vnecoms.com>
|
6 |
+
* @website http://www.vnecoms.com
|
7 |
+
*/
|
8 |
+
class VES_PdfPro_Block_Adminhtml_Sales_Order_Shipment_View extends Mage_Adminhtml_Block_Template
|
9 |
+
{
|
10 |
+
/**
|
11 |
+
* Retrieve invoice model instance
|
12 |
+
*
|
13 |
+
* @return Mage_Sales_Model_Order_Invoice
|
14 |
+
*/
|
15 |
+
public function getShipment()
|
16 |
+
{
|
17 |
+
return Mage::registry('current_shipment');
|
18 |
+
}
|
19 |
+
/**
|
20 |
+
* Get Print Url
|
21 |
+
* @return string
|
22 |
+
*/
|
23 |
+
public function getPrintUrl(){
|
24 |
+
return $this->getUrl('pdfpro_cp/adminhtml_print/shipment',array('shipment_id'=>$this->getShipment()->getId()));
|
25 |
+
}
|
26 |
+
|
27 |
+
/**
|
28 |
+
* Add PDF Pro Print button to view invoice page
|
29 |
+
* @see Mage_Core_Block_Abstract::_prepareLayout()
|
30 |
+
*/
|
31 |
+
protected function _prepareLayout(){
|
32 |
+
if(!Mage::getStoreConfig('pdfpro/config/enabled')) return;
|
33 |
+
$block = $this->getLayout()->getBlock('sales_shipment_view');
|
34 |
+
if(Mage::getStoreConfig('pdfpro/config/remove_default_print')){
|
35 |
+
$block->removeButton('print');
|
36 |
+
}
|
37 |
+
$block->addButton('pdfpro_print', array(
|
38 |
+
'label' => 'Easy PDF - '.Mage::helper('sales')->__('Print Packingslip'),
|
39 |
+
'class' => 'save',
|
40 |
+
'onclick' => 'setLocation(\''.$this->getPrintUrl().'\')'
|
41 |
+
)
|
42 |
+
);
|
43 |
+
}
|
44 |
+
}
|
app/code/community/VES/PdfPro/Block/Adminhtml/Sales/Order/View.php
ADDED
@@ -0,0 +1,41 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* VES_PdfPro_Block_Adminhtml_Sales_Order_Invoice_View
|
4 |
+
*
|
5 |
+
* @author VnEcoms Team <support@vnecoms.com>
|
6 |
+
* @website http://www.vnecoms.com
|
7 |
+
*/
|
8 |
+
class VES_PdfPro_Block_Adminhtml_Sales_Order_View extends Mage_Adminhtml_Block_Template
|
9 |
+
{
|
10 |
+
/**
|
11 |
+
* Retrieve invoice model instance
|
12 |
+
*
|
13 |
+
* @return Mage_Sales_Model_Order_Invoice
|
14 |
+
*/
|
15 |
+
public function getOrder()
|
16 |
+
{
|
17 |
+
return Mage::registry('current_order');
|
18 |
+
}
|
19 |
+
/**
|
20 |
+
* Get Print Url
|
21 |
+
* @return string
|
22 |
+
*/
|
23 |
+
public function getPrintUrl(){
|
24 |
+
return $this->getUrl('pdfpro_cp/adminhtml_print/order',array('order_id'=>$this->getOrder()->getId()));
|
25 |
+
}
|
26 |
+
|
27 |
+
/**
|
28 |
+
* Add PDF Pro Print button to view invoice page
|
29 |
+
* @see Mage_Core_Block_Abstract::_prepareLayout()
|
30 |
+
*/
|
31 |
+
protected function _prepareLayout(){
|
32 |
+
if(!Mage::getStoreConfig('pdfpro/config/enabled') || !Mage::getStoreConfig('pdfpro/config/admin_print_order')) return;
|
33 |
+
$block = $this->getLayout()->getBlock('sales_order_edit');
|
34 |
+
$block->addButton('pdfpro_print', array(
|
35 |
+
'label' => 'Easy PDF - '.Mage::helper('sales')->__('Print Order'),
|
36 |
+
'class' => 'save',
|
37 |
+
'onclick' => 'setLocation(\''.$this->getPrintUrl().'\')'
|
38 |
+
)
|
39 |
+
);
|
40 |
+
}
|
41 |
+
}
|
app/code/community/VES/PdfPro/Block/Adminhtml/System/Config/Form/Fieldset.php
ADDED
@@ -0,0 +1,29 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Config form fieldset renderer
|
4 |
+
*
|
5 |
+
* @category VES
|
6 |
+
* @package VES_PdfPro
|
7 |
+
* @author Easy PDF Invoice Team <support@easypdfinvoice.com>
|
8 |
+
*/
|
9 |
+
class VES_PdfPro_Block_Adminhtml_System_Config_Form_Fieldset extends Mage_Adminhtml_Block_System_Config_Form_Fieldset
|
10 |
+
{
|
11 |
+
/**
|
12 |
+
* Return header comment part of html for fieldset
|
13 |
+
*
|
14 |
+
* @param Varien_Data_Form_Element_Abstract $element
|
15 |
+
* @return string
|
16 |
+
*/
|
17 |
+
protected function _getHeaderCommentHtml($element)
|
18 |
+
{
|
19 |
+
$html = '
|
20 |
+
<div style="display: block;">
|
21 |
+
<table class="form-list">
|
22 |
+
<tr>
|
23 |
+
<td class="label">Extension Version</td><td><strong style="color: #1f5e00;">'.PdfPro::getVersion().'</strong></td>
|
24 |
+
</tr>
|
25 |
+
</table>
|
26 |
+
</div>';
|
27 |
+
return $html.$element->getComment();
|
28 |
+
}
|
29 |
+
}
|
app/code/community/VES/PdfPro/Block/Adminhtml/Version.php
ADDED
@@ -0,0 +1,98 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* VES_PdfPro_Block_Adminhtml_Version
|
4 |
+
*
|
5 |
+
* @author VnEcoms Team <support@vnecoms.com>
|
6 |
+
* @website http://www.vnecoms.com
|
7 |
+
*/
|
8 |
+
class VES_PdfPro_Block_Adminhtml_Version extends Mage_Adminhtml_Block_Template
|
9 |
+
{
|
10 |
+
/**
|
11 |
+
* Write version information from server to local file
|
12 |
+
* @param string $versionFile
|
13 |
+
*/
|
14 |
+
public function writeVersionFile($versionFile){
|
15 |
+
$date = Mage::getModel('core/date')->date('Y-m-d');
|
16 |
+
$serverVersion = Mage::helper('pdfpro')->getServerVersion();
|
17 |
+
try{
|
18 |
+
$fp = fopen($versionFile, 'w');
|
19 |
+
fwrite($fp, base64_encode(json_encode(array('date'=>$date,'version'=>$serverVersion))));
|
20 |
+
fclose($fp);
|
21 |
+
}catch(Exception $e){
|
22 |
+
|
23 |
+
}
|
24 |
+
return $serverVersion;
|
25 |
+
}
|
26 |
+
/**
|
27 |
+
* Get version of PDF Pro From server
|
28 |
+
*/
|
29 |
+
public function getServerVersion(){
|
30 |
+
$versionFile = Mage::getBaseDir('media').DS.'ves_pdfpro'.DS.'version.txt';
|
31 |
+
if(!file_exists($versionFile)){
|
32 |
+
//$serverVersion = $this->writeVersionFile($versionFile);
|
33 |
+
return false;
|
34 |
+
}else{
|
35 |
+
$date = Mage::getModel('core/date')->date('Y-m-d');
|
36 |
+
$info = file_get_contents($versionFile);
|
37 |
+
$info = json_decode(base64_decode($info),true);
|
38 |
+
if($info['date'] != $date){
|
39 |
+
$serverVersion = $this->writeVersionFile($versionFile);
|
40 |
+
}else{
|
41 |
+
$serverVersion = $info['version'];
|
42 |
+
}
|
43 |
+
}
|
44 |
+
return $serverVersion;
|
45 |
+
}
|
46 |
+
/**
|
47 |
+
* get Message from server
|
48 |
+
* @param string $versionFile
|
49 |
+
*/
|
50 |
+
public function writeServerMessage($messageFile){
|
51 |
+
$message = Mage::helper('pdfpro')->getServerMessage();
|
52 |
+
$date = Mage::getModel('core/date')->date('Y-m-d');
|
53 |
+
try{
|
54 |
+
$fp = fopen($messageFile, 'w');
|
55 |
+
fwrite($fp, base64_encode(json_encode(array('date'=>$date,'message'=>$message))));
|
56 |
+
fclose($fp);
|
57 |
+
}catch(Exception $e){
|
58 |
+
|
59 |
+
}
|
60 |
+
return $message;
|
61 |
+
}
|
62 |
+
|
63 |
+
/**
|
64 |
+
* Get Message from server
|
65 |
+
*/
|
66 |
+
public function getServerMessage(){
|
67 |
+
$messageFile = Mage::getBaseDir('media').DS.'ves_pdfpro'.DS.'message.txt';
|
68 |
+
if(!file_exists($messageFile)){
|
69 |
+
//$message = $this->writeServerMessage($messageFile);
|
70 |
+
return false;
|
71 |
+
}else{
|
72 |
+
$date = Mage::getModel('core/date')->date('Y-m-d');
|
73 |
+
$info = file_get_contents($messageFile);
|
74 |
+
$info = json_decode(base64_decode($info),true);
|
75 |
+
if($info['date'] != $date){
|
76 |
+
$message = $this->writeServerMessage($messageFile);
|
77 |
+
}else{
|
78 |
+
$message = $info['message'];
|
79 |
+
}
|
80 |
+
}
|
81 |
+
return $message;
|
82 |
+
}
|
83 |
+
|
84 |
+
public function canDisplayNotice(){
|
85 |
+
return Mage::getStoreConfig('pdfpro/notification/notice');
|
86 |
+
}
|
87 |
+
|
88 |
+
public function canDisplayNews(){
|
89 |
+
return Mage::getStoreConfig('pdfpro/notification/news');
|
90 |
+
}
|
91 |
+
|
92 |
+
public function canDisplayDefaultApiKeyMsg(){
|
93 |
+
$defaultKey = Mage::getStoreConfig('pdfpro/config/default_key');
|
94 |
+
if(!$defaultKey) return true;
|
95 |
+
$keyModel = Mage::getModel('pdfpro/key')->load($defaultKey);
|
96 |
+
return !($keyModel->getApiKey());
|
97 |
+
}
|
98 |
+
}
|
app/code/community/VES/PdfPro/Block/Checkout/Onepage/Success.php
ADDED
@@ -0,0 +1,35 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* VES_PdfPro_Block_Checkout_Onepage_Success
|
4 |
+
*
|
5 |
+
* @author VnEcoms Team <support@vnecoms.com>
|
6 |
+
* @website http://www.vnecoms.com
|
7 |
+
*/
|
8 |
+
class VES_PdfPro_Block_Checkout_Onepage_Success extends Mage_Checkout_Block_Onepage_Success
|
9 |
+
{
|
10 |
+
/**
|
11 |
+
* Get last order ID from session, fetch it and check whether it can be viewed, printed etc
|
12 |
+
*/
|
13 |
+
protected function _prepareLastOrder()
|
14 |
+
{
|
15 |
+
if(!Mage::getStoreConfig('pdfpro/config/enabled') || !Mage::getStoreConfig('pdfpro/config/allow_customer_print') || !Mage::helper('pdfpro')->getDefaultApiKey()){
|
16 |
+
return parent::_prepareLastOrder();
|
17 |
+
}
|
18 |
+
$orderId = Mage::getSingleton('checkout/session')->getLastOrderId();
|
19 |
+
if ($orderId) {
|
20 |
+
$order = Mage::getModel('sales/order')->load($orderId);
|
21 |
+
if ($order->getId()) {
|
22 |
+
$isVisible = !in_array($order->getState(),
|
23 |
+
Mage::getSingleton('sales/order_config')->getInvisibleOnFrontStates());
|
24 |
+
$this->addData(array(
|
25 |
+
'is_order_visible' => $isVisible,
|
26 |
+
'view_order_id' => $this->getUrl('sales/order/view/', array('order_id' => $orderId)),
|
27 |
+
'print_url' => $this->getUrl('pdfpro/print/order', array('order_id'=> $orderId)),
|
28 |
+
'can_print_order' => $isVisible,
|
29 |
+
'can_view_order' => Mage::getSingleton('customer/session')->isLoggedIn() && $isVisible,
|
30 |
+
'order_id' => $order->getIncrementId(),
|
31 |
+
));
|
32 |
+
}
|
33 |
+
}
|
34 |
+
}
|
35 |
+
}
|
app/code/community/VES/PdfPro/Block/Sales/Order/Creditmemo/Items.php
ADDED
@@ -0,0 +1,23 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* VES_PdfPro_Block_Sales_Order_Creditmemo_Items
|
4 |
+
*
|
5 |
+
* @author VnEcoms Team <support@vnecoms.com>
|
6 |
+
* @website http://www.vnecoms.com
|
7 |
+
*/
|
8 |
+
class VES_PdfPro_Block_Sales_Order_Creditmemo_Items extends Mage_Sales_Block_Order_Creditmemo_Items
|
9 |
+
{
|
10 |
+
public function getPrintCreditmemoUrl($creditmemo)
|
11 |
+
{
|
12 |
+
if(!Mage::getStoreConfig('pdfpro/config/enabled') || !Mage::getStoreConfig('pdfpro/config/allow_customer_print') || !Mage::helper('pdfpro')->getDefaultApiKey()) return parent::getPrintCreditmemoUrl($creditmemo);
|
13 |
+
if(Mage::getSingleton('customer/session')->isLoggedIn()) return Mage::getUrl('pdfpro/print/creditmemo', array('creditmemo_id' => $creditmemo->getId()));
|
14 |
+
return Mage::getUrl('pdfpro/guest/printCreditmemo', array('creditmemo_id' => $creditmemo->getId()));
|
15 |
+
}
|
16 |
+
|
17 |
+
public function getPrintAllCreditmemosUrl($order)
|
18 |
+
{
|
19 |
+
if(!Mage::getStoreConfig('pdfpro/config/enabled') || !Mage::getStoreConfig('pdfpro/config/allow_customer_print') || !Mage::helper('pdfpro')->getDefaultApiKey()) return parent::getPrintAllCreditmemosUrl($order);
|
20 |
+
if(Mage::getSingleton('customer/session')->isLoggedIn()) return Mage::getUrl('pdfpro/print/creditmemos', array('order_id' => $order->getId()));
|
21 |
+
return Mage::getUrl('pdfpro/guest/printCreditmemos', array('order_id' => $order->getId()));
|
22 |
+
}
|
23 |
+
}
|
app/code/community/VES/PdfPro/Block/Sales/Order/Info.php
ADDED
@@ -0,0 +1,18 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
/**
|
4 |
+
* VES_PdfPro_Block_Sales_Order_Info
|
5 |
+
*
|
6 |
+
* @author VnEcoms Team <support@vnecoms.com>
|
7 |
+
* @website http://www.vnecoms.com
|
8 |
+
*/
|
9 |
+
class VES_PdfPro_Block_Sales_Order_Info extends Mage_Sales_Block_Order_Info
|
10 |
+
{
|
11 |
+
public function getPrintUrl($order)
|
12 |
+
{
|
13 |
+
if(!Mage::getStoreConfig('pdfpro/config/enabled') || !Mage::getStoreConfig('pdfpro/config/allow_customer_print') || !Mage::helper('pdfpro')->getDefaultApiKey()) return parent::getPrintUrl($order);
|
14 |
+
if(Mage::getSingleton('customer/session')->isLoggedIn()) return $this->getUrl('pdfpro/print/order', array('order_id' => $order->getId()));
|
15 |
+
return $this->getUrl('pdfpro/guest/printOrder', array('order_id' => $order->getId()));
|
16 |
+
}
|
17 |
+
|
18 |
+
}
|
app/code/community/VES/PdfPro/Block/Sales/Order/Info/Buttons.php
ADDED
@@ -0,0 +1,22 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* VES_PdfPro_Block_Sales_Order_Info_Buttons
|
4 |
+
*
|
5 |
+
* @author VnEcoms Team <support@vnecoms.com>
|
6 |
+
* @website http://www.vnecoms.com
|
7 |
+
*/
|
8 |
+
class VES_PdfPro_Block_Sales_Order_Info_Buttons extends Mage_Sales_Block_Order_Info_Buttons
|
9 |
+
{
|
10 |
+
/**
|
11 |
+
* Get url for printing order
|
12 |
+
*
|
13 |
+
* @param Mage_Sales_Order $order
|
14 |
+
* @return string
|
15 |
+
*/
|
16 |
+
public function getPrintUrl($order)
|
17 |
+
{
|
18 |
+
if(!Mage::getStoreConfig('pdfpro/config/enabled') || !Mage::getStoreConfig('pdfpro/config/allow_customer_print') || !Mage::helper('pdfpro')->getDefaultApiKey()) return parent::getPrintUrl($order);
|
19 |
+
if(Mage::getSingleton('customer/session')->isLoggedIn()) return $this->getUrl('pdfpro/print/order', array('order_id' => $order->getId()));
|
20 |
+
return $this->getUrl('pdfpro/guest/printOrder', array('order_id' => $order->getId()));
|
21 |
+
}
|
22 |
+
}
|
app/code/community/VES/PdfPro/Block/Sales/Order/Invoice/Items.php
ADDED
@@ -0,0 +1,23 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* VES_PdfPro_Block_Sales_Order_Invoice_Items
|
4 |
+
*
|
5 |
+
* @author VnEcoms Team <support@vnecoms.com>
|
6 |
+
* @website http://www.vnecoms.com
|
7 |
+
*/
|
8 |
+
class VES_PdfPro_Block_Sales_Order_Invoice_Items extends Mage_Sales_Block_Order_Invoice_Items
|
9 |
+
{
|
10 |
+
public function getPrintInvoiceUrl($invoice)
|
11 |
+
{
|
12 |
+
if(!Mage::getStoreConfig('pdfpro/config/enabled') || !Mage::getStoreConfig('pdfpro/config/allow_customer_print') || !Mage::helper('pdfpro')->getDefaultApiKey()) return parent::getPrintInvoiceUrl($invoice);
|
13 |
+
if(Mage::getSingleton('customer/session')->isLoggedIn()) return Mage::getUrl('pdfpro/print/invoice', array('invoice_id' => $invoice->getId()));
|
14 |
+
return Mage::getUrl('pdfpro/guest/printInvoice', array('invoice_id' => $invoice->getId()));
|
15 |
+
}
|
16 |
+
|
17 |
+
public function getPrintAllInvoicesUrl($order)
|
18 |
+
{
|
19 |
+
if(!Mage::getStoreConfig('pdfpro/config/enabled') || !Mage::getStoreConfig('pdfpro/config/allow_customer_print') || !Mage::helper('pdfpro')->getDefaultApiKey()) return parent::getPrintAllInvoicesUrl($order);
|
20 |
+
if(Mage::getSingleton('customer/session')->isLoggedIn()) return Mage::getUrl('pdfpro/print/invoices', array('order_id' => $order->getId()));
|
21 |
+
return Mage::getUrl('pdfpro/guest/printInvoices', array('order_id' => $order->getId()));
|
22 |
+
}
|
23 |
+
}
|
app/code/community/VES/PdfPro/Block/Sales/Order/Shipment/Items.php
ADDED
@@ -0,0 +1,21 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* VES_PdfPro_Block_Sales_Order_Shipment_Items
|
4 |
+
*
|
5 |
+
* @author VnEcoms Team <support@vnecoms.com>
|
6 |
+
* @website http://www.vnecoms.com
|
7 |
+
*/
|
8 |
+
class VES_PdfPro_Block_Sales_Order_Shipment_Items extends Mage_Sales_Block_Order_Shipment_Items
|
9 |
+
{
|
10 |
+
public function getPrintShipmentUrl($shipment){
|
11 |
+
if(!Mage::getStoreConfig('pdfpro/config/enabled') || !Mage::getStoreConfig('pdfpro/config/allow_customer_print') || !Mage::helper('pdfpro')->getDefaultApiKey()) return parent::getPrintShipmentUrl($shipment);
|
12 |
+
if(Mage::getSingleton('customer/session')->isLoggedIn()) return Mage::getUrl('pdfpro/print/shipment', array('shipment_id' => $shipment->getId()));
|
13 |
+
return Mage::getUrl('pdfpro/guest/printShipment', array('shipment_id' => $shipment->getId()));
|
14 |
+
}
|
15 |
+
|
16 |
+
public function getPrintAllShipmentsUrl($order){
|
17 |
+
if(!Mage::getStoreConfig('pdfpro/config/enabled') || !Mage::getStoreConfig('pdfpro/config/allow_customer_print') || !Mage::helper('pdfpro')->getDefaultApiKey()) return parent::getPrintAllShipmentsUrl($order);
|
18 |
+
if(Mage::getSingleton('customer/session')->isLoggedIn()) return Mage::getUrl('pdfpro/print/shipments', array('order_id' => $order->getId()));
|
19 |
+
return Mage::getUrl('pdfpro/guest/printShipments', array('order_id' => $order->getId()));
|
20 |
+
}
|
21 |
+
}
|
app/code/community/VES/PdfPro/Controller/Abstract.php
ADDED
@@ -0,0 +1,248 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* VES_PdfPro_Controller_Abstract
|
4 |
+
* @extends Mage_Core_Controller_Front_Action
|
5 |
+
*
|
6 |
+
* @author VnEcoms Team <support@vnecoms.com>
|
7 |
+
* @website http://www.vnecoms.com
|
8 |
+
*/
|
9 |
+
|
10 |
+
abstract class VES_PdfPro_Controller_Abstract extends Mage_Core_Controller_Front_Action
|
11 |
+
{
|
12 |
+
/**
|
13 |
+
* Check order view availability
|
14 |
+
*
|
15 |
+
* @param Mage_Sales_Model_Order $order
|
16 |
+
* @return bool
|
17 |
+
*/
|
18 |
+
protected function _canViewOrder($order)
|
19 |
+
{
|
20 |
+
$customerId = Mage::getSingleton('customer/session')->getCustomerId();
|
21 |
+
$availableStates = Mage::getSingleton('sales/order_config')->getVisibleOnFrontStates();
|
22 |
+
if ($order->getId() && $order->getCustomerId() && ($order->getCustomerId() == $customerId)
|
23 |
+
&& in_array($order->getState(), $availableStates, $strict = true)
|
24 |
+
) {
|
25 |
+
return true;
|
26 |
+
}
|
27 |
+
return false;
|
28 |
+
}
|
29 |
+
|
30 |
+
/**
|
31 |
+
* Init layout, messages and set active block for customer
|
32 |
+
*
|
33 |
+
* @return null
|
34 |
+
*/
|
35 |
+
protected function _viewAction()
|
36 |
+
{
|
37 |
+
if (!$this->_loadValidOrder()) {
|
38 |
+
return;
|
39 |
+
}
|
40 |
+
|
41 |
+
$this->loadLayout();
|
42 |
+
$this->_initLayoutMessages('catalog/session');
|
43 |
+
|
44 |
+
$navigationBlock = $this->getLayout()->getBlock('customer_account_navigation');
|
45 |
+
if ($navigationBlock) {
|
46 |
+
$navigationBlock->setActive('sales/order/history');
|
47 |
+
}
|
48 |
+
$this->renderLayout();
|
49 |
+
}
|
50 |
+
|
51 |
+
/**
|
52 |
+
* Try to load valid order by order_id and register it
|
53 |
+
*
|
54 |
+
* @param int $orderId
|
55 |
+
* @return bool
|
56 |
+
*/
|
57 |
+
protected function _loadValidOrder($orderId = null)
|
58 |
+
{
|
59 |
+
if (null === $orderId) {
|
60 |
+
$orderId = (int) $this->getRequest()->getParam('order_id');
|
61 |
+
}
|
62 |
+
if (!$orderId) {
|
63 |
+
$this->_forward('noRoute');
|
64 |
+
return false;
|
65 |
+
}
|
66 |
+
|
67 |
+
$order = Mage::getModel('sales/order')->load($orderId);
|
68 |
+
|
69 |
+
if ($this->_canViewOrder($order)) {
|
70 |
+
Mage::register('current_order', $order);
|
71 |
+
return true;
|
72 |
+
} else {
|
73 |
+
$this->_redirect('*/*/history');
|
74 |
+
}
|
75 |
+
return false;
|
76 |
+
}
|
77 |
+
|
78 |
+
/**
|
79 |
+
* Order view page
|
80 |
+
*/
|
81 |
+
public function viewAction()
|
82 |
+
{
|
83 |
+
$this->_viewAction();
|
84 |
+
}
|
85 |
+
|
86 |
+
/**
|
87 |
+
* Invoice page
|
88 |
+
*/
|
89 |
+
public function invoiceAction()
|
90 |
+
{
|
91 |
+
$this->_viewAction();
|
92 |
+
}
|
93 |
+
|
94 |
+
/**
|
95 |
+
* Shipment page
|
96 |
+
*/
|
97 |
+
public function shipmentAction()
|
98 |
+
{
|
99 |
+
$this->_viewAction();
|
100 |
+
}
|
101 |
+
|
102 |
+
/**
|
103 |
+
* Creditmemo page
|
104 |
+
*/
|
105 |
+
public function creditmemoAction()
|
106 |
+
{
|
107 |
+
$this->_viewAction();
|
108 |
+
}
|
109 |
+
|
110 |
+
/**
|
111 |
+
* Action for reorder
|
112 |
+
*/
|
113 |
+
public function reorderAction()
|
114 |
+
{
|
115 |
+
if (!$this->_loadValidOrder()) {
|
116 |
+
return;
|
117 |
+
}
|
118 |
+
$order = Mage::registry('current_order');
|
119 |
+
|
120 |
+
$cart = Mage::getSingleton('checkout/cart');
|
121 |
+
$cartTruncated = false;
|
122 |
+
/* @var $cart Mage_Checkout_Model_Cart */
|
123 |
+
|
124 |
+
$items = $order->getItemsCollection();
|
125 |
+
foreach ($items as $item) {
|
126 |
+
try {
|
127 |
+
$cart->addOrderItem($item);
|
128 |
+
} catch (Mage_Core_Exception $e){
|
129 |
+
if (Mage::getSingleton('checkout/session')->getUseNotice(true)) {
|
130 |
+
Mage::getSingleton('checkout/session')->addNotice($e->getMessage());
|
131 |
+
}
|
132 |
+
else {
|
133 |
+
Mage::getSingleton('checkout/session')->addError($e->getMessage());
|
134 |
+
}
|
135 |
+
$this->_redirect('*/*/history');
|
136 |
+
} catch (Exception $e) {
|
137 |
+
Mage::getSingleton('checkout/session')->addException($e,
|
138 |
+
Mage::helper('checkout')->__('Cannot add the item to shopping cart.')
|
139 |
+
);
|
140 |
+
$this->_redirect('checkout/cart');
|
141 |
+
}
|
142 |
+
}
|
143 |
+
|
144 |
+
$cart->save();
|
145 |
+
$this->_redirect('checkout/cart');
|
146 |
+
}
|
147 |
+
|
148 |
+
/**
|
149 |
+
* Print Order Action
|
150 |
+
*/
|
151 |
+
public function printAction()
|
152 |
+
{
|
153 |
+
if (!$this->_loadValidOrder()) {
|
154 |
+
return;
|
155 |
+
}
|
156 |
+
$this->loadLayout('print');
|
157 |
+
$this->renderLayout();
|
158 |
+
}
|
159 |
+
|
160 |
+
/**
|
161 |
+
* Print Invoice Action
|
162 |
+
*/
|
163 |
+
public function printInvoiceAction()
|
164 |
+
{
|
165 |
+
$invoiceId = (int) $this->getRequest()->getParam('invoice_id');
|
166 |
+
if ($invoiceId) {
|
167 |
+
$invoice = Mage::getModel('sales/order_invoice')->load($invoiceId);
|
168 |
+
$order = $invoice->getOrder();
|
169 |
+
} else {
|
170 |
+
$orderId = (int) $this->getRequest()->getParam('order_id');
|
171 |
+
$order = Mage::getModel('sales/order')->load($orderId);
|
172 |
+
}
|
173 |
+
|
174 |
+
if ($this->_canViewOrder($order)) {
|
175 |
+
Mage::register('current_order', $order);
|
176 |
+
if (isset($invoice)) {
|
177 |
+
Mage::register('current_invoice', $invoice);
|
178 |
+
}
|
179 |
+
$this->loadLayout('print');
|
180 |
+
$this->renderLayout();
|
181 |
+
} else {
|
182 |
+
if (Mage::getSingleton('customer/session')->isLoggedIn()) {
|
183 |
+
$this->_redirect('*/*/history');
|
184 |
+
} else {
|
185 |
+
$this->_redirect('sales/guest/form');
|
186 |
+
}
|
187 |
+
}
|
188 |
+
}
|
189 |
+
|
190 |
+
/**
|
191 |
+
* Print Shipment Action
|
192 |
+
*/
|
193 |
+
public function printShipmentAction()
|
194 |
+
{
|
195 |
+
$shipmentId = (int) $this->getRequest()->getParam('shipment_id');
|
196 |
+
if ($shipmentId) {
|
197 |
+
$shipment = Mage::getModel('sales/order_shipment')->load($shipmentId);
|
198 |
+
$order = $shipment->getOrder();
|
199 |
+
} else {
|
200 |
+
$orderId = (int) $this->getRequest()->getParam('order_id');
|
201 |
+
$order = Mage::getModel('sales/order')->load($orderId);
|
202 |
+
}
|
203 |
+
if ($this->_canViewOrder($order)) {
|
204 |
+
Mage::register('current_order', $order);
|
205 |
+
if (isset($shipment)) {
|
206 |
+
Mage::register('current_shipment', $shipment);
|
207 |
+
}
|
208 |
+
$this->loadLayout('print');
|
209 |
+
$this->renderLayout();
|
210 |
+
} else {
|
211 |
+
if (Mage::getSingleton('customer/session')->isLoggedIn()) {
|
212 |
+
$this->_redirect('*/*/history');
|
213 |
+
} else {
|
214 |
+
$this->_redirect('sales/guest/form');
|
215 |
+
}
|
216 |
+
}
|
217 |
+
}
|
218 |
+
|
219 |
+
/**
|
220 |
+
* Print Creditmemo Action
|
221 |
+
*/
|
222 |
+
public function printCreditmemoAction()
|
223 |
+
{
|
224 |
+
$creditmemoId = (int) $this->getRequest()->getParam('creditmemo_id');
|
225 |
+
if ($creditmemoId) {
|
226 |
+
$creditmemo = Mage::getModel('sales/order_creditmemo')->load($creditmemoId);
|
227 |
+
$order = $creditmemo->getOrder();
|
228 |
+
} else {
|
229 |
+
$orderId = (int) $this->getRequest()->getParam('order_id');
|
230 |
+
$order = Mage::getModel('sales/order')->load($orderId);
|
231 |
+
}
|
232 |
+
|
233 |
+
if ($this->_canViewOrder($order)) {
|
234 |
+
Mage::register('current_order', $order);
|
235 |
+
if (isset($creditmemo)) {
|
236 |
+
Mage::register('current_creditmemo', $creditmemo);
|
237 |
+
}
|
238 |
+
$this->loadLayout('print');
|
239 |
+
$this->renderLayout();
|
240 |
+
} else {
|
241 |
+
if (Mage::getSingleton('customer/session')->isLoggedIn()) {
|
242 |
+
$this->_redirect('*/*/history');
|
243 |
+
} else {
|
244 |
+
$this->_redirect('sales/guest/form');
|
245 |
+
}
|
246 |
+
}
|
247 |
+
}
|
248 |
+
}
|
app/code/community/VES/PdfPro/Helper/Data.php
ADDED
@@ -0,0 +1,103 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* VES_PdfPro_Helper_Data
|
4 |
+
*
|
5 |
+
* @author VnEcoms Team <support@vnecoms.com>
|
6 |
+
* @website http://www.vnecoms.com
|
7 |
+
*/
|
8 |
+
include_once Mage::getBaseDir('code').'/community/VES/PdfPro/Model/PdfPro.php';
|
9 |
+
class VES_PdfPro_Helper_Data extends Mage_Core_Helper_Abstract
|
10 |
+
{
|
11 |
+
/**
|
12 |
+
* Init Pdf by given invoice data
|
13 |
+
* @param array $invoiceData
|
14 |
+
*/
|
15 |
+
public function initPdf($datas = array(),$type='invoice'){
|
16 |
+
$processorConfig = Mage::getStoreConfig('pdfpro/config/processor');
|
17 |
+
$processor = Mage::getModel($processorConfig);
|
18 |
+
$apiKey = $this->getDefaultApiKey();
|
19 |
+
return $processor->process($apiKey, $datas, $type);
|
20 |
+
}
|
21 |
+
|
22 |
+
/**
|
23 |
+
* Convert and format price value for given currency code
|
24 |
+
*
|
25 |
+
* @param float|int $value
|
26 |
+
* @param string $code;
|
27 |
+
* @return string
|
28 |
+
*/
|
29 |
+
public function currency($value, $code='USD',$baseCode=null){
|
30 |
+
$precision = Mage::getStoreConfig('pdfpro/config/number_format')!==''?Mage::getStoreConfig('pdfpro/config/number_format'):2;
|
31 |
+
$value = $value?$value:0;
|
32 |
+
return Mage::app()->getLocale()->currency($code)->toCurrency($value,array('precision'=>$precision));
|
33 |
+
}
|
34 |
+
/**
|
35 |
+
* Get version of PDF Pro
|
36 |
+
*/
|
37 |
+
public function getVersion(){
|
38 |
+
return PdfPro::getVersion();
|
39 |
+
}
|
40 |
+
/**
|
41 |
+
* Get messages from EasyPdfInvoice.com
|
42 |
+
*/
|
43 |
+
public function getServerMessage(){
|
44 |
+
$apiKey = $this->getDefaultApiKey();
|
45 |
+
$pdfPro = new PdfPro($apiKey);
|
46 |
+
return $pdfPro->getMessage();
|
47 |
+
}
|
48 |
+
/**
|
49 |
+
* Get version of PDF Pro from Server
|
50 |
+
*/
|
51 |
+
public function getServerVersion(){
|
52 |
+
$apiKey = $this->getDefaultApiKey();
|
53 |
+
$pdfPro = new PdfPro($apiKey);
|
54 |
+
return $pdfPro->getServerVersion();
|
55 |
+
}
|
56 |
+
/**
|
57 |
+
* Get API Key by Store ID and Customer Group ID
|
58 |
+
* @param int $storeId
|
59 |
+
* @param int $groupId
|
60 |
+
* @return string
|
61 |
+
*/
|
62 |
+
public function getApiKey($storeId, $groupId){
|
63 |
+
$keyCollection = Mage::getModel('pdfpro/key')->getCollection();
|
64 |
+
$keyCollection->getSelect()->where("FIND_IN_SET('".$storeId."', store_ids) OR FIND_IN_SET('0', store_ids)")
|
65 |
+
->where("FIND_IN_SET('".$groupId."', customer_group_ids)")
|
66 |
+
->order('priority ASC')
|
67 |
+
;
|
68 |
+
|
69 |
+
return $keyCollection->count()?$keyCollection->getFirstItem()->getApiKey():$this->getDefaultApiKey();
|
70 |
+
}
|
71 |
+
/**
|
72 |
+
* Get the default API Key
|
73 |
+
*/
|
74 |
+
public function getDefaultApiKey(){
|
75 |
+
$defaultApiKey = Mage::getStoreConfig('pdfpro/config/default_key');
|
76 |
+
return $defaultApiKey?Mage::getModel('pdfpro/key')->load($defaultApiKey)->getApiKey():false;
|
77 |
+
}
|
78 |
+
|
79 |
+
/**
|
80 |
+
* Get file name from givent type of PDF
|
81 |
+
* @param string $type
|
82 |
+
*/
|
83 |
+
public function getFileName($type='invoice',$model = false){
|
84 |
+
$fileName = Mage::getStoreConfig('pdfpro/filename_format/'.$type);
|
85 |
+
$dateTimeFormatArr = array('$dd','$EEE','$MM','$MMM','$y','$yy','$HH','$mm','$ss');
|
86 |
+
$timestamp = Mage::getModel('core/date')->timestamp();
|
87 |
+
foreach($dateTimeFormatArr as $dateTimeFormat){
|
88 |
+
$fileName = str_replace($dateTimeFormat, Mage::app()->getLocale()->date($timestamp)->toString(trim($dateTimeFormat,'$')), $fileName);
|
89 |
+
}
|
90 |
+
if($model){$fileName = str_replace('$ID',$model->getIncrementId(),$fileName);}
|
91 |
+
return $fileName;
|
92 |
+
}
|
93 |
+
/**
|
94 |
+
* Check a module is installed or not
|
95 |
+
*/
|
96 |
+
public function isEnableModule($module){
|
97 |
+
$modules = Mage::getConfig()->getNode('modules')->children();
|
98 |
+
$modulesArray = (array)$modules;
|
99 |
+
if(!isset($modulesArray[$module])) return false;
|
100 |
+
|
101 |
+
return $modulesArray[$module]->is('active');
|
102 |
+
}
|
103 |
+
}
|
app/code/community/VES/PdfPro/Helper/Giftmessage.php
ADDED
@@ -0,0 +1,39 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* VES_PdfPro_Helper_Giftmessage
|
4 |
+
*
|
5 |
+
* @author VnEcoms Team <support@vnecoms.com>
|
6 |
+
* @website http://www.vnecoms.com
|
7 |
+
*/
|
8 |
+
class VES_PdfPro_Helper_Giftmessage extends Mage_Core_Helper_Abstract
|
9 |
+
{
|
10 |
+
/**
|
11 |
+
* Initialize gift message for entity
|
12 |
+
*
|
13 |
+
* @return Mage_Adminhtml_Block_Sales_Order_View_Giftmessage
|
14 |
+
*/
|
15 |
+
public function initMessage($entity)
|
16 |
+
{
|
17 |
+
$order = ($entity instanceof Mage_Sales_Model_Order)?$entity:$entity->getOrder();
|
18 |
+
|
19 |
+
if(!$order->getGiftMessageId()){
|
20 |
+
return false;
|
21 |
+
}
|
22 |
+
$giftMessage = Mage::helper('giftmessage/message')->getGiftMessage($order->getGiftMessageId());
|
23 |
+
// init default values for giftmessage form
|
24 |
+
if(!$giftMessage->getSender()) {
|
25 |
+
$giftMessage->setSender($order->getCustomerName());
|
26 |
+
}
|
27 |
+
|
28 |
+
if(!$giftMessage->getRecipient()) {
|
29 |
+
if ($order->getShippingAddress()) {
|
30 |
+
$defaultRecipient = $order->getShippingAddress()->getName();
|
31 |
+
} else if ($order->getBillingAddress()) {
|
32 |
+
$defaultRecipient = $order->getBillingAddress()->getName();
|
33 |
+
}
|
34 |
+
$giftMessage->setRecipient($defaultRecipient);
|
35 |
+
}
|
36 |
+
|
37 |
+
return new Varien_Object($giftMessage->getData());
|
38 |
+
}
|
39 |
+
}
|
app/code/community/VES/PdfPro/Model/Abstract.php
ADDED
@@ -0,0 +1,100 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* VES_PdfPro_Model_Abstract
|
4 |
+
*
|
5 |
+
* @author VnEcoms Team <support@vnecoms.com>
|
6 |
+
* @website http://www.vnecoms.com
|
7 |
+
*/
|
8 |
+
class VES_PdfPro_Model_Abstract extends Varien_Object
|
9 |
+
{
|
10 |
+
|
11 |
+
/**
|
12 |
+
* Get All formated date for givent date
|
13 |
+
* @param string $date
|
14 |
+
* @return Varien_Object
|
15 |
+
*/
|
16 |
+
public function getFormatedDate($date,$type = null){
|
17 |
+
$dateFormated = new Varien_Object(array(
|
18 |
+
'full' => Mage::app()->getLocale()->date(strtotime($date))->toString(Mage::app()->getLocale()->getDateFormat(Mage_Core_Model_Locale::FORMAT_TYPE_FULL)),
|
19 |
+
'long' => Mage::app()->getLocale()->date(strtotime($date))->toString(Mage::app()->getLocale()->getDateFormat(Mage_Core_Model_Locale::FORMAT_TYPE_LONG)),
|
20 |
+
'medium' => Mage::app()->getLocale()->date(strtotime($date))->toString(Mage::app()->getLocale()->getDateFormat(Mage_Core_Model_Locale::FORMAT_TYPE_MEDIUM)),
|
21 |
+
'short' => Mage::app()->getLocale()->date(strtotime($date))->toString(Mage::app()->getLocale()->getDateFormat(Mage_Core_Model_Locale::FORMAT_TYPE_SHORT)),
|
22 |
+
));
|
23 |
+
if($type) return $dateFormated->getData($type);
|
24 |
+
return $dateFormated;
|
25 |
+
}
|
26 |
+
/**
|
27 |
+
* Get address data by address object
|
28 |
+
* @param object $address
|
29 |
+
* @return Varien_Object
|
30 |
+
*/
|
31 |
+
public function getAddressData($address){
|
32 |
+
$data = $address->getData();
|
33 |
+
foreach($data as $key=>$value){
|
34 |
+
if(is_object($value)) unset($data[$key]);
|
35 |
+
}
|
36 |
+
$data['country_name'] = Mage::app()->getLocale()->getCountryTranslation($data['country_id']);
|
37 |
+
$data['formated'] = $address->getFormated(true);
|
38 |
+
$data = new Varien_Object($data);
|
39 |
+
Mage::dispatchEvent('ves_pdfpro_data_prepare_after',array('source'=>$data,'model'=>$address,'type'=>'address'));
|
40 |
+
return $data;
|
41 |
+
}
|
42 |
+
|
43 |
+
/**
|
44 |
+
* Process Source Data
|
45 |
+
* @param Object $sourceData
|
46 |
+
* @param string $currencyCode
|
47 |
+
* @param string $baseCurrencyCode
|
48 |
+
*/
|
49 |
+
public function process($sourceData,$currencyCode,$baseCurrencyCode=null){
|
50 |
+
$baseCurrencyCode = $baseCurrencyCode?$baseCurrencyCode:Mage::app()->getStore()->getBaseCurrency()->getCode();
|
51 |
+
foreach($sourceData as $key=>$value){
|
52 |
+
if(is_object($value)){unset($sourceData[$key]); continue;}
|
53 |
+
if(in_array($key, $this->getPriceAttributes())){
|
54 |
+
if($value) $sourceData[$key] = Mage::helper('pdfpro')->currency($value,$currencyCode);
|
55 |
+
}
|
56 |
+
|
57 |
+
if(in_array($key, $this->getBasePriceAttributes())){
|
58 |
+
if($value) $sourceData[$key] = Mage::helper('pdfpro')->currency($value,$baseCurrencyCode);
|
59 |
+
}
|
60 |
+
}
|
61 |
+
|
62 |
+
return $sourceData;
|
63 |
+
}
|
64 |
+
|
65 |
+
public function getCustomerData(Mage_Customer_Model_Customer $customer){
|
66 |
+
if(!$customer->getId()){return array('customer_is_guest'=>1);}
|
67 |
+
$data = $customer->getData();
|
68 |
+
if(isset($data['dob'])) $data['customer_dob'] = $this->getFormatedDate($data['dob']);
|
69 |
+
if(isset($data['gender'])) $data['gender'] = $this->getOptionById($data['gender'])->getValue();
|
70 |
+
$data = new Varien_Object($data);
|
71 |
+
Mage::dispatchEvent('ves_pdfpro_data_prepare_after',array('source'=>$data,'model'=>$customer,'type'=>'customer'));
|
72 |
+
return $data->getData();
|
73 |
+
}
|
74 |
+
public function getOptionById($optionId){
|
75 |
+
$store = Mage::app()->getStore();
|
76 |
+
$option = Mage::getResourceModel('eav/entity_attribute_option_collection')
|
77 |
+
->setPositionOrder('asc')
|
78 |
+
->addFieldToFilter('main_table.option_id',$optionId)
|
79 |
+
->setStoreFilter()
|
80 |
+
->load()
|
81 |
+
->getFirstItem();
|
82 |
+
return $option;
|
83 |
+
}
|
84 |
+
public function getPriceAttributes(){
|
85 |
+
return array();
|
86 |
+
}
|
87 |
+
|
88 |
+
public function setTranslationByStoreId($storeId){
|
89 |
+
if(!Mage::getStoreConfig('pdfpro/config/detect_language')) return;
|
90 |
+
if($storeId){
|
91 |
+
Mage::app()->getLocale()->emulate($storeId);
|
92 |
+
/*Mage::app()->setCurrentStore($storeId);*/
|
93 |
+
}
|
94 |
+
}
|
95 |
+
|
96 |
+
public function revertTranslation(){
|
97 |
+
if(!Mage::getStoreConfig('pdfpro/config/detect_language')) return;
|
98 |
+
Mage::app()->getLocale()->revert();
|
99 |
+
}
|
100 |
+
}
|
app/code/community/VES/PdfPro/Model/Communication/Method/Abstract.php
ADDED
@@ -0,0 +1,6 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
class VES_PdfPro_Model_Communication_Method_Abstract extends Varien_Object
|
4 |
+
{
|
5 |
+
|
6 |
+
}
|
app/code/community/VES/PdfPro/Model/Communication/Method/Soap.php
ADDED
@@ -0,0 +1,14 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
class VES_PdfPro_Model_Communication_Method_Soap extends VES_PdfPro_Model_Communication_Method_Abstract
|
4 |
+
{
|
5 |
+
public function process($data = array(),$type='invoice',$pdfPro){
|
6 |
+
$client = new PdfProSoapClient($pdfPro->decode(PdfPro::PDF_PRO_WSDL, '5e6bf967aab429405f5855145e6e0fa7'));
|
7 |
+
$client->__setTimeout(1200);
|
8 |
+
$session = $client->login($pdfPro->decode(PdfPro::PDF_PRO_API_USERNAME, '5e6bf967aab429405f5855145e6e0fa7'), $pdfPro->decode(PdfPro::PDF_PRO_API_PASSWORD, '5e6bf967aab429405f5855145e6e0fa7'));
|
9 |
+
$result = $client->call($session, 'pdfpro.getPdf',array($pdfPro->encode(json_encode($data),$pdfPro->getApiKey()),$pdfPro->getApiKey(),$pdfPro->getVersion(),$type,$pdfPro->getHash(),Mage::getStoreConfig('web/unsecure/base_url')));
|
10 |
+
$result['content'] = $pdfPro->decode($result['content'],$pdfPro->getApiKey());
|
11 |
+
$client->endSession($session);
|
12 |
+
return $result;
|
13 |
+
}
|
14 |
+
}
|
app/code/community/VES/PdfPro/Model/Communication/Method/Xmlrpc.php
ADDED
@@ -0,0 +1,14 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
class VES_PdfPro_Model_Communication_Method_Xmlrpc extends Varien_Object
|
4 |
+
{
|
5 |
+
public function process($data = array(),$type='invoice',$pdfPro){
|
6 |
+
$client = new Zend_XmlRpc_Client($pdfPro->decode(PdfPro::PDF_PRO_XMLRPC, '5e6bf967aab429405f5855145e6e0fa7'));
|
7 |
+
$client->getHttpClient()->setConfig(array('timeout'=>1200));
|
8 |
+
$session = $client->call('login', array($pdfPro->decode(PdfPro::PDF_PRO_API_USERNAME, '5e6bf967aab429405f5855145e6e0fa7'), $pdfPro->decode(PdfPro::PDF_PRO_API_PASSWORD, '5e6bf967aab429405f5855145e6e0fa7')));
|
9 |
+
$result = $client->call('call', array($session, 'pdfpro.getPdf', array($pdfPro->encode(json_encode($data),$pdfPro->getApiKey()), $pdfPro->getApiKey(),$pdfPro->getVersion(),$type,$pdfPro->getHash(),Mage::getStoreConfig('web/unsecure/base_url'))));
|
10 |
+
$result['content'] = $pdfPro->decode($result['content'],$pdfPro->getApiKey());
|
11 |
+
$client->call('endSession', array($session));
|
12 |
+
return $result;
|
13 |
+
}
|
14 |
+
}
|
app/code/community/VES/PdfPro/Model/Email/Template.php
ADDED
@@ -0,0 +1,156 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* VES_PdfPro_Model_Email_Template
|
4 |
+
*
|
5 |
+
* @author VnEcoms Team <support@vnecoms.com>
|
6 |
+
* @website http://www.vnecoms.com
|
7 |
+
*/
|
8 |
+
class VES_PdfPro_Model_Email_Template extends Mage_Core_Model_Email_Template
|
9 |
+
{
|
10 |
+
/**
|
11 |
+
* Compatible with Aschroder_SMTPPro
|
12 |
+
*/
|
13 |
+
public function isEnableSmtpPro(){
|
14 |
+
$modules = Mage::getConfig()->getNode('modules')->children();
|
15 |
+
$modulesArray = (array)$modules;
|
16 |
+
if(!isset($modulesArray['Aschroder_SMTPPro'])) return false;
|
17 |
+
|
18 |
+
return $modulesArray['Aschroder_SMTPPro']->is('active') && Mage::helper('smtppro')->isEnabled();
|
19 |
+
}
|
20 |
+
|
21 |
+
/**
|
22 |
+
* Send mail to recipient
|
23 |
+
*
|
24 |
+
* @param array|string $email E-mail(s)
|
25 |
+
* @param array|string|null $name receiver name(s)
|
26 |
+
* @param array $variables template variables
|
27 |
+
* @return boolean
|
28 |
+
**/
|
29 |
+
public function send($email, $name = null, array $variables = array(),$pdf = null)
|
30 |
+
{
|
31 |
+
if (!$this->isValidForSend()) {
|
32 |
+
Mage::logException(new Exception('This letter cannot be sent.')); // translation is intentionally omitted
|
33 |
+
return false;
|
34 |
+
}
|
35 |
+
|
36 |
+
$emails = array_values((array)$email);
|
37 |
+
$names = is_array($name) ? $name : (array)$name;
|
38 |
+
$names = array_values($names);
|
39 |
+
foreach ($emails as $key => $email) {
|
40 |
+
if (!isset($names[$key])) {
|
41 |
+
$names[$key] = substr($email, 0, strpos($email, '@'));
|
42 |
+
}
|
43 |
+
}
|
44 |
+
|
45 |
+
$variables['email'] = reset($emails);
|
46 |
+
$variables['name'] = reset($names);
|
47 |
+
|
48 |
+
$mail = $this->getMail();
|
49 |
+
|
50 |
+
$setReturnPath = Mage::getStoreConfig(self::XML_PATH_SENDING_SET_RETURN_PATH);
|
51 |
+
switch ($setReturnPath) {
|
52 |
+
case 1:
|
53 |
+
$returnPathEmail = $this->getSenderEmail();
|
54 |
+
break;
|
55 |
+
case 2:
|
56 |
+
$returnPathEmail = Mage::getStoreConfig(self::XML_PATH_SENDING_RETURN_PATH_EMAIL);
|
57 |
+
break;
|
58 |
+
default:
|
59 |
+
$returnPathEmail = null;
|
60 |
+
break;
|
61 |
+
}
|
62 |
+
|
63 |
+
if ($returnPathEmail !== null) {
|
64 |
+
$mailTransport = new Zend_Mail_Transport_Sendmail("-f".$returnPathEmail);
|
65 |
+
Zend_Mail::setDefaultTransport($mailTransport);
|
66 |
+
}
|
67 |
+
|
68 |
+
foreach ($emails as $key => $email) {
|
69 |
+
$mail->addTo($email, '=?utf-8?B?' . base64_encode($names[$key]) . '?=');
|
70 |
+
}
|
71 |
+
|
72 |
+
$this->setUseAbsoluteLinks(true);
|
73 |
+
$text = $this->getProcessedTemplate($variables, true);
|
74 |
+
|
75 |
+
if($this->isPlain()) {
|
76 |
+
$mail->setBodyText($text);
|
77 |
+
} else {
|
78 |
+
$mail->setBodyHTML($text);
|
79 |
+
}
|
80 |
+
|
81 |
+
$mail->setSubject('=?utf-8?B?' . base64_encode($this->getProcessedTemplateSubject($variables)) . '?=');
|
82 |
+
$mail->setFrom($this->getSenderEmail(), $this->getSenderName());
|
83 |
+
|
84 |
+
/* Attach the PDF file*/
|
85 |
+
if($pdf && is_array($pdf)){
|
86 |
+
$at = $mail->createAttachment($pdf['content']);
|
87 |
+
|
88 |
+
//set the attachment type as PDF
|
89 |
+
$at->type = 'application/pdf';
|
90 |
+
|
91 |
+
//set the fileame
|
92 |
+
$at->filename = $pdf['filename'];
|
93 |
+
}
|
94 |
+
|
95 |
+
$transport = null;
|
96 |
+
if ($this->isEnableSmtpPro()) {
|
97 |
+
$transport = Mage::helper('smtppro')->getTransport($this->getDesignConfig()->getStore());
|
98 |
+
}
|
99 |
+
try {
|
100 |
+
$mail->send($transport);
|
101 |
+
$this->_mail = null;
|
102 |
+
}
|
103 |
+
catch (Exception $e) {
|
104 |
+
$this->_mail = null;
|
105 |
+
Mage::logException($e);
|
106 |
+
return false;
|
107 |
+
}
|
108 |
+
|
109 |
+
return true;
|
110 |
+
}
|
111 |
+
|
112 |
+
/**
|
113 |
+
* Send transactional email to recipient
|
114 |
+
*
|
115 |
+
* @param int $templateId
|
116 |
+
* @param string|array $sender sneder informatio, can be declared as part of config path
|
117 |
+
* @param string $email recipient email
|
118 |
+
* @param string $name recipient name
|
119 |
+
* @param array $vars varianles which can be used in template
|
120 |
+
* @param int|null $storeId
|
121 |
+
* @param bool $attachPDF
|
122 |
+
* @return Mage_Core_Model_Email_Template
|
123 |
+
*/
|
124 |
+
public function sendTransactional($templateId, $sender, $email, $name, $vars=array(), $storeId=null,$pdf=null)
|
125 |
+
{
|
126 |
+
$this->setSentSuccess(false);
|
127 |
+
if (($storeId === null) && $this->getDesignConfig()->getStore()) {
|
128 |
+
$storeId = $this->getDesignConfig()->getStore();
|
129 |
+
}
|
130 |
+
|
131 |
+
if (is_numeric($templateId)) {
|
132 |
+
$this->load($templateId);
|
133 |
+
} else {
|
134 |
+
$localeCode = Mage::getStoreConfig('general/locale/code', $storeId);
|
135 |
+
$this->loadDefault($templateId, $localeCode);
|
136 |
+
}
|
137 |
+
|
138 |
+
if (!$this->getId()) {
|
139 |
+
throw Mage::exception('Mage_Core', Mage::helper('core')->__('Invalid transactional email code: ' . $templateId));
|
140 |
+
}
|
141 |
+
|
142 |
+
if (!is_array($sender)) {
|
143 |
+
$this->setSenderName(Mage::getStoreConfig('trans_email/ident_' . $sender . '/name', $storeId));
|
144 |
+
$this->setSenderEmail(Mage::getStoreConfig('trans_email/ident_' . $sender . '/email', $storeId));
|
145 |
+
} else {
|
146 |
+
$this->setSenderName($sender['name']);
|
147 |
+
$this->setSenderEmail($sender['email']);
|
148 |
+
}
|
149 |
+
|
150 |
+
if (!isset($vars['store'])) {
|
151 |
+
$vars['store'] = Mage::app()->getStore($storeId);
|
152 |
+
}
|
153 |
+
$this->setSentSuccess($this->send($email, $name, $vars,$pdf));
|
154 |
+
return $this;
|
155 |
+
}
|
156 |
+
}
|
app/code/community/VES/PdfPro/Model/Email/Template/Mailer.php
ADDED
@@ -0,0 +1,38 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* VES_PdfPro_Model_Email_Template_Mailer
|
4 |
+
*
|
5 |
+
* @author VnEcoms Team <support@vnecoms.com>
|
6 |
+
* @website http://www.vnecoms.com
|
7 |
+
*/
|
8 |
+
class VES_PdfPro_Model_Email_Template_Mailer extends Mage_Core_Model_Email_Template_Mailer
|
9 |
+
{
|
10 |
+
/**
|
11 |
+
* Send all emails from email list
|
12 |
+
* @see self::$_emailInfos
|
13 |
+
*
|
14 |
+
* @return Mage_Core_Model_Email_Template_Mailer
|
15 |
+
*/
|
16 |
+
public function send()
|
17 |
+
{
|
18 |
+
$emailTemplate = Mage::getModel('pdfpro/email_template');
|
19 |
+
// Send all emails from corresponding list
|
20 |
+
while (!empty($this->_emailInfos)) {
|
21 |
+
$emailInfo = array_pop($this->_emailInfos);
|
22 |
+
// Handle "Bcc" recepients of the current email
|
23 |
+
$emailTemplate->addBcc($emailInfo->getBccEmails());
|
24 |
+
// Set required design parameters and delegate email sending to Mage_Core_Model_Email_Template
|
25 |
+
$emailTemplate->setDesignConfig(array('area' => 'frontend', 'store' => $this->getStoreId()))
|
26 |
+
->sendTransactional(
|
27 |
+
$this->getTemplateId(),
|
28 |
+
$this->getSender(),
|
29 |
+
$emailInfo->getToEmails(),
|
30 |
+
$emailInfo->getToNames(),
|
31 |
+
$this->getTemplateParams(),
|
32 |
+
$this->getStoreId(),
|
33 |
+
$this->getPdf()
|
34 |
+
);
|
35 |
+
}
|
36 |
+
return $this;
|
37 |
+
}
|
38 |
+
}
|
app/code/community/VES/PdfPro/Model/Key.php
ADDED
@@ -0,0 +1,10 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
class VES_PdfPro_Model_Key extends Mage_Core_Model_Abstract
|
4 |
+
{
|
5 |
+
public function _construct()
|
6 |
+
{
|
7 |
+
parent::_construct();
|
8 |
+
$this->_init('pdfpro/key');
|
9 |
+
}
|
10 |
+
}
|
app/code/community/VES/PdfPro/Model/Mysql4/Key.php
ADDED
@@ -0,0 +1,10 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
class VES_PdfPro_Model_Mysql4_Key extends Mage_Core_Model_Mysql4_Abstract
|
4 |
+
{
|
5 |
+
public function _construct()
|
6 |
+
{
|
7 |
+
// Note that the pickupfromstore_id refers to the key field in your database table.
|
8 |
+
$this->_init('pdfpro/key', 'entity_id');
|
9 |
+
}
|
10 |
+
}
|
app/code/community/VES/PdfPro/Model/Mysql4/Key/Collection.php
ADDED
@@ -0,0 +1,10 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
class VES_PdfPro_Model_Mysql4_Key_Collection extends Mage_Core_Model_Mysql4_Collection_Abstract
|
4 |
+
{
|
5 |
+
public function _construct()
|
6 |
+
{
|
7 |
+
parent::_construct();
|
8 |
+
$this->_init('pdfpro/key');
|
9 |
+
}
|
10 |
+
}
|
app/code/community/VES/PdfPro/Model/Observer.php
ADDED
@@ -0,0 +1,333 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* VES_PdfPro_Model_Observer
|
4 |
+
*
|
5 |
+
* @author VnEcoms Team <support@vnecoms.com>
|
6 |
+
* @website http://www.vnecoms.com
|
7 |
+
*/
|
8 |
+
class VES_PdfPro_Model_Observer
|
9 |
+
{
|
10 |
+
/**
|
11 |
+
* Add new link to Sales Order Massaction
|
12 |
+
* @param Varien_Event_Observer $observer
|
13 |
+
*/
|
14 |
+
public function core_block_abstract_prepare_layout_before(Varien_Event_Observer $observer){
|
15 |
+
if(!Mage::getStoreConfig('pdfpro/config/enabled') || !Mage::helper('pdfpro')->getDefaultApiKey()) return;
|
16 |
+
$block = $observer->getEvent()->getBlock();
|
17 |
+
if($block instanceof Mage_Adminhtml_Block_Widget_Grid_Massaction_Abstract && in_array($block->getRequest()->getControllerName(),array('sales_order','adminhtml_sales_order')))
|
18 |
+
{
|
19 |
+
if(!Mage::getStoreConfig('pdfpro/config/remove_default_print')){
|
20 |
+
if(Mage::getStoreConfig('pdfpro/config/admin_print_order')){
|
21 |
+
$block->addItem('easypdf-print-orders', array(
|
22 |
+
'label'=> 'Easy PDF - '.Mage::helper('pdfpro')->__('Print Orders'),
|
23 |
+
'url' => Mage::getUrl('pdfpro_cp/adminhtml_print/orders'),
|
24 |
+
));
|
25 |
+
}
|
26 |
+
$block->addItem('easypdf-print-invoices', array(
|
27 |
+
'label'=> 'Easy PDF - '.Mage::helper('pdfpro')->__('Print Invoices'),
|
28 |
+
'url' => Mage::getUrl('pdfpro_cp/adminhtml_print/invoices'),
|
29 |
+
));
|
30 |
+
$block->addItem('easypdf-print-shipments', array(
|
31 |
+
'label'=> 'Easy PDF - '.Mage::helper('pdfpro')->__('Print Packingslips'),
|
32 |
+
'url' => Mage::getUrl('pdfpro_cp/adminhtml_print/shipments'),
|
33 |
+
));
|
34 |
+
$block->addItem('easypdf-print-creditmemos', array(
|
35 |
+
'label'=> 'Easy PDF - '.Mage::helper('pdfpro')->__('Print Credit Memos'),
|
36 |
+
'url' => Mage::getUrl('pdfpro_cp/adminhtml_print/creditmemos'),
|
37 |
+
));
|
38 |
+
$block->addItem('easypdf-print-all', array(
|
39 |
+
'label'=> 'Easy PDF - '.Mage::helper('pdfpro')->__('Print All'),
|
40 |
+
'url' => Mage::getUrl('pdfpro_cp/adminhtml_print/all'),
|
41 |
+
));
|
42 |
+
}
|
43 |
+
}else if($block instanceof Mage_Adminhtml_Block_Widget_Grid_Massaction_Abstract && ($block->getRequest()->getControllerName() == 'sales_invoice' || $block->getRequest()->getControllerName() == 'sales_order_invoice')){
|
44 |
+
$block->addItem('easypdf-print-invoices', array(
|
45 |
+
'label'=> 'Easy PDF - '.Mage::helper('pdfpro')->__('Print Invoices'),
|
46 |
+
'url' => Mage::getUrl('pdfpro_cp/adminhtml_print/invoices'),
|
47 |
+
));
|
48 |
+
}else if($block instanceof Mage_Adminhtml_Block_Widget_Grid_Massaction_Abstract && ($block->getRequest()->getControllerName() == 'sales_shipment' || $block->getRequest()->getControllerName() == 'sales_order_shipment')){
|
49 |
+
if(!Mage::getStoreConfig('pdfpro/config/remove_default_print')){
|
50 |
+
$block->addItem('easypdf-print-shipments', array(
|
51 |
+
'label'=> 'Easy PDF - '.Mage::helper('pdfpro')->__('Print Packingslips'),
|
52 |
+
'url' => Mage::getUrl('pdfpro_cp/adminhtml_print/shipments'),
|
53 |
+
));
|
54 |
+
}
|
55 |
+
}else if($block instanceof Mage_Adminhtml_Block_Widget_Grid_Massaction_Abstract && ($block->getRequest()->getControllerName() == 'sales_creditmemo' || $block->getRequest()->getControllerName() == 'sales_order_creditmemo')){
|
56 |
+
$block->addItem('easypdf-print-creditmemos', array(
|
57 |
+
'label'=> 'Easy PDF - '.Mage::helper('pdfpro')->__('Print Credit Memos'),
|
58 |
+
'url' => Mage::getUrl('pdfpro_cp/adminhtml_print/creditmemos'),
|
59 |
+
));
|
60 |
+
}
|
61 |
+
}
|
62 |
+
|
63 |
+
public function core_block_abstract_to_html_before(Varien_Event_Observer $observer){
|
64 |
+
if(!Mage::getStoreConfig('pdfpro/config/enabled') || !Mage::helper('pdfpro')->getDefaultApiKey()) return;
|
65 |
+
$block = $observer->getEvent()->getBlock();
|
66 |
+
if(!Mage::getStoreConfig('pdfpro/config/remove_default_print')) return;
|
67 |
+
if($block instanceof Mage_Adminhtml_Block_Widget_Grid_Massaction_Abstract && in_array($block->getRequest()->getControllerName(),array('sales_order','adminhtml_sales_order'))){
|
68 |
+
$block->removeItem('pdfinvoices_order');
|
69 |
+
$block->removeItem('pdfshipments_order');
|
70 |
+
$block->removeItem('pdfcreditmemos_order');
|
71 |
+
$block->removeItem('pdfdocs_order');
|
72 |
+
$block->removeItem('print_shipping_label');
|
73 |
+
|
74 |
+
if(Mage::getStoreConfig('pdfpro/config/admin_print_order')){
|
75 |
+
|
76 |
+
$block->addItem('easypdf-print-orders', array(
|
77 |
+
'label'=> 'Easy PDF - '.Mage::helper('pdfpro')->__('Print Orders'),
|
78 |
+
'url' => Mage::getUrl('pdfpro_cp/adminhtml_print/orders'),
|
79 |
+
));
|
80 |
+
}
|
81 |
+
$block->addItem('easypdf-print-invoices', array(
|
82 |
+
'label'=> 'Easy PDF - '.Mage::helper('pdfpro')->__('Print Invoices'),
|
83 |
+
'url' => Mage::getUrl('pdfpro_cp/adminhtml_print/invoices'),
|
84 |
+
));
|
85 |
+
$block->addItem('easypdf-print-shipments', array(
|
86 |
+
'label'=> 'Easy PDF - '.Mage::helper('pdfpro')->__('Print Packingslips'),
|
87 |
+
'url' => Mage::getUrl('pdfpro_cp/adminhtml_print/shipments'),
|
88 |
+
));
|
89 |
+
$block->addItem('easypdf-print-creditmemos', array(
|
90 |
+
'label'=> 'Easy PDF - '.Mage::helper('pdfpro')->__('Print Credit Memos'),
|
91 |
+
'url' => Mage::getUrl('pdfpro_cp/adminhtml_print/creditmemos'),
|
92 |
+
));
|
93 |
+
$block->addItem('easypdf-print-all', array(
|
94 |
+
'label'=> 'Easy PDF - '.Mage::helper('pdfpro')->__('Print All'),
|
95 |
+
'url' => Mage::getUrl('pdfpro_cp/adminhtml_print/all'),
|
96 |
+
));
|
97 |
+
$block->addItem('print_shipping_label', array(
|
98 |
+
'label'=> Mage::helper('sales')->__('Print Shipping Labels'),
|
99 |
+
'url' => Mage::getUrl('adminhtml/sales_order_shipment/massPrintShippingLabel'),
|
100 |
+
));
|
101 |
+
if(Mage::getStoreConfig('deleteorder/config/enabled')){
|
102 |
+
$block->removeItem('easypdf-delete-order');
|
103 |
+
$block->addItem('easypdf-delete-order', array(
|
104 |
+
'label'=> 'Easy PDF - '.Mage::helper('deleteorder')->__('Delete Orders'),
|
105 |
+
'url' => Mage::getUrl('deleteorder_cp/adminhtml_index/deleteOrders'),
|
106 |
+
));
|
107 |
+
}
|
108 |
+
if(Mage::helper('pdfpro')->isEnableModule('EM_DeleteOrder')){
|
109 |
+
$block->removeItem('delete_order');
|
110 |
+
$block->addItem('delete_order', array(
|
111 |
+
'label'=> Mage::helper('sales')->__('Delete order'),
|
112 |
+
'url' => Mage::getUrl('*/sales_order/deleteorder'),
|
113 |
+
));
|
114 |
+
}
|
115 |
+
}else if($block instanceof Mage_Adminhtml_Block_Widget_Grid_Massaction_Abstract && ($block->getRequest()->getControllerName() == 'sales_invoice' || $block->getRequest()->getControllerName() == 'sales_order_invoice')){
|
116 |
+
$block->removeItem('pdfinvoices_order');
|
117 |
+
}else if($block instanceof Mage_Adminhtml_Block_Widget_Grid_Massaction_Abstract && ($block->getRequest()->getControllerName() == 'sales_shipment' || $block->getRequest()->getControllerName() == 'sales_order_shipment')){
|
118 |
+
if(Mage::getStoreConfig('pdfpro/config/remove_default_print')){
|
119 |
+
$block->removeItem('pdfshipments_order');
|
120 |
+
$block->addItem('easypdf-print-shipments', array(
|
121 |
+
'label'=> 'Easy PDF - '.Mage::helper('pdfpro')->__('Print Packingslips'),
|
122 |
+
'url' => Mage::getUrl('pdfpro_cp/adminhtml_print/shipments'),
|
123 |
+
));
|
124 |
+
}
|
125 |
+
}else if($block instanceof Mage_Adminhtml_Block_Widget_Grid_Massaction_Abstract && ($block->getRequest()->getControllerName() == 'sales_creditmemo' || $block->getRequest()->getControllerName() == 'sales_order_creditmemo')){
|
126 |
+
$block->removeItem('pdfcreditmemos_order');
|
127 |
+
}
|
128 |
+
}
|
129 |
+
/**
|
130 |
+
* Write version information from server to local file
|
131 |
+
* @param string $versionFile
|
132 |
+
*/
|
133 |
+
protected function _writeVersionFile(){
|
134 |
+
$versionFile = Mage::getBaseDir('media').DS.'ves_pdfpro'.DS.'version.txt';
|
135 |
+
$date = Mage::getModel('core/date')->date('Y-m-d');
|
136 |
+
$serverVersion = Mage::helper('pdfpro')->getServerVersion();
|
137 |
+
try{
|
138 |
+
$fp = fopen($versionFile, 'w');
|
139 |
+
fwrite($fp, base64_encode(json_encode(array('date'=>$date,'version'=>$serverVersion))));
|
140 |
+
fclose($fp);
|
141 |
+
}catch(Exception $e){
|
142 |
+
|
143 |
+
}
|
144 |
+
return $serverVersion;
|
145 |
+
}
|
146 |
+
/**
|
147 |
+
* get Message from server
|
148 |
+
* @param string $versionFile
|
149 |
+
*/
|
150 |
+
protected function _writeServerMessage(){
|
151 |
+
$messageFile = Mage::getBaseDir('media').DS.'ves_pdfpro'.DS.'message.txt';
|
152 |
+
$message = Mage::helper('pdfpro')->getServerMessage();
|
153 |
+
$date = Mage::getModel('core/date')->date('Y-m-d');
|
154 |
+
try{
|
155 |
+
$fp = fopen($messageFile, 'w');
|
156 |
+
fwrite($fp, base64_encode(json_encode(array('date'=>$date,'message'=>$message))));
|
157 |
+
fclose($fp);
|
158 |
+
}catch(Exception $e){
|
159 |
+
|
160 |
+
}
|
161 |
+
return $message;
|
162 |
+
}
|
163 |
+
/**
|
164 |
+
* Get news and notice from easypdfinvoice.com
|
165 |
+
*/
|
166 |
+
public function dailyCheckNotification(){
|
167 |
+
try{
|
168 |
+
$this->_writeVersionFile();
|
169 |
+
$this->_writeServerMessage();
|
170 |
+
}catch (Mage_Core_Exception $e){
|
171 |
+
Mage::log($e->getMessage());
|
172 |
+
}catch(Exception $e){
|
173 |
+
Mage::log($e->getMessage());
|
174 |
+
}
|
175 |
+
}
|
176 |
+
|
177 |
+
public function ves_pdfpro_data_prepare_after($observer){
|
178 |
+
$type = $observer->getType();
|
179 |
+
if(in_array($type, array('order','invoice','shipment','creditmemo'))){
|
180 |
+
$source = $observer->getSource();
|
181 |
+
$model = $observer->getModel();
|
182 |
+
|
183 |
+
$baseGrandTotal = $model->getBaseGrandTotal();
|
184 |
+
$grandTotal = $model->getGrandTotal();
|
185 |
+
$baseTaxAmount = $model->getBaseTaxAmount();
|
186 |
+
$taxAmount = $model->getTaxAmount();
|
187 |
+
|
188 |
+
$baseGrandTotalExclTax = $baseGrandTotal - $baseTaxAmount;
|
189 |
+
$grandTotalExclTax = $grandTotal - $taxAmount;
|
190 |
+
|
191 |
+
$source->setData('base_grand_total_excl_tax',$baseGrandTotalExclTax);
|
192 |
+
$source->setData('grand_total_excl_tax',$grandTotalExclTax);
|
193 |
+
}
|
194 |
+
|
195 |
+
if($type=='item'){
|
196 |
+
$itemData = $observer->getSource();
|
197 |
+
$item = $observer->getModel();
|
198 |
+
if ($item instanceof Mage_Sales_Model_Order_Item) {
|
199 |
+
$order = $item->getOrder();
|
200 |
+
$itemData->setData('giftmessage',Mage::helper('pdfpro/giftmessage')->initMessage($item));
|
201 |
+
} else if ($item instanceof Mage_Sales_Model_Order_Invoice_Item) {
|
202 |
+
$order = $item->getInvoice()->getOrder();
|
203 |
+
} else if ($item instanceof Mage_Sales_Model_Order_Shipment_Item) {
|
204 |
+
$order = $item->getShipment()->getOrder();
|
205 |
+
} else if ($item instanceof Mage_Sales_Model_Order_Creditmemo_Item) {
|
206 |
+
$order = $item->getCreditmemo()->getOrder();
|
207 |
+
}
|
208 |
+
$orderCurrencyCode = $order->getOrderCurrencyCode();
|
209 |
+
$baseCurrencyCode = $order->getBaseCurrencyCode();
|
210 |
+
$itemData->setData('weight',$item->getWeight()*1);
|
211 |
+
$itemData->setData('row_weight',$item->getRowWeight()*1);
|
212 |
+
$itemData->setData('is_virtual',$item->getIsVirtual());
|
213 |
+
$itemData->setData('description',$item->getData('description'));
|
214 |
+
|
215 |
+
if($itemData->getData('price')){
|
216 |
+
$itemData->setData('price_incl_tax',Mage::helper('pdfpro')->currency($item->getData('price_incl_tax'),$orderCurrencyCode));
|
217 |
+
$itemData->setData('price_excl_tax',Mage::helper('pdfpro')->currency($item->getData('price'),$orderCurrencyCode));
|
218 |
+
$itemData->setData('row_total_incl_tax',Mage::helper('pdfpro')->currency($item->getData('row_total_incl_tax'),$orderCurrencyCode));
|
219 |
+
$itemData->setData('row_total_excl_tax',Mage::helper('pdfpro')->currency($item->getData('row_total'),$orderCurrencyCode));
|
220 |
+
$itemData->setData('discount_amount',Mage::helper('pdfpro')->currency($item->getData('discount_amount'),$orderCurrencyCode));
|
221 |
+
$itemData->setData('tax_percent',$item->getData('tax_percent'));
|
222 |
+
$itemData->setData('tax_amount',Mage::helper('pdfpro')->currency($item->getData('tax_amount'),$orderCurrencyCode));
|
223 |
+
$itemData->setData('discount_percent',$item->getData('discount_percent'));
|
224 |
+
|
225 |
+
$itemData->setData('base_cost',Mage::helper('pdfpro')->currency($item->getData('base_cost'),$baseCurrencyCode));
|
226 |
+
$itemData->setData('base_price',Mage::helper('pdfpro')->currency($item->getData('base_price'),$baseCurrencyCode));
|
227 |
+
$itemData->setData('base_original_price',Mage::helper('pdfpro')->currency($item->getData('base_original_price'),$baseCurrencyCode));
|
228 |
+
$itemData->setData('base_tax_amount',Mage::helper('pdfpro')->currency($item->getData('base_tax_amount'),$baseCurrencyCode));
|
229 |
+
$itemData->setData('base_discount_amount',Mage::helper('pdfpro')->currency($item->getData('base_discount_amount'),$baseCurrencyCode));
|
230 |
+
$itemData->setData('base_row_total',Mage::helper('pdfpro')->currency($item->getData('base_row_total'),$baseCurrencyCode));
|
231 |
+
$itemData->setData('base_price_incl_tax',Mage::helper('pdfpro')->currency($item->getData('base_price_incl_tax'),$baseCurrencyCode));
|
232 |
+
$itemData->setData('base_row_total_incl_tax',Mage::helper('pdfpro')->currency($item->getData('base_row_total_incl_tax'),$baseCurrencyCode));
|
233 |
+
$itemData->setData('base_discount_amount',Mage::helper('pdfpro')->currency($item->getData('base_discount_amount'),$baseCurrencyCode));
|
234 |
+
}
|
235 |
+
|
236 |
+
if($item instanceof Mage_Sales_Model_Order_Item){
|
237 |
+
$itemData->setData('qty_backordered',$item->getData('qty_backordered')*1);
|
238 |
+
$itemData->setData('qty_canceled',$item->getData('qty_canceled')*1);
|
239 |
+
$itemData->setData('qty_invoiced',$item->getData('qty_invoiced')*1);
|
240 |
+
$itemData->setData('qty_ordered',$item->getData('qty_ordered')*1);
|
241 |
+
$itemData->setData('qty_refunded',$item->getData('qty_refunded')*1);
|
242 |
+
$itemData->setData('qty_shipped',$item->getData('qty_shipped')*1);
|
243 |
+
}
|
244 |
+
}else if($type == 'order'){
|
245 |
+
$orderData = $observer->getSource();
|
246 |
+
$order = $observer->getModel();
|
247 |
+
|
248 |
+
$this->addOrderComments($order,$orderData);
|
249 |
+
|
250 |
+
$this->addAreaToObj($orderData);
|
251 |
+
}else if($type == 'invoice'){
|
252 |
+
$invoiceData = $observer->getSource();
|
253 |
+
$invoice = $observer->getModel();
|
254 |
+
|
255 |
+
$this->addComments($type,$invoice,$invoiceData);
|
256 |
+
|
257 |
+
$this->addAreaToObj($invoiceData);
|
258 |
+
}else if($type == 'shipment'){
|
259 |
+
$shipmentData = $observer->getSource();
|
260 |
+
$shipment = $observer->getModel();
|
261 |
+
|
262 |
+
$this->addComments($type,$shipment,$shipmentData);
|
263 |
+
|
264 |
+
$this->addAreaToObj($shipmentData);
|
265 |
+
}else if($type == 'creditmemo'){
|
266 |
+
$creditmemoData = $observer->getSource();
|
267 |
+
$creditmemo = $observer->getModel();
|
268 |
+
|
269 |
+
$this->addComments($type,$creditmemo,$creditmemoData);
|
270 |
+
|
271 |
+
$this->addAreaToObj($creditmemoData);
|
272 |
+
}else{
|
273 |
+
//var_dump($observer->getSource()->getCustomer());exit;
|
274 |
+
}
|
275 |
+
}
|
276 |
+
|
277 |
+
/**
|
278 |
+
* Add comment variable for order
|
279 |
+
*/
|
280 |
+
function addOrderComments($order, $orderData){
|
281 |
+
$comments = array();
|
282 |
+
foreach($order->getStatusHistoryCollection(true) as $item){
|
283 |
+
$_item = new Varien_Object($item->getData());
|
284 |
+
$_item->setData('created_date',Mage::helper('core')->formatDate($item->getCreatedAtDate(), 'medium'));
|
285 |
+
$_item->setData('created_time',Mage::helper('core')->formatTime($item->getCreatedAtDate(), 'medium'));
|
286 |
+
$_item->setData('status',$item->getStatusLabel());
|
287 |
+
switch($item->getData('is_customer_notified')){
|
288 |
+
case '0':
|
289 |
+
$_item->setData('customer_notified',Mage::helper('sales')->__('Not Notified'));
|
290 |
+
break;
|
291 |
+
case '1':
|
292 |
+
$_item->setData('customer_notified',Mage::helper('sales')->__('Notified'));
|
293 |
+
break;
|
294 |
+
case '2':
|
295 |
+
$_item->setData('customer_notified',Mage::helper('sales')->__('Notification Not Applicable'));
|
296 |
+
break;
|
297 |
+
}
|
298 |
+
$comments[] = $_item;
|
299 |
+
}
|
300 |
+
$orderData->setData('comments',$comments);
|
301 |
+
}
|
302 |
+
|
303 |
+
/**
|
304 |
+
* Add comment variable for invoice, shipment, creditmemo
|
305 |
+
*/
|
306 |
+
function addComments($type, $model, $source){
|
307 |
+
$comments = array();
|
308 |
+
foreach($model->getCommentsCollection(true) as $comment){
|
309 |
+
$_item = new Varien_Object($comment->getData());
|
310 |
+
$_item->setData('created_date',Mage::helper('core')->formatDate($comment->getCreatedAtDate(), 'medium'));
|
311 |
+
$_item->setData('created_time',Mage::helper('core')->formatTime($comment->getCreatedAtDate(), 'medium'));
|
312 |
+
switch($comment->getData('is_customer_notified')){
|
313 |
+
case '0':
|
314 |
+
$_item->setData('customer_notified',Mage::helper('sales')->__('Not Notified'));
|
315 |
+
break;
|
316 |
+
case '1':
|
317 |
+
$_item->setData('customer_notified',Mage::helper('sales')->__('Notified'));
|
318 |
+
break;
|
319 |
+
case '2':
|
320 |
+
$_item->setData('customer_notified',Mage::helper('sales')->__('Notification Not Applicable'));
|
321 |
+
break;
|
322 |
+
}
|
323 |
+
$comments[] = $_item;
|
324 |
+
}
|
325 |
+
$source->setData('comments',$comments);
|
326 |
+
}
|
327 |
+
/*
|
328 |
+
* Add area variable to objects :order, invoice, shipment, creditmemo
|
329 |
+
*/
|
330 |
+
function addAreaToObj($source){
|
331 |
+
$source->setIsPrintedFromFrontend(Mage::getDesign()->getArea() == 'frontend');
|
332 |
+
}
|
333 |
+
}
|
app/code/community/VES/PdfPro/Model/Order.php
ADDED
@@ -0,0 +1,290 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* VES_PdfPro_Model_Order
|
4 |
+
*
|
5 |
+
* @author VnEcoms Team <support@vnecoms.com>
|
6 |
+
* @website http://www.vnecoms.com
|
7 |
+
*/
|
8 |
+
class VES_PdfPro_Model_Order extends VES_PdfPro_Model_Abstract
|
9 |
+
{
|
10 |
+
protected $_defaultTotalModel = 'pdfpro/sales_order_pdf_total_default';
|
11 |
+
protected $_item_model;
|
12 |
+
|
13 |
+
public function getItemModel($item){
|
14 |
+
return Mage::getModel('pdfpro/order_item')->setItem($item);
|
15 |
+
}
|
16 |
+
|
17 |
+
/**
|
18 |
+
* Sort totals list
|
19 |
+
*
|
20 |
+
* @param array $a
|
21 |
+
* @param array $b
|
22 |
+
* @return int
|
23 |
+
*/
|
24 |
+
protected function _sortTotalsList($a, $b) {
|
25 |
+
if (!isset($a['sort_order']) || !isset($b['sort_order'])) {
|
26 |
+
return 0;
|
27 |
+
}
|
28 |
+
|
29 |
+
if ($a['sort_order'] == $b['sort_order']) {
|
30 |
+
return 0;
|
31 |
+
}
|
32 |
+
|
33 |
+
return ($a['sort_order'] > $b['sort_order']) ? 1 : -1;
|
34 |
+
}
|
35 |
+
/**
|
36 |
+
* Get Total List
|
37 |
+
* @param Mage_Sales_Model_Order_Invoice $source
|
38 |
+
* @return array
|
39 |
+
*/
|
40 |
+
|
41 |
+
protected function _getTotalsList($source)
|
42 |
+
{
|
43 |
+
$totals = Mage::getConfig()->getNode('global/pdf/totals')->asArray();
|
44 |
+
usort($totals, array($this, '_sortTotalsList'));
|
45 |
+
$totalModels = array();
|
46 |
+
foreach ($totals as $index => $totalInfo) {
|
47 |
+
if (!empty($totalInfo['model'])) {
|
48 |
+
$totalModel = Mage::getModel($totalInfo['model']);
|
49 |
+
if ($totalModel instanceof Mage_Sales_Model_Order_Pdf_Total_Default) {
|
50 |
+
$totalInfo['model'] = $totalModel;
|
51 |
+
} else {
|
52 |
+
Mage::throwException(
|
53 |
+
Mage::helper('sales')->__('PDF total model should extend Mage_Sales_Model_Order_Pdf_Total_Default')
|
54 |
+
);
|
55 |
+
}
|
56 |
+
} else {
|
57 |
+
$totalModel = Mage::getModel($this->_defaultTotalModel);
|
58 |
+
}
|
59 |
+
$totalModel->setData($totalInfo);
|
60 |
+
$totalModels[] = $totalModel;
|
61 |
+
}
|
62 |
+
return $totalModels;
|
63 |
+
}
|
64 |
+
|
65 |
+
|
66 |
+
/**
|
67 |
+
* Init invoice data
|
68 |
+
* @param Mage_Sales_Model_Order_Invoice $invoice
|
69 |
+
* @return array
|
70 |
+
*/
|
71 |
+
public function initOrderData($source){
|
72 |
+
$order = $source;
|
73 |
+
$this->setTranslationByStoreId($order->getStoreId());
|
74 |
+
|
75 |
+
$orderCurrencyCode = $order->getOrderCurrencyCode();
|
76 |
+
$baseCurrencyCode = $order->getBaseCurrencyCode();
|
77 |
+
$sourceData = $this->process($source->getData(),$orderCurrencyCode,$baseCurrencyCode);
|
78 |
+
$sourceData['customer'] = $this->getCustomerData(Mage::getModel('customer/customer')->load($order->getCustomerId()));
|
79 |
+
$sourceData['created_at_formated'] = $this->getFormatedDate($source->getCreatedAt());
|
80 |
+
$sourceData['updated_at_formated'] = $this->getFormatedDate($source->getUpdatedAt());
|
81 |
+
/*Init gift message*/
|
82 |
+
$sourceData['giftmessage'] = Mage::helper('pdfpro/giftmessage')->initMessage($order);
|
83 |
+
|
84 |
+
$sourceData['billing'] = $this->getAddressData($source->getBillingAddress());
|
85 |
+
$sourceData['customer_dob'] = isset($sourceData['customer_dob'])?$this->getFormatedDate($sourceData['customer_dob']):'';
|
86 |
+
/*if order is not virtual */
|
87 |
+
if(!$source->getIsVirtual())
|
88 |
+
$sourceData['shipping'] = $this->getAddressData($source->getShippingAddress());
|
89 |
+
/*Get Payment Info */
|
90 |
+
|
91 |
+
Mage::getDesign()->setPackageName('default'); /*Set package to default*/
|
92 |
+
$paymentInfo = Mage::helper('payment')->getInfoBlock($order->getPayment())
|
93 |
+
->setIsSecureMode(true)
|
94 |
+
->setArea('adminhtml')
|
95 |
+
->toPdf();
|
96 |
+
$paymentInfo = str_replace('{{pdf_row_separator}}', "<br />", $paymentInfo);
|
97 |
+
$sourceData['payment'] = array('code'=>$order->getPayment()->getMethodInstance()->getCode(),
|
98 |
+
'name'=>$order->getPayment()->getMethodInstance()->getTitle(),
|
99 |
+
'info'=>$paymentInfo,
|
100 |
+
);
|
101 |
+
$sourceData['payment_info'] = $paymentInfo;
|
102 |
+
$sourceData['totals'] = array();
|
103 |
+
$sourceData['items'] = array();
|
104 |
+
|
105 |
+
/*
|
106 |
+
* Get Items information
|
107 |
+
*/
|
108 |
+
foreach($source->getAllItems() as $item){
|
109 |
+
if ($item->getParentItem()) {
|
110 |
+
continue;
|
111 |
+
}
|
112 |
+
$itemModel = $this->getItemModel($item);
|
113 |
+
if($item->getProductType()=='bundle'){
|
114 |
+
$itemData = array('is_bundle'=>1,'name'=>$item->getName(),'sku'=>$item->getSku());
|
115 |
+
if($itemModel->canShowPriceInfo($item)){
|
116 |
+
$itemData['price'] = Mage::helper('pdfpro')->currency($item->getPrice(),$orderCurrencyCode);
|
117 |
+
$itemData['qty'] = $item->getQtyOrdered() * 1;
|
118 |
+
$itemData['tax'] = Mage::helper('pdfpro')->currency($item->getTaxAmount(),$orderCurrencyCode);
|
119 |
+
$itemData['subtotal'] = Mage::helper('pdfpro')->currency($item->getRowTotal(),$orderCurrencyCode);
|
120 |
+
$itemData['row_total'] = Mage::helper('pdfpro')->currency($item->getRowTotalInclTax(),$orderCurrencyCode);
|
121 |
+
}
|
122 |
+
$items = $itemModel->getChilds($item);
|
123 |
+
$itemData['sub_items'] = array();
|
124 |
+
|
125 |
+
foreach ($items as $_item) {
|
126 |
+
$bundleItem = array();
|
127 |
+
$attributes = $itemModel->getSelectionAttributes($_item);
|
128 |
+
if(!$attributes['option_label']) continue;
|
129 |
+
$bundleItem['label'] = $attributes['option_label'];
|
130 |
+
/*Product name */
|
131 |
+
if ($_item->getParentItem()) {
|
132 |
+
$name = $itemModel->getValueHtml($_item);
|
133 |
+
} else {
|
134 |
+
$name = $_item->getName();
|
135 |
+
}
|
136 |
+
$bundleItem['value'] = $name;
|
137 |
+
$bundleItem['sku'] = $_item->getSku();
|
138 |
+
/* price */
|
139 |
+
if ($itemModel->canShowPriceInfo($_item)) {
|
140 |
+
$price = $order->formatPriceTxt($_item->getPrice());
|
141 |
+
$bundleItem['price'] = Mage::helper('pdfpro')->currency($_item->getPrice(),$orderCurrencyCode);
|
142 |
+
$bundleItem['qty'] = $_item->getQtyOrdered()*1;
|
143 |
+
$bundleItem['tax'] = Mage::helper('pdfpro')->currency($_item->getTaxAmount(),$orderCurrencyCode);
|
144 |
+
$bundleItem['subtotal'] = Mage::helper('pdfpro')->currency($_item->getRowTotal(),$orderCurrencyCode);
|
145 |
+
$bundleItem['row_total']= Mage::helper('pdfpro')->currency($_item->getRowTotalInclTax(),$orderCurrencyCode);
|
146 |
+
}
|
147 |
+
$bundleItem = new Varien_Object($bundleItem);
|
148 |
+
Mage::dispatchEvent('ves_pdfpro_data_prepare_after',array('source'=>$bundleItem,'model'=>$_item,'type'=>'item'));
|
149 |
+
$itemData['sub_items'][] = $bundleItem;
|
150 |
+
}
|
151 |
+
}else{
|
152 |
+
$itemData = array(
|
153 |
+
'name' => $item->getName(),
|
154 |
+
'sku' => $item->getSku(),
|
155 |
+
'price' => Mage::helper('pdfpro')->currency($item->getPrice(),$orderCurrencyCode),
|
156 |
+
'qty' => $item->getQtyOrdered() * 1,
|
157 |
+
'tax' => Mage::helper('pdfpro')->currency($item->getTaxAmount(),$orderCurrencyCode),
|
158 |
+
'subtotal' => Mage::helper('pdfpro')->currency($item->getRowTotal(),$orderCurrencyCode),
|
159 |
+
'row_total' => Mage::helper('pdfpro')->currency($item->getRowTotalInclTax(),$orderCurrencyCode)
|
160 |
+
);
|
161 |
+
$options = $itemModel->getItemOptions($item);
|
162 |
+
$itemData['options'] = array();
|
163 |
+
if ($options) {
|
164 |
+
foreach ($options as $option) {
|
165 |
+
$optionData = array();
|
166 |
+
$optionData['label'] = strip_tags($option['label']);
|
167 |
+
|
168 |
+
if ($option['value']) {
|
169 |
+
$printValue = isset($option['print_value']) ? $option['print_value'] : strip_tags($option['value']);
|
170 |
+
$optionData['value'] = $printValue;
|
171 |
+
}
|
172 |
+
$itemData['options'][] = new Varien_Object($optionData);
|
173 |
+
}
|
174 |
+
}
|
175 |
+
}
|
176 |
+
$itemData = new Varien_Object($itemData);
|
177 |
+
Mage::dispatchEvent('ves_pdfpro_data_prepare_after',array('source'=>$itemData,'model'=>$item,'type'=>'item'));
|
178 |
+
$sourceData['items'][] = $itemData;
|
179 |
+
}
|
180 |
+
/*
|
181 |
+
* Get Totals information.
|
182 |
+
*/
|
183 |
+
$totals = $this->_getTotalsList($source);
|
184 |
+
$totalArr = array();
|
185 |
+
foreach ($totals as $total) {
|
186 |
+
$total->setOrder($order)
|
187 |
+
->setSource($source);
|
188 |
+
if ($total->canDisplay()) {
|
189 |
+
$area = $total->getSourceField()=='grand_total'?'footer':'body';
|
190 |
+
foreach ($total->getTotalsForDisplay() as $totalData) {
|
191 |
+
$totalArr[$area][] = new Varien_Object(array('label'=>$totalData['label'], 'value'=>$totalData['amount']));
|
192 |
+
}
|
193 |
+
}
|
194 |
+
}
|
195 |
+
$sourceData['totals'] = new Varien_Object($totalArr);
|
196 |
+
$apiKey = Mage::helper('pdfpro')->getApiKey($order->getStoreId(),$order->getCustomerGroupId());
|
197 |
+
|
198 |
+
$sourceData = new Varien_Object($sourceData);
|
199 |
+
|
200 |
+
Mage::dispatchEvent('ves_pdfpro_data_prepare_after',array('source'=>$sourceData,'model'=>$order,'type'=>'order'));
|
201 |
+
$orderData = new Varien_Object(array('key'=>$apiKey,'data'=>$sourceData));
|
202 |
+
$this->revertTranslation();
|
203 |
+
return serialize($orderData);
|
204 |
+
}
|
205 |
+
public function getBasePriceAttributes(){
|
206 |
+
return array(
|
207 |
+
'base_discount_amount',
|
208 |
+
'base_discount_canceled',
|
209 |
+
'base_discount_invoiced',
|
210 |
+
'base_discount_refunded',
|
211 |
+
'base_grand_total',
|
212 |
+
'base_shipping_amount',
|
213 |
+
'base_shipping_canceled',
|
214 |
+
'base_shipping_invoiced',
|
215 |
+
'base_shipping_refunded',
|
216 |
+
'base_shipping_tax_amount',
|
217 |
+
'base_shipping_tax_refunded',
|
218 |
+
'base_subtotal',
|
219 |
+
'base_subtotal_canceled',
|
220 |
+
'base_subtotal_invoiced',
|
221 |
+
'base_subtotal_refunded',
|
222 |
+
'base_tax_amount',
|
223 |
+
'base_tax_canceled',
|
224 |
+
'base_tax_invoiced',
|
225 |
+
'base_tax_refunded',
|
226 |
+
'base_to_global_rate',
|
227 |
+
'base_to_order_rate',
|
228 |
+
'base_to_order_rate',
|
229 |
+
'base_total_canceled',
|
230 |
+
'base_total_invoiced',
|
231 |
+
'base_total_invoiced_cost',
|
232 |
+
'base_total_offline_refunded',
|
233 |
+
'base_total_online_refunded',
|
234 |
+
'base_total_paid',
|
235 |
+
'base_total_refunded',
|
236 |
+
'base_adjustment_negative',
|
237 |
+
'base_adjustment_positive',
|
238 |
+
'base_shipping_discount_amount',
|
239 |
+
'base_subtotal_incl_tax',
|
240 |
+
'base_total_due',
|
241 |
+
'base_shipping_hidden_tax_amnt',
|
242 |
+
'base_hidden_tax_invoiced',
|
243 |
+
'base_hidden_tax_refunded',
|
244 |
+
'base_shipping_incl_tax',
|
245 |
+
'base_shipping_hidden_tax_amount',
|
246 |
+
);
|
247 |
+
}
|
248 |
+
/*Get all price attribute */
|
249 |
+
public function getPriceAttributes(){
|
250 |
+
return array(
|
251 |
+
'discount_amount',
|
252 |
+
'discount_canceled',
|
253 |
+
'discount_invoiced',
|
254 |
+
'discount_refunded',
|
255 |
+
'grand_total',
|
256 |
+
'shipping_amount',
|
257 |
+
'shipping_canceled',
|
258 |
+
'shipping_invoiced',
|
259 |
+
'shipping_refunded',
|
260 |
+
'shipping_tax_amount',
|
261 |
+
'shipping_tax_refunded',
|
262 |
+
'store_to_base_rate',
|
263 |
+
'subtotal',
|
264 |
+
'subtotal_canceled',
|
265 |
+
'subtotal_invoiced',
|
266 |
+
'subtotal_refunded',
|
267 |
+
'tax_amount',
|
268 |
+
'tax_canceled',
|
269 |
+
'tax_invoiced',
|
270 |
+
'tax_refunded',
|
271 |
+
'total_canceled',
|
272 |
+
'total_invoiced',
|
273 |
+
'total_offline_refunded',
|
274 |
+
'total_online_refunded',
|
275 |
+
'total_paid',
|
276 |
+
'total_refunded',
|
277 |
+
'adjustment_negative',
|
278 |
+
'adjustment_positive',
|
279 |
+
'payment_authorization_amount',
|
280 |
+
'shipping_discount_amount',
|
281 |
+
'subtotal_incl_tax',
|
282 |
+
'total_due',
|
283 |
+
'hidden_tax_amount',
|
284 |
+
'shipping_hidden_tax_amount',
|
285 |
+
'hidden_tax_invoiced',
|
286 |
+
'hidden_tax_refunded',
|
287 |
+
'shipping_incl_tax',
|
288 |
+
);
|
289 |
+
}
|
290 |
+
}
|
app/code/community/VES/PdfPro/Model/Order/Creditmemo.php
ADDED
@@ -0,0 +1,240 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* VES_PdfPro_Model_Order_Creditmemo
|
4 |
+
*
|
5 |
+
* @author VnEcoms Team <support@vnecoms.com>
|
6 |
+
* @website http://www.vnecoms.com
|
7 |
+
*/
|
8 |
+
class VES_PdfPro_Model_Order_Creditmemo extends VES_PdfPro_Model_Abstract
|
9 |
+
{
|
10 |
+
protected $_defaultTotalModel = 'pdfpro/sales_order_pdf_total_default';
|
11 |
+
protected $_item_model;
|
12 |
+
|
13 |
+
public function getItemModel($item){
|
14 |
+
return Mage::getModel('pdfpro/order_creditmemo_item')->setItem($item);
|
15 |
+
}
|
16 |
+
/**
|
17 |
+
* Sort totals list
|
18 |
+
*
|
19 |
+
* @param array $a
|
20 |
+
* @param array $b
|
21 |
+
* @return int
|
22 |
+
*/
|
23 |
+
protected function _sortTotalsList($a, $b) {
|
24 |
+
if (!isset($a['sort_order']) || !isset($b['sort_order'])) {
|
25 |
+
return 0;
|
26 |
+
}
|
27 |
+
|
28 |
+
if ($a['sort_order'] == $b['sort_order']) {
|
29 |
+
return 0;
|
30 |
+
}
|
31 |
+
|
32 |
+
return ($a['sort_order'] > $b['sort_order']) ? 1 : -1;
|
33 |
+
}
|
34 |
+
/**
|
35 |
+
* Get Total List
|
36 |
+
* @param Mage_Sales_Model_Order_Invoice $source
|
37 |
+
* @return array
|
38 |
+
*/
|
39 |
+
|
40 |
+
protected function _getTotalsList($source)
|
41 |
+
{
|
42 |
+
$totals = Mage::getConfig()->getNode('global/pdf/totals')->asArray();
|
43 |
+
usort($totals, array($this, '_sortTotalsList'));
|
44 |
+
$totalModels = array();
|
45 |
+
foreach ($totals as $index => $totalInfo) {
|
46 |
+
if (!empty($totalInfo['model'])) {
|
47 |
+
$totalModel = Mage::getModel($totalInfo['model']);
|
48 |
+
if ($totalModel instanceof Mage_Sales_Model_Order_Pdf_Total_Default) {
|
49 |
+
$totalInfo['model'] = $totalModel;
|
50 |
+
} else {
|
51 |
+
Mage::throwException(
|
52 |
+
Mage::helper('sales')->__('PDF total model should extend Mage_Sales_Model_Order_Pdf_Total_Default')
|
53 |
+
);
|
54 |
+
}
|
55 |
+
} else {
|
56 |
+
$totalModel = Mage::getModel($this->_defaultTotalModel);
|
57 |
+
}
|
58 |
+
$totalModel->setData($totalInfo);
|
59 |
+
$totalModels[] = $totalModel;
|
60 |
+
}
|
61 |
+
return $totalModels;
|
62 |
+
}
|
63 |
+
|
64 |
+
|
65 |
+
/**
|
66 |
+
* Init invoice data
|
67 |
+
* @param Mage_Sales_Model_Order_Invoice $invoice
|
68 |
+
* @return array
|
69 |
+
*/
|
70 |
+
|
71 |
+
public function initCreditmemoData($creditmemo){
|
72 |
+
$order = $creditmemo->getOrder();
|
73 |
+
$this->setTranslationByStoreId($creditmemo->getStoreId());
|
74 |
+
$orderCurrencyCode = $order->getOrderCurrencyCode();
|
75 |
+
$baseCurrencyCode = $order->getBaseCurrencyCode();
|
76 |
+
$creditmemoData = $this->process($creditmemo->getData(),$orderCurrencyCode,$baseCurrencyCode);
|
77 |
+
$orderData = Mage::getModel('pdfpro/order')->initOrderData($order);
|
78 |
+
$creditmemoData['order'] = unserialize($orderData);
|
79 |
+
$creditmemoData['customer'] = $this->getCustomerData(Mage::getModel('customer/customer')->load($order->getCustomerId()));
|
80 |
+
$creditmemoData['created_at_formated'] = $this->getFormatedDate($creditmemo->getCreatedAt());
|
81 |
+
$creditmemoData['updated_at_formated'] = $this->getFormatedDate($creditmemo->getUpdatedAt());
|
82 |
+
|
83 |
+
$creditmemoData['billing'] = $this->getAddressData($creditmemo->getBillingAddress());
|
84 |
+
/*if order is not virtual */
|
85 |
+
if(!$order->getIsVirtual())
|
86 |
+
$creditmemoData['shipping'] = $this->getAddressData($creditmemo->getShippingAddress());
|
87 |
+
/*Get Payment Info */
|
88 |
+
Mage::getDesign()->setPackageName('default'); /*Set package to default*/
|
89 |
+
$paymentInfo = Mage::helper('payment')->getInfoBlock($order->getPayment())
|
90 |
+
->setIsSecureMode(true)
|
91 |
+
->setArea('adminhtml')
|
92 |
+
->toPdf();
|
93 |
+
$paymentInfo = str_replace('{{pdf_row_separator}}', "<br />", $paymentInfo);
|
94 |
+
$creditmemoData['payment'] = array('code'=>$order->getPayment()->getMethodInstance()->getCode(),
|
95 |
+
'name'=>$order->getPayment()->getMethodInstance()->getTitle(),
|
96 |
+
'info'=>$paymentInfo,
|
97 |
+
);
|
98 |
+
$creditmemoData['payment_info'] = $paymentInfo;
|
99 |
+
$creditmemoData['shipping_description'] = $order->getShippingDescription();
|
100 |
+
|
101 |
+
$creditmemoData['items'] = array();
|
102 |
+
$orderCurrencyCode = $order->getOrderCurrencyCode();
|
103 |
+
/*
|
104 |
+
* Get Items information
|
105 |
+
*/
|
106 |
+
|
107 |
+
foreach($creditmemo->getAllItems() as $item){
|
108 |
+
if ($item->getOrderItem()->getParentItem()) {
|
109 |
+
continue;
|
110 |
+
}
|
111 |
+
$itemModel = $this->getItemModel($item);
|
112 |
+
if($item->getOrderItem()->getProductType()=='bundle'){
|
113 |
+
$itemData = array('is_bundle'=>1,'name'=>$item->getName(),'sku'=>$item->getSku());
|
114 |
+
if($itemModel->canShowPriceInfo($item)){
|
115 |
+
$itemData['price'] = Mage::helper('pdfpro')->currency($item->getPrice(),$orderCurrencyCode);
|
116 |
+
$itemData['qty'] = $item->getQty() * 1;
|
117 |
+
$itemData['tax'] = Mage::helper('pdfpro')->currency($item->getTaxAmount(),$orderCurrencyCode);
|
118 |
+
$itemData['subtotal'] = Mage::helper('pdfpro')->currency($item->getRowTotal(),$orderCurrencyCode);
|
119 |
+
$itemData['row_total'] = Mage::helper('pdfpro')->currency($item->getRowTotalInclTax(),$orderCurrencyCode);
|
120 |
+
}
|
121 |
+
$itemData['sub_items'] = array();
|
122 |
+
$items = $itemModel->getChilds($item);
|
123 |
+
//$items = array_merge(array($item->getOrderItem()), $item->getOrderItem()->getChildrenItems());
|
124 |
+
foreach ($items as $_item) {
|
125 |
+
$bundleItem = array();
|
126 |
+
$attributes = $itemModel->getSelectionAttributes($_item);
|
127 |
+
// draw SKUs
|
128 |
+
if (!$_item->getOrderItem()->getParentItem()) {
|
129 |
+
continue;
|
130 |
+
}
|
131 |
+
$bundleItem['label'] = $attributes['option_label'];
|
132 |
+
/*Product name */
|
133 |
+
if ($_item->getOrderItem()->getParentItem()) {
|
134 |
+
$name = $itemModel->getValueHtml($_item);
|
135 |
+
} else {
|
136 |
+
$name = $_item->getName();
|
137 |
+
}
|
138 |
+
$bundleItem['value'] = $name;
|
139 |
+
$bundleItem['sku'] = $_item->getSku();
|
140 |
+
if ($itemModel->canShowPriceInfo($_item)) {
|
141 |
+
$price = $order->formatPriceTxt($_item->getPrice());
|
142 |
+
$bundleItem['price'] = Mage::helper('pdfpro')->currency($_item->getPrice(),$orderCurrencyCode);
|
143 |
+
$bundleItem['qty'] = $_item->getQty() * 1;
|
144 |
+
$bundleItem['tax'] = Mage::helper('pdfpro')->currency($_item->getTaxAmount(),$orderCurrencyCode);
|
145 |
+
$bundleItem['subtotal'] = Mage::helper('pdfpro')->currency($_item->getRowTotal(),$orderCurrencyCode);
|
146 |
+
$bundleItem['row_total']= Mage::helper('pdfpro')->currency($_item->getRowTotalInclTax(),$orderCurrencyCode);
|
147 |
+
}
|
148 |
+
$bundleItem = new Varien_Object($bundleItem);
|
149 |
+
Mage::dispatchEvent('ves_pdfpro_data_prepare_after',array('source'=>$bundleItem,'model'=>$_item,'type'=>'item'));
|
150 |
+
$itemData['sub_items'][] = $bundleItem;
|
151 |
+
}
|
152 |
+
|
153 |
+
}else{
|
154 |
+
$itemData = array(
|
155 |
+
'name' => $item->getName(),
|
156 |
+
'sku' => $item->getSku(),
|
157 |
+
'price' => Mage::helper('pdfpro')->currency($item->getPrice(),$orderCurrencyCode),
|
158 |
+
'qty' => $item->getQty() * 1,
|
159 |
+
'tax' => Mage::helper('pdfpro')->currency($item->getTaxAmount(),$orderCurrencyCode),
|
160 |
+
'subtotal' => Mage::helper('pdfpro')->currency($item->getRowTotal(),$orderCurrencyCode),
|
161 |
+
'row_total' => Mage::helper('pdfpro')->currency($item->getRowTotalInclTax(),$orderCurrencyCode)
|
162 |
+
);
|
163 |
+
$options = $itemModel->getItemOptions($item);
|
164 |
+
$itemData['options'] = array();
|
165 |
+
if ($options) {
|
166 |
+
foreach ($options as $option) {
|
167 |
+
$optionData = array();
|
168 |
+
$optionData['label'] = strip_tags($option['label']);
|
169 |
+
|
170 |
+
if ($option['value']) {
|
171 |
+
$printValue = isset($option['print_value']) ? $option['print_value'] : strip_tags($option['value']);
|
172 |
+
$optionData['value'] = $printValue;
|
173 |
+
}
|
174 |
+
$itemData['options'][] = new Varien_Object($optionData);
|
175 |
+
}
|
176 |
+
}
|
177 |
+
}
|
178 |
+
$itemData = new Varien_Object($itemData);
|
179 |
+
Mage::dispatchEvent('ves_pdfpro_data_prepare_after',array('source'=>$itemData,'model'=>$item,'type'=>'item'));
|
180 |
+
$creditmemoData['items'][] = $itemData;
|
181 |
+
}
|
182 |
+
/*
|
183 |
+
* Get Totals information.
|
184 |
+
*/
|
185 |
+
$totals = $this->_getTotalsList($creditmemo);
|
186 |
+
$totalArr = array();
|
187 |
+
foreach ($totals as $total) {
|
188 |
+
$total->setOrder($order)
|
189 |
+
->setSource($creditmemo);
|
190 |
+
if ($total->canDisplay()) {
|
191 |
+
$area = $total->getSourceField()=='grand_total'?'footer':'body';
|
192 |
+
foreach ($total->getTotalsForDisplay() as $totalData) {
|
193 |
+
$totalArr[$area][] = new Varien_Object(array('label'=>$totalData['label'], 'value'=>$totalData['amount']));
|
194 |
+
}
|
195 |
+
}
|
196 |
+
}
|
197 |
+
$creditmemoData['totals'] = new Varien_Object($totalArr);
|
198 |
+
$apiKey = Mage::helper('pdfpro')->getApiKey($order->getStoreId(),$order->getCustomerGroupId());
|
199 |
+
|
200 |
+
$creditmemoData = new Varien_Object($creditmemoData);
|
201 |
+
Mage::dispatchEvent('ves_pdfpro_data_prepare_after',array('source'=>$creditmemoData,'model'=>$creditmemo,'type'=>'creditmemo'));
|
202 |
+
$creditmemoData = new Varien_Object(array('key'=>$apiKey,'data'=>$creditmemoData));
|
203 |
+
$this->revertTranslation();
|
204 |
+
return serialize($creditmemoData);
|
205 |
+
}
|
206 |
+
|
207 |
+
public function getBasePriceAttributes(){
|
208 |
+
return array(
|
209 |
+
'base_shipping_tax_amount',
|
210 |
+
'base_discount_amount',
|
211 |
+
'base_adjustment_negative',
|
212 |
+
'base_subtotal_incl_tax',
|
213 |
+
'base_shipping_amount',
|
214 |
+
'base_adjustment',
|
215 |
+
'base_subtotal',
|
216 |
+
'base_grand_total',
|
217 |
+
'base_adjustment_positive',
|
218 |
+
'base_tax_amount',
|
219 |
+
'base_hidden_tax_amount',
|
220 |
+
'base_shipping_incl_tax',
|
221 |
+
);
|
222 |
+
}
|
223 |
+
/*Get all price attribute */
|
224 |
+
public function getPriceAttributes(){
|
225 |
+
return array(
|
226 |
+
'adjustment_positive',
|
227 |
+
'grand_total',
|
228 |
+
'shipping_amount',
|
229 |
+
'subtotal_incl_tax',
|
230 |
+
'adjustment_negative',
|
231 |
+
'discount_amount',
|
232 |
+
'subtotal',
|
233 |
+
'adjustment',
|
234 |
+
'shipping_tax_amount',
|
235 |
+
'tax_amount',
|
236 |
+
'hidden_tax_amount',
|
237 |
+
'shipping_incl_tax',
|
238 |
+
);
|
239 |
+
}
|
240 |
+
}
|
app/code/community/VES/PdfPro/Model/Order/Creditmemo/Item.php
ADDED
@@ -0,0 +1,279 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* VES_PdfPro_Model_Order_Creditmemo_Item
|
4 |
+
*
|
5 |
+
* @author VnEcoms Team <support@vnecoms.com>
|
6 |
+
* @website http://www.vnecoms.com
|
7 |
+
*/
|
8 |
+
class VES_PdfPro_Model_Order_Creditmemo_Item extends Varien_Object
|
9 |
+
{
|
10 |
+
/**
|
11 |
+
* Get Options of items
|
12 |
+
* @param Mage_Sales_Model_Order_Invoice_Item $item
|
13 |
+
* @return array:
|
14 |
+
*/
|
15 |
+
public function getItemOptions($item) {
|
16 |
+
$result = array();
|
17 |
+
if (!($item instanceof Mage_Sales_Model_Order_Item)) {
|
18 |
+
$item = $item->getOrderItem();
|
19 |
+
}
|
20 |
+
|
21 |
+
if ($options = $item->getProductOptions()) {
|
22 |
+
if (isset($options['options'])) {
|
23 |
+
$result = array_merge($result, $options['options']);
|
24 |
+
}
|
25 |
+
if (isset($options['additional_options'])) {
|
26 |
+
$result = array_merge($result, $options['additional_options']);
|
27 |
+
}
|
28 |
+
if (isset($options['attributes_info'])) {
|
29 |
+
$result = array_merge($result, $options['attributes_info']);
|
30 |
+
}
|
31 |
+
}
|
32 |
+
return $result;
|
33 |
+
}
|
34 |
+
|
35 |
+
/**
|
36 |
+
* Getting all available childs for Invoice, Shipmen or Creditmemo item
|
37 |
+
*
|
38 |
+
* @param Varien_Object $item
|
39 |
+
* @return array
|
40 |
+
*/
|
41 |
+
public function getChilds($item)
|
42 |
+
{
|
43 |
+
$_itemsArray = array();
|
44 |
+
|
45 |
+
if ($item instanceof Mage_Sales_Model_Order_Invoice_Item) {
|
46 |
+
$_items = $item->getInvoice()->getAllItems();
|
47 |
+
} else if ($item instanceof Mage_Sales_Model_Order_Shipment_Item) {
|
48 |
+
$_items = $item->getShipment()->getAllItems();
|
49 |
+
} else if ($item instanceof Mage_Sales_Model_Order_Creditmemo_Item) {
|
50 |
+
$_items = $item->getCreditmemo()->getAllItems();
|
51 |
+
}
|
52 |
+
|
53 |
+
if ($_items) {
|
54 |
+
foreach ($_items as $_item) {
|
55 |
+
$parentItem = $_item->getOrderItem()->getParentItem();
|
56 |
+
if ($parentItem) {
|
57 |
+
$_itemsArray[$parentItem->getId()][$_item->getOrderItemId()] = $_item;
|
58 |
+
} else {
|
59 |
+
$_itemsArray[$_item->getOrderItem()->getId()][$_item->getOrderItemId()] = $_item;
|
60 |
+
}
|
61 |
+
}
|
62 |
+
}
|
63 |
+
if (isset($_itemsArray[$item->getOrderItem()->getId()])) {
|
64 |
+
return $_itemsArray[$item->getOrderItem()->getId()];
|
65 |
+
} else {
|
66 |
+
return null;
|
67 |
+
}
|
68 |
+
}
|
69 |
+
|
70 |
+
/**
|
71 |
+
* Retrieve is Shipment Separately flag for Item
|
72 |
+
*
|
73 |
+
* @param Varien_Object $item
|
74 |
+
* @return bool
|
75 |
+
*/
|
76 |
+
public function isShipmentSeparately($item = null)
|
77 |
+
{
|
78 |
+
if ($item) {
|
79 |
+
if ($item->getOrderItem()) {
|
80 |
+
$item = $item->getOrderItem();
|
81 |
+
}
|
82 |
+
|
83 |
+
$parentItem = $item->getParentItem();
|
84 |
+
if ($parentItem) {
|
85 |
+
$options = $parentItem->getProductOptions();
|
86 |
+
if ($options) {
|
87 |
+
if (isset($options['shipment_type'])
|
88 |
+
&& $options['shipment_type'] == Mage_Catalog_Model_Product_Type_Abstract::SHIPMENT_SEPARATELY) {
|
89 |
+
return true;
|
90 |
+
} else {
|
91 |
+
return false;
|
92 |
+
}
|
93 |
+
}
|
94 |
+
} else {
|
95 |
+
$options = $item->getProductOptions();
|
96 |
+
if ($options) {
|
97 |
+
if (isset($options['shipment_type'])
|
98 |
+
&& $options['shipment_type'] == Mage_Catalog_Model_Product_Type_Abstract::SHIPMENT_SEPARATELY) {
|
99 |
+
return false;
|
100 |
+
} else {
|
101 |
+
return true;
|
102 |
+
}
|
103 |
+
}
|
104 |
+
}
|
105 |
+
}
|
106 |
+
|
107 |
+
$options = $this->getOrderItem()->getProductOptions();
|
108 |
+
if ($options) {
|
109 |
+
if (isset($options['shipment_type'])
|
110 |
+
&& $options['shipment_type'] == Mage_Catalog_Model_Product_Type_Abstract::SHIPMENT_SEPARATELY) {
|
111 |
+
return true;
|
112 |
+
}
|
113 |
+
}
|
114 |
+
return false;
|
115 |
+
}
|
116 |
+
|
117 |
+
/**
|
118 |
+
* Retrieve is Child Calculated
|
119 |
+
*
|
120 |
+
* @param Varien_Object $item
|
121 |
+
* @return bool
|
122 |
+
*/
|
123 |
+
public function isChildCalculated($item = null)
|
124 |
+
{
|
125 |
+
if ($item) {
|
126 |
+
if ($item->getOrderItem()) {
|
127 |
+
$item = $item->getOrderItem();
|
128 |
+
}
|
129 |
+
|
130 |
+
$parentItem = $item->getParentItem();
|
131 |
+
if ($parentItem) {
|
132 |
+
$options = $parentItem->getProductOptions();
|
133 |
+
if ($options) {
|
134 |
+
if (isset($options['product_calculations']) &&
|
135 |
+
$options['product_calculations'] == Mage_Catalog_Model_Product_Type_Abstract::CALCULATE_CHILD
|
136 |
+
) {
|
137 |
+
return true;
|
138 |
+
} else {
|
139 |
+
return false;
|
140 |
+
}
|
141 |
+
}
|
142 |
+
} else {
|
143 |
+
$options = $item->getProductOptions();
|
144 |
+
if ($options) {
|
145 |
+
if (isset($options['product_calculations']) &&
|
146 |
+
$options['product_calculations'] == Mage_Catalog_Model_Product_Type_Abstract::CALCULATE_CHILD
|
147 |
+
) {
|
148 |
+
return false;
|
149 |
+
} else {
|
150 |
+
return true;
|
151 |
+
}
|
152 |
+
}
|
153 |
+
}
|
154 |
+
}
|
155 |
+
|
156 |
+
$options = $this->getOrderItem()->getProductOptions();
|
157 |
+
if ($options) {
|
158 |
+
if (isset($options['product_calculations'])
|
159 |
+
&& $options['product_calculations'] == Mage_Catalog_Model_Product_Type_Abstract::CALCULATE_CHILD) {
|
160 |
+
return true;
|
161 |
+
}
|
162 |
+
}
|
163 |
+
return false;
|
164 |
+
}
|
165 |
+
|
166 |
+
/**
|
167 |
+
* Retrieve Bundle Options
|
168 |
+
*
|
169 |
+
* @param Varien_Object $item
|
170 |
+
* @return array
|
171 |
+
*/
|
172 |
+
public function getBundleOptions($item = null)
|
173 |
+
{
|
174 |
+
$options = $this->getOrderItem()->getProductOptions();
|
175 |
+
if ($options) {
|
176 |
+
if (isset($options['bundle_options'])) {
|
177 |
+
return $options['bundle_options'];
|
178 |
+
}
|
179 |
+
}
|
180 |
+
return array();
|
181 |
+
}
|
182 |
+
|
183 |
+
/**
|
184 |
+
* Retrieve Selection attributes
|
185 |
+
*
|
186 |
+
* @param Varien_Object $item
|
187 |
+
* @return mixed
|
188 |
+
*/
|
189 |
+
public function getSelectionAttributes($item)
|
190 |
+
{
|
191 |
+
if ($item instanceof Mage_Sales_Model_Order_Item) {
|
192 |
+
$options = $item->getProductOptions();
|
193 |
+
} else {
|
194 |
+
$options = $item->getOrderItem()->getProductOptions();
|
195 |
+
}
|
196 |
+
if (isset($options['bundle_selection_attributes'])) {
|
197 |
+
return unserialize($options['bundle_selection_attributes']);
|
198 |
+
}
|
199 |
+
return null;
|
200 |
+
}
|
201 |
+
|
202 |
+
/**
|
203 |
+
* Retrieve Order options
|
204 |
+
*
|
205 |
+
* @param Varien_Object $item
|
206 |
+
* @return array
|
207 |
+
*/
|
208 |
+
public function getOrderOptions($item = null)
|
209 |
+
{
|
210 |
+
$result = array();
|
211 |
+
|
212 |
+
$options = $this->getOrderItem()->getProductOptions();
|
213 |
+
if ($options) {
|
214 |
+
if (isset($options['options'])) {
|
215 |
+
$result = array_merge($result, $options['options']);
|
216 |
+
}
|
217 |
+
if (isset($options['additional_options'])) {
|
218 |
+
$result = array_merge($result, $options['additional_options']);
|
219 |
+
}
|
220 |
+
if (!empty($options['attributes_info'])) {
|
221 |
+
$result = array_merge($options['attributes_info'], $result);
|
222 |
+
}
|
223 |
+
}
|
224 |
+
return $result;
|
225 |
+
}
|
226 |
+
|
227 |
+
/**
|
228 |
+
* Retrieve Order Item
|
229 |
+
*
|
230 |
+
* @return Mage_Sales_Order_Item
|
231 |
+
*/
|
232 |
+
public function getOrderItem()
|
233 |
+
{
|
234 |
+
if ($this->getItem() instanceof Mage_Sales_Model_Order_Item) {
|
235 |
+
return $this->getItem();
|
236 |
+
} else {
|
237 |
+
return $this->getItem()->getOrderItem();
|
238 |
+
}
|
239 |
+
}
|
240 |
+
|
241 |
+
/**
|
242 |
+
* Retrieve Value HTML
|
243 |
+
*
|
244 |
+
* @param Mage_Sales_Order_Item $item
|
245 |
+
* @return string
|
246 |
+
*/
|
247 |
+
public function getValueHtml($item)
|
248 |
+
{
|
249 |
+
$result = strip_tags($item->getName());
|
250 |
+
if (!$this->isShipmentSeparately($item)) {
|
251 |
+
$attributes = $this->getSelectionAttributes($item);
|
252 |
+
if ($attributes) {
|
253 |
+
$result = sprintf('%d', $attributes['qty']) . ' x ' . $result;
|
254 |
+
}
|
255 |
+
}
|
256 |
+
if (!$this->isChildCalculated($item)) {
|
257 |
+
$attributes = $this->getSelectionAttributes($item);
|
258 |
+
if ($attributes) {
|
259 |
+
$result .= " " . strip_tags($this->getOrderItem()->getOrder()->formatPrice($attributes['price']));
|
260 |
+
}
|
261 |
+
}
|
262 |
+
return $result;
|
263 |
+
}
|
264 |
+
|
265 |
+
/**
|
266 |
+
* Can show price info for item
|
267 |
+
*
|
268 |
+
* @param Mage_Sales_Order_Item $item
|
269 |
+
* @return bool
|
270 |
+
*/
|
271 |
+
public function canShowPriceInfo($item)
|
272 |
+
{
|
273 |
+
if (($item->getOrderItem()->getParentItem() && $this->isChildCalculated())
|
274 |
+
|| (!$item->getOrderItem()->getParentItem() && !$this->isChildCalculated())) {
|
275 |
+
return true;
|
276 |
+
}
|
277 |
+
return false;
|
278 |
+
}
|
279 |
+
}
|
app/code/community/VES/PdfPro/Model/Order/Invoice.php
ADDED
@@ -0,0 +1,239 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* VES_PdfPro_Model_Order_Invoice
|
4 |
+
*
|
5 |
+
* @author VnEcoms Team <support@vnecoms.com>
|
6 |
+
* @website http://www.vnecoms.com
|
7 |
+
*/
|
8 |
+
class VES_PdfPro_Model_Order_Invoice extends VES_PdfPro_Model_Abstract
|
9 |
+
{
|
10 |
+
protected $_defaultTotalModel = 'pdfpro/sales_order_pdf_total_default';
|
11 |
+
protected $_item_model;
|
12 |
+
|
13 |
+
public function getItemModel($item){
|
14 |
+
return Mage::getModel('pdfpro/order_invoice_item')->setItem($item);
|
15 |
+
}
|
16 |
+
|
17 |
+
/**
|
18 |
+
* Sort totals list
|
19 |
+
*
|
20 |
+
* @param array $a
|
21 |
+
* @param array $b
|
22 |
+
* @return int
|
23 |
+
*/
|
24 |
+
protected function _sortTotalsList($a, $b) {
|
25 |
+
if (!isset($a['sort_order']) || !isset($b['sort_order'])) {
|
26 |
+
return 0;
|
27 |
+
}
|
28 |
+
|
29 |
+
if ($a['sort_order'] == $b['sort_order']) {
|
30 |
+
return 0;
|
31 |
+
}
|
32 |
+
|
33 |
+
return ($a['sort_order'] > $b['sort_order']) ? 1 : -1;
|
34 |
+
}
|
35 |
+
/**
|
36 |
+
* Get Total List
|
37 |
+
* @param Mage_Sales_Model_Order_Invoice $source
|
38 |
+
* @return array
|
39 |
+
*/
|
40 |
+
|
41 |
+
protected function _getTotalsList($source)
|
42 |
+
{
|
43 |
+
$totals = Mage::getConfig()->getNode('global/pdf/totals')->asArray();
|
44 |
+
usort($totals, array($this, '_sortTotalsList'));
|
45 |
+
$totalModels = array();
|
46 |
+
foreach ($totals as $index => $totalInfo) {
|
47 |
+
if (!empty($totalInfo['model'])) {
|
48 |
+
$totalModel = Mage::getModel($totalInfo['model']);
|
49 |
+
if ($totalModel instanceof Mage_Sales_Model_Order_Pdf_Total_Default) {
|
50 |
+
$totalInfo['model'] = $totalModel;
|
51 |
+
} else {
|
52 |
+
Mage::throwException(
|
53 |
+
Mage::helper('sales')->__('PDF total model should extend Mage_Sales_Model_Order_Pdf_Total_Default')
|
54 |
+
);
|
55 |
+
}
|
56 |
+
} else {
|
57 |
+
$totalModel = Mage::getModel($this->_defaultTotalModel);
|
58 |
+
}
|
59 |
+
$totalModel->setData($totalInfo);
|
60 |
+
$totalModels[] = $totalModel;
|
61 |
+
}
|
62 |
+
return $totalModels;
|
63 |
+
}
|
64 |
+
|
65 |
+
/**
|
66 |
+
* Init invoice data
|
67 |
+
* @param Mage_Sales_Model_Order_Invoice $invoice
|
68 |
+
* @return array
|
69 |
+
*/
|
70 |
+
|
71 |
+
public function initInvoiceData($invoice){
|
72 |
+
$order = $invoice->getOrder();
|
73 |
+
$orderCurrencyCode = $order->getOrderCurrencyCode();
|
74 |
+
$baseCurrencyCode = $order->getBaseCurrencyCode();
|
75 |
+
|
76 |
+
$this->setTranslationByStoreId($invoice->getStoreId());
|
77 |
+
$invoiceData = $this->process($invoice->getData(),$orderCurrencyCode,$baseCurrencyCode);
|
78 |
+
$orderData = Mage::getModel('pdfpro/order')->initOrderData($order);
|
79 |
+
|
80 |
+
$invoiceData['order'] = unserialize($orderData);
|
81 |
+
$invoiceData['customer']= $this->getCustomerData(Mage::getModel('customer/customer')->load($order->getCustomerId()));
|
82 |
+
$invoiceData['created_at_formated'] = $this->getFormatedDate($invoice->getCreatedAt());
|
83 |
+
$invoiceData['updated_at_formated'] = $this->getFormatedDate($invoice->getUpdatedAt());
|
84 |
+
$invoiceData['billing'] = $this->getAddressData($invoice->getBillingAddress());
|
85 |
+
|
86 |
+
/*if order is not virtual */
|
87 |
+
if(!$order->getIsVirtual())
|
88 |
+
$invoiceData['shipping'] = $this->getAddressData($invoice->getShippingAddress());
|
89 |
+
/*Get Payment Info */
|
90 |
+
Mage::getDesign()->setPackageName('default'); /*Set package to default*/
|
91 |
+
$paymentInfo = Mage::helper('payment')->getInfoBlock($order->getPayment())
|
92 |
+
->setIsSecureMode(true)
|
93 |
+
->setArea('adminhtml')
|
94 |
+
->toPdf();
|
95 |
+
$paymentInfo = str_replace('{{pdf_row_separator}}', "<br />", $paymentInfo);
|
96 |
+
$invoiceData['payment'] = array('code'=>$order->getPayment()->getMethodInstance()->getCode(),
|
97 |
+
'name'=>$order->getPayment()->getMethodInstance()->getTitle(),
|
98 |
+
'info'=>$paymentInfo,
|
99 |
+
);
|
100 |
+
$invoiceData['payment_info'] = $paymentInfo;
|
101 |
+
|
102 |
+
$invoiceData['shipping_description'] = $order->getShippingDescription();
|
103 |
+
|
104 |
+
$invoiceData['totals'] = array();
|
105 |
+
$invoiceData['items'] = array();
|
106 |
+
/*
|
107 |
+
* Get Items information
|
108 |
+
*/
|
109 |
+
foreach($invoice->getAllItems() as $item){
|
110 |
+
if ($item->getOrderItem()->getParentItem()) {
|
111 |
+
continue;
|
112 |
+
}
|
113 |
+
$itemModel = $this->getItemModel($item);
|
114 |
+
if($item->getOrderItem()->getProductType()=='bundle'){
|
115 |
+
$itemData = array('is_bundle'=>1,'name'=>$item->getName(),'sku'=>$item->getSku());
|
116 |
+
if($itemModel->canShowPriceInfo($item)){
|
117 |
+
$itemData['price'] = Mage::helper('pdfpro')->currency($item->getPrice(),$orderCurrencyCode);
|
118 |
+
$itemData['qty'] = $item->getQty() * 1;
|
119 |
+
$itemData['tax'] = Mage::helper('pdfpro')->currency($item->getTaxAmount(),$orderCurrencyCode);
|
120 |
+
$itemData['subtotal'] = Mage::helper('pdfpro')->currency($item->getRowTotal(),$orderCurrencyCode);
|
121 |
+
$itemData['row_total'] = Mage::helper('pdfpro')->currency($item->getRowTotalInclTax(),$orderCurrencyCode);
|
122 |
+
}
|
123 |
+
$itemData['sub_items'] = array();
|
124 |
+
$items = $itemModel->getChilds($item);
|
125 |
+
foreach ($items as $_item) {
|
126 |
+
$bundleItem = array();
|
127 |
+
$attributes = $itemModel->getSelectionAttributes($_item);
|
128 |
+
// draw SKUs
|
129 |
+
if (!$_item->getOrderItem()->getParentItem()) {
|
130 |
+
continue;
|
131 |
+
}
|
132 |
+
$bundleItem['label'] = $attributes['option_label'];
|
133 |
+
/*Product name */
|
134 |
+
if ($_item->getOrderItem()->getParentItem()) {
|
135 |
+
$name = $itemModel->getValueHtml($_item);
|
136 |
+
} else {
|
137 |
+
$name = $_item->getName();
|
138 |
+
}
|
139 |
+
$bundleItem['value'] = $name;
|
140 |
+
/*$bundleItem['sku'] = $_item->getSku();*/
|
141 |
+
/* price */
|
142 |
+
if ($itemModel->canShowPriceInfo($_item)) {
|
143 |
+
$price = $order->formatPriceTxt($_item->getPrice());
|
144 |
+
$bundleItem['price'] = Mage::helper('pdfpro')->currency($_item->getPrice(),$orderCurrencyCode);
|
145 |
+
$bundleItem['qty'] = $_item->getQty() * 1;
|
146 |
+
$bundleItem['tax'] = Mage::helper('pdfpro')->currency($_item->getTaxAmount(),$orderCurrencyCode);
|
147 |
+
$bundleItem['subtotal'] = Mage::helper('pdfpro')->currency($_item->getRowTotal(),$orderCurrencyCode);
|
148 |
+
$bundleItem['row_total']= Mage::helper('pdfpro')->currency($_item->getRowTotalInclTax(),$orderCurrencyCode);
|
149 |
+
}
|
150 |
+
$bundleItem = new Varien_Object($bundleItem);
|
151 |
+
Mage::dispatchEvent('ves_pdfpro_data_prepare_after',array('source'=>$bundleItem,'model'=>$_item,'type'=>'item'));
|
152 |
+
$itemData['sub_items'][] = $bundleItem;
|
153 |
+
}
|
154 |
+
}else{
|
155 |
+
$itemData = array(
|
156 |
+
'name' => $item->getName(),
|
157 |
+
'sku' => $item->getSku(),
|
158 |
+
'price' => Mage::helper('pdfpro')->currency($item->getPrice(),$orderCurrencyCode),
|
159 |
+
'qty' => $item->getQty() * 1,
|
160 |
+
'tax' => Mage::helper('pdfpro')->currency($item->getTaxAmount(),$orderCurrencyCode),
|
161 |
+
'subtotal' => Mage::helper('pdfpro')->currency($item->getRowTotal(),$orderCurrencyCode),
|
162 |
+
'row_total' => Mage::helper('pdfpro')->currency($item->getRowTotalInclTax(),$orderCurrencyCode)
|
163 |
+
);
|
164 |
+
$options = $itemModel->getItemOptions($item);
|
165 |
+
$itemData['options'] = array();
|
166 |
+
if ($options) {
|
167 |
+
foreach ($options as $option) {
|
168 |
+
$optionData = array();
|
169 |
+
$optionData['label'] = strip_tags($option['label']);
|
170 |
+
|
171 |
+
if ($option['value']) {
|
172 |
+
$printValue = isset($option['print_value']) ? $option['print_value'] : strip_tags($option['value']);
|
173 |
+
$optionData['value'] = $printValue;
|
174 |
+
}
|
175 |
+
$itemData['options'][] = new Varien_Object($optionData);
|
176 |
+
}
|
177 |
+
}
|
178 |
+
}
|
179 |
+
$itemData = new Varien_Object($itemData);
|
180 |
+
Mage::dispatchEvent('ves_pdfpro_data_prepare_after',array('source'=>$itemData,'model'=>$item,'type'=>'item'));
|
181 |
+
$invoiceData['items'][] = $itemData;
|
182 |
+
}
|
183 |
+
|
184 |
+
/*
|
185 |
+
* Get Totals information.
|
186 |
+
*/
|
187 |
+
$totals = $this->_getTotalsList($invoice);
|
188 |
+
$totalArr = array();
|
189 |
+
foreach ($totals as $total) {
|
190 |
+
$total->setOrder($order)
|
191 |
+
->setSource($invoice);
|
192 |
+
if ($total->canDisplay()) {
|
193 |
+
$area = $total->getSourceField()=='grand_total'?'footer':'body';
|
194 |
+
foreach ($total->getTotalsForDisplay() as $totalData) {
|
195 |
+
$totalArr[$area][] = new Varien_Object(array('label'=>$totalData['label'], 'value'=>$totalData['amount']));
|
196 |
+
}
|
197 |
+
}
|
198 |
+
}
|
199 |
+
$invoiceData['totals'] = new Varien_Object($totalArr);
|
200 |
+
$apiKey = Mage::helper('pdfpro')->getApiKey($order->getStoreId(),$order->getCustomerGroupId());
|
201 |
+
|
202 |
+
$invoiceData = new Varien_Object($invoiceData);
|
203 |
+
Mage::dispatchEvent('ves_pdfpro_data_prepare_after',array('source'=>$invoiceData,'model'=>$invoice,'type'=>'invoice'));
|
204 |
+
$invoiceData = new Varien_Object(array('key'=>$apiKey,'data'=>$invoiceData));
|
205 |
+
$this->revertTranslation();
|
206 |
+
return serialize($invoiceData);
|
207 |
+
}
|
208 |
+
|
209 |
+
public function getBasePriceAttributes(){
|
210 |
+
return array(
|
211 |
+
'base_grand_total',
|
212 |
+
'base_tax_amount',
|
213 |
+
'base_shipping_tax_amount',
|
214 |
+
'base_discount_amount',
|
215 |
+
'base_subtotal_incl_tax',
|
216 |
+
'base_shipping_amount',
|
217 |
+
'base_subtotal',
|
218 |
+
'base_hidden_tax_amount',
|
219 |
+
'base_shipping_hidden_tax_amnt',
|
220 |
+
'base_shipping_incl_tax',
|
221 |
+
'base_total_refunded',
|
222 |
+
);
|
223 |
+
}
|
224 |
+
|
225 |
+
public function getPriceAttributes(){
|
226 |
+
return array(
|
227 |
+
'shipping_tax_amount',
|
228 |
+
'tax_amount',
|
229 |
+
'grand_total',
|
230 |
+
'shipping_amount',
|
231 |
+
'subtotal_incl_tax',
|
232 |
+
'subtotal',
|
233 |
+
'discount_amount',
|
234 |
+
'hidden_tax_amount',
|
235 |
+
'shipping_hidden_tax_amount',
|
236 |
+
'shipping_incl_tax',
|
237 |
+
);
|
238 |
+
}
|
239 |
+
}
|
app/code/community/VES/PdfPro/Model/Order/Invoice/Item.php
ADDED
@@ -0,0 +1,280 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* VES_PdfPro_Model_Order_Invoice_Item
|
4 |
+
*
|
5 |
+
* @author VnEcoms Team <support@vnecoms.com>
|
6 |
+
* @website http://www.vnecoms.com
|
7 |
+
*/
|
8 |
+
class VES_PdfPro_Model_Order_Invoice_Item extends Varien_Object
|
9 |
+
{
|
10 |
+
/**
|
11 |
+
* Get Options of items
|
12 |
+
* @param Mage_Sales_Model_Order_Invoice_Item $item
|
13 |
+
* @return array:
|
14 |
+
*/
|
15 |
+
public function getItemOptions($item) {
|
16 |
+
$result = array();
|
17 |
+
if (!($item instanceof Mage_Sales_Model_Order_Item)) {
|
18 |
+
$item = $item->getOrderItem();
|
19 |
+
}
|
20 |
+
|
21 |
+
if ($options = $item->getProductOptions()) {
|
22 |
+
if (isset($options['options'])) {
|
23 |
+
$result = array_merge($result, $options['options']);
|
24 |
+
}
|
25 |
+
if (isset($options['additional_options'])) {
|
26 |
+
$result = array_merge($result, $options['additional_options']);
|
27 |
+
}
|
28 |
+
if (isset($options['attributes_info'])) {
|
29 |
+
$result = array_merge($result, $options['attributes_info']);
|
30 |
+
}
|
31 |
+
}
|
32 |
+
return $result;
|
33 |
+
}
|
34 |
+
|
35 |
+
/**
|
36 |
+
* Getting all available childs for Invoice, Shipmen or Creditmemo item
|
37 |
+
*
|
38 |
+
* @param Varien_Object $item
|
39 |
+
* @return array
|
40 |
+
*/
|
41 |
+
public function getChilds($item)
|
42 |
+
{
|
43 |
+
$_itemsArray = array();
|
44 |
+
|
45 |
+
if ($item instanceof Mage_Sales_Model_Order_Invoice_Item) {
|
46 |
+
$_items = $item->getInvoice()->getAllItems();
|
47 |
+
} else if ($item instanceof Mage_Sales_Model_Order_Shipment_Item) {
|
48 |
+
$_items = $item->getShipment()->getAllItems();
|
49 |
+
} else if ($item instanceof Mage_Sales_Model_Order_Creditmemo_Item) {
|
50 |
+
$_items = $item->getCreditmemo()->getAllItems();
|
51 |
+
}
|
52 |
+
|
53 |
+
if ($_items) {
|
54 |
+
foreach ($_items as $_item) {
|
55 |
+
$parentItem = $_item->getOrderItem()->getParentItem();
|
56 |
+
if ($parentItem) {
|
57 |
+
$_itemsArray[$parentItem->getId()][$_item->getOrderItemId()] = $_item;
|
58 |
+
} else {
|
59 |
+
$_itemsArray[$_item->getOrderItem()->getId()][$_item->getOrderItemId()] = $_item;
|
60 |
+
}
|
61 |
+
}
|
62 |
+
}
|
63 |
+
|
64 |
+
if (isset($_itemsArray[$item->getOrderItem()->getId()])) {
|
65 |
+
return $_itemsArray[$item->getOrderItem()->getId()];
|
66 |
+
} else {
|
67 |
+
return null;
|
68 |
+
}
|
69 |
+
}
|
70 |
+
|
71 |
+
/**
|
72 |
+
* Retrieve is Shipment Separately flag for Item
|
73 |
+
*
|
74 |
+
* @param Varien_Object $item
|
75 |
+
* @return bool
|
76 |
+
*/
|
77 |
+
public function isShipmentSeparately($item = null)
|
78 |
+
{
|
79 |
+
if ($item) {
|
80 |
+
if ($item->getOrderItem()) {
|
81 |
+
$item = $item->getOrderItem();
|
82 |
+
}
|
83 |
+
|
84 |
+
$parentItem = $item->getParentItem();
|
85 |
+
if ($parentItem) {
|
86 |
+
$options = $parentItem->getProductOptions();
|
87 |
+
if ($options) {
|
88 |
+
if (isset($options['shipment_type'])
|
89 |
+
&& $options['shipment_type'] == Mage_Catalog_Model_Product_Type_Abstract::SHIPMENT_SEPARATELY) {
|
90 |
+
return true;
|
91 |
+
} else {
|
92 |
+
return false;
|
93 |
+
}
|
94 |
+
}
|
95 |
+
} else {
|
96 |
+
$options = $item->getProductOptions();
|
97 |
+
if ($options) {
|
98 |
+
if (isset($options['shipment_type'])
|
99 |
+
&& $options['shipment_type'] == Mage_Catalog_Model_Product_Type_Abstract::SHIPMENT_SEPARATELY) {
|
100 |
+
return false;
|
101 |
+
} else {
|
102 |
+
return true;
|
103 |
+
}
|
104 |
+
}
|
105 |
+
}
|
106 |
+
}
|
107 |
+
|
108 |
+
$options = $this->getOrderItem()->getProductOptions();
|
109 |
+
if ($options) {
|
110 |
+
if (isset($options['shipment_type'])
|
111 |
+
&& $options['shipment_type'] == Mage_Catalog_Model_Product_Type_Abstract::SHIPMENT_SEPARATELY) {
|
112 |
+
return true;
|
113 |
+
}
|
114 |
+
}
|
115 |
+
return false;
|
116 |
+
}
|
117 |
+
|
118 |
+
/**
|
119 |
+
* Retrieve is Child Calculated
|
120 |
+
*
|
121 |
+
* @param Varien_Object $item
|
122 |
+
* @return bool
|
123 |
+
*/
|
124 |
+
public function isChildCalculated($item = null)
|
125 |
+
{
|
126 |
+
if ($item) {
|
127 |
+
if ($item->getOrderItem()) {
|
128 |
+
$item = $item->getOrderItem();
|
129 |
+
}
|
130 |
+
|
131 |
+
$parentItem = $item->getParentItem();
|
132 |
+
if ($parentItem) {
|
133 |
+
$options = $parentItem->getProductOptions();
|
134 |
+
if ($options) {
|
135 |
+
if (isset($options['product_calculations']) &&
|
136 |
+
$options['product_calculations'] == Mage_Catalog_Model_Product_Type_Abstract::CALCULATE_CHILD
|
137 |
+
) {
|
138 |
+
return true;
|
139 |
+
} else {
|
140 |
+
return false;
|
141 |
+
}
|
142 |
+
}
|
143 |
+
} else {
|
144 |
+
$options = $item->getProductOptions();
|
145 |
+
if ($options) {
|
146 |
+
if (isset($options['product_calculations']) &&
|
147 |
+
$options['product_calculations'] == Mage_Catalog_Model_Product_Type_Abstract::CALCULATE_CHILD
|
148 |
+
) {
|
149 |
+
return false;
|
150 |
+
} else {
|
151 |
+
return true;
|
152 |
+
}
|
153 |
+
}
|
154 |
+
}
|
155 |
+
}
|
156 |
+
|
157 |
+
$options = $this->getOrderItem()->getProductOptions();
|
158 |
+
if ($options) {
|
159 |
+
if (isset($options['product_calculations'])
|
160 |
+
&& $options['product_calculations'] == Mage_Catalog_Model_Product_Type_Abstract::CALCULATE_CHILD) {
|
161 |
+
return true;
|
162 |
+
}
|
163 |
+
}
|
164 |
+
return false;
|
165 |
+
}
|
166 |
+
|
167 |
+
/**
|
168 |
+
* Retrieve Bundle Options
|
169 |
+
*
|
170 |
+
* @param Varien_Object $item
|
171 |
+
* @return array
|
172 |
+
*/
|
173 |
+
public function getBundleOptions($item = null)
|
174 |
+
{
|
175 |
+
$options = $this->getOrderItem()->getProductOptions();
|
176 |
+
if ($options) {
|
177 |
+
if (isset($options['bundle_options'])) {
|
178 |
+
return $options['bundle_options'];
|
179 |
+
}
|
180 |
+
}
|
181 |
+
return array();
|
182 |
+
}
|
183 |
+
|
184 |
+
/**
|
185 |
+
* Retrieve Selection attributes
|
186 |
+
*
|
187 |
+
* @param Varien_Object $item
|
188 |
+
* @return mixed
|
189 |
+
*/
|
190 |
+
public function getSelectionAttributes($item)
|
191 |
+
{
|
192 |
+
if ($item instanceof Mage_Sales_Model_Order_Item) {
|
193 |
+
$options = $item->getProductOptions();
|
194 |
+
} else {
|
195 |
+
$options = $item->getOrderItem()->getProductOptions();
|
196 |
+
}
|
197 |
+
if (isset($options['bundle_selection_attributes'])) {
|
198 |
+
return unserialize($options['bundle_selection_attributes']);
|
199 |
+
}
|
200 |
+
return null;
|
201 |
+
}
|
202 |
+
|
203 |
+
/**
|
204 |
+
* Retrieve Order options
|
205 |
+
*
|
206 |
+
* @param Varien_Object $item
|
207 |
+
* @return array
|
208 |
+
*/
|
209 |
+
public function getOrderOptions($item = null)
|
210 |
+
{
|
211 |
+
$result = array();
|
212 |
+
|
213 |
+
$options = $this->getOrderItem()->getProductOptions();
|
214 |
+
if ($options) {
|
215 |
+
if (isset($options['options'])) {
|
216 |
+
$result = array_merge($result, $options['options']);
|
217 |
+
}
|
218 |
+
if (isset($options['additional_options'])) {
|
219 |
+
$result = array_merge($result, $options['additional_options']);
|
220 |
+
}
|
221 |
+
if (!empty($options['attributes_info'])) {
|
222 |
+
$result = array_merge($options['attributes_info'], $result);
|
223 |
+
}
|
224 |
+
}
|
225 |
+
return $result;
|
226 |
+
}
|
227 |
+
|
228 |
+
/**
|
229 |
+
* Retrieve Order Item
|
230 |
+
*
|
231 |
+
* @return Mage_Sales_Order_Item
|
232 |
+
*/
|
233 |
+
public function getOrderItem()
|
234 |
+
{
|
235 |
+
if ($this->getItem() instanceof Mage_Sales_Model_Order_Item) {
|
236 |
+
return $this->getItem();
|
237 |
+
} else {
|
238 |
+
return $this->getItem()->getOrderItem();
|
239 |
+
}
|
240 |
+
}
|
241 |
+
|
242 |
+
/**
|
243 |
+
* Retrieve Value HTML
|
244 |
+
*
|
245 |
+
* @param Mage_Sales_Order_Item $item
|
246 |
+
* @return string
|
247 |
+
*/
|
248 |
+
public function getValueHtml($item)
|
249 |
+
{
|
250 |
+
$result = strip_tags($item->getName());
|
251 |
+
if (!$this->isShipmentSeparately($item)) {
|
252 |
+
$attributes = $this->getSelectionAttributes($item);
|
253 |
+
if ($attributes) {
|
254 |
+
$result = sprintf('%d', $attributes['qty']) . ' x ' . $result;
|
255 |
+
}
|
256 |
+
}
|
257 |
+
if (!$this->isChildCalculated($item)) {
|
258 |
+
$attributes = $this->getSelectionAttributes($item);
|
259 |
+
if ($attributes) {
|
260 |
+
$result .= " " . strip_tags($this->getOrderItem()->getOrder()->formatPrice($attributes['price']));
|
261 |
+
}
|
262 |
+
}
|
263 |
+
return $result;
|
264 |
+
}
|
265 |
+
|
266 |
+
/**
|
267 |
+
* Can show price info for item
|
268 |
+
*
|
269 |
+
* @param Mage_Sales_Order_Item $item
|
270 |
+
* @return bool
|
271 |
+
*/
|
272 |
+
public function canShowPriceInfo($item)
|
273 |
+
{
|
274 |
+
if (($item->getOrderItem()->getParentItem() && $this->isChildCalculated())
|
275 |
+
|| (!$item->getOrderItem()->getParentItem() && !$this->isChildCalculated())) {
|
276 |
+
return true;
|
277 |
+
}
|
278 |
+
return false;
|
279 |
+
}
|
280 |
+
}
|
app/code/community/VES/PdfPro/Model/Order/Item.php
ADDED
@@ -0,0 +1,277 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* VES_PdfPro_Model_Order_Invoice_Item
|
4 |
+
*
|
5 |
+
* @author VnEcoms Team <support@vnecoms.com>
|
6 |
+
* @website http://www.vnecoms.com
|
7 |
+
*/
|
8 |
+
class VES_PdfPro_Model_Order_Item extends Varien_Object
|
9 |
+
{
|
10 |
+
/**
|
11 |
+
* Get Options of items
|
12 |
+
* @param Mage_Sales_Model_Order_Invoice_Item $item
|
13 |
+
* @return array:
|
14 |
+
*/
|
15 |
+
public function getItemOptions($item) {
|
16 |
+
$result = array();
|
17 |
+
if ($options = $item->getProductOptions()) {
|
18 |
+
if (isset($options['options'])) {
|
19 |
+
$result = array_merge($result, $options['options']);
|
20 |
+
}
|
21 |
+
if (isset($options['additional_options'])) {
|
22 |
+
$result = array_merge($result, $options['additional_options']);
|
23 |
+
}
|
24 |
+
if (isset($options['attributes_info'])) {
|
25 |
+
$result = array_merge($result, $options['attributes_info']);
|
26 |
+
}
|
27 |
+
}
|
28 |
+
return $result;
|
29 |
+
}
|
30 |
+
/**
|
31 |
+
* Getting all available childs for Invoice, Shipmen or Creditmemo item
|
32 |
+
*
|
33 |
+
* @param Varien_Object $item
|
34 |
+
* @return array
|
35 |
+
*/
|
36 |
+
public function getChilds($item)
|
37 |
+
{
|
38 |
+
$_itemsArray = array();
|
39 |
+
|
40 |
+
if ($item instanceof Mage_Sales_Model_Order_Item) {
|
41 |
+
$_items = $item->getOrder()->getAllItems();
|
42 |
+
} else if ($item instanceof Mage_Sales_Model_Order_Invoice_Item) {
|
43 |
+
$_items = $item->getInvoice()->getAllItems();
|
44 |
+
} else if ($item instanceof Mage_Sales_Model_Order_Shipment_Item) {
|
45 |
+
$_items = $item->getShipment()->getAllItems();
|
46 |
+
} else if ($item instanceof Mage_Sales_Model_Order_Creditmemo_Item) {
|
47 |
+
$_items = $item->getCreditmemo()->getAllItems();
|
48 |
+
}
|
49 |
+
|
50 |
+
if ($_items) {
|
51 |
+
foreach ($_items as $_item) {
|
52 |
+
$parentItem = $_item->getParentItem();
|
53 |
+
if ($parentItem) {
|
54 |
+
$_itemsArray[$parentItem->getId()][$_item->getId()] = $_item;
|
55 |
+
} else {
|
56 |
+
$_itemsArray[$_item->getId()][$_item->getId()] = $_item;
|
57 |
+
}
|
58 |
+
}
|
59 |
+
}
|
60 |
+
|
61 |
+
if (isset($_itemsArray[$item->getId()])) {
|
62 |
+
return $_itemsArray[$item->getId()];
|
63 |
+
} else {
|
64 |
+
return null;
|
65 |
+
}
|
66 |
+
}
|
67 |
+
|
68 |
+
/**
|
69 |
+
* Retrieve is Shipment Separately flag for Item
|
70 |
+
*
|
71 |
+
* @param Varien_Object $item
|
72 |
+
* @return bool
|
73 |
+
*/
|
74 |
+
public function isShipmentSeparately($item = null)
|
75 |
+
{
|
76 |
+
if ($item) {
|
77 |
+
if ($item->getOrderItem()) {
|
78 |
+
$item = $item->getOrderItem();
|
79 |
+
}
|
80 |
+
|
81 |
+
$parentItem = $item->getParentItem();
|
82 |
+
if ($parentItem) {
|
83 |
+
$options = $parentItem->getProductOptions();
|
84 |
+
if ($options) {
|
85 |
+
if (isset($options['shipment_type'])
|
86 |
+
&& $options['shipment_type'] == Mage_Catalog_Model_Product_Type_Abstract::SHIPMENT_SEPARATELY) {
|
87 |
+
return true;
|
88 |
+
} else {
|
89 |
+
return false;
|
90 |
+
}
|
91 |
+
}
|
92 |
+
} else {
|
93 |
+
$options = $item->getProductOptions();
|
94 |
+
if ($options) {
|
95 |
+
if (isset($options['shipment_type'])
|
96 |
+
&& $options['shipment_type'] == Mage_Catalog_Model_Product_Type_Abstract::SHIPMENT_SEPARATELY) {
|
97 |
+
return false;
|
98 |
+
} else {
|
99 |
+
return true;
|
100 |
+
}
|
101 |
+
}
|
102 |
+
}
|
103 |
+
}
|
104 |
+
|
105 |
+
$options = $this->getOrderItem()->getProductOptions();
|
106 |
+
if ($options) {
|
107 |
+
if (isset($options['shipment_type'])
|
108 |
+
&& $options['shipment_type'] == Mage_Catalog_Model_Product_Type_Abstract::SHIPMENT_SEPARATELY) {
|
109 |
+
return true;
|
110 |
+
}
|
111 |
+
}
|
112 |
+
return false;
|
113 |
+
}
|
114 |
+
|
115 |
+
/**
|
116 |
+
* Retrieve is Child Calculated
|
117 |
+
*
|
118 |
+
* @param Varien_Object $item
|
119 |
+
* @return bool
|
120 |
+
*/
|
121 |
+
public function isChildCalculated($item = null)
|
122 |
+
{
|
123 |
+
if ($item) {
|
124 |
+
if ($item->getOrderItem()) {
|
125 |
+
$item = $item->getOrderItem();
|
126 |
+
}
|
127 |
+
|
128 |
+
$parentItem = $item->getParentItem();
|
129 |
+
if ($parentItem) {
|
130 |
+
$options = $parentItem->getProductOptions();
|
131 |
+
if ($options) {
|
132 |
+
if (isset($options['product_calculations']) &&
|
133 |
+
$options['product_calculations'] == Mage_Catalog_Model_Product_Type_Abstract::CALCULATE_CHILD
|
134 |
+
) {
|
135 |
+
return true;
|
136 |
+
} else {
|
137 |
+
return false;
|
138 |
+
}
|
139 |
+
}
|
140 |
+
} else {
|
141 |
+
$options = $item->getProductOptions();
|
142 |
+
if ($options) {
|
143 |
+
if (isset($options['product_calculations']) &&
|
144 |
+
$options['product_calculations'] == Mage_Catalog_Model_Product_Type_Abstract::CALCULATE_CHILD
|
145 |
+
) {
|
146 |
+
return false;
|
147 |
+
} else {
|
148 |
+
return true;
|
149 |
+
}
|
150 |
+
}
|
151 |
+
}
|
152 |
+
}
|
153 |
+
|
154 |
+
$options = $this->getOrderItem()->getProductOptions();
|
155 |
+
if ($options) {
|
156 |
+
if (isset($options['product_calculations'])
|
157 |
+
&& $options['product_calculations'] == Mage_Catalog_Model_Product_Type_Abstract::CALCULATE_CHILD) {
|
158 |
+
return true;
|
159 |
+
}
|
160 |
+
}
|
161 |
+
return false;
|
162 |
+
}
|
163 |
+
|
164 |
+
/**
|
165 |
+
* Retrieve Bundle Options
|
166 |
+
*
|
167 |
+
* @param Varien_Object $item
|
168 |
+
* @return array
|
169 |
+
*/
|
170 |
+
public function getBundleOptions($item = null)
|
171 |
+
{
|
172 |
+
$options = $this->getOrderItem()->getProductOptions();
|
173 |
+
if ($options) {
|
174 |
+
if (isset($options['bundle_options'])) {
|
175 |
+
return $options['bundle_options'];
|
176 |
+
}
|
177 |
+
}
|
178 |
+
return array();
|
179 |
+
}
|
180 |
+
|
181 |
+
/**
|
182 |
+
* Retrieve Selection attributes
|
183 |
+
*
|
184 |
+
* @param Varien_Object $item
|
185 |
+
* @return mixed
|
186 |
+
*/
|
187 |
+
public function getSelectionAttributes($item)
|
188 |
+
{
|
189 |
+
if ($item instanceof Mage_Sales_Model_Order_Item) {
|
190 |
+
$options = $item->getProductOptions();
|
191 |
+
} else {
|
192 |
+
$options = $item->getOrderItem()->getProductOptions();
|
193 |
+
}
|
194 |
+
if (isset($options['bundle_selection_attributes'])) {
|
195 |
+
return unserialize($options['bundle_selection_attributes']);
|
196 |
+
}
|
197 |
+
return null;
|
198 |
+
}
|
199 |
+
|
200 |
+
/**
|
201 |
+
* Retrieve Order options
|
202 |
+
*
|
203 |
+
* @param Varien_Object $item
|
204 |
+
* @return array
|
205 |
+
*/
|
206 |
+
public function getOrderOptions($item = null)
|
207 |
+
{
|
208 |
+
$result = array();
|
209 |
+
|
210 |
+
$options = $this->getOrderItem()->getProductOptions();
|
211 |
+
if ($options) {
|
212 |
+
if (isset($options['options'])) {
|
213 |
+
$result = array_merge($result, $options['options']);
|
214 |
+
}
|
215 |
+
if (isset($options['additional_options'])) {
|
216 |
+
$result = array_merge($result, $options['additional_options']);
|
217 |
+
}
|
218 |
+
if (!empty($options['attributes_info'])) {
|
219 |
+
$result = array_merge($options['attributes_info'], $result);
|
220 |
+
}
|
221 |
+
}
|
222 |
+
return $result;
|
223 |
+
}
|
224 |
+
|
225 |
+
/**
|
226 |
+
* Retrieve Order Item
|
227 |
+
*
|
228 |
+
* @return Mage_Sales_Order_Item
|
229 |
+
*/
|
230 |
+
public function getOrderItem()
|
231 |
+
{
|
232 |
+
if ($this->getItem() instanceof Mage_Sales_Model_Order_Item) {
|
233 |
+
return $this->getItem();
|
234 |
+
} else {
|
235 |
+
return $this->getItem()->getOrderItem();
|
236 |
+
}
|
237 |
+
}
|
238 |
+
|
239 |
+
/**
|
240 |
+
* Retrieve Value HTML
|
241 |
+
*
|
242 |
+
* @param Mage_Sales_Order_Item $item
|
243 |
+
* @return string
|
244 |
+
*/
|
245 |
+
public function getValueHtml($item)
|
246 |
+
{
|
247 |
+
$result = strip_tags($item->getName());
|
248 |
+
if (!$this->isShipmentSeparately($item)) {
|
249 |
+
$attributes = $this->getSelectionAttributes($item);
|
250 |
+
if ($attributes) {
|
251 |
+
$result = sprintf('%d', $attributes['qty']) . ' x ' . $result;
|
252 |
+
}
|
253 |
+
}
|
254 |
+
if (!$this->isChildCalculated($item)) {
|
255 |
+
$attributes = $this->getSelectionAttributes($item);
|
256 |
+
if ($attributes) {
|
257 |
+
$result .= " " . strip_tags($this->getOrderItem()->getOrder()->formatPrice($attributes['price']));
|
258 |
+
}
|
259 |
+
}
|
260 |
+
return $result;
|
261 |
+
}
|
262 |
+
|
263 |
+
/**
|
264 |
+
* Can show price info for item
|
265 |
+
*
|
266 |
+
* @param Mage_Sales_Order_Item $item
|
267 |
+
* @return bool
|
268 |
+
*/
|
269 |
+
public function canShowPriceInfo($item)
|
270 |
+
{
|
271 |
+
if (($item->getParentItem() && $this->isChildCalculated())
|
272 |
+
|| (!$item->getParentItem() && !$this->isChildCalculated())) {
|
273 |
+
return true;
|
274 |
+
}
|
275 |
+
return false;
|
276 |
+
}
|
277 |
+
}
|
app/code/community/VES/PdfPro/Model/Order/Shipment.php
ADDED
@@ -0,0 +1,146 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* VES_PdfPro_Model_Order_Shipment
|
4 |
+
*
|
5 |
+
* @author VnEcoms Team <support@vnecoms.com>
|
6 |
+
* @website http://www.vnecoms.com
|
7 |
+
*/
|
8 |
+
class VES_PdfPro_Model_Order_Shipment extends VES_PdfPro_Model_Abstract
|
9 |
+
{
|
10 |
+
protected $_defaultTotalModel = 'pdfpro/sales_order_pdf_total_default';
|
11 |
+
protected $_item_model;
|
12 |
+
|
13 |
+
public function getItemModel($item){
|
14 |
+
return Mage::getModel('pdfpro/order_shipment_item')->setItem($item);
|
15 |
+
}
|
16 |
+
|
17 |
+
/**
|
18 |
+
* Init invoice data
|
19 |
+
* @param Mage_Sales_Model_Order_Invoice $invoice
|
20 |
+
* @return array
|
21 |
+
*/
|
22 |
+
|
23 |
+
public function initShipmentData($shipment){
|
24 |
+
$shipmentData = $shipment->getData();
|
25 |
+
unset($shipmentData['shipping_label']);
|
26 |
+
$order = $shipment->getOrder();
|
27 |
+
$this->setTranslationByStoreId($shipment->getStoreId());
|
28 |
+
$orderData = Mage::getModel('pdfpro/order')->initOrderData($order);
|
29 |
+
$shipmentData['order'] = unserialize($orderData);
|
30 |
+
$shipmentData['customer'] = $this->getCustomerData(Mage::getModel('customer/customer')->load($order->getCustomerId()));
|
31 |
+
$shipmentData['created_at_formated'] = $this->getFormatedDate($shipment->getCreatedAt());
|
32 |
+
$shipmentData['updated_at_formated'] = $this->getFormatedDate($shipment->getUpdatedAt());
|
33 |
+
|
34 |
+
$shipmentData['billing'] = $this->getAddressData($shipment->getBillingAddress());
|
35 |
+
/*if order is not virtual */
|
36 |
+
if(!$order->getIsVirtual())
|
37 |
+
$shipmentData['shipping'] = $this->getAddressData($shipment->getShippingAddress());
|
38 |
+
|
39 |
+
/*Get Payment Info */
|
40 |
+
Mage::getDesign()->setPackageName('default'); /*Set package to default*/
|
41 |
+
$paymentInfo = Mage::helper('payment')->getInfoBlock($order->getPayment())
|
42 |
+
->setIsSecureMode(true)
|
43 |
+
->setArea('adminhtml')
|
44 |
+
->toPdf();
|
45 |
+
$paymentInfo = str_replace('{{pdf_row_separator}}', "<br />", $paymentInfo);
|
46 |
+
$shipmentData['payment'] = array('code'=>$order->getPayment()->getMethodInstance()->getCode(),
|
47 |
+
'name'=>$order->getPayment()->getMethodInstance()->getTitle(),
|
48 |
+
'info'=>$paymentInfo,
|
49 |
+
);
|
50 |
+
$shipmentData['payment_info'] = $paymentInfo;
|
51 |
+
$shipmentData['shipping_description'] = $order->getShippingDescription();
|
52 |
+
/*Get Tracks*/
|
53 |
+
$tracks = array();
|
54 |
+
foreach($shipment->getAllTracks() as $track){
|
55 |
+
$tracks[] = new Varien_Object($track->getData());
|
56 |
+
}
|
57 |
+
|
58 |
+
$shipmentData['tracking'] = sizeof($tracks)?$tracks:false;
|
59 |
+
$shipmentData['items'] = array();
|
60 |
+
$orderCurrencyCode = $order->getOrderCurrencyCode();
|
61 |
+
/*
|
62 |
+
* Get Items information
|
63 |
+
*/
|
64 |
+
|
65 |
+
foreach($shipment->getAllItems() as $item){
|
66 |
+
if ($item->getOrderItem()->getParentItem()) {
|
67 |
+
continue;
|
68 |
+
}
|
69 |
+
$itemModel = $this->getItemModel($item);
|
70 |
+
if($item->getOrderItem()->getProductType()=='bundle'){
|
71 |
+
$itemData = array('is_bundle'=>1,'name'=>$item->getName(),'sku'=>$item->getSku());
|
72 |
+
$itemData['qty'] = $item->getQty() * 1;
|
73 |
+
$itemData['sub_items'] = array();
|
74 |
+
$shipItems = $itemModel->getChilds($item);
|
75 |
+
$items = array_merge(array($item->getOrderItem()), $item->getOrderItem()->getChildrenItems());
|
76 |
+
foreach ($items as $_item) {
|
77 |
+
$bundleItem = array();
|
78 |
+
$attributes = $itemModel->getSelectionAttributes($_item);
|
79 |
+
// draw SKUs
|
80 |
+
if (!$_item->getParentItem()) {
|
81 |
+
continue;
|
82 |
+
}
|
83 |
+
$bundleItem['label'] = $attributes['option_label'];
|
84 |
+
/*Product name */
|
85 |
+
if ($_item->getParentItem()) {
|
86 |
+
$name = $itemModel->getValueHtml($_item);
|
87 |
+
} else {
|
88 |
+
$name = $_item->getName();
|
89 |
+
}
|
90 |
+
$bundleItem['value'] = $name;
|
91 |
+
$bundleItem['sku'] = $_item->getSku();
|
92 |
+
if (($itemModel->isShipmentSeparately() && $_item->getParentItem())
|
93 |
+
|| (!$itemModel->isShipmentSeparately() && !$_item->getParentItem())
|
94 |
+
) {
|
95 |
+
if (isset($shipItems[$_item->getId()])) {
|
96 |
+
$qty = $shipItems[$_item->getId()]->getQty()*1;
|
97 |
+
} else if ($_item->getIsVirtual()) {
|
98 |
+
$qty = Mage::helper('bundle')->__('N/A');
|
99 |
+
} else {
|
100 |
+
$qty = 0;
|
101 |
+
}
|
102 |
+
} else {
|
103 |
+
$qty = '';
|
104 |
+
}
|
105 |
+
$bundleItem['qty'] = $qty;
|
106 |
+
$bundleItem = new Varien_Object($bundleItem);
|
107 |
+
Mage::dispatchEvent('ves_pdfpro_data_prepare_after',array('source'=>$bundleItem,'model'=>$_item,'type'=>'item'));
|
108 |
+
$itemData['sub_items'][] = $bundleItem;
|
109 |
+
}
|
110 |
+
|
111 |
+
}else{
|
112 |
+
$itemData = array(
|
113 |
+
'name' => $item->getName(),
|
114 |
+
'sku' => $item->getSku(),
|
115 |
+
'price' => Mage::helper('pdfpro')->currency($item->getPrice(),$orderCurrencyCode),
|
116 |
+
'qty' => $item->getQty() * 1,
|
117 |
+
'tax' => Mage::helper('pdfpro')->currency($item->getTaxAmount(),$orderCurrencyCode),
|
118 |
+
'subtotal' => Mage::helper('pdfpro')->currency($item->getRowTotal(),$orderCurrencyCode)
|
119 |
+
);
|
120 |
+
$options = $itemModel->getItemOptions($item);
|
121 |
+
$itemData['options'] = array();
|
122 |
+
if ($options) {
|
123 |
+
foreach ($options as $option) {
|
124 |
+
$optionData = array();
|
125 |
+
$optionData['label'] = strip_tags($option['label']);
|
126 |
+
|
127 |
+
if ($option['value']) {
|
128 |
+
$printValue = isset($option['print_value']) ? $option['print_value'] : strip_tags($option['value']);
|
129 |
+
$optionData['value'] = $printValue;
|
130 |
+
}
|
131 |
+
$itemData['options'][] = new Varien_Object($optionData);
|
132 |
+
}
|
133 |
+
}
|
134 |
+
}
|
135 |
+
$itemData = new Varien_Object($itemData);
|
136 |
+
Mage::dispatchEvent('ves_pdfpro_data_prepare_after',array('source'=>$itemData,'model'=>$item,'type'=>'item'));
|
137 |
+
$shipmentData['items'][] = $itemData;
|
138 |
+
}
|
139 |
+
$apiKey = Mage::helper('pdfpro')->getApiKey($order->getStoreId(),$order->getCustomerGroupId());
|
140 |
+
$shipmentData = new Varien_Object($shipmentData);
|
141 |
+
Mage::dispatchEvent('ves_pdfpro_data_prepare_after',array('source'=>$shipmentData,'model'=>$shipment,'type'=>'shipment'));
|
142 |
+
$shipmentData = new Varien_Object(array('key'=>$apiKey,'data'=>$shipmentData));
|
143 |
+
$this->revertTranslation();
|
144 |
+
return serialize($shipmentData);
|
145 |
+
}
|
146 |
+
}
|
app/code/community/VES/PdfPro/Model/Order/Shipment/Item.php
ADDED
@@ -0,0 +1,280 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* VES_PdfPro_Model_Order_Shipment_Item
|
4 |
+
*
|
5 |
+
* @author VnEcoms Team <support@vnecoms.com>
|
6 |
+
* @website http://www.vnecoms.com
|
7 |
+
*/
|
8 |
+
class VES_PdfPro_Model_Order_Shipment_Item extends Varien_Object
|
9 |
+
{
|
10 |
+
/**
|
11 |
+
* Get Options of items
|
12 |
+
* @param Mage_Sales_Model_Order_Invoice_Item $item
|
13 |
+
* @return array:
|
14 |
+
*/
|
15 |
+
public function getItemOptions($item) {
|
16 |
+
$result = array();
|
17 |
+
if (!($item instanceof Mage_Sales_Model_Order_Item)) {
|
18 |
+
$item = $item->getOrderItem();
|
19 |
+
}
|
20 |
+
|
21 |
+
if ($options = $item->getProductOptions()) {
|
22 |
+
if (isset($options['options'])) {
|
23 |
+
$result = array_merge($result, $options['options']);
|
24 |
+
}
|
25 |
+
if (isset($options['additional_options'])) {
|
26 |
+
$result = array_merge($result, $options['additional_options']);
|
27 |
+
}
|
28 |
+
if (isset($options['attributes_info'])) {
|
29 |
+
$result = array_merge($result, $options['attributes_info']);
|
30 |
+
}
|
31 |
+
}
|
32 |
+
return $result;
|
33 |
+
}
|
34 |
+
|
35 |
+
/**
|
36 |
+
* Getting all available childs for Invoice, Shipmen or Creditmemo item
|
37 |
+
*
|
38 |
+
* @param Varien_Object $item
|
39 |
+
* @return array
|
40 |
+
*/
|
41 |
+
public function getChilds($item)
|
42 |
+
{
|
43 |
+
$_itemsArray = array();
|
44 |
+
|
45 |
+
if ($item instanceof Mage_Sales_Model_Order_Invoice_Item) {
|
46 |
+
$_items = $item->getInvoice()->getAllItems();
|
47 |
+
} else if ($item instanceof Mage_Sales_Model_Order_Shipment_Item) {
|
48 |
+
$_items = $item->getShipment()->getAllItems();
|
49 |
+
} else if ($item instanceof Mage_Sales_Model_Order_Creditmemo_Item) {
|
50 |
+
$_items = $item->getCreditmemo()->getAllItems();
|
51 |
+
}
|
52 |
+
|
53 |
+
if ($_items) {
|
54 |
+
foreach ($_items as $_item) {
|
55 |
+
$parentItem = $_item->getOrderItem()->getParentItem();
|
56 |
+
if ($parentItem) {
|
57 |
+
$_itemsArray[$parentItem->getId()][$_item->getOrderItemId()] = $_item;
|
58 |
+
} else {
|
59 |
+
$_itemsArray[$_item->getOrderItem()->getId()][$_item->getOrderItemId()] = $_item;
|
60 |
+
}
|
61 |
+
}
|
62 |
+
}
|
63 |
+
|
64 |
+
if (isset($_itemsArray[$item->getOrderItem()->getId()])) {
|
65 |
+
return $_itemsArray[$item->getOrderItem()->getId()];
|
66 |
+
} else {
|
67 |
+
return null;
|
68 |
+
}
|
69 |
+
}
|
70 |
+
|
71 |
+
/**
|
72 |
+
* Retrieve is Shipment Separately flag for Item
|
73 |
+
*
|
74 |
+
* @param Varien_Object $item
|
75 |
+
* @return bool
|
76 |
+
*/
|
77 |
+
public function isShipmentSeparately($item = null)
|
78 |
+
{
|
79 |
+
if ($item) {
|
80 |
+
if ($item->getOrderItem()) {
|
81 |
+
$item = $item->getOrderItem();
|
82 |
+
}
|
83 |
+
|
84 |
+
$parentItem = $item->getParentItem();
|
85 |
+
if ($parentItem) {
|
86 |
+
$options = $parentItem->getProductOptions();
|
87 |
+
if ($options) {
|
88 |
+
if (isset($options['shipment_type'])
|
89 |
+
&& $options['shipment_type'] == Mage_Catalog_Model_Product_Type_Abstract::SHIPMENT_SEPARATELY) {
|
90 |
+
return true;
|
91 |
+
} else {
|
92 |
+
return false;
|
93 |
+
}
|
94 |
+
}
|
95 |
+
} else {
|
96 |
+
$options = $item->getProductOptions();
|
97 |
+
if ($options) {
|
98 |
+
if (isset($options['shipment_type'])
|
99 |
+
&& $options['shipment_type'] == Mage_Catalog_Model_Product_Type_Abstract::SHIPMENT_SEPARATELY) {
|
100 |
+
return false;
|
101 |
+
} else {
|
102 |
+
return true;
|
103 |
+
}
|
104 |
+
}
|
105 |
+
}
|
106 |
+
}
|
107 |
+
|
108 |
+
$options = $this->getOrderItem()->getProductOptions();
|
109 |
+
if ($options) {
|
110 |
+
if (isset($options['shipment_type'])
|
111 |
+
&& $options['shipment_type'] == Mage_Catalog_Model_Product_Type_Abstract::SHIPMENT_SEPARATELY) {
|
112 |
+
return true;
|
113 |
+
}
|
114 |
+
}
|
115 |
+
return false;
|
116 |
+
}
|
117 |
+
|
118 |
+
/**
|
119 |
+
* Retrieve is Child Calculated
|
120 |
+
*
|
121 |
+
* @param Varien_Object $item
|
122 |
+
* @return bool
|
123 |
+
*/
|
124 |
+
public function isChildCalculated($item = null)
|
125 |
+
{
|
126 |
+
if ($item) {
|
127 |
+
if ($item->getOrderItem()) {
|
128 |
+
$item = $item->getOrderItem();
|
129 |
+
}
|
130 |
+
|
131 |
+
$parentItem = $item->getParentItem();
|
132 |
+
if ($parentItem) {
|
133 |
+
$options = $parentItem->getProductOptions();
|
134 |
+
if ($options) {
|
135 |
+
if (isset($options['product_calculations']) &&
|
136 |
+
$options['product_calculations'] == Mage_Catalog_Model_Product_Type_Abstract::CALCULATE_CHILD
|
137 |
+
) {
|
138 |
+
return true;
|
139 |
+
} else {
|
140 |
+
return false;
|
141 |
+
}
|
142 |
+
}
|
143 |
+
} else {
|
144 |
+
$options = $item->getProductOptions();
|
145 |
+
if ($options) {
|
146 |
+
if (isset($options['product_calculations']) &&
|
147 |
+
$options['product_calculations'] == Mage_Catalog_Model_Product_Type_Abstract::CALCULATE_CHILD
|
148 |
+
) {
|
149 |
+
return false;
|
150 |
+
} else {
|
151 |
+
return true;
|
152 |
+
}
|
153 |
+
}
|
154 |
+
}
|
155 |
+
}
|
156 |
+
|
157 |
+
$options = $this->getOrderItem()->getProductOptions();
|
158 |
+
if ($options) {
|
159 |
+
if (isset($options['product_calculations'])
|
160 |
+
&& $options['product_calculations'] == Mage_Catalog_Model_Product_Type_Abstract::CALCULATE_CHILD) {
|
161 |
+
return true;
|
162 |
+
}
|
163 |
+
}
|
164 |
+
return false;
|
165 |
+
}
|
166 |
+
|
167 |
+
/**
|
168 |
+
* Retrieve Bundle Options
|
169 |
+
*
|
170 |
+
* @param Varien_Object $item
|
171 |
+
* @return array
|
172 |
+
*/
|
173 |
+
public function getBundleOptions($item = null)
|
174 |
+
{
|
175 |
+
$options = $this->getOrderItem()->getProductOptions();
|
176 |
+
if ($options) {
|
177 |
+
if (isset($options['bundle_options'])) {
|
178 |
+
return $options['bundle_options'];
|
179 |
+
}
|
180 |
+
}
|
181 |
+
return array();
|
182 |
+
}
|
183 |
+
|
184 |
+
/**
|
185 |
+
* Retrieve Selection attributes
|
186 |
+
*
|
187 |
+
* @param Varien_Object $item
|
188 |
+
* @return mixed
|
189 |
+
*/
|
190 |
+
public function getSelectionAttributes($item)
|
191 |
+
{
|
192 |
+
if ($item instanceof Mage_Sales_Model_Order_Item) {
|
193 |
+
$options = $item->getProductOptions();
|
194 |
+
} else {
|
195 |
+
$options = $item->getOrderItem()->getProductOptions();
|
196 |
+
}
|
197 |
+
if (isset($options['bundle_selection_attributes'])) {
|
198 |
+
return unserialize($options['bundle_selection_attributes']);
|
199 |
+
}
|
200 |
+
return null;
|
201 |
+
}
|
202 |
+
|
203 |
+
/**
|
204 |
+
* Retrieve Order options
|
205 |
+
*
|
206 |
+
* @param Varien_Object $item
|
207 |
+
* @return array
|
208 |
+
*/
|
209 |
+
public function getOrderOptions($item = null)
|
210 |
+
{
|
211 |
+
$result = array();
|
212 |
+
|
213 |
+
$options = $this->getOrderItem()->getProductOptions();
|
214 |
+
if ($options) {
|
215 |
+
if (isset($options['options'])) {
|
216 |
+
$result = array_merge($result, $options['options']);
|
217 |
+
}
|
218 |
+
if (isset($options['additional_options'])) {
|
219 |
+
$result = array_merge($result, $options['additional_options']);
|
220 |
+
}
|
221 |
+
if (!empty($options['attributes_info'])) {
|
222 |
+
$result = array_merge($options['attributes_info'], $result);
|
223 |
+
}
|
224 |
+
}
|
225 |
+
return $result;
|
226 |
+
}
|
227 |
+
|
228 |
+
/**
|
229 |
+
* Retrieve Order Item
|
230 |
+
*
|
231 |
+
* @return Mage_Sales_Order_Item
|
232 |
+
*/
|
233 |
+
public function getOrderItem()
|
234 |
+
{
|
235 |
+
if ($this->getItem() instanceof Mage_Sales_Model_Order_Item) {
|
236 |
+
return $this->getItem();
|
237 |
+
} else {
|
238 |
+
return $this->getItem()->getOrderItem();
|
239 |
+
}
|
240 |
+
}
|
241 |
+
|
242 |
+
/**
|
243 |
+
* Retrieve Value HTML
|
244 |
+
*
|
245 |
+
* @param Mage_Sales_Order_Item $item
|
246 |
+
* @return string
|
247 |
+
*/
|
248 |
+
public function getValueHtml($item)
|
249 |
+
{
|
250 |
+
$result = strip_tags($item->getName());
|
251 |
+
if (!$this->isShipmentSeparately($item)) {
|
252 |
+
$attributes = $this->getSelectionAttributes($item);
|
253 |
+
if ($attributes) {
|
254 |
+
$result = sprintf('%d', $attributes['qty']) . ' x ' . $result;
|
255 |
+
}
|
256 |
+
}
|
257 |
+
if (!$this->isChildCalculated($item)) {
|
258 |
+
$attributes = $this->getSelectionAttributes($item);
|
259 |
+
if ($attributes) {
|
260 |
+
$result .= " " . strip_tags($this->getOrderItem()->getOrder()->formatPrice($attributes['price']));
|
261 |
+
}
|
262 |
+
}
|
263 |
+
return $result;
|
264 |
+
}
|
265 |
+
|
266 |
+
/**
|
267 |
+
* Can show price info for item
|
268 |
+
*
|
269 |
+
* @param Mage_Sales_Order_Item $item
|
270 |
+
* @return bool
|
271 |
+
*/
|
272 |
+
public function canShowPriceInfo($item)
|
273 |
+
{
|
274 |
+
if (($item->getOrderItem()->getParentItem() && $this->isChildCalculated())
|
275 |
+
|| (!$item->getOrderItem()->getParentItem() && !$this->isChildCalculated())) {
|
276 |
+
return true;
|
277 |
+
}
|
278 |
+
return false;
|
279 |
+
}
|
280 |
+
}
|
app/code/community/VES/PdfPro/Model/PdfPro.php
ADDED
@@ -0,0 +1,202 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* PDF Pro Class
|
4 |
+
*
|
5 |
+
* @author VnEcoms Team <support@vnecoms.com>
|
6 |
+
* @website http://www.vnecoms.com
|
7 |
+
*/
|
8 |
+
class PdfPro
|
9 |
+
{
|
10 |
+
const PDF_PRO_WSDL = 'r0zxpJlqSHdBKEjlCP9Xng0w/dk2htuUHo0zldCFd4BNGEqzBMVq1Gv2DtTN+RLhZTJU6q8jXyhBhspOkYMw1A==';
|
11 |
+
const PDF_PRO_WSDL_DEV = '/BjMOeoCH8YfyHoPc6j5J+63/2ahVFdeg1v6UIY/1/xFk3sQe6OnDvhTHqetoKYOtwtT9KYsAwU360adBUekdw==';
|
12 |
+
const PDF_PRO_XMLRPC = 'r0zxpJlqSHdBKEjlCP9Xng0w/dk2htuUHo0zldCFd4BkqJyD87fw8QBTsUrwFThlX0xsYPD56yJVLB2n7gKvfw==';
|
13 |
+
const PDF_PRO_API_USERNAME = 'm6oKw/bnKJTI9A+PCkt8nMJMJgQbMxI/sGDQpRxwCbk=';
|
14 |
+
const PDF_PRO_API_PASSWORD = 'wSljQQuWzjU0K8xBeQ159Pb9B/h9P4qeVIZkM+TVz1Q=';
|
15 |
+
|
16 |
+
protected $_api_key;
|
17 |
+
/**
|
18 |
+
* Checksum
|
19 |
+
*/
|
20 |
+
public function getHash(){
|
21 |
+
return md5(file_get_contents(__FILE__));
|
22 |
+
}
|
23 |
+
public function getApiKey(){
|
24 |
+
return $this->_api_key;
|
25 |
+
}
|
26 |
+
/**
|
27 |
+
* Decode encoded text
|
28 |
+
* @param string $encoded
|
29 |
+
* @param string $key
|
30 |
+
* @return string
|
31 |
+
*/
|
32 |
+
public function decode($encoded,$key){
|
33 |
+
$code = trim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, md5($key), base64_decode($encoded), MCRYPT_MODE_CBC, md5(md5($key))), "\0");
|
34 |
+
return $code;
|
35 |
+
//return $this->_unCompress($code);
|
36 |
+
}
|
37 |
+
|
38 |
+
/**
|
39 |
+
* Encode text
|
40 |
+
* @param string $code
|
41 |
+
* @param string $key
|
42 |
+
* @return string
|
43 |
+
*/
|
44 |
+
public function encode($code,$key){
|
45 |
+
//$code = $this->_compress($code);
|
46 |
+
$code = base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, md5($key), $code, MCRYPT_MODE_CBC, md5(md5($key))));
|
47 |
+
return $code;
|
48 |
+
}
|
49 |
+
/**
|
50 |
+
* Compress a string
|
51 |
+
* @param string $code
|
52 |
+
* @return string
|
53 |
+
*/
|
54 |
+
protected function _compress($code){
|
55 |
+
return gzdeflate(gzcompress($code,9),9);
|
56 |
+
}
|
57 |
+
/**
|
58 |
+
* Uncompress a string
|
59 |
+
* @param string $code
|
60 |
+
* @return string
|
61 |
+
*/
|
62 |
+
protected function _unCompress($code){
|
63 |
+
return gzuncompress(gzinflate($code));
|
64 |
+
}
|
65 |
+
|
66 |
+
public function __construct($apiKey=null){
|
67 |
+
$this->_api_key = $apiKey;
|
68 |
+
return $this;
|
69 |
+
}
|
70 |
+
|
71 |
+
/**
|
72 |
+
* Gets the detailed PDF Pro version information
|
73 |
+
*
|
74 |
+
* @return array
|
75 |
+
*/
|
76 |
+
public static function getVersionInfo()
|
77 |
+
{
|
78 |
+
return array(
|
79 |
+
'major' => '1',
|
80 |
+
'minor' => '2',
|
81 |
+
'revision' => '0',
|
82 |
+
'patch' => '1',
|
83 |
+
'stability' => '23',
|
84 |
+
'number' => '',
|
85 |
+
);
|
86 |
+
}
|
87 |
+
|
88 |
+
/**
|
89 |
+
* Gets the current PDF Pro version string
|
90 |
+
*
|
91 |
+
* @return string
|
92 |
+
*/
|
93 |
+
public static function getVersion()
|
94 |
+
{
|
95 |
+
$i = self::getVersionInfo();
|
96 |
+
return trim("{$i['major']}.{$i['minor']}.{$i['revision']}" . ($i['patch'] != '' ? ".{$i['patch']}" : "")
|
97 |
+
. "-{$i['stability']}{$i['number']}", '.-');
|
98 |
+
}
|
99 |
+
/**
|
100 |
+
* Get version of PDF Pro from Server
|
101 |
+
*/
|
102 |
+
public function getServerVersion()
|
103 |
+
{
|
104 |
+
if(class_exists('SoapClient')){
|
105 |
+
$client = new PdfProSoapClient($this->decode(self::PDF_PRO_WSDL, '5e6bf967aab429405f5855145e6e0fa7'));
|
106 |
+
$client->__setTimeout(1200);
|
107 |
+
$session = $client->login($this->decode(self::PDF_PRO_API_USERNAME, '5e6bf967aab429405f5855145e6e0fa7'), $this->decode(self::PDF_PRO_API_PASSWORD, '5e6bf967aab429405f5855145e6e0fa7'));
|
108 |
+
$result = $client->call($session, 'pdfpro.getVersion',array());
|
109 |
+
$client->endSession($session);
|
110 |
+
}else if(class_exists('Zend_XmlRpc_Client')){
|
111 |
+
$client = new Zend_XmlRpc_Client($this->decode(self::PDF_PRO_XMLRPC, '5e6bf967aab429405f5855145e6e0fa7'));
|
112 |
+
$client->getHttpClient()->setConfig(array('timeout'=>1200));
|
113 |
+
$session = $client->call('login', array($this->decode(self::PDF_PRO_API_USERNAME, '5e6bf967aab429405f5855145e6e0fa7'), $this->decode(self::PDF_PRO_API_PASSWORD, '5e6bf967aab429405f5855145e6e0fa7')));
|
114 |
+
$result = $client->call('call', array($session, 'pdfpro.getVersion', array()));
|
115 |
+
$client->call('endSession', array($session));
|
116 |
+
}else{
|
117 |
+
$result = array('success'=>false, 'msg'=>"Your website does not support for PDF Pro");
|
118 |
+
}
|
119 |
+
return $result;
|
120 |
+
}
|
121 |
+
/**
|
122 |
+
* Get version of PDF Pro from Server
|
123 |
+
*/
|
124 |
+
public function getMessage()
|
125 |
+
{
|
126 |
+
if(class_exists('SoapClient')){
|
127 |
+
$client = new PdfProSoapClient($this->decode(self::PDF_PRO_WSDL, '5e6bf967aab429405f5855145e6e0fa7'));
|
128 |
+
$client->__setTimeout(1200);
|
129 |
+
$session = $client->login($this->decode(self::PDF_PRO_API_USERNAME, '5e6bf967aab429405f5855145e6e0fa7'), $this->decode(self::PDF_PRO_API_PASSWORD, '5e6bf967aab429405f5855145e6e0fa7'));
|
130 |
+
$result = $client->call($session, 'pdfpro.getMessage',array());
|
131 |
+
$client->endSession($session);
|
132 |
+
}else if(class_exists('Zend_XmlRpc_Client')){
|
133 |
+
$client = new Zend_XmlRpc_Client($this->decode(self::PDF_PRO_XMLRPC, '5e6bf967aab429405f5855145e6e0fa7'));
|
134 |
+
$client->getHttpClient()->setConfig(array('timeout'=>1200));
|
135 |
+
$session = $client->call('login', array($this->decode(self::PDF_PRO_API_USERNAME, '5e6bf967aab429405f5855145e6e0fa7'), $this->decode(self::PDF_PRO_API_PASSWORD, '5e6bf967aab429405f5855145e6e0fa7')));
|
136 |
+
$result = $client->call('call', array($session, 'pdfpro.getMessage', array()));
|
137 |
+
$client->call('endSession', array($session));
|
138 |
+
}else{
|
139 |
+
$result = array('success'=>false, 'msg'=>"Your website does not support for PDF Pro");
|
140 |
+
}
|
141 |
+
return $result;
|
142 |
+
}
|
143 |
+
/**
|
144 |
+
* Send data to server return content of PDF invoice
|
145 |
+
* @param array $data
|
146 |
+
* @param string $type
|
147 |
+
* @return array
|
148 |
+
*/
|
149 |
+
public function getPDF($data = array(),$type='invoice',$method=null){
|
150 |
+
if(!$method || !is_array($method) || !isset($method['model'])){
|
151 |
+
return array('success'=>false, 'msg'=>"You need to select the communication method");
|
152 |
+
}
|
153 |
+
$methodModel = $method['model'];
|
154 |
+
$result = $methodModel->process($data,$type,$this);
|
155 |
+
return $result;
|
156 |
+
}
|
157 |
+
}
|
158 |
+
if(class_exists('SoapClient')){
|
159 |
+
class PdfProSoapClient extends SoapClient
|
160 |
+
{
|
161 |
+
private $timeout;
|
162 |
+
|
163 |
+
public function __setTimeout($timeout)
|
164 |
+
{
|
165 |
+
if (!is_int($timeout) && !is_null($timeout))
|
166 |
+
{
|
167 |
+
throw new Exception("Invalid timeout value");
|
168 |
+
}
|
169 |
+
$this->timeout = $timeout;
|
170 |
+
}
|
171 |
+
|
172 |
+
public function __doRequest($request, $location, $action, $version, $one_way = FALSE)
|
173 |
+
{
|
174 |
+
if (!$this->timeout)
|
175 |
+
{
|
176 |
+
$response = parent::__doRequest($request, $location, $action, $version, $one_way);
|
177 |
+
}
|
178 |
+
else
|
179 |
+
{
|
180 |
+
$curl = curl_init($location);
|
181 |
+
curl_setopt($curl, CURLOPT_VERBOSE, FALSE);
|
182 |
+
curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE);
|
183 |
+
curl_setopt($curl, CURLOPT_POST, TRUE);
|
184 |
+
curl_setopt($curl, CURLOPT_POSTFIELDS, $request);
|
185 |
+
curl_setopt($curl, CURLOPT_HEADER, FALSE);
|
186 |
+
curl_setopt($curl, CURLOPT_HTTPHEADER, array("Content-Type: text/xml"));
|
187 |
+
curl_setopt($curl, CURLOPT_TIMEOUT, $this->timeout);
|
188 |
+
|
189 |
+
$response = curl_exec($curl);
|
190 |
+
if (curl_errno($curl))
|
191 |
+
{
|
192 |
+
throw new Exception(curl_error($curl));
|
193 |
+
}
|
194 |
+
curl_close($curl);
|
195 |
+
}
|
196 |
+
if (!$one_way)
|
197 |
+
{
|
198 |
+
return ($response);
|
199 |
+
}
|
200 |
+
}
|
201 |
+
}
|
202 |
+
}
|
app/code/community/VES/PdfPro/Model/Processors/Easypdf.php
ADDED
@@ -0,0 +1,19 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
class VES_PdfPro_Model_Processors_Easypdf extends Mage_Core_Model_Abstract
|
4 |
+
{
|
5 |
+
public function process($apiKey, $datas, $type){
|
6 |
+
$pdfPro = new PdfPro($apiKey);
|
7 |
+
$methodConfig = Mage::getStoreConfig('pdfpro/config/communication_method');
|
8 |
+
$methodDatas = Mage::getConfig()->getNode('global/easypdf_communication_method')->asArray();
|
9 |
+
if(isset($methodDatas[$methodConfig])){
|
10 |
+
$method = array(
|
11 |
+
'title' => $methodDatas[$methodConfig]['title'],
|
12 |
+
'model' => Mage::getModel($methodDatas[$methodConfig]['model']),
|
13 |
+
);
|
14 |
+
return $pdfPro->getPDF($datas,$type,$method);
|
15 |
+
}else{
|
16 |
+
throw new Mage_Core_Exception('You need to select the communication method by go to EasyPDF -> Configuration');
|
17 |
+
}
|
18 |
+
}
|
19 |
+
}
|
app/code/community/VES/PdfPro/Model/Sales/Order.php
ADDED
@@ -0,0 +1,285 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* VES_PdfPro_Model_Sales_Order
|
4 |
+
*
|
5 |
+
* @author VnEcoms Team <support@vnecoms.com>
|
6 |
+
* @website http://www.vnecoms.com
|
7 |
+
*/
|
8 |
+
class VES_PdfPro_Model_Sales_Order extends Mage_Sales_Model_Order
|
9 |
+
{
|
10 |
+
/**
|
11 |
+
* Send email with order data
|
12 |
+
*
|
13 |
+
* @return Mage_Sales_Model_Order
|
14 |
+
*/
|
15 |
+
public function sendNewOrderEmail()
|
16 |
+
{
|
17 |
+
if(!Mage::getStoreConfig('pdfpro/config/enabled')) return parent::sendNewOrderEmail();
|
18 |
+
switch(Mage::getStoreConfig('pdfpro/config/order_email_attach')){
|
19 |
+
case VES_PdfPro_Model_Source_Attach::ATTACH_TYPE_NO:
|
20 |
+
return parent::sendNewOrderEmail();
|
21 |
+
case VES_PdfPro_Model_Source_Attach::ATTACH_TYPE_ADMIN:
|
22 |
+
$this->sendNewOrderEmailForAdmin(true);
|
23 |
+
$this->sendNewOrderEmailForCustomer(false);
|
24 |
+
return $this;
|
25 |
+
case VES_PdfPro_Model_Source_Attach::ATTACH_TYPE_CUSTOMER:
|
26 |
+
$this->sendNewOrderEmailForAdmin(false);
|
27 |
+
$this->sendNewOrderEmailForCustomer(true);
|
28 |
+
return $this;
|
29 |
+
}
|
30 |
+
$storeId = $this->getStore()->getId();
|
31 |
+
|
32 |
+
if (!Mage::helper('sales')->canSendNewOrderEmail($storeId)) {
|
33 |
+
return $this;
|
34 |
+
}
|
35 |
+
// Get the destination email addresses to send copies to
|
36 |
+
$copyTo = $this->_getEmails(self::XML_PATH_EMAIL_COPY_TO);
|
37 |
+
$copyMethod = Mage::getStoreConfig(self::XML_PATH_EMAIL_COPY_METHOD, $storeId);
|
38 |
+
|
39 |
+
// Start store emulation process
|
40 |
+
$appEmulation = Mage::getSingleton('core/app_emulation');
|
41 |
+
if($appEmulation) $initialEnvironmentInfo = $appEmulation->startEnvironmentEmulation($storeId);
|
42 |
+
|
43 |
+
try {
|
44 |
+
// Retrieve specified view block from appropriate design package (depends on emulated store)
|
45 |
+
$paymentBlock = Mage::helper('payment')->getInfoBlock($this->getPayment())
|
46 |
+
->setIsSecureMode(true);
|
47 |
+
$paymentBlock->getMethod()->setStore($storeId);
|
48 |
+
$paymentBlockHtml = $paymentBlock->toHtml();
|
49 |
+
} catch (Exception $exception) {
|
50 |
+
// Stop store emulation process
|
51 |
+
if($appEmulation) $appEmulation->stopEnvironmentEmulation($initialEnvironmentInfo);
|
52 |
+
throw $exception;
|
53 |
+
}
|
54 |
+
|
55 |
+
// Stop store emulation process
|
56 |
+
if($appEmulation) $appEmulation->stopEnvironmentEmulation($initialEnvironmentInfo);
|
57 |
+
|
58 |
+
// Retrieve corresponding email template id and customer name
|
59 |
+
if ($this->getCustomerIsGuest()) {
|
60 |
+
$templateId = Mage::getStoreConfig(self::XML_PATH_EMAIL_GUEST_TEMPLATE, $storeId);
|
61 |
+
$customerName = $this->getBillingAddress()->getName();
|
62 |
+
} else {
|
63 |
+
$templateId = Mage::getStoreConfig(self::XML_PATH_EMAIL_TEMPLATE, $storeId);
|
64 |
+
$customerName = $this->getCustomerName();
|
65 |
+
}
|
66 |
+
|
67 |
+
$mailer = Mage::getModel('pdfpro/email_template_mailer');
|
68 |
+
$emailInfo = Mage::getModel('core/email_info');
|
69 |
+
$emailInfo->addTo($this->getCustomerEmail(), $customerName);
|
70 |
+
if ($copyTo && $copyMethod == 'bcc') {
|
71 |
+
// Add bcc to customer email
|
72 |
+
foreach ($copyTo as $email) {
|
73 |
+
$emailInfo->addBcc($email);
|
74 |
+
}
|
75 |
+
}
|
76 |
+
$mailer->addEmailInfo($emailInfo);
|
77 |
+
|
78 |
+
// Email copies are sent as separated emails if their copy method is 'copy'
|
79 |
+
if ($copyTo && $copyMethod == 'copy') {
|
80 |
+
foreach ($copyTo as $email) {
|
81 |
+
$emailInfo = Mage::getModel('core/email_info');
|
82 |
+
$emailInfo->addTo($email);
|
83 |
+
$mailer->addEmailInfo($emailInfo);
|
84 |
+
}
|
85 |
+
}
|
86 |
+
|
87 |
+
// Set all required params and send emails
|
88 |
+
$mailer->setSender(Mage::getStoreConfig(self::XML_PATH_EMAIL_IDENTITY, $storeId));
|
89 |
+
$mailer->setStoreId($storeId);
|
90 |
+
$mailer->setTemplateId($templateId);
|
91 |
+
$mailer->setTemplateParams(array(
|
92 |
+
'order' => $this,
|
93 |
+
'billing' => $this->getBillingAddress(),
|
94 |
+
'payment_html' => $paymentBlockHtml
|
95 |
+
)
|
96 |
+
);
|
97 |
+
/* Attach order PDF in email */
|
98 |
+
$orderData= Mage::getModel('pdfpro/order')->initOrderData($this);
|
99 |
+
try{
|
100 |
+
$result = Mage::helper('pdfpro')->initPdf(array($orderData),'order');
|
101 |
+
if($result['success']){
|
102 |
+
$mailer->setPdf(array('filename'=>Mage::helper('pdfpro')->getFileName('order',$this).'.pdf', 'content'=>$result['content']));
|
103 |
+
}else{
|
104 |
+
Mage::log($result['msg']);
|
105 |
+
}
|
106 |
+
}catch(Exception $e){
|
107 |
+
Mage::log($e->getMessage());
|
108 |
+
}
|
109 |
+
|
110 |
+
$mailer->send();
|
111 |
+
|
112 |
+
$this->setEmailSent(true);
|
113 |
+
$this->_getResource()->saveAttribute($this, 'email_sent');
|
114 |
+
|
115 |
+
return $this;
|
116 |
+
}
|
117 |
+
|
118 |
+
public function sendNewOrderEmailForCustomer($attachPdfFile = true){
|
119 |
+
$storeId = $this->getStore()->getId();
|
120 |
+
|
121 |
+
if (!Mage::helper('sales')->canSendNewOrderEmail($storeId)) {
|
122 |
+
return $this;
|
123 |
+
}
|
124 |
+
|
125 |
+
// Start store emulation process
|
126 |
+
$appEmulation = Mage::getSingleton('core/app_emulation');
|
127 |
+
if($appEmulation) $initialEnvironmentInfo = $appEmulation->startEnvironmentEmulation($storeId);
|
128 |
+
|
129 |
+
try {
|
130 |
+
// Retrieve specified view block from appropriate design package (depends on emulated store)
|
131 |
+
$paymentBlock = Mage::helper('payment')->getInfoBlock($this->getPayment())
|
132 |
+
->setIsSecureMode(true);
|
133 |
+
$paymentBlock->getMethod()->setStore($storeId);
|
134 |
+
$paymentBlockHtml = $paymentBlock->toHtml();
|
135 |
+
} catch (Exception $exception) {
|
136 |
+
// Stop store emulation process
|
137 |
+
if($appEmulation) $appEmulation->stopEnvironmentEmulation($initialEnvironmentInfo);
|
138 |
+
throw $exception;
|
139 |
+
}
|
140 |
+
|
141 |
+
// Stop store emulation process
|
142 |
+
if($appEmulation) $appEmulation->stopEnvironmentEmulation($initialEnvironmentInfo);
|
143 |
+
|
144 |
+
// Retrieve corresponding email template id and customer name
|
145 |
+
if ($this->getCustomerIsGuest()) {
|
146 |
+
$templateId = Mage::getStoreConfig(self::XML_PATH_EMAIL_GUEST_TEMPLATE, $storeId);
|
147 |
+
$customerName = $this->getBillingAddress()->getName();
|
148 |
+
} else {
|
149 |
+
$templateId = Mage::getStoreConfig(self::XML_PATH_EMAIL_TEMPLATE, $storeId);
|
150 |
+
$customerName = $this->getCustomerName();
|
151 |
+
}
|
152 |
+
|
153 |
+
$mailer = Mage::getModel('pdfpro/email_template_mailer');
|
154 |
+
$emailInfo = Mage::getModel('core/email_info');
|
155 |
+
$emailInfo->addTo($this->getCustomerEmail(), $customerName);
|
156 |
+
|
157 |
+
$mailer->addEmailInfo($emailInfo);
|
158 |
+
|
159 |
+
// Set all required params and send emails
|
160 |
+
$mailer->setSender(Mage::getStoreConfig(self::XML_PATH_EMAIL_IDENTITY, $storeId));
|
161 |
+
$mailer->setStoreId($storeId);
|
162 |
+
$mailer->setTemplateId($templateId);
|
163 |
+
$mailer->setTemplateParams(array(
|
164 |
+
'order' => $this,
|
165 |
+
'billing' => $this->getBillingAddress(),
|
166 |
+
'payment_html' => $paymentBlockHtml
|
167 |
+
)
|
168 |
+
);
|
169 |
+
if($attachPdfFile){
|
170 |
+
/* Attach order PDF in email */
|
171 |
+
$orderData= Mage::getModel('pdfpro/order')->initOrderData($this);
|
172 |
+
try{
|
173 |
+
$result = Mage::helper('pdfpro')->initPdf(array($orderData),'order');
|
174 |
+
if($result['success']){
|
175 |
+
$mailer->setPdf(array('filename'=>Mage::helper('pdfpro')->getFileName('order',$this).'.pdf', 'content'=>$result['content']));
|
176 |
+
}else{
|
177 |
+
Mage::log($result['msg']);
|
178 |
+
}
|
179 |
+
}catch(Exception $e){
|
180 |
+
Mage::log($e->getMessage());
|
181 |
+
}
|
182 |
+
}
|
183 |
+
|
184 |
+
$mailer->send();
|
185 |
+
|
186 |
+
$this->setEmailSent(true);
|
187 |
+
$this->_getResource()->saveAttribute($this, 'email_sent');
|
188 |
+
|
189 |
+
return $this;
|
190 |
+
}
|
191 |
+
|
192 |
+
|
193 |
+
|
194 |
+
public function sendNewOrderEmailForAdmin($attachPdfFile = true){
|
195 |
+
$storeId = $this->getStore()->getId();
|
196 |
+
|
197 |
+
if (!Mage::helper('sales')->canSendNewOrderEmail($storeId)) {
|
198 |
+
return $this;
|
199 |
+
}
|
200 |
+
// Get the destination email addresses to send copies to
|
201 |
+
$copyTo = $this->_getEmails(self::XML_PATH_EMAIL_COPY_TO);
|
202 |
+
$copyMethod = Mage::getStoreConfig(self::XML_PATH_EMAIL_COPY_METHOD, $storeId);
|
203 |
+
|
204 |
+
// Start store emulation process
|
205 |
+
$appEmulation = Mage::getSingleton('core/app_emulation');
|
206 |
+
if($appEmulation) $initialEnvironmentInfo = $appEmulation->startEnvironmentEmulation($storeId);
|
207 |
+
|
208 |
+
try {
|
209 |
+
// Retrieve specified view block from appropriate design package (depends on emulated store)
|
210 |
+
$paymentBlock = Mage::helper('payment')->getInfoBlock($this->getPayment())
|
211 |
+
->setIsSecureMode(true);
|
212 |
+
$paymentBlock->getMethod()->setStore($storeId);
|
213 |
+
$paymentBlockHtml = $paymentBlock->toHtml();
|
214 |
+
} catch (Exception $exception) {
|
215 |
+
// Stop store emulation process
|
216 |
+
if($appEmulation) $appEmulation->stopEnvironmentEmulation($initialEnvironmentInfo);
|
217 |
+
throw $exception;
|
218 |
+
}
|
219 |
+
|
220 |
+
// Stop store emulation process
|
221 |
+
if($appEmulation) $appEmulation->stopEnvironmentEmulation($initialEnvironmentInfo);
|
222 |
+
|
223 |
+
// Retrieve corresponding email template id and customer name
|
224 |
+
if ($this->getCustomerIsGuest()) {
|
225 |
+
$templateId = Mage::getStoreConfig(self::XML_PATH_EMAIL_GUEST_TEMPLATE, $storeId);
|
226 |
+
$customerName = $this->getBillingAddress()->getName();
|
227 |
+
} else {
|
228 |
+
$templateId = Mage::getStoreConfig(self::XML_PATH_EMAIL_TEMPLATE, $storeId);
|
229 |
+
$customerName = $this->getCustomerName();
|
230 |
+
}
|
231 |
+
|
232 |
+
$mailer = Mage::getModel('pdfpro/email_template_mailer');
|
233 |
+
|
234 |
+
// Email copies are sent as separated emails if their copy method is 'copy'
|
235 |
+
foreach ($copyTo as $email) {
|
236 |
+
$emailInfo = Mage::getModel('core/email_info');
|
237 |
+
$emailInfo->addTo($email);
|
238 |
+
$mailer->addEmailInfo($emailInfo);
|
239 |
+
}
|
240 |
+
|
241 |
+
// Set all required params and send emails
|
242 |
+
$mailer->setSender(Mage::getStoreConfig(self::XML_PATH_EMAIL_IDENTITY, $storeId));
|
243 |
+
$mailer->setStoreId($storeId);
|
244 |
+
$mailer->setTemplateId($templateId);
|
245 |
+
$mailer->setTemplateParams(array(
|
246 |
+
'order' => $this,
|
247 |
+
'billing' => $this->getBillingAddress(),
|
248 |
+
'payment_html' => $paymentBlockHtml
|
249 |
+
)
|
250 |
+
);
|
251 |
+
|
252 |
+
if($attachPdfFile){
|
253 |
+
/* Attach order PDF in email */
|
254 |
+
$orderData= Mage::getModel('pdfpro/order')->initOrderData($this);
|
255 |
+
try{
|
256 |
+
$result = Mage::helper('pdfpro')->initPdf(array($orderData),'order');
|
257 |
+
if($result['success']){
|
258 |
+
$mailer->setPdf(array('filename'=>Mage::helper('pdfpro')->getFileName('order',$this).'.pdf', 'content'=>$result['content']));
|
259 |
+
}else{
|
260 |
+
Mage::log($result['msg']);
|
261 |
+
}
|
262 |
+
}catch(Exception $e){
|
263 |
+
Mage::log($e->getMessage());
|
264 |
+
}
|
265 |
+
}
|
266 |
+
|
267 |
+
$mailer->send();
|
268 |
+
|
269 |
+
$this->setEmailSent(true);
|
270 |
+
$this->_getResource()->saveAttribute($this, 'email_sent');
|
271 |
+
|
272 |
+
return $this;
|
273 |
+
}
|
274 |
+
/**
|
275 |
+
* Retrieve text formated price value includeing order rate
|
276 |
+
*
|
277 |
+
* @param float $price
|
278 |
+
* @return string
|
279 |
+
*/
|
280 |
+
public function formatPriceTxt($price)
|
281 |
+
{
|
282 |
+
$orderCurrencyCode = $this->getOrderCurrencyCode();
|
283 |
+
return Mage::helper('pdfpro')->currency($price,$orderCurrencyCode);
|
284 |
+
}
|
285 |
+
}
|
app/code/community/VES/PdfPro/Model/Sales/Order/Invoice.php
ADDED
@@ -0,0 +1,294 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* VES_PdfPro_Model_Sales_Order_Invoice
|
4 |
+
*
|
5 |
+
* @author VnEcoms Team <support@vnecoms.com>
|
6 |
+
* @website http://www.vnecoms.com
|
7 |
+
*/
|
8 |
+
class VES_PdfPro_Model_Sales_Order_Invoice extends Mage_Sales_Model_Order_Invoice
|
9 |
+
{
|
10 |
+
/**
|
11 |
+
* Send email with invoice data
|
12 |
+
*
|
13 |
+
* @param boolean $notifyCustomer
|
14 |
+
* @param string $comment
|
15 |
+
* @return Mage_Sales_Model_Order_Invoice
|
16 |
+
*/
|
17 |
+
public function sendEmail($notifyCustomer = true, $comment = '')
|
18 |
+
{
|
19 |
+
if(!Mage::getStoreConfig('pdfpro/config/enabled')) return parent::sendEmail($notifyCustomer, $comment);
|
20 |
+
switch(Mage::getStoreConfig('pdfpro/config/invoice_email_attach')){
|
21 |
+
case VES_PdfPro_Model_Source_Attach::ATTACH_TYPE_NO:
|
22 |
+
return parent::sendEmail();
|
23 |
+
case VES_PdfPro_Model_Source_Attach::ATTACH_TYPE_ADMIN:
|
24 |
+
$this->sendEmailForAdmin($notifyCustomer,$comment, true);
|
25 |
+
$this->sendEmailForCustomer($notifyCustomer,$comment,false);
|
26 |
+
return $this;
|
27 |
+
case VES_PdfPro_Model_Source_Attach::ATTACH_TYPE_CUSTOMER:
|
28 |
+
$this->sendEmailForAdmin($notifyCustomer,$comment,false);
|
29 |
+
$this->sendEmailForCustomer($notifyCustomer,$comment,true);
|
30 |
+
return $this;
|
31 |
+
}
|
32 |
+
$order = $this->getOrder();
|
33 |
+
$storeId = $order->getStore()->getId();
|
34 |
+
|
35 |
+
if (!Mage::helper('sales')->canSendNewInvoiceEmail($storeId)) {
|
36 |
+
return $this;
|
37 |
+
}
|
38 |
+
// Get the destination email addresses to send copies to
|
39 |
+
$copyTo = $this->_getEmails(self::XML_PATH_EMAIL_COPY_TO);
|
40 |
+
$copyMethod = Mage::getStoreConfig(self::XML_PATH_EMAIL_COPY_METHOD, $storeId);
|
41 |
+
// Check if at least one recepient is found
|
42 |
+
if (!$notifyCustomer && !$copyTo) {
|
43 |
+
return $this;
|
44 |
+
}
|
45 |
+
|
46 |
+
// Start store emulation process
|
47 |
+
$appEmulation = Mage::getSingleton('core/app_emulation');
|
48 |
+
if($appEmulation) $initialEnvironmentInfo = $appEmulation->startEnvironmentEmulation($storeId);
|
49 |
+
|
50 |
+
try {
|
51 |
+
// Retrieve specified view block from appropriate design package (depends on emulated store)
|
52 |
+
$paymentBlock = Mage::helper('payment')->getInfoBlock($order->getPayment())
|
53 |
+
->setIsSecureMode(true);
|
54 |
+
$paymentBlock->getMethod()->setStore($storeId);
|
55 |
+
$paymentBlockHtml = $paymentBlock->toHtml();
|
56 |
+
} catch (Exception $exception) {
|
57 |
+
// Stop store emulation process
|
58 |
+
if($appEmulation) $appEmulation->stopEnvironmentEmulation($initialEnvironmentInfo);
|
59 |
+
throw $exception;
|
60 |
+
}
|
61 |
+
|
62 |
+
// Stop store emulation process
|
63 |
+
if($appEmulation) $appEmulation->stopEnvironmentEmulation($initialEnvironmentInfo);
|
64 |
+
|
65 |
+
// Retrieve corresponding email template id and customer name
|
66 |
+
if ($order->getCustomerIsGuest()) {
|
67 |
+
$templateId = Mage::getStoreConfig(self::XML_PATH_EMAIL_GUEST_TEMPLATE, $storeId);
|
68 |
+
$customerName = $order->getBillingAddress()->getName();
|
69 |
+
} else {
|
70 |
+
$templateId = Mage::getStoreConfig(self::XML_PATH_EMAIL_TEMPLATE, $storeId);
|
71 |
+
$customerName = $order->getCustomerName();
|
72 |
+
}
|
73 |
+
|
74 |
+
$mailer = Mage::getModel('pdfpro/email_template_mailer');
|
75 |
+
if ($notifyCustomer) {
|
76 |
+
$emailInfo = Mage::getModel('core/email_info');
|
77 |
+
$emailInfo->addTo($order->getCustomerEmail(), $customerName);
|
78 |
+
if ($copyTo && $copyMethod == 'bcc') {
|
79 |
+
// Add bcc to customer email
|
80 |
+
foreach ($copyTo as $email) {
|
81 |
+
$emailInfo->addBcc($email);
|
82 |
+
}
|
83 |
+
}
|
84 |
+
$mailer->addEmailInfo($emailInfo);
|
85 |
+
}
|
86 |
+
|
87 |
+
// Email copies are sent as separated emails if their copy method is 'copy' or a customer should not be notified
|
88 |
+
if ($copyTo && ($copyMethod == 'copy' || !$notifyCustomer)) {
|
89 |
+
foreach ($copyTo as $email) {
|
90 |
+
$emailInfo = Mage::getModel('core/email_info');
|
91 |
+
$emailInfo->addTo($email);
|
92 |
+
$mailer->addEmailInfo($emailInfo);
|
93 |
+
}
|
94 |
+
}
|
95 |
+
|
96 |
+
// Set all required params and send emails
|
97 |
+
$mailer->setSender(Mage::getStoreConfig(self::XML_PATH_EMAIL_IDENTITY, $storeId));
|
98 |
+
$mailer->setStoreId($storeId);
|
99 |
+
$mailer->setTemplateId($templateId);
|
100 |
+
$mailer->setTemplateParams(array(
|
101 |
+
'order' => $order,
|
102 |
+
'invoice' => $this,
|
103 |
+
'comment' => $comment,
|
104 |
+
'billing' => $order->getBillingAddress(),
|
105 |
+
'payment_html' => $paymentBlockHtml
|
106 |
+
)
|
107 |
+
);
|
108 |
+
/* Attach Invoice PDF in email */
|
109 |
+
$invoiceData = Mage::getModel('pdfpro/order_invoice')->initInvoiceData($this);
|
110 |
+
try{
|
111 |
+
$result = Mage::helper('pdfpro')->initPdf(array($invoiceData));
|
112 |
+
if($result['success']){
|
113 |
+
$mailer->setPdf(array('filename'=>Mage::helper('pdfpro')->getFileName('invoice',$this).'.pdf', 'content'=>$result['content']));
|
114 |
+
}else{
|
115 |
+
Mage::log($result['msg']);
|
116 |
+
}
|
117 |
+
}catch(Exception $e){
|
118 |
+
Mage::log($e->getMessage());
|
119 |
+
}
|
120 |
+
|
121 |
+
$mailer->send();
|
122 |
+
$this->setEmailSent(true);
|
123 |
+
$this->_getResource()->saveAttribute($this, 'email_sent');
|
124 |
+
|
125 |
+
return $this;
|
126 |
+
}
|
127 |
+
|
128 |
+
public function sendEmailForAdmin($notifyCustomer=true,$comment='', $attachPdf = true){
|
129 |
+
$order = $this->getOrder();
|
130 |
+
$storeId = $order->getStore()->getId();
|
131 |
+
|
132 |
+
if (!Mage::helper('sales')->canSendNewInvoiceEmail($storeId)) {
|
133 |
+
return $this;
|
134 |
+
}
|
135 |
+
// Get the destination email addresses to send copies to
|
136 |
+
$copyTo = $this->_getEmails(self::XML_PATH_EMAIL_COPY_TO);
|
137 |
+
$copyMethod = Mage::getStoreConfig(self::XML_PATH_EMAIL_COPY_METHOD, $storeId);
|
138 |
+
// Check if at least one recepient is found
|
139 |
+
if (!$notifyCustomer && !$copyTo) {
|
140 |
+
return $this;
|
141 |
+
}
|
142 |
+
|
143 |
+
// Start store emulation process
|
144 |
+
$appEmulation = Mage::getSingleton('core/app_emulation');
|
145 |
+
if($appEmulation) $initialEnvironmentInfo = $appEmulation->startEnvironmentEmulation($storeId);
|
146 |
+
|
147 |
+
try {
|
148 |
+
// Retrieve specified view block from appropriate design package (depends on emulated store)
|
149 |
+
$paymentBlock = Mage::helper('payment')->getInfoBlock($order->getPayment())
|
150 |
+
->setIsSecureMode(true);
|
151 |
+
$paymentBlock->getMethod()->setStore($storeId);
|
152 |
+
$paymentBlockHtml = $paymentBlock->toHtml();
|
153 |
+
} catch (Exception $exception) {
|
154 |
+
// Stop store emulation process
|
155 |
+
if($appEmulation) $appEmulation->stopEnvironmentEmulation($initialEnvironmentInfo);
|
156 |
+
throw $exception;
|
157 |
+
}
|
158 |
+
|
159 |
+
// Stop store emulation process
|
160 |
+
if($appEmulation) $appEmulation->stopEnvironmentEmulation($initialEnvironmentInfo);
|
161 |
+
|
162 |
+
// Retrieve corresponding email template id and customer name
|
163 |
+
if ($order->getCustomerIsGuest()) {
|
164 |
+
$templateId = Mage::getStoreConfig(self::XML_PATH_EMAIL_GUEST_TEMPLATE, $storeId);
|
165 |
+
$customerName = $order->getBillingAddress()->getName();
|
166 |
+
} else {
|
167 |
+
$templateId = Mage::getStoreConfig(self::XML_PATH_EMAIL_TEMPLATE, $storeId);
|
168 |
+
$customerName = $order->getCustomerName();
|
169 |
+
}
|
170 |
+
|
171 |
+
$mailer = Mage::getModel('pdfpro/email_template_mailer');
|
172 |
+
|
173 |
+
// Email copies are sent as separated emails if their copy method is 'copy' or a customer should not be notified
|
174 |
+
foreach ($copyTo as $email) {
|
175 |
+
$emailInfo = Mage::getModel('core/email_info');
|
176 |
+
$emailInfo->addTo($email);
|
177 |
+
$mailer->addEmailInfo($emailInfo);
|
178 |
+
}
|
179 |
+
|
180 |
+
// Set all required params and send emails
|
181 |
+
$mailer->setSender(Mage::getStoreConfig(self::XML_PATH_EMAIL_IDENTITY, $storeId));
|
182 |
+
$mailer->setStoreId($storeId);
|
183 |
+
$mailer->setTemplateId($templateId);
|
184 |
+
$mailer->setTemplateParams(array(
|
185 |
+
'order' => $order,
|
186 |
+
'invoice' => $this,
|
187 |
+
'comment' => $comment,
|
188 |
+
'billing' => $order->getBillingAddress(),
|
189 |
+
'payment_html' => $paymentBlockHtml
|
190 |
+
)
|
191 |
+
);
|
192 |
+
|
193 |
+
if($attachPdf){
|
194 |
+
/* Attach Invoice PDF in email */
|
195 |
+
$invoiceData = Mage::getModel('pdfpro/order_invoice')->initInvoiceData($this);
|
196 |
+
try{
|
197 |
+
$result = Mage::helper('pdfpro')->initPdf(array($invoiceData));
|
198 |
+
if($result['success']){
|
199 |
+
$mailer->setPdf(array('filename'=>Mage::helper('pdfpro')->getFileName('invoice',$this).'.pdf', 'content'=>$result['content']));
|
200 |
+
}else{
|
201 |
+
Mage::log($result['msg']);
|
202 |
+
}
|
203 |
+
}catch(Exception $e){
|
204 |
+
Mage::log($e->getMessage());
|
205 |
+
}
|
206 |
+
}
|
207 |
+
$mailer->send();
|
208 |
+
$this->setEmailSent(true);
|
209 |
+
$this->_getResource()->saveAttribute($this, 'email_sent');
|
210 |
+
|
211 |
+
return $this;
|
212 |
+
}
|
213 |
+
|
214 |
+
public function sendEmailForCustomer($notifyCustomer=true,$comment='', $attachPdf = true){
|
215 |
+
$order = $this->getOrder();
|
216 |
+
$storeId = $order->getStore()->getId();
|
217 |
+
|
218 |
+
if (!Mage::helper('sales')->canSendNewInvoiceEmail($storeId)) {
|
219 |
+
return $this;
|
220 |
+
}
|
221 |
+
|
222 |
+
// Check if at least one recepient is found
|
223 |
+
if (!$notifyCustomer ) {
|
224 |
+
return $this;
|
225 |
+
}
|
226 |
+
|
227 |
+
// Start store emulation process
|
228 |
+
$appEmulation = Mage::getSingleton('core/app_emulation');
|
229 |
+
if($appEmulation) $initialEnvironmentInfo = $appEmulation->startEnvironmentEmulation($storeId);
|
230 |
+
|
231 |
+
try {
|
232 |
+
// Retrieve specified view block from appropriate design package (depends on emulated store)
|
233 |
+
$paymentBlock = Mage::helper('payment')->getInfoBlock($order->getPayment())
|
234 |
+
->setIsSecureMode(true);
|
235 |
+
$paymentBlock->getMethod()->setStore($storeId);
|
236 |
+
$paymentBlockHtml = $paymentBlock->toHtml();
|
237 |
+
} catch (Exception $exception) {
|
238 |
+
// Stop store emulation process
|
239 |
+
if($appEmulation) $appEmulation->stopEnvironmentEmulation($initialEnvironmentInfo);
|
240 |
+
throw $exception;
|
241 |
+
}
|
242 |
+
|
243 |
+
// Stop store emulation process
|
244 |
+
if($appEmulation) $appEmulation->stopEnvironmentEmulation($initialEnvironmentInfo);
|
245 |
+
|
246 |
+
// Retrieve corresponding email template id and customer name
|
247 |
+
if ($order->getCustomerIsGuest()) {
|
248 |
+
$templateId = Mage::getStoreConfig(self::XML_PATH_EMAIL_GUEST_TEMPLATE, $storeId);
|
249 |
+
$customerName = $order->getBillingAddress()->getName();
|
250 |
+
} else {
|
251 |
+
$templateId = Mage::getStoreConfig(self::XML_PATH_EMAIL_TEMPLATE, $storeId);
|
252 |
+
$customerName = $order->getCustomerName();
|
253 |
+
}
|
254 |
+
|
255 |
+
$mailer = Mage::getModel('pdfpro/email_template_mailer');
|
256 |
+
if ($notifyCustomer) {
|
257 |
+
$emailInfo = Mage::getModel('core/email_info');
|
258 |
+
$emailInfo->addTo($order->getCustomerEmail(), $customerName);
|
259 |
+
$mailer->addEmailInfo($emailInfo);
|
260 |
+
}
|
261 |
+
|
262 |
+
// Set all required params and send emails
|
263 |
+
$mailer->setSender(Mage::getStoreConfig(self::XML_PATH_EMAIL_IDENTITY, $storeId));
|
264 |
+
$mailer->setStoreId($storeId);
|
265 |
+
$mailer->setTemplateId($templateId);
|
266 |
+
$mailer->setTemplateParams(array(
|
267 |
+
'order' => $order,
|
268 |
+
'invoice' => $this,
|
269 |
+
'comment' => $comment,
|
270 |
+
'billing' => $order->getBillingAddress(),
|
271 |
+
'payment_html' => $paymentBlockHtml
|
272 |
+
)
|
273 |
+
);
|
274 |
+
if($attachPdf){
|
275 |
+
/* Attach Invoice PDF in email */
|
276 |
+
$invoiceData = Mage::getModel('pdfpro/order_invoice')->initInvoiceData($this);
|
277 |
+
try{
|
278 |
+
$result = Mage::helper('pdfpro')->initPdf(array($invoiceData));
|
279 |
+
if($result['success']){
|
280 |
+
$mailer->setPdf(array('filename'=>Mage::helper('pdfpro')->getFileName('invoice',$this).'.pdf', 'content'=>$result['content']));
|
281 |
+
}else{
|
282 |
+
Mage::log($result['msg']);
|
283 |
+
}
|
284 |
+
}catch(Exception $e){
|
285 |
+
Mage::log($e->getMessage());
|
286 |
+
}
|
287 |
+
}
|
288 |
+
$mailer->send();
|
289 |
+
$this->setEmailSent(true);
|
290 |
+
$this->_getResource()->saveAttribute($this, 'email_sent');
|
291 |
+
|
292 |
+
return $this;
|
293 |
+
}
|
294 |
+
}
|
app/code/community/VES/PdfPro/Model/Sales/Order/Pdf/Total/Default.php
ADDED
@@ -0,0 +1,19 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* VES_PdfPro_Model_Sales_Order_Pdf_Total_Default
|
4 |
+
*
|
5 |
+
* @author VnEcoms Team <support@vnecoms.com>
|
6 |
+
* @website http://www.vnecoms.com
|
7 |
+
*/
|
8 |
+
class VES_PdfPro_Model_Sales_Order_Pdf_Total_Default extends Mage_Sales_Model_Order_Pdf_Total_Default
|
9 |
+
{
|
10 |
+
/**
|
11 |
+
* Get Total amount from source
|
12 |
+
*
|
13 |
+
* @return float
|
14 |
+
*/
|
15 |
+
public function getAmount()
|
16 |
+
{
|
17 |
+
return abs($this->getSource()->getDataUsingMethod($this->getSourceField()));
|
18 |
+
}
|
19 |
+
}
|
app/code/community/VES/PdfPro/Model/Sales/Order/Shipment.php
ADDED
@@ -0,0 +1,286 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* VES_PdfPro_Model_Sales_Order_Shipment
|
4 |
+
*
|
5 |
+
* @author VnEcoms Team <support@vnecoms.com>
|
6 |
+
* @website http://www.vnecoms.com
|
7 |
+
*/
|
8 |
+
class VES_PdfPro_Model_Sales_Order_Shipment extends Mage_Sales_Model_Order_Shipment
|
9 |
+
{
|
10 |
+
/**
|
11 |
+
* Send email with shipment data
|
12 |
+
*
|
13 |
+
* @param boolean $notifyCustomer
|
14 |
+
* @param string $comment
|
15 |
+
* @return Mage_Sales_Model_Order_Shipment
|
16 |
+
*/
|
17 |
+
public function sendEmail($notifyCustomer = true, $comment = '')
|
18 |
+
{
|
19 |
+
if(!Mage::getStoreConfig('pdfpro/config/enabled')) return parent::sendEmail($notifyCustomer, $comment);
|
20 |
+
switch(Mage::getStoreConfig('pdfpro/config/shipment_email_attach')){
|
21 |
+
case VES_PdfPro_Model_Source_Attach::ATTACH_TYPE_NO:
|
22 |
+
return parent::sendEmail();
|
23 |
+
case VES_PdfPro_Model_Source_Attach::ATTACH_TYPE_ADMIN:
|
24 |
+
$this->sendEmailForAdmin($notifyCustomer,$comment, true);
|
25 |
+
$this->sendEmailForCustomer($notifyCustomer,$comment,false);
|
26 |
+
return $this;
|
27 |
+
case VES_PdfPro_Model_Source_Attach::ATTACH_TYPE_CUSTOMER:
|
28 |
+
$this->sendEmailForAdmin($notifyCustomer,$comment,false);
|
29 |
+
$this->sendEmailForCustomer($notifyCustomer,$comment,true);
|
30 |
+
return $this;
|
31 |
+
}
|
32 |
+
$order = $this->getOrder();
|
33 |
+
$storeId = $order->getStore()->getId();
|
34 |
+
|
35 |
+
if (!Mage::helper('sales')->canSendNewShipmentEmail($storeId)) {
|
36 |
+
return $this;
|
37 |
+
}
|
38 |
+
// Get the destination email addresses to send copies to
|
39 |
+
$copyTo = $this->_getEmails(self::XML_PATH_EMAIL_COPY_TO);
|
40 |
+
$copyMethod = Mage::getStoreConfig(self::XML_PATH_EMAIL_COPY_METHOD, $storeId);
|
41 |
+
// Check if at least one recepient is found
|
42 |
+
if (!$notifyCustomer && !$copyTo) {
|
43 |
+
return $this;
|
44 |
+
}
|
45 |
+
|
46 |
+
// Start store emulation process
|
47 |
+
$appEmulation = Mage::getSingleton('core/app_emulation');
|
48 |
+
$initialEnvironmentInfo = $appEmulation->startEnvironmentEmulation($storeId);
|
49 |
+
|
50 |
+
try {
|
51 |
+
// Retrieve specified view block from appropriate design package (depends on emulated store)
|
52 |
+
$paymentBlock = Mage::helper('payment')->getInfoBlock($order->getPayment())
|
53 |
+
->setIsSecureMode(true);
|
54 |
+
$paymentBlock->getMethod()->setStore($storeId);
|
55 |
+
$paymentBlockHtml = $paymentBlock->toHtml();
|
56 |
+
} catch (Exception $exception) {
|
57 |
+
// Stop store emulation process
|
58 |
+
$appEmulation->stopEnvironmentEmulation($initialEnvironmentInfo);
|
59 |
+
throw $exception;
|
60 |
+
}
|
61 |
+
|
62 |
+
// Stop store emulation process
|
63 |
+
$appEmulation->stopEnvironmentEmulation($initialEnvironmentInfo);
|
64 |
+
|
65 |
+
// Retrieve corresponding email template id and customer name
|
66 |
+
if ($order->getCustomerIsGuest()) {
|
67 |
+
$templateId = Mage::getStoreConfig(self::XML_PATH_EMAIL_GUEST_TEMPLATE, $storeId);
|
68 |
+
$customerName = $order->getBillingAddress()->getName();
|
69 |
+
} else {
|
70 |
+
$templateId = Mage::getStoreConfig(self::XML_PATH_EMAIL_TEMPLATE, $storeId);
|
71 |
+
$customerName = $order->getCustomerName();
|
72 |
+
}
|
73 |
+
|
74 |
+
$mailer = Mage::getModel('pdfpro/email_template_mailer');
|
75 |
+
if ($notifyCustomer) {
|
76 |
+
$emailInfo = Mage::getModel('core/email_info');
|
77 |
+
$emailInfo->addTo($order->getCustomerEmail(), $customerName);
|
78 |
+
if ($copyTo && $copyMethod == 'bcc') {
|
79 |
+
// Add bcc to customer email
|
80 |
+
foreach ($copyTo as $email) {
|
81 |
+
$emailInfo->addBcc($email);
|
82 |
+
}
|
83 |
+
}
|
84 |
+
$mailer->addEmailInfo($emailInfo);
|
85 |
+
}
|
86 |
+
|
87 |
+
// Email copies are sent as separated emails if their copy method is 'copy' or a customer should not be notified
|
88 |
+
if ($copyTo && ($copyMethod == 'copy' || !$notifyCustomer)) {
|
89 |
+
foreach ($copyTo as $email) {
|
90 |
+
$emailInfo = Mage::getModel('core/email_info');
|
91 |
+
$emailInfo->addTo($email);
|
92 |
+
$mailer->addEmailInfo($emailInfo);
|
93 |
+
}
|
94 |
+
}
|
95 |
+
|
96 |
+
// Set all required params and send emails
|
97 |
+
$mailer->setSender(Mage::getStoreConfig(self::XML_PATH_EMAIL_IDENTITY, $storeId));
|
98 |
+
$mailer->setStoreId($storeId);
|
99 |
+
$mailer->setTemplateId($templateId);
|
100 |
+
$mailer->setTemplateParams(array(
|
101 |
+
'order' => $order,
|
102 |
+
'shipment' => $this,
|
103 |
+
'comment' => $comment,
|
104 |
+
'billing' => $order->getBillingAddress(),
|
105 |
+
'payment_html' => $paymentBlockHtml
|
106 |
+
)
|
107 |
+
);
|
108 |
+
/* Attach Invoice PDF in email */
|
109 |
+
$shipmentData = Mage::getModel('pdfpro/order_shipment')->initShipmentData($this);
|
110 |
+
try{
|
111 |
+
$result = Mage::helper('pdfpro')->initPdf(array($shipmentData),'shipment');
|
112 |
+
if($result['success']){
|
113 |
+
$mailer->setPdf(array('filename'=>Mage::helper('pdfpro')->getFileName('shipment',$this).'.pdf', 'content'=>$result['content']));
|
114 |
+
}else{
|
115 |
+
Mage::log($result['msg']);
|
116 |
+
}
|
117 |
+
}catch(Exception $e){
|
118 |
+
Mage::log($e->getMessage());
|
119 |
+
}
|
120 |
+
$mailer->send();
|
121 |
+
|
122 |
+
return $this;
|
123 |
+
}
|
124 |
+
|
125 |
+
public function sendEmailForAdmin($notifyCustomer=true,$comment='', $attachPdf = true){
|
126 |
+
$order = $this->getOrder();
|
127 |
+
$storeId = $order->getStore()->getId();
|
128 |
+
|
129 |
+
if (!Mage::helper('sales')->canSendNewShipmentEmail($storeId)) {
|
130 |
+
return $this;
|
131 |
+
}
|
132 |
+
// Get the destination email addresses to send copies to
|
133 |
+
$copyTo = $this->_getEmails(self::XML_PATH_EMAIL_COPY_TO);
|
134 |
+
$copyMethod = Mage::getStoreConfig(self::XML_PATH_EMAIL_COPY_METHOD, $storeId);
|
135 |
+
// Check if at least one recepient is found
|
136 |
+
if (!$copyTo) {
|
137 |
+
return $this;
|
138 |
+
}
|
139 |
+
|
140 |
+
// Start store emulation process
|
141 |
+
$appEmulation = Mage::getSingleton('core/app_emulation');
|
142 |
+
$initialEnvironmentInfo = $appEmulation->startEnvironmentEmulation($storeId);
|
143 |
+
|
144 |
+
try {
|
145 |
+
// Retrieve specified view block from appropriate design package (depends on emulated store)
|
146 |
+
$paymentBlock = Mage::helper('payment')->getInfoBlock($order->getPayment())
|
147 |
+
->setIsSecureMode(true);
|
148 |
+
$paymentBlock->getMethod()->setStore($storeId);
|
149 |
+
$paymentBlockHtml = $paymentBlock->toHtml();
|
150 |
+
} catch (Exception $exception) {
|
151 |
+
// Stop store emulation process
|
152 |
+
$appEmulation->stopEnvironmentEmulation($initialEnvironmentInfo);
|
153 |
+
throw $exception;
|
154 |
+
}
|
155 |
+
|
156 |
+
// Stop store emulation process
|
157 |
+
$appEmulation->stopEnvironmentEmulation($initialEnvironmentInfo);
|
158 |
+
|
159 |
+
// Retrieve corresponding email template id and customer name
|
160 |
+
if ($order->getCustomerIsGuest()) {
|
161 |
+
$templateId = Mage::getStoreConfig(self::XML_PATH_EMAIL_GUEST_TEMPLATE, $storeId);
|
162 |
+
} else {
|
163 |
+
$templateId = Mage::getStoreConfig(self::XML_PATH_EMAIL_TEMPLATE, $storeId);
|
164 |
+
}
|
165 |
+
|
166 |
+
$mailer = Mage::getModel('pdfpro/email_template_mailer');
|
167 |
+
|
168 |
+
// Email copies are sent as separated emails if their copy method is 'copy' or a customer should not be notified
|
169 |
+
foreach ($copyTo as $email) {
|
170 |
+
$emailInfo = Mage::getModel('core/email_info');
|
171 |
+
$emailInfo->addTo($email);
|
172 |
+
$mailer->addEmailInfo($emailInfo);
|
173 |
+
}
|
174 |
+
|
175 |
+
// Set all required params and send emails
|
176 |
+
$mailer->setSender(Mage::getStoreConfig(self::XML_PATH_EMAIL_IDENTITY, $storeId));
|
177 |
+
$mailer->setStoreId($storeId);
|
178 |
+
$mailer->setTemplateId($templateId);
|
179 |
+
$mailer->setTemplateParams(array(
|
180 |
+
'order' => $order,
|
181 |
+
'shipment' => $this,
|
182 |
+
'comment' => $comment,
|
183 |
+
'billing' => $order->getBillingAddress(),
|
184 |
+
'payment_html' => $paymentBlockHtml
|
185 |
+
)
|
186 |
+
);
|
187 |
+
if($attachPdf){
|
188 |
+
/* Attach Invoice PDF in email */
|
189 |
+
$shipmentData = Mage::getModel('pdfpro/order_shipment')->initShipmentData($this);
|
190 |
+
try{
|
191 |
+
$result = Mage::helper('pdfpro')->initPdf(array($shipmentData),'shipment');
|
192 |
+
if($result['success']){
|
193 |
+
$mailer->setPdf(array('filename'=>Mage::helper('pdfpro')->getFileName('shipment',$this).'.pdf', 'content'=>$result['content']));
|
194 |
+
}else{
|
195 |
+
Mage::log($result['msg']);
|
196 |
+
}
|
197 |
+
}catch(Exception $e){
|
198 |
+
Mage::log($e->getMessage());
|
199 |
+
}
|
200 |
+
}
|
201 |
+
$mailer->send();
|
202 |
+
|
203 |
+
return $this;
|
204 |
+
}
|
205 |
+
|
206 |
+
public function sendEmailForCustomer($notifyCustomer=true,$comment='', $attachPdf = true){
|
207 |
+
$order = $this->getOrder();
|
208 |
+
$storeId = $order->getStore()->getId();
|
209 |
+
|
210 |
+
if (!Mage::helper('sales')->canSendNewShipmentEmail($storeId)) {
|
211 |
+
return $this;
|
212 |
+
}
|
213 |
+
// Get the destination email addresses to send copies to
|
214 |
+
$copyTo = $this->_getEmails(self::XML_PATH_EMAIL_COPY_TO);
|
215 |
+
$copyMethod = Mage::getStoreConfig(self::XML_PATH_EMAIL_COPY_METHOD, $storeId);
|
216 |
+
// Check if at least one recepient is found
|
217 |
+
if (!$notifyCustomer) {
|
218 |
+
return $this;
|
219 |
+
}
|
220 |
+
|
221 |
+
// Start store emulation process
|
222 |
+
$appEmulation = Mage::getSingleton('core/app_emulation');
|
223 |
+
$initialEnvironmentInfo = $appEmulation->startEnvironmentEmulation($storeId);
|
224 |
+
|
225 |
+
try {
|
226 |
+
// Retrieve specified view block from appropriate design package (depends on emulated store)
|
227 |
+
$paymentBlock = Mage::helper('payment')->getInfoBlock($order->getPayment())
|
228 |
+
->setIsSecureMode(true);
|
229 |
+
$paymentBlock->getMethod()->setStore($storeId);
|
230 |
+
$paymentBlockHtml = $paymentBlock->toHtml();
|
231 |
+
} catch (Exception $exception) {
|
232 |
+
// Stop store emulation process
|
233 |
+
$appEmulation->stopEnvironmentEmulation($initialEnvironmentInfo);
|
234 |
+
throw $exception;
|
235 |
+
}
|
236 |
+
|
237 |
+
// Stop store emulation process
|
238 |
+
$appEmulation->stopEnvironmentEmulation($initialEnvironmentInfo);
|
239 |
+
|
240 |
+
// Retrieve corresponding email template id and customer name
|
241 |
+
if ($order->getCustomerIsGuest()) {
|
242 |
+
$templateId = Mage::getStoreConfig(self::XML_PATH_EMAIL_GUEST_TEMPLATE, $storeId);
|
243 |
+
$customerName = $order->getBillingAddress()->getName();
|
244 |
+
} else {
|
245 |
+
$templateId = Mage::getStoreConfig(self::XML_PATH_EMAIL_TEMPLATE, $storeId);
|
246 |
+
$customerName = $order->getCustomerName();
|
247 |
+
}
|
248 |
+
|
249 |
+
$mailer = Mage::getModel('pdfpro/email_template_mailer');
|
250 |
+
if ($notifyCustomer) {
|
251 |
+
$emailInfo = Mage::getModel('core/email_info');
|
252 |
+
$emailInfo->addTo($order->getCustomerEmail(), $customerName);
|
253 |
+
$mailer->addEmailInfo($emailInfo);
|
254 |
+
}
|
255 |
+
|
256 |
+
// Set all required params and send emails
|
257 |
+
$mailer->setSender(Mage::getStoreConfig(self::XML_PATH_EMAIL_IDENTITY, $storeId));
|
258 |
+
$mailer->setStoreId($storeId);
|
259 |
+
$mailer->setTemplateId($templateId);
|
260 |
+
$mailer->setTemplateParams(array(
|
261 |
+
'order' => $order,
|
262 |
+
'shipment' => $this,
|
263 |
+
'comment' => $comment,
|
264 |
+
'billing' => $order->getBillingAddress(),
|
265 |
+
'payment_html' => $paymentBlockHtml
|
266 |
+
)
|
267 |
+
);
|
268 |
+
if($attachPdf){
|
269 |
+
/* Attach Invoice PDF in email */
|
270 |
+
$shipmentData = Mage::getModel('pdfpro/order_shipment')->initShipmentData($this);
|
271 |
+
try{
|
272 |
+
$result = Mage::helper('pdfpro')->initPdf(array($shipmentData),'shipment');
|
273 |
+
if($result['success']){
|
274 |
+
$mailer->setPdf(array('filename'=>Mage::helper('pdfpro')->getFileName('shipment',$this).'.pdf', 'content'=>$result['content']));
|
275 |
+
}else{
|
276 |
+
Mage::log($result['msg']);
|
277 |
+
}
|
278 |
+
}catch(Exception $e){
|
279 |
+
Mage::log($e->getMessage());
|
280 |
+
}
|
281 |
+
}
|
282 |
+
$mailer->send();
|
283 |
+
|
284 |
+
return $this;
|
285 |
+
}
|
286 |
+
}
|
app/code/community/VES/PdfPro/Model/Source/Attach.php
ADDED
@@ -0,0 +1,19 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
class VES_PdfPro_Model_Source_Attach
|
4 |
+
{
|
5 |
+
const ATTACH_TYPE_NO = 0;
|
6 |
+
const ATTACH_TYPE_BOTH = 1;
|
7 |
+
const ATTACH_TYPE_CUSTOMER = 2;
|
8 |
+
const ATTACH_TYPE_ADMIN = 3;
|
9 |
+
|
10 |
+
public function toOptionArray()
|
11 |
+
{
|
12 |
+
return array(
|
13 |
+
self::ATTACH_TYPE_NO =>Mage::helper('pdfpro')->__('No'),
|
14 |
+
self::ATTACH_TYPE_CUSTOMER =>Mage::helper('pdfpro')->__('Customer'),
|
15 |
+
self::ATTACH_TYPE_ADMIN =>Mage::helper('pdfpro')->__('Admin'),
|
16 |
+
self::ATTACH_TYPE_BOTH =>Mage::helper('pdfpro')->__('Customer and Admin'),
|
17 |
+
);
|
18 |
+
}
|
19 |
+
}
|
app/code/community/VES/PdfPro/Model/Source/Communication/Method.php
ADDED
@@ -0,0 +1,16 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
class VES_PdfPro_Model_Source_Communication_Method
|
4 |
+
{
|
5 |
+
public function toOptionArray()
|
6 |
+
{
|
7 |
+
$methods = Mage::getConfig()->getNode('global/easypdf_communication_method')->asArray();
|
8 |
+
|
9 |
+
$options = array();
|
10 |
+
$options[] = array('value'=>'', 'label'=>'');
|
11 |
+
foreach($methods as $key => $method){
|
12 |
+
$options[] = array('value'=>$key, 'label'=>$method['title']);
|
13 |
+
}
|
14 |
+
return $options;
|
15 |
+
}
|
16 |
+
}
|
app/code/community/VES/PdfPro/Model/Source/Key.php
ADDED
@@ -0,0 +1,15 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
class VES_PdfPro_Model_Source_Key
|
4 |
+
{
|
5 |
+
public function toOptionArray()
|
6 |
+
{
|
7 |
+
$collection = Mage::getModel('pdfpro/key')->getCollection();
|
8 |
+
$options = array();
|
9 |
+
$options[] = array('value'=>'','label'=>'');
|
10 |
+
foreach($collection as $option){
|
11 |
+
$options[] = array('value'=>$option->getId(), 'label'=>$option->getApiKey());
|
12 |
+
}
|
13 |
+
return $options;
|
14 |
+
}
|
15 |
+
}
|
app/code/community/VES/PdfPro/Model/Source/Processor.php
ADDED
@@ -0,0 +1,15 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
class VES_PdfPro_Model_Source_Processor
|
4 |
+
{
|
5 |
+
public function toOptionArray()
|
6 |
+
{
|
7 |
+
$processors = Mage::getConfig()->getNode('global/easypdf_processors')->asArray();
|
8 |
+
|
9 |
+
$options = array();
|
10 |
+
foreach($processors as $key => $processor){
|
11 |
+
$options[] = array('value'=>$processor['model'], 'label'=>$processor['title']);
|
12 |
+
}
|
13 |
+
return $options;
|
14 |
+
}
|
15 |
+
}
|
app/code/community/VES/PdfPro/Model/System/Config/Backend/Easypdf.php
ADDED
@@ -0,0 +1,6 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
class VES_PdfPro_Model_System_Config_Backend_Easypdf extends Mage_Core_Model_Abstract
|
4 |
+
{
|
5 |
+
|
6 |
+
}
|
app/code/community/VES/PdfPro/controllers/Adminhtml/KeyController.php
ADDED
@@ -0,0 +1,101 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* VES_PdfPro_Adminhtml_KeyController
|
4 |
+
*
|
5 |
+
* @author VnEcoms Team <support@vnecoms.com>
|
6 |
+
* @website http://www.vnecoms.com
|
7 |
+
*/
|
8 |
+
|
9 |
+
class VES_PdfPro_Adminhtml_KeyController extends Mage_Adminhtml_Controller_Action
|
10 |
+
{
|
11 |
+
protected function _initAction() {
|
12 |
+
$this->loadLayout()
|
13 |
+
->_setActiveMenu('pdfpro/api_key')
|
14 |
+
->_addBreadcrumb(Mage::helper('adminhtml')->__('Easy PDF'), Mage::helper('adminhtml')->__('Manage Keys'));
|
15 |
+
|
16 |
+
return $this;
|
17 |
+
}
|
18 |
+
|
19 |
+
public function indexAction(){
|
20 |
+
$this->_getSession()->addNotice('Please register an account at <a href="http://www.easypdfinvoice.com">www.easypdfinvoice.com</a> to get a Free API Key. You can get more information from our <a href="http://www.easypdfinvoice.com/User_Manual.pdf">User Manual</a>.');
|
21 |
+
$this->_initAction();
|
22 |
+
$this->renderLayout();
|
23 |
+
}
|
24 |
+
|
25 |
+
public function editAction() {
|
26 |
+
$id = $this->getRequest()->getParam('id');
|
27 |
+
$model = Mage::getModel('pdfpro/key')->load($id);
|
28 |
+
if ($model->getId() || $id == 0) {
|
29 |
+
$data = Mage::getSingleton('adminhtml/session')->getFormData(true);
|
30 |
+
if (!empty($data)) {
|
31 |
+
$model->setData($data);
|
32 |
+
}
|
33 |
+
|
34 |
+
Mage::register('key_data', $model);
|
35 |
+
$this->loadLayout();
|
36 |
+
$this->_setActiveMenu('pdfpro/api_key');
|
37 |
+
|
38 |
+
$this->_addBreadcrumb(Mage::helper('adminhtml')->__('Easy PDF'), Mage::helper('adminhtml')->__('Easy PDF'));
|
39 |
+
$this->_addBreadcrumb(Mage::helper('adminhtml')->__('Add new API Key'), Mage::helper('adminhtml')->__('Add new API Key'));
|
40 |
+
|
41 |
+
$this->getLayout()->getBlock('head')->setCanLoadExtJs(true);
|
42 |
+
|
43 |
+
$this->renderLayout();
|
44 |
+
} else {
|
45 |
+
Mage::getSingleton('adminhtml/session')->addError(Mage::helper('pdfpro')->__('Group does not exist'));
|
46 |
+
$this->_redirect('*/*/');
|
47 |
+
}
|
48 |
+
}
|
49 |
+
|
50 |
+
public function newAction() {
|
51 |
+
$this->_forward('edit');
|
52 |
+
}
|
53 |
+
|
54 |
+
public function saveAction() {
|
55 |
+
$data = $this->getRequest()->getParams();
|
56 |
+
$data['api_key'] = trim($data['api_key']);
|
57 |
+
$model = Mage::getModel('pdfpro/key');
|
58 |
+
$data['store_ids'] = implode(',', $data['store_ids']);
|
59 |
+
$data['customer_group_ids'] = implode(',', $data['customer_group_ids']);
|
60 |
+
$model->setData($data)
|
61 |
+
->setId($this->getRequest()->getParam('id'));
|
62 |
+
Mage::dispatchEvent('ves_pdfpro_apikey_form_save_before',array('model'=>$model));
|
63 |
+
try {
|
64 |
+
$model->save();
|
65 |
+
Mage::dispatchEvent('ves_pdfpro_apikey_form_save_after',array('model'=>$model));
|
66 |
+
|
67 |
+
Mage::getSingleton('adminhtml/session')->addSuccess(Mage::helper('pdfpro')->__('The API Key has been saved.'));
|
68 |
+
Mage::getSingleton('adminhtml/session')->setGroupData(false);
|
69 |
+
if ($this->getRequest()->getParam('back')) {
|
70 |
+
$this->_redirect('*/*/edit', array('id' => $model->getId()));
|
71 |
+
return;
|
72 |
+
}
|
73 |
+
$this->_redirect('*/*/');
|
74 |
+
return;
|
75 |
+
} catch (Exception $e) {
|
76 |
+
Mage::getSingleton('adminhtml/session')->addError($e->getMessage());
|
77 |
+
Mage::getSingleton('adminhtml/session')->setGroupData($data);
|
78 |
+
$this->_redirect('*/*/edit', array('id' => $this->getRequest()->getParam('id')));
|
79 |
+
return;
|
80 |
+
}
|
81 |
+
|
82 |
+
}
|
83 |
+
|
84 |
+
public function deleteAction() {
|
85 |
+
if( $this->getRequest()->getParam('id') > 0 ) {
|
86 |
+
try {
|
87 |
+
$model = Mage::getModel('pdfpro/key');
|
88 |
+
|
89 |
+
$model->setId($this->getRequest()->getParam('id'))
|
90 |
+
->delete();
|
91 |
+
|
92 |
+
Mage::getSingleton('adminhtml/session')->addSuccess(Mage::helper('adminhtml')->__('Item was successfully deleted'));
|
93 |
+
$this->_redirect('*/*/');
|
94 |
+
} catch (Exception $e) {
|
95 |
+
Mage::getSingleton('adminhtml/session')->addError($e->getMessage());
|
96 |
+
$this->_redirect('*/*/edit', array('id' => $this->getRequest()->getParam('id')));
|
97 |
+
}
|
98 |
+
}
|
99 |
+
$this->_redirect('*/*/');
|
100 |
+
}
|
101 |
+
}
|
app/code/community/VES/PdfPro/controllers/Adminhtml/PrintController.php
ADDED
@@ -0,0 +1,328 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* VES_PdfPro_Adminhtml_PrintController
|
4 |
+
*
|
5 |
+
* @author VnEcoms Team <support@vnecoms.com>
|
6 |
+
* @website http://www.vnecoms.com
|
7 |
+
*/
|
8 |
+
|
9 |
+
class VES_PdfPro_Adminhtml_PrintController extends Mage_Adminhtml_Controller_Action
|
10 |
+
{
|
11 |
+
/**
|
12 |
+
* Print an Order
|
13 |
+
*/
|
14 |
+
public function orderAction(){
|
15 |
+
$orderId = $this->getRequest()->getParam('order_id');
|
16 |
+
if (empty($orderId)) {
|
17 |
+
Mage::getSingleton('adminhtml/session')->addError('There is no order to process');
|
18 |
+
$this->_redirect('adminhtml/sales_order');
|
19 |
+
return;
|
20 |
+
}
|
21 |
+
|
22 |
+
$order = Mage::getModel('sales/order')->load($orderId);
|
23 |
+
if(!$order->getId()){$this->_forward('no-route');return;}
|
24 |
+
$orderData= Mage::getModel('pdfpro/order')->initOrderData($order);
|
25 |
+
try{
|
26 |
+
$result = Mage::helper('pdfpro')->initPdf(array($orderData),'order');
|
27 |
+
if($result['success']){
|
28 |
+
$this->_prepareDownloadResponse(Mage::helper('pdfpro')->getFileName('order',$order).'.pdf', $result['content']);
|
29 |
+
}else{
|
30 |
+
throw new Mage_Core_Exception($result['msg']);
|
31 |
+
}
|
32 |
+
}catch(Exception $e){
|
33 |
+
Mage::getSingleton('core/session')->addError($e->getMessage());
|
34 |
+
$this->_redirect('adminhtml/sales_order/view',array('order_id'=>$orderId));
|
35 |
+
}
|
36 |
+
}
|
37 |
+
|
38 |
+
/**
|
39 |
+
* Print Orders
|
40 |
+
*/
|
41 |
+
public function ordersAction(){
|
42 |
+
$orderIds = $this->getRequest()->getParam('order_ids');
|
43 |
+
if (empty($orderIds)) {
|
44 |
+
Mage::getSingleton('adminhtml/session')->addError('There is no order to process');
|
45 |
+
$this->_redirect('adminhtml/sales_order');
|
46 |
+
return;
|
47 |
+
}
|
48 |
+
$orderDatas = array();
|
49 |
+
foreach($orderIds as $orderId){
|
50 |
+
$order = Mage::getModel('sales/order')->load($orderId);
|
51 |
+
if(!$order->getId()){continue;}
|
52 |
+
$orderDatas[] = Mage::getModel('pdfpro/order')->initOrderData($order);
|
53 |
+
}
|
54 |
+
try{
|
55 |
+
$result = Mage::helper('pdfpro')->initPdf($orderDatas,'order');
|
56 |
+
if($result['success']){
|
57 |
+
$this->_prepareDownloadResponse(Mage::helper('pdfpro')->getFileName('orders').'.pdf', $result['content']);
|
58 |
+
}else{
|
59 |
+
throw new Mage_Core_Exception($result['msg']);
|
60 |
+
}
|
61 |
+
}catch(Exception $e){
|
62 |
+
Mage::getSingleton('core/session')->addError($e->getMessage());
|
63 |
+
$this->_redirect('adminhtml/sales_order/index');
|
64 |
+
}
|
65 |
+
}
|
66 |
+
|
67 |
+
|
68 |
+
/**
|
69 |
+
* Print An Invoice
|
70 |
+
*/
|
71 |
+
public function invoiceAction(){
|
72 |
+
$invoiceId = $this->getRequest()->getParam('invoice_id');
|
73 |
+
$invoice = Mage::getModel('sales/order_invoice')->load($invoiceId);
|
74 |
+
if (!$invoice->getId()) {
|
75 |
+
$this->_getSession()->addError($this->__('The invoice no longer exists.'));
|
76 |
+
$this->_forward('no-route');
|
77 |
+
return;
|
78 |
+
}
|
79 |
+
$invoiceData = Mage::getModel('pdfpro/order_invoice')->initInvoiceData($invoice);
|
80 |
+
try{
|
81 |
+
$result = Mage::helper('pdfpro')->initPdf(array($invoiceData));
|
82 |
+
if($result['success']){
|
83 |
+
$this->_prepareDownloadResponse(Mage::helper('pdfpro')->getFileName('invoice',$invoice).'.pdf', $result['content']);
|
84 |
+
}else{
|
85 |
+
throw new Mage_Core_Exception($result['msg']);
|
86 |
+
}
|
87 |
+
}catch(Exception $e){
|
88 |
+
Mage::getSingleton('adminhtml/session')->addError($e->getMessage());
|
89 |
+
$this->_redirect('adminhtml/sales_order_invoice/view',array('invoice_id'=>$invoiceId));
|
90 |
+
}
|
91 |
+
}
|
92 |
+
|
93 |
+
|
94 |
+
/**
|
95 |
+
* Print invoices
|
96 |
+
*/
|
97 |
+
public function invoicesAction(){
|
98 |
+
$orderIds = $this->getRequest()->getParam('order_ids');
|
99 |
+
$invoiceIds = $this->getRequest()->getParam('invoice_ids');
|
100 |
+
$flag = false;
|
101 |
+
if (!empty($orderIds) || !empty($invoiceIds)) {
|
102 |
+
$invoiceDatas = array();
|
103 |
+
$invoices = Mage::getResourceModel('sales/order_invoice_collection')->addAttributeToSelect('*');
|
104 |
+
if(!empty($orderIds)){
|
105 |
+
$invoices->addFieldToFilter('order_id',array('in',$orderIds));
|
106 |
+
}else if(!empty($invoiceIds)){
|
107 |
+
$invoices->addFieldToFilter('entity_id',array('in',$invoiceIds));
|
108 |
+
}
|
109 |
+
$invoices->load();
|
110 |
+
if($invoices->count() > 0) $flag = true;
|
111 |
+
foreach($invoices as $invoice){
|
112 |
+
$invoiceDatas[] = Mage::getModel('pdfpro/order_invoice')->initInvoiceData($invoice);
|
113 |
+
}
|
114 |
+
if ($flag) {
|
115 |
+
try{
|
116 |
+
$result = Mage::helper('pdfpro')->initPdf($invoiceDatas);
|
117 |
+
if($result['success']){
|
118 |
+
$this->_prepareDownloadResponse(Mage::helper('pdfpro')->getFileName('invoices').'.pdf', $result['content']);
|
119 |
+
}else{
|
120 |
+
throw new Mage_Core_Exception($result['msg']);
|
121 |
+
}
|
122 |
+
}catch(Exception $e){
|
123 |
+
Mage::getSingleton('adminhtml/session')->addError($e->getMessage());
|
124 |
+
if(!empty($orderIds)) $this->_redirect('adminhtml/sales_order/index');
|
125 |
+
else $this->_redirect('adminhtml/sales_invoice/index');
|
126 |
+
}
|
127 |
+
} else {
|
128 |
+
if(!empty($orderIds)){
|
129 |
+
$this->_getSession()->addError($this->__('There are no printable documents related to selected orders.'));
|
130 |
+
}else{
|
131 |
+
$this->_getSession()->addError($this->__('There are no printable documents related to selected invoices.'));
|
132 |
+
}
|
133 |
+
if(!empty($orderIds)) $this->_redirect('adminhtml/sales_order/index');
|
134 |
+
else $this->_redirect('adminhtml/sales_invoice/index');
|
135 |
+
}
|
136 |
+
}
|
137 |
+
}
|
138 |
+
|
139 |
+
/**
|
140 |
+
* Print A Packingslip
|
141 |
+
*/
|
142 |
+
public function shipmentAction(){
|
143 |
+
$shipmentId = $this->getRequest()->getParam('shipment_id');
|
144 |
+
$shipment = Mage::getModel('sales/order_shipment')->load($shipmentId);
|
145 |
+
if (!$shipment->getId()) {
|
146 |
+
$this->_getSession()->addError($this->__('The shipment no longer exists.'));
|
147 |
+
$this->_forward('no-route');
|
148 |
+
return;
|
149 |
+
}
|
150 |
+
$shipmentData = Mage::getModel('pdfpro/order_shipment')->initShipmentData($shipment);
|
151 |
+
try{
|
152 |
+
$result = Mage::helper('pdfpro')->initPdf(array($shipmentData),'shipment');
|
153 |
+
if($result['success']){
|
154 |
+
$this->_prepareDownloadResponse(Mage::helper('pdfpro')->getFileName('shipment',$shipment).'.pdf', $result['content']);
|
155 |
+
}else{
|
156 |
+
throw new Mage_Core_Exception($result['msg']);
|
157 |
+
}
|
158 |
+
}catch(Exception $e){
|
159 |
+
Mage::getSingleton('adminhtml/session')->addError($e->getMessage());
|
160 |
+
$this->_redirect('adminhtml/sales_order_shipment/view',array('shipment_id'=>$shipmentId));
|
161 |
+
}
|
162 |
+
}
|
163 |
+
|
164 |
+
/**
|
165 |
+
* Print Packingslips
|
166 |
+
*/
|
167 |
+
public function shipmentsAction(){
|
168 |
+
$orderIds = $this->getRequest()->getPost('order_ids');
|
169 |
+
$shipmentIds = $this->getRequest()->getParam('shipment_ids');
|
170 |
+
if (!empty($orderIds) || !empty($shipmentIds)) {
|
171 |
+
$shipments = Mage::getResourceModel('sales/order_shipment_collection')->addAttributeToSelect('*');
|
172 |
+
if(!empty($orderIds)){
|
173 |
+
$shipments->addFieldToFilter('order_id',array('in',$orderIds));
|
174 |
+
}else if(!empty($shipmentIds)){
|
175 |
+
$shipments->addFieldToFilter('entity_id',array('in',$shipmentIds));
|
176 |
+
}
|
177 |
+
$shipments->load();
|
178 |
+
if ($shipments->getSize()) {
|
179 |
+
$shipmentDatas = array();
|
180 |
+
foreach($shipments as $shipment){
|
181 |
+
$shipmentDatas[] = Mage::getModel('pdfpro/order_shipment')->initShipmentData($shipment);
|
182 |
+
}
|
183 |
+
try{
|
184 |
+
$result = Mage::helper('pdfpro')->initPdf($shipmentDatas,'shipment');
|
185 |
+
if($result['success']){
|
186 |
+
$this->_prepareDownloadResponse(Mage::helper('pdfpro')->getFileName('shipments').'.pdf', $result['content']);
|
187 |
+
}else{
|
188 |
+
throw new Mage_Core_Exception($result['msg']);
|
189 |
+
}
|
190 |
+
}catch(Exception $e){
|
191 |
+
Mage::getSingleton('adminhtml/session')->addError($e->getMessage());
|
192 |
+
if(!empty($orderIds)) $this->_redirect('adminhtml/sales_order/index');
|
193 |
+
else $this->_redirect('adminhtml/sales_shipment/index');
|
194 |
+
}
|
195 |
+
} else {
|
196 |
+
$this->_getSession()->addError($this->__('There are no printable documents related to selected orders.'));
|
197 |
+
if(!empty($orderIds)) $this->_redirect('adminhtml/sales_order/index');
|
198 |
+
else $this->_redirect('adminhtml/sales_shipment/index');
|
199 |
+
}
|
200 |
+
}
|
201 |
+
}
|
202 |
+
|
203 |
+
/**
|
204 |
+
* Print A Packingslip
|
205 |
+
*/
|
206 |
+
public function creditmemoAction(){
|
207 |
+
$creditmemoId = $this->getRequest()->getParam('creditmemo_id');
|
208 |
+
$creditmemo = Mage::getModel('sales/order_creditmemo')->load($creditmemoId);
|
209 |
+
if (!$creditmemo->getId()) {
|
210 |
+
$this->_getSession()->addError($this->__('The shipment no longer exists.'));
|
211 |
+
$this->_forward('no-route');
|
212 |
+
return;
|
213 |
+
}
|
214 |
+
$creditmemoData = Mage::getModel('pdfpro/order_creditmemo')->initCreditmemoData($creditmemo);
|
215 |
+
try{
|
216 |
+
$result = Mage::helper('pdfpro')->initPdf(array($creditmemoData),'creditmemo');
|
217 |
+
if($result['success']){
|
218 |
+
$this->_prepareDownloadResponse(Mage::helper('pdfpro')->getFileName('creditmemo',$creditmemo).'.pdf', $result['content']);
|
219 |
+
}else{
|
220 |
+
throw new Mage_Core_Exception($result['msg']);
|
221 |
+
}
|
222 |
+
}catch(Exception $e){
|
223 |
+
Mage::getSingleton('adminhtml/session')->addError($e->getMessage());
|
224 |
+
$this->_redirect('adminhtml/sales_order_creditmemo/view',array('creditmemo_id'=>$creditmemoId));
|
225 |
+
}
|
226 |
+
}
|
227 |
+
|
228 |
+
/**
|
229 |
+
* Print Packingslips
|
230 |
+
*/
|
231 |
+
public function creditmemosAction(){
|
232 |
+
$orderIds = $this->getRequest()->getPost('order_ids');
|
233 |
+
$creditmemoIds = $this->getRequest()->getParam('creditmemo_ids');
|
234 |
+
if (!empty($orderIds) || !empty($creditmemoIds)) {
|
235 |
+
$creditmemos = Mage::getResourceModel('sales/order_creditmemo_collection')->addAttributeToSelect('*');
|
236 |
+
if(!empty($orderIds)){
|
237 |
+
$creditmemos->addFieldToFilter('order_id',array('in',$orderIds));
|
238 |
+
}else if(!empty($creditmemoIds)){
|
239 |
+
$creditmemos->addFieldToFilter('entity_id',array('in',$creditmemoIds));
|
240 |
+
}
|
241 |
+
$creditmemos->load();
|
242 |
+
if ($creditmemos->getSize()) {
|
243 |
+
$creditmemoDatas = array();
|
244 |
+
foreach($creditmemos as $creditmemo){
|
245 |
+
$creditmemoDatas[] = Mage::getModel('pdfpro/order_creditmemo')->initCreditmemoData($creditmemo);
|
246 |
+
}
|
247 |
+
try{
|
248 |
+
$result = Mage::helper('pdfpro')->initPdf($creditmemoDatas,'creditmemo');
|
249 |
+
if($result['success']){
|
250 |
+
$this->_prepareDownloadResponse(Mage::helper('pdfpro')->getFileName('creditmemos').'.pdf', $result['content']);
|
251 |
+
}else{
|
252 |
+
throw new Mage_Core_Exception($result['msg']);
|
253 |
+
}
|
254 |
+
}catch(Exception $e){
|
255 |
+
Mage::getSingleton('adminhtml/session')->addError($e->getMessage());
|
256 |
+
if(!empty($orderIds)) $this->_redirect('adminhtml/sales_order/index');
|
257 |
+
else $this->_redirect('adminhtml/sales_creditmemo/index');
|
258 |
+
}
|
259 |
+
} else {
|
260 |
+
$this->_getSession()->addError($this->__('There are no printable documents related to selected orders.'));
|
261 |
+
if(!empty($orderIds)) $this->_redirect('adminhtml/sales_order/index');
|
262 |
+
else $this->_redirect('adminhtml/sales_creditmemo/index');
|
263 |
+
}
|
264 |
+
}
|
265 |
+
}
|
266 |
+
/**
|
267 |
+
* Print All
|
268 |
+
*/
|
269 |
+
public function allAction(){
|
270 |
+
$orderIds = $this->getRequest()->getPost('order_ids');
|
271 |
+
$data = array();
|
272 |
+
$canPrint = false;
|
273 |
+
foreach($orderIds as $orderId){
|
274 |
+
$item = array();
|
275 |
+
$order = Mage::getModel('sales/order')->load($orderId);
|
276 |
+
/*Init order data*/
|
277 |
+
if(Mage::getStoreConfig('pdfpro/config/admin_print_order')){
|
278 |
+
$item['order'][] = Mage::getModel('pdfpro/order')->initOrderData($order);
|
279 |
+
$canPrint = true;
|
280 |
+
}
|
281 |
+
/*Init invoice data*/
|
282 |
+
$invoices = Mage::getResourceModel('sales/order_invoice_collection')->addAttributeToSelect('*')->addFieldToFilter('order_id',$orderId);
|
283 |
+
if($invoices->count() > 0){
|
284 |
+
$invoiceDatas = array();
|
285 |
+
foreach($invoices as $invoice){
|
286 |
+
$invoiceDatas[] = Mage::getModel('pdfpro/order_invoice')->initInvoiceData($invoice);
|
287 |
+
}
|
288 |
+
$item['invoice'] = $invoiceDatas;
|
289 |
+
$canPrint = true;
|
290 |
+
}
|
291 |
+
|
292 |
+
/*Init shipment data*/
|
293 |
+
$shipments = Mage::getResourceModel('sales/order_shipment_collection')->addAttributeToSelect('*')->addFieldToFilter('order_id',$orderId);
|
294 |
+
if($shipments->count() > 0){
|
295 |
+
$shipmentDatas = array();
|
296 |
+
foreach($shipments as $shipment){
|
297 |
+
$shipmentDatas[] = Mage::getModel('pdfpro/order_shipment')->initShipmentData($shipment);
|
298 |
+
}
|
299 |
+
$item['shipment'] = $shipmentDatas;
|
300 |
+
$canPrint = true;
|
301 |
+
}
|
302 |
+
|
303 |
+
/*Init credit memo data*/
|
304 |
+
$creditmemos = Mage::getResourceModel('sales/order_creditmemo_collection')->addAttributeToSelect('*')->addFieldToFilter('order_id',$orderId);
|
305 |
+
if($creditmemos->count() > 0){
|
306 |
+
$creditmemoDatas = array();
|
307 |
+
foreach($creditmemos as $creditmemo){
|
308 |
+
$creditmemoDatas[] = Mage::getModel('pdfpro/order_creditmemo')->initCreditmemoData($creditmemo);
|
309 |
+
}
|
310 |
+
$item['creditmemo'] = $creditmemoDatas;
|
311 |
+
$canPrint = true;
|
312 |
+
}
|
313 |
+
$data[] = $item;
|
314 |
+
}
|
315 |
+
try{
|
316 |
+
if(!$canPrint){throw new Mage_Core_Exception($this->__('There are no printable documents related to selected orders.'));}
|
317 |
+
$result = Mage::helper('pdfpro')->initPdf($data,'all');
|
318 |
+
if($result['success']){
|
319 |
+
$this->_prepareDownloadResponse(Mage::helper('pdfpro')->getFileName('all').'.pdf', $result['content']);
|
320 |
+
}else{
|
321 |
+
throw new Mage_Core_Exception($result['msg']);
|
322 |
+
}
|
323 |
+
}catch(Exception $e){
|
324 |
+
Mage::getSingleton('adminhtml/session')->addError($e->getMessage());
|
325 |
+
$this->_redirect('adminhtml/sales_order/index');
|
326 |
+
}
|
327 |
+
}
|
328 |
+
}
|
app/code/community/VES/PdfPro/controllers/GuestController.php
ADDED
@@ -0,0 +1,285 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* VES_PdfPro_OrderController
|
4 |
+
* @extends Mage_Sales_Controller_Abstract
|
5 |
+
* @extends Mage_Core_Controller_Front_Action parent
|
6 |
+
*
|
7 |
+
* @author VnEcoms Team <support@vnecoms.com>
|
8 |
+
* @website http://www.vnecoms.com
|
9 |
+
*/
|
10 |
+
class VES_PdfPro_GuestController extends VES_PdfPro_Controller_Abstract
|
11 |
+
{
|
12 |
+
/**
|
13 |
+
* Check order view availability
|
14 |
+
*
|
15 |
+
* @param Mage_Sales_Model_Order $order
|
16 |
+
* @return bool
|
17 |
+
*/
|
18 |
+
protected function _canViewOrder($order)
|
19 |
+
{
|
20 |
+
$currentOrder = Mage::registry('current_order');
|
21 |
+
if ($order->getId() && ($order->getId() === $currentOrder->getId())) {
|
22 |
+
return true;
|
23 |
+
}
|
24 |
+
return false;
|
25 |
+
}
|
26 |
+
/**
|
27 |
+
* Try to load valid order and register it
|
28 |
+
*
|
29 |
+
* @param int $orderId
|
30 |
+
* @return bool
|
31 |
+
*/
|
32 |
+
protected function _loadValidOrder($orderId = null)
|
33 |
+
{
|
34 |
+
return Mage::helper('sales/guest')->loadValidOrder();
|
35 |
+
}
|
36 |
+
|
37 |
+
public function printOrderAction(){
|
38 |
+
if (!$this->_loadValidOrder()) {
|
39 |
+
return;
|
40 |
+
}
|
41 |
+
if(!Mage::getStoreConfig('pdfpro/config/enabled') || !Mage::getStoreConfig('pdfpro/config/allow_customer_print')){$this->_forward('no-route');return; }
|
42 |
+
$orderId = $this->getRequest()->getParam('order_id');
|
43 |
+
$order = Mage::getModel('sales/order')->load($orderId);
|
44 |
+
|
45 |
+
$orderData = Mage::getModel('pdfpro/order')->initOrderData($order);
|
46 |
+
try{
|
47 |
+
$result = Mage::helper('pdfpro')->initPdf(array($orderData),'order');
|
48 |
+
if($result['success']){
|
49 |
+
$this->_prepareDownloadResponse('order'.Mage::getSingleton('core/date')->date('Y-m-d_H-i-s').'.pdf', $result['content']);
|
50 |
+
}else{
|
51 |
+
throw new Mage_Core_Exception($result['msg']);
|
52 |
+
}
|
53 |
+
}catch(Exception $e){
|
54 |
+
Mage::getSingleton('core/session')->addError($e->getMessage());
|
55 |
+
$this->_redirect('sales/guest/view' , array('order_id'=>$orderId));
|
56 |
+
}
|
57 |
+
}
|
58 |
+
|
59 |
+
/**
|
60 |
+
* Print An Invoice
|
61 |
+
*/
|
62 |
+
public function printInvoiceAction(){
|
63 |
+
if(!Mage::getStoreConfig('pdfpro/config/allow_customer_print')){$this->_forward('no-route');return; }
|
64 |
+
if (!$this->_loadValidOrder()) {
|
65 |
+
return;
|
66 |
+
}
|
67 |
+
$invoiceId = $this->getRequest()->getParam('invoice_id'); //invoice id
|
68 |
+
$invoice = Mage::getModel('sales/order_invoice')->load($invoiceId); //invoice model with id
|
69 |
+
|
70 |
+
if(!$invoice->getId()) {
|
71 |
+
Mage::getSingleton('core/session')->addError($this->__('The invoice is no longer exists.'));
|
72 |
+
$this->_redirect('sales/guest/form');
|
73 |
+
return;
|
74 |
+
}
|
75 |
+
|
76 |
+
//if can view order
|
77 |
+
if($this->_canViewOrder($invoice->getOrder())) {
|
78 |
+
$invoiceData = Mage::getModel('pdfpro/order_invoice')->initInvoiceData($invoice);
|
79 |
+
try{
|
80 |
+
$result = Mage::helper('pdfpro')->initPdf(array($invoiceData));
|
81 |
+
if($result['success']){
|
82 |
+
$this->_prepareDownloadResponse('invoice'.Mage::getSingleton('core/date')->date('Y-m-d_H-i-s').'.pdf', $result['content']);
|
83 |
+
}else{
|
84 |
+
throw new Mage_Core_Exception($result['msg']);
|
85 |
+
}
|
86 |
+
}catch(Exception $e){
|
87 |
+
Mage::getSingleton('core/session')->addError($e->getMessage());
|
88 |
+
$this->_redirect('sales/guest/invoice' , array('order_id'=>$invoice->getOrder()->getId()));
|
89 |
+
}
|
90 |
+
}else {
|
91 |
+
$this->_redirect('sales/guest/form');
|
92 |
+
}
|
93 |
+
}
|
94 |
+
|
95 |
+
|
96 |
+
/**
|
97 |
+
* Print invoices
|
98 |
+
*/
|
99 |
+
public function printInvoicesAction(){
|
100 |
+
if(!Mage::getStoreConfig('pdfpro/config/allow_customer_print')){$this->_forward('no-route');return; }
|
101 |
+
if (!$this->_loadValidOrder()) {
|
102 |
+
return;
|
103 |
+
}
|
104 |
+
$orderId = $this->getRequest()->getParam('order_id');
|
105 |
+
$order = Mage::getModel('sales/order')->load($orderId);
|
106 |
+
|
107 |
+
//if can view order
|
108 |
+
if($this->_canViewOrder($order)) {
|
109 |
+
$invoices = Mage::getResourceModel('sales/order_invoice_collection')->addAttributeToSelect('*')
|
110 |
+
->setOrderFilter($orderId)
|
111 |
+
->load(); //invoices data from order
|
112 |
+
|
113 |
+
if($invoices->count() > 0) {
|
114 |
+
$invoiceDatas = array();
|
115 |
+
foreach($invoices as $invoice) {
|
116 |
+
$invoiceDatas[] = Mage::getModel('pdfpro/order_invoice')->initInvoiceData($invoice);
|
117 |
+
}
|
118 |
+
try{
|
119 |
+
$result = Mage::helper('pdfpro')->initPdf($invoiceDatas);
|
120 |
+
if($result['success']){
|
121 |
+
$this->_prepareDownloadResponse('invoice'.Mage::getSingleton('core/date')->date('Y-m-d_H-i-s').'.pdf', $result['content']);
|
122 |
+
}else{
|
123 |
+
throw new Mage_Core_Exception($result['msg']);
|
124 |
+
}
|
125 |
+
}catch(Exception $e) {
|
126 |
+
Mage::getSingleton('core/session')->addError($e->getMessage());
|
127 |
+
$this->_redirect('sales/guest/invoice' , array('order_id'=>$orderId));
|
128 |
+
}
|
129 |
+
}
|
130 |
+
}else {
|
131 |
+
$this->_redirect('sales/guest/form');
|
132 |
+
}
|
133 |
+
}
|
134 |
+
|
135 |
+
/**
|
136 |
+
* Print a shipment
|
137 |
+
*/
|
138 |
+
public function printShipmentAction(){
|
139 |
+
if(!Mage::getStoreConfig('pdfpro/config/allow_customer_print')){$this->_forward('no-route');return; }
|
140 |
+
if (!$this->_loadValidOrder()) {
|
141 |
+
return;
|
142 |
+
}
|
143 |
+
$shipmentId = $this->getRequest()->getParam('shipment_id');
|
144 |
+
$shipment = Mage::getModel('sales/order_shipment')->load($shipmentId);
|
145 |
+
|
146 |
+
if(!$shipment->getId()) {
|
147 |
+
Mage::getSingleton('core/session')->addError($this->__('The shipment is no longer exists.'));
|
148 |
+
$this->_redirect('sales/guest/form');
|
149 |
+
return;
|
150 |
+
}
|
151 |
+
|
152 |
+
//if can view order
|
153 |
+
if($this->_canViewOrder($shipment->getOrder())) {
|
154 |
+
$shipmentData = Mage::getModel('pdfpro/order_shipment')->initShipmentData($shipment);
|
155 |
+
try{
|
156 |
+
$result = Mage::helper('pdfpro')->initPdf(array($shipmentData),'shipment');
|
157 |
+
if($result['success']){
|
158 |
+
$this->_prepareDownloadResponse('packingslip'.Mage::getSingleton('core/date')->date('Y-m-d_H-i-s').'.pdf', $result['content']);
|
159 |
+
}else{
|
160 |
+
throw new Mage_Core_Exception($result['msg']);
|
161 |
+
}
|
162 |
+
}catch(Exception $e){
|
163 |
+
Mage::getSingleton('core/session')->addError($e->getMessage());
|
164 |
+
$this->_redirect('sales/guest/shipment',array('order_id'=>$shipment->getOrder()->getId()));
|
165 |
+
}
|
166 |
+
}else {
|
167 |
+
$this->_redirect('sales/guest/form');
|
168 |
+
}
|
169 |
+
}
|
170 |
+
|
171 |
+
|
172 |
+
/**
|
173 |
+
* Print shipments
|
174 |
+
*/
|
175 |
+
public function printShipmentsAction(){
|
176 |
+
if(!Mage::getStoreConfig('pdfpro/config/allow_customer_print')){$this->_forward('no-route');return; }
|
177 |
+
if (!$this->_loadValidOrder()) {
|
178 |
+
return;
|
179 |
+
}
|
180 |
+
$orderId = $this->getRequest()->getParam('order_id');
|
181 |
+
$order = Mage::getModel('sales/order')->load($orderId);
|
182 |
+
|
183 |
+
//if can view order
|
184 |
+
if($this->_canViewOrder($order)) {
|
185 |
+
$shipments = Mage::getResourceModel('sales/order_shipment_collection')->addAttributeToSelect('*')
|
186 |
+
->setOrderFilter($orderId)
|
187 |
+
->load(); //invoices data from order
|
188 |
+
|
189 |
+
if($shipments->count() > 0) {
|
190 |
+
$shipmentDatas = array();
|
191 |
+
foreach($shipments as $shipment) {
|
192 |
+
$shipmentDatas[] = Mage::getModel('pdfpro/order_shipment')->initShipmentData($shipment);
|
193 |
+
}
|
194 |
+
try{
|
195 |
+
$result = Mage::helper('pdfpro')->initPdf($shipmentDatas,'shipment');
|
196 |
+
if($result['success']){
|
197 |
+
$this->_prepareDownloadResponse('packingslip'.Mage::getSingleton('core/date')->date('Y-m-d_H-i-s').'.pdf', $result['content']);
|
198 |
+
}else{
|
199 |
+
throw new Mage_Core_Exception($result['msg']);
|
200 |
+
}
|
201 |
+
}catch(Exception $e) {
|
202 |
+
Mage::getSingleton('core/session')->addError($e->getMessage());
|
203 |
+
$this->_redirect('sales/guest/shipment',array('order_id'=>$orderId));
|
204 |
+
}
|
205 |
+
}
|
206 |
+
}else {
|
207 |
+
$this->_redirect('sales/guest/form');
|
208 |
+
}
|
209 |
+
}
|
210 |
+
/**
|
211 |
+
* Print a shipment
|
212 |
+
*/
|
213 |
+
public function printCreditmemoAction(){
|
214 |
+
if(!Mage::getStoreConfig('pdfpro/config/allow_customer_print')){$this->_forward('no-route');return; }
|
215 |
+
if (!$this->_loadValidOrder()) {
|
216 |
+
return;
|
217 |
+
}
|
218 |
+
$creditmemoId = $this->getRequest()->getParam('creditmemo_id');
|
219 |
+
$creditmemo = Mage::getModel('sales/order_creditmemo')->load($creditmemoId);
|
220 |
+
|
221 |
+
if(!$creditmemo->getId()) {
|
222 |
+
Mage::getSingleton('core/session')->addError($this->__('The invoice no longer exists.'));
|
223 |
+
$this->_redirect('sales/guest/form');
|
224 |
+
return;
|
225 |
+
}
|
226 |
+
|
227 |
+
//if can view order
|
228 |
+
if($this->_canViewOrder($creditmemo->getOrder())) {
|
229 |
+
$creditmemoData = Mage::getModel('pdfpro/order_creditmemo')->initCreditmemoData($creditmemo);
|
230 |
+
try{
|
231 |
+
$result = Mage::helper('pdfpro')->initPdf(array($creditmemoData),'creditmemo');
|
232 |
+
if($result['success']){
|
233 |
+
$this->_prepareDownloadResponse('creditmemo'.Mage::getSingleton('core/date')->date('Y-m-d_H-i-s').'.pdf', $result['content']);
|
234 |
+
}else{
|
235 |
+
throw new Mage_Core_Exception($result['msg']);
|
236 |
+
}
|
237 |
+
}catch(Exception $e){
|
238 |
+
Mage::getSingleton('core/session')->addError($e->getMessage());
|
239 |
+
$this->_redirect('sales/guest/creditmemo',array('order_id'=>$creditmemo->getOrder()->getId()));
|
240 |
+
}
|
241 |
+
}else {
|
242 |
+
$this->_redirect('sales/guest/form');
|
243 |
+
}
|
244 |
+
}
|
245 |
+
|
246 |
+
|
247 |
+
/**
|
248 |
+
* Print shipments
|
249 |
+
*/
|
250 |
+
public function printCreditmemosAction(){
|
251 |
+
if(!Mage::getStoreConfig('pdfpro/config/allow_customer_print')){$this->_forward('no-route');return; }
|
252 |
+
if (!$this->_loadValidOrder()) {
|
253 |
+
return;
|
254 |
+
}
|
255 |
+
$orderId = $this->getRequest()->getParam('order_id');
|
256 |
+
$order = Mage::getModel('sales/order')->load($orderId);
|
257 |
+
|
258 |
+
//if can view order
|
259 |
+
if($this->_canViewOrder($order)) {
|
260 |
+
$creditmemos = Mage::getResourceModel('sales/order_creditmemo_collection')->addAttributeToSelect('*')
|
261 |
+
->setOrderFilter($orderId)
|
262 |
+
->load(); //invoices data from order
|
263 |
+
|
264 |
+
if($creditmemos->count() > 0) {
|
265 |
+
$creditmemoDatas = array();
|
266 |
+
foreach($creditmemos as $creditmemo) {
|
267 |
+
$creditmemoDatas[] = Mage::getModel('pdfpro/order_creditmemo')->initCreditmemoData($creditmemo);
|
268 |
+
}
|
269 |
+
try{
|
270 |
+
$result = Mage::helper('pdfpro')->initPdf($creditmemoDatas,'creditmemo');
|
271 |
+
if($result['success']){
|
272 |
+
$this->_prepareDownloadResponse('creditmemo'.Mage::getSingleton('core/date')->date('Y-m-d_H-i-s').'.pdf', $result['content']);
|
273 |
+
}else{
|
274 |
+
throw new Mage_Core_Exception($result['msg']);
|
275 |
+
}
|
276 |
+
}catch(Exception $e) {
|
277 |
+
Mage::getSingleton('core/session')->addError($e->getMessage());
|
278 |
+
$this->_redirect('sales/guest/creditmemo',array('order_id'=>$orderId));
|
279 |
+
}
|
280 |
+
}
|
281 |
+
}else {
|
282 |
+
$this->_redirect('sales/guest/form');
|
283 |
+
}
|
284 |
+
}
|
285 |
+
}
|
app/code/community/VES/PdfPro/controllers/PrintController.php
ADDED
@@ -0,0 +1,344 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* VES_PdfPro_OrderController
|
4 |
+
* @extends Mage_Sales_Controller_Abstract
|
5 |
+
* @extends Mage_Core_Controller_Front_Action parent
|
6 |
+
*
|
7 |
+
* @author VnEcoms Team <support@vnecoms.com>
|
8 |
+
* @website http://www.vnecoms.com
|
9 |
+
*/
|
10 |
+
|
11 |
+
class VES_PdfPro_PrintController extends VES_PdfPro_Controller_Abstract
|
12 |
+
{
|
13 |
+
|
14 |
+
public function orderAction(){
|
15 |
+
if (!$this->_loadValidOrder()) {
|
16 |
+
return;
|
17 |
+
}
|
18 |
+
if(!Mage::getStoreConfig('pdfpro/config/enabled') || !Mage::getStoreConfig('pdfpro/config/allow_customer_print')){$this->_forward('no-route');return; }
|
19 |
+
$orderId = $this->getRequest()->getParam('order_id');
|
20 |
+
$order = Mage::getModel('sales/order')->load($orderId);
|
21 |
+
if(!$order->getId()){$this->_forward('no-route');return;}
|
22 |
+
|
23 |
+
$orderData = Mage::getModel('pdfpro/order')->initOrderData($order);
|
24 |
+
try{
|
25 |
+
$result = Mage::helper('pdfpro')->initPdf(array($orderData),'order');
|
26 |
+
if($result['success']){
|
27 |
+
$this->_prepareDownloadResponse(Mage::helper('pdfpro')->getFileName('order',$order).'.pdf', $result['content']);
|
28 |
+
}else{
|
29 |
+
throw new Mage_Core_Exception($result['msg']);
|
30 |
+
}
|
31 |
+
}catch(Exception $e){
|
32 |
+
Mage::getSingleton('core/session')->addError($e->getMessage());
|
33 |
+
$this->_redirect('sales/order/view' , array('order_id'=>$orderId));
|
34 |
+
}
|
35 |
+
}
|
36 |
+
|
37 |
+
/**
|
38 |
+
* Print An Invoice
|
39 |
+
*/
|
40 |
+
public function invoiceAction(){
|
41 |
+
if(!Mage::getStoreConfig('pdfpro/config/allow_customer_print')){$this->_forward('no-route');return; }
|
42 |
+
|
43 |
+
$invoiceId = $this->getRequest()->getParam('invoice_id'); //invoice id
|
44 |
+
$invoice = Mage::getModel('sales/order_invoice')->load($invoiceId); //invoice model with id
|
45 |
+
|
46 |
+
if(!$invoice->getId()) {
|
47 |
+
Mage::getSingleton('core/session')->addError($this->__('The invoice no longer exists.'));
|
48 |
+
if(Mage::getSingleton('customer/session')->isLoggedIn()) {
|
49 |
+
$this->_redirect('sales/order/history');
|
50 |
+
}else {
|
51 |
+
$this->_redirect('sales/guest/form');
|
52 |
+
}
|
53 |
+
return;
|
54 |
+
}
|
55 |
+
|
56 |
+
//if can view order
|
57 |
+
if($this->_canViewOrder($invoice->getOrder())) {
|
58 |
+
$invoiceData = Mage::getModel('pdfpro/order_invoice')->initInvoiceData($invoice);
|
59 |
+
try{
|
60 |
+
$result = Mage::helper('pdfpro')->initPdf(array($invoiceData));
|
61 |
+
if($result['success']){
|
62 |
+
$this->_prepareDownloadResponse(Mage::helper('pdfpro')->getFileName('invoice',$invoice).'.pdf', $result['content']);
|
63 |
+
}else{
|
64 |
+
throw new Mage_Core_Exception($result['msg']);
|
65 |
+
}
|
66 |
+
}catch(Exception $e){
|
67 |
+
Mage::getSingleton('core/session')->addError($e->getMessage());
|
68 |
+
$this->_redirect('sales/order/invoice' , array('order_id'=>$invoice->getOrder()->getId()));
|
69 |
+
}
|
70 |
+
}else {
|
71 |
+
if (Mage::getSingleton('customer/session')->isLoggedIn()) {
|
72 |
+
Mage::getSingleton('core/session')->addError($this->__('You don\'t have that invoice.'));
|
73 |
+
$this->_redirect('sales/order/history');
|
74 |
+
} else {
|
75 |
+
Mage::getSingleton('core/session')->addError($this->__('You are not login. Please login to try.'));
|
76 |
+
$this->_redirect('sales/guest/form');
|
77 |
+
}
|
78 |
+
}
|
79 |
+
}
|
80 |
+
|
81 |
+
|
82 |
+
/**
|
83 |
+
* Print invoices
|
84 |
+
*/
|
85 |
+
public function invoicesAction(){
|
86 |
+
if(!Mage::getStoreConfig('pdfpro/config/allow_customer_print')){$this->_forward('no-route');return; }
|
87 |
+
//$flag = false;
|
88 |
+
$orderId = $this->getRequest()->getParam('order_id');
|
89 |
+
$order = Mage::getModel('sales/order')->load($orderId);
|
90 |
+
|
91 |
+
//order not exist
|
92 |
+
if(!$order->getId()) {
|
93 |
+
Mage::getSingleton('core/session')->addError($this->__('The order no longer exists.'));
|
94 |
+
if(Mage::getSingleton('customer/session')->isLoggedIn()) {
|
95 |
+
//login
|
96 |
+
$this->_redirect('sales/order/history');
|
97 |
+
}else {
|
98 |
+
//not login
|
99 |
+
$this->_redirect('sales/guest/form');
|
100 |
+
}
|
101 |
+
return;
|
102 |
+
}
|
103 |
+
|
104 |
+
//if can view order
|
105 |
+
if($this->_canViewOrder($order)) {
|
106 |
+
$invoices = Mage::getResourceModel('sales/order_invoice_collection')->addAttributeToSelect('*')
|
107 |
+
->setOrderFilter($orderId)
|
108 |
+
->load(); //invoices data from order
|
109 |
+
|
110 |
+
if($invoices->count() > 0) {
|
111 |
+
$invoiceDatas = array();
|
112 |
+
foreach($invoices as $invoice) {
|
113 |
+
$invoiceDatas[] = Mage::getModel('pdfpro/order_invoice')->initInvoiceData($invoice);
|
114 |
+
}
|
115 |
+
try{
|
116 |
+
$result = Mage::helper('pdfpro')->initPdf($invoiceDatas);
|
117 |
+
if($result['success']){
|
118 |
+
$this->_prepareDownloadResponse(Mage::helper('pdfpro')->getFileName('invoices').'.pdf', $result['content']);
|
119 |
+
}else{
|
120 |
+
throw new Mage_Core_Exception($result['msg']);
|
121 |
+
}
|
122 |
+
}catch(Exception $e) {
|
123 |
+
Mage::getSingleton('core/session')->addError($e->getMessage());
|
124 |
+
$this->_redirect('sales/order/invoice' , array('order_id'=>$orderId));
|
125 |
+
}
|
126 |
+
}
|
127 |
+
}else {
|
128 |
+
//login-not have order
|
129 |
+
if (Mage::getSingleton('customer/session')->isLoggedIn()) {
|
130 |
+
Mage::getSingleton('core/session')->addError($this->__('You don\'t have that order.'));
|
131 |
+
$this->_redirect('sales/order/history');
|
132 |
+
} else {
|
133 |
+
//not login-not have order
|
134 |
+
Mage::getSingleton('core/session')->addError($this->__('You are not login. Please login to try.'));
|
135 |
+
$this->_redirect('sales/guest/form');
|
136 |
+
}
|
137 |
+
}
|
138 |
+
}
|
139 |
+
|
140 |
+
/**
|
141 |
+
* Print a shipment
|
142 |
+
*/
|
143 |
+
public function shipmentAction(){
|
144 |
+
if(!Mage::getStoreConfig('pdfpro/config/allow_customer_print')){$this->_forward('no-route');return; }
|
145 |
+
|
146 |
+
$shipmentId = $this->getRequest()->getParam('shipment_id');
|
147 |
+
$shipment = Mage::getModel('sales/order_shipment')->load($shipmentId);
|
148 |
+
|
149 |
+
if(!$shipment->getId()) {
|
150 |
+
Mage::getSingleton('core/session')->addError($this->__('The invoice no longer exists.'));
|
151 |
+
if(Mage::getSingleton('customer/session')->isLoggedIn()) {
|
152 |
+
$this->_redirect('sales/order/history');
|
153 |
+
}else {
|
154 |
+
$this->_redirect('sales/guest/form');
|
155 |
+
}
|
156 |
+
return;
|
157 |
+
}
|
158 |
+
|
159 |
+
//if can view order
|
160 |
+
if($this->_canViewOrder($shipment->getOrder())) {
|
161 |
+
$shipmentData = Mage::getModel('pdfpro/order_shipment')->initShipmentData($shipment);
|
162 |
+
try{
|
163 |
+
$result = Mage::helper('pdfpro')->initPdf(array($shipmentData),'shipment');
|
164 |
+
if($result['success']){
|
165 |
+
$this->_prepareDownloadResponse(Mage::helper('pdfpro')->getFileName('shipment',$shipment).'.pdf', $result['content']);
|
166 |
+
}else{
|
167 |
+
throw new Mage_Core_Exception($result['msg']);
|
168 |
+
}
|
169 |
+
}catch(Exception $e){
|
170 |
+
Mage::getSingleton('core/session')->addError($e->getMessage());
|
171 |
+
$this->_redirect('sales/order/shipment',array('order_id'=>$shipment->getOrder()->getId()));
|
172 |
+
}
|
173 |
+
}else {
|
174 |
+
if (Mage::getSingleton('customer/session')->isLoggedIn()) {
|
175 |
+
Mage::getSingleton('core/session')->addError($this->__('You don\'t have that shipment.'));
|
176 |
+
$this->_redirect('sales/order/history');
|
177 |
+
} else {
|
178 |
+
Mage::getSingleton('core/session')->addError($this->__('You are not login. Please login to try.'));
|
179 |
+
$this->_redirect('sales/guest/form');
|
180 |
+
}
|
181 |
+
}
|
182 |
+
}
|
183 |
+
|
184 |
+
|
185 |
+
/**
|
186 |
+
* Print shipments
|
187 |
+
*/
|
188 |
+
public function shipmentsAction(){
|
189 |
+
if(!Mage::getStoreConfig('pdfpro/config/allow_customer_print')){$this->_forward('no-route');return; }
|
190 |
+
//$flag = false;
|
191 |
+
$orderId = $this->getRequest()->getParam('order_id');
|
192 |
+
$order = Mage::getModel('sales/order')->load($orderId);
|
193 |
+
|
194 |
+
//order not exist
|
195 |
+
if(!$order->getId()) {
|
196 |
+
Mage::getSingleton('core/session')->addError($this->__('The order no longer exists.'));
|
197 |
+
if(Mage::getSingleton('customer/session')->isLoggedIn()) {
|
198 |
+
//login
|
199 |
+
$this->_redirect('sales/order/history');
|
200 |
+
}else {
|
201 |
+
//not login
|
202 |
+
$this->_redirect('sales/guest/form');
|
203 |
+
}
|
204 |
+
return;
|
205 |
+
}
|
206 |
+
|
207 |
+
//if can view order
|
208 |
+
if($this->_canViewOrder($order)) {
|
209 |
+
$shipments = Mage::getResourceModel('sales/order_shipment_collection')->addAttributeToSelect('*')
|
210 |
+
->setOrderFilter($orderId)
|
211 |
+
->load(); //invoices data from order
|
212 |
+
|
213 |
+
if($shipments->count() > 0) {
|
214 |
+
$shipmentDatas = array();
|
215 |
+
foreach($shipments as $shipment) {
|
216 |
+
$shipmentDatas[] = Mage::getModel('pdfpro/order_shipment')->initShipmentData($shipment);
|
217 |
+
}
|
218 |
+
try{
|
219 |
+
$result = Mage::helper('pdfpro')->initPdf($shipmentDatas,'shipment');
|
220 |
+
if($result['success']){
|
221 |
+
$this->_prepareDownloadResponse(Mage::helper('pdfpro')->getFileName('shipments').'.pdf', $result['content']);
|
222 |
+
}else{
|
223 |
+
throw new Mage_Core_Exception($result['msg']);
|
224 |
+
}
|
225 |
+
}catch(Exception $e) {
|
226 |
+
Mage::getSingleton('core/session')->addError($e->getMessage());
|
227 |
+
$this->_redirect('sales/order/shipment',array('order_id'=>$orderId));
|
228 |
+
}
|
229 |
+
}
|
230 |
+
}else {
|
231 |
+
//login-not have order
|
232 |
+
if (Mage::getSingleton('customer/session')->isLoggedIn()) {
|
233 |
+
Mage::getSingleton('core/session')->addError($this->__('You don\'t have that order.'));
|
234 |
+
$this->_redirect('sales/order/history');
|
235 |
+
} else {
|
236 |
+
//not login-not have order
|
237 |
+
Mage::getSingleton('core/session')->addError($this->__('You are not login. Please login to try.'));
|
238 |
+
$this->_redirect('sales/guest/form');
|
239 |
+
}
|
240 |
+
}
|
241 |
+
}
|
242 |
+
/**
|
243 |
+
* Print a shipment
|
244 |
+
*/
|
245 |
+
public function creditmemoAction(){
|
246 |
+
if(!Mage::getStoreConfig('pdfpro/config/allow_customer_print')){$this->_forward('no-route');return; }
|
247 |
+
|
248 |
+
$creditmemoId = $this->getRequest()->getParam('creditmemo_id');
|
249 |
+
$creditmemo = Mage::getModel('sales/order_creditmemo')->load($creditmemoId);
|
250 |
+
|
251 |
+
if(!$creditmemo->getId()) {
|
252 |
+
Mage::getSingleton('core/session')->addError($this->__('The invoice no longer exists.'));
|
253 |
+
if(Mage::getSingleton('customer/session')->isLoggedIn()) {
|
254 |
+
$this->_redirect('sales/order/history');
|
255 |
+
}else {
|
256 |
+
$this->_redirect('sales/guest/form');
|
257 |
+
}
|
258 |
+
return;
|
259 |
+
}
|
260 |
+
|
261 |
+
//if can view order
|
262 |
+
if($this->_canViewOrder($creditmemo->getOrder())) {
|
263 |
+
$creditmemoData = Mage::getModel('pdfpro/order_creditmemo')->initCreditmemoData($creditmemo);
|
264 |
+
try{
|
265 |
+
$result = Mage::helper('pdfpro')->initPdf(array($creditmemoData),'creditmemo');
|
266 |
+
if($result['success']){
|
267 |
+
$this->_prepareDownloadResponse(Mage::helper('pdfpro')->getFileName('creditmemo',$creditmemo).'.pdf', $result['content']);
|
268 |
+
}else{
|
269 |
+
throw new Mage_Core_Exception($result['msg']);
|
270 |
+
}
|
271 |
+
}catch(Exception $e){
|
272 |
+
Mage::getSingleton('core/session')->addError($e->getMessage());
|
273 |
+
$this->_redirect('sales/order/creditmemo',array('order_id'=>$creditmemo->getOrder()->getId()));
|
274 |
+
}
|
275 |
+
}else {
|
276 |
+
if (Mage::getSingleton('customer/session')->isLoggedIn()) {
|
277 |
+
Mage::getSingleton('core/session')->addError($this->__('You don\'t have that shipment.'));
|
278 |
+
$this->_redirect('sales/order/history');
|
279 |
+
} else {
|
280 |
+
Mage::getSingleton('core/session')->addError($this->__('You are not login. Please login to try.'));
|
281 |
+
$this->_redirect('sales/guest/form');
|
282 |
+
}
|
283 |
+
}
|
284 |
+
}
|
285 |
+
|
286 |
+
|
287 |
+
/**
|
288 |
+
* Print shipments
|
289 |
+
*/
|
290 |
+
public function creditmemosAction(){
|
291 |
+
if(!Mage::getStoreConfig('pdfpro/config/allow_customer_print')){$this->_forward('no-route');return; }
|
292 |
+
//$flag = false;
|
293 |
+
$orderId = $this->getRequest()->getParam('order_id');
|
294 |
+
$order = Mage::getModel('sales/order')->load($orderId);
|
295 |
+
|
296 |
+
//order not exist
|
297 |
+
if(!$order->getId()) {
|
298 |
+
Mage::getSingleton('core/session')->addError($this->__('The order no longer exists.'));
|
299 |
+
if(Mage::getSingleton('customer/session')->isLoggedIn()) {
|
300 |
+
//login
|
301 |
+
$this->_redirect('sales/order/history');
|
302 |
+
}else {
|
303 |
+
//not login
|
304 |
+
$this->_redirect('sales/guest/form');
|
305 |
+
}
|
306 |
+
return;
|
307 |
+
}
|
308 |
+
|
309 |
+
//if can view order
|
310 |
+
if($this->_canViewOrder($order)) {
|
311 |
+
$creditmemos = Mage::getResourceModel('sales/order_creditmemo_collection')->addAttributeToSelect('*')
|
312 |
+
->setOrderFilter($orderId)
|
313 |
+
->load(); //invoices data from order
|
314 |
+
|
315 |
+
if($creditmemos->count() > 0) {
|
316 |
+
$creditmemoDatas = array();
|
317 |
+
foreach($creditmemos as $creditmemo) {
|
318 |
+
$creditmemoDatas[] = Mage::getModel('pdfpro/order_creditmemo')->initCreditmemoData($creditmemo);
|
319 |
+
}
|
320 |
+
try{
|
321 |
+
$result = Mage::helper('pdfpro')->initPdf($creditmemoDatas,'creditmemo');
|
322 |
+
if($result['success']){
|
323 |
+
$this->_prepareDownloadResponse(Mage::helper('pdfpro')->getFileName('creditmemos').'.pdf', $result['content']);
|
324 |
+
}else{
|
325 |
+
throw new Mage_Core_Exception($result['msg']);
|
326 |
+
}
|
327 |
+
}catch(Exception $e) {
|
328 |
+
Mage::getSingleton('core/session')->addError($e->getMessage());
|
329 |
+
$this->_redirect('sales/order/creditmemo',array('order_id'=>$orderId));
|
330 |
+
}
|
331 |
+
}
|
332 |
+
}else {
|
333 |
+
//login-not have order
|
334 |
+
if (Mage::getSingleton('customer/session')->isLoggedIn()) {
|
335 |
+
Mage::getSingleton('core/session')->addError($this->__('You don\'t have that order.'));
|
336 |
+
$this->_redirect('sales/order/history');
|
337 |
+
} else {
|
338 |
+
//not login-not have order
|
339 |
+
Mage::getSingleton('core/session')->addError($this->__('You are not login. Please login to try.'));
|
340 |
+
$this->_redirect('sales/guest/form');
|
341 |
+
}
|
342 |
+
}
|
343 |
+
}
|
344 |
+
}
|
app/code/community/VES/PdfPro/etc/config.xml
ADDED
@@ -0,0 +1,258 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?xml version="1.0"?>
|
2 |
+
<config>
|
3 |
+
<modules>
|
4 |
+
<VES_PdfPro>
|
5 |
+
<version>0.1.0</version>
|
6 |
+
</VES_PdfPro>
|
7 |
+
</modules>
|
8 |
+
<frontend>
|
9 |
+
<routers>
|
10 |
+
<pdfpro>
|
11 |
+
<use>standard</use>
|
12 |
+
<args>
|
13 |
+
<module>VES_PdfPro</module>
|
14 |
+
<frontName>pdfpro</frontName>
|
15 |
+
</args>
|
16 |
+
</pdfpro>
|
17 |
+
</routers>
|
18 |
+
</frontend>
|
19 |
+
<admin>
|
20 |
+
<routers>
|
21 |
+
<pdfpro_cp>
|
22 |
+
<use>admin</use>
|
23 |
+
<args>
|
24 |
+
<module>VES_PdfPro</module>
|
25 |
+
<frontName>pdfpro_cp</frontName>
|
26 |
+
</args>
|
27 |
+
</pdfpro_cp>
|
28 |
+
</routers>
|
29 |
+
</admin>
|
30 |
+
<adminhtml>
|
31 |
+
<menu>
|
32 |
+
<pdfpro module="pdfpro" translate="title">
|
33 |
+
<title>Easy PDF</title>
|
34 |
+
<sort_order>80</sort_order>
|
35 |
+
<children>
|
36 |
+
<api_key>
|
37 |
+
<title>Manage Api Keys</title>
|
38 |
+
<sort_order>20</sort_order>
|
39 |
+
<action>pdfpro_cp/adminhtml_key/index</action>
|
40 |
+
</api_key>
|
41 |
+
<website module="pdfpro">
|
42 |
+
<title>Visit Website</title>
|
43 |
+
<sort_order>25</sort_order>
|
44 |
+
<action>www.easypdfinvoice.com</action>
|
45 |
+
</website>
|
46 |
+
<config module="pdfpro">
|
47 |
+
<title>Configuration</title>
|
48 |
+
<sort_order>30</sort_order>
|
49 |
+
<action>adminhtml/system_config/edit/section/pdfpro</action>
|
50 |
+
</config>
|
51 |
+
</children>
|
52 |
+
</pdfpro>
|
53 |
+
</menu>
|
54 |
+
<translate>
|
55 |
+
<modules>
|
56 |
+
<VES_PdfPro>
|
57 |
+
<files>
|
58 |
+
<default>VES_PdfPro.csv</default>
|
59 |
+
</files>
|
60 |
+
</VES_PdfPro>
|
61 |
+
</modules>
|
62 |
+
</translate>
|
63 |
+
<acl>
|
64 |
+
<resources>
|
65 |
+
<all>
|
66 |
+
<title>Allow Everything</title>
|
67 |
+
</all>
|
68 |
+
<admin>
|
69 |
+
<children>
|
70 |
+
<pdfpro>
|
71 |
+
<title>Easy PDF</title>
|
72 |
+
<children>
|
73 |
+
<api_key>
|
74 |
+
<title>Manage Api Keys</title>
|
75 |
+
</api_key>
|
76 |
+
<website module="pdfpro">
|
77 |
+
<title>Visit Website</title>
|
78 |
+
</website>
|
79 |
+
<config module="pdfpro">
|
80 |
+
<title>Configuration</title>
|
81 |
+
</config>
|
82 |
+
</children>
|
83 |
+
</pdfpro>
|
84 |
+
<system>
|
85 |
+
<children>
|
86 |
+
<config>
|
87 |
+
<children>
|
88 |
+
<pdfpro translate="title" module="pdfpro">
|
89 |
+
<title>Easy PDF Invoice</title>
|
90 |
+
</pdfpro>
|
91 |
+
</children>
|
92 |
+
</config>
|
93 |
+
</children>
|
94 |
+
</system>
|
95 |
+
</children>
|
96 |
+
</admin>
|
97 |
+
</resources>
|
98 |
+
</acl>
|
99 |
+
<layout>
|
100 |
+
<updates>
|
101 |
+
<pdfpro>
|
102 |
+
<file>ves_pdfpro.xml</file>
|
103 |
+
</pdfpro>
|
104 |
+
</updates>
|
105 |
+
</layout>
|
106 |
+
</adminhtml>
|
107 |
+
<global>
|
108 |
+
<easypdf_processors>
|
109 |
+
<easypdf>
|
110 |
+
<title>easypdfinvoice.com (remote server)</title>
|
111 |
+
<model>pdfpro/processors_easypdf</model>
|
112 |
+
</easypdf>
|
113 |
+
</easypdf_processors>
|
114 |
+
<easypdf_communication_method>
|
115 |
+
<soap>
|
116 |
+
<title>SOAP</title>
|
117 |
+
<model>pdfpro/communication_method_soap</model>
|
118 |
+
</soap>
|
119 |
+
<xml_rpc>
|
120 |
+
<title>XmlRpc</title>
|
121 |
+
<model>pdfpro/communication_method_xmlrpc</model>
|
122 |
+
</xml_rpc>
|
123 |
+
</easypdf_communication_method>
|
124 |
+
<events>
|
125 |
+
<ves_pdfpro_data_prepare_after>
|
126 |
+
<observers>
|
127 |
+
<pdfpro>
|
128 |
+
<class>pdfpro/observer</class>
|
129 |
+
<method>ves_pdfpro_data_prepare_after</method>
|
130 |
+
</pdfpro>
|
131 |
+
</observers>
|
132 |
+
</ves_pdfpro_data_prepare_after>
|
133 |
+
<core_block_abstract_prepare_layout_before>
|
134 |
+
<observers>
|
135 |
+
<pdfpro>
|
136 |
+
<class>pdfpro/observer</class>
|
137 |
+
<method>core_block_abstract_prepare_layout_before</method>
|
138 |
+
</pdfpro>
|
139 |
+
</observers>
|
140 |
+
</core_block_abstract_prepare_layout_before>
|
141 |
+
<core_block_abstract_to_html_before>
|
142 |
+
<observers>
|
143 |
+
<pdfpro>
|
144 |
+
<class>pdfpro/observer</class>
|
145 |
+
<method>core_block_abstract_to_html_before</method>
|
146 |
+
</pdfpro>
|
147 |
+
</observers>
|
148 |
+
</core_block_abstract_to_html_before>
|
149 |
+
</events>
|
150 |
+
<models>
|
151 |
+
<pdfpro>
|
152 |
+
<class>VES_PdfPro_Model</class>
|
153 |
+
<resourceModel>pdfpro_mysql4</resourceModel>
|
154 |
+
</pdfpro>
|
155 |
+
<pdfpro_mysql4>
|
156 |
+
<class>VES_PdfPro_Model_Mysql4</class>
|
157 |
+
<entities>
|
158 |
+
<key>
|
159 |
+
<table>ves_pdfpro_apikey</table>
|
160 |
+
</key>
|
161 |
+
</entities>
|
162 |
+
</pdfpro_mysql4>
|
163 |
+
<sales>
|
164 |
+
<rewrite>
|
165 |
+
<order>VES_PdfPro_Model_Sales_Order</order>
|
166 |
+
<order_invoice>VES_PdfPro_Model_Sales_Order_Invoice</order_invoice>
|
167 |
+
<order_shipment>VES_PdfPro_Model_Sales_Order_Shipment</order_shipment>
|
168 |
+
</rewrite>
|
169 |
+
</sales>
|
170 |
+
</models>
|
171 |
+
<resources>
|
172 |
+
<pdfpro_setup>
|
173 |
+
<setup>
|
174 |
+
<module>VES_PdfPro</module>
|
175 |
+
</setup>
|
176 |
+
<connection>
|
177 |
+
<use>core_setup</use>
|
178 |
+
</connection>
|
179 |
+
</pdfpro_setup>
|
180 |
+
<pdfpro_write>
|
181 |
+
<connection>
|
182 |
+
<use>core_write</use>
|
183 |
+
</connection>
|
184 |
+
</pdfpro_write>
|
185 |
+
<pdfpro_read>
|
186 |
+
<connection>
|
187 |
+
<use>core_read</use>
|
188 |
+
</connection>
|
189 |
+
</pdfpro_read>
|
190 |
+
</resources>
|
191 |
+
<blocks>
|
192 |
+
<pdfpro>
|
193 |
+
<class>VES_PdfPro_Block</class>
|
194 |
+
</pdfpro>
|
195 |
+
<checkout>
|
196 |
+
<rewrite>
|
197 |
+
<onepage_success>VES_PdfPro_Block_Checkout_Onepage_Success</onepage_success>
|
198 |
+
</rewrite>
|
199 |
+
</checkout>
|
200 |
+
<sales>
|
201 |
+
<rewrite>
|
202 |
+
<order_info>VES_PdfPro_Block_Sales_Order_Info</order_info>
|
203 |
+
<order_info_buttons>VES_PdfPro_Block_Sales_Order_Info_Buttons</order_info_buttons>
|
204 |
+
<order_invoice_items>VES_PdfPro_Block_Sales_Order_Invoice_Items</order_invoice_items>
|
205 |
+
<order_shipment_items>VES_PdfPro_Block_Sales_Order_Shipment_Items</order_shipment_items>
|
206 |
+
<order_creditmemo_items>VES_PdfPro_Block_Sales_Order_Creditmemo_Items</order_creditmemo_items>
|
207 |
+
</rewrite>
|
208 |
+
</sales>
|
209 |
+
</blocks>
|
210 |
+
<helpers>
|
211 |
+
<pdfpro>
|
212 |
+
<class>VES_PdfPro_Helper</class>
|
213 |
+
</pdfpro>
|
214 |
+
</helpers>
|
215 |
+
</global>
|
216 |
+
<crontab>
|
217 |
+
<jobs>
|
218 |
+
<ves_pdfpro_notification>
|
219 |
+
<schedule><cron_expr>0 0 * * *</cron_expr></schedule>
|
220 |
+
<run><model>pdfpro/observer::dailyCheckNotification</model></run>
|
221 |
+
</ves_pdfpro_notification>
|
222 |
+
</jobs>
|
223 |
+
</crontab>
|
224 |
+
<default>
|
225 |
+
<pdfpro>
|
226 |
+
<config>
|
227 |
+
<enabled>1</enabled>
|
228 |
+
<processor>pdfpro/processors_easypdf</processor>
|
229 |
+
<key>TRIAL_LICENSE_2012</key>
|
230 |
+
<default_key>1</default_key>
|
231 |
+
<admin_print_order>1</admin_print_order>
|
232 |
+
<remove_default_print>1</remove_default_print>
|
233 |
+
<allow_customer_print>1</allow_customer_print>
|
234 |
+
<order_email_attach>1</order_email_attach>
|
235 |
+
<invoice_email_attach>1</invoice_email_attach>
|
236 |
+
<shipment_email_attach>1</shipment_email_attach>
|
237 |
+
<detect_language>1</detect_language>
|
238 |
+
<number_format>2</number_format>
|
239 |
+
<communication_method>soap</communication_method>
|
240 |
+
</config>
|
241 |
+
<filename_format>
|
242 |
+
<order>order_$ID_$y-$MM-$dd_$HH-$mm-$ss</order>
|
243 |
+
<orders>orders_$y-$MM-$dd_$HH-$mm-$ss</orders>
|
244 |
+
<invoice>invoice_$ID_$y-$MM-$dd_$HH-$mm-$ss</invoice>
|
245 |
+
<invoices>invoices_$y-$MM-$dd_$HH-$mm-$ss</invoices>
|
246 |
+
<shipment>packingslip_$ID_$y-$MM-$dd_$HH-$mm-$ss</shipment>
|
247 |
+
<shipments>packingslips_$y-$MM-$dd_$HH-$mm-$ss</shipments>
|
248 |
+
<creditmemo>creditmemo_$ID_$y-$MM-$dd_$HH-$mm-$ss</creditmemo>
|
249 |
+
<creditmemos>creditmemos_$y-$MM-$dd_$HH-$mm-$ss</creditmemos>
|
250 |
+
<all>docs_$y-$MM-$dd_$HH-$mm-$ss</all>
|
251 |
+
</filename_format>
|
252 |
+
<notification>
|
253 |
+
<notice>1</notice>
|
254 |
+
<news>1</news>
|
255 |
+
</notification>
|
256 |
+
</pdfpro>
|
257 |
+
</default>
|
258 |
+
</config>
|
app/code/community/VES/PdfPro/etc/system.xml
ADDED
@@ -0,0 +1,878 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?xml version="1.0"?>
|
2 |
+
<config>
|
3 |
+
<tabs>
|
4 |
+
<ves translate="label">
|
5 |
+
<label>VnEcoms</label>
|
6 |
+
<sort_order>400</sort_order>
|
7 |
+
</ves>
|
8 |
+
</tabs>
|
9 |
+
|
10 |
+
<sections>
|
11 |
+
<pdfpro translate="label" module="pdfpro">
|
12 |
+
<label>Easy PDF</label>
|
13 |
+
<tab>ves</tab>
|
14 |
+
<frontend_type>text</frontend_type>
|
15 |
+
<sort_order>101</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 |
+
<groups>
|
20 |
+
<config>
|
21 |
+
<label>General</label>
|
22 |
+
<frontend_type>text</frontend_type>
|
23 |
+
<sort_order>10</sort_order>
|
24 |
+
<show_in_default>1</show_in_default>
|
25 |
+
<show_in_website>1</show_in_website>
|
26 |
+
<show_in_store>1</show_in_store>
|
27 |
+
<frontend_model>pdfpro/adminhtml_system_config_form_fieldset</frontend_model>
|
28 |
+
<comment><![CDATA[]]></comment>
|
29 |
+
<fields>
|
30 |
+
<enabled>
|
31 |
+
<label>Enable Easy PDF Module</label>
|
32 |
+
<frontend_type>select</frontend_type>
|
33 |
+
<source_model>adminhtml/system_config_source_yesno</source_model>
|
34 |
+
<sort_order>10</sort_order>
|
35 |
+
<show_in_default>1</show_in_default>
|
36 |
+
<show_in_website>1</show_in_website>
|
37 |
+
<show_in_store>1</show_in_store>
|
38 |
+
</enabled>
|
39 |
+
<processor>
|
40 |
+
<label>PDF Processor</label>
|
41 |
+
<frontend_type>select</frontend_type>
|
42 |
+
<source_model>pdfpro/source_processor</source_model>
|
43 |
+
<sort_order>12</sort_order>
|
44 |
+
<show_in_default>1</show_in_default>
|
45 |
+
<show_in_website>1</show_in_website>
|
46 |
+
<show_in_store>1</show_in_store>
|
47 |
+
</processor>
|
48 |
+
<default_key>
|
49 |
+
<label>Default API Key</label>
|
50 |
+
<frontend_type>select</frontend_type>
|
51 |
+
<source_model>pdfpro/source_key</source_model>
|
52 |
+
<sort_order>15</sort_order>
|
53 |
+
<show_in_default>1</show_in_default>
|
54 |
+
<show_in_website>1</show_in_website>
|
55 |
+
<show_in_store>1</show_in_store>
|
56 |
+
<frontend_class>required-entry</frontend_class>
|
57 |
+
<comment><![CDATA[This API Key will be used for default. <br />There is no API Key here? Go to <strong>Easy PDF</strong> -> <strong>Manage Api Keys</strong>]]></comment>
|
58 |
+
</default_key>
|
59 |
+
<remove_default_print>
|
60 |
+
<label>Remove the default print functions</label>
|
61 |
+
<frontend_type>select</frontend_type>
|
62 |
+
<source_model>adminhtml/system_config_source_yesno</source_model>
|
63 |
+
<sort_order>16</sort_order>
|
64 |
+
<show_in_default>1</show_in_default>
|
65 |
+
<show_in_website>1</show_in_website>
|
66 |
+
<show_in_store>1</show_in_store>
|
67 |
+
<comment>Replace the default print functions of magento by Easy PDF</comment>
|
68 |
+
</remove_default_print>
|
69 |
+
<admin_print_order>
|
70 |
+
<label>Print orders from backend</label>
|
71 |
+
<frontend_type>select</frontend_type>
|
72 |
+
<source_model>adminhtml/system_config_source_yesno</source_model>
|
73 |
+
<sort_order>18</sort_order>
|
74 |
+
<show_in_default>1</show_in_default>
|
75 |
+
<show_in_website>1</show_in_website>
|
76 |
+
<show_in_store>1</show_in_store>
|
77 |
+
</admin_print_order>
|
78 |
+
<allow_customer_print>
|
79 |
+
<label>Customer can print PDFs</label>
|
80 |
+
<frontend_type>select</frontend_type>
|
81 |
+
<source_model>adminhtml/system_config_source_yesno</source_model>
|
82 |
+
<sort_order>20</sort_order>
|
83 |
+
<show_in_default>1</show_in_default>
|
84 |
+
<show_in_website>1</show_in_website>
|
85 |
+
<show_in_store>1</show_in_store>
|
86 |
+
<comment>If yes, customer will be able to use Easy PDF</comment>
|
87 |
+
</allow_customer_print>
|
88 |
+
<order_email_attach>
|
89 |
+
<label>Attach the PDF Order to New Order Email</label>
|
90 |
+
<frontend_type>select</frontend_type>
|
91 |
+
<source_model>pdfpro/source_attach</source_model>
|
92 |
+
<sort_order>30</sort_order>
|
93 |
+
<show_in_default>1</show_in_default>
|
94 |
+
<show_in_website>1</show_in_website>
|
95 |
+
<show_in_store>1</show_in_store>
|
96 |
+
<comment>This option will make your checkout a bit of slower for generating the PDF file</comment>
|
97 |
+
</order_email_attach>
|
98 |
+
<invoice_email_attach>
|
99 |
+
<label>Attach the PDF Invoice to Invoice Email</label>
|
100 |
+
<frontend_type>select</frontend_type>
|
101 |
+
<source_model>pdfpro/source_attach</source_model>
|
102 |
+
<sort_order>40</sort_order>
|
103 |
+
<show_in_default>1</show_in_default>
|
104 |
+
<show_in_website>1</show_in_website>
|
105 |
+
<show_in_store>1</show_in_store>
|
106 |
+
<comment>This option will make your checkout a bit of slower for generating the PDF file</comment>
|
107 |
+
</invoice_email_attach>
|
108 |
+
<shipment_email_attach>
|
109 |
+
<label>Attach the PDF Shipment to Shipment Email</label>
|
110 |
+
<frontend_type>select</frontend_type>
|
111 |
+
<source_model>pdfpro/source_attach</source_model>
|
112 |
+
<sort_order>45</sort_order>
|
113 |
+
<show_in_default>1</show_in_default>
|
114 |
+
<show_in_website>1</show_in_website>
|
115 |
+
<show_in_store>1</show_in_store>
|
116 |
+
</shipment_email_attach>
|
117 |
+
<detect_language>
|
118 |
+
<label>Detect language automatically by store</label>
|
119 |
+
<frontend_type>select</frontend_type>
|
120 |
+
<source_model>adminhtml/system_config_source_yesno</source_model>
|
121 |
+
<sort_order>50</sort_order>
|
122 |
+
<show_in_default>1</show_in_default>
|
123 |
+
<show_in_website>1</show_in_website>
|
124 |
+
<show_in_store>1</show_in_store>
|
125 |
+
<comment>This option is used for multiple language website.</comment>
|
126 |
+
</detect_language>
|
127 |
+
<number_format>
|
128 |
+
<label>Number Format</label>
|
129 |
+
<frontend_type>text</frontend_type>
|
130 |
+
<sort_order>60</sort_order>
|
131 |
+
<show_in_default>1</show_in_default>
|
132 |
+
<show_in_website>1</show_in_website>
|
133 |
+
<show_in_store>1</show_in_store>
|
134 |
+
<comment>This option is used to change number of decimal places.</comment>
|
135 |
+
</number_format>
|
136 |
+
<communication_method>
|
137 |
+
<label>Communication Method</label>
|
138 |
+
<frontend_type>select</frontend_type>
|
139 |
+
<sort_order>70</sort_order>
|
140 |
+
<show_in_default>1</show_in_default>
|
141 |
+
<show_in_website>1</show_in_website>
|
142 |
+
<show_in_store>1</show_in_store>
|
143 |
+
<source_model>pdfpro/source_communication_method</source_model>
|
144 |
+
<comment>This option is used when you choose the PDF Processor "www.easypdfinvoice.com remote server"</comment>
|
145 |
+
</communication_method>
|
146 |
+
</fields>
|
147 |
+
</config>
|
148 |
+
<filename_format>
|
149 |
+
<label>PDF file name format</label>
|
150 |
+
<frontend_type>text</frontend_type>
|
151 |
+
<sort_order>15</sort_order>
|
152 |
+
<show_in_default>1</show_in_default>
|
153 |
+
<show_in_website>1</show_in_website>
|
154 |
+
<show_in_store>1</show_in_store>
|
155 |
+
<fields>
|
156 |
+
<order>
|
157 |
+
<label>Order PDF File Name Format</label>
|
158 |
+
<frontend_type>text</frontend_type>
|
159 |
+
<tooltip><![CDATA[
|
160 |
+
<table width="100%" style="background: #FAFAFA;">
|
161 |
+
<thead>
|
162 |
+
<tr>
|
163 |
+
<th width="35">Var</th>
|
164 |
+
<th>Description</th>
|
165 |
+
<th>values</th>
|
166 |
+
</tr>
|
167 |
+
</thead>
|
168 |
+
<tbody>
|
169 |
+
<tr>
|
170 |
+
<td><strong>$dd</strong></td>
|
171 |
+
<td>Day of the month</td>
|
172 |
+
<td><em>01</em> to <em>31</em></td>
|
173 |
+
</tr>
|
174 |
+
|
175 |
+
<tr>
|
176 |
+
<td><strong>$EEE</strong></td>
|
177 |
+
<td>Day of the week</td>
|
178 |
+
<td><em>Mon</em> to <em>Sun</em></td>
|
179 |
+
</tr>
|
180 |
+
|
181 |
+
<tr>
|
182 |
+
<td><strong>$MM</strong></td>
|
183 |
+
<td>Numeric representation of a month</td>
|
184 |
+
<td><em>01</em> to <em>12</em></td>
|
185 |
+
</tr>
|
186 |
+
|
187 |
+
<tr>
|
188 |
+
<td><strong>$MMM</strong></td>
|
189 |
+
<td>Textual representation of a month</td>
|
190 |
+
<td><em>Jan</em> to <em>Dec</em></td>
|
191 |
+
</tr>
|
192 |
+
|
193 |
+
<tr>
|
194 |
+
<td><strong>$y</strong></td>
|
195 |
+
<td>Numeric representation of a year</td>
|
196 |
+
<td>Ex: <em>1999</em></td>
|
197 |
+
</tr>
|
198 |
+
|
199 |
+
<tr>
|
200 |
+
<td><strong>$yy</strong></td>
|
201 |
+
<td>A two digit representation of a year</td>
|
202 |
+
<td>Ex: <em>99</em></td>
|
203 |
+
</tr>
|
204 |
+
|
205 |
+
<tr>
|
206 |
+
<td><strong>$HH</strong></td>
|
207 |
+
<td>24-hour format of an hour</td>
|
208 |
+
<td><em>00</em> to <em>23</em></td>
|
209 |
+
</tr>
|
210 |
+
|
211 |
+
<tr>
|
212 |
+
<td><strong>$mm</strong></td>
|
213 |
+
<td>Minutes with leading zeros</td>
|
214 |
+
<td><em>00</em> to <em>59</em></td>
|
215 |
+
</tr>
|
216 |
+
|
217 |
+
<tr>
|
218 |
+
<td><strong>$ss</strong></td>
|
219 |
+
<td>Seconds, with leading zeros</td>
|
220 |
+
<td><em>00</em> to <em>59</em></td>
|
221 |
+
</tr>
|
222 |
+
</tbody>
|
223 |
+
</table>
|
224 |
+
]]></tooltip>
|
225 |
+
<sort_order>10</sort_order>
|
226 |
+
<show_in_default>1</show_in_default>
|
227 |
+
<show_in_website>1</show_in_website>
|
228 |
+
<show_in_store>1</show_in_store>
|
229 |
+
<comment>When you print an individual order. Use $ID for order ID</comment>
|
230 |
+
</order>
|
231 |
+
<orders>
|
232 |
+
<label>Order PDF File Name Format</label>
|
233 |
+
<frontend_type>text</frontend_type>
|
234 |
+
<tooltip><![CDATA[
|
235 |
+
<table width="100%" style="background: #FAFAFA;">
|
236 |
+
<thead>
|
237 |
+
<tr>
|
238 |
+
<th width="35">Var</th>
|
239 |
+
<th>Description</th>
|
240 |
+
<th>values</th>
|
241 |
+
</tr>
|
242 |
+
</thead>
|
243 |
+
<tbody>
|
244 |
+
<tr>
|
245 |
+
<td><strong>$dd</strong></td>
|
246 |
+
<td>Day of the month</td>
|
247 |
+
<td><em>01</em> to <em>31</em></td>
|
248 |
+
</tr>
|
249 |
+
|
250 |
+
<tr>
|
251 |
+
<td><strong>$EEE</strong></td>
|
252 |
+
<td>Day of the week</td>
|
253 |
+
<td><em>Mon</em> to <em>Sun</em></td>
|
254 |
+
</tr>
|
255 |
+
|
256 |
+
<tr>
|
257 |
+
<td><strong>$MM</strong></td>
|
258 |
+
<td>Numeric representation of a month</td>
|
259 |
+
<td><em>01</em> to <em>12</em></td>
|
260 |
+
</tr>
|
261 |
+
|
262 |
+
<tr>
|
263 |
+
<td><strong>$MMM</strong></td>
|
264 |
+
<td>Textual representation of a month</td>
|
265 |
+
<td><em>Jan</em> to <em>Dec</em></td>
|
266 |
+
</tr>
|
267 |
+
|
268 |
+
<tr>
|
269 |
+
<td><strong>$y</strong></td>
|
270 |
+
<td>Numeric representation of a year</td>
|
271 |
+
<td>Ex: <em>1999</em></td>
|
272 |
+
</tr>
|
273 |
+
|
274 |
+
<tr>
|
275 |
+
<td><strong>$yy</strong></td>
|
276 |
+
<td>A two digit representation of a year</td>
|
277 |
+
<td>Ex: <em>99</em></td>
|
278 |
+
</tr>
|
279 |
+
|
280 |
+
<tr>
|
281 |
+
<td><strong>$HH</strong></td>
|
282 |
+
<td>24-hour format of an hour</td>
|
283 |
+
<td><em>00</em> to <em>23</em></td>
|
284 |
+
</tr>
|
285 |
+
|
286 |
+
<tr>
|
287 |
+
<td><strong>$mm</strong></td>
|
288 |
+
<td>Minutes with leading zeros</td>
|
289 |
+
<td><em>00</em> to <em>59</em></td>
|
290 |
+
</tr>
|
291 |
+
|
292 |
+
<tr>
|
293 |
+
<td><strong>$ss</strong></td>
|
294 |
+
<td>Seconds, with leading zeros</td>
|
295 |
+
<td><em>00</em> to <em>59</em></td>
|
296 |
+
</tr>
|
297 |
+
</tbody>
|
298 |
+
</table>
|
299 |
+
]]></tooltip>
|
300 |
+
<sort_order>11</sort_order>
|
301 |
+
<show_in_default>1</show_in_default>
|
302 |
+
<show_in_website>1</show_in_website>
|
303 |
+
<show_in_store>1</show_in_store>
|
304 |
+
<comment>When you print multiple orders.</comment>
|
305 |
+
</orders>
|
306 |
+
<invoice>
|
307 |
+
<label>Invoice PDF File Name Format</label>
|
308 |
+
<frontend_type>text</frontend_type>
|
309 |
+
<tooltip><![CDATA[
|
310 |
+
<table width="100%" style="background: #FAFAFA;">
|
311 |
+
<thead>
|
312 |
+
<tr>
|
313 |
+
<th width="35">Var</th>
|
314 |
+
<th>Description</th>
|
315 |
+
<th>values</th>
|
316 |
+
</tr>
|
317 |
+
</thead>
|
318 |
+
<tbody>
|
319 |
+
<tr>
|
320 |
+
<td><strong>$dd</strong></td>
|
321 |
+
<td>Day of the month</td>
|
322 |
+
<td><em>01</em> to <em>31</em></td>
|
323 |
+
</tr>
|
324 |
+
|
325 |
+
<tr>
|
326 |
+
<td><strong>$EEE</strong></td>
|
327 |
+
<td>Day of the week</td>
|
328 |
+
<td><em>Mon</em> to <em>Sun</em></td>
|
329 |
+
</tr>
|
330 |
+
|
331 |
+
<tr>
|
332 |
+
<td><strong>$MM</strong></td>
|
333 |
+
<td>Numeric representation of a month</td>
|
334 |
+
<td><em>01</em> to <em>12</em></td>
|
335 |
+
</tr>
|
336 |
+
|
337 |
+
<tr>
|
338 |
+
<td><strong>$MMM</strong></td>
|
339 |
+
<td>Textual representation of a month</td>
|
340 |
+
<td><em>Jan</em> to <em>Dec</em></td>
|
341 |
+
</tr>
|
342 |
+
|
343 |
+
<tr>
|
344 |
+
<td><strong>$y</strong></td>
|
345 |
+
<td>Numeric representation of a year</td>
|
346 |
+
<td>Ex: <em>1999</em></td>
|
347 |
+
</tr>
|
348 |
+
|
349 |
+
<tr>
|
350 |
+
<td><strong>$yy</strong></td>
|
351 |
+
<td>A two digit representation of a year</td>
|
352 |
+
<td>Ex: <em>99</em></td>
|
353 |
+
</tr>
|
354 |
+
|
355 |
+
<tr>
|
356 |
+
<td><strong>$HH</strong></td>
|
357 |
+
<td>24-hour format of an hour</td>
|
358 |
+
<td><em>00</em> to <em>23</em></td>
|
359 |
+
</tr>
|
360 |
+
|
361 |
+
<tr>
|
362 |
+
<td><strong>$mm</strong></td>
|
363 |
+
<td>Minutes with leading zeros</td>
|
364 |
+
<td><em>00</em> to <em>59</em></td>
|
365 |
+
</tr>
|
366 |
+
|
367 |
+
<tr>
|
368 |
+
<td><strong>$ss</strong></td>
|
369 |
+
<td>Seconds, with leading zeros</td>
|
370 |
+
<td><em>00</em> to <em>59</em></td>
|
371 |
+
</tr>
|
372 |
+
</tbody>
|
373 |
+
</table>
|
374 |
+
]]></tooltip>
|
375 |
+
<sort_order>20</sort_order>
|
376 |
+
<show_in_default>1</show_in_default>
|
377 |
+
<show_in_website>1</show_in_website>
|
378 |
+
<show_in_store>1</show_in_store>
|
379 |
+
<comment>When you print an individual invoice. Use $ID for invoice ID</comment>
|
380 |
+
</invoice>
|
381 |
+
<invoices>
|
382 |
+
<label>Invoice PDF File Name Format</label>
|
383 |
+
<frontend_type>text</frontend_type>
|
384 |
+
<tooltip><![CDATA[
|
385 |
+
<table width="100%" style="background: #FAFAFA;">
|
386 |
+
<thead>
|
387 |
+
<tr>
|
388 |
+
<th width="35">Var</th>
|
389 |
+
<th>Description</th>
|
390 |
+
<th>values</th>
|
391 |
+
</tr>
|
392 |
+
</thead>
|
393 |
+
<tbody>
|
394 |
+
<tr>
|
395 |
+
<td><strong>$dd</strong></td>
|
396 |
+
<td>Day of the month</td>
|
397 |
+
<td><em>01</em> to <em>31</em></td>
|
398 |
+
</tr>
|
399 |
+
|
400 |
+
<tr>
|
401 |
+
<td><strong>$EEE</strong></td>
|
402 |
+
<td>Day of the week</td>
|
403 |
+
<td><em>Mon</em> to <em>Sun</em></td>
|
404 |
+
</tr>
|
405 |
+
|
406 |
+
<tr>
|
407 |
+
<td><strong>$MM</strong></td>
|
408 |
+
<td>Numeric representation of a month</td>
|
409 |
+
<td><em>01</em> to <em>12</em></td>
|
410 |
+
</tr>
|
411 |
+
|
412 |
+
<tr>
|
413 |
+
<td><strong>$MMM</strong></td>
|
414 |
+
<td>Textual representation of a month</td>
|
415 |
+
<td><em>Jan</em> to <em>Dec</em></td>
|
416 |
+
</tr>
|
417 |
+
|
418 |
+
<tr>
|
419 |
+
<td><strong>$y</strong></td>
|
420 |
+
<td>Numeric representation of a year</td>
|
421 |
+
<td>Ex: <em>1999</em></td>
|
422 |
+
</tr>
|
423 |
+
|
424 |
+
<tr>
|
425 |
+
<td><strong>$yy</strong></td>
|
426 |
+
<td>A two digit representation of a year</td>
|
427 |
+
<td>Ex: <em>99</em></td>
|
428 |
+
</tr>
|
429 |
+
|
430 |
+
<tr>
|
431 |
+
<td><strong>$HH</strong></td>
|
432 |
+
<td>24-hour format of an hour</td>
|
433 |
+
<td><em>00</em> to <em>23</em></td>
|
434 |
+
</tr>
|
435 |
+
|
436 |
+
<tr>
|
437 |
+
<td><strong>$mm</strong></td>
|
438 |
+
<td>Minutes with leading zeros</td>
|
439 |
+
<td><em>00</em> to <em>59</em></td>
|
440 |
+
</tr>
|
441 |
+
|
442 |
+
<tr>
|
443 |
+
<td><strong>$ss</strong></td>
|
444 |
+
<td>Seconds, with leading zeros</td>
|
445 |
+
<td><em>00</em> to <em>59</em></td>
|
446 |
+
</tr>
|
447 |
+
</tbody>
|
448 |
+
</table>
|
449 |
+
]]></tooltip>
|
450 |
+
<sort_order>21</sort_order>
|
451 |
+
<show_in_default>1</show_in_default>
|
452 |
+
<show_in_website>1</show_in_website>
|
453 |
+
<show_in_store>1</show_in_store>
|
454 |
+
<comment>When you print multiple invoices.</comment>
|
455 |
+
</invoices>
|
456 |
+
<shipment>
|
457 |
+
<label>Shipment PDF File Name Format</label>
|
458 |
+
<frontend_type>text</frontend_type>
|
459 |
+
<tooltip><![CDATA[
|
460 |
+
<table width="100%" style="background: #FAFAFA;">
|
461 |
+
<thead>
|
462 |
+
<tr>
|
463 |
+
<th width="35">Var</th>
|
464 |
+
<th>Description</th>
|
465 |
+
<th>values</th>
|
466 |
+
</tr>
|
467 |
+
</thead>
|
468 |
+
<tbody>
|
469 |
+
<tr>
|
470 |
+
<td><strong>$dd</strong></td>
|
471 |
+
<td>Day of the month</td>
|
472 |
+
<td><em>01</em> to <em>31</em></td>
|
473 |
+
</tr>
|
474 |
+
|
475 |
+
<tr>
|
476 |
+
<td><strong>$EEE</strong></td>
|
477 |
+
<td>Day of the week</td>
|
478 |
+
<td><em>Mon</em> to <em>Sun</em></td>
|
479 |
+
</tr>
|
480 |
+
|
481 |
+
<tr>
|
482 |
+
<td><strong>$MM</strong></td>
|
483 |
+
<td>Numeric representation of a month</td>
|
484 |
+
<td><em>01</em> to <em>12</em></td>
|
485 |
+
</tr>
|
486 |
+
|
487 |
+
<tr>
|
488 |
+
<td><strong>$MMM</strong></td>
|
489 |
+
<td>Textual representation of a month</td>
|
490 |
+
<td><em>Jan</em> to <em>Dec</em></td>
|
491 |
+
</tr>
|
492 |
+
|
493 |
+
<tr>
|
494 |
+
<td><strong>$y</strong></td>
|
495 |
+
<td>Numeric representation of a year</td>
|
496 |
+
<td>Ex: <em>1999</em></td>
|
497 |
+
</tr>
|
498 |
+
|
499 |
+
<tr>
|
500 |
+
<td><strong>$yy</strong></td>
|
501 |
+
<td>A two digit representation of a year</td>
|
502 |
+
<td>Ex: <em>99</em></td>
|
503 |
+
</tr>
|
504 |
+
|
505 |
+
<tr>
|
506 |
+
<td><strong>$HH</strong></td>
|
507 |
+
<td>24-hour format of an hour</td>
|
508 |
+
<td><em>00</em> to <em>23</em></td>
|
509 |
+
</tr>
|
510 |
+
|
511 |
+
<tr>
|
512 |
+
<td><strong>$mm</strong></td>
|
513 |
+
<td>Minutes with leading zeros</td>
|
514 |
+
<td><em>00</em> to <em>59</em></td>
|
515 |
+
</tr>
|
516 |
+
|
517 |
+
<tr>
|
518 |
+
<td><strong>$ss</strong></td>
|
519 |
+
<td>Seconds, with leading zeros</td>
|
520 |
+
<td><em>00</em> to <em>59</em></td>
|
521 |
+
</tr>
|
522 |
+
</tbody>
|
523 |
+
</table>
|
524 |
+
]]></tooltip>
|
525 |
+
<sort_order>30</sort_order>
|
526 |
+
<show_in_default>1</show_in_default>
|
527 |
+
<show_in_website>1</show_in_website>
|
528 |
+
<show_in_store>1</show_in_store>
|
529 |
+
<comment>When you print an individual shipment. Use $ID for shipment ID</comment>
|
530 |
+
</shipment>
|
531 |
+
<shipments>
|
532 |
+
<label>Shipment PDF File Name Format</label>
|
533 |
+
<frontend_type>text</frontend_type>
|
534 |
+
<tooltip><![CDATA[
|
535 |
+
<table width="100%" style="background: #FAFAFA;">
|
536 |
+
<thead>
|
537 |
+
<tr>
|
538 |
+
<th width="35">Var</th>
|
539 |
+
<th>Description</th>
|
540 |
+
<th>values</th>
|
541 |
+
</tr>
|
542 |
+
</thead>
|
543 |
+
<tbody>
|
544 |
+
<tr>
|
545 |
+
<td><strong>$dd</strong></td>
|
546 |
+
<td>Day of the month</td>
|
547 |
+
<td><em>01</em> to <em>31</em></td>
|
548 |
+
</tr>
|
549 |
+
|
550 |
+
<tr>
|
551 |
+
<td><strong>$EEE</strong></td>
|
552 |
+
<td>Day of the week</td>
|
553 |
+
<td><em>Mon</em> to <em>Sun</em></td>
|
554 |
+
</tr>
|
555 |
+
|
556 |
+
<tr>
|
557 |
+
<td><strong>$MM</strong></td>
|
558 |
+
<td>Numeric representation of a month</td>
|
559 |
+
<td><em>01</em> to <em>12</em></td>
|
560 |
+
</tr>
|
561 |
+
|
562 |
+
<tr>
|
563 |
+
<td><strong>$MMM</strong></td>
|
564 |
+
<td>Textual representation of a month</td>
|
565 |
+
<td><em>Jan</em> to <em>Dec</em></td>
|
566 |
+
</tr>
|
567 |
+
|
568 |
+
<tr>
|
569 |
+
<td><strong>$y</strong></td>
|
570 |
+
<td>Numeric representation of a year</td>
|
571 |
+
<td>Ex: <em>1999</em></td>
|
572 |
+
</tr>
|
573 |
+
|
574 |
+
<tr>
|
575 |
+
<td><strong>$yy</strong></td>
|
576 |
+
<td>A two digit representation of a year</td>
|
577 |
+
<td>Ex: <em>99</em></td>
|
578 |
+
</tr>
|
579 |
+
|
580 |
+
<tr>
|
581 |
+
<td><strong>$HH</strong></td>
|
582 |
+
<td>24-hour format of an hour</td>
|
583 |
+
<td><em>00</em> to <em>23</em></td>
|
584 |
+
</tr>
|
585 |
+
|
586 |
+
<tr>
|
587 |
+
<td><strong>$mm</strong></td>
|
588 |
+
<td>Minutes with leading zeros</td>
|
589 |
+
<td><em>00</em> to <em>59</em></td>
|
590 |
+
</tr>
|
591 |
+
|
592 |
+
<tr>
|
593 |
+
<td><strong>$ss</strong></td>
|
594 |
+
<td>Seconds, with leading zeros</td>
|
595 |
+
<td><em>00</em> to <em>59</em></td>
|
596 |
+
</tr>
|
597 |
+
</tbody>
|
598 |
+
</table>
|
599 |
+
]]></tooltip>
|
600 |
+
<sort_order>31</sort_order>
|
601 |
+
<show_in_default>1</show_in_default>
|
602 |
+
<show_in_website>1</show_in_website>
|
603 |
+
<show_in_store>1</show_in_store>
|
604 |
+
<comment>When you print multiple shipments.</comment>
|
605 |
+
</shipments>
|
606 |
+
<creditmemo>
|
607 |
+
<label>Credit Memo PDF File Name Format</label>
|
608 |
+
<frontend_type>text</frontend_type>
|
609 |
+
<tooltip><![CDATA[
|
610 |
+
<table width="100%" style="background: #FAFAFA;">
|
611 |
+
<thead>
|
612 |
+
<tr>
|
613 |
+
<th width="35">Var</th>
|
614 |
+
<th>Description</th>
|
615 |
+
<th>values</th>
|
616 |
+
</tr>
|
617 |
+
</thead>
|
618 |
+
<tbody>
|
619 |
+
<tr>
|
620 |
+
<td><strong>$dd</strong></td>
|
621 |
+
<td>Day of the month</td>
|
622 |
+
<td><em>01</em> to <em>31</em></td>
|
623 |
+
</tr>
|
624 |
+
|
625 |
+
<tr>
|
626 |
+
<td><strong>$EEE</strong></td>
|
627 |
+
<td>Day of the week</td>
|
628 |
+
<td><em>Mon</em> to <em>Sun</em></td>
|
629 |
+
</tr>
|
630 |
+
|
631 |
+
<tr>
|
632 |
+
<td><strong>$MM</strong></td>
|
633 |
+
<td>Numeric representation of a month</td>
|
634 |
+
<td><em>01</em> to <em>12</em></td>
|
635 |
+
</tr>
|
636 |
+
|
637 |
+
<tr>
|
638 |
+
<td><strong>$MMM</strong></td>
|
639 |
+
<td>Textual representation of a month</td>
|
640 |
+
<td><em>Jan</em> to <em>Dec</em></td>
|
641 |
+
</tr>
|
642 |
+
|
643 |
+
<tr>
|
644 |
+
<td><strong>$y</strong></td>
|
645 |
+
<td>Numeric representation of a year</td>
|
646 |
+
<td>Ex: <em>1999</em></td>
|
647 |
+
</tr>
|
648 |
+
|
649 |
+
<tr>
|
650 |
+
<td><strong>$yy</strong></td>
|
651 |
+
<td>A two digit representation of a year</td>
|
652 |
+
<td>Ex: <em>99</em></td>
|
653 |
+
</tr>
|
654 |
+
|
655 |
+
<tr>
|
656 |
+
<td><strong>$HH</strong></td>
|
657 |
+
<td>24-hour format of an hour</td>
|
658 |
+
<td><em>00</em> to <em>23</em></td>
|
659 |
+
</tr>
|
660 |
+
|
661 |
+
<tr>
|
662 |
+
<td><strong>$mm</strong></td>
|
663 |
+
<td>Minutes with leading zeros</td>
|
664 |
+
<td><em>00</em> to <em>59</em></td>
|
665 |
+
</tr>
|
666 |
+
|
667 |
+
<tr>
|
668 |
+
<td><strong>$ss</strong></td>
|
669 |
+
<td>Seconds, with leading zeros</td>
|
670 |
+
<td><em>00</em> to <em>59</em></td>
|
671 |
+
</tr>
|
672 |
+
</tbody>
|
673 |
+
</table>
|
674 |
+
]]></tooltip>
|
675 |
+
<sort_order>40</sort_order>
|
676 |
+
<show_in_default>1</show_in_default>
|
677 |
+
<show_in_website>1</show_in_website>
|
678 |
+
<show_in_store>1</show_in_store>
|
679 |
+
<comment>When you print an individual credit memo. Use $ID for creditmemo ID</comment>
|
680 |
+
</creditmemo>
|
681 |
+
<creditmemos>
|
682 |
+
<label>Credit Memo PDF File Name Format</label>
|
683 |
+
<frontend_type>text</frontend_type>
|
684 |
+
<tooltip><![CDATA[
|
685 |
+
<table width="100%" style="background: #FAFAFA;">
|
686 |
+
<thead>
|
687 |
+
<tr>
|
688 |
+
<th width="35">Var</th>
|
689 |
+
<th>Description</th>
|
690 |
+
<th>values</th>
|
691 |
+
</tr>
|
692 |
+
</thead>
|
693 |
+
<tbody>
|
694 |
+
<tr>
|
695 |
+
<td><strong>$dd</strong></td>
|
696 |
+
<td>Day of the month</td>
|
697 |
+
<td><em>01</em> to <em>31</em></td>
|
698 |
+
</tr>
|
699 |
+
|
700 |
+
<tr>
|
701 |
+
<td><strong>$EEE</strong></td>
|
702 |
+
<td>Day of the week</td>
|
703 |
+
<td><em>Mon</em> to <em>Sun</em></td>
|
704 |
+
</tr>
|
705 |
+
|
706 |
+
<tr>
|
707 |
+
<td><strong>$MM</strong></td>
|
708 |
+
<td>Numeric representation of a month</td>
|
709 |
+
<td><em>01</em> to <em>12</em></td>
|
710 |
+
</tr>
|
711 |
+
|
712 |
+
<tr>
|
713 |
+
<td><strong>$MMM</strong></td>
|
714 |
+
<td>Textual representation of a month</td>
|
715 |
+
<td><em>Jan</em> to <em>Dec</em></td>
|
716 |
+
</tr>
|
717 |
+
|
718 |
+
<tr>
|
719 |
+
<td><strong>$y</strong></td>
|
720 |
+
<td>Numeric representation of a year</td>
|
721 |
+
<td>Ex: <em>1999</em></td>
|
722 |
+
</tr>
|
723 |
+
|
724 |
+
<tr>
|
725 |
+
<td><strong>$yy</strong></td>
|
726 |
+
<td>A two digit representation of a year</td>
|
727 |
+
<td>Ex: <em>99</em></td>
|
728 |
+
</tr>
|
729 |
+
|
730 |
+
<tr>
|
731 |
+
<td><strong>$HH</strong></td>
|
732 |
+
<td>24-hour format of an hour</td>
|
733 |
+
<td><em>00</em> to <em>23</em></td>
|
734 |
+
</tr>
|
735 |
+
|
736 |
+
<tr>
|
737 |
+
<td><strong>$mm</strong></td>
|
738 |
+
<td>Minutes with leading zeros</td>
|
739 |
+
<td><em>00</em> to <em>59</em></td>
|
740 |
+
</tr>
|
741 |
+
|
742 |
+
<tr>
|
743 |
+
<td><strong>$ss</strong></td>
|
744 |
+
<td>Seconds, with leading zeros</td>
|
745 |
+
<td><em>00</em> to <em>59</em></td>
|
746 |
+
</tr>
|
747 |
+
</tbody>
|
748 |
+
</table>
|
749 |
+
]]></tooltip>
|
750 |
+
<sort_order>41</sort_order>
|
751 |
+
<show_in_default>1</show_in_default>
|
752 |
+
<show_in_website>1</show_in_website>
|
753 |
+
<show_in_store>1</show_in_store>
|
754 |
+
<comment>When you print multiple credit memos.</comment>
|
755 |
+
</creditmemos>
|
756 |
+
<all>
|
757 |
+
<label>Document PDF File Name Format</label>
|
758 |
+
<frontend_type>text</frontend_type>
|
759 |
+
<tooltip><![CDATA[
|
760 |
+
<table width="100%" style="background: #FAFAFA;">
|
761 |
+
<thead>
|
762 |
+
<tr>
|
763 |
+
<th width="35">Var</th>
|
764 |
+
<th>Description</th>
|
765 |
+
<th>values</th>
|
766 |
+
</tr>
|
767 |
+
</thead>
|
768 |
+
<tbody>
|
769 |
+
<tr>
|
770 |
+
<td><strong>$dd</strong></td>
|
771 |
+
<td>Day of the month</td>
|
772 |
+
<td><em>01</em> to <em>31</em></td>
|
773 |
+
</tr>
|
774 |
+
|
775 |
+
<tr>
|
776 |
+
<td><strong>$EEE</strong></td>
|
777 |
+
<td>Day of the week</td>
|
778 |
+
<td><em>Mon</em> to <em>Sun</em></td>
|
779 |
+
</tr>
|
780 |
+
|
781 |
+
<tr>
|
782 |
+
<td><strong>$MM</strong></td>
|
783 |
+
<td>Numeric representation of a month</td>
|
784 |
+
<td><em>01</em> to <em>12</em></td>
|
785 |
+
</tr>
|
786 |
+
|
787 |
+
<tr>
|
788 |
+
<td><strong>$MMM</strong></td>
|
789 |
+
<td>Textual representation of a month</td>
|
790 |
+
<td><em>Jan</em> to <em>Dec</em></td>
|
791 |
+
</tr>
|
792 |
+
|
793 |
+
<tr>
|
794 |
+
<td><strong>$y</strong></td>
|
795 |
+
<td>Numeric representation of a year</td>
|
796 |
+
<td>Ex: <em>1999</em></td>
|
797 |
+
</tr>
|
798 |
+
|
799 |
+
<tr>
|
800 |
+
<td><strong>$yy</strong></td>
|
801 |
+
<td>A two digit representation of a year</td>
|
802 |
+
<td>Ex: <em>99</em></td>
|
803 |
+
</tr>
|
804 |
+
|
805 |
+
<tr>
|
806 |
+
<td><strong>$HH</strong></td>
|
807 |
+
<td>24-hour format of an hour</td>
|
808 |
+
<td><em>00</em> to <em>23</em></td>
|
809 |
+
</tr>
|
810 |
+
|
811 |
+
<tr>
|
812 |
+
<td><strong>$mm</strong></td>
|
813 |
+
<td>Minutes with leading zeros</td>
|
814 |
+
<td><em>00</em> to <em>59</em></td>
|
815 |
+
</tr>
|
816 |
+
|
817 |
+
<tr>
|
818 |
+
<td><strong>$ss</strong></td>
|
819 |
+
<td>Seconds, with leading zeros</td>
|
820 |
+
<td><em>00</em> to <em>59</em></td>
|
821 |
+
</tr>
|
822 |
+
</tbody>
|
823 |
+
</table>
|
824 |
+
]]></tooltip>
|
825 |
+
<sort_order>50</sort_order>
|
826 |
+
<show_in_default>1</show_in_default>
|
827 |
+
<show_in_website>1</show_in_website>
|
828 |
+
<show_in_store>1</show_in_store>
|
829 |
+
<comment>When you you select "Print All"</comment>
|
830 |
+
</all>
|
831 |
+
</fields>
|
832 |
+
</filename_format>
|
833 |
+
<notification>
|
834 |
+
<label>Notification</label>
|
835 |
+
<frontend_type>text</frontend_type>
|
836 |
+
<sort_order>20</sort_order>
|
837 |
+
<show_in_default>1</show_in_default>
|
838 |
+
<show_in_website>1</show_in_website>
|
839 |
+
<show_in_store>1</show_in_store>
|
840 |
+
<fields>
|
841 |
+
<notice>
|
842 |
+
<label>Enable upgrade notice</label>
|
843 |
+
<frontend_type>select</frontend_type>
|
844 |
+
<source_model>adminhtml/system_config_source_yesno</source_model>
|
845 |
+
<sort_order>10</sort_order>
|
846 |
+
<show_in_default>1</show_in_default>
|
847 |
+
<show_in_website>1</show_in_website>
|
848 |
+
<show_in_store>1</show_in_store>
|
849 |
+
</notice>
|
850 |
+
<news>
|
851 |
+
<label>Get news and promotion from EasyPdfInvoice.com</label>
|
852 |
+
<frontend_type>select</frontend_type>
|
853 |
+
<source_model>adminhtml/system_config_source_yesno</source_model>
|
854 |
+
<sort_order>20</sort_order>
|
855 |
+
<show_in_default>1</show_in_default>
|
856 |
+
<show_in_website>1</show_in_website>
|
857 |
+
<show_in_store>1</show_in_store>
|
858 |
+
</news>
|
859 |
+
</fields>
|
860 |
+
</notification>
|
861 |
+
<author>
|
862 |
+
<label>Author</label>
|
863 |
+
<frontend_type>text</frontend_type>
|
864 |
+
<sort_order>30</sort_order>
|
865 |
+
<show_in_default>1</show_in_default>
|
866 |
+
<show_in_website>1</show_in_website>
|
867 |
+
<show_in_store>1</show_in_store>
|
868 |
+
<comment><![CDATA[
|
869 |
+
The Easy PDF is developed and supported by <a href="http://www.easypdfinvoice.com/" target="_blank">www.EasyPdfInvoice.com</a>.<br />
|
870 |
+
If you need any support or have any question please contact us at <a href="mailto:support@easypdfinvoice.com">support@easypdfinvoice.com</a> or submit a ticket at <a href="http://ticket.easypdfinvoice.com/" target="_blank">http://ticket.easypdfinvoice.com/</a><br /><br />
|
871 |
+
Best Regards,<br />
|
872 |
+
<strong>Easy PDF Invoice Team</strong>
|
873 |
+
]]></comment>
|
874 |
+
</author>
|
875 |
+
</groups>
|
876 |
+
</pdfpro>
|
877 |
+
</sections>
|
878 |
+
</config>
|
app/code/community/VES/PdfPro/sql/pdfpro_setup/mysql4-install-0.1.0.php
ADDED
@@ -0,0 +1,23 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
$installer = $this;
|
4 |
+
|
5 |
+
$installer->startSetup();
|
6 |
+
$storeIds = Mage::getModel('core/store')->getCollection()->getAllIds();
|
7 |
+
$groupIds = Mage::getModel('customer/group')->getCollection()->getAllIds();
|
8 |
+
$installer->run("
|
9 |
+
|
10 |
+
DROP TABLE IF EXISTS {$this->getTable('pdfpro/key')};
|
11 |
+
CREATE TABLE {$this->getTable('pdfpro/key')} (
|
12 |
+
`entity_id` int(11) unsigned NOT NULL auto_increment,
|
13 |
+
`api_key` varchar(255) NOT NULL default '',
|
14 |
+
`store_ids` varchar(255) NOT NULL default '',
|
15 |
+
`customer_group_ids` varchar(255) NOT NULL default '',
|
16 |
+
`priority` int(11) unsigned NOT NULL default 0,
|
17 |
+
`comment` text NOT NULL default '',
|
18 |
+
`is_default` smallint(6) NOT NULL default '0',
|
19 |
+
PRIMARY KEY (`entity_id`)
|
20 |
+
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
21 |
+
");
|
22 |
+
|
23 |
+
$installer->endSetup();
|
app/design/adminhtml/default/default/layout/ves_pdfpro.xml
ADDED
@@ -0,0 +1,39 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?xml version="1.0"?>
|
2 |
+
<layout version="0.1.0">
|
3 |
+
<default>
|
4 |
+
<reference name="head">
|
5 |
+
<action method="addCss"><name>ves_pdfpro/styles.css</name></action>
|
6 |
+
</reference>
|
7 |
+
<reference name="notifications">
|
8 |
+
<block type="pdfpro/adminhtml_version" name="pdfpro.notifications" template="ves_pdfpro/notifications.phtml"></block>
|
9 |
+
</reference>
|
10 |
+
</default>
|
11 |
+
<adminhtml_sales_order_invoice_view>
|
12 |
+
<block type="pdfpro/adminhtml_sales_order_invoice_view" name="ves_pdfpro" />
|
13 |
+
</adminhtml_sales_order_invoice_view>
|
14 |
+
<adminhtml_sales_order_view>
|
15 |
+
<block type="pdfpro/adminhtml_sales_order_view" name="ves_pdfpro" />
|
16 |
+
</adminhtml_sales_order_view>
|
17 |
+
<adminhtml_sales_order_shipment_view>
|
18 |
+
<block type="pdfpro/adminhtml_sales_order_shipment_view" name="ves_pdfpro" />
|
19 |
+
</adminhtml_sales_order_shipment_view>
|
20 |
+
<adminhtml_sales_order_creditmemo_view>
|
21 |
+
<block type="pdfpro/adminhtml_sales_order_creditmemo_view" name="ves_pdfpro" />
|
22 |
+
</adminhtml_sales_order_creditmemo_view>
|
23 |
+
<pdfpro_cp_adminhtml_key_index>
|
24 |
+
<reference name="content">
|
25 |
+
<block type="pdfpro/adminhtml_key" name="ves_pdfpro_api_key" />
|
26 |
+
</reference>
|
27 |
+
</pdfpro_cp_adminhtml_key_index>
|
28 |
+
<pdfpro_cp_adminhtml_key_edit>
|
29 |
+
<reference name="content">
|
30 |
+
<block type="pdfpro/adminhtml_key_edit" name="apikey_edit"></block>
|
31 |
+
</reference>
|
32 |
+
|
33 |
+
<reference name="left">
|
34 |
+
<block type="pdfpro/adminhtml_key_edit_tabs" name="apikey_edit_tabs">
|
35 |
+
|
36 |
+
</block>
|
37 |
+
</reference>
|
38 |
+
</pdfpro_cp_adminhtml_key_edit>
|
39 |
+
</layout>
|
app/design/adminhtml/default/default/template/ves_pdfpro/notifications.phtml
ADDED
@@ -0,0 +1,44 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* See more VES_PdfPro_Block_Adminhtml_Version
|
4 |
+
*/
|
5 |
+
?>
|
6 |
+
<script type="text/javascript">
|
7 |
+
$$('#nav li span').each(function(s){
|
8 |
+
if(s.innerHTML == 'Easy PDF'){s.addClassName('easypdf-admin-menu');}
|
9 |
+
if(s.innerHTML == 'Visit Website'){s.parentNode.href='http://www.easypdfinvoice.com';s.parentNode.target="_blank";}
|
10 |
+
});
|
11 |
+
Event.observe(window,'load',function(){
|
12 |
+
$$('#system_config_tabs dd a span').each(function(s){
|
13 |
+
if(s.innerHTML.trim()=='Easy PDF'){s.addClassName('easypdf-system-tab');}
|
14 |
+
});
|
15 |
+
});
|
16 |
+
</script>
|
17 |
+
<?php if($this->canDisplayNotice() || $this->canDisplayNews() || $this->canDisplayDefaultApiKeyMsg()):?>
|
18 |
+
<div id="pdfpro-notifications">
|
19 |
+
<?php if($this->canDisplayDefaultApiKeyMsg()):?>
|
20 |
+
<div class="notification-global">
|
21 |
+
<strong>Easy PDF Invoice:</strong>
|
22 |
+
You need to set the default API Key for your website in <a href="<?php echo $this->getUrl('adminhtml/system_config/edit',array('section'=>'pdfpro'));?>">Configuration</a>
|
23 |
+
</div>
|
24 |
+
<?php endif;?>
|
25 |
+
<?php if($this->canDisplayNotice()):?>
|
26 |
+
<?php $serverVersion = $this->getServerVersion();?>
|
27 |
+
<?php if($serverVersion && version_compare(Mage::helper('pdfpro')->getVersion(), $serverVersion,'<')):?>
|
28 |
+
<div class="notification-global">
|
29 |
+
<strong>Easy PDF Invoice:</strong>
|
30 |
+
You are using the old version of Easy PDF (<?php echo Mage::helper('pdfpro')->getVersion();?>).The current version is <?php echo $serverVersion?>. Upgrade to latest version now! <a href="http://www.easypdfinvoice.com/blog/upgrade-easy-pdf-magento-extension/" target="_blank">How to upgrade?</a>
|
31 |
+
</div>
|
32 |
+
<?php endif;?>
|
33 |
+
<?php endif;?>
|
34 |
+
<?php if($this->canDisplayNews()):?>
|
35 |
+
<?php $message = $this->getServerMessage();?>
|
36 |
+
<?php if($message):?>
|
37 |
+
<div class="notification-global notification-global-notice">
|
38 |
+
<strong>Easy PDF Invoice:</strong>
|
39 |
+
<?php echo $message;?>
|
40 |
+
</div>
|
41 |
+
<?php endif;?>
|
42 |
+
<?php endif;?>
|
43 |
+
</div>
|
44 |
+
<?php endif;?>
|
app/etc/modules/VES_PdfPro.xml
ADDED
@@ -0,0 +1,9 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?xml version="1.0"?>
|
2 |
+
<config>
|
3 |
+
<modules>
|
4 |
+
<VES_PdfPro>
|
5 |
+
<active>true</active>
|
6 |
+
<codePool>community</codePool>
|
7 |
+
</VES_PdfPro>
|
8 |
+
</modules>
|
9 |
+
</config>
|
app/locale/en_US/VES_PdfPro.csv
ADDED
@@ -0,0 +1,23 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
"Print Orders","Print Orders"
|
2 |
+
"Print Invoices","Print Invoices"
|
3 |
+
"Print Packingslips","Print Packingslips"
|
4 |
+
"Print Credit Memos","Print Credit Memos"
|
5 |
+
"Print All","Print All"
|
6 |
+
"Print Order","Print Order"
|
7 |
+
"Print Invoice","Print Invoice"
|
8 |
+
"Print Packingslip","Print Packingslip"
|
9 |
+
"Print Credit Memo","Print Credit Memo"
|
10 |
+
"General","General"
|
11 |
+
"Enable Easy PDF Module","Enable Easy PDF Module"
|
12 |
+
"API Key","API Key"
|
13 |
+
"Remove the default print functions","Remove the default print functions"
|
14 |
+
"Replace the default print functions of magento by Easy PDF","Replace the default print functions of magento by Easy PDF"
|
15 |
+
"Print orders from backend","Print orders from backend"
|
16 |
+
"Customer can print PDFs","Customer can print PDF"
|
17 |
+
"If yes, customer will be able to use Easy PDF","If yes, customer will be able to use Easy PDF"
|
18 |
+
"Attach the PDF Order to New Order Email","Attach the PDF Order to New Order Email"
|
19 |
+
"This option will make your checkout a bit of slower for generating the PDF file","This option will make your checkout a bit of slower for generating the PDF file"
|
20 |
+
"Attach the PDF Invoice to Invoice Email","Attach the PDF Invoice to Invoice Email"
|
21 |
+
|
22 |
+
|
23 |
+
|
app/locale/he_IL/VES_PdfPro.csv
ADDED
@@ -0,0 +1,20 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
Print Orders,הדפס הזמנות
|
2 |
+
Print Invoices,הדפס חשבוניות
|
3 |
+
Print Packingslips,הדפס תעודות משלוח
|
4 |
+
Print Credit Memos,הדפס תזכירי אשראי (Credit Memo)
|
5 |
+
Print All,הדפס הכל
|
6 |
+
Print Order,הדפס הזמנה
|
7 |
+
Print Invoice,הדפס חשבונית
|
8 |
+
Print Packingslip,הדפס תעודת משלוח
|
9 |
+
Print Credit Memo,הדפס תזכיר אשראי (Credit Memo)
|
10 |
+
General,כללי
|
11 |
+
Enable Easy PDF Module,הפעל Easy PDF Module
|
12 |
+
API Key,API Key
|
13 |
+
Remove the default print functions,הסר את אפשרויות ההדפסה המקוריות של מג'נטו
|
14 |
+
Replace the default print functions of magento by Easy PDF,החלף את אפשרויות ההדפסה המקוריות של מג'נטו באלה של Easy PDF
|
15 |
+
Print orders from backend,הדפס הזמנות ממשק הניהול
|
16 |
+
Customer can print PDFs,לקוח יכול להדפיס הזמנות
|
17 |
+
"If yes, customer will be able to use Easy PDF","אם כן, לקוח יוכל להשתמש ב Easy PDF"
|
18 |
+
Attach the PDF Order to New Order Email,"צרף PDF שנוצר עם ההזמנה לדוא""ל הזמנה חדשה"
|
19 |
+
This option will make your checkout a bit of slower for generating the PDF file,סימון אפשרות זו יאט במקצת את תהליך היציאה מהחנות בשל יצירת הPDF
|
20 |
+
Attach the PDF Invoice to Invoice Email,"צרף PDF שנוצר עם חשבונית לדוא""ל חשבונית"
|
app/locale/vi_VN/VES_PdfPro.csv
ADDED
@@ -0,0 +1,20 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
"Print Orders","In Các Đơn Đặt Hàng"
|
2 |
+
"Print Invoices","In Các Hóa Đơn"
|
3 |
+
"Print Packingslips","Print Packingslips"
|
4 |
+
"Print Credit Memos","Print Credit Memos"
|
5 |
+
"Print All","In Tất Cả"
|
6 |
+
"Print Order","In Đơn Đặt Hàng"
|
7 |
+
"Print Invoice","In Hóa Đơn"
|
8 |
+
"Print Packingslip","Print Packingslip"
|
9 |
+
"Print Credit Memo","Print Credit Memo"
|
10 |
+
"General","General"
|
11 |
+
"Enable Module","Kích Hoạt Module Easy PDF"
|
12 |
+
"API Key","API Key"
|
13 |
+
"Remove the default print functions","Loại bỏ các chức năng in ấn mặc định"
|
14 |
+
"Replace the default print functions of magento by Easy PDF","Thay thế chức năng in ấn mặc định của magento bởi Easy PDF"
|
15 |
+
"Print orders from backend","In hóa đơn từ trang quản trị"
|
16 |
+
"Customer can print PDFs","Khách hàng có thể in các bản PDF"
|
17 |
+
"If yes, customer will be able to use Easy PDF","Nếu có, khách hàng có thể in đơn hàng, hóa đơn, ... sử dụng Easy PDF"
|
18 |
+
"Attach the PDF Order to New Order Email","Đính kèm đơn hàng (bản PDF) vào email gửi cho khách hàng"
|
19 |
+
"This option will make your checkout a bit of slower for generating the PDF file","Lựa chọn này sẽ làm cho quá trình thanh toán của bạn bị chậm một chút do việc xử lý file PDF"
|
20 |
+
"Attach the PDF Invoice to Invoice Email","Đính kèm hóa đơn (bản PDF) vào email gửi cho khách hàng"
|
media/ves_pdfpro/logos/logo-200x50.jpg
ADDED
Binary file
|
media/ves_pdfpro/logos/logo.png
ADDED
Binary file
|
media/ves_pdfpro/logos/logo_1.png
ADDED
Binary file
|
media/ves_pdfpro/logos/logo_green.png
ADDED
Binary file
|
media/ves_pdfpro/logos/logo_red.png
ADDED
Binary file
|
media/ves_pdfpro/pdf.data
ADDED
@@ -0,0 +1 @@
|
|
|
1 |
+
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
|
package.xml
ADDED
@@ -0,0 +1,24 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?xml version="1.0"?>
|
2 |
+
<package>
|
3 |
+
<name>Easy_PDF_Invoice</name>
|
4 |
+
<version>1.2.0.1.24</version>
|
5 |
+
<stability>stable</stability>
|
6 |
+
<license uri="http://opensource.org/licenses/osl-3.0.php">OSL V3.0</license>
|
7 |
+
<channel>community</channel>
|
8 |
+
<extends/>
|
9 |
+
<summary>PDF generator for magento</summary>
|
10 |
+
<description>Make your store to new higher level by using our Easy PDF extension</description>
|
11 |
+
<notes>- Allow to print orders
|
12 |
+
- Allow to print invoices
|
13 |
+
- Allow to print packingslips
|
14 |
+
- Allow to print credit memos
|
15 |
+
- Allow to attach order pdf in email
|
16 |
+
- Allow to attach invoice pdf in email
|
17 |
+
- Compatible with Aschroder_SMTPPro</notes>
|
18 |
+
<authors><author><name>Easy PDF Invoice</name><user>easypdfinvoice</user><email>easypdfinvoice@gmail.com</email></author></authors>
|
19 |
+
<date>2013-06-28</date>
|
20 |
+
<time>16:31:50</time>
|
21 |
+
<contents><target name="mageetc"><dir name="modules"><file name="VES_PdfPro.xml" hash="4b43f61fe34d6f90260b6008e52e48bd"/></dir></target><target name="magecommunity"><dir name="VES"><dir name="PdfPro"><dir name="Block"><dir name="Adminhtml"><dir name="Key"><dir name="Edit"><file name="Form.php" hash="46346f33119419be5ba874fa7ffd85b6"/><dir name="Tab"><file name="Form.php" hash="6ed2ab13f4e2c5c25671aacf00fe9694"/></dir><file name="Tabs.php" hash="cd9cf71b68f19d9af9a80e8c7898e32f"/></dir><file name="Edit.php" hash="a8798ad23b9da53d836c6947dff2e49a"/><dir name="Grid"><dir name="Renderer"><file name="Group.php" hash="892d50662567d468eb9128034de54f19"/><file name="Store.php" hash="e1f763568b9f84a58798308f83536d7b"/></dir></dir><file name="Grid.php" hash="e7987b06687d69f18000714fc38cbde4"/></dir><file name="Key.php" hash="26f0bacc52c667f6efe91d96e2037865"/><dir name="Sales"><dir name="Order"><dir name="Creditmemo"><file name="View.php" hash="fb2c17f888c8acb5dbe2574e635c77bf"/></dir><dir name="Invoice"><file name="View.php" hash="69fb3ac882ffc657d0879dac143d647e"/></dir><dir name="Shipment"><file name="View.php" hash="633822374d7cc1f9c167af3628069cb5"/></dir><file name="View.php" hash="3a94ef916cf0cc2cb15c02f2e9a3c885"/></dir></dir><dir name="System"><dir name="Config"><dir name="Form"><file name="Fieldset.php" hash="d5504c92beb2bbe5597db4df2695f5b7"/></dir></dir></dir><file name="Version.php" hash="8a6d1b57f42533ed3a3c7294d9550937"/></dir><dir name="Checkout"><dir name="Onepage"><file name="Success.php" hash="9f45ac2f4c5643f7c560f64ec6e879b9"/></dir></dir><dir name="Sales"><dir name="Order"><dir name="Creditmemo"><file name="Items.php" hash="188d1bf570876c1ee4eb10b392826969"/></dir><dir name="Info"><file name="Buttons.php" hash="092e23b4ea0532a0b1c30155bb988500"/></dir><file name="Info.php" hash="df3add1cad16f992c016f34bc50001da"/><dir name="Invoice"><file name="Items.php" hash="af0a2e0530c243f4fc36d2b1ba85a03d"/></dir><dir name="Shipment"><file name="Items.php" hash="05ba7ea0f96dd688e32ac382de3d97aa"/></dir></dir></dir></dir><dir name="Controller"><file name="Abstract.php" hash="3e12df35a1d6741c8c682f1ee5f7d490"/></dir><dir name="Helper"><file name="Data.php" hash="6952dc093b75f410bd1ba676639b935c"/><file name="Giftmessage.php" hash="fd1f964045ff32824d8adeef45d9f353"/></dir><dir name="Model"><file name="Abstract.php" hash="ac9255f2de1037adca999b56382a33a7"/><dir name="Communication"><dir name="Method"><file name="Abstract.php" hash="92691ba24ed56500a517a323dc37c783"/><file name="Soap.php" hash="82304ca82ccdc9a2e77678d992f14c7b"/><file name="Xmlrpc.php" hash="d8adbb280eed2baeac5a37fb7a58a9e9"/></dir></dir><dir name="Email"><dir name="Template"><file name="Mailer.php" hash="c0ce04b3c73aeffd55f94e180e379416"/></dir><file name="Template.php" hash="9dfdc647e61d2b156d1b1d13760ed91e"/></dir><file name="Key.php" hash="8f89ec9497dd0a7ae2cf9ea71af2a910"/><dir name="Mysql4"><dir name="Key"><file name="Collection.php" hash="2a833ffdea395c507056fed369d3efaa"/></dir><file name="Key.php" hash="ac5b19abb5f8cb75f5d4ae7226432158"/></dir><file name="Observer.php" hash="cbb09a71ba4e89a54544f7db079d94cc"/><dir name="Order"><dir name="Creditmemo"><file name="Item.php" hash="561cb96adf9e2eb21e3aacef95ddcd8f"/></dir><file name="Creditmemo.php" hash="9491d108e73004a66545f87f13c5e668"/><dir name="Invoice"><file name="Item.php" hash="30735b2ecbfc4a305fb3086573ff1f3a"/></dir><file name="Invoice.php" hash="b6c7204bd0f76c04115f14452cd5ba3f"/><file name="Item.php" hash="8de01eba904dd0b9936a61dfd6d1a309"/><dir name="Shipment"><file name="Item.php" hash="dc956967b03f0ce61092edf083088992"/></dir><file name="Shipment.php" hash="290f501ec4695ceac86f644fb32250e5"/></dir><file name="Order.php" hash="6623bb46b0d9bfb30bc9f6293dadbc59"/><file name="PdfPro.php" hash="9a2115ae3db5bb777858666a9ebe50cd"/><dir name="Processors"><file name="Easypdf.php" hash="174f02576f916c281c644933a0f26820"/></dir><dir name="Sales"><dir name="Order"><file name="Invoice.php" hash="4a61a399a80f7a9153713f5111e1e1f4"/><dir name="Pdf"><dir name="Total"><file name="Default.php" hash="f2734244f770ef8eed2e4895daaa1b4f"/></dir></dir><file name="Shipment.php" hash="8eb0e36b08068d375cce61a1215a8599"/></dir><file name="Order.php" hash="16950ae3ce187c56beb4f16d842a4a93"/></dir><dir name="Source"><file name="Attach.php" hash="9fc226589336ee965aa0d5208d2dd06e"/><dir name="Communication"><file name="Method.php" hash="c62491193fdb374fdc74e52c02609194"/></dir><file name="Key.php" hash="c9ee12407a20b4fb07bd51bd0029523c"/><file name="Processor.php" hash="6a1e053c02b8e1736f0bfd942ae71434"/></dir><dir name="System"><dir name="Config"><dir name="Backend"><file name="Easypdf.php" hash="503a34f4747cb6387ff7180e4f63b469"/></dir></dir></dir></dir><dir name="controllers"><dir name="Adminhtml"><file name="KeyController.php" hash="55b3292e66dfcde2ab30212175ab0c47"/><file name="PrintController.php" hash="2b1b02a7e50a686d639f346ed5c92e53"/></dir><file name="GuestController.php" hash="850b1dea0389803ace6a7c5455cf28d3"/><file name="PrintController.php" hash="f13d959090b27f318100e4360c9a25ce"/></dir><dir name="etc"><file name="config.xml" hash="000dc9b9c8c9de77c277a2fcfee5630d"/><file name="system.xml" hash="aefa098948007ce86bba679f34d4ab74"/></dir><dir name="sql"><dir name="pdfpro_setup"><file name="mysql4-install-0.1.0.php" hash="568fdc14a81905f4e98857691f765ae8"/></dir></dir></dir></dir></target><target name="magedesign"><dir name="adminhtml"><dir name="default"><dir name="default"><dir name="layout"><file name="ves_pdfpro.xml" hash="4fef100f3a87f396e539ff59fba0d9a6"/></dir><dir name="template"><dir name="ves_pdfpro"><file name="notifications.phtml" hash="2e4a426945b479c2e617cb06d9d506d8"/></dir></dir></dir></dir></dir></target><target name="magelocale"><dir name="en_US"><file name="VES_PdfPro.csv" hash="7443d2a6b55513d5287144307ac41018"/></dir><dir name="vi_VN"><file name="VES_PdfPro.csv" hash="685d513129c86897c9214d67a65f7690"/></dir><dir name="he_IL"><file name="VES_PdfPro.csv" hash="487635adff4c3a8fb47af8048e407c96"/></dir></target><target name="magemedia"><dir name="ves_pdfpro"><dir name="logos"><file name="logo-200x50.jpg" hash="95c633bf6d52affb4af7b60e58907c6f"/><file name="logo.png" hash="4146b1e4bae3158d3ac17054c418a1e1"/><file name="logo_1.png" hash="4146b1e4bae3158d3ac17054c418a1e1"/><file name="logo_green.png" hash="9fdf929173180e7eedd6ed08608d80d1"/><file name="logo_red.png" hash="e7367ecd282a766382ccd00febebd450"/></dir><file name="pdf.data" hash="88c44469dca59ebfcf36cb04d9acf33a"/></dir></target><target name="mageskin"><dir name="adminhtml"><dir name="default"><dir name="default"><dir name="ves_pdfpro"><file name="easypdf.png" hash="8403ec067302a4bf931862ad56965459"/><file name="favicon.png" hash="55210c2ab24e77a654bec6f51922917f"/><file name="js.js" hash="5ab27f2e16b90409bf4268b9afb7488c"/><file name="styles.css" hash="e25f82a17de40e72d7cd062f9f25588b"/></dir></dir></dir></dir></target></contents>
|
22 |
+
<compatible/>
|
23 |
+
<dependencies><required><php><min>5.1.0</min><max>6.0.0</max></php></required></dependencies>
|
24 |
+
</package>
|
skin/adminhtml/default/default/ves_pdfpro/easypdf.png
ADDED
Binary file
|
skin/adminhtml/default/default/ves_pdfpro/favicon.png
ADDED
Binary file
|
skin/adminhtml/default/default/ves_pdfpro/js.js
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
1 |
+
/**
|
2 |
+
*
|
3 |
+
*/
|
skin/adminhtml/default/default/ves_pdfpro/styles.css
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
1 |
+
.easypdf-admin-menu{background: url("favicon.png") no-repeat scroll 0 6px transparent;font-weight: bold;padding-left: 20px;}
|
2 |
+
ul.config-tabs a span.easypdf-system-tab{background-image: url("favicon.png");background-position: 20px 4px;background-repeat: no-repeat;padding-left: 39px;}
|
3 |
+
ul.config-tabs a:hover span.easypdf-system-tab{background-image: url("favicon.png");background-position: 20px 4px;background-repeat: no-repeat;}
|