src/Controller/EgdDeclarationController.php line 20
<?phpnamespace App\Controller;use App\Entity\EgdDeclaration;use App\Repository\EgdDeclarationRepository;use App\Service\Egd\EgdApiClient;use Doctrine\ORM\EntityManagerInterface;use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;use Symfony\Component\HttpFoundation\Request;use Symfony\Component\HttpFoundation\Response;use Symfony\Component\Routing\Annotation\Route;#[Route('/egd-declaration')]class EgdDeclarationController extends AbstractController{#[Route('/upload', name: 'app_egd_declaration_upload', methods: ['GET', 'POST'])]public function uploadExcel(Request $request,EntityManagerInterface $em,EgdApiClient $apiClient,\App\Service\Egd\EgdXmlBuilder $xmlBuilder): Response {if ($request->isMethod('POST')) {$uploadedFile = $request->files->get('file');if ($uploadedFile) {try {$fileDirectory = $this->getParameter('kernel.project_dir') . '/var/uploads';if (!is_dir($fileDirectory)) {mkdir($fileDirectory, 0777, true);}$originalExtension = pathinfo($uploadedFile->getClientOriginalName(), PATHINFO_EXTENSION);$newFilename = uniqid() . '.' . $originalExtension;$uploadedFile->move($fileDirectory, $newFilename);$filePath = $fileDirectory . '/' . $newFilename;if (!class_exists('\PhpOffice\PhpSpreadsheet\IOFactory')) {throw new \Exception('PhpSpreadsheet is not installed. Please run: composer require phpoffice/phpspreadsheet');}$spreadsheet = \PhpOffice\PhpSpreadsheet\IOFactory::load($filePath);$worksheet = $spreadsheet->getActiveSheet();$data = [];$columnHeaders = [];foreach ($worksheet->getRowIterator() as $row) {foreach ($row->getCellIterator() as $cell) {$columnHeaders[] = $cell->getValue();}break;}foreach ($worksheet->getRowIterator() as $rowIndex => $row) {if ($rowIndex === 1) continue; // Skip headers$rowValues = [];$cellIterator = $row->getCellIterator();$cellIterator->setIterateOnlyExistingCells(false);foreach ($cellIterator as $cell) {$rowValues[] = $cell->getValue();}// Make sure we have the same number of keys and valuesif (count($columnHeaders) === count($rowValues)) {$data[] = array_combine($columnHeaders, $rowValues);}}// Build XML$masterWaybillId = $request->request->get('masterWaybillId', 'TD-000000001');$xmlData = $xmlBuilder->buildFromExcelData($data, $masterWaybillId);// Create Local Declaration$declaration = new EgdDeclaration();$courierDocId = $this->generateUuid();$messageId = $this->generateUuid();$declaration->setCourierDocId($courierDocId);$declaration->setMessageId($messageId);$declaration->setMasterWaybillId($masterWaybillId);$declaration->setOperation('Store');$declaration->setStatus('PENDING_SUBMIT');$declaration->setXmlData($xmlData);$em->persist($declaration);$em->flush();// Submit to EGD API$response = $apiClient->submitDeclaration($courierDocId, $messageId, 'Store', $xmlData);if ($response['success']) {$declaration->setStatus('SUBMITTED');$this->addFlash('success', 'Excel processed and declaration successfully submitted to EGD.');} else {$declaration->setStatus('FAILED');$declaration->setErrors($response['error'] ?? null);$this->addFlash('error', 'Failed to submit declaration to EGD.');}$em->flush();// Cleanup temp file@unlink($filePath);return $this->redirectToRoute('app_egd_declaration_show', ['id' => $declaration->getId()]);} catch (\Exception $e) {$this->addFlash('error', 'Error processing Excel: ' . $e->getMessage());}} else {$this->addFlash('error', 'No file uploaded.');}}return $this->render('egd_declaration/upload.html.twig');}#[Route('/new', name: 'app_egd_declaration_new', methods: ['GET', 'POST'])]public function new(Request $request, EntityManagerInterface $em, EgdApiClient $apiClient): Response{if ($request->isMethod('POST')) {$xmlData = $request->request->get('xmlData');if (empty($xmlData)) {$this->addFlash('error', 'XML Data cannot be empty.');return $this->redirectToRoute('app_egd_declaration_new');}$declaration = new EgdDeclaration();$courierDocId = $this->generateUuid();$messageId = $this->generateUuid();$declaration->setCourierDocId($courierDocId);$declaration->setMessageId($messageId);$declaration->setOperation('Store');$declaration->setStatus('PENDING_SUBMIT');$declaration->setXmlData($xmlData);$em->persist($declaration);$em->flush();// Submit to EGD$response = $apiClient->submitDeclaration($courierDocId, $messageId, 'Store', $xmlData);if ($response['success']) {$declaration->setStatus('SUBMITTED');$this->addFlash('success', 'Declaration successfully submitted to EGD.');} else {$declaration->setStatus('FAILED');$declaration->setErrors($response['error'] ?? null);$this->addFlash('error', 'Failed to submit declaration to EGD.');}$em->flush();return $this->redirectToRoute('app_egd_declaration_show', ['id' => $declaration->getId()]);}// We load the sample XML for convenience$sampleXmlPath = $this->getParameter('kernel.project_dir') . '/sample-DGEC-declaration.xml';$sampleXml = file_exists($sampleXmlPath) ? file_get_contents($sampleXmlPath) : '';return $this->render('egd_declaration/new.html.twig', ['sampleXml' => $sampleXml,]);}#[Route('/{id}', name: 'app_egd_declaration_show', methods: ['GET'])]public function show(EgdDeclaration $declaration): Response{return $this->render('egd_declaration/show.html.twig', ['declaration' => $declaration,]);}#[Route('/{id}/refresh', name: 'app_egd_declaration_refresh', methods: ['POST'])]public function refresh(EgdDeclaration $declaration, EgdApiClient $apiClient, EntityManagerInterface $em): Response{$response = $apiClient->getSubmissionStatus($declaration->getMessageId());if ($response['status'] === 200) {$data = $response['data'];if (isset($data['status'])) {$declaration->setStatus($data['status']);$em->flush();$this->addFlash('success', 'Status refreshed from EGD.');}} else {$this->addFlash('error', 'Could not refresh status. HTTP Code: ' . $response['status']);}return $this->redirectToRoute('app_egd_declaration_show', ['id' => $declaration->getId()]);}private function generateUuid(): string{$data = random_bytes(16);$data[6] = chr(ord($data[6]) & 0x0f | 0x40);$data[8] = chr(ord($data[8]) & 0x3f | 0x80);return vsprintf('%s%s-%s-%s-%s-%s%s%s', str_split(bin2hex($data), 4));}}