work_time-1.0.x-dev/src/Controller/WorktimeController.php
src/Controller/WorktimeController.php
<?php
namespace Drupal\work_time\Controller;
use Drupal\Core\Controller\ControllerBase;
use Drupal\Core\Database\Connection;
use Drupal\Core\Url;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\Request;
/**
* Defines HelloController class.
*/
class WorktimeController extends ControllerBase {
/**
* The form builder.
*
* @var \Drupal\Core\Form\FormBuilder
*/
protected $database;
/**
* WorktimeController constructor.
*
* @param \Drupal\Core\Database\Connection $database
* Database service.
*/
public function __construct(Connection $database) {
$this->database = $database;
}
/**
* {@inheritdoc}
*
* @param \Symfony\Component\DependencyInjection\ContainerInterface $container
* The Drupal service container.
*
* @return static
*/
public static function create(ContainerInterface $container) {
return new static(
$container->get('database')
);
}
/**
* {@inheritdoc}
*/
public function timesheet(Request $request) {
$post = $request->request->all();
$delete = $post['delete'] ?? FALSE;
$modify = $post['modify'] ?? FALSE;
$create = $post['timesheet'] ?? FALSE;
$labels = $post['label'] ?? FALSE;
$route_name = $request->request->get('route_name');
$reference_type = $request->request->get('reference_type');
$workTimeStorage = $this->entityTypeManager()->getStorage('work_time');
$user = $this->currentUser();
// Delete work time.
if (!empty($delete)) {
foreach ($delete as $reference_id => $timesheet) {
foreach ($timesheet as $date => $status) {
$select = $this->database->select('work_time', 'w')
->fields('w', ['id'])
->condition('reference_id', $reference_id)
->condition('uid', $user->id());
$select->where('DATE(FROM_UNIXTIME(created)) = :date', [':date' => $date]);
$results = $select->execute();
$wids = $results->fetchCol();
$entities = $workTimeStorage->loadMultiple($wids);
$workTimeStorage->delete($entities);
}
}
}
// Modify work time.
if (!empty($modify)) {
foreach ($modify as $reference_id => $timesheet) {
foreach ($timesheet as $date => $hour) {
$select = $this->database->select('work_time', 'w')
->fields('w', ['id'])
->condition('reference_id', $reference_id)
->condition('uid', $user->id());
$select->where('DATE(FROM_UNIXTIME(created)) = :date', [':date' => $date]);
$wids = $select->execute()->fetchCol();
$entities = $workTimeStorage->loadMultiple($wids);
$count = count($entities);
foreach ($entities as $entity) {
$time_total = $hour * $count * 60 * 60;
$entity->set('time_total', $time_total);
$entity->save();
}
}
}
}
// Create work time.
if (!empty($create)) {
foreach ($create as $reference_id => $timesheet) {
$label = $labels[$reference_id] ?? $this->t('Time sheet');
foreach ($timesheet as $date => $hour) {
$startHour = "08:00";
// Get stop hour.
$select = $this->database->select('work_time', 'w')
->condition('uid', $user->id());
$select->addExpression("DATE_FORMAT(FROM_UNIXTIME(stopped), '%H:%i')", 'timestopped');
$select->where('DATE(FROM_UNIXTIME(created)) = :date', [':date' => $date]);
$select->orderBy('created', 'DESC');
$timeStopped = $select->execute()->fetchCol();
if (!empty($timeStopped)) {
$startHour = current($timeStopped);
}
$created = strtotime("$date $startHour");
$time_total = $hour * 60 * 60;
$stopped = $created + $time_total;
$worktime = [
'label' => $label,
'uid' => $user->id(),
'created' => $created,
'stopped' => $stopped,
'time_total' => $time_total,
'reference_id' => $reference_id,
'reference_type' => $reference_type ?? 'node',
];
$workTime = $workTimeStorage->create($worktime);
$workTime->save();
}
}
}
$url = Url::fromRoute($route_name);
return new RedirectResponse($url->toString());
}
/**
* {@inheritdoc}
*/
public function ajaxTimesheet(Request $request) {
$getMonth = $request->request->get('month');
[$year, $month] = explode('-', $getMonth);
$records = \Drupal::service('work_time.monthly')->getDataMonthly($year, $month);
$response['data'] = $records;
return new JsonResponse($response);
}
/**
* {@inheritdoc}
*/
public function ajaxTimeGeneral($mode_display, $mode_time, $date) {
$query = $this->database->select('work_time', 'wt');
$query->fields('wt', [$mode_display]);
$query->condition('type', '0');
$query->condition($mode_display, NULL, 'IS NOT NULL');
$resultModeDisplay = $query->distinct()->execute()->fetchAll();
if ($resultModeDisplay) {
$data = [];
foreach ($resultModeDisplay as $item) {
switch ($mode_time) {
case 'week':
if (empty($date)) {
$date = date('Y-\WW');
}
$timestamp = strtotime($date);
$start = strtotime('monday this week', $timestamp);
$end = strtotime('sunday this week', $timestamp);
$data[] = $this->genSql($start, $end, $mode_display, $item);
break;
case 'month':
if (!empty($date)) {
$timestamp = strtotime($date . '-01');
$start = strtotime('first day of this month', $timestamp);
$end = strtotime('last day of this month', $timestamp);
$data[] = $this->genSql($start, $end, $mode_display, $item);
}
break;
case 'year':
$month = date('m');
$year = $filter ?? date('Y');
if ($year < date('Y')) {
$month = 12;
}
$timestamp = strtotime("$year-$month-01");
$start = strtotime("$year-01-01");
$end = strtotime('last day of this month', $timestamp) + 24 * 3600 - 1;
$data[] = $this->genSql($start, $end, $mode_display, $item, "%Y-%m");
break;
}
}
return new JsonResponse([
'data' => $data,
'method' => 'POST',
'status' => 200,
]);
}
}
/**
* {@inheritdoc}
*/
public function genSql($start, $end, $mode_display, $item, $format = "%Y-%m-%d") {
$record = $this->database->query("
SELECT FROM_UNIXTIME(`created`, '$format') AS 'date_time', ANY_VALUE(uid) AS 'uid', reference_id, SUM(time_total) AS 'time_total' FROM {work_time}
WHERE FROM_UNIXTIME(`created`, '$format') BETWEEN :startTime AND :endTime AND $mode_display = :id
GROUP BY reference_id, FROM_UNIXTIME(`created`, '$format')", [
':startTime' => date('Y-m-d', $start),
':endTime' => date('Y-m-d', $end),
':id' => $item->{$mode_display},
])->fetchAll();
return $record;
}
/**
* Ajax json response.
*/
public function ajaxTimeline($date = '') {
// Current week.
$start = strtotime('this week');
$end = strtotime('this week +6 days');
if (!empty($date)) {
if (strpos($date, "-W") !== FALSE) {
[$year, $week] = explode('-W', $date);
$start = strtotime($year . 'W' . str_pad($week, 2, '0', STR_PAD_LEFT));
$end = strtotime('+6 days', $start);
}
else {
$month = date('Y-m', strtotime($date));
$start = strtotime(date('Y-m-01', strtotime($month)));
$end = strtotime(date('Y-m-t', strtotime($month)));
}
}
return new JsonResponse([
...$this->getData($start, $end),
'method' => 'GET',
'status' => 200,
]);
}
/**
* Get time data.
*
* {@inheritdoc}
*/
public function getData($start, $end) {
$groups = $result = [];
$query = \Drupal::entityQuery('work_time')
->condition('created', [$start, $end], 'BETWEEN');
$worktime_ids = $query->execute();
if ($worktime_ids) {
$entityManager = $this->entityTypeManager();
$fingerService = $entityManager->getStorage('work_time');
$userService = $entityManager->getStorage('user');
foreach ($worktime_ids as $id) {
$entity = $fingerService->load($id);
$uid = $entity->getOwnerId();
if (empty($groups[$uid])) {
$user = $userService->load($uid);
$groups[$uid] = [
'id' => $uid,
'content' => empty($user) ? $entity->get('label')->value : $user->getDisplayName(),
];
}
$hour = round($entity->get('time_total')->value / 3600);
$result[] = [
'id' => $entity->id(),
'content' => empty($hour) ? 'N/A' : " $hour",
'start' => date('Y-m-d\TH:i', $entity->get('created')->value),
'end' => date('Y-m-d\TH:i', $entity->get('stopped')->value - 120),
'group' => $entity->getOwnerId(),
'title' => $entity->get('label')->value,
];
}
}
return ['items' => $result, 'groups' => array_values($groups)];
}
}
