diff --git a/app/controller/admin.php b/app/controller/admin.php index b88da31a58492a91d4aafe2ab7260cd627eab591..137124103e515169fed76f944158b2351296ee83 100644 --- a/app/controller/admin.php +++ b/app/controller/admin.php @@ -881,6 +881,75 @@ class Admin extends Controller $f3->reroute("/admin/users/$user_id"); } + public function user_merge($f3, $args) + { + $id = array_key_exists('id', $args) ? \Utils::asl($args['id']) : ''; + $f3->set('id', $id); + + if($f3->get('VERB') == 'GET') { + $merger = $f3->get('container')['user_finder']->findById($id); + $email_merged = \Utils::asl($f3->get('GET.merged')); + $user = $f3->get('container')['user_finder']->findById($id); + $merged = $f3->get('container')['user_finder']->findByEmail($email_merged); + // Now, we're going to list all pledges and counterparts of merged user + // to display them to the admin. + $counterparts = $f3->get('container')['counterpart_finder']->findByUserId($merged['id']); + $donations = $f3->get('container')['donation_finder']->findByUserId($merged['id']); + + // Augment the context + $f3->set('merger', $merger); + $f3->set('merged', $merged); + $f3->set('total', (int)$merged['total'] + (int)$merger['total']); + $f3->set('cumul', (int)$merged['cumul'] + (int)$merger['cumul']); + $f3->set('counterparts', $counterparts); + $f3->set('donations', $donations); + + $f3->set('block_content', 'backend/fusion_user.html'); + } else if($f3->get('VERB') == 'POST') { + $merger_id = \Utils::asl($f3->get('POST.merger_id')); + $merged_id = \Utils::asl($f3->get('POST.merged_id')); + + // Retrieving the associated users + $merger = $f3->get('container')['user_finder']->findById($merger_id); + $merged = $f3->get('container')['user_finder']->findById($merged_id); + + // Update total and cumul values + $f3->get('container')['command_handler']->handle(new UserUpdateByAdminCommand($merger_id, + $merger['pseudo'], + $merger['email'], + $merger['commentaire'] + $merged['commentaire'], + (int) $merger['total'] + (int) $merged['total'], + (int) $merger['cumul'] + (int) $merged['cumul'])); + + $db = $f3->get('DB'); + // Now, let's change all counterparts of merged + $db->query("UPDATE contreparties + SET user_id = '" . $merger_id ."' + WHERE user_id = '" . $merged_id ."'"); + + // The donations + $db->query("UPDATE dons + SET user_id = '" . $merger_id ."' + WHERE user_id = '" . $merged_id ."'"); + + // The identifiers + $db->query("UPDATE identifiers + SET user_id = '" . $merger_id . "' + WHERE user_id = '" . $merged_id . "'"); + + // The adresses + $db->query("UPDATE adresses + SET user_id = '" . $merger_id . "' + WHERE user_id = '" . $merged_id . "'"); + + // Remove the merged user + $db->query("DELETE FROM users WHERE id = '" . $merged_id . "'"); + + // Reroute to the merger + $f3->reroute('/admin/users/'.$merger_id); + }; + } + public function user($f3, $args) { $id = array_key_exists('id', $args) ? \Utils::asl($args['id']) : ''; diff --git a/app/routes.ini b/app/routes.ini index b005fcfda33dce6d18098ee3b08f1fb798d4f629..02d84cc13fc3e9a4292b4a761daeafd099276c26 100644 --- a/app/routes.ini +++ b/app/routes.ini @@ -45,6 +45,7 @@ GET|POST @users:/admin/users=Controller\Admin->users POST @add_user:/admin/users/add=Controller\Admin->user GET @user_info:/admin/users/@id=Controller\Admin->user POST @modify_user:/admin/users/@id=Controller\Admin->user +GET|POST @fusion_user:/admin/users/fusion/@id=Controller\Admin->user_merge POST @adresse:/admin/adresses=Controller\Admin->adresse diff --git a/app/view/backend/fusion_user.html b/app/view/backend/fusion_user.html new file mode 100644 index 0000000000000000000000000000000000000000..68c239dbbaa98b74bedab04df5fd95349298edf1 --- /dev/null +++ b/app/view/backend/fusion_user.html @@ -0,0 +1,98 @@ +<section id="fusion"> + <h2>Fusion de deux utilisateurs</h2> + <p> Fusionner l'utilisateur #{{ @merged.id }} avec l'utilisateur #{{ @merger.id }}</p> + <h3>Utilisateur {{ @merger.pseudo }} après fusion :</h3> + <dl> + <dt>Pseudo</dt> + <dd>{{ @merger.pseudo }}</dd> + <dt>Email</dt> + <dd>{{ @merger.email }}</dd> + <dt>Total</dt> + <dd>{{ @total }}</dd> + <dt>Cumul</dt> + <dd>{{ @cumul }}</dd> + </dl> +</section> +<section id="counterparts"> + <h2>Les contreparties suivantes seront ajoutées à {{ @merger.pseudo }}</h2> + <table> + <thead> + <tr> + <th>Id</th> + <th>Id du parent</th> + <th>Date</th> + <th>Quoi</th> + <th>Taille/Piplome</th> + <th>Statut</th> + <th>Commentaire</th> + </tr> + </thead> + <tbody> + <repeat group="{{ @counterparts }}" value="{{ @row }}"> + <tr> + <td>{{ @row.id }}</td> + <td>{{ @row.parent }}</td> + <td>{{ @row.datec }}</td> + <td>{{ @row.quoi }}</td> + <td> + <check if="{{ @row.quoi=='piplome' }}"> + <true> + <a href="{{ @PIPLOME_URL }}{{ @row.pdf_url }}.pdf">{{ @row.pdf_url }}</a> + ({{ @row.pdf_nom }}) + </true> + <false> + <check if="{{ @row.quoi=='pibag' }}"> + <true> + + </true> + <false> + {{ @atailles[@row.taille] }} + </false> + </check> + </false> + </check> + </td> + <td> + {{ @row.status }} + </td> + <td> + {{ @row.commentaire }} + </td> + </repeat> + </tr> + </tbody> + </table> +</section> +<section id="donations"> + <h2>Les dons suivants seront ajoutés à {{ @merger.pseudo }}</h2> + <table> + <thead> + <th>Id</th> + <th>Date</th> + <th>Don</th> + <th>Adresse</th> + <th>PDF</th> + <th>Statut</th> + </thead> + <tbody> + <repeat group="{{ @donations }}" value="{{ @row }}"> + <tr> + <td>{{ @row.id }}</td> + <td class="inline">{{ @row.datec }}</td> + <td>{{ @row.somme }}</td> + <td>{{ @row.pdf }}</td> + <td class="inline">{{ @row.status }}</td> + </tr> + </repeat> + </tbody> + </table> +</section> +<section id="form"> + <h2>Fusionner les utilisateurs #{{ @merger.id }} et #{{ @merged.id }} </h2> + <form name="merge" method="POST" action="{{ 'fusion_user' | alias }}"> + <input type="hidden" id="csrf" name="csrf" value="{{ @CSRF }}" /> + <input type="hidden" id="merger_id" name="merger_id" value="{{ @merger.id }}" /> + <input type="hidden" id="merged_id" name="merged_id" value="{{ @merged.id }}" /> + <input type="submit" value="Fusionner les utilisateurs" /> + </form> +</section> diff --git a/app/view/backend/user.html b/app/view/backend/user.html index 77aeb5fd429fb72aeedd00429176e1136a731fe7..17908284eed3b89b123859ecad1e7c09a95ac027 100644 --- a/app/view/backend/user.html +++ b/app/view/backend/user.html @@ -1,49 +1,61 @@ <section id="ajout"> - <check if="{{ @id>0 }}"> - <true> - <h2>Modification d'un utilisateur</h2> - </true> - <false> - <h2>Ajout d'un utilisateur</h2> - </false> - </check> - <form name="f" method="POST" action="{{ 'modify_user' | alias }}"> - <input type="hidden" name="id" id="id" value="{{ @id }}" /> - <input type="hidden" id="csrf" name="csrf" value="{{ @CSRF }}" /> + <check if="{{ @id>0 }}"> + <true> + <h2>Modification d'un utilisateur</h2> + </true> + <false> + <h2>Ajout d'un utilisateur</h2> + </false> + </check> + <form name="f" method="POST" action="{{ 'modify_user' | alias }}"> + <input type="hidden" name="id" id="id" value="{{ @id }}" /> + <input type="hidden" id="csrf" name="csrf" value="{{ @CSRF }}" /> - <label for="pseudo">Pseudo</label> - <input type="text" id="pseudo" name="pseudo" size="30" value="{{ @user.pseudo }}" /> - <br /> + <label for="pseudo">Pseudo</label> + <input type="text" id="pseudo" name="pseudo" size="30" value="{{ @user.pseudo }}" /> + <br /> - <label for="email">Email</label> - <input type="text" id="email" name="email" size="30" value="{{ @user.email }}" /> - <br /> + <label for="email">Email</label> + <input type="text" id="email" name="email" size="30" value="{{ @user.email }}" /> + <br /> - <label for="commentaire">Commentaire</label> - <textarea type="textarea" id="commentaire" name="commentaire" cols="30" rows="2">{{ @user.commentaire }}</textarea> - <br /> + <label for="commentaire">Commentaire</label> + <textarea type="textarea" id="commentaire" name="commentaire" cols="30" rows="2">{{ @user.commentaire }}</textarea> + <br /> - <check if="{{ @id>0 }}"> - <true> - <label for="total">Total de dons cumulés</label> + <check if="{{ @id>0 }}"> + <true> + <label for="total">Total de dons cumulés</label> <input type="text" id="total" name="total" size="30" value="{{ @user.total }}" /> - <br /> + <br /> - <label for="cumul">Cumul disponible pour les contreparties</label> + <label for="cumul">Cumul disponible pour les contreparties</label> <input type="text" id="cumul" name="cumul" size="30" value="{{ @user.cumul }}" /> - <br /> + <br /> + + <input type="submit" value="Modifier cet utilisateur" /> + </true> + <false> + <input type="submit" value="Ajouter cet utilisateur" /> + </false> + </check> + </form> + <br /> +</section> +<section id="fusion"> + <h2>Fusionner cet utilisateur avec un autre</h2> + <form name="merge_{{@id}}" method="GET" action="{{ 'fusion_user' | alias }}"> + <input type="hidden" id="csrf" name="csrf" value="{{ @CSRF }}" /> + <input type="hidden" name="id" id="id" value="{{ @@user.id }}" /> + + <label for="merge_adresse">Adresse mail du compte à fusionner avec celui-ci</label> + <input type="text" id="merged" name="merged" size="30" /> - <input type="submit" value="Modifier cet utilisateur" /> - </true> - <false> - <input type="submit" value="Ajouter cet utilisateur" /> - </false> - </check> - </form> - <br /> + <input type="submit" value="Prévisualiser les changements avant fusion." /> + </form> </section> <section id="adresses"> - <h2>Adresse postale de cet utilisateur</h2> + <h2>Adresse postale de cet utilisateur</h2> <check if="@@user.adresse"> <form name="addr_{{@id }}" method="POST" action="{{ 'adresse' |alias }}"> <input type="hidden" id="csrf" name="csrf" value="{{ @CSRF }}" /> @@ -81,7 +93,7 @@ <input type="submit" value="Modifier l'adresse" /> </form> <form name="del_addr_{{@id}}" method="POST" action="{{ 'adresse' | alias }}"> - <input type="hidden" id="csrf" name="csrf" value="{{ @CSRF }}" /> + <input type="hidden" id="csrf" name="csrf" value="{{ @CSRF }}" /> <input type="hidden" name="id" id="id" value="{{ @@user.adresse.id }}" /> <input type="hidden" name="action" id="action" value="delete" /> <input type="submit" value="Effacer l'adresse" /> @@ -89,168 +101,168 @@ </check> </section> <section id="contreparties"> - <check if="{{ count(@user.contreparties) > 0}}"> - <true> - <h2>Contreparties de cet utilisateur</h2> - <table cellspacing="0" cellpadding="0"> - <theader> - <th>Id</th> - <th>Id du parent</th> - <th>Date</th> - <th>Quoi</th> - <th>Taille/Piplome</th> - <th>Adresse</th> - <th>Statut</th> - <th>Actions</th> - </theader> - <tbody> - <repeat group="{{ @user.contreparties }}" value="{{ @row }}"> - <tr> - <td>{{ @row.id }}</td> - <td>{{ @row.parent }}</td> - <td>{{ @row.datec }}</td> - <td>{{ @row.quoi }}</td> - <td> - <check if="{{ @row.quoi=='piplome' }}"> - <true> - <a href="{{ @PIPLOME_URL }}{{ @row.pdf_url }}.pdf">{{ @row.pdf_url }}</a> - ({{ @row.pdf_nom }}) - </true> - <false> - <check if="{{ @row.quoi=='pibag' }}"> - <true> - - </true> - <false> - {{ @TAILLES[@row.taille] }} - </false> - </check> - </false> - </check> - </td> - <td> - <check if="{{ @row.adresse_id != null }}"> - <true> - {{ @@user.adresses[@row.adresse_id].nom }} - </true> - <false> - - - </false> - </check> - </td> - <td class="inline">{{ @CT_STATUTS[@row.status] }}</td> - <td> - <a href="{{ 'edit_counterpart', 'id='.@row.id | alias }}">Editer</a> - <check if="{{ @row.status!=1 }}" > - - - <span class="lien" onclick="asked({{ @row.id }})">Demandé</span> - </check> - <check if="{{ @row.status!=2 }}" > - - - <span class="lien" onclick="sent({{ @row.id }})">Envoyé</span> - </check> - <check if="{{ @row.status!=3 }}" > - - - <span class="lien" onclick="npai({{ @row.id }})">NPAI</span> - </check> - <check if="{{ @row.status!=99 }}" > - - - <span class="lien" onclick="canceled({{ @row.id }})">Annulé</span> - </check> - <check if="{{ @row.quoi=='piplome' }}" > - - - <span class="lien" onclick="pdf({{ @row.pdf_id }})">PDF</span> - </check> - </td> - </tr> - </repeat> - </tbody> - </table> - </true> - <false> - <h2>Pas de contreparties associées à cet utilisateur</h2> - </false> - </check> + <check if="{{ count(@user.contreparties) > 0}}"> + <true> + <h2>Contreparties de cet utilisateur</h2> + <table cellspacing="0" cellpadding="0"> + <theader> + <th>Id</th> + <th>Id du parent</th> + <th>Date</th> + <th>Quoi</th> + <th>Taille/Piplome</th> + <th>Adresse</th> + <th>Statut</th> + <th>Actions</th> + </theader> + <tbody> + <repeat group="{{ @user.contreparties }}" value="{{ @row }}"> + <tr> + <td>{{ @row.id }}</td> + <td>{{ @row.parent }}</td> + <td>{{ @row.datec }}</td> + <td>{{ @row.quoi }}</td> + <td> + <check if="{{ @row.quoi=='piplome' }}"> + <true> + <a href="{{ @PIPLOME_URL }}{{ @row.pdf_url }}.pdf">{{ @row.pdf_url }}</a> + ({{ @row.pdf_nom }}) + </true> + <false> + <check if="{{ @row.quoi=='pibag' }}"> + <true> + + </true> + <false> + {{ @TAILLES[@row.taille] }} + </false> + </check> + </false> + </check> + </td> + <td> + <check if="{{ @row.adresse_id != null }}"> + <true> + {{ @@user.adresses[@row.adresse_id].nom }} + </true> + <false> + - + </false> + </check> + </td> + <td class="inline">{{ @CT_STATUTS[@row.status] }}</td> + <td> + <a href="{{ 'edit_counterpart', 'id='.@row.id | alias }}">Editer</a> + <check if="{{ @row.status!=1 }}" > + - + <span class="lien" onclick="asked({{ @row.id }})">Demandé</span> + </check> + <check if="{{ @row.status!=2 }}" > + - + <span class="lien" onclick="sent({{ @row.id }})">Envoyé</span> + </check> + <check if="{{ @row.status!=3 }}" > + - + <span class="lien" onclick="npai({{ @row.id }})">NPAI</span> + </check> + <check if="{{ @row.status!=99 }}" > + - + <span class="lien" onclick="canceled({{ @row.id }})">Annulé</span> + </check> + <check if="{{ @row.quoi=='piplome' }}" > + - + <span class="lien" onclick="pdf({{ @row.pdf_id }})">PDF</span> + </check> + </td> + </tr> + </repeat> + </tbody> + </table> + </true> + <false> + <h2>Pas de contreparties associées à cet utilisateur</h2> + </false> + </check> </section> <section id="dons"> - <check if="{{ count(@user.dons) > 0 }}"> - <true> - <h2>Dons associés à cet utilisateur</h2> - </true> - <table cellspacing="0" cellpadding="0"> - <theader> - <th>ID</th> - <th>Date</th> - <th>Don</th> - <th>PDF</th> - <th>Statut</th> - <th>Actions</th> - </theader> - <tbody> - <repeat group="{{ @user.dons }}" value="{{ @row }}"> - <tr> - <td>{{ @row.id }}</td> - <td class="inline">{{ @row.datec }}</td> - <td>{{ @row.somme }}</td> - <td> - <check if="{{ @row.pdf == '' }}"> + <check if="{{ count(@user.dons) > 0 }}"> + <true> + <h2>Dons associés à cet utilisateur</h2> + </true> + <table cellspacing="0" cellpadding="0"> + <theader> + <th>ID</th> + <th>Date</th> + <th>Don</th> + <th>PDF</th> + <th>Statut</th> + <th>Actions</th> + </theader> + <tbody> + <repeat group="{{ @user.dons }}" value="{{ @row }}"> + <tr> + <td>{{ @row.id }}</td> + <td class="inline">{{ @row.datec }}</td> + <td>{{ @row.somme }}</td> + <td> + <check if="{{ @row.pdf == '' }}"> + <true> + <a href="/cron/piplome/{{ @row.id }}">PDF</a> + </true> + <false> + <a href="{{ PIPLOME_URL }}/{{ @row.pdf }}.pdf" target="_blank">PDF</a> + </false> + </check> + </td> + <td class="inline">{{ @DONS_STATUTS[@row.status] }}</td> + <td> + <a href="{{ 'edit_support', 'id='.@row.id | alias }}">Editer</a> + - + <check if="{{ @row.status==0 || @row.status==100 }}" > <true> - <a href="/cron/piplome/{{ @row.id }}">PDF</a> + <a href="{{ 'validate_support', 'id='.@row.id | alias }}">Valider</a> </true> <false> - <a href="{{ PIPLOME_URL }}/{{ @row.pdf }}.pdf" target="_blank">PDF</a> + <a href="{{ 'invalidate_support', 'id='.@row.id | alias }}">Invalider</a> + - </false> - </check> - </td> - <td class="inline">{{ @DONS_STATUTS[@row.status] }}</td> - <td> - <a href="{{ 'edit_support', 'id='.@row.id | alias }}">Editer</a> - - - <check if="{{ @row.status==0 || @row.status==100 }}" > - <true> - <a href="{{ 'validate_support', 'id='.@row.id | alias }}">Valider</a> - </true> - <false> - <a href="{{ 'invalidate_support', 'id='.@row.id | alias }}">Invalider</a> - - - </false> - </check> - </td> - </tr> - </repeat> - </tbody> - </table> - </true> - <false> - <h2>Pas de dons enregistrés pour cet utilisateur</h2> - </false> - </check> + </check> + </td> + </tr> + </repeat> + </tbody> + </table> + </true> + <false> + <h2>Pas de dons enregistrés pour cet utilisateur</h2> + </false> + </check> </section> <script type="text/javascript"> -document.forms['f'].nom.focus(); + document.forms['f'].nom.focus(); function select_span() { - if (document.forms['f'].quoi.value=='piplome') { - $('#quoi_pdf').show(); - $('#quoi_taille').hide(); - } else { - $('#quoi_pdf').hide(); - $('#quoi_taille').show(); - } - select_taille(); + if (document.forms['f'].quoi.value=='piplome') { + $('#quoi_pdf').show(); + $('#quoi_taille').hide(); + } else { + $('#quoi_pdf').hide(); + $('#quoi_taille').show(); + } + select_taille(); } function select_taille() { - if (document.forms['f'].quoi.value=='piplome') { - document.forms['f'].taille.value = document.forms['f'].url.value; - } else { - document.forms['f'].taille.value = document.forms['f'].size.value; - } + if (document.forms['f'].quoi.value=='piplome') { + document.forms['f'].taille.value = document.forms['f'].url.value; + } else { + document.forms['f'].taille.value = document.forms['f'].size.value; + } } window.onload = function() { - select_span(); - select_taille(); + select_span(); + select_taille(); }; </script>