2014-03-29 18:02:48 -03:00

167 lines
5.9 KiB
PHP

<?php
class Crunchbutton_Admin_Hour extends Cana_Table {
public function __construct($id = null) {
parent::__construct();
$this
->table('admin_hour')
->idVar('id_admin_hour')
->load($id);
}
public function removeByDateIdAdmin( $date, $id_admin ){
return c::db()->query( "DELETE from admin_hour WHERE id_admin = $id_admin AND DATE_FORMAT( date_start, '%Y-%m-%d' ) = '$date'" );
}
public function hoursByDateRestaurant( $id_restaurant, $date ){
$hours = Crunchbutton_Admin_Hour::q( "SELECT DISTINCT( a.id_admin_hour ) id, a.*,
DATE_FORMAT( date_start, '%H' ) start_hour,
DATE_FORMAT( date_start, '%d' ) start_day,
DATE_FORMAT( date_end, '%H' ) end_hour,
DATE_FORMAT( date_end, '%d' ) end_day
FROM admin_hour a
INNER JOIN notification n ON a.id_admin = n.id_admin AND id_restaurant = {$id_restaurant}
WHERE ( DATE_FORMAT( date_start, '%Y-%m-%d' ) = '{$date}' || DATE_FORMAT( date_end, '%Y-%m-%d' ) = '{$date}' )" );
$hasDriver = [];
$day = intval( explode( '-', $date )[ 2 ] );
foreach( $hours as $hour ){
$start_hour = intval( $hour->start_hour );
$start_day = intval( $hour->start_day );
$end_hour = intval( $hour->end_hour );
$end_day = intval( $hour->end_day );
if( $end_day > $day ){
$end_hour = 23;
}
if( $end_day == $day && $start_day < $day ){
$start_hour = 0;
}
for( $i = $start_hour; $i <= $end_hour; $i++ ){
$hasDriver[ $i ] = true;
}
}
return $hasDriver;
}
public function segmentsByDate( $date, $_join = ', ', $id_admin = false ){
$where = ( $id_admin ) ? ' AND id_admin = ' . $id_admin : '';
$hours = Crunchbutton_Admin_Hour::q( "SELECT * FROM admin_hour WHERE id_admin IS NOT NULL AND DATE_FORMAT( date_start, '%Y-%m-%d' ) = '$date' $where ORDER BY date_start, id_admin ASC" );
$admins = [];
foreach ( $hours as $hour ) {
$join = '';
if( !$admins[ $hour->id_admin ] ){
$admins[ $hour->id_admin ] = [ 'name' => $hour->admin()->name, 'login' => $hour->admin()->login, 'hours' => '', 'id_admin' => $hour->id_admin ];
} else {
$join = $_join;
}
$admins[ $hour->id_admin ][ 'hours' ] = $admins[ $hour->id_admin ][ 'hours' ] . $join . $hour->segment();
$admins[ $hour->id_admin ][ 'pst' ] = $admins[ $hour->id_admin ][ 'pst' ] . $join . $hour->segment( 'PST' );
}
return $admins;
}
public function formatedToSegment( $dateTime ){
if( $dateTime ){
$hour = $dateTime->format( 'h' );
if( $hour > 12 ){
$hour = $hour - 12;
}
$min = $dateTime->format( 'i' );
$ampm = $dateTime->format( 'a' );
return intval( $hour ) . ( intval( $min ) > 0 ? ':' . intval( $min ) : '' ) . ' ' . $ampm ;
}
}
public function segment( $timezone = false ){
if( $timezone ){
$date_start = DateTime::createFromFormat( 'Y-m-d H:i:s', $this->date_start, new DateTimeZone( $this->admin()->timezone ) );
$date_start->setTimezone( new DateTimeZone( $timezone ) );
$date_end = DateTime::createFromFormat( 'Y-m-d H:i:s', $this->date_end, new DateTimeZone( $this->admin()->timezone ) );
$date_end->setTimezone( new DateTimeZone( $timezone ) );
} else {
$date_start = $this->date_start();
$date_end = $this->date_end();
}
return $this->formatedToSegment( $date_start ) . ' - ' . $this->formatedToSegment( $date_end );
}
public function date_start(){
if ( !isset( $this->_date_start ) ) {
$this->_date_start = DateTime::createFromFormat( 'Y-m-d H:i:s', $this->date_start, new DateTimeZone( $this->admin()->timezone ) );
}
return $this->_date_start;
}
public function date_end(){
if ( !isset( $this->_date_end ) ) {
$this->_date_end = DateTime::createFromFormat( 'Y-m-d H:i:s', $this->date_end, new DateTimeZone( $this->admin()->timezone ) );
}
return $this->_date_end;
}
public function validateTimezone( $timezone ){
if ( in_array( $timezone, DateTimeZone::listIdentifiers() ) ) {
return true;
}
return false;
}
public function admin(){
if ( !isset( $this->_admin ) ) {
$this->_admin = Admin::o( $this->id_admin );
}
return $this->_admin;
}
public function segmentToDate( $date_base, $segment, $timezone = false ){
$matches = [];
preg_match( '/^ *(\d+)(?:\:(\d+))? *(am|pm) *(?:to|-) *(\d+)(?:\:(\d+))? *(am|pm) *$/i', $segment, $matches );
$start_hour = $matches[ 1 ];
$start_min = $matches[ 2 ];
$start_ampm = strtolower( $matches[ 3 ] );
$end_hour = $matches[ 4 ];
$end_min = $matches[ 5 ];
$end_ampm = strtolower( $matches[ 6 ] );
$end_day = 0;
if( $start_ampm == 'pm' && $start_hour < 12 ){
$start_hour = $start_hour + 12;
}
if( $end_ampm == 'pm' && $end_hour == 12 ){
$end_hour = 24;
}
if( $end_ampm == 'pm' && $end_hour < 12 ){
$end_hour = $end_hour + 12;
}
if( $end_ampm == 'am' && $end_hour == 12 ){
$end_hour = 24;
}
if( $end_ampm == 'am' && $end_hour < $start_hour ){
$end_hour = $end_hour + 24;
}
if( $end_hour >= 24 ){
$end_hour = $end_hour - 24;
$end_day = 1;
}
$start_at = $start_hour . ':' . ( ( $start_min == '' ) ? '00' : $start_min );
$date_start = DateTime::createFromFormat( 'Y-m-d H:i:s', $date_base->format( 'Y-m-d' ) . ' ' . $start_at . ':00', new DateTimeZone( $date_base->format( 'e' ) ) );
$end_at = $end_hour . ':' . ( ( $end_min == '' ) ? '00' : $end_min );
$date_end = DateTime::createFromFormat( 'Y-m-d H:i:s', $date_base->format( 'Y-m-d' ) . ' ' . $end_at. ':00', new DateTimeZone( $date_base->format( 'e' ) ) );
if( $end_day ){
$date_end->modify( '+' . $end_day . ' day' );
}
if( $timezone ){
$date_start->setTimezone( new DateTimeZone( $timezone ) );
$date_end->setTimezone( new DateTimeZone( $timezone ) );
}
if( $date_start->format( 'Y-m-d H:i:s' ) && $date_end->format( 'Y-m-d H:i:s' ) ){
return [ 'start' => $date_start->format( 'Y-m-d H:i:s' ), 'end' => $date_end->format( 'Y-m-d H:i:s' ) ];
}
return false;
}
}