em = $em; $this->wh = $wh; $this->loadSAPBatteries(); parent::__construct(); } protected function configure() { $this->setName('warranty:cleanup') ->setDescription('Cleanup warranties.') ->setHelp('Cleanup warranties') ->addArgument('start_date', InputArgument::REQUIRED, 'Start Date') ->addArgument('end_date', InputArgument::REQUIRED, 'End Date'); } protected function execute(InputInterface $input, OutputInterface $output) { $em = $this->em; $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); // 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 and jo.status = :status'); $jo_query->setParameter('service_type', ServiceType::BATTERY_REPLACEMENT_NEW) ->setParameter('date_start', $start_date) ->setParameter('date_end', $end_date) ->setParameter('status', JOStatus::FULFILLED); $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(); error_log($cv->getPlateNumber()); $clean_plate_num = Warranty::cleanPlateNumber($cv->getPlateNumber()); if (!($clean_plate_num)) { error_log('invalid plate'); continue; } if ($invoice_item == null) { error_log('invoice item null'); continue; } if ($invoice_item->getBattery() == null) { error_log('invoice item not a battery'); continue; } error_log('clean plate, invoice item not null, battery not 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'; } // check if a warranty exists with the plate number and date_schedule // get date_schedule $datetime_schedule = $jo->getDateSchedule(); $datetime_schedule_str = $datetime_schedule->format('Y-m-d'); $date_schedule = DateTime::createFromFormat('Y-m-d', $datetime_schedule_str); $warranties_date_schedule = $this->em->getRepository(Warranty::class)->findBy(['plate_number' => $clean_plate_num, 'date_purchase' => $date_schedule]); if (empty($warranties_date_schedule)) { // check if warranty exists with plate number and date_fulfilled $datetime_fulfilled = $jo->getDateFulfill(); $datetime_fulfilled_str = $datetime_fulfilled->format('Y-m-d'); $date_fulfilled = DateTime::createFromFormat('Y-m-d', $datetime_fulfilled_str); $warranties_date_fulfilled = $this->em->getRepository(Warranty::class)->findBy(['plate_number' => $clean_plate_num, 'date_purchase' => $date_fulfilled]); if (!(empty($warranties_date_fulfilled))) { foreach ($warranties_date_fulfilled as $warranty) { // fix expiration date // get warranty class of JO $jo_warranty_class = $jo->getWarrantyClass(); $warranty_period = 0; if ($jo_warranty_class == WarrantyClass::WTY_PRIVATE) { $warranty_period = $invoice_item->getBattery()->getWarrantyPrivate(); } if ($jo_warranty_class == WarrantyClass::WTY_COMMERCIAL) { $warranty_period = $invoice_item->getBattery()->getWarrantyCommercial(); } if ($jo_warranty_class == WarrantyClass::WTY_TNV) { $warranty_period = $invoice_item->getBattery()->getWarrantyTnv(); } // NOTE: changing date_purchase to date_schedule unless told otherwise $date_purchase = $datetime_schedule_str; // compute expiration date $expiry_date = $this->wh->computeDateExpire($date_schedule, $warranty_period); $date_expiry = $expiry_date->format('Y-m-d'); $date_purchase_value = '\'' . $date_purchase . '\''; $date_expire_value = '\'' . $date_expiry . '\''; $update_sql_statement = 'UPDATE `warranty` SET date_expire=' . $date_expire_value . ', date_purchase=' . $date_purchase_value . ' WHERE id=\'' . $warranty->getID() . '\';' . "\n"; echo $update_sql_statement; } } else error_log('no warranty date_fulfilled found.'); } else error_log('warranty date_schedule found.'); $em->detach($row[0]); $em->clear(); } } 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; } }