@php $intEuro = fn (int $euros): string => number_format($euros, 0, ',', "\u{202F}").' €'; $roundEuro = fn ($money): int => (int) round($money->cents / 100); $formatPeriodFormula = function (array $period): string { $note = (int) $period['fullDays'].' j × '.number_format($period['dailyRate'], 2, ',', ' ').' €'; if ($period['partialHours'] > 0) { $note .= ' + '.rtrim(rtrim(number_format($period['partialHours'], 2, ',', ''), '0'), ',').' h × '.number_format($period['dailyRate'] / 8, 2, ',', ' ').' €'; } return $note; }; $initials = function (string $name): string { $letters = collect(preg_split('/\s+/', trim($name))) ->filter() ->take(2) ->map(fn ($part) => mb_strtoupper(mb_substr($part, 0, 1))); return $letters->implode('') ?: '?'; }; $smicBracketsByRate = collect(\App\Domain\Tax\SmicAbatementScale::bracketsForYear($year)) ->keyBy(fn ($bracket) => number_format($bracket['smic'], 2, '.', '')); $employerDetail = function ($group) use ($intEuro, $roundEuro, $formatPeriodFormula, $initials, $year, $smicBracketsByRate): array { return [ 'title' => $group->employer->display_name, 'initials' => $initials($group->employer->display_name), 'subtitle' => $group->employer->primary_pajemploi_number ? 'N° Pajemploi '.$group->employer->primary_pajemploi_number : '', 'children' => $group->rows->map(function ($r) use ($formatPeriodFormula, $year, $smicBracketsByRate) { $periods = collect($r->rateBreakdown)->map(function ($period) use ($smicBracketsByRate, $formatPeriodFormula) { $smicLabel = number_format($period['smic'], 2, ',', ' ').' €'; $bracket = $smicBracketsByRate->get(number_format($period['smic'], 2, '.', '')); $periodLabel = $bracket !== null ? 'Valeur du SMIC du '.\Carbon\CarbonImmutable::parse($bracket['from'])->format('d/m/Y').' au '.\Carbon\CarbonImmutable::parse($bracket['to'])->format('d/m/Y').' : '.$smicLabel.'/heure' : null; return [ 'fullDays' => (int) $period['fullDays'], 'hasFullDays' => $period['fullDays'] > 0, 'smicLabel' => $smicLabel, 'periodLabel' => $periodLabel, 'dailyRateLabel' => number_format($period['dailyRate'], 2, ',', ' ').' €', 'hourlyRateLabel' => number_format($period['dailyRate'] / 8, 2, ',', ' ').' €', 'hasPartialHours' => $period['partialHours'] > 0, 'partialHoursLabel' => $period['partialHours'] > 0 ? rtrim(rtrim(number_format($period['partialHours'], 2, ',', ''), '0'), ',').' h' : null, 'formula' => $formatPeriodFormula($period), 'abatement' => \App\Domain\Shared\Money::fromCents($period['abatementCents'])->format(), ]; })->values(); return [ 'name' => $r->child->display_name, 'imposable' => $r->imposable->format(), 'exemptOvertime' => $r->exemptOvertime->format(), 'abatement' => $r->abatementBrut->format(), 'rateBreakdown' => $periods, ]; })->all(), 'totalImposable' => $group->totalImposable->format(), 'totalExemptOvertime' => $group->totalExemptOvertime->format(), 'totalAbatementBrut' => $group->totalAbatementBrut->format(), 'totalAbatementFormulaLabel' => 'Calculé '.$year.' ('.$group->rows ->flatMap(fn ($row) => collect($row->rateBreakdown)->pluck('abatementCents')) ->map(fn ($cents) => \App\Domain\Shared\Money::fromCents($cents)->format()) ->implode(' + ').')', 'isCapped' => $group->isCapped, 'totalAbatement' => $group->totalAbatement->format(), 'totalImposableRounded' => $intEuro($roundEuro($group->totalImposable)), 'totalAbatementRounded' => $intEuro($roundEuro($group->totalAbatement)), 'totalToDeclareExact' => $group->totalToDeclare->format(), 'totalToDeclareRounded' => $intEuro($group->totalToDeclareRounded), 'totalToDeclareRoundedRaw' => (string) $group->totalToDeclareRounded, 'totalImposableRoundedRaw' => (string) $roundEuro($group->totalImposable), 'totalAbatementRoundedRaw' => (string) $roundEuro($group->totalAbatement), ]; }; $originalByEmployerId = $groups->keyBy(fn ($group) => $group->employer->id); @endphp

