Tidy up forms.
[readifood.git] / lib / order.php
index 40b645d..38a235a 100644 (file)
 
   function show_orders($offset, $per_page, $requester_ids = null, $beneficiary_ids = null, $state_mask = null) {
     /* XXX: Use Propel methods. */
-    if (isset($state_mask)) {
-      $order_ids = array();
-      $dbh = Propel::getConnection();
-      $sth = $dbh->prepare("select * from OrderState o where updated=(select max(updated) from OrderState where order_id=o.order_id) and state & $state_mask");
-      $sth->execute();
-      $order_states = OrderStatePeer::populateObjects($sth);
-      foreach ($order_states as $order_state) $order_ids[] = $order_state->getOrderId();
-    }
+    if (isset($state_mask)) $order_ids = get_order_ids_by_state($state_mask);
     $q = new OrderQuery;
     if (isset($requester_ids)) $q->filterByRequesterId($requester_ids);
     if (isset($beneficiary_ids)) $q->filterByBeneficiaryId($beneficiary_ids);
     $orders = $q->orderByDate()->find();
     if (count($orders)) {
       foreach ($orders as $order) {
-        echo "<br>\nOrder " . $order->getStrongLink($order->getId()) . ": " . get_order_displayname($order);
-        if (check_admin(1)) {
-          echo " " . $order->getDeleteLink();
-        }
-
-        /* XXX: Should pull from query. */
-        $q = new ContactQuery;
-        $contact = $q->findOneById($order->getBeneficiaryId());
-        if ($contact) {
-          echo " for " . $contact->getLink();
-          $area = get_contact_area($contact);
-          if ($area) echo " in " . $area->getLink();
-        }
-
-        if ($order->getHubId()) {
-          $q = new HubQuery;
-          $hub = $q->findOneById($order->getHubId());
-          if ($hub) echo " to hub " . $hub->getLink();
-          $area = get_hub_area($hub);
-          if ($area) echo " in " . $area->getLink();
-        }
+        echo "<br>\n" . get_order_summary($order) . "<br>\n";
       }
     }
     else echo " none";
   }
 
   function show_order_forms($city_id, $state_mask) {
-    echo "<form method=\"POST\" action=\"" . $_SERVER['REQUEST_URI'] . "\">\n";
+    form("noprint standout");
     show_order_state_form($state_mask);
     show_order_areas_form($city_id);
     show_order_cities_form($city_id);
-    echo "</form>\n";
+    end_form();
   }
 
   function show_order_form($order = null, $area_id = null) {
-    global $states;
+    global $states, $parcel_sizes, $parcel_contents;
 
     if ($order) {
       $q = new OrderStateQuery;
       $order_state = $q->filterByOrderId($order->getId())->orderByUpdated('desc')->limit(1)->findOne();
-      if ($order_state) $state = $order_state->getState();
+      if ($order_state) {
+        $state = $order_state->getState();
+        $driver_id = $order_state->getDriverId();
+      }
     }
     else $order = new Order;
 
     echo "<tr>\n";
     echo "  <td>Delivery</td>\n";
     /* XXX: Find suitable dates from area. */
-    echo "  <td>"; show_date_form("date", $order->getDate()); echo "</td>\n";
+    echo "  <td>";
+    show_date_form("date", $order->getDate());
+    if (! $order->getDate()) {
+      echo " and recur for <select name=\"recurrence\">\n";
+      for ($i = 0; $i < 4; $i++) option("recurrence", $i, $i);
+      echo "</select> weeks";
+    }
+    echo "</td>\n";
     echo "</tr>\n";
 
     /* Referrer. */
     echo "  <td>Beneficiary</td>\n";
     echo "  <td><select name=\"beneficiary_id\">\n";
     option("beneficiary_id", null, "");
-    $contacts = get_area_beneficiaries($area_id);
-    foreach ($contacts as $contact) {
-      option("beneficiary_id", $contact->getId(), $contact->getDisplayname(), $order->getBeneficiaryId());
+    if (! $order->getId() && $order->getBeneficiaryId()) {
+      $contact = get_contact_by_id($order->getBeneficiaryId());
+      if ($contact) option("beneficiary_id", $order->getBeneficiaryId(), $contact->getDisplayname(), $order->getBeneficiaryId());
+    }
+    else {
+      $contacts = get_area_beneficiaries($area_id);
+      foreach ($contacts as $contact) {
+        option("beneficiary_id", $contact->getId(), $contact->getDisplayname(), $order->getBeneficiaryId());
+      }
     }
     echo "</select></td>\n";
     echo "</tr>\n";
     echo "</select></td>\n";
     echo "</tr>\n";
 
-    /* Quantity. */
+    /* Parcel type. */
+    echo "<tr>\n";
+    echo "  <td>Parcel size</td>\n";
+    echo "  <td><select name=\"parcel_size\">\n";
+    $mask = 1 << count($parcel_sizes);
+    for ($i = 0; $i < count($parcel_sizes); $i++) {
+      option("parcel_size", 1 << $i, $parcel_sizes[$i], $order->getParcel() % $mask);
+    }
+    echo "</select></td>\n";
+    echo "</tr>\n";
+
+    /* Parcel contents. */
     echo "<tr>\n";
-    echo "  <td>Quantity (kg)</td>\n";
-    echo "  <td>"; input("quantity", $order->getQuantity()); echo "</td>\n";
+    echo "  <td>Parcel contents</td>\n";
+    echo "  <td>";
+    for ($i = count($parcel_sizes); $i < count($parcel_contents); $i++) {
+      echo "  <input type=\"checkbox\" name=\"parcel_$i\"";
+      if ($order->getParcel() & (1 << $i)) echo " checked";
+      echo ">$parcel_contents[$i]\n";
+    }
+    echo "</td>\n";
     echo "</tr>\n";
 
     /* Driver. */
       return;
     }
 
-    echo "<form method=\"POST\" action=\"" . $_SERVER['REQUEST_URI'] . "\">\n";
+    form("noprint");
     echo "<p>Place an order:</p>\n";
 
     echo "<table>\n";
     echo "  <td colspan=2>"; submit("add_order", "Order"); echo "</td></tr>\n";
     echo "</tr>\n";
     echo "</table>\n";
-    echo "</form>\n";
+    end_form();
+  }
+
+  function show_contact_order_form($contact) {
+    if (! check_admin(1)) return;
+
+    $area = get_contact_area($contact);
+    if (! $area) {
+      echo "<p>No valid <a href=\"/area\">area</a> for contact!</p>\n";
+      return;
+    }
+
+    $order = new Order;
+    $order->setBeneficiaryId($contact->getId());
+
+    form("standout");
+    echo "<p>Placing order for " . $contact->getStrongLink() . ".";
+    $parcel = $contact->getParcel();
+    if ($parcel) {
+      echo "  Suggested parcel type is <span class=\"strong\">" .  get_contact_parcel_string($contact) . "</span>";
+      $order->setParcel($parcel);
+    }
+    echo "</p>\n";
+
+    echo "<table>\n";
+    show_order_form($order, $area_id);
+
+    echo "<tr>\n";
+    echo "  <td colspan=2>"; submit("add_order", "Order"); echo "</td></tr>\n";
+    echo "</tr>\n";
+    echo "</table>\n";
+    end_form();
   }
 
   function show_add_new_order_form() {
       return;
     }
 
