How to have second loop inside my first loop
I am using array-to-xml package and I have sample (static) data like this one
<RECIEVEITEM operation="Add" REQUESTID="1"> <TRANSACTIONID>264276</TRANSACTIONID> <ITEMLINE operation="Add"> <KeyID>1</KeyID> <ITEMNO>7GE65B</ITEMNO> <QUANTITY>5</QUANTITY> <ITEMUNIT>UNT</ITEMUNIT> <UNITRATIO>1</UNITRATIO> <ITEMRESERVED1 /> <ITEMRESERVED2 /> <ITEMRESERVED3 /> <ITEMRESERVED4 /> <ITEMRESERVED5 /> <ITEMRESERVED6 /> <ITEMRESERVED7 /> <ITEMRESERVED8 /> <ITEMRESERVED9 /> <ITEMRESERVED10 /> <ITEMOVDESC>PRINTER HP DESKJET 2135 (7GE65B) NEW</ITEMOVDESC> <UNITPRICE /> <ITEMDISCPC /> <TAXCODES /> <GROUPSEQ /> <POSEQ /> <BRUTOUNITPRICE>0</BRUTOUNITPRICE> <WAREHOUSEID>345346</WAREHOUSEID> <QTYCONTROL>0</QTYCONTROL> <RISEQ /> <SNHISTORY operation="Ret"><SERIALNUMBER>A1</SERIALNUMBER><EXPIREDDATE>2020-06-30</EXPIREDDATE><QUANTITY>1</QUANTITY><SNSIGN>1</SNSIGN></SNHISTORY> <SNHISTORY operation="Ret"><SERIALNUMBER>A2</SERIALNUMBER><EXPIREDDATE>2020-06-30</EXPIREDDATE><QUANTITY>1</QUANTITY><SNSIGN>1</SNSIGN></SNHISTORY> <SNHISTORY operation="Ret"><SERIALNUMBER>A3</SERIALNUMBER><EXPIREDDATE>2020-06-30</EXPIREDDATE><QUANTITY>1</QUANTITY><SNSIGN>1</SNSIGN></SNHISTORY> <SNHISTORY operation="Ret"><SERIALNUMBER>A4</SERIALNUMBER><EXPIREDDATE>2020-06-30</EXPIREDDATE><QUANTITY>1</QUANTITY><SNSIGN>1</SNSIGN></SNHISTORY> <SNHISTORY operation="Ret"><SERIALNUMBER>A5</SERIALNUMBER><EXPIREDDATE>2020-06-30</EXPIREDDATE><QUANTITY>1</QUANTITY><SNSIGN>1</SNSIGN></SNHISTORY> <RIID /> </ITEMLINE> <INVOICENO>PO-TEST1</INVOICENO> <INVOICEDATE>2020-06-30</INVOICEDATE> <TAX1ID>T</TAX1ID> <TAX1CODE>T</TAX1CODE> <TAX2CODE /> <TAX1RATE>10</TAX1RATE> <TAX2RATE>0</TAX2RATE> <RATE>1</RATE> <INCLUSIVETAX>0</INCLUSIVETAX> <INVOICEISTAXABLE>1</INVOICEISTAXABLE> <CASHDISCOUNT>0</CASHDISCOUNT> <CASHDISCPC /> <INVOICEAMOUNT>0</INVOICEAMOUNT> <TERMSID>Net 30</TERMSID> <FOB /> <PURCHASEORDERNO /> <WAREHOUSEID>345346</WAREHOUSEID> <DESCRIPTION>PO-TEST1</DESCRIPTION> <SHIPDATE>2020-06-30</SHIPDATE> <POSTED>0</POSTED> <FISCALRATE>1</FISCALRATE> <INVFROMPR /> <TAXDATE>2020-06-30</TAXDATE> <VENDORID>PT ECS INDO JAYA</VENDORID> <SEQUENCENO>PO-TEST1</SEQUENCENO> <APACCOUNT>2000.01</APACCOUNT> <SHIPVENDID /> <INVTAXNO2 /> <INVTAXNO1 /> <SSPDATE /> <EXPENSESOFBILLID /> <EXPENSESJOURNALDATETYPE /> <LOCKED_BY /> <LOCKED_TIME /> </RECIEVEITEM>
As you can see tag SNHISTORY
includes array, since RECIEVEITEM
itself is inside an array I would like to know how can I achieve to have SNHISTORY
array?
Code
Commented issue part for you to find is faster 🙂
public function exportReturn(Request $request) { $returnProducts = ReturnProduct::with(['barcode', 'barcode.product', 'barcode.product.allBarcodes', 'outlet', 'user',])->get(); foreach($returnProducts as $item) { $year = Carbon::createFromFormat('Y-m-d H:i:s', $item['created_at'])->year; $month = Carbon::createFromFormat('Y-m-d H:i:s', $item['created_at'])->month; $array = [ "TRANSACTIONS" => [ '_attributes' => [ 'OnError' => 'CONTINUE' ], 'RECIEVEITEM' => [ // image 1 '_attributes' => [ 'operation' => 'Add', 'REQUESTID' => '1' ], 'TRANSACTIONID' => $item['id'], 'ITEMLINE' => [ '_attributes' => [ 'operation' => 'Add' ], 'KeyID' => $item['barcode']['product']['id'], 'ITEMNO' => $item['barcode']['product']['sku'], 'QUANTITY' => $item['barcodes']['product']->allBarcodes->count(), 'ITEMUNIT' => $item['barcode']['product']['unit'], 'UNITRATIO' => '1', 'ITEMRESERVED1' => '', 'ITEMRESERVED2' => '', 'ITEMRESERVED3' => '', 'ITEMRESERVED4' => '', 'ITEMRESERVED5' => '', 'ITEMRESERVED6' => '', 'ITEMRESERVED7' => '', 'ITEMRESERVED8' => '', 'ITEMRESERVED9' => '', 'ITEMRESERVED10' => '', 'ITEMOVDESC' => $item['barcode']['product']['name'], 'UNITPRICE' => $item['barcode']['product']['price'], 'ITEMDISCPC' => '', 'TAXCODES' => '', 'GROUPSEQ' => '', 'POSEQ' => '', 'BRUTOUNITPRICE' => '0', 'WAREHOUSEID' => $item['outlet']['code'], 'QTYCONTROL' => '0', 'RISEQ' => '', 'SNHISTORY' => [ // array of product barcodes '_attributes' => [ 'operation' => 'Ret' ], foreach($item['barcodes']['product']->allBarcodes as $bb) { // this is WRONG (is just here for you to know about data that I need to place here "logic purpose only") 'SERIALNUMBER' => $bb['serial_number'] ? $bb['serial_number'] : $bb['u_serial_number'], 'EXPIREDDATE' => $bb['created_at'], 'QUANTITY' => '1', 'SNSIGN' => '1', } ], 'RIID' => '', ], 'INVOICENO' => 'POINS-001', //test 'INVOICEDATE' => '2020-06-10', //test 'TAX1ID' => 'T', //test 'TAX1CODE' => 'T', //test 'TAX2CODE' => '', 'TAX1RATE' => '10', //test 'TAX2RATE' => '0', //test 'RATE' => '1', //test 'INCLUSIVETAX' => '0', //test 'INVOICEISTAXABLE' => '1', //test 'CASHDISCOUNT' => '0', //test 'CASHDISCPC' => '', 'INVOICEAMOUNT' => '0', //test 'TERMSID' => 'Net 30', //test 'FOB' => '', 'PURCHASEORDERNO' => '', 'WAREHOUSEID' => $outlet['code'], //test 'DESCRIPTION' => '', // reason of return goes here 'SHIPDATE' => '2020-06-10', //test 'POSTED' => '0', //test 'FISCALRATE' => '1', //test 'INVFROMPR' => '', 'TAXDATE' => '2020-06-10', //test 'VENDORID' => 'PT ECS INDO JAYA', //test 'SEQUENCENO' => 'POINS-001', //test 'APACCOUNT' => '2000.01', //test 'SHIPVENDID' => '', 'INVTAXNO2' => '', 'INVTAXNO1' => '', 'SSPDATE' => '', 'EXPENSESOFBILLID' => '', 'EXPENSESJOURNALDATETYPE' => '', 'LOCKED_BY' => '', 'LOCKED_TIME' => '', ] ] ]; } $filename = 'returns.xml'; $result = ArrayToXml::convert($array, [ 'rootElementName' => 'NMEXML', '_attributes' => [ 'EximID'=> "12551", 'BranchCode'=> $item['outlet']['code'], 'ACCOUNTANTCOPYID'=> "" ] ]); Storage::disk('local')->put($filename, $result); $fullPath = url('exports', $filename); return response()->json([ 'data' => $fullPath ]); }
Questions
- How to loop
SNHISTORY
data?
UPDATE
I have changed my code like:
$array = []; foreach($returnProducts as $item) { $year = Carbon::createFromFormat('Y-m-d H:i:s', $item['created_at'])->year; $month = Carbon::createFromFormat('Y-m-d H:i:s', $item['created_at'])->month; foreach($item['barcode']['product']->allBarcodes as $bb) { $shin[] = [ 'SERIALNUMBER' => $bb['serial_number'] ? $bb['serial_number'] : $bb['u_serial_number'], 'EXPIREDDATE' => $bb['created_at'], 'QUANTITY' => '1', 'SNSIGN' => '1', ]; } $array['RECIEVEITEM'] = [ '_attributes' => [ 'operation' => 'Add', 'REQUESTID' => '1' ], 'TRANSACTIONID' => $item['id'], 'ITEMLINE' => [ '_attributes' => [ 'operation' => 'Add' ], 'KeyID' => $item['barcode']['product']['id'], 'ITEMNO' => $item['barcode']['product']['sku'], 'QUANTITY' => $item['barcode']['product']->allBarcodes->count(), 'ITEMUNIT' => $item['barcode']['product']['unit'], 'UNITRATIO' => '1', 'ITEMRESERVED1' => '', 'ITEMRESERVED2' => '', 'ITEMRESERVED3' => '', 'ITEMRESERVED4' => '', 'ITEMRESERVED5' => '', 'ITEMRESERVED6' => '', 'ITEMRESERVED7' => '', 'ITEMRESERVED8' => '', 'ITEMRESERVED9' => '', 'ITEMRESERVED10' => '', 'ITEMOVDESC' => $item['barcode']['product']['name'], 'UNITPRICE' => $item['barcode']['product']['price'], 'ITEMDISCPC' => '', 'TAXCODES' => '', 'GROUPSEQ' => '', 'POSEQ' => '', 'BRUTOUNITPRICE' => '0', 'WAREHOUSEID' => $item['outlet']['code'], 'QTYCONTROL' => '0', 'RISEQ' => '', 'SNHISTORY' => [ '_attributes' => [ 'operation' => 'Ret' ], $shin, ], 'RIID' => '', ], 'INVOICENO' => 'POINS-001', //test 'INVOICEDATE' => '2020-06-10', //test 'TAX1ID' => 'T', //test 'TAX1CODE' => 'T', //test 'TAX2CODE' => '', 'TAX1RATE' => '10', //test 'TAX2RATE' => '0', //test 'RATE' => '1', //test 'INCLUSIVETAX' => '0', //test 'INVOICEISTAXABLE' => '1', //test 'CASHDISCOUNT' => '0', //test 'CASHDISCPC' => '', 'INVOICEAMOUNT' => '0', //test 'TERMSID' => 'Net 30', //test 'FOB' => '', 'PURCHASEORDERNO' => '', 'WAREHOUSEID' => $item['outlet']['code'], //test 'DESCRIPTION' => '', // reason of return goes here 'SHIPDATE' => '2020-06-10', //test 'POSTED' => '0', //test 'FISCALRATE' => '1', //test 'INVFROMPR' => '', 'TAXDATE' => '2020-06-10', //test 'VENDORID' => 'PT ECS INDO JAYA', //test 'SEQUENCENO' => 'POINS-001', //test 'APACCOUNT' => '2000.01', //test 'SHIPVENDID' => '', 'INVTAXNO2' => '', 'INVTAXNO1' => '', 'SSPDATE' => '', 'EXPENSESOFBILLID' => '', 'EXPENSESJOURNALDATETYPE' => '', 'LOCKED_BY' => '', 'LOCKED_TIME' => '', ]; }
Now if I do return response()->json($shin);
it returns data just as I need them
But When I try to use $shin
in my code (as you see in my update code it doesn’t work.
Error? it give error about 100 lines above my code (really not helpful error message)
here is the error in preview tab
exception: "DOMException" file: "..........\vendor\spatie\array-to-xml\src\ArrayToXml.php" line: 152 message: "Invalid Character Error"
here is where i track my controller in response tab
{ "file": "........\\app\\Http\\Controllers\\Api\\XmlExportController.php", "line": 869, "function": "convert", "class": "Spatie\\ArrayToXml\\ArrayToXml", "type": "::" }, { "function": "exportReturn", "class": "App\\Http\\Controllers\\Api\\XmlExportController", "type": "->" },
Any idea?
UPDATE 2
Well I managed to get my SNHISTORY
looped data as array but the issue is while $item['barcode']['product']->allBarcodes
only includes current product barcodes during print somehow it print all barcodes even from other products.
foreach($item['barcode']['product']->allBarcodes as $bb) { $shin[] = [ '_attributes' => [ 'operation' => 'Ret' ], 'SERIALNUMBER' => $bb['serial_number'] ? $bb['serial_number'] : $bb['u_serial_number'], 'EXPIREDDATE' => $bb['created_at'], 'QUANTITY' => '1', 'SNSIGN' => '1', ]; }
and in my xml code
'SNHISTORY' => [ $shin, ],
now it prints like:
result of return response()->json($item['barcode']['product']->allBarcodes);
any idea?
Solved
After doing UPDATE 2
i could fix my extra data by adding $shin = [];
above my loop code.
$shin = []; foreach($item['barcode']['product']->allBarcodes as $bb) { $shin[] = [ '_attributes' => [ 'operation' => 'Ret' ], 'SERIALNUMBER' => $bb->serial_number ? $bb->serial_number : $bb->u_serial_number, 'EXPIREDDATE' => $bb->created_at, 'QUANTITY' => '1', 'SNSIGN' => '1', ]; }
and
'SNHISTORY' => [ $shin, ],
Works as it should be now.