Browse Source

Merge pull request #265 from 1day2die/fix_Tax

Full configurable Tax support
Dennis 3 years ago
parent
commit
3fac4f87c0

+ 32 - 5
app/Http/Controllers/Admin/PaymentController.php

@@ -27,6 +27,7 @@ use PayPalHttp\HttpException;
 
 
 class PaymentController extends Controller
 class PaymentController extends Controller
 {
 {
+
     /**
     /**
      * @return Application|Factory|View
      * @return Application|Factory|View
      */
      */
@@ -45,7 +46,10 @@ class PaymentController extends Controller
     public function checkOut(Request $request, PaypalProduct $paypalProduct)
     public function checkOut(Request $request, PaypalProduct $paypalProduct)
     {
     {
         return view('store.checkout')->with([
         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(),
                     "reference_id" => uniqid(),
                     "description" => $paypalProduct->description,
                     "description" => $paypalProduct->description,
                     "amount"       => [
                     "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'),
                 'brand_name' =>  config('app.name', 'Laravel'),
                 'shipping_preference'  => 'NO_SHIPPING'
                 'shipping_preference'  => 'NO_SHIPPING'
             ]
             ]
+
+        
         ];
         ];
 
 
 
 
@@ -161,6 +179,9 @@ class PaymentController extends Controller
                     'status' => $response->result->status,
                     'status' => $response->result->status,
                     'amount' => $paypalProduct->quantity,
                     'amount' => $paypalProduct->quantity,
                     'price' => $paypalProduct->price,
                     'price' => $paypalProduct->price,
+                    'tax_value' => $paypalProduct->getTaxValue(),
+                    'tax_percent' => $paypalProduct->getTaxPercent(),
+                    'total_price' => $paypalProduct->getTotalPrice(),
                     'currency_code' => $paypalProduct->currency_code,
                     'currency_code' => $paypalProduct->currency_code,
                     'payer' => json_encode($response->result->payer),
                     'payer' => json_encode($response->result->payer),
                 ]);
                 ]);
@@ -199,7 +220,7 @@ class PaymentController extends Controller
      */
      */
     public function cancel(Request $request)
     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;
                 return $payment->user->name;
             })
             })
             ->editColumn('price', function (Payment $payment) {
             ->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) {
             ->editColumn('created_at', function (Payment $payment) {
                 return $payment->created_at ? $payment->created_at->diffForHumans() : '';
                 return $payment->created_at ? $payment->created_at->diffForHumans() : '';

+ 1 - 1
app/Http/Controllers/Admin/PaypalProductController.php

@@ -173,7 +173,7 @@ class PaypalProductController extends Controller
                 return $paypalProduct->created_at ? $paypalProduct->created_at->diffForHumans() : '';
                 return $paypalProduct->created_at ? $paypalProduct->created_at->diffForHumans() : '';
             })
             })
             ->editColumn('price', function (PaypalProduct $paypalProduct) {
             ->editColumn('price', function (PaypalProduct $paypalProduct) {
-                return $paypalProduct->formatCurrency();
+                return $paypalProduct->formatToCurrency($paypalProduct->price);
             })
             })
             ->rawColumns(['actions', 'disabled'])
             ->rawColumns(['actions', 'disabled'])
             ->make();
             ->make();

+ 11 - 2
app/Models/Payment.php

@@ -29,6 +29,9 @@ class Payment extends Model
         'type',
         'type',
         'amount',
         'amount',
         'price',
         'price',
+        'tax_value',
+        'total_price',
+        'tax_percent',
         'currency_code',
         'currency_code',
     ];
     ];
 
 
@@ -51,9 +54,15 @@ class Payment extends Model
         return $this->belongsTo(User::class);
         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);
         $formatter = new NumberFormatter($locale, NumberFormatter::CURRENCY);
-        return $formatter->formatCurrency($this->price, $this->currency_code);
+        return $formatter->formatCurrency($value, $this->currency_code);
     }
     }
 }
 }

+ 37 - 3
app/Models/PaypalProduct.php

@@ -6,6 +6,7 @@ use Hidehalo\Nanoid\Client;
 use Illuminate\Database\Eloquent\Model;
 use Illuminate\Database\Eloquent\Model;
 use NumberFormatter;
 use NumberFormatter;
 use Spatie\Activitylog\Traits\LogsActivity;
 use Spatie\Activitylog\Traits\LogsActivity;
