1 <?php
2
3 class BookingAdminPage extends Page {
4
5 static $months = array(
6 1 => 'Январь',
7 2 => 'Февраль',
8 3 => 'Март',
9 4 => 'Апрель',
10 5 => 'Май',
11 6 => 'Июнь',
12 7 => 'Июль',
13 8 => 'Август',
14 9 => 'Сентябрь',
15 10 => 'Октябрь',
16 11 => 'Ноябрь',
17 12 => 'Декабрь',
18 );
19
20 static $week_days = array(
21 1 => 'пн',
22 2 => 'вт',
23 3 => 'ср',
24 4 => 'чт',
25 5 => 'пт',
26 6 => 'сб',
27 7 => 'вс',
28 );
29
30 static function get_default_dates() {
31 return array(
32 'StartDate' => date('d.m.Y'),
33 'EndDate' => date('d.m.Y', strtotime('+30 day')),
34 );
35 }
36
37 static function find_links($action="") {
38 if ($page = DataObject::get_one('BookingAdminPage')) {
39 return $page->Link($action);
40 }
41 return false;
42 }
43
44 function MonthData($date=false) {
45 if (!$date) {
46 $date = self::get_default_dates();
47 }
48 $rs = new DataObjectSet();
49 if ($rooms = DataObject::get('Room')) {
50 foreach($rooms as $room) {
51 $daysData = self::room_calendar($date, $room);
52 $roomsData = new DataObjectSet();
53 foreach($daysData->Days as $day) {
54 $count = RoomOrder::available_rooms_count($room->ID, $day->{'Date'}, $day->{'Date'});
55 $day->FreeCount = $count;
56 $roomsData->push($day);
57 }
58
59 $rates = new DataObjectSet();
60 foreach($room->Rates() as $rate) {
61 $days = new DataObjectSet();
62 foreach($daysData->Days as $day) {
63 $dday = clone $day;
64 $dday->RatePrice = $rate->getOneDayRoomPrice(strtotime($day->{'Date'}));
65 $dday->OrderLink = $this->OrderRoomLink() . "?StartDate=" . $day->{'Date'} . "&RateID={$rate->ID}";
66 $dday->Rate = $rate;
67 $days->push($dday);
68 }
69 $rate->Days = $days;
70 $rates->push($rate);
71 }
72 $daysData->Days = $roomsData;
73 $room->RoomUseData = $daysData;
74 $room->RatesData = $rates;
75 $rs->push($room);
76 }
77 }
78 return $rs;
79 }
80
81 static function room_calendar($date, $room) {
82 if (is_array($date) && isset($date['StartDate']) && isset($date['EndDate'])) {
83 $startDate = date('Y-m-d', strtotime($date['StartDate']));
84 $endDate = date('Y-m-d', strtotime($date['EndDate']));
85 } else {
86 list($year, $month) = explode('_', $date);
87 $year = (int)$year;
88 $month = (int)$month;
89 $startDate = "{$year}-{$month}-01";
90 $endDate = "{$year}-{$month}-" . date("t", strtotime($startDate));
91 }
92
93 $days = new DataObjectSet();
94
95 $startDay = 0;
96 $monthDay = 1;
97 $f = true;
98 $first = true;
99 while ($f) {
100 $currDate = date("Y-m-d", strtotime("{$startDay} days", strtotime($startDate)));
101 $days_of_month = date("t", strtotime($currDate));
102 $nextDate = date("Y-m-d", strtotime(($startDay+1) . " days", strtotime($startDate)));
103 $days->push(new ArrayData(array(
104 'Date' => $currDate,
105 'NextDate' => $nextDate,
106 'Day' => date('d', strtotime($currDate)),
107 'FirstDay' => ((date('j', strtotime($currDate)) == 1) || $first) ? true : false,
108 'LastDay' => (date('j', strtotime($currDate)) == $days_of_month) ? true : false,
109 'MonthDays' => ((date('j', strtotime($currDate)) == 1) || $first) ? ($days_of_month - date('j', strtotime($currDate)) + 1) : false,
110 'DayOfWeek' => self::$week_days[date('N', strtotime($currDate))],
111 'Month' => self::$months[date('n', strtotime($currDate))],
112 'Year' => date('Y', strtotime($currDate)),
113 'IsWeekend' => (date('N', strtotime($currDate)) > 5) ? true : false,
114 'IsCurrentMonth' => (date('m', strtotime($currDate)) == $month) ? true : false,
115 'DayActivityLink' => self::find_links('date_activity') . "?Date={$currDate}",
116 )));
117
118 $monthDay++;
119 if ((date('j', strtotime($currDate)) == 1)) {
120 $monthDay = 0;
121 }
122 $startDay++;
123 if ($nextDate > $endDate) {
124 $f = false;
125 }
126 $first = false;
127 }
128 $nextDate = date('Y_m', strtotime("+1 month", strtotime($startDate)));
129 $prevDate = date('Y_m', strtotime("-1 month", strtotime($startDate)));
130 return new ArrayData(array(
131 'Days' => $days,
132 'Month' => self::$months[$month],
133 'Year' => $year,
134 'PrevDate' => $prevDate,
135 'NextDate' => $nextDate,
136 ));
137 }
138
139 function CalendarLink() {
140 return $this->Link('calendar');
141 }
142
143 function OrderRoomLink() {
144 return $this->Link('order_room');
145 }
146
147 function OrderStatuses() {
148 $statuses = BookingOrder::LocalStatuses();
149 unset($statuses['Basket']);
150 $rs = new DataObjectSet();
151 foreach($statuses as $status => $title) {
152 $rs->push(new ArrayData(array(
153 'Status' => $status,
154 'Title' => $title,
155 )));
156 }
157 return $rs;
158 }
159 }
160
161 class BookingAdminPage_Controller extends Page_Controller {
162
163 function calendar($request) {
164 $data = false;
165 if (isset($_GET['StartDate']) && trim($_GET['StartDate']) && ($startDate = date('Y-m-d', strtotime($_GET['StartDate'])))) {
166 if (isset($_GET['EndDate']) && trim($_GET['EndDate']) && ($endDate = date('Y-m-d', strtotime($_GET['EndDate'])))) {
167 $data = $this->MonthData(array('StartDate' => $startDate, 'EndDate' => $endDate));
168 }
169 }
170 if (!$data) {
171 $data = $this->MonthData();
172 }
173 return $this->customise(array('MonthData' => $data));
174 }
175
176 function DateFilterForm() {
177 $fields = new FieldSet();
178 $fields->push(new DateField('StartDate', _t("DateFilterForm.StartDate")));
179 $fields->push(new DateField('EndDate', _t("DateFilterForm.EndDate")));
180
181 $form = new Form(
182 $this,
183 'DateFilterForm',
184 $fields,
185 new FieldSet(new FormAction('doFilterDates', _t("DateFilterForm.FilterDates")))
186 );
187 if (isset($_GET['StartDate']) || isset($_GET['EndDate'])) {
188 $form->loadDataFrom($_GET);
189 } else {
190 $dates = BookingAdminPage::get_default_dates();
191 $form->loadDataFrom($dates);
192 }
193 return $form;
194 }
195
196 function doFilterDates($data, $form) {
197 $url = $this->Link('calendar') . "?";
198 if (isset($data['StartDate']) && trim($data['StartDate']) && ($startDate = date('Y-m-d', strtotime($data['StartDate'])))) {
199 $url .= "StartDate={$startDate}&";
200 }
201 if (isset($data['EndDate']) && trim($data['EndDate']) && ($endDate = date('Y-m-d', strtotime($data['EndDate'])))) {
202 $url .= "EndDate={$endDate}";
203 }
204 return $this->redirect($url);
205 }
206
207 function order_room() {
208 if (!isset($_GET['StartDate']) || !isset($_GET['RateID'])) {
209 return $this->redirectBack();
210 }
211 $startDate = date('Y-m-d', strtotime($_GET['StartDate']));
212
213 $rate = DataObject::get_by_id('RoomRate', (int)$_GET['RateID']);
214 if (!$rate) {
215 return $this->redirectBack();
216 }
217
218 if (isset($_GET['EndDate'])) {
219 $endDate = date('Y-m-d', strtotime($_GET['EndDate']));
220 } else {
221 $endDate = date('Y-m-d', strtotime("+1 day", strtotime($startDate)));
222 }
223
224 $currDate = $startDate;
225 $hasEmptyDays = false;
226 while(strtotime($currDate) < strtotime($endDate)) {
227 $count = RoomOrder::available_rooms_count($rate->RoomID, $currDate, $currDate);
228 if (!$count) {
229 $hasEmptyDays = true;
230 break;
231 }
232 $currDate = date('Y-m-d', strtotime("+1 day", strtotime($currDate)));
233 }
234 if ($hasEmptyDays) {
235 return $this->redirect($this->Link());
236 }
237
238 Session::set('BookingFilter', array(
239 'FilterStartDate' => date('d.m.Y', strtotime($startDate)),
240 'FilterEndDate' => date('d.m.Y', strtotime($endDate))
241 ));
242
243 $data = array();
244 $data['dateArrival'] = $startDate;
245 $data['dateDeparture'] = $endDate;
246 $data['roomsList'] = array();
247
248 $data['roomsList'][0]['rate-id'] = $rate->ID;
249 $data['roomsList'][0]['room-id'] = $rate->RoomID;
250 if ($rate->AdditionalPlaceCount) {
251 $data['roomsList'][0]['additional-count'] = $rate->AdditionalPlaceCount;
252 }
253
254 $order = new BookingOrder();
255 $order->Status = 'Basket';
256 $order->write();
257 $order->saveOrderData($data);
258
259 if ($bookingLink = BookingPage::find_links('services?RateID=' . $rate->ID)) {
260 $this->redirect($bookingLink);
261 return;
262 }
263 return $this->redirectBack();
264 }
265
266 function () {
267 $menu = new DataObjectSet();
268
269 $date = '';
270 if (isset($_GET['Date']) && strtotime($_GET['Date'])) {
271 $date = "&Date=" . date('d.m.Y', strtotime($_GET['Date']));
272 }
273
274 $item = new ArrayData(array(
275 'Type' => 'InOrders',
276 'Link' => $this->Link('date_activity') . "?Type=InOrders{$date}",
277 'Title' => _t('ActivityMenu.InOrdersTitle'),
278 'Current' => (!isset($_GET['Type']) || ($_GET['Type'] == 'InOrders')) ? 1 : 0,
279 ));
280 $menu->push($item);
281
282 $item = new ArrayData(array(
283 'Type' => 'OutOrders',
284 'Link' => $this->Link('date_activity') . "?Type=OutOrders{$date}",
285 'Title' => _t('ActivityMenu.OutOrdersTitle'),
286 'Current' => (isset($_GET['Type']) && ($_GET['Type'] == 'OutOrders')) ? 1 : 0,
287 ));
288 $menu->push($item);
289
290 $item = new ArrayData(array(
291 'Type' => 'CurrentOrders',
292 'Link' => $this->Link('date_activity') . "?Type=CurrentOrders{$date}",
293 'Title' => _t('ActivityMenu.CurrentOrdersTitle'),
294 'Current' => (isset($_GET['Type']) && ($_GET['Type'] == 'CurrentOrders')) ? 1 : 0,
295 ));
296 $menu->push($item);
297
298 return $menu;
299 }
300
301 function date_activity() {
302 if (isset($_GET['Date'])) {
303 $date = date('Y-m-d', strtotime($_GET['Date']));
304 } else {
305 $date = date('Y-m-d');
306 }
307
308 if (isset($_GET['Type']) && in_array($_GET['Type'], array('InOrders', 'OutOrders', 'CurrentOrders'))) {
309 $type = $_GET['Type'];
310 } else {
311 $type = 'InOrders';
312 }
313
314 switch($type) {
315 case 'InOrders':
316 $orders = DataObject::get('BookingOrder', "StartDate = '{$date}' AND Status IN('".implode("', '", BookingOrder::$accounted_statuses)."')");
317 break;
318 case 'OutOrders':
319 $orders = DataObject::get('BookingOrder', "EndDate = '{$date}' AND Status IN('".implode("', '", BookingOrder::$accounted_statuses)."')");
320 break;
321 case 'CurrentOrders':
322 $orders = DataObject::get('BookingOrder', "StartDate < '{$date}' AND EndDate > '{$date}' AND Status IN('".implode("', '", BookingOrder::$accounted_statuses)."')");
323 break;
324 }
325
326 return $this->customise(array(
327 'Date' => $date,
328 'OrdersList' => $orders,
329 ));
330 }
331
332 function ActivityFilterForm() {
333 $fields = new FieldSet();
334 $fields->push(new DateField('Date', _t('ActivityFilterForm.Date')));
335 $fields->push(new HiddenField('Type'));
336 $form = new Form(
337 $this,
338 'ActivityFilterForm',
339 $fields,
340 new FieldSet(new FormAction('doFilterActivities', _t('ActivityFilterForm.FilterActivities')))
341 );
342 $form->loadDataFrom($_GET);
343 if (!isset($_GET['Date'])) {
344 $form->loadDataFrom(array('Date' => date('d.m.Y')));
345 }
346 if (!isset($_GET['Type'])) {
347 $form->loadDataFrom(array('Type' => 'InOrders'));
348 }
349 return $form;
350 }
351
352 function doFilterActivities($data, $form) {
353 if (!isset($data['Date']) || !($date = date('d.m.Y', strtotime($data['Date'])))) {
354 $date = date('d.m.Y');
355 }
356 if (isset($data['Type']) && in_array($data['Type'], array('InOrders', 'OutOrders', 'CurrentOrders'))) {
357 $type = $data['Type'];
358 } else {
359 $type = 'InOrders';
360 }
361 return $this->redirect($this->Link('date_activity') . "?Date={$date}&Type={$type}");
362 }
363
364 function () {
365 $menu = new DataObjectSet();
366
367 $item = new ArrayData(array(
368 'Type' => 'NewOrders',
369 'Link' => $this->Link('orders') . "?Type=NewOrders",
370 'Title' => _t('OrdersMenu.NewOrdersTitle'),
371 'Current' => (!isset($_GET['Type']) || ($_GET['Type'] == 'NewOrders')) ? 1 : 0,
372 ));
373 $menu->push($item);
374
375 $item = new ArrayData(array(
376 'Type' => 'QueryOrders',
377 'Link' => $this->Link('orders') . "?Type=QueryOrders",
378 'Title' => _t('OrdersMenu.QueryOrdersTitle'),
379 'Current' => (isset($_GET['Type']) && ($_GET['Type'] == 'QueryOrders')) ? 1 : 0,
380 ));
381 $menu->push($item);
382
383 $item = new ArrayData(array(
384 'Type' => 'PayedOrders',
385 'Link' => $this->Link('orders') . "?Type=PayedOrders",
386 'Title' => _t('OrdersMenu.PayedOrdersTitle'),
387 'Current' => (isset($_GET['Type']) && ($_GET['Type'] == 'PayedOrders')) ? 1 : 0,
388 ));
389 $menu->push($item);
390
391 return $menu;
392 }
393
394 function orders() {
395 if (isset($_GET['Type']) && in_array($_GET['Type'], array('NewOrders', 'QueryOrders', 'PayedOrders'))) {
396 $type = $_GET['Type'];
397 } else {
398 $type = 'NewOrders';
399 }
400
401 $start = 0;
402 if (isset($_GET['start'])) {
403 $start = (int)$_GET['start'];
404 }
405 $count = 20;
406 switch($type) {
407 case 'NewOrders':
408 $orders = DataObject::get('BookingOrder', "Status = 'New'", 'ID DESC', '', "{$start},{$count}");
409 break;
410 case 'QueryOrders':
411 $orders = DataObject::get('BookingOrder', "Status = 'Query'", 'ID DESC', '', "{$start},{$count}");
412 break;
413 case 'PayedOrders':
414 $orders = DataObject::get('BookingOrder', "Status = 'Paid'", 'ID DESC', '', "{$start},{$count}");
415 break;
416 }
417 return $this->customise(array(
418 'OrdersList' => $orders,
419 ));
420 }
421
422 function change_order_status() {
423 $rs = 0;
424 if (isset($_GET['OrderID']) && ($order = DataObject::get_by_id('BookingOrder', (int)$_GET['OrderID']))) {
425 if (isset($_GET['Status']) && in_array($_GET['Status'], $order->dbObject('Status')->enumValues())) {
426 $order->Status = $_GET['Status'];
427 $order->write();
428 $rs = 1;
429 }
430 }
431 if ($this->isAjax()) {
432 return json_encode(array('rs' => $rs));
433 }
434 return $this->redirectBack();
435 }
436 }
437
[Raise a SilverStripe Framework issue/bug](https://github.com/silverstripe/silverstripe-framework/issues/new)
- [Raise a SilverStripe CMS issue/bug](https://github.com/silverstripe/silverstripe-cms/issues/new)
- Please use the
Silverstripe Forums to ask development related questions.
-