Version 5.0.6

This commit is contained in:
Neo committed 2025-12-19 18:55:49 -08:00
1 parent a3a4a9ccbd
commit b89858b2ff
1214 files changed
+92828 -14859

No files matched your search

+20 -14
View File
@@ -522,23 +522,29 @@ class Application extends SystemApplication
{
$return = [];
if( $extensionType == 'Item' )
switch( $extensionType )
{
$return[ '{itemType}' ] = new Select( 'extension_invoice_item_type', null, true, [
'options' => [
'Purchase' => 'Purchase',
'Charge' => 'Charge'
]
]);
$return[ '{type}' ] = new Text( 'extension_item_key', null, true, [], function( $val ) use ( $appKey ){
foreach( SystemApplication::load( $appKey )->extensions( 'nexus', 'Item', false ) as $ext )
{
if( $ext::$type == $val )
case 'Item':
$return[ '{itemType}' ] = new Select( 'extension_invoice_item_type', null, true, [
'options' => [
'Purchase' => 'Purchase',
'Charge' => 'Charge'
]
]);
$return[ '{type}' ] = new Text( 'extension_item_key', null, true, [], function( $val ) use ( $appKey ){
foreach( SystemApplication::load( $appKey )->extensions( 'nexus', 'Item', false ) as $ext )
{
throw new DomainException( 'err_duplicate_item_key' );
if( $ext::$type == $val )
{
throw new DomainException( 'err_duplicate_item_key' );
}
}
}
} );
} );
break;
case 'PackageType':
$return[ '{table}' ] = new Text( 'extension_packagetype_table', null, true );
break;
}
return $return;
@@ -0,0 +1,76 @@
<?php
/**
* @brief {class}
* @author <a href='https://www.invisioncommunity.com'>Invision Power Services, Inc.</a>
* @copyright (c) Invision Power Services, Inc.
* @license https://www.invisioncommunity.com/legal/standards/
* @package Invision Community
{subpackage}
* @since {date}
*/
namespace IPS\{app}\extensions\nexus\PackageType;
/* To prevent PHP errors (extending class does not exist) revealing path */
use IPS\nexus\Invoice;
use IPS\nexus\Package;
use IPS\nexus\Purchase;
use function defined;
if ( !defined( '\IPS\SUITE_UNIQUE_KEY' ) )
{
header( ( $_SERVER['SERVER_PROTOCOL'] ?? 'HTTP/1.0' ) . ' 403 Forbidden' );
exit;
}
/**
* {class}
*/
class {class} extends Package
{
/**
* @brief Database Table
*/
protected static string $packageDatabaseTable = '{table}';
/**
* @brief Which columns belong to the local table
*/
protected static array $packageDatabaseColumns = array();
/**
* @brief Icon
*/
public static string $icon = '';
/**
* @brief Title
*/
public static string $title = '';
/**
* ACP Fields
*
* @param Package $package The package
* @param bool $custom If TRUE, is for a custom package
* @param bool $customEdit If TRUE, is editing a custom package
* @return array
*/
public static function acpFormFields( Package $package, bool $custom=FALSE, bool $customEdit=FALSE ): array
{
return [];
}
/**
* On Purchase Generated
*
* @param Purchase $purchase The purchase
* @param Invoice $invoice The invoice
* @return void
*/
public function onPurchaseGenerated( Purchase $purchase, Invoice $invoice ): void
{
/** Handle any custom data stored in @see static::$packageDatabaseTable **/
}
}
+34 -28
View File
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<javascript app="nexus">
<file javascript_app="nexus" javascript_location="front" javascript_path="controllers/checkout" javascript_name="ips.checkout.register.js" javascript_type="controller" javascript_version="5000049" javascript_position="1000100">/**
<file javascript_app="nexus" javascript_location="front" javascript_path="controllers/checkout" javascript_name="ips.checkout.register.js" javascript_type="controller" javascript_version="5000074" javascript_position="1000100">/**
* Invision Community
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
*
@@ -34,7 +34,7 @@
}
});
}(jQuery, _));</file>
<file javascript_app="nexus" javascript_location="front" javascript_path="controllers/checkout" javascript_name="ips.checkout.review.js" javascript_type="controller" javascript_version="5000049" javascript_position="1000100"><![CDATA[/**
<file javascript_app="nexus" javascript_location="front" javascript_path="controllers/checkout" javascript_name="ips.checkout.review.js" javascript_type="controller" javascript_version="5000074" javascript_position="1000100"><![CDATA[/**
* Invision Community
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
*
@@ -91,7 +91,7 @@
}
});
}(jQuery, _));]]></file>
<file javascript_app="nexus" javascript_location="global" javascript_path="controllers/forms" javascript_name="ips.forms.businessAddressVat.js" javascript_type="controller" javascript_version="5000049" javascript_position="1000150"><![CDATA[/**
<file javascript_app="nexus" javascript_location="global" javascript_path="controllers/forms" javascript_name="ips.forms.businessAddressVat.js" javascript_type="controller" javascript_version="5000074" javascript_position="1000150"><![CDATA[/**
* Invision Community
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
*
@@ -130,7 +130,7 @@
});
}(jQuery, _));]]></file>
<file javascript_app="nexus" javascript_location="global" javascript_path="controllers/gateways" javascript_name="ips.gateways.stripe.js" javascript_type="controller" javascript_version="5000049" javascript_position="1000200"><![CDATA[/**
<file javascript_app="nexus" javascript_location="global" javascript_path="controllers/gateways" javascript_name="ips.gateways.stripe.js" javascript_type="controller" javascript_version="5000074" javascript_position="1000200"><![CDATA[/**
* Invision Community
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
*
@@ -471,7 +471,7 @@
});
}(jQuery, _));]]></file>
<file javascript_app="nexus" javascript_location="global" javascript_path="controllers/gateways" javascript_name="ips.gateways.stripepaymentrequest.js" javascript_type="controller" javascript_version="5000049" javascript_position="1000200">/**
<file javascript_app="nexus" javascript_location="global" javascript_path="controllers/gateways" javascript_name="ips.gateways.stripepaymentrequest.js" javascript_type="controller" javascript_version="5000074" javascript_position="1000200">/**
* IPS Community Suite 4
* (c) 2017 Invision Power Services - http://www.invisionpower.com
*
@@ -552,7 +552,7 @@
});
}(jQuery, _));</file>
<file javascript_app="nexus" javascript_location="global" javascript_path="controllers/misc" javascript_name="ips.misc.print.js" javascript_type="controller" javascript_version="5000049" javascript_position="1000100">/**
<file javascript_app="nexus" javascript_location="global" javascript_path="controllers/misc" javascript_name="ips.misc.print.js" javascript_type="controller" javascript_version="5000074" javascript_position="1000100">/**
* Invision Community
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
*
@@ -574,7 +574,7 @@
});
}(jQuery, _));</file>
<file javascript_app="nexus" javascript_location="admin" javascript_path="controllers/notifications" javascript_name="ips.notifications.pendingTransactions.js" javascript_type="controller" javascript_version="5000049" javascript_position="1000100">/**
<file javascript_app="nexus" javascript_location="admin" javascript_path="controllers/notifications" javascript_name="ips.notifications.pendingTransactions.js" javascript_type="controller" javascript_version="5000074" javascript_position="1000100">/**
* Invision Community
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
*
@@ -654,7 +654,7 @@
});
}(jQuery, _));</file>
<file javascript_app="nexus" javascript_location="admin" javascript_path="controllers/store" javascript_name="ips.store.productoptions.js" javascript_type="controller" javascript_version="5000049" javascript_position="1000150"><![CDATA[/**
<file javascript_app="nexus" javascript_location="admin" javascript_path="controllers/store" javascript_name="ips.store.productoptions.js" javascript_type="controller" javascript_version="5000074" javascript_position="1000150"><![CDATA[/**
* Invision Community
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
*
@@ -709,7 +709,7 @@
});
}(jQuery, _));]]></file>
<file javascript_app="nexus" javascript_location="admin" javascript_path="controllers/store" javascript_name="ips.store.productselector.js" javascript_type="controller" javascript_version="5000049" javascript_position="1000150"><![CDATA[/**
<file javascript_app="nexus" javascript_location="admin" javascript_path="controllers/store" javascript_name="ips.store.productselector.js" javascript_type="controller" javascript_version="5000074" javascript_position="1000150"><![CDATA[/**
* Invision Community
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
*
@@ -769,7 +769,7 @@
});
}(jQuery, _));]]></file>
<file javascript_app="nexus" javascript_location="front" javascript_path="controllers/store" javascript_name="ips.store.cartReview.js" javascript_type="controller" javascript_version="5000049" javascript_position="1000200">/**
<file javascript_app="nexus" javascript_location="front" javascript_path="controllers/store" javascript_name="ips.store.cartReview.js" javascript_type="controller" javascript_version="5000074" javascript_position="1000200">/**
* Invision Community
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
*
@@ -869,7 +869,7 @@
}
});
}(jQuery, _));</file>
<file javascript_app="nexus" javascript_location="front" javascript_path="controllers/store" javascript_name="ips.store.category.js" javascript_type="controller" javascript_version="5000049" javascript_position="1000200"><![CDATA[/**
<file javascript_app="nexus" javascript_location="front" javascript_path="controllers/store" javascript_name="ips.store.category.js" javascript_type="controller" javascript_version="5000074" javascript_position="1000200"><![CDATA[/**
* Invision Community
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
*
@@ -977,7 +977,7 @@
}
});
}(jQuery, _));]]></file>
<file javascript_app="nexus" javascript_location="front" javascript_path="controllers/store" javascript_name="ips.store.currencySelect.js" javascript_type="controller" javascript_version="5000049" javascript_position="1000200">/**
<file javascript_app="nexus" javascript_location="front" javascript_path="controllers/store" javascript_name="ips.store.currencySelect.js" javascript_type="controller" javascript_version="5000074" javascript_position="1000200"><![CDATA[/**
* Invision Community
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
*
@@ -986,12 +986,14 @@
* Author: Mark Wade
*/
;( function($, _, undefined){
&quot;use strict&quot;;
"use strict";
ips.controller.register('nexus.front.store.currencySelect', {
currencyChangeWarningConfirmed: false,
initialize: function () {
this.on( 'click', 'a', this.currencyChangeWarning );
this.on( 'submit', 'form', this.currencyChangeWarning );
},
/**
@@ -1001,17 +1003,22 @@
* @returns {void}
*/
currencyChangeWarning: function (e) {
e.preventDefault();
if( this.currencyChangeWarningConfirmed )
{
return;
}
var url = $(e.currentTarget).attr('href');
e.preventDefault();
ips.ui.alert.show({
type: 'confirm',
message: ips.getString('store_currency_change_warning'),
icon: 'warn',
callbacks: {
ok: function () {
window.location = url;
ok: () => {
this.currencyChangeWarningConfirmed = true;
let submitButton = (e instanceof SubmitEvent || e.originalEvent.submitter instanceof Element) ? e.originalEvent.submitter : e.target.querySelector('button[type="submit"], button:not([type]), input[type="submit"]');
submitButton.click();
}
}
});
@@ -1019,8 +1026,8 @@
}
});
}(jQuery, _));</file>
<file javascript_app="nexus" javascript_location="front" javascript_path="controllers/store" javascript_name="ips.store.giftCard.js" javascript_type="controller" javascript_version="5000049" javascript_position="1000200"><![CDATA[/**
}(jQuery, _));]]></file>
<file javascript_app="nexus" javascript_location="front" javascript_path="controllers/store" javascript_name="ips.store.giftCard.js" javascript_type="controller" javascript_version="5000074" javascript_position="1000200"><![CDATA[/**
* Invision Community
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
*
@@ -1108,7 +1115,7 @@
}
});
}(jQuery, _));]]></file>
<file javascript_app="nexus" javascript_location="front" javascript_path="controllers/store" javascript_name="ips.store.packagePage.js" javascript_type="controller" javascript_version="5000049" javascript_position="1000200"><![CDATA[/**
<file javascript_app="nexus" javascript_location="front" javascript_path="controllers/store" javascript_name="ips.store.packagePage.js" javascript_type="controller" javascript_version="5000074" javascript_position="1000200"><![CDATA[/**
* Invision Community
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
*
@@ -1385,7 +1392,7 @@
});
}(jQuery, _));]]></file>
<file javascript_app="nexus" javascript_location="front" javascript_path="controllers/store" javascript_name="ips.store.register.js" javascript_type="controller" javascript_version="5000049" javascript_position="1000200"><![CDATA[/**
<file javascript_app="nexus" javascript_location="front" javascript_path="controllers/store" javascript_name="ips.store.register.js" javascript_type="controller" javascript_version="5000074" javascript_position="1000200"><![CDATA[/**
* Invision Community
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
*
@@ -1534,7 +1541,7 @@
},
});
}(jQuery, _));]]></file>
<file javascript_app="nexus" javascript_location="front" javascript_path="controllers/subscriptions" javascript_name="ips.subscriptions.main.js" javascript_type="controller" javascript_version="5000049" javascript_position="1000150">/**
<file javascript_app="nexus" javascript_location="front" javascript_path="controllers/subscriptions" javascript_name="ips.subscriptions.main.js" javascript_type="controller" javascript_version="5000074" javascript_position="1000150">/**
* Invision Community
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
*
@@ -1572,7 +1579,7 @@
}
});
}(jQuery, _));</file>
<file javascript_app="nexus" javascript_location="admin" javascript_path="templates" javascript_name="ips.templates.store.js" javascript_type="template" javascript_version="5000049" javascript_position="1000050"><![CDATA[ips.templates.set('nexus.store.images', `
<file javascript_app="nexus" javascript_location="admin" javascript_path="templates" javascript_name="ips.templates.store.js" javascript_type="template" javascript_version="5000074" javascript_position="1000050"><![CDATA[ips.templates.set('nexus.store.images', `
<div class='ipsUploader__row ipsUploader__row--image ipsAttach {{#done}}ipsAttach_done{{/done}}' id='{{id}}' data-role='file' data-fileid='{{id}}' data-fullsizeurl='{{imagesrc}}' data-thumbnailurl='{{thumbnail}}' data-fileType='image'>
<div class='ipsUploader__rowPreview' data-role='preview'>
{{#thumb}}
@@ -1605,12 +1612,12 @@
ips.templates.set('nexus.store.imagesWrapper', `
<div class='ipsUploader__container ipsUploader__container--images'>{{{content}}}</div>
`);]]></file>
<file javascript_app="nexus" javascript_location="front" javascript_path="templates" javascript_name="ips.templates.store.js" javascript_type="template" javascript_version="5000049" javascript_position="1000050"><![CDATA[ips.templates.set('nexus.store.productImage', " \
<file javascript_app="nexus" javascript_location="front" javascript_path="templates" javascript_name="ips.templates.store.js" javascript_type="template" javascript_version="5000074" javascript_position="1000050"><![CDATA[ips.templates.set('nexus.store.productImage', " \
<a href='{{fullURL}}' data-fullURL='{{fullURL}}' class='cNexusProduct_primaryImage' data-ipsLightbox data-ipsLightbox-group='product' style='background-image:url({{thumbURL}})'>\
<img src='{{thumbURL}}' alt=''>\
</a>\
");]]></file>
<file javascript_app="nexus" javascript_location="global" javascript_path="templates" javascript_name="ips.templates.gateways.js" javascript_type="template" javascript_version="5000049" javascript_position="1000050"><![CDATA[ips.templates.set('nexus.gateway.vaultAccount', " \
<file javascript_app="nexus" javascript_location="global" javascript_path="templates" javascript_name="ips.templates.gateways.js" javascript_type="template" javascript_version="5000074" javascript_position="1000050"><![CDATA[ips.templates.set('nexus.gateway.vaultAccount', " \
<li>\
<input type='radio' name='{{fieldName}}[stored]' value='{{value}}' id='{{fieldName}}_stored{{random}}' data-control='toggle' data-toggles='{{fieldName}}_existing' class='ipsInput ipsInput--toggle'>\
<div class='ipsFieldList__content'>\
@@ -1630,8 +1637,7 @@ mustache
Debug.js
app.js</order>
<order app="global" path="/dev/js//library//jquery">jquery.js
jquery-migrate.js
jquery.transform.js</order>
jquery-migrate.js</order>
<order app="global" path="/dev/js//library//linkify">linkify.min.js
linkify-jquery.min.js</order>
</javascript>
+4 -1
View File
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<language>
<app key="nexus" version="5000049">
<app key="nexus" version="5000074">
<word key="__app_nexus" js="0">Commerce</word>
<word key="menutab__nexus" js="0">Commerce</word>
<word key="menutab__nexus_icon" js="0">usd</word>
@@ -2568,6 +2568,7 @@ At this stage, no further action is required from you. We will send you an addit
<word key="ext__Gateway" js="0">Payment Gateway</word>
<word key="ext__Payout" js="0">Payout Gateway</word>
<word key="ext__LicenseKey" js="0">Add a license key type as used in purchase benefits</word>
<word key="ext__PackageType" js="0">Create a custom package type</word>
<word key="cm_store_view" js="0">Default Store Layout</word>
<word key="cm_store_view_grid" js="0">Grid: show products as cards</word>
<word key="cm_store_view_list" js="0">List: show products in a list</word>
@@ -2575,6 +2576,8 @@ At this stage, no further action is required from you. We will send you an addit
<word key="extension_item_key" js="0">Item Key</word>
<word key="extension_item_key_desc" js="0"><![CDATA[Stored in the nexus_purchases.ps_type field.<br>Must be unique to your application.]]></word>
<word key="err_duplicate_item_key" js="0">This item key is already in use</word>
<word key="extension_packagetype_table" js="0">Database Table</word>
<word key="extension_packagetype_table_desc" js="0">The table where your custom package data will be stored</word>
<word key="acpsearch__nexus_customers_fields" js="0">Customer Fields</word>
<word key="acpsearch__nexus_store_fields" js="0">Package Fields</word>
<word key="acpsearch__nexus_payments_paymentsettings" js="0">Payment Settings</word>
+28 -27
View File
@@ -320,7 +320,9 @@
{{if \count( $recurrings )}}
{{$taxAmount = new \IPS\Math\Number('0');}}
{{foreach $recurrings as $recurring}}
<h3 class="ipsTitle ipsTitle--h3 i-margin-top_3">{lang="renewals_header" sprintf="$recurring['term']->getTermUnit()"}</h3>
<div class="i-padding_3">
<h3 class="ipsTitle ipsTitle--h3 i-margin-top_3">{lang="renewals_header" sprintf="$recurring['term']->getTermUnit()"}</h3>
</div>
<i-data>
<ul class="ipsData ipsData--table ipsData--renewals i-margin-top_3">
{{foreach $recurring['items'] as $rId => $item}}
@@ -1666,7 +1668,7 @@
</ul>
{{endif}}
<dl class='cNexusPurchase_info i-margin-top_3'>
<dl class='cNexusPurchase_info i-margin-top_3' data-ips-hook="purchaseInfo">
<dt class='ipsMinorTitle'><strong>{lang="ps_start"}</strong></dt>
<dd>{$purchase->start->localeDate()}</dd>
{{if $purchase->expire}}
@@ -1778,7 +1780,7 @@
{{endif}}
</div>
</div>
<div class='ipsButtons ipsButtons--fill ipsButtons--start i-padding-top_2'>
<div class='ipsButtons ipsButtons--fill ipsButtons--start i-padding-top_2' data-ips-hook="purchaseButtons">
{{if $fromBillingAgreement}}
<!-- <a href='{$purchase->url()}' class='ipsButton ipsButton--secondary ipsButton--small' title="{lang="purchases_manage_purchase"}"><i class="fa-solid fa-box-open"></i> {lang="view"}</a> -->
{{else}}
@@ -1841,7 +1843,7 @@
<div role='tablist'>
{{foreach $tabs as $k => $tab}}
<a href='{$customer->acpUrl()->setQueryString( array( 'do' => 'view', 'blockKey' => 'nexus_AccountInformation', 'block[nexus_AccountInformation]' => $k ) )}' class='ipsTabs__tab' id='ipsTabs_customer_{$k}' role="tab" aria-controls="ipsTabs_customer_{$k}_panel" aria-selected="{{if $activeTabKey == $k}}true{{else}}{{endif}}" data-ipsTooltip title='{lang="customer_tab_{$k}"}'>
<i class='fa-solid fa-{$tab['icon']}'></i> <span class='ipsResponsive_showPhone'>&nbsp;&nbsp;{lang="customer_tab_{$k}"}</span>
<i class='{$tab['icon']}'></i> <span class='ipsResponsive_showPhone'>{lang="customer_tab_{$k}"}</span>
{{if $tab['count']}}<span class='ipsNotification'>{$tab['count']}</span>{{endif}}
</a>
{{endforeach}}
@@ -1928,10 +1930,10 @@
</div>]]></template>
<template template_group="customers" template_name="accountInformationTablePreview" template_data="$customer, $table, $title, $type" template_location="admin" template_app="nexus"><![CDATA[<div class="i-padding_3">
{{$count = \count( $table->getRows(NULL) );}}
<h3 class='ipsTitle ipsTitle--h3 ipsTruncate ipsTruncate_line {{if !$count}}i-color_soft{{endif}}'>{{if $count}}<strong>{{endif}}{$title}{{if $count}}</strong>{{endif}}</h3>
<h3 class='ipsTitle ipsTitle--h4'>{$title}</h3>
{$table|raw}
<p class='i-margin-top_1'>
<a href='{url="app=core&module=members&controller=members&do=editBlock&block=IPS\\nexus\\extensions\\core\\MemberACPProfileBlocks\\AccountInformation&id={$customer->member_id}&type={$type}"}' data-ipsDialog data-ipsDialog-title='{lang="customer_tab_{$type}"}' class='ipsButton ipsButton--inherit ipsButton--tiny ipsButton--wide'>
<a href='{url="app=core&module=members&controller=members&do=editBlock&block=IPS\\nexus\\extensions\\core\\MemberACPProfileBlocks\\AccountInformation&id={$customer->member_id}&type={$type}"}' data-ipsDialog data-ipsDialog-title='{lang="customer_tab_{$type}"}' class='ipsButton ipsButton--inherit ipsButton--wide'>
{lang="customer_manage_{$type}"} <i class='fa-solid fa-caret-down'></i>
</a>
</p>
@@ -1990,7 +1992,7 @@
{{endif}}]]></template>
<template template_group="customers" template_name="altContactsOverview" template_data="$table, $headers, $rows, $quickSearch" template_location="admin" template_app="nexus"><![CDATA[
{{if \count( $rows )}}
<ul class='cCustomerOther_list i-grid i-gap_3'>
<ul class='cCustomerOther_list i-grid i-gap_2 i-margin-top_2 i-margin-bottom_3'>
{template="$table->rowsTemplate[1]" params="$table, $headers, $rows" object="$table->rowsTemplate[0]"}
</ul>
{{else}}
@@ -1999,10 +2001,10 @@
<template template_group="customers" template_name="altContactsOverviewRows" template_data="$table, $headers, $rows" template_location="admin" template_app="nexus"><![CDATA[
{{foreach $rows as $row}}
<li>
<p class='ipsTruncate ipsTruncate_line'>
<p class='i-font-weight_600 i-color_hard'>
{$row['alt_id']|raw}
</p>
<span class='i-font-size_1 i-color_soft'>{$row['email']}</span>
<span class='i-color_soft'>{$row['email']}</span>
</li>
{{endforeach}}]]></template>
<template template_group="customers" template_name="billingAgreementsOverview" template_data="$table, $headers, $rows, $quickSearch" template_location="admin" template_app="nexus"><![CDATA[
@@ -2654,7 +2656,7 @@
</label>
<div class='ipsFieldRow__content'>
{{if $field->options['dummy']}}
<div class="ipsInput ipsInput--text ipsInput--dummy ipsInput--primary" id="elInput_{$field->htmlId}-number" data-role="dummyCard"></div>
<div class="ipsInput ipsInput--text ipsInput--dummy ipsInput--primary ipsInput--stripeInput" id="elInput_{$field->htmlId}-number" data-role="dummyCard"></div>
{{else}}
<input type="text" class='ipsInput ipsInput--text ipsInput--primary' {{if $field->options['names']}}name="{$field->name}[number]"{{endif}} data-card="number" id="elInput_{$field->htmlId}-number" maxlength="16" value="{$number}" autocomplete="cc-number">
{{endif}}
@@ -2669,7 +2671,7 @@
</label>
<div class='ipsFieldRow__content'>
{{if $field->options['dummy']}}
<div class="ipsInput ipsInput--text ipsInput--dummy" id="elInput_{$field->htmlId}-exp" data-role="dummyExp"></div>
<div class="ipsInput ipsInput--text ipsInput--dummy ipsInput--stripeInput" id="elInput_{$field->htmlId}-exp" data-role="dummyExp"></div>
{{else}}
<select class="ipsInput ipsInput--select" {{if $field->options['names']}}name="{$field->name}[exp_month]"{{endif}} data-card="exp_month" id="elInput_{$field->htmlId}-exp_month" autocomplete="cc-exp-month">
<option {{if $expMonth === NULL}}selected{{endif}} disabled>MM</option>
@@ -2696,7 +2698,7 @@
</label>
<div class='ipsFieldRow__content'>
{{if $field->options['dummy']}}
<div class="ipsInput ipsInput--text ipsInput--dummy" id="elInput_{$field->htmlId}-ccv" data-role="dummyCcv"></div>
<div class="ipsInput ipsInput--text ipsInput--dummy ipsInput--stripeInput" id="elInput_{$field->htmlId}-ccv" data-role="dummyCcv"></div>
{{else}}
<input type="text" class="ipsInput ipsInput--text" size='4' {{if $field->options['names']}}name="{$field->name}[ccv]"{{endif}} data-card="ccv" id="elInput_{$field->htmlId}-ccv" maxlength="4" value="{$ccv}" autocomplete="cc-csc">
{{endif}}
@@ -5216,19 +5218,20 @@
{{$memberCurrency = ( ( isset( \IPS\Request::i()->cookie['currency'] ) and \in_array( \IPS\Request::i()->cookie['currency'], \IPS\nexus\Money::currencies() ) ) ? \IPS\Request::i()->cookie['currency'] : \IPS\nexus\Customer::loggedIn()->defaultCurrency() );}}
<div class='i-text-align_center ipsBox i-padding_3 i-margin-top_2' {{if isset( $_SESSION['cart'] ) and \count( $_SESSION['cart'] )}}data-controller="nexus.front.store.currencySelect"{{endif}}>
<span>{lang="show_prices_in"}</span><br>
<ul class='ipsList ipsList--inline i-link-color_inherit'>
<form action="{$baseUrl}" method="post">
<input type="hidden" name="csrfKey" value="{expression="\IPS\Session::i()->csrfKey"}">
<ul class='ipsButtons i-link-color_inherit i-margin-top_2'>
{{foreach \IPS\nexus\Money::currencies() as $currency}}
<li>
{{if $currency == $memberCurrency}}
<a data-action="filter" href='{$baseUrl->setQueryString( 'currency', $currency )->csrf()}' title='{lang="set_currency_to" sprintf="$currency"}'>
<strong><i class='fa-solid fa-check'></i> {$currency}</strong>
</a>
<button type="submit" name="currency" value="{$currency}" class='ipsButton ipsButton--primary ipsButton--small'><i class='fa fa-check'></i> {$currency}</button>
{{else}}
<a data-action="filter" href='{$baseUrl->setQueryString( 'currency', $currency )->csrf()}' title='{lang="set_currency_to" sprintf="$currency"}'>{$currency}</a>
<button type="submit" name="currency" value="{$currency}" class='ipsButton ipsButton--soft ipsButton--small' title='{lang="set_currency_to" sprintf="$currency"}'> {$currency}</button>
{{endif}}
</li>
{{endforeach}}
</ul>
</form>
</div>
{{endif}}]]></template>
<template template_group="store" template_name="fraudRuleDesc" template_data="$conditions, $results, $warning" template_location="admin" template_app="nexus"><![CDATA[<div class="i-margin-top_1">
@@ -5681,17 +5684,17 @@
{{if $package->image}}
<img src="{$package->image}" alt="{$package->_title}" loading="lazy">
{{else}}
<i class="fa-solid fa-box-open"></i>
<span class='ipsIcon ipsIcon--fa' aria-hidden="true"><i class="fa-solid fa-box-open"></i></span>
{{endif}}
</a>
<div class='ipsData__content'>
<div class='ipsData__main'>
<div class='ipsTitle ipsTitle--h5 ipsTitle--margin'>
<div class='ipsData__title'>
<h2><a href="{$package->url()}">{$package->_title}</a></h2>
{{if $package->featured}}<span class="ipsBadge ipsBadge--icon ipsBadge--positive" data-ipsTooltip title='{lang="featured"}'><i class='fa-solid fa-star'></i></span>{{endif}}
</div>
{template="packageBlockPrice" app="nexus" group="store" params="$package->fullPriceInfo()"}
{template="richText" group="global" app="core" location="global" params="$package->description, array('ipsTruncate_4', 'i-margin-top_2')"}
<div class="ipsData__desc">{$package->description}</div>
{{if $package->reviewable}}
<div class='i-margin-top_2'>
{template="rating" group="global" app="core" params="'large', $package->item()->averageReviewRating(), \IPS\Settings::i()->reviews_rating_out_of, $package->item()->memberReviewRating()"} <span class='i-color_soft'>({lang="num_reviews" pluralize="$package->item()->reviews"})</span>
@@ -6180,7 +6183,7 @@
</div>
{{endif}}]]></template>
<template template_group="subscription" template_name="row" template_data="$package, $subscription, $showImagePlaceholder=FALSE" template_location="front" template_app="nexus"><![CDATA[<!--{$package->id}-->
<div class='ipsData__item cSubscriptions {{if isset( \IPS\Request::i()->id ) and \IPS\Request::i()->id == $package->id}}cSubscription--highlighted{{endif}} {{if $subscription and $subscription->package and $subscription->package->id === $package->id}}cSubscription--active {{if !$subscription->active}}cSubscription--expired{{endif}}{{endif}} {$package->ui( 'css' )}' {$package->ui( 'dataAttributes' )}>
<div class='ipsData__item cSubscriptions {{if isset( \IPS\Request::i()->id ) and \IPS\Request::i()->id == $package->id}}cSubscription--highlighted{{endif}} {{if $subscription and $subscription->package and $subscription->package->id === $package->id}}cSubscription--active {{if !$subscription->active}}cSubscription--expired{{endif}}{{endif}} {$package->ui( 'css' )}' {$package->ui( 'dataAttributes' )} data-ips-hook="block">
{{if $package->_image || $showImagePlaceholder}}
<div class='ipsData__image' aria-hidden='true'>
{{if $package->_image}}
@@ -6191,7 +6194,7 @@
</div>
{{endif}}
<div class='ipsData__content'>
<div class="ipsData__main">
<div class="ipsData__main" data-ips-hook="header">
<h2 class='ipsData__title'>{$package->_title}</h2>
<div>
{{if $priceInfo = $package->priceInfo() and $priceInfo['primaryPrice']}}
@@ -6212,7 +6215,7 @@
{{$upgradeCost = (!( $subscription->purchase->billing_agreement and !$subscription->purchase->billing_agreement->canceled ) )? $package->costToUpgradeIncludingTax( $subscription->package, \IPS\nexus\Customer::loggedIn() ) : NULL;}}
{{if $subscription->package->id === $package->id}}
{{if $subscription->purchase->expire and ( $canRenewUntil = $subscription->purchase->canRenewUntil( NULL,TRUE ) or ( $subscription->purchase->can_reactivate ) or ( $pendingInvoice = $subscription->purchase->invoice_pending and $pendingInvoice->status === $pendingInvoice::STATUS_PENDING ) or $subscription->purchase->canCancel())}}
<div class='cSubscriptionInfo'>
<div class='cSubscriptionInfo' data-ips-hook="infoActivePurchase">
<ul class='ipsButtons ipsButtons--fill'>
{{if $pendingInvoice = $subscription->purchase->invoice_pending and $pendingInvoice->status === $pendingInvoice::STATUS_PENDING}}
<li>
@@ -6244,7 +6247,7 @@
</div>
{{endif}}
{{elseif $upgradeCost !== NULL}}
<div class='cSubscriptionInfo'>
<div class='cSubscriptionInfo' data-ips-hook="infoExpiredPurchase">
<ul class='ipsButtons ipsButtons--fill'>
{{if $upgradeCost->amount->isGreaterThanZero() or ( $upgradeCost->amount->isZero() and $package->price() >= $subscription->package->price())}}
<li>
@@ -6286,7 +6289,7 @@
{{endif}}
{{endif}}
{{else}}
<div class='cSubscriptionInfo'>
<div class='cSubscriptionInfo' data-ips-hook="infoNoPurchase">
<a href='{url="app=nexus&module=subscriptions&controller=subscriptions&do=purchase&id={$package->id}" csrf="true" seoTemplate="nexus_subscription"}' class="ipsButton ipsButton--primary">{lang="nexus_subs_buy"}</a>
</div>
{{endif}}
@@ -8534,7 +8537,6 @@ ul.cInvoiceUnpaidConsequences ul {
.cInvoiceUnpaidConsequences_warning:before {
font-family: var(--i-font-awesome);
-moz-osx-font-smoothing: grayscale;
-webkit-font-smoothing: antialiased;
text-rendering: auto;
font-weight: 900;
@@ -8566,7 +8568,6 @@ ul.cInvoiceUnpaidConsequences ul {
top: 0px;
inset-inline-start: -22px;
font-family: var(--i-font-awesome);
-moz-osx-font-smoothing: grayscale;
-webkit-font-smoothing: antialiased;
text-rendering: auto;
font-weight: 900;
+33 -1
View File
@@ -268,6 +268,13 @@
"107785": "4.7.19",
"107786": "4.7.19",
"107787": "4.7.19",
"107795": "4.7.20 Beta 1",
"107796": "4.7.20 Beta 2",
"107797": "4.7.20 Beta 3",
"107798": "4.7.20 Beta 4",
"107799": "4.7.20 Beta 5",
"107800": "4.7.20",
"107801": "4.7.20",
"500001": "5.0.0 Alpha 1",
"500002": "5.0.0 Alpha 2",
"5000003": "5.0.0 Alpha 3",
@@ -316,5 +323,30 @@
"5000046": "5.0.0 Beta 14",
"5000047": "5.0.0 Beta 14.1",
"5000048": "5.0.0 Beta 14.2",
"5000049": "5.0.0"
"5000049": "5.0.0",
"5000050": "5.0.0",
"5000051": "5.0.0",
"5000052": "5.0.1",
"5000053": "5.0.1",
"5000054": "5.0.2",
"5000055": "5.0.2",
"5000056": "5.0.2",
"5000057": "5.0.3",
"5000058": "5.0.3",
"5000059": "5.0.3",
"5000060": "5.0.3",
"5000061": "5.0.4 Beta 1",
"5000062": "5.0.4 Beta 1",
"5000063": "5.0.4 Beta 1",
"5000064": "5.0.4 Beta 2",
"5000065": "5.0.4 Beta 3",
"5000066": "5.0.4",
"5000067": "5.0.5 Beta 1",
"5000068": "5.0.5 Beta 2",
"5000069": "5.0.5",
"5000070": "5.0.6 Beta 1",
"5000071": "5.0.6 Beta 2",
"5000072": "5.0.6 Beta 3",
"5000073": "5.0.6 Beta 4",
"5000074": "5.0.6"
}
@@ -59,26 +59,26 @@ class AccountInformation extends TabbedBlock
{
$tabs = array(
'overview' => array(
'icon' => 'address-card',
'icon' => 'fa-solid fa-address-card',
'count' => 0
)
);
if ( count( Gateway::cardStorageGateways() ) )
{
$tabs['cards'] = array(
'icon' => 'credit-card',
'icon' => 'fa-solid fa-credit-card',
'count' => \IPS\Db::i()->select( 'COUNT(*)', 'nexus_customer_cards', array( 'card_member=?', $this->member->member_id ) )->first()
);
}
if ( count( Gateway::billingAgreementGateways() ) )
{
$tabs['paypal'] = array(
'icon' => 'paypal',
'icon' => 'fa-brands fa-paypal',
'count' => \IPS\Db::i()->select( 'COUNT(*)', 'nexus_billing_agreements', array( 'ba_member=? AND ba_canceled=0', $this->member->member_id ) )->first()
);
}
$tabs['alts'] = array(
'icon' => 'user',
'icon' => 'fa-solid fa-user',
'count' => \IPS\Db::i()->select( 'COUNT(*)', 'nexus_alternate_contacts', array( 'main_id=?', $this->member->member_id ) )->first()
);
@@ -83,7 +83,7 @@ class store extends Controller
$_SESSION['cart'] = array();
Request::i()->setCookie( 'currency', Request::i()->currency );
Output::i()->redirect( Url::internal( 'app=nexus&module=store&controller=store', 'front', 'store' ) );
Output::i()->redirect( Request::i()->url() );
}
$this->currency = Request::i()->currency;
}
@@ -0,0 +1,23 @@
{
"id": 107795,
"name": "4.7.20 Beta 1",
"steps": {
"queries": false,
"lang": false,
"theme": true,
"themeSettings": false,
"javascript": false,
"emailTemplates": false,
"hooks": false,
"acpSearchKeywords": false,
"settings": false,
"tasks": false,
"modules": false,
"widgets": false,
"customOptions": false,
"customRoutines": false
},
"forceMainUpgrader": false,
"forceManualDownloadNoCiC": false,
"forceManualDownloadCiC": false
}
@@ -0,0 +1,20 @@
{
"html": {
"added": [],
"edited": [],
"removed": []
},
"css": {
"added": [],
"edited": [],
"removed": []
},
"resources": {
"added": [],
"edited": [
"admin\/enhancements\/easypost.png",
"admin\/enhancements\/maxmind.png"
],
"removed": []
}
}
@@ -0,0 +1,23 @@
{
"id": 107796,
"name": "4.7.20 Beta 2",
"steps": {
"queries": false,
"lang": false,
"theme": false,
"themeSettings": false,
"javascript": false,
"emailTemplates": false,
"hooks": false,
"acpSearchKeywords": false,
"settings": false,
"tasks": false,
"modules": false,
"widgets": false,
"customOptions": false,
"customRoutines": false
},
"forceMainUpgrader": false,
"forceManualDownloadNoCiC": false,
"forceManualDownloadCiC": false
}
@@ -0,0 +1,23 @@
{
"id": 107797,
"name": "4.7.20 Beta 3",
"steps": {
"queries": false,
"lang": false,
"theme": false,
"themeSettings": false,
"javascript": false,
"emailTemplates": false,
"hooks": false,
"acpSearchKeywords": false,
"settings": false,
"tasks": false,
"modules": false,
"widgets": false,
"customOptions": false,
"customRoutines": false
},
"forceMainUpgrader": false,
"forceManualDownloadNoCiC": false,
"forceManualDownloadCiC": false
}
@@ -0,0 +1,23 @@
{
"id": 107798,
"name": "4.7.20 Beta 4",
"steps": {
"queries": false,
"lang": false,
"theme": true,
"themeSettings": false,
"javascript": false,
"emailTemplates": false,
"hooks": false,
"acpSearchKeywords": false,
"settings": false,
"tasks": false,
"modules": false,
"widgets": false,
"customOptions": false,
"customRoutines": false
},
"forceMainUpgrader": false,
"forceManualDownloadNoCiC": false,
"forceManualDownloadCiC": false
}
@@ -0,0 +1,19 @@
{
"html": {
"added": [],
"edited": [
"front\/checkout\/paymentForm"
],
"removed": []
},
"css": {
"added": [],
"edited": [],
"removed": []
},
"resources": {
"added": [],
"edited": [],
"removed": []
}
}
@@ -0,0 +1,23 @@
{
"id": 107799,
"name": "4.7.20 Beta 5",
"steps": {
"queries": false,
"lang": false,
"theme": false,
"themeSettings": false,
"javascript": false,
"emailTemplates": false,
"hooks": false,
"acpSearchKeywords": false,
"settings": false,
"tasks": false,
"modules": false,
"widgets": false,
"customOptions": false,
"customRoutines": false
},
"forceMainUpgrader": false,
"forceManualDownloadNoCiC": false,
"forceManualDownloadCiC": false
}
@@ -0,0 +1,23 @@
{
"id": 107800,
"name": "4.7.20",
"steps": {
"queries": false,
"lang": false,
"theme": true,
"themeSettings": false,
"javascript": true,
"emailTemplates": false,
"hooks": false,
"acpSearchKeywords": false,
"settings": false,
"tasks": false,
"modules": false,
"widgets": false,
"customOptions": false,
"customRoutines": false
},
"forceMainUpgrader": false,
"forceManualDownloadNoCiC": false,
"forceManualDownloadCiC": false
}
@@ -0,0 +1,14 @@
{
"files": {
"added": [],
"edited": [
"nexus\/front\/controllers\/store\/ips.store.currencySelect.js"
],
"removed": []
},
"orders": {
"added": [],
"edited": [],
"removed": []
}
}
@@ -0,0 +1,19 @@
{
"html": {
"added": [],
"edited": [
"front\/store\/chooseCurrency"
],
"removed": []
},
"css": {
"added": [],
"edited": [],
"removed": []
},
"resources": {
"added": [],
"edited": [],
"removed": []
}
}
@@ -0,0 +1,23 @@
{
"id": 107801,
"name": "4.7.20",
"steps": {
"queries": false,
"lang": false,
"theme": false,
"themeSettings": false,
"javascript": false,
"emailTemplates": false,
"hooks": false,
"acpSearchKeywords": false,
"settings": false,
"tasks": false,
"modules": false,
"widgets": false,
"customOptions": false,
"customRoutines": false
},
"forceMainUpgrader": false,
"forceManualDownloadNoCiC": false,
"forceManualDownloadCiC": false
}
@@ -0,0 +1,22 @@
{
"id": 5000050,
"name": "5.0.0",
"steps": {
"queries": false,
"lang": false,
"theme": false,
"themeeditor": true,
"javascript": false,
"emailTemplates": false,
"acpSearchKeywords": false,
"settings": false,
"tasks": false,
"modules": false,
"widgets": false,
"customOptions": false,
"customRoutines": false
},
"forceMainUpgrader": false,
"forceManualDownloadNoCiC": false,
"forceManualDownloadCiC": false
}
@@ -0,0 +1,14 @@
{
"categories": {
"added": [],
"edited": [],
"removed": []
},
"settings": {
"added": [],
"edited": [
"layout_store_view"
],
"removed": []
}
}
@@ -0,0 +1,22 @@
{
"id": 5000051,
"name": "5.0.0",
"steps": {
"queries": false,
"lang": false,
"theme": false,
"themeeditor": true,
"javascript": false,
"emailTemplates": false,
"acpSearchKeywords": false,
"settings": false,
"tasks": false,
"modules": false,
"widgets": false,
"customOptions": false,
"customRoutines": false
},
"forceMainUpgrader": false,
"forceManualDownloadNoCiC": false,
"forceManualDownloadCiC": false
}
@@ -0,0 +1,14 @@
{
"categories": {
"added": [],
"edited": [],
"removed": []
},
"settings": {
"added": [],
"edited": [
"layout_store_view"
],
"removed": []
}
}
@@ -0,0 +1,22 @@
{
"id": 5000052,
"name": "5.0.1",
"steps": {
"queries": false,
"lang": false,
"theme": true,
"themeeditor": true,
"javascript": true,
"emailTemplates": false,
"acpSearchKeywords": false,
"settings": false,
"tasks": false,
"modules": false,
"widgets": false,
"customOptions": false,
"customRoutines": false
},
"forceMainUpgrader": false,
"forceManualDownloadNoCiC": false,
"forceManualDownloadCiC": false
}
@@ -0,0 +1,14 @@
{
"files": {
"added": [],
"edited": [
"nexus\/front\/controllers\/store\/ips.store.currencySelect.js"
],
"removed": []
},
"orders": {
"added": [],
"edited": [],
"removed": []
}
}
@@ -0,0 +1,23 @@
{
"html": {
"added": [],
"edited": [
"admin\/customers\/accountInformation",
"admin\/customers\/accountInformationTablePreview",
"admin\/customers\/altContactsOverview",
"admin\/customers\/altContactsOverviewRows",
"front\/store\/chooseCurrency"
],
"removed": []
},
"css": {
"added": [],
"edited": [],
"removed": []
},
"resources": {
"added": [],
"edited": [],
"removed": []
}
}
@@ -0,0 +1,14 @@
{
"categories": {
"added": [],
"edited": [],
"removed": []
},
"settings": {
"added": [],
"edited": [
"layout_store_view"
],
"removed": []
}
}
@@ -0,0 +1,22 @@
{
"id": 5000053,
"name": "5.0.1",
"steps": {
"queries": false,
"lang": false,
"theme": false,
"themeeditor": true,
"javascript": false,
"emailTemplates": false,
"acpSearchKeywords": false,
"settings": false,
"tasks": false,
"modules": false,
"widgets": false,
"customOptions": false,
"customRoutines": false
},
"forceMainUpgrader": false,
"forceManualDownloadNoCiC": false,
"forceManualDownloadCiC": false
}
@@ -0,0 +1,14 @@
{
"categories": {
"added": [],
"edited": [],
"removed": []
},
"settings": {
"added": [],
"edited": [
"layout_store_view"
],
"removed": []
}
}
@@ -0,0 +1,22 @@
{
"id": 5000054,
"name": "5.0.2",
"steps": {
"queries": false,
"lang": false,
"theme": true,
"themeeditor": true,
"javascript": false,
"emailTemplates": false,
"acpSearchKeywords": false,
"settings": false,
"tasks": false,
"modules": false,
"widgets": false,
"customOptions": false,
"customRoutines": false
},
"forceMainUpgrader": false,
"forceManualDownloadNoCiC": false,
"forceManualDownloadCiC": false
}
@@ -0,0 +1,20 @@
{
"html": {
"added": [],
"edited": [],
"removed": []
},
"css": {
"added": [],
"edited": [
"admin\/invoice.css",
"admin\/invoiceTimeline.css"
],
"removed": []
},
"resources": {
"added": [],
"edited": [],
"removed": []
}
}
@@ -0,0 +1,14 @@
{
"categories": {
"added": [],
"edited": [],
"removed": []
},
"settings": {
"added": [],
"edited": [
"layout_store_view"
],
"removed": []
}
}
@@ -0,0 +1,22 @@
{
"id": 5000055,
"name": "5.0.2",
"steps": {
"queries": false,
"lang": false,
"theme": false,
"themeeditor": true,
"javascript": false,
"emailTemplates": false,
"acpSearchKeywords": false,
"settings": false,
"tasks": false,
"modules": false,
"widgets": false,
"customOptions": false,
"customRoutines": false
},
"forceMainUpgrader": false,
"forceManualDownloadNoCiC": false,
"forceManualDownloadCiC": false
}
@@ -0,0 +1,14 @@
{
"categories": {
"added": [],
"edited": [],
"removed": []
},
"settings": {
"added": [],
"edited": [
"layout_store_view"
],
"removed": []
}
}
@@ -0,0 +1,22 @@
{
"id": 5000056,
"name": "5.0.2",
"steps": {
"queries": false,
"lang": false,
"theme": false,
"themeeditor": true,
"javascript": false,
"emailTemplates": false,
"acpSearchKeywords": false,
"settings": false,
"tasks": false,
"modules": false,
"widgets": false,
"customOptions": false,
"customRoutines": false
},
"forceMainUpgrader": false,
"forceManualDownloadNoCiC": false,
"forceManualDownloadCiC": false
}
@@ -0,0 +1,14 @@
{
"categories": {
"added": [],
"edited": [],
"removed": []
},
"settings": {
"added": [],
"edited": [
"layout_store_view"
],
"removed": []
}
}
@@ -0,0 +1,22 @@
{
"id": 5000057,
"name": "5.0.3",
"steps": {
"queries": false,
"lang": false,
"theme": false,
"themeeditor": true,
"javascript": false,
"emailTemplates": false,
"acpSearchKeywords": false,
"settings": false,
"tasks": false,
"modules": false,
"widgets": false,
"customOptions": false,
"customRoutines": false
},
"forceMainUpgrader": false,
"forceManualDownloadNoCiC": false,
"forceManualDownloadCiC": false
}
@@ -0,0 +1,14 @@
{
"categories": {
"added": [],
"edited": [],
"removed": []
},
"settings": {
"added": [],
"edited": [
"layout_store_view"
],
"removed": []
}
}
@@ -0,0 +1,22 @@
{
"id": 5000058,
"name": "5.0.3",
"steps": {
"queries": false,
"lang": false,
"theme": false,
"themeeditor": true,
"javascript": false,
"emailTemplates": false,
"acpSearchKeywords": false,
"settings": false,
"tasks": false,
"modules": false,
"widgets": false,
"customOptions": false,
"customRoutines": false
},
"forceMainUpgrader": false,
"forceManualDownloadNoCiC": false,
"forceManualDownloadCiC": false
}
@@ -0,0 +1,14 @@
{
"categories": {
"added": [],
"edited": [],
"removed": []
},
"settings": {
"added": [],
"edited": [
"layout_store_view"
],
"removed": []
}
}
@@ -0,0 +1,22 @@
{
"id": 5000059,
"name": "5.0.3",
"steps": {
"queries": false,
"lang": false,
"theme": false,
"themeeditor": true,
"javascript": false,
"emailTemplates": false,
"acpSearchKeywords": false,
"settings": false,
"tasks": false,
"modules": false,
"widgets": false,
"customOptions": false,
"customRoutines": false
},
"forceMainUpgrader": false,
"forceManualDownloadNoCiC": false,
"forceManualDownloadCiC": false
}
@@ -0,0 +1,14 @@
{
"categories": {
"added": [],
"edited": [],
"removed": []
},
"settings": {
"added": [],
"edited": [
"layout_store_view"
],
"removed": []
}
}
@@ -0,0 +1,22 @@
{
"id": 5000060,
"name": "5.0.3",
"steps": {
"queries": false,
"lang": false,
"theme": false,
"themeeditor": true,
"javascript": false,
"emailTemplates": false,
"acpSearchKeywords": false,
"settings": false,
"tasks": false,
"modules": false,
"widgets": false,
"customOptions": false,
"customRoutines": false
},
"forceMainUpgrader": false,
"forceManualDownloadNoCiC": false,
"forceManualDownloadCiC": false
}
@@ -0,0 +1,14 @@
{
"categories": {
"added": [],
"edited": [],
"removed": []
},
"settings": {
"added": [],
"edited": [
"layout_store_view"
],
"removed": []
}
}
@@ -0,0 +1,22 @@
{
"id": 5000061,
"name": "5.0.4 Beta 1",
"steps": {
"queries": false,
"lang": false,
"theme": true,
"themeeditor": true,
"javascript": false,
"emailTemplates": false,
"acpSearchKeywords": false,
"settings": false,
"tasks": false,
"modules": false,
"widgets": false,
"customOptions": false,
"customRoutines": false
},
"forceMainUpgrader": false,
"forceManualDownloadNoCiC": false,
"forceManualDownloadCiC": false
}
@@ -0,0 +1,21 @@
{
"html": {
"added": [],
"edited": [
"front\/clients\/purchase",
"front\/clients\/purchaseList",
"front\/subscription\/row"
],
"removed": []
},
"css": {
"added": [],
"edited": [],
"removed": []
},
"resources": {
"added": [],
"edited": [],
"removed": []
}
}
@@ -0,0 +1,14 @@
{
"categories": {
"added": [],
"edited": [],
"removed": []
},
"settings": {
"added": [],
"edited": [
"layout_store_view"
],
"removed": []
}
}
@@ -0,0 +1,22 @@
{
"id": 5000062,
"name": "5.0.4 Beta 1",
"steps": {
"queries": false,
"lang": false,
"theme": false,
"themeeditor": true,
"javascript": false,
"emailTemplates": false,
"acpSearchKeywords": false,
"settings": false,
"tasks": false,
"modules": false,
"widgets": false,
"customOptions": false,
"customRoutines": false
},
"forceMainUpgrader": false,
"forceManualDownloadNoCiC": false,
"forceManualDownloadCiC": false
}
@@ -0,0 +1,14 @@
{
"categories": {
"added": [],
"edited": [],
"removed": []
},
"settings": {
"added": [],
"edited": [
"layout_store_view"
],
"removed": []
}
}
@@ -0,0 +1,22 @@
{
"id": 5000063,
"name": "5.0.4 Beta 1",
"steps": {
"queries": false,
"lang": false,
"theme": false,
"themeeditor": true,
"javascript": false,
"emailTemplates": false,
"acpSearchKeywords": false,
"settings": false,
"tasks": false,
"modules": false,
"widgets": false,
"customOptions": false,
"customRoutines": false
},
"forceMainUpgrader": false,
"forceManualDownloadNoCiC": false,
"forceManualDownloadCiC": false
}
@@ -0,0 +1,14 @@
{
"categories": {
"added": [],
"edited": [],
"removed": []
},
"settings": {
"added": [],
"edited": [
"layout_store_view"
],
"removed": []
}
}
@@ -0,0 +1,22 @@
{
"id": 5000064,
"name": "5.0.4 Beta 2",
"steps": {
"queries": false,
"lang": false,
"theme": false,
"themeeditor": true,
"javascript": false,
"emailTemplates": false,
"acpSearchKeywords": false,
"settings": false,
"tasks": false,
"modules": false,
"widgets": false,
"customOptions": false,
"customRoutines": false
},
"forceMainUpgrader": false,
"forceManualDownloadNoCiC": false,
"forceManualDownloadCiC": false
}
@@ -0,0 +1,14 @@
{
"categories": {
"added": [],
"edited": [],
"removed": []
},
"settings": {
"added": [],
"edited": [
"layout_store_view"
],
"removed": []
}
}
@@ -0,0 +1,22 @@
{
"id": 5000065,
"name": "5.0.4 Beta 3",
"steps": {
"queries": false,
"lang": false,
"theme": false,
"themeeditor": true,
"javascript": false,
"emailTemplates": false,
"acpSearchKeywords": false,
"settings": false,
"tasks": false,
"modules": false,
"widgets": false,
"customOptions": false,
"customRoutines": false
},
"forceMainUpgrader": false,
"forceManualDownloadNoCiC": false,
"forceManualDownloadCiC": false
}
@@ -0,0 +1,14 @@
{
"categories": {
"added": [],
"edited": [],
"removed": []
},
"settings": {
"added": [],
"edited": [
"layout_store_view"
],
"removed": []
}
}
@@ -0,0 +1,22 @@
{
"id": 5000066,
"name": "5.0.4",
"steps": {
"queries": false,
"lang": false,
"theme": false,
"themeeditor": true,
"javascript": false,
"emailTemplates": false,
"acpSearchKeywords": false,
"settings": false,
"tasks": false,
"modules": false,
"widgets": false,
"customOptions": false,
"customRoutines": false
},
"forceMainUpgrader": false,
"forceManualDownloadNoCiC": false,
"forceManualDownloadCiC": false
}
@@ -0,0 +1,14 @@
{
"categories": {
"added": [],
"edited": [],
"removed": []
},
"settings": {
"added": [],
"edited": [
"layout_store_view"
],
"removed": []
}
}
@@ -0,0 +1,22 @@
{
"id": 5000067,
"name": "5.0.5 Beta 1",
"steps": {
"queries": false,
"lang": false,
"theme": false,
"themeeditor": true,
"javascript": false,
"emailTemplates": false,
"acpSearchKeywords": false,
"settings": false,
"tasks": false,
"modules": false,
"widgets": false,
"customOptions": false,
"customRoutines": false
},
"forceMainUpgrader": false,
"forceManualDownloadNoCiC": false,
"forceManualDownloadCiC": false
}
@@ -0,0 +1,14 @@
{
"categories": {
"added": [],
"edited": [],
"removed": []
},
"settings": {
"added": [],
"edited": [
"layout_store_view"
],
"removed": []
}
}
@@ -0,0 +1,22 @@
{
"id": 5000068,
"name": "5.0.5 Beta 2",
"steps": {
"queries": false,
"lang": false,
"theme": false,
"themeeditor": true,
"javascript": false,
"emailTemplates": false,
"acpSearchKeywords": false,
"settings": false,
"tasks": false,
"modules": false,
"widgets": false,
"customOptions": false,
"customRoutines": false
},
"forceMainUpgrader": false,
"forceManualDownloadNoCiC": false,
"forceManualDownloadCiC": false
}
@@ -0,0 +1,14 @@
{
"categories": {
"added": [],
"edited": [],
"removed": []
},
"settings": {
"added": [],
"edited": [
"layout_store_view"
],
"removed": []
}
}
@@ -0,0 +1,22 @@
{
"id": 5000069,
"name": "5.0.5",
"steps": {
"queries": false,
"lang": false,
"theme": false,
"themeeditor": true,
"javascript": false,
"emailTemplates": false,
"acpSearchKeywords": false,
"settings": false,
"tasks": false,
"modules": false,
"widgets": false,
"customOptions": false,
"customRoutines": false
},
"forceMainUpgrader": false,
"forceManualDownloadNoCiC": false,
"forceManualDownloadCiC": false
}
@@ -0,0 +1,14 @@
{
"categories": {
"added": [],
"edited": [],
"removed": []
},
"settings": {
"added": [],
"edited": [
"layout_store_view"
],
"removed": []
}
}
@@ -0,0 +1,22 @@
{
"id": 5000070,
"name": "5.0.6 Beta 1",
"steps": {
"queries": false,
"lang": true,
"theme": true,
"themeeditor": true,
"javascript": true,
"emailTemplates": false,
"acpSearchKeywords": false,
"settings": false,
"tasks": false,
"modules": false,
"widgets": false,
"customOptions": false,
"customRoutines": false
},
"forceMainUpgrader": true,
"forceManualDownloadNoCiC": false,
"forceManualDownloadCiC": false
}
@@ -0,0 +1,14 @@
{
"files": {
"added": [],
"edited": [],
"removed": []
},
"orders": {
"added": [],
"edited": [
"global\/\/dev\/js\/\/library\/\/jquery"
],
"removed": []
}
}
@@ -0,0 +1,16 @@
{
"normal": {
"added": [
"ext__PackageType",
"extension_packagetype_table",
"extension_packagetype_table_desc"
],
"edited": [],
"removed": []
},
"js": {
"added": [],
"edited": [],
"removed": []
}
}
@@ -0,0 +1,19 @@
{
"html": {
"added": [],
"edited": [
"front\/store\/packageRow"
],
"removed": []
},
"css": {
"added": [],
"edited": [],
"removed": []
},
"resources": {
"added": [],
"edited": [],
"removed": []
}
}
@@ -0,0 +1,14 @@
{
"categories": {
"added": [],
"edited": [],
"removed": []
},
"settings": {
"added": [],
"edited": [
"layout_store_view"
],
"removed": []
}
}
@@ -0,0 +1,22 @@
{
"id": 5000071,
"name": "5.0.6 Beta 2",
"steps": {
"queries": false,
"lang": false,
"theme": true,
"themeeditor": true,
"javascript": false,
"emailTemplates": false,
"acpSearchKeywords": false,
"settings": false,
"tasks": false,
"modules": false,
"widgets": false,
"customOptions": false,
"customRoutines": false
},
"forceMainUpgrader": false,
"forceManualDownloadNoCiC": false,
"forceManualDownloadCiC": false
}
@@ -0,0 +1,20 @@
{
"html": {
"added": [],
"edited": [
"front\/checkout\/confirmAndPay",
"global\/forms\/creditCard"
],
"removed": []
},
"css": {
"added": [],
"edited": [],
"removed": []
},
"resources": {
"added": [],
"edited": [],
"removed": []
}
}
@@ -0,0 +1,14 @@
{
"categories": {
"added": [],
"edited": [],
"removed": []
},
"settings": {
"added": [],
"edited": [
"layout_store_view"
],
"removed": []
}
}
@@ -0,0 +1,22 @@
{
"id": 5000072,
"name": "5.0.6 Beta 3",
"steps": {
"queries": false,
"lang": false,
"theme": false,
"themeeditor": true,
"javascript": false,
"emailTemplates": false,
"acpSearchKeywords": false,
"settings": false,
"tasks": false,
"modules": false,
"widgets": false,
"customOptions": false,
"customRoutines": false
},
"forceMainUpgrader": false,
"forceManualDownloadNoCiC": false,
"forceManualDownloadCiC": false
}
@@ -0,0 +1,14 @@
{
"categories": {
"added": [],
"edited": [],
"removed": []
},
"settings": {
"added": [],
"edited": [
"layout_store_view"
],
"removed": []
}
}
@@ -0,0 +1,22 @@
{
"id": 5000073,
"name": "5.0.6 Beta 4",
"steps": {
"queries": false,
"lang": false,
"theme": false,
"themeeditor": true,
"javascript": false,
"emailTemplates": false,
"acpSearchKeywords": false,
"settings": false,
"tasks": false,
"modules": false,
"widgets": false,
"customOptions": false,
"customRoutines": false
},
"forceMainUpgrader": false,
"forceManualDownloadNoCiC": false,
"forceManualDownloadCiC": false
}
@@ -0,0 +1,14 @@
{
"categories": {
"added": [],
"edited": [],
"removed": []
},
"settings": {
"added": [],
"edited": [
"layout_store_view"
],
"removed": []
}
}
@@ -0,0 +1,22 @@
{
"id": 5000074,
"name": "5.0.6",
"steps": {
"queries": false,
"lang": false,
"theme": false,
"themeeditor": true,
"javascript": false,
"emailTemplates": false,
"acpSearchKeywords": false,
"settings": false,
"tasks": false,
"modules": false,
"widgets": false,
"customOptions": false,
"customRoutines": false
},
"forceMainUpgrader": false,
"forceManualDownloadNoCiC": false,
"forceManualDownloadCiC": false
}
@@ -0,0 +1,14 @@
{
"categories": {
"added": [],
"edited": [],
"removed": []
},
"settings": {
"added": [],
"edited": [
"layout_store_view"
],
"removed": []
}
}
@@ -15,6 +15,7 @@ namespace IPS\nexus\Form;
use DateInterval;
use IPS\Helpers\Form\FormAbstract;
use IPS\Math\Number;
use IPS\Member;
use IPS\nexus\Money;
use IPS\nexus\Purchase\RenewalTerm as RenewalTermClass;
@@ -126,7 +127,14 @@ class RenewalTerm extends FormAbstract
/* If we have no price specified, stop here */
if( $costs === NULL OR ( is_array( $costs ) AND !count( $costs ) ) )
{
return null;
if( $this->options['lockPrice'] )
{
$costs = new Money( new Number( "0" ), $currency );
}
else
{
return null;
}
}
/* Work out term */
+11 -22
View File
@@ -128,6 +128,11 @@ abstract class Gateway extends Model
* @brief [Node] Title prefix. If specified, will look for a language key with "{$key}_title" as the key
*/
public static ?string $titleLangPrefix = 'nexus_paymethod_';
/**
* @brief [Node] Enabled/Disabled Column
*/
public static ?string $databaseColumnEnabledDisabled = 'active';
/**
* Construct ActiveRecord from database row
@@ -176,28 +181,6 @@ abstract class Gateway extends Model
return $obj;
}
/**
* [Node] Get whether or not this node is enabled
*
* @note Return value NULL indicates the node cannot be enabled/disabled
* @return bool|null
*/
protected function get__enabled(): ?bool
{
return $this->enabled;
}
/**
* [Node] Set whether or not this node is enabled
*
* @param bool|int $enabled Whether to set it enabled or disabled
* @return void
*/
protected function set__enabled( bool|int $enabled ) : void
{
$this->enabled = $enabled;
}
/**
* @brief [Node] ACP Restrictions
* @code
@@ -490,6 +473,12 @@ abstract class Gateway extends Model
*/
public function checkValidity(Money $amount, ?GeoLocation $billingAddress = NULL, ?Customer $customer = NULL, array $recurrings = array() ) : bool
{
/* If the gateway is disabled, skip it */
if( !$this->active )
{
return false;
}
if ( $this->countries !== '*' )
{
if ( $billingAddress )
@@ -505,7 +505,7 @@ class PayPal extends Gateway
/* Send the request */
try
{
$response = $this->api( 'checkout/orders', [
$intent = [
'intent' => 'AUTHORIZE',
'purchase_units' => $this->_getPurchaseUnits( $transaction ),
'payment_source' => [
@@ -515,16 +515,23 @@ class PayPal extends Gateway
'cancel_url' => (string)$transaction->invoice->checkoutUrl(),
],
'email_address' => $transaction->member->email,
'name' => [
'given_name' => $this->_getFirstName( $transaction ),
'surname' => $this->_getLastName( $transaction )
],
'address' => ( $transaction->invoice->billaddress instanceof GeoLocation ) ? $this->_getAddress( $transaction->invoice->billaddress, $transaction->member ) : null,
]
]
], 'POST', true, null, md5( $transaction->invoice->checkoutUrl() . ';' . $transaction->id ), 2 );
];
try
{
$intent['payment_source']['paypal']['name'] = [
'given_name' => $this->_getFirstName( $transaction ),
'surname' => $this->_getLastName( $transaction )
];
}
catch( UnexpectedValueException ){}
$response = $this->api( 'checkout/orders', $intent, 'POST', true, null, md5( $transaction->invoice->checkoutUrl() . ';' . $transaction->id ), 2 );
}
catch(PayPal\Exception $e )
catch( PayPal\Exception $e )
{
$this->processException( $transaction, $e );
throw $e;
@@ -645,14 +652,10 @@ class PayPal extends Gateway
$plan = $this->api( 'billing/plans', $planDetails );
/* Create a subscription */
$subscription = $this->api( 'billing/subscriptions', array(
$planData = array(
'plan_id' => $plan['id'],
'quantity' => '1',
'subscriber' => array(
'name' => array(
'given_name' => $this->_getFirstName( $transaction ),
'surname' => $this->_getLastName( $transaction )
),
'email_address' => $transaction->member->email,
),
'application_context' => array(
@@ -668,7 +671,21 @@ class PayPal extends Gateway
'cancel_url' => (string) $transaction->invoice->checkoutUrl(),
'return_url' => Settings::i()->base_url . 'applications/nexus/interface/gateways/paypal.php?subscription=1&nexusTransactionId=' . $transaction->id,
)
) );
);
if( $transaction->invoice->hasItemsRequiringBillingAddress() )
{
try
{
$planData['subscriber']['name'] = array(
'given_name' => $this->_getFirstName( $transaction ),
'surname' => $this->_getLastName( $transaction )
);
}
catch( UnexpectedValueException ){}
}
$subscription = $this->api( 'billing/subscriptions', $planData );
/* Redirect */
foreach ( $subscription['links'] as $link )
@@ -1250,27 +1267,43 @@ class PayPal extends Gateway
/* Return */
return $address;
}
/**
* Get first name for PayPal
*
* @param Transaction $transaction Transaction
* @return string
* @throws UnexpectedValueException
*/
protected function _getFirstName( Transaction $transaction ) : string
{
return $transaction->invoice->member->member_id ? $transaction->invoice->member->cm_first_name : $transaction->invoice->guest_data['member']['cm_first_name'];
$name = $transaction->invoice->member->member_id ? $transaction->invoice->member->cm_first_name : $transaction->invoice->guest_data['member']['cm_first_name'];
if( empty( $name ) )
{
throw new UnexpectedValueException;
}
return $name;
}
/**
* Get last name for PayPal
*
* @param Transaction $transaction Transaction
* @return string
* @throws UnexpectedValueException
*/
protected function _getLastName( Transaction $transaction ) : string
{
return $transaction->invoice->member->member_id ? $transaction->invoice->member->cm_last_name : $transaction->invoice->guest_data['member']['cm_last_name'];
$name = $transaction->invoice->member->member_id ? $transaction->invoice->member->cm_last_name : $transaction->invoice->guest_data['member']['cm_last_name'];
if( empty( $name ) )
{
throw new UnexpectedValueException;
}
return $name;
}
/**
@@ -55,6 +55,7 @@ use function in_array;
use function intval;
use function is_numeric;
use function is_string;
use function str_starts_with;
use function strlen;
use const IPS\CIC;
use const IPS\LONG_REQUEST_TIMEOUT;
@@ -89,6 +90,19 @@ class Stripe extends Gateway
{
$settings = json_decode( $this->settings, TRUE );
/* Check if we are using test or live keys */
if( \IPS\NEXUS_TEST_GATEWAYS )
{
if( !str_starts_with( $settings['secret_key'], 'sk_test_' ) or !str_starts_with( $settings['publishable_key'], 'pk_test_' ) )
{
return false;
}
}
elseif( !str_starts_with( $settings['secret_key'], 'sk_live_' ) or !str_starts_with( $settings['publishable_key'], 'pk_live_' ) )
{
return false;
}
/* Stripe has a minimum transaction fee. This is based on the businesses currency, but as we don't know what the transaction rate is
we'll do this check only in the transactions we know - anything else will be rejected when the user tries to pay */
switch ( $amount->currency )
@@ -15,6 +15,7 @@ namespace IPS\nexus\Gateway;
use Exception;
use InvalidArgumentException;
use IPS\GeoLocation;
use IPS\Helpers\Form;
use IPS\nexus\Customer;
use IPS\nexus\Gateway;
@@ -41,6 +42,25 @@ class Test extends Gateway
const SUPPORTS_PARTIAL_REFUNDS = TRUE;
/* !Payment Gateway */
/**
* Check the gateway can process this...
*
* @param $amount Money The amount
* @param $billingAddress GeoLocation|NULL The billing address, which may be NULL if one if not provided
* @param $customer Customer|null The customer (Default NULL value is for backwards compatibility - it should always be provided.)
* @param array $recurrings Details about recurring costs
* @return bool
*/
public function checkValidity( Money $amount, ?GeoLocation $billingAddress = NULL, ?Customer $customer = NULL, array $recurrings = array() ) : bool
{
if( !NEXUS_TEST_GATEWAYS )
{
return false;
}
return parent::checkValidity( $amount, $billingAddress, $customer, $recurrings );
}
/**
* Payment Screen Fields
+2 -2
View File
@@ -231,7 +231,7 @@ class Item extends ContentItem implements Embeddable
* @param array $where Where clause
* @param string|null $order MySQL ORDER BY clause (NULL to order by date)
* @param int|array|null $limit Limit clause
* @param string $permissionKey A key which has a value in the permission map (either of the container or of this class) matching a column ID in core_permission_index or NULL to ignore permissions
* @param string|null $permissionKey A key which has a value in the permission map (either of the container or of this class) matching a column ID in core_permission_index or NULL to ignore permissions
* @param int|bool|null $includeHiddenItems Include hidden items? NULL to detect if currently logged in member has permission, -1 to return public content only, TRUE to return unapproved content and FALSE to only return unapproved content the viewing member submitted
* @param int $queryFlags Select bitwise flags
* @param Member|null $member The member (NULL to use currently logged in member)
@@ -248,7 +248,7 @@ class Item extends ContentItem implements Embeddable
* @param array|null $location Array of item lat and long
* @return ActiveRecordIterator|int
*/
public static function getItemsWithPermission( array $where=array(), string $order=NULL, int|array|null $limit=10, string $permissionKey='read', int|bool|null $includeHiddenItems= Filter::FILTER_AUTOMATIC, int $queryFlags=0, ?Member $member=null, bool $joinContainer=FALSE, bool $joinComments=FALSE, bool $joinReviews=FALSE, bool $countOnly=FALSE, array|null $joins=null, bool|Model $skipPermission=FALSE, bool $joinTags=TRUE, bool $joinAuthor=TRUE, bool $joinLastCommenter=TRUE, bool $showMovedLinks=FALSE, array|null $location=null ): ActiveRecordIterator|int
public static function getItemsWithPermission( array $where=array(), string $order=NULL, int|array|null $limit=10, ?string $permissionKey='read', int|bool|null $includeHiddenItems= Filter::FILTER_AUTOMATIC, int $queryFlags=0, ?Member $member=null, bool $joinContainer=FALSE, bool $joinComments=FALSE, bool $joinReviews=FALSE, bool $countOnly=FALSE, array|null $joins=null, bool|Model $skipPermission=FALSE, bool $joinTags=TRUE, bool $joinAuthor=TRUE, bool $joinLastCommenter=TRUE, bool $showMovedLinks=FALSE, array|null $location=null ): ActiveRecordIterator|int
{
$member = $member ?: Member::loggedIn();
+13 -4
View File
@@ -148,10 +148,17 @@ class Package extends Model
*/
public static function packageTypes() : array
{
return array(
$return = array(
'Product' => 'IPS\nexus\Package\Product',
'Ad' => 'IPS\nexus\Package\Ad'
);
foreach( Application::allExtensions( 'nexus', 'PackageType', null, null, null, false ) as $key => $ext )
{
$return[ $key ] = $ext;
}
return $return;
}
/* !ActiveRecord */
@@ -621,7 +628,7 @@ class Package extends Model
catch ( OutOfRangeException ) { }
}
return static::lowestPriceFromData( $customer, $currency, $this->id, json_decode( $this->base_price, TRUE ), json_decode( $this->discounts, TRUE ), $renewOptions, $this->stock, $tax, $priceMayChange, $priceNotIncludingDiscounts, $relevantRenewalTerm );
return static::lowestPriceFromData( $customer, $currency, $this->id, json_decode( $this->base_price, TRUE ), ( $this->discounts ? json_decode( $this->discounts, TRUE ) : [] ), $renewOptions, $this->stock, $tax, $priceMayChange, $priceNotIncludingDiscounts, $relevantRenewalTerm );
}
/**
@@ -1105,7 +1112,7 @@ class Package extends Model
);
}
return NULL;
return parent::get__badge();
}
/**
@@ -1330,7 +1337,9 @@ class Package extends Model
$form->addHeader( 'package_renewals' );
$form->add( new YesNo( 'p_renews', !empty( $renewOptions ), FALSE, array( 'togglesOn' => array( 'p_initial_term', 'p_renew_options', 'p_grace_period', 'p_renew', ( $this->id ? "form_{$this->id}" : 'form_new' ) . '_header_package_client_area_renewals', 'p_email_expire_soon_type', 'p_email_expire_type' ) ), NULL, NULL, NULL, 'p_renews' ) );
$form->add( new \IPS\nexus\Form\RenewalTerm( 'p_initial_term', $this->initial_term ?: NULL, FALSE, array( 'initialTerm' => TRUE, 'initialTermLang' => 'term_same_as_renewal', 'lockPrice' => TRUE ), NULL, NULL, NULL, 'p_initial_term' ) );
/* The price is ignored on this field anyway, so we can hard-code to $0 */
$form->add( new \IPS\nexus\Form\RenewalTerm( 'p_initial_term', $this->initial_term ? new RenewalTerm( new Money( "0", "USD" ), new DateInterval( "P" . $this->initial_term ) ) : NULL, FALSE, array( 'initialTerm' => TRUE, 'initialTermLang' => 'term_same_as_renewal', 'lockPrice' => TRUE ), NULL, NULL, NULL, 'p_initial_term' ) );
$form->add( new Stack( 'p_renew_options', $renewOptions, FALSE, array(
'stackFieldType' => 'IPS\nexus\Form\RenewalTerm',
'allCurrencies' => TRUE,
@@ -709,6 +709,20 @@ class Package extends Model
return new Money( $priceOfThisPackage - $priceOfExistingPackage, $currency );
}
}
/* If the purchase is expired, charge the full amount */
if( !$purchase->active or ( $purchase->expire instanceof DateTime and $purchase->expire->getTimestamp() < time() ) )
{
$newPrice = new Money( $priceOfThisPackage, $currency );
/* If the package has a free trial, charge the renewal fee instead to stop endless free trials */
if( $newPrice->amount->isZero() )
{
return new Money( $renewalOptionsOnNewPackage['cost'][ $currency ]['amount'], $currency );
}
return new Money( $priceOfThisPackage, $currency );
}
/* It's a recurring subscription */
if ( $priceOfThisPackage >= $priceOfExistingPackage )
@@ -729,20 +743,6 @@ class Package extends Model
return new Money( 0, $currency );
case 1:
/* If the purchase is expired, charge the full amount */
if( !$purchase->active or ( $purchase->expire instanceof DateTime and $purchase->expire->getTimestamp() < time() ) )
{
$newPrice = new Money( $priceOfThisPackage, $currency );
/* If the package has a free trial, charge the renewal fee instead to stop endless free trials */
if( $newPrice->amount->isZero() )
{
return new Money( $renewalOptionsOnNewPackage['cost'][ $currency ]['amount'], $currency );
}
return new Money( $priceOfThisPackage, $currency );
}
return new Money( $priceOfThisPackage - $priceOfExistingPackage, $currency );
case 2:
@@ -227,7 +227,7 @@ class generateRenewalInvoices extends Task
try
{
$gateway = Gateway::load( $paymentMethodId );
if( $gateway::SUPPORTS_AUTOPAY )
if( $gateway::SUPPORTS_AUTOPAY and $gateway->checkValidity( $invoice->amountToPay() ) )
{
foreach( $gateway->autopay( $invoice ) as $transaction )
{