Newer
Older
<?php
namespace App\Models;
use ApiPlatform\Metadata\ApiResource;
use ApiPlatform\Metadata\Get;
use ApiPlatform\Metadata\GetCollection;
use ApiPlatform\Metadata\Link;
use ApiPlatform\OpenApi\Model\Operation;
use ApiPlatform\OpenApi\Model\Response;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use ApiPlatform\Laravel\Eloquent\Filter\EqualsFilter;
#[ApiResource(
description: 'Tax records for French communes (TFPNB, TFPB, TH, CFE)',
operations: [
new GetCollection(
openapi: new Operation(
summary: 'List tax records for French communes',
description: 'Returns paginated tax records with amounts and rates for each commune.',
responses: [
'200' => new Response(description: 'Paginated collection of tax records'),
],
),
),
new Get(
uriTemplate: '/taxes/{id}',
uriVariables: ['id' => new Link(fromClass: Taxe::class, identifiers: ['id'])],
openapi: new Operation(
summary: 'Get a single tax record by ID',
description: 'Returns a tax record with all amounts and rates for a commune.',
responses: [
'200' => new Response(description: 'Tax record details'),
'404' => new Response(description: 'Tax record not found'),
],
),
),
]
)]
#[QueryParameter(key: 'commune_code', description: 'Filter by commune INSEE code (e.g. 76540)', filter: EqualsFilter::class)]
#[QueryParameter(key: 'commune_name', description: 'Filter by commune name', filter: EqualsFilter::class)]
#[QueryParameter(key: 'department_id', description: 'Filter by department code (e.g. 76)', filter: EqualsFilter::class, property: 'department_id')]
#[QueryParameter(key: 'year', description: 'Filter by year (2019-2022)', filter: EqualsFilter::class)]
#[QueryParameter(key: 'sort[:property]', description: 'Sort by property (e.g. sort[year]=asc)', filter: EqualsFilter::class)]
// Tax field constants
public const FIELD_TFPNB = 'tfpnb';
public const FIELD_TFPB = 'tfpb';
public const FIELD_TH = 'th';
public const FIELD_CFE = 'cfe';
public const ALLOWED_STAT_FIELDS = [
self::FIELD_TFPNB,
self::FIELD_TFPB,
self::FIELD_TH,
self::FIELD_CFE,
];
public const AMOUNT_FIELDS = [
'tfpnb_amount' => self::FIELD_TFPNB,
'tfpb_amount' => self::FIELD_TFPB,
'th_amount' => self::FIELD_TH,
'cfe_amount' => self::FIELD_CFE,
];
public const PERCENTAGE_FIELDS = [
'tfpnb_percentage' => self::FIELD_TFPNB,
'tfpb_percentage' => self::FIELD_TFPB,
'th_percentage' => self::FIELD_TH,
'cfe_percentage' => self::FIELD_CFE,
];
'commune_code',
'commune_name',
'department_id',
'tfpnb_amount',
'tfpnb_percentage',
'tfpb_amount',
'tfpb_percentage',
'th_amount',
'th_percentage',
'cfe_amount',
'cfe_percentage',
'year'
];
protected $casts = [
'tfpnb_percentage' => 'float',
'tfpb_percentage' => 'float',
'th_percentage' => 'float',
'cfe_percentage' => 'float',
'tfpnb_amount' => 'float',
'tfpb_amount' => 'float',
'th_amount' => 'float',
'cfe_amount' => 'float',
protected $table = 'taxes';
public $timestamps = false;
/**
* Get the department that owns the tax record.
*/
public function department()
{
return $this->belongsTo(Department::class, 'department_id', 'department_id');
}
}