From 3107e0d3e9e04cc600a05f1151a15492a2e26d1e Mon Sep 17 00:00:00 2001 From: Ramon Gutierrez Date: Fri, 12 Jan 2018 03:16:07 +0800 Subject: [PATCH] Add controlllers for vehicle entities --- src/Controller/BatteryController.php | 326 ++++++++++++++++++ src/Controller/VehicleController.php | 314 +++++++++++++++++ .../VehicleManufacturerController.php | 277 +++++++++++++++ 3 files changed, 917 insertions(+) create mode 100644 src/Controller/BatteryController.php create mode 100644 src/Controller/VehicleController.php create mode 100644 src/Controller/VehicleManufacturerController.php diff --git a/src/Controller/BatteryController.php b/src/Controller/BatteryController.php new file mode 100644 index 00000000..eaa21098 --- /dev/null +++ b/src/Controller/BatteryController.php @@ -0,0 +1,326 @@ +acl_gen = $acl_gen; + parent::__construct($menu_gen); + } + + public function index() + { + $this->denyAccessUnlessGranted('battery.list', null, 'No access.'); + + $params = $this->initParameters('battery_list'); + + // response + return $this->render('battery/list.html.twig', $params); + } + + public function rows(Request $req) + { + $this->denyAccessUnlessGranted('battery.list', null, 'No access.'); + + // build query + $qb = $this->getDoctrine() + ->getRepository(Battery::class) + ->createQueryBuilder('q'); + + // count total records + $total = $qb->select('COUNT(q)') + ->getQuery() + ->getSingleScalarResult(); + + // get datatable params + $datatable = $req->request->get('datatable'); + + // get current page number + $page = $datatable['pagination']['page'] ?? 1; + + $perpage = $datatable['pagination']['perpage']; + $offset = ($page - 1) * $perpage; + + // add metadata + $meta = [ + 'page' => $page, + 'perpage' => $perpage, + 'pages' => ceil($total / $perpage), + 'total' => $total, + 'sort' => 'asc', + 'field' => 'id' + ]; + + // build query + $query = $qb->select('q') + ->addSelect('mfg.name as mfg_name') + ->addSelect('model.name as model_name') + ->addSelect('size.name as size_name'); + + // add associations + $query->join('q.manufacturer', 'mfg') + ->join('q.model', 'model') + ->join('q.size', 'size'); + + // check if filter is present + if (isset($datatable['query']['data-rows-search']) && !empty($datatable['query']['data-rows-search'])) { + $query->where('mfg_name LIKE :filter') + ->orWhere('model_name LIKE :filter') + ->orWhere('size_name LIKE :filter') + ->orWhere('q.prod_code LIKE :filter') + ->setParameter('filter', '%' . $datatable['query']['data-rows-search'] . '%'); + } + + // check if sorting is present, otherwise use default + if (isset($datatable['sort']['field']) && !empty($datatable['sort']['field'])) { + $prefix = ''; + + if (!in_array($datatable['sort']['field'], ['mfg_name', 'model_name', 'size_name'])) + $prefix = 'q.'; + + $order = $datatable['sort']['sort'] ?? 'asc'; + $query->orderBy($prefix . $datatable['sort']['field'], $order); + } else { + $query->orderBy('mfg_name', 'asc'); + } + + // get rows for this page + $obj_rows = $query->setFirstResult($offset) + ->setMaxResults($perpage) + ->getQuery() + ->getResult(); + + // process rows + $rows = []; + foreach ($obj_rows as $orow) { + // add row data + $row['mfg_name'] = $orow->getManufacturer()->getName(); + $row['model_name'] = $orow->getModel()->getName(); + $row['size_name'] = $orow->getSize()->getName(); + $row['prod_code'] = $orow->getProductCode(); + $row['sell_price'] = $orow->getSellingPrice(); + $row['warr_personal'] = $orow->getWarrantyPersonal(); + $row['warr_commercial'] = $orow->getWarrantyCommercial(); + $row['res_capacity'] = $orow->getReserveCapacity(); + $row['length'] = $orow->getLength(); + $row['width'] = $orow->getWidth(); + $row['height'] = $orow->getHeight(); + $row['total_height'] = $orow->getTotalHeight(); + + // add row metadata + $row['meta'] = [ + 'update_url' => '', + 'delete_url' => '' + ]; + + // add crud urls + if ($this->isGranted('user.update')) + $row['meta']['update_url'] = $this->generateUrl('battery_update', ['id' => $row['id']]); + if ($this->isGranted('user.delete')) + $row['meta']['delete_url'] = $this->generateUrl('battery_delete', ['id' => $row['id']]); + + $rows[] = $row; + } + + // response + return $this->json([ + 'meta' => $meta, + 'data' => $rows + ]); + } + + public function create() + { + $this->denyAccessUnlessGranted('battery.add', null, 'No access.'); + + $params = $this->initParameters('battery_list'); + + $em = $this->getDoctrine()->getManager(); + + // get parent associations + $params['bmfgs'] = $em->getRepository(BatteryManufacturer::class)->findAll(); + $params['models'] = $em->getRepository(BatteryModel::class)->findAll(); + $params['sizes'] = $em->getRepository(BatterySize::class)->findAll(); + $params['vmfgs'] = $em->getRepository(VehicleManufacturer::class)->findAll(); + + // response + return $this->render('battery/form.html.twig', $params); + } + + public function createSubmit(Request $req, ValidatorInterface $validator) + { + $this->denyAccessUnlessGranted('battery.add', null, 'No access.'); + + // create new row + $em = $this->getDoctrine()->getManager(); + $row = new Battery(); + + // set and save values + $row->setID($req->request->get('id')) + ->setName($req->request->get('name')); + + // acl attributes + $acl_attribs = $req->request->get('acl'); + foreach ($acl_attribs as $acl_key) + { + $row->addACLAccess($acl_key); + } + + // validate + $errors = $validator->validate($row); + + // initialize error list + $error_array = []; + + // add errors to list + foreach ($errors as $error) { + $error_array[$error->getPropertyPath()] = $error->getMessage(); + } + + // check if any errors were found + if (!empty($error_array)) { + // return validation failure response + return $this->json([ + 'success' => false, + 'errors' => $error_array + ], 422); + } else { + // validated! save the entity + $em->persist($row); + $em->flush(); + + // return successful response + return $this->json([ + 'success' => 'Changes have been saved!' + ]); + } + } + + public function update($id) + { + $this->denyAccessUnlessGranted('battery.update', null, 'No access.'); + + $params = $this->initParameters('battery_list'); + + // get row data + $em = $this->getDoctrine()->getManager(); + $row = $em->getRepository(Role::class)->find($id); + + // make sure this row exists + if (empty($row)) + throw $this->createNotFoundException('The item does not exist'); + + // get parent associations + $params['bmfgs'] = $em->getRepository(BatteryManufacturer::class)->findAll(); + $params['models'] = $em->getRepository(BatteryModel::class)->findAll(); + $params['sizes'] = $em->getRepository(BatterySize::class)->findAll(); + $params['vmfgs'] = $em->getRepository(VehicleManufacturer::class)->findAll(); + + $params['row'] = $row; + + // response + return $this->render('battery/form.html.twig', $params); + } + + public function updateSubmit(Request $req, ValidatorInterface $validator, $id) + { + $this->denyAccessUnlessGranted('battery.update', null, 'No access.'); + + // get row data + $em = $this->getDoctrine()->getManager(); + $row = $em->getRepository(Role::class)->find($id); + + // make sure this row exists + if (empty($row)) + throw $this->createNotFoundException('The item does not exist'); + + // set and save values + $row->setID($req->request->get('id')) + ->setName($req->request->get('name')); + + // don't update acl attributes for super user since they don't need it + if (!$row->isSuperAdmin()) + { + // clear first + $row->clearACLAttributes(); + + // then add + $acl_attribs = $req->request->get('acl'); + foreach ($acl_attribs as $acl_key) + { + $row->addACLAccess($acl_key); + } + } + + // validate + $errors = $validator->validate($row); + + // initialize error list + $error_array = []; + + // add errors to list + foreach ($errors as $error) { + $error_array[$error->getPropertyPath()] = $error->getMessage(); + } + + // check if any errors were found + if (!empty($error_array)) { + // return validation failure response + return $this->json([ + 'success' => false, + 'errors' => $error_array + ], 422); + } else { + // validated! save the entity + $em->flush(); + + // return successful response + return $this->json([ + 'success' => 'Changes have been saved!' + ]); + } + } + + public function destroy($id) + { + $this->denyAccessUnlessGranted('battery.delete', null, 'No access.'); + + $params = $this->initParameters('battery_list'); + + // get row data + $em = $this->getDoctrine()->getManager(); + $row = $em->getRepository(Role::class)->find($id); + + if (empty($row)) + throw $this->createNotFoundException('The item does not exist'); + + // delete this row + $em->remove($row); + $em->flush(); + + // response + $response = new Response(); + $response->setStatusCode(Response::HTTP_OK); + $response->send(); + } +} diff --git a/src/Controller/VehicleController.php b/src/Controller/VehicleController.php new file mode 100644 index 00000000..4597e69e --- /dev/null +++ b/src/Controller/VehicleController.php @@ -0,0 +1,314 @@ +acl_gen = $acl_gen; + parent::__construct($menu_gen); + } + + public function index() + { + $this->denyAccessUnlessGranted('vehicle.list', null, 'No access.'); + + $params = $this->initParameters('vehicle_list'); + + // response + return $this->render('vehicle/list.html.twig', $params); + } + + public function rows(Request $req) + { + $this->denyAccessUnlessGranted('vehicle.list', null, 'No access.'); + + // build query + $qb = $this->getDoctrine() + ->getRepository(Vehicle::class) + ->createQueryBuilder('q'); + + // count total records + $total = $qb->select('COUNT(q)') + ->getQuery() + ->getSingleScalarResult(); + + // get datatable params + $datatable = $req->request->get('datatable'); + + // get current page number + $page = $datatable['pagination']['page'] ?? 1; + + $perpage = $datatable['pagination']['perpage']; + $offset = ($page - 1) * $perpage; + + // add metadata + $meta = [ + 'page' => $page, + 'perpage' => $perpage, + 'pages' => ceil($total / $perpage), + 'total' => $total, + 'sort' => 'asc', + 'field' => 'id' + ]; + + // build query + $query = $qb->select('q') + ->addSelect('mfg.name as mfg_name'); + + // add associations + $query->join('q.manufacturer', 'mfg'); + + // check if filter is present + if (isset($datatable['query']['data-rows-search']) && !empty($datatable['query']['data-rows-search'])) { + $query->where('mfg.name LIKE :filter') + ->orWhere('q.make LIKE :filter') + ->orWhere('q.model_year_from LIKE :filter') + ->orWhere('q.model_year_to LIKE :filter') + ->setParameter('filter', '%' . $datatable['query']['data-rows-search'] . '%'); + } + + // check if sorting is present, otherwise use default + if (isset($datatable['sort']['field']) && !empty($datatable['sort']['field'])) { + $prefix = ''; + + if (!in_array($datatable['sort']['field'], ['mfg_name'])) + $prefix = 'q.'; + + $order = $datatable['sort']['sort'] ?? 'asc'; + $query->orderBy($prefix . $datatable['sort']['field'], $order); + } else { + $query->orderBy('mfg_name', 'asc'); + } + + // get rows for this page + $obj_rows = $query->setFirstResult($offset) + ->setMaxResults($perpage) + ->getQuery() + ->getResult(); + + // process rows + $rows = []; + foreach ($obj_rows as $orow) { + // add row data + $row['id'] = $orow[0]->getID(); + $row['mfg_name'] = $orow['mfg_name']; + $row['make'] = $orow[0]->getMake(); + $row['model_year_from'] = $orow[0]->getModelYearFrom(); + $row['model_year_to'] = $orow[0]->getModelYearTo(); + + // add row metadata + $row['meta'] = [ + 'update_url' => '', + 'delete_url' => '' + ]; + + // add crud urls + if ($this->isGranted('user.update')) + $row['meta']['update_url'] = $this->generateUrl('vehicle_update', ['id' => $row['id']]); + if ($this->isGranted('user.delete')) + $row['meta']['delete_url'] = $this->generateUrl('vehicle_delete', ['id' => $row['id']]); + + $rows[] = $row; + } + + // response + return $this->json([ + 'meta' => $meta, + 'data' => $rows + ]); + } + + public function create() + { + $this->denyAccessUnlessGranted('vehicle.add', null, 'No access.'); + + $params = $this->initParameters('vehicle_list'); + + $em = $this->getDoctrine()->getManager(); + + // get parent associations + $params['manufacturers'] = $em->getRepository(VehicleManufacturer::class)->findAll(); + + $params['years'] = $this->generateYearOptions(); + + // response + return $this->render('vehicle/form.html.twig', $params); + } + + public function createSubmit(Request $req, ValidatorInterface $validator) + { + $this->denyAccessUnlessGranted('vehicle.add', null, 'No access.'); + + // create new row + $em = $this->getDoctrine()->getManager(); + $row = new Vehicle(); + + // set and save values + $row->setMake($req->request->get('make')); + $row->setModelYearFrom($req->request->get('model_year_from')); + $row->setModelYearTo($req->request->get('model_year_to')); + + // initialize error list + $error_array = []; + + // custom validation for associations + $manufacturer = $em->getRepository(VehicleManufacturer::class) + ->find($req->request->get('manufacturer')); + + if (empty($manufacturer)) + $error_array['manufacturer'] = 'Invalid manufacturer selected.'; + else { + $row->setManufacturer($manufacturer); + + // 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)) { + // return validation failure response + return $this->json([ + 'success' => false, + 'errors' => $error_array + ], 422); + } else { + // validated! save the entity + $em->persist($row); + $em->flush(); + + // return successful response + return $this->json([ + 'success' => 'Changes have been saved!' + ]); + } + } + + public function update($id) + { + $this->denyAccessUnlessGranted('vehicle.update', null, 'No access.'); + + $params = $this->initParameters('vehicle_list'); + + // get row data + $em = $this->getDoctrine()->getManager(); + $row = $em->getRepository(Vehicle::class)->find($id); + + // make sure this row exists + if (empty($row)) + throw $this->createNotFoundException('The item does not exist'); + + // get parent associations + $params['manufacturers'] = $em->getRepository(VehicleManufacturer::class)->findAll(); + + $params['years'] = $this->generateYearOptions(); + $params['row'] = $row; + + // response + return $this->render('vehicle/form.html.twig', $params); + } + + public function updateSubmit(Request $req, ValidatorInterface $validator, $id) + { + $this->denyAccessUnlessGranted('vehicle.update', null, 'No access.'); + + // get row data + $em = $this->getDoctrine()->getManager(); + $row = $em->getRepository(Vehicle::class)->find($id); + + // make sure this row exists + if (empty($row)) + throw $this->createNotFoundException('The item does not exist'); + + // set and save values + $row->setMake($req->request->get('make')); + $row->setModelYearFrom($req->request->get('model_year_from')); + $row->setModelYearTo($req->request->get('model_year_to')); + + // validate + $errors = $validator->validate($row); + + // initialize error list + $error_array = []; + + // add errors to list + foreach ($errors as $error) { + $error_array[$error->getPropertyPath()] = $error->getMessage(); + } + + // custom validation for associations + $manufacturer = $em->getRepository(VehicleManufacturer::class) + ->find($req->request->get('manufacturer')); + + if (empty($manufacturer)) + $error_array['manufacturer'] = 'Invalid manufacturer selected.'; + else + $row->setManufacturer($manufacturer); + + // check if any errors were found + if (!empty($error_array)) { + // return validation failure response + return $this->json([ + 'success' => false, + 'errors' => $error_array + ], 422); + } else { + // validated! save the entity + $em->flush(); + + // return successful response + return $this->json([ + 'success' => 'Changes have been saved!' + ]); + } + } + + public function destroy($id) + { + $this->denyAccessUnlessGranted('vehicle.delete', null, 'No access.'); + + $params = $this->initParameters('vehicle_list'); + + // get row data + $em = $this->getDoctrine()->getManager(); + $row = $em->getRepository(Vehicle::class)->find($id); + + if (empty($row)) + throw $this->createNotFoundException('The item does not exist'); + + // delete this row + $em->remove($row); + $em->flush(); + + // response + $response = new Response(); + $response->setStatusCode(Response::HTTP_OK); + $response->send(); + } + + protected function generateYearOptions() + { + $start_year = 1950; + return range($start_year, date("Y")); + } +} diff --git a/src/Controller/VehicleManufacturerController.php b/src/Controller/VehicleManufacturerController.php new file mode 100644 index 00000000..493600f1 --- /dev/null +++ b/src/Controller/VehicleManufacturerController.php @@ -0,0 +1,277 @@ +acl_gen = $acl_gen; + parent::__construct($menu_gen); + } + + public function index() + { + $this->denyAccessUnlessGranted('vmfg.list', null, 'No access.'); + + $params = $this->initParameters('vmfg_list'); + + // response + return $this->render('vehicle-manufacturer/list.html.twig', $params); + } + + public function rows(Request $req) + { + $this->denyAccessUnlessGranted('vmfg.list', null, 'No access.'); + + // build query + $qb = $this->getDoctrine() + ->getRepository(VehicleManufacturer::class) + ->createQueryBuilder('q'); + + // count total records + $total = $qb->select('COUNT(q)') + ->getQuery() + ->getSingleScalarResult(); + + // get datatable params + $datatable = $req->request->get('datatable'); + + // get current page number + $page = $datatable['pagination']['page'] ?? 1; + + $perpage = $datatable['pagination']['perpage']; + $offset = ($page - 1) * $perpage; + + // add metadata + $meta = [ + 'page' => $page, + 'perpage' => $perpage, + 'pages' => ceil($total / $perpage), + 'total' => $total, + 'sort' => 'asc', + 'field' => 'id' + ]; + + // build query + $query = $qb->select('q'); + + // check if filter is present + if (isset($datatable['query']['data-rows-search']) && !empty($datatable['query']['data-rows-search'])) { + $query->where('q.name LIKE :filter') + ->setParameter('filter', '%' . $datatable['query']['data-rows-search'] . '%'); + } + + // check if sorting is present, otherwise use default + if (isset($datatable['sort']['field']) && !empty($datatable['sort']['field'])) { + $order = $datatable['sort']['sort'] ?? 'asc'; + $query->orderBy('q.' . $datatable['sort']['field'], $order); + } else { + $query->orderBy('q.name', 'asc'); + } + + // get rows for this page + $obj_rows = $query->setFirstResult($offset) + ->setMaxResults($perpage) + ->getQuery() + ->getResult(); + + // process rows + $rows = []; + foreach ($obj_rows as $orow) { + // add row data + $row['id'] = $orow->getID(); + $row['name'] = $orow->getName(); + + // add row metadata + $row['meta'] = [ + 'update_url' => '', + 'delete_url' => '' + ]; + + // add crud urls + if ($this->isGranted('user.update')) + $row['meta']['update_url'] = $this->generateUrl('vmfg_update', ['id' => $row['id']]); + if ($this->isGranted('user.delete')) + $row['meta']['delete_url'] = $this->generateUrl('vmfg_delete', ['id' => $row['id']]); + + $rows[] = $row; + } + + // response + return $this->json([ + 'meta' => $meta, + 'data' => $rows + ]); + } + + public function create() + { + $this->denyAccessUnlessGranted('vmfg.add', null, 'No access.'); + + $params = $this->initParameters('vmfg_list'); + + // response + return $this->render('vehicle-manufacturer/form.html.twig', $params); + } + + public function createSubmit(Request $req, ValidatorInterface $validator) + { + $this->denyAccessUnlessGranted('vmfg.add', null, 'No access.'); + + // create new row + $em = $this->getDoctrine()->getManager(); + $row = new VehicleManufacturer(); + + // set and save values + $row->setName($req->request->get('name')); + + // validate + $errors = $validator->validate($row); + + // initialize error list + $error_array = []; + + // add errors to list + foreach ($errors as $error) { + $error_array[$error->getPropertyPath()] = $error->getMessage(); + } + + // check if any errors were found + if (!empty($error_array)) { + // return validation failure response + return $this->json([ + 'success' => false, + 'errors' => $error_array + ], 422); + } else { + // validated! save the entity + $em->persist($row); + $em->flush(); + + // return successful response + return $this->json([ + 'success' => 'Changes have been saved!' + ]); + } + } + + public function update($id) + { + $this->denyAccessUnlessGranted('vmfg.update', null, 'No access.'); + + $params = $this->initParameters('vmfg_list'); + + // get row data + $em = $this->getDoctrine()->getManager(); + $row = $em->getRepository(VehicleManufacturer::class)->find($id); + + // make sure this row exists + if (empty($row)) + throw $this->createNotFoundException('The item does not exist'); + + $params['row'] = $row; + $params['values'] = []; + + // response + return $this->render('vehicle-manufacturer/form.html.twig', $params); + } + + public function updateSubmit(Request $req, ValidatorInterface $validator, $id) + { + $this->denyAccessUnlessGranted('vmfg.update', null, 'No access.'); + + // get row data + $em = $this->getDoctrine()->getManager(); + $row = $em->getRepository(VehicleManufacturer::class)->find($id); + + // make sure this row exists + if (empty($row)) + throw $this->createNotFoundException('The item does not exist'); + + // set and save values + $row->setName($req->request->get('name')); + + // validate + $errors = $validator->validate($row); + + // initialize error list + $error_array = []; + + // add errors to list + foreach ($errors as $error) { + $error_array[$error->getPropertyPath()] = $error->getMessage(); + } + + // check if any errors were found + if (!empty($error_array)) { + // return validation failure response + return $this->json([ + 'success' => false, + 'errors' => $error_array + ], 422); + } else { + // validated! save the entity + $em->flush(); + + // return successful response + return $this->json([ + 'success' => 'Changes have been saved!' + ]); + } + } + + public function destroy($id) + { + $this->denyAccessUnlessGranted('vmfg.delete', null, 'No access.'); + + $params = $this->initParameters('vmfg_list'); + + // get row data + $em = $this->getDoctrine()->getManager(); + $row = $em->getRepository(VehicleManufacturer::class)->find($id); + + if (empty($row)) + throw $this->createNotFoundException('The item does not exist'); + + // delete this row + $em->remove($row); + $em->flush(); + + // response + $response = new Response(); + $response->setStatusCode(Response::HTTP_OK); + $response->send(); + } + + public function getVehicles(Request $req, $id) + { + if (!$this->isGranted('battery.add') && !$this->isGranted('battery.update')) { + $exception = $this->createAccessDeniedException('No access.'); + throw $exception; + } + + // get row data + $em = $this->getDoctrine()->getManager(); + $row = $em->getRepository(VehicleManufacturer::class)->find($id); + + if (empty($row)) + throw $this->createNotFoundException('The item does not exist'); + + // get vehicles + return $row->getVehicles(); + } +}