Commit 81b9fdeb by Damien Moulard

add params to household allowance calculation & add allowance cap at calculation with param

parent 3b0eeba8
......@@ -205,6 +205,8 @@ class AdherentAdmin extends AbstractAdmin
;
if ($tav_env) {
$mlc = $em->getRepository(GlobalParameter::class)->val(GlobalParameter::MLC_SYMBOL);
if ($this->getConfigurationPool()->getContainer()->getParameter('ccas_mode')) {
$formMapper
->tab('General')
......@@ -325,6 +327,14 @@ class AdherentAdmin extends AbstractAdmin
$cotisSectionInfo .= " " . $adherent->getProfilDeCotisation() . ".";
}
$maxAllocationAmount = $em->getRepository(GlobalParameter::class)
->val(GlobalParameter::SSA_HOUSEHOLD_MAX_ALLOCATION_AMOUNT);
if (null !== $maxAllocationAmount && '' !== $maxAllocationAmount) {
$allowanceCalculationLimitationMsg = " dans la limite de {$maxAllocationAmount} {$mlc}";
} else {
$allowanceCalculationLimitationMsg = '';
}
// Add cotisation info
$formMapper
->tab('General')
......@@ -341,7 +351,7 @@ class AdherentAdmin extends AbstractAdmin
'label' => 'Montant d\'allocation prévu en fonction du foyer (en MonA)',
'disabled' => true,
'required' => false,
'help' => 'Le montant de l\'allocation sera calculé automatiquement en fonction des informations du foyer une fois les informations sauvegardées.'
'help' => "Le montant de l'allocation sera calculé automatiquement en fonction des informations du foyer une fois les informations sauvegardées{$allowanceCalculationLimitationMsg}."
])
->end()
->end();
......@@ -453,7 +463,6 @@ class AdherentAdmin extends AbstractAdmin
if (!empty($adherent) && !empty($adherent->getEmlcAccount()) ) {
$balance = $adherent->getEmlcAccount()->getBalance();
$mlc = $em->getRepository(GlobalParameter::class)->val(GlobalParameter::MLC_SYMBOL);
$formMapper
->tab('General')
->with('Informations de cotisation')
......
......@@ -29,7 +29,7 @@ class DependentChild
/**
* @ORM\Column(type="boolean")
*/
private $olderThanFourteen;
private $olderThanLimitAge;
/**
* @var float
......@@ -57,14 +57,14 @@ class DependentChild
return $this;
}
public function getOlderThanFourteen()
public function getOlderThanLimitAge()
{
return $this->olderThanFourteen;
return $this->olderThanLimitAge;
}
public function setOlderThanFourteen($olderThanFourteen)
public function setOlderThanLimitAge($olderThanLimitAge)
{
$this->olderThanFourteen = $olderThanFourteen;
$this->olderThanLimitAge = $olderThanLimitAge;
return $this;
}
......
......@@ -61,6 +61,12 @@ class GlobalParameter
const SSA_SIMPL_HOUSEHOLD_ADMIN_TEXT_INFO_ADHERENT_FALLBACKS_TO_PROFILECOTIS = 'SSA_SIMPL_HOUSEHOLD_ADMIN_TEXT_INFO_ADHERENT_FALLBACKS_TO_PROFILECOTIS';
const SSA_DISABLE_COTISATION = 'SSA_DISABLE_COTISATION';
const SSA_FORCE_ALLOCATION_AMOUNT = 'SSA_FORCE_ALLOCATION_AMOUNT';
const SSA_HOUSEHOLD_BASE_AMOUNT = 'SSA_HOUSEHOLD_BASE_AMOUNT';
const SSA_HOUSEHOLD_SECONDARY_AMOUNT = 'SSA_HOUSEHOLD_SECONDARY_AMOUNT';
const SSA_HOUSEHOLD_DEPENDANT_CHILD_LIMIT_AGE = 'SSA_HOUSEHOLD_DEPENDANT_CHILD_LIMIT_AGE';
const SSA_HOUSEHOLD_DEPENDANT_CHILD_UNDER_LIMIT_AMOUNT = 'SSA_HOUSEHOLD_DEPENDANT_CHILD_UNDER_LIMIT_AMOUNT';
const SSA_HOUSEHOLD_USE_SHARED_CUSTODY = 'SSA_HOUSEHOLD_USE_SHARED_CUSTODY';
const SSA_HOUSEHOLD_MAX_ALLOCATION_AMOUNT = 'SSA_HOUSEHOLD_MAX_ALLOCATION_AMOUNT';
/**
* @var \Ramsey\Uuid\UuidInterface
*
......@@ -130,7 +136,7 @@ class GlobalParameter
return $this->value;
}
public function setValue(string $value): self
public function setValue(?string $value): self
{
$this->value = $value;
......
......@@ -7,29 +7,43 @@ use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Doctrine\ORM\EntityManagerInterface;
use App\Entity\GlobalParameter;
class DependentChildFormType extends AbstractType
{
protected $em;
public function __construct(EntityManagerInterface $em) {
$this->em = $em;
}
public function buildForm(FormBuilderInterface $builder, array $options)
{
$dependantChildAge = $this->em->getRepository(GlobalParameter::class)->val(GlobalParameter::SSA_HOUSEHOLD_DEPENDANT_CHILD_LIMIT_AGE);
$builder
->add('olderThanFourteen', ChoiceType::class, array(
->add('olderThanLimitAge', ChoiceType::class, array(
'choices' => [
'oui' => true,
'non' => false
],
'label' => "A-t-il plus de 14 ans ?",
'label' => "A-t-il plus de {$dependantChildAge} ans ?",
'required' => true,
'expanded' => true
))
;
if ('true' === $this->em->getRepository(GlobalParameter::class)->val(GlobalParameter::SSA_HOUSEHOLD_USE_SHARED_CUSTODY)) {
$builder
->add('sharedCustodyPercentage', ChoiceType::class, [
'label' => "Est-il en garde partagée ?",
'required' => true,
'choices' => [
'non' => null,
'oui : je le garde 25 % du temps' => '0.25',//using strings as values (and not floats) seems required
'oui : je le garde 50 % du temps' => '0.50',//to make display work fine
'oui : je le garde 25 % du temps' => '0.25',
'oui : je le garde 50 % du temps' => '0.50',
'oui : je le garde 75 % du temps' => '0.75',
],
'required' => false,
......@@ -37,6 +51,7 @@ class DependentChildFormType extends AbstractType
])
;
}
}
public function configureOptions(OptionsResolver $resolver)
{
......
<?php
declare(strict_types=1);
namespace DoctrineMigrations;
use Doctrine\DBAL\Schema\Schema;
use Doctrine\Migrations\AbstractMigration;
/**
* Auto-generated Migration: Please modify to your needs!
*/
final class Version20250411113705 extends AbstractMigration
{
public function getDescription() : string
{
return '';
}
public function up(Schema $schema) : void
{
// this up() migration is auto-generated, please modify it to your needs
$this->addSql("INSERT INTO global_parameter (id, name, description, value, mandatory) VALUES (UUID(), 'SSA_HOUSEHOLD_BASE_AMOUNT', 'Valeur de la part de base dans l\allocation par foyer', '150', '1')");
$this->addSql("INSERT INTO global_parameter (id, name, description, value, mandatory) VALUES (UUID(), 'SSA_HOUSEHOLD_SECONDARY_AMOUNT', 'Valeur des autres parts dans l\allocation par foyer (e.g. à partir du deuxième adulte, enfants à charge, etc...)', '75', '1')");
$this->addSql("INSERT INTO global_parameter (id, name, description, value, mandatory) VALUES (UUID(), 'SSA_HOUSEHOLD_DEPENDANT_CHILD_LIMIT_AGE', 'Age limite des enfants à charge', '14', '1')");
$this->addSql("INSERT INTO global_parameter (id, name, description, value, mandatory) VALUES (UUID(), 'SSA_HOUSEHOLD_DEPENDANT_CHILD_UNDER_LIMIT_AMOUNT', 'Si défini, valeur des parts pour les enfants à charge sous la limite d\'age. Si non défini, utilise SSA_HOUSEHOLD_SECONDARY_AMOUNT pour tous les enfants à charge.', null, '0')");
$this->addSql("INSERT INTO global_parameter (id, name, description, value, mandatory) VALUES (UUID(), 'SSA_HOUSEHOLD_USE_SHARED_CUSTODY', 'Si la valeur est à true, active et prend en compte la garde partagé pour les enfants à charge dans le calcul de l\'allocation', 'true', '0')");
$this->addSql("INSERT INTO global_parameter (id, name, description, value, mandatory) VALUES (UUID(), 'SSA_HOUSEHOLD_MAX_ALLOCATION_AMOUNT', 'Si une valeur est renseignée, applique la valeur comme plafond de montant d\'allocation dans le calcul', null, '0')");
$this->addSql('ALTER TABLE dependent_child CHANGE older_than_fourteen older_than_limit_age TINYINT(1) NOT NULL');
}
public function down(Schema $schema) : void
{
$this->addSql("DELETE FROM global_parameter WHERE name='SSA_HOUSEHOLD_BASE_AMOUNT'");
$this->addSql("DELETE FROM global_parameter WHERE name='SSA_HOUSEHOLD_SECONDARY_AMOUNT'");
$this->addSql("DELETE FROM global_parameter WHERE name='SSA_HOUSEHOLD_DEPENDANT_CHILD_LIMIT_AGE'");
$this->addSql("DELETE FROM global_parameter WHERE name='SSA_HOUSEHOLD_DEPENDANT_CHILD_UNDER_LIMIT_AMOUNT'");
$this->addSql("DELETE FROM global_parameter WHERE name='SSA_HOUSEHOLD_USE_SHARED_CUSTODY'");
$this->addSql("DELETE FROM global_parameter WHERE name='SSA_HOUSEHOLD_MAX_ALLOCATION_AMOUNT'");
$this->addSql('ALTER TABLE dependent_child CHANGE older_than_limit_age older_than_fourteen TINYINT(1) NOT NULL');
// this down() migration is auto-generated, please modify it to your needs
}
}
......@@ -175,13 +175,15 @@ class TAVCotisationUtils
* allowance based on user's household.
*
* Rules are as follow:
* - 150 emlc for the first person in user's household
* - 75 emlc for each other adult
* - 75 emlc amount for each dependant child, with a percentage applied if the child is in shared custody:
* 25%, 50% or 75% depending on the shared custody arrangement
*
* Once the full amount is calculated, cap user's balance.
* User account balance is capped at twice the amount previously calculated.
* - [SSA_HOUSEHOLD_BASE_AMOUNT] emlc for the first person in user's household
* - [SSA_HOUSEHOLD_SECONDARY_AMOUNT] emlc for each other adult
* - [SSA_HOUSEHOLD_SECONDARY_AMOUNT] emlc for each dependant child above [SSA_HOUSEHOLD_DEPENDANT_CHILD_LIMIT_AGE]
* - if SSA_HOUSEHOLD_DEPENDANT_CHILD_UNDER_LIMIT_AMOUNT is defined:
* [SSA_HOUSEHOLD_DEPENDANT_CHILD_UNDER_LIMIT_AMOUNT] emlc for each dependant child under [SSA_HOUSEHOLD_DEPENDANT_CHILD_LIMIT_AGE]
* else
* [SSA_HOUSEHOLD_SECONDARY_AMOUNT] for all dependant child
* - if SSA_HOUSEHOLD_USE_SHARED_CUSTODY is true:
* apply a percentage if the child is in shared custody: 25%, 50% or 75% depending on the shared custody arrangement
*
* @param Adherent $adherent (by ref)
*/
......@@ -195,30 +197,56 @@ class TAVCotisationUtils
return;
}
// base allowance, for one adult
$mlcAllowanceAmount = 150;
$adultsCount = $adherent->getHouseholdAdultCount();
if ($adultsCount == null) {
return;
}
// base allowance, for the first adult
$mlcAllowanceAmount = (int) $this->em->getRepository(GlobalParameter::class)
->val(GlobalParameter::SSA_HOUSEHOLD_BASE_AMOUNT);
// Get amount for the other houshold members
$mclSecondaryAmount = (int) $this->em->getRepository(GlobalParameter::class)
->val(GlobalParameter::SSA_HOUSEHOLD_SECONDARY_AMOUNT);
// increment for each other adult in the household
$mlcAllowanceAmount += 75 * ($adultsCount - 1);
$mlcAllowanceAmount += $mclSecondaryAmount * ($adultsCount - 1);
// increment allowance for each dependant child, depending on the shared custody arrangement
$useSharedCustody = $this->em->getRepository(GlobalParameter::class)
->val(GlobalParameter::SSA_HOUSEHOLD_SECONDARY_AMOUNT);
$childUnderLimitAmount = (int) $this->em->getRepository(GlobalParameter::class)
->val(GlobalParameter::SSA_HOUSEHOLD_DEPENDANT_CHILD_UNDER_LIMIT_AMOUNT);
$dependentChildren = $adherent->getDependentChildren();
foreach ($dependentChildren as $child) {
$childAllowanceAmount = 75;
$childAllowanceAmount = $mclSecondaryAmount;
// Different value for children under limit age, if activated
if (true === $child->getOlderThanLimitAge() && null !== $childUnderLimitAmount) {
$childAllowanceAmount = (int) $childUnderLimitAmount;
}
// Apply shared custody percentage activated and set
if ('true' === $useSharedCustody) {
$sharedCustodyPercentage = $child->getSharedCustodyPercentage();
if ($sharedCustodyPercentage != null) {
$childAllowanceAmount = $childAllowanceAmount * $sharedCustodyPercentage;
}
}
$mlcAllowanceAmount += $childAllowanceAmount;
}
$maxAllocationAmount = $this->em->getRepository(GlobalParameter::class)
->val(GlobalParameter::SSA_HOUSEHOLD_MAX_ALLOCATION_AMOUNT);
// Apply cap if activated in configuration
if (null !== $maxAllocationAmount && 0 !== intval($maxAllocationAmount) && $mlcAllowanceAmount > intval($maxAllocationAmount)) {
$mlcAllowanceAmount = intval($maxAllocationAmount);
}
$adherent->setAllocationAmount($mlcAllowanceAmount);
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment