Coverage Report - jp.co.y_net.amm.page.MemberListPage
 
Classes in this File Line Coverage Branch Coverage Complexity
MemberListPage
0%
0/82
0%
0/30
0
MemberListPage$1
0%
0/5
0%
0/2
0
MemberListPage$10
0%
0/3
0%
0/2
0
MemberListPage$2
0%
0/5
0%
0/2
0
MemberListPage$3
0%
0/3
N/A
0
MemberListPage$4
0%
0/5
0%
0/2
0
MemberListPage$5
0%
0/5
0%
0/2
0
MemberListPage$6
0%
0/9
N/A
0
MemberListPage$7
0%
0/13
N/A
0
MemberListPage$7$1
0%
0/9
0%
0/2
0
MemberListPage$8
0%
0/3
0%
0/2
0
MemberListPage$9
0%
0/76
0%
0/36
0
 
 1  0
 package jp.co.y_net.amm.page;
 2  
 
 3  
 import java.util.ArrayList;
 4  
 import java.util.Collections;
 5  
 import java.util.List;
 6  
 
 7  
 import jp.co.y_net.amm.AppSession;
 8  
 import jp.co.y_net.amm.AppSession.LoginUser;
 9  
 import jp.co.y_net.amm.common.AppLogger;
 10  
 import jp.co.y_net.amm.common.AppSendMail;
 11  
 import jp.co.y_net.amm.common.AppSendMail.MailSetting;
 12  
 import jp.co.y_net.amm.common.AppStringUtils;
 13  
 import jp.co.y_net.amm.common.AppUtils;
 14  
 import jp.co.y_net.amm.common.ResourceReader;
 15  
 import jp.co.y_net.amm.dao.AppDef;
 16  
 import jp.co.y_net.amm.dao.Org;
 17  
 import jp.co.y_net.amm.dao.Usr;
 18  
 
 19  
 import org.apache.commons.lang.StringUtils;
 20  
 import org.apache.wicket.AttributeModifier;
 21  
 import org.apache.wicket.RestartResponseException;
 22  
 import org.apache.wicket.ajax.AjaxRequestTarget;
 23  
 import org.apache.wicket.markup.html.WebMarkupContainer;
 24  
 import org.apache.wicket.markup.html.basic.Label;
 25  
 import org.apache.wicket.markup.html.form.Button;
 26  
 import org.apache.wicket.markup.html.form.Form;
 27  
 import org.apache.wicket.markup.html.form.TextField;
 28  
 import org.apache.wicket.markup.html.link.Link;
 29  
 import org.apache.wicket.markup.html.list.ListItem;
 30  
 import org.apache.wicket.markup.html.list.PageableListView;
 31  
 import org.apache.wicket.markup.html.navigation.paging.PagingNavigator;
 32  
 import org.apache.wicket.model.IModel;
 33  
 import org.apache.wicket.model.LoadableDetachableModel;
 34  
 import org.apache.wicket.model.Model;
 35  
 import org.apache.wicket.model.PropertyModel;
 36  
 import org.apache.wicket.request.mapper.parameter.PageParameters;
 37  
 
 38  
 /**
 39  
  * @author k_inaba
 40  
  */
 41  
 public class MemberListPage extends CommonFrameA {
 42  
     private static final long serialVersionUID = 1L;
 43  
     
 44  
     /*
 45  
      * 画面入力値
 46  
      */
 47  
     public String usrnameValue;
 48  
     public String usrmailValue;
 49  
     public String usrmail2Value;
 50  
     
 51  
     /*
 52  
      * 画面の状態
 53  
      */
 54  0
     private boolean complete = false;
 55  
     
 56  
     /* 編集対象の組織 */
 57  0
     private Org targetOrg = null;
 58  
     
 59  
     
 60  
     
 61  
     /**
 62  
      * ログインチェック定義
 63  
      * @see jp.co.y_net.amm.page.AppPage#validateLogin()
 64  
      */
 65  
     @Override
 66  
     public boolean validateLogin() {
 67  0
         if(AppSession.get().isLogin()) {
 68  0
             if(AppSession.get().getLoginUser().getKind().equals(Usr.KIND_運営管理者)) {
 69  0
                 return true;
 70  
             }
 71  0
             if(AppSession.get().getLoginUser().getKind().equals(Usr.KIND_機関管理者)) {
 72  0
                 return true;
 73  
             }
 74  
 //            if(AppSession.get().getLoginUser().getKind().equals(Usr.KIND_機関会員)) {
 75  
 //                error("権限がありません。");
 76  
 //                return false;
 77  
 //            }
 78  
         }
 79  0
         return false;
 80  
     }
 81  
     
 82  0
     public MemberListPage(PageParameters pageParams) {
 83  
         
 84  
         /* 共通戻るリンクの設置 */
 85  0
         createCommonBackLinks();
 86  
         
 87  
         /* 画面固有の戻るボタンの設置 */
 88  0
         createBackLink(OrgMemberListPage.class, "登録会員情報管理");
 89  
         
 90  
         /* フィードバックパネルの設置 */
 91  0
         createFeedbackPanel();
 92  
 
 93  0
         final Form<Void> form  = new Form<Void>("form");
 94  0
         add(form);
 95  
         
 96  0
         Label h1msg = new Label("h1msg", "");
 97  0
         form.add(h1msg);
 98  
         
 99  
         /* 見出し */
 100  0
         form.add(new Label("h2msg", new Model<String>(){
 101  
             @Override
 102  
             public String getObject() {
 103  0
                 if(mode運営管理者一覧() == false) {
 104  0
                     return "追加";
 105  
                 } else {
 106  0
                     return "運営管理者の追加";
 107  
                 }
 108  
             }
 109  
         }));
 110  
 
 111  
         
 112  0
         WebMarkupContainer contMemberList = new WebMarkupContainer("contMemberList");
 113  0
         form.add(contMemberList);
 114  
         
 115  
         /* 見出し */
 116  0
         contMemberList.add(new Label("h2msg", new Model<String>(){
 117  
             @Override
 118  
             public String getObject() {
 119  0
                 if(mode運営管理者一覧() == false) {
 120  0
                     return "会員";
 121  
                 } else {
 122  0
                     return "運営管理者";
 123  
                 }
 124  
             }
 125  
         }));
 126  
         
 127  
         
 128  
         /* 初期表示エラーチェック ----------------------------------------------------------------------------------- */
 129  0
         form.setVisible(false); // Formはエラーチェックが完了するまで非表示とする。
 130  0
         contMemberList.setVisible(false);
 131  
 
 132  0
         final LoginUser loginUser  = AppSession.get().getLoginUser();
 133  0
         if(loginUser == null) {
 134  0
             error("ログイン情報が取得できません。");
 135  0
             return; // ----------中断
 136  
         }
 137  0
         final Integer loginUserId = loginUser.getUsrid();
 138  
         
 139  
         
 140  
         /*
 141  
          * 表示対象の決定
 142  
          * ・パラメータに orgid が設定されている場合は、該当する組織を対象とする。
 143  
          *   ただし、ログインユーザが 運営管理者か、その組織の代表者でなければいけない。
 144  
          * ・パラメータに orgid が設定されていない場合は、ログインユーザに紐づく組織を対象とする。
 145  
          */
 146  0
         String paramOrgid = pageParams.get("orgid").toString("");
 147  0
         Integer targetOrgid = null;
 148  0
         if(StringUtils.isEmpty(paramOrgid) == false) {
 149  0
             targetOrgid = AppUtils.toInteger(paramOrgid);
 150  0
             this.targetOrg = orgDao.getByOrgid(targetOrgid);
 151  
             
 152  0
             if(this.targetOrg == null) {
 153  0
                 error("組織情報が取得できません。 orgid=" + paramOrgid);
 154  0
                 return; // ----------中断
 155  
             }
 156  0
             if(isSystemAdmin()) {
 157  
                 // OK
 158  0
             } else if(isOrgAdmin()) {
 159  0
                 if (this.targetOrg.getOrgid().equals(loginUser.getOrgid())) {
 160  
                     // OK
 161  
                 } else {
 162  0
                     error("該当する情報を扱う権限がありません。");
 163  0
                     return; // ----------中断
 164  
                 }
 165  
             } else {
 166  0
                 error("該当する情報を扱う権限がありません。");
 167  0
                 return; // ----------中断
 168  
             }
 169  
         } else {
 170  0
             targetOrgid = loginUser.getOrgid();
 171  0
             this.targetOrg = orgDao.getByOrgid(targetOrgid);
 172  
         }
 173  
         
 174  0
         if(hasInputError()) return; // ----------エラーがあれば中止
 175  
         
 176  
         /* 組織が「個人」であれば、組織情報編集ページへ遷移させる */
 177  0
         if(Org.KIND_PERSONAL == this.targetOrg.getKind()) {
 178  0
             throw new RestartResponseException(OrgDetailPage.class);
 179  
         }
 180  
         
 181  
         
 182  0
         form.setVisible(true);
 183  0
         contMemberList.setVisible(true);
 184  
         
 185  
         /* Form内の設定 ----------------------------------------------------------------------------------------------*/
 186  
 
 187  0
         h1msg.setDefaultModelObject("会員管理 「" +targetOrg.getName() + "」");
 188  
         
 189  
         /* 完了メッセージ */
 190  0
         Model<String> resultMessageModel = new Model<String>() {
 191  
             @Override
 192  
             public String getObject() {
 193  
                 if(complete) {
 194  
 //                    return "仮登録を行い、登録したメールアドレスへ会員追加メールを送りました。";
 195  
                     /* 連続登録を想定し、infoメッセージとする。 */
 196  
                 }
 197  0
                 return "";
 198  
             }
 199  
         };
 200  0
         final Label resutlMessage = new Label("resutlMessage", resultMessageModel);
 201  0
         form.add(resutlMessage);
 202  
         /* 出力コンポーネントの設定 ----------------------------------------------------------------------------------*/
 203  0
         form.add(new Label("thLoginid", new Model<String>(){
 204  
             @Override
 205  
             public String getObject() {
 206  0
                 if(mode運営管理者一覧() == false) {
 207  0
                     return "メールアドレス";
 208  
                 } else {
 209  0
                     return "ログインID";
 210  
                 }
 211  
             }
 212  
         }));
 213  0
         form.add(new Label("thLoginid2", new Model<String>(){
 214  
             @Override
 215  
             public String getObject() {
 216  0
                 if(mode運営管理者一覧() == false) {
 217  0
                     return "メールアドレス確認用";
 218  
                 } else {
 219  0
                     return "ログインID確認用";
 220  
                 }
 221  
             }
 222  
         }));
 223  
         
 224  
         
 225  
         /* 入力コンポーネントの設定 ----------------------------------------------------------------------------------*/
 226  0
         TextField<String> usrname = new TextField<String>("usrname", new PropertyModel<String>(this, "usrnameValue"));
 227  0
         form.add(usrname);
 228  0
         TextField<String> usrmail = new TextField<String>("usrmail", new PropertyModel<String>(this, "usrmailValue"));
 229  0
         form.add(usrmail);
 230  0
         TextField<String> usrmail2 = new TextField<String>("usrmail2", new PropertyModel<String>(this, "usrmail2Value"));
 231  0
         form.add(usrmail2);
 232  
         
 233  
         /* 一覧の設定 */
 234  0
         final WebMarkupContainer listViewContainer = new WebMarkupContainer("listViewContainer");
 235  0
         contMemberList.add(listViewContainer);
 236  0
         listViewContainer.setOutputMarkupId(true);
 237  
         
 238  
         // LoadableDetachableModel は リクエストの最初に load にてデータを取得するモデル
 239  0
         final IModel<List<Usr>> usrModel = new LoadableDetachableModel<List<Usr>>() {
 240  
             @Override
 241  
             protected List<Usr> load() {
 242  0
                 Usr cnd = new Usr();
 243  0
                 cnd.setOrgid(targetOrg.getOrgid()); // 該当機関
 244  0
                 Usr cndNot = new Usr();
 245  0
                 cndNot.setStatus(Usr.STATUS_退会);
 246  0
                 List<Usr> list = usrDao.get(cnd, cndNot);
 247  
                 
 248  
                 /* 最終ログイン日の新しい順でソート*/
 249  0
                 Collections.sort(list, new Usr.LastlogindateComparator(true));
 250  
                 
 251  0
                 return list;
 252  
             }
 253  
         };
 254  0
         final PageableListView<Usr> listview = new PageableListView<Usr>("listview", usrModel, 20) {
 255  
             private static final long serialVersionUID = 1L;
 256  
             @Override
 257  
             protected void populateItem(ListItem<Usr> item) {
 258  
                 
 259  0
                 final Usr member = item.getModelObject();
 260  
                 
 261  
                 /* 氏名リンク */
 262  0
                 final PageParameters param = new PageParameters();
 263  0
                 param.add("usrid", member.getUsrid());
 264  
                 //BookmarkablePageLink<Void> lnkName = new BookmarkablePageLink<Void>("lnkName", MemberDetailPage.class, param);
 265  0
                 Link<Void> lnkName = new Link<Void>("lnkName") {
 266  
                     @Override
 267  
                     public void onClick() {
 268  0
                         MemberDetailPage nextPage = new MemberDetailPage(param);
 269  0
                         nextPage.setReturnPage(getPage()); // このページを戻り先として記録する
 270  0
                         setResponsePage(nextPage);
 271  0
                     }
 272  
                     @Override
 273  
                     protected boolean isLinkEnabled() {
 274  
                         /* 組織の管理者は 登録情報編集画面を使用するため、会員詳細ページへリンクさせない */
 275  0
                         if(Usr.ROLE_管理者 == member.getOrgrole()) {
 276  0
                             return false;
 277  
                         }
 278  0
                         return super.isLinkEnabled();
 279  
                     }
 280  
                     
 281  
                 };
 282  
                 
 283  0
                 Label lnklblName = new Label("lnklblName", member.getName_Disp());
 284  0
                 lnkName.add(lnklblName);
 285  0
                 item.add(lnkName);
 286  
                 
 287  
                 /* メールアドレス */
 288  0
                 item.add(new Label("mail", member.getLoginid_Disp()));
 289  
                 
 290  
                 /* ステータス */
 291  0
                 item.add(new Label("status", member.getStatus_Disp()));
 292  
                 
 293  
                 /* 最終ログイン日時 */
 294  0
                 item.add(new Label("lastlogin" , member.getLastlogindate_Disp()));
 295  0
             }
 296  
         };
 297  0
         listViewContainer.add(listview);
 298  
         
 299  0
         PagingNavigator navigator = new PagingNavigator("paging", listview){
 300  
             @Override
 301  
             public boolean isVisible() {
 302  0
                 return listview.size() > 0;
 303  
             }
 304  
         };
 305  0
         contMemberList.add(navigator);
 306  
         
 307  
         /* 処理ボタン定義 --------------------------------------------------------------------------------------------*/
 308  0
         Button btnSubmit = new ConfirmAjaxButton("btnSubmit"){
 309  
             @Override
 310  
             String getConfirmMessage() {
 311  0
                 if(mode運営管理者一覧() == false) {
 312  0
                     return "会員を追加します。";
 313  
                 } else {
 314  0
                     return "運営管理者を追加します。";
 315  
                 }
 316  
             }
 317  
             @Override
 318  
             boolean executeBefore() {
 319  
                 /* 入力値変換 */
 320  0
                 usrnameValue = AppStringUtils.trim(usrnameValue);
 321  0
                 usrmailValue = AppStringUtils.trimHalf(usrmailValue);
 322  0
                 usrmail2Value = AppStringUtils.trimHalf(usrmail2Value);
 323  
                 
 324  
                 /* 入力値検査 */
 325  0
                 validItem(usrnameValue, "氏名", 1, 512);
 326  0
                 if(mode運営管理者一覧() == false) {
 327  0
                     validItemMail(usrmailValue, "メールアドレス");
 328  0
                     validItemMail(usrmail2Value, "メールアドレス確認用");
 329  0
                 } else {
 330  0
                     validItem(usrmailValue, "ログインID", 1, 256);
 331  0
                     validItem(usrmail2Value, "ログインID確認用", 1, 256);
 332  
                 }
 333  
 
 334  0
                 if(hasInputError()) return false; // ここまででエラーチェック
 335  
 
 336  
                 
 337  0
                 if(usrmailValue.equals(usrmail2Value) == false) {
 338  0
                     if(mode運営管理者一覧() == false) {
 339  0
                         error("メールアドレスが一致しません。");
 340  0
                     } else {
 341  0
                         error("ログインIDが一致しません。");
 342  
                     }
 343  
                 }
 344  
                 
 345  0
                 if(mailAddressCheck.exist(usrmailValue)) {
 346  0
                     if(mode運営管理者一覧() == false) {
 347  0
                         error("このメールアドレスは既に使用されています。");
 348  0
                     } else {
 349  0
                         error("このログインIDは既に使用されています。");
 350  
                     }
 351  
                     
 352  
                 }
 353  
                 
 354  0
                 Usr cnd = new Usr();
 355  0
                 cnd.setOrgid(targetOrg.getOrgid()); // 該当機関
 356  0
                 List<Usr> members = usrDao.get(cnd);
 357  0
                 List<Usr> members退会者以外 = new ArrayList<Usr>();
 358  0
                 for(Usr usr: members) {
 359  0
                     if(usr.getStatus().equals(Usr.STATUS_退会) == false) {
 360  0
                         members退会者以外.add(usr);
 361  
                     }
 362  
                 }
 363  0
                 if(targetOrg.isLimitnum指定なし() == false
 364  0
                         && targetOrg.getLimitnum() < members退会者以外.size() + 1) { // 管理者分+1
 365  0
                     error("登録可能会員数を超過するため、これ以上登録できません。");
 366  
                 }
 367  
                 
 368  
 
 369  
                 
 370  0
                 if(hasInputError()) return false; // ここまででエラーチェック
 371  
                 
 372  0
                 return true;
 373  
             }
 374  
             @Override
 375  
             void executeAfter(AjaxRequestTarget target) {
 376  0
                 if(mode運営管理者一覧()) {
 377  
                     
 378  
                     /* 運営管理者追加 */
 379  
                     
 380  0
                     Usr usr運営管理者 = Usr.create運営管理者(targetOrg, usrmailValue, usrnameValue, false);
 381  0
                     usrDao.add(usr運営管理者, loginUserId); // 更新処理
 382  
 
 383  
                     /* 完了メッセージ */
 384  0
                     info("運営管理者を追加しました。");
 385  
                     
 386  0
                 }else{
 387  
                     /* データアクセス 機関管理者による会員仮登録  */
 388  0
                     Usr usr = new Usr();
 389  0
                     usr.setLoginid(usrmailValue);
 390  0
                     usr.setName(usrnameValue);
 391  0
                     usr.setOrgid(targetOrg.getOrgid());
 392  0
                     usr.setKind(Usr.KIND_機関会員);
 393  0
                     usr.setOrgrole(Usr.ROLE_通常会員);
 394  0
                     usr.setStoplogin(AppDef.FLASE);
 395  0
                     usr.setStatus(Usr.STATUS_仮登録);
 396  0
                     usr.setLoginerrorcount(0);
 397  
                     
 398  0
                     usrDao.add(usr, loginUserId); // 【更新処理】
 399  
 
 400  
                     /* 共通機能:パスワード登録チケット発行 からチケットを取得する */
 401  0
                     String random = passwordTicketManager.execute新規パスワード発行(usr.getUsrid());
 402  
                     
 403  
                     /* 会員追加メール送信 */
 404  0
                     MailSetting setting = new MailSetting();
 405  0
                     setting.setTemplate(ResourceReader.getText("message/mail.addmember"));
 406  0
                     setting.setMailTo(usrmailValue);
 407  0
                     setting.replace("機関名称", targetOrg.getName());
 408  0
                     setting.replace("氏名", usrnameValue);
 409  0
                     String 本登録URL = ResourceReader.getStringQuick("urlroot") + "entrypassword?value=" + random;
 410  0
                     setting.replace("本登録URL", 本登録URL);
 411  0
                     boolean sendmailrsult = AppSendMail.send(setting);
 412  0
                     if(sendmailrsult == false) {
 413  0
                         error("メールの送信に失敗しました。");
 414  
                     }
 415  
                     
 416  
                     /* テスト自動化対応 */
 417  0
                     if (AppLogger.isDebug()) {
 418  
                         //info("メールに記載したURL【" + 本登録URL + "】");
 419  0
                         addDebugUrl(本登録URL);
 420  
                     }
 421  
                     
 422  
                     /* 完了メッセージ */
 423  0
                     info("仮登録を行い、登録したメールアドレスへ会員追加メールを送りました。");
 424  
                 }
 425  
                 
 426  
                 
 427  
                 /*
 428  
                  * 状態遷移
 429  
                  *  この画面では連続して登録することを想定するため、状態遷移は行わない
 430  
                  */
 431  
 //              complete = true;
 432  
                 
 433  
                 /* 入力項目初期化 */
 434  0
                 usrnameValue = "";
 435  0
                 usrmailValue = "";
 436  0
                 usrmail2Value = "";
 437  
                 
 438  
                 /* コンポーネント更新 */
 439  0
                 target.add(form);
 440  
                 
 441  0
             }
 442  
             @Override
 443  
             public boolean isVisible() {
 444  
                 /* 完了後の状態ならボタンを表示しない */
 445  0
                 return complete == false;
 446  
             }
 447  
             @Override
 448  
             public boolean isEnabled() {
 449  
                 /* 運営管理組織のとき、代表者以外は運営管理者を追加できない。 */
 450  0
                 if(mode運営管理者一覧() && isSystemAdmin代表者() == false) {
 451  0
                     return false;
 452  
                 }
 453  0
                 return true;
 454  
             }
 455  
         };
 456  0
         if(mode運営管理者一覧() == false) {
 457  0
             btnSubmit.add(new AttributeModifier("value", "会員を追加"));
 458  0
         } else {
 459  0
             btnSubmit.add(new AttributeModifier("value", "運営管理者を追加"));
 460  
         }
 461  
         
 462  0
         form.add(btnSubmit);
 463  0
         form.add(new Label("msgNoneBtnSubmit", "このユーザはシステム管理者の追加はできません。"){
 464  
 
 465  
             @Override
 466  
             public boolean isVisible() {
 467  0
                 return form.get("btnSubmit").isEnabled() == false;
 468  
             }
 469  
             
 470  
         });
 471  
         
 472  
         
 473  0
     }
 474  0
     private boolean mode運営管理者一覧() {
 475  0
         if(targetOrg != null && Org.KIND_運営管理 == targetOrg.getKind()) {
 476  0
             if(isSystemAdmin()) {
 477  0
                 return true;
 478  
             }
 479  
         }
 480  0
         return false;
 481  
     }
 482  
 }