Ma déclaration d'impôts {{ $year }}

{{ $groups->count() }} parent{{ $groups->count() > 1 ? 's' : '' }} employeur{{ $groups->count() > 1 ? 's' : '' }} · abattement forfaitaire déjà déduit · à reporter case 1AJ

Déclarer sur impots.gouv.fr
@if ($groups->isEmpty())

Aucun revenu calculable pour {{ $year }}. Une fois vos contrats et votre planning à jour, votre déclaration se prépare ici automatiquement.

@else
Revenu imposable {{ $year }} {{ $totalImposable->format() }} Salaires nets imposables déclarés par mes {{ $groups->count() }} parent{{ $groups->count() > 1 ? 's' : '' }} employeur{{ $groups->count() > 1 ? 's' : '' }} à Pajemploi.
Abattement calculé par naneasy − {{ $totalAbatement->format() }} {{ (int) $totalFullDays }} jours d'accueil × {{ number_format($referenceDailyRate, 2, ',', ' ') }} € (3 × SMIC horaire brut), plafonné au revenu de chaque employeur.
Revenu imposable après abattement
{{ $intEuro($totalToDeclareRounded) }}
Montants arrondis à l'euro, comme l'attend la déclaration 2042.

Mes corrections

La base imposable affichée peut différer de celle indiquée par les impôts. Le calcul de l'abattement n'est basé sur cette base imposable que pour calculer le plafond: il dépend du nombre de jours et d'heures de garde enregistrés. L'administration fiscale peut parfois récupérer vos revenus de décembre à décembre ou se tromper en cas de fin de contrat, ou déclaration tardive d'un parent employeur. Si vous n'êtes pas rassuré(e), saisissez le revenu imposable et les heures sup. exonérées affichés par votre espace impots.gouv.fr ou votre attestation Pajemploi quand ils diffèrent afin que naneasy recalcule l'abattement et le montant à reporter à partir des montants. Un champ laissé vide comptera pour 0 €.
@include('declarations._naneasy-table')
N° Pajemploi Parent employeur Jours de garde Heures partielles Revenu imposable Heures sup. exonérées Abattement forfaitaire
@foreach ($correctedGroups as $correctedGroup) @php $employerId = $correctedGroup->employer->id; $original = $originalByEmployerId[$employerId]; @endphp
{{ $correctedGroup->employer->primary_pajemploi_number ?? '—' }}
{{ $correctedGroup->employer->display_name }}
{{ number_format($original->totalFullDays, 2, ',', ' ') }} j
{{ number_format($original->totalPartialHours, 2, ',', ' ') }} h
@endforeach
@if ($hasAnyOverride)
@csrf @method('DELETE')
@endif
@php $cappedEmployerNames = $groups->where('isCapped', true)->map(fn ($g) => $g->employer->display_name)->values(); @endphp

Comment naneasy calcule mon abattement

Jours d'accueil × 3 × SMIC horaire brut = {{ number_format($referenceDailyRate, 2, ',', ' ') }} € / jour et par enfant
  • Un jour d'accueil compte dès 8 heures de garde ; en dessous, l'abattement est proratisé.
  • @if ($cappedEmployerNames->isNotEmpty()) L'abattement d'un employeur ne peut jamais dépasser le revenu qu'il m'a versé — c'est le cas de {{ $cappedEmployerNames->implode(', ') }}. @else L'abattement d'un employeur ne peut jamais dépasser le revenu qu'il m'a versé, tous enfants confondus. @endif
  • Un enfant en situation de handicap (AEEH) ouvre droit à 4 × SMIC horaire brut par jour.
  • Les indemnités d'entretien et de repas que je reçois figurent dans mon revenu imposable, comme sur mon bulletin de salaire ; l'abattement forfaitaire les neutralise au même titre que le reste du salaire.
  • Les heures majorées au-delà de la durée légale sont exonérées d'impôt sur le revenu : je les reporte à part, elles ne sont pas comptées dans mon revenu imposable.

Vérifiez les montants

Les montants affichés sont calculés à partir des contrats et déclarations que vous avez saisis dans naneasy. Ils peuvent différer de ceux de votre attestation fiscale Pajemploi ou de votre déclaration préremplie, notamment si certaines informations sont incomplètes ou ont été modifiées. Ils vous sont fournis à titre indicatif : vous restez responsable de votre déclaration de revenus. Vérifiez-les avant de déclarer et, en cas de doute, contactez votre service des impôts.

@endif