-    echo "<form method=\"POST\" action=\"" . $_SERVER['REQUEST_URI'] . "\">\n";
+    form("noprint standout");
     echo "<p>Place an order in <select name=\"area_id\">\n";
     foreach ($areas as $area) {
       option("area_id", $area->getId(), get_area_displayname($area));
     echo "</select>";
     submit("show_add_order", "Proceed");
     echo "</p>\n";
-    echo "</form>\n";
+    end_form();
   }
 
   function update_order(&$order, $new = false) {
-    global $user_id;
+    global $user_id, $parcel_sizes, $parcel_contents;
 
     #$date = ymd_to_iso8601("date");
     $date = $_POST['date'];
     $requester_id = $_POST['requester_id'];
     $beneficiary_id = $_POST['beneficiary_id'];
     $hub_id = $_POST['hub_id'];
-    $quantity = $_POST['quantity'];
     $driver_id = $_POST['driver_id'];
+    if (! $driver_id) $driver_id = null;
     $state = $_POST['state'];
     if (! $state) $state = $GLOBALS['STATE_PLACED'];
+    $parcel = $_POST['parcel_size'];
+    for ($i = count($parcel_sizes); $i < count($parcel_contents); $i++) {
+      if ($_POST['parcel_' . $i] == "on") $parcel |= (1 << $i);
+    }
 
-    if (! $date) $date = time();
+    if ($date) {
+      list($y, $m, $d) = explode('-', $date);
+      $then = mktime(0, 0, 0, $m, $d, $y);
+    }
+    else $then = time();
     /* XXX: check date */
 
     $requester = get_contact_by_id($requester_id);
         return false;
       }
     }
