Transaction.php 1.68 KB
Newer Older
Julien Jorry committed
1 2 3 4 5 6 7
<?php

namespace App\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
8 9 10 11 12 13 14 15 16 17 18 19 20
 * TRANSACTION
 * Dans l'interface de gestion de son compte professionnel, un prestataire peut effectuer deux types de virements internes, vers un autre prestataire ou vers un adhérent
 * Pour ajouter il faut un rôle spécifique:
 *     – Adhérent (paiement numérique avec son compte adhérent)
 *     – Prestataire (entre prestataires et virement vers un compte adhérent)
 * La somme des transactions électroniques sont limitées à un million d'euro par année glissante,
 * important donc de contrôler au moins le montant global des 365 derniers jours
 *
 * Types de transaction :
 *
 *   - PRESTATAIRES     =>    ADHERENTS         (Virement vers un adherent)
 *   - PRESTATAIRES     =>    PRESTATAIRES      (Virement entre prestataires)
 *   - ADHERENTS        =>    PRESTATAIRES      (Paiement numérique)
21
 *   - ADHERENTS        =>    ADHERENTS         (transfert de monnaie numérique)
22
 *
Julien Jorry committed
23 24
 * @ORM\Entity
 */
25
abstract class Transaction extends Flux
Julien Jorry committed
26
{
27 28 29 30 31
    /**
     * @return string
     */
    public function getParenttype(): string
    {
32
        return self::TYPE_TRANSACTION;
33
    }
34

Julien Jorry committed
35
    public function operate($em)
36 37 38 39 40 41 42 43 44 45 46 47
    {
        $compteExp = $this->getExpediteur()->getEcompte() - $this->getMontant();
        if ($compteExp < 0) {
            throw new \Exception("[FLUX] Transaction impossible ! Montant supérieur au solde de l'expéditeur !");
        } else {
            $this->getExpediteur()->removeEcompte($this->getMontant());
            $this->getDestinataire()->addEcompte($this->getMontant());

            return [$this->getExpediteur(), $this->getDestinataire()];
        }
        return [];
    }
Julien Jorry committed
48
}