Merge branch 'master' of gitlab.com:jankstudio/resq into 654-script-to-fulflll-job-orders

This commit is contained in:
Korina Cordero 2022-05-11 03:04:42 +00:00
commit 1a7d53ca01
5 changed files with 924 additions and 9 deletions

View file

@ -301,3 +301,8 @@ services:
App\Service\HubFilteringGeoChecker: App\Service\HubFilteringGeoChecker:
arguments: arguments:
$geofence_flag: "%env(HUB_GEOFENCE_ENABLE)%" $geofence_flag: "%env(HUB_GEOFENCE_ENABLE)%"
# bulk warranty uploader
App\Service\WarrantyBulkUploader:
arguments:
$em: "@doctrine.orm.entity_manager"

View file

@ -0,0 +1,464 @@
<?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 Doctrine\ORM\EntityManagerInterface;
use App\Ramcar\WarrantySource;
use App\Ramcar\WarrantyStatus;
use App\Ramcar\WarrantyClass;
use DateTime;
use DateInterval;
use PDO;
class TestWarrantyUploadCommand extends Command
{
const F_ENCODER = 0;
const F_DATE_ENCODED = 1;
const F_FNAME = 2;
const F_LNAME = 3;
const F_EMAIL = 4;
const F_ADDRESS = 5;
const F_MOBILE = 6;
const F_TELEPHONE = 7;
const F_VMAKE = 8;
const F_VMODEL = 9;
const F_MYEAR = 10;
const F_PLATE_NUMBER = 11;
const F_SERIAL = 12;
const F_INVOICE_NUM = 13;
const F_DATE_PURCHASE = 14;
const F_DIST_NAME = 15;
const F_DIST_ADDRESS = 16;
const F_APP_TYPE_ID = 17;
const F_BATT_ID = 18; // sap code in system
const F_OWNER_TYPE = 19;
protected $em;
protected $batt_hash;
protected $sap_batt_hash;
public function __construct(EntityManagerInterface $em)
{
$this->em = $em;
parent::__construct();
}
protected function configure()
{
$this->setName('testwarranty:upload')
->setDescription('Test bulk warranty upload.')
->setHelp('Test bulk warranty upload.')
->addArgument('input_file', InputArgument::REQUIRED, 'Path to the CSV file.')
->addArgument('output_file', InputArgument::REQUIRED, 'Path to output file.');
}
protected function execute(InputInterface $input, OutputInterface $output)
{
// hash the battery table using sap_code as index
$this->populateBatteryIndex();
$csv_file = $input->getArgument('input_file');
$output_file = $input->getArgument('output_file');
// attempt to open file
try
{
$fh = fopen($csv_file, "r");
}
catch (Exception $e)
{
throw new Exception('The file "' . $csv_file . '" could be read.');
}
$output_info = [];
// loop through rows
// ignore first row since that's header data
$row_num = 0;
$sql_values = '';
while (($fields = fgetcsv($fh)) !== false)
{
// ignore first row since that's the header
if ($row_num == 0)
{
$row_num++;
continue;
}
// process row
$output_info[] = $this->processRow($fields, $sql_values);
$row_num++;
}
// check if we have values to insert
if (strlen($sql_values) > 0)
{
$sql_statement = 'INSERT INTO `warranty` (bty_model_id,bty_size_id,sap_bty_id,serial,warranty_class,plate_number,status,date_create,date_purchase,date_expire,first_name,last_name,mobile_number,flag_activated,vehicle_id,customer_id, create_source) VALUES ' . $sql_values . ';' . "\n";
// error_log($sql_statement);
$conn = $this->em->getConnection();
$stmt = $conn->prepare($sql_statement);
$stmt->execute();
}
// write to output file
$this->outputWarrantyInfo($output_file, $output_info);
fclose($fh);
return 0;
}
protected function processRow($fields, &$sql_values)
{
error_log('Processing warranty with serial ' . trim($fields[self::F_SERIAL]));
$output_info = [];
// get necessary fields
$fname = trim($fields[self::F_FNAME]);
$lname = trim($fields[self::F_LNAME]);
$mobile = trim($fields[self::F_MOBILE]);
$serial = trim($fields[self::F_SERIAL]);
$date_purchase = trim($fields[self::F_DATE_PURCHASE]);
$sap_code = trim($fields[self::F_BATT_ID]);
$plate_number = $this->cleanPlateNumber($fields[self::F_PLATE_NUMBER]);
// validate the necessary fields
$output_info = $this->validateFields($fields);
if (!empty($output_info))
return $output_info;
// see if we can get customer id and vehicle id, given the plate number.
// this is not required so if we can't find customer and/or vehicle,
// we still create the warranty
$conn = $this->em->getConnection();
// NOTE: what happens if there's more than one result?
// for now, get the first one
$sql = 'SELECT c.id AS c_id, v.id AS v_id FROM customer_vehicle cv, customer c, vehicle v
WHERE cv.customer_id = c.id AND cv.vehicle_id = v.id AND cv.plate_number = :plate_number LIMIT 1';
$stmt = $conn->prepare($sql);
$stmt->execute(['plate_number' => $plate_number]);
$cv_results = $stmt->fetch();
$cust_id = 'NULL';
$vehicle_id = 'NULL';
if (!empty($cv_results))
{
$cust_id = $cv_results['c_id'];
$vehicle_id = $cv_results['v_id'];
}
// get battery info from hash (battery model id, battery size id, warranty periods (needed for expiration date)
$batt_info = $this->batt_hash[$sap_code];
$b_id = $batt_info['id'];
$model_id = $batt_info['model_id'];
$size_id = $batt_info['size_id'];
$warr_private = $batt_info['warr_private'];
$warr_commercial = $batt_info['warr_commercial'];
$warr_tnv = $batt_info['warr_tnv'];
// format purchase date to DateTime and then change the format to Y-m-d
$purchase_date = DateTime::createFromFormat('m/d/y', $date_purchase);
// need to manually create the created date
$date_create = date('Y-m-d H:i:s');
// compute expiration date
// TODO: might need checking for what kind of warranty for the warranty period
// by default, we use private
$warranty_class = WarrantyClass::WTY_PRIVATE;
$date_expire = $this->computeDateExpire($purchase_date, $warr_private);
// convert all dates to string for the values string for the insert statement
//$str_date_create = $date_create->format('Y-m-d H:i:s');
$str_date_purchase = $purchase_date->format('Y-m-d H:i:s');
$str_date_expire = $date_expire->format('Y-m-d H:i:s');
$first_name = addslashes($fname);
$last_name = addslashes($lname);
$mobile_number = addslashes($mobile);
// populate the values string for the values to be inserted into warranty
$value_string = '(' . $model_id . ',' . $size_id . ',\'' . $sap_code . '\',\'' . $serial . '\',\'' . $warranty_class . '\',\''
. $plate_number . '\',\'' . WarrantyStatus::ACTIVE . '\',\'' . $date_create . '\',\'' . $str_date_purchase
. '\',\'' . $str_date_expire . '\',\'' . $first_name . '\',\'' . $last_name . '\',\'' . $mobile_number . '\',' . 1 . ',' . $vehicle_id . ',' . $cust_id . ',\'' . WarrantySource::BULK_UPLOAD . '\')';
if (strlen($sql_values) == 0)
{
// first entry to insert, should have no comma before
$sql_values = $value_string;
}
else
{
// need to insert a comma after the existing string
$sql_values = $sql_values . ',' . $value_string;
}
// error_log($sql_values);
return $output_info;
}
protected function validateFields($fields)
{
$errors = [];
$serial = trim($fields[self::F_SERIAL]);
$date_purchase = trim($fields[self::F_DATE_PURCHASE]);
$sap_code = trim($fields[self::F_BATT_ID]);
$plate_number = trim($fields[self::F_PLATE_NUMBER]);
// clean the plate number
$clean_plate = $this->cleanPlateNumber($plate_number);
// validate the plate number
// (1) plate number should not be empty
if (empty($clean_plate))
{
$message = 'No plate number.';
$errors = $this->setOutputInfo($fields, 'NOT ADDED', $message);
return $errors;
}
// validate date purchase
// (1) date purchase should not be empty
// (2) date purchase should be of format: d-M-y
if (empty($date_purchase))
{
$message = 'No date purchase.';
$errors = $this->setOutputInfo($fields, 'NOT ADDED', $message);
return $errors;
}
$purchase_date = DateTime::createFromFormat('m/d/y', $date_purchase);
if ($purchase_date === false)
{
$message = 'Invalid date format. Date format should be: m/d/y (example: 06/13/16)';
$errors = $this->setOutputInfo($fields, 'NOT ADDED', $message);
return $errors;
}
// validate serial
// (1) should not be empty
if (empty($serial))
{
$message = 'No battery serial number.';
$errors = $this->setOutputInfo($fields, 'NOT ADDED', $message);
return $errors;
}
// validate battery
// (1) should not be empty
// (2) should find battery using sap_code.
if (empty($sap_code))
{
$message = 'No battery ID.';
$errors = $this->setOutputInfo($fields, 'NOT ADDED', $message);
return $errors;
}
if (!(isset($this->batt_hash[$sap_code])))
{
$message = 'Battery not found.';
$errors = $this->setOutputInfo($fields, 'NOT ADDED', $message);
return $errors;
}
// (1) check if warranty exists using serial + plate number
// (2) check if serial already exists even if for another plate number
$conn = $this->em->getConnection();
// find warranties using serial + plate number
$sql = 'SELECT w.id FROM warranty w WHERE w.serial = :serial AND w.plate_number = :plate_number';
$stmt = $conn->prepare($sql);
$stmt->execute([
'serial' => $serial,
'plate_number' => $plate_number,
]);
$warr_results = $stmt->fetchAll();
if (!empty($warr_results))
{
$message = 'Warranty already exists for serial and plate number.';
$errors = $this->setOutputInfo($fields, 'NOT ADDED', $message);
return $errors;
}
// find warranties using serial number alone
$w_sql = 'SELECT w.id FROM warranty w WHERE w.serial = :serial';
$w_stmt = $conn->prepare($w_sql);
$w_stmt->execute([
'serial' => $serial,
]);
$w_results = $w_stmt->fetchAll();
if (!empty($w_results))
{
$message = 'Warranty already exists for serial.';
$errors = $this->setOutputInfo($fields, 'NOT ADDED', $message);
return $errors;
}
return $errors;
}
protected function computeDateExpire($date_create, $warranty_period)
{
$expire_date = clone $date_create;
$expire_date->add(new DateInterval('P'.$warranty_period.'M'));
return $expire_date;
}
protected function setOutputInfo($fields, $status, $message)
{
$encoder = trim($fields[self::F_ENCODER]);
$date_encoded = trim($fields[self::F_DATE_ENCODED]);
$fname = trim($fields[self::F_FNAME]);
$lname = trim($fields[self::F_LNAME]);
$email = trim($fields[self::F_EMAIL]);
$address = trim($fields[self::F_ADDRESS]);
$mobile = trim($fields[self::F_MOBILE]);
$telephone = trim($fields[self::F_TELEPHONE]);
$vmake = trim($fields[self::F_VMAKE]);
$vmodel = trim($fields[self::F_VMODEL]);
$year = trim($fields[self::F_MYEAR]);
$serial = trim($fields[self::F_SERIAL]);
$invoice_number = trim($fields[self::F_INVOICE_NUM]);
$date_purchase = trim($fields[self::F_DATE_PURCHASE]);
$dist_name = trim($fields[self::F_DIST_NAME]);
$dist_address = trim($fields[self::F_DIST_ADDRESS]);
$app_type_id = trim($fields[self::F_APP_TYPE_ID]);
$sap_code = trim($fields[self::F_BATT_ID]);
$plate_number = trim($fields[self::F_PLATE_NUMBER]);
$owner_type = trim($fields[self::F_OWNER_TYPE]);
return [
$encoder,
$date_encoded,
$fname,
$lname,
$email,
$address,
$mobile,
$telephone,
$vmake,
$vmodel,
$year,
$plate_number,
$serial,
$invoice_number,
$date_purchase,
$dist_name,
$dist_address,
$app_type_id,
$sap_code,
$owner_type,
$status,
$message,
];
}
protected function outputWarrantyInfo($output_file, $entries)
{
try
{
$fh = fopen($output_file, "w");
}
catch (Exception $e)
{
throw new Exception('The file "' . $report_file . '" could be opened.');
}
// write the headers
fputcsv($fh, [
'Encoded By',
'Date of Encoded',
'Owner First Name',
'Owner Last Name',
'Owner Email',
'Owner Address',
'Owner Mobile',
'Owner Telephone',
'Vehicle Make',
'Vehicle Model',
'Vehicle Year',
'Vehicle Plate No.',
'Battery Serial No.',
'Battery Sales Invoice No.',
'Battery Date of Purchase',
'Distributor Name',
'Distributor Address',
'Application Type ID',
'Battery ID',
'Ownership Type',
'Status',
'Reason',
]);
foreach($entries as $row)
{
if ($row != null)
fputcsv($fh, $row);
}
fclose($fh);
}
protected function populateBatteryIndex()
{
$conn = $this->em->getConnection();
// get all the batteries
$sql = 'SELECT b.id, b.model_id, b.size_id, b.sap_code, b.warr_private, b.warr_commercial, b.warr_tnv
FROM battery b';
$stmt = $conn->prepare($sql);
$stmt->execute();
$results = $stmt->fetchAll();
// go through the rows
foreach ($results as $row)
{
// breaking this down for clarity
$battery_id = $row['id'];
$model_id = $row['model_id'];
$size_id = $row['size_id'];
$sap_code = trim($row['sap_code']);
$warr_private = $row['warr_private'];
$warr_commercial = $row['warr_commercial'];
$warr_tnv = $row['warr_tnv'];
if(!empty($sap_code))
{
$this->batt_hash[$sap_code] = [
'id' => $battery_id,
'model_id' => $model_id,
'size_id' => $size_id,
'warr_private' => $warr_private,
'warr_commercial' => $warr_commercial,
'warr_tnv' => $warr_tnv,
];
}
}
}
protected function cleanPlateNumber($plate)
{
return strtoupper(str_replace(' ', '', $plate));
}
}

