web-dev-qa-db-ja.com

更新後のCivicrmメンバーシップの有効期限

私はCiviCRM 4.4.6でD7を使用しています。会員フォームを含めて、投稿ページを作成しました。

メンバーシップの更新後、有効期限は終了日に従って延長されます。例えば:

開始日:2014年11月1日
終了日:2014年11月5日
ステータス:期限切れ

11月11日に1か月分の更新支払いを行った場合、有効期限は2014年12月5日に変更されます。

しかし、私は有効期限を支払日から1か月後、つまり2014年12月11日にしたいと考えています。

上記の結果を得るために設定する方法はありますか?

構成にない場合、コードで変更する方法はありますか?

4
vences

これは4.5.2サンドボックスで機能します(4.4.6で機能するかどうかは不明です)

  1. メンバーシップの種類を固定ではなくローリングに設定します
  2. 「猶予」会員ステータスを無効にする
  3. 会員期間が3か月未満の場合は、「新規」会員ステータスを無効にするか、短くしてください

別の回避策は、少し扱いに​​くいかもしれませんが、毎月新しいメンバーシップタイプを作成し、投稿ページを更新して、既存のメンバーシップを更新するのではなく、新しいメンバーシップにサインアップするように強制することです。ただし、古いメンバーシップが終了する前に新しいメンバーシップにサインアップすると、メンバーシップが重複する可能性があります。

5
Markus Forsberg

あなたが説明した例では、終了日後に更新支払いが行われる場合、猶予期間を削除/無効にすると望ましい効果が得られます。基本的に、支払いが行われた日付から新しいメンバーシップが作成されます。

ユーザーは猶予期間の終了時からではなく、終了日からすぐに非メンバーとして扱われるため、これはあなたに影響を与える可能性があります。したがって、DrupalサイトでCivimember Roles Syncモジュールを使用していて、たとえばコンテンツへのアクセスを管理するためにそれを使用していた場合、ユーザーがアクセスできなくなる期間があります会員限定コンテンツ。

更新が終了日より前に行われた場合、猶予期間は無関係であり、日付ではなく前の終了日から開始して、メンバーシップの期間(単に質問を正しく読んだ場合は1か月)だけメンバーシップが延長されます。リニューアルしました。

2
Graham

本当にこれが必要で、コードを書く準備ができている場合。これがあなたができることです:

/**
 * hook_civicrm_pre
 */
function myextension_civicrm_pre( $op, $objectName, $id, &$params ) {
  // changing end date for the monthly membership

  if ($objectName == 'Membership' && $op == 'create' && $params['membership_type_id'] == MY_MEMBERSHIP_TYPE_ID) {

    // FIXME: don't know if it's in params or if you need to get it using the api
    $contribution_date = ... 

    // compute the new date
    $membershipDates = _getNewDatesForMyMembership($params['membership_type_id'], $params['join_date'], $contribution_date);

    // update the params, so it gets saved in the database
    $params['end_date'] = $membershipDates['end_date'];

  }
}

CiviCRMがメンバーシップの日付を計算する方法については、CRM_Member_BAO_MembershipType :: getDatesForMembershipTypeも参照してください。

2
samuelsov

よくわかりませんが、[管理]> [CiviMember]> [メンバーシップの種類]のルールを無効にするなど、[管理]> [CiviMember]> [メンバーシップの種類]、関連するタイプの横にある[編集]リンク、および[固定]を[ローリング]に変更すると、これに影響する可能性があります。

hook_civicrm_pre() を使用してこれをプログラムする必要がある可能性が高くなります。

1
Joe Murray