diff --git a/config/acl.yaml b/config/acl.yaml index f50b9d33..a1152234 100644 --- a/config/acl.yaml +++ b/config/acl.yaml @@ -211,6 +211,8 @@ access_keys: acls: - id: support.menu label: Menu + - id: general.search + label: Search - id: ticket label: Ticket Access acls: diff --git a/config/menu.yaml b/config/menu.yaml index 9da352f9..fd870fea 100644 --- a/config/menu.yaml +++ b/config/menu.yaml @@ -118,3 +118,7 @@ main_menu: acl: ticket.list label: Tickets parent: support + - id: general_search + acl: general.search + label: Search + parent: support diff --git a/config/routes/search.yaml b/config/routes/search.yaml new file mode 100644 index 00000000..54bebd51 --- /dev/null +++ b/config/routes/search.yaml @@ -0,0 +1,8 @@ +general_search: + path: /search + controller: App\Controller\SearchController::index + +search_history: + path: /search/history + controller: App\Controller\SearchController::search + methods: [GET] diff --git a/src/Command/TestGeneralSearchCommand.php b/src/Command/TestGeneralSearchCommand.php new file mode 100644 index 00000000..0696fb86 --- /dev/null +++ b/src/Command/TestGeneralSearchCommand.php @@ -0,0 +1,70 @@ +setName('test:generalsearch') + ->setDescription('Test general search service.') + ->setHelp('Test the general search service.') + ->addArgument('search_term', InputArgument::REQUIRED, 'Search Terms'); + } + + public function __construct(GeneralSearch $search) + { + $this->search = $search; + + parent::__construct(); + } + + protected function execute(InputInterface $input, OutputInterface $output) + { + $search_term = $input->getArgument('search_term'); + + $results = $this->search->search($search_term); + + echo "legacy job order results: " . count($results['legacy_job_orders']) . "\n"; + + foreach($results['legacy_job_orders'] as $legacy_job_order) + { + echo "Plate Number: " . $legacy_job_order->getPlateNumber() . "\n"; + echo "Mobile Number: " . $legacy_job_order->getCustMobile() . "\n"; + echo "Landline: " . $legacy_job_order->getCustLandline() . "\n"; + echo "Name: " . $legacy_job_order->getCustName() . "\n"; + echo "Last Name: " . $legacy_job_order->getCustLastName() . "\n"; + echo "First Name: " . $legacy_job_order->getCustFirstName() . "\n"; + echo "Middle Name: " . $legacy_job_order->getCustMiddleName() . "\n"; + } + + echo "job order results: " . count($results['job_orders']) . "\n"; + foreach($results['job_orders'] as $job_order) + { + echo "Plate Number: " . $job_order->getCustomerVehicle()->getPlateNumber() . "\n"; + echo "Mobile Number: " . $job_order->getCustomer()->getPhoneMobile() . "\n"; + echo "Landline: " . $job_order->getCustomer()->getPhoneLandline() . "\n"; + echo "Office: " . $job_order->getCustomer()->getPhoneOffice() . "\n"; + echo "Fax: " . $job_order->getCustomer()->getPhoneFax() . "\n"; + echo "Last Name: " . $job_order->getCustomer()->getLastName() . "\n"; + echo "First Name: " . $job_order->getCustomer()->getFirstName() . "\n"; + } + + echo "warranties results: " . count($results['warranties']) . "\n"; + + foreach($results['warranties'] as $warranty) + { + echo "Plate Number: " . $warranty->getPlateNumber() . "\n"; + echo "Mobile Number: " . $warranty->getMobileNumber() . "\n"; + echo "Last Name: " . $warranty->getLastName() . "\n"; + echo "First Name: " . $warranty->getFirstName() . "\n"; + } + } +} diff --git a/src/Controller/SearchController.php b/src/Controller/SearchController.php new file mode 100644 index 00000000..1d73c4d7 --- /dev/null +++ b/src/Controller/SearchController.php @@ -0,0 +1,44 @@ +acl_gen = $acl_gen; + parent::__construct($menu_gen); + } + + public function index() + { + $this->denyaccessUnlessGranted('general.search', null, 'No access.'); + $params = $this->initParameters('general_search'); + + // response + return $this->render('search/list.html.twig', $params); + } + + public function search(Request $req, GeneralSearch $search) + { + $this->denyAccessUnlessGranted('general.search', null, 'No access.'); + $params = $this->initParameters('general_search'); + + $search_term = $req->query->get('search'); + $results = $search->search($search_term); + + $params['data'] = $results; + return $this->render('search/results.html.twig', $params); + } +} diff --git a/src/Entity/LegacyJobOrder.php b/src/Entity/LegacyJobOrder.php index 345fc724..fde4d7ff 100644 --- a/src/Entity/LegacyJobOrder.php +++ b/src/Entity/LegacyJobOrder.php @@ -355,4 +355,345 @@ class LegacyJobOrder { return $this->id; } + + public function setTransDate($trans_date) + { + $this->id = $trans_date; + return $this; + } + + public function getTransDate() + { + return $this->trans_date; + } + + public function setTransType($trans_type) + { + $this->trans_type = $trans_type; + return $this; + } + + public function getTransType() + { + return $this->trans_type; + } + + public function setOrigin($origin) + { + $this->origin = $origin; + return $this; + } + + public function getOrigin() + { + return $this->origin; + } + + public function setCarBrand($car_brand) + { + $this->car_brand = $car_brand; + return $this; + } + + public function getCarBrand() + { + return $this->car_brand; + } + + public function setCarMake($car_make) + { + $this->car_make = $car_make; + return $this; + } + + public function getCarMake() + { + return $this->car_make; + } + + public function setCarModel($car_model) + { + $this->car_model = $car_model; + return $this; + } + + public function getCarModel() + { + return $this->car_model; + } + + public function setCarColor($car_color) + { + $this->car_color = $car_color; + return $this; + } + + public function getCarColor() + { + return $this->car_color; + } + + public function setCustName($cust_name) + { + $this->cust_name = $cust_name; + return $this; + } + + public function getCustName() + { + return $this->cust_name; + } + + public function setCustFirstName($cust_first_name) + { + $this->cust_first_name = $cust_first_name; + return $this; + } + + public function getCustFirstName() + { + return $this->cust_first_name; + } + + public function setCustMiddleName($cust_middle_name) + { + $this->cust_middle_name = $cust_middle_name; + return $this; + } + + public function getCustMiddleName() + { + return $this->cust_middle_name; + } + + public function setCustLastName($cust_last_name) + { + $this->cust_last_name = $cust_last_name; + return $this; + } + + public function getCustLastName() + { + return $this->cust_last_name; + } + + public function setCustContact($cust_contact) + { + $this->cust_contact = $cust_contact; + return $this; + } + + public function getCustContact() + { + return $this->cust_contact; + } + + public function setCustMobile($cust_mobile) + { + $this->cust_mobile = $cust_mobile; + return $this; + } + + public function getCustMobile() + { + return $this->cust_mobile; + } + + public function setCustLandline($cust_landline) + { + $this->cust_landline = $cust_landline; + return $this; + } + + public function getCustLandline() + { + return $this->cust_landline; + } + + public function setDeliveryInstructions($delivery_instructions) + { + $this->delivery_instructions = $delivery_instructions; + return $this; + } + + public function getDeliveryInstructions() + { + return $this->delivery_instructions; + } + + public function setAgentNotes1($agent_notes_1) + { + $this->agent_notes_1 = $agent_notes_1; + return $this; + } + + public function getAgentNotes1() + { + return $this->agent_notes_1; + } + + public function setDeliveryDate($delivery_date) + { + $this->delivery_date = $delivery_date; + return $this; + } + + public function getDeliveryDate() + { + return $this->delivery_date; + } + + public function setDeliveryTime($delivery_time) + { + $this->delivery_time = $delivery_time; + return $this; + } + + public function getDeliveryTime() + { + return $this->delivery_time; + } + + public function setAdvanceOrder($advance_order) + { + $this->advance_order = $advance_order; + return $this; + } + + public function getAdvanceOrder() + { + return $this->advance_order; + } + + public function setStage($stage) + { + $this->stage = $stage; + return $this; + } + + public function getStage() + { + return $this->stage; + } + + public function setCancelReason($cancel_reason) + { + $this->cancel_reason = $cancel_reason; + return $this; + } + + public function getCancelReason() + { + return $this->cancel_reason; + } + + public function setCancelReasonSpecify($cancel_reason_specify) + { + $this->cancel_reason_specify = $cancel_reason_specify; + return $this; + } + + public function getCancelReasonSpecify() + { + return $this->cancel_reason_specify; + } + + public function setPaymentMethod($payment_method) + { + $this->payment_method = $payment_method; + return $this; + } + + public function getPaymentMethod() + { + return $this->payment_method; + } + + public function setPreparedBy($prepared_by) + { + $this->prepared_by = $prepared_by; + return $this; + } + + public function getPreparedBy() + { + return $this->prepared_by; + } + + public function setDispatchTime($dispatch_time) + { + $this->dispatch_time = $dispatch_time; + return $this; + } + + public function getDispatchTime() + { + return $this->dispatch_time; + } + + public function setDispatchDate($dispatch_date) + { + $this->dispatch_date = $dispatch_date; + return $this; + } + + public function getDispatchDate() + { + return $this->dispatch_date; + } + + public function setDispatchBy($dispatch_by) + { + $this->dispatch_by = $dispatch_by; + return $this; + } + + public function getDispatchBy() + { + return $this->dispatch_by; + } + + public function setAddress($address) + { + $this->address = $address; + return $this; + } + + public function getAddress() + { + return $this->address; + } + + public function setLandmark($landmark) + { + $this->landmark = $landmark; + return $this; + } + + public function getLandmark() + { + return $this->landmark; + } + + public function setDatePurchase($date_purchase) + { + $this->date_purchase = $date_purchase; + return $this; + } + + public function getDatePurchase() + { + return $this->date_purchase; + } + + public function setPlateNumber($plate_number) + { + $this->plate_number = $plate_number; + return $this; + } + + public function getPlateNumber() + { + return $this->plate_number; + } } diff --git a/src/Service/GeneralSearch.php b/src/Service/GeneralSearch.php new file mode 100644 index 00000000..5a5b47ed --- /dev/null +++ b/src/Service/GeneralSearch.php @@ -0,0 +1,68 @@ +em = $em; + } + + public function search($search_term) + { + // query legacy job orders for plate number, name (first, middle, last), phone number(mobile, landline) + $legacy_job_orders = $this->em->createQuery('SELECT l FROM App\Entity\LegacyJobOrder l + WHERE l.plate_number LIKE :search_term + OR l.cust_mobile LIKE :search_term + OR l.cust_landline LIKE :search_term + OR l.cust_name LIKE :search_term + OR l.cust_last_name LIKE :search_term + OR l.cust_middle_name LIKE :search_term + OR l.cust_first_name LIKE :search_term + OR l.cust_contact LIKE :search_term') + ->setParameter('search_term', "%" . $search_term . "%") + ->setMaxResults(SEARCH_MAX_RESULTS) + ->getResult(); + + // query current job orders for plate number, name(first, last), phone number(mobile, landline, office, fax) + // join with customervehicle for plate number. join with customer for name and number + $job_orders = $this->em->createQuery('SELECT jo FROM App\Entity\JobOrder jo + JOIN jo.cus_vehicle cv + JOIN jo.customer c + WHERE cv.plate_number LIKE :search_term + OR c.first_name LIKE :search_term + OR c.last_name LIKE :search_term + OR c.phone_mobile LIKE :search_term + OR c.phone_landline LIKE :search_term + OR c.phone_office LIKE :search_term + OR c.phone_fax LIKE :search_term') + ->setParameter('search_term', "%" . $search_term . "%") + ->setMaxResults(SEARCH_MAX_RESULTS) + ->getResult(); + + // query warranty for plate number, name(first, last), phone number(mobile) + $warranties = $this->em->createQuery('SELECT w FROM App\Entity\Warranty w + WHERE w.plate_number LIKE :search_term + OR w.first_name LIKE :search_term + OR w.last_name LIKE :search_term + OR w.mobile_number LIKE :search_term') + ->setParameter('search_term', "%" . $search_term . "%") + ->setMaxResults(SEARCH_MAX_RESULTS) + ->getResult(); + + $results = array('legacy_job_orders'=>$legacy_job_orders, 'job_orders'=>$job_orders, 'warranties'=>$warranties); + + return $results; + } +} diff --git a/templates/search/list.html.twig b/templates/search/list.html.twig new file mode 100644 index 00000000..0d715c80 --- /dev/null +++ b/templates/search/list.html.twig @@ -0,0 +1,60 @@ +{% extends 'base.html.twig' %} + +{% block body %} + +
Legacy Job Orders
+| No records for legacy job orders | + {% else %} +ID | +Last Name | +Plate Number | + {% for key, result in data.legacy_job_orders %} +
|---|---|---|---|
| {{ result.getID }} | +{{ result.getCustLastName | default('') }} | +{{ result.getCustFirstNamei | default('') }} | +{{ result.getPlateNumber | default('') }} | +
Job Orders
+| No records for job orders | + {% else %} +ID | +Last Name | +Plate Number | + {% for result in data.job_orders %} +
|---|---|---|---|
| {{ result.getID }} | +{{ result.getCustomer.getLastName }} | +{{ result.getCustomer.getFirstName }} | +{{ result.getCustomerVehicle.getPlateNumber }} | +
Warranties
+| No records for warranties | + {% else %} +ID | +Last Name | +Plate Number | + {% for result in data.warranties %} +
|---|---|---|---|
| {{ result.getID }} | +{{ result.getLastName }} | +{{ result.getFirstName }} | +{{ result.getPlateNumber }} | +