tyoshikawa1106のブログ

- Force.com Developer Blog -

SFDC:工数入力アプリをつくってみました

商談に紐付く工数の入力アプリをつくってみました。こんなやつです。

アプリ概要

  • 商談に紐付く工数オブジェクトを登録するための画面です。
  • 選択リストで選択した対象年月の工数一覧を表示します。
    • 年または月の値を変更すると再検索処理を実行します。
  • 保存ボタンで工数レコードを保存します。
  • レポートボタンでグラフを表示します。
    • analytics:reportChartタグを使用。
  • 編集リンクで標準の編集画面へ遷移します。
  • 削除リンクで対象の工数レコードを削除します。
    • 削除後、再検索処理が実行されます。
  • 日付リンクで工数レコードの詳細ページを別タブで開きます。
  • 商談リンクで商談レコードの詳細ページを別タブで開きます。

オブジェクト構成

f:id:tyoshikawa1106:20150215231927p:plain


・・・とだいたいこんな感じです。これはこれでいいのですが、今回は標準機能の勉強も兼ねて実際にどのように使用されるかを考えてみました。

リードの作成

まずはリードの作成です。取引先になりそうな顧客の情報をここに登録します。Web-to-リードなどの機能もありますが、今回は社内ユーザが自分で登録する想定とします。

リードタブ

f:id:tyoshikawa1106:20150215232449p:plain

新規ボタン

f:id:tyoshikawa1106:20150215232652p:plain

詳細ページ

f:id:tyoshikawa1106:20150215233251p:plain

取引の開始

リードを作成後に実際に取引先となった場合、まず重複の検索ボタンで登録済みではないか確認します。
f:id:tyoshikawa1106:20150215233539p:plain


こんな感じで取引先や取引先責任者、商談が存在していないか確認できます。
f:id:tyoshikawa1106:20150215233653p:plain


類似レコードが存在していないことを確認できたら、リードの詳細ページまたは重複検索ページにある取引の開始ボタンをクリックして取引先を作成します。
f:id:tyoshikawa1106:20150215233827p:plain


必要事項を入力後に取引の開始ボタンで取引先が作成されます。
f:id:tyoshikawa1106:20150215234226p:plain


取引先責任者や商談も一緒に登録されます。
f:id:tyoshikawa1106:20150215234320p:plain


取引を開始したリードは表示されなくなります。
f:id:tyoshikawa1106:20150215234449p:plain


※レコード自体は存在しています。
f:id:tyoshikawa1106:20150215234826p:plain

ソーシャル取引先の活用

ソーシャル取引先でSNS情報を取得することができます。取引先や取引先責任者、リードで利用できますが、企業SNSアカウントが一番確認しやすいと思うので取引先での利用が多いのかなと思います。
f:id:tyoshikawa1106:20150215235125p:plain


目当てのアカウントが見つからない場合は手動検索が可能です。
f:id:tyoshikawa1106:20150215235314p:plain:w300


SNSから最新の話題を取得できます。
f:id:tyoshikawa1106:20150215235415p:plain:w300


ソーシャル取引先を利用するとプロフィール写真も表示されるようになります。
f:id:tyoshikawa1106:20150215235509p:plain:w300

商談の参照

取引先の関連リストから商談の詳細ページにアクセスできます。ここから工数レコードを登録できます。
f:id:tyoshikawa1106:20150215235813p:plain

商談に紐付く工数の作成

関連リストの新規ボタンで商談に紐付く工数を作成できます。その商談に対してどのような作業と作業時間を入力して保存します。
f:id:tyoshikawa1106:20150215235958p:plain


保存後は詳細ページが表示されますが、元の商談には商談リンクで戻ることができます。
f:id:tyoshikawa1106:20150216000120p:plain


このように商談に紐付く工数が登録されるので、後はレポートやダッシュボードなどを利用して社員の作業内容を管理することができます。

工数の一括入力

1つの商談に対する工数の登録を行いたい場合は、上で行ったように関連リストから登録すれば問題ないと思います。しかし、工数をまとめて登録したい場合など、複数の商談に対して工数を登録したい場合は、関連リストからだと効率が良くありません。


解決策として工数タブを作成してそこから登録する方法があります。
f:id:tyoshikawa1106:20150216000950p:plain


新規ボタンで工数登録画面が表示されます。
f:id:tyoshikawa1106:20150216001054p:plain


商談のルックアップ検索で好きな商談を選択できます。
f:id:tyoshikawa1106:20150216001150p:plain:w300


この方法なら商談の詳細ページを経由しなくても好きな商談に対して工数を登録できます。・・・ですが次の問題点が考えられます。

  • 登録後に詳細ページに遷移してしまうので何件も登録するのが大変。
  • 複数の工数を登録時に既に登録済みか確認しずらい。
  • 同じ日に複数の工数を登録する場合、作業時間の合計を確認しずらい。


その問題を解決するのがApex開発で作成した工数入力アプリです。
f:id:tyoshikawa1106:20150216002314p:plain


日付で選択した年月を条件に工数一覧を表示するのでその月の工数を簡単に確認できます。レポートボタンから表示できるグラフを使って極端に工数の少ない日付と多い日付を簡単に確認できます。これで入力間違いも防ぎやすくなります。
f:id:tyoshikawa1106:20150216002550p:plain:w300

レポートグラフの表示条件は作成者がログインユーザと一致 かつ 選択された年月の工数となっています。analytics:reportChartタグとfillter属性で対応しています。

補足

やってみて気づいたのですが、レポートのグラフは0.5単位までは正確に表示されないみたいです。例えば7.5の場合は8に含まれて表示されました。


