diff --git a/config/services.yaml b/config/services.yaml index e3591e0d..06ce277a 100644 --- a/config/services.yaml +++ b/config/services.yaml @@ -147,3 +147,9 @@ services: #job order generator interface App\Service\JobOrderHandlerInterface: "@App\\Service\\JobOrderHandler\\CMBJobOrderHandler" + + # customer generator + App\Service\CustomerHandler\CMBCustomerHandler: ~ + + # customer generator interface + App\Service\CustomerHandlerInterface: "@App\\Service\\CustomerHandler\\CMBCustomerHandler" diff --git a/src/Controller/CustomerController.php b/src/Controller/CustomerController.php index 0b14a011..29ae9cdc 100644 --- a/src/Controller/CustomerController.php +++ b/src/Controller/CustomerController.php @@ -7,6 +7,8 @@ use App\Ramcar\FuelType; use App\Ramcar\VehicleStatusCondition; use App\Ramcar\CrudException; +use App\Service\CustomerHandlerInterface; + use App\Entity\Customer; use App\Entity\CustomerVehicle; use App\Entity\MobileNumber; @@ -159,18 +161,16 @@ class CustomerController extends Controller /** * @Menu(selected="customer_list") */ - public function addForm() + public function addForm(CustomerHandlerInterface $cust_handler) { $this->denyAccessUnlessGranted('customer.add', null, 'No access.'); - $params['obj'] = new Customer(); - $params['mode'] = 'create'; + $params = $cust_handler->initializeAddCustomerForm(); - // get dropdown parameters - $this->fillDropdownParameters($params); + $template = $params['template']; // response - return $this->render('customer/form.html.twig', $params); + return $this->render($template, $params); } protected function setObject($obj, $req) @@ -193,95 +193,28 @@ class CustomerController extends Controller } - public function addSubmit(Request $req, ValidatorInterface $validator) + public function addSubmit(Request $req, CustomerHandlerInterface $cust_handler) { $this->denyAccessUnlessGranted('customer.add', null, 'No access.'); - // create new row - $em = $this->getDoctrine()->getManager(); - $row = new Customer(); + $result = $cust_handler->addCustomer($req); - $this->setObject($row, $req); + if (isset($result['id'])) + { + $id = $result['id']; - // initialize error lists - $error_array = []; - $nerror_array = []; - $verror_array = []; - - // error_log(print_r($req->request->all(), true)); - - // custom validation for vehicles - $vehicles = json_decode($req->request->get('vehicles')); - - if (!empty($vehicles)) { - foreach ($vehicles as $vehicle) { - // check if vehicle exists - $vobj = $em->getRepository(Vehicle::class)->find($vehicle->vehicle); - - if (empty($vobj)) { - $verror_array[$vehicle->index]['vehicle'] = 'Invalid vehicle specified.'; - } else { - $cust_vehicle = new CustomerVehicle(); - $cust_vehicle->setName($vehicle->name) - ->setVehicle($vobj) - ->setPlateNumber($vehicle->plate_number) - ->setModelYear($vehicle->model_year) - ->setColor('') - ->setStatusCondition('') - ->setFuelType('') - ->setActive($vehicle->flag_active) - ->setCustomer($row); - - // if specified, check if battery exists - if ($vehicle->battery) { - // check if battery exists - $bobj = $em->getRepository(Battery::class)->find($vehicle->battery); - - if (empty($bobj)) { - $verror_array[$vehicle->index]['battery'] = 'Invalid battery specified.'; - } else { - // check if warranty expiration was specified - $warr_ex = DateTime::createFromFormat("d M Y", $vehicle->warranty_expiration); - if (!$warr_ex) - $warr_ex = null; - - $cust_vehicle->setHasMotoliteBattery(true) - ->setCurrentBattery($bobj) - ->setWarrantyCode($vehicle->warranty_code) - ->setWarrantyExpiration($warr_ex); - } - } else { - $cust_vehicle->setHasMotoliteBattery(false); - } - - $verrors = $validator->validate($cust_vehicle); - - // add errors to list - foreach ($verrors as $error) { - if (!isset($verror_array[$vehicle->index])) - $verror_array[$vehicle->index] = []; - - $verror_array[$vehicle->index][$error->getPropertyPath()] = $error->getMessage(); - } - - // add to entity - if (!isset($verror_array[$vehicle->index])) { - $row->addVehicle($cust_vehicle); - } - } - } + // return successful response + return $this->json([ + 'success' => 'Changes have been saved!', + 'id' => $id + ]); } + else + { + $error_array = $result['error_array']; + $nerror_array = $result['nerror_array']; + $verror_array = $result['verror_array']; - // validate - $errors = $validator->validate($row); - - // add errors to list - foreach ($errors as $error) { - $error_array[$error->getPropertyPath()] = $error->getMessage(); - } - - // check if any errors were found - if (!empty($error_array) || !empty($nerror_array) || !empty($verror_array)) { // return validation failure response return $this->json([ 'success' => false, @@ -289,17 +222,7 @@ class CustomerController extends Controller 'nerrors' => $nerror_array, 'verrors' => $verror_array ], 422); - } else { - // validated! save the entity - $em->persist($row); - $em->flush(); - - // return successful response - return $this->json([ - 'success' => 'Changes have been saved!', - 'id' => $row->getID() - ]); - } + } } /** diff --git a/src/Entity/CustomerVehicle.php b/src/Entity/CustomerVehicle.php index 841f7b16..4f593ac3 100644 --- a/src/Entity/CustomerVehicle.php +++ b/src/Entity/CustomerVehicle.php @@ -61,21 +61,18 @@ class CustomerVehicle // color of customer's vehicle /** * @ORM\Column(type="string", length=80) - * @Assert\NotBlank() */ protected $color; // vehicle status (new / second-hand) /** * @ORM\Column(type="string", length=15) - * @Assert\NotBlank() */ protected $status_condition; // fuel type - diesel, gas /** * @ORM\Column(type="string", length=15) - * @Assert\NotBlank() */ protected $fuel_type; diff --git a/src/Service/CustomerHandler/CMBCustomerHandler.php b/src/Service/CustomerHandler/CMBCustomerHandler.php new file mode 100644 index 00000000..28118b25 --- /dev/null +++ b/src/Service/CustomerHandler/CMBCustomerHandler.php @@ -0,0 +1,230 @@ +em = $em; + $this->validator = $validator; + + $this->loadTemplates(); + } + + // initialize add customer form + public function initializeAddCustomerForm() + { + $params['obj'] = new Customer(); + $params['mode'] = 'create'; + + // get dropdown parameters + $this->fillDropdownParameters($params); + + // get template to display + $params['template'] = $this->getTwigTemplate('cust_add_form'); + + // return params + return $params; + } + + // add new customer and customer vehicle, if any + public function addCustomer(Request $req) + { + // create new row + $em = $this->em; + $row = new Customer(); + + $this->setObject($row, $req); + + // initialize error lists + $error_array = []; + $nerror_array = []; + $verror_array = []; + + // custom validation for vehicles + $vehicles = json_decode($req->request->get('vehicles')); + + if (!empty($vehicles)) + { + foreach ($vehicles as $vehicle) + { + // check if vehicle exists + $vobj = $em->getRepository(Vehicle::class)->find($vehicle->vehicle); + + if (empty($vobj)) + { + $verror_array[$vehicle->index]['vehicle'] = 'Invalid vehicle specified.'; + } + else + { + $cust_vehicle = new CustomerVehicle(); + $cust_vehicle->setName($vehicle->name) + ->setVehicle($vobj) + ->setPlateNumber($vehicle->plate_number) + ->setModelYear($vehicle->model_year) + ->setColor('') + ->setStatusCondition('') + ->setFuelType('') + ->setActive($vehicle->flag_active) + ->setCustomer($row); + + // if specified, check if battery exists + if ($vehicle->battery) + { + // check if battery exists + $bobj = $em->getRepository(Battery::class)->find($vehicle->battery); + + if (empty($bobj)) + { + $verror_array[$vehicle->index]['battery'] = 'Invalid battery specified.'; + } + else + { + // check if warranty expiration was specified + $warr_ex = DateTime::createFromFormat("d M Y", $vehicle->warranty_expiration); + if (!$warr_ex) + $warr_ex = null; + + $cust_vehicle->setHasMotoliteBattery(true) + ->setCurrentBattery($bobj) + ->setWarrantyCode($vehicle->warranty_code) + ->setWarrantyExpiration($warr_ex); + } + } + else + { + $cust_vehicle->setHasMotoliteBattery(false); + } + + $verrors = $this->validator->validate($cust_vehicle); + + // add errors to list + foreach ($verrors as $error) + { + if (!isset($verror_array[$vehicle->index])) + $verror_array[$vehicle->index] = []; + + $verror_array[$vehicle->index][$error->getPropertyPath()] = $error->getMessage(); + } + + // add to entity + if (!isset($verror_array[$vehicle->index])) + { + $row->addVehicle($cust_vehicle); + } + } + } + } + + // validate + $errors = $this->validator->validate($row); + + // add errors to list + foreach ($errors as $error) + { + $error_array[$error->getPropertyPath()] = $error->getMessage(); + } + + // check if any errors were found + if (!empty($error_array) || !empty($nerror_array) || !empty($verror_array)) + { + // return all error_arrays + $result = [ + 'error_array' => $error_array, + 'nerror_array' => $nerror_array, + 'verror_array' => $verror_array, + ]; + } + else + { + // validated! save the entity + $em->persist($row); + $em->flush(); + + $result = [ + 'id' => $row->getID(), + ]; + } + + return $result; + } + + public function getTwigTemplate($id) + { + if (isset($this->template_hash[$id])) + { + return $this->template_hash[$id]; + } + + return null; + } + + protected function setObject($obj, $req) + { + // set and save values + $obj->setTitle($req->request->get('title')) + ->setFirstName($req->request->get('first_name')) + ->setLastName($req->request->get('last_name')) + ->setCustomerClassification($req->request->get('customer_classification')) + ->setCustomerNotes($req->request->get('customer_notes')) + ->setEmail($req->request->get('email')) + ->setIsCSAT($req->request->get('flag_csat') ? true : false) + ->setActive($req->request->get('flag_active') ? true : false); + + // phone numbers + $obj->setPhoneMobile($req->request->get('phone_mobile')) + ->setPhoneLandline($req->request->get('phone_landline')) + ->setPhoneOffice($req->request->get('phone_office')) + ->setPhoneFax($req->request->get('phone_fax')); + } + + protected function fillDropdownParameters(&$params) + { + $em = $this->em; + + $params['bmfgs'] = $em->getRepository(BatteryManufacturer::class)->findAll(); + $params['vmfgs'] = $em->getRepository(VehicleManufacturer::class)->findAll(); + + $params['classifications'] = CustomerClassification::getCollection(); + + $params['years'] = $this->generateYearOptions(); + $params['batteries'] = $em->getRepository(Battery::class)->findAll(); + } + + protected function generateYearOptions() + { + $start_year = 1950; + return range($start_year, date("Y") + 1); + } + + + protected function loadTemplates() + { + $this->template_hash = []; + + // add all twig templates for customer to hash + $this->template_hash['cust_add_form'] = 'customer/cmb.form.html.twig'; + } +} diff --git a/src/Service/CustomerHandler/ResqCustomerHandler.php b/src/Service/CustomerHandler/ResqCustomerHandler.php new file mode 100644 index 00000000..3dabaa54 --- /dev/null +++ b/src/Service/CustomerHandler/ResqCustomerHandler.php @@ -0,0 +1,238 @@ +em = $em; + $this->validator = $validator; + + $this->loadTemplates(); + } + + // initialize add customer form + public function initializeAddCustomerForm() + { + $params['obj'] = new Customer(); + $params['mode'] = 'create'; + + // get dropdown parameters + $this->fillDropdownParameters($params); + + // get template to display + $params['template'] = $this->getTwigTemplate('cust_add_form'); + + // return params + return $params; + } + + + // add new customer and customer vehicle, if any + public function addCustomer(Request $req) + { + // create new row + $em = $this->em; + $row = new Customer(); + + $this->setObject($row, $req); + + // initialize error lists + $error_array = []; + $nerror_array = []; + $verror_array = []; + + // custom validation for vehicles + $vehicles = json_decode($req->request->get('vehicles')); + + if (!empty($vehicles)) + { + foreach ($vehicles as $vehicle) + { + // check if vehicle exists + $vobj = $em->getRepository(Vehicle::class)->find($vehicle->vehicle); + + if (empty($vobj)) + { + $verror_array[$vehicle->index]['vehicle'] = 'Invalid vehicle specified.'; + } + else + { + $cust_vehicle = new CustomerVehicle(); + $cust_vehicle->setName($vehicle->name) + ->setVehicle($vobj) + ->setPlateNumber($vehicle->plate_number) + ->setModelYear($vehicle->model_year) + ->setColor($vehicle->color) + ->setStatusCondition($vehicle->status_condition) + ->setFuelType($vehicle->fuel_type) + ->setActive($vehicle->flag_active) + ->setCustomer($row); + + // if specified, check if battery exists + if ($vehicle->battery) + { + // check if battery exists + $bobj = $em->getRepository(Battery::class)->find($vehicle->battery); + + if (empty($bobj)) + { + $verror_array[$vehicle->index]['battery'] = 'Invalid battery specified.'; + } + else + { + // check if warranty expiration was specified + $warr_ex = DateTime::createFromFormat("d M Y", $vehicle->warranty_expiration); + if (!$warr_ex) + $warr_ex = null; + + $cust_vehicle->setHasMotoliteBattery(true) + ->setCurrentBattery($bobj) + ->setWarrantyCode($vehicle->warranty_code) + ->setWarrantyExpiration($warr_ex); + } + } + else + { + $cust_vehicle->setHasMotoliteBattery(false); + } + + $verrors = $this->validator->validate($cust_vehicle); + + // add errors to list + foreach ($verrors as $error) + { + if (!isset($verror_array[$vehicle->index])) + $verror_array[$vehicle->index] = []; + + $verror_array[$vehicle->index][$error->getPropertyPath()] = $error->getMessage(); + } + + // add to entity + if (!isset($verror_array[$vehicle->index])) + { + $row->addVehicle($cust_vehicle); + } + } + } + } + + // validate + $errors = $this->validator->validate($row); + + // add errors to list + foreach ($errors as $error) + { + $error_array[$error->getPropertyPath()] = $error->getMessage(); + } + + // check if any errors were found + if (!empty($error_array) || !empty($nerror_array) || !empty($verror_array)) + { + // return all error_arrays + $result = [ + 'error_array' => $error_array, + 'nerror_array' => $nerror_array, + 'verror_array' => $verror_array, + ]; + } + else + { + // validated! save the entity + $em->persist($row); + $em->flush(); + + $result = [ + 'id' => $row->getID(), + ]; + } + + return $result; + } + + public function getTwigTemplate($id) + { + if (isset($this->template_hash[$id])) + { + return $this->template_hash[$id]; + } + + return null; + } + + + protected function setObject($obj, $req) + { + // set and save values + $obj->setTitle($req->request->get('title')) + ->setFirstName($req->request->get('first_name')) + ->setLastName($req->request->get('last_name')) + ->setCustomerClassification($req->request->get('customer_classification')) + ->setCustomerNotes($req->request->get('customer_notes')) + ->setEmail($req->request->get('email')) + ->setIsCSAT($req->request->get('flag_csat') ? true : false) + ->setActive($req->request->get('flag_active') ? true : false); + + // phone numbers + $obj->setPhoneMobile($req->request->get('phone_mobile')) + ->setPhoneLandline($req->request->get('phone_landline')) + ->setPhoneOffice($req->request->get('phone_office')) + ->setPhoneFax($req->request->get('phone_fax')); + } + + protected function fillDropdownParameters(&$params) + { + $em = $this->em; + + $params['bmfgs'] = $em->getRepository(BatteryManufacturer::class)->findAll(); + $params['vmfgs'] = $em->getRepository(VehicleManufacturer::class)->findAll(); + + $params['classifications'] = CustomerClassification::getCollection(); + $params['fuel_types'] = FuelType::getCollection(); + $params['status_conditions'] = VehicleStatusCondition::getCollection(); + + $params['years'] = $this->generateYearOptions(); + $params['batteries'] = $em->getRepository(Battery::class)->findAll(); + } + + protected function generateYearOptions() + { + $start_year = 1950; + return range($start_year, date("Y") + 1); + } + + protected function loadTemplates() + { + $this->template_hash = []; + + // add all twig templates for customer to hash + $this->template_hash['cust_add_form'] = 'customer/form.html.twig'; + } + + +} diff --git a/src/Service/CustomerHandlerInterface.php b/src/Service/CustomerHandlerInterface.php new file mode 100644 index 00000000..f27e941a --- /dev/null +++ b/src/Service/CustomerHandlerInterface.php @@ -0,0 +1,17 @@ + +