Skip to content

Commit 386db6e

Browse files
committed
wip generator
1 parent 95ddc02 commit 386db6e

11 files changed

Lines changed: 187 additions & 82 deletions

File tree

app/config/services.yml

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,9 @@ services:
2323
CCMBenchmark\Ting\Repository\Repository:
2424
tags: [ 'app.vendor.ting_repository' ]
2525

26+
AppBundle\Accounting\Invoices\Generator\InvoiceGeneration:
27+
tags: [ 'app.invoice_generation_handler' ]
28+
2629
Symfony\Component\HttpFoundation\Session\Storage\Handler\PdoSessionHandler:
2730
public: false
2831
arguments:
@@ -167,6 +170,13 @@ services:
167170
Afup\Site\Forum\Inscriptions:
168171
autowire: true
169172

173+
AppBundle\Accounting\Invoices\Generator\MemberInvoiceGenerator: ~
174+
AppBundle\Accounting\Invoices\Generator\CompanyMemberInvoiceGenerator: ~
175+
176+
AppBundle\Accounting\Invoices\InvoiceGenerator:
177+
arguments:
178+
$handlers: !tagged_iterator app.invoice_generation_handler
179+
170180
Afup\Site\Association\CotisationsFactory:
171181
autowire: true
172182

sources/Afup/Association/Cotisations.php

Lines changed: 44 additions & 73 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,17 @@
55
namespace Afup\Site\Association;
66

77
use Afup\Site\Droits;
8-
use Afup\Site\Utils\Base_De_Donnees;
98
use Afup\Site\Utils\Mailing;
109
use Afup\Site\Utils\PDF_Facture;
1110
use Afup\Site\Utils\Utils;
1211
use Afup\Site\Utils\Vat;
12+
use AppBundle\Accounting\Invoices\InvoiceGenerator;
1313
use AppBundle\Association\MemberType;
14+
use AppBundle\Controller\Admin\Membership\MembershipFeePayment;
15+
use AppBundle\Association\Model\CompanyMember;
1416
use AppBundle\Association\Model\Repository\CompanyMemberRepository;
1517
use AppBundle\Association\Model\Repository\UserRepository;
18+
use AppBundle\Association\Model\User;
1619
use AppBundle\Compta\BankAccount\BankAccountFactory;
1720
use AppBundle\Email\Mailer\Attachment;
1821
use AppBundle\Email\Mailer\Mailer;
@@ -45,45 +48,11 @@ class Cotisations
4548
private ?MembershipFeeRepository $membershipFeeRepository = null;
4649

4750
public function __construct(
48-
private readonly Base_De_Donnees $_bdd,
51+
private readonly UserRepository $userRepository,
52+
private readonly InvoiceGenerator $invoiceGenerator,
4953
private readonly ?Droits $_droits = null,
5054
) {}
5155

