<?php
namespace App\Controller;
use App\Entity\DataDictionary;
use App\Repository\FeedRepository;
use Doctrine\DBAL\Connection;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\HeaderUtils;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\StreamedResponse;
use Symfony\Component\Validator\Validation;
use Symfony\Component\Validator\Constraints as Rules;
class DataDictionaryController extends AbstractController
{
/**
* @param $clientKey
* @return \Symfony\Component\HttpFoundation\Response
* @throws \Doctrine\DBAL\DBALException
*/
public function index($clientKey)
{
$connection = $this->getDoctrine()->getConnection();
$feed = new FeedRepository($connection);
$data['clients'] = $feed->getActiveClient();
$data['clientFeeds'] = $feed->findByClient($clientKey);
$sql = "SELECT client_key
FROM feeds.CLIENT
WHERE name = 'GENERIC'";
$db = $this->getDoctrine()->getConnection();
$stmt = $db->prepare($sql);
$stmt->execute();
$genericKey = $stmt->fetchColumn();
$data['genericKey'] = $genericKey;
return $this->render('data_dictionary/index.html.twig', $data);
}
/**
* Displays form for creating a new feed
* @return \Symfony\Component\HttpFoundation\Response
*/
public function addNewFeed(){
$data = array(
'title' => 'Create New Feed',
'type' => 'create'
);
return $this->render('data_dictionary/add-edit-feed.html.twig', $data);
}
/**
* Adds a new feed to Feed_Summary
* @param Request $request
* @return \Symfony\Component\HttpFoundation\Response
* @throws \Doctrine\DBAL\DBALException
*/
public function createFeed(Request $request){
$errors = $this->validateFeedData($request);
$data = array(
'title' => 'Create New Feed',
'type' => 'create',
'errors' => $errors,
'feed' => $request->request->all()
);
if(count($errors) > 0){
$this->addFlash('error', 'One or more errors on form');
return $this->render('data_dictionary/add-edit-feed.html.twig', $data);
}
$name = $request->request->get('name');
$this->createOrUpdateFeedSummary($request);
$this->addFlash('success', "Feed $name created successfully");
return $this->redirectToRoute('dd_list');
}
/**
*
* @param int $feedNumber
* @return \Symfony\Component\HttpFoundation\Response
*/
public function editFeedSummary($feedNumber){
$feed = $this->getFeedSummary($feedNumber);
if(!$feed){
$this->addFlash('error', 'Invalid Feed');
return $this->redirectToRoute('dd_list');
}
$data = array(
'feed'=> $feed,
'title' => "Editing {$feed['name']}",
'type' => 'edit'
);
return $this->render('data_dictionary/add-edit-feed.html.twig', $data);
}
/**
* @param Request $request
* @param $feedKey
* @return \Symfony\Component\HttpFoundation\Response
* @throws \Doctrine\DBAL\DBALException
*/
public function showFeed(Request $request, $feedKey)
{
$data['is_support'] = $request->query->get('is_support', 0);
$data['selected_feed'] = $feedKey;
$connection = $this->getDoctrine()->getConnection();
$feed = new FeedRepository($connection);
$data['client'] = $feed->findByKey($feedKey);
$data['feedColumns'] = $feed->findColumnsByKey($feedKey, $data['is_support']);
// get available columns from GENERIC
if ($data['client']['name'] != 'GENERIC') {
$feedColumns = array_column($data['feedColumns'], 'column_key');
$sql = "SELECT
FC.select_column,
FFC.feed_file_column_key,
FFC.is_primary_key,
FFC.is_business_key,
FFC.is_event_date,
FFC.is_foreign_key,
FFC.is_proprietary_column,
FFC.is_eol,
FF.file_name,
FC.column_key,
FC.data_type,
IFNULL(FC.allowed_values, 'N/A') AS allowed_values,
FC.short_column,
FC.long_column,
FC.column_description
FROM feeds.FEED_COLUMN AS FC
JOIN feeds.FEED_FILE_COLUMN FFC
ON FFC.column_fkey = FC.column_key
JOIN feeds.FEED_FILE FF
ON FF.feed_file_key = FFC.feed_file_fkey
JOIN feeds.FEED F
ON F.feed_key = FF.feed_fkey
JOIN feeds.CLIENT_TO_FEED CTF
ON CTF.feed_fkey = F.feed_key
JOIN feeds.CLIENT CL
ON CL.client_key = CTF.client_fkey
WHERE CL.name = 'GENERIC'
AND F.feed_number = {$data['client']['feed_number']}
AND FF.is_support_file = ?
AND FFC.column_fkey NOT IN (?)
ORDER BY FF.file_name, FFC.select_order
";
$stmt = $connection->executeQuery($sql,
array($request->query->get('is_support', 0), $feedColumns),
array(\PDO::PARAM_INT, Connection::PARAM_INT_ARRAY)
);
$data['availableColumns'] = $stmt->fetchAll();
}
return $this->render('data_dictionary/feed.html.twig', $data);
}
/**
* @param Request $request
* @param $feedKey
* @return \Symfony\Component\HttpFoundation\RedirectResponse|\Symfony\Component\HttpFoundation\Response
* @throws \Doctrine\DBAL\DBALException
*/
public function editFeed(Request $request, $feedKey)
{
if (!$request->isMethod('POST')) {
return $this->redirectToRoute('dd_feed_list', ['feedKey' => $feedKey]);
}
$columnKeys = $request->request->get('column_keys');
$isSupport = $request->query->get('is_support', 0);
$data['is_support'] = $isSupport;
$data['feed_key'] = $feedKey;
$connection = $this->getDoctrine()->getConnection();
$feed = new FeedRepository($connection);
$data['client'] = $feed->findByKey($feedKey);
$sql = "SELECT
FC.select_column,
FFC.feed_file_column_key,
FFC.is_primary_key,
FFC.is_business_key,
FFC.is_event_date,
FFC.is_foreign_key,
FFC.is_eol,
FF.file_name,
FC.column_key,
CFC.client_feed_column_key,
IF(ISNULL(CFC.feed_file_column_fkey), FC.data_type, CFC.data_type) AS data_type,
IFNULL(IF(ISNULL(CFC.feed_file_column_fkey), FC.allowed_values, CFC.allowed_values), 'N/A') AS allowed_values,
IF(ISNULL(CFC.feed_file_column_fkey), FC.short_column, CFC.short_column) AS short_column,
IF(ISNULL(CFC.feed_file_column_fkey), FC.long_column, CFC.long_column) AS long_column,
IF(ISNULL(CFC.feed_file_column_fkey), FC.column_description, CFC.column_description) AS column_description
FROM feeds.FEED_FILE AS FF
JOIN feeds.FEED_FILE_COLUMN AS FFC
ON FF.feed_file_key = FFC.feed_file_fkey
JOIN feeds.FEED_COLUMN AS FC
ON FFC.column_fkey = FC.column_key
LEFT JOIN feeds.CLIENT_FEED_COLUMN AS CFC
ON FFC.feed_file_column_key = CFC.feed_file_column_fkey
WHERE FFC.feed_file_column_key IN (?)
ORDER BY FF.file_name, FFC.select_order";
$stmt = $connection->executeQuery($sql, array($columnKeys), array(Connection::PARAM_INT_ARRAY));
$data['feedColumns'] = $stmt->fetchAll(\PDO::FETCH_ASSOC);
return $this->render('data_dictionary/edit.html.twig', $data);
}
/**
* @param Request $request
* @param $feedKey
* @return \Symfony\Component\HttpFoundation\Response
*/
public function updateFeed(Request $request, $feedKey)
{
$fileColumnKeys = $request->request->get('feed_file_column_keys');
$columnKeys = $request->request->get('column_keys');
$shortColumns = $request->request->get('short_columns');
$allowedValues = $request->request->get('allowed_values');
$descriptions = $request->request->get('descriptions');
$clientLevels = $request->request->get('client_levels');
$data['is_support'] = $request->request->get('is_support', 0);
$connection = $this->getDoctrine()->getConnection();
$sql = "SELECT
C.name,
C.client_key,
FF.feed_fkey,
FF.feed_file_key,
LPAD(FS.feed_number, 2, '0') as feed_number,
FS.name as feed_name,
FS.business_key_description
FROM feeds.CLIENT C
JOIN feeds.CLIENT_TO_FEED AS CTF
ON CTF.client_fkey = C.client_key
JOIN feeds.FEED AS F
ON F.feed_key = CTF.feed_fkey
JOIN feeds.FEED_SUMMARY AS FS
ON FS.feed_number = F.feed_number
JOIN feeds.FEED_FILE FF
ON FF.feed_fkey = F.feed_key
WHERE FF.feed_fkey = :feed_fkey";
$stmt = $connection->prepare($sql);
$stmt->bindValue(':feed_fkey', $feedKey, \PDO::PARAM_INT);
$stmt->execute();
$data['client'] = $stmt->fetch();
foreach ($columnKeys as $i => $columnKey) {
$allowedValue = trim($allowedValues[$i]) == 'N/A' ? null : $allowedValues[$i];
$clientFeedColumnRow = $this->clientFeedColumn($fileColumnKeys[$i]);
$clientFeedColumnKey = $clientFeedColumnRow['client_feed_column_key'];
if (isset($clientLevels[$columnKey]) && !$clientFeedColumnKey) {
// Create a new client level Feed Column record
$sql = " INSERT INTO feeds.CLIENT_FEED_COLUMN (
feed_file_column_fkey,
long_column,
short_column,
data_type,
allowed_values,
column_description,
source_table,
is_restricted,
meta_date_time_created
) SELECT
:feed_file_column_key,
long_column,
:short_column,
data_type,
:allowed_value,
:description,
source_table,
is_restricted,
NOW()
FROM feeds.FEED_COLUMN
WHERE column_key = :column_key";
$stmt = $connection->prepare($sql);
$stmt->bindValue(':feed_file_column_key', $fileColumnKeys[$i], \PDO::PARAM_INT);
$stmt->bindValue(':short_column', $shortColumns[$i], \PDO::PARAM_STR);
$stmt->bindValue(':allowed_value', $allowedValue, \PDO::PARAM_STR);
$stmt->bindValue(':description', $descriptions[$i], \PDO::PARAM_STR);
$stmt->bindValue(':column_key', $columnKey, \PDO::PARAM_INT);
$stmt->execute();
} elseif ($clientFeedColumnKey) {
// Update existing CLIENT_FEED_COLUMN
$sql = "UPDATE feeds.CLIENT_FEED_COLUMN
SET short_column = :short_column,
allowed_values = :allowed_value,
column_description = :description
WHERE client_feed_column_key = :client_feed_column_key";
$stmt = $connection->prepare($sql);
$stmt->bindValue(':short_column', $shortColumns[$i], \PDO::PARAM_STR);
$stmt->bindValue(':allowed_value', $allowedValue, \PDO::PARAM_STR);
$stmt->bindValue(':description', $descriptions[$i], \PDO::PARAM_STR);
$stmt->bindValue(':client_feed_column_key', $clientFeedColumnKey, \PDO::PARAM_INT);
$stmt->execute();
} else {
// Update existing FEED_COLUMN
$sql = "UPDATE feeds.FEED_COLUMN
SET short_column = :short_column,
allowed_values = :allowed_value,
column_description = :description
WHERE column_key = :column_key";
$stmt = $connection->prepare($sql);
$stmt->bindValue(':short_column', $shortColumns[$i], \PDO::PARAM_STR);
$stmt->bindValue(':allowed_value', $allowedValue, \PDO::PARAM_STR);
$stmt->bindValue(':description', $descriptions[$i], \PDO::PARAM_STR);
$stmt->bindValue(':column_key', $columnKey, \PDO::PARAM_INT);
$stmt->execute();
}
}
$columnParams = array_fill(0, count($columnKeys), '?');
$columnParams = implode(',', $columnParams);
$sql = "SELECT
FC.select_column,
FFC.is_primary_key,
FFC.is_business_key,
FFC.is_event_date,
FFC.is_foreign_key,
FFC.is_eol,
FF.file_name,
FFC.feed_file_column_key,
FC.column_key,
CFC.client_feed_column_key,
IF(ISNULL(CFC.feed_file_column_fkey), FC.data_type, CFC.data_type) AS data_type,
IFNULL(IF(ISNULL(CFC.feed_file_column_fkey), FC.allowed_values, CFC.allowed_values), 'N/A') AS allowed_values,
IF(ISNULL(CFC.feed_file_column_fkey), FC.short_column, CFC.short_column) AS short_column,
IF(ISNULL(CFC.feed_file_column_fkey), FC.long_column, CFC.long_column) AS long_column,
IF(ISNULL(CFC.feed_file_column_fkey), FC.column_description, CFC.column_description) AS column_description
FROM feeds.FEED_FILE AS FF
JOIN feeds.FEED_FILE_COLUMN AS FFC
ON FF.feed_file_key = FFC.feed_file_fkey
JOIN feeds.FEED_COLUMN AS FC
ON FFC.column_fkey = FC.column_key
LEFT JOIN feeds.CLIENT_FEED_COLUMN AS CFC
ON FFC.feed_file_column_key = CFC.feed_file_column_fkey
WHERE FF.feed_fkey = ?
AND FFC.column_fkey IN ($columnParams)
ORDER BY FF.file_name, FFC.select_order";
$stmt = $connection->prepare($sql);
$stmt->bindValue(1, $feedKey, \PDO::PARAM_INT);
foreach ($columnKeys as $key => $column) {
$stmt->bindValue($key + 2, $column, \PDO::PARAM_INT);
}
$stmt->execute();
$data['feedColumns'] = $stmt->fetchAll(\PDO::FETCH_ASSOC);
return $this->render('data_dictionary/review.html.twig', $data);
}
/**
*
* @param Request $request
* @param int $feedNumber
* @return \Symfony\Component\HttpFoundation\Response
* @throws \Doctrine\DBAL\DBALException
*/
public function updateFeedSummary(Request $request, $feedNumber){
$feedSummary = $this->getFeedSummary($feedNumber);
if(!$feedSummary){
$this->addFlash('error', 'Invalid Feed');
return $this->redirectToRoute('dd_list');
}
$errors = $this->validateFeedData($request);
$data = array(
'title' => "Editing {$feedSummary['name']}",
'errors' => $errors,
'feed' => $request->request->all(),
'type' => 'edit'
);
if(count($errors) > 0){
$this->addFlash('error', 'One or more errors on form');
return $this->render('data_dictionary/add-edit-feed.html.twig', $data);
}
$this->createOrUpdateFeedSummary($request);
$this->addFlash('success', "Feed {$feedSummary['name']} updated successfully");
return $this->redirectToRoute('dd_list');
}
/**
* @param Request $request
* @param $feedKey
* @return \Symfony\Component\HttpFoundation\RedirectResponse
*/
public function updateKey(Request $request, $feedKey)
{
$setKey = $request->request->get('setKey', []);
$fileColumnKeys = $request->request->get('column_keys', []);
$isSupport = $request->query->get('is_support', 0);
if (empty($fileColumnKeys)) {
$this->addFlash('error', 'No column selected.');
return $this->redirectToRoute('dd_feed_list', ['feedKey' => $feedKey, 'is_support' => $isSupport]);
}
$connection = $this->getDoctrine()->getConnection();
$sql = "SELECT
C.name,
C.client_key,
F.feed_number,
FS.name as feed_name,
FS.business_key_description
FROM feeds.CLIENT C
JOIN feeds.CLIENT_TO_FEED AS CTF
ON CTF.client_fkey = C.client_key
JOIN feeds.FEED AS F
ON F.feed_key = CTF.feed_fkey
JOIN feeds.FEED_SUMMARY AS FS
ON FS.feed_number = F.feed_number
WHERE F.feed_key = :feed_key";
$stmt = $connection->prepare($sql);
$stmt->bindValue(':feed_key', $feedKey, \PDO::PARAM_INT);
$stmt->execute();
$data['client'] = $stmt->fetch();
$error = false;
if (!empty($setKey)) {
if (isset($setKey['primary'])) {
$column = 'is_primary_key';
$label = 'Primary Key';
} elseif (isset($setKey['foreign'])) {
$column = 'is_foreign_key';
$label = 'Foreign Key';
} elseif (isset($setKey['business'])) {
$column = 'is_business_key';
$label = 'Business Key';
} elseif (isset($setKey['eventDate'])) {
$column = 'is_event_date';
$label = 'Event Date';
} elseif (isset($setKey['proprietary'])) {
$column = 'is_proprietary_column';
$label = 'Proprietary Column';
} elseif (isset($setKey['companyBlock'])) {
$column = 'is_company_block';
$label = 'Company Block';
} elseif (isset($setKey['financialBlock'])) {
$column = 'is_financial_block';
$label = 'Financial Block';
} elseif (isset($setKey['hasDelta'])) {
$column = 'has_delta';
$label = 'Has Delta';
} elseif (isset($setKey['isEol'])){
$column = 'is_eol';
$label = 'Is EOL';
} else {
$this->addFlash('error', 'Invalid action.');
$error = true;
}
if (!$error) {
$sql = "SELECT column_fkey FROM feeds.FEED_FILE_COLUMN
WHERE feed_file_column_key IN (?)";
$stmt = $connection->executeQuery($sql, array($fileColumnKeys), array(Connection::PARAM_INT_ARRAY));
$columnKeys = array_column($stmt->fetchAll(\PDO::FETCH_NUM), 0);
$sql = "UPDATE feeds.FEED_FILE_COLUMN FFC
JOIN feeds.FEED_FILE FF
ON FF.feed_file_key = FFC.feed_file_fkey
JOIN feeds.FEED F
ON F.feed_key = FF.feed_fkey
SET {$column} = NOT {$column}
WHERE F.feed_number = {$data['client']['feed_number']}
AND FFC.column_fkey IN (?)";
$connection->executeQuery($sql, array($columnKeys), array(Connection::PARAM_INT_ARRAY));
$this->addFlash('success', "Successfully updated {$label}");
}
return $this->redirectToRoute('dd_feed_list', ['feedKey' => $feedKey, 'is_support' => $isSupport]);
}
}
/**
* @param $clientKey
* @param bool $genericPIT True if the 'Export PIT DD' for generic was pressed, false if otherwise
* @return StreamedResponse
* @throws \Doctrine\DBAL\DBALException
* @throws \PhpOffice\PhpSpreadsheet\Exception
* @throws \PhpOffice\PhpSpreadsheet\Writer\Exception
*/
public function export(int $clientKey, $genericPIT = false)
{
$connection = $this->getDoctrine()->getConnection();
$dd = new DataDictionary($connection, $clientKey);
$feed = new FeedRepository($connection);
$clientName = $feed->getClientName($clientKey);
if ($clientName['name'] === 'GENERIC') {
$files = $dd->exportGeneric($genericPIT);
} else {
$files = $dd->export();
}
// Add _PIT to the parent zip folder only if the GENERIC client is selected and the export PIT DD
// button is pressed. This is so that there's a GENERIC_DD and GENERIC_PIT_DD
$fileNamePit = '';
if ($clientName['name'] === 'GENERIC' && $genericPIT) {
$fileNamePit = '_PIT';
}
$fileName = $clientName['name'] . $fileNamePit . '_Data_Dictionary_' . date('Ymd') . '.zip';
$response = new StreamedResponse(function() use ($files, $fileName) {
$options = new \ZipStream\Option\Archive();
$options->setContentDisposition("attachment;filename='{$fileName}'");
$options->setContentType('application/octet-stream');
$options->setZeroHeader(true);
$zip = new \ZipStream\ZipStream($fileName, $options);
foreach ($files as $originalName => $file) {
if (true === file_exists($file)) {
$zip->addFileFromPath($originalName, $file);
// remove generated excel files
unlink($file);
}
}
$zip->finish();
});
$response->headers->set('Content-Type', 'application/octet-stream');
$disposition = HeaderUtils::makeDisposition(
HeaderUtils::DISPOSITION_ATTACHMENT,
$fileName
);
$response->headers->set('Content-Disposition', $disposition);
return $response;
}
/**
* Export ERD diagrams of the client's feeds.
*
* Diagrams are found within the ERD diagram repository.
*
* @param int $clientKey
* @param bool $genericPIT True if the 'Export PIT ERDs' for generic, false if otherwise
* @return StreamedResponse
* @throws \Doctrine\DBAL\DBALException
*/
public function exportERDs(int $clientKey, $genericPIT = false)
{
// Get the client name and what feeds they have
$connection = $this->getDoctrine()->getConnection();
$feed = new FeedRepository($connection);
$clientName = $feed->getClientName($clientKey)['name'];
if ($clientName === 'GENERIC' && $genericPIT) {
$fileName = $clientName . '_PIT_ERDs_' . date('Ymd') . '.zip';
} else {
$fileName = $clientName . '_ERDs_' . date('Ymd') . '.zip';
}
$clientFeedNumbers = [];
foreach ($feed->findByClient($clientKey) as $feedInfo) {
$feedNumber = str_pad($feedInfo['feed_number'], 2, '0', STR_PAD_LEFT);
$clientFeedNumbers[$feedNumber] = $feedInfo['is_normalized'];
}
// Get the path to each ERD file
$dir = dirname(__FILE__) . '/../../../erd';
$ERDs = [];
foreach ($clientFeedNumbers as $feedNumber => $is_normalized) {
//only GENERIC standard ERD export needs to be specifically pulling from Standard dir
if (!$genericPIT && $clientName === 'GENERIC') {
$subDir = "Feed{$feedNumber}/Standard";
} else {
$subDir = $is_normalized? "Feed{$feedNumber}/PIT" : "Feed{$feedNumber}/Standard";
}
$ERDs = array_merge($ERDs, glob($dir . "/$subDir/*.png"));
}
$response = new StreamedResponse(function() use($ERDs, $fileName) {
$options = new \ZipStream\Option\Archive();
$options->setContentDisposition("attachment;filename='{$fileName}'");
$options->setContentType('application/octet-stream');
$options->setZeroHeader(true);
$zip = new \ZipStream\ZipStream($fileName, $options);
foreach ($ERDs as $ERD) {
$zip->addFileFromPath(basename($ERD), $ERD);
}
$zip->finish();
});
$response->headers->set('Content-Type', 'application/octet-stream');
$disposition = HeaderUtils::makeDisposition(
HeaderUtils::DISPOSITION_ATTACHMENT,
$fileName
);
$response->headers->set('Content-Disposition', $disposition);
return $response;
}
/**
* Creates a new feed summary or update existing one
* @param \Symfony\Component\HttpFoundation\Request $request
*/
protected function createOrUpdateFeedSummary(Request $request){
$name = $request->request->get('name');
$feedNumber = $request->request->get('feed_number');
$availability = $request->request->get('availability');
$description = $request->request->get('description');
$financialDesc = $request->request->get('financial_matching_description');
$businessDesc = $request->request->get('business_key_description');
$params = array(
':name' => $name, ':desc' => $description, ':f_desc' => $financialDesc,
':feed_num' => $feedNumber, ':b_desc' => $businessDesc, ':avail' => $availability
);
$paramsTypes = array(
':name' => \PDO::PARAM_STR, ':desc' => \PDO::PARAM_STR, ':f_desc' => \PDO::PARAM_STR,
':feed_num' => \PDO::PARAM_INT, ':b_desc' => \PDO::PARAM_STR, ':avail' => \PDO::PARAM_STR
);
$connection = $this->getDoctrine()->getConnection();
$sql = "INSERT into feeds.FEED_SUMMARY
SET name = :name,
description = :desc,
financial_matching_description = :f_desc,
business_key_description = :b_desc,
feed_number = :feed_num,
availability = :avail,
meta_date_time_created = NOW()
ON DUPLICATE KEY UPDATE
name = :name,
description = :desc,
financial_matching_description = :f_desc,
business_key_description = :b_desc,
feed_number = :feed_num,
availability = :avail";
$connection->executeQuery($sql, $params, $paramsTypes);
}
/**
* Fetch feed summary from DB by feedNumber
* @param int $feedNumber
* @return mixed
*/
protected function getFeedSummary($feedNumber){
$connection = $this->getDoctrine()->getConnection();
$sql = "select feed_summary_key, feed_number, name, availability, description, business_key_description, financial_matching_description
FROM feeds.FEED_SUMMARY
WHERE feed_number = :feed_num
";
$stmt = $connection->prepare($sql);
$stmt->bindValue(':feed_num', $feedNumber, \PDO::PARAM_INT);
$stmt->execute();
return $stmt->fetch(\PDO::FETCH_ASSOC);
}
/**
* Validates feed summary data
* @param Request $request
* @return array
*/
protected function validateFeedData(Request $request){
$fieldsToValidate = array('name', 'feed_number', 'availability');
$dataToValidate = array();
foreach($fieldsToValidate as $field){
$dataToValidate[$field] = $request->request->get($field);
}
$rules = new Rules\Collection(array(
'name' => new Rules\NotBlank(array('message' => 'Name is Required')),
'feed_number' => new Rules\GreaterThan(array('message' => 'Feed Number must be numeric and greater than 0', 'value' => 0)),
'availability' => new Rules\NotBlank(array('message' => 'Availability is Required'))
));
$validator = Validation::createValidator();
$violations = $validator->validate($dataToValidate, $rules);
$errors = array();
foreach($violations as $key=>$err){
$errors[] = $err->getMessage();
}
return $errors;
}
/**
* Return the existing FEED_FILE_COLUMN row with CFC
* @param int $feedFileColumnKey
* @return array
*/
protected function clientFeedColumn($feedFileColumnKey) {
$connection = $this->getDoctrine()->getConnection();
$sql = "SELECT
FFC.feed_file_column_key,
CFC.client_feed_column_key
FROM feeds.FEED_FILE_COLUMN AS FFC
LEFT JOIN feeds.CLIENT_FEED_COLUMN AS CFC
ON FFC.feed_file_column_key = CFC.feed_file_column_fkey
WHERE FFC.feed_file_column_key = :feed_file_column_key";
$stmt = $connection->prepare($sql);
$stmt->bindValue(':feed_file_column_key', $feedFileColumnKey, \PDO::PARAM_INT);
$stmt->execute();
$result = $stmt->fetch(\PDO::FETCH_ASSOC);
return $result;
}
}