Browse Source

migrate user customer profil

bach 2 years ago
parent
commit
1806c09228

+ 13 - 30
config/sync/migrate_plus.migration.d7_user_profile_customer.yml

@@ -18,43 +18,26 @@ migration_tags:
 migration_group: d7_materio
 label: 'D7 User Customer Profile'
 source:
-  plugin: d7_user_profile
+  plugin: d7_user_profile_customer
   batch_size: 1000
-  high_water_property:
-    name: changed
-    alias: p
 process:
   type:
-    -
-      plugin: skip_on_value
-      equals: true
-      source: type
-      method: row
-      value:
-        - contact_operationnel
-    -
-      plugin: static_map
-      source: type
-      map:
-        adherent: customer
+    plugin: default_value
+    default_value: customer
   uid:
     plugin: migration_lookup
     migration: d7_users
     source: uid
-  phone: field_private_phone
-  address:
-    plugin: iterator
-    source: field_adresse
-    process:
-      country_code: country
-      administrative_area: administrative_area
-      locality: locality
-      dependent_locality: dependent_locality
-      postal_code: postal_code
-      address_line1: thoroughfare
-      organization: organisation_name
-      given_name: first_name
-      family_name: last_name
+  phone: billing_phone
+  address/country_code: billing_country
+  address/administrative_area: billing_zone
+  address/locality: billing_city
+  address/postal_code: billing_postal_code
+  address/address_line1: billing_street1
+  address/address_line2: billing_street2
+  address/organization: billing_company
+  address/given_name: billing_first_name
+  address/family_name: billing_last_name
   tax_number:
     plugin: iterator
     source: field_vat_number_intra_ce

+ 56 - 42
web/modules/custom/materio_migrate/config/install/migrate_plus.migration.d7_user_profile_customer.yml

@@ -8,12 +8,9 @@ migration_tags:
   - Materio
 
 source:
-  plugin: d7_user_profile
+  plugin: d7_user_profile_customer
   batch_size: 1000
-  high_water_property:
-    name: changed
-    alias: p
-
+  
 destination:
   plugin: entity:profile
 
@@ -21,51 +18,68 @@ process:
   # id: pid
   # label: label
 
-  type:
-    -
-      plugin: skip_on_value
-      equals: true
-      source: type
-      method: row
-      value:
-        - contact_operationnel
-    -  
-      plugin: static_map
-      source: type
-      map:
-        adherent: customer
+  type: 
+    plugin: default_value
+    default_value: customer
+    # -
+    #   plugin: skip_on_value
+    #   equals: true
+    #   source: type
+    #   method: row
+    #   value:
+    #     - contact_operationnel
+    # -  
+    #   plugin: static_map
+    #   source: type
+    #   map:
+    #     adherent: customer
 
   uid:
     plugin: migration_lookup
     migration: d7_users
     source: uid
 
-  phone: field_private_phone
+  phone: billing_phone
+
+
+  
+  address/country_code: billing_country
+  address/administrative_area: billing_zone
+  address/locality: billing_city
+  # address/dependent_locality: dependent_locality
+  address/postal_code: billing_postal_code
+  # address/sorting_code:
+  address/address_line1: billing_street1
+  address/address_line2: billing_street2
+  address/organization: billing_company
+  address/given_name: billing_first_name
+  # address/additional_name:
+  address/family_name: billing_last_name
 
-  address:
-      plugin: iterator
-      source: field_adresse
-      process:
-        # langcode:
-        country_code: country
-        administrative_area: administrative_area
-        locality: locality
-        dependent_locality: dependent_locality
-        postal_code: postal_code
-        # sorting_code:
-        address_line1: thoroughfare
-        # address_line2:
-        organization: organisation_name
-        given_name: first_name
-        # additional_name:
-        family_name: last_name
+  # address:
+  #     plugin: iterator
+  #     source: field_adresse
+  #     process:
+  #       # langcode:
+  #       country_code: country
+  #       administrative_area: administrative_area
+  #       locality: locality
+  #       dependent_locality: dependent_locality
+  #       postal_code: postal_code
+  #       # sorting_code:
+  #       address_line1: thoroughfare
+  #       # address_line2:
+  #       organization: organisation_name
+  #       given_name: first_name
+  #       # additional_name:
+  #       family_name: last_name
 
-        # SOURCES
-        # sub_administrative_area
-        # premise
-        # sub_premise
-        # name_line
-        # data
+  #       # SOURCES
+  #       # sub_administrative_area
+  #       # premise
+  #       # sub_premise
+  #       # name_line
+  #       # data
 
   # body:
   #     plugin: iterator

