Version 4.0.13.1

This commit is contained in:
Neo committed 2025-12-19 04:57:54 -08:00
1 parent f9e857d255
commit c6a86f0d9b
7517 files changed
+597400 -668041

No files matched your search

File diff suppressed because it is too large. Load diff
Whitespace-only changes.
@@ -0,0 +1,190 @@
<?php
/**
* @brief Addresses
* @author <a href='http://www.invisionpower.com'>Invision Power Services, Inc.</a>
* @copyright (c) 2001 - SVN_YYYY Invision Power Services, Inc.
* @license http://www.invisionpower.com/legal/standards/
* @package IPS Social Suite
* @subpackage Nexus
* @since 06 May 2014
* @version SVN_VERSION_NUMBER
*/
namespace IPS\nexus\modules\front\clients;
/* To prevent PHP errors (extending class does not exist) revealing path */
if ( !defined( '\IPS\SUITE_UNIQUE_KEY' ) )
{
header( ( isset( $_SERVER['SERVER_PROTOCOL'] ) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.0' ) . ' 403 Forbidden' );
exit;
}
/**
* Addresses
*/
class _addresses extends \IPS\Dispatcher\Controller
{
/**
* Execute
*
* @return void
*/
public function execute()
{
if ( !\IPS\Member::loggedIn()->member_id )
{
\IPS\Output::i()->error( 'no_module_permission_guest', '2X235/1', 403, '' );
}
if ( mb_strtolower( $_SERVER['REQUEST_METHOD'] ) == 'get' and \IPS\Settings::i()->nexus_https and \IPS\Request::i()->url()->data['scheme'] !== 'https' )
{
\IPS\Output::i()->redirect( new \IPS\Http\Url( preg_replace( '/^http:/', 'https:', \IPS\Request::i()->url() ) ) );
}
\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', array(), \IPS\Settings::i()->nexus_https ), \IPS\Member::loggedIn()->language()->addToStack('client_addresses') );
\IPS\Output::i()->title = \IPS\Member::loggedIn()->language()->addToStack('client_addresses');
\IPS\Output::i()->sidebar['enabled'] = FALSE;
parent::execute();
}
/**
* View List
*
* @return void
*/
protected function manage()
{
$addresses = new \IPS\Patterns\ActiveRecordIterator( \IPS\Db::i()->select( '*', 'nexus_customer_addresses', array( 'member=?', \IPS\Member::loggedIn()->member_id ) ), 'IPS\nexus\Customer\Address' );
$shippingAddress = NULL;
$billingAddress = NULL;
$otherAddresses = array();
foreach ( $addresses as $address )
{
if( $address->primary_billing )
{
$billingAddress = $address;
}
if( $address->primary_shipping )
{
$shippingAddress = $address;
}
if( !$address->primary_shipping && !$address->primary_billing )
{
$otherAddresses[] = $address;
}
}
\IPS\Output::i()->output = \IPS\Theme::i()->getTemplate('clients')->template( \IPS\Theme::i()->getTemplate('clients')->addresses( $billingAddress, $shippingAddress, $otherAddresses ) );
}
/**
* Add/Edit
*
* @return void
*/
protected function form()
{
$existing = NULL;
if ( isset( \IPS\Request::i()->id ) )
{
try
{
$existing = \IPS\nexus\Customer\Address::load( \IPS\Request::i()->id );
if ( $existing->member->member_id != \IPS\Member::loggedIn()->member_id )
{
throw new \OutOfRangeException;
}
}
catch ( \OutOfRangeException $e )
{
$existing = NULL;
}
}
$form = new \IPS\Helpers\Form;
$form->add( new \IPS\Helpers\Form\Address( 'address', $existing ? $existing->address : NULL, TRUE ) );
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'] ) ) );
}
else
{
\IPS\nexus\Customer::loggedIn()->log( 'address', array( 'type' => 'edit', 'new' => json_encode( $values['address'] ), 'old' => json_encode( $existing->address ) ) );
}
$existing->address = $values['address'];
$existing->save();
\IPS\Output::i()->redirect( \IPS\Http\Url::internal( 'app=nexus&module=clients&controller=addresses', 'front', 'clientsaddresses', array(), \IPS\Settings::i()->nexus_https ) );
}
if ( \IPS\Request::i()->isAjax() )
{
$form->class = 'ipsForm_vertical ipsForm_noLabels';
\IPS\Output::i()->sendOutput( $form->customTemplate( array( call_user_func_array( array( \IPS\Theme::i(), 'getTemplate' ), array( 'forms', 'core' ) ), 'popupTemplate' ) ) );
}
else
{
\IPS\Output::i()->output = \IPS\Theme::i()->getTemplate('clients')->template( $form );
}
}
/**
* Make Primary
*
* @return void
*/
protected function primary()
{
try
{
$address = \IPS\nexus\Customer\Address::load( \IPS\Request::i()->id );
if ( $address->member->member_id == \IPS\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;
$address->save();
\IPS\nexus\Customer::loggedIn()->log( 'address', array( 'type' => ( \IPS\Request::i()->primary === 'billing' ? 'primary_billing' : 'primary_shipping' ), 'details' => json_encode( $address->address ) ) );
}
}
catch ( \OutOfRangeException $e ) {}
\IPS\Output::i()->redirect( \IPS\Http\Url::internal( 'app=nexus&module=clients&controller=addresses', 'front', 'clientsaddresses', array(), \IPS\Settings::i()->nexus_https ) );
}
/**
* Delete
*
* @return void
*/
protected function delete()
{
try
{
$address = \IPS\nexus\Customer\Address::load( \IPS\Request::i()->id );
if ( $address->member->member_id == \IPS\Member::loggedIn()->member_id )
{
$address->delete();
\IPS\nexus\Customer::loggedIn()->log( 'address', array( 'type' => 'delete', 'details' => json_encode( $address->address ) ) );
}
}
catch ( \OutOfRangeException $e ) {}
\IPS\Output::i()->redirect( \IPS\Http\Url::internal( 'app=nexus&module=clients&controller=addresses', 'front', 'clientsaddresses', array(), \IPS\Settings::i()->nexus_https ) );
}
}
@@ -0,0 +1,157 @@
<?php
/**
* @brief Alternative Contacts
* @author <a href='http://www.invisionpower.com'>Invision Power Services, Inc.</a>
* @copyright (c) 2001 - SVN_YYYY Invision Power Services, Inc.
* @license http://www.invisionpower.com/legal/standards/
* @package IPS Social Suite
* @subpackage Nexus
* @since 08 May 2014
* @version SVN_VERSION_NUMBER
*/
namespace IPS\nexus\modules\front\clients;
/* To prevent PHP errors (extending class does not exist) revealing path */
if ( !defined( '\IPS\SUITE_UNIQUE_KEY' ) )
{
header( ( isset( $_SERVER['SERVER_PROTOCOL'] ) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.0' ) . ' 403 Forbidden' );
exit;
}
/**
* Alternative Contacts
*/
class _alternatives extends \IPS\Dispatcher\Controller
{
/**
* Execute
*
* @return void
*/
public function execute()
{
if ( !\IPS\Member::loggedIn()->member_id )
{
\IPS\Output::i()->error( 'no_module_permission_guest', '2X237/1', 403, '' );
}
if ( mb_strtolower( $_SERVER['REQUEST_METHOD'] ) == 'get' and \IPS\Settings::i()->nexus_https and \IPS\Request::i()->url()->data['scheme'] !== 'https' )
{
\IPS\Output::i()->redirect( new \IPS\Http\Url( preg_replace( '/^http:/', 'https:', \IPS\Request::i()->url() ) ) );
}
\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', array(), \IPS\Settings::i()->nexus_https ), \IPS\Member::loggedIn()->language()->addToStack('client_alternatives') );
\IPS\Output::i()->title = \IPS\Member::loggedIn()->language()->addToStack('client_alternatives');
\IPS\Output::i()->sidebar['enabled'] = FALSE;
parent::execute();
}
/**
* View List
*
* @return void
*/
protected function manage()
{
foreach ( \IPS\nexus\Customer::loggedIn()->alternativeContacts() as $contact )
{
$contact->alt_id;
}
\IPS\Output::i()->output = \IPS\Theme::i()->getTemplate('clients')->template( \IPS\Theme::i()->getTemplate('clients')->alternatives() );
}
/**
* Add/Edit
*
* @return void
*/
protected function form()
{
$existing = NULL;
if ( isset( \IPS\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() );
}
catch ( \UnderflowException $e ) {}
}
$form = new \IPS\Helpers\Form;
$form->class = 'ipsForm_vertical';
if ( !$existing )
{
$form->add( new \IPS\Helpers\Form\Email( 'altcontact_email', NULL, TRUE, array(), function( $val )
{
$member = \IPS\Member::load( $val, 'email' );
if ( !$member->member_id )
{
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');
}
catch ( \UnderflowException $e ) {}
} ) );
}
$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 ) );
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'] ) );
}
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->purchases = $values['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', array(), \IPS\Settings::i()->nexus_https ) );
}
if( \IPS\Request::i()->isAjax() )
{
\IPS\Output::i()->sendOutput( $form->customTemplate( array( call_user_func_array( array( \IPS\Theme::i(), 'getTemplate' ), array( 'forms', 'core' ) ), 'popupTemplate' ) ) );
}
else
{
\IPS\Output::i()->output = \IPS\Theme::i()->getTemplate('clients')->template( $form );
}
}
/**
* Delete
*
* @return void
*/
protected function delete()
{
\IPS\Session::i()->csrfCheck();
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->delete();
\IPS\nexus\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', array(), \IPS\Settings::i()->nexus_https ) );
}
}
@@ -0,0 +1,117 @@
<?php
/**
* @brief Cards
* @author <a href='http://www.invisionpower.com'>Invision Power Services, Inc.</a>
* @copyright (c) 2001 - SVN_YYYY Invision Power Services, Inc.
* @license http://www.invisionpower.com/legal/standards/
* @package IPS Social Suite
* @subpackage Nexus
* @since 08 May 2014
* @version SVN_VERSION_NUMBER
*/
namespace IPS\nexus\modules\front\clients;
/* To prevent PHP errors (extending class does not exist) revealing path */
if ( !defined( '\IPS\SUITE_UNIQUE_KEY' ) )
{
header( ( isset( $_SERVER['SERVER_PROTOCOL'] ) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.0' ) . ' 403 Forbidden' );
exit;
}
/**
* Cards
*/
class _cards extends \IPS\Dispatcher\Controller
{
/**
* Execute
*
* @return void
*/
public function execute()
{
if ( !\IPS\Member::loggedIn()->member_id )
{
\IPS\Output::i()->error( 'no_module_permission_guest', '2X236/1', 403, '' );
}
if ( mb_strtolower( $_SERVER['REQUEST_METHOD'] ) == 'get' and \IPS\Settings::i()->nexus_https and \IPS\Request::i()->url()->data['scheme'] !== 'https' )
{
\IPS\Output::i()->redirect( new \IPS\Http\Url( preg_replace( '/^http:/', 'https:', \IPS\Request::i()->url() ) ) );
}
\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', array(), \IPS\Settings::i()->nexus_https ), \IPS\Member::loggedIn()->language()->addToStack('client_cards') );
\IPS\Output::i()->title = \IPS\Member::loggedIn()->language()->addToStack('client_cards');
\IPS\Output::i()->sidebar['enabled'] = FALSE;
parent::execute();
}
/**
* View List
*
* @return void
*/
protected function manage()
{
$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 )
{
try
{
$cardData = $card->card;
$cards[ $card->id ] = array(
'id' => $card->id,
'card_type' => $cardData->type,
'card_number' => $cardData->lastFour,
'card_expire' => str_pad( $cardData->expMonth , 2, '0', STR_PAD_LEFT ). '/' . $cardData->expYear
);
}
catch ( \Exception $e ) { }
}
\IPS\Output::i()->output = \IPS\Theme::i()->getTemplate('clients')->template( \IPS\Theme::i()->getTemplate('clients')->cards( $cards ) );
}
/**
* Add
*
* @return void
*/
public function add()
{
$form = \IPS\nexus\Customer\CreditCard::create( \IPS\nexus\Customer::loggedIn() );
if ( $form instanceof \IPS\nexus\Customer\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', array(), \IPS\Settings::i()->nexus_https ) );
}
else
{
\IPS\Output::i()->output = \IPS\Theme::i()->getTemplate('clients')->template( $form );
}
}
/**
* Delete
*
* @return void
*/
public function delete()
{
\IPS\Session::i()->csrfCheck();
try
{
$card = \IPS\nexus\Customer\CreditCard::load( \IPS\Request::i()->id );
if ( $card->member->member_id === \IPS\nexus\Customer::loggedIn()->member_id )
{
$card->delete();
\IPS\nexus\Customer::loggedIn()->log( 'card', array( 'type' => 'delete', 'number' => $card->card->lastFour ) );
}
}
catch ( \Exception $e ) { }
\IPS\Output::i()->redirect( \IPS\Http\Url::internal( 'app=nexus&module=clients&controller=cards', 'front', 'clientscards', array(), \IPS\Settings::i()->nexus_https ) );
}
}
@@ -0,0 +1,436 @@
<?php
/**
* @brief Account Credit
* @author <a href='http://www.invisionpower.com'>Invision Power Services, Inc.</a>
* @copyright (c) 2001 - SVN_YYYY Invision Power Services, Inc.
* @license http://www.invisionpower.com/legal/standards/
* @package IPS Social Suite
* @subpackage Nexus
* @since 08 May 2014
* @version SVN_VERSION_NUMBER
*/
namespace IPS\nexus\modules\front\clients;
/* To prevent PHP errors (extending class does not exist) revealing path */
if ( !defined( '\IPS\SUITE_UNIQUE_KEY' ) )
{
header( ( isset( $_SERVER['SERVER_PROTOCOL'] ) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.0' ) . ' 403 Forbidden' );
exit;
}
/**
* Account Credit
*/
class _credit extends \IPS\Dispatcher\Controller
{
/**
* Execute
*
* @return void
*/
public function execute()
{
if ( !\IPS\Member::loggedIn()->member_id )
{
\IPS\Output::i()->error( 'no_module_permission_guest', '2X239/1', 403, '' );
}
if ( mb_strtolower( $_SERVER['REQUEST_METHOD'] ) == 'get' and \IPS\Settings::i()->nexus_https and \IPS\Request::i()->url()->data['scheme'] !== 'https' )
{
\IPS\Output::i()->redirect( new \IPS\Http\Url( preg_replace( '/^http:/', 'https:', \IPS\Request::i()->url() ) ) );
}
\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', array(), \IPS\Settings::i()->nexus_https ), \IPS\Member::loggedIn()->language()->addToStack('client_credit') );
\IPS\Output::i()->title = \IPS\Member::loggedIn()->language()->addToStack('client_credit');
\IPS\Output::i()->sidebar['enabled'] = FALSE;
parent::execute();
}
/**
* View
*
* @return void
*/
protected function manage()
{
/* Get Balance(s) */
$balance = array_filter( \IPS\nexus\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;
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 ), NULL, NULL, \IPS\Db::SELECT_SQL_CALC_FOUND_ROWS );
$pastWithdrawalsPagination = \IPS\Theme::i()->getTemplate( 'global', 'core', 'global' )->pagination(
\IPS\Http\Url::internal( 'app=nexus&module=clients&controller=credit', 'front', 'clientscredit', array(), \IPS\Settings::i()->nexus_https ),
ceil( $pastWithdrawalsSelect->count( TRUE ) / $perPage ),
$page,
$perPage
);
$pastWithdrawals = new \IPS\Patterns\ActiveRecordIterator( $pastWithdrawalsSelect, 'IPS\nexus\Payout' );
/* Can we withdraw? */
$canWithdraw = FALSE;
$withdrawOptions = json_decode( \IPS\Settings::i()->nexus_payout, TRUE );
if ( count( $withdrawOptions ) )
{
foreach ( \IPS\nexus\Money::currencies() as $currency )
{
if ( isset( $balance[ $currency ] ) )
{
$canWithdraw = TRUE;
}
}
}
/* Can we topup? */
$canTopup = FALSE;
if ( \IPS\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;
$maximums = array();
foreach ( array_merge( array( \IPS\nexus\Customer::loggedIn() ), iterator_to_array( \IPS\nexus\Customer::loggedIn()->parentContacts( array('billing=1') ) ) ) as $account )
{
if ( $account instanceof \IPS\nexus\Customer\AlternativeContact )
{
$account = $account->main_id;
}
foreach ( $account->cm_credits as $value )
{
$max = $maximumBalanceAmounts ? ( $maximumBalanceAmounts[ $value->currency ]['amount'] - $value->amount ) : NULL;
if ( is_null( $max ) or $max > 0 )
{
$canTopup = TRUE;
}
}
}
}
/* Display */
\IPS\Output::i()->output = \IPS\Theme::i()->getTemplate('clients')->template( \IPS\Theme::i()->getTemplate('clients')->credit( $balance, $pastWithdrawals, $pastWithdrawalsPagination, $canWithdraw, $canTopup ) );
}
/**
* Withdraw
*
* @return void
*/
protected function withdraw()
{
$withdrawForm = NULL;
$withdrawOptions = json_decode( \IPS\Settings::i()->nexus_payout, TRUE );
if ( count( $withdrawOptions ) )
{
$withdrawForm = new \IPS\Helpers\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;
$balance = array_filter( \IPS\nexus\Customer::loggedIn()->cm_credits, function( $val )
{
return $val->amount;
} );
$currencyOptions = array();
if ( count( $balance ) > 1 )
{
$currencyToggles = array();
foreach ( \IPS\nexus\Money::currencies() as $currency )
{
if ( isset( $balance[ $currency ] ) )
{
$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 ) ) );
}
$canWithdraw = FALSE;
foreach ( \IPS\nexus\Money::currencies() as $currency )
{
if ( !isset( $balance[ $currency ] ) )
{
continue;
}
$min = $minimumWithdrawalsAmounts ? ( $minimumWithdrawalsAmounts[ $currency ]['amount'] ) : NULL;
$max = $balance[ $currency ]->amount;
$field = new \IPS\Helpers\Form\Number( 'withdraw_amount_' . $currency, $max, count( $currencyOptions ) ? NULL : TRUE, array( 'min' => $min, 'max' => $max, 'decimals' => TRUE ), count( $currencyOptions ) ? NULL : function( $val ) use ( $currency )
{
if ( !$val and \IPS\Request::i()->withdraw_currency === $currency )
{
throw new \DomainException('form_required');
}
}, NULL, $currency, 'withdraw_amount_' . $currency );
$field->label = \IPS\Member::loggedIn()->language()->addToStack('withdraw_amount');
$withdrawForm->add( $field );
$canWithdraw = TRUE;
}
if ( $canWithdraw )
{
$options = array();
$toggles = array();
$fields = array();
foreach ( $withdrawOptions as $k => $settings )
{
$options[ $k ] = $k === 'Manual' ? $settings['name'] : 'withdraw__' . $k;
$toggles[ $k ] = array();
$class = 'IPS\nexus\Gateway\\' . $k . '\Payout';
foreach ( $class::form() as $field )
{
if ( !$field->htmlId )
{
$field->htmlId = $field->name;
$toggles[ $k ][] = $field->htmlId;
}
$fields[] = $field;
}
}
if ( count( $withdrawOptions ) > 1 )
{
$withdrawForm->add( new \IPS\Helpers\Form\Radio( 'withdraw_method', NULL, TRUE, array( 'options' => $options, 'toggles' => $toggles ) ) );
}
foreach ( $fields as $field )
{
$withdrawForm->add( $field );
}
if ( $values = $withdrawForm->values() )
{
$currencies = array_keys( $balance );
$currency = count( $currencyOptions ) ? $values['withdraw_currency'] : array_pop( $currencies );
$withdrawMethods = array_keys( $options );
if ( count( $withdrawMethods ) === 1 )
{
$key = array_pop( $withdrawMethods );
$class = 'IPS\nexus\Gateway\\' . $key . '\Payout';
}
else
{
$class = 'IPS\nexus\Gateway\\' . $values['withdraw_method'] . '\Payout';
}
$payout = new $class;
$payout->amount = new \IPS\nexus\Money( $values[ 'withdraw_amount_' . $currency ], $currency );
$payout->member = \IPS\nexus\Customer::loggedIn();
try
{
$payout->data = $payout->getData( $values );
}
catch ( \DomainException $e )
{
\IPS\Output::i()->error( $e->getMessage(), '1X239/2', 403, '' );
}
$payout->ip = \IPS\Request::i()->ipAddress();
$payout->save();
$credits = \IPS\nexus\Customer::loggedIn()->cm_credits;
$credits[ $currency ]->amount -= $values[ 'withdraw_amount_' . $currency ];
\IPS\nexus\Customer::loggedIn()->cm_credits = $credits;
\IPS\nexus\Customer::loggedIn()->save();
if ( !\IPS\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', array(), \IPS\Settings::i()->nexus_https ) );
}
catch ( \Exception $e ) {}
}
\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', array(), \IPS\Settings::i()->nexus_https ) );
}
}
else
{
$withdrawForm = NULL;
}
}
if ( !$withdrawForm )
{
\IPS\Output::i()->error( 'no_module_permission', '2X239/3', 403, '' );
}
\IPS\Output::i()->output = $withdrawForm->customTemplate( array( call_user_func_array( array( \IPS\Theme::i(), 'getTemplate' ), array( 'forms', 'core' ) ), 'popupTemplate' ) );
}
/**
* Topup
*
* @return void
*/
protected function topup()
{
$topupForm = NULL;
if ( \IPS\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;
$maximums = array();
foreach ( array_merge( array( \IPS\nexus\Customer::loggedIn() ), iterator_to_array( \IPS\nexus\Customer::loggedIn()->parentContacts( array('billing=1') ) ) ) as $account )
{
if ( $account instanceof \IPS\nexus\Customer\AlternativeContact )
{
$account = $account->main_id;
}
foreach ( $account->cm_credits as $value )
{
$max = $maximumBalanceAmounts ? ( $maximumBalanceAmounts[ $value->currency ]['amount'] - $value->amount ) : NULL;
if ( is_null( $max ) or $max > 0 )
{
$maximums[ $account->member_id ][ $value->currency ] = $max;
}
}
}
if ( count( $maximums ) )
{
$topupForm = new \IPS\Helpers\Form( 'topup', 'checkout' );
$accountOptions = array();
foreach ( $maximums as $accountId => $data )
{
$currency = NULL;
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 );
}
$topupForm->add( new \IPS\Helpers\Form\Radio( 'topup_account', NULL, TRUE, array( 'options' => $accountOptions, 'parse' => 'none', 'toggles' => $accountOptionToggles ) ) );
foreach ( $maximums as $accountId => $data )
{
if ( count( $data ) > 1 )
{
$currencyToggles = array();
foreach ( $data as $currency => $maximum )
{
$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' );
$topupForm->add( $field );
}
foreach ( $data as $currency => $maximum )
{
$min = $minimumTopupAmounts ? ( $minimumTopupAmounts[ $currency ]['amount'] ) : 0.01;
$field = new \IPS\Helpers\Form\Number( 'topup_amount_' . $accountId . '_' . $currency, NULL, NULL, array( 'decimals' => TRUE ), function( $val ) use ( $currency, $accountOptions, $accountId, $data, $min, $maximum )
{
if ( count( $accountOptions ) === 1 or \IPS\Request::i()->topup_account == $accountId )
{
$key = "topup_currency_{$accountId}";
if ( count( $data ) === 1 or \IPS\Request::i()->$key == $currency )
{
if ( !$val )
{
throw new \DomainException('form_required');
}
elseif ( !is_null( $min ) and $val < $min )
{
throw new \DomainException( \IPS\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 ) ) ) );
}
}
}
}, NULL, $currency, 'topup_amount_' . $accountId . '_' . $currency );
$field->label = \IPS\Member::loggedIn()->language()->addToStack('topup_amount');
$topupForm->add( $field );
}
}
if ( $values = $topupForm->values() )
{
$account = isset( $values['topup_account'] ) ? \IPS\nexus\Customer::load( $values['topup_account'] ) : \IPS\nexus\Customer::loggedIn();
if ( isset( $values[ 'topup_currency_' . $account->member_id ] ) )
{
$currency = $values[ 'topup_currency_' . $account->member_id ];
}
else
{
$currencies = array_keys( $maximums[ $account->member_id ] );
$currency = array_pop( $currencies );
}
$invoice = new \IPS\nexus\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() );
}
}
}
if ( !$topupForm )
{
\IPS\Output::i()->error( 'no_module_permission', '2X239/4', 403, '' );
}
\IPS\Output::i()->output = $topupForm->customTemplate( array( call_user_func_array( array( \IPS\Theme::i(), 'getTemplate' ), array( 'forms', 'core' ) ), 'popupTemplate' ) );
}
/**
* Cancel Pending Payout
*
* @return void
*/
protected function cancel()
{
\IPS\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->status = $payout::STATUS_CANCELED;
$payout->save();
$credits = $payout->member->cm_credits;
$credits[ $payout->amount->currency ]->amount += $payout->amount->amount;
$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 ) );
}
}
catch ( \OutOfRangeException $e ) { }
\IPS\Output::i()->redirect( \IPS\Http\Url::internal( 'app=nexus&module=clients&controller=credit', 'front', 'clientscredit', array(), \IPS\Settings::i()->nexus_https ) );
}
}
@@ -0,0 +1,111 @@
<?php
/**
* @brief Donations
* @author <a href='http://www.invisionpower.com'>Invision Power Services, Inc.</a>
* @copyright (c) 2001 - SVN_YYYY Invision Power Services, Inc.
* @license http://www.invisionpower.com/legal/standards/
* @package IPS Social Suite
* @subpackage Nexus
* @since 17 Jun 2014
* @version SVN_VERSION_NUMBER
*/
namespace IPS\nexus\modules\front\clients;
/* To prevent PHP errors (extending class does not exist) revealing path */
if ( !defined( '\IPS\SUITE_UNIQUE_KEY' ) )
{
header( ( isset( $_SERVER['SERVER_PROTOCOL'] ) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.0' ) . ' 403 Forbidden' );
exit;
}
/**
* Donations
*/
class _donations extends \IPS\Dispatcher\Controller
{
/**
* Execute
*
* @return void
*/
public function execute()
{
if ( mb_strtolower( $_SERVER['REQUEST_METHOD'] ) == 'get' and \IPS\Settings::i()->nexus_https and \IPS\Request::i()->url()->data['scheme'] !== 'https' )
{
\IPS\Output::i()->redirect( new \IPS\Http\Url( preg_replace( '/^http:/', 'https:', \IPS\Request::i()->url() ) ) );
}
parent::execute();
}
/**
* View List
*
* @return void
*/
protected function manage()
{
if ( isset( \IPS\Request::i()->id ) )
{
if ( \IPS\Request::i()->isAjax() )
{
}
else
{
\IPS\Output::i()->redirect( \IPS\Http\Url::internal( 'app=nexus&module=clients&controller=donations', 'front', 'clientsdonations', array(), \IPS\Settings::i()->nexus_https ) );
}
}
\IPS\Output::i()->breadcrumb[] = array( \IPS\Http\Url::internal( 'app=nexus&module=clients&controller=donations', 'front', 'clientsdonations', array(), \IPS\Settings::i()->nexus_https ), \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' ) );
\IPS\Output::i()->output = \IPS\Theme::i()->getTemplate('clients')->template( \IPS\Theme::i()->getTemplate('clients')->donations() );
}
/**
* Make Donation
*
* @return void
*/
public function donate()
{
try
{
$goal = \IPS\nexus\Donation\Goal::load( \IPS\Request::i()->id );
}
catch ( \OutOfRangeException $e )
{
\IPS\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->addMessage( $desc, '', FALSE );
}
$form->add( new \IPS\Helpers\Form\Number( 'donate_amount', 0, TRUE, array( 'decimals' => TRUE, 'min' => 0.01 ), NULL, NULL, $goal->currency ) );
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() );
}
\IPS\Output::i()->title = $goal->_title;
\IPS\Output::i()->output = $form->customTemplate( array( call_user_func_array( array( \IPS\Theme::i(), 'getTemplate' ), array( 'forms', 'core' ) ), 'popupTemplate' ) );
}
}
Whitespace-only changes.
@@ -0,0 +1,91 @@
<?php
/**
* @brief Custom Fields
* @author <a href='http://www.invisionpower.com'>Invision Power Services, Inc.</a>
* @copyright (c) 2001 - SVN_YYYY Invision Power Services, Inc.
* @license http://www.invisionpower.com/legal/standards/
* @package IPS Social Suite
* @subpackage Nexus
* @since 08 Sep 2014
* @version SVN_VERSION_NUMBER
*/
namespace IPS\nexus\modules\front\clients;
/* To prevent PHP errors (extending class does not exist) revealing path */
if ( !defined( '\IPS\SUITE_UNIQUE_KEY' ) )
{
header( ( isset( $_SERVER['SERVER_PROTOCOL'] ) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.0' ) . ' 403 Forbidden' );
exit;
}
/**
* Custom Fields
*/
class _info extends \IPS\Dispatcher\Controller
{
/**
* Execute
*
* @return void
*/
public function execute()
{
if ( !\IPS\Member::loggedIn()->member_id )
{
\IPS\Output::i()->error( 'no_module_permission_guest', '2X242/1', 403, '' );
}
if ( mb_strtolower( $_SERVER['REQUEST_METHOD'] ) == 'get' and \IPS\Settings::i()->nexus_https and \IPS\Request::i()->url()->data['scheme'] !== 'https' )
{
\IPS\Output::i()->redirect( new \IPS\Http\Url( preg_replace( '/^http:/', 'https:', \IPS\Request::i()->url() ) ) );
}
\IPS\Output::i()->breadcrumb[] = array( \IPS\Http\Url::internal( 'app=nexus&module=clients&controller=info', 'front', 'clientsinfo', array(), \IPS\Settings::i()->nexus_https ), \IPS\Member::loggedIn()->language()->addToStack('client_info') );
\IPS\Output::i()->title = \IPS\Member::loggedIn()->language()->addToStack('client_info');
\IPS\Output::i()->sidebar['enabled'] = FALSE;
parent::execute();
}
/**
* Edit Info
*
* @return void
*/
protected function manage()
{
$form = new \IPS\Helpers\Form;
foreach ( \IPS\nexus\Customer\CustomField::roots() as $field )
{
$column = $field->column;
$form->add( $field->buildHelper( \IPS\nexus\Customer::loggedIn()->$column ) );
}
if ( $values = $form->values( TRUE ) )
{
$changes = array();
foreach ( \IPS\nexus\Customer\CustomField::roots() as $field )
{
$column = $field->column;
if ( \IPS\nexus\Customer::loggedIn()->$column != $values["nexus_ccfield_{$field->id}"] )
{
$changes[] = array( 'name' => 'nexus_ccfield_' . $field->id, 'value' => $values["nexus_ccfield_{$field->id}"], 'old' => \IPS\nexus\Customer::loggedIn()->$column );
\IPS\nexus\Customer::loggedIn()->$column = $values["nexus_ccfield_{$field->id}"];
}
if ( $field->type === 'Editor' )
{
$field->claimAttachments( \IPS\nexus\Customer::loggedIn()->member_id );
}
}
if ( !empty( $changes ) )
{
\IPS\nexus\Customer::loggedIn()->log( 'info', array( 'other' => $changes ) );
}
\IPS\nexus\Customer::loggedIn()->save();
\IPS\Output::i()->redirect( \IPS\Http\Url::internal( 'app=nexus&module=clients&controller=info', 'front', 'clientsinfo', array(), \IPS\Settings::i()->nexus_https ) );
}
\IPS\Output::i()->output = \IPS\Theme::i()->getTemplate('clients')->template( \IPS\Theme::i()->getTemplate('clients')->info( $form ) );
}
}
@@ -0,0 +1,179 @@
<?php
/**
* @brief Invoices
* @author <a href='http://www.invisionpower.com'>Invision Power Services, Inc.</a>
* @copyright (c) 2001 - SVN_YYYY Invision Power Services, Inc.
* @license http://www.invisionpower.com/legal/standards/
* @package IPS Social Suite
* @subpackage Nexus
* @since 06 May 2014
* @version SVN_VERSION_NUMBER
*/
namespace IPS\nexus\modules\front\clients;
/* To prevent PHP errors (extending class does not exist) revealing path */
if ( !defined( '\IPS\SUITE_UNIQUE_KEY' ) )
{
header( ( isset( $_SERVER['SERVER_PROTOCOL'] ) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.0' ) . ' 403 Forbidden' );
exit;
}
/**
* Invoices
*/
class _invoices extends \IPS\Dispatcher\Controller
{
/**
* Execute
*
* @return void
*/
public function execute()
{
if ( !\IPS\Member::loggedIn()->member_id )
{
\IPS\Output::i()->error( 'no_module_permission_guest', '2X215/3', 403, '' );
}
if ( mb_strtolower( $_SERVER['REQUEST_METHOD'] ) == 'get' and \IPS\Settings::i()->nexus_https and \IPS\Request::i()->url()->data['scheme'] !== 'https' )
{
\IPS\Output::i()->redirect( new \IPS\Http\Url( preg_replace( '/^http:/', 'https:', \IPS\Request::i()->url() ) ) );
}
/* Load Invoice */
if ( isset( \IPS\Request::i()->id ) )
{
try
{
$this->invoice = \IPS\nexus\Invoice::loadAndCheckPerms( \IPS\Request::i()->id );
}
catch ( \OutOfRangeException $e )
{
\IPS\Output::i()->error( 'node_error', '2X215/1', 404, '' );
}
\IPS\Output::i()->breadcrumb[] = array( \IPS\Http\Url::internal( 'app=nexus&module=clients&controller=invoices', 'front', 'clientsinvoices', array(), \IPS\Settings::i()->nexus_https ), \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;
}
else
{
\IPS\Output::i()->title = \IPS\Member::loggedIn()->language()->addToStack('client_invoices');
if ( isset( \IPS\Request::i()->do ) )
{
\IPS\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;
parent::execute();
}
/**
* View List
*
* @return void
*/
protected function manage()
{
$where = array( 'i_member=?', \IPS\Member::loggedIn()->member_id );
$parentContacts = \IPS\nexus\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=?';
$where[] = $id;
}
}
$invoices = new \IPS\Patterns\ActiveRecordIterator( \IPS\Db::i()->select( '*', 'nexus_invoices', $where, 'i_date DESC' ), 'IPS\nexus\Invoice' );
\IPS\Output::i()->output = \IPS\Theme::i()->getTemplate('clients')->template( \IPS\Theme::i()->getTemplate('clients')->invoices( $invoices ) );
}
/**
* View
*
* @return void
*/
public function view()
{
$shipments = $this->invoice->shipments();
\IPS\Output::i()->output = \IPS\Theme::i()->getTemplate('clients')->template( \IPS\Theme::i()->getTemplate('clients')->invoice( $this->invoice ) );
}
/**
* PO Number
*
* @return void
*/
public function poNumber()
{
$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 ) ) );
if ( $values = $form->values() )
{
$this->invoice->po = $values['invoice_po_number'];
$this->invoice->save();
\IPS\Output::i()->redirect( $this->invoice->url() );
}
\IPS\Output::i()->output = $form->customTemplate( array( call_user_func_array( array( \IPS\Theme::i(), 'getTemplate' ), array( 'forms', 'core' ) ), 'popupTemplate' ) );;
}
/**
* Notes
*
* @return void
*/
public function notes()
{
$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'] = '';
if ( $values = $form->values() )
{
$this->invoice->notes = $values['invoice_notes'];
$this->invoice->save();
\IPS\Output::i()->redirect( $this->invoice->url() );
}
\IPS\Output::i()->output = $form->customTemplate( array( call_user_func_array( array( \IPS\Theme::i(), 'getTemplate' ), array( 'forms', 'core' ) ), 'popupTemplate' ) );;
}
/**
* Print
*
* @return void
*/
public function printout()
{
$output = \IPS\Theme::i()->getTemplate( 'invoices', 'nexus', 'global' )->printInvoice( $this->invoice, $this->invoice->summary() );
\IPS\Output::i()->title = 'I' . $this->invoice->id;
\IPS\Output::i()->sendOutput( \IPS\Theme::i()->getTemplate( 'global', 'core' )->blankTemplate( $output ) );
}
/**
* Cancel
*
* @return void
*/
public function cancel()
{
\IPS\Session::i()->csrfCheck();
$this->invoice->status = \IPS\nexus\invoice::STATUS_CANCELED;
$this->invoice->save();
foreach ( $this->invoice->items as $k => $item )
{
$item->onInvoiceCancel( $this->invoice );
}
$this->invoice->member->log( 'invoice', array( 'type' => 'status', 'new' => 'canc', 'id' => $this->invoice->id, 'title' => $this->invoice->title ) );
\IPS\Output::i()->redirect( $this->invoice->url() );
}
}
@@ -0,0 +1,54 @@
<?php
/**
* @brief Network Status
* @author <a href='http://www.invisionpower.com'>Invision Power Services, Inc.</a>
* @copyright (c) 2001 - SVN_YYYY Invision Power Services, Inc.
* @license http://www.invisionpower.com/legal/standards/
* @package IPS Social Suite
* @subpackage Nexus
* @since 11 Sep 2014
* @version SVN_VERSION_NUMBER
*/
namespace IPS\nexus\modules\front\clients;
/* To prevent PHP errors (extending class does not exist) revealing path */
if ( !defined( '\IPS\SUITE_UNIQUE_KEY' ) )
{
header( ( isset( $_SERVER['SERVER_PROTOCOL'] ) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.0' ) . ' 403 Forbidden' );
exit;
}
/**
* Network Status
*/
class _networkStatus extends \IPS\Dispatcher\Controller
{
/**
* View
*
* @return void
*/
protected function manage()
{
if ( !\IPS\Settings::i()->network_status )
{
\IPS\Output::i()->error( 'no_module_permission', '2X246/1', 403, '' );
}
if ( \IPS\Settings::i()->network_status == 2 )
{
$servers = \IPS\nexus\Hosting\Server::roots( NULL, NULL, array( 'server_monitor<>?', '' ) );
}
else
{
$servers = \IPS\nexus\Hosting\Server::roots( NULL, NULL, array( 'server_monitor<>? AND server_monitor_fails>0', '' ) );
}
\IPS\Output::i()->title = \IPS\Member::loggedIn()->language()->addToStack('network_status');
\IPS\Output::i()->output = \IPS\Theme::i()->getTemplate('clients')->networkStatus( $servers );
unset( \IPS\Output::i()->breadcrumb['module'] );
\IPS\Output::i()->breadcrumb[] = array( NULL, \IPS\Member::loggedIn()->language()->addToStack('network_status') );
}
}
@@ -0,0 +1,240 @@
<?php
/**
* @brief Purchases
* @author <a href='http://www.invisionpower.com'>Invision Power Services, Inc.</a>
* @copyright (c) 2001 - SVN_YYYY Invision Power Services, Inc.
* @license http://www.invisionpower.com/legal/standards/
* @package IPS Social Suite
* @subpackage Nexus
* @since 06 May 2014
* @version SVN_VERSION_NUMBER
*/
namespace IPS\nexus\modules\front\clients;
/* To prevent PHP errors (extending class does not exist) revealing path */
if ( !defined( '\IPS\SUITE_UNIQUE_KEY' ) )
{
header( ( isset( $_SERVER['SERVER_PROTOCOL'] ) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.0' ) . ' 403 Forbidden' );
exit;
}
/**
* Purchases
*/
class _purchases extends \IPS\Dispatcher\Controller
{
/**
* Execute
*
* @return void
*/
public function execute()
{
if ( !\IPS\Member::loggedIn()->member_id )
{
\IPS\Output::i()->error( 'no_module_permission_guest', '2X212/6', 403, '' );
}
if ( mb_strtolower( $_SERVER['REQUEST_METHOD'] ) == 'get' and \IPS\Settings::i()->nexus_https and \IPS\Request::i()->url()->data['scheme'] !== 'https' )
{
\IPS\Output::i()->redirect( new \IPS\Http\Url( preg_replace( '/^http:/', 'https:', \IPS\Request::i()->url() ) ) );
}
/* Purchases breadcrumb */
\IPS\Output::i()->breadcrumb[] = array( \IPS\Http\Url::internal( 'app=nexus&module=clients&controller=purchases', 'front', 'clientspurchases', array(), \IPS\Settings::i()->nexus_https ), \IPS\Member::loggedIn()->language()->addToStack('client_purchases') );
/* Load Purchase */
if ( isset( \IPS\Request::i()->id ) )
{
try
{
$this->purchase = \IPS\nexus\Purchase::load( \IPS\Request::i()->id );
}
catch ( \OutOfRangeException $e )
{
\IPS\Output::i()->error( 'node_error', '2X212/1', 404, '' );
}
if ( !$this->purchase->canView() )
{
\IPS\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;
}
else
{
\IPS\Output::i()->title = \IPS\Member::loggedIn()->language()->addToStack('client_purchases');
if ( isset( \IPS\Request::i()->do ) )
{
\IPS\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;
parent::execute();
}
/**
* View List
*
* @return void
*/
protected function manage()
{
$where = array( array( 'ps_member=?', \IPS\Member::loggedIn()->member_id ) );
$parentContacts = \IPS\nexus\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[] = array( 'ps_show=1' );
$purchases = array();
foreach( new \IPS\Patterns\ActiveRecordIterator( \IPS\Db::i()->select( '*', 'nexus_purchases', $where ), 'IPS\nexus\Purchase' ) as $purchase )
{
$purchases[ $purchase->parent ][ $purchase->id ] = $purchase;
}
\IPS\Output::i()->output = \IPS\Theme::i()->getTemplate('clients')->template( \IPS\Theme::i()->getTemplate('clients')->purchases( $purchases ) );
}
/**
* View
*
* @return void
*/
public function view()
{
\IPS\Output::i()->output = \IPS\Theme::i()->getTemplate('clients')->template( \IPS\Theme::i()->getTemplate('clients')->purchase( $this->purchase ) );
}
/**
* Extra
*
* @return void
*/
protected function extra()
{
if ( $output = $this->purchase->clientAreaAction() )
{
if ( \IPS\Request::i()->isAjax() )
{
\IPS\Output::i()->output = $output;
}
else
{
\IPS\Output::i()->output = \IPS\Theme::i()->getTemplate('clients')->template( $output );
}
}
else
{
\IPS\Output::i()->redirect( $this->purchase->url() );
}
}
/**
* Renew
*
* @return void
*/
protected function renew()
{
$cycles = $this->purchase->canRenewUntil( NULL, TRUE );
if ( $cycles === FALSE )
{
\IPS\Output::i()->error( 'you_cannot_renew', '2X212/4', 403, '' );
}
elseif ( $cycles === 1 )
{
\IPS\Session::i()->csrfCheck();
}
$term = $this->purchase->renewals->getTerm();
if ( $term['term'] > 1 )
{
$suffix = '&times; ' . $this->purchase->renewals->getTermUnit();
}
else
{
switch( $term['unit'] )
{
case 'd':
$suffix = \IPS\Member::loggedIn()->language()->addToStack('days');
break;
case 'm':
$suffix = \IPS\Member::loggedIn()->language()->addToStack('months');
break;
case 'y':
$suffix = \IPS\Member::loggedIn()->language()->addToStack('years');
break;
}
}
$form = new \IPS\Helpers\Form;
$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 ) );
if( $values = $form->values() or $cycles === 1 )
{
if ( $pendingInvoice = $this->purchase->invoice_pending )
{
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'] ) )
{
\IPS\Output::i()->redirect( $pendingInvoice->checkoutUrl() );
}
}
}
$pendingInvoice->status = $pendingInvoice::STATUS_CANCELED;
$pendingInvoice->save();
$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->currency = $this->purchase->renewals->cost->currency;
$invoice->addItem( \IPS\nexus\Invoice\Item\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() );
}
\IPS\Output::i()->output = \IPS\Theme::i()->getTemplate('clients')->template( $form );
}
/**
* Cancel
*
* @return void
*/
protected function cancel()
{
\IPS\Session::i()->csrfCheck();
if ( !$this->purchase->canCancel() )
{
\IPS\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' ) );
$this->purchase->renewals = NULL;
$this->purchase->can_reactivate = TRUE;
$this->purchase->save();
\IPS\Output::i()->redirect( $this->purchase->url() );
}
}
@@ -0,0 +1,66 @@
<?php
/**
* @brief Referrals
* @author <a href='http://www.invisionpower.com'>Invision Power Services, Inc.</a>
* @copyright (c) 2001 - SVN_YYYY Invision Power Services, Inc.
* @license http://www.invisionpower.com/legal/standards/
* @package IPS Social Suite
* @subpackage Nexus
* @since 15 Aug 2014
* @version SVN_VERSION_NUMBER
*/
namespace IPS\nexus\modules\front\clients;
/* To prevent PHP errors (extending class does not exist) revealing path */
if ( !defined( '\IPS\SUITE_UNIQUE_KEY' ) )
{
header( ( isset( $_SERVER['SERVER_PROTOCOL'] ) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.0' ) . ' 403 Forbidden' );
exit;
}
/**
* Referrals
*/
class _referrals extends \IPS\Dispatcher\Controller
{
/**
* Execute
*
* @return void
*/
public function execute()
{
if ( mb_strtolower( $_SERVER['REQUEST_METHOD'] ) == 'get' and \IPS\Settings::i()->nexus_https and \IPS\Request::i()->url()->data['scheme'] !== 'https' )
{
\IPS\Output::i()->redirect( new \IPS\Http\Url( preg_replace( '/^http:/', 'https:', \IPS\Request::i()->url() ) ) );
}
\IPS\Output::i()->cssFiles = array_merge( \IPS\Output::i()->cssFiles, \IPS\Theme::i()->css( 'clients.css', 'nexus' ) );
\IPS\Output::i()->jsFiles = array_merge( \IPS\Output::i()->jsFiles, \IPS\Output::i()->js( 'front_clients.js', 'nexus', 'front' ) );
\IPS\Output::i()->sidebar['enabled'] = FALSE;
parent::execute();
}
/**
* View List
*
* @return void
*/
protected function manage()
{
\IPS\Output::i()->breadcrumb[] = array( \IPS\Http\Url::internal( 'app=nexus&module=clients&controller=referrals', 'front', 'clientsreferrals', array(), \IPS\Settings::i()->nexus_https ), \IPS\Member::loggedIn()->language()->addToStack('client_referrals') );
\IPS\Output::i()->title = \IPS\Member::loggedIn()->language()->addToStack('client_referrals');
\IPS\Output::i()->sidebar['enabled'] = FALSE;
$url = \IPS\Http\Url::internal( 'app=nexus&module=promotion&controller=referral&id=' . \IPS\Member::loggedIn()->member_id, 'front', 'referral' );
if ( isset( \IPS\Request::i()->target ) )
{
$url = $url->setQueryString( 'direct', base64_encode( \IPS\Request::i()->target ) );
}
$rules = new \IPS\nexus\CommissionRule\Iterator( new \IPS\Patterns\ActiveRecordIterator( \IPS\Db::i()->select( '*', 'nexus_referral_rules' ), 'IPS\nexus\CommissionRule' ), \IPS\Member::loggedIn() );
\IPS\Output::i()->output = \IPS\Theme::i()->getTemplate('clients')->template( \IPS\Theme::i()->getTemplate('clients')->referrals( $url, $rules ) );
}
}
Whitespace-only changes.
Whitespace-only changes.
@@ -0,0 +1,46 @@
<?php
/**
* @brief Incoming Referrals
* @author <a href='http://www.invisionpower.com'>Invision Power Services, Inc.</a>
* @copyright (c) 2001 - SVN_YYYY Invision Power Services, Inc.
* @license http://www.invisionpower.com/legal/standards/
* @package IPS Social Suite
* @subpackage Nexus
* @since 15 Aug 2014
* @version SVN_VERSION_NUMBER
*/
namespace IPS\nexus\modules\front\promotion;
/* To prevent PHP errors (extending class does not exist) revealing path */
if ( !defined( '\IPS\SUITE_UNIQUE_KEY' ) )
{
header( ( isset( $_SERVER['SERVER_PROTOCOL'] ) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.0' ) . ' 403 Forbidden' );
exit;
}
/**
* Incoming Referrals
*/
class _referral extends \IPS\Dispatcher\Controller
{
/**
* Handle Referral
*
* @return void
*/
protected function manage()
{
\IPS\Request::i()->setCookie( 'referred_by', intval( \IPS\Request::i()->id ), \IPS\DateTime::create()->add( new \DateInterval( 'P1Y' ) ) );
$target = new \IPS\Http\Url( \IPS\Request::i()->direct ? base64_decode( \IPS\Request::i()->direct ) : \IPS\Settings::i()->base_url );
if ( $target->isInternal )
{
\IPS\Output::i()->redirect( $target );
}
else
{
\IPS\Output::i()->redirect( \IPS\Settings::i()->base_url );
}
}
}
@@ -0,0 +1,222 @@
<?php
/**
* @brief View Cart
* @author <a href='http://www.invisionpower.com'>Invision Power Services, Inc.</a>
* @copyright (c) 2001 - SVN_YYYY Invision Power Services, Inc.
* @license http://www.invisionpower.com/legal/standards/
* @package IPS Social Suite
* @subpackage Nexus
* @since 29 Apr 2014
* @version SVN_VERSION_NUMBER
*/
namespace IPS\nexus\modules\front\store;
/* To prevent PHP errors (extending class does not exist) revealing path */
if ( !defined( '\IPS\SUITE_UNIQUE_KEY' ) )
{
header( ( isset( $_SERVER['SERVER_PROTOCOL'] ) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.0' ) . ' 403 Forbidden' );
exit;
}
/**
* View Cart
*/
class _cart extends \IPS\Dispatcher\Controller
{
/**
* Execute
*
* @return void
*/
public function execute()
{
\IPS\Output::i()->cssFiles = array_merge( \IPS\Output::i()->cssFiles, \IPS\Theme::i()->css( 'store.css', 'nexus' ) );
if ( \IPS\Theme::i()->settings['responsive'] )
{
\IPS\Output::i()->cssFiles = array_merge( \IPS\Output::i()->cssFiles, \IPS\Theme::i()->css( 'store_responsive.css', 'nexus', 'front' ) );
}
parent::execute();
}
/**
* View Cart
*
* @return void
*/
protected function manage()
{
/* Init */
if ( !isset( $_SESSION['cart'] ) )
{
$_SESSION['cart'] = array();
}
$currency = isset( $_SESSION['currency'] ) ? $_SESSION['currency'] : \IPS\nexus\Customer::loggedIn()->defaultCurrency();
/* Display */
\IPS\Output::i()->bodyClasses[] = 'ipsLayout_minimal';
\IPS\Output::i()->sidebar['enabled'] = FALSE;
\IPS\Output::i()->title = \IPS\Member::loggedIn()->language()->addToStack('your_cart');
\IPS\Output::i()->output = \IPS\Theme::i()->getTemplate('store')->cart( ( isset( $_SESSION['location'] ) and $_SESSION['location'] ) ? \IPS\GeoLocation::buildFromJson( $_SESSION['location'] ) : NULL, $currency );
}
/**
* Update Quantities
*
* @return void
*/
protected function quantities()
{
\IPS\Session::i()->csrfCheck();
foreach ( \IPS\Request::i()->item as $k => $v )
{
/* Get item */
$item = $_SESSION['cart'][ $k ];
$package = \IPS\nexus\Package::load( $item->id );
/* Are any others just a duplicate for discount purposes? If so, condense them into this one */
foreach ( $_SESSION['cart'] as $_k => $_item )
{
if ( $_k != $k and $_item->id == $package->id )
{
$cloned = clone $_item;
$cloned->quantity = $item->quantity;
$cloned->price = $item->price;
if ( $cloned == $item )
{
$v += $_item->quantity;
unset( $_SESSION['cart'][ $_k ] );
}
}
}
/* Subscriptions can only have 1 */
if ( $package->subscription and $v > 1 )
{
\IPS\Output::i()->error( 'err_subscription_qty', '1X214/4', 403, '' );
}
/* Set the quantity back to 0 and "re-add" the item */
$item->quantity = 0;
if ( $v )
{
$data = $package->optionValuesStockAndPrice( $package->optionValues( $item->details ) );
if ( $data['stock'] != -1 and ( $data['stock'] - $item->quantity ) < $v )
{
\IPS\Output::i()->error( \IPS\Member::loggedIn()->language()->addToStack( 'not_enough_in_stock', FALSE, array( 'sprintf' => array( $data['stock'] - $item->quantity ) ) ), '1X214/3', 403, '' );
}
$package->addItemsToCartData( $item->details, $v, $item->renewalTerm, $item->parent );
}
else
{
foreach ( $_SESSION['cart'] as $k2 => $_item )
{
if ( $_item->parent === $k )
{
unset( $_SESSION['cart'][ $k2 ] );
}
}
}
/* And if the quantity is 0, remove it */
if ( $_SESSION['cart'][ $k ]->quantity == 0 )
{
unset( $_SESSION['cart'][ $k ] );
}
}
if ( empty( $_SESSION['cart'] ) and \IPS\CACHE_PAGE_TIMEOUT and !\IPS\Member::loggedIn()->member_id )
{
\IPS\Request::i()->setCookie( 'noCache', 0, \IPS\DateTime::ts( time() - 86400 ) );
}
if ( \IPS\Request::i()->isAjax() )
{
$currency = isset( $_SESSION['currency'] ) ? $_SESSION['currency'] : \IPS\nexus\Customer::loggedIn()->defaultCurrency();
\IPS\Output::i()->sendOutput( \IPS\Theme::i()->getTemplate('store')->cartContents( ( isset( $_SESSION['location'] ) and $_SESSION['location'] ) ? \IPS\GeoLocation::buildFromJson( $_SESSION['location'] ) : NULL, $currency ), 200, 'text/html' );
}
else
{
\IPS\Output::i()->redirect( \IPS\Http\Url::internal('app=nexus&module=store&controller=cart', 'front', 'store_cart' ) );
}
}
/**
* Empty Cart
*
* @return void
*/
protected function clear()
{
\IPS\Session::i()->csrfCheck();
$_SESSION['cart'] = array();
if ( \IPS\CACHE_PAGE_TIMEOUT and !\IPS\Member::loggedIn()->member_id )
{
\IPS\Request::i()->setCookie( 'noCache', 0, \IPS\DateTime::ts( time() - 86400 ) );
}
if ( \IPS\Request::i()->isAjax() )
{
\IPS\Output::i()->json( $_SESSION['cart'] );
}
else
{
\IPS\Output::i()->redirect( \IPS\Http\Url::internal('app=nexus&module=store&controller=cart', 'front', 'store_cart' ) );
}
}
/**
* Checkout
*
* @return void
*/
protected function checkout()
{
\IPS\Session::i()->csrfCheck();
$currency = isset( $_SESSION['currency'] ) ? $_SESSION['currency'] : \IPS\nexus\Customer::loggedIn()->defaultCurrency();
$canRegister = ( !\IPS\Settings::i()->nexus_reg_force or \IPS\Member::loggedIn()->member_id );
$invoice = new \IPS\nexus\Invoice;
$invoice->member = \IPS\nexus\Customer::loggedIn();
$invoice->currency = $currency;
foreach ( $_SESSION['cart'] as $item )
{
if ( !$canRegister and \IPS\nexus\Package::load( $item->id )->reg )
{
$canRegister = TRUE;
}
$invoice->addItem( $item );
}
if ( !count( $invoice->items ) )
{
\IPS\Output::i()->error( 'your_cart_empty', '2X214/2', 403, '' );
}
if ( !$canRegister )
{
\IPS\Output::i()->redirect( \IPS\Http\Url::internal( 'app=nexus&module=store&controller=store&do=register', 'front', 'store' ) );
}
if ( $minimumOrderAmounts = json_decode( \IPS\Settings::i()->nexus_minimum_order, TRUE ) and $minimumOrderAmounts[ $currency ]['amount'] > $invoice->total->amount )
{
\IPS\Output::i()->error( \IPS\Member::loggedIn()->language()->addToStack( 'err_minimum_order', FALSE, array( 'sprintf' => array( new \IPS\nexus\Money( $minimumOrderAmounts[ $currency ]['amount'], $currency ) ) ) ), '1X214/1', 403, '' );
}
$_SESSION['cart'] = array();
if ( \IPS\CACHE_PAGE_TIMEOUT and !\IPS\Member::loggedIn()->member_id )
{
\IPS\Request::i()->setCookie( 'noCache', 0, \IPS\DateTime::ts( time() - 86400 ) );
}
\IPS\Output::i()->redirect( $invoice->checkoutUrl() );
}
}
@@ -0,0 +1,181 @@
<?php
/**
* @brief Gift Vouchers
* @author <a href='http://www.invisionpower.com'>Invision Power Services, Inc.</a>
* @copyright (c) 2001 - SVN_YYYY Invision Power Services, Inc.
* @license http://www.invisionpower.com/legal/standards/
* @package IPS Social Suite
* @subpackage Nexus
* @since 5 May 2014
* @version SVN_VERSION_NUMBER
*/
namespace IPS\nexus\modules\front\store;
/* To prevent PHP errors (extending class does not exist) revealing path */
if ( !defined( '\IPS\SUITE_UNIQUE_KEY' ) )
{
header( ( isset( $_SERVER['SERVER_PROTOCOL'] ) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.0' ) . ' 403 Forbidden' );
exit;
}
/**
* Gift Vouchers
*/
class _gifts extends \IPS\Dispatcher\Controller
{
/**
* Execute
*
* @return void
*/
public function execute()
{
\IPS\Output::i()->jsFiles = array_merge( \IPS\Output::i()->jsFiles, \IPS\Output::i()->js( 'front_store.js', 'nexus', 'front' ) );
\IPS\Output::i()->cssFiles = array_merge( \IPS\Output::i()->cssFiles, \IPS\Theme::i()->css( 'store.css', 'nexus' ) );
if ( \IPS\Theme::i()->settings['responsive'] )
{
\IPS\Output::i()->cssFiles = array_merge( \IPS\Output::i()->cssFiles, \IPS\Theme::i()->css( 'store_responsive.css', 'nexus', 'front' ) );
}
parent::execute();
}
/**
* Buy
*
* @return void
*/
protected function manage()
{
/* Work out what our options are */
$memberCurrency = ( isset( $_SESSION['currency'] ) ? $_SESSION['currency'] : \IPS\nexus\Customer::loggedIn()->defaultCurrency() );
$options = array();
foreach ( json_decode( \IPS\Settings::i()->nexus_gift_vouchers, TRUE ) as $voucher )
{
if ( isset( $voucher[ $memberCurrency ] ) and $voucher[ $memberCurrency ] )
{
$options[ $voucher[ $memberCurrency ] ] = new \IPS\nexus\Money( $voucher[ $memberCurrency ], $memberCurrency );
}
}
if ( \IPS\Settings::i()->nexus_gift_vouchers_free )
{
$options['x'] = \IPS\Member::loggedIn()->language()->addToStack('other');
}
if ( empty( $options ) )
{
\IPS\Output::i()->error( 'no_module_permission', '4X213/2', 403, '' );
}
$form = new \IPS\Helpers\Form( 'form', 'buy_gift_voucher' );
$form->class = 'ipsForm_vertical';
$form->add( new \IPS\Helpers\Form\Color( 'gift_voucher_color', '3b3b3b', FALSE ) );
$form->add( new \IPS\Helpers\Form\Radio( 'gift_voucher_amount', NULL, TRUE, array( 'options' => $options, 'parse' => 'none', 'userSuppliedInput' => 'x' ) ) );
$form->add( new \IPS\Helpers\Form\Radio( 'gift_voucher_method', NULL, TRUE, array( 'options' => array( 'email' => 'email', 'print' => 'gift_voucher_print' ), 'toggles' => array( 'email' => array( 'gift_voucher_email' ) ) ) ) );
$form->add( new \IPS\Helpers\Form\Email( 'gift_voucher_email', NULL, NULL, array(), function( $val )
{
if ( !$val and \IPS\Request::i()->gift_voucher_method === 'email' )
{
throw new \DomainException('form_required');
}
}, NULL, NULL, 'gift_voucher_email' ) );
$form->add( new \IPS\Helpers\Form\Text( 'gift_voucher_recipient' ) );
$form->add( new \IPS\Helpers\Form\Text( 'gift_voucher_sender', \IPS\Member::loggedIn()->name ) );
$form->add( new \IPS\Helpers\Form\TextArea( 'gift_voucher_message' ) );
$formTemplate = $form->customTemplate( array( call_user_func_array( array( \IPS\Theme::i(), 'getTemplate' ), array( 'store', 'nexus' ) ), 'giftCardForm' ) );
/* Handle submissions */
if ( $values = $form->values() )
{
$item = new \IPS\nexus\extensions\nexus\Item\GiftVoucher( \IPS\Member::loggedIn()->language()->get('gift_voucher'), new \IPS\nexus\Money( $values['gift_voucher_amount'], $memberCurrency ) );
$item->paymentMethodIds = array_keys( \IPS\nexus\Gateway::roots( NULL, NULL, array( 'm_active=1 AND m_gateway<>?', 'TwoCheckout' ) ) ); // It is against 2CO terms to use them for buying gift vouchers
$item->extra['method'] = $values['gift_voucher_method'];
$item->extra['recipient_email'] = $values['gift_voucher_email'];
$item->extra['recipient_name'] = $values['gift_voucher_recipient'];
$item->extra['sender'] = $values['gift_voucher_sender'];
$item->extra['message'] = $values['gift_voucher_message'];
$item->extra['amount'] = $values['gift_voucher_amount'];
$item->extra['color'] = $values['gift_voucher_color'];
$item->extra['currency'] = $memberCurrency;
$invoice = new \IPS\nexus\Invoice;
$invoice->currency = $memberCurrency;
$invoice->member = \IPS\Member::loggedIn();
$invoice->addItem( $item );
$invoice->save();
\IPS\Output::i()->redirect( $invoice->checkoutUrl() );
}
/* Display */
\IPS\Output::i()->output = \IPS\Theme::i()->getTemplate('store')->giftCard( $formTemplate );
\IPS\Output::i()->title = \IPS\Member::loggedIn()->language()->addToStack('buy_gift_voucher');
\IPS\Output::i()->breadcrumb[] = array( NULL, \IPS\Member::loggedIn()->language()->addToStack('buy_gift_voucher') );
}
/**
* [AJAX] Format currency amount
*
* @return void
*/
protected function formatCurrency()
{
\IPS\Output::i()->json( (string) new \IPS\nexus\Money( \IPS\Request::i()->amount, ( isset( $_SESSION['currency'] ) ? $_SESSION['currency'] : \IPS\nexus\Customer::loggedIn()->defaultCurrency() ) ) );
}
/**
* Redeem
*
* @return void
*/
protected function redeem()
{
if ( !\IPS\nexus\Customer::loggedIn()->member_id )
{
\IPS\Output::i()->error( 'redeem_must_be_logged_in', '1X213/1', 403, '' );
}
$form = new \IPS\Helpers\Form( 'form', 'redeem_gift_voucher' );
$form->add( new \IPS\Helpers\Form\Text( 'redemption_code', isset( \IPS\Request::i()->code ) ? \IPS\Request::i()->code : NULL, TRUE, array(), function( $val )
{
try
{
\IPS\nexus\extensions\nexus\Item\GiftVoucher::getPurchase( $val );
}
catch ( \InvalidArgumentException $e )
{
throw new \DomainException('redeem_gift_voucher_error');
}
} ) );
if ( $values = $form->values() )
{
$purchase = \IPS\nexus\extensions\nexus\Item\GiftVoucher::getPurchase( $values['redemption_code'] );
$extra = $purchase->extra;
$currency = isset( $extra['currency'] ) ? $extra['currency'] : \IPS\nexus\Customer::loggedIn()->defaultCurrency();
$credits = \IPS\nexus\Customer::loggedIn()->cm_credits;
$credits[ $currency ]->amount += $extra['amount'];
\IPS\nexus\Customer::loggedIn()->cm_credits = $credits;
\IPS\nexus\Customer::loggedIn()->save();
\IPS\nexus\Customer::loggedIn()->log( 'giftvoucher', array( 'type' => 'redeemed', 'code' => $values['redemption_code'], 'amount' => $extra['amount'], 'currency' => $extra['currency'], 'ps_member' => $purchase->member->member_id, 'newCreditAmount' => $credits[ $currency ]->amount ) );
$purchase->member->log( 'giftvoucher', array( 'type' => 'used', 'code' => $values['redemption_code'], 'amount' => $extra['amount'], 'currency' => $extra['currency'], 'by' => \IPS\nexus\Customer::loggedIn()->member_id ) );
$purchase->delete();
\IPS\Output::i()->redirect( \IPS\Http\Url::internal( "app=nexus&module=store&controller=store&currency={$currency}", 'front', 'store' ) );
}
if( \IPS\Request::i()->isAjax() )
{
$form->class = 'ipsForm_vertical';
\IPS\Output::i()->output = $form->customTemplate( array( call_user_func_array( array( \IPS\Theme::i(), 'getTemplate' ), array( 'forms', 'core', 'front' ) ), 'popupTemplate' ) );
}
else
{
\IPS\Output::i()->output = $form;
}
}
}
Whitespace-only changes.
@@ -0,0 +1,473 @@
<?php
/**
* @brief View product
* @author <a href='http://www.invisionpower.com'>Invision Power Services, Inc.</a>
* @copyright (c) 2001 - SVN_YYYY Invision Power Services, Inc.
* @license http://www.invisionpower.com/legal/standards/
* @package IPS Social Suite
* @subpackage Nexus
* @since 29 Apr 2014
* @version SVN_VERSION_NUMBER
*/
namespace IPS\nexus\modules\front\store;
/* To prevent PHP errors (extending class does not exist) revealing path */
if ( !defined( '\IPS\SUITE_UNIQUE_KEY' ) )
{
header( ( isset( $_SERVER['SERVER_PROTOCOL'] ) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.0' ) . ' 403 Forbidden' );
exit;
}
/**
* View product
*/
class _product extends \IPS\Content\Controller
{
/**
* [Content\Controller] Class
*/
protected static $contentModel = 'IPS\nexus\Package\Item';
/**
* Execute
*
* @return void
*/
public function execute()
{
\IPS\Output::i()->jsFiles = array_merge( \IPS\Output::i()->jsFiles, \IPS\Output::i()->js( 'front_store.js', 'nexus', 'front' ) );
\IPS\Output::i()->cssFiles = array_merge( \IPS\Output::i()->cssFiles, \IPS\Theme::i()->css( 'store.css', 'nexus' ) );
if ( \IPS\Theme::i()->settings['responsive'] )
{
\IPS\Output::i()->cssFiles = array_merge( \IPS\Output::i()->cssFiles, \IPS\Theme::i()->css( 'store_responsive.css', 'nexus', 'front' ) );
}
parent::execute();
}
/**
* View
*
* @return void
*/
protected function manage()
{
/* Init */
if ( !isset( $_SESSION['cart'] ) )
{
$_SESSION['cart'] = array();
}
$memberCurrency = ( isset( $_SESSION['currency'] ) ? $_SESSION['currency'] : \IPS\nexus\Customer::loggedIn()->defaultCurrency() );
/* Load Package */
$item = parent::manage();
if ( !$item )
{
\IPS\Output::i()->error( 'node_error', '2X240/1', 404, '' );
}
$package = \IPS\nexus\Package::load( $item->id );
$category = \IPS\nexus\Package\Group::load( $item->group );
/* Do we have any in the cart already (this will affect stock level)? */
$inCart = 0;
foreach ( $_SESSION['cart'] as $itemInCart )
{
if ( $itemInCart->id === $package->id )
{
$inCart += $itemInCart->quantity;
}
}
/* Showing just the form to purchase, or full product page? */
if ( \IPS\Request::i()->purchase )
{
\IPS\Output::i()->output = \IPS\Theme::i()->getTemplate('store')->purchaseForm( $package, $item, $this->_getForm( $package, $inCart, TRUE ), $inCart );
}
/* No - show the full page */
else
{
/* If physical, get available shipping methods */
$shippingMethods = array();
$locationType = 'none';
if ( $package->physical )
{
/* Where are we shipping to? */
$shipAddress = NULL;
if ( \IPS\Member::loggedIn()->member_id )
{
try
{
$shipAddress = \IPS\nexus\Customer\Address::constructFromData( \IPS\Db::i()->select( '*', 'nexus_customer_addresses', array( 'member=? AND primary_billing=1', \IPS\Member::loggedIn()->member_id ) )->first() )->address;
$locationType = 'address';
}
catch ( \UnderflowException $e ) { }
}
if ( !$shipAddress )
{
try
{
$shipAddress = \IPS\GeoLocation::getByIp( \IPS\Request::i()->ipAddress() );
$locationType = 'geo';
}
catch ( \Exception $e ) { }
}
/* Standard */
$where = NULL;
if ( $package->shipping != '*' )
{
$where = \IPS\Db::i()->in( 's_id', explode( ',', $package->shipping ) );
}
foreach ( \IPS\nexus\Shipping\FlatRate::roots( NULL, NULL, $where ) as $rate )
{
if ( ( $shipAddress and $rate->isAvailable( $shipAddress ) ) or ( $rate->locations === '*' ) )
{
$shippingMethods[] = $rate;
}
}
/* Easypost */
if ( \IPS\Settings::i()->easypost_api_key and \IPS\Settings::i()->easypost_show_rates and ( $package->shipping == '*' or in_array( 'easypost', explode( ',', $package->shipping ) ) ) )
{
try
{
$fromAddress = \IPS\GeoLocation::buildFromJson( \IPS\Settings::i()->site_address );
$length = new \IPS\nexus\Shipping\Length( $package->length );
$width = new \IPS\nexus\Shipping\Length( $package->width );
$height = new \IPS\nexus\Shipping\Length( $package->height );
$weight = new \IPS\nexus\Shipping\Weight( $package->weight );
$easyPost = \IPS\nexus\Shipping\EasyPostRate::getRates( $length->float('in'), $width->float('in'), $height->float('in'), $weight->float('oz'), \IPS\nexus\Customer::loggedIn(), $shipAddress, $memberCurrency );
if ( isset( $easyPost['rates'] ) )
{
foreach ( $easyPost['rates'] as $rate )
{
if ( $rate['currency'] === $memberCurrency )
{
$shippingMethods[] = new \IPS\nexus\Shipping\EasyPostRate( $rate );
}
}
}
}
catch ( \IPS\Http\Request\Exception $e ) { }
}
}
/* We need to create a dummy item so we can work out ship times/prices */
$itemDataForShipping = NULL;
if ( count( $shippingMethods ) )
{
try
{
$itemDataForShipping = $package->createItemForCart( $package->price() );
}
catch ( \OutOfBoundsException $e ) { }
}
/* Do we have renewal terms? */
$renewalTerm = NULL;
$renewOptions = $package->renew_options ? json_decode( $package->renew_options, TRUE ) : array();
if ( count( $renewOptions ) )
{
$renewalTerm = TRUE;
if ( count( $renewOptions ) === 1 )
{
$renewalTerm = array_pop( $renewOptions );
$renewalTerm = new \IPS\nexus\Purchase\RenewalTerm( new \IPS\nexus\Money( $renewalTerm['cost'][ $memberCurrency ]['amount'], $memberCurrency ), new \DateInterval( 'P' . $renewalTerm['term'] . mb_strtoupper( $renewalTerm['unit'] ) ), isset( $this->tax ) ? \IPS\nexus\Tax::load( $this->tax ) : NULL, $renewalTerm['add'] );
}
}
/* Display */
\IPS\Output::i()->output = \IPS\Theme::i()->getTemplate('store')->package( $package, $item, $this->_getForm( $package, $inCart, TRUE ), $inCart, $shippingMethods, $itemDataForShipping, $locationType, $renewalTerm );
}
}
/**
* Get form
*
* @param \IPS\nexus\Package $package The package
* @param int $inCart The number in the cart already
* @return string
*/
protected function _getForm( \IPS\nexus\Package $package, $inCart, $verticalForm = FALSE )
{
/* Get member's currency */
$memberCurrency = ( isset( $_SESSION['currency'] ) ? $_SESSION['currency'] : \IPS\nexus\Customer::loggedIn()->defaultCurrency() );
/* Init form */
$form = new \IPS\Helpers\Form( "package_{$package->id}", 'add_to_cart' );
if ( $verticalForm )
{
$form->class = 'ipsForm_vertical';
}
/* Package-dependant fields */
$package->storeForm( $form, $memberCurrency );
/* Are we in stock? */
if ( $package->stock != -1 and $package->stock != -2 and ( $package->stock - $inCart ) <= 0 )
{
$form->actionButtons = array();
$form->addButton( 'out_of_stock', 'submit', NULL, 'ipsButton ipsButton_primary', array( 'disabled' => 'disabled' ) );
}
/* And is it available for our currency */
else
{
try
{
$price = $package->price();
}
catch ( \OutOfBoundsException $e )
{
$form->actionButtons = array();
$form->addButton( 'currently_unavailable', 'submit', NULL, 'ipsButton ipsButton_primary', array( 'disabled' => 'disabled' ) );
}
}
/* Associate */
if ( count( $package->associablePackages() ) )
{
$associableIds = array_keys( $package->associablePackages() );
$associableOptions = array();
foreach ( $_SESSION['cart'] as $k => $item )
{
if ( in_array( $item->id, $associableIds ) )
{
for ( $i = 0; $i < $item->quantity; $i++ )
{
$name = $item->name;
if ( count( $item->details ) )
{
$customFields = \IPS\nexus\Package\CustomField::roots();
$stickyFields = array();
foreach ( $item->details as $k => $v )
{
if ( $v and isset( $customFields[ $k ] ) and $customFields[ $k ]->sticky )
{
$stickyFields[] = $v;
}
}
if ( count( $stickyFields ) )
{
$name .= ' (' . implode( ' &middot; ', $stickyFields ) . ')';
}
}
$associableOptions['in_cart']["0.{$k}"] = $name;
}
}
}
foreach ( new \IPS\Patterns\ActiveRecordIterator( \IPS\Db::i()->select( '*', 'nexus_purchases', array( array( 'ps_member=? AND ps_app=? AND ps_type=?', \IPS\nexus\Customer::loggedIn()->member_id, 'nexus', 'package' ), \IPS\Db::i()->in( 'ps_item_id', $associableIds ) ) ), 'IPS\nexus\Purchase' ) as $purchase )
{
$associableOptions['existing_purchases']["1.{$purchase->id}"] = $purchase->name;
}
if ( !empty( $associableOptions ) )
{
if ( !$package->force_assoc )
{
array_unshift( $associableOptions, 'do_not_associate' );
}
$form->add( new \IPS\Helpers\Form\Select( 'associate_with', NULL, $package->force_assoc, array( 'options' => $associableOptions ) ) );
}
elseif ( $package->force_assoc )
{
return \IPS\Member::loggedIn()->language()->addToStack("nexus_package_{$package->id}_assoc");
}
}
/* Renewal options */
$renewOptions = $package->renew_options ? json_decode( $package->renew_options, TRUE ) : array();
if ( count( $renewOptions ) > 1 )
{
$options = array();
foreach ( $renewOptions as $k => $option )
{
if ( isset( $option['cost'][ $memberCurrency ] ) )
{
switch ( $option['unit'] )
{
case 'd':
$term = \IPS\Member::loggedIn()->language()->addToStack('renew_days', FALSE, array( 'pluralize' => array( $option['term'] ) ) );
break;
case 'm':
$term = \IPS\Member::loggedIn()->language()->addToStack('renew_months', FALSE, array( 'pluralize' => array( $option['term'] ) ) );
break;
case 'y':
$term = \IPS\Member::loggedIn()->language()->addToStack('renew_years', FALSE, array( 'pluralize' => array( $option['term'] ) ) );
break;
}
$options[ $k ] =
\IPS\Member::loggedIn()->language()->addToStack( 'renew_option', FALSE, array( 'sprintf' => array(
(string) new \IPS\nexus\Money( $option['cost'][ $memberCurrency ]['amount'], $memberCurrency ),
$term
) ) );
}
}
$form->add( new \IPS\Helpers\Form\Radio( 'renewal_term', NULL, TRUE, array( 'options' => $options ) ) );
}
/* Custom Fields */
$customFields = \IPS\nexus\Package\CustomField::roots( NULL, NULL, array( array( 'cf_purchase=1' ), array( \IPS\Db::i()->findInSet( 'cf_packages', array( $package->id ) ) ) ) );
foreach ( $customFields as $field )
{
$form->add( $field->buildHelper() );
}
/* Handle submissions */
if ( $values = $form->values() )
{
/* Custom fields */
$details = array();
foreach ( $values as $k => $v )
{
if ( mb_substr( $k, 0, 13 ) == 'nexus_pfield_' )
{
$class = \IPS\nexus\Package\CustomField::load( mb_substr( $k, 13 ) )->buildHelper();
$details[ mb_substr( $k, 13 ) ] = $class::stringValue( $v );
}
}
$optionValues = $package->optionValues( $details );
/* Stock check */
$quantity = isset( $values['quantity'] ) ? $values['quantity'] : 1;
try
{
$data = $package->optionValuesStockAndPrice( $optionValues, TRUE );
}
catch ( \UnderflowException $e )
{
\IPS\Output::i()->error( 'product_options_price_error', '3X240/2', 500, 'product_options_price_error_admin' );
}
if ( \IPS\Request::i()->isAjax() && isset( \IPS\Request::i()->stockCheck ) )
{
/* Stock */
if ( $data['stock'] == -1 )
{
$return = array(
'stock' => '',
'okay' => true
);
}
else
{
$return = array(
'stock' => \IPS\Member::loggedIn()->language()->addToStack( 'x_in_stock', FALSE, array( 'pluralize' => array( $data['stock'] - $inCart ) ) ),
'okay' => true
);
}
/* Price */
$_data = $package->optionValuesStockAndPrice( $optionValues, FALSE );
$normalPrice = $_data['price'];
/* Renewals */
$renewOptions = $package->renew_options ? json_decode( $package->renew_options, TRUE ) : array();
if ( !empty( $renewOptions ) )
{
$term = ( isset( \IPS\Request::i()->renewal_term ) and isset( $renewOptions[ \IPS\Request::i()->renewal_term ] ) ) ? $renewOptions[ \IPS\Request::i()->renewal_term ] : array_shift( $renewOptions );
if ( $term['add'] )
{
$data['price']->amount += $term['cost'][ $memberCurrency ]['amount'];
$normalPrice->amount += $term['cost'][ $memberCurrency ]['amount'];
}
$return['renewal'] = \IPS\Member::loggedIn()->language()->addToStack( 'and_renewal', FALSE, array( 'sprintf' => array( new \IPS\nexus\Purchase\RenewalTerm( new \IPS\nexus\Money( $term['cost'][ $memberCurrency ]['amount'] + $_data['renewalAdjustment'], $memberCurrency ), new \DateInterval( 'P' . $term['term'] . mb_strtoupper( $term['unit'] ) ), isset( $this->tax ) ? \IPS\nexus\Tax::load( $this->tax ) : NULL, $term['add'] ) ) ) );
}
else
{
$return['renewal'] = '';
}
/* Include tax? */
if ( \IPS\Settings::i()->nexus_show_tax and $package->tax )
{
try
{
$taxRate = \IPS\nexus\Tax::load( $package->tax )->rate( \IPS\nexus\Customer::loggedIn()->estimatedLocation() );
$data['price']->amount += ( $data['price']->amount * $taxRate );
$normalPrice->amount += ( $normalPrice->amount * $taxRate );
}
catch ( \OutOfRangeException $e ) { }
}
/* Format and return */
if ( $data['price']->amount != $normalPrice->amount )
{
$return['price'] = \IPS\Theme::i()->getTemplate( 'store', 'nexus' )->priceDiscounted( $normalPrice, $data['price'], FALSE );
}
else
{
$return['price'] = \IPS\Theme::i()->getTemplate( 'store', 'nexus' )->price( $data['price'], FALSE );
}
\IPS\Output::i()->json( $return );
}
elseif ( $data['stock'] != -1 and ( $data['stock'] - $inCart ) < $quantity )
{
$form->error = \IPS\Member::loggedIn()->language()->addToStack( 'not_enough_in_stock', FALSE, array( 'sprintf' => array( $data['stock'] - $inCart ) ) );
return (string) $form;
}
/* Work out renewal term */
$renewalTerm = NULL;
if ( count( $renewOptions ) )
{
if ( count( $renewOptions ) === 1 )
{
$chosenRenewOption = array_pop( $renewOptions );
}
else
{
$chosenRenewOption = $renewOptions[ $values['renewal_term'] ];
}
$renewalTerm = new \IPS\nexus\Purchase\RenewalTerm( new \IPS\nexus\Money( $chosenRenewOption['cost'][ $memberCurrency ]['amount'] + $data['renewalAdjustment'], $memberCurrency ), new \DateInterval( 'P' . $chosenRenewOption['term'] . mb_strtoupper( $chosenRenewOption['unit'] ) ), isset( $this->tax ) ? \IPS\nexus\Tax::load( $this->tax ) : NULL, $chosenRenewOption['add'], $package->grace_period ? new \DateInterval( 'P' . $package->grace_period . 'D' ) : NULL );
}
/* Associations */
$parent = NULL;
if ( isset( $values['associate_with'] ) and $values['associate_with'] )
{
$exploded = explode( '.', $values['associate_with'] );
if ( $exploded[0] )
{
$parent = \IPS\nexus\Purchase::load( $exploded[1] );
}
else
{
$parent = (int) $exploded[1];
}
}
/* Blah */
$package->addItemsToCartData( $details, $quantity, $renewalTerm, $parent, $values );
/* Redirect or AJAX */
if ( \IPS\Request::i()->isAjax() )
{
/* Upselling? */
$upsell = \IPS\nexus\Package\Item::getItemsWithPermission( array( array( 'p_upsell=1' ), array( \IPS\Db::i()->findInSet( 'p_associable', array( $package->id ) ) ) ), 'p_position' );
/* Send */
\IPS\Output::i()->sendOutput( \IPS\Theme::i()->getTemplate('store')->cartReview( $package, $quantity, $upsell ), 200, 'text/html' );
}
else
{
\IPS\Output::i()->redirect( \IPS\Http\Url::internal( 'app=nexus&module=store&controller=cart&added=' . $package->id, 'front', 'store_cart' ) );
}
}
return (string) $form;
}
}
@@ -0,0 +1,210 @@
<?php
/**
* @brief Browse Store
* @author <a href='http://www.invisionpower.com'>Invision Power Services, Inc.</a>
* @copyright (c) 2001 - SVN_YYYY Invision Power Services, Inc.
* @license http://www.invisionpower.com/legal/standards/
* @package IPS Social Suite
* @subpackage Nexus
* @since 29 Apr 2014
* @version SVN_VERSION_NUMBER
*/
namespace IPS\nexus\modules\front\store;
/* To prevent PHP errors (extending class does not exist) revealing path */
if ( !defined( '\IPS\SUITE_UNIQUE_KEY' ) )
{
header( ( isset( $_SERVER['SERVER_PROTOCOL'] ) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.0' ) . ' 403 Forbidden' );
exit;
}
/**
* Browse Store
*/
class _store extends \IPS\Dispatcher\Controller
{
/**
* @brief Products per page
*/
protected static $productsPerPage = 50;
/**
* Execute
*
* @return void
*/
public function execute()
{
\IPS\Output::i()->cssFiles = array_merge( \IPS\Output::i()->cssFiles, \IPS\Theme::i()->css( 'store.css', 'nexus' ) );
if ( \IPS\Theme::i()->settings['responsive'] )
{
\IPS\Output::i()->cssFiles = array_merge( \IPS\Output::i()->cssFiles, \IPS\Theme::i()->css( 'store_responsive.css', 'nexus', 'front' ) );
}
parent::execute();
}
/**
* Browse Store
*
* @return void
*/
protected function manage()
{
/* Work out currenty */
if ( isset( \IPS\Request::i()->currency ) and in_array( \IPS\Request::i()->currency, \IPS\nexus\Money::currencies() ) )
{
if ( isset( \IPS\Request::i()->csrfKey ) and \IPS\Request::i()->csrfKey === \IPS\Session\Front::i()->csrfKey )
{
$_SESSION['currency'] = \IPS\Request::i()->currency;
}
$currency = \IPS\Request::i()->currency;
}
else
{
$currency = \IPS\nexus\Customer::loggedIn()->defaultCurrency();
}
/* If we have a category, display it */
if ( isset( \IPS\Request::i()->cat ) )
{
try
{
$category = \IPS\nexus\Package\Group::loadAndCheckPerms( \IPS\Request::i()->cat );
if ( \IPS\Request::i()->view )
{
\IPS\Request::i()->setCookie( 'storeView', ( \IPS\Request::i()->view == 'list' ) ? 'list' : 'grid', \IPS\DateTime::ts( time() )->add( new \DateInterval( 'P1Y' ) ) );
\IPS\Request::i()->cookie['storeView'] = ( \IPS\Request::i()->view == 'list' ) ? 'list' : 'grid';
}
$subcategories = new \IPS\Patterns\ActiveRecordIterator( \IPS\Db::i()->select( '*', 'nexus_package_groups', array( 'pg_parent=?', $category->id ) ), 'IPS\nexus\Package\Group' );
$joins = array();
switch ( \IPS\Request::i()->sortby )
{
case 'name':
$joins['core_sys_lang_words'] = array( "word_app='nexus' AND word_key=CONCAT( 'nexus_package_', p_id ) AND lang_id=?", \IPS\Member::loggedIn()->language()->id );
$sortBy = 'word_custom';
break;
case 'price_low':
case 'price_high':
$joins['nexus_package_base_prices'] = array( 'id=p_id' );
$sortBy = \IPS\Request::i()->sortby == 'price_low' ? $currency : ( $currency . ' DESC' );
break;
case 'rating':
$sortBy = 'p_rating DESC';
break;
default:
$sortBy = 'p_position';
break;
}
$currentPage = isset( \IPS\Request::i()->page ) ? intval( \IPS\Request::i()->page ) : 1;
if( $currentPage < 1 )
{
$currentPage = 1;
}
$select = \IPS\Db::i()->select( '*', 'nexus_packages', array(
array( 'p_group=?', $category->id ),
array( 'p_store=1' ),
array( "( p_member_groups='*' OR " . \IPS\Db::i()->findInSet( 'p_member_groups', \IPS\Member::loggedIn()->groups ) . ' )' )
), $sortBy, array( ( $currentPage - 1 ) * static::$productsPerPage, static::$productsPerPage ), NULL, NULL, \IPS\Db::SELECT_SQL_CALC_FOUND_ROWS );
foreach ( $joins as $table => $clause )
{
$select->join( $table, $clause );
}
$packages = new \IPS\Patterns\ActiveRecordIterator( $select, 'IPS\nexus\Package' );
$totalPages = ceil( $packages->count( TRUE ) / static::$productsPerPage );
if ( $totalPages and $currentPage > $totalPages )
{
\IPS\Output::i()->redirect( $category->url()->setQueryString( 'page', $totalPages ), NULL, 303 );
}
$pagination = \IPS\Theme::i()->getTemplate( 'global', 'core', 'global' )->pagination( $category->url(), $totalPages, $currentPage, static::$productsPerPage );
$packagesWithCustomFields = array();
foreach ( iterator_to_array( \IPS\Db::i()->select( 'cf_packages', 'nexus_package_fields', 'cf_purchase=1' ) ) as $ids )
{
$packagesWithCustomFields = array_merge( $packagesWithCustomFields, array_filter( explode( ',', $ids ) ) );
}
\IPS\Output::i()->sidebar['contextual'] = \IPS\Theme::i()->getTemplate('store')->categorySidebar( $category, $subcategories );
\IPS\Output::i()->output = \IPS\Theme::i()->getTemplate('store')->category( $category, $subcategories, $packages, $pagination, $packagesWithCustomFields );
foreach ( $category->parents() as $parent )
{
\IPS\Output::i()->breadcrumb[] = array( $parent->url(), $parent->_title );
}
\IPS\Output::i()->breadcrumb[] = array( NULL, $category->_title );
\IPS\Output::i()->title = $category->_title;
return;
}
catch ( \OutofRangeException $e )
{
\IPS\Output::i()->error( 'node_error', '1X241/1', 404, '' );
}
}
/* Otherwise, display the index */
else
{
/* New Products */
$newProducts = array();
$nexus_store_new = explode( ',', \IPS\Settings::i()->nexus_store_new );
if ( $nexus_store_new[0] )
{
$newProducts = \IPS\nexus\Package\Item::getItemsWithPermission( array( array( 'p_date_added>?', \IPS\DateTime::create()->sub( new \DateInterval( 'P' . $nexus_store_new[1] . 'D' ) )->getTimestamp() ) ), 'p_date_added DESC', $nexus_store_new[0] );
}
/* Popular Products */
$popularProducts = array();
$nexus_store_popular = explode( ',', \IPS\Settings::i()->nexus_store_popular );
if ( $nexus_store_popular[0] )
{
$where = array();
$where[] = array( 'ps_app=? AND ps_type=? AND ps_start>?', 'nexus', 'package', \IPS\DateTime::create()->sub( new \DateInterval( 'P' . $nexus_store_popular[1] . 'D' ) )->getTimestamp() );
$where[] = "( p_member_groups='*' OR " . \IPS\Db::i()->findInSet( 'p_member_groups', \IPS\Member::loggedIn()->groups ) . ' )';
$where[] = array( 'p_store=?', 1 );
$popularProducts = new \IPS\Patterns\ActiveRecordIterator( \IPS\Db::i()->select( 'nexus_packages.*', 'nexus_purchases', $where, 'COUNT(*) DESC', $nexus_store_popular[0], 'ps_item_id' )->join( 'nexus_packages', 'ps_item_id=p_id' ), 'IPS\nexus\Package' );
}
/* Display */
\IPS\Output::i()->sidebar['contextual'] = \IPS\Theme::i()->getTemplate('store')->categorySidebar( );
\IPS\Output::i()->output = \IPS\Theme::i()->getTemplate('store')->index( \IPS\nexus\Customer::loggedIn()->cm_credits[ $currency ], $newProducts, $popularProducts );
\IPS\Output::i()->title = \IPS\Member::loggedIn()->language()->addToStack('module__nexus_store');
}
}
/**
* Registration Packages
*
* @return void
*/
public function register()
{
\IPS\Output::i()->bodyClasses[] = 'ipsLayout_minimal';
\IPS\Output::i()->sidebar['enabled'] = FALSE;
\IPS\Output::i()->output = \IPS\Theme::i()->getTemplate('store')->register( \IPS\nexus\Package\Item::getItemsWithPermission( array( array( 'p_reg=1' ) ), 'p_date_added DESC' ) );
\IPS\Output::i()->title = \IPS\Member::loggedIn()->language()->addToStack('sign_up');
}
/**
* View Cart
*
* @return void
*/
protected function cart()
{
\IPS\Output::i()->output = \IPS\Theme::i()->getTemplate('store')->cart();
}
}
@@ -0,0 +1,91 @@
<?php
/**
* @brief Support Index
* @author <a href='http://www.invisionpower.com'>Invision Power Services, Inc.</a>
* @copyright (c) 2001 - SVN_YYYY Invision Power Services, Inc.
* @license http://www.invisionpower.com/legal/standards/
* @package IPS Social Suite
* @subpackage Nexus
* @since 08 Apr 2014
* @version SVN_VERSION_NUMBER
*/
namespace IPS\nexus\modules\front\support;
/* To prevent PHP errors (extending class does not exist) revealing path */
if ( !defined( '\IPS\SUITE_UNIQUE_KEY' ) )
{
header( ( isset( $_SERVER['SERVER_PROTOCOL'] ) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.0' ) . ' 403 Forbidden' );
exit;
}
/**
* Support Index
*/
class _home extends \IPS\Dispatcher\Controller
{
/**
* Execute
*
* @return void
*/
public function execute()
{
if ( !\IPS\Member::loggedIn()->member_id )
{
\IPS\Output::i()->error( 'no_module_permission_guest', '2X265/1', 403, '' );
}
parent::execute();
}
/**
* Index
*
* @return void
*/
protected function manage()
{
$table = new \IPS\Helpers\Table\Content( 'IPS\nexus\Support\Request', \IPS\Http\Url::internal( 'app=nexus&module=support&controller=home', 'support' ) );
$table->rowsTemplate = array( \IPS\Theme::i()->getTemplate( 'support' ), 'tableRows' );
$table->classes[] = 'ipsDataList_large';
$table->showFilters = FALSE;
\IPS\Output::i()->title = \IPS\Member::loggedIn()->language()->addToStack('support');
\IPS\Output::i()->output = \IPS\Theme::i()->getTemplate('support')->requestList( (string) $table );
}
/**
* Create
*
* @return void
*/
protected function create()
{
\IPS\Output::i()->title = \IPS\Member::loggedIn()->language()->addToStack('new_request');
\IPS\Output::i()->breadcrumb[] = array( NULL, \IPS\Member::loggedIn()->language()->addToStack( 'new_request' ) );
$accounts = \IPS\nexus\Customer::loggedIn()->parentContacts( array( 'support=1' ) );
if ( count( $accounts ) and !isset( \IPS\Request::i()->account ) )
{
$options = array();
foreach ( $accounts as $contact )
{
$options[ $contact->main_id->member_id ] = $contact->main_id->cm_name;
}
$options[ \IPS\nexus\Customer::loggedIn()->member_id ] = \IPS\nexus\Customer::loggedIn()->language()->addToStack( 'my_account', FALSE, array( 'sprintf' => array( \IPS\nexus\Customer::loggedIn()->cm_name ) ) );
$form = new \IPS\Helpers\Form( 'account', 'continue' );
$form->class = 'ipsForm_vertical';
$form->add( new \IPS\Helpers\Form\Radio( 'support_account', NULL, TRUE, array( 'options' => $options, 'parse' => 'none' ) ) );
if ( $values = $form->values() )
{
\IPS\Output::i()->redirect( \IPS\Http\Url::internal( "app=nexus&module=support&controller=home&do=create&account={$values['support_account']}", 'front', 'support_create' ) );
}
\IPS\Output::i()->output = $form->customTemplate( array( call_user_func_array( array( \IPS\Theme::i(), 'getTemplate' ), array( 'forms', 'core' ) ), 'popupTemplate' ) );
}
else
{
\IPS\Output::i()->output = \IPS\Theme::i()->getTemplate('support')->create( \IPS\nexus\Support\Request::create() );
}
}
}
Whitespace-only changes.
@@ -0,0 +1,182 @@
<?php
/**
* @brief Support Request View
* @author <a href='http://www.invisionpower.com'>Invision Power Services, Inc.</a>
* @copyright (c) 2001 - SVN_YYYY Invision Power Services, Inc.
* @license http://www.invisionpower.com/legal/standards/
* @package IPS Social Suite
* @subpackage Nexus
* @since 09 Apr 2014
* @version SVN_VERSION_NUMBER
*/
namespace IPS\nexus\modules\front\support;
/* To prevent PHP errors (extending class does not exist) revealing path */
if ( !defined( '\IPS\SUITE_UNIQUE_KEY' ) )
{
header( ( isset( $_SERVER['SERVER_PROTOCOL'] ) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.0' ) . ' 403 Forbidden' );
exit;
}
/**
* Support Request View
*/
class _view extends \IPS\Content\Controller
{
/**
* [Content\Controller] Class
*/
protected static $contentModel = 'IPS\nexus\Support\Request';
/**
* Execute
*
* @return void
*/
public function execute()
{
if ( !\IPS\Member::loggedIn()->member_id )
{
\IPS\Output::i()->error( 'no_module_permission_guest', '2X264/1', 403, '' );
}
\IPS\Output::i()->jsFiles = array_merge( \IPS\Output::i()->jsFiles, \IPS\Output::i()->js( 'front_support.js', 'nexus', 'front' ) );
parent::execute();
}
/**
* View Item
*
* @return void
*/
protected function manage()
{
$this->request = parent::manage();
if ( !$this->request )
{
\IPS\Output::i()->error( 'node_error', '2X204/1', 404, '' );
}
$allowedStatuses = \IPS\nexus\Support\Status::publicSetStatuses( $this->request );
if ( isset( \IPS\Request::i()->setStatus ) and !empty( $allowedStatuses ) and in_array( \IPS\Request::i()->setStatus, array_keys( $allowedStatuses ) ) )
{
\IPS\Session::i()->csrfCheck();
$this->request->status = \IPS\nexus\Support\Status::load( \IPS\Request::i()->setStatus );
$this->request->save();
\IPS\Output::i()->redirect( $this->request->url() );
}
if ( !isset( \IPS\Request::i()->root ) and $purchase = $this->request->purchase and $purchase->childrenCount( NULL ) )
{
\IPS\Request::i()->root = $purchase->id;
\IPS\Request::i()->noshowroot = TRUE;
}
\IPS\Output::i()->output = \IPS\Theme::i()->getTemplate( 'support' )->request( $this->request );
}
/**
* Rate Staff Response
*
* @return void
*/
protected function rate()
{
try
{
$reply = \IPS\nexus\Support\Reply::loadAndCheckPerms( \IPS\Request::i()->response );
}
catch ( \OutOfRangeException $e )
{
\IPS\Output::i()->error( 'node_error', '2X209/1', 404, '' );
}
$existingRating = NULL;
try
{
$existingRating = \IPS\Db::i()->select( '*', 'nexus_support_ratings', array( 'rating_reply=?', $reply->id ) )->first();
}
catch ( \UnderflowException $e ) {}
$form = new \IPS\Helpers\Form( 'feedback', 'send_feedback' );
$form->class = 'ipsForm_vertical';
$form->add( new \IPS\Helpers\Form\Rating( 'support_rating_rating', \IPS\Request::i()->rating, TRUE ) );
$form->add( new \IPS\Helpers\Form\TextArea( 'support_rating_feedback', $existingRating ? $existingRating['rating_note'] : NULL, FALSE ) );
if ( $values = $form->values() )
{
$save = array(
'rating_reply' => $reply->id,
'rating_rating' => $values['support_rating_rating'],
'rating_from' => \IPS\Member::loggedIn()->member_id,
'rating_staff' => $reply->member,
'rating_note' => $values['support_rating_feedback'],
'rating_date' => time()
);
if ( $existingRating )
{
\IPS\Db::i()->update( 'nexus_support_ratings', $save, array( 'rating_reply=?', $reply->id ) );
}
else
{
\IPS\Db::i()->insert( 'nexus_support_ratings', $save );
}
if ( \IPS\Request::i()->isAjax() )
{
$reply->ratingData = $save;
\IPS\Output::i()->json( \IPS\Theme::i()->getTemplate('support')->ratingValue( $reply ) );
}
else
{
\IPS\Output::i()->redirect( $reply->url(), 'thanks_for_your_feedback' );
}
}
\IPS\Output::i()->output = $form->customTemplate( array( call_user_func_array( array( \IPS\Theme::i(), 'getTemplate' ), array( 'forms', 'core' ) ), 'popupTemplate' ) );
}
/**
* Change Severity
*
* @return void
*/
protected function severity()
{
try
{
$request = \IPS\nexus\Support\Request::loadAndCheckPerms( \IPS\Request::i()->id );
}
catch ( \OutOfRangeException $e )
{
\IPS\Output::i()->error( 'node_error', '2X209/1', 404, '' );
}
if ( !\IPS\Settings::i()->nexus_severities or \IPS\Member::loggedIn()->cm_no_sev )
{
\IPS\Output::i()->error( 'node_error', '2X209/3', 404, '' );
}
$options = array();
foreach ( \IPS\nexus\Support\Severity::roots( NULL, NULL, array( array( 'sev_public=1' ), array( "sev_departments='*' OR " . \IPS\Db::i()->findInSet( 'sev_departments', array( $request->department->id ) ) ) ) ) as $severity )
{
$options[ $severity->id ] = $severity->_title;
}
$form = new \IPS\Helpers\Form;
$form->class = 'ipsForm_vertical';
$form->add( new \IPS\Helpers\Form\Radio( 'support_severity', $request->severity->id, FALSE, array(
'options' => $options
) ) );
if ( $values = $form->values() )
{
$request->severity = \IPS\nexus\Support\Severity::load( $values['support_severity'] );
$request->save();
\IPS\Output::i()->redirect( $request->url() );
}
\IPS\Output::i()->output = $form->customTemplate( array( call_user_func_array( array( \IPS\Theme::i(), 'getTemplate' ), array( 'forms', 'core' ) ), 'popupTemplate' ) );
}
}