Merge branch 'master' into uat
[readifood.git] / lib / area.php
1 <?php
2
3   if ($_POST['area_name']) {
4     set_last_selected("city_id", $_POST['city_id']);
5     $id = add_area($_POST['area_name'], $_POST['city_id']);
6     if ($id !== false) {
7       echo "<p>Added area.</p>\n";
8       $parameters = array($_POST['area_name'], $id);
9     }
10   }
11   else if ($_POST['city_id']) {
12     set_last_selected("city_id", $_POST['city_id']);
13     $city_id = $_POST['city_id'];
14     $city = get_city_by_id($city_id);
15     header(sprintf("Location: http%s://%s/%s/in/city/%s/%d", ($_SERVER['HTTPS']) ? "s" : "", $_SERVER['HTTP_HOST'], $module, $city->getName(), $city_id));
16     exit;
17   }
18   else if ($_POST['update_area']) {
19     update_area_delivery_days($parameters[0]);
20   }
21
22   function show_areas($offset, $per_page, $city_name = null, $city_id = null) {
23     if (isset($city_name) || isset($city_id)) {
24       if (isset($city_id)) $city = get_city_by_id($city_id);
25       else if ($city_name) $city = get_city_by_name($city_name);
26       if ($city) {
27         echo "<p>Areas in " . $city->getLink(get_city_displayname($city)) . ":";
28         $q = new AreaQuery;
29         $areas = $q->filterByCityId($city_id)->find();
30
31         if (count($areas)) {
32           foreach ($areas as $area) {
33             echo "<br>\nArea: " . $area->getStrongLink() . "\n";
34             $n = urlencode($area->getName());
35             $i = $area->getId();
36             echo " " . get_small_link("Contacts", "/contact/in/area/%s/%d", $n, $i);
37             echo " " . get_small_link("Donations", "/donation/in/area/%s/%d", $n, $i);
38             echo " " . get_small_link("Orders", "/order/in/area/%s/%d", $n, $i);
39             if (check_admin(1)) {
40               echo " " . $area->getDeleteLink();
41             }
42           }
43         }
44         else echo " none";
45         echo "</p>\n";
46       }
47       else echo "<p>No such city!</p>\n";
48     }
49   }
50
51   function show_area_cities_form($city_id = null) {
52     $q = new CityQuery;
53     $cities = $q->find();
54     if (! count($cities)) {
55       echo "<p>No <a href=\"/city\">cities</a>!</p>\n";
56       return;
57     }
58
59     $candidates = array();
60     foreach ($cities as $city) {
61       if (! count(get_city_areas($city->getId()))) continue;
62       $candidates[] = $city;
63     }
64     if (! count($candidates)) return;
65
66     form("noprint standout");
67     echo "<p>Show areas in\n";
68     echo "<select name=\"city_id\">\n";
69     foreach ($candidates as $city) {
70       option("city_id", $city->getId(), get_city_displayname($city));
71     }
72     echo "</select>\n";
73     echo "<input type=\"submit\" value=\"Show\">\n";
74     end_form();
75   }
76
77   function show_new_area_form($city_id = null) {
78     if (! check_admin(1)) return;
79
80     $q = new CityQuery;
81     $cities = $q->find();
82     if (! count($cities)) {
83       echo "<p>No <a href=\"/city\">cities</a>!</p>\n";
84       return;
85     }
86
87     form("noprint standout");
88     echo "<p>Add a new area <input name=\"area_name\">\n";
89     echo "in <select name=\"city_id\">\n";
90
91     foreach ($cities as $city) {
92       option("city_id", $city->getId(), get_city_displayname($city));
93     }
94     echo "</select>\n";
95     echo "<input type=\"submit\" value=\"Add\">\n";
96     end_form();
97   }
98
99   function add_area($name, $city_id) {
100     if (! check_admin(1, "add an area")) return;
101
102     $name = urldecode($name);
103     $area = get_area_by_name($name, false);
104     if ($area) {
105       echo "<p>$name already exists!</p>\n";
106       show_area($name);
107       return false;
108     }
109
110     $city = get_city_by_id($city_id);
111     if (! $city) {
112       echo "<p>Not a valid city!</p>\n";
113       return false;
114     }
115
116     $area = new Area;
117     $area->setName($name);
118     $area->setCityId($city_id);
119
120     try {
121       $area->save();
122     }
123     catch (Exception $e) {
124       echo "<p>Error adding $name!</p>\n";
125       /* XXX: Why? */
126       return false;
127     }
128
129     return $area->getId();
130   }
131
132   function show_area_delivery_days_form($days) {
133     global $week;
134     echo "Delivery days:";
135     if (check_admin(1)) {
136       for ($i = 0; $i < count($week); $i++) {
137         echo " <input type=\"checkbox\" id=\"day_$i\" name=\"day_$i\"";
138         if ($days & (1 << $i)) echo " checked";
139         echo "><label for=\"day_$i\">$week[$i]</label>\n";
140       }
141     }
142     else {
143       if (! $days) echo " none";
144       else {
145         for ($i = 0; $i < count($week); $i++) {
146           if ($days & (1 << $i)) echo " $week[$i]";
147         }
148       }
149     }
150   }
151
152   function update_area_delivery_days($name) {
153     global $week;
154
155     if (! check_admin(1, "edit an area")) return false;
156
157     $days = 0;
158     for ($i = 0; $i < count($week); $i++) {
159       if ($_POST['day_' . $i] == "on") $days |= (1 << $i);
160     }
161
162     $area = get_area_by_name($name);
163     if (! $area) return false;
164
165     $area->setDays($days);
166
167     try {
168       $area->save();
169     }
170     catch (Exception $e) {
171       echo "<p>Error updating area!</p>\n";
172       return false;
173     }
174
175     echo "<p>Updated area.</p>\n";
176     return true;
177   }
178
179   function confirm_delete_area($name, $id = null, &$city_id = null) {
180     if (! check_admin(1, "delete an area")) return;
181
182     if (isset($id)) $area = get_area_by_id($id);
183     else $area = get_area_by_name($name);
184     if (! $area) return false;
185
186     echo "<h3>Confirm deletion</h3>\n";
187     echo "<p>You must confirm deletion of area " . $area->getName() . ": " . $area->getDeleteLink(true) . "</p>\n";
188   }
189
190   function delete_area($name, $id = null, &$city_id = null) {
191     if (! check_admin(1, "delete an area")) return;
192
193     if (isset($id)) $area = get_area_by_id($id);
194     else $area = get_area_by_name($name);
195     if (! $area) return false;
196
197     /* Remember city ID for dropdown. */
198     $city_id = $area->getCityId();
199
200     try {
201       $area->delete();
202       echo "<p>Deleted area.</p>\n";
203     }
204     catch (Exception $e) {
205       echo "<p>Error deleting $name!</p>\n";
206       /* XXX: Why? Check for addresses in use... */
207       return false;
208     }
209
210     return true;
211   }
212
213   function show_area($name, &$city_id = null) {
214     $area = get_area_by_name($name);
215     if (! $area) return;
216
217     form();
218     echo "<p>Area: <span class=\"strong\">" . $area->getName() . "</span>";
219     $n = $area->getName();
220     $i = $area->getId();
221     echo " " . get_small_link("Contacts", "/contact/in/area/%s/%d", $n, $i);
222     echo " " . get_small_link("Donations", "/donation/in/area/%s/%d", $n, $i);
223     echo " " . get_small_link("Orders", "/order/in/area/%s/%d", $n, $i);
224     if (check_admin(1)) {
225       echo " " . $area->getDeleteLink();
226     }
227     $city = get_city_by_id($area->getCityId());
228     if ($city) {
229       /* Remember city ID for dropdown. */
230       $city_id = $city->getId();
231       echo " in " . $city->getLink(get_city_displayname($city));
232     }
233     echo ": ";
234     echo "\n<br>";
235     show_area_delivery_days_form($area->getDays());
236     if (check_admin(1)) {
237       echo "<input type=\"submit\" name=\"update_area\" value=\"Update\">\n";
238     }
239     echo "</p>\n";
240     end_form();
241   }
242
243   /* /area/in/Cambridge/1 */
244   if (count($parameters)) {
245     if ($parameters[0] == "in") {
246       if ($parameters[1] == "city") {
247         $city_id = $parameters[3];
248         show_areas(0, 10, $parameters[2], $city_id);
249         show_new_area_form($city_id);
250       }
251     }
252   }
253   list($name, $id, $args) = parse_parameters($parameters);
254   //echo "<p>$name($id) " . print_r($args, true) . "</p>\n";
255   if (count($args)) {
256     switch ($args[0]) {
257       case "delete":
258         confirm_delete_area($name, $id, $city_id);
259       break;
260
261       case "confirmdelete":
262         delete_area($name, $id, $city_id);
263       break;
264     }
265   }
266   else if (isset($name)) show_area($name, $city_id);
267   else {
268     show_area_cities_form($city_id);
269     show_new_area_form($city_id);
270   }
271
272   if (count($parameters))
273     show_area_cities_form($city_id);
274 ?>