]> _ Git - pmi.git/commitdiff
wait #6165 @6:30
authorsoufiane <soufiane@cubedesigners.com>
Tue, 25 Jul 2023 08:52:28 +0000 (10:52 +0200)
committersoufiane <soufiane@cubedesigners.com>
Tue, 25 Jul 2023 08:52:28 +0000 (10:52 +0200)
app/Http/Controllers/Admin/ProductBaseController.php
app/Http/Controllers/AjaxController.php
app/Models/Cart.php
app/Models/Client.php
app/Models/ECommerceCommon.php
app/Models/Product.php
resources/views/components/item-cart-order.blade.php

index 037d12658aee80d3009fb92b56a91e9a8bbd15e6..e9ff728b5b0d93078c238e1d9f46f8c3ba721ebf 100644 (file)
@@ -85,7 +85,7 @@ class ProductBaseController extends CubistMagicController {
                                 foreach ($fields as $key => $field) {
                                     // Ignore first and second row (SKU, ID)
                                     // Begin at third
-                                    $c = $key += 2;
+                                    $c = ($key + 2);
                                     $value = $rows[$c][$index];
 
                                     if (in_array($field, ["basic_selling_price", "basic_purschase_price", "conversion"])) {
@@ -100,6 +100,15 @@ class ProductBaseController extends CubistMagicController {
                                     $data[$id][$field] = $value;
                                 }
                             } elseif ($row >= 9) {
+                                try {
+                                    if(empty($colmns[6])) {
+                                        throw new Exception('Empty ref');
+                                    }
+                                } catch (Exception $e) {
+                                    $contentMail["details"][$filename][$sheet] = "[ERREUR] Référence manquante";
+                                    continue;
+                                }
+
                                 if ($columns[0] && $columns[0] !== " ") {
                                     $optionId++;
                                     $specifications[$id][$optionId] = [
@@ -133,9 +142,14 @@ class ProductBaseController extends CubistMagicController {
                 }
 
 
+                $product = Product::whereIn('id', $ids)
+                    ->select('id')
+                    ->get()
+                    ->groupBy('id')
+                    ->toArray();
+
                 foreach ($ids as $sheet => $id) {
-                    $product = Product::find($id);
-                    if ($product) {
+                    if ($product[$id]) {
                         $changes = $this->storeAndReturnChanges($data);
 
                         // Remove empty array from the changes
index b04b3a42209143eab0fc71e66e4806c3f4ac2265..aa0d9f356c37dc3c1eae051916c24457cf21af42 100644 (file)
@@ -2,6 +2,7 @@
 
 namespace App\Http\Controllers;
 
+use App\Models\ECommerceCommon;
 use App\Models\Order;
 use App\Models\Cart;
 use Cubist\Backpack\Facades\App;
@@ -26,10 +27,13 @@ use Illuminate\Support\HtmlString;
 
 class AjaxController extends CubistFrontController
 {
-    protected static $_labels = ['firstname' => 'Prénom',
+    protected static $_labels = [
+        'company' => 'Société',
+        "tva" => "N° TVA",
+        "siren" => "SIREN",
+        'firstname' => 'Prénom',
         'name' => 'Nom',
         'lastname' => 'Nom',
-        'company' => 'Société',
         'sku' => 'Numéro de série',
         'ref' => 'Reference',
         'phone' => 'Téléphone',
@@ -108,6 +112,10 @@ class AjaxController extends CubistFrontController
     protected function _sendMail($validatedData, $page, $appendContents = [], $subject_ = "", $recipient = "")
     {
         $contents = [];
+
+        $validatedData['tva'] = Client::getClientConnected()->vat;
+        $validatedData['siren'] = Client::getClientConnected()->siren;
+
         foreach (self::$_labels as $key => $label) {
             if (isset($validatedData[$key])) {
                 $contents[] = $label . ' : ' . $validatedData[$key];
@@ -279,44 +287,83 @@ class AjaxController extends CubistFrontController
         $data['status'] = 'new';
         $data['locale'] = 'fr';
         $data['products'] = [];
-        $productsMessage = ["Produits : \n----"];
+        $productsMessage = ["\n\nProduits : \n"];
 
         $index = 0;
         $indexMessage = 0;
+        $prices = [];
         foreach ($cartData as $id => $_data) {
             $indexMessage++;
             $optionsPrices = Product::optionPrice($id, $cartData_[$index]['ref'], $productsArray, true);
             $basicSellingPrice = $products[$id]['basic_selling_price'];
 
+            if($basicSellingPrice) {
+                $categoryProduct = $products[$id]['category'];
+                $discount = intval(Client::getDiscount($categoryProduct));
+                $price = ECommerceCommon::priceWithDiscount($basicSellingPrice, $discount);
+
+                if ($optionsPrices) {
+                    $totalOptionPrice = Product::totalOptionPrice($optionsPrices[0], $cartData_[$index]['ref']);
+                    $price = intval($price) + $totalOptionPrice;
+                }
+                $prices[] = floatval(($price * $_data));
+            }
+
             $data['products'][] = [
                 'id' => $id,
                 'reference' => $cartData_[$index]['ref'],
                 'name' => $products[$id]['name'],
                 'quantity' => $_data,
-                'price' => floatval($basicSellingPrice)." €" ?? 0
+                'price' => $price."€" ?? 0
             ];
 
             $productsMessage[] = 'Référence : ' . $cartData_[$index]['ref'] . "\n";
-            $productsMessage[$indexMessage] .= 'Qté : ' . $_data . "\n";
+            $productsMessage[$indexMessage] .= url("/{$products[$id]['slug']}")."\n";
 
             $labelPrice = 'Prix unitaire HT : ';
 
             if($optionsPrices) {
-                foreach ($optionsPrices[1] as $v) {
-                    $productsMessage[$indexMessage] .= $v . "\n";
+                $productsMessage[$indexMessage] .= 'Prix de base : ' . $cartData_[$index]['basic_selling_price'] . "€ HT\n";
+                foreach ($optionsPrices[1] as $key => $v) {
+                    $productsMessage[$indexMessage] .= $v . " (+".array_values($optionsPrices[0])[0][$key]."€ HT)\n";
                 }
-                $totalOptionPrice = Product::totalOptionPrice($optionsPrices[0],$cartData_[$index]['ref']);
-                $data['products'][$index]['price'] = floatval($basicSellingPrice + $totalOptionPrice);
                 $labelPrice = 'Prix unitaire HT (avec options) : ';
             }
 
-            $productsMessage[$indexMessage] .= $labelPrice.$data['products'][$index]['price'] . "€ \n";
-            $productsMessage[$indexMessage] .= url("/{$products[$id]['slug']}")."\n";
-            $productsMessage[$indexMessage] .= "----";
+            $productsMessage[$indexMessage] .= $labelPrice.$price . "€ \n";
+            $productsMessage[$indexMessage] .= 'Qté : ' . $_data . "\n\n";
+            $productsMessage[$indexMessage] .= "----\n\n";
 
+            //Information for order
             $index++;
         }
 
+        if($action === "order") {
+            $totalHT = array_reduce($prices, function($carry, $item) { return $carry + $item; });
+            $totalHT += ($totalHT > 1000) ? 20 : 0;
+            $tva = ECommerceCommon::tva($totalHT);
+            $totalTTC = ECommerceCommon::totalTTC($totalHT);
+
+            $productsMessage[$indexMessage] .= "Frais de ports : ".($totalHT > 1000 ? 20 : 0)."€\n";
+            $productsMessage[$indexMessage] .= "Total HT : $totalHT"."€\n";
+            $productsMessage[$indexMessage] .= "Montant TVA : $tva"."€\n";
+            $productsMessage[$indexMessage] .= "Total TTC : $totalTTC"."€\n";
+            $productsMessage[$indexMessage] .= "\n----\n\n";
+
+            $productsMessage[$indexMessage] .= "Adresse de facturation : \n";
+            foreach (Client::getAddressByType("billing_address")[0] as $key => $info) {
+                $productsMessage[$indexMessage] .= $info;
+                $productsMessage[$indexMessage] .= !in_array($key, ["firstname","zipcode"]) ? "\n" : " ";
+            }
+            $productsMessage[$indexMessage] .= "\n----\n\n";
+            $productsMessage[$indexMessage] .= "Adresse de livraison : \n";
+            foreach (Client::getAddressByType("delivery_address")[0] as $key => $info) {
+                $productsMessage[$indexMessage] .= $info;
+                $productsMessage[$indexMessage] .= !in_array($key, ["firstname","zipcode"]) ? "\n" : " ";
+            }
+            $productsMessage[$indexMessage] .= "\n----\n";
+        }
+
         $data['products'] = json_encode($data['products']);
         unset($data['page']);
         unset($data['cart_data']);
@@ -329,7 +376,7 @@ class AjaxController extends CubistFrontController
 
             $linkTo = 'Voir la demande en ligne : ' . url('/admin/quotes/' . $quote->id . '/edit');
         }else {
-            $linkTo = 'Voir la commande en ligne : ' . url('/admin/order/' . $save->id . '/edit');
+            $linkTo = 'Voir la commande en ligne : ' . url('/admin/order/' . $save->id . "/edit \n");
         }
 
         $this->_sendMail($validatedData, $page, [implode("\r\n", $productsMessage), '', $linkTo], "Nouvelle commande");
index e115681b10e79a3fd28a392bcd9b27c3be8c30d0..18e7634074d45a849e69f180d5f699315b86cc75 100644 (file)
@@ -64,7 +64,8 @@ class Cart extends ECommerceCommon
     }
 
     public static function hasNoEcommerceProductInCart(Request $request) {
-        $cartData = $request->session()->get('cart_items', []);
+        $items = $request->session()->get('cart_items', []);
+        $cartData = Product::getCartData($items);
         return sizeof(array_filter($cartData, function($n) { return empty($n['basic_selling_price']); })) > 0 ?? false;
     }
 }
index 7d9a321b1a6723817098a8ae479dbc3452a46a44..9fdb73b3328a15a0561c79d527991fee1b2719d9 100644 (file)
@@ -113,6 +113,17 @@ class Client extends CubistMagicAbstractModel
         return self::getClientConnected()->discount ?? 'A';
     }
 
+    public static function getAddressByType($type) {
+        $addresses = json_decode(self::getClientConnected()->address, true);
+        $addresses = array_values(array_filter($addresses, function ($n) use($type) {
+            return $n[$type];
+        }));
+        unset($addresses[0]["name"]);
+        unset($addresses[0]["billing_address"]);
+        unset($addresses[0]["delivery_address"]);
+        return $addresses;
+    }
+
     public static function getDiscount($categoryProduct, $categoryClient = false) {
         if(!$categoryClient)
             $categoryClient = self::getCategory();
index dce2a0bfa70abfb3898172b005b0c354159224a0..7d93faa9148a132aa932ce85c9950ba35f0f171b 100644 (file)
@@ -42,6 +42,23 @@ class ECommerceCommon extends CubistMagicAbstractModel
         return self::all()->where('user_id', $userID)->toArray();
     }
 
+    public static function priceWithDiscount($price, $discount) {
+        return ($price - (($price * $discount) / 100));
+    }
+    public static function totalHT($price, $discount, $quantity) {
+        $t = self::priceWithDiscount($price, $discount) * $quantity;
+        $t += ($t > 1000) ? 20 : 0;
+        return $t;
+    }
+
+    public static function totalTTC($totalHT) {
+        return $totalHT + self::tva($totalHT);
+    }
+
+    public static function tva($totalHT) {
+        return $totalHT * 0.2;
+    }
+
     public static function updateCartData($currentCartRef,$data = [], $productsInfosBase = []) {
         $opt = [];
         $total = [];
index fc4b2a60e9ae7eae7bfc5169f36b64fc3c6ff9f1..dfdafec57dfb33636d4871d445284468d5e4bcd6 100644 (file)
@@ -536,28 +536,30 @@ class Product extends CubistMagicPageModel
                 return false;
             }
 
+            $counter = -1;
             foreach ($explodeRef as $key => $ref) {
-                $key -= 1;
-                if ($key > -1) {
-                    $options_ = $options[$key]['options'];
+                if ($counter > -1) {
+                    $options_ = $options[$counter]['options'];
                     foreach ($options_ as $opt_) {
                         if ($opt_["ref"] === $ref) {
-                            $opt[$refs][] = $opt_["sale_price"] ?? 0;
-                            $optDetails[] = ucfirst($options[$key]['name_fr']) . ' : ' . $ref;
+                            $opt[$refs][] = $opt_["sale_price"];
+                            $optDetails[] = ucfirst($options[$counter]['name_fr']) . ' : ' . $ref;
                         }
                     }
                 }
+                $counter++;
             }
         }
 
-        if($mailCondition)
+        if($mailCondition) {
             return [$opt, $optDetails];
-
-        return $opt;
+        } else {
+            return $opt;
+        }
     }
 
     public static function totalOptionPrice($optionPrice, $refs) {
-        return $optionPrice ? array_reduce($optionPrice[$refs], function ($carry, $item) {
+        return $optionPrice ? array_reduce(array_values($optionPrice)[0], function ($carry, $item) {
             return $carry + $item;
         }) : 0;
     }
index 90c820148d6271cd81aa494a0e99dd71001c428b..291feba723b1b204f790f72cabcca9b31c660488 100644 (file)
@@ -5,7 +5,7 @@
             <div class="flex justify-between">
                 <div>
                     <p class="no-m">{{ __('Date de commande') }}</p>
-                    <p class="no-m text-navy">{{ \Carbon\Carbon::parse($item['created_at'])->isoFormat("DD/MM/Y") }}</p>
+                    <p class="no-m text-navy">{{ \Carbon\Carbon::parse($item['request_date'])->isoFormat("DD/MM/Y") }}</p>
                 </div>
                 <div class="text-right">
                     <p class="no-m">{{ __('Numéro de commande') }}</p>