From 8adea20f59ee0d3ea718f8e21305446d44a0b70c Mon Sep 17 00:00:00 2001 From: Korina Cordero Date: Mon, 27 May 2019 13:59:51 +0000 Subject: [PATCH 1/2] Fix memory error when querying the database. #213 --- .../GenerateWarrantyFromJobOrderCommand.php | 126 +++++++++++++----- 1 file changed, 96 insertions(+), 30 deletions(-) diff --git a/src/Command/GenerateWarrantyFromJobOrderCommand.php b/src/Command/GenerateWarrantyFromJobOrderCommand.php index 1412c706..57bf1be4 100644 --- a/src/Command/GenerateWarrantyFromJobOrderCommand.php +++ b/src/Command/GenerateWarrantyFromJobOrderCommand.php @@ -17,15 +17,21 @@ use App\Entity\Warranty; use App\Entity\SAPBattery; use App\Ramcar\ServiceType; +use App\Ramcar\WarrantyStatus; class GenerateWarrantyFromJobOrderCommand extends Command { protected $em; + protected $sapbatt_hash; + protected $warranties_hash; public function __construct(ObjectManager $em) { $this->em = $em; + $this->loadSAPBatteries(); + $this->loadWarranties(); + parent::__construct(); } @@ -43,22 +49,68 @@ class GenerateWarrantyFromJobOrderCommand extends Command return $expire_date; } + 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 loadWarranties() + { + $this->warranties_hash = []; + + $warranties = $this->em->getRepository(Warranty::class)->findAll(); + foreach($warranties as $warranty) + { + $plate_number = $warranty->getPlateNumber(); + $date_expire = $warranty->getDateExpire(); + $expiry_date = $date_expire->format('Y-m-d'); + + $this->warranties_hash[$plate_number][$expiry_date] = $warranty->getID(); + } + } + + protected function findSAPBattery($batt_id) + { + if (!isset($this->sapbatt_hash[$batt_id])) + { + return false; + } + + return true; + } + + protected function findWarranty($plate_number, $expiry_date) + { + $date_expire = $expiry_date->format('Y-m-d'); + if (!isset($this->warranties_hash[$plate_number][$date_expire])) + { + return false; + } + + return true; + } + protected function execute(InputInterface $input, OutputInterface $output) { $em = $this->em; - $qb = $this->em->getRepository(JobOrder::class)->createQueryBuilder('j'); + $query = $em->createQuery('SELECT jo FROM App\Entity\JobOrder jo + WHERE jo.service_type = :service_type'); + $query->setParameter('service_type', ServiceType::BATTERY_REPLACEMENT_NEW); - // get all job orders with service_type='battery_replacement_new' - $qb->select('j') - ->where('j.service_type = :service_type') - ->setParameter('service_type', ServiceType::BATTERY_REPLACEMENT_NEW); + $result = $query->iterate(); - $query = $qb->getQuery(); - $result = $query->getResult(); - - foreach ($result as $jo) + foreach ($result as $row) { + $jo = $row[0]; $invoice_items = []; // For now, one invoice == one battery $invoice_items = $jo->getInvoice()->getItems(); @@ -69,8 +121,13 @@ class GenerateWarrantyFromJobOrderCommand extends Command { // manually retrieve the SAPBattery using the SAPCode $battery_sap_code = $invoice_item->getBattery()->getSAPCode(); - $sap_battery = $this->em->getRepository(SAPBattery::class)->find($battery_sap_code); - + $found_battery = $this->findSAPBattery($battery_sap_code); + $sap_code = '\'' . $battery_sap_code . '\''; + if (!$found_battery) + { + $sap_code = 'NULL'; + } + // get warranty period for battery $warranty_period = 0; if ($invoice_item->getBattery()->getWarrantyPrivate() != null) @@ -96,30 +153,39 @@ class GenerateWarrantyFromJobOrderCommand extends Command // check if warranty already exists $cleaned_plate_number = Warranty::cleanPlateNumber($jo->getCustomerVehicle()->getPlateNumber()); $expiry_date = $this->computeDateExpire($jo->getInvoice()->getDateCreate(), $warranty_period); - $found_warranty = $this->em->createQuery("SELECT count(w) FROM App\Entity\Warranty w - WHERE w.plate_number = :plate_number AND w.date_expire = :date_expire") - ->setParameter('plate_number', $cleaned_plate_number) - ->setParameter('date_expire', $expiry_date->format('Y-m-d')) - ->getSingleScalarResult(); - if ($found_warranty == 0) + $found_warranty = $this->findWarranty($cleaned_plate_number, $expiry_date); + if (!$found_warranty) { - $warranty = new Warranty(); - $warranty->setWarrantyClass($jo->getWarrantyClass()) - ->setFirstName($jo->getCustomer()->getFirstName()) - ->setLastName($jo->getCustomer()->getLastName()) - ->setMobileNumber($jo->getCustomer()->getPhoneMobile()) - ->setPlateNumber($cleaned_plate_number) - ->setDatePurchase($jo->getInvoice()->getDateCreate()) - ->setDateExpire($expiry_date) - ->setBatteryModel($invoice_item->getBattery()->getModel()) - ->setBatterySize($invoice_item->getBattery()->getSize()) - ->setSAPBattery($sap_battery); - $em->persist($warranty); + $bty_model_id = $invoice_item->getBattery()->getModel()->getID(); + $bty_size_id = $invoice_item->getBattery()->getSize()->getID(); + $warranty_class = $jo->getWarrantyClass(); + + $date = $jo->getInvoice()->getDateCreate(); + $date_purchase = $date->format('Y-m-d'); + + $date_create = date('Y-m-d H:i:s'); + + $date_expire = $expiry_date->format('Y-m-d'); + + $first_name = addslashes(trim($jo->getCustomer()->getFirstName())); + $last_name = addslashes(trim($jo->getCustomer()->getLastName())); + $mobile_number = addslashes(trim($jo->getCustomer()->getPhoneMobile())); + + $values = '(' . $bty_model_id . ',' . $bty_size_id . ',NULL,\'' . $warranty_class . '\',\'' + . $cleaned_plate_number . '\',\'' . WarrantyStatus::ACTIVE . '\',\'' . $date_create . '\',\'' . $date_purchase + . '\',\'' . $date_expire . '\',NULL,' + . $sap_code . ',NULL,\'' . $first_name . '\',\'' . $last_name . '\',\'' . $mobile_number . '\');'; + + $sql_statement = 'INSERT INTO `warranty` (bty_model_id,bty_size_id,serial,warranty_class,plate_number,status,date_create,date_purchase,date_expire,date_claim,sap_bty_id,claim_id,first_name,last_name,mobile_number) VALUES ' . $values . "\n"; + + echo $sql_statement; + } - $em->flush(); } } } + $em->detach($row[0]); + $em->clear(); } } } From 754af5e1e42afe7e5cadf90b4db003e8b7090642 Mon Sep 17 00:00:00 2001 From: Kendrick Chan Date: Tue, 28 May 2019 01:20:09 +0800 Subject: [PATCH 2/2] Fix memory issue for warranty generation #213 --- .../GenerateWarrantyFromJobOrderCommand.php | 40 +++++++++++++++---- 1 file changed, 32 insertions(+), 8 deletions(-) diff --git a/src/Command/GenerateWarrantyFromJobOrderCommand.php b/src/Command/GenerateWarrantyFromJobOrderCommand.php index 57bf1be4..86653d97 100644 --- a/src/Command/GenerateWarrantyFromJobOrderCommand.php +++ b/src/Command/GenerateWarrantyFromJobOrderCommand.php @@ -66,15 +66,22 @@ class GenerateWarrantyFromJobOrderCommand extends Command { $this->warranties_hash = []; + /* $warranties = $this->em->getRepository(Warranty::class)->findAll(); foreach($warranties as $warranty) { $plate_number = $warranty->getPlateNumber(); $date_expire = $warranty->getDateExpire(); + + // skip null date expire + if ($date_expire == null) + continue; + $expiry_date = $date_expire->format('Y-m-d'); $this->warranties_hash[$plate_number][$expiry_date] = $warranty->getID(); } + */ } protected function findSAPBattery($batt_id) @@ -102,19 +109,32 @@ class GenerateWarrantyFromJobOrderCommand extends Command { $em = $this->em; + // to save on joins, go with invoice item first + $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'); + $query->setParameter('service_type', ServiceType::BATTERY_REPLACEMENT_NEW); + /* $query = $em->createQuery('SELECT jo FROM App\Entity\JobOrder jo WHERE jo.service_type = :service_type'); $query->setParameter('service_type', ServiceType::BATTERY_REPLACEMENT_NEW); + */ $result = $query->iterate(); foreach ($result as $row) { - $jo = $row[0]; + $invoice_item = $row[0]; + $invoice = $invoice_item->getInvoice(); + $jo = $invoice->getJobOrder(); + $cv = $jo->getCustomerVehicle(); + $customer = $jo->getCustomer(); + /* $invoice_items = []; - // For now, one invoice == one battery + // for now, one invoice == one battery + + $invoice_items = $jo->getInvoice()->getItems(); $invoice_item = $invoice_items[0]; + */ if ($invoice_item != null) { if($invoice_item->getBattery() != null) @@ -129,6 +149,7 @@ class GenerateWarrantyFromJobOrderCommand extends Command } // get warranty period for battery + // TODO: base it on the battery type $warranty_period = 0; if ($invoice_item->getBattery()->getWarrantyPrivate() != null) { @@ -143,15 +164,17 @@ class GenerateWarrantyFromJobOrderCommand extends Command $warranty_period = $invoice_item->getBattery()->getWarrantyTnv(); } - if ($jo->getInvoice()->getDateCreate() != null) + if ($invoice->getDateCreate() != null) { // check if plate number is "clean". If not, do not insert into warranty - if (!(Warranty::cleanPlateNumber($jo->getCustomerVehicle()->getPlateNumber()))) + if (!(Warranty::cleanPlateNumber($cv->getPlateNumber()))) { continue; } + // check if warranty already exists - $cleaned_plate_number = Warranty::cleanPlateNumber($jo->getCustomerVehicle()->getPlateNumber()); + $cleaned_plate_number = Warranty::cleanPlateNumber($cv->getPlateNumber()); + $expiry_date = $this->computeDateExpire($jo->getInvoice()->getDateCreate(), $warranty_period); $found_warranty = $this->findWarranty($cleaned_plate_number, $expiry_date); if (!$found_warranty) @@ -167,9 +190,9 @@ class GenerateWarrantyFromJobOrderCommand extends Command $date_expire = $expiry_date->format('Y-m-d'); - $first_name = addslashes(trim($jo->getCustomer()->getFirstName())); - $last_name = addslashes(trim($jo->getCustomer()->getLastName())); - $mobile_number = addslashes(trim($jo->getCustomer()->getPhoneMobile())); + $first_name = addslashes(trim($customer->getFirstName())); + $last_name = addslashes(trim($customer->getLastName())); + $mobile_number = addslashes(trim($customer->getPhoneMobile())); $values = '(' . $bty_model_id . ',' . $bty_size_id . ',NULL,\'' . $warranty_class . '\',\'' . $cleaned_plate_number . '\',\'' . WarrantyStatus::ACTIVE . '\',\'' . $date_create . '\',\'' . $date_purchase @@ -184,6 +207,7 @@ class GenerateWarrantyFromJobOrderCommand extends Command } } } + $em->detach($row[0]); $em->clear(); }