Correctly filter city or area.
[readifood.git] / lib / hub.php
1 <?php
2
3   if (isset($_POST['show_add_hub'])) {
4     $city_id = $_POST['city_id'];
5     show_new_hub_form($city_id);
6   }
7   else if (isset($_POST['add_hub'])) {
8     $id = add_hub($displayname);
9     if ($id !== false) {
10       echo "<p>Added hub.</p>\n";
11       $parameters = array($displayname, $id);
12     }
13   }
14   else if (isset($_POST['update_hub'])) {
15     list($name, $id, $args) = parse_parameters($parameters);
16     $q = new HubQuery;
17     $hub = $q->findOneById($id);
18     if ($hub) {
19       $area = get_hub_area($hub);
20       if ($area) $area_id = $area->getId();
21       if (update_hub($hub, $area_id) !== false) {
22         echo "<p>Updated hub.</p>\n";
23         $parameters = array($hub->getDisplayname(), $hub->getId());
24       }
25     }
26     else {
27       echo "<p>No such hub!</p>\n";
28     }
29   }
30   else if ($_POST['show_in_area']) {
31     $q = new AreaQuery;
32     $area = $q->findOneById($_POST['area_id']);
33     header(sprintf("Location: http%s://%s/%s/in/area/%s/%d", ($_SERVER['HTTPS']) ? "s" : "", $_SERVER['HTTP_HOST'], $module, urlencode($area->getName()), $_POST['area_id']));
34     exit;
35   }
36   else if ($_POST['show_in_city']) {
37     $q = new CityQuery;
38     $city = $q->findOneById($_POST['city_id']);
39     header(sprintf("Location: http%s://%s/%s/in/city/%s/%d", ($_SERVER['HTTPS']) ? "s" : "", $_SERVER['HTTP_HOST'], $module, urlencode($city->getName()), $_POST['city_id']));
40     exit;
41   }
42
43   function show_hub_summary(&$hub, $editing = false) {
44     if ($editing) echo "<p>Hub: <span class=\"strong\">" . htmlspecialchars($hub->getName()) . "</span>";
45     else echo "<br>\nHub " . $hub->getStrongLink();
46     $role = $hub->getRole();
47     $role_string = get_hub_role_string($hub);
48     if ($role_string) echo " $role_string";
49     if ($role & $GLOBALS['ROLE_COLLECTION']) printf(" <a class=\"small\" href=\"/donation/to/hub/%s/%d\">Donations</a>", urlencode($hub->getName()), $hub->getId());
50     if ($role & $GLOBALS['ROLE_DISTRIBUTION']) printf(" <a class=\"small\" href=\"/order/to/hub/%s/%d\">Orders</a>", urlencode($hub->getName()), $hub->getId());
51     if (check_admin(1)) {
52       echo " " . $hub->getDeleteLink();
53     }
54     $area = get_hub_area($hub);
55     if ($area) echo " in " . $area->getLink();
56     $city = get_hub_city($hub);
57     if ($city) echo ", " . $city->getLink(get_city_displayname($city));
58   }
59
60   function show_hubs($offset, $per_page, $address_ids) {
61     $q = new HubQuery;
62     $hubs = $q->filterByAddressId($address_ids)->find();
63     if (count($hubs)) {
64       foreach ($hubs as $hub) show_hub_summary($hub);
65     }
66     else echo " none";
67   }
68
69   function show_city_hubs($offset, $per_page, $city_name, $city_id = null) {
70     if (isset($city_id)) $city = get_city_by_id($city_id);
71     else if ($city_name) $city = get_city_by_name($city_name);
72     if ($city) {
73       $q = new AreaQuery;
74       $areas = $q->filterByCityId($city->getId())->find();
75       $area_ids = array();
76       foreach ($areas as $area) $area_ids[] = $area->getId();
77
78       $q = new AddressQuery;
79       $addresses = $q->filterByAreaId($area_ids)->find();
80       $address_ids = array();
81       foreach ($addresses as $address) $address_ids[] = $address->getId();
82
83       echo "<p>Hubs in city " . $city->getLink(get_city_displayname($city)) . ":";
84       return show_hubs($offset, $per_page, $address_ids);
85     }
86     else echo "<p>No such city!</p>\n";
87   }
88
89   function show_area_hubs($offset, $per_page, $area_name, $area_id = null) {
90     if (isset($area_id)) $area = get_area_by_id($area_id);
91     else if ($area_name) $area = get_area_by_name($area_name);
92     if ($area) {
93       $q = new AddressQuery;
94       $addresses = $q->filterByAreaId($area->getId())->find();
95       $address_ids = array();
96       foreach ($addresses as $address) $address_ids[] = $address->getId();
97
98       echo "<p>Hubs in area " . $area->getLink() . ":";
99       return show_hubs($offset, $per_page, $address_ids);
100     }
101     else echo "<p>No such area!</p>\n";
102   }
103
104   function show_hub_areas_form($city_id = null) {
105     $areas = get_city_areas($city_id);
106     if (! count($areas)) {
107       echo "<p>No <a href=\"/area\">areas</a>!</p>\n";
108       return;
109     }
110
111     $candidates = array();
112     foreach ($areas as $area) {
113       if (! count(get_area_hubs($area->getId()))) continue;
114       $candidates[] = $area;
115     }
116     if (! count($candidates)) return;
117
118     echo "<p>Show hubs in area\n";
119     echo "<select name=\"area_id\">\n";
120     foreach ($candidates as $area) {
121       option("area_id", $area->getId(), get_area_displayname($area));
122     }
123     echo "</select>\n";
124     submit("show_in_area", "Show");
125   }
126
127   function show_hub_cities_form($city_id = null) {
128     $q = new CityQuery;
129     $cities = $q->orderByName()->find();
130
131     if (! count($cities)) {
132       echo "<p>No <a href=\"/city\">cities</a>!</p>\n";
133       return;
134     }
135
136     $candidates = array();
137     foreach ($cities as $city) {
138       if (! count(get_city_hubs($city->getId()))) continue;
139       $candidates[] = $city;
140     }
141     if (! count($candidates)) return;
142
143     echo "<p>Show hubs in city\n";
144     echo "<select name=\"city_id\">\n";
145     foreach ($candidates as $city) {
146       option("city_id", $city->getId(), get_city_displayname($city), $city_id);
147     }
148     echo "</select>\n";
149     submit("show_in_city", "Show");
150   }
151
152   function show_hub_forms($city_id) {
153     form("noprint standout");
154     show_hub_areas_form($city_id);
155     show_hub_cities_form($city_id);
156     end_form();
157   }
158
159   function show_hub_role_form($role) {
160     return show_role_form($role, $GLOBALS['hub_roles']);
161   }
162
163   function show_hub_form($hub = null, $area_id = null) {
164     if (! $hub) $hub = new Hub;
165
166     /* Role. */
167     echo "<tr>\n";
168     echo "  <td>Role</td>\n";
169     echo "  <td>"; show_hub_role_form($hub->getRole()); echo "</td>\n";
170     echo "</tr>\n";
171
172     /* Display name. */
173     echo "<tr>\n";
174     echo "  <td>Hub name</td>\n";
175     echo "  <td>"; input("displayname", $hub->getDisplayname()); echo "</td>\n";
176     echo "</tr>\n";
177
178     /* Address. */
179     $address = get_hub_address($hub);
180     if (! $address) $address = new Address;
181     echo "<tr>\n";
182     echo "  <td>Address</td>\n";
183     echo "  <td>"; textarea("address", $address->getLine()); echo "</td>\n";
184     echo "</tr>\n";
185
186     /* Postcode. */
187     echo "<tr>\n";
188     echo "  <td>Postcode</td>\n";
189     echo "  <td>"; input("postcode", $address->getPostcode()); echo get_address_map_link($address); echo "</td>\n";
190     echo "</tr>\n";
191
192     /* Telephone. */
193     echo "<tr>\n";
194     echo "  <td>Telephone</td>\n";
195     echo "  <td>"; input("telephone1", $hub->getTelephone1()); echo "</td>\n";
196     echo "</tr>\n";
197     echo "<tr>\n";
198     echo "  <td>Alternative telephone</td>\n";
199     echo "  <td>"; input("telephone2", $hub->getTelephone2()); echo "</td>\n";
200     echo "</tr>\n";
201
202     /* Email. */
203     echo "<tr>\n";
204     echo "  <td>Email</td>\n";
205     echo "  <td>"; input("email", $hub->getEmail()); echo "</td>\n";
206     echo "</tr>\n";
207
208     /* Area. */
209     $areas = get_city_areas();
210     if (! isset($area_id)) $area_id = get_hub_area($hub);
211     echo "<tr>\n";
212     echo "  <td>Area</td>\n";
213     echo "  <td><select name=\"area_id\">\n";
214     foreach ($areas as $area) {
215       option("area_id", $area->getId(), get_area_displayname($area), $area_id);
216     }
217     echo "  </select></td>\n";
218     echo "</tr>\n";
219   }
220
221   function show_new_hub_form($city_id = null) {
222     if (! check_admin(1)) return;
223
224     $areas = get_city_areas($city_id);
225     if (! count($areas)) {
226       echo "<p>No <a href=\"/area\">areas</a>!</p>\n";
227       return;
228     }
229
230     form("noprint");
231     echo "<p>Add a new hub:</p>\n";
232
233     echo "<table>\n";
234     show_hub_form($hub);
235
236     echo "<tr>\n";
237     echo "  <td colspan=2>"; submit("add_hub", "Add"); echo "</td></tr>\n";
238     echo "</tr>\n";
239     echo "</table>\n";
240     end_form();
241   }
242
243   function show_add_new_hub_form() {
244     if (! check_admin(1)) return;
245
246     $q = new CityQuery;
247     $cities = $q->find();
248     if (! count($cities)) {
249       echo "<p>No <a href=\"/city\">cities</a>!</p>\n";
250       return;
251     }
252
253     form("noprint standout");
254     echo "<p>Add a new hub in <select name=\"city_id\">\n";
255     foreach ($cities as $city) {
256       option("city_id", $city->getId(), get_city_displayname($city));
257     }
258     echo "</select>";
259     submit("show_add_hub", "Proceed");
260     echo "</p>\n";
261     end_form();
262   }
263
264   function update_hub(&$hub, $area_id, $new = false) {
265     global $hub_roles;
266
267     $role = 0;
268     for ($i = 0; $i < count($hub_roles); $i++) {
269       if ($_POST['role_' . $i] == "on") $role |= (1 << $i);
270     }
271
272     $displayname = $_POST['displayname'];
273
274     if (! $displayname) {
275       echo "<p>Must have a name!</p>\n";
276       return false;
277     }
278
279     /* Get address. */
280     $line = $_POST['address'];
281     $postcode = $_POST['postcode'];
282     $q = new AddressQuery;
283     /* XXX: Finding by area properly? */
284     $address = $q->filterByAreaId($area_id)->filterByLine($line)->filterByPostcode($postcode)->findOneOrCreate();
285     if ($address->isNew()) {
286       /* Changing address. */
287       //if (! $new)
288       /*
289         XXX: Check for other hubs at the old address.
290         Make this a new address if there are others, but
291         provide a link to update other hubs.
292       */
293       try {
294         $address->save();
295       }
296       catch (Exception $e) {
297         echo "<p>Error adding $line.</p>\n";
298         return false;
299       }
300     }
301
302     $telephone1 = $_POST['telephone1'];
303     $telephone2 = $_POST['telephone2'];
304     $email = $_POST['email'];
305
306     $hub->setRole($role);
307     $hub->setDisplayname($displayname);
308     $hub->setTelephone1($telephone1);
309     $hub->setTelephone2($telephone2);
310     $hub->setEmail($email);
311     $hub->setAddressId($address->getId());
312
313     try {
314       $hub->save();
315     }
316     catch (Exception $e) {
317       if ($new) echo "<p>Error adding $displayname.</p>\n";
318       else echo "<p>Error updating $displayname.</p>\n";
319       return false;
320     }
321
322     return true;
323   }
324
325   function add_hub(&$name) {
326     if (! check_admin(1, "add a hub")) return;
327
328     $area_id = $_POST['area_id'];
329     if (! is_numeric($area_id)) {
330       echo "<p>Invalid area!</p>\n";
331       return false;
332     }
333
334     $area = get_area_by_id($area_id);
335     if (! $area) {
336       echo "<p>No such area!</p>\n";
337       return false;
338     }
339
340     $hub = new Hub;
341     if (! update_hub($hub, $area_id, true)) return false;
342     return $hub->getId();
343   }
344
345   function confirm_delete_hub($name, $id = null) {
346     if (! check_admin(1, "delete a hub")) return;
347
348     if (isset($id)) $hub = get_hub_by_id($id);
349     else $hub = get_hub_by_name($name);
350     if (! $hub) return false;
351
352     echo "<h3>Confirm deletion</h3>\n";
353     echo "<p>You must confirm deletion of hub " . $hub->getDisplayname() . ": " . $hub->getDeleteLink(true) . "</p>\n";
354   }
355
356   function delete_hub($name, $id = null, &$city_id = null) {
357     if (! check_admin(1, "delete a hub")) return;
358
359     if (isset($id)) $hub = get_hub_by_id($id);
360     else $hub = get_hub_by_name($name);
361     if (! $hub) return false;
362
363     ///* Remember city ID for dropdown. */
364     //$city_id = $area->getCityId();
365
366     try {
367       $hub->delete();
368       echo "<p>Deleted hub.</p>\n";
369     }
370     catch (Exception $e) {
371       echo "<p>Error deleting $name!</p>\n";
372       return false;
373     }
374
375     return true;
376   }
377
378   function show_hub($name, &$id = null) {
379     if (isset($id)) $hub = get_hub_by_id($id);
380     else $hub = get_hub_by_name($name);
381     if (! $hub) return;
382
383     form();
384     show_hub_summary($hub, true);
385     echo ": ";
386     echo "\n</p>";
387
388     echo "<table>\n";
389     show_hub_form($hub);
390
391     if (check_admin(1)) {
392       echo "<tr>\n";
393       echo "  <td colspan=2>";
394       submit("update_hub", "Update");
395       echo "</td>\n";
396       echo "</tr>\n";
397     }
398
399     echo "</table>\n";
400     end_form();
401   }
402
403   /* /hub/in/area/Cambridge/1 */
404   if (count($parameters)) {
405     if ($parameters[0] == "in") {
406       switch ($parameters[1]) {
407         case "area":
408           $area_id = $parameters[3];
409           $_POST['area_id'] = $area_id;
410           $q = new AreaQuery;
411           $area = $q->findOneById($area_id);
412           $city = get_area_city($area);
413           if ($city) $city_id = $city->getId();
414           show_area_hubs(0, 10, $parameters[2], $area_id);
415         break;
416
417         case "city":
418           $city_id = $parameters[3];
419           $_POST['city_id'] = $city_id;
420           $q = new CityQuery;
421           $city = $q->findOneById($city_id);
422           show_city_hubs(0, 10, $parameters[2], $city_id);
423         break;
424       }
425     }
426   }
427   list($name, $id, $args) = parse_parameters($parameters);
428   //echo "<p>$name($id) " . print_r($args, true) . "</p>\n";
429   if (count($args)) {
430     switch ($args[0]) {
431       case "delete":
432         confirm_delete_hub($name, $id);
433       break;
434
435       case "confirmdelete":
436         delete_hub($name, $id);
437       break;
438     }
439   }
440   else if (isset($name)) show_hub($name, $id);
441
442   show_hub_forms($city_id);
443   show_add_new_hub_form($city_id);
444
445 ?>