Try harder to avoid duplicate order state IDs.
[readifood.git] / lib / report.php
index f06e8ca..c58864d 100644 (file)
     $q->withColumn('count(*)', 'count');
     $q->addGroupByColumn('week')->orderByUpdated();
     $rows = $q->find();
+    $year_offset = 0;
     $week_offset = 0;
     $week = 1;
     $last_week = 0;
     $total = 0;
     echo "<table class=\"report\">\n";
     foreach ($rows as $row) {
-      /* Convert week of year to date range. */
-      if (! $week_offset) $week_offset = $row->getWeek() - 1;
-      else $week = $row->getWeek() - $week_offset;
+      /*
+        Convert week of year to date range.
+        Beware that week 201401 comes after 201352.
+      */
+      $yearweek = $row->getWeek();
+      if (! $week_offset) {
+        $year_offset = substr($yearweek, 0, 4);
+        $week_offset = substr($yearweek, 4, 2) - 1;
+      }
+      else {
+        $y = substr($yearweek, 0, 4);
+        $w = substr($yearweek, 4, 2);
+        $week = (($y - $year_offset) * 52) + ($w - $week_offset);
+      }
       $total += $row->getCount();
       /* Fill in missing weeks. XXX */
       for ($missing_week = $last_week + 1; $missing_week < $week; $missing_week++) {
     $sth = $dbh->prepare("select * from OrderState o where updated=(select min(updated) from OrderState where order_id=o.order_id and state & " . $GLOBALS['STATE_DELIVERED'] . ") and updated between '$from' and '$to'");
     $sth->execute();
     $order_states = OrderStatePeer::populateObjects($sth);
+    $dups = array();
     foreach ($order_states as $order_state) {
-      $order_ids[] = $order_state->getOrderId();
-      $order_state_ids[] = $order_state->getId();
+      $order_id = $order_state->getOrderId();
+      $order_ids[] = $order_id;
+      if (! $dups[$order_id]) $order_state_ids[] = $order_state->getId();
+      $dups[$order_id] = true;
     }
     $q = new OrderQuery;
     $q->filterById($order_ids);