HOME


Mini Shell 1.0
Redirecting to https://devs.lapieza.net/iniciar-sesion Redirecting to https://devs.lapieza.net/iniciar-sesion.
DIR: /var/www/devs.lapieza.net/app/Http/Controllers/Api/V2/Seller/
Upload File :
Current File : /var/www/devs.lapieza.net/app/Http/Controllers/Api/V2/Seller/PosController.php
<?php

namespace App\Http\Controllers\Api\V2\Seller;

use App\Http\Controllers\Mensajeria\WhatsAppController;
use App\Http\Resources\PosProductCollection;
use App\Http\Resources\V2\AddressCollection;
use App\Http\Resources\V2\Seller\CartCollection;
use App\Http\Resources\V2\Seller\CustomerCollection;
use App\Mail\UserCreatedBySellerMail;
use App\Mail\VerificationEmail;
use App\Models\Address;
use App\Models\Cart;
use App\Models\User;
use App\Utility\PosUtility;
use Exception;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Mail;
use Str;

class PosController extends Controller {
    public function productsList(Request $request) {
        $products = PosUtility::product_search($request->only('category', 'brand', 'keyword'));

        return response()->json([
            'products' => new PosProductCollection($products),
            'keyword' => $request->keyword,
            'category' => $request->category,
            'brand' => $request->brand
        ]);
    }

    public function getCustomers() {
        $customers = User::latest()->where('user_type', 'customer')->get();
        return new CustomerCollection($customers);
    }

    public function updateSessionUser(Request $request) {
        $userID = $request->userId;
        $sessionUserId = $request->sessionUserId;
        $sessionTemUserId = $request->sessionTemUserId;
        $carts = get_pos_user_cart($sessionUserId, $sessionTemUserId);

        // If user is selected but Session user is not this user
        if ($userID && $carts) {
            PosUtility::updatePosUserCartData($carts, $userID, null);
        }

        // If user is not selected, and if session has not Temp user ID
        if (!$userID) {
            if (!$sessionTemUserId) {
                $sessionTemUserId = bin2hex(random_bytes(10));
            }
            if ($carts) {
                PosUtility::updatePosUserCartData($carts, null, $sessionTemUserId);
            }
        }

        return response()->json([
            'result' => true,
            'message' => translate('Información actualizada'),
            'userID' => $userID,
            'temUserId' => $sessionTemUserId
        ]);
    }

    public function getShippingAddress($id) {
        $user = user::where('id', $id)->first();
        $shippingAddresses = $user->addresses;
        return new AddressCollection($shippingAddresses);
    }

    public function posConfigurationUpdate(Request $request) {
        $shop = auth()->user()->shop;
        $shop->thermal_printer_width = $request->thermal_printer_width;
        $shop->save();

        return $this->success(translate('Configuracion actualizada'));

    }

    public function posConfiguration(Request $request) {
        $shop = auth()->user()->shop;
        $data = $shop->thermal_printer_width;
        return $this->success($data);

    }

    public function createShippingAddress(Request $request) {
        $address = new Address;
        $address->user_id = $request->user_id;
        $address->address = $request->address;
        $address->country_id = $request->country_id;
        $address->state_id = $request->state_id;
        $address->city_id = $request->city_id;
        $address->postal_code = $request->postal_code;
        $address->phone = $request->phone;
        $address->save();

        return response()->json([
            'result' => true,
            'message' => translate('Información de entrega agregada con exito')
        ]);
    }

    public function addToCart(Request $request) {
        $stockId = $request->stock_id;
        $userID = $request->userID;
        $temUserId = $request->temUserId;
        if (!$temUserId && !$userID) {
            $temUserId = bin2hex(random_bytes(10));
        }
        $response = PosUtility::addToCart($stockId, $userID, $temUserId);

        return response()->json([
            'success' => $response['success'],
            'message' => $response['message'],
            'userId' => $userID,
            'temUserId' => $temUserId
        ]);
    }

