escape($force).'") '; } $q = ' select community.* from community left join community_ip on community_ip.id_community=community.id_community where community.active=1 AND ( ( community.private=0 ) OR (community.private=1 AND community_ip.ip="'.c::db()->escape($ip).'") '.$forceq.' ) group by community.id_community order by name '; return self::q($q); } public function restaurantByLoc() { if (!isset($this->_restaurantsByLoc)) { $this->_restaurantsByLoc = Restaurant::byRange([ 'lat' => $this->loc_lat, 'lon' => $this->loc_lon, 'range' => $this->range, ]); } return $this->_restaurantsByLoc; } /** * Returns all the restaurants that belong to this Community * * @return Cana_Iterator * * @todo probably not required to sort them as the front end sorts them */ public function restaurants() { if (!isset($this->_restaurants)) { $this->_restaurants = Restaurant::q(' SELECT restaurant.* , restaurant_community.sort FROM restaurant left join restaurant_community using(id_restaurant) WHERE id_community="'.$this->id_community.'" and restaurant.active=1 ORDER by restaurant_community.sort, restaurant.delivery DESC '); /* $this->_restaurants->sort([ 'function' => 'open' ]); */ } return $this->_restaurants; } /** * Returns all data related to this Community * * @return array * * @see Cana_Table::exports() */ public function exports() { $out = $this->properties(); $out[ 'name_alt' ] = $this->name_alt(); $out[ 'prep' ] = $this->prep(); $out[ 'active' ] = intval( $out[ 'active' ] ); $out[ 'private' ] = intval( $out[ 'private' ] ); $out[ 'image' ] = intval( $out[ 'image' ] ); $out[ 'close_all_restaurants' ] = intval( $out[ 'close_all_restaurants' ] ); $out[ 'close_3rd_party_delivery_restaurants' ] = intval( $out[ 'close_3rd_party_delivery_restaurants' ] ); $out[ 'auto_close' ] = intval( $out[ 'auto_close' ] ); if( $out[ 'close_all_restaurants_id_admin' ] ){ $admin = Admin::o( $out[ 'close_all_restaurants_id_admin' ] ); $out[ 'close_all_restaurants_admin' ] = $admin->name; $date = new DateTime( $out[ 'close_all_restaurants_date' ], new DateTimeZone( c::config()->timezone ) ); $out[ 'close_all_restaurants_date' ] = $date->format( 'M jS Y g:i:s A T' ); } if( $out[ 'close_3rd_party_delivery_restaurants_id_admin' ] ){ $admin = Admin::o( $out[ 'close_3rd_party_delivery_restaurants_id_admin' ] ); $out[ 'close_3rd_party_delivery_restaurants_admin' ] = $admin->name; $date = new DateTime( $out[ 'close_3rd_party_delivery_restaurants_date' ], new DateTimeZone( c::config()->timezone ) ); $out[ 'close_3rd_party_delivery_restaurants_date' ] = $date->format( 'M jS Y g:i:s A T' ); } $next_sort = Crunchbutton_Community_Alias::q( 'SELECT MAX(sort) AS sort FROM community_alias WHERE id_community = ' . $this->id_community ); if( $next_sort->sort ){ $sort = $next_sort->sort + 1; } else { $sort = 1; } $out['next_sort'] = $sort; foreach ($this->restaurants() as $restaurant) { $out['_restaurants'][$restaurant->id_restaurant.' '] = $restaurant->exports(); } return $out; } public function allRestaurantsClosed(){ if( $this->close_all_restaurants > 0 ){ return $this->close_all_restaurants_note; } return false; } public function allThirdPartyDeliveryRestaurantsClosed(){ if( $this->close_3rd_party_delivery_restaurants > 0 ){ return $this->close_3rd_party_delivery_restaurants_note; } return false; } public static function permalink($permalink) { return self::q('select * from community where permalink="'.$permalink.'"')->get(0); } public static function all_locations(){ $res = Cana::db()->query( 'SELECT c.id_community, c.loc_lat, c.loc_lon, c.range FROM community c' ); $locations = array(); while ( $row = $res->fetch() ) { $locations[ $row->id_community ] = array( 'loc_lat' => $row->loc_lat, 'loc_lon' => $row->loc_lon, 'range' => $row->range ); } return $locations; } public function name_alt(){ $alias = Community_Alias::alias( $this->permalink ); if( !$alias ){ $alias = Community_Alias::community( $this->id_community ); } if( $alias ){ return $alias[ 'name_alt' ]; } return $this->name_alt; } public function aliases(){ if( !$this->_aliases ){ $this->_aliases = Crunchbutton_Community_Alias::q( 'SELECT * FROM community_alias WHERE id_community = ' . $this->id_community . ' ORDER BY alias ASC' ); } return $this->_aliases; } public function prep(){ $alias = Community_Alias::alias( $this->permalink ); if( !$alias ){ $alias = Community_Alias::community( $this->id_community ); } if( $alias ){ return $alias[ 'prep' ]; } return $this->prep; } public function __construct($id = null) { parent::__construct(); $this ->table('community') ->idVar('id_community') ->load($id); } function groupOfDrivers(){ if (!isset($this->_groupOfDrivers)) { $group = Crunchbutton_Group::byName($this->driverGroup()); if (!$group->id_group) { $group = Crunchbutton_Group::createDriverGroup($this->driverGroup(), $this->name); } $this->_groupOfDrivers = $group; } return $this->_groupOfDrivers; } function groupOfMarketingReps(){ if (!isset($this->_groupOfMarketingReps)) { $group = Crunchbutton_Group::q( 'SELECT * FROM `group` WHERE id_community = "' . $this->id_community . '" AND type = "' . Crunchbutton_Group::TYPE_MARKETING_REP . '" ORDER BY id_group DESC LIMIT 1 ' ); if (!$group->id_group) { $group = Crunchbutton_Group::createMarketingRepGroup( $this->id_community ); } $this->_groupOfMarketingReps = $group; } return $this->_groupOfMarketingReps; } public function communityByDriverGroup( $group ){ return Crunchbutton_Community::q( 'SELECT * FROM community WHERE driver_group = "' . $group . '"' ); } public function active(){ return Crunchbutton_Community::q( 'SELECT * FROM community WHERE active = 1 ORDER BY name ASC' ); } public function getDriversOfCommunity(){ $group = $this->driverGroup(); $query = 'SELECT a.* FROM admin a INNER JOIN ( SELECT DISTINCT(id_admin) FROM ( SELECT DISTINCT(a.id_admin) FROM admin a INNER JOIN notification n ON n.id_admin = a.id_admin AND n.active = 1 LEFT JOIN admin_notification an ON a.id_admin = an.id_admin AND an.active = 1 INNER JOIN restaurant r ON r.id_restaurant = n.id_restaurant INNER JOIN restaurant_community c ON c.id_restaurant = r.id_restaurant AND c.id_community = ' . $this->id_community . ' UNION SELECT DISTINCT(a.id_admin) FROM admin a INNER JOIN admin_group ag ON ag.id_admin = a.id_admin INNER JOIN `group` g ON g.id_group = ag.id_group AND g.name = "' . $group . '" ) drivers ) drivers ON drivers.id_admin = a.id_admin AND a.active = 1 ORDER BY name ASC'; return Admin::q( $query ); } public function slug(){ return str_replace( ' ' , '-', strtolower( $this->name ) ); } public function totalUsersByCommunity(){ $chart = new Crunchbutton_Chart_User(); $total = $chart->totalUsersByCommunity( $this->id_community ); $all = $chart->totalUsersAll(); $percent = intval( $total * 100 / $all ); return [ 'community' => $total, 'all' => $all, 'percent' => $percent ]; } public function totalOrdersByCommunity(){ $chart = new Crunchbutton_Chart_Order(); $total = $chart->totalOrdersByCommunity( $this->id_community ); $all = $chart->totalOrdersAll(); $percent = intval( $total * 100 / $all ); return [ 'community' => $total, 'all' => $all, 'percent' => $percent ]; } public function newUsersLastWeek(){ $chart = new Crunchbutton_Chart_User(); $now = new DateTime( 'now', new DateTimeZone( c::config()->timezone ) ); $now->modify( '-1 day' ); $chart->dayTo = $now->format( 'Y-m-d' ); $now->modify( '-6 days' ); $chart->dayFrom = $now->format( 'Y-m-d' ); $chart->justGetTheData = true; $orders = $chart->newByDayByCommunity( false, $this->slug() ); $now->modify( '+6 day' ); $_orders = []; // fill empty spaces for( $i = 0; $i <= 6 ; $i++ ){ $_orders[ $now->format( 'Y-m-d' ) ] = ( $orders[ $now->format( 'Y-m-d' ) ] ? $orders[ $now->format( 'Y-m-d' ) ] : '0' ); $now->modify( '-1 day' ); } $total = 0; $week = []; foreach( $_orders as $day => $value ){ $total += $value; $week[] = $value; } return [ 'total' => $total, 'week' => join( ',', $week ) ]; } public function getOrdersFromLastDaysByCommunity( $days = 14 ){ $query = "SELECT SUM(1) orders, DATE_FORMAT( o.date, '%m/%d/%Y' ) day FROM `order` o INNER JOIN restaurant r ON r.id_restaurant = o.id_restaurant INNER JOIN restaurant_community rc ON r.id_restaurant = rc.id_restaurant AND rc.id_community = '{$this->id_community}' WHERE o.date > DATE_SUB(CURDATE(), INTERVAL $days DAY) AND o.name NOT LIKE '%test%' GROUP BY day ORDER BY o.date ASC"; return c::db()->get( $query ); } public function ordersLastWeek(){ $chart = new Crunchbutton_Chart_Order(); $now = new DateTime( 'now', new DateTimeZone( c::config()->timezone ) ); $now->modify( '-1 day' ); $chart->dayTo = $now->format( 'Y-m-d' ); $now->modify( '-6 days' ); $chart->dayFrom = $now->format( 'Y-m-d' ); $chart->justGetTheData = true; $orders = $chart->byDayPerCommunity( false, $this->slug() ); $now->modify( '+6 day' ); $_orders = []; // fill empty spaces for( $i = 0; $i <= 6 ; $i++ ){ $_orders[ $now->format( 'Y-m-d' ) ] = ( $orders[ $now->format( 'Y-m-d' ) ] ? $orders[ $now->format( 'Y-m-d' ) ] : '0' ); $now->modify( '-1 day' ); } $total = 0; $week = []; foreach( $_orders as $day => $value ){ $total += $value; $week[] = $value; } return [ 'total' => $total, 'week' => join( ',', $week ) ]; } public function getRestaurants(){ return Restaurant::q( 'SELECT * FROM restaurant r INNER JOIN restaurant_community rc ON rc.id_restaurant = r.id_restaurant AND rc.id_community = ' . $this->id_community . ' ORDER BY r.name' ); } public function driverDeliveryHere( $id_admin ){ $group = $this->groupOfDrivers(); if( $group->id_group ){ $admin_group = Crunchbutton_Admin_Group::q( "SELECT * FROM admin_group ag WHERE ag.id_group = {$group->id_group} AND ag.id_admin = {$id_admin} LIMIT 1" ); if( $admin_group->id_admin_group ){ return true; } return false; } else { return false; } return false; } public function driverGroup(){ if( !$this->driver_group ){ $this->driver_group = Crunchbutton_Group::driverGroupOfCommunity( $this->name ); $this->save(); } return $this->driver_group; } public function marketingRepGroup(){ if( !$this->_marketing_rep_group ){ $this->_marketing_rep_group = Crunchbutton_Group::marketingRepGroupOfCommunity( $this->id_community ); } return $this->_marketing_rep_group; } /** * Returns the Testing community * * @return Crunchbutton_Community */ public function getTest(){ $row = $this->q('SELECT * FROM community WHERE name="Testing" ')->current(); return $row; } public function totalDriversByCommunity(){ $drivers = $this->getDriversOfCommunity(); $total = $drivers->count(); $drivers = Admin::drivers(); $all = $drivers->count(); $percent = intval( $total * 100 / $all ); return [ 'community' => $total, 'all' => $all, 'percent' => $percent ]; } public function hasShiftThisWeek(){ $now = new DateTime( 'now', new DateTimeZone( c::config()->timezone ) ); if( $now->format( 'l' ) == 'Sunday' ){ $day = $now; } else { $day = new DateTime( 'last sunday', new DateTimeZone( c::config()->timezone ) ); } $from = $day->format( 'Y-m-d' ); $day->modify( '+6 days' ); $to = $day->format( 'Y-m-d' ); $shifts = Crunchbutton_Community_Shift::q( 'SELECT COUNT(*) AS shifts FROM community_shift cs WHERE DATE_FORMAT( cs.date_start, "%Y-%m-%d" ) >= "' . $from . '" AND DATE_FORMAT( cs.date_end, "%Y-%m-%d" ) <= "' . $to . '" AND id_community = "' . $this->id_community . '" ORDER BY cs.date_start ASC' ); return ( $shifts->shifts > 0 ); } public function hasShiftByPeriod( $from = false, $to = false ){ return Crunchbutton_Community_Shift::shiftsByCommunityPeriod( $this->id_community, $from, $to ); } public function totalRestaurantsByCommunity(){ $query = "SELECT COUNT(*) AS Total FROM restaurant r INNER JOIN restaurant_community rc ON rc.id_restaurant = r.id_restaurant AND rc.id_community = {$this->id_community}"; $result = c::db()->get( $query ); $total = $result->_items[0]->Total; $query = "SELECT COUNT(*) AS Total FROM restaurant WHERE active = 1 AND name NOT LIKE '%test%'"; $result = c::db()->get( $query ); $all = $result->_items[0]->Total; $percent = intval( $total * 100 / $all ); return [ 'community' => $total, 'all' => $all, 'percent' => $percent ]; } public function closedSince(){ $force_closed_times = Crunchbutton_Community_Changeset::q( 'SELECT ccs.*, cc.field FROM community_change cc INNER JOIN community_change_set ccs ON ccs.id_community_change_set = cc.id_community_change_set AND id_community = "' . $this->id_community . '" AND ( cc.field = "close_all_restaurants" OR cc.field = "close_3rd_party_delivery_restaurants" ) AND cc.new_value = 1 ORDER BY cc.id_community_change DESC' ); $out = []; if( $force_closed_times->count() ){ foreach( $force_closed_times as $force_close ){ $output = []; $closed_at = $force_close->date(); $output[ 'closed_at' ] = $closed_at->format( 'M jS Y g:i:s A T' ); $closed_by = $force_close->admin()->name; if( !$closed_by ){ // it probably was closed by auto shutdown $closed_by = Admin::login( Crunchbutton_Community::AUTO_SHUTDOWN_COMMUNITY_LOGIN )->name; } $output[ 'closed_by' ] = $closed_by; if( $force_close->field == 'close_all_restaurants' ){ $output[ 'type' ] = 'Close All Restaurants'; } else if ( $force_close->field == 'close_3rd_party_delivery_restaurants' ){ $output[ 'type' ] = 'Close 3rd Party Delivery Restaurants'; } $output[ 'note' ] = $this->_closedNote( $force_close->id_community_change_set, $force_close->field ); $open = $this->_openedAt( $force_close->id_community_change_set, $force_close->field ); if( !$open ){ $now = new DateTime( 'now', new DateTimeZone( c::config()->timezone ) ); $interval = $now->diff( $closed_at ); $output[ 'how_long' ] = Crunchbutton_Util::format_interval( $interval ); $out[] = $output; } } } // if the community was closed before we start logging it else { if( $this->close_all_restaurants ){ $output = []; $closed_at = new DateTime( $this->close_all_restaurants_date, new DateTimeZone( c::config()->timezone ) ); $output[ 'type' ] = 'Close All Restaurants'; $output[ 'closed_at' ] = $closed_at->format( 'M jS Y g:i:s A T' ); $output[ 'closed_by' ] = Admin::o( $this->close_all_restaurants_id_admin )->name; $output[ 'note' ] = $this->close_all_restaurants_note; $now = new DateTime( 'now', new DateTimeZone( c::config()->timezone ) ); $interval = $now->diff( $closed_at ); $output[ 'how_long' ] = Crunchbutton_Util::format_interval( $interval ); $out[] = $output; } if( $this->close_3rd_party_delivery_restaurants ){ $output = []; if( $this->close_3rd_party_delivery_restaurants_date ){ $closed_at = new DateTime( $this->close_3rd_party_delivery_restaurants_date, new DateTimeZone( c::config()->timezone ) ); $output[ 'closed_at' ] = $closed_at->format( 'M jS Y g:i:s A T' ); $now = new DateTime( 'now', new DateTimeZone( c::config()->timezone ) ); $interval = $now->diff( $closed_at ); $output[ 'how_long' ] = Crunchbutton_Util::format_interval( $interval ); } else { $output[ 'closed_at' ] = '-'; } $output[ 'type' ] = 'Close 3rd Party Delivery Restaurants'; $output[ 'closed_by' ] = Admin::o( $this->close_3rd_party_delivery_restaurants_id_admin )->name; $output[ 'note' ] = $this->close_3rd_party_delivery_restaurants_note; $out[] = $output; } } return $out; } public function forceCloseLog(){ $force_closed_times = Crunchbutton_Community_Changeset::q( 'SELECT ccs.*, cc.field FROM community_change cc INNER JOIN community_change_set ccs ON ccs.id_community_change_set = cc.id_community_change_set AND id_community = "' . $this->id_community . '" AND ( cc.field = "close_all_restaurants" OR cc.field = "close_3rd_party_delivery_restaurants" ) AND cc.new_value = 1 ORDER BY cc.id_community_change DESC' ); $out = []; foreach( $force_closed_times as $force_close ){ $output = []; $closed_at = $force_close->date(); $output[ 'closed_at' ] = $closed_at->format( 'M jS Y g:i:s A T' ); $closed_by = $force_close->admin()->name; if( !$closed_by ){ // it probably was closed by auto shutdown $closed_by = Admin::login( Crunchbutton_Community::AUTO_SHUTDOWN_COMMUNITY_LOGIN )->name; } $output[ 'closed_by' ] = $closed_by; if( $force_close->field == 'close_all_restaurants' ){ $output[ 'type' ] = 'Close All Restaurants'; } else if ( $force_close->field == 'close_3rd_party_delivery_restaurants' ){ $output[ 'type' ] = 'Close 3rd Party Delivery Restaurants'; } $output[ 'note' ] = $this->_closedNote( $force_close->id_community_change_set, $force_close->field ); $open = $this->_openedAt( $force_close->id_community_change_set, $force_close->field ); if( $open ){ $opened_at = $open->date(); $output[ 'opened_at' ] = $opened_at->format( 'M jS Y g:i:s A T' ); $opened_by = $open->admin()->name; if( !$opened_by ){ // it probably was closed by auto shutdown $opened_by = Admin::login( Crunchbutton_Community::AUTO_SHUTDOWN_COMMUNITY_LOGIN )->name; } $output[ 'opened_by' ] = $opened_by; $interval = $opened_at->diff( $closed_at ); $output[ 'how_long' ] = Crunchbutton_Util::format_interval( $interval ); } else { $output[ 'how_long' ] = 'It is still closed!'; } $out[] = $output; } echo json_encode( $out );exit; } private function _closedNote( $id_community_change_set, $field ){ $field = $field . '_note'; $note = Crunchbutton_Community_Changeset::q( 'SELECT ccs.*, cc.field, cc.new_value FROM community_change cc INNER JOIN community_change_set ccs ON ccs.id_community_change_set = cc.id_community_change_set AND id_community = "' . $this->id_community . '" AND cc.field = "' . $field . '" AND ccs.id_community_change_set = ' . $id_community_change_set . ' ORDER BY cc.id_community_change DESC LIMIT 1' )->get( 0 ); if( $note->new_value ){ return $note->new_value; } return false; } public function shutDownCommunities( $dt = null ){ $communities = Crunchbutton_Community::q( 'SELECT * FROM community WHERE auto_close = 1' ); foreach( $communities as $community ){ $community->shutDownCommunity( $dt ); } // Call the method that reopen auto closed communities with drivers Crunchbutton_Community::reopenAutoClosedCommunities(); } public function reopenAutoClosedCommunities(){ $admin = Admin::login( Crunchbutton_Community::AUTO_SHUTDOWN_COMMUNITY_LOGIN ); $id_admin = $admin->id_admin; $communities = Crunchbutton_Community::q( 'SELECT * FROM community WHERE close_all_restaurants_id_admin = "' . $id_admin . '" OR close_3rd_party_delivery_restaurants_id_admin = "' . $id_admin . '"' ); foreach( $communities as $community ){ $community->reopenAutoClosedCommunity(); } } public function reopenAutoClosedCommunity(){ if( !$this->auto_close ){ return; } if( !$this->id_community || !$this->allThirdPartyDeliveryRestaurantsClosed() || !$this->allRestaurantsClosed() ){ $admin = Admin::login( Crunchbutton_Community::AUTO_SHUTDOWN_COMMUNITY_LOGIN ); $id_admin = $admin->id_admin; if( $this->close_all_restaurants_id_admin == $id_admin || $this->close_3rd_party_delivery_restaurants_id_admin == $id_admin ){ $nextShift =Crunchbutton_Community_Shift::currentAssignedShiftByCommunity( $this->id_community ); if( $nextShift->id_community_shift ){ $date_start = $nextShift->dateStart( $this->timezone ); $date_start->setTimezone( new DateTimeZone( c::config()->timezone ) ); $date_end = $nextShift->dateEnd( $this->timezone ); $date_end->setTimezone( new DateTimeZone( c::config()->timezone ) ); $now = new DateTime( 'now', new DateTimeZone( c::config()->timezone ) ); if( $now->format( 'YmdHis' ) >= $date_start->format( 'YmdHis' ) && $now->format( 'YmdHis' ) <= $date_end->format( 'YmdHis' ) ){ // Open the community $this->close_3rd_party_delivery_restaurants = 0; $this->close_3rd_party_delivery_restaurants_id_admin = null; $this->close_3rd_party_delivery_restaurants_note = null; $this->driver_restaurant_name = null; $this->save(); $ticket = 'The community ' . $this->name . ' was auto reopened.'; Log::debug( [ 'id_community' => $this->id_community, 'nextShift' => $nextShift->id_community_shift, 'message' => $ticket, 'type' => 'community-auto-reopened' ] ); Crunchbutton_Support::createNewWarning( [ 'body' => $ticket ] ); } } } } } public function activeDrivers( $dt = null ){ $totalDrivers = 0; $drivers = $this->getDriversOfCommunity(); $hasDriverWorking = false; foreach( $drivers as $driver ){ if( $driver->isWorking( $dt ) ){ $totalDrivers++; } } return $totalDrivers; } public function shutDownCommunity( $dt = null ){ if( !$this->auto_close ){ return; } if( !$this->id_community || $this->allThirdPartyDeliveryRestaurantsClosed() || $this->allRestaurantsClosed() ){ return; } // check if the community has any restaurant open $restaurants = $this->restaurants(); $has3rdPartyDeliveryRestaurantsOpen = false; foreach( $restaurants as $restaurant ){ if( $restaurant->open( $dt ) ){ if( intval( $restaurant->delivery_service ) == 1 ){ $has3rdPartyDeliveryRestaurantsOpen = true; } } } if( $has3rdPartyDeliveryRestaurantsOpen ){ if( $this->activeDrivers( $dt ) > 0 ){ $hasDriverWorking = true; } else { $hasDriverWorking = false; } $close3rdParyDeliveryRestaurants = ( $has3rdPartyDeliveryRestaurantsOpen && !$hasDriverWorking ); if( $close3rdParyDeliveryRestaurants ){ $admin = Admin::login( Crunchbutton_Community::AUTO_SHUTDOWN_COMMUNITY_LOGIN ); $id_admin = $admin->id_admin; $nextShift =Crunchbutton_Community_Shift::nextAssignedShiftByCommunity( $this->id_community ); if( $nextShift->id_community ){ $date_start = $nextShift->dateStart( $this->timezone ); $date_end = $nextShift->dateEnd( $this->timezone ); $message = 'Reopening '; $message .= $date_start->format( 'g' ); if( $date_start->format( 'i' ) != '00' ){ $message .= ':' . $date_start->format( 'i' ); } $message .= $date_start->format( 'A' ); $message .= '-'; $message .= $date_end->format( 'g' ); if( $date_end->format( 'i' ) != '00' ){ $message .= ':' . $date_end->format( 'i' ); } $message .= $date_end->format( 'A' ); $message .= ' on '; $message .= $date_start->format( 'D' ); $message .= '!'; } else { $message = 'Temporally closed!'; } echo $message; echo "\n"; // Close the community $this->close_3rd_party_delivery_restaurants = true; $this->close_3rd_party_delivery_restaurants_id_admin = $id_admin; $this->close_3rd_party_delivery_restaurants_note = $message; $this->driver_restaurant_name = $message; $this->save(); $ticket = 'The community ' . $this->name . ' was auto closed due to it has no drivers.' . "\n"; $ticket .= 'The community message was set to: "' . $message . '"' . "\n"; if( $nextShift->id_community ){ $ticket .= 'that is when the next shift will start.'; } else { $ticket .= 'Because it has no next shift with drivers.'; } Log::debug( [ 'id_community' => $this->id_community, 'nextShift' => $nextShift->id_community_shift, 'message' => $ticket, 'type' => 'community-auto-closed' ] ); Crunchbutton_Support::createNewWarning( [ 'body' => $ticket ] ); } } } public function driverRestaurant(){ if( $this->id_driver_restaurant ){ return Restaurant::o( $this->id_driver_restaurant ); } return false; } private function _openedAt( $id_community_change_set, $field ){ $opened = Crunchbutton_Community_Changeset::q( 'SELECT ccs.*, cc.field FROM community_change cc INNER JOIN community_change_set ccs ON ccs.id_community_change_set = cc.id_community_change_set AND id_community = "' . $this->id_community . '" AND cc.field = "' . $field . '" AND ( cc.new_value = 0 OR cc.new_value IS NULL ) AND ccs.id_community_change_set > ' . $id_community_change_set . ' ORDER BY cc.id_community_change DESC LIMIT 1' )->get( 0 ); if( $opened->id_community_change_set ){ return $opened; } return false; } public function currentShift(){ return Crunchbutton_Community_Shift::currentShiftByCommunity( $this->id_community )->get( 0 ); } }