src/Controller/DataDictionaryController.php line 24

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Entity\DataDictionary;
  4. use App\Repository\FeedRepository;
  5. use Doctrine\DBAL\Connection;
  6. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  7. use Symfony\Component\HttpFoundation\HeaderUtils;
  8. use Symfony\Component\HttpFoundation\Request;
  9. use Symfony\Component\HttpFoundation\StreamedResponse;
  10. use Symfony\Component\Validator\Validation;
  11. use Symfony\Component\Validator\Constraints as Rules;
  12. class DataDictionaryController extends AbstractController
  13. {
  14.     /**
  15.      * @param $clientKey
  16.      * @return \Symfony\Component\HttpFoundation\Response
  17.      * @throws \Doctrine\DBAL\DBALException
  18.      */
  19.     public function index($clientKey)
  20.     {
  21.         $connection $this->getDoctrine()->getConnection();
  22.         $feed = new FeedRepository($connection);
  23.         $data['clients'] = $feed->getActiveClient();
  24.         $data['clientFeeds'] = $feed->findByClient($clientKey);
  25.         $sql "SELECT client_key
  26.                 FROM feeds.CLIENT
  27.                 WHERE name = 'GENERIC'";
  28.         $db $this->getDoctrine()->getConnection();
  29.         $stmt $db->prepare($sql);
  30.         $stmt->execute();
  31.         $genericKey $stmt->fetchColumn();
  32.         $data['genericKey'] = $genericKey;
  33.         
  34.         return $this->render('data_dictionary/index.html.twig'$data);
  35.     }
  36.     
  37.     /**
  38.      * Displays form for creating a new feed
  39.      * @return \Symfony\Component\HttpFoundation\Response
  40.      */
  41.     public function addNewFeed(){
  42.         $data = array(
  43.             'title' => 'Create New Feed',
  44.             'type' => 'create'
  45.         );
  46.         
  47.         return $this->render('data_dictionary/add-edit-feed.html.twig'$data);
  48.     }
  49.     
  50.     /**
  51.      * Adds a new feed to Feed_Summary
  52.      * @param Request $request
  53.      * @return \Symfony\Component\HttpFoundation\Response
  54.      * @throws \Doctrine\DBAL\DBALException
  55.      */
  56.     public function createFeed(Request $request){
  57.         
  58.         $errors $this->validateFeedData($request);
  59.         $data = array(
  60.             'title' => 'Create New Feed',
  61.             'type' => 'create',
  62.             'errors' => $errors
  63.             'feed' => $request->request->all()
  64.         );
  65.         if(count($errors) > 0){
  66.             $this->addFlash('error''One or more errors on form');
  67.             
  68.             return $this->render('data_dictionary/add-edit-feed.html.twig'$data);
  69.         }
  70.         
  71.         $name $request->request->get('name');
  72.         
  73.         $this->createOrUpdateFeedSummary($request);
  74.         
  75.         $this->addFlash('success'"Feed $name created successfully");
  76.         return $this->redirectToRoute('dd_list');
  77.     }
  78.     
  79.     /**
  80.      * 
  81.      * @param int $feedNumber
  82.      * @return \Symfony\Component\HttpFoundation\Response
  83.      */
  84.     public function editFeedSummary($feedNumber){
  85.         $feed $this->getFeedSummary($feedNumber);
  86.         
  87.         if(!$feed){
  88.             $this->addFlash('error''Invalid Feed');
  89.             return $this->redirectToRoute('dd_list');
  90.         }
  91.         
  92.         $data = array(
  93.             'feed'=> $feed,
  94.             'title' => "Editing {$feed['name']}",
  95.             'type' => 'edit'
  96.         );
  97.             
  98.         return $this->render('data_dictionary/add-edit-feed.html.twig'$data);
  99.     }
  100.     
  101.     /**
  102.      * @param Request $request
  103.      * @param         $feedKey
  104.      * @return \Symfony\Component\HttpFoundation\Response
  105.      * @throws \Doctrine\DBAL\DBALException
  106.      */
  107.     public function showFeed(Request $request$feedKey)
  108.     {
  109.         $data['is_support'] = $request->query->get('is_support'0);
  110.         $data['selected_feed'] = $feedKey;
  111.         $connection $this->getDoctrine()->getConnection();
  112.         $feed = new FeedRepository($connection);
  113.         $data['client'] = $feed->findByKey($feedKey);
  114.         $data['feedColumns'] = $feed->findColumnsByKey($feedKey$data['is_support']);
  115.         // get available columns from GENERIC
  116.         if ($data['client']['name'] != 'GENERIC') {
  117.             $feedColumns array_column($data['feedColumns'], 'column_key');
  118.             $sql "SELECT 
  119.                         FC.select_column,
  120.                         FFC.feed_file_column_key,
  121.                         FFC.is_primary_key,
  122.                         FFC.is_business_key,
  123.                         FFC.is_event_date,
  124.                         FFC.is_foreign_key,
  125.                         FFC.is_proprietary_column,
  126.                         FFC.is_eol,
  127.                         FF.file_name,
  128.                         FC.column_key,
  129.                         FC.data_type,
  130.                         IFNULL(FC.allowed_values, 'N/A') AS allowed_values,
  131.                         FC.short_column,
  132.                         FC.long_column,
  133.                         FC.column_description
  134.                     FROM feeds.FEED_COLUMN AS FC
  135.                     JOIN feeds.FEED_FILE_COLUMN FFC
  136.                         ON FFC.column_fkey = FC.column_key
  137.                     JOIN feeds.FEED_FILE FF
  138.                         ON FF.feed_file_key = FFC.feed_file_fkey
  139.                     JOIN feeds.FEED F 
  140.                         ON F.feed_key = FF.feed_fkey
  141.                     JOIN feeds.CLIENT_TO_FEED CTF
  142.                         ON CTF.feed_fkey = F.feed_key
  143.                     JOIN feeds.CLIENT CL 
  144.                         ON CL.client_key = CTF.client_fkey
  145.                     WHERE CL.name = 'GENERIC'
  146.                         AND F.feed_number = {$data['client']['feed_number']}
  147.                         AND FF.is_support_file = ?
  148.                         AND FFC.column_fkey NOT IN (?)
  149.                     ORDER BY FF.file_name, FFC.select_order
  150.             ";
  151.             $stmt $connection->executeQuery($sql,
  152.                 array($request->query->get('is_support'0), $feedColumns),
  153.                 array(\PDO::PARAM_INTConnection::PARAM_INT_ARRAY)
  154.             );
  155.             $data['availableColumns'] = $stmt->fetchAll();
  156.         }
  157.         return $this->render('data_dictionary/feed.html.twig'$data);
  158.     }
  159.     /**
  160.      * @param Request $request
  161.      * @param         $feedKey
  162.      * @return \Symfony\Component\HttpFoundation\RedirectResponse|\Symfony\Component\HttpFoundation\Response
  163.      * @throws \Doctrine\DBAL\DBALException
  164.      */
  165.     public function editFeed(Request $request$feedKey)
  166.     {
  167.         if (!$request->isMethod('POST')) {
  168.             return $this->redirectToRoute('dd_feed_list', ['feedKey' => $feedKey]);
  169.         }
  170.         $columnKeys $request->request->get('column_keys');
  171.         $isSupport $request->query->get('is_support'0);
  172.         $data['is_support'] = $isSupport;
  173.         $data['feed_key'] = $feedKey;
  174.         $connection $this->getDoctrine()->getConnection();
  175.         $feed = new FeedRepository($connection);
  176.         $data['client'] = $feed->findByKey($feedKey);
  177.         $sql "SELECT 
  178.                     FC.select_column,
  179.                     FFC.feed_file_column_key,
  180.                     FFC.is_primary_key,
  181.                     FFC.is_business_key,
  182.                     FFC.is_event_date,
  183.                     FFC.is_foreign_key,
  184.                     FFC.is_eol,
  185.                     FF.file_name,
  186.                     FC.column_key,
  187.                     CFC.client_feed_column_key,
  188.                     IF(ISNULL(CFC.feed_file_column_fkey), FC.data_type, CFC.data_type) AS data_type,
  189.                     IFNULL(IF(ISNULL(CFC.feed_file_column_fkey), FC.allowed_values, CFC.allowed_values), 'N/A') AS allowed_values,
  190.                     IF(ISNULL(CFC.feed_file_column_fkey), FC.short_column, CFC.short_column) AS short_column,
  191.                     IF(ISNULL(CFC.feed_file_column_fkey), FC.long_column, CFC.long_column) AS long_column,
  192.                     IF(ISNULL(CFC.feed_file_column_fkey), FC.column_description, CFC.column_description) AS column_description
  193.                 FROM feeds.FEED_FILE AS FF
  194.                 JOIN feeds.FEED_FILE_COLUMN AS FFC 
  195.                     ON FF.feed_file_key = FFC.feed_file_fkey
  196.                 JOIN feeds.FEED_COLUMN AS FC 
  197.                     ON FFC.column_fkey = FC.column_key
  198.                 LEFT JOIN feeds.CLIENT_FEED_COLUMN AS CFC
  199.                     ON FFC.feed_file_column_key = CFC.feed_file_column_fkey
  200.                 WHERE FFC.feed_file_column_key IN (?)
  201.                 ORDER BY FF.file_name, FFC.select_order";
  202.         $stmt $connection->executeQuery($sql, array($columnKeys), array(Connection::PARAM_INT_ARRAY));
  203.         $data['feedColumns'] = $stmt->fetchAll(\PDO::FETCH_ASSOC);
  204.         return $this->render('data_dictionary/edit.html.twig'$data);
  205.     }
  206.     /**
  207.      * @param Request $request
  208.      * @param         $feedKey
  209.      * @return \Symfony\Component\HttpFoundation\Response
  210.      */
  211.     public function updateFeed(Request $request$feedKey)
  212.     {
  213.         $fileColumnKeys $request->request->get('feed_file_column_keys');
  214.         $columnKeys $request->request->get('column_keys');
  215.         $shortColumns $request->request->get('short_columns');
  216.         $allowedValues $request->request->get('allowed_values');
  217.         $descriptions $request->request->get('descriptions');
  218.         $clientLevels $request->request->get('client_levels');
  219.         $data['is_support'] = $request->request->get('is_support'0);
  220.         $connection $this->getDoctrine()->getConnection();
  221.         $sql "SELECT 
  222.                     C.name,
  223.                     C.client_key,
  224.                     FF.feed_fkey,
  225.                     FF.feed_file_key,
  226.                     LPAD(FS.feed_number, 2, '0') as feed_number,
  227.                     FS.name as feed_name,
  228.                     FS.business_key_description
  229.                 FROM feeds.CLIENT C 
  230.                 JOIN feeds.CLIENT_TO_FEED AS CTF
  231.                     ON CTF.client_fkey = C.client_key
  232.                 JOIN feeds.FEED AS F 
  233.                     ON F.feed_key = CTF.feed_fkey
  234.                 JOIN feeds.FEED_SUMMARY AS FS 
  235.                     ON FS.feed_number = F.feed_number
  236.                 JOIN feeds.FEED_FILE FF
  237.                     ON FF.feed_fkey = F.feed_key
  238.                 WHERE FF.feed_fkey = :feed_fkey";
  239.         $stmt $connection->prepare($sql);
  240.         $stmt->bindValue(':feed_fkey'$feedKey\PDO::PARAM_INT);
  241.         $stmt->execute();
  242.         $data['client'] = $stmt->fetch();
  243.         foreach ($columnKeys as $i => $columnKey) {
  244.             $allowedValue trim($allowedValues[$i]) == 'N/A' null $allowedValues[$i];
  245.             $clientFeedColumnRow $this->clientFeedColumn($fileColumnKeys[$i]);
  246.             $clientFeedColumnKey $clientFeedColumnRow['client_feed_column_key'];
  247.             if (isset($clientLevels[$columnKey]) && !$clientFeedColumnKey) {
  248.                 // Create a new client level Feed Column record
  249.                 $sql " INSERT INTO feeds.CLIENT_FEED_COLUMN (
  250.                             feed_file_column_fkey,
  251.                             long_column,
  252.                             short_column,
  253.                             data_type,
  254.                             allowed_values,
  255.                             column_description,
  256.                             source_table,
  257.                             is_restricted,
  258.                             meta_date_time_created
  259.                         ) SELECT
  260.                             :feed_file_column_key,
  261.                             long_column,
  262.                             :short_column,
  263.                             data_type,
  264.                             :allowed_value,
  265.                             :description,
  266.                             source_table,
  267.                             is_restricted,
  268.                             NOW()
  269.                         FROM feeds.FEED_COLUMN
  270.                         WHERE column_key = :column_key";
  271.                 $stmt $connection->prepare($sql);
  272.                 $stmt->bindValue(':feed_file_column_key'$fileColumnKeys[$i], \PDO::PARAM_INT);
  273.                 $stmt->bindValue(':short_column'$shortColumns[$i], \PDO::PARAM_STR);
  274.                 $stmt->bindValue(':allowed_value'$allowedValue\PDO::PARAM_STR);
  275.                 $stmt->bindValue(':description'$descriptions[$i], \PDO::PARAM_STR);
  276.                 $stmt->bindValue(':column_key'$columnKey\PDO::PARAM_INT);
  277.                 $stmt->execute();
  278.             } elseif ($clientFeedColumnKey) {
  279.                 // Update existing CLIENT_FEED_COLUMN
  280.                 $sql "UPDATE feeds.CLIENT_FEED_COLUMN 
  281.                         SET short_column = :short_column,
  282.                             allowed_values = :allowed_value,
  283.                             column_description = :description
  284.                         WHERE client_feed_column_key = :client_feed_column_key";
  285.                 $stmt $connection->prepare($sql);
  286.                 $stmt->bindValue(':short_column'$shortColumns[$i], \PDO::PARAM_STR);
  287.                 $stmt->bindValue(':allowed_value'$allowedValue\PDO::PARAM_STR);
  288.                 $stmt->bindValue(':description'$descriptions[$i], \PDO::PARAM_STR);
  289.                 $stmt->bindValue(':client_feed_column_key'$clientFeedColumnKey\PDO::PARAM_INT);
  290.                 $stmt->execute();
  291.             } else {
  292.                 // Update existing FEED_COLUMN
  293.                 $sql "UPDATE feeds.FEED_COLUMN 
  294.                         SET short_column = :short_column,
  295.                             allowed_values = :allowed_value,
  296.                             column_description = :description
  297.                         WHERE column_key = :column_key";
  298.                 $stmt $connection->prepare($sql);
  299.                 $stmt->bindValue(':short_column'$shortColumns[$i], \PDO::PARAM_STR);
  300.                 $stmt->bindValue(':allowed_value'$allowedValue\PDO::PARAM_STR);
  301.                 $stmt->bindValue(':description'$descriptions[$i], \PDO::PARAM_STR);
  302.                 $stmt->bindValue(':column_key'$columnKey\PDO::PARAM_INT);
  303.                 $stmt->execute();
  304.             }
  305.         }
  306.         $columnParams array_fill(0count($columnKeys), '?');
  307.         $columnParams implode(','$columnParams);
  308.         $sql "SELECT 
  309.                     FC.select_column,
  310.                     FFC.is_primary_key,
  311.                     FFC.is_business_key,
  312.                     FFC.is_event_date,
  313.                     FFC.is_foreign_key,
  314.                     FFC.is_eol,
  315.                     FF.file_name,
  316.                     FFC.feed_file_column_key,
  317.                     FC.column_key,
  318.                     CFC.client_feed_column_key,
  319.                     IF(ISNULL(CFC.feed_file_column_fkey), FC.data_type, CFC.data_type) AS data_type,
  320.                     IFNULL(IF(ISNULL(CFC.feed_file_column_fkey), FC.allowed_values, CFC.allowed_values), 'N/A') AS allowed_values,
  321.                     IF(ISNULL(CFC.feed_file_column_fkey), FC.short_column, CFC.short_column) AS short_column,
  322.                     IF(ISNULL(CFC.feed_file_column_fkey), FC.long_column, CFC.long_column) AS long_column,
  323.                     IF(ISNULL(CFC.feed_file_column_fkey), FC.column_description, CFC.column_description) AS column_description
  324.                 FROM feeds.FEED_FILE AS FF
  325.                 JOIN feeds.FEED_FILE_COLUMN AS FFC 
  326.                     ON FF.feed_file_key = FFC.feed_file_fkey
  327.                 JOIN feeds.FEED_COLUMN AS FC
  328.                     ON FFC.column_fkey = FC.column_key
  329.                 LEFT JOIN feeds.CLIENT_FEED_COLUMN AS CFC
  330.                     ON FFC.feed_file_column_key = CFC.feed_file_column_fkey
  331.                 WHERE FF.feed_fkey = ?
  332.                       AND FFC.column_fkey IN ($columnParams)
  333.                 ORDER BY FF.file_name, FFC.select_order";
  334.         $stmt $connection->prepare($sql);
  335.         $stmt->bindValue(1$feedKey\PDO::PARAM_INT);
  336.         foreach ($columnKeys as $key => $column) {
  337.             $stmt->bindValue($key 2$column\PDO::PARAM_INT);
  338.         }
  339.         $stmt->execute();
  340.         $data['feedColumns'] = $stmt->fetchAll(\PDO::FETCH_ASSOC);
  341.         return $this->render('data_dictionary/review.html.twig'$data);
  342.     }
  343.     
  344.     /**
  345.      * 
  346.      * @param Request $request
  347.      * @param int $feedNumber
  348.      * @return \Symfony\Component\HttpFoundation\Response
  349.      * @throws \Doctrine\DBAL\DBALException
  350.      */
  351.     public function updateFeedSummary(Request $request$feedNumber){
  352.         
  353.         $feedSummary $this->getFeedSummary($feedNumber);
  354.         if(!$feedSummary){
  355.             $this->addFlash('error''Invalid Feed');
  356.             return $this->redirectToRoute('dd_list');
  357.         }
  358.         
  359.         $errors $this->validateFeedData($request);
  360.         
  361.         $data = array(
  362.             'title' => "Editing {$feedSummary['name']}"
  363.             'errors' => $errors
  364.             'feed' => $request->request->all(),
  365.             'type' => 'edit'
  366.         );
  367.         if(count($errors) > 0){
  368.             $this->addFlash('error''One or more errors on form');
  369.             return $this->render('data_dictionary/add-edit-feed.html.twig'$data);
  370.         }
  371.         $this->createOrUpdateFeedSummary($request);
  372.         
  373.         $this->addFlash('success'"Feed {$feedSummary['name']} updated successfully");
  374.         return $this->redirectToRoute('dd_list');
  375.     }
  376.     /**
  377.      * @param Request $request
  378.      * @param         $feedKey
  379.      * @return \Symfony\Component\HttpFoundation\RedirectResponse
  380.      */
  381.     public function updateKey(Request $request$feedKey)
  382.     {
  383.         $setKey $request->request->get('setKey', []);
  384.         $fileColumnKeys $request->request->get('column_keys', []);
  385.         $isSupport $request->query->get('is_support'0);
  386.         if (empty($fileColumnKeys)) {
  387.             $this->addFlash('error''No column selected.');
  388.             return $this->redirectToRoute('dd_feed_list', ['feedKey' => $feedKey'is_support' => $isSupport]);
  389.         }
  390.         $connection $this->getDoctrine()->getConnection();
  391.         $sql "SELECT 
  392.                     C.name,
  393.                     C.client_key,
  394.                     F.feed_number,
  395.                     FS.name as feed_name,
  396.                     FS.business_key_description
  397.                 FROM feeds.CLIENT C 
  398.                 JOIN feeds.CLIENT_TO_FEED AS CTF
  399.                     ON CTF.client_fkey = C.client_key
  400.                 JOIN feeds.FEED AS F 
  401.                     ON F.feed_key = CTF.feed_fkey
  402.                 JOIN feeds.FEED_SUMMARY AS FS 
  403.                     ON FS.feed_number = F.feed_number
  404.                 WHERE F.feed_key = :feed_key";
  405.         $stmt $connection->prepare($sql);
  406.         $stmt->bindValue(':feed_key'$feedKey\PDO::PARAM_INT);
  407.         $stmt->execute();
  408.         $data['client'] = $stmt->fetch();
  409.         $error false;
  410.         if (!empty($setKey)) {
  411.             if (isset($setKey['primary'])) {
  412.                 $column 'is_primary_key';
  413.                 $label 'Primary Key';
  414.             } elseif (isset($setKey['foreign'])) {
  415.                 $column 'is_foreign_key';
  416.                 $label 'Foreign Key';
  417.             } elseif (isset($setKey['business'])) {
  418.                 $column 'is_business_key';
  419.                 $label 'Business Key';
  420.             } elseif (isset($setKey['eventDate'])) {
  421.                 $column 'is_event_date';
  422.                 $label 'Event Date';
  423.             } elseif (isset($setKey['proprietary'])) {
  424.                 $column 'is_proprietary_column';
  425.                 $label 'Proprietary Column';
  426.             } elseif (isset($setKey['companyBlock'])) {
  427.                 $column 'is_company_block';
  428.                 $label 'Company Block';
  429.             } elseif (isset($setKey['financialBlock'])) {
  430.                 $column 'is_financial_block';
  431.                 $label 'Financial Block';
  432.             } elseif (isset($setKey['hasDelta'])) {
  433.                 $column 'has_delta';
  434.                 $label 'Has Delta';
  435.             } elseif (isset($setKey['isEol'])){
  436.                 $column 'is_eol';
  437.                 $label 'Is EOL';
  438.             } else {
  439.                 $this->addFlash('error''Invalid action.');
  440.                 $error true;
  441.             }
  442.             if (!$error) {
  443.                 $sql "SELECT column_fkey FROM feeds.FEED_FILE_COLUMN
  444.                         WHERE feed_file_column_key IN (?)";
  445.                 $stmt $connection->executeQuery($sql, array($fileColumnKeys), array(Connection::PARAM_INT_ARRAY));
  446.                 $columnKeys array_column($stmt->fetchAll(\PDO::FETCH_NUM), 0);
  447.                 $sql "UPDATE feeds.FEED_FILE_COLUMN FFC
  448.                         JOIN feeds.FEED_FILE FF
  449.                             ON FF.feed_file_key = FFC.feed_file_fkey
  450.                         JOIN feeds.FEED F 
  451.                             ON F.feed_key = FF.feed_fkey
  452.                         SET {$column} = NOT {$column}
  453.                         WHERE F.feed_number = {$data['client']['feed_number']}
  454.                               AND FFC.column_fkey IN (?)";
  455.                 $connection->executeQuery($sql, array($columnKeys), array(Connection::PARAM_INT_ARRAY));
  456.                 $this->addFlash('success'"Successfully updated {$label}");
  457.             }
  458.             return $this->redirectToRoute('dd_feed_list', ['feedKey' => $feedKey'is_support' => $isSupport]);
  459.         }
  460.     }
  461.     /**
  462.      * @param $clientKey
  463.      * @param bool $genericPIT True if the 'Export PIT DD' for generic was pressed, false if otherwise
  464.      * @return StreamedResponse
  465.      * @throws \Doctrine\DBAL\DBALException
  466.      * @throws \PhpOffice\PhpSpreadsheet\Exception
  467.      * @throws \PhpOffice\PhpSpreadsheet\Writer\Exception
  468.      */
  469.     public function export(int $clientKey$genericPIT false)
  470.     {
  471.         $connection $this->getDoctrine()->getConnection();
  472.         $dd = new DataDictionary($connection$clientKey);
  473.         $feed = new FeedRepository($connection);
  474.         $clientName $feed->getClientName($clientKey);
  475.         if ($clientName['name'] === 'GENERIC') {
  476.             $files $dd->exportGeneric($genericPIT);
  477.         } else {
  478.             $files $dd->export();
  479.         }
  480.         // Add _PIT to the parent zip folder only if the GENERIC client is selected and the export PIT DD
  481.         // button is pressed. This is so that there's a GENERIC_DD and GENERIC_PIT_DD
  482.         $fileNamePit '';
  483.         if ($clientName['name'] === 'GENERIC' && $genericPIT) {
  484.             $fileNamePit '_PIT';
  485.         }
  486.         $fileName $clientName['name'] . $fileNamePit '_Data_Dictionary_' date('Ymd') . '.zip';
  487.         $response = new StreamedResponse(function() use ($files$fileName) {
  488.             $options = new \ZipStream\Option\Archive();
  489.             $options->setContentDisposition("attachment;filename='{$fileName}'");
  490.             $options->setContentType('application/octet-stream');
  491.             $options->setZeroHeader(true);
  492.             $zip = new \ZipStream\ZipStream($fileName$options);
  493.             foreach ($files as $originalName => $file) {
  494.                 if (true === file_exists($file)) {
  495.                     $zip->addFileFromPath($originalName$file);
  496.                     // remove generated excel files
  497.                     unlink($file);
  498.                 }
  499.             }
  500.             $zip->finish();
  501.         });
  502.         $response->headers->set('Content-Type''application/octet-stream');
  503.         $disposition HeaderUtils::makeDisposition(
  504.             HeaderUtils::DISPOSITION_ATTACHMENT,
  505.             $fileName
  506.         );
  507.         $response->headers->set('Content-Disposition'$disposition);
  508.         return $response;
  509.     }
  510.     /**
  511.      * Export ERD diagrams of the client's feeds.
  512.      *
  513.      * Diagrams are found within the ERD diagram repository.
  514.      *
  515.      * @param int $clientKey
  516.      * @param bool $genericPIT True if the 'Export PIT ERDs' for generic, false if otherwise
  517.      * @return StreamedResponse
  518.      * @throws \Doctrine\DBAL\DBALException
  519.      */
  520.     public function exportERDs(int $clientKey$genericPIT false)
  521.     {
  522.         // Get the client name and what feeds they have
  523.         $connection $this->getDoctrine()->getConnection();
  524.         $feed = new FeedRepository($connection);
  525.         $clientName $feed->getClientName($clientKey)['name'];
  526.         if ($clientName === 'GENERIC' && $genericPIT) {
  527.             $fileName $clientName '_PIT_ERDs_' date('Ymd') . '.zip';
  528.         } else {
  529.             $fileName $clientName '_ERDs_' date('Ymd') . '.zip';
  530.         }
  531.         $clientFeedNumbers = [];
  532.         foreach ($feed->findByClient($clientKey) as $feedInfo) {
  533.             $feedNumber str_pad($feedInfo['feed_number'], 2'0'STR_PAD_LEFT);
  534.             $clientFeedNumbers[$feedNumber] = $feedInfo['is_normalized'];
  535.         }
  536.         // Get the path to each ERD file
  537.         $dir dirname(__FILE__) . '/../../../erd';
  538.         $ERDs = [];
  539.         foreach ($clientFeedNumbers as $feedNumber => $is_normalized) {
  540.             //only GENERIC standard ERD export needs to be specifically pulling from Standard dir
  541.             if (!$genericPIT && $clientName === 'GENERIC') {
  542.                 $subDir "Feed{$feedNumber}/Standard";
  543.             } else {
  544.                 $subDir $is_normalized"Feed{$feedNumber}/PIT" "Feed{$feedNumber}/Standard";
  545.             }
  546.             $ERDs array_merge($ERDsglob($dir "/$subDir/*.png"));
  547.         }
  548.         $response = new StreamedResponse(function() use($ERDs$fileName) {
  549.             $options = new \ZipStream\Option\Archive();
  550.             $options->setContentDisposition("attachment;filename='{$fileName}'");
  551.             $options->setContentType('application/octet-stream');
  552.             $options->setZeroHeader(true);
  553.             $zip = new \ZipStream\ZipStream($fileName$options);
  554.             foreach ($ERDs as $ERD) {
  555.                 $zip->addFileFromPath(basename($ERD), $ERD);
  556.             }
  557.             $zip->finish();
  558.         });
  559.         $response->headers->set('Content-Type''application/octet-stream');
  560.         $disposition HeaderUtils::makeDisposition(
  561.             HeaderUtils::DISPOSITION_ATTACHMENT,
  562.             $fileName
  563.         );
  564.         $response->headers->set('Content-Disposition'$disposition);
  565.         return $response;
  566.     }
  567.    /**
  568.     * Creates a new feed summary or update existing one
  569.     * @param \Symfony\Component\HttpFoundation\Request $request
  570.     */
  571.     protected function createOrUpdateFeedSummary(Request $request){
  572.         
  573.         $name $request->request->get('name');
  574.         $feedNumber $request->request->get('feed_number');
  575.         $availability $request->request->get('availability');
  576.         $description $request->request->get('description');
  577.         $financialDesc $request->request->get('financial_matching_description');
  578.         $businessDesc $request->request->get('business_key_description');
  579.         $params = array(
  580.                 ':name' => $name':desc' => $description':f_desc' => $financialDesc
  581.                 ':feed_num' => $feedNumber':b_desc' => $businessDesc':avail' => $availability
  582.             );
  583.         $paramsTypes = array(
  584.                 ':name' => \PDO::PARAM_STR':desc' => \PDO::PARAM_STR':f_desc' => \PDO::PARAM_STR
  585.                 ':feed_num' => \PDO::PARAM_INT':b_desc' => \PDO::PARAM_STR':avail' => \PDO::PARAM_STR
  586.             );
  587.         
  588.         
  589.         $connection $this->getDoctrine()->getConnection();
  590.         
  591.         $sql "INSERT into feeds.FEED_SUMMARY 
  592.                 SET name = :name,
  593.                     description = :desc,
  594.                     financial_matching_description = :f_desc,
  595.                     business_key_description = :b_desc,
  596.                     feed_number = :feed_num,
  597.                     availability = :avail,
  598.                     meta_date_time_created = NOW()
  599.                 ON DUPLICATE KEY UPDATE
  600.                     name = :name,
  601.                     description = :desc,
  602.                     financial_matching_description = :f_desc,
  603.                     business_key_description = :b_desc,
  604.                     feed_number = :feed_num,
  605.                     availability = :avail";
  606.         
  607.         $connection->executeQuery($sql$params$paramsTypes);
  608.     }
  609.     
  610.     /**
  611.      * Fetch feed summary from DB by feedNumber
  612.      * @param int $feedNumber
  613.      * @return mixed
  614.      */
  615.     protected function getFeedSummary($feedNumber){
  616.         $connection $this->getDoctrine()->getConnection();
  617.         $sql "select feed_summary_key, feed_number, name, availability, description, business_key_description, financial_matching_description
  618.                 FROM feeds.FEED_SUMMARY
  619.                 WHERE feed_number = :feed_num
  620.         ";
  621.         
  622.         $stmt $connection->prepare($sql);
  623.         $stmt->bindValue(':feed_num'$feedNumber\PDO::PARAM_INT);
  624.         $stmt->execute();
  625.         
  626.         return $stmt->fetch(\PDO::FETCH_ASSOC);
  627.     }
  628.     
  629.     /**
  630.      * Validates feed summary data
  631.      * @param Request $request
  632.      * @return array
  633.      */
  634.     protected function validateFeedData(Request $request){
  635.         
  636.         $fieldsToValidate = array('name''feed_number''availability');
  637.         $dataToValidate = array();
  638.         
  639.         foreach($fieldsToValidate as $field){
  640.             $dataToValidate[$field] = $request->request->get($field);
  641.         }
  642.         
  643.         $rules = new Rules\Collection(array(
  644.             'name' => new Rules\NotBlank(array('message' => 'Name is Required')),
  645.             'feed_number' => new Rules\GreaterThan(array('message' => 'Feed Number must be numeric and greater than 0''value' => 0)),
  646.             'availability' => new Rules\NotBlank(array('message' => 'Availability is Required'))
  647.         ));
  648.         
  649.         $validator Validation::createValidator();
  650.         
  651.         $violations $validator->validate($dataToValidate$rules);
  652.         
  653.         $errors = array();
  654.         
  655.         foreach($violations as $key=>$err){
  656.             $errors[] = $err->getMessage();
  657.         }
  658.         
  659.         return $errors;
  660.     }
  661.     /**
  662.      * Return the existing FEED_FILE_COLUMN row with CFC
  663.      * @param int $feedFileColumnKey
  664.      * @return array
  665.      */
  666.     protected function clientFeedColumn($feedFileColumnKey) {
  667.         $connection $this->getDoctrine()->getConnection();
  668.         $sql "SELECT 
  669.                     FFC.feed_file_column_key, 
  670.                     CFC.client_feed_column_key
  671.                 FROM feeds.FEED_FILE_COLUMN AS FFC
  672.                 LEFT JOIN feeds.CLIENT_FEED_COLUMN AS CFC
  673.                     ON FFC.feed_file_column_key = CFC.feed_file_column_fkey
  674.                 WHERE FFC.feed_file_column_key = :feed_file_column_key";
  675.         $stmt $connection->prepare($sql);
  676.         $stmt->bindValue(':feed_file_column_key'$feedFileColumnKey\PDO::PARAM_INT);
  677.         $stmt->execute();
  678.         $result $stmt->fetch(\PDO::FETCH_ASSOC);
  679.         return $result;
  680.     }
  681. }