52-
/**
53-
* Renvoit la cotisation demandée
54-
*
55-
* @param int $id Identifiant de la cotisation
56-
* @param string $champs Champs à renvoyer
57-
* @return array
58-
*/
59-
public function obtenir($id, string $champs = '*')
60-
{
61-
$requete = 'SELECT';
62-
$requete .= ' ' . $champs . ' ';
63-
$requete .= 'FROM';
64-
$requete .= ' afup_cotisations ';
65-
$requete .= 'WHERE';
66-
$requete .= ' id=' . $id;
67-
return $this->_bdd->obtenirEnregistrement($requete);
68-
}
69-
70-
/**
71-
* Renvoit le numéro de la prochaine facture au format : {année}-{index depuis le début de l'année}
72-
*
73-
*/
74-
public function _genererNumeroFacture(): string
75-
{
76-
$requete = 'SELECT';
77-
$requete .= " MAX(CAST(SUBSTRING_INDEX(numero_facture, '-', -1) AS UNSIGNED)) + 1 ";
78-
$requete .= 'FROM';
79-
$requete .= ' afup_cotisations ';
80-
$requete .= 'WHERE';
81-
$requete .= ' LEFT(numero_facture, 4)=' . $this->_bdd->echapper(date('Y'));
82-
$requete .= ' OR LEFT(numero_facture, 10)=' . $this->_bdd->echapper("COTIS-" . date('Y'));
83-
$index = $this->_bdd->obtenirUn($requete);
84-
return 'COTIS-' . date('Y') . '-' . (is_null($index) ? 1 : $index);
85-
}
86-
8756
/**
8857
* Ajoute une cotisation
8958
*
@@ -101,23 +70,27 @@ public function _genererNumeroFacture(): string
10170
public function ajouter(MemberType $type_personne, $id_personne, $montant, $type_reglement,
10271
$informations_reglement, $date_debut, $date_fin, $commentaires, $referenceClient = null): bool
10372
{
104-
$requete = 'INSERT INTO ';
105-
$requete .= ' afup_cotisations (type_personne, id_personne, montant, type_reglement , informations_reglement,';
106-
$requete .= ' date_debut, date_fin, numero_facture, token, commentaires, reference_client, date_facture) ';
107-
$requete .= 'VALUES (';
108-
$requete .= $type_personne->value . ',';
109-
$requete .= $id_personne . ',';
110-
$requete .= $montant . ',';
111-
$requete .= $this->_bdd->echapper($type_reglement) . ',';
112-
$requete .= $this->_bdd->echapper($informations_reglement) . ',';
113-
$requete .= $date_debut . ',';
114-
$requete .= $date_fin . ',';
115-
$requete .= $this->_bdd->echapper($this->_genererNumeroFacture()) . ',';
116-
$requete .= $this->_bdd->echapper(base64_encode(random_bytes(30))) . ',';
117-
$requete .= $this->_bdd->echapper($commentaires) . ',';
118-
$requete .= $this->_bdd->echapper($referenceClient) . ',';
119-
$requete .= $this->_bdd->echapper(date('Y-m-d\TH:i:s')) . ')';
120-
return $this->_bdd->executer($requete) !== false;
73+
try {
74+
$membershipFee = new MembershipFee();
75+
$membershipFee
76+
->setUserType($type_personne)
77+
->setUserId($id_personne)
78+
->setAmount($montant)
79+
->setPaymentType(MembershipFeePayment::from($type_reglement))
80+
->setPaymentDetails($informations_reglement)
81+
->setStartDate(new DateTime('@' . $date_debut))
82+
->setEndDate(new DateTime('@' . $date_fin))
83+
->setInvoiceNumber($this->membershipFeeRepository->generateInvoiceNumber())
84+
->setToken(base64_encode(random_bytes(30)))
85+
->setComments($commentaires)
86+
->setClientReference($referenceClient)
87+
->setInvoiceDate(new \DateTimeImmutable())
88+
;
89+
$this->membershipFeeRepository->save($membershipFee);
90+
return true;
91+
} catch (\Exception $e) {
92+
return false;
93+
}
12194
}
12295

12396
public function isAlreadyPaid($cmd): bool
@@ -267,12 +240,17 @@ public function supprimer(int $id): bool
267240
*/
268241
public function genererFacture($id_cotisation, $chemin = null)
269242
{
270-
$requete = 'SELECT * FROM afup_cotisations WHERE id=' . $id_cotisation;
271-
$cotisation = $this->_bdd->obtenirEnregistrement($requete);
243+
$cotisation = $this->membershipFeeRepository->get($id_cotisation);
244+
245+
246+
$userRepository = match ($cotisation->getUserType()) {
247+
MemberType::MemberCompany => $this->companyMemberRepository,
248+
default => $this->userRepository,
249+
};
272250

273-
$table = $cotisation['type_personne'] == MemberType::MemberCompany->value ? 'afup_personnes_morales' : 'afup_personnes_physiques';
274-
$requete = 'SELECT * FROM ' . $table . ' WHERE id=' . $cotisation['id_personne'];
275-
$personne = $this->_bdd->obtenirEnregistrement($requete);
251+
/** @var User|CompanyMember $user */
252+
$user = $userRepository->get($cotisation->getUserId());
253+
$invoiceData = $this->invoiceGenerator->getInvoiceData($user);
276254

277255
if ($cotisation['date_facture'] !== null) {
278256
$dateFacture = \DateTimeImmutable::createFromFormat('Y-m-d H:i:s', $cotisation['date_facture']);
@@ -298,15 +276,8 @@ public function genererFacture($id_cotisation, $chemin = null)
298276
$pdf->Cell(130, 5, 'Objet : Facture n°' . $cotisation['numero_facture']);
299277
$pdf->SetFont('Arial', '', 10);
300278

301-
if ($cotisation['type_personne'] == MemberType::MemberCompany->value) {
302-
$nom = $personne['raison_sociale'];
303-
$patternPrefix = $personne['raison_sociale'];
304-
} else {
305-
$nom = $personne['prenom'] . ' ' . $personne['nom'];
306-
$patternPrefix = $personne['nom'];
307-
}
308279
$pdf->Ln(10);
309-
$pdf->MultiCell(130, 5, $nom . "\n" . $personne['adresse'] . "\n" . $personne['code_postal'] . "\n" . $personne['ville']);
280+
$pdf->MultiCell(130, 5, $invoiceData->recipient . "\n" . $invoiceData->address . "\n" . $invoiceData->zipcode . "\n" . $invoiceData->city);
310281

311282
if (isset($cotisation['reference_client'])) {
312283
$pdf->Ln(10);
@@ -379,7 +350,7 @@ public function genererFacture($id_cotisation, $chemin = null)
379350
$pdf->Cell(10, 5, 'Lors de votre règlement, merci de préciser la mention : "Facture n°' . $cotisation['numero_facture'] . '"');
380351

381352
if (is_null($chemin)) {
382-
$pattern = str_replace(' ', '', $patternPrefix) . '_' . $cotisation['numero_facture'] . '_' . date('dmY', (int) $cotisation['date_debut']) . '.pdf';
353+
$pattern = str_replace(' ', '', $invoiceData->patternPrefix) . '_' . $cotisation['numero_facture'] . '_' . date('dmY', (int) $cotisation['date_debut']) . '.pdf';
383354

384355
$pdf->Output($pattern, 'D', true);
385356
} else {
@@ -446,18 +417,18 @@ private function formatFactureValue($value): string
446417
*/
447418
public function envoyerFacture($id_cotisation, Mailer $mailer, UserRepository $userRepository)
448419
{
449-
$personne = $this->obtenir($id_cotisation, 'type_personne, id_personne');
420+
$membership = $this->membershipFeeRepository->get($id_cotisation);
450421

451-
if ($personne['type_personne'] == MemberType::MemberCompany->value) {
452-
$company = $this->companyMemberRepository ? $this->companyMemberRepository->get($personne['id_personne']) : null;
422+
if ($membership->getUserType() == MemberType::MemberCompany->value) {
423+
$company = $this->companyMemberRepository ? $this->companyMemberRepository->get($membership->getUserId()) : null;
453424
Assert::notNull($company);
454425
$contactPhysique = [
455426
'nom' => $company->getLastName(),
456427
'prenom' => $company->getFirstName(),
457428
'email' => $company->getEmail(),
458429
];
459430
} else {
460-
$user = $userRepository->get($personne['id_personne']);
431+
$user = $userRepository->get($membership->getUserId());
461432
Assert::notNull($user);
462433
$contactPhysique = [
463434
'nom' => $user->getLastName(),
@@ -477,7 +448,7 @@ public function envoyerFacture($id_cotisation, Mailer $mailer, UserRepository $u
477448

478449
$cheminFacture = AFUP_CHEMIN_RACINE . 'cache/fact' . $id_cotisation . '.pdf';
479450
$numeroFacture = $this->genererFacture($id_cotisation, $cheminFacture);
480-
$cotisation = $this->getLastestByUserTypeAndId(MemberType::from((int) $personne['type_personne']), (int) $personne['id_personne']);
451+
$cotisation = $this->getLastestByUserTypeAndId($membership->getUserType(), $membership->getUserId());
481452
$pattern = str_replace(' ', '', $patternPrefix) . '_' . $numeroFacture . '_' . date('dmY', $cotisation->getStartDate()->getTimestamp()) . '.pdf';
482453

483454
$message = new Message('Facture AFUP', null, new MailUser(

sources/Afup/Association/CotisationsFactory.php

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,9 @@
55
namespace Afup\Site\Association;
66

77
use Afup\Site\Utils\Utils;
8+
use AppBundle\Accounting\Invoices\InvoiceGenerator;
89
use AppBundle\Association\Model\Repository\CompanyMemberRepository;
10+
use AppBundle\Association\Model\Repository\UserRepository;
911
use AppBundle\MembershipFee\Model\Repository\MembershipFeeRepository;
1012
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
1113
use Symfony\Component\Security\Core\Authorization\AuthorizationCheckerInterface;
@@ -17,12 +19,15 @@ public function __construct(
1719
private CompanyMemberRepository $companyMemberRepository,
1820
private AuthorizationCheckerInterface $authorizationChecker,
1921
private MembershipFeeRepository $membershipFeeRepository,
22+
private UserRepository $userRepository,
23+
private InvoiceGenerator $invoiceGenerator,
2024
) {}
2125

2226
public function create(): Cotisations
2327
{
24-
$cotisations = new Cotisations(
25-
$GLOBALS['AFUP_DB'],
28+
$cotisations = new Cotisations(
29+
$this->userRepository,
30+
$this->invoiceGenerator,
2631
Utils::fabriqueDroits($this->tokenStorage, $this->authorizationChecker),
2732
);
2833

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace AppBundle\Accounting\Invoices\Dto;
6+
7+
final readonly class InvoiceData
8+
{
9+
public function __construct(
10+
public string $recipient,
11+
public string $address,
12+
public string $zipcode,
13+
public string $city,
14+
public string $patternPrefix,
15+
) {}
16+
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace AppBundle\Accounting\Invoices\Generator;
6+
7+
use AppBundle\Accounting\Invoices\Dto\InvoiceData;
8+
use AppBundle\Association\Model\CompanyMember;
9+
use AppBundle\Association\Model\User;
10+
11+
class CompanyMemberInvoiceGenerator implements InvoiceGeneration
12+
{
13+
public function generate(User|CompanyMember $member): InvoiceData
14+
{
15+
return new InvoiceData(
16+
$member->getCompanyName(),
17+
$member->getAddress(),
18+
$member->getZipcode(),
19+
$member->getCity(),
20+
$member->getCompanyName(),
21+
);
22+
}
23+
24+
public function support(User|CompanyMember $user): true
25+
{
26+
return $user instanceof CompanyMember;
27+
}
28+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace AppBundle\Accounting\Invoices\Generator;
6+
7+
use AppBundle\Accounting\Invoices\Dto\InvoiceData;
8+
use AppBundle\Association\Model\CompanyMember;
9+
use AppBundle\Association\Model\User;
10+
11+
interface InvoiceGeneration
12+
{
13+
public function generate(User|CompanyMember $member): InvoiceData;
14+
15+
public function support(User|CompanyMember $user): true;
16+
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace AppBundle\Accounting\Invoices\Generator;
6+
7+
use AppBundle\Accounting\Invoices\Dto\InvoiceData;
8+
use AppBundle\Association\Model\CompanyMember;
9+
use AppBundle\Association\Model\User;
10+
11+
class MemberInvoiceGenerator implements InvoiceGeneration
12+
{
13+
public function generate(User|CompanyMember $member): InvoiceData
14+
{
15+
return new InvoiceData(
16+
$member->getFirstName() . ' ' . $member->getLastName(),
17+
$member->getAddress(),
18+
$member->getZipcode(),
19+
$member->getCity(),
20+
$member->getLastName(),
21+
);
22+
}
23+
24+
public function support(User|CompanyMember $user): true
25+
{
26+
return $user instanceof User;
27+
}
28+
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace AppBundle\Accounting\Invoices;
6+
7+
use AppBundle\Accounting\Invoices\Dto\InvoiceData;
8+
use AppBundle\Accounting\Invoices\Generator\InvoiceGeneration;
9+
use AppBundle\Association\Model\CompanyMember;
10+
use AppBundle\Association\Model\User;
11+
12+
class InvoiceGenerator
13+
{
14+
/**
15+
* @param iterable<InvoiceGeneration> $handlers
16+
*/
17+
public function __construct(private readonly iterable $handlers) {}
18+
19+
public function getInvoiceData(User|CompanyMember $user): InvoiceData
20+
{
21+
foreach ($this->handlers as $handler) {
22+
if ($handler->support($user)) {
23+
return $handler->generate($user);
24+
}
25+
}
26+
throw new \RuntimeException('Could not fetch instance of InvoiceData');
27+
}
28+
}

sources/AppBundle/Command/PayboxCallbackSimulatorCommand.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ protected function execute(InputInterface $input, OutputInterface $output): int
105105
private function callCotisation(string $cmd, string $status): string
106106
{
107107
$account = $this->cotisations->getAccountFromCmd($cmd);
108-
$cotisation = $this->cotisations->obtenirDerniere(MemberType::from($account['type']), $account['id']);
108+
$cotisation = $this->cotisations->getLastestByUserTypeAndId(MemberType::from($account['type']), $account['id']);
109109
if (!$cotisation) {
110110
throw new \RuntimeException(
111111
sprintf('Cotisation non trouvée avec ce CMD: %s', $cmd),

sources/AppBundle/Controller/Website/Membership/Fee/DownloadAction.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ public function __invoke(Request $request): BinaryFileResponse
4444
$numeroFacture = $this->cotisations->genererFacture($id, $tempfile);
4545
$membershipFee = $this->membershipFeeRepository->get($id);
4646

47-
if ($cotisation['type_personne']$membershipFee->getUserType() == MemberType::MemberCompany->value) {
47+
if ($membershipFee->getUserType() === MemberType::MemberCompany) {
4848
$company = $this->companyMemberRepository->get($membershipFee->getUserId());
4949
Assert::isInstanceOf($company, CompanyMember::class);
5050
$patternPrefix = $company->getCompanyName();

0 commit comments

Comments
 (0)