Конструктор отчетов расчет прибыли за период времени

Все вопросы/проблемы по установке и использовании.
Ответить
era1fgg
Сообщения: 28
Зарегистрирован: 26 фев 2020, 14:02
Имя: Era
Откуда: Astana

Конструктор отчетов расчет прибыли за период времени

Сообщение era1fgg »

Приветствую всех, есть сущность Авто (id 27) и подсущьность Аренда (id 34).
Авто
-Гос.номер [245] (Поле с динамической маской ввода - Заголовок)
Аренда
-ФИО арендатора [314] (Поле ввода - Заголовок)
-Начало аренды [313] (Дата с календарем)
-Конец аренды [319] (Дата с календарем)
-Цена аренды за 1 день [317] (Числовое поле)
-Срок аренды в днях [315] (MySQL Формула):
if(
IFNULL([319],0) > 0,
TIMESTAMPDIFF(DAY, FROM_UNIXTIME([313]), FROM_UNIXTIME([319])),
TIMESTAMPDIFF(DAY, FROM_UNIXTIME([313]), FROM_UNIXTIME([TODAY]))
)
-Прибыль [318] (MySQL Формула):
if(
IFNULL([319],0) > 0,
TIMESTAMPDIFF(DAY, FROM_UNIXTIME([313]), FROM_UNIXTIME([319])) * [317],
TIMESTAMPDIFF(DAY, FROM_UNIXTIME([313]), FROM_UNIXTIME([TODAY])) * [317]
)
Необходимо сделать сводный отчет по прибыли от аренды авто за период времени (по фильтру период) т.е. вывести таблицу в виде:
Гос.номер, Срок аренды в днях, Прибыль.
Если указать в фильтре период времени, прибыль должна считаться только за те дни когда авто было в аренде, например с 1 по 20 июля авто сдавалось в аренду 5 дней разным арендаторам.
Не могу разобраться с конструктором отчетов и построить правильный MySQL запрос для таблицы в HTML блоке
Аватара пользователя
Fait
Инвестор
Инвестор
Сообщения: 1196
Зарегистрирован: 19 ноя 2020, 17:46
Имя: Максим Балакшеев
Откуда: Россия, Златоуст
Организация: ИП Балакшеев Максим Георгиевич
Контактная информация:

Re: Конструктор отчетов расчет прибыли за период времени

Сообщение Fait »

Добрый день!
Предлагаю такое решение, работающее со всеми типами фильтров по датам.
Создайте в конструкторе отчётов блок с типом "PHP код" и вставьте туда этот код:

Код: Выделить всё

$ent_cars = 27; // Сущность Автомобили
$f_cars_number = 245; // Поле Гос. номер
$ent_rent = 34; // Сущность Аренда
$f_rent_date_from = 313; // Поле Дата от
$f_rent_date_to = 319; // Поле Дата до
$f_rent_sum = 317; // Поле Сумма
//------------------------------
$date_from = 0;
$date_to = 0;
if (array_key_exists('filter_by_date_from',$_POST)) {
  $date_from = strtotime($_POST['filter_by_date_from']);
  $date_to = strtotime($_POST['filter_by_date_to']);
}
else if (array_key_exists('filter_by_date',$_POST)) {
  $dt = explode('-',$_POST['filter_by_date']);
  if (count($dt) == 3) {
    $date_from = mktime(0, 0, 0, $dt[1], $dt[2], $dt[0]);
    $date_to = $date_from + 86400;
  }
  else if (count($dt) == 2) {
    $date_from = mktime(0, 0, 0, $dt[1], 1, $dt[0]);
    $date_to = $date_from + date('t',$date_from) * 86400;
  }
  else if (count($dt) == 1) {
    $date_from = mktime(0, 0, 0, 1, 1, $dt[0]);
    $date_to = mktime(23, 59, 59, 12, 31, $dt[0]);
  }
}
if ($date_from == 0) { $date_from = mktime(0, 0, 0, 1, 1, date('Y')); }
if ($date_to == 0) { $date_to = mktime(0, 0, 0, date('m'), date('d')+1, date('Y')); }
$sql = 'SELECT cars.field_'.$f_cars_number.' AS number,
  SUM(
  (IF(rent.field_'.$f_rent_date_to.'<'.$date_to.',rent.field_'.$f_rent_date_to.','.$date_to.')
  -IF(rent.field_'.$f_rent_date_from.'>'.$date_from.',rent.field_'.$f_rent_date_from.','.$date_from.')
  )/86400) AS diff,
  SUM(
    ((IF(rent.field_'.$f_rent_date_to.'<'.$date_to.',rent.field_'.$f_rent_date_to.','.$date_to.')
  -IF(rent.field_'.$f_rent_date_from.'>'.$date_from.',rent.field_'.$f_rent_date_from.','.$date_from.')
  ) / 86400
  ) * rent.field_'.$f_rent_sum.'
  ) AS sum
FROM app_entity_'.$ent_rent.' rent
JOIN app_entity_'.$ent_cars.' cars ON rent.parent_item_id = cars.id
WHERE rent.field_'.$f_rent_date_from.' <= '.$date_to.' AND (rent.field_'.$f_rent_date_to.' >= '.$date_from.' OR rent.field_'.$f_rent_date_to.' IS NULL)
GROUP BY cars.field_'.$f_cars_number.' ORDER BY sum DESC';
$check = db_query($sql);
echo '<table class="table table-striped table-bordered table-hover table-thead-sticky table-tfoot-sticky">
<tr>
  <th>Гос. номер</th>
  <th>Срок аренды</th>
  <th>Прибыль</th>
</tr>';
foreach ($check as $value) {
  echo '<tr>
    <td>'.$value['number'].'</td>
    <td>'.number_format($value['diff'],0,',',' ').'</td>
    <td>'.number_format($value['sum'],2,',',' ').'</td>
  </tr>';
}
echo '</table>';
era1fgg
Сообщения: 28
Зарегистрирован: 26 фев 2020, 14:02
Имя: Era
Откуда: Astana

Re: Конструктор отчетов расчет прибыли за период времени

Сообщение era1fgg »

Благодарю, добрейший человек! :P
Ответить