diff --git a/app/Resources/views/admin/association/membership/_member_menu.html.twig b/app/Resources/views/admin/association/membership/_member_menu.html.twig index 4ae1b849d..a78e1c0e9 100644 --- a/app/Resources/views/admin/association/membership/_member_menu.html.twig +++ b/app/Resources/views/admin/association/membership/_member_menu.html.twig @@ -20,11 +20,6 @@ "lien": path('member_techletter'), "is_active": current == "techletter", }, - { - "nom": "Listes de diffusion", - "lien": path('my_groups'), - "is_active": current == "mygroups", - }, { "nom": "Assemblée générale", "lien": path('member_general_meeting'), diff --git a/app/Resources/views/site/member/index.html.twig b/app/Resources/views/site/member/index.html.twig index 440d624f1..56bc32adc 100644 --- a/app/Resources/views/site/member/index.html.twig +++ b/app/Resources/views/site/member/index.html.twig @@ -105,18 +105,6 @@ -
-
- {% set href = path('my_groups') %} - - - - Listes de diffusion - -
-
diff --git a/app/config/config.yml b/app/config/config.yml index aa0d42379..ba6ace5db 100644 --- a/app/config/config.yml +++ b/app/config/config.yml @@ -380,13 +380,6 @@ ting: default: connection: main database: '%database_name%' - groups: - namespace : AppBundle\Groups\Model\Repository - directory : "@AppBundle/Groups/Model/Repository" - options: - default: - connection: main - database: '%database_name%' throttling: namespace : AppBundle\Security\ActionThrottling directory : "@AppBundle/Security/ActionThrottling" diff --git a/app/config/parameters.yml.dist b/app/config/parameters.yml.dist index 1b73ab6b0..0a846c8f6 100644 --- a/app/config/parameters.yml.dist +++ b/app/config/parameters.yml.dist @@ -43,8 +43,6 @@ parameters: meetup_api_consumer_key: "" meetup_api_consumer_secret: "" - google_groups_api_key: "" - techno_watch_calendar_url: "https://docs.google.com/spreadsheets/d/2cUeAk86Ov7BLYyn0Ad9ge3ecbsdboeQH64wIU9a9Zzp/export?format=csv" techno_watch_calendar_key: "9Yt0feebMyMrUWx" diff --git a/app/config/parameters.yml.dist-docker b/app/config/parameters.yml.dist-docker index 559f9952f..333c70368 100644 --- a/app/config/parameters.yml.dist-docker +++ b/app/config/parameters.yml.dist-docker @@ -46,8 +46,6 @@ parameters: meetup_api_consumer_key: "" meetup_api_consumer_secret: "" - google_groups_api_key: "" - techno_watch_calendar_url: "https://docs.google.com/spreadsheets/d/2cUeAk86Ov7BLYyn0Ad9ge3ecbsdboeQH64wIU9a9Zzp/export?format=csv" techno_watch_calendar_key: "9Yt0feebMyMrUWx" diff --git a/app/config/routing.yml b/app/config/routing.yml index c5fc7e8e3..39a3c7821 100644 --- a/app/config/routing.yml +++ b/app/config/routing.yml @@ -29,10 +29,6 @@ blog: resource: "routing/blog.yml" prefix: /blog -groups: - resource: "routing/groups.yml" - prefix: /admin/groups - cms_page: resource: "routing/cms_page.yml" prefix: /p diff --git a/app/config/routing/groups.yml b/app/config/routing/groups.yml deleted file mode 100644 index fa417c73f..000000000 --- a/app/config/routing/groups.yml +++ /dev/null @@ -1,3 +0,0 @@ -my_groups: - path: / - defaults: {_controller: AppBundle:Groups:myGroups} diff --git a/app/config/services.yml b/app/config/services.yml index 8a4776e54..a7f4ed75e 100644 --- a/app/config/services.yml +++ b/app/config/services.yml @@ -451,11 +451,6 @@ services: factory: ["@ting", get] arguments: [AppBundle\Event\Model\Repository\TicketSpecialPriceRepository] - AppBundle\Groups\Model\Repository\MailingListRepository: - class: AppBundle\Groups\Model\Repository\MailingListRepository - factory: ["@ting", get] - arguments: [AppBundle\Groups\Model\Repository\MailingListRepository] - AppBundle\Site\Model\Repository\RubriqueRepository: class: AppBundle\Site\Model\Repository\RubriqueRepository factory: ["@ting", get] @@ -597,27 +592,6 @@ services: AppBundle\Event\JsonLd: autowire: true - Google_Client: - class: Google_Client - calls: - - ["setAuthConfig", ["%google_groups_api_key%"]] - - ["setScopes", [[!php/const Google_Service_Directory::ADMIN_DIRECTORY_GROUP, !php/const Google_Service_Directory::ADMIN_DIRECTORY_GROUP_READONLY]]] - - ["setSubject", ['admin-mailing-listes-api@afup.org']] - - Google_Service_Directory: - class: Google_Service_Directory - arguments: ["@Google_Client"] - - AppBundle\Groups\GroupRepository: - autowire: true - - AppBundle\Association\Listener\MembersGroupsListener: - arguments: - $logger: "@logger" - autowire: true - tags: - - { name: kernel.event_listener, event: member.new, method: onNewMemberEvent } - AppBundle\Offices\OfficeFinder: arguments: ['@Geocoder\Provider\GoogleMaps'] diff --git a/composer.json b/composer.json index b25625fcc..88b16447a 100644 --- a/composer.json +++ b/composer.json @@ -28,7 +28,6 @@ "sabre/vobject": "^4.1", "erusev/parsedown": "^1.6", "dms/meetup-api-client": "^2.3", - "google/apiclient": "^2.0", "robmorgan/phinx": "^0.9.2", "presta/sitemap-bundle": "^1.5", "setasign/fpdf": "1.53", diff --git a/composer.lock b/composer.lock index dbfb7bab5..476ba1b73 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "474e590136f4222c76bb64ccb6f628b0", + "content-hash": "b02a5bda029a7c3d77208e67833d4254", "packages": [ { "name": "algolia/algoliasearch-client-php", @@ -1434,52 +1434,6 @@ ], "time": "2016-10-17T18:31:11+00:00" }, - { - "name": "firebase/php-jwt", - "version": "v5.0.0", - "source": { - "type": "git", - "url": "https://github.com/firebase/php-jwt.git", - "reference": "9984a4d3a32ae7673d6971ea00bae9d0a1abba0e" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/firebase/php-jwt/zipball/9984a4d3a32ae7673d6971ea00bae9d0a1abba0e", - "reference": "9984a4d3a32ae7673d6971ea00bae9d0a1abba0e", - "shasum": "" - }, - "require": { - "php": ">=5.3.0" - }, - "require-dev": { - "phpunit/phpunit": " 4.8.35" - }, - "type": "library", - "autoload": { - "psr-4": { - "Firebase\\JWT\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Neuman Vong", - "email": "neuman+pear@twilio.com", - "role": "Developer" - }, - { - "name": "Anant Narayanan", - "email": "anant@php.net", - "role": "Developer" - } - ], - "description": "A simple library to encode and decode JSON Web Tokens (JWT) in PHP. Should conform to the current spec.", - "homepage": "https://github.com/firebase/php-jwt", - "time": "2017-06-27T22:17:23+00:00" - }, { "name": "friendsofpear/pear_exception", "version": "0.0.2", @@ -1538,147 +1492,6 @@ ], "time": "2019-03-25T15:55:08+00:00" }, - { - "name": "google/apiclient", - "version": "v2.2.1", - "source": { - "type": "git", - "url": "https://github.com/googleapis/google-api-php-client.git", - "reference": "b69b8ac4bf6501793c389d4e013a79d09c85c5f2" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/googleapis/google-api-php-client/zipball/b69b8ac4bf6501793c389d4e013a79d09c85c5f2", - "reference": "b69b8ac4bf6501793c389d4e013a79d09c85c5f2", - "shasum": "" - }, - "require": { - "firebase/php-jwt": "~2.0|~3.0|~4.0|~5.0", - "google/apiclient-services": "~0.13", - "google/auth": "^1.0", - "guzzlehttp/guzzle": "~5.3.1|~6.0", - "guzzlehttp/psr7": "^1.2", - "monolog/monolog": "^1.17", - "php": ">=5.4", - "phpseclib/phpseclib": "~0.3.10|~2.0" - }, - "require-dev": { - "cache/filesystem-adapter": "^0.3.2", - "phpunit/phpunit": "~4", - "squizlabs/php_codesniffer": "~2.3", - "symfony/css-selector": "~2.1", - "symfony/dom-crawler": "~2.1" - }, - "suggest": { - "cache/filesystem-adapter": "For caching certs and tokens (using Google_Client::setCache)" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.x-dev" - } - }, - "autoload": { - "psr-0": { - "Google_": "src/" - }, - "classmap": [ - "src/Google/Service/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "Apache-2.0" - ], - "description": "Client library for Google APIs", - "homepage": "http://developers.google.com/api-client-library/php", - "keywords": [ - "google" - ], - "time": "2017-11-03T01:19:53+00:00" - }, - { - "name": "google/apiclient-services", - "version": "v0.37", - "source": { - "type": "git", - "url": "https://github.com/googleapis/google-api-php-client-services.git", - "reference": "75fb5412eec7cfc9f78ac0f8d23e907ce07c2330" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/googleapis/google-api-php-client-services/zipball/75fb5412eec7cfc9f78ac0f8d23e907ce07c2330", - "reference": "75fb5412eec7cfc9f78ac0f8d23e907ce07c2330", - "shasum": "" - }, - "require": { - "php": ">=5.4" - }, - "require-dev": { - "phpunit/phpunit": "~4.8" - }, - "type": "library", - "autoload": { - "psr-0": { - "Google_Service_": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "Apache-2.0" - ], - "description": "Client library for Google APIs", - "homepage": "http://developers.google.com/api-client-library/php", - "keywords": [ - "google" - ], - "time": "2017-12-02T00:23:18+00:00" - }, - { - "name": "google/auth", - "version": "v1.1.0", - "source": { - "type": "git", - "url": "https://github.com/googleapis/google-auth-library-php.git", - "reference": "548d27d670f0236dc5258fa4cdde6e7b63464cfd" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/googleapis/google-auth-library-php/zipball/548d27d670f0236dc5258fa4cdde6e7b63464cfd", - "reference": "548d27d670f0236dc5258fa4cdde6e7b63464cfd", - "shasum": "" - }, - "require": { - "firebase/php-jwt": "~2.0|~3.0|~4.0|~5.0", - "guzzlehttp/guzzle": "~5.3.1|~6.0", - "guzzlehttp/psr7": "~1.2", - "php": ">=5.4", - "psr/cache": "^1.0", - "psr/http-message": "^1.0" - }, - "require-dev": { - "friendsofphp/php-cs-fixer": "^1.11", - "phpunit/phpunit": "3.7.*" - }, - "type": "library", - "autoload": { - "psr-4": { - "Google\\Auth\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "Apache-2.0" - ], - "description": "Google Auth Library for PHP", - "homepage": "http://github.com/google/google-auth-library-php", - "keywords": [ - "Authentication", - "google", - "oauth2" - ], - "time": "2017-10-10T17:01:45+00:00" - }, { "name": "google/recaptcha", "version": "1.2.4", @@ -3410,98 +3223,6 @@ ], "time": "2015-07-25T16:39:46+00:00" }, - { - "name": "phpseclib/phpseclib", - "version": "2.0.9", - "source": { - "type": "git", - "url": "https://github.com/phpseclib/phpseclib.git", - "reference": "c9a3fe35e20eb6eeaca716d6a23cde03f52d1558" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpseclib/phpseclib/zipball/c9a3fe35e20eb6eeaca716d6a23cde03f52d1558", - "reference": "c9a3fe35e20eb6eeaca716d6a23cde03f52d1558", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "require-dev": { - "phing/phing": "~2.7", - "phpunit/phpunit": "~4.0", - "sami/sami": "~2.0", - "squizlabs/php_codesniffer": "~2.0" - }, - "suggest": { - "ext-gmp": "Install the GMP (GNU Multiple Precision) extension in order to speed up arbitrary precision integer arithmetic operations.", - "ext-libsodium": "SSH2/SFTP can make use of some algorithms provided by the libsodium-php extension.", - "ext-mcrypt": "Install the Mcrypt extension in order to speed up a few other cryptographic operations.", - "ext-openssl": "Install the OpenSSL extension in order to speed up a wide variety of cryptographic operations." - }, - "type": "library", - "autoload": { - "files": [ - "phpseclib/bootstrap.php" - ], - "psr-4": { - "phpseclib\\": "phpseclib/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jim Wigginton", - "email": "terrafrost@php.net", - "role": "Lead Developer" - }, - { - "name": "Patrick Monnerat", - "email": "pm@datasphere.ch", - "role": "Developer" - }, - { - "name": "Andreas Fischer", - "email": "bantu@phpbb.com", - "role": "Developer" - }, - { - "name": "Hans-Jürgen Petrich", - "email": "petrich@tronic-media.com", - "role": "Developer" - }, - { - "name": "Graham Campbell", - "email": "graham@alt-three.com", - "role": "Developer" - } - ], - "description": "PHP Secure Communications Library - Pure-PHP implementations of RSA, AES, SSH2, SFTP, X.509 etc.", - "homepage": "http://phpseclib.sourceforge.net", - "keywords": [ - "BigInteger", - "aes", - "asn.1", - "asn1", - "blowfish", - "crypto", - "cryptography", - "encryption", - "rsa", - "security", - "sftp", - "signature", - "signing", - "ssh", - "twofish", - "x.509", - "x509" - ], - "time": "2017-11-29T06:38:08+00:00" - }, { "name": "pimple/pimple", "version": "v3.0.2", @@ -6438,6 +6159,8 @@ "platform": { "ext-gd": "*", "ext-json": "*", + "ext-dom": "*", + "ext-libxml": "*", "ext-curl": "*" }, "platform-dev": [], diff --git a/db/migrations/20231121203300_suppression_mailing_list.php b/db/migrations/20231121203300_suppression_mailing_list.php new file mode 100644 index 000000000..0f87de9e4 --- /dev/null +++ b/db/migrations/20231121203300_suppression_mailing_list.php @@ -0,0 +1,11 @@ +execute('DROP TABLE IF EXISTS afup_mailing_lists'); + } +} diff --git a/db/seeds/Users.php b/db/seeds/Users.php index 1d524cab5..d495404a6 100644 --- a/db/seeds/Users.php +++ b/db/seeds/Users.php @@ -149,7 +149,7 @@ public function run() 'id_personne' => self::ID_USER_PERSONNE_PHYSIQUE, 'montant' => 25, 'date_fin' => $now + $oneMonthInSeconds * 12, - 'numero_facture' => 'COTIS-'.date('Y').'-201', + 'numero_facture' => 'COTIS-'.date('Y').'-'.(date('Hi')+200), ] ]; diff --git a/doc/groups.md b/doc/groups.md deleted file mode 100644 index da3be0a7a..000000000 --- a/doc/groups.md +++ /dev/null @@ -1,10 +0,0 @@ -# Google Groups - -Gestion des mailing-list sur la base de groupes google. - -1. Utilisation de l'api google avec le client google/apiclient -2. Création d'identifiants au format json -3. [Délégation de droits "domain-wide"](https://developers.google.com/api-client-library/php/auth/service-accounts) pour cette application -4. Création de l'utilisateur "admin-mailing-listes-api@afup.org" dédié à cet api sur le compte google - il sera "impersonifié" par le client lors des requetes -5. Attribution à cet utilisateur du role "Administrateur des groupes" (pas d'escalade de droit possible en cas de faille) -6. Une copie du fichier d'identifiants est dispo dans le gestionnaire de mot de passe partagés, nom "Compte google API Gestion mailing listes" diff --git a/sources/Afup/Association/Cotisations.php b/sources/Afup/Association/Cotisations.php index 1887aa0b5..f5b620ead 100644 --- a/sources/Afup/Association/Cotisations.php +++ b/sources/Afup/Association/Cotisations.php @@ -222,13 +222,13 @@ function notifierRegelementEnLigneAuTresorier($cmd, $total, $autorisation, $tran */ $configuration = $GLOBALS['AFUP_CONF']; - list($ref, $date, $type_personne, $id_personne, $reste) = explode('-', $cmd, 5); + $account = $this->getAccountFromCmd($cmd); - if (AFUP_PERSONNES_MORALES == $type_personne) { + if (AFUP_PERSONNES_MORALES == $account['type']) { $personnes = new Personnes_Morales($this->_bdd); - $infos = $personnes->obtenir($id_personne, 'nom, prenom, email'); + $infos = $personnes->obtenir($account['id'], 'nom, prenom, email'); } else { - $user = $userRepository->get($id_personne); + $user = $userRepository->get($account['id']); Assertion::notNull($user); $infos = [ 'nom' => $user->getLastName(), @@ -242,7 +242,7 @@ function notifierRegelementEnLigneAuTresorier($cmd, $total, $autorisation, $tran $corps = "Bonjour, \n\n"; $corps .= "Une cotisation annuelle AFUP a été réglée.\n\n"; $corps .= "Personne : " . $infos['nom'] . " " . $infos['prenom'] . " (" . $infos['email'] . ")\n"; - $corps .= "URL : " . $configuration->obtenir('web|path') . "pages/administration/index.php?page=cotisations&type_personne=" . $type_personne . "&id_personne=" . $id_personne . "\n"; + $corps .= "URL : " . $configuration->obtenir('web|path') . "pages/administration/index.php?page=cotisations&type_personne=" . $account['type'] . "&id_personne=" . $account['id'] . "\n"; $corps .= "Commande : " . $cmd . "\n"; $corps .= "Total : " . $total . "\n"; $corps .= "Autorisation : " . $autorisation . "\n"; @@ -300,7 +300,14 @@ function validerReglementEnLigne($cmd, $total, $autorisation, $transaction) public function getAccountFromCmd($cmd) { - list($ref, $date, $memberType, $memberId, $stuff) = explode('-', $cmd, 5); + $arr = explode('-', $cmd, 5); + // Personne morale : $cmd=FCOTIS-2023-202 + if (3 === count($arr)) { + return ['type' => UserRepository::USER_TYPE_COMPANY, 'id' => $arr[2]]; + } + + // Personne physique : $cmd=C2023-211120232237-0-5-PAUL-431 + list($ref, $date, $memberType, $memberId, $stuff) = $arr; return ['type' => $memberType, 'id' => $memberId]; } diff --git a/sources/AppBundle/Association/Listener/MembersGroupsListener.php b/sources/AppBundle/Association/Listener/MembersGroupsListener.php deleted file mode 100644 index d190c068c..000000000 --- a/sources/AppBundle/Association/Listener/MembersGroupsListener.php +++ /dev/null @@ -1,54 +0,0 @@ -mailingListRepository = $mailingListRepository; - $this->groupRepository = $groupRepository; - $this->logger = $logger; - } - - public function onNewMemberEvent(NewMemberEvent $event) - { - // Premiere cotisation payée: il faut abonner le membre à toutes les ml définies par défaut - /** - * @var $lists MailingList[] - */ - $lists = $this->mailingListRepository->getBy(['autoRegistration' => true]); - - foreach ($lists as $list) { - try { - $this->groupRepository->addMember($list->getEmail(), $event->getUser()->getEmail()); - } catch (\Google_Service_Exception $e) { - $this->logger->error( - 'Could not add a new member to a mailing list', - ['user' => $event->getUser()->getId(), 'mailing' => $list->getEmail()] - ); - } - } - } -} diff --git a/sources/AppBundle/Command/UpdateMailingListMembersCommand.php b/sources/AppBundle/Command/UpdateMailingListMembersCommand.php deleted file mode 100644 index 6964f35d6..000000000 --- a/sources/AppBundle/Command/UpdateMailingListMembersCommand.php +++ /dev/null @@ -1,92 +0,0 @@ -setName('groups:update-members') - ; - } - - public function execute(InputInterface $input, OutputInterface $output) - { - $mailingListRepository = $this->getContainer()->get(\AppBundle\Groups\Model\Repository\MailingListRepository::class); - $groupsRepository = $this->getContainer()->get(\AppBundle\Groups\GroupRepository::class); - - $output->writeln("Synchronisation Mailing Lists " . date('Y-m-d H:i:s')); - - $output->writeln(" - récupération des membres à jour de cotisation..."); - /** - * @var $membersAfup User[] - */ - $membersAfup = $this->getContainer()->get(\AppBundle\Association\Model\Repository\UserRepository::class)->getActiveMembers(UserRepository::USER_TYPE_ALL); - - $emails = []; - foreach ($membersAfup as $member) { - $emails[] = $groupsRepository->cleanEmail($member->getEmail()); - } - - $filter = function (\Google_Service_Directory_Member $member) use ($emails) { - // Remove every mail if not a member - return !in_array($member->getEmail(), $emails); - }; - - $this->addMissingMembers($groupsRepository, $emails, $output); - - $lists = $mailingListRepository->getAllMailingLists(true); - - foreach ($lists as $list) { - $output->writeln($list->getEmail()); - $membersOfList = $groupsRepository->getMembers($list->getEmail()); - $membersOfListNonMemberAfup = array_filter($membersOfList, $filter); - - // Get expired members, which are still member of a mailing list - foreach ($membersOfListNonMemberAfup as $member) { - $output->write(sprintf('Removing "%s"', $member->getEmail())); - if ($groupsRepository->removeMember($list->getEmail(), $member->getEmail()) !== false) { - $output->writeln('[OK]'); - } else { - $output->writeln('[NOK]'); - } - } - } - } - - private function addMissingMembers(GroupRepository $groupsRepository, $membersAfupEmails, OutputInterface $output) - { - $membersOfList = $groupsRepository->getMembers(self::MEMBERS_MAILING_ADDRESS); - - $listEmails = []; - /** @var Google_Service_Directory_Member $memberOfList */ - foreach ($membersOfList as $memberOfList) { - $listEmails[$memberOfList->getEmail()] = true; - } - - foreach ($membersAfupEmails as $memberEmail) { - if (!isset($listEmails[$memberEmail])) { - $output->write(sprintf('Adding "%s"', $memberEmail)); - if ($groupsRepository->addMember(self::MEMBERS_MAILING_ADDRESS, $memberEmail) !== false) { - $output->writeln('[OK]'); - } else { - $output->writeln('[NOK]'); - } - } - } - } -} diff --git a/sources/AppBundle/Controller/GroupsController.php b/sources/AppBundle/Controller/GroupsController.php deleted file mode 100644 index 7f0a79b0d..000000000 --- a/sources/AppBundle/Controller/GroupsController.php +++ /dev/null @@ -1,88 +0,0 @@ -getMethod() === Request::METHOD_POST) { - return $this->forward('AppBundle:Groups:registerGroup'); - } - - $token = $this->get('security.csrf.token_manager')->getToken('GroupsAction'); - - /** - * @var $lists MailingList[] - */ - $lists = $this->get(\AppBundle\Groups\Model\Repository\MailingListRepository::class)->getAllMailingLists(); - $groupRepository = $this->get(\AppBundle\Groups\GroupRepository::class); - - $subscriptions = []; - - $error = null; - - try { - foreach ($lists as $list) { - $subscriptions[$list->getEmail()] = $groupRepository->hasMember($list->getEmail(), $this->getUser()->getEmail()); - } - } catch (\Exception $exception) { // Can be a guzzle exception or google exception, does not matter actually - $error = 'Une erreur est survenue en vérifiant les listes auxquelles vous etes abonnés. Les résultats ci-dessous peuvent ne pas refléter vos abonnements.'; - } - - return $this->render('admin/groups/lists.html.twig', [ - 'csrf_token' => $token, - 'lists' => $lists, - 'error' => $error, - 'subscriptions' => $subscriptions, - 'title' => 'Mes listes de diffusion', - 'page' => 'groups' - ]); - } - - public function registerGroupAction(Request $request) - { - $csrf = $this->get('security.csrf.token_manager')->getToken('GroupsAction'); - - if ($csrf->getValue() !== $request->get('token')) { - $this->addFlash('error', 'Jeton anti-csrf invalide.'); - return $this->redirectToRoute('my_groups'); - } - - $email = $this->getUser()->getEmail(); - $groupRepository = $this->get(\AppBundle\Groups\GroupRepository::class); - $mailingListRepository = $this->get(\AppBundle\Groups\Model\Repository\MailingListRepository::class); - if ($request->request->get('subscribe') !== null) { - $mailingId = $request->request->getInt('subscribe'); - /** - * @var $mailing MailingList - */ - $mailing = $mailingListRepository->get($mailingId); - - if ($groupRepository->addMember($mailing->getEmail(), $email)) { - $this->addFlash('success', sprintf('Vous avez été abonné à la liste "%s"', $mailing->getName())); - } else { - $this->addFlash('error', 'Une erreur est survenue lors de la prise en compte de votre abonnement.'); - } - } elseif ($request->request->get('unsubscribe') !== null) { - $mailingId = $request->request->getInt('unsubscribe'); - /** - * @var $mailing MailingList - */ - $mailing = $mailingListRepository->get($mailingId); - - if ($groupRepository->removeMember($mailing->getEmail(), $email)) { - $this->addFlash('success', sprintf('Vous avez été désabonné de la liste "%s"', $mailing->getName())); - } else { - $this->addFlash('error', 'Une erreur est survenue lors de la prise en compte de votre désabonnement.'); - } - } else { - $this->addFlash('error', 'Impossible vous abonner à cette liste'); - } - - return $this->redirectToRoute('my_groups'); - } -} diff --git a/sources/AppBundle/Groups/GroupRepository.php b/sources/AppBundle/Groups/GroupRepository.php deleted file mode 100644 index 7ddc02e94..000000000 --- a/sources/AppBundle/Groups/GroupRepository.php +++ /dev/null @@ -1,76 +0,0 @@ -directory = $directory; - } - - public function hasMember($mailing, $email) - { - $email = $this->cleanEmail($email); - try { - $this->directory->members->get($mailing, $email); - } catch (\Google_Service_Exception $exception) { - return false; - } - return true; - } - - public function addMember($mailing, $email) - { - $email = $this->cleanEmail($email); - $member = new \Google_Service_Directory_Member(); - $member->setEmail($email); - $member->setKind('admin#directory#member'); - $member->setRole('MEMBER'); - try { - return $this->directory->members->insert($mailing, $member); - } catch (\Google_Service_Exception $exception) { - return false; - } - } - - public function removeMember($mailing, $email) - { - $email = $this->cleanEmail($email); - try { - return $this->directory->members->delete($mailing, $email); - } catch (\Google_Service_Exception $exception) { - return false; - } - } - - /** - * @param $mailing - * @return \Google_Service_Directory_Member[] - */ - public function getMembers($mailing) - { - $members = []; - $nextPage = []; - do { - $list = $this->directory->members->listMembers($mailing, $nextPage); - - $nextPage = []; - if ($list->getNextPageToken() !== null) { - $nextPage = ['pageToken' => $list->getNextPageToken()]; - } - - $members = array_merge($members, $list->getMembers()); - } while ($nextPage !== []); - - return $members; - } - - public function cleanEmail($email) - { - // Google groups does not supports disposable emails - return preg_replace('/(.*)\+.*(@.*)/', '$1$2', $email); - } -} diff --git a/sources/AppBundle/Groups/Model/MailingList.php b/sources/AppBundle/Groups/Model/MailingList.php deleted file mode 100644 index b75ac6b31..000000000 --- a/sources/AppBundle/Groups/Model/MailingList.php +++ /dev/null @@ -1,191 +0,0 @@ - 'Toutes les mailing lists de nos antennes', - 'member' => 'Mailing lists réservées aux membres' - ]; - - /** - * @return int - */ - public function getId() - { - return $this->id; - } - - /** - * @param int $id - * @return MailingList - */ - public function setId($id) - { - $this->propertyChanged('id', $this->id, $id); - $this->id = $id; - return $this; - } - - /** - * @return string - */ - public function getEmail() - { - return $this->email; - } - - /** - * @param string $email - * @return MailingList - */ - public function setEmail($email) - { - $this->propertyChanged('email', $this->email, $email); - $this->email = $email; - return $this; - } - - /** - * @return string - */ - public function getName() - { - return $this->name; - } - - /** - * @param string $name - * @return MailingList - */ - public function setName($name) - { - $this->propertyChanged('name', $this->name, $name); - $this->name = $name; - return $this; - } - - /** - * @return string - */ - public function getDescription() - { - return $this->description; - } - - /** - * @param string $description - * @return MailingList - */ - public function setDescription($description) - { - $this->propertyChanged('description', $this->description, $description); - $this->description = $description; - return $this; - } - - /** - * @return boolean - */ - public function getMembersOnly() - { - return $this->membersOnly; - } - - /** - * @param boolean $membersOnly - * @return MailingList - */ - public function setMembersOnly($membersOnly) - { - $membersOnly = (boolean) $membersOnly; - $this->propertyChanged('membersOnly', $this->membersOnly, $membersOnly); - $this->membersOnly = $membersOnly; - return $this; - } - - /** - * @return string - */ - public function getCategory() - { - return $this->category; - } - - /** - * @param string $category - * @return MailingList - */ - public function setCategory($category) - { - $this->propertyChanged('category', $this->category, $category); - $this->category = $category; - return $this; - } - - public function getCategoryLabel() - { - return $this->categoryLabels[$this->category]; - } - - /** - * @return bool - */ - public function getAutoRegistration() - { - return $this->autoRegistration; - } - - /** - * @param bool $autoRegistration - * @return MailingList - */ - public function setAutoRegistration($autoRegistration) - { - $autoRegistration = (bool) $autoRegistration; - $this->propertyChanged('autoRegistration', $this->autoRegistration, $autoRegistration); - $this->autoRegistration = $autoRegistration; - return $this; - } -} diff --git a/sources/AppBundle/Groups/Model/Repository/MailingListRepository.php b/sources/AppBundle/Groups/Model/Repository/MailingListRepository.php deleted file mode 100644 index ad6e5499f..000000000 --- a/sources/AppBundle/Groups/Model/Repository/MailingListRepository.php +++ /dev/null @@ -1,106 +0,0 @@ -getQueryBuilder(self::QUERY_SELECT); - $query - ->cols(['id', 'email', 'name', 'description', 'members_only', 'category']) - ->from('afup_mailing_lists') - ->orderBy(['category', 'name']) - ; - $params = []; - if ($membersOnly === true) { - $query->where('members_only = 1'); - } - if ($category !== null) { - $query->where('category = :category'); - $params['category'] = $category; - } - - return $this - ->getQuery($query->getStatement()) - ->setParams($params) - ->query($this->getCollection(new HydratorSingleObject())) - ; - } - - /** - * @inheritDoc - */ - public static function initMetadata(SerializerFactoryInterface $serializerFactory, array $options = []) - { - $metadata = new Metadata($serializerFactory); - - $metadata->setEntity(MailingList::class); - $metadata->setConnectionName('main'); - $metadata->setDatabase($options['database']); - $metadata->setTable('afup_mailing_lists'); - - $metadata - ->addField([ - 'columnName' => 'id', - 'fieldName' => 'id', - 'primary' => true, - 'autoincrement' => true, - 'type' => 'int' - ]) - ->addField([ - 'columnName' => 'email', - 'fieldName' => 'email', - 'type' => 'string' - ]) - ->addField([ - 'columnName' => 'name', - 'fieldName' => 'name', - 'type' => 'string' - ]) - ->addField([ - 'columnName' => 'description', - 'fieldName' => 'description', - 'type' => 'string' - ]) - ->addField([ - 'columnName' => 'members_only', - 'fieldName' => 'membersOnly', - 'type' => 'bool', - 'serializer' => Boolean::class - ]) - ->addField([ - 'columnName' => 'category', - 'fieldName' => 'category', - 'type' => 'string' - ]) - ->addField([ - 'columnName' => 'auto_registration', - 'fieldName' => 'autoRegistration', - 'type' => 'bool', - 'serializer' => Boolean::class - ]) - ; - - return $metadata; - } -} diff --git a/tests/behat/features/PublicSite/Register.feature b/tests/behat/features/PublicSite/Register.feature index 6dd90d2c9..223485f49 100644 --- a/tests/behat/features/PublicSite/Register.feature +++ b/tests/behat/features/PublicSite/Register.feature @@ -36,8 +36,9 @@ Feature: Site Public - Register # Simuler l'appel de callback Paybox And simulate the Paybox callback And I should only receive the following emails: - | to | subject | - | | Votre compte afup.org | + | to | subject | + | | Votre compte afup.org | + | | Paiement cotisation AFUP | @reloadDbWithTestData @clearEmails @@ -76,3 +77,4 @@ Feature: Site Public - Register And I should only receive the following emails: | to | subject | | | Une société vous invite à profiter de son compte "Membre AFUP" | + | | Paiement cotisation AFUP | diff --git a/tests/units/Afup/Association/Cotisations.php b/tests/units/Afup/Association/Cotisations.php index 92ea1bef2..c343e6d5c 100644 --- a/tests/units/Afup/Association/Cotisations.php +++ b/tests/units/Afup/Association/Cotisations.php @@ -4,6 +4,7 @@ use Afup\Site\Utils\Base_De_Donnees; +use AppBundle\Association\Model\Repository\UserRepository; class Cotisations extends \atoum { @@ -54,4 +55,42 @@ public function testFinProchaineCotisation($case, $dateFin, $expected) ->isEqualTo($expected->format('Y-m-d'), $case) ; } + + protected function accountCmdProvider() + { + return [ + [ + 'Personne Morale', + 'FCOTIS-2023-202', + ['type' => UserRepository::USER_TYPE_COMPANY, 'id' => '202'] + ], + [ + 'Personne physique', + 'C2023-211120232237-0-5-PAUL-431', + ['type' => UserRepository::USER_TYPE_PHYSICAL, 'id' => '5'] + ], + ]; + } + + /** + * @dataProvider accountCmdProvider + */ + public function testGetAccountFromCmd($case, $cmd, $expected) + { + $bdd = $this->newMockInstance(Base_De_Donnees::class, null, null, [ + 'hostname', + 'database', + 'user', + 'password', + ]); + + $this + ->given( + $cotisations = new \Afup\Site\Association\Cotisations($bdd) + ) + ->then + ->array($cotisations->getAccountFromCmd($cmd)) + ->isEqualTo($expected, $case) + ; + } }