]> git.agnieray.net Git - galette.git/commitdiff
Create member from parent
authorJohan Cwiklinski <johan@x-tnd.be>
Mon, 4 Oct 2021 04:37:35 +0000 (06:37 +0200)
committerJohan Cwiklinski <johan@x-tnd.be>
Sun, 17 Oct 2021 04:15:40 +0000 (06:15 +0200)
galette/includes/core_acls.php
galette/includes/routes/members.routes.php
galette/lib/Galette/Controllers/Crud/MembersController.php
galette/lib/Galette/Core/Preferences.php
galette/lib/Galette/Entity/Adherent.php
galette/templates/default/member.tpl
galette/templates/default/page.tpl
galette/templates/default/preferences.tpl

index 89f6f3cb25fc5cbb9007367a1da0c19b50a587c2..2090faec527ec7a432479faf42118a83de9590c6 100644 (file)
@@ -68,6 +68,7 @@ $core_acls = [
     'member'                            => 'member',
     'pdf-members-cards'                 => 'member',
     'editMember'                        => 'member',
+    'addMemberChild'                    => 'member',
     //most of members routes are accessible to groups manager, including mass changes pages
     '/(.+)?member(.+)?/i'               => 'groupmanager',
     'ajaxGroupMembers'                  => 'staff',
index d6c5e7b4078c8017c37c7a75c9578ec28409606a..0c85674027d329dea2d2479db0679296b955b1a2 100644 (file)
@@ -88,6 +88,11 @@ $app->get(
     [Crud\MembersController::class, 'add']
 )->setName('addMember')->add($authenticate)->add(MembersNavigate::class);
 
+$app->get(
+    '/member/add/child',
+    [Crud\MembersController::class, 'addChild']
+)->setName('addMemberChild')->add($authenticate);
+
 $app->post(
     '/subscribe/store',
     [Crud\MembersController::class, 'doSelfSubscribe']
index 998c7b65915f68537b1ce7a7ae0b7f385aae9968..50d1c084023414e3ebf25ed5aa048857e025fc08 100644 (file)
@@ -95,6 +95,19 @@ class MembersController extends CrudController
         return $this->edit($request, $response, null, 'add');
     }
 
+    /**
+     * Add child page
+     *
+     * @param Request  $request  PSR Request
+     * @param Response $response PSR Response
+     *
+     * @return Response
+     */
+    public function addChild(Request $request, Response $response): Response
+    {
+        return $this->edit($request, $response, null, 'addchild');
+    }
+
     /**
      * Self subscription page
      *
@@ -1083,29 +1096,41 @@ class MembersController extends CrudController
             //retrieve from session, in add or edit
             $member = $this->session->member;
             $this->session->member = null;
-        } elseif ($id !== null) {
+            $id = $member->id;
+        }
+
+        if ($id !== null) {
             //load requested member
             $member->load($id);
-            if (!$member->canEdit($this->login)) {
-                $this->flash->addMessage(
-                    'error_detected',
-                    _T("You do not have permission for requested URL.")
+            $can = $member->canEdit($this->login);
+        } else {
+            $can = $member->canCreate($this->login);
+        }
+
+        if (!$can) {
+            $this->flash->addMessage(
+                'error_detected',
+                _T("You do not have permission for requested URL.")
+            );
+
+            return $response
+                ->withStatus(403)
+                ->withHeader(
+                    'Location',
+                    $this->router->pathFor('me')
                 );
+        }
 
-                return $response
-                    ->withStatus(403)
-                    ->withHeader(
-                        'Location',
-                        $this->router->pathFor('me')
-                    );
-            }
+        //if adding a child, force parent here
+        if ($action === 'addchild') {
+            $member->setParent((int)$this->login->id);
         }
 
         // flagging required fields
         $fc = $this->fields_config;
 
         // password required if we create a new member
-        if ($member->id != '') {
+        if ($id === null) {
             $fc->setNotRequired('mdp_adh');
         }
 
@@ -1144,18 +1169,18 @@ class MembersController extends CrudController
 
         $form_elements = $fc->getFormElements(
             $this->login,
-            $member->id == ''
+            $id === null
         );
 
         // members
         $m = new Members();
-        $id = null;
+        $pid = null;
         if ($member->hasParent()) {
-            $id = ($member->parent instanceof Adherent ? $member->parent->id : $member->parent);
+            $pid = ($member->parent instanceof Adherent ? $member->parent->id : $member->parent);
         }
         $members = $m->getSelectizedMembers(
             $this->zdb,
-            $id
+            $pid
         );
 
         $route_params['members'] = [
@@ -1184,7 +1209,8 @@ class MembersController extends CrudController
                 'groups'            => $groups_list,
                 'fieldsets'         => $form_elements['fieldsets'],
                 'hidden_elements'   => $form_elements['hiddens'],
-                'parent_fields'     => $tpl_parent_fields
+                'parent_fields'     => $tpl_parent_fields,
+                'addchild'          => ($action === 'addchild')
             ) + $route_params
         );
         return $response;
index f85acfe3b0b9507ec6752c5fc2369370aaeffa33..461a7d3e3a14b28beb3f433559a2367e9b768e81 100644 (file)
@@ -38,7 +38,6 @@ namespace Galette\Core;
 use Galette\Entity\PaymentType;
 use Throwable;
 use Analog\Analog;
-use Galette\Core\Galette;
 use Galette\Entity\Adherent;
 use Galette\Entity\Status;
 use Galette\IO\PdfMembersCards;
@@ -275,7 +274,8 @@ class Preferences
         'pref_password_length' => 6,
         'pref_password_blacklist' => false,
         'pref_password_strength' => self::PWD_NONE,
-        'pref_default_paymenttype' => PaymentType::CHECK
+        'pref_default_paymenttype' => PaymentType::CHECK,
+        'pref_bool_create_member' => false
     );
 
     // flagging required fields
index 387932983688912dc46c9da8e1d96cd268514093..fca63ec93418d28c8fc7b92f5525276cfd59202f 100644 (file)
@@ -2039,7 +2039,27 @@ class Adherent
     }
 
     /**
-     * Can current logged in user edit member
+     * Can current logged-in user create member
+     *
+     * @param Login $login Login instance
+     *
+     * @return boolean
+     */
+    public function canCreate(Login $login)
+    {
+        global $preferences;
+
+        if ($this->id && $login->id == $this->id || $login->isAdmin() || $login->isStaff()) {
+            return true;
+        }
+
+        if ($preferences->pref_bool_create_member && $login->isLogged()) {
+            return true;
+        }
+    }
+
+    /**
+     * Can current logged-in user edit member
      *
      * @param Login $login Login instance
      *
@@ -2113,4 +2133,18 @@ class Adherent
     {
         return $this->sendmail;
     }
+
+    /**
+     * Set member parent
+     *
+     * @param integer $id Parent identifier
+     *
+     * @return $this
+     */
+    public function setParent(int $id): self
+    {
+        $this->_parent = $id;
+        $this->loadParent();
+        return $this;
+    }
 }
