Spamworldpro Mini Shell
Spamworldpro


Server : Apache
System : Linux server2.corals.io 4.18.0-348.2.1.el8_5.x86_64 #1 SMP Mon Nov 15 09:17:08 EST 2021 x86_64
User : corals ( 1002)
PHP Version : 7.4.33
Disable Function : exec,passthru,shell_exec,system
Directory :  /home/corals/ts.corals.io/corals-api/Corals/modules/Timesheet/Reports/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Current File : /home/corals/ts.corals.io/corals-api/Corals/modules/Timesheet/Reports/ActivitiesReportPerLevel.php
<?php

namespace Corals\Modules\Timesheet\Reports;

use Corals\Modules\Timesheet\Models\Client;
use Corals\Modules\Timesheet\Models\Entry;
use Illuminate\Http\Request;

class ActivitiesReportPerLevel
{
    public function getBaseActivityQuery($start_date, $end_date)
    {
        return Entry::query()
            ->selectRaw("
            ((SUM(ifNull(timesheet_entries.hours*60,0)) + SUM(ifNull(timesheet_entries.minutes,0)))/60) as total_time,
            ((SUM(ifNull(timesheet_entries.evaluation_hours*60,0)) + SUM(ifNull(timesheet_entries.evaluation_minutes,0)))/60) as evaluation_time,
            timesheet_entries.activity_id,
            timesheet_activities.title,
            timesheet_activities.billable as activity_is_billable,
            timesheet_entries.user_id,
            timesheet_entries.hourly_rate,
            timesheet_projects.type as project_type,
            timesheet_entries.project_id,
            (SUM(timesheet_entries.amount)) as total_amount,
            (SUM(timesheet_entries.cost)) as total_cost")
            ->join('timesheet_activities', 'timesheet_activities.id', '=', 'timesheet_entries.activity_id')
            ->join('timesheet_projects', 'timesheet_projects.id', '=', 'timesheet_entries.project_id')
            ->whereBetween('timesheet_entries.spent_at', [$start_date, $end_date])
            ->groupBy('timesheet_activities.id', 'timesheet_projects.type');
    }

    public function getActivitiesPerLevel(Request $request): array
    {
        $billable_activities = [];
        $non_billable_activities = [];

        $start_date = $request->get('from_date', now()->subMonth()->startOfMonth());
        $end_date = $request->get('to_date', now()->subMonth()->endOfMonth());

        $project_id = $request->get('project_id');
        $client_id = $request->get('client_id');
        $user_id = $request->get('user_id');

        $header_for_billable_activity = [
            'billable_activities' => 'Activity',
            'hours' => 'Hours',
            'evaluation_hours' => 'Evaluation',
            'billable_amount' => 'Billable',
            'cost' => 'Cost',
            'balance' => 'Balance'
        ];

        $header_for_non_billable_activity = [
            'non_billable_activities' => 'Activity',
            'hours' => 'Hours',
            'cost' => 'Cost'
        ];

        $footer_billable_activities = [
            'total' => 'Total',
            'total_hours' => 0,
            'total_evaluation_hours' => 0,
            'total_billable_amount' => 0,
            'total_cost' => 0,
            'total_balance' => 0
        ];

        $footer_non_billable_activities = [
            'total' => 'Total',
            'total_hours' => 0,
            'total_cost' => 0
        ];

        $billable_activities['header'] = $header_for_billable_activity;
        $non_billable_activities['header'] = $header_for_non_billable_activity;


        if (!is_null($project_id)) {
            $activitiesWithEntries = $this->getBaseActivityQuery($start_date, $end_date)->where('timesheet_entries.project_id', $project_id)->get();
        } elseif (!is_null($client_id)) {
            $projects_for_client = Client::findOrFail($client_id)->projects->pluck('id');
            $activitiesWithEntries = $this->getBaseActivityQuery($start_date, $end_date)->whereIn('timesheet_entries.project_id', $projects_for_client)->get();
        } elseif (!is_null($user_id)) {
            $activitiesWithEntries = $this->getBaseActivityQuery($start_date, $end_date)->where('timesheet_entries.user_id', $user_id)->get();
        } else {
            $activitiesWithEntries = [];
        }

        foreach ($activitiesWithEntries as $activity) {
            if ($activity->total_time == 0) {
                continue;
            }
            if ($activity->project_type !== 'non_billable' && $activity->activity_is_billable) {
                $billable_activities['activity_' . $activity->activity_id]['title'] = $activity->title;
                $billable_activities['activity_' . $activity->activity_id]['hours'] = $activity->total_time;
                $billable_activities['activity_' . $activity->activity_id]['evaluation_hours'] = $activity->evaluation_time;
                $billable_activities['activity_' . $activity->activity_id]['billable_amount'] = $activity->total_amount;
                $billable_activities['activity_' . $activity->activity_id]['cost'] = $activity->total_cost;
                $billable_activities['activity_' . $activity->activity_id]['balance'] = $activity->total_amount - $activity->total_cost;


                $footer_billable_activities['total_hours'] += $activity->total_time;
                $footer_billable_activities['total_evaluation_hours'] += $activity->evaluation_time;
                $footer_billable_activities['total_billable_amount'] += $activity->total_amount;
                $footer_billable_activities['total_cost'] += $activity->total_cost;
                $footer_billable_activities['total_balance'] += $billable_activities['activity_' . $activity->activity_id]['balance'];

            } else {
                $non_billable_activities['activity_' . $activity->activity_id]['title'] = $activity->title;
                $non_billable_activities['activity_' . $activity->activity_id]['hours'] = $activity->total_time;
                $non_billable_activities['activity_' . $activity->activity_id]['cost'] = $activity->total_cost;

                $footer_non_billable_activities['total_hours'] += $activity->total_time;
                $footer_non_billable_activities['total_cost'] += $activity->total_cost;
            }
        }

        if (count($billable_activities) === 1) {
            $billable_activities['no_data'] = [];
        } else {
            $billable_activities['footer'] = $footer_billable_activities;
        }

        if (count($non_billable_activities) === 1) {
            $non_billable_activities['no_data'] = [];
        } else {
            $non_billable_activities['footer'] = $footer_non_billable_activities;
        }

        return roundResults([
            'billable_activities' => $billable_activities,
            'non_billable_activities' => $non_billable_activities,
        ]);
    }
}

Spamworldpro Mini