El desenvolupament d'aquesta versió ha costat 4.250 euros. El cost de la primera versió va ser de 38.000 euros. El cost acumulat des de la primera versió és de 46.610 euros, però el cost per a tu és només la llicència des de 80€.
Nova branca 3.0.x del plugin Subscripcions Avançades per WooCommerce. És una versió major: estrena les opcions de compra a la fitxa de producte («Compra única» o «Subscriu-te i estalvia»), el descompte opcional Subscriu-te i estalvia amb regles pròpies, la traducció completa al català i la possibilitat que el client canviï la quantitat i la freqüència de la seva subscripció des de El meu compte. A més, porta una auditoria de seguretat completa i una llarga llista de correccions en renovacions, canvis de pla, descomptes i passarel·les de pagament.
Versions de la branca
3.0.0
Important:
- Actualització recomanada per a totes les botigues: inclou correccions de seguretat i de cobraments a les passarel·les incloses, a El meu compte i a les renovacions.
- El selector «Compra única / Subscripció» que apareixia sota el preu desapareix i el substitueix el nou widget d'opcions de compra. Si el teu tema o algun fragment de codi depenia d'ell, revisa-ho abans d'actualitzar.
- El mòdul de data d'inici personalitzada (Custom Start Date) queda desactivat a la 3.0.0 i la seva secció d'ajustos no es mostra, també a les botigues que el tenien activat: mostrava la data escollida, però la subscripció començava i es cobrava en el moment. Tornarà, acabat, en una versió posterior.
- El correu de recordatori de renovació ve desactivat per defecte. Si el tenies guardat com activat, es desactiva una vegada s'actualitza perquè els teus clients no rebin correus per sorpresa; pots tornar a activar-ho quan vulguis.
- En actualitzar, les subscripcions que s'havien quedat en «Pendent de cancel·lar» es cancel·len en la seva següent data de pagament, o en les dotze hores següents si aquesta data ja ha passat. Rebràs aleshores els seus correus de cancel·lació.
- En actualitzar, les subscripcions actives amb la data del següent pagament en el passat i res programat passen a cobrar-se en la següent data del seu cicle. El període vençut no es cobra i queda una nota a la subscripció.
Nou:
- Opcions de compra a la fitxa de producte: «Compra única» o «Subscriu-te i estalvia», com un grup d'opcions natiu i manejable amb el teclat, amb l'estalvi destacat en una etiqueta. Funciona en productes simples i variables (per variació) i en temes clàssics i de blocs. L'opció preseleccionada s'escull a les configuracions.
- Subscriu-te i estalvia (desactivat per defecte; res canvia fins que ho activis): el preu de la subscripció és el preu normal del producte menys un percentatge (del 1 % al 50 %), que pot venir d'un ajust del producte o de la variació, de la primera regla que coincideixi o de l'ajust global. Pots descomptar també el primer encàrrec i limitar el nombre d'encàrrecs amb descompte. Tot es guarda a la subscripció al donar-se d'alta, així que canviar els ajustos més endavant mai canvia el seu preu.
- Nova pantalla WooCommerce › Subscriu-te i estalvia amb regles ordenades per condicions (preu per sobre o per sota d'un import, categoria, etiqueta o productes concrets). Guanya la primera regla que coincideix. Les regles es poden pujar, baixar, arrossegar per reordenar-les i esborrar en dos passos.
- El client pot escollir la freqüència de lliurament dins dels períodes i límits que permeti la botiga, llevat que el producte la tingui bloquejada.
- Al carro clàssic, cada línia que ho admet es pot canviar entre compra única i subscripció, amb la seva freqüència. Els totals del carro i del pagament (clàssics i de blocs) mostren una fila amb l'estalvi de Subscriu-te i estalvia.
- A El meu compte, el client pot canviar la quantitat i la freqüència de la seva subscripció. El canvi s'aplica des de la següent renovació, amb una vista prèvia del nou import i de la nova data.
- Cada línia d'un producte que ofereix les dues opcions mostra «Compra: compra única» o «Compra: subscripció», amb les seves condicions, al carro, al pagament (clàssic i de blocs), a l'encàrrec, a El meu compte, a la confirmació de l'encàrrec i als correus. Una subscripció de N unitats es crea i es renova per N unitats.
- Els trams de descompte de renovació poden sumar-se al descompte de Subscriu-te i estalvia o aplicar-se després d'ell: primer Subscriu-te i estalvia mentre duri i després els trams (és un ajust). Un canvi de pla agafa els trams del nou producte.
- Traducció al català (ca) inclosa: tot el plugin, amb les passarel·les incloses de Redsys, Bizum, Google Pay i Inespay. Una botiga en català ja no mostra textos en anglès al pagament, a El meu compte, als correus ni als ajustos.
- En actualitzar, les subscripcions que es renoven amb un cicle diferent al del seu producte apareixen en un avís d'administració amb el botó «Alinea amb el producte» per alinear-les.
Arreglat:
- Les traduccions incloses a la carpeta
languages/del plugin es carreguen de veritat. A WordPress 6.7 i posteriors es buscaven en una carpeta que no existeix, així que només s'aplicaven les instal·lades awp-content/languages/plugins/. - Una subscripció cancel·lada pel client a El meu compte, o per la botiga des de l'administració, ara acaba de veritat. Si no tenia data de fi es quedava per sempre en «Pendent de cancel·lar»: mai es cancel·lava, el correu de subscripció cancel·lada no sortia i una botiga que dóna accés segons l'estat de la subscripció seguia donant-ho. Ara es cancela quan acaba el període ja pagat. Nou filtre
aswc_prepaid_term_end. - Un reintentar de pagament cobra cada període com a màxim una vegada. Amb un cobrament pendent, o amb un que va expirar després que el banc l'aprovés, el reintentar podia crear i cobrar una segona renovació del mateix període.
- Quan un reintentar paga una renovació fallida amb un encàrrec de renovació nou, el client ja no pot pagar també l'encàrrec fallit (al pagament, a El meu compte o amb l'acció d'administració «Reintentar pagament d'encàrrec pendent»). Si ja hi havia un pagament en marxa quan es va executar el reintentar, es marca en els dos encàrrecs perquè decideixis el reemborsament.
- Dues execucions de renovació simultànies per la mateixa subscripció (diversos lots d'Action Scheduler, o un executor de WP-CLI juntament amb WP-Cron) ja no poden cobrar-la les dues.
- Stripe: una renovació la resposta de la qual es perd (un temps d'espera esgotat, un servidor que s'atura a mig camí de la petició, un error d'un proxy) ja no es marca com a fallida, cosa que la deixava pagable i permetia que un reintentar cobrés el període dues vegades. Ara queda en espera amb una nota a l'encàrrec, no es torna a cobrar mentrestant i es consulta a Stripe una hora després: es completa si el cobrament es va fer i passa als reintents normals si no.
- Stripe: mentre una renovació està retinguda a l'espera de confirmar el seu cobrament, reactivar la subscripció ja no permet que la següent execució creï i cobri una altra renovació del mateix període. La retenció també queda anotada a la subscripció.
- Stripe: un avís tardà de «pagament fallit» ja no fa fallir una renovació que ja està pagada. Stripe i PayPal: una renovació ja no torna a posar la targeta que el client havia substituït.
- PayPal: quan PayPal no respon (temps d'espera esgotat, error de connexió o error del servidor), la renovació queda retinguda perquè la revisis, en lloc de marcar-se com a fallida i reintentarse, cosa que podia cobrar-la dues vegades.
- PayPal i WooPayments: una renovació mai es queda pagable quan el plugin de pagament falla amb un error intern després d'enviar el cobrament. Les de PayPal queden retingudes perquè les revisis i les de WooPayments es concilien. Abans, un reintentar podia cobrar-les per segona vegada.
- Una subscripció sense un cicle de facturació vàlid ja no es renova cada dia: agafa el cicle del seu producte o es posa en espera i mai es cobra. Tampoc la cobra un reintentar de pagament ni les accions manuals de la botiga (Crear Encàrrec de Renovació Pendent, Reintentar Pagament d'Encàrrec Pendent i Reintentar Pagament de Renovació), que ara la rebutgen amb una nota.
- En actualitzar a la 3.0.0, les subscripcions sense cicle de facturació agafen el del seu producte.
- L'interval de facturació d'un producte de subscripció, i el de cada variació, ja no ve preseleccionat en «Dies»: cal escollir-lo, o el producte no es guarda com a subscripció.
- El «Pagament» i el «Cicle de Facturació» d'una subscripció existent es guarden des de la seva caixa de programació, i un cicle buit ja no es mostra com a «Dies».
- Les comprovacions del cicle de facturació accepten períodes afegits per altres plugins, mai modifiquen una subscripció només per mostrar-la i envien a la botiga com a màxim un correu al dia sobre subscripcions sense cicle.
- Una subscripció amb període de prova es renova el dia en què va acabar la prova, no el dia en què es va comprar (el segon cobrament arribava menys d'un mes després del primer).
- Una nova subscripció queda datada en el moment real en què es crea. La seva data de creació era l'hora local de la botiga guardada com a UTC, així que en una botiga a l'est d'UTC apareixia més tard del que era (dues hores a Espanya a l'estiu) i les noves subscripcions es ordenaven per sota d'altres més antigues. Les subscripcions creades abans de la 3.0.0 conserven la seva data.
- Una comanda de renovació que paga el client queda registrada: una renovació fallida pagada a la pàgina de pagament de la comanda, o una renovació manual, mou ara la data del següent pagament un interval i programa aquest pagament. Abans la subscripció tornava a activa sense res programat i no es renovava mai més.
- Una renovació sense res a pagar (un cupó recurrent del 100 %) es registra com qualsevol altra: la subscripció continua activa i la seva següent renovació queda programada.
- La comprovació diària de la programació restaura l'acció de pagament que falti en les botigues amb emmagatzematge de comandes d'alt rendiment (HPOS). Buscava les subscripcions només entre les entrades i no trobava cap.
- Una subscripció o una comanda cancel·lada, reembolsada o caducada després de programar la seva data d'inici ja no s'activa quan arriba aquesta data.
- Una subscripció eliminada, cancel·lada per un administrador o reembolsada mentre una renovació fallida espera el seu reintent ja no manté aquest reintent programat.
- Reactivar una subscripció pausada a La meva compte ja no programa un reintent de pagament.
- Un reemborsament total de la primera comanda d'una subscripció torna a cancel·lar-la. La botiga tractava aquesta primera comanda com una renovació, així que un client reembolsat continuava subscrit i se li cobrava a la següent renovació.
- Els trams de descompte de renovació arriben a totes les renovacions per a les quals es van configurar: el comptador de renovacions pagades no avançava mai, així que un tram que començava a la segona renovació o més tard no s'aplicava mai. Ara cada renovació pagada compta una vegada, i una renovació reembolsada continua comptant.
- Editar els trams de descompte de renovació d'un producte ja no canvia el preu de les subscripcions existents. Els trams es guarden en començar la subscripció i es mantenen tal com es van vendre, també els dels cupons.
- Els trams de descompte de renovació configurats en un cupó, i els trams per rol de client, s'apliquen ara a les renovacions. Es guardaven, però mai s'utilitzaven. Els d'un cupó també s'apliquen en un producte sense trams propis, encara que «Override Product Discounts» estigui desmarcat.
- El pagament ja no acaba amb un error fatal quan el producte té trams de descompte de renovació.
- El descompte del primer pagament s'aplica una sola vegada i només en el primer pagament. S'aplicava dues vegades i es traslladava a totes les renovacions. No s'aplica a un període de prova ni a un canvi de pla.
- Un producte amb descompte en el primer pagament mostra en el pagament el seu preu real de renovació. Els dos checkouts mostraven el primer pagament amb descompte com a preu de totes les renovacions, encara que les renovacions es cobraven al preu complet.
- Un producte amb període de prova comprat amb un cupó recurrent es renova al seu preu amb descompte. Es guardava amb un import de renovació de 0 i es renovava gratis.
- La quota d'alta es cobra una vegada per subscripció, sigui quina sigui la quantitat. Una subscripció comprada amb quantitat 3 pagava la quota tres vegades.
- Amb els preus introduïts amb impostos inclosos, el total recurrent de la subscripció es guarda arrodonit als decimals de la botiga.
- Canvis de pla: el canvi es cobra en la data del següent pagament que mostra la subscripció, i la nova data es compta des del canvi (abans una millora regalava un període sencer). Un canvi mai concedeix el període de prova del producte nou; el crèdit del període no utilitzat és el que realment es va pagar per ell; es rebutja una segona línia de canvi per la mateixa subscripció i una comanda de canvi confirmada dues vegades alhora s'aplica una sola vegada.
- Canvis de pla amb prorrateig: el crèdit de la subscripció anterior s'aplica una vegada per línia, no una vegada per unitat.
- Un canvi de pla a una variació que pren el període de facturació del producte variable es reconeix com el que és. Abans es tractava sempre com una baixada de pla, fossin quins fossin els preus.
- Una baixada de pla a una variació que hereta l'interval del seu producte pare rep el seu crèdit. Es calculava com a infinit i mai s'aplicava.
- Un canvi de pla manté la facturació d'una subscripció sense data de fi quan el seu crèdit s'afegeix com a dies, comença el nou període el dia del canvi i conserva els trams de descompte d'un cupó d'alta.
- «Stop Downgrade» i «Allow switching only to the same interval» estan desactivats llevat que els marquis. Un cop guardats els ajustos, es llegien com activats i es rebutjaven totes les baixades de pla i tots els canvis entre intervals.
- Dia de renovació sincronitzat: la primera renovació mensual és el dia d'aquest mes si encara no ha passat; totes les renovacions es mantenen en aquest dia; la fitxa de producte anuncia la data que es cobra; «Últim dia del mes» renova l'últim dia de cada mes, i un lloc a l'est d'UTC ja no avança un dia la primera renovació al final de la seva jornada.
- «Let the customer choose the expiry» en una subscripció variable: el camp de caducitat ofereix el període de facturació del producte (abans caia en «Días») i es rebutja una caducitat més curta que l'interval de facturació. El mateix s'aplica a una subscripció creada des d'una venda addicional de CartFlows.
- El límit de cancel·lacions de períodes de prova d'un producte s'aplica: després del nombre indicat de proves cancel·lades, el client ja no pot cancel·lar la següent.
- El bloc de Pagament mostra en el resum de la comanda el període de facturació («/ 1 mes»), com ja feia el bloc de Carret.
- Les xifres de renovació del bloc de Pagament segueixen al carret: després d'un cupó o un canvi de quantitat o d'enviament ja no es queden amb els imports anteriors fins a recarregar la pàgina.
- Bloc de Pagament: el primer cobrament d'una prova gratuïta (la quota d'alta, o res) ja no apareix com una oferta. La línia mostra el que es cobra ara, la prova i el preu de renovació.
- Un producte variable que barreja variacions de subscripció i de compra única ja no mostra el seu rang de preus amb un període de facturació, el que presentava el preu de compra única com a mensual. Nova funció auxiliar i filtre
aswc_variable_product_has_one_time_variation(). - L'icona de targeta de Redsys (i les icones per defecte de les altres passarel·les incloses) ja no ocupa tota la caixa de pagament en el checkout clàssic amb un tema de blocs. El teu propi logotip no es toca.
- Passarel·la Redsys inclosa: una renovació cobrada amb la targeta guardada ja no la guarda una altra vegada. Cada renovació afegia una altra targeta idèntica al compte del client. En actualitzar s'eliminen els duplicats que van guardar les versions anteriors, conservant la que utilitzen les renovacions.
- Redsys: una renovació cobra la targeta guardada més recent del client, no la més antiga, i una targeta ja guardada mai es torna a guardar en clients amb més de deu targetes.
- Una cancel·lació en Redsys, Bizum o Google Pay cancela la comanda a la botiga. Abans quedava pendent.
- Els pagaments amb contra reemborsament, transferència o xec, i les subscripcions manuals, envien al client la factura de renovació amb l'enllaç per pagar-la. Abans el client no sabia res fins que la botiga utilitzava «Retry Renewal Payment». Nou filtre
aswc_send_manual_renewal_invoice. - «Retry Renewal Payment» torna a oferir-se en una comanda de renovació pendent, i el correu que rep la botiga sobre una renovació fallida indica que és una renovació i nomena la seva subscripció.
- La botiga rep una sola vegada el correu d'una renovació fallida. El plugin enviava la seva pròpia còpia juntament amb la de WooCommerce.
- El correu de recordatori de renovació s'envia abans de la renovació quan la botiga ho activa. Es programava i no s'enviava mai.
- El correu «Subscription on hold to active» s'envia quan la botiga reactiva una subscripció en espera des de la seva pantalla d'edició.
- L'assumpte per defecte de cinc correus (cancel·lada, caducada, en espera, pausada i reactivada) escrivia malament «Subscription».
- Els enllaços de l'administració a la pantalla de subscripcions tornen a funcionar: l'enllaç d'ajustos del plugin, el de la subscripció a les notes de la comanda, la tornada després de pausar, reactivar o cancel·lar, «Go Back» i l'exportació CSV acabaven en «Ho sento, no tens permisos per accedir a aquesta pàgina».
- La paperera de la llista de subscripcions ofereix «Restaurar» i «Esborrar permanentment», per restaurar o esborrar una subscripció concreta.
- La ruta REST
aswc-view-subscriptionretorna les subscripcions. Filtrava per una clau de metadades sense el seu guió baix i no retornava cap. - Desapareix un error de JavaScript a les pàgines de carret i de pagament clàssiques: el script dels blocs s'executava on no hi ha blocs.
- WordPress 6.7 i posteriors ja no registren l'avís «translation loading was triggered too early» en cada petició. També desapareixen dos avisos de PHP a la botiga i a la pantalla d'edició de producte.
- La plantilla de traducció (.pot) torna a cobrir tots els textos: uns 360 no es podien traduir, entre ells el correu HTML de factura de renovació.
- Accessibilitat: tots els camps del panell de subscripció del producte (simple, multiproducte i per variació) tenen ara un nom que anuncia el lector de pantalla.
- Guardar una subscripció al principi d'una petició d'administració (per exemple, des d'admin-ajax o admin-post) ja no acaba amb un error fatal.
- Desinstal·lar el plugin elimina també les seves dades transitoris.
Seguretat:
- Redsys, Bizum i Google Pay només accepten el resultat d'un pagament quan la seva firma és vàlida. Un retorn falsificat a la botiga podia marcar una comanda com a pagada.
- Les notificacions de pagament d'Inespay s'autentiquen. Una notificació el import signat de la qual no coincideix amb la comanda queda en espera, i una notificació repetida per a una comanda ja pagada s'ignora.
- Els enllaços d'administració per aturar i reactivar una subscripció requereixen permís per editar comandes, un enllaç vàlid i l'estat esperat. Una reactivació es podia disparar sense haver iniciat sessió.
- Les comprovacions de llicència i d'actualitzacions verifiquen sempre el certificat del servidor, i un paquet d'actualització només s'accepta si ve del servidor de llicències per https.
- A La meva compte, els detalls d'una subscripció, la seva llista de renovacions i el seu canvi de mètode de pagament (Stripe inclòs) només estan disponibles per al client al qual pertany.
- Les accions del client per aturar, reactivar i cancel·lar es decideixen a partir de l'estat guardat de la subscripció i dels ajustos de la botiga, així que ja no es poden saltar el termini mínim ni el límit de cancel·lacions de prova. Un enllaç mostrat abans d'actualitzar falla una vegada; al tornar a carregar la pàgina apareix un que funciona.
- La data d'inici que envia un client només s'accepta si és una de les que ofereix el producte.
- El bloc de Pagament crea sempre la subscripció quan el carro la conté; un paràmetre de la petició podia saltar-se-la.
- Un canvi de pla només dóna crèdit per prorrateig per a una subscripció pròpia i activa del client, i cada crèdit s'gasta una sola vegada. Un període reemborsat no genera crèdit.
- Reforços de l'auditoria de seguretat de la 3.0.0: les rutines d'actualització i la configuració del vault de PayPal només s'executen per als administradors; l'acció massiva de data d'inici personalitzada comprova l'usuari i la petició; una acció de fi de període només acaba subscripcions que esperen acabar; el restaurador de la programació mai torna a intentar retencions decidides per la botiga, i les passarel·les Redsys incloses ja no escriuen la clau de signatura al log de depuració.
- La pestanya de descomptes del producte i els camps de descompte de cada variació només es guarden per a un usuari que pot editar aquest producte (defensa en profunditat).
Desenvolupament:
- S'eliminen el selector «Compra única / Subscripció» que s'imprimia sota el preu; el substitueix el nou widget. L'acció AJAX
aswc_onetime_purchasesegueix registrada com a obsoleta i no fa res (es registra al log com a molt una vegada al dia ambWP_DEBUG). Consultadocs/reference/hooks-and-extension-points.md. - S'elimina
ASWC_Admin::aswc_admin_reactivate_onhold_subscription()i el seu hook deinit: era el gestor d'un enllaç que cap pantalla mostrava. - Nous filtres:
aswc_prepaid_term_end,aswc_send_manual_renewal_invoiceiaswc_variable_product_has_one_time_variation.
Compatibilitat:
- Provada fins a WordPress 7.1 i WooCommerce 11.1.0.
- Requereix WordPress 6.5 o superior, WooCommerce 8.0 o superior i PHP 7.4 o superior.
- Totalment compatible amb l'emmagatzematge de comandes d'alt rendiment de WooCommerce (HPOS) i amb els blocs de Carro i Pagament.
- Segueix funcionant de manera autònoma, sense dependre de l'extensió WooCommerce Subscriptions.