index 862287d647bc49f1ab021f5a5758834aa9b14be7..85d29618f0dc8f9e6ad310bdd5b18433b1db3798 100644 (file)
@@ -21,9 +21,9 @@
             <div>
         {if $member->hasParent() && !$member->isDuplicate()}
                 <strong>{_T string="Attached to:"}
-                <a href="{path_for name="member" data=["id" => $member->parent->id]}">{$member->parent->sfullname}</a></strong><br/>
-            {if $login->isAdmin() or $login->isStaff() or $login->id eq $member->parent->id}
-                <label for="detach_parent">{_T string="Detach?"}</label>
+                <a href="{path_for name="member" data=["id" => $member->parent->id]}">{$member->parent->sfullname}</a></strong>
+            {if $login->isAdmin() or $login->isStaff() && (!isset($addchild) || !$addchild)}
+                <br/><label for="detach_parent">{_T string="Detach?"}</label>
                 <input type="checkbox" name="detach_parent" id="detach_parent" value="1"/>
             {/if}
         {else if ($login->isAdmin() or $login->isStaff()) and !$member->hasChildren() and isset($members.list)}
@@ -45,7 +45,6 @@
             {foreach from=$member->children item=child}
                 <a href="{path_for name="member" data=["id" => $child->id]}">{$child->sfullname}</a>{if not $child@last}, {/if}
             {/foreach}
-            </tr>
         {/if}
             </div>
     {/if}
index 93021cab8e27d4c2f5138348a860631012ecabfa..eeb39221cf5b3e09febc8fc503cc5830f90c7764 100644 (file)
@@ -34,6 +34,9 @@ We have to use a template file, so Smarty will do its work (like replacing varia
         <h1 class="nojs">{_T string="Navigation"}</h1>
         <ul>
             <li{if $cur_route eq "dashboard"} class="selected"{/if}><a href="{path_for name="dashboard"}" title="{_T string="Go to Galette's dashboard"}">{_T string="Dashboard"}</a></li>
+  {if $preferences->pref_bool_create_member}
+            <li{if $cur_route eq "addMemberChild"} class="selected"{/if}><a href="{path_for name="addMemberChild"}" title="{_T string="Add new child member in database"}">{_T string="Add a child member"}</a></li>
+  {/if}
   {if $login->isAdmin() or $login->isStaff() or $login->isGroupManager()}
             <li{if $cur_route eq "members"} class="selected"{/if}><a href="{path_for name="members"}" title="{_T string="View, search into and filter member's list"}">{_T string="List of members"}</a></li>
             <li{if $cur_route eq "advanced-search"} class="selected"{/if}><a href="{path_for name="advanced-search"}" title="{_T string="Perform advanced search into members list"}">{_T string="Advanced search"}</a></li>
index cc4f22054d3d83e4ffc478ae604481f4af5f9f53..b91e273bd1d34ed0d7a9d31ce438375b088fab38 100644 (file)
                         {html_options options=$pref_numrows_options selected=$pref.pref_numrows}
                     </select>
                 </p>
+                <p>
+                    <label for="pref_bool_create_member" class="bline tooltip">{_T string="Can members create child?"}</label>
+                    <span class="tip">{_T string="Any logged in member will be able to create his own child cards"}</span>
+                    <input type="checkbox" name="pref_bool_create_member" id="pref_bool_create_member" value="1" {if $pref.pref_bool_create_member eq 1}checked="checked"{/if}{if isset($required.pref_bool_create_member) and $required.pref_bool_create_member eq 1} required="required"{/if}/>
+                </p>
                 <p>
 
                     <label for="pref_redirect_on_create" class="bline">{_T string="After member creation:"}</label>