File "ContragentsController.php"
Full Path: /var/www/html/back/app/Http/Controllers/Api/V1/Auth/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
);
}
}