Link directly to order from contact view.
[readifood.git] / lib / order.php
1 <?php
2
3   if (isset($_POST['show_add_order'])) {
4     $area_id = $_POST['area_id'];
5     show_new_order_form($area_id);
6   }
7   else if (isset($_POST['add_order'])) {
8     $id = add_order();
9     if ($id !== false) {
10       echo "<p>Order placed.</p>\n";
11       $parameters = array("id", $id);
12     }
13   }
14   else if (isset($_POST['update_order'])) {
15     list($ignored, $id, $args) = parse_parameters($parameters);
16     $q = new OrderQuery;
17     $order = $q->findOneById($id);
18     if ($order) {
19       if (update_order($order) !== false) {
20         echo "<p>Updated order.</p>\n";
21         $parameters = array("id", $order->getId());
22       }
23     }
24     else {
25       echo "<p>No such contact!</p>\n";
26     }
27   }
28   else if ($_POST['show_in_area']) {
29     $q = new AreaQuery;
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())));
32     exit;
33   }
34   else if ($_POST['show_in_city']) {
35     $q = new CityQuery;
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())));
38     exit;
39   }
40
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)) {
44       $order_ids = array();
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");
47       $sth->execute();
48       $order_states = OrderStatePeer::populateObjects($sth);
49       foreach ($order_states as $order_state) $order_ids[] = $order_state->getOrderId();
50     }
51     $q = new OrderQuery;
52     if (isset($requester_ids)) $q->filterByRequesterId($requester_ids);
53     if (isset($beneficiary_ids)) $q->filterByBeneficiaryId($beneficiary_ids);
54     # XXX: Doesn't work.
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();
58     if (count($orders)) {
59       foreach ($orders as $order) {
60         echo "<br>\nOrder " . $order->getStrongLink($order->getId()) . ": " . get_order_displayname($order);
61         if (check_admin(1)) {
62           echo " " . $order->getDeleteLink();
63         }
64
65         /* XXX: Should pull from query. */
66         $q = new ContactQuery;
67         $contact = $q->findOneById($order->getBeneficiaryId());
68         if ($contact) {
69           echo " for " . $contact->getLink();
70           $area = get_contact_area($contact);
71           if ($area) echo " in " . $area->getLink();
72         }
73
74         if ($order->getHubId()) {
75           $q = new HubQuery;
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();
80         }
81       }
82     }
83     else echo " none";
84   }
85
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);
89     if ($city) {
90       $contacts = get_city_contacts($city->getId(), $GLOBALS['ROLE_BENEFICIARY']);
91       $beneficiary_ids = array();
92       foreach ($contacts as $contact) $beneficiary_ids[] = $contact->getId();
93
94       echo "<p>Orders in city " . $city->getLink(get_city_displayname($city)) . ":";
95       return show_orders($offset, $per_page, null, $beneficiary_ids, $state_mask);
96     }
97     else echo "<p>No such city!</p>\n";
98   }
99
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);
103     if ($contact) {
104       echo "<p>Orders from referrer " . $contact->getLink() . ":";
105       return show_orders($offset, $per_page, $contact->getId(), null, $state_mask);
106     }
107     else echo "<p>No such contact!</p>\n";
108   }
109
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);
113     if ($contact) {
114       echo "<p>Orders to beneficiary " . $contact->getLink() . ":";
115       return show_orders($offset, $per_page, null, $contact->getId(), $state_mask);
116     }
117     else echo "<p>No such contact!</p>\n";
118   }
119
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);
123     if ($area) {
124       $contacts = get_area_contacts($area->getId(), $GLOBALS['ROLE_BENEFICIARY']);
125       $contact_ids = array();
126       foreach ($contacts as $contact) $contact_ids[] = $contact->getId();
127
128       echo "<p>Orders in area " . $area->getLink() . ":";
129       return show_orders($offset, $per_page, null, $contact_ids, $state_mask);
130     }
131     else echo "<p>No such area!</p>\n";
132   }
133
134   function show_order_state_form($state_mask = null) {
135     global $states, $all_states;
136
137     if (is_null($state_mask)) $state_mask = $all_states;
138
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";
144     }
145     echo "</p>\n";
146   }
147
148   function get_order_state_mask($string = null) {
149     global $states, $all_states;
150
151     $mask = 0;
152
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);
157       }
158     }
159     else {
160       for ($i = 0; $i < count($states); $i++) {
161         if ($_POST['state_' . $i] == "on") $mask |= (1 << $i);
162       }
163     }
164
165     if (! $mask) $mask = $all_states;
166     return $mask;
167   }
168
169   function get_order_state_string($mask) {
170     global $states;
171
172     $selected = array();
173
174     for ($i = 0; $i < count($states); $i++) {
175       if ($mask & (1 << $i)) $selected[] = $states[$i];
176     }
177
178     return implode("+", $selected);
179   }
180
181   function get_order_state_uri($mask) {
182     global $all_states;
183
184     if (is_null($mask)) return "";
185     if ($mask == $all_states) return "";
186
187     return "/state/" . get_order_state_string($mask);
188   }
189
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";
194       return;
195     }
196
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));
201     }
202     echo "</select>\n";
203     echo "<input type=\"submit\" name=\"show_in_area\" value=\"Show\">\n";
204   }
205
206   function show_order_cities_form($city_id = null) {
207     $q = new CityQuery;
208     $cities = $q->orderByName()->find();
209
210     if (! count($cities)) {
211       echo "<p>No <a href=\"/city\">cities</a>!</p>\n";
212       return;
213     }
214
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);
219     }
220     echo "</select>\n";
221     echo "<input type=\"submit\" name=\"show_in_city\" value=\"Show\">\n";
222   }
223
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);
229     echo "</form>\n";
230   }
231
232   function show_order_form($order = null, $area_id = null) {
233     global $states, $parcel_sizes, $parcel_contents;
234
235     if ($order) {
236       $q = new OrderStateQuery;
237       $order_state = $q->filterByOrderId($order->getId())->orderByUpdated('desc')->limit(1)->findOne();
238       if ($order_state) {
239         $state = $order_state->getState();
240         $driver_id = $order_state->getDriverId();
241       }
242     }
243     else $order = new Order;
244
245
246     /* Date. */
247     echo "<tr>\n";
248     echo "  <td>Delivery</td>\n";
249     /* XXX: Find suitable dates from area. */
250     echo "  <td>";
251     show_date_form("date", $order->getDate());
252     if (! $order->getDate()) {
253       echo " and recur for <select name=\"recurrence\">\n";
254       for ($i = 0; $i < 4; $i++) option("recurrence", $i, $i);
255       echo "</select> weeks";
256     }
257     echo "</td>\n";
258     echo "</tr>\n";
259
260     /* Referrer. */
261     echo "<tr>\n";
262     echo "  <td>Referrer</td>\n";
263     echo "  <td><select name=\"requester_id\">\n";
264     option("requester_id", null, "");
265     $contacts = get_area_requesters();
266     foreach ($contacts as $contact) {
267       option("requester_id", $contact->getId(), $contact->getDisplayname(), $order->getRequesterId());
268     }
269     echo "</select></td>\n";
270     echo "</tr>\n";
271
272     /* Beneficiary. */
273     echo "<tr>\n";
274     echo "  <td>Beneficiary</td>\n";
275     echo "  <td><select name=\"beneficiary_id\">\n";
276     option("beneficiary_id", null, "");
277     if (! $order->getId() && $order->getBeneficiaryId()) {
278       $contact = get_contact_by_id($order->getBeneficiaryId());
279       if ($contact) option("beneficiary_id", $order->getBeneficiaryId(), $contact->getDisplayname(), $order->getBeneficiaryId());
280     }
281     else {
282       $contacts = get_area_beneficiaries($area_id);
283       foreach ($contacts as $contact) {
284         option("beneficiary_id", $contact->getId(), $contact->getDisplayname(), $order->getBeneficiaryId());
285       }
286     }
287     echo "</select></td>\n";
288     echo "</tr>\n";
289
290     /* Hub. */
291     echo "<tr>\n";
292     echo "  <td>Hub</td>\n";
293     echo "  <td><select name=\"hub_id\">\n";
294     option("hub_id", null, "");
295     $hubs = get_area_hubs();
296     foreach ($hubs as $hub) {
297       option("hub_id", $hub->getId(), $hub->getDisplayname(), $order->getHubId());
298     }
299     echo "</select></td>\n";
300     echo "</tr>\n";
301
302     /* Quantity. */
303     echo "<tr>\n";
304     echo "  <td>Quantity (kg)</td>\n";
305     echo "  <td>"; input("quantity", sprintf("%0.2f", $order->getQuantity() / 1000)); echo "</td>\n";
306     echo "</tr>\n";
307
308     /* Parcel type. */
309     echo "<tr>\n";
310     echo "  <td>Parcel size</td>\n";
311     echo "  <td><select name=\"parcel_size\">\n";
312     $mask = 1 << (count($parcel_sizes) + 1);
313     for ($i = 0; $i < count($parcel_sizes); $i++) {
314       option("parcel_size", $i << 1, $parcel_sizes[$i], $order->getParcel() % $mask);
315     }
316     echo "</select></td>\n";
317     echo "</tr>\n";
318
319     /* Parcel contents. */
320     echo "<tr>\n";
321     echo "  <td>Parcel contents</td>\n";
322     echo "  <td>";
323     for ($i = count($parcel_sizes); $i < count($parcel_contents); $i++) {
324       echo "  <input type=\"checkbox\" name=\"parcel_$i\"";
325       if ($order->getParcel() & (1 << $i)) echo " checked";
326       echo ">$parcel_contents[$i]\n";
327     }
328     echo "</td>\n";
329     echo "</tr>\n";
330
331     /* Driver. */
332     echo "<tr>\n";
333     echo "  <td>Driver</td>\n";
334     $contacts = get_city_drivers();
335     if (count($contacts)) {
336       echo "  <td><select name=\"driver_id\">\n";
337       option("driver_id", null, "");
338       foreach ($contacts as $contact) {
339         option("driver_id", $contact->getId(), $contact->getDisplayname(), $driver_id);
340       }
341       echo "</select></td>\n";
342     }
343     else echo "  <td>No drivers!</td>\n";
344     echo "</tr>\n";
345
346     /* State. */
347     if ($order->getId()) {
348       echo "<tr>\n";
349       echo "  <td>State</td>\n";
350       echo "  <td><select name=\"state\">\n";
351       for ($i = 0; $i < count($states); $i++) {
352         option("state", $i << 1, ucfirst($states[$i]), $state);
353       }
354       echo "</select></td>\n";
355       echo "</tr>\n";
356     }
357   }
358
359   function show_new_order_form($area_id = null) {
360     if (! check_admin(1)) return;
361
362     $area = get_area_by_id($area_id);
363     if (! count($area)) {
364       echo "<p>No such <a href=\"/area\">area</a>!</p>\n";
365       return;
366     }
367
368     echo "<form method=\"POST\" action=\"" . $_SERVER['REQUEST_URI'] . "\">\n";
369     echo "<p>Place an order:</p>\n";
370
371     echo "<table>\n";
372     show_order_form(null, $area_id);
373
374     echo "<tr>\n";
375     echo "  <td colspan=2>"; submit("add_order", "Order"); echo "</td></tr>\n";
376     echo "</tr>\n";
377     echo "</table>\n";
378     echo "</form>\n";
379   }
380
381   function show_contact_order_form($contact) {
382     if (! check_admin(1)) return;
383
384     $area = get_contact_area($contact);
385     if (! $area) {
386       echo "<p>No valid <a href=\"/area\">area</a> for contact!</p>\n";
387       return;
388     }
389
390     $order = new Order;
391     $order->setBeneficiaryId($contact->getId());
392
393     echo "<form method=\"POST\" action=\"" . $_SERVER['REQUEST_URI'] . "\">\n";
394     echo "<p>Place an order:</p>\n";
395
396     echo "<table>\n";
397     show_order_form($order, $area_id);
398
399     echo "<tr>\n";
400     echo "  <td colspan=2>"; submit("add_order", "Order"); echo "</td></tr>\n";
401     echo "</tr>\n";
402     echo "</table>\n";
403     echo "</form>\n";
404   }
405
406   function show_add_new_order_form() {
407     if (! check_admin(1)) return;
408
409     /* We intentionally hide areas with no contacts. */
410     $areas = get_city_areas_with_contacts(null, $GLOBALS['ROLE_BENEFICIARY']);
411     if (! count($areas)) {
412       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";
413       return;
414     }
415
416     echo "<form method=\"POST\" action=\"" . $_SERVER['REQUEST_URI'] . "\">\n";
417     echo "<p>Place an order in <select name=\"area_id\">\n";
418     foreach ($areas as $area) {
419       option("area_id", $area->getId(), get_area_displayname($area));
420     }
421     echo "</select>";
422     submit("show_add_order", "Proceed");
423     echo "</p>\n";
424     echo "</form>\n";
425   }
426
427   function update_order(&$order, $new = false) {
428     global $user_id, $parcel_sizes, $parcel_contents;
429
430     #$date = ymd_to_iso8601("date");
431     $date = $_POST['date'];
432     $requester_id = $_POST['requester_id'];
433     $beneficiary_id = $_POST['beneficiary_id'];
434     $hub_id = $_POST['hub_id'];
435     $quantity = $_POST['quantity'];
436     $driver_id = $_POST['driver_id'];
437     if (! $driver_id) $driver_id = null;
438     $state = $_POST['state'];
439     if (! $state) $state = $GLOBALS['STATE_PLACED'];
440     $parcel = $_POST['parcel_size'];
441     for ($i = count($parcel_sizes); $i < count($parcel_contents); $i++) {
442       if ($_POST['parcel_' . $i] == "on") $parcel |= (1 << $i);
443     }
444
445     if ($date) {
446       list($y, $m, $d) = explode('-', $date);
447       $then = mktime(0, 0, 0, $m, $d, $y);
448     }
449     else $then = time();
450     /* XXX: check date */
451
452     $requester = get_contact_by_id($requester_id);
453     if (! $requester) {
454       echo "<p>Invalid referrer!</p>\n";
455       return false;
456     }
457
458     $beneficiary = get_contact_by_id($beneficiary_id);
459     if (! $beneficiary) {
460       echo "<p>Invalid beneficiary!</p>\n";
461       return false;
462     }
463
464     if ($hub_id) {
465       $hub = get_hub_by_id($hub_id);
466       if (! $hub) {
467         echo "<p>Invalid hub!</p>\n";
468         return false;
469       }
470     }
471     else $hub_id = null;
472
473     if (! is_numeric($quantity)) {
474       echo "<p>Invalid quantity!</p>\n";
475       return false;
476     }
477
478     if ($new && isset($_POST['recurrence'])) $recurrence = $_POST['recurrence'];
479     if (! $recurrence) $recurrence = 0;
480
481     $now = time();
482     for ($i = 0; $i <= $recurrence; $i++) {
483       if ($i) {
484         echo "<p>Creating recurrence $i.</p>\n";
485         $order = new Order;
486       }
487
488       $order->setDate($then + 7 * 86400 * $i);
489       $order->setRequesterId($requester_id);
490       $order->setBeneficiaryId($beneficiary_id);
491       $order->setHubId($hub_id);
492       $order->setQuantity($quantity * 1000);
493       $order->setParcel($parcel);
494
495       /* XXX: begin/commit */
496       try {
497         $order->save();
498
499         $order_state = new OrderState;
500         $order_state->setUpdated($now);
501         $order_state->setOrderId($order->getId());
502         $order_state->setUserId($user_id);
503         $order_state->setDriverId($driver_id);
504         $order_state->setState($state);
505
506         $order_state->save();
507       }
508       catch (Exception $e) {
509         if ($new) echo "<p>Error placing order.</p>\n";
510         else echo "<p>Error updating order.</p>\n";
511         echo "<p>" . $e->getMessage() . "</p>\n";
512         return false;
513       }
514     }
515
516     return true;
517   }
518
519   function add_order() {
520     if (! check_admin(1, "place an order")) return;
521
522     $order = new Order;
523     if (! update_order($order, true)) return false;
524     return $order->getId();
525   }
526
527   function delete_order($id = null) {
528     if (! check_admin(1, "delete an order")) return;
529
530     if (isset($id)) $order = get_order_by_id($id);
531     if (! $order) return false;
532
533     try {
534       $q = new OrderStateQuery;
535       $order_states = $q->filterByOrderId($id)->find();
536       foreach ($order_states as $order_state) $order_state->delete();
537       $order->delete();
538       echo "<p>Deleted order.</p>\n";
539     }
540     catch (Exception $e) {
541       echo "<p>Error deleting order $id!</p>\n";
542       return false;
543     }
544
545     return true;
546   }
547
548   function show_order_history($id) {
549     global $states;
550
551     $q = new OrderStateQuery();
552     $order_states = $q->filterByOrderId($id)->orderById()->find();
553
554     if (! count($order_states)) return;
555
556     echo "<h3>Order history</h3>\n";
557     foreach ($order_states as $order_state) {
558       $date = $order_state->getUpdated();
559
560       $user = get_contact_by_id($order_state->getUserId());
561       if ($user) $username = $user->getDisplayname();
562       else $username = "unknown user";
563
564       $driver_id = $order_state->getDriverId();
565       if ($driver_id) $driver = get_contact_by_id($driver_id);
566       else $driver = null;
567
568       /* XXX */
569       $state = $order_state->getState();
570       for ($i = 0; $i < count($states); $i++) {
571         if ((1 << $i) == $state) {
572           $state = $states[$i];
573           break;
574         }
575       }
576       #$state = $states[$order_state->getState()];
577       echo "<p><strong>$username</strong> changed order to state <strong>$state</strong>";
578       if ($driver) echo " for driver " . $driver->getDisplayname();
579       echo " on $date.</p>\n";
580     }
581   }
582
583   function show_order(&$id = null) {
584     if (isset($id)) $order = get_order_by_id($id);
585     if (! $order) return;
586
587     echo "<form method=\"POST\" action=\"" . $_SERVER['REQUEST_URI'] . "\">\n";
588     echo "<p>Order: <span class=\"strong\">" . $order->getId() . "</span>";
589     if (check_admin(1)) {
590       echo " " . $order->getDeleteLink();
591     }
592     echo ": ";
593     echo "\n</p>";
594
595     echo "<table>\n";
596     show_order_form($order);
597
598     if (check_admin(1)) {
599       echo "<tr>\n";
600       echo "  <td colspan=2>";
601       submit("update_order", "Update");
602       echo "</td>\n";
603       echo "</tr>\n";
604     }
605
606     echo "</table>\n";
607     echo "</form>\n";
608
609     show_order_history($order->getId());
610   }
611
612   $state_mask = null;
613   if (count($parameters)) {
614     for ($i = 1; $i < count($parameters); $i++) {
615       if ($parameters[$i] == "state") {
616         /* /order/state/placed+picked */
617         $state_mask = get_order_state_mask($parameters[$i + 1]);
618       }
619     }
620
621     if ($parameters[0] == "in") {
622       /* /order/in/area/Romsey+Town/1 */
623       switch ($parameters[1]) {
624       case "area":
625         case "area":
626           $area_id = $parameters[3];
627           $_POST['area_id'] = $area_id;
628           $q = new AreaQuery;
629           $area = $q->findOneById($area_id);
630           $city = get_area_city($area);
631           if ($city) $city_id = $city->getId();
632           show_area_orders(0, 10, $parameters[2], $area_id, $state_mask);
633         break;
634
635         case "city":
636           $city_id = $parameters[3];
637           $_POST['city_id'] = $city_id;
638           $q = new CityQuery;
639           $city = $q->findOneById($city_id);
640           show_city_orders(0, 10, $parameters[2], $city_id, $state_mask);
641         break;
642       }
643     }
644     else if ($parameters[0] == "from") {
645       /* /order/from/referrer/Iain+Patterson/4 */
646       switch ($parameters[1]) {
647         case "referrer":
648           $contact_id = $parameters[3];
649           $q = new ContactQuery;
650           $contact = $q->findOneById($contact_id);
651           show_requester_orders(0, 10, $parameters[2], $contact_id, $state_mask);
652         break;
653       }
654     }
655     else if ($parameters[0] == "to") {
656       /* /order/to/beneficiary/Cambridge+Community+Church/1 */
657       switch ($parameters[1]) {
658         case "beneficiary":
659           $contact_id = $parameters[3];
660           $q = new ContactQuery;
661           $hub = $q->findOneById($contact_id);
662           show_beneficiary_orders(0, 10, $parameters[2], $contact_id, $state_mask);
663         break;
664       }
665     }
666     else if ($parameters[0] == "place") {
667       if ($parameters[1] == "for") {
668         if ($parameters[2] == "beneficiary") {
669           if ($parameters[4]) $contact = get_contact_by_id($parameters[4]);
670           if (! $contact) $contact = get_contact_by_name(urldecode($parameters[3]));
671           if ($contact) show_contact_order_form($contact);
672         }
673       }
674     }
675   }
676   list($ignored, $id, $args) = parse_parameters($parameters);
677   //echo "<p>$name($id) " . print_r($args, true) . "</p>\n";
678   if (count($args)) {
679     switch ($args[0]) {
680       case "delete":
681         delete_order($id);
682       break;
683     }
684   }
685   else if (isset($id)) show_order($id);
686   else if ($state_mask) show_orders(0, 10, null, null, $state_mask);
687   else {
688     /* XXX: Shown after adding. */
689     show_order_forms($city_id, $state_mask);
690     show_add_new_order_form($city_id);
691   }
692
693   if (count($parameters)) {
694     show_order_forms($city_id, $state_mask);
695   }
696
697
698 ?>