Repository navigation
Conversation
|
Attention web/sources/AppBundle/Event/Entity/SponsorTicket.php Lines 20 to 37 in 3fa33e3 Un |
…nsors Sur une soumission vide ou remplie d'espaces, le composant Form convertit la valeur en null, ce qui provoquait une erreur de typage sur les propriétés non nullables de SponsorTicket au lieu d'un message de validation. - empty_data => '' sur les champs texte de SponsorTokenType - empty_data => '0' sur maxInvitations (même classe de bug, Champ integer) - #Assert\NotBlank rétabli sur SponsorTicket::$societe (perdu dans la migration Ting) Retour de la review afup#2416 (vgreb).
|
Merci pour la review, corrigé dans 493be7d :
La checkbox |
|
|
||
| public function addTicketToSponsor(SponsorTicket $sponsorTicket, Ticket $ticket): void | ||
| { | ||
| $invoice = $this->invoiceFactory->createInvoiceFromSponsorTicket($sponsorTicket); |
There was a problem hiding this comment.
Le save() Doctrine ne fait pas partie de la transaction Ting : Doctrine (PDO) et Ting (mysqli) ouvrent chacun leur propre connexion, et flush() commite immédiatement. Pour que le compteur ne puisse que surestimer en cas d'échec (le quota est contrôlé via getPendingInvitations()), on réserve l'invitation avant la transaction et on la libère si la transaction échoue.
$invoice = $this->invoiceFactory->createInvoiceFromSponsorTicket($sponsorTicket);
$isNewTicket = $ticket->getId() === null;
if ($isNewTicket) {
// Réservée hors transaction Ting (connexion Doctrine distincte) :
// en cas d'échec entre les deux écritures, le compteur surestime, sans risque de dépasser le quota
$sponsorTicket->usedInvitations++;
$this->sponsorTicketRepository->save($sponsorTicket);
}
try {
$this->invoiceRepository->startTransaction();
$this->invoiceRepository->save($invoice);
$this->ticketRepository->save($ticket);
$this->invoiceRepository->commit();
} catch (Exception) {
$this->invoiceRepository->rollback();
if ($isNewTicket) {
$sponsorTicket->usedInvitations--;
$this->sponsorTicketRepository->save($sponsorTicket);
}
}| @@ -50,7 +50,7 @@ | |||
| try { | |||
There was a problem hiding this comment.
Même problème : la décrémentation est commitée par Doctrine avant le commit() Ting. Si ce dernier échoue, le ticket existe toujours alors que l'invitation a été rendue. On ne libère l'invitation qu'une fois la suppression commitée.
try {
$this->ticketRepository->startTransaction();
$this->ticketRepository->delete($ticket);
$this->ticketRepository->commit();
} catch (Exception) {
$this->ticketRepository->rollback();
return;
}
// Libérée seulement après le commit Ting (connexion Doctrine distincte) :
// si cette écriture échoue, le compteur surestime, sans risque de dépasser le quota
$sponsorTicket->usedInvitations--;
$this->sponsorTicketRepository->save($sponsorTicket);…nsors Sur une soumission vide ou remplie d'espaces, le composant Form convertit la valeur en null, ce qui provoquait une erreur de typage sur les propriétés non nullables de SponsorTicket au lieu d'un message de validation. - empty_data => '' sur les champs texte de SponsorTokenType - empty_data => '0' sur maxInvitations (même classe de bug, Champ integer) - #Assert\NotBlank rétabli sur SponsorTicket::$societe (perdu dans la migration Ting) Retour de la review afup#2416 (vgreb).
493be7d to
5564c37
Compare
Description
Migre l'entité des tokens sponsors (billetterie des sponsors) de l'ORM maison Ting vers Doctrine ORM, conformément à l'ADR-002 (entité à propriétés publiques, repository Doctrine) et à l'ADR-001 (vocabulaire métier en français :
societe,inscription). Aucun changement de schéma de base de données.Changes
societe(libellé inchangé)How to test
make test-integrationpour le nouveau test du repository