File "ContragentsController.php"

Full Path: /var/www/html/back/app/Http/Controllers/Api/V1/ContragentsController.php
File size: 4.83 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\Counterparty\CounterPartyService;
use App\Domain\Counterparty\Requests\CreateNewRequest;
use App\Domain\Counterparty\Requests\UpdateRequest;
use App\Http\Controllers\Api\ApiController;
use App\Models\Counterparty;
use App\Requests\SearchRequest;
use App\Responses\ResponseDto;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Log;
use Knuckles\Scribe\Attributes\Group;

/**
 * Контроллер для управления счетами
 */
class ContragentsController extends ApiController
{
    protected CounterPartyService $counterPartyService;

    public function __construct(counterPartyService $counterPartyService)
    {
        $this->counterPartyService = $counterPartyService;
    }

    /**
     * Получение списка
     *
     * @queryParam search string Поисковый запрос для фильтрации. Пример: "Laravel"
     */
    #[Group('contragents')]
    public function index(int $modelID, SearchRequest $request): ResponseDto
    {
        return new ResponseDto(
            data: $this->counterPartyService->getAll($modelID, $request)->simplePaginate(4000),
            status: true
        );
    }

    public function listWithoutPaginate(int $modelID, SearchRequest $request)
    {
        return new ResponseDto(
            data: $this->counterPartyService->getAll($modelID, $request)->get(),
            status: true
        );
    }


    /**
     * Получение по ID
     *
     * @param int $modelID
     * @param int $id
     * @return ResponseDto
     */
    #[Group('contragents')]
    public function show(int $modelID, int $id): ResponseDto
    {
        $account = $this->counterPartyService->getById($id);

        return new ResponseDto(
            data: $account,
            status: true
        );
    }

    /**
     * Создание
     *
     * @param int $modelID
     * @param CreateNewRequest $request
     * @return ResponseDto
     */
    #[Group('contragents')]
    #[OpenApiResponse(ResponseDto::class)]
    public function store(int $modelID, CreateNewRequest $request): ResponseDto
    {
        $account = $this->counterPartyService->addNew($modelID, $request);

        return new ResponseDto(
            data: $account,
            status: true
        );
    }

    /**
     * Обновление
     *
     * @param int $modelID
     * @param int $id
     * @param UpdateRequest $request
     * @return ResponseDto
     */
    #[Group('contragents')]
    #[OpenApiResponse(ResponseDto::class)]
    public function update(int $modelID, int $id, Request $request): ResponseDto
    {

        $account = $this->counterPartyService->update($id, $request);

        return new ResponseDto(
            data: $account,
            status: true
        );
    }

    /**
     * Удаление
     *
     * @param int $modelID
     * @param int $id
     * @return ResponseDto
     */
    #[Group('contragents')]
    #[OpenApiResponse(ResponseDto::class)]
    public function destroy(int $modelID, int $id, Request $request): ResponseDto
    {
        if(!$request->has('transfer_id') || !(int) $request->get('transfer_id')) {
            return $this->error('Не передан контрагент, для переноса платежей');
        }

        $transferId = (int) $request->get('transfer_id');
        if($id == $transferId) {
            return $this->error('Нельзя перенести данные в удаляемого контрагента');
        }

        $this->counterPartyService->getById($id);

        if(!$this->counterPartyService->transferPayments($id, $transferId)) {
            return $this->error('Не удалось перенести платежи');
        }

        $this->counterPartyService->delete($id);

        return new ResponseDto(
            status: true
        );
    }

    /**
     * Получение списка вместе с платежами
     *
     * @queryParam search string Поисковый запрос для фильтрации. Пример: "Laravel"
     */
    #[Group('contragents')]
    public function contragentsWithPayments(int $modelID, SearchRequest $request): ResponseDto
    {
        $result = [];
        $this->counterPartyService->getAll($modelID, $request)->with('payments')
            ->each(function ($item) use (&$result): void {
                $amount = 0;
                foreach ($item->payments as $payment) {
                    $amount += $payment->amount;
                }

                /** @var Counterparty $item */
                $item->forceFill([
                    'payments_amount' => $amount
                ]);
                $result[] = $item;
            });

        return new ResponseDto(
            data: $result,
            status: true
        );
    }
}