[gelöst] Preismodell für 3 Benutzerrollen: Free, Premium und Corporate

am 18.07.2017 - 16:39 Uhr in
Hallo,
gibt es ein Modul für Drupal 7 welches das Rollensystem insofern erweitert, dass auch ein Preismodell daran geknüpft werden könnte?
Beispiel: https://de.statista.com/statistik/accounts/
Also es gibt zum Beispiel 3 Benutzerrollen: Free, Premium und Corporate
Free darf nach Anmeldung/Registrierung pro Monat 100 Seitenaufrufe in bestimmten nicht öffentlichen Bereichen generieren.
Premium darf 1000 Seitenaufrufe generieren,
und Corporate ist unbegrenzt.
Schick wäre dabei, dass dem Nutzer die bereits generierten Seitenaufrufe auf der Profilseite angezeigt werden - vielleicht wie ein Countdowntimer, so dass er informiert ist wie viele Seitenaufrufe er noch generieren darf. Auch eine Warnung z.B. bei Erreichen von 80% des jeweiligen Seitenaufrufkontingents wäre nett.
Außerdem sollte der Nutzer während der Registrierung wählen dürfen für welche Kontenart (Free, Premium und Corporate) er sich anmelden möchte.
Bei Free könnte das Standardprozedere eingestellt bleiben (E-Mail Bestätigungscode) nur bei den kostenpflichtigen Konten müsste der Admin die Nutzer erst freischalten.
Geht so etwas? Gibt es da bereits ein Modul?
Oder vielleicht kann man mit einem Mix aus verschiedenen Modulen etwas ähnliches erreichen? Vielleicht irgendwie in Kombination mit den Statistik-Modulen?
Die Abrechnung muss nicht unbedingt wie in einem eCommerce direkt im System geregelt werden.
Freue mich über eure Anregungen.
Vielen Dank.
- Anmelden oder Registrieren um Kommentare zu schreiben
Zitat: Free darf nach
am 19.07.2017 - 10:21 Uhr
Free darf nach Anmeldung/Registrierung pro Monat 100 Seitenaufrufe in bestimmten nicht öffentlichen Bereichen generieren.
Prinzipiell kannst du die Anforderungen mit Drupal und Zusatzmodulen umsetzen (Rollenbasiert und ein Ereignis auslösen z.B. mit Rules, verschiedenen Inhaltstypen nach Rolle etc.)
Aber dein Angehen per Seitenaufruf ist nicht wirklich umsetzbar, (meiner Meinung nach).
Wie willst du das steuern? Wenn ein User den Backbutton betätigt oder eventuell eine Suche oder kurz auf sein Konto geht, wäre jedesmal ein Aufruf verbraucht.
Du müßtest also auch noch nach angezeigtem Inhalt berechnen und nach Rolle und versehentliche zurück Klicks oder Page reload rausrechnen?
Oder der User speichert sich eine Node als Favorit im Browser, und ruft die erneut auf, weil er glaubt er hat ja dafür schon bezahlt, was dann?
Das wird grausam unübersichtlich, selbst wenn man das hingebastelt bekommt.
Ich würde anders rangehen, mit einer Art Punktesystem. Beispiel Datingplattformen: Free darf 10 Kontakte ansehen, Premium 50.... usw., Free darf 3 Anfragen versenden, Premium 10 Anfragen.
Dann können die User z.B. Punkte über den Shop kaufen und innerhalb eines gesetzten Zeitraumes verbrauchen.
Grüße Jenna
Hallo Jenna, vielen Dank für
am 19.07.2017 - 13:59 Uhr
Hallo Jenna,
vielen Dank für deine wirklich gute Anregung. Das mit dem Punktesystem klingt gut.
Aber recht kompliziert in der Umsetzung, oder denke ich einfach nur zu kompliziert? Weil, wenn ich das richtig verstehe, muss das System dann nicht nur zählen ob ein Kontakt aufgerufen wurde, sondern auch, ob der Aufruf zum ersten mal stattfand oder eine "Wiederholungstat" ist. Erneute Seitenaufrufe des gleichen Kontakts dürften ja nicht gezählt werden, nur Aufrufe "neuer" Kontakte, um zählen zu können wieviele unterschiedliche Kontakte angesehen wurden.
Gibt es denn da ein Modul, das etwas ähnliches bereits umsetzen könnte?
Ich habe schon einen kleinen Ansatz über DB-Abfragen der Statistik-Tabelle "accesslog", wo ich die uid und den timestamp nach Jahr & Monat gruppiere und die Seitenaufrufe spezieller Bereiche (gefiltert in den Feldern url, path, title) zählen lasse.
Bin nur noch am überlegen, wie ich den User für den Rest des Monats aussperre, wenn er sein Kontingent verbraucht hat, so dass er nur noch Bereiche der Website betrachten kann, für die keine Anmeldung notwendig ist. So als wäre er nicht auf der Website registriert/angemeldet. Bricht der neue Monat an, soll auch sein neues Kontingent anfangen und er sich wieder normal anmelden können.
Ein fertiges Modul gibt es
am 19.07.2017 - 15:40 Uhr
Ein fertiges Modul gibt es meines Wissens nicht, das wäre auch kaum möglich, da es viel zu viele unterschiedliche Anforderungen gibt.
Das meiste kannst du mit Rules umsetzen > Aktion soll sein... wenn Bedingung ist... da hast du etliche Möglichkeiten z.B. einen Wert zu setzen oder ähnliches.
Du kannst auch versuchen dieses Modul abzuwandeln, in dem du die Clicks den Users zuordnest und damit auch jeder Click gezählt wird.
https://www.drupal.org/project/link_click_count
Ebenso könnte man auch Flag einsetzen, es gibt sehr viele Wege so etwas umzusetzen und mehrere Module die jeweils für einen bestimmten Abschnitt eingesetzt werden können.
Der Aufwand für diese Art Umsetzung kann leicht einige Wochen oder mehr Zeit in Anspruch nehmen.
Gerade zu Rules gibt es unendlich Tutorials für die verschiedensten Anforderungen, kostet eben viel Zeit sich dort einzuarbeiten und zu testen.
Grüße Jenna
Nur für den Fall, dass jemand
am 08.08.2017 - 11:12 Uhr
Nur für den Fall, dass jemand ein ähnliches Projekt hat: Ich konnte es zwischenzeitlich umsetzen.
Habe mich an Jenna's wirklich guten Vorschlag mit dem Punktesystem gehalten. Das ist tatsächlich besser umsetzbar. Nochmal vielen herzlichen Dank dafür, Jenna! :-)
Für die Umsetzung benötigt man folgende Module:
Für das Gutschreiben eines Credits benötigt man ein wenig PHP-Kenntnisse, um die dafür geeignete Rule zu erstellen.
Überhaupt läuft in diesem System fast alles im Modul "Rules" ab.
Hier mal mein Lösungsweg, wie ich die Credits pro User gutgeschrieben habe, die er sich gekauft hat:
Event: "Completing the checkout process"
Conditions
Parameter: Reihenfolge: [commerce_order], Product type(s): Commerce Credits
Parameter: Credit to check: credit, Credit type: DEIN_CREDIT_TYPE
Action: (Hier kommt jetzt der PHP-Code zum Einsatz)
Entity: Add credits to entity => (Data selector) commerce-order:owner
Credit type: Credit type to be added => (Value) DEIN_CREDIT_TYPE
Number of credits: Number of credits that should be added => (Data selector) commerce-order:order-id
PHP evaluation (Enter PHP code without ?php ? delimiters that returns the processed value. The selected value is available in the variable $value. Example: return $value + 1;)
<?php
$order = commerce_order_load($value);
$order_id = $order->order_id;
$entity_id = db_query('SELECT cp.product_id FROM commerce_line_item AS cli INNER JOIN commerce_product AS cp ON cp.sku = cli.line_item_label WHERE cli.order_id = '.$order_id)->fetchField();
$credit_number = db_query('SELECT commerce_credits_number_value FROM field_data_commerce_credits_number WHERE entity_id = '.$entity_id)->fetchField();
$quantity = db_query('SELECT quantity FROM commerce_line_item WHERE order_id = '.$order_id)->fetchField();
$credits_granted = $credit_number * $quantity;
return $credits_granted;
?>
Außerdem habe ich noch zusätzlich ein eigenes kleines Script in einen Block integriert, das bei einem Seitenaufruf in einem speziellen Bereich einen Credit abzieht. So kann man steuern welcher Seitenbereich betroffen ist, indem man den Block nur da einbindet, wo Credits abgezogen werden sollen.
<?php
global $user;
$u_uid = $user->uid;
$credit_number = db_query('SELECT credits FROM commerce_credits WHERE entity_id = '.$u_uid)->fetchField();
if($credit_number > 0){
$new_credit_number = $credit_number - 1;
db_update('commerce_credits')
->fields(array(
'credits' => $new_credit_number,
))
->condition('entity_id', $u_uid)
->execute();
}else{
watchdog('user', 'Credits von %name wurden aufgebraucht', array('%name' => $user->name));
drupal_goto('http://www.demodomain.de/bestellseite');
}//ENDE else
?>
Falls das auf eine bestimmte Rolle eingeschränkt werden soll, dann einfach noch eine If-Schleife drumherum basteln:
<?php
if(in_array("ZahlenderKunde_OderWieDieRolleEbenHeisst", $user->roles)){
//CODE einfügen, wenn Rolle zutrifft
}else{
//CODE einfügen, wenn Rolle nicht zutrifft
}
?>