File "ProjectGroupController.php"

Full Path: /var/www/html/back/app/Http/Controllers/Api/ProjectGroupController.php
File size: 3.66 KB
MIME-type: text/x-php
Charset: utf-8

<?php

declare(strict_types=1);

namespace App\Http\Controllers\Api\V1;

use App\Attributes\OpenApiResponse;
use App\Domain\Article\Enums\ArticleTypeEnum;
use App\Domain\Project\Requests\CreateProjectGroupRequest;
use App\Domain\Project\Services\projectGroupService;
use App\Http\Controllers\Api\ApiController;
use App\Http\Resources\CashFlowCreditResource;
use App\Http\Resources\CashFlowDebitResource;
use App\Http\Resources\ShowProjectGroupResource;
use App\Models\ProjectGroup;
use App\Responses\ResponseDto;
use App\Services\CashFlow\ActiveTabProjectService;
use App\Services\CashFlowService;
use Illuminate\Support\Facades\Log;
use Knuckles\Scribe\Attributes\Group;
use Illuminate\Http\Request;

/**
 * Контроллер для управления группами.
 */
class ProjectGroupController extends ApiController
{
    protected ProjectGroupService $projectGroupService;

    public function __construct(projectGroupService $articleService, protected CashFlowService $cashFlowService, protected ActiveTabProjectService $tabProjectService)
    {
        $this->projectGroupService = $articleService;
    }

    /**
     * Получить список групп проектов.
     */
    #[Group('projects')]
    #[OpenApiResponse(ProjectGroup::class)]
    public function index(int $modelID): ResponseDto
    {
        return new ResponseDto(
            data: $this->projectGroupService->getAll($modelID),
            status: true
        );
    }

    /**
     * Получить группу по ID.
     */
    #[Group('projects')]
    #[OpenApiResponse(ProjectGroup::class)]
    public function show(int $modelID, int $id, Request $request): ResponseDto
    {
        $group = $this->projectGroupService->findById($id);
        $sort = $request->get('sort');
        $direction = $request->get('sort_direction', 'ASC');
        if ($sort) {
            //TODO сделать сортировку в $group
        }

        return new ResponseDto(
            data: new ShowProjectGroupResource($this->projectGroupService->findById($id)),
            status: true
        );
    }

    /**
     * Создать новую группу.
     *
     * @queryParam name string
     * @queryParam description string
     * @queryParam projects array[]
     */
    #[Group('projects')]
    #[OpenApiResponse(ProjectGroup::class)]
    public function store(int $modelID, CreateProjectGroupRequest $request): ResponseDto
    {
        return new ResponseDto(
            data: $this->projectGroupService->create($modelID, $request),
            status: true
        );
    }

    /**
     * Обновить существующую группу.
     */
    #[Group('projects')]
    #[OpenApiResponse(ProjectGroup::class)]
    public function update(int $modelID, int $id, Request $request)
    {
        $data = $request->all();

        return new ResponseDto(
            status: (bool)$this->projectGroupService->update($id, $data)
        );
    }

    /**
     * Удалить группу.
     */
    #[Group('projects')]
    #[OpenApiResponse(ResponseDto::class)]
    public function destroy(int $modelID, int $id): ResponseDto
    {
        return new ResponseDto(
            status: (bool)$this->projectGroupService->delete($id)
        );
    }

    public function getGroupedByArticle($modelId, $groupId, Request $request)
    {
        $paymentsMadeInput = $request->input('payments_made');

        $filters = [
            'date_from' => $request->input('date_from'),
            'date_to' => $request->input('date_to'),
            'payments_made' => $paymentsMadeInput ?? null,
        ];

        return $this->projectGroupService->getGroupedByArticleForProjetsGroup($modelId, $groupId, $filters);
    }
}