    public function getUserCartData(Request $request) {
        $shippingCost = $request->shippingCost;
        $discountAmount = 0;
        $carts = Cart::where('user_id', $request->userId)->get();
        $subtotal = 0;
        $tax = 0;

        foreach ($carts as $cartItem) {
            $product = $cartItem->product;
            $subtotal += cart_product_price($cartItem, $product, false, false) * $cartItem['quantity'];
        }

        if ($request->discount) {
            $discountAmount = ($request->discount / 100) * ($subtotal);
            $subtotal = $subtotal - $discountAmount;
        }


        $tax = $subtotal * (config('app.itbis') / 100);

        $total = $subtotal + $tax + $shippingCost;

        return response()->json([
            'result' => true,
            'data' => [
                'cart_data' => new CartCollection($carts),
                'subtotal' => single_price($subtotal),
                'tax' => single_price($tax),
                'shippingCost' => $shippingCost,
                'shippingCost_str' => single_price($shippingCost),
                'discount' => single_price($discountAmount),
                'Total' => single_price($total)
            ]
        ]);
    }

    public function updateQuantity(Request $request) {
        $cart = Cart::find($request->cart_id);
        $response = PosUtility::updateCartItemQuantity($cart, $request->only(['cart_id', 'quantity']));

        return response()->json(['result' => (bool)$response['success'] ?? true, 'message' => $response['message']]);
    }

    public function removeFromCart(Request $request) {
        Cart::where('id', $request->id)->delete();
        return $this->success(translate('Eliminado exitosamente'));
    }

    public function orderStore(Request $request) {
        $response = PosUtility::orderStore($request->except(['_token']));
        return $response['success'] ? $this->success($response['message']) : $this->success($response['message']);
    }

    public function createUser(Request $request) {
        $verificationCode = str_pad(rand(0, 999999), 6, '0', STR_PAD_LEFT);
        $confirmationCode = Str::random(25);

        try{
            $user = User::create([
                'name' => $request->name,
                'email' => $request->email,
                'phone' => $request->phone,
                'referred_by' => auth()->id(),
                'password' => Hash::make($verificationCode),
                'user_type' => 'customer',
                'confirmation_code' => $confirmationCode,
                'verification_code' => $verificationCode,
            ]);
            Log::info('User created');
        }catch (Exception $e){
            Log::error('User cant be created');
            Log::error($e);
            return response()->json([
                'result' => false,
                'message' => 'No se puede crear el usuario, verifica los datos',
                'data' => []
            ]);
        }

        ( new WhatsAppController )->sendCreatedAccountMessage($user);

        try {
            Mail::to($user->email)->send(new VerificationEmail($user));
        } catch ( Exception $e) {
            Log::error('Mail cant be sendend');
            Log::error($e);
            $user->delete();
            return response()->json([
                'result' => false,
                'message' => 'No se ah podido enviar el correo electronico',
                'data' => []
            ]);
        }

        return response()->json([
            'result' => true,
            'message' => 'Usuario creado exitosamente',
            'data' => $user
        ]);
    }

    public function updateShippingAddress(Request $request){
        auth()->user()->addresses()->default()->delete();

        // Quitar guiones y espacios del telefono
        $phone = str_replace(['-', ' '], '', $request->phone);

        // Agrega +1 al inicio si no está ya presente
        if (substr($phone, 0, 2) !== '+1') {
            $phone = '+1' . $phone;
        }

        // Valida que el número tenga 12 dígitos (10 dígitos más el '+1' al inicio)
        if (strlen($phone) !== 12) {
            return response()->json([
                'result' => false,
                'message' => translate('El telefono debe ser de 10 digitos')
            ]);
        }

        $address = new Address;
        $address->user_id = auth()->user()->id;
        $address->address = $request->address;
        $address->country = $request->country;
        $address->state = $request->state;
        $address->city = $request->city;
        $address->postalCode = $request->postalCode;
        $address->postal_code = $request->postalCode;
        $address->phone = $phone;
        $address->longitude = $request->longitude;
        $address->latitude = $request->latitude;
        $address->set_default = true;
        $address->save();

        return response()->json([
            'result' => true,
            'message' => translate('Direccion Guardada Exitosamente')
        ], 201);
    }
}