diff --git a/app/controller/campaign.php b/app/controller/campaign.php index 937787ee2c42082a2d79ad31430a486b8351b253..e49afbeea7a5dc1df0e3d445f9de24a569f753f3 100644 --- a/app/controller/campaign.php +++ b/app/controller/campaign.php @@ -86,6 +86,12 @@ class Campaign extends Controller $sum = $f3->get('amount_other'); } + // If the donation is not a positive amount, we fail the donation. + if ($f3->get('amount') < 1) { + $f3->set("error", _("Montant du don invalide, il doit être supérieur à 1€.")); + $f3->error("403"); + } + $f3->set('amount', $sum); $status = 0; diff --git a/app/controller/perso.php b/app/controller/perso.php index f5d3410becc28c87c6edc95a0134aefb1ddb1ff5..cf8c5dd0411a32d0dbdb8cc48d3c5d9ebcb2cfc9 100644 --- a/app/controller/perso.php +++ b/app/controller/perso.php @@ -287,6 +287,22 @@ class Perso extends Controller } $f3->push('SESSION.message', _("Adresse ajoutée à votre profil")); break; + case 'UPDATE': + $f3->get('container')['command_handler']->handle( + new AddressUpdateCommand( + \Utils::asl($f3->get('id')), + \Utils::asl($f3->get('SESSION.id')), + \Utils::asl($f3->get('nom')), + \Utils::asl($f3->get('adresse')), + \Utils::asl($f3->get('adresse2')), + \Utils::asl($f3->get('codepostal')), + \Utils::asl($f3->get('ville')), + \Utils::asl($f3->get('pays')), + \Utils::asl($f3->get('state')) + ) + ); + $f3->push('SESSION.message', _("Adresse du profil modifiée.")); + break; case 'DELETE': try { $f3->get('container')['command_handler']->handle( diff --git a/app/view/base.html b/app/view/base.html index 647042c1511a4869bc156664d9ab3fefde478db8..cf95e63dd7a1565423cc51a7a8a5089e8cafe597 100644 --- a/app/view/base.html +++ b/app/view/base.html @@ -1,5 +1,5 @@ <!DOCTYPE html> -<html> +<html lang="fr"> <include href="header.html" /> <body> <include href="toolbar.html" /> diff --git a/app/view/campaign/donation.html b/app/view/campaign/donation.html index 52bb2559de88deb8654ff8c8837783394efb17d3..9f709bb38d4fb69463c5cfb6e48690f2285199d8 100644 --- a/app/view/campaign/donation.html +++ b/app/view/campaign/donation.html @@ -13,8 +13,8 @@ <input type="text" name="card" value="Carte de Crédit"><br> <input type="text" name="crypto" value="123"><br> <input type="text" name="expiry" value="1218"><br> - <input type="radio" name="monthly" value="1">Récurrent</br> - <input type="radio" name="monthly" value="0">Ponctuel</br> + <input type="radio" name="monthly" value="1">Récurrent </br> + <input type="radio" name="monthly" value="0">Ponctuel </br> <input type="submit" value="Submit"><br> </form> diff --git a/app/view/campaign/errors.html b/app/view/campaign/errors.html index 8b2359583f5c135816f6982639b50b900850e811..f3243d289cbcb90788e7ccf6b6ca59da3499f238 100644 --- a/app/view/campaign/errors.html +++ b/app/view/campaign/errors.html @@ -15,7 +15,7 @@ <form method="POST" class="form-inline" action="{{ 'login' | alias }}"> <fieldset> <legend> - <h3 class="text-center">{{ _("Réinitialiser votre mot de passe.") }}</h4> + <h3 class="text-center">{{ _("Réinitialiser votre mot de passe.") }}</h3> </legend> <input type="hidden" name="csrf" id="csrf" value="{{ @CSRF }}"> <input type="hidden" name="action" id="action" value="renew_password"> diff --git a/app/view/campaign/faq.html b/app/view/campaign/faq.html index e4cdfa3d2e2531d456e39ef72be827aca04ea272..60bbff62e04ccaef609f4e49e3011df8276334cf 100644 --- a/app/view/campaign/faq.html +++ b/app/view/campaign/faq.html @@ -150,12 +150,12 @@ <input id="don-bitcoin" type="checkbox"> <div class="panel-heading"> <h4> - <label for="don-bitcoin">{{ _("Puis-je faire un don via BitCoin ou d'autres crypto-monnaies ?") }}<span class="panel-caret pull-right"></span></label> + <label for="don-bitcoin">{{ _("Puis-je faire un don en Bitcoin ?") }}<span class="panel-caret pull-right"></span></label> </h4> </div> <div class="collapsed "> <div class="panel-body white-pure"> - <p>{{ _("Non , nous n'acceptons plus les bitcoins, car ils représentent une faible partie des dons, et qu'ils ont un impact écologique disproportioné. Mais nous continuons d’accepter l’argent physique, en chèque ou autre.") }}<ul><li>{{ _("S'il vous plaît, n'utilisez plus l'ancienne adresse bitcoin : ils partiront dans le vide.") }}</li></ul></p> + <p>{{ _("Nous n'acceptons plus les dons en Bitcoin : ils représentent une faible partie des dons et ont un impact écologique disproportioné. Nous continuons d’accepter les dons en espèce, en chèque ou autre.") }}<ul><li>{{ _("S'il vous plaît, n'utilisez plus l'ancienne adresse Bitcoin : vos dons partiront dans le vide.") }}</li></ul></p> </div> </div> </div> diff --git a/app/view/campaign/home.html b/app/view/campaign/home.html index fbb23e9858ea352bc07e2b5d022a05b4efb3c21d..d12ae1983ffba7a11c873188469b643328eb8c99 100644 --- a/app/view/campaign/home.html +++ b/app/view/campaign/home.html @@ -44,7 +44,7 @@ <legend class="modal-form-only">{{ _("Récapitulatif de votre don") }}</legend> <fieldset> <div class="modal-row"> - <div class="radio-row"> + <div class="radio-row"> <input type="radio" name="amount" id="amount1" value="11"> <label for="amount1" class="text-center">11€ </label> <input type="radio" name="amount" id="amount2" value="42"> @@ -71,7 +71,7 @@ </div> </div> </fieldset> - <p class="unmodal">{{ _("Vous pouvez donner par <b>carte bancaire</b>, <b><a href=\"/faq#don-cheque\">chèque</a></b>, <b><a href=\"/faq#don-bitcoin\">crypto-monnaie</a></b> ou <b><a href=\"/faq#don-virement\">virement</a></b>.") }}</p> + <p class="unmodal">{{ _("Vous pouvez donner par <b>carte bancaire</b>, <b><a href=\"/faq#don-cheque\">chèque</a></b> ou <b><a href=\"/faq#don-virement\">virement</a></b>.") }}</p> <a class="btn btn-modal btn-lg unmodal" href="#step1"><em>{{ _("Faire un don") }}</em></a> <check if="{{ @@SESSION.user }}"> <false> diff --git a/app/view/header.html b/app/view/header.html index fe36718fe821f9b1df9c1b8c56c3995f949a7a55..00f79b618ec87096ef3c93dda6d0e85cf97ae1cc 100644 --- a/app/view/header.html +++ b/app/view/header.html @@ -16,7 +16,7 @@ <!-- Twitter cards --> <meta name="twitter:card" content="summary_large_image" /> <meta name="twitter:site" content="@laquadrature" /> - <meta name="twitter:title" content="{{ _("Soutenez la Quadrature du Net !") }}"> + <meta name="twitter:title" content="{{ _("Soutenez la Quadrature du Net !") }}"> <meta name="twitter:image" content="https://soutien.laquadrature.net/static/img/anim_3.gif"> <meta name="twitter:description" content="{{ _("Depuis sa création, La Quadrature du Net agit sans relâche pour qu'Internet demeure un outil de partage, de libre expression, d'émancipation et permette la participation de tous au débat démocratique.") }}"> diff --git a/app/view/user/perso.html b/app/view/user/perso.html index d5d3aa7d64ea56528c266aa03facf83d8c68cdf1..524f8e4aca56325bacb16728f430fd4b6bcd1351 100644 --- a/app/view/user/perso.html +++ b/app/view/user/perso.html @@ -79,8 +79,15 @@ <h3>{{ _("Renseigner votre adresse.")}}</h3> <form method="POST" action="{{ 'adresses' | alias }}" id="create-adress-form"> <input type="hidden" name="csrf" value="{{ @CSRF }}" /> - <input type="hidden" name="action" value="ADD" /> + <check if="{{ @adresse }}"> + <true> + <input type="hidden" name="action" value="UPDATE" /> <input type="hidden" name="id" value="{{ @@adresse.id }}" /> + </true> + <false> + <input type="hidden" name="action" value="ADD" /> + </false> + </check> <div class="form-group"> <label for="nom">{{ _("Destinataire") }}</label> <input type="text" class="form-control" name="nom" value="{{ @@adresse.nom }}"> diff --git a/locales/en_US/LC_MESSAGES/messages.po b/locales/en_US/LC_MESSAGES/messages.po index a4cc1c87825a812a9c285f28fb998c567b07064b..126813a443b60d440b73b02b75cb91711a3a16e1 100644 --- a/locales/en_US/LC_MESSAGES/messages.po +++ b/locales/en_US/LC_MESSAGES/messages.po @@ -113,7 +113,7 @@ msgid "" "Site hébergé par <a href=\"https://laquadrature.net\">La Quadrature du Net</" "a>" msgstr "" -"Website hosted by <a href=\"https://laqaudrature.net\">La Quadrature du Net</" +"Website hosted by <a href=\"https://laquadrature.net\">La Quadrature du Net</" "a>" #: app/view/footer.html:7 @@ -830,12 +830,8 @@ msgstr "" "to protect our financial freedom. Our financial regulations document defines " "how:<br />As for companies, the following rules applies:" -<<<<<<< Updated upstream #: app/view/campaign/faq.html:234 #, c-format -======= -#: app/view/campaign/faq.html:235 ->>>>>>> Stashed changes msgid "" "La part du budget annuel de LQdN apportée par des entreprises donnant " "chacune 1 000 euros ou plus une année donnée ne peut dépasser 20% du budget " @@ -877,11 +873,7 @@ msgstr "" msgid "Qui finance La Quadrature du Net ?" msgstr "Who's financing La Quadrature du Net?" -<<<<<<< Updated upstream #: app/view/campaign/faq.html:252 -======= -#: app/view/campaign/faq.html:253 ->>>>>>> Stashed changes msgid "" "La Quadrature du Net est financée à 70 % par des dons individuels : vos " "dons ! Nous acceptons aussi les dons d'entreprise, mais tous les dons " diff --git a/src/LQDN/Command/AddressUpdateCommand.php b/src/LQDN/Command/AddressUpdateCommand.php new file mode 100644 index 0000000000000000000000000000000000000000..e094fd336ab88de8890006dab06971c33d300e46 --- /dev/null +++ b/src/LQDN/Command/AddressUpdateCommand.php @@ -0,0 +1,74 @@ +<?php + +namespace LQDN\Command; + +class AddressUpdateCommand +{ + private $addressId; + private $userId; + private $name; + private $address; + private $address2; + private $postalCode; + private $city; + private $country; + private $state; + + public function __construct($addressId, $userId, $name, $address, $address2, $postalCode, $city, $country, $state) + { + $this->addressId = $addressId; + $this->userId = $userId; + $this->name = $name; + $this->address = $address; + $this->address2 = $address2; + $this->postalCode = $postalCode; + $this->city = $city; + $this->country = $country; + $this->state = $state; + } + + public function getAddressId() + { + return $this->addressId; + } + + public function getUserId() + { + return $this->userId; + } + + public function getName() + { + return $this->name; + } + + public function getAddress() + { + return $this->address; + } + + public function getAddress2() + { + return $this->address2; + } + + public function getPostalCode() + { + return $this->postalCode; + } + + public function getCity() + { + return $this->city; + } + + public function getCountry() + { + return $this->country; + } + + public function getState() + { + return $this->state; + } +} diff --git a/src/LQDN/Handler/AddressHandler.php b/src/LQDN/Handler/AddressHandler.php index cbc247ffbdd087a00037f2b71e3508b3fa20af04..55b1edb12c5ca9b23f4895322893077468c5d334 100644 --- a/src/LQDN/Handler/AddressHandler.php +++ b/src/LQDN/Handler/AddressHandler.php @@ -63,24 +63,6 @@ EOF; $stmt->execute(); } - /** - * Check if an address already exists. - * - * @param int $userId - * - * @return bool - */ - private function addressExists($userId) - { - return (bool) $this->connection->fetchColumn( - "SELECT 1 FROM adresses WHERE user_id = :user_id", - [ - 'user_id' => $userId, - ], - 0 - ); - } - /** * Check if an adress is used. * @@ -99,4 +81,33 @@ EOF; ); return ($count > 0); } + + /** + * Update an address. + * + * @param AddressUpdateCommand $command + */ + public function handleAddressUpdateCommand(AddressUpdateCommand $command) + { + $addressId = $command->getAddressId(); + $userId = $command->getUserId(); + + $query =<<<EOF +UPDATE adresses +SET nom = :name, adresse = :address, adresse2 = :address2, codepostal = :postal_code, ville = :city, etat = :state, pays = :country +WHERE id = :id and user_id = :user_id +EOF; + + $stmt = $this->connection->prepare($query); + $stmt->bindValue('id', $command->getAddressId()); + $stmt->bindValue('user_id', $command->getUserId()); + $stmt->bindValue('name', $command->getName()); + $stmt->bindValue('address', $command->getAddress()); + $stmt->bindValue('address2', $command->getAddress2()); + $stmt->bindValue('postal_code', $command->getPostalCode()); + $stmt->bindValue('city', $command->getCity()); + $stmt->bindValue('state', $command->getState()); + $stmt->bindValue('country', $command->getCountry()); + $stmt->execute(); + } } diff --git a/tests/functional/Handler/AddressHandlerTest.php b/tests/functional/Handler/AddressHandlerTest.php index 81558168925e6fdf564d75d46eff1847d3c4bf72..27fcc15e5d7a18c635f6db13830d56e127acff4b 100644 --- a/tests/functional/Handler/AddressHandlerTest.php +++ b/tests/functional/Handler/AddressHandlerTest.php @@ -61,6 +61,30 @@ class AddressHandlerTest extends FunctionalTest $this->assertSame($expectedAddress, $latestAddress); } + public function testAddressUpdate() + { + $this->assertTrue($this->addressExists(1)); + + $latestAddress = $this->getLatestAddress(); + + $this->container['command_handler']->handle(new AddressUpdateCommand(1, 1, 'LQDN', '115 rue de Ménilmontant', '', 75020, 'Paris', 'France', 'IDF')); + + $expectedAddress = [ + 'id' => '1', + 'user_id' => '1', + 'nom' => 'LQDN', + 'adresse' => '115 rue de Ménilmontant', + 'adresse2' => '', + 'codepostal' => '75020', + 'ville' => 'Paris', + 'pays' => 'France', + 'etat' => 'IDF', + ]; + + $updatedAddress = $this->getAddressById(1); + $this->assertSame($expectedAddress, $updatedAddress); + } + /** * Check if an address exists in DB. * @@ -82,4 +106,16 @@ class AddressHandlerTest extends FunctionalTest { return $this->container['db']->fetchAssoc("SELECT * FROM adresses ORDER BY id DESC LIMIT 1"); } + + /** + * Retrieve address by its ID. + * + * @param int $id + * + * @return [] + */ + private function getAddressById($id) + { + return $this->container['db']->fetchAssoc("SELECT id,user_id,nom,adresse,adresse2,codepostal,ville,pays,etat FROM adresses WHERE id = $id LIMIT 1"); + } }