Invoice.php 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189
  1. <?php
  2. /**
  3. * Copyright © Magento, Inc. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. namespace Magento\Sales\Model\Order\Pdf;
  7. use Magento\Sales\Model\ResourceModel\Order\Invoice\Collection;
  8. /**
  9. * Sales Order Invoice PDF model
  10. * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
  11. */
  12. class Invoice extends AbstractPdf
  13. {
  14. /**
  15. * @var \Magento\Store\Model\StoreManagerInterface
  16. */
  17. protected $_storeManager;
  18. /**
  19. * @var \Magento\Framework\Locale\ResolverInterface
  20. */
  21. protected $_localeResolver;
  22. /**
  23. * @param \Magento\Payment\Helper\Data $paymentData
  24. * @param \Magento\Framework\Stdlib\StringUtils $string
  25. * @param \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig
  26. * @param \Magento\Framework\Filesystem $filesystem
  27. * @param Config $pdfConfig
  28. * @param \Magento\Sales\Model\Order\Pdf\Total\Factory $pdfTotalFactory
  29. * @param \Magento\Sales\Model\Order\Pdf\ItemsFactory $pdfItemsFactory
  30. * @param \Magento\Framework\Stdlib\DateTime\TimezoneInterface $localeDate
  31. * @param \Magento\Framework\Translate\Inline\StateInterface $inlineTranslation
  32. * @param \Magento\Sales\Model\Order\Address\Renderer $addressRenderer
  33. * @param \Magento\Store\Model\StoreManagerInterface $storeManager
  34. * @param \Magento\Framework\Locale\ResolverInterface $localeResolver
  35. * @param array $data
  36. *
  37. * @SuppressWarnings(PHPMD.ExcessiveParameterList)
  38. */
  39. public function __construct(
  40. \Magento\Payment\Helper\Data $paymentData,
  41. \Magento\Framework\Stdlib\StringUtils $string,
  42. \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig,
  43. \Magento\Framework\Filesystem $filesystem,
  44. Config $pdfConfig,
  45. \Magento\Sales\Model\Order\Pdf\Total\Factory $pdfTotalFactory,
  46. \Magento\Sales\Model\Order\Pdf\ItemsFactory $pdfItemsFactory,
  47. \Magento\Framework\Stdlib\DateTime\TimezoneInterface $localeDate,
  48. \Magento\Framework\Translate\Inline\StateInterface $inlineTranslation,
  49. \Magento\Sales\Model\Order\Address\Renderer $addressRenderer,
  50. \Magento\Store\Model\StoreManagerInterface $storeManager,
  51. \Magento\Framework\Locale\ResolverInterface $localeResolver,
  52. array $data = []
  53. ) {
  54. $this->_storeManager = $storeManager;
  55. $this->_localeResolver = $localeResolver;
  56. parent::__construct(
  57. $paymentData,
  58. $string,
  59. $scopeConfig,
  60. $filesystem,
  61. $pdfConfig,
  62. $pdfTotalFactory,
  63. $pdfItemsFactory,
  64. $localeDate,
  65. $inlineTranslation,
  66. $addressRenderer,
  67. $data
  68. );
  69. }
  70. /**
  71. * Draw header for item table
  72. *
  73. * @param \Zend_Pdf_Page $page
  74. * @return void
  75. */
  76. protected function _drawHeader(\Zend_Pdf_Page $page)
  77. {
  78. /* Add table head */
  79. $this->_setFontRegular($page, 10);
  80. $page->setFillColor(new \Zend_Pdf_Color_Rgb(0.93, 0.92, 0.92));
  81. $page->setLineColor(new \Zend_Pdf_Color_GrayScale(0.5));
  82. $page->setLineWidth(0.5);
  83. $page->drawRectangle(25, $this->y, 570, $this->y - 15);
  84. $this->y -= 10;
  85. $page->setFillColor(new \Zend_Pdf_Color_Rgb(0, 0, 0));
  86. //columns headers
  87. $lines[0][] = ['text' => __('Products'), 'feed' => 35];
  88. $lines[0][] = ['text' => __('SKU'), 'feed' => 290, 'align' => 'right'];
  89. $lines[0][] = ['text' => __('Qty'), 'feed' => 435, 'align' => 'right'];
  90. $lines[0][] = ['text' => __('Price'), 'feed' => 360, 'align' => 'right'];
  91. $lines[0][] = ['text' => __('Tax'), 'feed' => 495, 'align' => 'right'];
  92. $lines[0][] = ['text' => __('Subtotal'), 'feed' => 565, 'align' => 'right'];
  93. $lineBlock = ['lines' => $lines, 'height' => 5];
  94. $this->drawLineBlocks($page, [$lineBlock], ['table_header' => true]);
  95. $page->setFillColor(new \Zend_Pdf_Color_GrayScale(0));
  96. $this->y -= 20;
  97. }
  98. /**
  99. * Return PDF document
  100. *
  101. * @param array|Collection $invoices
  102. * @return \Zend_Pdf
  103. */
  104. public function getPdf($invoices = [])
  105. {
  106. $this->_beforeGetPdf();
  107. $this->_initRenderer('invoice');
  108. $pdf = new \Zend_Pdf();
  109. $this->_setPdf($pdf);
  110. $style = new \Zend_Pdf_Style();
  111. $this->_setFontBold($style, 10);
  112. foreach ($invoices as $invoice) {
  113. if ($invoice->getStoreId()) {
  114. $this->_localeResolver->emulate($invoice->getStoreId());
  115. $this->_storeManager->setCurrentStore($invoice->getStoreId());
  116. }
  117. $page = $this->newPage();
  118. $order = $invoice->getOrder();
  119. /* Add image */
  120. $this->insertLogo($page, $invoice->getStore());
  121. /* Add address */
  122. $this->insertAddress($page, $invoice->getStore());
  123. /* Add head */
  124. $this->insertOrder(
  125. $page,
  126. $order,
  127. $this->_scopeConfig->isSetFlag(
  128. self::XML_PATH_SALES_PDF_INVOICE_PUT_ORDER_ID,
  129. \Magento\Store\Model\ScopeInterface::SCOPE_STORE,
  130. $order->getStoreId()
  131. )
  132. );
  133. /* Add document text and number */
  134. $this->insertDocumentNumber($page, __('Invoice # ') . $invoice->getIncrementId());
  135. /* Add table */
  136. $this->_drawHeader($page);
  137. /* Add body */
  138. foreach ($invoice->getAllItems() as $item) {
  139. if ($item->getOrderItem()->getParentItem()) {
  140. continue;
  141. }
  142. /* Draw item */
  143. $this->_drawItem($item, $page, $order);
  144. $page = end($pdf->pages);
  145. }
  146. /* Add totals */
  147. $this->insertTotals($page, $invoice);
  148. if ($invoice->getStoreId()) {
  149. $this->_localeResolver->revert();
  150. }
  151. }
  152. $this->_afterGetPdf();
  153. return $pdf;
  154. }
  155. /**
  156. * Create new page and assign to PDF object
  157. *
  158. * @param array $settings
  159. * @return \Zend_Pdf_Page
  160. */
  161. public function newPage(array $settings = [])
  162. {
  163. /* Add new table head */
  164. $page = $this->_getPdf()->newPage(\Zend_Pdf_Page::SIZE_A4);
  165. $this->_getPdf()->pages[] = $page;
  166. $this->y = 800;
  167. if (!empty($settings['table_header'])) {
  168. $this->_drawHeader($page);
  169. }
  170. return $page;
  171. }
  172. }