diff --git a/src/Command/GetFlawedWarrantiesCommand.php b/src/Command/GetFlawedWarrantiesCommand.php new file mode 100644 index 00000000..5ba04981 --- /dev/null +++ b/src/Command/GetFlawedWarrantiesCommand.php @@ -0,0 +1,248 @@ +em = $em; + $this->wh = $wh; + + $this->loadSAPBatteries(); + + parent::__construct(); + } + + protected function configure() + { + $this->setName('warranty:getflawedwarranties') + ->setDescription('Get warranties that need to be fixed.') + ->setHelp('Get flawed warranties') + ->addArgument('start_date', InputArgument::REQUIRED, 'Start Date') + ->addArgument('end_date', InputArgument::REQUIRED, 'End Date'); + } + + protected function execute(InputInterface $input, OutputInterface $output) + { + $s_date = $input->getArgument('start_date'); + $e_date = $input->getArgument('end_date'); + + $start_date = DateTime::createFromFormat('Ymd', $s_date); + $end_date = DateTime::createFromFormat('Ymd', $e_date); + $end_date->setTime(23, 59); + + $missing_warranties = []; + $comm_private_warranties = []; + $invalid_plate_numbers = []; + $duplicate_warranties = []; + $sdate_expiry_wrong_warranties = []; + + $first_results_set = $this->getMissingWarranties($start_date, $end_date); + //$second_results_set = $this->getWarrantiesWithWrongEntries($start_date, $end_date); + //$third_results_set = $this->getDuplicateWarranties($start_date, $end_date); + + $missing_warranties = $first_results_set['missing']; + $invalid_plate_numbers = $first_results_set['invalid_plate_number']; + $comm_private_warranties = $first_results_set['commercial_private']; + + // our warranty error categories: missing, commercial_private, invalid plate number, duplicate, start date of expiry computation wrong + $this->outputResults($missing_warranties, $invalid_plate_numbers, $comm_prvate_warranties); + + return 0; + } + + protected function getMissingWarranties($start_date, $end_date) + { + $em = $this->em; + + // get all job orders with battery new service type within date range + $jo_query = $em->createQuery('select ii,i,jo,cv from App\Entity\InvoiceItem ii inner join ii.invoice i inner join i.job_order jo inner join jo.cus_vehicle cv join jo.customer c where ii.battery is not null and jo.service_type = :service_type and jo.date_schedule > :date_start and jo.date_schedule < :date_end'); + $jo_query->setParameter('service_type', ServiceType::BATTERY_REPLACEMENT_NEW) + ->setParameter('date_start', $start_date) + ->setParameter('date_end', $end_date); + + $jos = $jo_query->iterate(); + + $invalids = []; + $missings = []; + $comm_privates = []; + + foreach($jos as $row) + { + $invoice_item = $row[0]; + $invoice = $invoice_item->getInvoice(); + $jo = $invoice->getJobOrder(); + $cv = $jo->getCustomerVehicle(); + $customer = $jo->getCustomer(); + + if ($invoice_item != null) + { + if($invoice_item->getBattery() != null) + { + // manually retrieve the SAPBattery using the SAPCode + $battery_sap_code = $invoice_item->getBattery()->getSAPCode(); + $found_battery = $this->findSAPBattery($battery_sap_code); + $sap_code = '\'' . $battery_sap_code . '\''; + if (!$found_battery) + { + $sap_code = 'NULL'; + } + + // have to use this erroneous setting of the warranty period + // to be able to find those warranties that were added with this warranty period. + // warranties found with this warranty period will be marked as commercial_private + $warranty_period = 0; + if ($invoice_item->getBattery()->getWarrantyPrivate() != null) + { + $warranty_period = $invoice_item->getBattery()->getWarrantyPrivate(); + } + if ($invoice_item->getBattery()->getWarrantyCommercial() != null) + { + $warranty_period = $invoice_item->getBattery()->getWarrantyCommercial(); + } + if ($invoice_item->getBattery()->getWarrantyTnv() != null) + { + $warranty_period = $invoice_item->getBattery()->getWarrantyTnv(); + } + + if ($invoice->getDateCreate() != null) + { + // check if plate number is "clean". If not, do not insert into warranty + if (!(Warranty::cleanPlateNumber($cv->getPlateNumber()))) + { + // log with the dupes + $invalids[] = [ + 'jo_id' => $jo->getID(), + 'plate_number' => $cv->getPlateNumber(), + 'expiry_date' => '', + ]; + + continue; + } + + // check if warranty already exists + $cleaned_plate_number = Warranty::cleanPlateNumber($cv->getPlateNumber()); + + // use date_create of invoice as start date, as decided in group chat + $expiry_date_date_create = $this->computeDateExpire($jo->getInvoice()->getDateCreate(), $warranty_period); + $results = $em->getRepository(Warranty::class)->findBy(['plate_number' => $cleaned_plate_number, + 'date_expire' => $expiry_date_date_create]);; + + if (empty($results)) + { + $missings[] = [ + 'jo_id' => $jo->getID(), + 'plate_number' => $cv->getPlateNumber(), + 'expiry_date' => $expiry_date_date_create->format('Y-m-d'), + ]; + } + else + { + foreach ($results as $warranty) + { + $comm_privates[] = [ + 'warranty_id' => $warranty->getID(), + 'plate_number' => $warranty->getPlateNumber(), + 'expiry_date' => $warranty->getDateExpire()->format('Y-m-d'), + ]; + } + } + } + } + } + + $em->detach($row[0]); + $em->clear(); + } + + $res = [ + 'missing' => $missings, + 'invalid_plate_number' => $invalids, + 'commercial_private' => $comm_privates, + ]; + + return $res; + + } + + protected function getWarrantiesWithWrongEntries($start_date, $end_date) + { + $em = $this->em; + + // get all job orders with battery new service type within date range + $jo_query = $em->createQuery('select ii,i,jo,cv from App\Entity\InvoiceItem ii inner join ii.invoice i inner join i.job_order jo inner join jo.cus_vehicle cv join jo.customer c where ii.battery is not null and jo.service_type = :service_type and jo.date_schedule > :date_start and jo.date_schedule < :date_end'); + $jo_query->setParameter('service_type', ServiceType::BATTERY_REPLACEMENT_NEW) + ->setParameter('date_start', $start_date) + ->setParameter('date_end', $end_date); + + $jos = $jo_query->iterate(); + + foreach($jos as $row) + { + $invoice_item = $row[0]; + $invoice = $invoice_item->getInvoice(); + $jo = $invoice->getJobOrder(); + $cv = $jo->getCustomerVehicle(); + $customer = $jo->getCustomer(); + + $em->detach($row[0]); + $em->clear(); + } + + } + + protected function getDuplicateWarranties($start_date, $end_date) + { + } + + protected function outputResults($missing, $invalid, $commercial_private) + { + // output one file per array in csv format + } + + protected function loadSAPBatteries() + { + $this->sapbatt_hash = []; + + $sap_batteries = $this->em->getRepository(SAPBattery::class)->findAll(); + foreach($sap_batteries as $sap_batt) + { + $id = $sap_batt->getID(); + $brand_size = $sap_batt->getBrand()->getID() . " " . $sap_batt->getSize()->getID(); + $this->sapbatt_hash[$id] = $brand_size; + } + } + + protected function findSAPBattery($batt_id) + { + if (!isset($this->sapbatt_hash[$batt_id])) + { + return false; + } + + return true; + } + + + +}