Version 5.0.0 beta 1

This commit is contained in:
Neo committed 2025-12-19 16:27:35 -08:00
1 parent 25ddeb65d6
commit 15c7beabc5
6736 files changed
+627902 -497943

No files matched your search

@@ -12,38 +12,56 @@
namespace IPS\nexus\modules\front\clients;
/* To prevent PHP errors (extending class does not exist) revealing path */
if ( !\defined( '\IPS\SUITE_UNIQUE_KEY' ) )
use IPS\Db;
use IPS\Dispatcher\Controller;
use IPS\Helpers\Form;
use IPS\Http\Url;
use IPS\Member;
use IPS\MFA\MFAHandler;
use IPS\nexus\Customer;
use IPS\nexus\Customer\Address;
use IPS\nexus\Tax;
use IPS\Output;
use IPS\Patterns\ActiveRecordIterator;
use IPS\Request;
use IPS\Session;
use IPS\Theme;
use OutOfRangeException;
use function defined;
if ( !defined( '\IPS\SUITE_UNIQUE_KEY' ) )
{
header( ( isset( $_SERVER['SERVER_PROTOCOL'] ) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.0' ) . ' 403 Forbidden' );
header( ( $_SERVER['SERVER_PROTOCOL'] ?? 'HTTP/1.0' ) . ' 403 Forbidden' );
exit;
}
/**
* Addresses
*/
class _addresses extends \IPS\Dispatcher\Controller
class addresses extends Controller
{
/**
* Execute
*
* @return void
*/
public function execute()
public function execute() : void
{
if ( !\IPS\Member::loggedIn()->member_id )
if ( !Member::loggedIn()->member_id )
{
\IPS\Output::i()->error( 'no_module_permission_guest', '2X235/1', 403, '' );
Output::i()->error( 'no_module_permission_guest', '2X235/1', 403, '' );
}
\IPS\Output::i()->jsFiles = array_merge( \IPS\Output::i()->jsFiles, \IPS\Output::i()->js( 'global_forms.js', 'nexus', 'global' ) );
\IPS\Output::i()->cssFiles = array_merge( \IPS\Output::i()->cssFiles, \IPS\Theme::i()->css( 'clients.css', 'nexus' ) );
\IPS\Output::i()->breadcrumb[] = array( \IPS\Http\Url::internal( 'app=nexus&module=clients&controller=addresses', 'front', 'clientsaddresses' ), \IPS\Member::loggedIn()->language()->addToStack('client_addresses') );
\IPS\Output::i()->title = \IPS\Member::loggedIn()->language()->addToStack('client_addresses');
\IPS\Output::i()->sidebar['enabled'] = FALSE;
Output::i()->jsFiles = array_merge( Output::i()->jsFiles, Output::i()->js( 'global_forms.js', 'nexus', 'global' ) );
Output::i()->cssFiles = array_merge( Output::i()->cssFiles, Theme::i()->css( 'clients.css', 'nexus' ) );
Output::i()->breadcrumb[] = array( Url::internal( 'app=nexus&module=clients&controller=addresses', 'front', 'clientsaddresses' ), Member::loggedIn()->language()->addToStack('client_addresses') );
Output::i()->title = Member::loggedIn()->language()->addToStack('client_addresses');
Output::i()->sidebar['enabled'] = FALSE;
if ( $output = \IPS\MFA\MFAHandler::accessToArea( 'nexus', 'Addresses', \IPS\Http\Url::internal( 'app=nexus&module=clients&controller=addresses', 'front', 'clientsaddresses' ) ) )
if ( $output = MFAHandler::accessToArea( 'nexus', 'Addresses', Url::internal( 'app=nexus&module=clients&controller=addresses', 'front', 'clientsaddresses' ) ) )
{
\IPS\Output::i()->output = \IPS\Theme::i()->getTemplate('clients')->addresses( NULL, NULL, array() ) . $output;
Output::i()->output = Theme::i()->getTemplate('clients')->addresses( NULL, NULL, array() ) . $output;
return;
}
@@ -55,11 +73,10 @@ class _addresses extends \IPS\Dispatcher\Controller
*
* @return void
*/
protected function manage()
protected function manage() : void
{
$addresses = new \IPS\Patterns\ActiveRecordIterator( \IPS\Db::i()->select( '*', 'nexus_customer_addresses', array( '`member`=?', \IPS\Member::loggedIn()->member_id ) ), 'IPS\nexus\Customer\Address' );
$addresses = new ActiveRecordIterator( Db::i()->select( '*', 'nexus_customer_addresses', array( '`member`=?', Member::loggedIn()->member_id ) ), 'IPS\nexus\Customer\Address' );
$shippingAddress = NULL;
$billingAddress = NULL;
$otherAddresses = array();
@@ -69,19 +86,13 @@ class _addresses extends \IPS\Dispatcher\Controller
{
$billingAddress = $address;
}
if( $address->primary_shipping )
{
$shippingAddress = $address;
}
if( !$address->primary_shipping && !$address->primary_billing )
else
{
$otherAddresses[] = $address;
}
}
\IPS\Output::i()->output = \IPS\Theme::i()->getTemplate('clients')->addresses( $billingAddress, $shippingAddress, $otherAddresses );
Output::i()->output = Theme::i()->getTemplate('clients')->addresses( $billingAddress, $otherAddresses );
}
/**
@@ -89,27 +100,27 @@ class _addresses extends \IPS\Dispatcher\Controller
*
* @return void
*/
protected function form()
protected function form() : void
{
$existing = NULL;
if ( isset( \IPS\Request::i()->id ) )
if ( isset( Request::i()->id ) )
{
try
{
$existing = \IPS\nexus\Customer\Address::load( \IPS\Request::i()->id );
if ( $existing->member->member_id != \IPS\Member::loggedIn()->member_id )
$existing = Address::load( Request::i()->id );
if ( $existing->member->member_id != Member::loggedIn()->member_id )
{
throw new \OutOfRangeException;
throw new OutOfRangeException;
}
}
catch ( \OutOfRangeException $e )
catch ( OutOfRangeException )
{
$existing = NULL;
}
}
$needTaxStatus = NULL;
foreach ( \IPS\nexus\Tax::roots() as $tax )
foreach ( Tax::roots() as $tax )
{
if ( $tax->type === 'eu' )
{
@@ -124,41 +135,40 @@ class _addresses extends \IPS\Dispatcher\Controller
$addressHelperClass = $needTaxStatus ? 'IPS\nexus\Form\BusinessAddress' : 'IPS\Helpers\Form\Address';
$addressHelperOptions = ( $needTaxStatus === 'eu' ) ? array( 'vat' => TRUE ) : array();
$form = new \IPS\Helpers\Form;
$form->add( new $addressHelperClass( 'address', $existing ? $existing->address : NULL, TRUE, $addressHelperOptions ) );
$form = new Form;
$form->add( new $addressHelperClass( 'address', $existing?->address, TRUE, $addressHelperOptions ) );
if ( $values = $form->values() )
{
if ( !$existing )
{
$existing = new \IPS\nexus\Customer\Address;
$existing->member = \IPS\Member::loggedIn();
$existing->primary_billing = !\IPS\Db::i()->select( 'count(*)', 'nexus_customer_addresses', array( '`member`=? AND primary_billing=1', \IPS\Member::loggedIn()->member_id ) )->first();
$existing->primary_shipping = !\IPS\Db::i()->select( 'count(*)', 'nexus_customer_addresses', array( '`member`=? AND primary_shipping=1', \IPS\Member::loggedIn()->member_id ) )->first();
\IPS\nexus\Customer::loggedIn()->log( 'address', array( 'type' => 'add', 'details' => json_encode( $values['address'] ) ) );
$existing = new Address;
$existing->member = Member::loggedIn();
$existing->primary_billing = !Db::i()->select( 'count(*)', 'nexus_customer_addresses', array( '`member`=? AND primary_billing=1', Member::loggedIn()->member_id ) )->first();
Customer::loggedIn()->log( 'address', array( 'type' => 'add', 'details' => json_encode( $values['address'] ) ) );
}
else
{
\IPS\nexus\Customer::loggedIn()->log( 'address', array( 'type' => 'edit', 'new' => json_encode( $values['address'] ), 'old' => json_encode( $existing->address ) ) );
Customer::loggedIn()->log( 'address', array( 'type' => 'edit', 'new' => json_encode( $values['address'] ), 'old' => json_encode( $existing->address ) ) );
}
$existing->address = $values['address'];
$existing->save();
\IPS\Request::i()->setCookie( 'location', NULL );
Request::i()->setCookie( 'location', NULL );
\IPS\Output::i()->redirect( \IPS\Http\Url::internal( 'app=nexus&module=clients&controller=addresses', 'front', 'clientsaddresses' ) );
Output::i()->redirect( Url::internal( 'app=nexus&module=clients&controller=addresses', 'front', 'clientsaddresses' ) );
}
if ( \IPS\Request::i()->isAjax() )
if ( Request::i()->isAjax() )
{
$form->class = 'ipsForm_vertical ipsForm_noLabels';
\IPS\Output::i()->sendOutput( $form->customTemplate( array( \IPS\Theme::i()->getTemplate( 'forms', 'core' ), 'popupTemplate' ) ) );
$form->class = 'ipsForm--vertical ipsForm--edit-address ipsForm--noLabels';
Output::i()->sendOutput( $form->customTemplate( array( Theme::i()->getTemplate( 'forms', 'core' ), 'popupTemplate' ) ) );
}
else
{
\IPS\Output::i()->output = $form;
Output::i()->output = $form;
}
}
@@ -167,28 +177,27 @@ class _addresses extends \IPS\Dispatcher\Controller
*
* @return void
*/
protected function primary()
protected function primary() : void
{
\IPS\Session::i()->csrfCheck();
Session::i()->csrfCheck();
try
{
$address = \IPS\nexus\Customer\Address::load( \IPS\Request::i()->id );
if ( $address->member->member_id == \IPS\Member::loggedIn()->member_id )
$address = Address::load( Request::i()->id );
if ( $address->member->member_id == Member::loggedIn()->member_id )
{
$field = \IPS\Request::i()->primary === 'billing' ? 'primary_billing' : 'primary_shipping';
\IPS\Db::i()->update( 'nexus_customer_addresses', array( $field => 0 ), array( '`member`=?', \IPS\Member::loggedIn()->member_id ) );
$address->$field = TRUE;
Db::i()->update( 'nexus_customer_addresses', array( 'primary_billing' => 0 ), array( '`member`=?', Member::loggedIn()->member_id ) );
$address->primary_billing = TRUE;
$address->save();
\IPS\nexus\Customer::loggedIn()->log( 'address', array( 'type' => ( \IPS\Request::i()->primary === 'billing' ? 'primary_billing' : 'primary_shipping' ), 'details' => json_encode( $address->address ) ) );
Customer::loggedIn()->log( 'address', array( 'type' => 'primary_billing', 'details' => json_encode( $address->address ) ) );
}
}
catch ( \OutOfRangeException $e ) {}
catch ( OutOfRangeException ) {}
\IPS\Request::i()->setCookie( 'location', NULL );
Request::i()->setCookie( 'location', NULL );
\IPS\Output::i()->redirect( \IPS\Http\Url::internal( 'app=nexus&module=clients&controller=addresses', 'front', 'clientsaddresses' ) );
Output::i()->redirect( Url::internal( 'app=nexus&module=clients&controller=addresses', 'front', 'clientsaddresses' ) );
}
/**
@@ -196,24 +205,24 @@ class _addresses extends \IPS\Dispatcher\Controller
*
* @return void
*/
protected function delete()
protected function delete() : void
{
\IPS\Session::i()->csrfCheck();
Session::i()->csrfCheck();
/* Make sure the user confirmed the deletion */
\IPS\Request::i()->confirmedDelete();
Request::i()->confirmedDelete();
try
{
$address = \IPS\nexus\Customer\Address::load( \IPS\Request::i()->id );
if ( $address->member->member_id == \IPS\Member::loggedIn()->member_id )
$address = Address::load( Request::i()->id );
if ( $address->member->member_id == Member::loggedIn()->member_id )
{
$address->delete();
\IPS\nexus\Customer::loggedIn()->log( 'address', array( 'type' => 'delete', 'details' => json_encode( $address->address ) ) );
Customer::loggedIn()->log( 'address', array( 'type' => 'delete', 'details' => json_encode( $address->address ) ) );
}
}
catch ( \OutOfRangeException $e ) {}
catch ( OutOfRangeException ) {}
\IPS\Output::i()->redirect( \IPS\Http\Url::internal( 'app=nexus&module=clients&controller=addresses', 'front', 'clientsaddresses' ) );
Output::i()->redirect( Url::internal( 'app=nexus&module=clients&controller=addresses', 'front', 'clientsaddresses' ) );
}
}
@@ -12,155 +12,173 @@
namespace IPS\nexus\modules\front\clients;
/* To prevent PHP errors (extending class does not exist) revealing path */
if ( !\defined( '\IPS\SUITE_UNIQUE_KEY' ) )
use DomainException;
use IPS\Db;
use IPS\Dispatcher\Controller;
use IPS\Helpers\Form;
use IPS\Helpers\Form\Checkbox;
use IPS\Helpers\Form\Email;
use IPS\Helpers\Form\Node;
use IPS\Http\Url;
use IPS\Member;
use IPS\MFA\MFAHandler;
use IPS\nexus\Customer;
use IPS\nexus\Customer\AlternativeContact;
use IPS\Output;
use IPS\Request;
use IPS\Session;
use IPS\Theme;
use UnderflowException;
use function defined;
if ( !defined( '\IPS\SUITE_UNIQUE_KEY' ) )
{
header( ( isset( $_SERVER['SERVER_PROTOCOL'] ) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.0' ) . ' 403 Forbidden' );
header( ( $_SERVER['SERVER_PROTOCOL'] ?? 'HTTP/1.0' ) . ' 403 Forbidden' );
exit;
}
/**
* Alternative Contacts
*/
class _alternatives extends \IPS\Dispatcher\Controller
class alternatives extends Controller
{
/**
* Execute
*
* @return void
*/
public function execute()
public function execute() : void
{
if ( !\IPS\Member::loggedIn()->member_id )
if ( !Member::loggedIn()->member_id )
{
\IPS\Output::i()->error( 'no_module_permission_guest', '2X237/1', 403, '' );
Output::i()->error( 'no_module_permission_guest', '2X237/1', 403, '' );
}
\IPS\Output::i()->cssFiles = array_merge( \IPS\Output::i()->cssFiles, \IPS\Theme::i()->css( 'clients.css', 'nexus' ) );
\IPS\Output::i()->breadcrumb[] = array( \IPS\Http\Url::internal( 'app=nexus&module=clients&controller=alternatives', 'front', 'clientsalternatives' ), \IPS\Member::loggedIn()->language()->addToStack('client_alternatives') );
\IPS\Output::i()->title = \IPS\Member::loggedIn()->language()->addToStack('client_alternatives');
\IPS\Output::i()->sidebar['enabled'] = FALSE;
if ( $output = \IPS\MFA\MFAHandler::accessToArea( 'nexus', 'Alternatives', \IPS\Http\Url::internal( 'app=nexus&module=clients&controller=alternatives', 'front', 'clientsalternatives' ) ) )
Output::i()->cssFiles = array_merge( Output::i()->cssFiles, Theme::i()->css( 'clients.css', 'nexus' ) );
Output::i()->breadcrumb[] = array( Url::internal( 'app=nexus&module=clients&controller=alternatives', 'front', 'clientsalternatives' ), Member::loggedIn()->language()->addToStack('client_alternatives') );
Output::i()->title = Member::loggedIn()->language()->addToStack('client_alternatives');
Output::i()->sidebar['enabled'] = FALSE;
if ( $output = MFAHandler::accessToArea( 'nexus', 'Alternatives', Url::internal( 'app=nexus&module=clients&controller=alternatives', 'front', 'clientsalternatives' ) ) )
{
\IPS\Output::i()->output = \IPS\Theme::i()->getTemplate('clients')->alternatives( TRUE ) . $output;
Output::i()->output = Theme::i()->getTemplate('clients')->alternatives( TRUE ) . $output;
return;
}
parent::execute();
}
/**
* View List
*
* @return void
*/
protected function manage()
protected function manage() : void
{
foreach ( \IPS\nexus\Customer::loggedIn()->alternativeContacts() as $contact )
foreach ( Customer::loggedIn()->alternativeContacts() as $contact )
{
$contact->alt_id;
}
\IPS\Output::i()->output = \IPS\Theme::i()->getTemplate('clients')->alternatives();
Output::i()->output = Theme::i()->getTemplate('clients')->alternatives();
}
/**
* Add/Edit
*
* @return void
*/
protected function form()
protected function form() : void
{
$existing = NULL;
if ( isset( \IPS\Request::i()->id ) )
if ( isset( Request::i()->id ) )
{
try
{
$existing = \IPS\nexus\Customer\AlternativeContact::constructFromData( \IPS\Db::i()->select( '*', 'nexus_alternate_contacts', array( 'main_id=? AND alt_id=?', \IPS\nexus\Customer::loggedIn()->member_id, \IPS\Request::i()->id ) )->first() );
$existing = AlternativeContact::constructFromData( Db::i()->select( '*', 'nexus_alternate_contacts', array( 'main_id=? AND alt_id=?', Customer::loggedIn()->member_id, Request::i()->id ) )->first() );
}
catch ( \UnderflowException $e ) {}
catch ( UnderflowException ) {}
}
$form = new \IPS\Helpers\Form;
$form->class = 'ipsForm_vertical';
$form = new Form;
$form->class = 'ipsForm--vertical ipsForm--edit-alernatives';
if ( !$existing )
{
$form->add( new \IPS\Helpers\Form\Email( 'altcontact_email', NULL, TRUE, array(), function( $val )
$form->add( new Email( 'altcontact_email', NULL, TRUE, array(), function( $val )
{
if( \IPS\Member::loggedIn()->email == $val )
if( Member::loggedIn()->email == $val )
{
throw new \DomainException('altcontact_email_self');
throw new DomainException('altcontact_email_self');
}
$member = \IPS\Member::load( $val, 'email' );
$member = Member::load( $val, 'email' );
if ( !$member->member_id )
{
throw new \DomainException('altcontact_email_error');
throw new DomainException('altcontact_email_error');
}
try
{
\IPS\Db::i()->select( '*', 'nexus_alternate_contacts', array( 'main_id=? AND alt_id=?', \IPS\nexus\Customer::loggedIn()->member_id, $member->member_id ) )->first();
throw new \DomainException('altcontact_already_exists');
Db::i()->select( '*', 'nexus_alternate_contacts', array( 'main_id=? AND alt_id=?', Customer::loggedIn()->member_id, $member->member_id ) )->first();
throw new DomainException('altcontact_already_exists');
}
catch ( \UnderflowException $e ) {}
catch ( UnderflowException ) {}
} ) );
}
$form->add( new \IPS\Helpers\Form\Node( 'altcontact_purchases', $existing ? iterator_to_array( $existing->purchases ) : NULL, FALSE, array( 'class' => 'IPS\nexus\Purchase', 'forceOwner' => \IPS\Member::loggedIn(), 'multiple' => TRUE ) ) );
$form->add( new \IPS\Helpers\Form\Checkbox( 'altcontact_support', $existing ? $existing->support : FALSE ) );
$form->add( new \IPS\Helpers\Form\Checkbox( 'altcontact_billing', $existing ? $existing->billing : FALSE ) );
$form->add( new Node( 'altcontact_purchases', $existing ? iterator_to_array( $existing->purchases ) : NULL, FALSE, array( 'class' => 'IPS\nexus\Purchase', 'forceOwner' => Member::loggedIn(), 'multiple' => TRUE ) ) );
$form->add( new Checkbox( 'altcontact_billing', $existing ? $existing->billing : FALSE ) );
if ( $values = $form->values() )
{
if ( $existing )
{
$altContact = $existing;
\IPS\nexus\Customer::loggedIn()->log( 'alternative', array( 'type' => 'edit', 'alt_id' => $altContact->alt_id->member_id, 'alt_name' => $altContact->alt_id->name, 'purchases' => json_encode( $values['altcontact_purchases'] ? $values['altcontact_purchases'] : array() ), 'billing' => $values['altcontact_billing'], 'support' => $values['altcontact_support'] ) );
Customer::loggedIn()->log( 'alternative', array( 'type' => 'edit', 'alt_id' => $altContact->alt_id->member_id, 'alt_name' => $altContact->alt_id->name, 'purchases' => json_encode( $values['altcontact_purchases'] ?: array() ), 'billing' => $values['altcontact_billing'] ) );
}
else
{
$altContact = new \IPS\nexus\Customer\AlternativeContact;
$altContact->main_id = \IPS\nexus\Customer::loggedIn();
$altContact->alt_id = \IPS\Member::load( $values['altcontact_email'], 'email' );
\IPS\nexus\Customer::loggedIn()->log( 'alternative', array( 'type' => 'add', 'alt_id' => $altContact->alt_id->member_id, 'alt_name' => $altContact->alt_id->name, 'purchases' => json_encode( $values['altcontact_purchases'] ? $values['altcontact_purchases'] : array() ), 'billing' => $values['altcontact_billing'], 'support' => $values['altcontact_support'] ) );
$altContact = new AlternativeContact;
$altContact->main_id = Customer::loggedIn();
$altContact->alt_id = Member::load( $values['altcontact_email'], 'email' );
Customer::loggedIn()->log( 'alternative', array( 'type' => 'add', 'alt_id' => $altContact->alt_id->member_id, 'alt_name' => $altContact->alt_id->name, 'purchases' => json_encode( $values['altcontact_purchases'] ?: array() ), 'billing' => $values['altcontact_billing'] ) );
}
$altContact->purchases = $values['altcontact_purchases'] ? $values['altcontact_purchases'] : array();
$altContact->purchases = $values['altcontact_purchases'] ?: array();
$altContact->billing = $values['altcontact_billing'];
$altContact->support = $values['altcontact_support'];
$altContact->save();
\IPS\Output::i()->redirect( \IPS\Http\Url::internal( 'app=nexus&module=clients&controller=alternatives', 'front', 'clientsalternatives' ) );
Output::i()->redirect( Url::internal( 'app=nexus&module=clients&controller=alternatives', 'front', 'clientsalternatives' ) );
}
if( \IPS\Request::i()->isAjax() )
if( Request::i()->isAjax() )
{
\IPS\Output::i()->sendOutput( $form->customTemplate( array( \IPS\Theme::i()->getTemplate( 'forms', 'core' ), 'popupTemplate' ) ) );
Output::i()->sendOutput( $form->customTemplate( array( Theme::i()->getTemplate( 'forms', 'core' ), 'popupTemplate' ) ) );
}
else
{
\IPS\Output::i()->output = $form;
}
Output::i()->output = $form;
}
}
/**
* Delete
*
* @return void
*/
protected function delete()
protected function delete() : void
{
\IPS\Session::i()->csrfCheck();
Session::i()->csrfCheck();
/* Make sure the user confirmed the deletion */
\IPS\Request::i()->confirmedDelete();
Request::i()->confirmedDelete();
try
{
$contact = \IPS\nexus\Customer\AlternativeContact::constructFromData( \IPS\Db::i()->select( '*', 'nexus_alternate_contacts', array( 'main_id=? AND alt_id=?', \IPS\nexus\Customer::loggedIn()->member_id, \IPS\Request::i()->id ) )->first() );
$contact = AlternativeContact::constructFromData( Db::i()->select( '*', 'nexus_alternate_contacts', array( 'main_id=? AND alt_id=?', Customer::loggedIn()->member_id, Request::i()->id ) )->first() );
$contact->delete();
\IPS\nexus\Customer::loggedIn()->log( 'alternative', array( 'type' => 'delete', 'alt_id' => $contact->alt_id->member_id, 'alt_name' => $contact->alt_id->name ) );
Customer::loggedIn()->log( 'alternative', array( 'type' => 'delete', 'alt_id' => $contact->alt_id->member_id, 'alt_name' => $contact->alt_id->name ) );
}
catch ( \UnderflowException $e ) {}
\IPS\Output::i()->redirect( \IPS\Http\Url::internal( 'app=nexus&module=clients&controller=alternatives', 'front', 'clientsalternatives' ) );
catch (UnderflowException ) {}
Output::i()->redirect( Url::internal( 'app=nexus&module=clients&controller=alternatives', 'front', 'clientsalternatives' ) );
}
}
@@ -12,37 +12,58 @@
namespace IPS\nexus\modules\front\clients;
/* To prevent PHP errors (extending class does not exist) revealing path */
if ( !\defined( '\IPS\SUITE_UNIQUE_KEY' ) )
use DomainException;
use IPS\Db;
use IPS\Dispatcher\Controller;
use IPS\Http\Url;
use IPS\Member;
use IPS\MFA\MFAHandler;
use IPS\nexus\Customer;
use IPS\nexus\Customer\BillingAgreement;
use IPS\nexus\Gateway\PayPal\Exception;
use IPS\Output;
use IPS\Patterns\ActiveRecordIterator;
use IPS\Request;
use IPS\Session;
use IPS\Theme;
use OutOfRangeException;
use function count;
use function defined;
use function in_array;
use function intval;
if ( !defined( '\IPS\SUITE_UNIQUE_KEY' ) )
{
header( ( isset( $_SERVER['SERVER_PROTOCOL'] ) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.0' ) . ' 403 Forbidden' );
header( ( $_SERVER['SERVER_PROTOCOL'] ?? 'HTTP/1.0' ) . ' 403 Forbidden' );
exit;
}
/**
* Billing Agreements
*/
class _billingagreements extends \IPS\Dispatcher\Controller
class billingagreements extends Controller
{
/**
* Execute
*
* @return void
*/
public function execute()
public function execute() : void
{
if ( !\IPS\Member::loggedIn()->member_id )
if ( !Member::loggedIn()->member_id )
{
\IPS\Output::i()->error( 'no_module_permission_guest', '2X321/1', 403, '' );
Output::i()->error( 'no_module_permission_guest', '2X321/1', 403, '' );
}
\IPS\Output::i()->cssFiles = array_merge( \IPS\Output::i()->cssFiles, \IPS\Theme::i()->css( 'clients.css', 'nexus' ) );
\IPS\Output::i()->breadcrumb[] = array( \IPS\Http\Url::internal( 'app=nexus&module=clients&controller=billingagreements', 'front', 'clientsbillingagreements' ), \IPS\Member::loggedIn()->language()->addToStack('client_billing_agreements') );
\IPS\Output::i()->title = \IPS\Member::loggedIn()->language()->addToStack('client_billing_agreements');
\IPS\Output::i()->sidebar['enabled'] = FALSE;
Output::i()->cssFiles = array_merge( Output::i()->cssFiles, Theme::i()->css( 'clients.css', 'nexus' ) );
Output::i()->breadcrumb[] = array( Url::internal( 'app=nexus&module=clients&controller=billingagreements', 'front', 'clientsbillingagreements' ), Member::loggedIn()->language()->addToStack('client_billing_agreements') );
Output::i()->title = Member::loggedIn()->language()->addToStack('client_billing_agreements');
Output::i()->sidebar['enabled'] = FALSE;
if ( $output = \IPS\MFA\MFAHandler::accessToArea( 'nexus', 'BillingAgreements', \IPS\Http\Url::internal( 'app=nexus&module=clients&controller=billingagreements', 'front', 'clientsbillingagreements' ) ) )
if ( $output = MFAHandler::accessToArea( 'nexus', 'BillingAgreements', Url::internal( 'app=nexus&module=clients&controller=billingagreements', 'front', 'clientsbillingagreements' ) ) )
{
\IPS\Output::i()->output = \IPS\Theme::i()->getTemplate('clients')->billingAgreements( array() ) . $output;
Output::i()->output = Theme::i()->getTemplate('clients')->billingAgreements( array() ) . $output;
return;
}
@@ -54,15 +75,14 @@ class _billingagreements extends \IPS\Dispatcher\Controller
*
* @return void
*/
protected function manage()
protected function manage() : void
{
$billingAgreements = array();
$where = array( 'ba_member=?', \IPS\Member::loggedIn()->member_id );
$parentContacts = \IPS\nexus\Customer::loggedIn()->parentContacts( array( 'billing=1' ) );
if ( \count( $parentContacts ) )
$where = array( 'ba_member=?', Member::loggedIn()->member_id );
$parentContacts = Customer::loggedIn()->parentContacts( array( 'billing=1' ) );
if ( count( $parentContacts ) )
{
$or = array();
foreach ( array_keys( iterator_to_array( $parentContacts ) ) as $id )
{
$where[0] .= ' OR ba_member=?';
@@ -70,13 +90,14 @@ class _billingagreements extends \IPS\Dispatcher\Controller
}
}
foreach ( new \IPS\Patterns\ActiveRecordIterator( \IPS\Db::i()->select( '*', 'nexus_billing_agreements', $where ), 'IPS\nexus\Customer\BillingAgreement' ) as $billingAgreement )
{
foreach ( new ActiveRecordIterator( Db::i()->select( '*', 'nexus_billing_agreements', $where ), 'IPS\nexus\Customer\BillingAgreement' ) as $billingAgreement )
{
/* @var BillingAgreement $billingAgreement */
try
{
$status = $billingAgreement->status();
}
catch ( \Exception $e )
catch ( \Exception )
{
$status = NULL;
}
@@ -85,7 +106,7 @@ class _billingagreements extends \IPS\Dispatcher\Controller
{
$term = $billingAgreement->term();
}
catch ( \Exception $e )
catch ( \Exception )
{
$term = NULL;
}
@@ -98,7 +119,7 @@ class _billingagreements extends \IPS\Dispatcher\Controller
);
}
\IPS\Output::i()->output = \IPS\Theme::i()->getTemplate('clients')->billingAgreements( $billingAgreements );
Output::i()->output = Theme::i()->getTemplate('clients')->billingAgreements( $billingAgreements );
}
/**
@@ -106,48 +127,48 @@ class _billingagreements extends \IPS\Dispatcher\Controller
*
* @return void
*/
protected function view()
protected function view() : void
{
/* Load Billing Agreement */
try
{
$billingAgreement = \IPS\nexus\Customer\BillingAgreement::loadAndCheckPerms( \IPS\Request::i()->id );
$billingAgreement = BillingAgreement::loadAndCheckPerms( Request::i()->id );
$billingAgreement->status(); // Just to make the API call so we can catch the error if there is one
}
catch ( \OutOfRangeException $e )
catch ( OutOfRangeException )
{
\IPS\Output::i()->error( 'node_error', '2X320/4', 404, '' );
Output::i()->error( 'node_error', '2X320/4', 404, '' );
}
catch ( \IPS\nexus\Gateway\PayPal\Exception $e )
catch ( Exception $e )
{
\IPS\Output::i()->error( 'billing_agreement_error', '4X321/5', 500, '', array(), $e->getName() );
Output::i()->error( 'billing_agreement_error', '4X321/5', 500, '', array(), $e->getName() );
}
/* Get associated purchases */
$purchases = array();
foreach( new \IPS\Patterns\ActiveRecordIterator( \IPS\Db::i()->select( '*', 'nexus_purchases', array( 'ps_billing_agreement=?', $billingAgreement->id ) ), 'IPS\nexus\Purchase' ) as $purchase )
foreach( new ActiveRecordIterator( Db::i()->select( '*', 'nexus_purchases', array( 'ps_billing_agreement=?', $billingAgreement->id ) ), 'IPS\nexus\Purchase' ) as $purchase )
{
$purchases[0][ $purchase->id ] = $purchase;
}
/* Transactions */
$currentPage = isset( \IPS\Request::i()->page ) ? \intval( \IPS\Request::i()->page ) : 1;
$currentPage = isset( Request::i()->page ) ? intval( Request::i()->page ) : 1;
$perPage = 25;
$invoices = new \IPS\Patterns\ActiveRecordIterator(
\IPS\Db::i()->select(
$invoices = new ActiveRecordIterator(
Db::i()->select(
'*',
'nexus_invoices',
array( 'i_id IN(?)', \IPS\Db::i()->select( 't_invoice', 'nexus_transactions', array( 't_billing_agreement=?', $billingAgreement->id ) ) ),
array( 'i_id IN(?)', Db::i()->select( 't_invoice', 'nexus_transactions', array( 't_billing_agreement=?', $billingAgreement->id ) ) ),
'i_date DESC',
array( ( $currentPage - 1 ) * $perPage, $perPage )
),
'IPS\nexus\Invoice'
);
$invoicesCount = \IPS\Db::i()->select( 'COUNT(*)', 'nexus_invoices', array( 'i_id IN(?)', \IPS\Db::i()->select( 't_invoice', 'nexus_transactions', array( 't_billing_agreement=?', $billingAgreement->id ) ) ) )->first();
$pagination = \IPS\Theme::i()->getTemplate( 'global', 'core', 'global' )->pagination( $billingAgreement->url(), ceil( $invoicesCount / $perPage ), $currentPage, $perPage );
$invoicesCount = Db::i()->select( 'COUNT(*)', 'nexus_invoices', array( 'i_id IN(?)', Db::i()->select( 't_invoice', 'nexus_transactions', array( 't_billing_agreement=?', $billingAgreement->id ) ) ) )->first();
$pagination = Theme::i()->getTemplate( 'global', 'core', 'global' )->pagination( $billingAgreement->url(), ceil( $invoicesCount / $perPage ), $currentPage, $perPage );
\IPS\Output::i()->breadcrumb[] = array( $billingAgreement->url(), $billingAgreement->gw_id );
\IPS\Output::i()->output = \IPS\Theme::i()->getTemplate('clients')->billingAgreement( $billingAgreement, $purchases, $invoices, $pagination );
Output::i()->breadcrumb[] = array( $billingAgreement->url(), $billingAgreement->gw_id );
Output::i()->output = Theme::i()->getTemplate('clients')->billingAgreement( $billingAgreement, $purchases, $invoices, $pagination );
}
/**
@@ -155,25 +176,25 @@ class _billingagreements extends \IPS\Dispatcher\Controller
*
* @return void
*/
protected function act()
protected function act() : void
{
\IPS\Session::i()->csrfCheck();
Session::i()->csrfCheck();
/* Check act */
$act = \IPS\Request::i()->act;
if ( !\in_array( $act, array( 'suspend', 'reactivate', 'cancel' ) ) )
$act = Request::i()->act;
if ( !in_array( $act, array( 'suspend', 'reactivate', 'cancel' ) ) )
{
\IPS\Output::i()->error( 'node_error', '3X321/3', 403, '' );
Output::i()->error( 'node_error', '3X321/3', 403, '' );
}
/* Load Billing Agreement */
try
{
$billingAgreement = \IPS\nexus\Customer\BillingAgreement::loadAndCheckPerms( \IPS\Request::i()->id );
$billingAgreement = BillingAgreement::loadAndCheckPerms( Request::i()->id );
}
catch ( \OutOfRangeException $e )
catch ( OutOfRangeException )
{
\IPS\Output::i()->error( 'node_error', '2X321/2', 404, '' );
Output::i()->error( 'node_error', '2X321/2', 404, '' );
}
/* Perform Action */
@@ -181,11 +202,11 @@ class _billingagreements extends \IPS\Dispatcher\Controller
{
$billingAgreement->$act();
\IPS\Output::i()->redirect( $billingAgreement->url() );
Output::i()->redirect( $billingAgreement->url() );
}
catch ( \DomainException $e )
catch ( DomainException )
{
\IPS\Output::i()->error( 'billing_agreement_error_public', '3X321/4', 500, '' );
Output::i()->error( 'billing_agreement_error_public', '3X321/4', 500, '' );
}
}
}
@@ -12,37 +12,54 @@
namespace IPS\nexus\modules\front\clients;
/* To prevent PHP errors (extending class does not exist) revealing path */
if ( !\defined( '\IPS\SUITE_UNIQUE_KEY' ) )
use Exception;
use IPS\Db;
use IPS\Dispatcher\Controller;
use IPS\Http\Url;
use IPS\Member;
use IPS\MFA\MFAHandler;
use IPS\nexus\Customer;
use IPS\nexus\Customer\CreditCard;
use IPS\Output;
use IPS\Patterns\ActiveRecordIterator;
use IPS\Request;
use IPS\Session;
use IPS\Theme;
use function defined;
use function is_null;
if ( !defined( '\IPS\SUITE_UNIQUE_KEY' ) )
{
header( ( isset( $_SERVER['SERVER_PROTOCOL'] ) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.0' ) . ' 403 Forbidden' );
header( ( $_SERVER['SERVER_PROTOCOL'] ?? 'HTTP/1.0' ) . ' 403 Forbidden' );
exit;
}
/**
* Cards
*/
class _cards extends \IPS\Dispatcher\Controller
class cards extends Controller
{
/**
* Execute
*
* @return void
*/
public function execute()
public function execute() : void
{
if ( !\IPS\Member::loggedIn()->member_id )
if ( !Member::loggedIn()->member_id )
{
\IPS\Output::i()->error( 'no_module_permission_guest', '2X236/1', 403, '' );
Output::i()->error( 'no_module_permission_guest', '2X236/1', 403, '' );
}
\IPS\Output::i()->cssFiles = array_merge( \IPS\Output::i()->cssFiles, \IPS\Theme::i()->css( 'clients.css', 'nexus' ) );
\IPS\Output::i()->breadcrumb[] = array( \IPS\Http\Url::internal( 'app=nexus&module=clients&controller=cards', 'front', 'clientscards' ), \IPS\Member::loggedIn()->language()->addToStack('client_cards') );
\IPS\Output::i()->title = \IPS\Member::loggedIn()->language()->addToStack('client_cards');
\IPS\Output::i()->sidebar['enabled'] = FALSE;
Output::i()->cssFiles = array_merge( Output::i()->cssFiles, Theme::i()->css( 'clients.css', 'nexus' ) );
Output::i()->breadcrumb[] = array( Url::internal( 'app=nexus&module=clients&controller=cards', 'front', 'clientscards' ), Member::loggedIn()->language()->addToStack('client_cards') );
Output::i()->title = Member::loggedIn()->language()->addToStack('client_cards');
Output::i()->sidebar['enabled'] = FALSE;
if ( $output = \IPS\MFA\MFAHandler::accessToArea( 'nexus', 'Cards', \IPS\Http\Url::internal( 'app=nexus&module=clients&controller=cards', 'front', 'clientscards' ) ) )
if ( $output = MFAHandler::accessToArea( 'nexus', 'Cards', Url::internal( 'app=nexus&module=clients&controller=cards', 'front', 'clientscards' ) ) )
{
\IPS\Output::i()->output = \IPS\Theme::i()->getTemplate('clients')->cards( array() ) . $output;
Output::i()->output = Theme::i()->getTemplate('clients')->cards( array() ) . $output;
return;
}
@@ -54,10 +71,10 @@ class _cards extends \IPS\Dispatcher\Controller
*
* @return void
*/
protected function manage()
protected function manage() : void
{
$cards = array();
foreach ( new \IPS\Patterns\ActiveRecordIterator( \IPS\Db::i()->select( '*', 'nexus_customer_cards', array( 'card_member=?', \IPS\nexus\Customer::loggedIn()->member_id ) ), 'IPS\nexus\Customer\CreditCard' ) as $card )
foreach ( new ActiveRecordIterator( Db::i()->select( '*', 'nexus_customer_cards', array( 'card_member=?', Customer::loggedIn()->member_id ) ), 'IPS\nexus\Customer\CreditCard' ) as $card )
{
try
{
@@ -66,13 +83,13 @@ class _cards extends \IPS\Dispatcher\Controller
'id' => $card->id,
'card_type' => $cardData->type,
'card_number' => $cardData->lastFour ?: $cardData->number,
'card_expire' => ( !\is_null( $cardData->expMonth ) AND !\is_null( $cardData->expYear ) ) ? str_pad( $cardData->expMonth , 2, '0', STR_PAD_LEFT ). '/' . $cardData->expYear : NULL
'card_expire' => ( !is_null( $cardData->expMonth ) AND !is_null( $cardData->expYear ) ) ? str_pad( $cardData->expMonth , 2, '0', STR_PAD_LEFT ). '/' . $cardData->expYear : NULL
);
}
catch ( \Exception $e ) { }
catch ( Exception ) { }
}
\IPS\Output::i()->output = \IPS\Theme::i()->getTemplate('clients')->cards( $cards );
Output::i()->output = Theme::i()->getTemplate('clients')->cards( $cards );
}
/**
@@ -80,19 +97,19 @@ class _cards extends \IPS\Dispatcher\Controller
*
* @return void
*/
public function add()
public function add() : void
{
\IPS\Output::i()->cssFiles = array_merge( \IPS\Output::i()->cssFiles, \IPS\Theme::i()->css( 'checkout.css', 'nexus' ) );
\IPS\Output::i()->jsFiles = array_merge( \IPS\Output::i()->jsFiles, \IPS\Output::i()->js( 'global_gateways.js', 'nexus', 'global' ) );
$form = \IPS\nexus\Customer\CreditCard::create( \IPS\nexus\Customer::loggedIn(), FALSE );
if ( $form instanceof \IPS\nexus\Customer\CreditCard )
Output::i()->cssFiles = array_merge( Output::i()->cssFiles, Theme::i()->css( 'checkout.css', 'nexus' ) );
Output::i()->jsFiles = array_merge( Output::i()->jsFiles, Output::i()->js( 'global_gateways.js', 'nexus', 'global' ) );
$form = CreditCard::create( Customer::loggedIn(), FALSE );
if ( $form instanceof CreditCard )
{
\IPS\nexus\Customer::loggedIn()->log( 'card', array( 'type' => 'add', 'number' => $form->card->lastFour ) );
\IPS\Output::i()->redirect( \IPS\Http\Url::internal( 'app=nexus&module=clients&controller=cards', 'front', 'clientscards' ) );
Customer::loggedIn()->log( 'card', array( 'type' => 'add', 'number' => $form->card->lastFour ) );
Output::i()->redirect( Url::internal( 'app=nexus&module=clients&controller=cards', 'front', 'clientscards' ) );
}
else
{
\IPS\Output::i()->output = $form;
Output::i()->output = $form;
}
}
@@ -101,26 +118,26 @@ class _cards extends \IPS\Dispatcher\Controller
*
* @return void
*/
public function delete()
public function delete() : void
{
\IPS\Session::i()->csrfCheck();
Session::i()->csrfCheck();
/* Make sure the user confirmed the deletion */
\IPS\Request::i()->confirmedDelete();
Request::i()->confirmedDelete();
try
{
$card = \IPS\nexus\Customer\CreditCard::load( \IPS\Request::i()->id );
if ( $card->member->member_id === \IPS\nexus\Customer::loggedIn()->member_id )
$card = CreditCard::load( Request::i()->id );
if ( $card->member->member_id === Customer::loggedIn()->member_id )
{
$cardData = $card->card;
$card->delete();
\IPS\nexus\Customer::loggedIn()->log( 'card', array( 'type' => 'delete', 'number' => $cardData->lastFour ) );
Customer::loggedIn()->log( 'card', array( 'type' => 'delete', 'number' => $cardData->lastFour ) );
}
}
catch ( \Exception $e ) { }
catch ( Exception ) { }
\IPS\Output::i()->redirect( \IPS\Http\Url::internal( 'app=nexus&module=clients&controller=cards', 'front', 'clientscards' ) );
Output::i()->redirect( Url::internal( 'app=nexus&module=clients&controller=cards', 'front', 'clientscards' ) );
}
}
@@ -12,37 +12,72 @@
namespace IPS\nexus\modules\front\clients;
/* To prevent PHP errors (extending class does not exist) revealing path */
if ( !\defined( '\IPS\SUITE_UNIQUE_KEY' ) )
use DateInterval;
use DomainException;
use Exception;
use IPS\core\AdminNotification;
use IPS\DateTime;
use IPS\Db;
use IPS\Dispatcher\Controller;
use IPS\Helpers\Form;
use IPS\Helpers\Form\Number;
use IPS\Helpers\Form\Radio;
use IPS\Http\Url;
use IPS\Member;
use IPS\MFA\MFAHandler;
use IPS\nexus\Customer;
use IPS\nexus\Customer\AlternativeContact;
use IPS\nexus\extensions\nexus\Item\AccountCreditIncrease;
use IPS\nexus\Gateway;
use IPS\nexus\Invoice;
use IPS\nexus\Money;
use IPS\nexus\Payout;
use IPS\Output;
use IPS\Patterns\ActiveRecordIterator;
use IPS\Request;
use IPS\Session;
use IPS\Settings;
use IPS\Theme;
use OutOfRangeException;
use function count;
use function defined;
use function in_array;
use function intval;
use function is_countable;
use function is_null;
if ( !defined( '\IPS\SUITE_UNIQUE_KEY' ) )
{
header( ( isset( $_SERVER['SERVER_PROTOCOL'] ) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.0' ) . ' 403 Forbidden' );
header( ( $_SERVER['SERVER_PROTOCOL'] ?? 'HTTP/1.0' ) . ' 403 Forbidden' );
exit;
}
/**
* Account Credit
*/
class _credit extends \IPS\Dispatcher\Controller
class credit extends Controller
{
/**
* Execute
*
* @return void
*/
public function execute()
public function execute() : void
{
if ( !\IPS\Member::loggedIn()->member_id )
if ( !Member::loggedIn()->member_id )
{
\IPS\Output::i()->error( 'no_module_permission_guest', '2X239/1', 403, '' );
Output::i()->error( 'no_module_permission_guest', '2X239/1', 403, '' );
}
\IPS\Output::i()->cssFiles = array_merge( \IPS\Output::i()->cssFiles, \IPS\Theme::i()->css( 'clients.css', 'nexus' ) );
\IPS\Output::i()->breadcrumb[] = array( \IPS\Http\Url::internal( 'app=nexus&module=clients&controller=credit', 'front', 'clientscredit' ), \IPS\Member::loggedIn()->language()->addToStack('client_credit') );
\IPS\Output::i()->title = \IPS\Member::loggedIn()->language()->addToStack('client_credit');
\IPS\Output::i()->sidebar['enabled'] = FALSE;
Output::i()->cssFiles = array_merge( Output::i()->cssFiles, Theme::i()->css( 'clients.css', 'nexus' ) );
Output::i()->breadcrumb[] = array( Url::internal( 'app=nexus&module=clients&controller=credit', 'front', 'clientscredit' ), Member::loggedIn()->language()->addToStack('client_credit') );
Output::i()->title = Member::loggedIn()->language()->addToStack('client_credit');
Output::i()->sidebar['enabled'] = FALSE;
if ( $output = \IPS\MFA\MFAHandler::accessToArea( 'nexus', 'AccountCredit', \IPS\Http\Url::internal( 'app=nexus&module=clients&controller=credit', 'front', 'clientscredit' ) ) )
if ( $output = MFAHandler::accessToArea( 'nexus', 'AccountCredit', Url::internal( 'app=nexus&module=clients&controller=credit', 'front', 'clientscredit' ) ) )
{
\IPS\Output::i()->output = \IPS\Theme::i()->getTemplate('clients')->credit( NULL, array(), NULL, FALSE, FALSE ) . $output;
Output::i()->output = Theme::i()->getTemplate('clients')->credit( NULL, array(), NULL, FALSE, FALSE ) . $output;
return;
}
@@ -54,38 +89,38 @@ class _credit extends \IPS\Dispatcher\Controller
*
* @return void
*/
protected function manage()
protected function manage() : void
{
/* Get Balance(s) */
$balance = array_filter( \IPS\nexus\Customer::loggedIn()->cm_credits, function( $val )
$balance = array_filter( Customer::loggedIn()->cm_credits, function( $val )
{
return $val->amount;
} );
/* Pending Withdrawls */
$perPage = 10;
$page = isset( \IPS\Request::i()->page ) ? \intval( \IPS\Request::i()->page ) : 1;
$page = isset( Request::i()->page ) ? intval( Request::i()->page ) : 1;
if( $page < 1 )
{
$page = 1;
}
$pastWithdrawalsSelect = \IPS\Db::i()->select( '*', 'nexus_payouts', array( 'po_member=?', \IPS\nexus\Customer::loggedIn()->member_id ), 'po_date DESC', array( ( $page - 1 ) * $perPage, $perPage ) );
$pastWithdrawalsPagination = \IPS\Theme::i()->getTemplate( 'global', 'core', 'global' )->pagination(
\IPS\Http\Url::internal( 'app=nexus&module=clients&controller=credit', 'front', 'clientscredit' ),
ceil( \IPS\Db::i()->select( 'COUNT(*)', 'nexus_payouts', array( 'po_member=?', \IPS\nexus\Customer::loggedIn()->member_id ) )->first() / $perPage ),
$pastWithdrawalsSelect = Db::i()->select( '*', 'nexus_payouts', array( 'po_member=?', Customer::loggedIn()->member_id ), 'po_date DESC', array( ( $page - 1 ) * $perPage, $perPage ) );
$pastWithdrawalsPagination = Theme::i()->getTemplate( 'global', 'core', 'global' )->pagination(
Url::internal( 'app=nexus&module=clients&controller=credit', 'front', 'clientscredit' ),
ceil( Db::i()->select( 'COUNT(*)', 'nexus_payouts', array( 'po_member=?', Customer::loggedIn()->member_id ) )->first() / $perPage ),
$page,
$perPage
);
$pastWithdrawals = new \IPS\Patterns\ActiveRecordIterator( $pastWithdrawalsSelect, 'IPS\nexus\Payout' );
$pastWithdrawals = new ActiveRecordIterator( $pastWithdrawalsSelect, 'IPS\nexus\Payout' );
$activePayouts = [];
if( !\IPS\Settings::i()->nexus_payout_unlimited_times )
if( !Settings::i()->nexus_payout_unlimited_times )
{
foreach ( $pastWithdrawals as $payout )
{
if ( $payout->status == \IPS\nexus\Payout::STATUS_PENDING )
if ( $payout->status == Payout::STATUS_PENDING )
{
$activePayouts[ $payout->currency ] = TRUE;
}
@@ -94,10 +129,10 @@ class _credit extends \IPS\Dispatcher\Controller
/* Can we withdraw? */
$canWithdraw = FALSE;
$withdrawOptions = json_decode( \IPS\Settings::i()->nexus_payout, TRUE );
if( \is_countable( $withdrawOptions ) AND \count( $withdrawOptions ) )
$withdrawOptions = json_decode( Settings::i()->nexus_payout, TRUE );
if( is_countable( $withdrawOptions ) AND count( $withdrawOptions ) )
{
foreach ( \IPS\nexus\Money::currencies() as $currency )
foreach ( Money::currencies() as $currency )
{
if ( isset( $balance[ $currency ] ) and $balance[ $currency ]->amount->isGreaterThanZero() and !isset( $activePayouts[ $currency ] ) )
{
@@ -108,22 +143,20 @@ class _credit extends \IPS\Dispatcher\Controller
/* Can we topup? */
$canTopup = FALSE;
if ( \IPS\Settings::i()->nexus_min_topup )
if ( Settings::i()->nexus_min_topup )
{
$minimumTopupAmounts = ( \IPS\Settings::i()->nexus_min_topup and \IPS\Settings::i()->nexus_min_topup !== '*' ) ? json_decode( \IPS\Settings::i()->nexus_min_topup, TRUE ) : NULL;
$maximumBalanceAmounts = ( \IPS\Settings::i()->nexus_max_credit and \IPS\Settings::i()->nexus_max_credit !== '*' ) ? json_decode( \IPS\Settings::i()->nexus_max_credit, TRUE ) : NULL;
$maximumBalanceAmounts = ( Settings::i()->nexus_max_credit and Settings::i()->nexus_max_credit !== '*' ) ? json_decode( Settings::i()->nexus_max_credit, TRUE ) : NULL;
$maximums = array();
foreach ( array_merge( array( \IPS\nexus\Customer::loggedIn() ), iterator_to_array( \IPS\nexus\Customer::loggedIn()->parentContacts( array('billing=1') ) ) ) as $account )
foreach ( array_merge( array( Customer::loggedIn() ), iterator_to_array( Customer::loggedIn()->parentContacts( array('billing=1') ) ) ) as $account )
{
if ( $account instanceof \IPS\nexus\Customer\AlternativeContact )
if ( $account instanceof AlternativeContact )
{
$account = $account->main_id;
}
foreach ( $account->cm_credits as $value )
{
if ( $maximumBalanceAmounts === NULL or $value->amount->compare( new \IPS\Math\Number( number_format( $maximumBalanceAmounts[ $value->currency ]['amount'], \IPS\nexus\Money::numberOfDecimalsForCurrency( $value->currency ), '.', '' ) ) ) === -1 )
if ( $maximumBalanceAmounts === NULL or $value->amount->compare( new \IPS\Math\Number( number_format( $maximumBalanceAmounts[ $value->currency ]['amount'], Money::numberOfDecimalsForCurrency( $value->currency ), '.', '' ) ) ) === -1 )
{
$canTopup = TRUE;
}
@@ -132,7 +165,7 @@ class _credit extends \IPS\Dispatcher\Controller
}
/* Display */
\IPS\Output::i()->output = \IPS\Theme::i()->getTemplate('clients')->credit( $balance, $pastWithdrawals, $pastWithdrawalsPagination, $canWithdraw, $canTopup );
Output::i()->output = Theme::i()->getTemplate('clients')->credit( $balance, $pastWithdrawals, $pastWithdrawalsPagination, $canWithdraw, $canTopup );
}
/**
@@ -140,47 +173,47 @@ class _credit extends \IPS\Dispatcher\Controller
*
* @return void
*/
protected function withdraw()
protected function withdraw() : void
{
$activeWithdrawals = \IPS\Settings::i()->nexus_payout_unlimited_times ? [] : iterator_to_array( \IPS\Db::i()->select( 'po_currency', 'nexus_payouts', array( 'po_status=? AND po_member=?', \IPS\nexus\Payout::STATUS_PENDING, \IPS\nexus\Customer::loggedIn()->member_id ) ) );
$activeWithdrawals = Settings::i()->nexus_payout_unlimited_times ? [] : iterator_to_array( Db::i()->select( 'po_currency', 'nexus_payouts', array( 'po_status=? AND po_member=?', Payout::STATUS_PENDING, Customer::loggedIn()->member_id ) ) );
$withdrawForm = NULL;
$withdrawOptions = json_decode( \IPS\Settings::i()->nexus_payout, TRUE );
$withdrawOptions = json_decode( Settings::i()->nexus_payout, TRUE );
if ( isset( $withdrawOptions['Stripe'] ) )
{
unset( $withdrawOptions['Stripe'] );
}
if ( \is_countable( $withdrawOptions ) AND \count( $withdrawOptions ) )
if ( is_countable( $withdrawOptions ) AND count( $withdrawOptions ) )
{
$withdrawForm = new \IPS\Helpers\Form( 'withdraw', 'withdraw_credit' );
$withdrawForm = new Form( 'withdraw', 'withdraw_credit' );
$minimumWithdrawalsAmounts = ( \IPS\Settings::i()->nexus_payout_min and \IPS\Settings::i()->nexus_payout_min !== '*' ) ? json_decode( \IPS\Settings::i()->nexus_payout_min, TRUE ) : NULL;
$maximumWithdrawalsAmounts = ( \IPS\Settings::i()->nexus_payout_max and \IPS\Settings::i()->nexus_payout_max !== '*' ) ? json_decode( \IPS\Settings::i()->nexus_payout_max, TRUE ) : NULL;
$minimumWithdrawalsAmounts = ( Settings::i()->nexus_payout_min and Settings::i()->nexus_payout_min !== '*' ) ? json_decode( Settings::i()->nexus_payout_min, TRUE ) : NULL;
$maximumWithdrawalsAmounts = ( Settings::i()->nexus_payout_max and Settings::i()->nexus_payout_max !== '*' ) ? json_decode( Settings::i()->nexus_payout_max, TRUE ) : NULL;
$balance = array_filter( \IPS\nexus\Customer::loggedIn()->cm_credits, function( $val )
$balance = array_filter( Customer::loggedIn()->cm_credits, function( $val )
{
return $val->amount;
} );
$currencyOptions = array();
if ( \count( $balance ) > 1 )
if ( count( $balance ) > 1 )
{
$currencyToggles = array();
foreach ( \IPS\nexus\Money::currencies() as $currency )
foreach ( Money::currencies() as $currency )
{
if ( isset( $balance[ $currency ] ) AND !\in_array( $currency, $activeWithdrawals ) )
if ( isset( $balance[ $currency ] ) AND !in_array( $currency, $activeWithdrawals ) )
{
$currencyOptions[ $currency ] = $currency;
$currencyToggles[ $currency ] = array( 'withdraw_amount_' . $currency );
}
}
$withdrawForm->add( new \IPS\Helpers\Form\Radio( 'withdraw_currency', NULL, TRUE, array( 'options' => $currencyOptions, 'toggles' => $currencyToggles ) ) );
$withdrawForm->add( new Radio( 'withdraw_currency', NULL, TRUE, array( 'options' => $currencyOptions, 'toggles' => $currencyToggles ) ) );
}
$canWithdraw = FALSE;
foreach ( \IPS\nexus\Money::currencies() as $currency )
foreach ( Money::currencies() as $currency )
{
if ( !isset( $balance[ $currency ] ) OR ( !\IPS\Settings::i()->nexus_payout_unlimited_times AND \in_array( $currency, $activeWithdrawals ) ) )
if ( !isset( $balance[ $currency ] ) OR ( !Settings::i()->nexus_payout_unlimited_times AND in_array( $currency, $activeWithdrawals ) ) )
{
continue;
}
@@ -197,13 +230,13 @@ class _credit extends \IPS\Dispatcher\Controller
$upperLimit = $maximumWithdrawalsAmounts[ $currency ];
/* Determine our date cutoff */
$periodRestrictions = json_decode( \IPS\Settings::i()->nexus_payout_max_period, TRUE );
$periodRestrictions = json_decode( Settings::i()->nexus_payout_max_period, TRUE );
$interval = 'P' . (int) $periodRestrictions[0] . ( mb_strtoupper( mb_substr( $periodRestrictions[1], 0, 1 ) ) );
$date = \IPS\DateTime::create()->sub( new \DateInterval( $interval ) )->getTimestamp();
$date = DateTime::create()->sub( new DateInterval( $interval ) )->getTimestamp();
/* Get our (non-cancelled) payout requests since the date cutoff */
foreach( \IPS\Db::i()->select( '*', 'nexus_payouts', array( 'po_member=? AND po_date>? AND po_status NOT IN(?) AND po_currency=?', \IPS\nexus\Customer::loggedIn()->member_id, $date, 'canc', $currency ) ) as $request )
foreach( Db::i()->select( '*', 'nexus_payouts', array( 'po_member=? AND po_date>? AND po_status NOT IN(?) AND po_currency=?', Customer::loggedIn()->member_id, $date, 'canc', $currency ) ) as $request )
{
$upperLimit -= $request['po_amount'];
}
@@ -217,17 +250,17 @@ class _credit extends \IPS\Dispatcher\Controller
if( $max <= 0 )
{
\IPS\Member::loggedIn()->language()->words[ 'withdraw_amount_' . $currency . '_desc' ] = \IPS\Member::loggedIn()->language()->addToStack( 'max_withdrawl_exceeded' );
Member::loggedIn()->language()->words[ 'withdraw_amount_' . $currency . '_desc' ] = Member::loggedIn()->language()->addToStack( 'max_withdrawl_exceeded' );
}
$field = new \IPS\Helpers\Form\Number( 'withdraw_amount_' . $currency, (string) $max, \count( $currencyOptions ) ? NULL : TRUE, array( 'min' => $min, 'max' => (string) $max, 'decimals' => \IPS\nexus\Money::numberOfDecimalsForCurrency( $currency ), 'disabled' => ( $max <= 0 ) ), \count( $currencyOptions ) ? NULL : function( $val ) use ( $currency )
$field = new Number( 'withdraw_amount_' . $currency, (string) $max, count( $currencyOptions ) ? NULL : TRUE, array( 'min' => $min, 'max' => (string) $max, 'decimals' => Money::numberOfDecimalsForCurrency( $currency ), 'disabled' => ( $max <= 0 ) ), count( $currencyOptions ) ? NULL : function( $val ) use ( $currency )
{
if ( !$val and \IPS\Request::i()->withdraw_currency === $currency )
if ( !$val and Request::i()->withdraw_currency === $currency )
{
throw new \DomainException('form_required');
throw new DomainException('form_required');
}
}, NULL, $currency, 'withdraw_amount_' . $currency );
$field->label = \IPS\Member::loggedIn()->language()->addToStack('withdraw_amount');
$field->label = Member::loggedIn()->language()->addToStack('withdraw_amount');
$withdrawForm->add( $field );
$canWithdraw = TRUE;
@@ -242,7 +275,9 @@ class _credit extends \IPS\Dispatcher\Controller
{
$options[ $k ] = $k === 'Manual' ? $settings['name'] : 'withdraw__' . $k;
$toggles[ $k ] = array();
$class = \IPS\nexus\Gateway::payoutGateways()[ $k ];
/* @var Payout $class */
$class = Gateway::payoutGateways()[ $k ];
foreach ( $class::form() as $field )
{
if ( !$field->htmlId )
@@ -254,9 +289,9 @@ class _credit extends \IPS\Dispatcher\Controller
}
}
if ( \is_countable( $withdrawOptions ) AND \count( $withdrawOptions ) > 1 )
if ( is_countable( $withdrawOptions ) AND count( $withdrawOptions ) > 1 )
{
$withdrawForm->add( new \IPS\Helpers\Form\Radio( 'withdraw_method', NULL, TRUE, array( 'options' => $options, 'toggles' => $toggles ) ) );
$withdrawForm->add( new Radio( 'withdraw_method', NULL, TRUE, array( 'options' => $options, 'toggles' => $toggles ) ) );
}
foreach ( $fields as $field )
@@ -266,55 +301,55 @@ class _credit extends \IPS\Dispatcher\Controller
if ( $values = $withdrawForm->values() )
{
$currencies = array_keys( $balance );
$currency = \count( $currencyOptions ) ? $values['withdraw_currency'] : array_pop( $currencies );
$currency = count( $currencyOptions ) ? $values['withdraw_currency'] : array_pop( $currencies );
$withdrawMethods = array_keys( $options );
if ( \count( $withdrawMethods ) === 1 )
if ( count( $withdrawMethods ) === 1 )
{
$key = array_pop( $withdrawMethods );
$class = \IPS\nexus\Gateway::payoutGateways()[ $key ];
$class = Gateway::payoutGateways()[ $key ];
}
else
{
$class = \IPS\nexus\Gateway::payoutGateways()[ $values['withdraw_method'] ];
$class = Gateway::payoutGateways()[ $values['withdraw_method'] ];
}
$payout = new $class;
$payout->amount = new \IPS\nexus\Money( $values[ 'withdraw_amount_' . $currency ], $currency );
$payout->member = \IPS\nexus\Customer::loggedIn();
$payout->amount = new Money( $values[ 'withdraw_amount_' . $currency ], $currency );
$payout->member = Customer::loggedIn();
try
{
$payout->data = $payout->getData( $values );
}
catch ( \DomainException $e )
catch ( DomainException $e )
{
\IPS\Output::i()->error( $e->getMessage(), '1X239/2', 403, '' );
Output::i()->error( $e->getMessage(), '1X239/2', 403, '' );
}
$payout->ip = \IPS\Request::i()->ipAddress();
$payout->ip = Request::i()->ipAddress();
$payout->save();
$credits = \IPS\nexus\Customer::loggedIn()->cm_credits;
$credits[ $currency ]->amount = $credits[ $currency ]->amount->subtract( new \IPS\Math\Number( number_format( $values[ 'withdraw_amount_' . $currency ], \IPS\nexus\Money::numberOfDecimalsForCurrency( $currency ), '.', '' ) ) );
\IPS\nexus\Customer::loggedIn()->cm_credits = $credits;
\IPS\nexus\Customer::loggedIn()->save();
$credits = Customer::loggedIn()->cm_credits;
$credits[ $currency ]->amount = $credits[ $currency ]->amount->subtract( new \IPS\Math\Number( number_format( $values[ 'withdraw_amount_' . $currency ], Money::numberOfDecimalsForCurrency( $currency ), '.', '' ) ) );
Customer::loggedIn()->cm_credits = $credits;
Customer::loggedIn()->save();
if ( !\IPS\Settings::i()->nexus_payout_approve and !$payout::$requiresApproval )
if ( !Settings::i()->nexus_payout_approve and !$payout::$requiresApproval )
{
try
{
$payout->process();
\IPS\nexus\Customer::loggedIn()->log( 'payout', array( 'type' => 'autoprocess', 'amount' => $values[ 'withdraw_amount_' . $currency ], 'currency' => $currency, 'payout_id' => $payout->id ) );
\IPS\Output::i()->redirect( \IPS\Http\Url::internal( 'app=nexus&module=clients&controller=credit&withdraw=success', 'front', 'clientscredit' ) );
Customer::loggedIn()->log( 'payout', array( 'type' => 'autoprocess', 'amount' => $values[ 'withdraw_amount_' . $currency ], 'currency' => $currency, 'payout_id' => $payout->id ) );
Output::i()->redirect( Url::internal( 'app=nexus&module=clients&controller=credit&withdraw=success', 'front', 'clientscredit' ) );
}
catch ( \Exception $e ) {}
catch ( Exception ) {}
}
else
{
\IPS\core\AdminNotification::send( 'nexus', 'Withdrawal', NULL, TRUE, $payout );
AdminNotification::send( 'nexus', 'Withdrawal', NULL, TRUE, $payout );
}
\IPS\nexus\Customer::loggedIn()->log( 'payout', array( 'type' => 'request', 'amount' => $values[ 'withdraw_amount_' . $currency ], 'currency' => $currency, 'payout_id' => $payout->id ) );
\IPS\Output::i()->redirect( \IPS\Http\Url::internal( 'app=nexus&module=clients&controller=credit&withdraw=pending', 'front', 'clientscredit' ) );
Customer::loggedIn()->log( 'payout', array( 'type' => 'request', 'amount' => $values[ 'withdraw_amount_' . $currency ], 'currency' => $currency, 'payout_id' => $payout->id ) );
Output::i()->redirect( Url::internal( 'app=nexus&module=clients&controller=credit&withdraw=pending', 'front', 'clientscredit' ) );
}
}
else
@@ -325,10 +360,10 @@ class _credit extends \IPS\Dispatcher\Controller
if ( !$withdrawForm )
{
\IPS\Output::i()->error( 'no_module_permission', '2X239/3', 403, '' );
Output::i()->error( 'no_module_permission', '2X239/3', 403, '' );
}
\IPS\Output::i()->output = $withdrawForm->customTemplate( array( \IPS\Theme::i()->getTemplate( 'forms', 'core' ), 'popupTemplate' ) );
Output::i()->output = $withdrawForm->customTemplate( array( Theme::i()->getTemplate( 'forms', 'core' ), 'popupTemplate' ) );
}
/**
@@ -336,54 +371,55 @@ class _credit extends \IPS\Dispatcher\Controller
*
* @return void
*/
protected function topup()
protected function topup() : void
{
$topupForm = NULL;
if ( \IPS\Settings::i()->nexus_min_topup )
if ( Settings::i()->nexus_min_topup )
{
$minimumTopupAmounts = ( \IPS\Settings::i()->nexus_min_topup and \IPS\Settings::i()->nexus_min_topup !== '*' ) ? json_decode( \IPS\Settings::i()->nexus_min_topup, TRUE ) : NULL;
$maximumBalanceAmounts = ( \IPS\Settings::i()->nexus_max_credit and \IPS\Settings::i()->nexus_max_credit !== '*' ) ? json_decode( \IPS\Settings::i()->nexus_max_credit, TRUE ) : NULL;
$minimumTopupAmounts = ( Settings::i()->nexus_min_topup and Settings::i()->nexus_min_topup !== '*' ) ? json_decode( Settings::i()->nexus_min_topup, TRUE ) : NULL;
$maximumBalanceAmounts = ( Settings::i()->nexus_max_credit and Settings::i()->nexus_max_credit !== '*' ) ? json_decode( Settings::i()->nexus_max_credit, TRUE ) : NULL;
$maximums = array();
foreach ( array_merge( array( \IPS\nexus\Customer::loggedIn() ), iterator_to_array( \IPS\nexus\Customer::loggedIn()->parentContacts( array('billing=1') ) ) ) as $account )
foreach ( array_merge( array( Customer::loggedIn() ), iterator_to_array( Customer::loggedIn()->parentContacts( array('billing=1') ) ) ) as $account )
{
if ( $account instanceof \IPS\nexus\Customer\AlternativeContact )
if ( $account instanceof AlternativeContact )
{
$account = $account->main_id;
}
foreach ( $account->cm_credits as $value )
{
$max = $maximumBalanceAmounts ? ( ( new \IPS\Math\Number( number_format( $maximumBalanceAmounts[ $value->currency ]['amount'], \IPS\nexus\Money::numberOfDecimalsForCurrency( $value->currency ), '.', '' ) ) )->subtract( $value->amount ) ) : NULL;
if ( \is_null( $max ) or $max->isGreaterThanZero() )
$max = $maximumBalanceAmounts ? ( ( new \IPS\Math\Number( number_format( $maximumBalanceAmounts[ $value->currency ]['amount'], Money::numberOfDecimalsForCurrency( $value->currency ), '.', '' ) ) )->subtract( $value->amount ) ) : NULL;
if ( is_null( $max ) or $max->isGreaterThanZero() )
{
$maximums[ $account->member_id ][ $value->currency ] = \is_null( $max ) ? NULL : (string) $max;
$maximums[ $account->member_id ][ $value->currency ] = is_null( $max ) ? NULL : (string) $max;
}
}
}
if ( \count( $maximums ) )
if ( count( $maximums ) )
{
$topupForm = new \IPS\Helpers\Form( 'topup', 'checkout' );
$topupForm = new Form( 'topup', 'checkout' );
$accountOptions = array();
$accountOptionToggles = array();
foreach ( $maximums as $accountId => $data )
{
$currency = NULL;
if ( \count( $data ) === 1 )
if ( count( $data ) === 1 )
{
$currencies = array_keys( $data );
$currency = array_pop( $currencies );
}
$accountOptions[ $accountId ] = $accountId === \IPS\nexus\Customer::loggedIn()->id ? \IPS\nexus\Customer::loggedIn()->language()->addToStack( 'my_account', FALSE, array( 'sprintf' => array( \IPS\nexus\Customer::loggedIn()->cm_name ) ) ) : \IPS\nexus\Customer::load( $accountId )->cm_name;
$accountOptionToggles[ $accountId ] = ( \count( $data ) > 1 ) ? array( 'topup_currency_' . $accountId ) : array( 'topup_amount_' . $accountId . '_' . $currency );
$accountOptions[ $accountId ] = $accountId === Customer::loggedIn()->id ? Customer::loggedIn()->language()->addToStack( 'my_account', FALSE, array( 'sprintf' => array( Customer::loggedIn()->cm_name ) ) ) : Customer::load( $accountId )->cm_name;
$accountOptionToggles[ $accountId ] = ( count( $data ) > 1 ) ? array( 'topup_currency_' . $accountId ) : array( 'topup_amount_' . $accountId . '_' . $currency );
}
$topupForm->add( new \IPS\Helpers\Form\Radio( 'topup_account', NULL, TRUE, array( 'options' => $accountOptions, 'parse' => 'normal', 'toggles' => $accountOptionToggles ) ) );
$topupForm->add( new Radio( 'topup_account', NULL, TRUE, array( 'options' => $accountOptions, 'parse' => 'normal', 'toggles' => $accountOptionToggles ) ) );
foreach ( $maximums as $accountId => $data )
{
if ( \count( $data ) > 1 )
if ( count( $data ) > 1 )
{
$currencyToggles = array();
foreach ( $data as $currency => $maximum )
@@ -391,8 +427,8 @@ class _credit extends \IPS\Dispatcher\Controller
$currencyToggles[ $currency ] = array( 'topup_amount_' . $accountId . '_' . $currency );
}
$field = new \IPS\Helpers\Form\Radio( 'topup_currency_' . $accountId, NULL, NULL, array( 'options' => array_combine( array_keys( $data ), array_keys( $data ) ), 'toggles' => $currencyToggles ), NULL, NULL, NULL, 'topup_currency_' . $accountId );
$field->label = \IPS\Member::loggedIn()->language()->addToStack( 'topup_currency' );
$field = new Radio( 'topup_currency_' . $accountId, NULL, NULL, array( 'options' => array_combine( array_keys( $data ), array_keys( $data ) ), 'toggles' => $currencyToggles ), NULL, NULL, NULL, 'topup_currency_' . $accountId );
$field->label = Member::loggedIn()->language()->addToStack( 'topup_currency' );
$topupForm->add( $field );
}
@@ -400,29 +436,29 @@ class _credit extends \IPS\Dispatcher\Controller
{
$min = $minimumTopupAmounts ? ( $minimumTopupAmounts[ $currency ]['amount'] ) : 0.01;
$field = new \IPS\Helpers\Form\Number( 'topup_amount_' . $accountId . '_' . $currency, NULL, NULL, array( 'decimals' => \IPS\nexus\Money::numberOfDecimalsForCurrency( $currency ) ), function( $val ) use ( $currency, $accountOptions, $accountId, $data, $min, $maximum )
$field = new Number( 'topup_amount_' . $accountId . '_' . $currency, NULL, NULL, array( 'decimals' => Money::numberOfDecimalsForCurrency( $currency ) ), function( $val ) use ( $currency, $accountOptions, $accountId, $data, $min, $maximum )
{
if ( \count( $accountOptions ) === 1 or \IPS\Request::i()->topup_account == $accountId )
if ( count( $accountOptions ) === 1 or Request::i()->topup_account == $accountId )
{
$key = "topup_currency_{$accountId}";
if ( \count( $data ) === 1 or \IPS\Request::i()->$key == $currency )
if ( count( $data ) === 1 or Request::i()->$key == $currency )
{
if ( !$val )
{
throw new \DomainException('form_required');
throw new DomainException('form_required');
}
elseif ( !\is_null( $min ) and $val < $min )
elseif ( !is_null( $min ) and $val < $min )
{
throw new \DomainException( \IPS\Member::loggedIn()->language()->addToStack( 'form_number_min', FALSE, array( 'sprintf' => array( $min ) ) ) );
throw new DomainException( Member::loggedIn()->language()->addToStack( 'form_number_min', FALSE, array( 'sprintf' => array( $min ) ) ) );
}
elseif ( $maximum and $val > $maximum )
{
throw new \DomainException( \IPS\Member::loggedIn()->language()->addToStack( 'form_number_max', FALSE, array( 'sprintf' => array( $maximum ) ) ) );
throw new DomainException( Member::loggedIn()->language()->addToStack( 'form_number_max', FALSE, array( 'sprintf' => array( $maximum ) ) ) );
}
}
}
}, NULL, $currency, 'topup_amount_' . $accountId . '_' . $currency );
$field->label = \IPS\Member::loggedIn()->language()->addToStack('topup_amount');
$field->label = Member::loggedIn()->language()->addToStack('topup_amount');
$topupForm->add( $field );
}
}
@@ -430,7 +466,7 @@ class _credit extends \IPS\Dispatcher\Controller
if ( $values = $topupForm->values() )
{
$account = isset( $values['topup_account'] ) ? \IPS\nexus\Customer::load( $values['topup_account'] ) : \IPS\nexus\Customer::loggedIn();
$account = isset( $values['topup_account'] ) ? Customer::load( $values['topup_account'] ) : Customer::loggedIn();
if ( isset( $values[ 'topup_currency_' . $account->member_id ] ) )
{
$currency = $values[ 'topup_currency_' . $account->member_id ];
@@ -441,22 +477,22 @@ class _credit extends \IPS\Dispatcher\Controller
$currency = array_pop( $currencies );
}
$invoice = new \IPS\nexus\Invoice;
$invoice = new Invoice;
$invoice->member = $account;
$invoice->currency = $currency;
$invoice->return_uri = 'app=nexus&module=clients&controller=credit';
$invoice->addItem( new \IPS\nexus\extensions\nexus\Item\AccountCreditIncrease( \IPS\nexus\Customer::loggedIn()->language()->get('account_credit'), new \IPS\nexus\Money( $values["topup_amount_{$account->member_id}_{$currency}"], $currency ) ) );
\IPS\Output::i()->redirect( $invoice->checkoutUrl() );
$invoice->addItem( new AccountCreditIncrease( Customer::loggedIn()->language()->get('account_credit'), new Money( $values["topup_amount_{$account->member_id}_{$currency}"], $currency ) ) );
Output::i()->redirect( $invoice->checkoutUrl() );
}
}
}
if ( !$topupForm )
{
\IPS\Output::i()->error( 'no_module_permission', '2X239/4', 403, '' );
Output::i()->error( 'no_module_permission', '2X239/4', 403, '' );
}
\IPS\Output::i()->output = $topupForm->customTemplate( array( \IPS\Theme::i()->getTemplate( 'forms', 'core' ), 'popupTemplate' ) );
Output::i()->output = $topupForm->customTemplate( array( Theme::i()->getTemplate( 'forms', 'core' ), 'popupTemplate' ) );
}
/**
@@ -464,14 +500,14 @@ class _credit extends \IPS\Dispatcher\Controller
*
* @return void
*/
protected function cancel()
protected function cancel() : void
{
\IPS\Session::i()->csrfCheck();
Session::i()->csrfCheck();
try
{
$payout = \IPS\nexus\Payout::load( \IPS\Request::i()->id );
if ( $payout->member->member_id === \IPS\nexus\Customer::loggedIn()->member_id and $payout->status === $payout::STATUS_PENDING )
$payout = Payout::load( Request::i()->id );
if ( $payout->member->member_id === Customer::loggedIn()->member_id and $payout->status === $payout::STATUS_PENDING )
{
$payout->status = $payout::STATUS_CANCELED;
$payout->save();
@@ -481,11 +517,11 @@ class _credit extends \IPS\Dispatcher\Controller
$payout->member->cm_credits = $credits;
$payout->member->save();
\IPS\nexus\Customer::loggedIn()->log( 'payout', array( 'type' => 'cancel', 'amount' => $payout->amount->amount, 'currency' => $payout->amount->currency, 'payout_id' => $payout->id ) );
Customer::loggedIn()->log( 'payout', array( 'type' => 'cancel', 'amount' => $payout->amount->amount, 'currency' => $payout->amount->currency, 'payout_id' => $payout->id ) );
}
}
catch ( \OutOfRangeException $e ) { }
catch ( OutOfRangeException ) { }
\IPS\Output::i()->redirect( \IPS\Http\Url::internal( 'app=nexus&module=clients&controller=credit', 'front', 'clientscredit' ) );
Output::i()->redirect( Url::internal( 'app=nexus&module=clients&controller=credit', 'front', 'clientscredit' ) );
}
}
@@ -12,48 +12,60 @@
namespace IPS\nexus\modules\front\clients;
/* To prevent PHP errors (extending class does not exist) revealing path */
if ( !\defined( '\IPS\SUITE_UNIQUE_KEY' ) )
use IPS\Dispatcher\Controller;
use IPS\Helpers\Form;
use IPS\Helpers\Form\Number;
use IPS\Helpers\Form\Radio;
use IPS\Helpers\Form\YesNo;
use IPS\Http\Url;
use IPS\Member;
use IPS\nexus\Customer;
use IPS\nexus\Donation\Goal;
use IPS\nexus\extensions\nexus\Item\Donation;
use IPS\nexus\Invoice;
use IPS\nexus\Money;
use IPS\Output;
use IPS\Request;
use IPS\Theme;
use OutOfRangeException;
use function count;
use function defined;
if ( !defined( '\IPS\SUITE_UNIQUE_KEY' ) )
{
header( ( isset( $_SERVER['SERVER_PROTOCOL'] ) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.0' ) . ' 403 Forbidden' );
header( ( $_SERVER['SERVER_PROTOCOL'] ?? 'HTTP/1.0' ) . ' 403 Forbidden' );
exit;
}
/**
* Donations
*/
class _donations extends \IPS\Dispatcher\Controller
class donations extends Controller
{
/**
* View List
*
* @return void
*/
protected function manage()
protected function manage() : void
{
if ( isset( \IPS\Request::i()->id ) )
if ( isset( Request::i()->id ) and !Request::i()->isAjax() )
{
if ( \IPS\Request::i()->isAjax() )
{
}
else
{
\IPS\Output::i()->redirect( \IPS\Http\Url::internal( 'app=nexus&module=clients&controller=donations', 'front', 'clientsdonations' ) );
}
Output::i()->redirect( Url::internal( 'app=nexus&module=clients&controller=donations', 'front', 'clientsdonations' ) );
}
\IPS\Output::i()->breadcrumb[] = array( \IPS\Http\Url::internal( 'app=nexus&module=clients&controller=donations', 'front', 'clientsdonations' ), \IPS\Member::loggedIn()->language()->addToStack('client_donations') );
\IPS\Output::i()->title = \IPS\Member::loggedIn()->language()->addToStack('client_donations');
\IPS\Output::i()->sidebar['enabled'] = FALSE;
\IPS\Output::i()->cssFiles = array_merge( \IPS\Output::i()->cssFiles, \IPS\Theme::i()->css( 'donations.css' ) );
Output::i()->breadcrumb[] = array( Url::internal( 'app=nexus&module=clients&controller=donations', 'front', 'clientsdonations' ), Member::loggedIn()->language()->addToStack('client_donations') );
Output::i()->title = Member::loggedIn()->language()->addToStack('client_donations');
Output::i()->sidebar['enabled'] = FALSE;
/* "Nowt 'ere lad, may as well knock it over tut 404" - Marc */
if( \count( \IPS\nexus\Donation\Goal::roots() ) === 0 )
if( count( Goal::roots() ) === 0 )
{
\IPS\Output::i()->error( 'nexus_no_donations_found', '1X238/2', 404, '' );
Output::i()->error( 'nexus_no_donations_found', '1X238/2', 404, '' );
}
\IPS\Output::i()->output = \IPS\Theme::i()->getTemplate('clients')->donations();
Output::i()->output = Theme::i()->getTemplate('clients')->donations();
}
/**
@@ -61,45 +73,80 @@ class _donations extends \IPS\Dispatcher\Controller
*
* @return void
*/
public function donate()
public function donate() : void
{
if( !\IPS\Member::loggedIn()->member_id )
if( !Member::loggedIn()->member_id )
{
\IPS\Output::i()->error( 'no_module_permission_guest', '1X238/3', 403, '' );
Output::i()->error( 'no_module_permission_guest', '1X238/3', 403, '' );
}
try
{
$goal = \IPS\nexus\Donation\Goal::load( \IPS\Request::i()->id );
$goal = Goal::load( Request::i()->id );
}
catch ( \OutOfRangeException $e )
catch ( OutOfRangeException )
{
\IPS\Output::i()->error( 'node_error', '2X238/1', 404, '' );
Output::i()->error( 'node_error', '2X238/1', 404, '' );
}
$form = new \IPS\Helpers\Form( 'donate', 'donate' );
$form->class = 'ipsForm_vertical';
if ( !isset( \IPS\Request::i()->noDesc ) and $desc = \IPS\Member::loggedIn()->language()->get("nexus_donategoal_{$goal->id}_desc") )
$form = new Form( 'donate', 'donate' );
$form->class = 'ipsForm--vertical ipsForm--donate';
if ( !isset( Request::i()->noDesc ) and $desc = Member::loggedIn()->language()->get("nexus_donategoal_{$goal->id}_desc") )
{
$form->addMessage( $desc, '', FALSE );
}
$form->add( new \IPS\Helpers\Form\Number( 'donate_amount', 0, TRUE, array( 'decimals' => TRUE, 'min' => 0.01 ), NULL, NULL, $goal->currency ) );
/* Work out what our options are */
$options = array();
if( $goal->suggestions )
{
foreach ( json_decode( $goal->suggestions ) as $suggestion )
{
$options[ $suggestion ] = new Money( $suggestion, $goal->currency );
}
}
if ( empty( $options ) )
{
$form->add( new Number( 'donate_amount', 0, TRUE, array( 'decimals' => TRUE, 'min' => 0.01 ), NULL, NULL, $goal->currency ) );
}
else
{
if( $goal->suggestions_open )
{
$options['x'] = Member::loggedIn()->language()->addToStack('other');
}
$form->add( new Radio( 'donate_amount', NULL, TRUE, array( 'options' => $options, 'parse' => 'normal', 'userSuppliedInput' => 'x' ) ) );
}
$form->add( new YesNo( 'donate_anonymous', FALSE ) );
if ( $values = $form->values() )
{
$item = new \IPS\nexus\extensions\nexus\Item\Donation( \IPS\Member::loggedIn()->language()->get( 'nexus_donategoal_' . $goal->_id ), new \IPS\nexus\Money( $values['donate_amount'], $goal->currency ) );
$item->id = $goal->_id;
$invoice = new \IPS\nexus\Invoice;
$invoice->member = \IPS\nexus\Customer::loggedIn();
$invoice->currency = $goal->currency;
$invoice->addItem( $item );
$invoice->return_uri = 'app=nexus&module=clients&controller=donations&thanks=1';
$invoice->save();
\IPS\Output::i()->redirect( $invoice->checkoutUrl() );
if( !is_numeric( $values['donate_amount'] ) )
{
$form->error = Member::loggedIn()->language()->addToStack( 'donation_invalid_amount' );
}
if( !$form->error )
{
$item = new Donation( Member::loggedIn()->language()->get( 'nexus_donategoal_' . $goal->_id ), new Money( $values['donate_amount'], $goal->currency ) );
$item->id = $goal->_id;
$item->extra = array( 'anonymous' => $values['donate_anonymous'] );
$invoice = new Invoice;
$invoice->member = Customer::loggedIn();
$invoice->currency = $goal->currency;
$invoice->addItem( $item );
$invoice->return_uri = 'app=nexus&module=clients&controller=donations&thanks=1';
$invoice->save();
Output::i()->redirect( $invoice->checkoutUrl() );
}
}
\IPS\Output::i()->title = $goal->_title;
\IPS\Output::i()->output = $form->customTemplate( array( \IPS\Theme::i()->getTemplate( 'forms', 'core' ), 'popupTemplate' ) );
Output::i()->title = $goal->_title;
Output::i()->output = $form->customTemplate( array( Theme::i()->getTemplate( 'forms', 'core' ), 'popupTemplate' ) );
}
}
@@ -1,4 +1,5 @@
<?php
/**
* @brief Custom Fields
* @author <a href='https://www.invisioncommunity.com'>Invision Power Services, Inc.</a>
@@ -12,41 +13,55 @@
namespace IPS\nexus\modules\front\clients;
/* To prevent PHP errors (extending class does not exist) revealing path */
if ( !\defined( '\IPS\SUITE_UNIQUE_KEY' ) )
use IPS\Dispatcher\Controller;
use IPS\Helpers\Form;
use IPS\Helpers\Form\Text;
use IPS\Helpers\Form\Upload;
use IPS\Http\Url;
use IPS\Member;
use IPS\MFA\MFAHandler;
use IPS\nexus\Customer;
use IPS\nexus\Customer\CustomField;
use IPS\Output;
use IPS\Theme;
use function defined;
if ( !defined( '\IPS\SUITE_UNIQUE_KEY' ) )
{
header( ( isset( $_SERVER['SERVER_PROTOCOL'] ) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.0' ) . ' 403 Forbidden' );
header( ( $_SERVER['SERVER_PROTOCOL'] ?? 'HTTP/1.0' ) . ' 403 Forbidden' );
exit;
}
/**
* Custom Fields
*/
class _info extends \IPS\Dispatcher\Controller
class info extends Controller
{
/**
* Execute
*
* @return void
*/
public function execute()
public function execute() : void
{
if ( !\IPS\Member::loggedIn()->member_id )
if ( !Member::loggedIn()->member_id )
{
\IPS\Output::i()->error( 'no_module_permission_guest', '2X242/1', 403, '' );
Output::i()->error( 'no_module_permission_guest', '2X242/1', 403, '' );
}
\IPS\Output::i()->breadcrumb[] = array( \IPS\Http\Url::internal( 'app=nexus&module=clients&controller=info', 'front', 'clientsinfo' ), \IPS\Member::loggedIn()->language()->addToStack('client_info') );
\IPS\Output::i()->title = \IPS\Member::loggedIn()->language()->addToStack('client_info');
\IPS\Output::i()->sidebar['enabled'] = FALSE;
Output::i()->breadcrumb[] = array( Url::internal( 'app=nexus&module=clients&controller=info', 'front', 'clientsinfo' ), Member::loggedIn()->language()->addToStack('client_info') );
Output::i()->title = Member::loggedIn()->language()->addToStack('client_info');
Output::i()->sidebar['enabled'] = FALSE;
if ( $output = \IPS\MFA\MFAHandler::accessToArea( 'nexus', 'BillingInfo', \IPS\Http\Url::internal( 'app=nexus&module=clients&controller=info', 'front', 'clientsinfo' ) ) )
if ( $output = MFAHandler::accessToArea( 'nexus', 'BillingInfo', Url::internal( 'app=nexus&module=clients&controller=info', 'front', 'clientsinfo' ) ) )
{
$form = new \IPS\Helpers\Form;
$form = new Form;
foreach( $this->_buildInfoForm( TRUE ) AS $formElement )
{
$form->add( $formElement );
}
\IPS\Output::i()->output = \IPS\Theme::i()->getTemplate('clients')->info( $form ) . $output;
Output::i()->output = Theme::i()->getTemplate('clients')->info( $form ) . $output;
return;
}
@@ -58,9 +73,9 @@ class _info extends \IPS\Dispatcher\Controller
*
* @return void
*/
protected function manage()
protected function manage() : void
{
$form = new \IPS\Helpers\Form;
$form = new Form;
foreach( $this->_buildInfoForm() AS $formElement )
{
$form->add( $formElement );
@@ -73,24 +88,25 @@ class _info extends \IPS\Dispatcher\Controller
{
if ( isset( $values[ $nameField ] ) )
{
if ( $values[ $nameField ] != \IPS\nexus\Customer::loggedIn()->$nameField )
if ( $values[ $nameField ] != Customer::loggedIn()->$nameField )
{
/* We only need to log this once, so do it if it isn't set */
if ( !isset( $changes['name'] ) )
{
$changes['name'] = \IPS\nexus\Customer::loggedIn()->cm_name;
$changes['name'] = Customer::loggedIn()->cm_name;
}
\IPS\nexus\Customer::loggedIn()->$nameField = $values[ $nameField ];
Customer::loggedIn()->$nameField = $values[ $nameField ];
}
}
}
foreach ( \IPS\nexus\Customer\CustomField::roots() as $field )
foreach ( CustomField::roots() as $field )
{
/* @var CustomField $field */
$column = $field->column;
$helper = $field->buildHelper();
if ( $helper instanceof \IPS\Helpers\Form\Upload )
if ( $helper instanceof Upload )
{
$valueToSave = (string) $values["nexus_ccfield_{$field->id}"];
}
@@ -98,26 +114,26 @@ class _info extends \IPS\Dispatcher\Controller
{
$valueToSave = $helper::stringValue( $values["nexus_ccfield_{$field->id}"] );
}
if ( \IPS\nexus\Customer::loggedIn()->$column != $valueToSave )
if ( Customer::loggedIn()->$column != $valueToSave )
{
$changes['other'][] = array( 'name' => 'nexus_ccfield_' . $field->id, 'value' => $field->displayValue( $valueToSave ), 'old' => $field->displayValue( \IPS\nexus\Customer::loggedIn()->$column ) );
\IPS\nexus\Customer::loggedIn()->$column = $valueToSave;
$changes['other'][] = array( 'name' => 'nexus_ccfield_' . $field->id, 'value' => $field->displayValue( $valueToSave ), 'old' => $field->displayValue( Customer::loggedIn()->$column ) );
Customer::loggedIn()->$column = $valueToSave;
}
if ( $field->type === 'Editor' )
{
$field->claimAttachments( \IPS\nexus\Customer::loggedIn()->member_id );
$field->claimAttachments( Customer::loggedIn()->member_id );
}
}
if ( !empty( $changes ) )
{
\IPS\nexus\Customer::loggedIn()->log( 'info', $changes );
Customer::loggedIn()->log( 'info', $changes );
}
\IPS\nexus\Customer::loggedIn()->save();
\IPS\Output::i()->redirect( \IPS\Http\Url::internal( 'app=nexus&module=clients&controller=info', 'front', 'clientsinfo' ) );
Customer::loggedIn()->save();
Output::i()->redirect( Url::internal( 'app=nexus&module=clients&controller=info', 'front', 'clientsinfo' ) );
}
\IPS\Output::i()->output = \IPS\Theme::i()->getTemplate('clients')->info( $form );
Output::i()->output = Theme::i()->getTemplate('clients')->info( $form );
}
/**
@@ -126,19 +142,20 @@ class _info extends \IPS\Dispatcher\Controller
* @param bool $protected If TRUE, current values will be blanked out
* @return array
*/
protected function _buildInfoForm( $protected = FALSE )
protected function _buildInfoForm( bool $protected = FALSE ) : array
{
$formElements = array();
$formElements['cm_first_name'] = new \IPS\Helpers\Form\Text( 'cm_first_name', $protected ? NULL : \IPS\nexus\Customer::loggedIn()->cm_first_name, TRUE );
$formElements['cm_last_name'] = new \IPS\Helpers\Form\Text( 'cm_last_name', $protected ? NULL : \IPS\nexus\Customer::loggedIn()->cm_last_name, TRUE );
foreach ( \IPS\nexus\Customer\CustomField::roots() as $field )
$formElements['cm_first_name'] = new Text( 'cm_first_name', $protected ? NULL : Customer::loggedIn()->cm_first_name, TRUE );
$formElements['cm_last_name'] = new Text( 'cm_last_name', $protected ? NULL : Customer::loggedIn()->cm_last_name, TRUE );
foreach ( CustomField::roots() as $field )
{
/* @var CustomField $field */
$column = $field->column;
if ( $field->type === 'Editor' )
{
$field::$editorOptions = array_merge( $field::$editorOptions, array( 'attachIds' => array( \IPS\nexus\Customer::loggedIn()->member_id ) ) );
$field::$editorOptions = array_merge( $field::$editorOptions, array( 'attachIds' => array( Customer::loggedIn()->member_id ) ) );
}
$formElements[ $column ] = $field->buildHelper( $protected ? NULL : \IPS\nexus\Customer::loggedIn()->$column );
$formElements[ $column ] = $field->buildHelper( $protected ? NULL : Customer::loggedIn()->$column );
}
return $formElements;
@@ -12,101 +12,128 @@
namespace IPS\nexus\modules\front\clients;
/* To prevent PHP errors (extending class does not exist) revealing path */
if ( !\defined( '\IPS\SUITE_UNIQUE_KEY' ) )
use Exception;
use IPS\Db;
use IPS\Dispatcher\Controller;
use IPS\Events\Event;
use IPS\Helpers\Form;
use IPS\Helpers\Form\Text;
use IPS\Helpers\Form\TextArea;
use IPS\Http\Url;
use IPS\Login;
use IPS\Member;
use IPS\nexus\Customer;
use IPS\nexus\Invoice;
use IPS\nexus\Transaction;
use IPS\Output;
use IPS\Patterns\ActiveRecordIterator;
use IPS\Request;
use IPS\Session;
use IPS\Theme;
use OutOfRangeException;
use function count;
use function defined;
if ( !defined( '\IPS\SUITE_UNIQUE_KEY' ) )
{
header( ( isset( $_SERVER['SERVER_PROTOCOL'] ) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.0' ) . ' 403 Forbidden' );
header( ( $_SERVER['SERVER_PROTOCOL'] ?? 'HTTP/1.0' ) . ' 403 Forbidden' );
exit;
}
/**
* Invoices
*/
class _invoices extends \IPS\Dispatcher\Controller
class invoices extends Controller
{
/**
* @var Invoice|null
*/
protected ?Invoice $invoice = null;
/**
* Execute
*
* @return void
*/
public function execute()
public function execute() : void
{
/* Load Invoice */
if ( isset( \IPS\Request::i()->id ) )
if ( isset( Request::i()->id ) )
{
if ( isset( \IPS\Request::i()->printout ) )
if ( isset( Request::i()->printout ) )
{
\IPS\Request::i()->do = 'printout';
Request::i()->do = 'printout';
}
if ( \IPS\Member::loggedIn()->member_id )
if ( Member::loggedIn()->member_id )
{
try
{
$this->invoice = \IPS\nexus\Invoice::loadAndCheckPerms( \IPS\Request::i()->id );
$this->invoice = Invoice::loadAndCheckPerms( Request::i()->id );
}
catch ( \OutOfRangeException $e )
catch ( OutOfRangeException )
{
\IPS\Output::i()->error( 'node_error', '2X215/1', 404, '' );
Output::i()->error( 'node_error', '2X215/1', 404, '' );
}
}
else
{
/* Prevent the vid key from being exposed in referrers */
\IPS\Output::i()->sendHeader( "Referrer-Policy: origin" );
Output::i()->sendHeader( "Referrer-Policy: origin" );
$key = isset( \IPS\Request::i()->key ) ? \IPS\Request::i()->key : ( isset( \IPS\Request::i()->cookie['guestTransactionKey'] ) ? \IPS\Request::i()->cookie['guestTransactionKey'] : NULL );
$this->invoice = \IPS\nexus\Invoice::load( \IPS\Request::i()->id );
$key = isset( Request::i()->key ) ? Request::i()->key : ( isset( Request::i()->cookie['guestTransactionKey'] ) ? Request::i()->cookie['guestTransactionKey'] : NULL );
$this->invoice = Invoice::load( Request::i()->id );
if( $this->invoice->member->member_id or !$key or !isset( $this->invoice->guest_data['guestTransactionKey'] ) or !\IPS\Login::compareHashes( $key, $this->invoice->guest_data['guestTransactionKey'] ) )
if( $this->invoice->member->member_id or !$key or !isset( $this->invoice->guest_data['guestTransactionKey'] ) or !Login::compareHashes( $key, $this->invoice->guest_data['guestTransactionKey'] ) )
{
\IPS\Output::i()->error( 'no_module_permission_guest', '2X215/6', 404, '' );
Output::i()->error( 'no_module_permission_guest', '2X215/6', 404, '' );
}
/* Do not cache this guest view invoice */
\IPS\Output::setCacheTime( false );
Output::i()->pageCaching = FALSE;
}
\IPS\Output::i()->breadcrumb[] = array( \IPS\Http\Url::internal( 'app=nexus&module=clients&controller=invoices', 'front', 'clientsinvoices' ), \IPS\Member::loggedIn()->language()->addToStack('client_invoices') );
\IPS\Output::i()->breadcrumb[] = array( $this->invoice->url(), $this->invoice->title );
\IPS\Output::i()->title = $this->invoice->title;
Output::i()->breadcrumb[] = array( Url::internal( 'app=nexus&module=clients&controller=invoices', 'front', 'clientsinvoices' ), Member::loggedIn()->language()->addToStack('client_invoices') );
Output::i()->breadcrumb[] = array( $this->invoice->url(), $this->invoice->title );
Output::i()->title = $this->invoice->title;
}
else
{
if ( !\IPS\Member::loggedIn()->member_id )
if ( !Member::loggedIn()->member_id )
{
\IPS\Output::i()->error( 'no_module_permission_guest', '2X215/3', 403, '' );
Output::i()->error( 'no_module_permission_guest', '2X215/3', 403, '' );
}
\IPS\Output::i()->title = \IPS\Member::loggedIn()->language()->addToStack('client_invoices');
if ( isset( \IPS\Request::i()->do ) )
Output::i()->title = Member::loggedIn()->language()->addToStack('client_invoices');
if ( isset( Request::i()->do ) )
{
\IPS\Output::i()->error( 'node_error', '2X215/2', 403, '' );
Output::i()->error( 'node_error', '2X215/2', 403, '' );
}
}
/* Execute */
\IPS\Output::i()->cssFiles = array_merge( \IPS\Output::i()->cssFiles, \IPS\Theme::i()->css( 'clients.css', 'nexus' ) );
\IPS\Output::i()->sidebar['enabled'] = FALSE;
Output::i()->cssFiles = array_merge( Output::i()->cssFiles, Theme::i()->css( 'clients.css', 'nexus' ) );
Output::i()->sidebar['enabled'] = FALSE;
parent::execute();
}
/**
* @brief Invoices Per Page
*/
protected static $invoicesPerPage = 25;
protected static int $invoicesPerPage = 25;
/**
* View List
*
* @return void
*/
protected function manage()
protected function manage() : void
{
$where = array( 'i_member=?', \IPS\Member::loggedIn()->member_id );
$parentContacts = \IPS\nexus\Customer::loggedIn()->parentContacts( array( 'billing=1' ) );
if ( \count( $parentContacts ) )
$where = array( 'i_member=?', Member::loggedIn()->member_id );
$parentContacts = Customer::loggedIn()->parentContacts( array( 'billing=1' ) );
if ( count( $parentContacts ) )
{
$or = array();
foreach ( array_keys( iterator_to_array( $parentContacts ) ) as $id )
{
$where[0] .= ' OR i_member=?';
@@ -114,8 +141,8 @@ class _invoices extends \IPS\Dispatcher\Controller
}
}
$count = \IPS\Db::i()->select( 'COUNT(*)', 'nexus_invoices', $where )->first();
$page = isset( \IPS\Request::i()->page ) ? \IPS\Request::i()->page : 1;
$count = Db::i()->select( 'COUNT(*)', 'nexus_invoices', $where )->first();
$page = isset( Request::i()->page ) ? Request::i()->page : 1;
if ( $page < 1 )
{
@@ -126,13 +153,13 @@ class _invoices extends \IPS\Dispatcher\Controller
if ( $page > $pages )
{
\IPS\Output::i()->redirect( \IPS\Http\Url::internal( "app=nexus&module=clients&controller=invoices", 'front', 'clientsinvoices' ) );
Output::i()->redirect( Url::internal( "app=nexus&module=clients&controller=invoices", 'front', 'clientsinvoices' ) );
}
$pagination = \IPS\Theme::i()->getTemplate( 'global', 'core', 'global' )->pagination( \IPS\Http\Url::internal( "app=nexus&module=clients&controller=invoices", 'front', 'clientsinvoices' ), $pages, $page, static::$invoicesPerPage );
$pagination = Theme::i()->getTemplate( 'global', 'core', 'global' )->pagination( Url::internal( "app=nexus&module=clients&controller=invoices", 'front', 'clientsinvoices' ), $pages, $page, static::$invoicesPerPage );
$invoices = new \IPS\Patterns\ActiveRecordIterator( \IPS\Db::i()->select( '*', 'nexus_invoices', $where, 'i_date DESC', array( ( $page - 1 ) * static::$invoicesPerPage, static::$invoicesPerPage ) ), 'IPS\nexus\Invoice' );
\IPS\Output::i()->output = \IPS\Theme::i()->getTemplate('clients')->invoices( $invoices, $pagination );
$invoices = new ActiveRecordIterator( Db::i()->select( '*', 'nexus_invoices', $where, 'i_date DESC', array( ( $page - 1 ) * static::$invoicesPerPage, static::$invoicesPerPage ) ), 'IPS\nexus\Invoice' );
Output::i()->output = Theme::i()->getTemplate('clients')->invoices( $invoices, $pagination );
}
/**
@@ -140,10 +167,9 @@ class _invoices extends \IPS\Dispatcher\Controller
*
* @return void
*/
public function view()
public function view() : void
{
$shipments = $this->invoice->shipments();
\IPS\Output::i()->output = \IPS\Theme::i()->getTemplate('clients')->invoice( $this->invoice );
Output::i()->output = Theme::i()->getTemplate('clients')->invoice( $this->invoice );
}
/**
@@ -151,18 +177,18 @@ class _invoices extends \IPS\Dispatcher\Controller
*
* @return void
*/
public function poNumber()
public function poNumber() : void
{
$form = new \IPS\Helpers\Form;
$form->class = 'ipsForm_vertical ipsForm_noLabels';
$form->add( new \IPS\Helpers\Form\Text( 'invoice_po_number', $this->invoice->po, FALSE, array( 'maxLength' => 255 ) ) );
$form = new Form;
$form->class = 'ipsForm--vertical ipsForm--po-number ipsForm--noLabels';
$form->add( new Text( 'invoice_po_number', $this->invoice->po, FALSE, array( 'maxLength' => 255 ) ) );
if ( $values = $form->values() )
{
$this->invoice->po = $values['invoice_po_number'];
$this->invoice->save();
\IPS\Output::i()->redirect( $this->invoice->url() );
Output::i()->redirect( $this->invoice->url() );
}
\IPS\Output::i()->output = $form->customTemplate( array( \IPS\Theme::i()->getTemplate( 'forms', 'core' ), 'popupTemplate' ) );;
Output::i()->output = $form->customTemplate( array( Theme::i()->getTemplate( 'forms', 'core' ), 'popupTemplate' ) );
}
/**
@@ -170,19 +196,19 @@ class _invoices extends \IPS\Dispatcher\Controller
*
* @return void
*/
public function notes()
public function notes() : void
{
$form = new \IPS\Helpers\Form;
$form->class = 'ipsForm_vertical ipsForm_noLabels';
$form->add( new \IPS\Helpers\Form\TextArea( 'invoice_notes', $this->invoice->notes ) );
\IPS\Member::loggedIn()->language()->words['invoice_notes_desc'] = '';
$form = new Form;
$form->class = 'ipsForm--vertical ipsForm--invoice-notes ipsForm--noLabels';
$form->add( new TextArea( 'invoice_notes', $this->invoice->notes ) );
Member::loggedIn()->language()->words['invoice_notes_desc'] = '';
if ( $values = $form->values() )
{
$this->invoice->notes = $values['invoice_notes'];
$this->invoice->save();
\IPS\Output::i()->redirect( $this->invoice->url() );
Output::i()->redirect( $this->invoice->url() );
}
\IPS\Output::i()->output = $form->customTemplate( array( \IPS\Theme::i()->getTemplate( 'forms', 'core' ), 'popupTemplate' ) );;
Output::i()->output = $form->customTemplate( array( Theme::i()->getTemplate( 'forms', 'core' ), 'popupTemplate' ) );
}
/**
@@ -190,11 +216,11 @@ class _invoices extends \IPS\Dispatcher\Controller
*
* @return void
*/
public function printout()
public function printout() : void
{
$output = \IPS\Theme::i()->getTemplate( 'invoices', 'nexus', 'global' )->printInvoice( $this->invoice, $this->invoice->summary(), $this->invoice->billaddress ?: $this->invoice->member->primaryBillingAddress() );
\IPS\Output::i()->title = 'I' . $this->invoice->id;
\IPS\Output::i()->sendOutput( \IPS\Theme::i()->getTemplate( 'global', 'core' )->blankTemplate( $output ) );
$output = Theme::i()->getTemplate( 'invoices', 'nexus', 'global' )->printInvoice( $this->invoice, $this->invoice->summary(), $this->invoice->billaddress ?: $this->invoice->member->primaryBillingAddress() );
Output::i()->title = 'I' . $this->invoice->id;
Output::i()->sendOutput( Theme::i()->getTemplate( 'global', 'core' )->blankTemplate( $output ) );
}
/**
@@ -202,42 +228,45 @@ class _invoices extends \IPS\Dispatcher\Controller
*
* @return void
*/
public function cancel()
public function cancel() : void
{
/* CSRF check */
\IPS\Session::i()->csrfCheck();
Session::i()->csrfCheck();
/* Can only cancel the invoice if it's pending and there are no processing transactions */
if ( $this->invoice->status !== \IPS\nexus\Invoice::STATUS_PENDING or \count( $this->invoice->transactions( [ \IPS\nexus\Transaction::STATUS_HELD, \IPS\nexus\Transaction::STATUS_REVIEW, \IPS\nexus\Transaction::STATUS_GATEWAY_PENDING, \IPS\nexus\Transaction::STATUS_DISPUTED ] ) ) )
if ( $this->invoice->status !== Invoice::STATUS_PENDING or count( $this->invoice->transactions( [ Transaction::STATUS_HELD, Transaction::STATUS_REVIEW, Transaction::STATUS_GATEWAY_PENDING, Transaction::STATUS_DISPUTED ] ) ) )
{
\IPS\Output::i()->error( 'order_already_paid', '2X215/4', 403, '' );
Output::i()->error( 'order_already_paid', '2X215/4', 403, '' );
}
/* If they have already made a partial payment, refund it to their account credit */
foreach ( $this->invoice->transactions( array( \IPS\nexus\Transaction::STATUS_PAID, \IPS\nexus\Transaction::STATUS_PART_REFUNDED ) ) as $transaction )
foreach ( $this->invoice->transactions( array( Transaction::STATUS_PAID, Transaction::STATUS_PART_REFUNDED ) ) as $transaction )
{
/* @var Transaction $transaction */
try
{
$transaction->refund( 'credit' );
}
catch ( \Exception $e )
catch ( Exception $e )
{
\IPS\Output::i()->error( 'order_cancel_error', '4C171/5', 500, $e->getMessage() );
Output::i()->error( 'order_cancel_error', '4C171/5', 500, $e->getMessage() );
}
}
/* Cancel the invoice */
$this->invoice->status = \IPS\nexus\invoice::STATUS_CANCELED;
$this->invoice->status = invoice::STATUS_CANCELED;
$this->invoice->save();
$this->invoice->member->log( 'invoice', array( 'type' => 'status', 'new' => 'canc', 'id' => $this->invoice->id, 'title' => $this->invoice->title ) );
/* Run any callbacks (for example, coupons get unmarked as being used) */
foreach ( $this->invoice->items as $k => $item )
foreach ( $this->invoice->items as $item )
{
$item->onInvoiceCancel( $this->invoice );
Event::fire( 'onInvoiceCancel', $item, array( $this->invoice ) );
}
/* Redirect */
\IPS\Output::i()->redirect( $this->invoice->url() );
Output::i()->redirect( $this->invoice->url() );
}
}
@@ -12,63 +12,91 @@
namespace IPS\nexus\modules\front\clients;
/* To prevent PHP errors (extending class does not exist) revealing path */
if ( !\defined( '\IPS\SUITE_UNIQUE_KEY' ) )
use IPS\Application;
use IPS\Db;
use IPS\Dispatcher\Controller;
use IPS\Helpers\Form;
use IPS\Helpers\Form\Number;
use IPS\Http\Url;
use IPS\Login;
use IPS\Member;
use IPS\nexus\Customer;
use IPS\nexus\Invoice;
use IPS\nexus\Invoice\Item\Renewal;
use IPS\nexus\Purchase;
use IPS\Output;
use IPS\Patterns\ActiveRecordIterator;
use IPS\Request;
use IPS\Session;
use IPS\Theme;
use OutOfRangeException;
use function count;
use function defined;
use function intval;
if ( !defined( '\IPS\SUITE_UNIQUE_KEY' ) )
{
header( ( isset( $_SERVER['SERVER_PROTOCOL'] ) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.0' ) . ' 403 Forbidden' );
header( ( $_SERVER['SERVER_PROTOCOL'] ?? 'HTTP/1.0' ) . ' 403 Forbidden' );
exit;
}
/**
* Purchases
*/
class _purchases extends \IPS\Dispatcher\Controller
class purchases extends Controller
{
/**
* @brief Purchase object
*/
protected ?Purchase $purchase = NULL;
/**
* Execute
*
* @return void
*/
public function execute()
public function execute() : void
{
if ( !\IPS\Member::loggedIn()->member_id )
if ( !Member::loggedIn()->member_id )
{
\IPS\Output::i()->error( 'no_module_permission_guest', '2X212/6', 403, '' );
Output::i()->error( 'no_module_permission_guest', '2X212/6', 403, '' );
}
/* Purchases breadcrumb */
\IPS\Output::i()->breadcrumb[] = array( \IPS\Http\Url::internal( 'app=nexus&module=clients&controller=purchases', 'front', 'clientspurchases' ), \IPS\Member::loggedIn()->language()->addToStack('client_purchases') );
Output::i()->breadcrumb[] = array( Url::internal( 'app=nexus&module=clients&controller=purchases', 'front', 'clientspurchases' ), Member::loggedIn()->language()->addToStack('client_purchases') );
/* Load Purchase */
if ( isset( \IPS\Request::i()->id ) )
if ( isset( Request::i()->id ) )
{
try
{
$this->purchase = \IPS\nexus\Purchase::load( \IPS\Request::i()->id );
$this->purchase = Purchase::load( Request::i()->id );
}
catch ( \OutOfRangeException $e )
catch ( OutOfRangeException )
{
\IPS\Output::i()->error( 'node_error', '2X212/1', 404, '' );
Output::i()->error( 'node_error', '2X212/1', 404, '' );
}
if ( !$this->purchase->canView() )
{
\IPS\Output::i()->error( 'no_module_permission', '2X212/2', 403, '' );
Output::i()->error( 'no_module_permission', '2X212/2', 403, '' );
}
\IPS\Output::i()->breadcrumb[] = array( $this->purchase->url(), $this->purchase->name );
\IPS\Output::i()->title = $this->purchase->name;
Output::i()->breadcrumb[] = array( $this->purchase->url(), $this->purchase->name );
Output::i()->title = $this->purchase->name;
}
else
{
\IPS\Output::i()->title = \IPS\Member::loggedIn()->language()->addToStack('client_purchases');
if ( isset( \IPS\Request::i()->do ) )
Output::i()->title = Member::loggedIn()->language()->addToStack('client_purchases');
if ( isset( Request::i()->do ) )
{
\IPS\Output::i()->error( 'node_error', '2X212/3', 403, '' );
Output::i()->error( 'node_error', '2X212/3', 403, '' );
}
}
/* Execute */
\IPS\Output::i()->cssFiles = array_merge( \IPS\Output::i()->cssFiles, \IPS\Theme::i()->css( 'clients.css', 'nexus' ) );
\IPS\Output::i()->sidebar['enabled'] = FALSE;
Output::i()->cssFiles = array_merge( Output::i()->cssFiles, Theme::i()->css( 'clients.css', 'nexus' ) );
Output::i()->sidebar['enabled'] = FALSE;
parent::execute();
}
@@ -77,30 +105,29 @@ class _purchases extends \IPS\Dispatcher\Controller
*
* @return void
*/
protected function manage()
protected function manage() : void
{
$where = array( array( 'ps_member=?', \IPS\Member::loggedIn()->member_id ) );
$where = array( array( 'ps_member=?', Member::loggedIn()->member_id ) );
$parentContacts = \IPS\nexus\Customer::loggedIn()->parentContacts();
if ( \count( $parentContacts ) )
$parentContacts = Customer::loggedIn()->parentContacts();
if ( count( $parentContacts ) )
{
$or = array();
foreach ( $parentContacts as $contact )
{
$where[0][0] .= ' OR ' . \IPS\Db::i()->in( 'ps_id', $contact->purchaseIds() );
$where[0][0] .= ' OR ' . Db::i()->in( 'ps_id', $contact->purchaseIds() );
}
}
$where[] = array( 'ps_show=1' );
/* Get only the purchases from active applications */
$where[] = array( "ps_app IN('" . implode( "','", array_keys( \IPS\Application::enabledApplications() ) ) . "')" );
$where[] = array( "ps_app IN('" . implode( "','", array_keys( Application::enabledApplications() ) ) . "')" );
$purchases = array();
foreach( new \IPS\Patterns\ActiveRecordIterator( \IPS\Db::i()->select( '*', 'nexus_purchases', $where, 'ps_active DESC, ps_expire DESC, ps_start DESC' ), 'IPS\nexus\Purchase' ) as $purchase )
foreach( new ActiveRecordIterator( Db::i()->select( '*', 'nexus_purchases', $where, 'ps_active DESC, ps_expire DESC, ps_start DESC' ), 'IPS\nexus\Purchase' ) as $purchase )
{
$purchases[ $purchase->parent ][ $purchase->id ] = $purchase;
}
\IPS\Output::i()->output = \IPS\Theme::i()->getTemplate('clients')->purchases( $purchases );
Output::i()->output = Theme::i()->getTemplate('clients')->purchases( $purchases );
}
/**
@@ -108,9 +135,9 @@ class _purchases extends \IPS\Dispatcher\Controller
*
* @return void
*/
public function view()
public function view() : void
{
\IPS\Output::i()->output = \IPS\Theme::i()->getTemplate('clients')->purchase( $this->purchase );
Output::i()->output = Theme::i()->getTemplate('clients')->purchase( $this->purchase );
}
/**
@@ -118,23 +145,10 @@ class _purchases extends \IPS\Dispatcher\Controller
*
* @return void
*/
protected function extra()
protected function extra() : void
{
if ( $output = $this->purchase->clientAreaAction() )
{
if ( \IPS\Request::i()->isAjax() )
{
\IPS\Output::i()->output = $output;
}
else
{
\IPS\Output::i()->output = $output;
}
}
else
{
\IPS\Output::i()->redirect( $this->purchase->url() );
}
$this->purchase->clientAreaAction();
Output::i()->redirect( $this->purchase->url() );
}
/**
@@ -142,20 +156,20 @@ class _purchases extends \IPS\Dispatcher\Controller
*
* @return void
*/
protected function renew()
protected function renew() : void
{
$cycles = $this->purchase->canRenewUntil( NULL, TRUE );
if ( $cycles === FALSE )
{
\IPS\Output::i()->error( 'you_cannot_renew', '2X212/4', 403, '' );
Output::i()->error( 'you_cannot_renew', '2X212/4', 403, '' );
}
elseif ( $cycles === 1 )
{
\IPS\Session::i()->csrfCheck();
Session::i()->csrfCheck();
}
elseif ( isset( \IPS\Request::i()->cycles ) and \IPS\Login::compareHashes( (string) \IPS\Session::i()->csrfKey, (string) \IPS\Request::i()->csrfKey ) )
elseif ( isset( Request::i()->cycles ) and Login::compareHashes( (string) Session::i()->csrfKey, (string) Request::i()->csrfKey ) )
{
$_cycles = \intval( \IPS\Request::i()->cycles );
$_cycles = intval( Request::i()->cycles );
if ( $_cycles >= 1 and ( $cycles === TRUE or $_cycles <= $cycles ) )
{
$cycles = $_cycles;
@@ -172,31 +186,31 @@ class _purchases extends \IPS\Dispatcher\Controller
switch( $term['unit'] )
{
case 'd':
$suffix = \IPS\Member::loggedIn()->language()->addToStack('days');
$suffix = Member::loggedIn()->language()->addToStack('days');
break;
case 'm':
$suffix = \IPS\Member::loggedIn()->language()->addToStack('months');
$suffix = Member::loggedIn()->language()->addToStack('months');
break;
case 'y':
$suffix = \IPS\Member::loggedIn()->language()->addToStack('years');
$suffix = Member::loggedIn()->language()->addToStack('years');
break;
}
}
$form = new \IPS\Helpers\Form( 'form', 'continue' );
$form->class = 'ipsForm_vertical';
$form->add( new \IPS\Helpers\Form\Number( 'renew_for', 1, TRUE, array( 'min' => 1, 'max' => $cycles === TRUE ? NULL : $cycles ), NULL, NULL, $suffix ) );
$form = new Form( 'form', 'continue' );
$form->class = 'ipsForm--vertical ipsForm--renew';
$form->add( new Number( 'renew_for', 1, TRUE, array( 'min' => 1, 'max' => $cycles === TRUE ? NULL : $cycles ), NULL, NULL, $suffix ) );
if( $values = $form->values() or $cycles === 1 )
{
if ( $pendingInvoice = $this->purchase->invoice_pending and $pendingInvoice->status === $pendingInvoice::STATUS_PENDING )
{
if ( \count( $pendingInvoice->items ) === 1 )
if ( count( $pendingInvoice->items ) === 1 )
{
foreach ( $pendingInvoice->items as $item )
{
if ( $item instanceof \IPS\nexus\Invoice\Item\Renewal and $item->id === $this->purchase->id and $item->quantity === ( $cycles === 1 ? 1 : $values['renew_for'] ) )
if ( $item instanceof Renewal and $item->id === $this->purchase->id and $item->quantity === ( $cycles === 1 ? 1 : $values['renew_for'] ) )
{
\IPS\Output::i()->redirect( $pendingInvoice->checkoutUrl() );
Output::i()->redirect( $pendingInvoice->checkoutUrl() );
}
}
}
@@ -206,19 +220,19 @@ class _purchases extends \IPS\Dispatcher\Controller
$pendingInvoice->member->log( 'invoice', array( 'type' => 'status', 'new' => 'canc', 'id' => $pendingInvoice->id, 'title' => $pendingInvoice->title ) );
}
$invoice = new \IPS\nexus\Invoice;
$invoice->member = \IPS\nexus\Customer::loggedIn();
$invoice = new Invoice;
$invoice->member = Customer::loggedIn();
$invoice->currency = $this->purchase->renewals->cost->currency;
$invoice->addItem( \IPS\nexus\Invoice\Item\Renewal::create( $this->purchase, $cycles === 1 ? 1 : $values['renew_for'] ) );
$invoice->addItem( Renewal::create( $this->purchase, $cycles === 1 ? 1 : $values['renew_for'] ) );
$invoice->save();
$this->purchase->invoice_pending = $invoice;
$this->purchase->save();
\IPS\Output::i()->redirect( $invoice->checkoutUrl() );
Output::i()->redirect( $invoice->checkoutUrl() );
}
\IPS\Output::i()->output = $form->customTemplate( array( \IPS\Theme::i()->getTemplate( 'forms', 'core' ), 'popupTemplate' ) );
Output::i()->output = $form->customTemplate( array( Theme::i()->getTemplate( 'forms', 'core' ), 'popupTemplate' ) );
}
/**
@@ -226,13 +240,13 @@ class _purchases extends \IPS\Dispatcher\Controller
*
* @return void
*/
protected function cancel()
protected function cancel() : void
{
\IPS\Session::i()->csrfCheck();
Session::i()->csrfCheck();
if ( !$this->purchase->canCancel() )
{
\IPS\Output::i()->error( 'you_cannot_cancel', '2X212/5', 403, '' );
Output::i()->error( 'you_cannot_cancel', '2X212/5', 403, '' );
}
$this->purchase->member->log( 'purchase', array( 'type' => 'info', 'id' => $this->purchase->id, 'name' => $this->purchase->name, 'info' => 'remove_renewals' ) );
@@ -240,7 +254,7 @@ class _purchases extends \IPS\Dispatcher\Controller
/* If we have a pending renewal invoice, cancel it (as at this point, we need to reactivate instead) */
if ( $this->purchase->invoice_pending )
{
$this->purchase->invoice_pending->status = \IPS\nexus\Invoice::STATUS_CANCELED; # The constant has a typo and it make me sad
$this->purchase->invoice_pending->status = Invoice::STATUS_CANCELED; # The constant has a typo and it make me sad
$this->purchase->invoice_pending->save();
$this->purchase->invoice_pending = NULL;
@@ -250,10 +264,10 @@ class _purchases extends \IPS\Dispatcher\Controller
$this->purchase->can_reactivate = TRUE;
$this->purchase->save();
if ( $ref = \IPS\Request::i()->referrer( FALSE, TRUE ) )
if ( $ref = Request::i()->referrer( FALSE, TRUE ) )
{
\IPS\Output::i()->redirect( $ref );
Output::i()->redirect( $ref );
}
\IPS\Output::i()->redirect( $this->purchase->url() );
Output::i()->redirect( $this->purchase->url() );
}
}
@@ -12,25 +12,31 @@
namespace IPS\nexus\modules\front\clients;
/* To prevent PHP errors (extending class does not exist) revealing path */
if ( !\defined( '\IPS\SUITE_UNIQUE_KEY' ) )
use IPS\Dispatcher\Controller;
use IPS\Http\Url;
use IPS\Output;
use function defined;
if ( !defined( '\IPS\SUITE_UNIQUE_KEY' ) )
{
header( ( isset( $_SERVER['SERVER_PROTOCOL'] ) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.0' ) . ' 403 Forbidden' );
header( ( $_SERVER['SERVER_PROTOCOL'] ?? 'HTTP/1.0' ) . ' 403 Forbidden' );
exit;
}
/**
* Legacy Referrals Controller
*/
class _referrals extends \IPS\Dispatcher\Controller
class referrals extends Controller
{
/**
* Manage
*
* @return void
*/
protected function manage()
protected function manage() : void
{
/* Referrals have moved to the core. */
\IPS\Output::i()->redirect( \IPS\Http\Url::internal( "app=core&module=system&controller=settings&area=referrals", 'front', 'settings_referrals' ) );
Output::i()->redirect( Url::internal( "app=core&module=system&controller=settings&area=referrals", 'front', 'settings_referrals' ) );
}
}
@@ -12,44 +12,53 @@
namespace IPS\nexus\modules\front\clients;
/* To prevent PHP errors (extending class does not exist) revealing path */
if ( !\defined( '\IPS\SUITE_UNIQUE_KEY' ) )
use IPS\Db;
use IPS\Dispatcher\Controller;
use IPS\Http\Url;
use IPS\Member;
use IPS\nexus\Customer;
use IPS\Output;
use function count;
use function defined;
if ( !defined( '\IPS\SUITE_UNIQUE_KEY' ) )
{
header( ( isset( $_SERVER['SERVER_PROTOCOL'] ) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.0' ) . ' 403 Forbidden' );
header( ( $_SERVER['SERVER_PROTOCOL'] ?? 'HTTP/1.0' ) . ' 403 Forbidden' );
exit;
}
/**
* Controller to redirect /clients to something sensible
*/
class _splash extends \IPS\Dispatcher\Controller
class splash extends Controller
{
/**
* Execute
*
* @return void
*/
public function execute()
public function execute() : void
{
if ( \IPS\Member::loggedIn()->member_id )
if ( Member::loggedIn()->member_id )
{
$where = array( array( 'ps_member=?', \IPS\Member::loggedIn()->member_id ) );
$parentContacts = \IPS\nexus\Customer::loggedIn()->parentContacts();
if ( \count( $parentContacts ) )
$where = array( array( 'ps_member=?', Member::loggedIn()->member_id ) );
$parentContacts = Customer::loggedIn()->parentContacts();
if ( count( $parentContacts ) )
{
$or = array();
foreach ( $parentContacts as $contact )
{
$where[0][0] .= ' OR ' . \IPS\Db::i()->in( 'ps_id', $contact->purchaseIds() );
$where[0][0] .= ' OR ' . Db::i()->in( 'ps_id', $contact->purchaseIds() );
}
}
$where[] = array( 'ps_show=1' );
if ( \IPS\Db::i()->select( 'COUNT(*)', 'nexus_purchases', $where )->first() )
if ( Db::i()->select( 'COUNT(*)', 'nexus_purchases', $where )->first() )
{
\IPS\Output::i()->redirect( \IPS\Http\Url::internal( 'app=nexus&module=clients&controller=purchases', 'front', 'clientspurchases' ) );
Output::i()->redirect( Url::internal( 'app=nexus&module=clients&controller=purchases', 'front', 'clientspurchases' ) );
}
}
\IPS\Output::i()->redirect( \IPS\Http\Url::internal( 'app=nexus&module=clients&controller=invoices', 'front', 'clientsinvoices' ) );
Output::i()->redirect( Url::internal( 'app=nexus&module=clients&controller=invoices', 'front', 'clientsinvoices' ) );
}
}