Handles canceled payment transactions.
[platal.git] / bin / cron / emails.check.php
index d930338..426a2d6 100755 (executable)
@@ -1,7 +1,7 @@
 #!/usr/bin/php5 -q
 <?php
 /***************************************************************************
- *  Copyright (C) 2003-2008 Polytechnique.org                              *
+ *  Copyright (C) 2003-2014 Polytechnique.org                              *
  *  http://opensource.polytechnique.org/                                   *
  *                                                                         *
  *  This program is free software; you can redistribute it and/or modify   *
  */
 $panne_level = 3;
 
-require('./connect.db.inc.php');
+require './connect.db.inc.php';
+require 'Console/Getopt.php';
+
+/*
+ * Parse the command-line options.
+ */
+$opts = Console_GetOpt::getopt($argv, 'v');
+$opt_verbose = false;
+
+if (PEAR::isError($opts)) {
+    echo $opts->getMessage();
+} else {
+    $opts = $opts[0];
+    foreach ($opts as $opt) {
+        if ($opt[0] == 'v') {
+            $opt_verbose = true;
+        }
+    }
+}
 
 /*
  * Check duplicated addresses
  */
-$sql = "SELECT a1.alias, a2.alias, e1.email
-          FROM emails        AS e1
-    INNER JOIN emails        AS e2 ON (e1.email = e2.email AND e1.uid != e2.uid
-                                       AND (e1.uid < e2.uid OR NOT FIND_IN_SET('active', e2.flags)))
-     LEFT JOIN emails_watch  AS w  ON (e1.email = w.email)
-    INNER JOIN aliases       AS a1 ON (a1.id = e1.uid AND a1.type = 'a_vie')
-    INNER JOIN aliases       AS a2 ON (a2.id = e2.uid AND a2.type = 'a_vie')
-    INNER JOIN auth_user_md5 AS u1 ON (a1.id = u1.user_id)
-    INNER JOIN auth_user_md5 AS u2 ON (a2.id = u2.user_id)
-         WHERE FIND_IN_SET('active', e1.flags) AND u1.nom != u2.nom_usage AND u2.nom != u1.nom_usage AND w.email IS NULL
-      ORDER BY a1.alias";
-
-$it = Xdb::iterRow($sql);
+$it = Xdb::iterRow("SELECT  s1.email, s2.email, r1.redirect
+                      FROM  email_redirect_account AS r1
+                INNER JOIN  email_redirect_account AS r2 ON (r1.redirect = r2.redirect AND r1.uid != r2.uid)
+                INNER JOIN  email_source_account   AS s1 ON (s1.uid = r1.uid AND s1.type = 'forlife')
+                INNER JOIN  email_source_account   AS s2 ON (s2.uid = r2.uid AND s2.type = 'forlife')
+                 LEFT JOIN  email_watch            AS w  ON (r1.redirect = w.email)
+                     WHERE  w.email IS NULL
+                  GROUP BY  r1.redirect
+                  ORDER BY  r1.redirect, s1.email");
 
 $insert   = array();
 $conflits = array();
@@ -56,8 +70,8 @@ if (count($conflits) > 0) {
         . "https://www.polytechnique.org/admin/emails/duplicated";
 
     echo "\n\n";
-    $sql = "INSERT IGNORE INTO emails_watch (email, state, detection, last)
-                        VALUES " . join(", ", $insert);
+    $sql = "INSERT IGNORE INTO  email_watch (email, state, detection, last)
+                        VALUES  " . join(", ", $insert);
     XDB::execute($sql);
     if (XDB::errno() != 0) {
         echo 'Error : ' . XDB::error() . "\n$sql";
@@ -68,30 +82,62 @@ if (count($conflits) > 0) {
  * Check dead emails
  */
 if ($panne_level > 0) {
-    $sql = "SELECT  e.email, u.hruid
-              FROM  emails  AS e
-        INNER JOIN  auth_user_md5 AS u ON u.user_id = e.uid
-             WHERE  e.panne_level = $panne_level AND e.flags = 'active'
-          ORDER BY  u.hruid";
-    $res = Xdb::query($sql);
-
-    if ($res->numRows()) {
-        $result = $res->fetchAllAssoc();
+    $res = XDB::fetchAllAssoc("SELECT  r.redirect, a.hruid
+                                 FROM  email_redirect_account AS r
+                           INNER JOIN  accounts               AS a ON (a.uid = r.uid)
+                                WHERE  r.broken_level = {?} AND r.flags != 'broken'
+                             ORDER BY  a.hruid",
+                              $panne_level);
+
+    if ($res) {
         echo "Nouvelles adresses en panne detectees :\n";
-        foreach ($result as $assoc) {
-            echo '* ' . $assoc['email'] . ' pour ' . $assoc['hruid'] . "\n";
+        foreach ($res as $assoc) {
+            echo '* ' . $assoc['redirect'] . ' pour ' . $assoc['hruid'] . "\n";
         }
         echo "\n\n";
 
-        Xdb::execute("UPDATE  emails
-                         SET  flags = 'panne'
-                       WHERE  panne_level = 3 AND flags = 'active'");
+        Xdb::execute("UPDATE  email_redirect_account
+                         SET  flags = 'broken'
+                       WHERE  broken_level = 3");
     }
 
-    Xdb::execute("UPDATE  emails
-                     SET  panne_level = $panne_level
-                   WHERE  panne_level > $panne_level");
+    Xdb::execute('UPDATE  email_redirect_account
+                     SET  broken_level = {?}
+                   WHERE  broken_level > {?}',
+                 $panne_level, $panne_level);
 }
 
-// vim:set et sw=4 sts=4 sws=4 foldmethod=marker enc=utf-8:
+/*
+ * Retrieve the users with no active redirection, but still one working
+ * inactive redirection.
+ */
+if ($opt_verbose) {
+    $res = XDB::fetchAllAssoc("SELECT  a.hruid, r2.redirect
+                                 FROM  accounts               AS a
+                            LEFT JOIN  email_redirect_account AS r1 ON (a.uid = r1.uid AND r1.flags = 'active')
+                           INNER JOIN  email_redirect_account AS r2 ON (a.uid = r2.uid AND r2.flags = 'inactive'
+                                                                        AND r2.type != 'imap' AND r2.type != 'homonym')
+                                WHERE  r1.uid IS NULL
+                             GROUP BY  a.uid");
+
+    if ($res) {
+        echo "Camarades n'ayant plus d'adresses actives, mais ayant une adresse inactive :\n";
+        foreach ($res as $user) {
+            echo '* ' . $user['redirect'] . ' pour ' . $user['hruid'] . "\n";
+        }
+    }
+    echo "\n";
+}
+
+/*
+ * Updates imap settings for users with no active redirection. Their emails
+ * must go to imap and bounce.
+ */
+XDB::execute("UPDATE  email_redirect_account AS r
+           LEFT JOIN  email_redirect_account AS a ON (r.uid = a.uid AND a.flags = 'active' AND a.type != 'imap')
+                 SET  r.action = 'imap_and_bounce'
+               WHERE  r.type = 'imap' AND a.redirect IS NULL");
+
+
+// vim:set et sw=4 sts=4 sws=4 foldmethod=marker fenc=utf-8:
 ?>