Développement d'un plugin Subscription et enchâinement des évènements

  • Posts: 19
  • Thank you received: 3
  • Hikaserial Subscription Hikashop Business
4 days 22 hours ago #364727

-- HikaShop version -- : 5.1.1
-- HikaSerial version -- : 5.0.0
-- Joomla version -- : 3.10.12
-- PHP version -- : 7.3.33

Bonjour,

Je développe un plugin simple sur HikaSubscription. Les souscriptions sont des adhésions à renouveler tous les ans. Si une personne à une souscription active elle fait partie du groupe "membre". Cette partie-là fonctionne bien. A l'achat, "subscription active", la personne est mise dans le bon groupe. A l'expiration, elle est supprimée de ce groupe sauf si elle renouvelle.

Le but du plugin est d'autoriser ou pas la personne a figurer dans l'annuaire (cotisation à jour : oui. Sinon, pas d'affichage). Le plugin fait un simple baculement de switch dans l'annuaire selon que la souscription est active ou pas.

1/ il manquerait sur cette page : www.hikashop.com/support/documentation/1...#subscription_plugin une description de l'évènement déclencheur et un petit peu d'explications comme sur www.hikashop.com/support/documentation/6...mentation.html#order

2/ Pour la partie "activation", cela semble fonctionner. En utilisant "onAfterSubscriptionUpdate" on récupère l'information d'activation tant à la création de la commande (créé-->confirmée) qu'au renouvellement de la souscription. Si on utilise "onSubscriptionActivation", on ne voit pas passer le renouvellement... Exact ?

3/ lorsque le cron détecte une fin de souscription, il active onBeforeSubscriptionExpire avec la liste des souscriptions expirées. Même chose ensuite avec onAfterSubscriptionExpire . Mais dans les deux cas, le status de la souscription concernée (une seule dans ce cas) est toujours "active". Tant "before" que "after"... Pourtant dans l'interface backend, elle est bien expirée... Est-ce normal ? Comment détecter qu'une souscription est bien expirée ?

4/ j'avais positionné mon code dans "onSubscriptionExpiration" pensant récupérer les informations de la souscription passant de active à expirée. Mais cet évènement n'est pas déclenché...

Voici les paramètres liés à l'expiration :



et voici l'extrait du log au moment ou le cron a basculé une souscription de active à expirée :
[28/11/2024 17:01] - onBeforeSubscriptionExpire.
[28/11/2024 17:01] -      objet expired_subscriptions : Array
(
    [172] => stdClass Object
        (
            [subscription_id] => 172
            [subscription_pack_id] => 1
            [subscription_data] => ujlAdPjn7lht1yD
            [subscription_extradata] => 
            [subscription_status] => active
            [subscription_created] => 1701187120
            [subscription_modified] => 0
            [subscription_start_date] => 1701187190
            [subscription_end_date] => 1732809590
            [subscription_user_id] => 188
            [subscription_auto_renew] => 0
            [subscription_payment_renew] => 
        )

)

[28/11/2024 17:01] -      objet plans : Array
(
    [1] => stdClass Object
        (
            [pack_id] => 1
            [pack_name] => Adhésion xxxxx
            [pack_data] => sql
            [pack_generator] => 
            [pack_published] => 1
            [pack_type] => subscription
            [pack_group_id] => 0
            [pack_vendor_id] => 0
            [pack_manage_access] => all
            [pack_email_inherit] => 1
            [pack_params] => stdClass Object
                (
                    [generator_format] => 
                    [generator_size] => 
                    [groupsubscriber] => Array
                        (
                            [groups] => 10
                        )

                )

            [pack_description] => <p>Description du plan adhésion ?</p>
        )

)

[28/11/2024 17:01] -      objet users : Array
(
    [188] => stdClass Object
        (
            [user_id] => 188
            [user_cms_id] => 7323
            [user_email] => dominiquexxxxx@xxxxx.fr
            [user_partner_email] => 
            [user_params] => 
            [user_partner_id] => 0
            [user_partner_price] => 0.00000
            [user_partner_paid] => 0
            [user_created_ip] => 2001:861:7e9:8af5
            [user_unpaid_amount] => 0.00000
            [user_partner_currency_id] => 0
            [user_created] => 1675866133
            [user_currency_id] => 0
            [user_partner_activated] => 0
            [prescripteur] => xxxxx
            [id] => 7323
            [name] => xxxxxx
            [username] => domxxxxx
            [email] => dominiquexxxxx@xxxxxxxx.fr
            [password] => $W50YVB5d1i
            [block] => 0
            [sendEmail] => 0
            [registerDate] => 2023-02-08 14:22:13
            [lastvisitDate] => 2024-11-19 21:15:02
            [activation] => 
            [params] => {"site_language":"fr-FR","language":"fr-FR"}
            [lastResetTime] => 0000-00-00 00:00:00
            [resetCount] => 0
            [otpKey] => 
            [otep] => 
            [requireReset] => 0
            [authProvider] => 
        )

)

[28/11/2024 17:01] - onAfterSubscriptionExpire.
[28/11/2024 17:01] -      objet expired_subscriptions : Array
(
    [172] => stdClass Object
        (
            [subscription_id] => 172
            [subscription_pack_id] => 1
            [subscription_data] => ujlAdPjn7lht1yD
            [subscription_extradata] => 
            [subscription_status] => active
            [subscription_created] => 1701187120
            [subscription_modified] => 0
            [subscription_start_date] => 1701187190
            [subscription_end_date] => 1732809590
            [subscription_user_id] => 188
            [subscription_auto_renew] => 0
            [subscription_payment_renew] => 
        )

)

[28/11/2024 17:01] -      objet plans : Array
(
    [1] => stdClass Object
        (
            [pack_id] => 1
            [pack_name] => Adhésion au xxxxxxxxx
            [pack_data] => sql
            [pack_generator] => 
            [pack_published] => 1
            [pack_type] => subscription
            [pack_group_id] => 0
            [pack_vendor_id] => 0
            [pack_manage_access] => all
            [pack_email_inherit] => 1
            [pack_params] => stdClass Object
                (
                    [generator_format] => 
                    [generator_size] => 
                    [groupsubscriber] => Array
                        (
                            [groups] => 10
                        )

                )

            [pack_description] => <p>Description du plan adhésion ?</p>
        )

)

[28/11/2024 17:01] -      objet users : Array
(
    [188] => stdClass Object
        (
            [user_id] => 188
            [user_cms_id] => 7323
            [user_email] => dominiquexxxxxxxxxx@xxxxxxxxx.fr
            [user_partner_email] => 
            [user_params] => 
            [user_partner_id] => 0
            [user_partner_price] => 0.00000
            [user_partner_paid] => 0
            [user_created_ip] => 2001:861::8af5
            [user_unpaid_amount] => 0.00000
            [user_partner_currency_id] => 0
            [user_created] => 1675866133
            [user_currency_id] => 0
            [user_partner_activated] => 0
            [prescripteur] => xxxx
            [id] => 7323
            [name] => xxxxxxxx
            [username] => domxxxxx
            [email] => dominiquexxxxxx@xxxxxxx.fr
            [password] => $20YVB5d1i
            [block] => 0
            [sendEmail] => 0
            [registerDate] => 2023-02-08 14:22:13
            [lastvisitDate] => 2024-11-19 21:15:02
            [activation] => 
            [params] => {"site_language":"fr-FR","language":"fr-FR"}
            [lastResetTime] => 0000-00-00 00:00:00
            [resetCount] => 0
            [otpKey] => 
            [otep] => 
            [requireReset] => 0
            [authProvider] => 
        )

)

Il ne semble pas y avoir d'erreurs PHP.

Merci de m'aider à y voir clair.

Laurent

Attachments:
Last edit: 4 days 22 hours ago by gvitry.

Please Log in or Create an account to join the conversation.

  • Posts: 26159
  • Thank you received: 4028
  • MODERATOR
4 days 9 hours ago #364729

Bonjour,

2 - Tout changement fait sur une souscription va déclencher les trigger "Update".
Donc un renouvellement va déclencher le trigger puisque la date d'expiration est mise à jour.

Lorsqu'une souscription devient active, le trigger "Active" est appelé ; un renouvellement ne changeant pas l'état, ce trigger n'est donc pas appelé.
Ce trigger sert à déclencher les actions lorsqu'une souscription devient active ; il est donc important de ne pas prévenir lors d'un renouvellement puisqu'ill n'y a rien à faire de "nouveau" (si votre utilisateur est dans l'annuaire, le renouvellement ne va pas l'ajouter de nouveau).

3 - Nous avons le même principe pour l'expiration ; sauf que suivant le trigger (unique ou batch), les données en paramètre vont changer ainsi que la façon dont HikaSubscription gère la base de données.
Dans le cas d'une mise à jour "en masse" (le trigger de cron) ; le fait d'avoir les même données pour le "before" et le "after" est normal dans le sens ou HikaSubcription ne va modifier qu'un seul champs de la base de données. Si vous modifiez des objets de la liste, les champs ne seront pas mis à jour en base.
C'est la raison pour laquelle le status ne change pas entre les deux triggers ; il s'agit de la même donnée qui est fournis et puisque la requête en base va toucher les données mais ne pas les re-récupérer le champs de statut n'est pas à jour.
Effectivement il serait plus "logique" de le mettre à jour mais la logique du "AfterExpire" est qu'HikaSubscription a effectué un :

UPDATE subscription SET subscription_status = 'expire" WHERE subscription_id IN (...)

4 - Le trigger "onSubscriptionExpiration" concerne une seule souscription.
Ce trigger est appelé lorsqu'une souscription expire par une action dans le backend ou par exemple lorsque l'utilisateur se connecte entre le moment d'expiration et le déclanchement de la cron de traitement.
Ce cas de figure permet de s'assurer qu'une souscription expirée soit bien considérée comme expirée au moment ou elle se termine et ne pas avoir d'effet de bord étrange si votre cron ne se déclenche peu souvent.

Cordialement,


Jerome - Obsidev.com
HikaMarket & HikaSerial developer / HikaShop core dev team.

Also helping the HikaShop support team when having some time or couldn't sleep.
By the way, do not send me private message, use the "contact us" form instead.

Please Log in or Create an account to join the conversation.

  • Posts: 19
  • Thank you received: 3
  • Hikaserial Subscription Hikashop Business
4 days 2 hours ago #364744

Merci pour ces précisions détaillées. Je vais cogiter tout cela.
En première approche, j'ai le "feeling" qu'il faut surveiller presque chaque trigger et vérifier si on a quelque chose à faire.
Notamment, il semble prudent de surveiller afterExpire et onExpiraton. Et si je suis bien, dans le cas de onAfterExpire, comme il s'agit d'un batch, c'est à moi de récupérer la "collection" de souscription concernée et de vérifier chacune d'entre elles.

Je m'y remets ! :-)

Please Log in or Create an account to join the conversation.

  • Posts: 26159
  • Thank you received: 4028
  • MODERATOR
3 days 18 hours ago #364750

Bonjour,

Je vous invite à regarder les plugins "subscriber" qui peuvent vous servir d'exemple pour la gestion de l'activation et l'expiration.
Mais effectivement, il est nécessaire d'avoir les deux trigger "expire" pour gérer aussi bien les batch que les éléments uniques ; les deux triggers ont une approche différente mais peuvent dans certains cas appeler une fonction commune ou toute votre logique métier va se trouver.

Cordialement,


Jerome - Obsidev.com
HikaMarket & HikaSerial developer / HikaShop core dev team.

Also helping the HikaShop support team when having some time or couldn't sleep.
By the way, do not send me private message, use the "contact us" form instead.

Please Log in or Create an account to join the conversation.

Moderators: Obsidev
Time to create page: 0.071 seconds
Powered by Kunena Forum