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,52 @@ 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+ $ lines = [];
100+ foreach ( $ this -> getChildren ( $ this -> getItem ()) as $ childItem ) {
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+ $ index ++;
116119 $ prevOptionId = $ attributes ['option_id ' ];
117120 }
118121
@@ -124,35 +127,97 @@ public function draw()
124127 $ feed = 35 ;
125128 $ name = $ childItem ->getName ();
126129 }
127- $ line [] = ['text ' => $ this ->string ->split ($ name , 35 , true , true ), 'feed ' => $ feed ];
130+ $ lines [ $ index ] [] = ['text ' => $ this ->string ->split ($ name , 35 , true , true ), 'feed ' => $ feed ];
128131
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- }
132+ $ lines = $ this ->drawSkus ($ childItem , $ lines );
137133
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 ' ];
134+ $ lines = $ this ->drawPrices ($ childItem , $ lines );
135+ }
136+ $ drawItems [$ optionId ]['lines ' ] = $ lines ;
143137
144- $ tax = $ order -> formatPriceTxt ( $ childItem -> getTaxAmount ()) ;
145- $ line [] = [ ' text ' => $ tax , ' feed ' => 495 , ' font ' => ' bold ' , ' align ' => ' right ' ];
138+ return $ drawItems ;
139+ }
146140
147- $ row_total = $ order ->formatPriceTxt ($ childItem ->getRowTotal ());
148- $ line [] = ['text ' => $ row_total , 'feed ' => 565 , 'font ' => 'bold ' , 'align ' => 'right ' ];
141+ /**
142+ * Draw sku parts
143+ *
144+ * @param DataObject $childItem
145+ * @param array $lines
146+ * @return array
147+ */
148+ private function drawSkus (DataObject $ childItem , array $ lines ): array
149+ {
150+ $ index = array_key_last ($ lines );
151+ if (!$ childItem ->getOrderItem ()->getParentItem ()) {
152+ $ text = [];
153+ foreach ($ this ->string ->split ($ this ->getItem ()->getSku (), 17 ) as $ part ) {
154+ $ text [] = $ part ;
149155 }
156+ $ lines [$ index ][] = ['text ' => $ text , 'feed ' => 255 ];
157+ }
158+
159+ return $ lines ;
160+ }
150161
151- $ drawItems [$ optionId ]['lines ' ][] = $ line ;
162+ /**
163+ * Draw prices for bundle product children items
164+ *
165+ * @param DataObject $childItem
166+ * @param array $lines
167+ * @return array
168+ */
169+ private function drawPrices (DataObject $ childItem , array $ lines ): array
170+ {
171+ $ index = array_key_last ($ lines );
172+ if ($ this ->canShowPriceInfo ($ childItem )) {
173+ $ lines [$ index ][] = ['text ' => $ childItem ->getQty () * 1 , 'feed ' => 435 , 'align ' => 'right ' ];
174+
175+ $ tax = $ this ->getOrder ()->formatPriceTxt ($ childItem ->getTaxAmount ());
176+ $ lines [$ index ][] = ['text ' => $ tax , 'feed ' => 495 , 'font ' => 'bold ' , 'align ' => 'right ' ];
177+
178+ $ item = $ this ->getItem ();
179+ $ this ->_item = $ childItem ;
180+ $ feedPrice = 380 ;
181+ $ feedSubtotal = $ feedPrice + 185 ;
182+ foreach ($ this ->getItemPricesForDisplay () as $ priceData ) {
183+ if (isset ($ priceData ['label ' ])) {
184+ // draw Price label
185+ $ lines [$ index ][] = ['text ' => $ priceData ['label ' ], 'feed ' => $ feedPrice , 'align ' => 'right ' ];
186+ // draw Subtotal label
187+ $ lines [$ index ][] = ['text ' => $ priceData ['label ' ], 'feed ' => $ feedSubtotal , 'align ' => 'right ' ];
188+ $ index ++;
189+ }
190+ // draw Price
191+ $ lines [$ index ][] = [
192+ 'text ' => $ priceData ['price ' ],
193+ 'feed ' => $ feedPrice ,
194+ 'font ' => 'bold ' ,
195+ 'align ' => 'right ' ,
196+ ];
197+ // draw Subtotal
198+ $ lines [$ index ][] = [
199+ 'text ' => $ priceData ['subtotal ' ],
200+ 'feed ' => $ feedSubtotal ,
201+ 'font ' => 'bold ' ,
202+ 'align ' => 'right ' ,
203+ ];
204+ $ index ++;
205+ }
206+ $ this ->_item = $ item ;
152207 }
153208
154- // custom options
155- $ options = $ item ->getOrderItem ()->getProductOptions ();
209+ return $ lines ;
210+ }
211+
212+ /**
213+ * Draw bundle product custom options
214+ *
215+ * @param array $draw
216+ * @return array
217+ */
218+ private function drawCustomOptions (array $ draw ): array
219+ {
220+ $ options = $ this ->getItem ()->getOrderItem ()->getProductOptions ();
156221 if ($ options && isset ($ options ['options ' ])) {
157222 foreach ($ options ['options ' ] as $ option ) {
158223 $ lines = [];
@@ -180,12 +245,10 @@ public function draw()
180245 $ lines [][] = ['text ' => $ text , 'feed ' => 40 ];
181246 }
182247
183- $ drawItems [] = ['lines ' => $ lines , 'height ' => 15 ];
248+ $ draw [] = ['lines ' => $ lines , 'height ' => 15 ];
184249 }
185250 }
186251
187- $ page = $ pdf ->drawLineBlocks ($ page , $ drawItems , ['table_header ' => true ]);
188-
189- $ this ->setPage ($ page );
252+ return $ draw ;
190253 }
191254}
0 commit comments