+ 273 - 0
web/modules/custom/materio_migrate/src/Plugin/migrate/source/D7UserProfileCustomer.php

@@ -0,0 +1,273 @@
+<?php
+
+namespace Drupal\materio_migrate\Plugin\migrate\source;
+
+use Drupal\Core\Extension\ModuleHandlerInterface;
+use Drupal\migrate\Row;
+use Drupal\migrate_drupal\Plugin\migrate\source\d7\FieldableEntity;
+use Drupal\Core\Database\Query\SelectInterface;
+use Drupal\Core\Entity\EntityManagerInterface;
+use Drupal\Core\Extension\ModuleHandler;
+use Drupal\Core\State\StateInterface;
+use Drupal\migrate\Plugin\MigrationInterface;
+use Symfony\Component\DependencyInjection\ContainerInterface;
+use Drupal\Core\Locale\CountryManagerInterface;
+use libphonenumber\PhoneNumber;
+use libphonenumber\PhoneNumberUtil;
+use libphonenumber\PhoneNumberFormat;
+/**
+ * Drupal 7 node source from database.
+ *
+ * @MigrateSource(
+ *   id = "d7_user_profile_customer",
+ *   source_module = "profile2"
+ * )
+ */
+class D7UserProfileCustomer extends FieldableEntity {
+
+  /**
+   * Phone Number util.
+   *
+   * @var \libphonenumber\PhoneNumberUtil
+   */
+  public $phoneUtils;
+
+  /**
+   * Country Manager service.
+   *
+   * @var \Drupal\Core\Locale\CountryManagerInterface
+   */
+  public $countryManager;
+
+  /**
+   * The module handler.
+   *
+   * @var \Drupal\Core\Extension\ModuleHandlerInterface
+   */
+  protected $moduleHandler;
+
+  /**
+   * {@inheritdoc}
+   */
+  public function __construct(array $configuration, $plugin_id, $plugin_definition, MigrationInterface $migration, StateInterface $state, EntityManagerInterface $entity_manager, ModuleHandlerInterface $module_handler, CountryManagerInterface $country_manager) {
+    parent::__construct($configuration, $plugin_id, $plugin_definition, $migration, $state, $entity_manager);
+    $this->moduleHandler = $module_handler;
+    $this->phoneUtils = PhoneNumberUtil::getInstance();
+    $this->countryManager = $country_manager;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition, MigrationInterface $migration = NULL) {
+    return new static(
+      $configuration,
+      $plugin_id,
+      $plugin_definition,
+      $migration,
+      $container->get('state'),
+      $container->get('entity.manager'),
+      $container->get('module_handler'),
+      $container->get('country_manager')
+    );
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function query() {
+    // Select node in its last revision.
+    $query = $this->select('uc_orders', 'uco')
+      ->fields('uco', [
+        'uid',
+        // 'order_id',
+        // 'billing_first_name',
+        // 'billing_last_name',
+        // 'billing_phone',
+        // 'billing_company',
+        // 'billing_street1',
+        // 'billing_street2',
+        // 'billing_city',
+        // 'billing_zone',
+        // 'billing_postal_code',
+        // 'billing_country'
+      ])
+      ->groupBy('uco.uid')
+      // ->groupBy('uco.order_id')
+      // ->groupBy('uco.billing_first_name')
+      // ->groupBy('uco.billing_last_name')
+      // ->groupBy('uco.billing_phone')
+      // ->groupBy('uco.billing_company')
+      // ->groupBy('uco.billing_street1')
+      // ->groupBy('uco.billing_street2')
+      // ->groupBy('uco.billing_city')
+      // ->groupBy('uco.billing_zone')
+      // ->groupBy('uco.billing_postal_code')
+      // ->groupBy('uco.billing_country')
+      ->condition('order_status', 'completed')
+      ->orderBy('modified', 'DESC');
+    $query->innerJoin('users', 'u', 'uco.uid = u.uid');
+    
+    return $query;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function prepareRow(Row $row) {
+    // $order_id = $row->getSourceProperty('order_id');
+    $uid = $row->getSourceProperty('uid');
+    drush_print("\n".'-- '.$uid);
+    $query = $this->select('uc_orders', 'uco')
+      ->fields('uco', [
+        'uid',
+        'order_id',
+        'billing_first_name',
+        'billing_last_name',
+        'billing_phone',
+        'billing_company',
+        'billing_street1',
+        'billing_street2',
+        'billing_city',
+        'billing_zone',
+        'billing_postal_code',
+        'billing_country',
+        'modified'
+      ])
+      ->condition('order_status', 'completed')
+      ->condition('uco.uid', $uid)
+      ->orderBy('modified', 'ASC');
+    $query->innerJoin('users', 'u', 'uco.uid = u.uid');
+    $query->fields('u',['mail']);
+  
+      // TODO filter by user active
+    $user_orders = $query->execute()->fetchAll();
+
+    $fields = [];
+    foreach ($user_orders as $order) {
+      foreach ($order as $field_name => $field){
+        if ($field !== '') {
+          $fields[$field_name] = $field;
+        }
+      }
+    }
+
+    if (count($user_orders) > 1){
+      drush_print(print_r($user_orders, true));
+      drush_print(print_r($fields, true));
+    }
+
+    foreach ($fields as $field_name => $field){
+      $row->setSourceProperty($field_name, $field);
+    }
+    // // convert phone field with libphonenumber
+    // $phone = $row->getSourceProperty('billing_phone');
+    // if(isset($phone[0]['number']) && !empty($phone[0]['number'])){
+    //   $national_number = $phone[0]['number'];
+    //   $region = strtoupper($phone[0]['country_codes']);
+    //   // isValidRegionCode($regionCode)
+    //   if($this->phoneUtils->isPossibleNumber($national_number, $region)){
+    //     $number = $this->phoneUtils->parse($national_number, $region);
+    //     $row->setSourceProperty('billing_phone', $this->phoneUtils->format($number, PhoneNumberFormat::E164));
+    //   }else{
+    //     // add bad phone number to memo field
+    //     $memo .= "#migration : invalid phone number: ".$national_number.' region: '.$region."\n";
+    //     drush_print('WARNING: phone number invalide; number: '.$national_number.' region: '.$region);
+    //   }
+    // }
+
+    // country_zone
+    $query = $this->select('uc_countries', 'ucc')
+      ->condition('ucc.country_id', $row->getSourceProperty('billing_country'))
+      ->fields('ucc', [
+        'country_id',
+        'country_name',
+        'country_iso_code_2',
+        'country_iso_code_3',]);
+    $country = array_shift($query->execute()->fetchAll());
+    drush_print(print_r($country, true));
+    $row->setSourceProperty('billing_country', $country['country_iso_code_2']);
+    
+
+    // billing_zone
+    $query = $this->select('uc_zones', 'ucz')
+      ->condition('ucz.zone_id', $row->getSourceProperty('billing_zone'))
+      ->fields('ucz', [
+        'zone_code',
+        'zone_name',
+      ]);
+    $zone = array_shift($query->execute()->fetchAll());
+    drush_print(print_r($zone, true));
+    $row->setSourceProperty('billing_zone', $zone['zone_code']);
+    
+    
+
+    // get TVA from old adhérent profil
+    $query = $this->select('profile', 'p')
+      ->fields('p', [
+        'pid',
+        'type',
+        'uid',
+        'label',
+        'created',
+        'changed',
+      ])
+      ->condition('uid', $uid)
+      ->condition('type', 'adherent')
+      ->orderBy('changed');
+    $profils = $query->execute()->fetchAll();
+
+    if(count($profils)){
+      $profil = array_shift($profils);
+      // Get Field API field values.
+      // foreach ($this->getFields('profile2', $profil['type']) as $field_name => $field) {
+      //   // drush_print($field_name);
+      //   $value = $this->getFieldValues('profile2', $field_name, $profil['pid']);
+      //   $row->setSourceProperty($field_name, $value);
+      // }
+      $vat = $this->getFieldValues('profile2', 'field_vat_number_intra_ce', $profil['pid']);
+      $row->setSourceProperty('field_vat_number_intra_ce', $vat);
+    }
+
+
+    // record migration errors in field_memo
+    if(isset($memo)){
+      $field_memo = $row->getSourceProperty('field_memo');
+      $field_memo[0]['value'] .= "\n".$memo;
+      $row->setSourceProperty('field_memo', $field_memo);
+    }
+
+    return parent::prepareRow($row);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function fields() {
+    $fields = [
+      'order_id' => $this->t('Order ID'),
+      'uid' => $this->t('User id'),
+      'billing_first_name' => $this->t('First name'),
+      'billing_last_name' => $this->t('Last name'),
+      'billing_phone' => $this->t('Phone'),
+      'billing_company' => $this->t('Company'),
+      'billing_street1' => $this->t('Street 1'),
+      'billing_street2' => $this->t('Street 2'),
+      'billing_city' => $this->t('City'),
+      'billing_zone' => $this->t('Zone'),
+      'billing_postal_code' => $this->t('Postal code'),
+      'billing_country' => $this->t('Country'),
+    ];
+    return $fields;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getIds() {
+    $ids['uid']['type'] = 'integer';
+    $ids['uid']['alias'] = 'p';
+    return $ids;
+  }
+
+}