<?php


class my_class
{
  //TODO: обновить отчет для соответствия текущей структуре.
  static function get_project_worktime()
  //метод формирует отчет по общему времини участия пользователей в проектах.
  {
    global $app_user;
    

    
    $project_query = db_query(
      // "SELECT app_entity_21.id as `project_id`, app_entity_21.field_158 as `project_name`, app_entity_1.id as `user_id`, CONCAT_WS(' ', `field_8`, `field_7`) AS `name`, app_entity_1.field_677 as `hourly_rate`, app_entity_38.field_486 as `hours`, SUM(app_entity_38.field_486*app_entity_1.field_677) as `money` FROM `app_entity_21` INNER JOIN (`app_entity_38`,`app_entity_37`,`app_entity_36`, `app_entity_1`) ON (app_entity_1.id=app_entity_37.field_363 AND app_entity_38.parent_item_id=app_entity_37.id AND app_entity_37.parent_item_id=app_entity_36.id AND app_entity_36.parent_item_id=app_entity_21.id) GROUP BY `project_id`, `user_id` "
      // "SELECT * FROM `app_entity_22` INNER JOIN (app_entity_1, app_entity_21) ON (app_entity_1.id = app_entity_22.field_171 AND app_entity_21.id = app_entity_22.parent_item_id)"
      "SELECT `id`,`field_158` FROM `app_entity_21`"
    );
    
    $html = '';

    $html = '<table class="table table-hover">
    <thead class = "thead-inverse">
      <tr>
        <th>Сотрудник</th>
        <th>Время (часы:минуты)</th>
      </tr>
    </thead>
    <tbody>';

    while ($db_project = db_fetch_array($project_query)) {
      $db_project_total = db_query("SELECT SUM(`field_277`) as 'hours' FROM app_entity_34 WHERE parent_item_id in (SELECT app_entity_22.id FROM app_entity_22 where parent_item_id = {$db_project['id']})");
      $project_total = db_fetch_array($db_project_total);
      $html .= '<tr>';
      $html .= "<th class = 'thead-inverse'>{$db_project['field_158']}</th>";
      $html .= "<th class = 'thead-inverse'>{$project_total['hours']}</th>";
      $html .= '</tr>';

      $db_user_query = db_query("SELECT * FROM app_entity_1 where app_entity_1.id in (SELECT app_entity_22.field_171 FROM app_entity_22 where parent_item_id = {$db_project['id']}) ");

      while($db_project_users = db_fetch_array($db_user_query))
      {
        $db_user_workhours = db_query("SELECT SUM(`field_486`) as 'hours' FROM app_entity_47 WHERE parent_item_id in (SELECT app_entity_22.id FROM app_entity_22 where parent_item_id = {$db_project['id']} and field_171 = {$db_project_users['id']} )");
        $user_workhours = db_fetch_array($db_user_workhours);
        $html .= '<tr>';
        // $html .= "<td>{$dbresult['field_158']}</td>";
        $html .= "<td>{$db_project_users['field_8']} {$db_project_users['field_7']}</td>";
        $html .= "<td>{$user_workhours['hours']}</td>";
        $html .= '</tr>';
      }
    }
    
    $html .= '  </tbody>
    </table>';

    return $html;
  }
  // FIXME: считает криво, но не используется => приоритет низкий
  static function get_month_worktime($start_date_string , $end_date_string)
  {
      $start_date = new DateTime($start_date_string);
      $end_date = new DateTime($end_date_string);

      $html = '';
      $html .= '<table class="table table-hover">
      <thead class = "thead-inverse">
        <tr>
          <th>Сотрудник</th>
          <th>Время (часы:минуты)</th>
        </tr>
      </thead>
      <tbody>';

      if ($db_users_worktime = db_query("
      SELECT
          app_entity_1.id as 'user_id',
          CONCAT_WS(' ', `field_8`, `field_7`) AS 'name',
          SUM(`field_716`) AS 'hours'
      FROM
          app_entity_47
      INNER JOIN(app_entity_1)
      ON
      (
          app_entity_1.id = app_entity_47.field_713
      )
      WHERE
          {$start_date->format("U")} <= `field_715` AND `field_715` <= {$end_date->format("U")}
      GROUP BY app_entity_1.id
        ")){
            while ($user_worktime = db_fetch_array($db_users_worktime)) {
            $html .= '<tr>';
            $html .= "<th class = 'thead-inverse'>{$user_worktime['name']}</th>";
            $hours = new DateIntervalEnhanced("PT".round($user_worktime['hours']*3600)."S");
            $html .= "<th class = 'thead-inverse'>".$hours->recalculate()->format('%H:%I')."</th>";
            $html .= '</tr>';
            }
      }

      $html .= '  </tbody>
      </table>';

      return $html;

  }

  static function get_month_worktime_details($start_date_string, $end_date_string, $user_id=0 )
  {

    $start_date = new DateTime($start_date_string);
    $end_date = new DateTime($end_date_string);
    $date_period = new DatePeriod($start_date, new DateInterval('P1D'), (clone($end_date))->modify('+1 day'));

    if ($user_id==0) {
      $db_users_worktime = db_query("
    SELECT
        app_entity_1.id as 'user_id',
        CONCAT_WS(' ', `field_8`, `field_7`) AS 'name',
        SUM(`field_716`) AS 'hours'
    FROM
        app_entity_47
    INNER JOIN(app_entity_1)
    ON
      (
      app_entity_1.id = app_entity_47.field_713
      )
    WHERE
          {$start_date->format("U")} <= `field_715` AND `field_715` <= {$end_date->format("U")}
    GROUP BY app_entity_1.id
    ");
    } else {
      $db_users_worktime = db_query("
    SELECT
      app_entity_1.id as 'user_id',
      CONCAT_WS(' ', `field_8`, `field_7`) AS 'name',
      SUM(`field_716`) AS 'hours'
    FROM
      app_entity_47
    INNER JOIN(app_entity_1)
    ON
      (
      app_entity_1.id = app_entity_47.field_713
      )
    WHERE
          app_entity_1.id={$user_id} AND {$start_date->format("U")} <= `field_715` AND `field_715` <= {$end_date->format("U")}
    GROUP BY app_entity_1.id
      ");
    }
    
// начинаем рисовать таблицу, формируем заголовки.
    $html = '';
    $html .= '<table class="table table-hover">
    <thead>
      <tr>
        <th rowspan="2">Сотрудник</th>
        <th rowspan="2">Время (часы:минуты)</th>';
    foreach ($date_period as $date ) {
      if ($date->format('N')<6) {
        $html .= "<th>{$date->format('d')}</th>";
      } else {
        $html .= "<th bgcolor='yellow'>{$date->format('d')}</th>";
      }      
    }
    // второй заход - дни недели
    $html .=  '</tr>';
    foreach ($date_period as $date ) {
      if ($date->format('N')<6) {
        $html .= "<th>{$date->format('D')}</th>";
      } else {
        $html .= "<th bgcolor='yellow'>{$date->format('D')}</th>";
      }
    }
    $html .= '</thead><tbody>';
    // собственно вписываем строки в таблицу
    while ($user_worktime = db_fetch_array($db_users_worktime)) {
      $html .= '<tr>';
      $html .= "<th class = 'thead-inverse'>{$user_worktime['name']}</th>";
      $hours = floor($user_worktime['hours']) .":". str_pad(round(($user_worktime['hours'] - floor($user_worktime['hours']))*60),2,"0", STR_PAD_LEFT);
      $html .= "<th class = 'thead-inverse'>{$hours}</th>";
      foreach ($date_period as $date ) {
        $db_daily_workhours = db_query(
        "SELECT
			      SUM(`field_716`) AS 'hours'
        FROM
            app_entity_47
        INNER JOIN(app_entity_1)
        ON
            (
            app_entity_1.id = app_entity_47.field_713
            )
        WHERE
            `field_715` = {$date->format('U')}
            AND
            app_entity_1.id={$user_worktime['user_id']}" );

            $daily_workhours = db_fetch_array($db_daily_workhours);

            if ($daily_workhours['hours']) {
              $dayly_hours = floor($daily_workhours['hours']) .":". str_pad(round(($daily_workhours['hours'] - floor($daily_workhours['hours']))*60),2,"0", STR_PAD_LEFT);
              if ($date->format('N')<6) {
                $html .= "<td>{$dayly_hours}</td>";
              } else {
                $html .= "<td bgcolor='yellow'>{$dayly_hours}</td>";
              }
              
            } else {
              if ($date->format('N')<6) {
                $html .= "<td> 00:00 </td>";
              } else {
                $html .= "<td bgcolor='yellow'> 00:00 </td>";
              }
            }

      }
      
      
      $html .= '</tr>';
    }
    $html .= '  </tbody>
    </table>';

    return $html;
  }


}

function hours_and_minutes($hours)
{
  return floor($hours) .":". str_pad(round(($hours - floor($hours))*60),2,"0", STR_PAD_LEFT);
}

class DateIntervalEnhanced extends DateInterval {

  public function recalculate()
  {
      $from = new DateTime;
      $to = clone $from;
      $to = $to->add($this);
      $diff = $from->diff($to);
      foreach ($diff as $k => $v) $this->$k = $v;
      return $this;
  }

}