# Пример использования регистрации клиента через заказ

## Описание процесса

1. Клиент делает заказ, вводит свои данные (email, имя, телефон)
2. Система автоматически создает пользователя без пароля (если его еще нет)
3. Клиенту отправляется email с подтверждением заказа и ссылкой на личный кабинет
4. При первом посещении кабинета клиент устанавливает пароль
5. После установки пароля отправляется email для подтверждения email адреса

## Пример контроллера заказов

```php
<?php

namespace App\Http\Controllers\Api;

use App\Http\Controllers\Controller;
use App\Models\Order;
use App\Models\OrderItem;
use App\Http\Controllers\Api\AuthController;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Validator;

class OrderController extends Controller
{
    public function store(Request $request)
    {
        $validator = Validator::make($request->all(), [
            'customer_name' => 'required|string|max:255',
            'customer_email' => 'required|email|max:255',
            'customer_phone' => 'required|string|max:20',
            'delivery_address' => 'required|string',
            'delivery_time' => 'nullable|date',
            'type' => 'required|in:delivery,pickup',
            'items' => 'required|array|min:1',
            'items.*.dish_id' => 'required|exists:dishes,id',
            'items.*.quantity' => 'required|integer|min:1',
        ]);

        if ($validator->fails()) {
            return response()->json([
                'success' => false,
                'message' => 'Ошибка валидации',
                'errors' => $validator->errors()
            ], 422);
        }

        DB::beginTransaction();
        try {
            // Генерируем номер заказа
            $orderNumber = Order::generateOrderNumber();

            // Регистрируем или находим пользователя
            $user = AuthController::registerFromOrder(
                $request->customer_email,
                $request->customer_name,
                $request->customer_phone,
                $orderNumber
            );

            // Создаем заказ
            $order = Order::create([
                'user_id' => $user->id,
                'order_number' => $orderNumber,
                'type' => $request->type,
                'status' => 'pending',
                'customer_name' => $request->customer_name,
                'customer_phone' => $request->customer_phone,
                'delivery_address' => $request->delivery_address,
                'delivery_time' => $request->delivery_time,
                'subtotal' => 0,
                'delivery_fee' => $request->type === 'delivery' ? 500 : 0, // пример
                'total' => 0,
                'payment_status' => 'pending',
            ]);

            // Добавляем позиции заказа
            $subtotal = 0;
            foreach ($request->items as $item) {
                $dish = \App\Models\Dish::findOrFail($item['dish_id']);
                $itemSubtotal = $dish->price * $item['quantity'];
                $subtotal += $itemSubtotal;

                OrderItem::create([
                    'order_id' => $order->id,
                    'dish_id' => $dish->id,
                    'dish_name' => $dish->name,
                    'dish_price' => $dish->price,
                    'quantity' => $item['quantity'],
                    'subtotal' => $itemSubtotal,
                ]);
            }

            // Обновляем суммы заказа
            $order->update([
                'subtotal' => $subtotal,
                'total' => $subtotal + $order->delivery_fee,
            ]);

            DB::commit();

            return response()->json([
                'success' => true,
                'message' => 'Заказ успешно создан',
                'data' => [
                    'order' => $order->load('items'),
                ]
            ], 201);

        } catch (\Exception $e) {
            DB::rollBack();
            return response()->json([
                'success' => false,
                'message' => 'Ошибка при создании заказа',
                'error' => $e->getMessage()
            ], 500);
        }
    }
}
```

## API Endpoints

### Создание заказа
```
POST /api/orders
Content-Type: application/json

{
  "customer_name": "Иван Иванов",
  "customer_email": "ivan@example.com",
  "customer_phone": "+1234567890",
  "delivery_address": "ул. Примерная, д. 1",
  "delivery_time": "2024-01-20 18:00:00",
  "type": "delivery",
  "items": [
    {
      "dish_id": 1,
      "quantity": 2
    },
    {
      "dish_id": 3,
      "quantity": 1
    }
  ]
}
```

### Установка пароля
```
POST /api/auth/set-password
Content-Type: application/json

{
  "token": "token_from_email",
  "password": "newpassword123",
  "password_confirmation": "newpassword123"
}
```

### Проверка токена для установки пароля
```
POST /api/auth/check-set-password-token
Content-Type: application/json

{
  "token": "token_from_email"
}
```

## Поток работы

1. **Клиент создает заказ** → `POST /api/orders`
   - Система автоматически регистрирует клиента (если его нет)
   - Отправляется email с подтверждением заказа и ссылкой на кабинет

2. **Клиент переходит по ссылке** → `GET /cabinet?token=xxx`
   - Frontend проверяет токен через `POST /api/auth/check-set-password-token`
   - Если токен валиден, показывается форма установки пароля

3. **Клиент устанавливает пароль** → `POST /api/auth/set-password`
   - Пароль сохраняется
   - Отправляется email для подтверждения email адреса
   - Возвращается токен авторизации

4. **Клиент подтверждает email** → `GET /verify-email?token=xxx`
   - Email адрес подтверждается
   - Клиент может полноценно использовать кабинет

## Важные моменты

- Токен для установки пароля действителен 7 дней
- Если пользователь уже существует, email о заказе все равно отправляется
- Профиль клиента автоматически создается при регистрации
- Телефон сохраняется в таблице `phones` с полиморфной связью