+    else $hub_id = null;
 
-    if (! is_numeric($quantity)) {
-      echo "<p>Invalid quantity!</p>\n";
-      return false;
-    }
+    if ($new && isset($_POST['recurrence'])) $recurrence = $_POST['recurrence'];
+    if (! $recurrence) $recurrence = 0;
 
-    $order->setDate($date);
-    $order->setRequesterId($requester_id);
-    $order->setBeneficiaryId($beneficiary_id);
-    $order->setHubId($hub_id);
-    $order->setQuantity($quantity);
+    $now = time();
+    for ($i = 0; $i <= $recurrence; $i++) {
+      if ($i) {
+        echo "<p>Creating recurrence $i.</p>\n";
+        $order = new Order;
+      }
 
-    try {
-      $order->save();
+      $order->setDate($then + 7 * 86400 * $i);
+      $order->setRequesterId($requester_id);
+      $order->setBeneficiaryId($beneficiary_id);
+      $order->setHubId($hub_id);
+      $order->setParcel($parcel);
 
-      $order_state = new OrderState;
-      $order_state->setUpdated(time());
-      $order_state->setOrderId($order->getId());
-      $order_state->setUserId($user_id);
-      $order_state->setDriverId($driver_id);
-      $order_state->setState($state);
+      /* XXX: begin/commit */
+      try {
+        $order->save();
 
-      $order_state->save();
-    }
-    catch (Exception $e) {
-      if ($new) echo "<p>Error placing order.</p>\n";
-      else echo "<p>Error updating order.</p>\n";
-      return false;
+        $order_state = new OrderState;
+        $order_state->setUpdated($now);
+        $order_state->setOrderId($order->getId());
+        $order_state->setUserId($user_id);
+        $order_state->setDriverId($driver_id);
+        $order_state->setState($state);
+
+        $order_state->save();
+      }
+      catch (Exception $e) {
+        if ($new) echo "<p>Error placing order.</p>\n";
+        else echo "<p>Error updating order.</p>\n";
+        echo "<p>" . $e->getMessage() . "</p>\n";
+        return false;
+      }
     }
 
     return true;
 
       $driver_id = $order_state->getDriverId();
       if ($driver_id) $driver = get_contact_by_id($driver_id);
+      else $driver = null;
 
       /* XXX */
       $state = $order_state->getState();
     if (isset($id)) $order = get_order_by_id($id);
     if (! $order) return;
 
-    echo "<form method=\"POST\" action=\"" . $_SERVER['REQUEST_URI'] . "\">\n";
+    form();
     echo "<p>Order: <span class=\"strong\">" . $order->getId() . "</span>";
     if (check_admin(1)) {
       echo " " . $order->getDeleteLink();
     }
 
     echo "</table>\n";
-    echo "</form>\n";
+    end_form();
 
     show_order_history($order->getId());
   }
         break;
       }
     }
+    else if ($parameters[0] == "place") {
+      if ($parameters[1] == "for") {
+        if ($parameters[2] == "beneficiary") {
+          if ($parameters[4]) $contact = get_contact_by_id($parameters[4]);
+          if (! $contact) $contact = get_contact_by_name(urldecode($parameters[3]));
+          if ($contact) show_contact_order_form($contact);
+        }
+      }
+    }
   }
   list($ignored, $id, $args) = parse_parameters($parameters);
   //echo "<p>$name($id) " . print_r($args, true) . "</p>\n";
   }
   else if (isset($id)) show_order($id);
   else if ($state_mask) show_orders(0, 10, null, null, $state_mask);
-  else {
-    /* XXX: Shown after adding. */
-    show_order_forms($city_id, $state_mask);
-    show_add_new_order_form($city_id);
-  }
 
-  if (count($parameters)) {
-    show_order_forms($city_id, $state_mask);
-  }
+  show_order_forms($city_id, $state_mask);
+  show_add_new_order_form($city_id);
 
 
 ?>