Rename ax_mail flag to dn_best_mail for profile addresses
authorNicolas Iooss <nicolas.iooss_git@polytechnique.org>
Mon, 17 Feb 2014 20:58:38 +0000 (21:58 +0100)
committerNicolas Iooss <nicolas.iooss_git@polytechnique.org>
Mon, 17 Feb 2014 22:16:13 +0000 (23:16 +0100)
The name "ax_mail" is ambiguous with the visibility level "ax". In fact this
is only used to speed up the advanced search when an administrator exports a
list of addresses to prepare a mailing.

Therefore this denormalized flag is renamed "dn_best_mail", which is the best
known address to send mail.

This commit adds a comment in classes/address.php to describe how this best
address is chosen.

classes/address.php
classes/userfilter/conditions.inc.php
include/ufbuilder.inc.php
include/userset.inc.php
templates/search/adv.form.tpl
upgrade/1.1.12/04_profile_addresses_rename_ax-mail_to_dn-best-mail.sql [new file with mode: 0644]

index 0b3ae04..b3e9da9 100644 (file)
@@ -728,31 +728,44 @@ class Address
             }
 
             if ($this->pid != 0) {
-                $this->updateAxMail();
+                $this->updateBestMail();
             }
         }
     }
 
-    private function updateAxMail()
+    /**
+     * Upate the denormalized flag which is used to mark the best mail to use
+     * when sending postal mail
+     */
+    private function updateBestMail()
     {
         XDB::execute("UPDATE  profile_addresses
-                         SET  flags = REPLACE(flags, 'ax_mail', '')
+                         SET  flags = REPLACE(flags, 'dn_best_mail', '')
                        WHERE  pid = {?}",
                      $this->pid);
 
-        $ax_mail = XDB::fetchOneAssoc("SELECT  pid, jobid, groupid, type, id
+        /* Following order is selected to find the best mail:
+         *  * Use addresses without the deliveryIssue flag if possible.
+         *  * Among these, use addresses flagged as "current".
+         *  * If there is no such addresses or several ones, prefer those
+         *    without "secondary" flag.
+         *  * If there are still several addresses in the selection, try not
+         *    to select the ones with "job" type.
+         */
+        $best_mail = XDB::fetchOneAssoc("SELECT  pid, jobid, groupid, type, id
                                          FROM  profile_addresses
-                                        WHERE  pub IN ('public', 'ax') AND FIND_IN_SET('mail', flags) AND pid = {?}
+                                        WHERE  FIND_IN_SET('mail', flags) AND pid = {?}
                                      ORDER BY  FIND_IN_SET('deliveryIssue', flags),
                                                NOT FIND_IN_SET('current', flags),
-                                               FIND_IN_SET('secondary', flags), type = 'job'",
+                                               FIND_IN_SET('secondary', flags), type = 'job'
+                                        LIMIT  1",
                                       $this->pid);
 
-        if ($ax_mail) {
+        if ($best_mail) {
             XDB::execute("UPDATE  profile_addresses
-                             SET  flags = CONCAT(flags, ',ax_mail')
+                             SET  flags = CONCAT(flags, ',dn_best_mail')
                            WHERE  pid = {?} AND jobid = {?} AND groupid = {?} AND type = {?} AND id = {?}",
-                         $ax_mail['pid'], $ax_mail['jobid'], $ax_mail['groupid'], $ax_mail['type'], $ax_mail['id']);
+                         $best_mail['pid'], $best_mail['jobid'], $best_mail['groupid'], $best_mail['type'], $best_mail['id']);
         }
     }
 
index f3bf5db..150e97e 100644 (file)
@@ -1028,26 +1028,27 @@ abstract class UFC_Address extends UserFilterCondition
 
     /** Flags for addresses
      */
-    const FLAG_NONE    = 0x0000;
-    const FLAG_CURRENT = 0x0001;
-    const FLAG_TEMP    = 0x0002;
-    const FLAG_SECOND  = 0x0004;
-    const FLAG_MAIL    = 0x0008;
-    const FLAG_CEDEX   = 0x0010;
-    const FLAG_AX_MAIL = 0x0020;
+    const FLAG_NONE      = 0x0000;
+    const FLAG_CURRENT   = 0x0001;
+    const FLAG_TEMP      = 0x0002;
+    const FLAG_SECOND    = 0x0004;
+    const FLAG_MAIL      = 0x0008;
+    const FLAG_CEDEX     = 0x0010;
+    const FLAG_BEST_MAIL = 0x0020;
 
     // Binary OR of those flags
     const FLAG_ANY     = 0x003F;
 
     /** Text of these flags
+     *  "Best mail" is a denormalized flag, hence the dn_ prefix
      */
     protected static $flagtexts = array(
-        self::FLAG_CURRENT => 'current',
-        self::FLAG_TEMP    => 'temporary',
-        self::FLAG_SECOND  => 'secondary',
-        self::FLAG_MAIL    => 'mail',
-        self::FLAG_CEDEX   => 'cedex',
-        self::FLAG_AX_MAIL => 'ax_mail',
+        self::FLAG_CURRENT   => 'current',
+        self::FLAG_TEMP      => 'temporary',
+        self::FLAG_SECOND    => 'secondary',
+        self::FLAG_MAIL      => 'mail',
+        self::FLAG_CEDEX     => 'cedex',
+        self::FLAG_BEST_MAIL => 'dn_best_mail',
     );
 
     protected $flags;
index 361a66a..9cb95cf 100644 (file)
@@ -1071,13 +1071,13 @@ class UFBF_Dead extends UFBF_Enum
 class UFBF_AddressMixed extends UFBF_Mixed
 {
     protected $onlycurrentfield;
-    protected $onlyaxmailfield;
+    protected $onlybestmailfield;
 
-    public function __construct($envfieldtext, $envfieldindex, $formtext = '', $addressfield, $onlycurrentfield = 'only_current', $onlyaxmailfield = 'only_ax_mail')
+    public function __construct($envfieldtext, $envfieldindex, $formtext = '', $addressfield, $onlycurrentfield = 'only_current', $onlybestmailfield = 'only_best_mail')
     {
         parent::__construct($envfieldtext, $envfieldindex, $formtext);
         $this->onlycurrentfield = $onlycurrentfield;
-        $this->onlyaxmailfield = $onlyaxmailfield;
+        $this->onlybestmailfield = $onlybestmailfield;
         $this->direnum = constant('DirEnum::' . $addressfield);
     }
 
@@ -1087,8 +1087,8 @@ class UFBF_AddressMixed extends UFBF_Mixed
         if ($ufb->isOn($this->onlycurrentfield)) {
             $flags |= UFC_Address::FLAG_CURRENT;
         }
-        if ($ufb->isOn($this->onlyaxmailfield)) {
-            $flags |= UFC_Address::FLAG_AX_MAIL;
+        if ($ufb->isOn($this->onlybestmailfield)) {
+            $flags |= UFC_Address::FLAG_BEST_MAIL;
         }
         if ($flags == UFC_Address::FLAG_NONE) {
             $flags = UFC_Address::FLAG_ANY;
@@ -1099,7 +1099,7 @@ class UFBF_AddressMixed extends UFBF_Mixed
 
     public function getEnvFieldNames()
     {
-        return array($this->envfield, $this->envfieldindex, $this->onlycurrentfield, $this->onlyaxmailfield);
+        return array($this->envfield, $this->envfieldindex, $this->onlycurrentfield, $this->onlybestmailfield);
     }
 }
 // }}}
@@ -1109,13 +1109,13 @@ class UFBF_AddressIndex extends UFBF_Index
 {
     protected $direnum;
     protected $onlycurrentfield;
-    protected $onlyaxmailfield;
+    protected $onlybestmailfield;
 
-    public function __construct($envfield, $formtext = '', $addressfield, $onlycurrentfield = 'only_current', $onlyaxmailfield = 'only_ax_mail')
+    public function __construct($envfield, $formtext = '', $addressfield, $onlycurrentfield = 'only_current', $onlybestmailfield = 'only_best_mail')
     {
         parent::__construct($envfield, $formtext);
         $this->onlycurrentfield = $onlycurrentfield;
-        $this->onlyaxmailfield = $onlyaxmailfield;
+        $this->onlybestmailfield = $onlybestmailfield;
         $this->direnum = constant('DirEnum::' . $addressfield);
     }
 
@@ -1126,8 +1126,8 @@ class UFBF_AddressIndex extends UFBF_Index
         if ($ufb->isOn($this->onlycurrentfield)) {
             $flags |= UFC_Address::FLAG_CURRENT;
         }
-        if ($ufb->isOn($this->onlyaxmailfield)) {
-            $flags |= UFC_Address::FLAG_AX_MAIL;
+        if ($ufb->isOn($this->onlybestmailfield)) {
+            $flags |= UFC_Address::FLAG_BEST_MAIL;
         }
         if ($flags == UFC_Address::FLAG_NONE) {
             $flags = UFC_Address::FLAG_ANY;
@@ -1138,7 +1138,7 @@ class UFBF_AddressIndex extends UFBF_Index
 
     public function getEnvFieldNames()
     {
-        return array($this->envfield, $this->onlycurrentfield, $this->onlyaxmailfield);
+        return array($this->envfield, $this->onlycurrentfield, $this->onlybestmailfield);
     }
 }
 // }}}
index d7d5542..67d8aab 100644 (file)
@@ -486,7 +486,7 @@ class AddressesView implements PlView
                             LEFT JOIN  profile_job          AS pj   ON (pj.pid = pa.pid
                                                                         AND pj.id = IF(pa.type = 'job', pa.id, NULL))
                             LEFT JOIN  profile_job_enum     AS pje  ON (pj.jobid = pje.id)
-                                WHERE  pa.pid IN {?} AND FIND_IN_SET('ax_mail', pa.flags)", $pids);
+                                WHERE  pa.pid IN {?} AND FIND_IN_SET('dn_best_mail', pa.flags)", $pids);
             foreach ($res->fetchAllRow() as $item) {
                 list($axid, $promo, $title, $lastname, $firstname, $company, $full_address, $zipcode, $email, $delivery_issue) = array_map('utf8_decode', $item);
                 $lines = self::split_address($full_address);
index f681e41..f12a6e3 100644 (file)
     {if hasPerm('admin,edit_directory')}
     <tr>
       <td colspan="2">
-        <label for="only_ax_mail">
-          <input name="only_ax_mail" id="only_ax_mail" type="checkbox"{if $smarty.request.only_ax_mail} checked="checked"{/if}/>
-          Chercher uniquement parmi les adresses postales de l'AX.
+        <label for="only_best_mail">
+          <input name="only_best_mail" id="only_best_mail" type="checkbox"{if $smarty.request.only_best_mail} checked="checked"{/if}/>
+          Chercher uniquement parmi les adresses postales utilisées lors de l'envoi de courrier.
         </label>
       </td>
     </tr>
diff --git a/upgrade/1.1.12/04_profile_addresses_rename_ax-mail_to_dn-best-mail.sql b/upgrade/1.1.12/04_profile_addresses_rename_ax-mail_to_dn-best-mail.sql
new file mode 100644 (file)
index 0000000..4ac5683
--- /dev/null
@@ -0,0 +1,9 @@
+-- Rename ax_mail flag to dn_best_mail
+
+ALTER TABLE profile_addresses MODIFY COLUMN flags SET('current', 'temporary', 'secondary', 'mail', 'cedex', 'deliveryIssue', 'ax_mail', 'dn_best_mail') DEFAULT NULL;
+
+UPDATE profile_addresses SET flags=REPLACE(flags, 'ax_mail', 'dn_best_mail') WHERE FIND_IN_SET('ax_mail', flags);
+
+ALTER TABLE profile_addresses MODIFY COLUMN flags SET('current', 'temporary', 'secondary', 'mail', 'cedex', 'deliveryIssue', 'dn_best_mail') DEFAULT NULL;
+
+-- vim:set syntax=mysql: