mirror of
https://github.com/invoiceninja/invoiceninja.git
synced 2024-11-08 20:22:42 +01:00
336 lines
11 KiB
PHP
336 lines
11 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers;
|
|
|
|
use App\Models\Affiliate;
|
|
use App\Models\Country;
|
|
use App\Models\License;
|
|
use App\Ninja\Mailers\ContactMailer;
|
|
use App\Ninja\Repositories\AccountRepository;
|
|
use App\Libraries\CurlUtils;
|
|
use Auth;
|
|
use Cache;
|
|
use CreditCard;
|
|
use Input;
|
|
use Omnipay;
|
|
use Session;
|
|
use URL;
|
|
use Utils;
|
|
use Validator;
|
|
use View;
|
|
|
|
class NinjaController extends BaseController
|
|
{
|
|
/**
|
|
* @var AccountRepository
|
|
*/
|
|
protected $accountRepo;
|
|
|
|
/**
|
|
* @var ContactMailer
|
|
*/
|
|
protected $contactMailer;
|
|
|
|
/**
|
|
* NinjaController constructor.
|
|
*
|
|
* @param AccountRepository $accountRepo
|
|
* @param ContactMailer $contactMailer
|
|
*/
|
|
public function __construct(AccountRepository $accountRepo, ContactMailer $contactMailer)
|
|
{
|
|
$this->accountRepo = $accountRepo;
|
|
$this->contactMailer = $contactMailer;
|
|
}
|
|
|
|
/**
|
|
* @param array $input
|
|
* @param Affiliate $affiliate
|
|
*
|
|
* @return array
|
|
*/
|
|
private function getLicensePaymentDetails(array $input, Affiliate $affiliate)
|
|
{
|
|
$country = Country::find($input['country_id']);
|
|
|
|
$data = [
|
|
'firstName' => $input['first_name'],
|
|
'lastName' => $input['last_name'],
|
|
'email' => $input['email'],
|
|
'number' => $input['card_number'],
|
|
'expiryMonth' => $input['expiration_month'],
|
|
'expiryYear' => $input['expiration_year'],
|
|
'cvv' => $input['cvv'],
|
|
'billingAddress1' => $input['address1'],
|
|
'billingAddress2' => $input['address2'],
|
|
'billingCity' => $input['city'],
|
|
'billingState' => $input['state'],
|
|
'billingPostcode' => $input['postal_code'],
|
|
'billingCountry' => $country->iso_3166_2,
|
|
'shippingAddress1' => $input['address1'],
|
|
'shippingAddress2' => $input['address2'],
|
|
'shippingCity' => $input['city'],
|
|
'shippingState' => $input['state'],
|
|
'shippingPostcode' => $input['postal_code'],
|
|
'shippingCountry' => $country->iso_3166_2,
|
|
];
|
|
|
|
$card = new CreditCard($data);
|
|
|
|
return [
|
|
'amount' => $affiliate->price,
|
|
'card' => $card,
|
|
'currency' => 'USD',
|
|
'returnUrl' => URL::to('license_complete'),
|
|
'cancelUrl' => URL::to('/'),
|
|
];
|
|
}
|
|
|
|
/**
|
|
* @return $this|\Illuminate\Contracts\View\View
|
|
*/
|
|
public function show_license_payment()
|
|
{
|
|
if (Input::has('return_url')) {
|
|
session(['return_url' => Input::get('return_url')]);
|
|
}
|
|
|
|
if (Input::has('affiliate_key')) {
|
|
if ($affiliate = Affiliate::where('affiliate_key', '=', Input::get('affiliate_key'))->first()) {
|
|
session(['affiliate_id' => $affiliate->id]);
|
|
}
|
|
}
|
|
|
|
if (Input::has('product_id')) {
|
|
session(['product_id' => Input::get('product_id')]);
|
|
} elseif (! Session::has('product_id')) {
|
|
session(['product_id' => PRODUCT_ONE_CLICK_INSTALL]);
|
|
}
|
|
|
|
if (! Session::get('affiliate_id')) {
|
|
return Utils::fatalError();
|
|
}
|
|
|
|
if (Utils::isNinjaDev() && Input::has('test_mode')) {
|
|
session(['test_mode' => Input::get('test_mode')]);
|
|
}
|
|
|
|
$account = $this->accountRepo->getNinjaAccount();
|
|
$account->load('account_gateways.gateway');
|
|
$accountGateway = $account->getGatewayByType(GATEWAY_TYPE_CREDIT_CARD);
|
|
$gateway = $accountGateway->gateway;
|
|
$acceptedCreditCardTypes = $accountGateway->getCreditcardTypes();
|
|
|
|
$affiliate = Affiliate::find(Session::get('affiliate_id'));
|
|
|
|
$data = [
|
|
'showBreadcrumbs' => false,
|
|
'hideHeader' => true,
|
|
'url' => 'license',
|
|
'amount' => $affiliate->price,
|
|
'client' => false,
|
|
'contact' => false,
|
|
'gateway' => $gateway,
|
|
'account' => $account,
|
|
'accountGateway' => $accountGateway,
|
|
'acceptedCreditCardTypes' => $acceptedCreditCardTypes,
|
|
'countries' => Cache::get('countries'),
|
|
'currencyId' => 1,
|
|
'currencyCode' => 'USD',
|
|
'paymentTitle' => $affiliate->payment_title,
|
|
'paymentSubtitle' => $affiliate->payment_subtitle,
|
|
'showAddress' => true,
|
|
];
|
|
|
|
return View::make('payments.stripe.credit_card', $data);
|
|
}
|
|
|
|
/**
|
|
* @return \Illuminate\Contracts\View\View
|
|
*/
|
|
public function do_license_payment()
|
|
{
|
|
$testMode = Session::get('test_mode') === 'true';
|
|
|
|
$rules = [
|
|
'first_name' => 'required',
|
|
'last_name' => 'required',
|
|
'email' => 'required',
|
|
'card_number' => 'required',
|
|
'expiration_month' => 'required',
|
|
'expiration_year' => 'required',
|
|
'cvv' => 'required',
|
|
'address1' => 'required',
|
|
'city' => 'required',
|
|
'state' => 'required',
|
|
'postal_code' => 'required',
|
|
'country_id' => 'required',
|
|
];
|
|
|
|
$validator = Validator::make(Input::all(), $rules);
|
|
|
|
if ($validator->fails()) {
|
|
return redirect()->to('license')
|
|
->withErrors($validator)
|
|
->withInput();
|
|
}
|
|
|
|
$account = $this->accountRepo->getNinjaAccount();
|
|
$account->load('account_gateways.gateway');
|
|
$accountGateway = $account->getGatewayByType(GATEWAY_TYPE_CREDIT_CARD);
|
|
|
|
try {
|
|
$affiliate = Affiliate::find(Session::get('affiliate_id'));
|
|
|
|
if ($testMode) {
|
|
$ref = 'TEST_MODE';
|
|
} else {
|
|
$details = self::getLicensePaymentDetails(Input::all(), $affiliate);
|
|
|
|
$gateway = Omnipay::create($accountGateway->gateway->provider);
|
|
$gateway->initialize((array) $accountGateway->getConfig());
|
|
$response = $gateway->purchase($details)->send();
|
|
|
|
$ref = $response->getTransactionReference();
|
|
|
|
if (! $response->isSuccessful() || ! $ref) {
|
|
$this->error('License', $response->getMessage(), $accountGateway);
|
|
|
|
return redirect()->to('license')->withInput();
|
|
}
|
|
}
|
|
|
|
$licenseKey = Utils::generateLicense();
|
|
|
|
$license = new License();
|
|
$license->first_name = Input::get('first_name');
|
|
$license->last_name = Input::get('last_name');
|
|
$license->email = Input::get('email');
|
|
$license->transaction_reference = $ref;
|
|
$license->license_key = $licenseKey;
|
|
$license->affiliate_id = Session::get('affiliate_id');
|
|
$license->product_id = Session::get('product_id');
|
|
$license->save();
|
|
|
|
$data = [
|
|
'message' => $affiliate->payment_subtitle,
|
|
'license' => $licenseKey,
|
|
'hideHeader' => true,
|
|
'productId' => $license->product_id,
|
|
'price' => $affiliate->price,
|
|
];
|
|
|
|
$name = "{$license->first_name} {$license->last_name}";
|
|
$this->contactMailer->sendLicensePaymentConfirmation($name, $license->email, $affiliate->price, $license->license_key, $license->product_id);
|
|
|
|
if (Session::has('return_url')) {
|
|
$data['redirectTo'] = Session::get('return_url')."?license_key={$license->license_key}&product_id=".Session::get('product_id');
|
|
$data['message'] = 'Redirecting to ' . Session::get('return_url');
|
|
}
|
|
|
|
return View::make('public.license', $data);
|
|
} catch (\Exception $e) {
|
|
$this->error('License-Uncaught', false, $accountGateway, $e);
|
|
|
|
return redirect()->to('license')->withInput();
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @return string
|
|
*/
|
|
public function claim_license()
|
|
{
|
|
$licenseKey = Input::get('license_key');
|
|
$productId = Input::get('product_id', PRODUCT_ONE_CLICK_INSTALL);
|
|
|
|
// add in dashes
|
|
if (strlen($licenseKey) == 20) {
|
|
$licenseKey = sprintf('%s-%s-%s-%s-%s',
|
|
substr($licenseKey, 0, 4),
|
|
substr($licenseKey, 4, 4),
|
|
substr($licenseKey, 8, 4),
|
|
substr($licenseKey, 12, 4),
|
|
substr($licenseKey, 16, 4));
|
|
}
|
|
|
|
$license = License::where('license_key', '=', $licenseKey)
|
|
->where('is_claimed', '<', 10)
|
|
->where('product_id', '=', $productId)
|
|
->first();
|
|
|
|
if ($license) {
|
|
if ($license->transaction_reference != 'TEST_MODE') {
|
|
$license->is_claimed = $license->is_claimed + 1;
|
|
$license->save();
|
|
}
|
|
|
|
if ($productId == PRODUCT_INVOICE_DESIGNS) {
|
|
return file_get_contents(storage_path() . '/invoice_designs.txt');
|
|
} else {
|
|
return $license->created_at->format('Y-m-d');
|
|
}
|
|
} else {
|
|
return RESULT_FAILURE;
|
|
}
|
|
}
|
|
|
|
private function error($type, $error, $accountGateway = false, $exception = false)
|
|
{
|
|
$message = '';
|
|
if ($accountGateway && $accountGateway->gateway) {
|
|
$message = $accountGateway->gateway->name . ': ';
|
|
}
|
|
$message .= $error ?: trans('texts.payment_error');
|
|
Session::flash('error', $message);
|
|
Utils::logError("Payment Error [{$type}]: " . ($exception ? Utils::getErrorString($exception) : $message), 'PHP', true);
|
|
}
|
|
|
|
public function hideWhiteLabelMessage()
|
|
{
|
|
$user = Auth::user();
|
|
$company = $user->account->company;
|
|
|
|
$company->plan = null;
|
|
$company->save();
|
|
|
|
return RESULT_SUCCESS;
|
|
}
|
|
|
|
public function purchaseWhiteLabel()
|
|
{
|
|
if (Utils::isNinja()) {
|
|
return redirect('/');
|
|
}
|
|
|
|
$user = Auth::user();
|
|
$account = $user->account;
|
|
$url = NINJA_APP_URL . '/buy_now';
|
|
$contactKey = $user->primaryAccount()->account_key;
|
|
|
|
$data = [
|
|
'account_key' => NINJA_LICENSE_ACCOUNT_KEY,
|
|
'contact_key' => $contactKey,
|
|
'product_id' => PRODUCT_WHITE_LABEL,
|
|
'first_name' => $user->first_name,
|
|
'last_name' => $user->last_name,
|
|
'email' => $user->email,
|
|
'name' => $account->name,
|
|
'address1' => $account->address1,
|
|
'address2' => $account->address2,
|
|
'city' => $account->city,
|
|
'state' => $account->state,
|
|
'postal_code' => $account->postal_code,
|
|
'country_id' => $account->country_id,
|
|
'vat_number' => $account->vat_number,
|
|
'return_link' => true,
|
|
];
|
|
|
|
if ($url = CurlUtils::post($url, $data)) {
|
|
return redirect($url);
|
|
} else {
|
|
return redirect()->back()->withError(trans('texts.error_refresh_page'));
|
|
}
|
|
}
|
|
}
|