保存時に必須項目が未入力の場合は次のように表示されます。
f:id:tyoshikawa1106:20150216002833p:plain


HTML5に対応していないルックアップ項目は従来と同じようにエラーメッセージが表示されます。
f:id:tyoshikawa1106:20150216002940p:plain


工数保存時は入力欄が初期化され、最新の工数一覧が表示されるように再検索が実行されます。
f:id:tyoshikawa1106:20150216003125p:plain


入力規則エラーにも対応できるので、標準カスタマイズでルールを追加することも可能です。
f:id:tyoshikawa1106:20150216003408p:plain:w300


・・・という感じで標準の登録画面より便利な画面となっています。せっかくなのでこの機能でこだわったところについても記載します。

工数入力アプリの権限チェック

通常、工数入力アプリの使用権限が無いユーザにはVisulaforceページ自体のアクセス権を付与しません。これでタブやURLなどからアクセスされてもそのページを表示しないようにできます。
f:id:tyoshikawa1106:20150216004354p:plain


基本的にはこれで問題ありませんが、Apex側でもきちんと判定することでより良いコードになると思っています。

参照権限の無いユーザでアクセスした場合

入力欄の表示にはapex:inputFieldを使用すれば、その項目の入力欄は画面に表示されません。apex:inputFieldを使用できない項目の場合は、エラーメッセージを表示するようにしています。
f:id:tyoshikawa1106:20150216005010p:plain


また、保存ボタンによる処理は実行できないようになっています。『with sharing』を宣言することで権限の無いレコードは取得できなくなるので、工数一覧が表示されることもありません。


グラフは標準レポートのグラフを使用するので、権限の無いユーザは自動でアクセスできなくなります。
f:id:tyoshikawa1106:20150216005354p:plain:w300

作成権限の無いユーザでアクセスした場合

工数一覧は表示できますが、新規登録は出来ないようになっています。
f:id:tyoshikawa1106:20150216010224p:plain

編集権限の無いユーザでアクセスした場合

新規登録は可能ですが、一度登録した工数は編集できなくなります。
f:id:tyoshikawa1106:20150216010135p:plain

削除権限の無いユーザでアクセスした場合

新規登録、編集は可能ですが、削除は実行できなくなります。
f:id:tyoshikawa1106:20150216010336p:plain

Apex Classの権限チェック

ボタンやリンクの表示は権限チェックしてreRenderで切り替えていますが、ApexClass側でも保存や削除処理のタイミングで権限チェックを行い、処理を実行するか判定するようにしています。これでテストクラスで安全を確認することが可能になります。
f:id:tyoshikawa1106:20150216010536p:plain


参照と作成の権限は項目毎に行います。これで項目レベルセキュリティによる細かい調整に対応できるのと、権限の無い項目が存在した場合、どのように対応するか検討しやすくなります。


権限チェックする項目はすべての項目ではなく、登録処理に使用する項目、またはクエリで取得する項目のみとなっています。削除権限は項目毎ではなくオブジェクトの権限だけで確認できます。

多言語対応

トランスレーションワークベンチの翻訳機能を利用することで、ユーザの言語が英語だった場合にもラベルやメッセージの切り替えが可能になっています。
f:id:tyoshikawa1106:20150216011351p:plain


開発したApexクラスが日本語ユーザ以外でも動作するかは確認しておくとベストだと思います。実案件で要件に含まれていない場合、そこまで確認する必要はないと思いますが、Developer環境などで勉強用に作った機能の場合はチェックしておくと勉強になると思っています。


過去にやった案件で海外のユーザも使用している組織をさわったことがありました。同じ組織なだけで開発する機能やオブジェクトは独立しているので多言語対応する必要はなかったのですが、『date.parse()』のように地域依存するメソッドを使用していたところ、海外の開発者がApexテストの一括実行を行った際にエラーが発生したということがありました。


「日本側の機能でエラーが出た。」と言われた痛い目をみたことがあったので、別言語のユーザでもエラーにならない(地域依存しない)ようにしておくと安心だと思います。

モバイルから工数入力

最後にちょっとおまけの話ですが、今回の工数入力アプリはPC向けの画面です。なのでモバイルからはアクセスは考慮していません。また、モバイルでは一度に多くの入力を行うのには向いていないと思います。(基本的にモバイルは移動時間などちょっとした空き時間の使用が多いと思います。)


ということでモバイルから工数入力を行う場合はパブリッシャーアクションがいいと思います。

サイドバーから商談にアクセス

f:id:tyoshikawa1106:20150216013914p:plain:w200

商談詳細ページのアクションバーから工数入力アクションを選択

f:id:tyoshikawa1106:20150216014011p:plain:w200

工数を登録

f:id:tyoshikawa1106:20150216014053p:plain:w200

登録した工数を確認したい場合は関連リストから

f:id:tyoshikawa1106:20150216014147p:plain:w200

工数一覧から対象レコードを選択

f:id:tyoshikawa1106:20150216014209p:plain:w200

詳細ページで登録情報を確認

f:id:tyoshikawa1106:20150216014231p:plain:w200


とだいたいこんな感じだと思います。登録画面の初期値はアクション作成時に定義済み項目値で指定可能です。
f:id:tyoshikawa1106:20150216014329p:plain


これなら標準カスタマイズのみでの対応が可能です。より高機能な入力画面が必要になった場合は、開発という手段が検討できます。(Visualforceページはパブリッシャーアクションにも表示できます。)


ということで...標準機能の利用も踏まえて工数入力アプリの使い方を想像してみました。