+use App\Models\Configuration;
 
 
 class PaypalProduct extends Model
 class PaypalProduct extends Model
 {
 {
@@ -40,12 +41,45 @@ class PaypalProduct extends Model
     }
     }
 
 
     /**
     /**
+     * @param mixed $value
      * @param string $locale
      * @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);
         $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());
     }
     }
 }
 }

+ 36 - 0
database/migrations/2021_11_05_071456_add_tax_to_paymentlogs.php

@@ -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');
+        });
+    }
+}

+ 8 - 0
database/seeders/Seeds/ConfigurationSeeder.php

@@ -136,6 +136,14 @@ class ConfigurationSeeder extends Seeder
             'type'        => 'boolean',
             'type'        => 'boolean',
             'description' => 'Charges the first hour worth of credits upon creating a server.'
             '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'
+        ]);
 
 
     }
     }
 }
 }

+ 7 - 1
resources/views/admin/payments/index.blade.php

@@ -37,7 +37,10 @@
                             <th>User</th>
                             <th>User</th>
                             <th>Type</th>
                             <th>Type</th>
                             <th>Amount</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>Payment_ID</th>
                             <th>Payer_ID</th>
                             <th>Payer_ID</th>
                             <th>Created at</th>
                             <th>Created at</th>
@@ -68,6 +71,9 @@
                     {data: 'type'},
                     {data: 'type'},
                     {data: 'amount'},
                     {data: 'amount'},
                     {data: 'price'},
                     {data: 'price'},
+                    {data: 'tax_value'},
+                    {data: 'tax_percent'},
+                    {data: 'total_price'},
                     {data: 'payment_id'},
                     {data: 'payment_id'},
                     {data: 'payer_id'},
                     {data: 'payer_id'},
                     {data: 'created_at'},
                     {data: 'created_at'},

+ 1 - 1
resources/views/mail/payment/confirmed.blade.php

@@ -6,7 +6,7 @@ Your payment has been confirmed; Your credit balance has been updated.<br>
 ___
 ___
 ### Payment ID: **{{$payment->id}}**<br>
 ### Payment ID: **{{$payment->id}}**<br>
 ### Status:     **{{$payment->status}}**<br>
 ### Status:     **{{$payment->status}}**<br>
-### Price:      **{{$payment->formatCurrency()}}**<br>
+### Price:      **{{$payment->formatToCurrency($payment->total_price)}}**<br>
 ### Type:       **{{$payment->type}}**<br>
 ### Type:       **{{$payment->type}}**<br>
 ### Amount:     **{{$payment->amount}}**<br>
 ### Amount:     **{{$payment->amount}}**<br>
 ### Balance:    **{{$payment->user->credits}}**<br>
 ### Balance:    **{{$payment->user->credits}}**<br>

+ 5 - 5
resources/views/store/checkout.blade.php

@@ -83,7 +83,7 @@
                                         <td>1</td>
                                         <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><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->description}}</td>
-                                        <td>{{$product->formatCurrency()}}</td>
+                                        <td>{{$product->formatToCurrency($product->price)}}</td>
                                     </tr>
                                     </tr>
                                     </tbody>
                                     </tbody>
                                 </table>
                                 </table>
@@ -111,11 +111,11 @@
                                     <table class="table">
                                     <table class="table">
                                         <tr>
                                         <tr>
                                             <th style="width:50%">Subtotal:</th>
                                             <th style="width:50%">Subtotal:</th>
-                                            <td>{{$product->formatCurrency()}}</td>
+                                            <td>{{$product->formatToCurrency($product->price)}}</td>
                                         </tr>
                                         </tr>
                                         <tr>
                                         <tr>
-                                            <th>Tax (0%)</th>
-                                            <td>0.00</td>
+                                            <th>Tax ({{$taxpercent}}%)</th>
+                                            <td>{{$product->formatToCurrency($taxvalue)}}</td>
                                         </tr>
                                         </tr>
                                         <tr>
                                         <tr>
                                             <th>Quantity:</th>
                                             <th>Quantity:</th>
@@ -123,7 +123,7 @@
                                         </tr>
                                         </tr>
                                         <tr>
                                         <tr>
                                             <th>Total:</th>
                                             <th>Total:</th>
-                                            <td>{{$product->formatCurrency()}}</td>
+                                            <td>{{$product->formatToCurrency($total)}}</td>
                                         </tr>
                                         </tr>
                                     </table>
                                     </table>
                                 </div>
                                 </div>

+ 1 - 1
resources/views/store/index.blade.php

@@ -50,7 +50,7 @@
                             <?php /** @var $product PaypalProduct */?>
                             <?php /** @var $product PaypalProduct */?>
                             @foreach($products as $product)
                             @foreach($products as $product)
                                 <tr>
                                 <tr>
-                                    <td>{{$product->formatCurrency()}}</td>
+                                    <td>{{$product->formatToCurrency($product->price)}}</td>
                                     <td>{{strtolower($product->type) == 'credits' ? CREDITS_DISPLAY_NAME : $product->type}}</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><i class="fa fa-coins mr-2"></i>{{$product->display}}</td>
                                     <td><a href="{{route('checkout' , $product->id)}}" class="btn btn-info">Purchase</a>
                                     <td><a href="{{route('checkout' , $product->id)}}" class="btn btn-info">Purchase</a>