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)];
  }

}

Главная | Обратная связь

drupal hosting | друпал хостинг | it patrol .inc