3 if (isset($_POST['show_add_order'])) {
4 $area_id = $_POST['area_id'];
5 show_new_order_form($area_id);
7 else if (isset($_POST['add_order'])) {
10 echo "<p>Order placed.</p>\n";
11 $parameters = array("id", $id);
14 else if (isset($_POST['update_order'])) {
15 list($ignored, $id, $args) = parse_parameters($parameters);
17 $order = $q->findOneById($id);
19 if (update_order($order) !== false) {
20 echo "<p>Updated order.</p>\n";
21 $parameters = array("id", $order->getId());
25 echo "<p>No such contact!</p>\n";
28 else if ($_POST['show_in_area']) {
30 $area = $q->findOneById($_POST['area_id']);
31 header(sprintf("Location: http%s://%s/%s/in/area/%s/%d%s", ($_SERVER['HTTPS']) ? "s" : "", $_SERVER['HTTP_HOST'], $module, urlencode($area->getName()), $_POST['area_id'], get_order_state_uri(get_order_state_mask())));
34 else if ($_POST['show_in_city']) {
36 $city = $q->findOneById($_POST['city_id']);
37 header(sprintf("Location: http%s://%s/%s/in/city/%s/%d%s", ($_SERVER['HTTPS']) ? "s" : "", $_SERVER['HTTP_HOST'], $module, urlencode($city->getName()), $_POST['city_id'], get_order_state_uri(get_order_state_mask())));
41 function show_orders($offset, $per_page, $requester_ids = null, $beneficiary_ids = null, $state_mask = null) {
42 /* XXX: Use Propel methods. */
43 if (isset($state_mask)) {
45 $dbh = Propel::getConnection();
46 $sth = $dbh->prepare("select * from OrderState o where updated=(select max(updated) from OrderState where order_id=o.order_id) and state & $state_mask");
48 $order_states = OrderStatePeer::populateObjects($sth);
49 foreach ($order_states as $order_state) $order_ids[] = $order_state->getOrderId();
52 if (isset($requester_ids)) $q->filterByRequesterId($requester_ids);
53 if (isset($beneficiary_ids)) $q->filterByBeneficiaryId($beneficiary_ids);
55 #if (isset($state_mask)) $q->useOrderStateQuery()->addSelectQuery($latest_state, 'latestState')->where("order_id=latestState.order_id")->where("state & $state_mask")->endUse();
56 if (isset($state_mask)) $q->filterById($order_ids);
57 $orders = $q->orderByDate()->find();
59 foreach ($orders as $order) {
60 echo "<br>\nOrder " . $order->getStrongLink($order->getId()) . ": " . get_order_displayname($order);
62 echo " " . $order->getDeleteLink();
65 /* XXX: Should pull from query. */
66 $q = new ContactQuery;
67 $contact = $q->findOneById($order->getBeneficiaryId());
69 echo " for " . $contact->getLink();
70 $area = get_contact_area($contact);
71 if ($area) echo " in " . $area->getLink();
74 if ($order->getHubId()) {
76 $hub = $q->findOneById($order->getHubId());
77 if ($hub) echo " to hub " . $hub->getLink();
78 $area = get_hub_area($hub);
79 if ($area) echo " in " . $area->getLink();
86 function show_city_orders($offset, $per_page, $city_name, $city_id = null, $state_mask = null) {
87 if (isset($city_id)) $city = get_city_by_id($city_id);
88 else if ($city_name) $city = get_city_by_name($city_name);
90 $contacts = get_city_contacts($city->getId(), $GLOBALS['ROLE_BENEFICIARY']);
91 $beneficiary_ids = array();
92 foreach ($contacts as $contact) $beneficiary_ids[] = $contact->getId();
94 echo "<p>Orders in city " . $city->getLink(get_city_displayname($city)) . ":";
95 return show_orders($offset, $per_page, null, $beneficiary_ids, $state_mask);
97 else echo "<p>No such city!</p>\n";
100 function show_requester_orders($offset, $per_page, $contact_name, $contact_id = null, $state_mask = null) {
101 if (isset($contact_id)) $contact = get_contact_by_id($contact_id);
102 else if ($contact_name) $contact = get_contact_by_name($contact_name);
104 echo "<p>Orders from requester " . $contact->getLink() . ":";
105 return show_orders($offset, $per_page, $contact->getId(), null, $state_mask);
107 else echo "<p>No such contact!</p>\n";
110 function show_beneficiary_orders($offset, $per_page, $contact_name, $contact_id = null, $state_mask = null) {
111 if (isset($contact_id)) $contact = get_contact_by_id($contact_id);
112 else if ($contact_name) $contact = get_contact_by_name($contact_name);
114 echo "<p>Orders to beneficiary " . $contact->getLink() . ":";
115 return show_orders($offset, $per_page, null, $contact->getId(), $state_mask);
117 else echo "<p>No such contact!</p>\n";
120 function show_area_orders($offset, $per_page, $area_name, $area_id = null, $state_mask = null) {
121 if (isset($area_id)) $area = get_area_by_id($area_id);
122 else if ($area_name) $area = get_area_by_name($area_name);
124 $contacts = get_area_contacts($area->getId(), $GLOBALS['ROLE_BENEFICIARY']);
125 $contact_ids = array();
126 foreach ($contacts as $contact) $contact_ids[] = $contact->getId();
128 echo "<p>Orders in area " . $area->getLink() . ":";
129 return show_orders($offset, $per_page, null, $contact_ids, $state_mask);
131 else echo "<p>No such area!</p>\n";
134 function show_order_state_form($state_mask = null) {
135 global $states, $all_states;
137 if (is_null($state_mask)) $state_mask = $all_states;
139 echo "<p>Restrict to order states:\n";
140 for ($i = 0; $i < count($states); $i++) {
141 echo " <input type=\"checkbox\" name=\"state_$i\"";
142 if ($state_mask & (1 << $i)) echo " checked";
143 echo ">$states[$i]\n";
148 function get_order_state_mask($string = null) {
149 global $states, $all_states;
153 if (isset($string)) {
154 $selected = explode("+", $string);
155 for ($i = 0; $i < count($states); $i++) {
156 if (in_array($states[$i], $selected)) $mask |= (1 << $i);
160 for ($i = 0; $i < count($states); $i++) {
161 if ($_POST['state_' . $i] == "on") $mask |= (1 << $i);
165 if (! $mask) $mask = $all_states;
169 function get_order_state_string($mask) {
174 for ($i = 0; $i < count($states); $i++) {
175 if ($mask & (1 << $i)) $selected[] = $states[$i];
178 return implode("+", $selected);
181 function get_order_state_uri($mask) {
184 if (is_null($mask)) return "";
185 if ($mask == $all_states) return "";
187 return "/state/" . get_order_state_string($mask);
190 function show_order_areas_form($city_id = null) {
191 $areas = get_city_areas($city_id);
192 if (! count($areas)) {
193 echo "<p>No <a href=\"/area\">areas</a>!</p>\n";
197 echo "<p>Show orders in area\n";
198 echo "<select name=\"area_id\">\n";
199 foreach ($areas as $area) {
200 option("area_id", $area->getId(), get_area_displayname($area));
203 echo "<input type=\"submit\" name=\"show_in_area\" value=\"Show\">\n";
206 function show_order_cities_form($city_id = null) {
208 $cities = $q->orderByName()->find();
210 if (! count($cities)) {
211 echo "<p>No <a href=\"/city\">cities</a>!</p>\n";
215 echo "<p>Show orders in city\n";
216 echo "<select name=\"city_id\">\n";
217 foreach ($cities as $city) {
218 option("city_id", $city->getId(), get_city_displayname($city), $city_id);
221 echo "<input type=\"submit\" name=\"show_in_city\" value=\"Show\">\n";
224 function show_order_forms($city_id, $state_mask) {
225 echo "<form method=\"POST\" action=\"" . $_SERVER['REQUEST_URI'] . "\">\n";
226 show_order_state_form($state_mask);
227 show_order_areas_form($city_id);
228 show_order_cities_form($city_id);
232 function show_order_form($order = null, $area_id = null) {
236 $q = new OrderStateQuery;
237 $order_state = $q->filterByOrderId($order->getId())->orderByUpdated('desc')->limit(1)->findOne();
238 if ($order_state) $state = $order_state->getState();
240 else $order = new Order;
245 echo " <td>Delivery</td>\n";
246 /* XXX: Find suitable dates from area. */
247 echo " <td>"; show_date_form("date", $order->getDate()); echo "</td>\n";
252 echo " <td>Requester</td>\n";
253 echo " <td><select name=\"requester_id\">\n";
254 option("requester_id", null, "");
255 $contacts = get_area_requesters();
256 foreach ($contacts as $contact) {
257 option("requester_id", $contact->getId(), $contact->getDisplayname(), $order->getRequesterId());
259 echo "</select></td>\n";
264 echo " <td>Beneficiary</td>\n";
265 echo " <td><select name=\"beneficiary_id\">\n";
266 option("beneficiary_id", null, "");
267 $contacts = get_area_beneficiaries($area_id);
268 foreach ($contacts as $contact) {
269 option("beneficiary_id", $contact->getId(), $contact->getDisplayname(), $order->getBeneficiaryId());
271 echo "</select></td>\n";
276 echo " <td>Hub</td>\n";
277 echo " <td><select name=\"hub_id\">\n";
278 option("hub_id", null, "");
279 $hubs = get_area_hubs();
280 foreach ($hubs as $hub) {
281 option("hub_id", $hub->getId(), $hub->getDisplayname(), $order->getHubId());
283 echo "</select></td>\n";
288 echo " <td>Quantity (kg)</td>\n";
289 echo " <td>"; input("quantity", $order->getQuantity()); echo "</td>\n";
294 echo " <td>Driver</td>\n";
295 $contacts = get_city_drivers();
296 if (count($contacts)) {
297 echo " <td><select name=\"driver_id\">\n";
298 option("driver_id", null, "");
299 foreach ($contacts as $contact) {
300 option("driver_id", $contact->getId(), $contact->getDisplayname(), $driver_id);
302 echo "</select></td>\n";
304 else echo " <td>No drivers!</td>\n";
308 if ($order->getId()) {
310 echo " <td>State</td>\n";
311 echo " <td><select name=\"state\">\n";
312 for ($i = 0; $i < count($states); $i++) {
313 option("state", $i << 1, ucfirst($states[$i]), $state);
315 echo "</select></td>\n";
320 function show_new_order_form($area_id = null) {
321 if (! check_admin(1)) return;
323 $area = get_area_by_id($area_id);
324 if (! count($area)) {
325 echo "<p>No such <a href=\"/area\">area</a>!</p>\n";
329 echo "<form method=\"POST\" action=\"" . $_SERVER['REQUEST_URI'] . "\">\n";
330 echo "<p>Place an order:</p>\n";
333 show_order_form(null, $area_id);
336 echo " <td colspan=2>"; submit("add_order", "Order"); echo "</td></tr>\n";
342 function show_add_new_order_form() {
343 if (! check_admin(1)) return;
345 /* We intentionally hide areas with no contacts. */
346 $areas = get_city_areas_with_contacts(null, $GLOBALS['ROLE_BENEFICIARY']);
347 if (! count($areas)) {
348 echo "<p>Can't place any orders until at least one <a href=\"/area\">area</a> has a <a href=\"/contact\">contact</a>!</p>\n";
352 echo "<form method=\"POST\" action=\"" . $_SERVER['REQUEST_URI'] . "\">\n";
353 echo "<p>Place an order in <select name=\"area_id\">\n";
354 foreach ($areas as $area) {
355 option("area_id", $area->getId(), get_area_displayname($area));
358 submit("show_add_order", "Proceed");
363 function update_order(&$order, $new = false) {
366 #$date = ymd_to_iso8601("date");
367 $date = $_POST['date'];
368 $requester_id = $_POST['requester_id'];
369 $beneficiary_id = $_POST['beneficiary_id'];
370 $hub_id = $_POST['hub_id'];
371 $quantity = $_POST['quantity'];
372 $driver_id = $_POST['driver_id'];
373 $state = $_POST['state'];
374 if (! $state) $state = $GLOBALS['STATE_PLACED'];
376 if (! $date) $date = time();
377 /* XXX: check date */
379 $requester = get_contact_by_id($requester_id);
381 echo "<p>Invalid requester!</p>\n";
385 $beneficiary = get_contact_by_id($beneficiary_id);
386 if (! $beneficiary) {
387 echo "<p>Invalid beneficiary!</p>\n";
392 $hub = get_hub_by_id($hub_id);
394 echo "<p>Invalid hub!</p>\n";
399 if (! is_numeric($quantity)) {
400 echo "<p>Invalid quantity!</p>\n";
404 $order->setDate($date);
405 $order->setRequesterId($requester_id);
406 $order->setBeneficiaryId($beneficiary_id);
407 $order->setHubId($hub_id);
408 $order->setQuantity($quantity);
413 $order_state = new OrderState;
414 $order_state->setUpdated(time());
415 $order_state->setOrderId($order->getId());
416 $order_state->setUserId($user_id);
417 $order_state->setDriverId($driver_id);
418 $order_state->setState($state);
420 $order_state->save();
422 catch (Exception $e) {
423 if ($new) echo "<p>Error placing order.</p>\n";
424 else echo "<p>Error updating order.</p>\n";
431 function add_order() {
432 if (! check_admin(1, "place an order")) return;
435 if (! update_order($order, true)) return false;
436 return $order->getId();
439 function delete_order($id = null) {
440 if (! check_admin(1, "delete an order")) return;
442 if (isset($id)) $order = get_order_by_id($id);
443 if (! $order) return false;
446 $q = new OrderStateQuery;
447 $order_states = $q->filterByOrderId($id)->find();
448 foreach ($order_states as $order_state) $order_state->delete();
450 echo "<p>Deleted order.</p>\n";
452 catch (Exception $e) {
453 echo "<p>Error deleting order $id!</p>\n";
460 function show_order_history($id) {
463 $q = new OrderStateQuery();
464 $order_states = $q->filterByOrderId($id)->orderById()->find();
466 if (! count($order_states)) return;
468 echo "<h3>Order history</h3>\n";
469 foreach ($order_states as $order_state) {
470 $date = $order_state->getUpdated();
472 $user = get_contact_by_id($order_state->getUserId());
473 if ($user) $username = $user->getDisplayname();
474 else $username = "unknown user";
476 $driver_id = $order_state->getDriverId();
477 if ($driver_id) $driver = get_contact_by_id($driver_id);
480 $state = $order_state->getState();
481 for ($i = 0; $i < count($states); $i++) {
482 if ((1 << $i) == $state) {
483 $state = $states[$i];
487 #$state = $states[$order_state->getState()];
488 echo "<p><strong>$username</strong> changed order to state <strong>$state</strong>";
489 if ($driver) echo " for driver " . $driver->getDisplayname();
490 echo " on $date.</p>\n";
494 function show_order(&$id = null) {
495 if (isset($id)) $order = get_order_by_id($id);
496 if (! $order) return;
498 echo "<form method=\"POST\" action=\"" . $_SERVER['REQUEST_URI'] . "\">\n";
499 echo "<p>Order: <span class=\"strong\">" . $order->getId() . "</span>";
500 if (check_admin(1)) {
501 echo " " . $order->getDeleteLink();
507 show_order_form($order);
509 if (check_admin(1)) {
511 echo " <td colspan=2>";
512 submit("update_order", "Update");
520 show_order_history($order->getId());
524 if (count($parameters)) {
525 for ($i = 1; $i < count($parameters); $i++) {
526 if ($parameters[$i] == "state") {
527 /* /order/state/placed+picked */
528 $state_mask = get_order_state_mask($parameters[$i + 1]);
532 if ($parameters[0] == "in") {
533 /* /order/in/area/Romsey+Town/1 */
534 switch ($parameters[1]) {
537 $area_id = $parameters[3];
538 $_POST['area_id'] = $area_id;
540 $area = $q->findOneById($area_id);
541 $city = get_area_city($area);
542 if ($city) $city_id = $city->getId();
543 show_area_orders(0, 10, $parameters[2], $area_id, $state_mask);
547 $city_id = $parameters[3];
548 $_POST['city_id'] = $city_id;
550 $city = $q->findOneById($city_id);
551 show_city_orders(0, 10, $parameters[2], $city_id, $state_mask);
555 else if ($parameters[0] == "from") {
556 /* /order/from/requester/Iain+Patterson/4 */
557 switch ($parameters[1]) {
559 $contact_id = $parameters[3];
560 $q = new ContactQuery;
561 $contact = $q->findOneById($contact_id);
562 show_requester_orders(0, 10, $parameters[2], $contact_id, $state_mask);
566 else if ($parameters[0] == "to") {
567 /* /order/to/beneficiary/Cambridge+Community+Church/1 */
568 switch ($parameters[1]) {
570 $contact_id = $parameters[3];
571 $q = new ContactQuery;
572 $hub = $q->findOneById($contact_id);
573 show_beneficiary_orders(0, 10, $parameters[2], $contact_id, $state_mask);
578 list($ignored, $id, $args) = parse_parameters($parameters);
579 //echo "<p>$name($id) " . print_r($args, true) . "</p>\n";
587 else if (isset($id)) show_order($id);
588 else if ($state_mask) show_orders(0, 10, null, null, $state_mask);
590 /* XXX: Shown after adding. */
591 show_order_forms($city_id, $state_mask);
592 show_add_new_order_form($city_id);
595 if (count($parameters)) {
596 show_order_forms($city_id, $state_mask);