denyAccessUnlessGranted('warranty.list', null, 'No access.'); return $this->render('warranty/list.html.twig'); } public function rows(Request $req) { $this->denyAccessUnlessGranted('warranty.list', null, 'No access.'); // get query builder $qb = $this->getDoctrine() ->getRepository(Warranty::class) ->createQueryBuilder('q'); // get datatable params $datatable = $req->request->get('datatable'); // count total records $tquery = $qb->select('COUNT(q)'); // add filters to count query $this->setQueryFilters($datatable, $tquery); $total = $tquery->getQuery() ->getSingleScalarResult(); // 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'); // add filters to query $this->setQueryFilters($datatable, $query); // 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.id', '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['serial'] = $orow->getSerial(); $row['plate_number'] = $orow->getPlateNumber(); $row['warranty_class'] = $orow->getWarrantyClass(); $row['status'] = $orow->getStatus(); $row['is_activated'] = $orow->isActivated(); // add row metadata $row['meta'] = [ 'update_url' => '', ]; // add crud urls if ($this->isGranted('warranty.update')) $row['meta']['update_url'] = $this->generateUrl('warranty_update', ['id' => $row['id']]); $rows[] = $row; } // response return $this->json([ 'meta' => $meta, 'data' => $rows ]); } /** * @Menu(selected="warranty_list") */ public function addForm() { $this->denyAccessUnlessGranted('warranty.add', null, 'No access.'); $params['obj'] = new Warranty(); $params['mode'] = 'create'; // get dropdown parameters $this->fillDropdownParameters($params); // response return $this->render('warranty/form.html.twig', $params); } public function addSubmit(Request $req, ValidatorInterface $validator) { $this->denyAccessUnlessGranted('warranty.add', null, 'No access.'); // create new row $em = $this->getDoctrine()->getManager(); $obj = new Warranty(); $date_purchase = DateTime::createFromFormat('d M Y', $req->request->get('date_purchase')); $date_claim = DateTime::createFromFormat('d M Y', $req->request->get('date_claim')); $date_expire = DateTime::createFromFormat('d M Y', $req->request->get('date_expire')); // set and save values $obj->setSerial($req->request->get('serial')) ->setWarrantyClass($req->request->get('warranty_class')) ->setFirstName($req->request->get('first_name')) ->setLastName($req->request->get('last_name')) ->setMobileNumber($req->request->get('mobile_number')) ->setDatePurchase($date_purchase) ->setClaimedFrom($req->request->get('claim_from')) ->setStatus($req->request->get('status')); if ($date_claim) { $obj->setDateClaim($date_claim); } if ($date_expire) { $obj->setDateExpire($date_expire); } // custom validation for battery model $model = $em->getRepository(BatteryModel::class) ->find($req->request->get('battery_model')); if (empty($model)) $error_array['battery_model'] = 'Invalid model selected.'; else $obj->setBatteryModel($model); // custom validation for battery size $size = $em->getRepository(BatterySize::class) ->find($req->request->get('battery_size')); if (empty($size)) $error_array['battery_size'] = 'Invalid size selected.'; else $obj->setBatterySize($size); // custom validation for SAP battery $sap = $em->getRepository(SAPBattery::class) ->find($req->request->get('sap_battery')); if (empty($sap)) $error_array['sap_battery'] = 'Invalid SAP battery selected.'; else $obj->setSAPBattery($sap); // validate $errors = $validator->validate($obj); $cleaned_plate_number = Warranty::cleanPlateNumber($req->request->get('plate_number')); if (!$cleaned_plate_number) { $error_array['plate_number'] = 'Invalid plate number specified.'; } $obj->setPlateNumber($cleaned_plate_number); // 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($obj); $em->flush(); // return successful response return $this->json([ 'success' => 'Changes have been saved!' ]); } } /** * @Menu(selected="warranty_list") */ public function updateForm($id) { $this->denyAccessUnlessGranted('warranty.update', null, 'No access.'); $params['mode'] = 'update'; // get row data $em = $this->getDoctrine()->getManager(); $obj = $em->getRepository(Warranty::class)->find($id); // make sure this row exists if (empty($obj)) throw $this->createNotFoundException('The item does not exist'); $params['obj'] = $obj; // get dropdown parameters $this->fillDropdownParameters($params); // response return $this->render('warranty/form.html.twig', $params); } public function updateSubmit(Request $req, ValidatorInterface $validator, $id) { $this->denyAccessUnlessGranted('warranty.update', null, 'No access.'); // get row data $em = $this->getDoctrine()->getManager(); $obj = $em->getRepository(Warranty::class)->find($id); // make sure this row exists if (empty($obj)) throw $this->createNotFoundException('The item does not exist'); $date_purchase = DateTime::createFromFormat('d M Y', $req->request->get('date_purchase')); $date_claim = DateTime::createFromFormat('d M Y', $req->request->get('date_claim')); $date_expire = DateTime::createFromFormat('d M Y', $req->request->get('date_expire')); // set and save values $obj->setSerial($req->request->get('serial')) ->setWarrantyClass($req->request->get('warranty_class')) ->setFirstName($req->request->get('first_name')) ->setLastName($req->request->get('last_name')) ->setMobileNumber($req->request->get('mobile_number')) ->setDatePurchase($date_purchase) ->setClaimedFrom($req->request->get('claim_from')) ->setStatus($req->request->get('status')); if ($date_claim) { $obj->setDateClaim($date_claim); } if ($date_expire) { $obj->setDateExpire($date_expire); } // custom validation for battery model $model = $em->getRepository(BatteryModel::class) ->find($req->request->get('battery_model')); if (empty($model)) $error_array['battery_model'] = 'Invalid model selected.'; else $obj->setBatteryModel($model); // custom validation for battery size $size = $em->getRepository(BatterySize::class) ->find($req->request->get('battery_size')); if (empty($size)) $error_array['battery_size'] = 'Invalid size selected.'; else $obj->setBatterySize($size); // custom validation for SAP battery $sap = $em->getRepository(SAPBattery::class) ->find($req->request->get('sap_battery')); if (empty($sap)) $error_array['sap_battery'] = 'Invalid SAP battery selected.'; else $obj->setSAPBattery($sap); // validate $errors = $validator->validate($obj); $cleaned_plate_number = Warranty::cleanPlateNumber($req->request->get('plate_number')); if (!$cleaned_plate_number) { $error_array['plate_number'] = 'Invalid plate number specified.'; } $obj->setPlateNumber($cleaned_plate_number); // 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($obj); $em->flush(); // return successful response return $this->json([ 'success' => 'Changes have been saved!' ]); } } /** * @Menu(selected="warranty_list") */ public function uploadForm() { $this->denyAccessUnlessGranted('warranty.upload', null, 'No access.'); return $this->render('warranty/upload.form.html.twig'); } /** * @Menu(selected="warranty_list") */ public function uploadSubmit(Request $req, EntityManagerInterface $em) { // retrieve temporary info for file $file = $req->files->get('csv_file'); // process the csv file $this->processWarrantyFile($file, $em); return $this->render('warranty/upload.form.html.twig'); } protected function processWarrantyFile(UploadedFile $csv_file, EntityManagerInterface $em) { // attempt to open file try { $fh = fopen($csv_file, "r"); } catch (Exception $e) { throw new Exception('The file "' . $csv_file . '" could be read.'); } // loop through the rows // 0 - Owner First Name // 1 - Owner Last Name // 2 - Owner Email // 3 - Owner Address // 4 - Owner Mobile // 5 - Owner Telephone // 6 - Vehicle Make // 7 - Vehicle Model // 8 - Vehicle Year // 9 - Vehicle Plate Number // 10 - Battery Serial Number // 11 - Battery Sales Invoice // 12 - Battery Date of Purchase // 13 - Distributor Name // 14 - Distributor Address // 15 - Application Type ID // 16 - Battery ID // 17 - Ownership Type $row_num = 0; while (($fields = fgetcsv($fh)) !== false) { // start processing at row 1, not 0 if ($row_num < 1) { $row_num++; continue; } // get the data $first_name = trim($fields[0]); $last_name = trim($fields[1]); $mobile_number = trim($fields[4]); $plate_number = trim($fields[9]); $serial = trim($fields[10]); $purchase_date = trim($fields[12]); $battery_id = trim($fields[16]); // new warranty $warranty = new Warranty(); // clean the plate number $cleaned_plate_number = Warranty::cleanPlateNumber($plate_number); if ($cleaned_plate_number) { error_log("mogol plate number " . $cleaned_plate_number); // continue processing // check if purchase_date is empty. If so, ignore entry $date_purchase = DateTime::createFromFormat('d-M-y', $purchase_date); if ($date_purchase != false) { error_log ("mogol date purchase " . $purchase_date); // get the battery purchased // check battery first. If not found, check sap_battery $battery = $em->getRepository(Battery::class)->find($battery_id); if ($battery != null) { // get the battery model and battery size $model_id = $battery->getModel()->getID(); $size_id = $battery->getSize()->getID(); $bty_model = $em->getRepository(BatteryModel::class)->find($model_id); $bty_size = $em->getRepository(BatterySize::class)->find($size_id); if ($bty_model != null) { $warranty->setBatteryModel($bty_model); } if ($bty_size != null) { $warranty->setBatterySize($bty_size); } } else { // find battery in sap_battery $battery = $em->getRepository(SAPBattery::class)->find($battery_id); if ($battery != null) { // battery is SAPBattery $warranty->setSAPBattery($battery); } } // set and save values error_log("mogol serial " . $serial); $warranty->setSerial($serial) ->setPlateNumber($cleaned_plate_number) ->setFirstName($first_name) ->setLastName($last_name) ->setMobileNumber($mobile_number) ->setDatePurchase($date_purchase); $em->persist($warranty); $em->flush(); } } $row_num++; } } protected function fillDropdownParameters(&$params) { $em = $this->getDoctrine()->getManager(); $params['batt_models'] = $em->getRepository(BatteryModel::class)->findAll(); $params['batt_sizes'] = $em->getRepository(BatterySize::class)->findAll(); $params['sap_batts'] = $em->getRepository(SAPBattery::class)->findAll(); $params['warranty_classes'] = WarrantyClass::getCollection(); $params['warranty_statuses'] = WarrantyStatus::getCollection(); } // check if datatable filter is present and append to query protected function setQueryFilters($datatable, &$query) { if (isset($datatable['query']['data-rows-search']) && !empty($datatable['query']['data-rows-search'])) { $query->where('q.serial LIKE :filter') ->orWhere('q.plate_number LIKE :filter') ->setParameter('filter', '%' . $datatable['query']['data-rows-search'] . '%'); } } }