diff --git a/src/Command/ImportCarClubCustomerHubCommand.php b/src/Command/ImportCarClubCustomerHubCommand.php index 29040955..15275a1c 100644 --- a/src/Command/ImportCarClubCustomerHubCommand.php +++ b/src/Command/ImportCarClubCustomerHubCommand.php @@ -10,24 +10,29 @@ use Symfony\Component\Console\Output\OutputInterface; use Doctrine\ORM\EntityManagerInterface; use App\Entity\Customer; +use App\Entity\CustomerTag; use App\Entity\CarClubCustomerHub; use App\Entity\Hub; class ImportCarClubCustomerHubCommand extends Command { // field index in csv file - const F_REGION = 0; - const F_OUTLET = 1; - const F_ADDRESS = 2; - const F_LAST_NAME_COUNT = 3; - const F_CONTACT_PERSON = 4; - const F_CONTACT_NUMBER = 5; + const F_HUB_NAME = 0; + const F_HUB_ADDRESS = 1; + const F_CAR_CLUB = 2; + const F_FIRST_NAME = 3; + const F_LAST_NAME = 4; + const F_CONTACT_NUMBER = 5; + const F_BATT_SIZE = 6; + const F_SERIAL = 7; protected $em; + protected $cust_tag_hash; public function __construct(EntityManagerInterface $em) { $this->em = $em; + $this->loadCustomerTags(); parent::__construct(); } @@ -37,6 +42,7 @@ class ImportCarClubCustomerHubCommand extends Command $this->setName('customer:importcarclubhub') ->setDescription('Import assigned hubs for customers for car club.') ->setHelp('Import assigned hubs for customers for car club.') + ->addArgument('promo_tag', InputArgument::REQUIRED, 'Promo customer tag ID to use.') ->addArgument('input_file', InputArgument::REQUIRED, 'Path to the input CSV file with the customer and hub info.') ->addArgument('output_file', InputArgument::REQUIRED, 'Output filename'); } @@ -45,6 +51,14 @@ class ImportCarClubCustomerHubCommand extends Command { $csv_file = $input->getArgument('input_file'); $output_file = $input->getArgument('output_file'); + $promo_tag_id = $input->getArgument('promo_tag'); + + // fetch promo tag + $promo_tag = $this->em->getRepository(CustomerTag::class)->find($promo_tag_id); + if ($promo_tag == null) + { + throw new Exception('Could not find promo tag - ' . $promo_tag_id); + } // attempt to open file try @@ -68,7 +82,7 @@ class ImportCarClubCustomerHubCommand extends Command } // process row - $output_info[] = $this->processRow($fields); + $output_info[] = $this->processRow($fields, $promo_tag); $row_num++; } @@ -81,71 +95,124 @@ class ImportCarClubCustomerHubCommand extends Command return 0; } - protected function processRow($fields) + protected function processRow($fields, $promo_tag) { - $hub_name = trim($fields[SELF::F_OUTLET]); $contact_number = trim($fields[SELF::F_CONTACT_NUMBER]); + $car_club = trim($fields[self::F_CAR_CLUB]); if (empty($contact_number)) { // add info to output array return $this->setOutputInfo($fields, 'NOT ADDED', 'No mobile number', ''); } - - // clean up contact number - $valid_contact_numbers = $this->getValidContactNumbers($contact_number); - // get first customer that matches any of the numbers - $customer = $this->findCustomerByNumbers($valid_contact_numbers); - - // if no customer found, create one - if ($customer == null) - { - error_log('Creating customer...'); - - // TODO: create customer - // add info to output array - return $this->setOutputInfo($fields, 'NOT ADDED', 'No customer found', ''); - } + $hub_name = trim($fields[SELF::F_HUB_NAME]); // find hub using name $hub = $this->findHubByName($hub_name); - // if no hub, log to output info + if ($hub == null) { // add info to output array return $this->setOutputInfo($fields, 'NOT ADDED', 'No hub found', ''); } - // at this point, we have customer and hub - // create CarClubCustomerHub - $car_club_cust_hub = new CarClubCustomerHub(); + // clean up contact number + $valid_contact_numbers = $this->getValidContactNumbers($contact_number); + // check customer tag + $cust_tag = $this->findCustomerTag($car_club); + $cust_id = ''; + + // get first customer that matches any of the numbers + $customer = $this->findCustomerByNumbers($valid_contact_numbers); + + // if no customer found, create one and add the hub + if ($customer == null) + { + error_log('Creating customer...'); + + // create new customer + $new_cust = $this->createNewCustomer($fields, $valid_contact_numbers, $cust_tag, $promo_tag); + + // get customer id of new customer here + $cust_id = $new_cust->getID(); + + // create the carclubcustomerhub + $this->createCarClubCustomerHub($fields, $new_cust, $hub); + + // add info to output array + return $this->setOutputInfo($fields, 'CUSTOMER CREATED AND CUSTOMER HUB ADDED', '', $cust_id); + } + + //customer exists, we just need to add the hub and the promo tag + // NOTE: for now, we add the promo tag and the hub + // to the first customer found with the mobile number + $customer->addCustomerTag($promo_tag) + ->addCustomerTag($cust_tag); + + // create the carclubcustomerhub + $this->createCarClubCustomerHub($fields, $customer, $hub); + + return $this->setOutputInfo($fields, 'CUSTOMER HUB ADDED', '', $customer->getID()); + } + + protected function createCarClubCustomerHub($fields, $cust, $hub) + { + $car_club_cust_hub = new CarClubCustomerHub(); $car_club_cust_hub->setHub($hub); - $customer->setCarClubCustomerHub($car_club_cust_hub); + + $cust->setCarClubCustomerHub($car_club_cust_hub); $this->em->persist($car_club_cust_hub); $this->em->flush(); + } - return $this->setOutputInfo($fields, 'ADDED', '', $customer->getID()); + protected function createNewCustomer($fields, $contact_numbers, $cust_tag, $promo_tag) + { + $fname = trim($fields[self::F_FIRST_NAME]); + $lname = trim($fields[self::F_LAST_NAME]); + + if (count($contact_numbers) > 0) + $clean_number = $contact_numbers[0]; + else + $clean_number = ''; + + // create new customer + $new_cust = new Customer(); + $new_cust->setFirstName($fname) + ->setLastName($lname) + ->setPhoneMobile($clean_number) + ->setCreateSource('car_club_file') + ->addCustomerTag($cust_tag) + ->addCustomerTag($promo_tag); + + $this->em->persist($new_cust); + $this->em->flush(); + + return $new_cust; } protected function setOutputInfo($fields, $status, $reason, $cust_id) { - $region = trim($fields[SELF::F_REGION]); - $outlet = trim($fields[SELF::F_OUTLET]); - $address = trim($fields[SELF::F_ADDRESS]); - $last_name_count = trim($fields[SELF::F_LAST_NAME_COUNT]); - $contact_person = trim($fields[SELF::F_CONTACT_PERSON]); + $hub_name = trim($fields[SELF::F_HUB_NAME]); + $hub_address = trim($fields[SELF::F_HUB_ADDRESS]); + $car_club_name = trim($fields[SELF::F_CAR_CLUB]); + $first_name = trim($fields[self::F_FIRST_NAME]); + $last_name = trim($fields[self::F_LAST_NAME]); $contact_number = trim($fields[SELF::F_CONTACT_NUMBER]); + $battery_size = trim($fields[SELF::F_BATT_SIZE]); + $serial = trim($fields[SELF::F_SERIAL]); return [ - $region, - $outlet, - $address, - $last_name_count, - $contact_person, + $hub_name, + $hub_address, + $car_club_name, + $first_name, + $last_name, $contact_number, + $battery_size, + $serial, $status, $reason, $cust_id @@ -165,12 +232,14 @@ class ImportCarClubCustomerHubCommand extends Command // write the headers fputcsv($fh, [ - 'Region', - 'Outlet Assignment', - 'Address', - 'Count of Last Name', - 'Contact Person', + 'Hub Name', + 'Hub Address', + 'Car Club Name', + 'First Name', + 'Last Name', 'Contact Number', + 'Battery Size', + 'Serial', 'Status', 'Reason', 'Customer ID', @@ -198,6 +267,31 @@ class ImportCarClubCustomerHubCommand extends Command return $hub; } + protected function findCustomerTag($car_club) + { + // find the customer tag for club + $tag_name = $this->normalizeClubName($car_club); + error_log($tag_name); + if (isset($this->cust_tag_hash[$tag_name])) + return $this->cust_tag_hash[$tag_name]; + + error_log('customer tag not in hash...'); + // create the customer tag + $new_cust_tag = new CustomerTag(); + $tag_details = json_decode('{"type":"car club"}', true); + $new_cust_tag->setID($tag_name) + ->setName(strtoupper($car_club)) + ->setTagDetails($tag_details); + $this->em->persist($new_cust_tag); + + // need to flush before adding to hash + $this->em->flush(); + + $this->cust_tag_hash[$tag_name] = $new_cust_tag; + + return $new_cust_tag; + } + protected function getValidContactNumbers($contact_number) { // check contact number if mobile or not @@ -264,7 +358,35 @@ class ImportCarClubCustomerHubCommand extends Command return ""; } + protected function loadCustomerTags() + { + $this->cust_tag_hash = []; + $cust_tags = $this->em->getRepository(CustomerTag::class)->findAll(); + foreach ($cust_tags as $cust_tag) + { + $tag_id = $cust_tag->getID(); + $this->cust_tag_hash[$tag_id] = $cust_tag; + } + } + protected function normalizeClubName($name) + { + // uppercase the name + $clean_name = trim(strtoupper($name)); + // remove apostrophes + $clean_name = str_replace("'", '', $clean_name); + + // replace all special characters except ampersand (&) with whitespace + $clean_name = trim(preg_replace('/[^A-Za-z0-9&]/', ' ', $clean_name)); + + // replace spaces with underscore (_) + $clean_name = preg_replace('/\s+/', '_', $clean_name); + + // prepend 'TAG_' + $tag_name = 'TAG_' . $clean_name; + + return $tag_name; + } } diff --git a/src/Entity/CarClubCustomerHub.php b/src/Entity/CarClubCustomerHub.php index 2e64cab1..397de567 100644 --- a/src/Entity/CarClubCustomerHub.php +++ b/src/Entity/CarClubCustomerHub.php @@ -19,8 +19,7 @@ class CarClubCustomerHub protected $id; /** - * one CarClubCustomerHub has one Hub - * @ORM\OneToOne(targetEntity="Hub") + * @ORM\ManyToOne(targetEntity="Hub") */ protected $hub;