Licensed under the GNU AGPL v3 license. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Affero Public License as published by the Free Software Foundation, version 3. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Affero Public License for more details. You should have received a copy of the GNU General Affero Public License along with this program. If not, see . *********************************************************************** Références http://www.legifrance.gouv.fr/affichTexte.do?cidTexte=JORFTEXT000020466929 http://www.unedic.org/juridique/l-indemnisation-du-chomage Calcul Pole emploi: https://www.pole-emploi.fr/simulation/resultatdroits RG = Règlement général annexé à la Convention du 19 février 2009 http://www.unedic.org/Textes/reglement-general-annexe-a-la-convention-du-19-fevrier-2009 */ /** TODO - Gestion des contributions sociales alsace-moselle - Taux réduit de CSG pour les faibles revenus (ou faibles allocations ? pas pareil du coup..) - Calcul spécifique chômage saisonnier - Spécificités licenciement économique - Travail temps partiel - Autres spécificités (faire une repasse) - Plus d'infos et doc sur les spécificités **/ class Calcul { // Mise à jour des données en regard des changements législatifs et réglementaires const MISE_A_JOUR = '2013-01-01'; /** * RG art.3 * la période d’affiliation doit être au moins égale à 122 jours, ou 610 heures de travail */ const DUREE_MINIMALE_COTISATION = '122'; /** * Plafond de salaire mensuel * * RG Art. 13 - § 2 * Le salaire de référence ainsi déterminé ne peut dépasser la somme des salaires * mensuels plafonnés conformément à l'article 43 du règlement et compris dans la * période de référence. * * Source : http://www.unedic.org/documents/DAJ/Juridique/ci200929.pdf */ const PLAFOND_MENSUEL = 12344; /** * Délai de carence minimal * * RG Art. 22 * La prise en charge est reportée au terme d’un délai d’attente de 7 jours. */ const CARENCE_MINIMALE = 7; /** * Part fixe du calcul de l'ARE * Revalorisé chaque année au 1er juillet * * Source : http://www.unedic.org/actualites/revalorisation-des-allocations-au-1er */ const ARE_FIXE = 11.57; /** * Montant minimal de l'allocation journalière * Revalorisé chaque année au 1er juillet * Source : http://www.unedic.org/actualites/revalorisation-des-allocations-au-1er */ const ARE_MINIMALE = 28.21; /** * Contribution sociale généralisée (CSG) * * Source : http://www.unedic.org/Juridique/retenues-sociales-sur-les-allocations */ const CONTRIBUTION_CSG_TAUX = 0.062; const CONTRIBUTION_CSG_ASSIETTE = 0.97; const CONTRIBUTION_CSG_SEUIL = 47; /** * contribution au remboursement de la dette sociale (CRDS) * * Source : http://www.unedic.org/Juridique/retenues-sociales-sur-les-allocations */ const CONTRIBUTION_CRDS_TAUX = 0.005; const CONTRIBUTION_CRDS_ASSIETTE = 0.97; const CONTRIBUTION_CRDS_SEUIL = 47; /** * Contribution retraite complémentaire (CRC) * * RG Art. 19 * Une participation de 3 % assise sur le salaire journalier de référence est retenue * sur l’allocation journalière. * Le prélèvement de cette participation ne peut avoir pour effet de réduire le montant * des allocations tel qu'il est fixé au dernier alinéa de l'article 15. */ const CONTRIBUTION_CRC_TAUX = 0.03; const CONTRIBUTION_CRC_SEUIL = self::ARE_MINIMALE; public $Date_Naissance = null; public $Date_Debut = null; public $Date_Fin = null; public $Salaires = array(); public $Primes_Annuelles = array(); public $Suspensions = array(); public $Indemnite_Extra = 0; public $Indemnite_Conges = 0; public function getDuree() { if (!$this->Date_Debut || !$this->Date_Fin) return false; $duree = $this->Date_Fin - $this->Date_Debut; return round($duree / 3600 / 24); } // Art. 11 § 3 public function getDureeIndemnisation() { if (!$this->Date_Naissance || !$this->Date_Debut || !$this->Date_Fin) return false; $Diff = $this->getDuree(); $Age = $this->getAge($this->Date_Fin); // Pour les salariés privés d’emploi âgés de 50 ans ou plus à la // date de fin de leur contrat de travail, cette limite est portée à 1095 jours (36 mois) if ($Age >= 50 && $Diff > 1095) return 1095; // Sinon 24 mois (730 jours) if ($Diff > 730) return 730; if ($Diff < 122) return 122; return $Diff; } public function getAge($Date_Relative) { if (!$Date_Relative) { $Date_Relative = time(); } $Annees = date('Y', $Date_Relative) - date('Y', $this->Date_Naissance); if (date('m', $this->Date_Naissance) < date('m', $Date_Relative) || (date('m', $this->Date_Naissance) == date('m', $Date_Relative) && date('d', $this->Date_Naissance) <= date('d', $Date_Relative))) $Annees--; return $Annees; } public function getListeMois() { $Liste_Mois = array(); $Avant = $this->Date_Fin - (3600 * 24 * 365); if ($this->Date_Debut > $Avant) $Avant = $this->Date_Debut; $Annee_Debut = date('Y', $Avant); $Mois_Debut = date('n', $Avant); $Annee_Fin = date('Y', $this->Date_Fin); $Mois_Fin = date('n', $this->Date_Fin); for ($a = $Annee_Debut; $a <= $Annee_Fin; $a++) { for ($m = $Mois_Debut; $m <= 12; $m++) { if ($m == $Mois_Fin && $a == $Annee_Fin) { break; } $Liste_Mois[] = $a . sprintf('%02d', $m); } $Mois_Debut = 1; } // Toutes les fois que le dernier jour correspond au terme d'un mois civil, // ce mois est inclus dans la période de référence (décalage de la période). $Nb_Jours_Dernier_Mois = date('t', $this->Date_Fin); if (date('d', $this->Date_Fin) == $Nb_Jours_Dernier_Mois) { array_shift($Liste_Mois); array_push($Liste_Mois, $Annee_Fin . $m); } return $Liste_Mois; } public function getListeAnnees() { $Liste_Annees = array(); $mois = self::getListeMois(); foreach ($mois as $v) { $a = substr($v, 0, 4); if (!in_array($a, $Liste_Annees)) $Liste_Annees[] = $a; } return $Liste_Annees; } public function AjouterSalaire($mois, $salaire) { $this->Salaires[(int)$mois] = (int)$salaire; return true; } public function AjouterPrimesAnnuelles($annee, $primes) { $this->Primes_Annuelles[(int)$annee] = (int)$primes; return true; } public function AjouterSuspensions($mois, $jours) { $this->Suspensions[(int)$mois] = (int)$jours; return true; } public function getSJR() { if (empty($this->Salaires) || !$this->Date_Debut || !$this->Date_Fin) return false; $salaire_annuel = 0; /* ART. 14 § 4 Le salaire journalier moyen de référence est égal au quotient du salaire de référence défini ci-dessus par le nombre de jours d'appartenance au titre desquels ces salaires ont été perçus, dans la limite de 365 jours. Les jours pendant lesquels le salarié n'a pas appartenu à une entreprise, les jours d'absence non payés et, d'une manière générale, les jours n'ayant pas donné lieu à une rémunération normale au sens du paragraphe précédent sont déduits du nombre de jours d'appartenance. */ $nb_jours = ($this->Date_Fin - $this->Date_Debut) / 3600 / 24; if ($nb_jours > 365) $nb_jours = 365; /* Ainsi, si dans la période de référence sont comprises des périodes de maladie, de maternité ou, d'une manière plus générale, des périodes de suspension du contrat de travail n'ayant pas donné lieu à une rémunération normale, ces rémunérations ne sont pas prises en compte dans le salaire de référence. */ foreach ($this->Salaires as $mois=>$value) { if ($value > self::PLAFOND_MENSUEL) $value = self::PLAFOND_MENSUEL; $salaire_annuel += (int) $value; } // ART. 14 § 1 // En conséquence, les indemnités de 13e mois, les primes de bilan, les gratifications // perçues au cours de cette période ne sont retenues que pour la fraction afférente à ladite période. // Les salaires, gratifications, primes, dont le paiement est subordonné à l'accomplissement // d'une tâche particulière ou à la présence du salarié à une date déterminée, sont considérés // comme des avantages dont la périodicité est annuelle. // DONC -> calcul de la fraction $annees = array(); $annees[date('Y', $this->Date_Fin)] = 365 - date('z', $this->Date_Fin); $avant = $this->Date_Fin - ($nb_jours * 3600 * 24); if (!array_key_exists(date('Y', $avant), $annees)) $annees[date('Y', $avant)] = date('z', $avant); foreach ($annees as $a=>$jours) { if (!empty($this->Primes_Annuelles[$a])) $salaire_annuel += ($this->Primes_Annuelles[$a] * ($jours / 365)); // Calcul Pole-Emploi plus simpliste //$salaire_annuel += $this->Primes_Annuelles[$a]; } $nb_jours -= array_sum($this->Suspensions); $sjr = $salaire_annuel / $nb_jours; return round($sjr, 2); } public function getAllocation() { $sjr = $this->getSJR(); $alloc = ($sjr * (40.4/100)) + self::ARE_FIXE; if ($alloc < ($sjr * (57.4/100))) $alloc = $sjr * (57.4/100); if ($alloc < self::ARE_MINIMALE) $alloc = self::ARE_MINIMALE; if ($alloc > ($sjr * 0.75)) $alloc = ($sjr * 0.75); return round($alloc, 2); } public function getAllocationNette() { $alloc = $this->getAllocation(); $sjr = $this->getSJR(); // Cotisation Retraite Complémentaire (CRC) // Une participation de 3 % assise sur le salaire journalier de référence est retenue sur l’allocation journalière $crc = ($sjr * self::CONTRIBUTION_CRC_TAUX); $crc = round($crc, 2); // Le prélèvement de cette participation ne peut avoir pour effet de réduire le montant // des allocations tel qu'il est fixé au dernier alinéa de l'article 15. if ($alloc - $crc < self::CONTRIBUTION_CRC_SEUIL) $crc = 0; $csg = 0; $crds = 0; // Attention le simulateur pole emploi ainsi que le calcul pôle emploi de référence // ne semblent pas être corrects et calculent un taux plus bas de CSG (?!) // FIXME taux réduit pour les faibles revenus // http://www.securite-sociale.fr/comprendre/dossiers/comptes/2009/ccss200906_fic-07-1.pdf // "CSG à 3,8% pour les personnes non imposables dont le revenu fiscal est supérieur // à un certain barème, variable selon le nombre de personnes à charge." $csg = ($alloc * self::CONTRIBUTION_CSG_ASSIETTE) * self::CONTRIBUTION_CSG_TAUX; $csg = round($csg, 2); if ($alloc - $csg < self::CONTRIBUTION_CSG_SEUIL) $csg = 0; // Contributions au Remboursement de la Dette Sociale (CRDS) $crds = ($alloc * self::CONTRIBUTION_CRDS_ASSIETTE) * self::CONTRIBUTION_CRDS_TAUX; $crds = round($crds, 2); if ($alloc - $crds < self::CONTRIBUTION_CRDS_SEUIL) $csg = 0; $alloc = $alloc - $csg - $crds - $crc; return round($alloc, 2); } public function getCarenceMinimale() { return self::CARENCE_MINIMALE; } public function getCarenceConges() { $sjr = $this->getSJR(); if (!$sjr) return 0; return floor($this->Indemnite_Conges / $sjr); } public function getCarenceExtra() { if (empty($this->Indemnite_Extra)) return 0; $sjr = $this->getSJR(); $jours = (int) ($this->Indemnite_Extra / $sjr); if ($jours > 75) $jours = 75; return $jours; } } if (!headers_sent()) { header('X-Powered-ARE: ARE Calcul object, updated '.Calcul::MISE_A_JOUR.', by bohwaz (C) 2010 AGPL-licensed'); } ?>