88namespace Magento \Bundle \Model \Sales \Order \Pdf \Items ;
99
1010use Magento \Framework \Data \Collection \AbstractDb ;
11+ use Magento \Framework \DataObject ;
1112use Magento \Framework \Filesystem ;
1213use Magento \Framework \Filter \FilterManager ;
1314use Magento \Framework \Model \Context ;
@@ -69,50 +70,53 @@ public function __construct(
6970 }
7071
7172 /**
72- * Draw item line
73+ * Draw bundle product item line
7374 *
7475 * @return void
75- * @SuppressWarnings(PHPMD.CyclomaticComplexity)
76- * @SuppressWarnings(PHPMD.NPathComplexity)
77- * @SuppressWarnings(PHPMD.ExcessiveMethodLength)
7876 */
7977 public function draw ()
8078 {
81- $ order = $ this ->getOrder ();
82- $ item = $ this ->getItem ();
83- $ pdf = $ this ->getPdf ();
84- $ page = $ this ->getPage ();
79+ $ draw = $ this ->drawChildrenItems ();
80+ $ draw = $ this ->drawCustomOptions ($ draw );
8581
82+ $ page = $ this ->getPdf ()->drawLineBlocks ($ this ->getPage (), $ draw , ['table_header ' => true ]);
83+
84+ $ this ->setPage ($ page );
85+ }
86+
87+ /**
88+ * Draw bundle product children items
89+ *
90+ * @return array
91+ */
92+ private function drawChildrenItems (): array
93+ {
8694 $ this ->_setFontRegular ();
87- $ items = $ this ->getChildren ($ item );
8895
8996 $ prevOptionId = '' ;
9097 $ drawItems = [];
91-
92- foreach ($ items as $ childItem ) {
93- $ line = [];
94-
98+ $ optionId = 0 ;
99+ foreach ($ this -> getChildren ( $ this -> getItem ()) as $ childItem ) {
100+ $ lines = [];
101+ $ index = array_key_last ( $ lines ) !== null ? array_key_last ( $ lines ) + 1 : 0 ;
95102 $ attributes = $ this ->getSelectionAttributes ($ childItem );
96103 if (is_array ($ attributes )) {
97104 $ optionId = $ attributes ['option_id ' ];
98- } else {
99- $ optionId = 0 ;
100105 }
101106
102107 if (!isset ($ drawItems [$ optionId ])) {
103108 $ drawItems [$ optionId ] = ['lines ' => [], 'height ' => 15 ];
104109 }
105110
106111 if ($ childItem ->getOrderItem ()->getParentItem () && $ prevOptionId != $ attributes ['option_id ' ]) {
107- $ line [ 0 ] = [
112+ $ lines [ $ index ][ ] = [
108113 'font ' => 'italic ' ,
109114 'text ' => $ this ->string ->split ($ attributes ['option_label ' ], 45 , true , true ),
110115 'feed ' => 35 ,
111116 ];
112117
113- $ drawItems [$ optionId ] = ['lines ' => [$ line ], 'height ' => 15 ];
114-
115- $ line = [];
118+ $ drawItems [$ optionId ] = ['height ' => 15 ];
119+ $ index ++;
116120 $ prevOptionId = $ attributes ['option_id ' ];
117121 }
118122
@@ -124,35 +128,97 @@ public function draw()
124128 $ feed = 35 ;
125129 $ name = $ childItem ->getName ();
126130 }
127- $ line [] = ['text ' => $ this ->string ->split ($ name , 35 , true , true ), 'feed ' => $ feed ];
131+ $ lines [ $ index ] [] = ['text ' => $ this ->string ->split ($ name , 35 , true , true ), 'feed ' => $ feed ];
128132
129- // draw SKUs
130- if (!$ childItem ->getOrderItem ()->getParentItem ()) {
131- $ text = [];
132- foreach ($ this ->string ->split ($ item ->getSku (), 17 ) as $ part ) {
133- $ text [] = $ part ;
134- }
135- $ line [] = ['text ' => $ text , 'feed ' => 255 ];
136- }
133+ $ lines = $ this ->drawSkus ($ childItem , $ lines );
137134
138- // draw prices
139- if ($ this ->canShowPriceInfo ($ childItem )) {
140- $ price = $ order ->formatPriceTxt ($ childItem ->getPrice ());
141- $ line [] = ['text ' => $ price , 'feed ' => 395 , 'font ' => 'bold ' , 'align ' => 'right ' ];
142- $ line [] = ['text ' => $ childItem ->getQty () * 1 , 'feed ' => 435 , 'font ' => 'bold ' ];
135+ $ lines = $ this ->drawPrices ($ childItem , $ lines );
136+ $ drawItems [$ optionId ]['lines ' ] = $ lines ;
137+ }
143138
144- $ tax = $ order -> formatPriceTxt ( $ childItem -> getTaxAmount ()) ;
145- $ line [] = [ ' text ' => $ tax , ' feed ' => 495 , ' font ' => ' bold ' , ' align ' => ' right ' ];
139+ return $ drawItems ;
140+ }
146141
147- $ row_total = $ order ->formatPriceTxt ($ childItem ->getRowTotal ());
148- $ line [] = ['text ' => $ row_total , 'feed ' => 565 , 'font ' => 'bold ' , 'align ' => 'right ' ];
142+ /**
143+ * Draw sku parts
144+ *
145+ * @param DataObject $childItem
146+ * @param array $lines
147+ * @return array
148+ */
149+ private function drawSkus (DataObject $ childItem , array $ lines ): array
150+ {
151+ $ index = array_key_last ($ lines );
152+ if (!$ childItem ->getOrderItem ()->getParentItem ()) {
153+ $ text = [];
154+ foreach ($ this ->string ->split ($ this ->getItem ()->getSku (), 17 ) as $ part ) {
155+ $ text [] = $ part ;
149156 }
157+ $ lines [$ index ][] = ['text ' => $ text , 'feed ' => 255 ];
158+ }
159+
160+ return $ lines ;
161+ }
150162
151- $ drawItems [$ optionId ]['lines ' ][] = $ line ;
163+ /**
164+ * Draw prices for bundle product children items
165+ *
166+ * @param DataObject $childItem
167+ * @param array $lines
168+ * @return array
169+ */
170+ private function drawPrices (DataObject $ childItem , array $ lines ): array
171+ {
172+ $ index = array_key_last ($ lines );
173+ if ($ this ->canShowPriceInfo ($ childItem )) {
174+ $ lines [$ index ][] = ['text ' => $ childItem ->getQty () * 1 , 'feed ' => 435 , 'align ' => 'right ' ];
175+
176+ $ tax = $ this ->getOrder ()->formatPriceTxt ($ childItem ->getTaxAmount ());
177+ $ lines [$ index ][] = ['text ' => $ tax , 'feed ' => 495 , 'font ' => 'bold ' , 'align ' => 'right ' ];
178+
179+ $ item = $ this ->getItem ();
180+ $ this ->_item = $ childItem ;
181+ $ feedPrice = 380 ;
182+ $ feedSubtotal = $ feedPrice + 185 ;
183+ foreach ($ this ->getItemPricesForDisplay () as $ priceData ) {
184+ if (isset ($ priceData ['label ' ])) {
185+ // draw Price label
186+ $ lines [$ index ][] = ['text ' => $ priceData ['label ' ], 'feed ' => $ feedPrice , 'align ' => 'right ' ];
187+ // draw Subtotal label
188+ $ lines [$ index ][] = ['text ' => $ priceData ['label ' ], 'feed ' => $ feedSubtotal , 'align ' => 'right ' ];
189+ $ index ++;
190+ }
191+ // draw Price
192+ $ lines [$ index ][] = [
193+ 'text ' => $ priceData ['price ' ],
194+ 'feed ' => $ feedPrice ,
195+ 'font ' => 'bold ' ,
196+ 'align ' => 'right ' ,
197+ ];
198+ // draw Subtotal
199+ $ lines [$ index ][] = [
200+ 'text ' => $ priceData ['subtotal ' ],
201+ 'feed ' => $ feedSubtotal ,
202+ 'font ' => 'bold ' ,
203+ 'align ' => 'right ' ,
204+ ];
205+ $ index ++;
206+ }
207+ $ this ->_item = $ item ;
152208 }
153209
154- // custom options
155- $ options = $ item ->getOrderItem ()->getProductOptions ();
210+ return $ lines ;
211+ }
212+
213+ /**
214+ * Draw bundle product custom options
215+ *
216+ * @param array $draw
217+ * @return array
218+ */
219+ private function drawCustomOptions (array $ draw ): array
220+ {
221+ $ options = $ this ->getItem ()->getOrderItem ()->getProductOptions ();
156222 if ($ options && isset ($ options ['options ' ])) {
157223 foreach ($ options ['options ' ] as $ option ) {
158224 $ lines = [];
@@ -180,12 +246,10 @@ public function draw()
180246 $ lines [][] = ['text ' => $ text , 'feed ' => 40 ];
181247 }
182248
183- $ drawItems [] = ['lines ' => $ lines , 'height ' => 15 ];
249+ $ draw [] = ['lines ' => $ lines , 'height ' => 15 ];
184250 }
185251 }
186252
187- $ page = $ pdf ->drawLineBlocks ($ page , $ drawItems , ['table_header ' => true ]);
188-
189- $ this ->setPage ($ page );
253+ return $ draw ;
190254 }
191255}
0 commit comments