View file

@ -9,13 +9,14 @@ use App\Entity\BatteryModel;
use App\Entity\BatterySize; use App\Entity\BatterySize;
use App\Entity\Invoice; use App\Entity\Invoice;
use App\Entity\CustomerVehicle; use App\Entity\CustomerVehicle;
use App\Entity\Customer;
use App\Ramcar\WarrantyClass; use App\Ramcar\WarrantyClass;
use App\Ramcar\WarrantyStatus; use App\Ramcar\WarrantyStatus;
use App\Ramcar\WarrantySource; use App\Ramcar\WarrantySource;
use App\Service\WarrantyHandler;
use App\Service\WarrantyAPILogger; use App\Service\WarrantyAPILogger;
use App\Service\WarrantyBulkUploader;
use Doctrine\ORM\Query; use Doctrine\ORM\Query;
use Doctrine\ORM\EntityManagerInterface; use Doctrine\ORM\EntityManagerInterface;
@ -447,14 +448,13 @@ class WarrantyController extends Controller
/** /**
* @Menu(selected="warranty_list") * @Menu(selected="warranty_list")
*/ */
public function uploadSubmit(Request $req, EntityManagerInterface $em, public function uploadSubmit(Request $req, WarrantyBulkUploader $warr_uploader)
WarrantyHandler $wh)
{ {
// retrieve temporary info for file // retrieve temporary info for file
$file = $req->files->get('csv_file'); $file = $req->files->get('csv_file');
// process the csv file // process the csv file. Call the WarrantyBulkUploader service
$inv_entries = $this->processWarrantyFile($file, $em, $wh); $inv_entries = $warr_uploader->warrantyUpload($file);
$resp = new StreamedResponse(); $resp = new StreamedResponse();
@ -464,6 +464,8 @@ class WarrantyController extends Controller
// csv output // csv output
$csv_handle = fopen('php://output', 'w+'); $csv_handle = fopen('php://output', 'w+');
fputcsv($csv_handle, [ fputcsv($csv_handle, [
'Encoded By',
'Date of Encoded',
'Owner First Name', 'Owner First Name',
'Owner Last Name', 'Owner Last Name',
'Owner Email', 'Owner Email',
@ -482,6 +484,7 @@ class WarrantyController extends Controller
'Application Type ID', 'Application Type ID',
'Battery ID', 'Battery ID',
'Ownership Type', 'Ownership Type',
'Status',
'Reason Warranty Not Added', 'Reason Warranty Not Added',
]); ]);
foreach ($inv_entries as $row) foreach ($inv_entries as $row)
@ -513,6 +516,8 @@ class WarrantyController extends Controller
return $resp; return $resp;
} }
// NOTE: this is not being called anymore. We are now using the WarrantyBulkUploader service.
// Do we delete this?
protected function processWarrantyFile(UploadedFile $csv_file, EntityManagerInterface $em, protected function processWarrantyFile(UploadedFile $csv_file, EntityManagerInterface $em,
WarrantyHandler $wh) WarrantyHandler $wh)
{ {
@ -647,6 +652,43 @@ class WarrantyController extends Controller
} }
} }
// find customer vehicle using plate number
$vehicle = null;
//$customer_vehicle = $em->getRepository(CustomerVehicle::class)->findOneBy(['plate_number' => $plate_number]);
$cv_query = $em->createQuery('SELECT cv FROM App\Entity\CustomerVehicle cv WHERE cv.plate_number = :plate_number');
$customer_vehicle = $cv_query->setParameters([
'plate_number' => $plate_number,
])
->setMaxResults(1)
->getOneOrNullResult();
if ($customer_vehicle != null)
$vehicle = $customer_vehicle->getVehicle();
// find customer using mobile number
$customer = null;
//$customer_results = $em->getRepository(Customer::class)->findBy(['phone_mobile' => $mobile_number]);
$cust_query = $em->createQuery('SELECT c FROM App\Entity\Customer c where c.phone_mobile = :mobile_number');
$customer_results = $cust_query->setParameters([
'mobile_number' => $mobile_number
])
->getResult();
foreach ($customer_results as $cust)
{
if ($customer_vehicle != null)
{
if ($cust->getID() == $customer_vehicle->getCustomer()->getID())
break;
}
}
if ($customer_vehicle != null)
{
// set customer to associated customer of customer vehicle
$customer = $customer_vehicle->getCustomer();
}
if (!empty($warr_results)) if (!empty($warr_results))
{ {
foreach($warr_results as $warr) foreach($warr_results as $warr)
@ -674,7 +716,7 @@ class WarrantyController extends Controller
$source = WarrantySource::BULK_UPLOAD; $source = WarrantySource::BULK_UPLOAD;
$wh->createWarranty($serial, $plate_number, $first_name, $last_name, $mobile_number, $batt_list, $date_purchase, $warranty_class, $wh->createWarranty($serial, $plate_number, $first_name, $last_name, $mobile_number, $batt_list, $date_purchase, $warranty_class,
$user_id, $source); $user_id, $source, $customer, $vehicle);
} }
} }

