Merge branch 'development' into product_linking
This commit is contained in:
commit
126eedc610
|
@ -27,6 +27,7 @@ use PayPalHttp\HttpException;
|
|||
|
||||
class PaymentController extends Controller
|
||||
{
|
||||
|
||||
/**
|
||||
* @return Application|Factory|View
|
||||
*/
|
||||
|
@ -45,7 +46,10 @@ class PaymentController extends Controller
|
|||
public function checkOut(Request $request, PaypalProduct $paypalProduct)
|
||||
{
|
||||
return view('store.checkout')->with([
|
||||
'product' => $paypalProduct
|
||||
'product' => $paypalProduct,
|
||||
'taxvalue' => $paypalProduct->getTaxValue(),
|
||||
'taxpercent' => $paypalProduct->getTaxPercent(),
|
||||
'total' => $paypalProduct->getTotalPrice()
|
||||
]);
|
||||
}
|
||||
|
||||
|
@ -65,8 +69,20 @@ class PaymentController extends Controller
|
|||
"reference_id" => uniqid(),
|
||||
"description" => $paypalProduct->description,
|
||||
"amount" => [
|
||||
"value" => $paypalProduct->price,
|
||||
"currency_code" => strtoupper($paypalProduct->currency_code)
|
||||
"value" => $paypalProduct->getTotalPrice(),
|
||||
'currency_code' => strtoupper($paypalProduct->currency_code),
|
||||
'breakdown' =>[
|
||||
'item_total' =>
|
||||
[
|
||||
'currency_code' => strtoupper($paypalProduct->currency_code),
|
||||
'value' => $paypalProduct->price,
|
||||
],
|
||||
'tax_total' =>
|
||||
[
|
||||
'currency_code' => strtoupper($paypalProduct->currency_code),
|
||||
'value' => $paypalProduct->getTaxValue(),
|
||||
]
|
||||
]
|
||||
]
|
||||
]
|
||||
],
|
||||
|
@ -76,6 +92,8 @@ class PaymentController extends Controller
|
|||
'brand_name' => config('app.name', 'Laravel'),
|
||||
'shipping_preference' => 'NO_SHIPPING'
|
||||
]
|
||||
|
||||
|
||||
];
|
||||
|
||||
|
||||
|
@ -161,6 +179,9 @@ class PaymentController extends Controller
|
|||
'status' => $response->result->status,
|
||||
'amount' => $paypalProduct->quantity,
|
||||
'price' => $paypalProduct->price,
|
||||
'tax_value' => $paypalProduct->getTaxValue(),
|
||||
'tax_percent' => $paypalProduct->getTaxPercent(),
|
||||
'total_price' => $paypalProduct->getTotalPrice(),
|
||||
'currency_code' => $paypalProduct->currency_code,
|
||||
'payer' => json_encode($response->result->payer),
|
||||
]);
|
||||
|
@ -199,7 +220,7 @@ class PaymentController extends Controller
|
|||
*/
|
||||
public function cancel(Request $request)
|
||||
{
|
||||
return redirect()->route('store.index')->with('success', 'Payment was Cannceled');
|
||||
return redirect()->route('store.index')->with('success', 'Payment was Canceled');
|
||||
}
|
||||
|
||||
|
||||
|
@ -216,7 +237,13 @@ class PaymentController extends Controller
|
|||
return $payment->user->name;
|
||||
})
|
||||
->editColumn('price', function (Payment $payment) {
|
||||
return $payment->formatCurrency();
|
||||
return $payment->formatToCurrency($payment->price);
|
||||
})
|
||||
->editColumn('tax_value', function (Payment $payment) {
|
||||
return $payment->formatToCurrency($payment->tax_value);
|
||||
})
|
||||
->editColumn('total_price', function (Payment $payment) {
|
||||
return $payment->formatToCurrency($payment->total_price);
|
||||
})
|
||||
->editColumn('created_at', function (Payment $payment) {
|
||||
return $payment->created_at ? $payment->created_at->diffForHumans() : '';
|
||||
|
|
|
@ -62,7 +62,7 @@ class PaypalProductController extends Controller
|
|||
$disabled = !is_null($request->input('disabled'));
|
||||
PaypalProduct::create(array_merge($request->all(), ['disabled' => $disabled]));
|
||||
|
||||
return redirect()->route('admin.store.index')->with('success', 'store item has been created!');
|
||||
return redirect()->route('admin.store.index')->with('success', 'Store item has been created!');
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -112,7 +112,7 @@ class PaypalProductController extends Controller
|
|||
$disabled = !is_null($request->input('disabled'));
|
||||
$paypalProduct->update(array_merge($request->all(), ['disabled' => $disabled]));
|
||||
|
||||
return redirect()->route('admin.store.index')->with('success', 'store item has been updated!');
|
||||
return redirect()->route('admin.store.index')->with('success', 'Store item has been updated!');
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -124,7 +124,7 @@ class PaypalProductController extends Controller
|
|||
{
|
||||
$paypalProduct->update(['disabled' => !$paypalProduct->disabled]);
|
||||
|
||||
return redirect()->route('admin.store.index')->with('success', 'product has been updated!');
|
||||
return redirect()->route('admin.store.index')->with('success', 'Product has been updated!');
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -136,7 +136,7 @@ class PaypalProductController extends Controller
|
|||
public function destroy(PaypalProduct $paypalProduct)
|
||||
{
|
||||
$paypalProduct->delete();
|
||||
return redirect()->back()->with('success', 'store item has been removed!');
|
||||
return redirect()->back()->with('success', 'Store item has been removed!');
|
||||
}
|
||||
|
||||
|
||||
|
@ -173,7 +173,7 @@ class PaypalProductController extends Controller
|
|||
return $paypalProduct->created_at ? $paypalProduct->created_at->diffForHumans() : '';
|
||||
})
|
||||
->editColumn('price', function (PaypalProduct $paypalProduct) {
|
||||
return $paypalProduct->formatCurrency();
|
||||
return $paypalProduct->formatToCurrency($paypalProduct->price);
|
||||
})
|
||||
->rawColumns(['actions', 'disabled'])
|
||||
->make();
|
||||
|
|
|
@ -84,7 +84,7 @@ class ProductController extends Controller
|
|||
$product->eggs()->attach($request->input('eggs'));
|
||||
$product->nodes()->attach($request->input('nodes'));
|
||||
|
||||
return redirect()->route('admin.products.index')->with('success', 'product has been created!');
|
||||
return redirect()->route('admin.products.index')->with('success', 'Product has been created!');
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -152,7 +152,7 @@ class ProductController extends Controller
|
|||
$product->eggs()->attach($request->input('eggs'));
|
||||
$product->nodes()->attach($request->input('nodes'));
|
||||
|
||||
return redirect()->route('admin.products.index')->with('success', 'product has been updated!');
|
||||
return redirect()->route('admin.products.index')->with('success', 'Product has been updated!');
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -164,7 +164,7 @@ class ProductController extends Controller
|
|||
{
|
||||
$product->update(['disabled' => !$product->disabled]);
|
||||
|
||||
return redirect()->route('admin.products.index')->with('success', 'product has been updated!');
|
||||
return redirect()->route('admin.products.index')->with('success', 'Product has been updated!');
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -181,7 +181,7 @@ class ProductController extends Controller
|
|||
}
|
||||
|
||||
$product->delete();
|
||||
return redirect()->back()->with('success', 'product has been removed!');
|
||||
return redirect()->back()->with('success', 'Product has been removed!');
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -92,7 +92,7 @@ class ServerController extends Controller
|
|||
{
|
||||
try {
|
||||
$server->delete();
|
||||
return redirect()->route('admin.servers.index')->with('success', 'server removed');
|
||||
return redirect()->route('admin.servers.index')->with('success', 'Server removed');
|
||||
} catch (Exception $e) {
|
||||
return redirect()->route('admin.servers.index')->with('error', 'An exception has occurred while trying to remove a resource "' . $e->getMessage() . '"');
|
||||
}
|
||||
|
@ -109,7 +109,7 @@ class ServerController extends Controller
|
|||
return redirect()->back()->with('error', $exception->getMessage());
|
||||
}
|
||||
|
||||
return redirect()->back()->with('success', 'server has been updated!');
|
||||
return redirect()->back()->with('success', 'Server has been updated!');
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -21,7 +21,7 @@ class ProductController extends Controller
|
|||
*/
|
||||
public function getNodesBasedOnEgg(Request $request, Egg $egg)
|
||||
{
|
||||
if (is_null($egg->id)) return response()->json('egg id is required', '400');
|
||||
if (is_null($egg->id)) return response()->json('Egg ID is required', '400');
|
||||
|
||||
#get products that include this egg
|
||||
$products = Product::query()->with('nodes')->whereHas('eggs', function (Builder $builder) use ($egg) {
|
||||
|
|
|
@ -86,6 +86,6 @@ class ProfileController extends Controller
|
|||
'email' => $request->input('email'),
|
||||
]);
|
||||
|
||||
return redirect()->route('profile.index')->with('success' , 'profile updated');
|
||||
return redirect()->route('profile.index')->with('success' , 'Profile updated');
|
||||
}
|
||||
}
|
||||
|
|
|
@ -138,7 +138,7 @@ class ServerController extends Controller
|
|||
}
|
||||
}
|
||||
|
||||
return redirect()->route('servers.index')->with('success', 'server created');
|
||||
return redirect()->route('servers.index')->with('success', 'Server created');
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -151,7 +151,7 @@ class ServerController extends Controller
|
|||
$server->delete();
|
||||
|
||||
Auth::user()->notify(new ServerCreationError($server));
|
||||
return redirect()->route('servers.index')->with('error', 'No allocations satisfying the requirements for automatic deployment were found.');
|
||||
return redirect()->route('servers.index')->with('error', 'No allocations satisfying the requirements for automatic deployment on this node were found.');
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -172,7 +172,7 @@ class ServerController extends Controller
|
|||
{
|
||||
try {
|
||||
$server->delete();
|
||||
return redirect()->route('servers.index')->with('success', 'server removed');
|
||||
return redirect()->route('servers.index')->with('success', 'Server removed');
|
||||
} catch (Exception $e) {
|
||||
return redirect()->route('servers.index')->with('error', 'An exception has occurred while trying to remove a resource "' . $e->getMessage() . '"');
|
||||
}
|
||||
|
|
|
@ -29,6 +29,9 @@ class Payment extends Model
|
|||
'type',
|
||||
'amount',
|
||||
'price',
|
||||
'tax_value',
|
||||
'total_price',
|
||||
'tax_percent',
|
||||
'currency_code',
|
||||
];
|
||||
|
||||
|
@ -51,9 +54,15 @@ class Payment extends Model
|
|||
return $this->belongsTo(User::class);
|
||||
}
|
||||
|
||||
public function formatCurrency($locale = 'en_US')
|
||||
/**
|
||||
* @param mixed $value
|
||||
* @param string $locale
|
||||
*
|
||||
* @return float
|
||||
*/
|
||||
public function formatToCurrency($value,$locale = 'en_US')
|
||||
{
|
||||
$formatter = new NumberFormatter($locale, NumberFormatter::CURRENCY);
|
||||
return $formatter->formatCurrency($this->price, $this->currency_code);
|
||||
return $formatter->formatCurrency($value, $this->currency_code);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -6,6 +6,7 @@ use Hidehalo\Nanoid\Client;
|
|||
use Illuminate\Database\Eloquent\Model;
|
||||
use NumberFormatter;
|
||||
use Spatie\Activitylog\Traits\LogsActivity;
|
||||
use App\Models\Configuration;
|
||||
|
||||
class PaypalProduct extends Model
|
||||
{
|
||||
|
@ -40,12 +41,45 @@ class PaypalProduct extends Model
|
|||
}
|
||||
|
||||
/**
|
||||
* @param mixed $value
|
||||
* @param string $locale
|
||||
* @return string
|
||||
*
|
||||
* @return float
|
||||
*/
|
||||
public function formatCurrency($locale = 'en_US')
|
||||
public function formatToCurrency($value,$locale = 'en_US')
|
||||
{
|
||||
$formatter = new NumberFormatter($locale, NumberFormatter::CURRENCY);
|
||||
return $formatter->formatCurrency($this->price, $this->currency_code);
|
||||
return $formatter->formatCurrency($value, $this->currency_code);
|
||||
}
|
||||
|
||||
/**
|
||||
* @description Returns the tax in % taken from the Configuration
|
||||
*
|
||||
* @return int
|
||||
*/
|
||||
public function getTaxPercent()
|
||||
{
|
||||
$tax = Configuration::getValueByKey("SALES_TAX");
|
||||
return $tax < 0 ? 0 : $tax;
|
||||
}
|
||||
|
||||
/**
|
||||
* @description Returns the tax as Number
|
||||
*
|
||||
* @return float
|
||||
*/
|
||||
public function getTaxValue()
|
||||
{
|
||||
return $this->price*$this->getTaxPercent()/100;
|
||||
}
|
||||
|
||||
/**
|
||||
* @description Returns the full price of a Product including tax
|
||||
*
|
||||
* @return float
|
||||
*/
|
||||
public function getTotalPrice()
|
||||
{
|
||||
return $this->price+($this->getTaxValue());
|
||||
}
|
||||
}
|
||||
|
|
|
@ -0,0 +1,36 @@
|
|||
<?php
|
||||
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
|
||||
class AddTaxToPaymentlogs extends Migration
|
||||
{
|
||||
/**
|
||||
* Run the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function up()
|
||||
{
|
||||
Schema::table('payments', function (Blueprint $table) {
|
||||
$table->decimal('tax_value',8,2)->after('price')->nullable();
|
||||
$table->integer('tax_percent')->after('tax_value')->nullable();
|
||||
$table->decimal('total_price',8,2)->after('tax_percent')->nullable();
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Reverse the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function down()
|
||||
{
|
||||
Schema::table('payments', function (Blueprint $table) {
|
||||
$table->dropColumn('tax_value');
|
||||
$table->dropColumn('tax_percent');
|
||||
$table->dropColumn('total_price');
|
||||
});
|
||||
}
|
||||
}
|
|
@ -136,6 +136,14 @@ class ConfigurationSeeder extends Seeder
|
|||
'type' => 'boolean',
|
||||
'description' => 'Charges the first hour worth of credits upon creating a server.'
|
||||
]);
|
||||
//sales tax
|
||||
Configuration::firstOrCreate([
|
||||
'key' => 'SALES_TAX',
|
||||
], [
|
||||
'value' => '0',
|
||||
'type' => 'integer',
|
||||
'description' => 'The %-value of tax that will be added to the product price on checkout'
|
||||
]);
|
||||
|
||||
}
|
||||
}
|
||||
|
|
|
@ -37,7 +37,10 @@
|
|||
<th>User</th>
|
||||
<th>Type</th>
|
||||
<th>Amount</th>
|
||||
<th>Price</th>
|
||||
<th>Product Price</th>
|
||||
<th>Tax</th>
|
||||
<th>Tax(%)</th>
|
||||
<th>Total Price</th>
|
||||
<th>Payment_ID</th>
|
||||
<th>Payer_ID</th>
|
||||
<th>Created at</th>
|
||||
|
@ -68,6 +71,9 @@
|
|||
{data: 'type'},
|
||||
{data: 'amount'},
|
||||
{data: 'price'},
|
||||
{data: 'tax_value'},
|
||||
{data: 'tax_percent'},
|
||||
{data: 'total_price'},
|
||||
{data: 'payment_id'},
|
||||
{data: 'payer_id'},
|
||||
{data: 'created_at'},
|
||||
|
|
|
@ -6,7 +6,7 @@ Your payment has been confirmed; Your credit balance has been updated.<br>
|
|||
___
|
||||
### Payment ID: **{{$payment->id}}**<br>
|
||||
### Status: **{{$payment->status}}**<br>
|
||||
### Price: **{{$payment->formatCurrency()}}**<br>
|
||||
### Price: **{{$payment->formatToCurrency($payment->total_price)}}**<br>
|
||||
### Type: **{{$payment->type}}**<br>
|
||||
### Amount: **{{$payment->amount}}**<br>
|
||||
### Balance: **{{$payment->user->credits}}**<br>
|
||||
|
|
|
@ -83,7 +83,7 @@
|
|||
<td>1</td>
|
||||
<td><i class="fa fa-coins mr-2"></i>{{$product->quantity}} {{strtolower($product->type) == 'credits' ? CREDITS_DISPLAY_NAME : $product->type}}</td>
|
||||
<td>{{$product->description}}</td>
|
||||
<td>{{$product->formatCurrency()}}</td>
|
||||
<td>{{$product->formatToCurrency($product->price)}}</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
@ -111,11 +111,11 @@
|
|||
<table class="table">
|
||||
<tr>
|
||||
<th style="width:50%">Subtotal:</th>
|
||||
<td>{{$product->formatCurrency()}}</td>
|
||||
<td>{{$product->formatToCurrency($product->price)}}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Tax (0%)</th>
|
||||
<td>0.00</td>
|
||||
<th>Tax ({{$taxpercent}}%)</th>
|
||||
<td>{{$product->formatToCurrency($taxvalue)}}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Quantity:</th>
|
||||
|
@ -123,7 +123,7 @@
|
|||
</tr>
|
||||
<tr>
|
||||
<th>Total:</th>
|
||||
<td>{{$product->formatCurrency()}}</td>
|
||||
<td>{{$product->formatToCurrency($total)}}</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
|
|
|
@ -50,7 +50,7 @@
|
|||
<?php /** @var $product PaypalProduct */?>
|
||||
@foreach($products as $product)
|
||||
<tr>
|
||||
<td>{{$product->formatCurrency()}}</td>
|
||||
<td>{{$product->formatToCurrency($product->price)}}</td>
|
||||
<td>{{strtolower($product->type) == 'credits' ? CREDITS_DISPLAY_NAME : $product->type}}</td>
|
||||
<td><i class="fa fa-coins mr-2"></i>{{$product->display}}</td>
|
||||
<td><a href="{{route('checkout' , $product->id)}}" class="btn btn-info">Purchase</a>
|
||||
|
|
Loading…
Reference in a new issue