PEEL Shopping
Open source ecommerce : PEEL Shopping
clients_segmentation.php
Go to the documentation of this file.
1 <?php
2 // This file should be in UTF8 without BOM - Accents examples: éèê
3 // +----------------------------------------------------------------------+
4 // | Copyright (c) 2004-2015 Advisto SAS, service PEEL - contact@peel.fr |
5 // +----------------------------------------------------------------------+
6 // | This file is part of PEEL Shopping 8.0.0, which is subject to an |
7 // | opensource GPL license: you are allowed to customize the code |
8 // | for your own needs, but must keep your changes under GPL |
9 // | More information: https://www.peel.fr/lire/licence-gpl-70.html |
10 // +----------------------------------------------------------------------+
11 // | Author: Advisto SAS, RCS 479 205 452, France, https://www.peel.fr/ |
12 // +----------------------------------------------------------------------+
13 // $Id: clients_segmentation.php 46935 2015-09-18 08:49:48Z gboussin $
14 if (!defined('IN_PEEL')) {
15  die();
16 }
17 
18 include($GLOBALS['dirroot'] . '/lib/fonctions/fonctions_admin.php');
19 
26 {
27  $query = query('SELECT o.id_utilisateur AS customers_id, count(*) AS this_count, IF( o_timestamp <"' . date('Y-m-d 00:00:00', time()-3600 * 24 * 365) . '",1,0) AS old
28  FROM peel_commandes o
29  INNER JOIN peel_statut_paiement sp ON sp.id=o.id_statut_paiement
30  WHERE sp.technical_code IN ("being_checked","completed")
31  GROUP BY o.id_utilisateur, IF(o.o_timestamp < "' . date('Y-m-d 00:00:00', time()-3600 * 24 * 365) . '",1,0)
32  ORDER BY o.id_utilisateur ASC');
33  while ($result = fetch_assoc($query)) {
34  if (empty($result['old'])) {
35  $recent_buys[$result['customers_id']] = $result['this_count'];
36  } else {
37  $old_buys[$result['customers_id']] = $result['this_count'];
38  }
39  $users[] = $result['customers_id'];
40  }
41  foreach($users as $user_id) {
42  $buys = 0;
43  if (!empty($old_buys[$user_id])) {
44  $buys += $old_buys[$user_id];
45  }
46  if (!empty($recent_buys[$user_id])) {
47  $buys += $recent_buys[$user_id];
48  }
49  if ($buys >= 2 && !empty($recent_buys[$user_id])) {
50  $users_seg_buy['multi_recent'][$user_id] = true;
51  } elseif (!empty($recent_buys[$user_id])) {
52  $users_seg_buy['one_recent'][$user_id] = true;
53  } elseif ($buys >= 2) {
54  $users_seg_buy['multi_old'][$user_id] = true;
55  } elseif ($buys == 1) {
56  $users_seg_buy['one_old'][$user_id] = true;
57  } else {
58  // On n'est pas censé passer ici puisqu'on ne traite que les utilisateurs avec au moins une commande
59  // $users_seg_buy['no'][$user_id] = true; // inutile car on fait un UPDATE à no pour tous par défaut avant MAJ
60  }
61  }
62  query('UPDATE peel_utilisateurs SET seg_buy="no"');
63  // var_dump($users_seg_buy); die();
64  foreach($users_seg_buy as $this_value => $ids_as_keys) {
65  query('UPDATE peel_utilisateurs
66  SET seg_buy="' . nohtml_real_escape_string($this_value) . '"
67  WHERE id_utilisateur IN ("' . implode('","', real_escape_string(array_keys($ids_as_keys))) . '") AND ' . get_filter_site_cond('utilisateurs') . '');
68  }
69  $GLOBALS['contentMail'] .= 'MAJ des valeurs de segmentation achat : OK' . "\n";
70 }
71 
78 {
79  if (check_if_module_active('annonces')) {
80  $query = query('SELECT UNIX_TIMESTAMP(expiration_date) AS paid_until_timestamp, user_id
81  FROM peel_gold_ads');
82  while ($result = fetch_assoc($query)) {
83  $gold_ads_renewals_timestamps[$result['user_id']][] = $result['paid_until_timestamp'];
84  }
85  }
86  $query = query('SELECT user_id, timestamp
87  FROM peel_admins_contacts_planified
88  WHERE timestamp >= UNIX_TIMESTAMP(NOW())
89  ORDER BY timestamp ASC');
90  while ($contact = fetch_assoc($query)) {
91  $planified_contact_timestamps[$contact['user_id']][] = $contact['timestamp'];
92  }
93  $query = query('SELECT id_membre, UNIX_TIMESTAMP(MAX(date)) AS last_contact_timestamp, COUNT(*) AS contacts_count
94  FROM peel_admins_actions
95  WHERE action IN ("PHONE_EMITTED", "PHONE_RECEIVED", "SEND_EMAIL") AND ' . get_filter_site_cond('admins_actions') . '
96  GROUP BY id_membre');
97  while ($contact = fetch_assoc($query)) {
98  $last_contact_timestamps[$contact['id_membre']] = $contact['last_contact_timestamp'];
99  $contacts_counts[$contact['id_membre']] = $contact['contacts_count'];
100  }
101  $query = query('SELECT *, TO_DAYS(now())-TO_DAYS(GREATEST(date_insert,"2008-01-01 00:00:00")) AS followed_days
102  FROM peel_utilisateurs
103  WHERE ' . get_filter_site_cond('utilisateurs') . '');
104  while ($user = fetch_assoc($query)) {
105  $user_id = $user['id_utilisateur'];
106  $seg_followed = '';
107  $is_actif = ($user['etat'] !== '0');
108  if ($is_actif) {
109  // Evaluation de la fréquence de suivi
110  if (!empty($contacts_counts) && !empty($contacts_counts[$user_id])) {
111  $frequence_followed = $contacts_counts[$user_id] * 365 / $user['followed_days'];
112  } else {
113  $frequence_followed = 0;
114  }
115  if ($frequence_followed == 0) {
116  $seg_followed = 'no';
117  } elseif ($frequence_followed < 3) {
118  $seg_followed = 'poor';
119  } else {
120  $seg_followed = 'correct';
121  }
122  // Préparation de la définition de la prochaine date de contact et de la raison
123  $seg_note = getClientNote($user);
124  if (!empty($last_contact_timestamps[$user_id])) {
125  $contact_time_basis = $last_contact_timestamps[$user_id];
126  } else {
127  $contact_time_basis = strtotime($user['date_insert']);
128  }
129  if (!empty($seg_note)) {
130  // Si seg_not=0 => Pas de contact => on en rentre pas de $next_contact_time['usual']
131  if ($seg_note < 38) {
132  $seg_contact_days_frequence = 365;
133  } elseif ($seg_note < 45) {
134  $seg_contact_days_frequence = 182;
135  } elseif ($seg_note < 60) {
136  $seg_contact_days_frequence = 91;
137  } else {
138  $seg_contact_days_frequence = 30;
139  }
140  // Contact X temps après le dernier contact ou l'inscription
141  $next_contact_time['usual'] = $contact_time_basis + $seg_contact_days_frequence * 3600 * 24;
142  }
143  // On vérifie la dernière échéance d'un abonnement type SILVER / PLATINUM / DIAMOND
144  if (!empty($user['supramembre'])) {
145  // Abonnement silver
146  // Contact prévu 7 jours avant la fin de l'abonnement
147  $next_contact_time_subscription_renewal_expected_array[] = $user['supramembre']-7 * 24 * 3600;
148  }
149  if (!empty($user['platinum_until'])) {
150  // Abonnement platinum
151  // Contact prévu 7 jours avant la fin de l'abonnement
152  $next_contact_time_subscription_renewal_expected_array[] = $user['platinum_until']-7 * 24 * 3600;
153  }
154  if (!empty($user['diamond_until'])) {
155  // Abonnement diamond
156  // Contact prévu 7 jours avant la fin de l'abonnement
157  $next_contact_time_subscription_renewal_expected_array[] = $user['diamond_until']-7 * 24 * 3600;
158  }
159  if (!empty($next_contact_time_subscription_renewal_expected_array) && max($next_contact_time_subscription_renewal_expected_array) > $contact_time_basis + 7 * 24 * 3600) {
160  // on définit la date de contact pour un renouvellement, seulement si on n'a pas contacté l'utilisateur depuis cette date ou dans la semaine précédent
161  // NB: c'est max et non pas min car les abonnements sont des variantes d'abonnement
162  $next_contact_time['renewal_expected'] = max($next_contact_time_subscription_renewal_expected_array);
163  unset($next_contact_time_subscription_renewal_expected_array);
164  }
165  if (!empty($gold_ads_renewals_timestamps) && !empty($gold_ads_renewals_timestamps[$user_id])) {
166  // On regarde si annonce GOLD à renouveler
167  foreach($gold_ads_renewals_timestamps[$user_id] as $this_timestamp) {
168  if ((empty($next_contact_time['renewal_expected']) || $this_timestamp-7 * 24 * 3600 < $next_contact_time['renewal_expected']) && $this_timestamp-7 * 24 * 3600 > $contact_time_basis + 7 * 24 * 3600) {
169  // Si l'annonce GOLD vient à expiration, on veut contacter l'auteur une semaine à l'avance
170  // mais on ne le fait que si on ne l'a pas contacté dans la semaine précédente
171  $next_contact_time['renewal_expected'] = $this_timestamp-7 * 24 * 3600;
172  break;
173  }
174  }
175  }
176  if (!empty($planified_contact_timestamps) && !empty($planified_contact_timestamps[$user_id])) {
177  // On regarde si un contact a été planifié spécifiquement pour cet utilisateur
178  foreach($planified_contact_timestamps[$user_id] as $this_timestamp) {
179  if ((empty($next_contact_time['already_planified']) || $this_timestamp < $next_contact_time['already_planified']) && $this_timestamp > $contact_time_basis) {
180  // Si l'annonce GOLD vient à expiration, on veut contacter l'auteur une semaine à l'avance
181  // mais on ne le fait que si on ne l'a pas contacté dans la semaine précédente
182  $next_contact_time['already_planified'] = $this_timestamp;
183  break;
184  }
185  }
186  }
187  }
188  if (!empty($next_contact_time)) {
189  // On trie pour avoir en premier le timestamp le plus faible
190  asort($next_contact_time);
191  // On prend la clé pour la première valeur, donc la plus faible
192  $next_contact_reason = key($next_contact_time);
193  if($next_contact_reason != 'already_planified') {
194  $next_contact_timestamp = $next_contact_time[$next_contact_reason];
195  // var_dump($user_id,$next_contact_time); echo '<br />';
196  query('INSERT INTO peel_admins_contacts_planified (`user_id`, `timestamp`, `reason`)
197  VALUES(
198  ' . intval($user['id_utilisateur']) . ',
199  "' . nohtml_real_escape_string(vb($next_contact_timestamp)) . '",
200  "' . nohtml_real_escape_string(vb($next_contact_reason)) . '")');
201  }
202  } else {
203  $next_contact_reason = '';
204  $next_contact_timestamp = 0;
205  }
206  if ($seg_followed != $user['seg_followed']) {
207  // Mise à jour des utilisateurs dont la date de contact (et/ou la raison) a/ont changé
208  query('UPDATE peel_utilisateurs
209  SET seg_followed="' . nohtml_real_escape_string($seg_followed) . '" AND ' . get_filter_site_cond('utilisateurs') . '
210  WHERE id_utilisateur=' . intval($user_id));
211  }
212  unset($next_contact_time);
213  }
214  $GLOBALS['contentMail'] .= 'MAJ des dates de contact : OK' . "\n";
215 }
216 
217 $contentMail = 'Traitement des segmentations client et des dates de contact
218 
219 ';
220 
223 
$result
updateClientsContactDates()
updateClientsContactDates()
getClientNote(&$user_infos)
Renvoie la note d'un client en fonction de l'intérêt qu'on souhaite lui porter.
nohtml_real_escape_string($value, $allowed_tags=null)
Protège les données pour insertion dans MySQL ET supprime les tags HTML pour protéger de toute sorte ...
Definition: database.php:400
real_escape_string($value)
real_escape_string()
Definition: database.php:374
get_filter_site_cond($table_technical_code, $table_alias=null, $use_strict_rights_if_in_admin=false, $specific_site_id=null, $exclude_public_items=false, $admin_force_multisite_if_allowed=false)
Retourne la condition SQL permettant de filtrer les données pour une table.
Definition: fonctions.php:4643
query($query, $die_if_error=false, $database_object=null, $silent_if_error=false, $security_sql_filter=true)
The query() function is meant to be called anywhere you want to make a query.
Definition: database.php:158
vb(&$var, $default=null)
Variable blanche if $var n'est pas défini, retourne $default, sinon retourne $var.
Definition: format.php:97
updateClientsSegBuy()
updateClientsSegBuy()
if(strlen($date2)== '10') if($type== 'users-by-age'&&a_priv('admin_users', true)) elseif($type== 'forums-count'&&a_priv('admin_content', true)) elseif($type== 'forums-categories'&&a_priv('admin_content', true)) elseif($type== 'users-count'&&a_priv('admin_users', true)) elseif($type== 'product-categories'&&a_priv('admin_products', true)) elseif($type== 'users-by-sex'&&a_priv('admin_users', true)) elseif($type== 'users-by-country'&&a_priv('admin_users', true)) elseif($type== 'sales'&&a_priv('admin_sales', true))
Definition: chart-data.php:160
fetch_assoc($query_result)
fetch_assoc()
Definition: database.php:283
$GLOBALS['page_columns_count']
check_if_module_active($module_name, $specific_file_name=null)
Renvoie si un module est présent et activé ou non - Peut être appelé avant ou après le chargement d'u...

This documentation for Open ecommerce PEEL Shopping and PEEL.fr has been generated by Doxygen on Thu Oct 15 2015 14:41:27 - Peel ecommerce is a product of Agence web Advisto SAS. All rights reserved.