View file

@ -15,7 +15,10 @@ use Exception;
* uniqueConstraints={ * uniqueConstraints={
* @ORM\UniqueConstraint(columns={"serial"}) * @ORM\UniqueConstraint(columns={"serial"})
* }, * },
* indexes={@ORM\Index(name="plate_number_idx", columns={"plate_number"})}) * indexes={
* @ORM\Index(name="plate_number_idx", columns={"plate_number"}),
@ORM\Index(name="serial_idx", columns={"serial"})
* })
* ) * )
*/ */
class Warranty class Warranty
@ -538,7 +541,7 @@ class Warranty
return $this->file_warr_card; return $this->file_warr_card;
} }
public function setVehicle(Vehicle $v) public function setVehicle(Vehicle $v = null)
{ {
$this->vehicle = $v; $this->vehicle = $v;
return $this; return $this;
@ -637,7 +640,7 @@ class Warranty
return $this->flag_validated; return $this->flag_validated;
} }
public function setCustomer(Customer $customer) public function setCustomer(Customer $customer = null)
{ {
$this->customer = $customer; $this->customer = $customer;
return $this; return $this;

View file

@ -0,0 +1,401 @@
<?php
namespace App\Service;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\HttpFoundation\File\UploadedFile;
use App\Ramcar\WarrantySource;
use App\Ramcar\WarrantyStatus;
use App\Ramcar\WarrantyClass;
use DateTime;
use DateInterval;
use PDO;
class WarrantyBulkUploader
{
const F_ENCODER = 0;
const F_DATE_ENCODED = 1;
const F_FNAME = 2;
const F_LNAME = 3;
const F_EMAIL = 4;
const F_ADDRESS = 5;
const F_MOBILE = 6;
const F_TELEPHONE = 7;
const F_VMAKE = 8;
const F_VMODEL = 9;
const F_MYEAR = 10;
const F_PLATE_NUMBER = 11;
const F_SERIAL = 12;
const F_INVOICE_NUM = 13;
const F_DATE_PURCHASE = 14;
const F_DIST_NAME = 15;
const F_DIST_ADDRESS = 16;
const F_APP_TYPE_ID = 17;
const F_BATT_ID = 18; // sap code in system
const F_OWNER_TYPE = 19;
protected $em;
protected $batt_hash;
public function __construct(EntityManagerInterface $em)
{
$this->em = $em;
}
public function warrantyUpload(UploadedFile $csv_file)
{
// hash the battery table using sap_code as index
$this->populateBatteryIndex();
// attempt to open file
try
{
$fh = fopen($csv_file, "r");
}
catch (Exception $e)
{
throw new Exception('The file "' . $csv_file . '" could be read.');
}
$output_info = [];
// loop through rows
// ignore first row since that's header data
$row_num = 0;
$sql_values = '';
while (($fields = fgetcsv($fh)) !== false)
{
// ignore first row since that's the header
if ($row_num == 0)
{
$row_num++;
continue;
}
// process row
$output_info[] = $this->processRow($fields, $sql_values);
$row_num++;
}
// check if we have values to insert
if (strlen($sql_values) > 0)
{
$sql_statement = 'INSERT INTO `warranty` (bty_model_id,bty_size_id,sap_bty_id,serial,warranty_class,plate_number,status,date_create,date_purchase,date_expire,first_name,last_name,mobile_number,flag_activated,vehicle_id,customer_id, create_source) VALUES ' . $sql_values . ';' . "\n";
// error_log($sql_statement);
$conn = $this->em->getConnection();
$stmt = $conn->prepare($sql_statement);
$stmt->execute();
}
fclose($fh);
// return invalid entries
return $output_info;
}
protected function processRow($fields, &$sql_values)
{
// error_log('Processing warranty with serial ' . trim($fields[self::F_SERIAL]));
$output_info = [];
// get necessary fields
$fname = trim($fields[self::F_FNAME]);
$lname = trim($fields[self::F_LNAME]);
$mobile = trim($fields[self::F_MOBILE]);
$serial = trim($fields[self::F_SERIAL]);
$date_purchase = trim($fields[self::F_DATE_PURCHASE]);
$sap_code = trim($fields[self::F_BATT_ID]);
$plate_number = $this->cleanPlateNumber($fields[self::F_PLATE_NUMBER]);
// validate the necessary fields
$output_info = $this->validateFields($fields);
if (!empty($output_info))
return $output_info;
// see if we can get customer id and vehicle id, given the plate number.
// this is not required so if we can't find customer and/or vehicle,
// we still create the warranty
$conn = $this->em->getConnection();
// NOTE: what happens if there's more than one result?
// for now, get the first one
$sql = 'SELECT c.id AS c_id, v.id AS v_id FROM customer_vehicle cv, customer c, vehicle v
WHERE cv.customer_id = c.id AND cv.vehicle_id = v.id AND cv.plate_number = :plate_number LIMIT 1';
$stmt = $conn->prepare($sql);
$stmt->execute(['plate_number' => $plate_number]);
$cv_results = $stmt->fetch();
$cust_id = 'NULL';
$vehicle_id = 'NULL';
if (!empty($cv_results))
{
$cust_id = $cv_results['c_id'];
$vehicle_id = $cv_results['v_id'];
}
// get battery info from hash (battery model id, battery size id, warranty periods (needed for expiration date)
$batt_info = $this->batt_hash[$sap_code];
$b_id = $batt_info['id'];
$model_id = $batt_info['model_id'];
$size_id = $batt_info['size_id'];
$warr_private = $batt_info['warr_private'];
$warr_commercial = $batt_info['warr_commercial'];
$warr_tnv = $batt_info['warr_tnv'];
// format purchase date to DateTime and then change the format to Y-m-d
$purchase_date = DateTime::createFromFormat('m/d/y', $date_purchase);
// need to manually create the created date
$date_create = date('Y-m-d H:i:s');
// compute expiration date
// TODO: might need checking for what kind of warranty for the warranty period
// by default, we use private
$warranty_class = WarrantyClass::WTY_PRIVATE;
$date_expire = $this->computeDateExpire($purchase_date, $warr_private);
// convert all dates to string for the values string for the insert statement
//$str_date_create = $date_create->format('Y-m-d H:i:s');
$str_date_purchase = $purchase_date->format('Y-m-d H:i:s');
$str_date_expire = $date_expire->format('Y-m-d H:i:s');
$first_name = addslashes($fname);
$last_name = addslashes($lname);
$mobile_number = addslashes($mobile);
// populate the values string for the values to be inserted into warranty
$value_string = '(' . $model_id . ',' . $size_id . ',\'' . $sap_code . '\',\'' . $serial . '\',\'' . $warranty_class . '\',\''
. $plate_number . '\',\'' . WarrantyStatus::ACTIVE . '\',\'' . $date_create . '\',\'' . $str_date_purchase
. '\',\'' . $str_date_expire . '\',\'' . $first_name . '\',\'' . $last_name . '\',\'' . $mobile_number . '\',' . 1 . ',' . $vehicle_id . ',' . $cust_id . ',\'' . WarrantySource::BULK_UPLOAD . '\')';
if (strlen($sql_values) == 0)
{
// first entry to insert, should have no comma before
$sql_values = $value_string;
}
else
{
// need to insert a comma after the existing string
$sql_values = $sql_values . ',' . $value_string;
}
// error_log($sql_values);
// if we reach this point, warranty is going to be uploaded
// so we also output to file the warranty that will be uploaded
$output_info = $this->setOutputInfo($fields, 'UPLOADED', '');
return $output_info;
}
protected function validateFields($fields)
{
$errors = [];
$serial = trim($fields[self::F_SERIAL]);
$date_purchase = trim($fields[self::F_DATE_PURCHASE]);
$sap_code = trim($fields[self::F_BATT_ID]);
$plate_number = trim($fields[self::F_PLATE_NUMBER]);
// clean the plate number
$clean_plate = $this->cleanPlateNumber($plate_number);
// validate the plate number
// (1) plate number should not be empty
if (empty($clean_plate))
{
$message = 'No plate number.';
$errors = $this->setOutputInfo($fields, 'NOT UPLOADED', $message);
return $errors;
}
// validate date purchase
// (1) date purchase should not be empty
// (2) date purchase should be of format: d-M-y
if (empty($date_purchase))
{
$message = 'No date purchase.';
$errors = $this->setOutputInfo($fields, 'NOT UPLOADED', $message);
return $errors;
}
$purchase_date = DateTime::createFromFormat('m/d/y', $date_purchase);
if ($purchase_date === false)
{
$message = 'Invalid date format. Date format should be: m/d/y (example: 06/13/16)';
$errors = $this->setOutputInfo($fields, 'NOT UPLOADED', $message);
return $errors;
}
// validate serial
// (1) should not be empty
if (empty($serial))
{
$message = 'No battery serial number.';
$errors = $this->setOutputInfo($fields, 'NOT UPLOADED', $message);
return $errors;
}
// validate battery
// (1) should not be empty
// (2) should find battery using sap_code.
if (empty($sap_code))
{
$message = 'No battery ID.';
$errors = $this->setOutputInfo($fields, 'NOT UPLOADED', $message);
return $errors;
}
if (!(isset($this->batt_hash[$sap_code])))
{
$message = 'Battery not found.';
$errors = $this->setOutputInfo($fields, 'NOT UPLOADED', $message);
return $errors;
}
// (1) check if warranty exists using serial + plate number
// (2) check if serial already exists even if for another plate number
$conn = $this->em->getConnection();
// find warranties using serial + plate number
$sql = 'SELECT w.id FROM warranty w WHERE w.serial = :serial AND w.plate_number = :plate_number';
$stmt = $conn->prepare($sql);
$stmt->execute([
'serial' => $serial,
'plate_number' => $plate_number,
]);
$warr_results = $stmt->fetchAll();
if (!empty($warr_results))
{
$message = 'Warranty already exists for serial and plate number.';
$errors = $this->setOutputInfo($fields, 'NOT UPLOADED', $message);
return $errors;
}
// find warranties using serial number alone
$w_sql = 'SELECT w.id FROM warranty w WHERE w.serial = :serial';
$w_stmt = $conn->prepare($w_sql);
$w_stmt->execute([
'serial' => $serial,
]);
$w_results = $w_stmt->fetchAll();
if (!empty($w_results))
{
$message = 'Warranty already exists for serial.';
$errors = $this->setOutputInfo($fields, 'NOT UPLOADED', $message);
return $errors;
}
return $errors;
}
protected function computeDateExpire($date_create, $warranty_period)
{
$expire_date = clone $date_create;
$expire_date->add(new DateInterval('P'.$warranty_period.'M'));
return $expire_date;
}
protected function setOutputInfo($fields, $status, $message)
{
$encoder = trim($fields[self::F_ENCODER]);
$date_encoded = trim($fields[self::F_DATE_ENCODED]);
$fname = trim($fields[self::F_FNAME]);
$lname = trim($fields[self::F_LNAME]);
$email = trim($fields[self::F_EMAIL]);
$address = trim($fields[self::F_ADDRESS]);
$mobile = trim($fields[self::F_MOBILE]);
$telephone = trim($fields[self::F_TELEPHONE]);
$vmake = trim($fields[self::F_VMAKE]);
$vmodel = trim($fields[self::F_VMODEL]);
$year = trim($fields[self::F_MYEAR]);
$serial = trim($fields[self::F_SERIAL]);
$invoice_number = trim($fields[self::F_INVOICE_NUM]);
$date_purchase = trim($fields[self::F_DATE_PURCHASE]);
$dist_name = trim($fields[self::F_DIST_NAME]);
$dist_address = trim($fields[self::F_DIST_ADDRESS]);
$app_type_id = trim($fields[self::F_APP_TYPE_ID]);
$sap_code = trim($fields[self::F_BATT_ID]);
$plate_number = trim($fields[self::F_PLATE_NUMBER]);
$owner_type = trim($fields[self::F_OWNER_TYPE]);
return [
$encoder,
$date_encoded,
$fname,
$lname,
$email,
$address,
$mobile,
$telephone,
$vmake,
$vmodel,
$year,
$plate_number,
$serial,
$invoice_number,
$date_purchase,
$dist_name,
$dist_address,
$app_type_id,
$sap_code,
$owner_type,
$status,
$message,
];
}
protected function populateBatteryIndex()
{
$conn = $this->em->getConnection();
// get all the batteries
$sql = 'SELECT b.id, b.model_id, b.size_id, b.sap_code, b.warr_private, b.warr_commercial, b.warr_tnv
FROM battery b';
$stmt = $conn->prepare($sql);
$stmt->execute();
$results = $stmt->fetchAll();
// go through the rows
foreach ($results as $row)
{
// breaking this down for clarity
$battery_id = $row['id'];
$model_id = $row['model_id'];
$size_id = $row['size_id'];
$sap_code = trim($row['sap_code']);
$warr_private = $row['warr_private'];
$warr_commercial = $row['warr_commercial'];
$warr_tnv = $row['warr_tnv'];
if(!empty($sap_code))
{
$this->batt_hash[$sap_code] = [
'id' => $battery_id,
'model_id' => $model_id,
'size_id' => $size_id,
'warr_private' => $warr_private,
'warr_commercial' => $warr_commercial,
'warr_tnv' => $warr_tnv,
];
}
}
}
protected function cleanPlateNumber($plate)
{
return strtoupper(str_replace(' ', '', $plate));
}
}