499 lines
18 KiB
PHP
499 lines
18 KiB
PHP
<?php
|
|
|
|
namespace App\Command;
|
|
|
|
use Symfony\Component\Console\Command\Command;
|
|
use Symfony\Component\Console\Input\InputArgument;
|
|
use Symfony\Component\Console\Input\InputInterface;
|
|
use Symfony\Component\Console\Output\OutputInterface;
|
|
use Symfony\Component\HttpKernel\KernelInterface;
|
|
use Symfony\Component\Filesystem\Filesystem;
|
|
|
|
use Doctrine\ORM\EntityManagerInterface;
|
|
|
|
use PDO;
|
|
use DateTime;
|
|
|
|
class GetJobOrderArchiveDataCommand extends Command
|
|
{
|
|
protected $em;
|
|
protected $project_dir;
|
|
protected $filesystem;
|
|
|
|
public function __construct(EntityManagerInterface $em, KernelInterface $kernel, FileSystem $filesystem)
|
|
{
|
|
$this->em = $em;
|
|
$this->project_dir = $kernel->getProjectDir();
|
|
$this->filesystem = $filesystem;
|
|
|
|
parent::__construct();
|
|
}
|
|
|
|
protected function configure()
|
|
{
|
|
$this->setName('joborder:archive')
|
|
->setDescription('Get job order data to archive.')
|
|
->setHelp('Get job order data to archive.')
|
|
->addArgument('year', InputArgument::REQUIRED, 'year');
|
|
}
|
|
|
|
protected function execute(InputInterface $input, OutputInterface $output)
|
|
{
|
|
// get table to back up
|
|
$year = $input->getArgument('year');
|
|
|
|
// get the data to archive for the following tables:
|
|
// (1) job_order
|
|
// (2) invoice (has jo foreign key)
|
|
// (3) invoice_item (has invoice foreign key)
|
|
// (4) ticket (has jo foreign key)
|
|
// (5) jo_rejection (has jo foreign key)
|
|
// (6) rider_rating (has jo foreign key)
|
|
|
|
$jo_backup_data = $this->getJobOrderData($year);
|
|
|
|
// create the archive tables
|
|
// TODO: create the other archive tables
|
|
$archive_table_name = $this->createJobOrderArchiveTable($year);
|
|
|
|
error_log('count ' . count($jo_backup_data));
|
|
|
|
// create the load file for the backup data
|
|
// $this->createLoadDataFileForBackupData($jo_backup_data, $archive_table_name);
|
|
|
|
return 0;
|
|
}
|
|
|
|
protected function getJobOrderData($year)
|
|
{
|
|
$db = $this->em->getConnection();
|
|
|
|
$query_sql = 'SELECT *
|
|
FROM job_order
|
|
WHERE YEAR(date_create) = :year
|
|
ORDER BY date_create';
|
|
|
|
$query_stmt = $db->prepare($query_sql);
|
|
$query_stmt->bindValue('year', $year, PDO::PARAM_STR);
|
|
|
|
$results = $query_stmt->executeQuery();
|
|
|
|
$jo_data = [];
|
|
$jo_event_data = [];
|
|
$invoice_data = [];
|
|
$ticket_data = [];
|
|
$jo_rejection_data = [];
|
|
$rider_rating_data = [];
|
|
|
|
while ($row = $results->fetchAssociative())
|
|
{
|
|
$jo_data[] = $this->createJobOrderArchiveData($row);
|
|
|
|
// get the data to archive for jo_event, invoice, ticket, jo_rejection, rider_rating
|
|
// using the job order id
|
|
$id = $row['id'];
|
|
|
|
$jo_event_data = $this->getJORelatedData($id, 'jo_event');
|
|
$ticket_data = $this->getJORelatedData($id, 'ticket');
|
|
$jo_rejection_data = $this->getJORelatedData($id, 'jo_rejection');
|
|
$rider_rating_data = $this->getJORelatedData($id, 'rider_rating');
|
|
|
|
// TODO: separate the invoice and invoice item data
|
|
}
|
|
|
|
$backup_data = [
|
|
'jo' => $jo_data,
|
|
'jo_event' => $jo_event_data,
|
|
'invoice' => $invoice_data,
|
|
'ticket' => $ticket_data,
|
|
'jo_rejection' => $jo_rejection_data,
|
|
'rider_rating' => $rider_rating_data,
|
|
];
|
|
|
|
return $backup_data;
|
|
}
|
|
|
|
protected function getJORelatedData($id, $table_name)
|
|
{
|
|
$db = $this->em->getConnection();
|
|
|
|
if (($table_name == 'jo_event') ||
|
|
($table_name == 'invoice') ||
|
|
($table_name == 'ticket'))
|
|
{
|
|
$query_sql = 'SELECT *
|
|
FROM ' . $table_name . ' WHERE job_order_id = :id';
|
|
}
|
|
else
|
|
{
|
|
$query_sql = 'SELECT *
|
|
FROM ' . $table_name . ' WHERE jo_id = :id';
|
|
}
|
|
|
|
$query_stmt = $db->prepare($query_sql);
|
|
$query_stmt->bindValue('id', $id);
|
|
|
|
$results = $query_stmt->executeQuery();
|
|
|
|
$jo_related_data = [];
|
|
|
|
while ($row = $results->fetchAssociative())
|
|
{
|
|
if ($table_name == 'jo_event')
|
|
{
|
|
// create the jo event archive data
|
|
$jo_related_data = $this->createJOEventArchiveData($row);
|
|
}
|
|
if ($table_name == 'invoice')
|
|
{
|
|
// get the data to archive for invoice item
|
|
// create the invoice archive data
|
|
}
|
|
if ($table_name == 'ticket')
|
|
{
|
|
// create the ticket archive data
|
|
}
|
|
if ($table_name == 'jo_rejection')
|
|
{
|
|
// create the jo rejection archive data
|
|
}
|
|
if ($table_name == 'rider_rating')
|
|
{
|
|
// create the rider rating archive data
|
|
}
|
|
}
|
|
|
|
return $jo_related_data;
|
|
}
|
|
|
|
// TODO: make this so you just call one function to create all the tables
|
|
// pass the year and the table name
|
|
// set the create sql as a constant or something
|
|
protected function createJobOrderArchiveTable($year)
|
|
{
|
|
// form the archive table name <original table name>_archive_<year of data being archived>
|
|
$archive_table_name = 'job_order_archive_' . $year;
|
|
|
|
// create the table if it doesn't exist
|
|
$db = $this->em->getConnection();
|
|
|
|
// TODO: What if table already exists?
|
|
$create_sql = 'CREATE TABLE IF NOT EXISTS `' . $archive_table_name . '` (
|
|
`id` int(11) NOT NULL,
|
|
`customer_id` int(11) DEFAULT NULL,
|
|
`cvehicle_id` int(11) DEFAULT NULL,
|
|
`rider_id` int(11) DEFAULT NULL,
|
|
`date_create` datetime NOT NULL,
|
|
`date_schedule` datetime NOT NULL,
|
|
`date_fulfill` datetime DEFAULT NULL,
|
|
`coordinates` point NOT NULL COMMENT \'(DC2Type:point)\',
|
|
`flag_advance` tinyint(1) NOT NULL,
|
|
`service_type` varchar(25) COLLATE utf8_unicode_ci NOT NULL,
|
|
`source` varchar(30) COLLATE utf8_unicode_ci NOT NULL,
|
|
`date_cancel` datetime DEFAULT NULL,
|
|
`status` varchar(15) COLLATE utf8_unicode_ci NOT NULL,
|
|
`delivery_instructions` longtext COLLATE utf8_unicode_ci DEFAULT NULL,
|
|
`delivery_address` longtext COLLATE utf8_unicode_ci NOT NULL,
|
|
`create_user_id` int(11) DEFAULT NULL,
|
|
`assign_user_id` int(11) DEFAULT NULL,
|
|
`date_assign` datetime DEFAULT NULL,
|
|
`warranty_class` varchar(25) COLLATE utf8_unicode_ci NOT NULL,
|
|
`process_user_id` int(11) DEFAULT NULL,
|
|
`hub_id` int(11) DEFAULT NULL,
|
|
`cancel_reason` varchar(200) COLLATE utf8_unicode_ci DEFAULT NULL,
|
|
`ref_jo_id` int(11) DEFAULT NULL,
|
|
`tier1_notes` longtext COLLATE utf8_unicode_ci DEFAULT NULL,
|
|
`tier2_notes` longtext COLLATE utf8_unicode_ci DEFAULT NULL,
|
|
`mode_of_payment` varchar(50) COLLATE utf8_unicode_ci NOT NULL,
|
|
`or_name` varchar(80) COLLATE utf8_unicode_ci NOT NULL,
|
|
`landmark` longtext COLLATE utf8_unicode_ci NOT NULL,
|
|
`promo_detail` varchar(80) COLLATE utf8_unicode_ci NOT NULL,
|
|
`or_num` varchar(80) COLLATE utf8_unicode_ci DEFAULT NULL,
|
|
`trade_in_type` varchar(25) COLLATE utf8_unicode_ci DEFAULT NULL,
|
|
`flag_rider_rating` tinyint(1) DEFAULT NULL,
|
|
`flag_coolant` tinyint(1) NOT NULL,
|
|
`facilitated_hub_id` int(11) DEFAULT NULL,
|
|
`facilitated_type` varchar(8) COLLATE utf8_unicode_ci DEFAULT NULL,
|
|
`coord_long` decimal(11,8) NOT NULL,
|
|
`coord_lat` decimal(11,8) NOT NULL,
|
|
`priority` int(11) NOT NULL DEFAULT 0,
|
|
`meta` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL,
|
|
`status_autoassign` varchar(30) COLLATE utf8_unicode_ci DEFAULT NULL,
|
|
`first_name` varchar(80) COLLATE utf8_unicode_ci NOT NULL,
|
|
`last_name` varchar(80) COLLATE utf8_unicode_ci NOT NULL,
|
|
`plate_number` varchar(100) COLLATE utf8_unicode_ci NOT NULL,
|
|
`phone_mobile` varchar(30) COLLATE utf8_unicode_ci NOT NULL,
|
|
`no_trade_in_reason` varchar(80) COLLATE utf8_unicode_ci DEFAULT NULL,
|
|
`will_wait` varchar(30) COLLATE utf8_unicode_ci NOT NULL,
|
|
`reason_not_waiting` varchar(80) COLLATE utf8_unicode_ci DEFAULT NULL,
|
|
`not_waiting_notes` longtext COLLATE utf8_unicode_ci DEFAULT NULL,
|
|
`delivery_status` varchar(30) COLLATE utf8_unicode_ci DEFAULT NULL,
|
|
`emergency_type_id` int(11) DEFAULT NULL,
|
|
`ownership_type_id` int(11) DEFAULT NULL,
|
|
`cust_location_id` int(11) DEFAULT NULL,
|
|
`source_of_awareness` varchar(80) COLLATE utf8_unicode_ci DEFAULT NULL,
|
|
`remarks` longtext COLLATE utf8_unicode_ci DEFAULT NULL,
|
|
`initial_concern` varchar(80) COLLATE utf8_unicode_ci DEFAULT NULL,
|
|
`initial_concern_notes` longtext COLLATE utf8_unicode_ci DEFAULT NULL,
|
|
`gender` varchar(80) COLLATE utf8_unicode_ci DEFAULT NULL,
|
|
`caller_classification` varchar(80) COLLATE utf8_unicode_ci DEFAULT NULL,
|
|
`inventory_count` smallint(6) NOT NULL, PRIMARY KEY (`id`))';
|
|
|
|
$create_stmt = $db->prepare($create_sql);
|
|
|
|
$result = $create_stmt->execute();
|
|
|
|
return $archive_table_name;
|
|
}
|
|
|
|
protected function createJobOrderArchiveData($row)
|
|
{
|
|
// get job order data
|
|
// check for nulls. check the ff fields since these can be null: date_fulfill, date_cancel, date_assign, create_user_id,
|
|
// assign_user_id, process_user_id, hub_id, rider_id, cancel_reason, ref_jo_id, or_num, trade_in_type,
|
|
// flag_rider_rating, facilitated_type, facilitated_hub_id, status_autoassign, reason_not_waiting,
|
|
// not_waiting_notes, no_trade_in_reason, delivery_status, source_of_awareness, remarks, initial_concern,
|
|
// initial_concern_notes, gender, caller_classifications, emergency_type_id, ownership_type_id, cust_location_id
|
|
|
|
$id = $row['id'];
|
|
$cust_id = $row['customer_id'];
|
|
$cv_id = $row['cvehicle_id'];
|
|
|
|
$rider_id = $row['rider_id'] ?? '\N';
|
|
|
|
$date_create = $row['date_create'];
|
|
$date_schedule = $row['date_schedule'];
|
|
|
|
$date_fulfill = $row['date_fulfill'] ?? '\N';
|
|
|
|
$flag_advance = $row['flag_advance'];
|
|
$service_type = $row['service_type'];
|
|
$source = $row['source'];
|
|
|
|
$date_cancel = $row['date_cancel'] ?? '\N';
|
|
|
|
$status = $row['status'];
|
|
|
|
$del_instructions = $this->cleanData($row['delivery_instructions']);
|
|
$del_address = $this->cleanData($row['delivery_address']);
|
|
|
|
$create_user_id = $row['create_user_id'] ?? '\N';
|
|
$assign_user_id = $row['assign_user_id'] ?? '\N';
|
|
$date_assign = $row['date_assign'] ?? '\N';
|
|
|
|
$warr_class = $row['warranty_class'];
|
|
|
|
$process_user_id = $row['process_user_id'] ?? '\N';
|
|
$hub_id = $row['hub_id'] ?? '\N';
|
|
$cancel_reason = $row['cancel_reason'] ?? '\N';
|
|
$ref_jo_id = $row['ref_jo_id'] ?? '\N';
|
|
|
|
$tier1_notes = $this->cleanData($row['tier1_notes']);
|
|
$tier2_notes = $this->cleanData($row['tier2_notes']);
|
|
|
|
$mode_of_payment = $row['mode_of_payment'];
|
|
$or_name = $row['or_name'];
|
|
|
|
$landmark = $this->cleanData($row['landmark']);
|
|
$promo_details = $row['promo_detail'];
|
|
|
|
$or_num = $row['or_num'] ?? '\N';
|
|
$trade_in_type = $row['trade_in_type'] ?? '\N';
|
|
$flag_rider_rating = $row['flag_rider_rating'] ?? '\N';
|
|
|
|
$flag_coolant = $row['flag_coolant'];
|
|
|
|
$fac_hub_id = $row['facilitated_hub_id'] ?? '\N';
|
|
$fac_type = $row['facilitated_type'] ?? '\N';
|
|
|
|
$coord_long = $row['coord_long'];
|
|
$coord_lat = $row['coord_lat'];
|
|
|
|
// coordinates needs special handling since it's a spatial column
|
|
$geo_coordinates = 'POINT(' . $coord_lat . ' ' . $coord_long .')';
|
|
|
|
$priority = $row['priority'];
|
|
$meta = $row['meta'];
|
|
|
|
$status_autoassign = $row['status_autoassign'] ?? '\N';
|
|
|
|
$first_name = $row['first_name'];
|
|
$last_name = $row['last_name'];
|
|
$plate_number = $row['plate_number'];
|
|
$phone_mobile = $row['phone_mobile'];
|
|
|
|
$no_trade_in_reason = $row['no_trade_in_reason'] ?? '\N';
|
|
|
|
$will_wait = $row['will_wait'];
|
|
|
|
$reason_not_waiting = $row['reason_not_waiting'] ?? '\N';
|
|
$not_waiting_notes = $this->cleanData($row['not_waiting_notes']) ?? '\N';
|
|
$del_status = $row['delivery_status'] ?? '\N';
|
|
$emergency_type_id = $row['emergency_type_id'] ?? '\N';
|
|
$owner_type_id = $row['ownership_type_id'] ?? '\N';
|
|
$cust_location_id = $row['cust_location_id'] ?? '\N';
|
|
$source_of_awareness = $row['source_of_awareness'] ?? '\N';
|
|
$remarks = $this->cleanData($row['remarks']) ?? '\N';
|
|
$initial_concern = $row['initial_concern'] ?? '\N';
|
|
$initial_concern_notes = $this->cleanData($row['initial_concern_notes']) ?? '\N';
|
|
$gender = $row['gender'] ?? '\N';
|
|
$caller_class = $row['caller_classification'] ?? '\N';
|
|
|
|
$inv_count = $row['inventory_count'];
|
|
|
|
// create the array for the file
|
|
$data = [
|
|
$id,
|
|
$cust_id,
|
|
$cv_id,
|
|
$rider_id,
|
|
$date_create,
|
|
$date_schedule,
|
|
$date_fulfill,
|
|
$geo_coordinates,
|
|
$flag_advance,
|
|
$service_type,
|
|
$source,
|
|
$date_cancel,
|
|
$status,
|
|
$del_instructions,
|
|
$del_address,
|
|
$create_user_id,
|
|
$assign_user_id,
|
|
$date_assign,
|
|
$warr_class,
|
|
$process_user_id,
|
|
$hub_id,
|
|
$cancel_reason,
|
|
$ref_jo_id,
|
|
$tier1_notes,
|
|
$tier2_notes,
|
|
$mode_of_payment,
|
|
$or_name,
|
|
$landmark,
|
|
$promo_details,
|
|
$or_num,
|
|
$trade_in_type,
|
|
$flag_rider_rating,
|
|
$flag_coolant,
|
|
$fac_hub_id,
|
|
$fac_type,
|
|
$coord_long,
|
|
$coord_lat,
|
|
$priority,
|
|
$meta,
|
|
$status_autoassign,
|
|
$first_name,
|
|
$last_name,
|
|
$plate_number,
|
|
$phone_mobile,
|
|
$no_trade_in_reason,
|
|
$will_wait,
|
|
$reason_not_waiting,
|
|
$not_waiting_notes,
|
|
$del_status,
|
|
$emergency_type_id,
|
|
$owner_type_id,
|
|
$cust_location_id,
|
|
$source_of_awareness,
|
|
$remarks,
|
|
$initial_concern,
|
|
$initial_concern_notes,
|
|
$gender,
|
|
$caller_class,
|
|
$inv_count
|
|
];
|
|
|
|
return $data;
|
|
}
|
|
|
|
protected function createJOEventArchiveData($row)
|
|
{
|
|
// fields that can be null: rider_id, create_user_id
|
|
$id = $row['id'];
|
|
|
|
$create_user_id = $row['create_user_id'] ?? '\N';
|
|
|
|
$job_order_id = $row['job_order_id'];
|
|
$date_create = $row['date_create'];
|
|
$date_happen = $row['date_happen'];
|
|
$type_id = $row['type_id'];
|
|
|
|
$rider_id = $row['rider_id'] ?? '\N';
|
|
|
|
$data = [
|
|
$id,
|
|
$create_user_id,
|
|
$job_order_id,
|
|
$date_create,
|
|
$date_happen,
|
|
$type_id,
|
|
$rider_id,
|
|
];
|
|
|
|
return $data;
|
|
}
|
|
|
|
protected function createLoadDataFileForBackupData($backup_data, $table_name)
|
|
{
|
|
// cache directory
|
|
$cache_dir = __DIR__ . '/../../var/cache';
|
|
|
|
$file = $cache_dir . '/jo_archive.tab';
|
|
error_log('opening file for jo archive - ' . $file);
|
|
|
|
$fp = fopen($file, 'w');
|
|
if ($fp === false)
|
|
{
|
|
error_log('could not open file for load data infile - ' . $file);
|
|
}
|
|
else
|
|
{
|
|
foreach ($backup_data as $key => $data)
|
|
{
|
|
$line = implode('|', $data) . "\r\n";
|
|
fwrite($fp, $line);
|
|
}
|
|
}
|
|
|
|
fclose($fp);
|
|
|
|
$conn = $this->em->getConnection();
|
|
$stmt = $conn->prepare('LOAD DATA LOCAL INFILE \'' . $file . '\' INTO TABLE ' . $table_name . '
|
|
FIELDS TERMINATED BY \'|\'
|
|
LINES TERMINATED BY \'\\r\\n\'
|
|
(id, customer_id, cvehicle_id, rider_id, date_create,
|
|
date_schedule, date_fulfill, @coordinates, flag_advance, service_type,
|
|
source, date_cancel, status, delivery_instructions, delivery_address,
|
|
create_user_id, assign_user_id, date_assign, warranty_class, process_user_id,
|
|
hub_id, cancel_reason, ref_jo_id, tier1_notes, tier2_notes,
|
|
mode_of_payment, or_name, landmark, promo_detail, or_num,
|
|
trade_in_type, flag_rider_rating, flag_coolant, facilitated_hub_id, facilitated_type,
|
|
coord_long, coord_lat, priority, meta, status_autoassign,
|
|
first_name, last_name, plate_number, phone_mobile, no_trade_in_reason,
|
|
will_wait, reason_not_waiting, not_waiting_notes, delivery_status, emergency_type_id,
|
|
ownership_type_id, cust_location_id, source_of_awareness, remarks, initial_concern,
|
|
initial_concern_notes, gender, caller_classification, inventory_count)
|
|
SET coordinates=ST_GeomFromText(@geo_coordinates)'
|
|
);
|
|
|
|
$result = $stmt->execute();
|
|
|
|
if (!$result)
|
|
error_log('Failed loading data.');
|
|
|
|
// TODO: delete file?
|
|
}
|
|
|
|
protected function cleanData($text)
|
|
{
|
|
$clean_text = '';
|
|
|
|
// replace the new lines with whitespace
|
|
$clean_text = preg_replace("/[\n\r]/", ' ', $text);
|
|
|
|
return $clean_text;
|
|
|
|
}
|
|
|
|
}
|