invoicebd.com_new_update

 Hi! How can I help you today?

এটা আমার ওয়েবসাইট 'https://invoicebd.com/' চেক করে দেখো এবং আমি এই ওয়েবসাইটের সবকিছু আপডেট করতে চাই একবারে নতুন করে UI and Features যোগ করা "

ইউ আই ডিজাইনটা থাকবে py tkinter এরকম এবং আমি তৈরি করব লারাভেল এইট এবং পিএসপি 8 দিয়ে"

এবং তৈরি করব একদম সিম্পল ভাবে স্টেপ বাই স্টেপ প্রথমে হোমপেজ তারপরে ড্যাশবোর্ড একদম সিম্পল ভাবে তৈরি করব

"ইউজারা সাইন আপ করবে সাবস্ক্রিপশন নিবে ব্যবহার করবে ফ্রি ট্রাই ফ্রী ট্রায়াল থাকবে সেটিং থেকে যদি ট্রায়াল অন রাখি এবং ডেট দিয়ে দেই কতদিনের জন্য তাহলে ট্রায়াল ভার্সন থাকবে"

UI মোবাইলে মোবাইল রেস্পনসিভ থাকবে

মোবাইলে মেনু বাটনে একটি QRকোড (স্ক্যান টু সেল) অপশন থাকবে যেখানে টিপ দিলে কিউ আর কোড স্ক্যান করলে সরাসরি প্রোডাক্ট সেল অপশনে চলে যাবে আর যদি প্রোডাক্ট না থাকে তাহলে প্রোডাক্ট এড করতে নিয়ে যাবে

কাস্টমারের যদি একটি প্রোডাক্ট কিনে সে যদি পরবর্তীতে ওই প্রোডাক্ট কিনে আবার তাহলে একটা জায়গায় দেখা যাবে যে সে ওই প্রোডাক্টটি কত দিয়ে আগে কিনেছিল

আরো অনেক নতুন ফিচার আছে যা একটা একটা করে বলবো পরে একটা একটা করে আপডেট করব এখন প্রথম থেকে শুরু করব তুমি আগে থিওরি টা বুঝে নাও স্টেপ বাই স্টেপ একটা একটা করে সাজিয়ে গুছিয়ে আমাকে সিম্পল ভাবে বানিয়ে দাও

সবার প্রথমে কি করব ?

আপনার সাইট দেখেছি। এখন ওয়েবসাইটে আছে: হোমপেজ, ৩টি প্ল্যান (Plan 1 ফ্রি ২ মাস, Plan 2 মাসে ৩০০ টাকা, Enterprise কাস্টম), Features, How To Use, Contact, Affiliate, PWA install, আর লগইন পেজ। পুরো সিস্টেম একসাথে না বানিয়ে ধাপে ধাপে যাওয়াই ভালো।

আপনার বানানোর ক্রম

ধাপকাজ
১প্রজেক্ট সেটআপ + ডাটাবেস + লগইন/সাইন আপ
২হোমপেজ (মোবাইল রেসপন্সিভ)
৩ড্যাশবোর্ড (মেনু, লেআউট)
৪সাবস্ক্রিপশন + ফ্রি ট্রায়াল (সেটিং থেকে অন/অফ ও তারিখ)
৫প্রোডাক্ট + সেল
৬QR স্ক্যান টু সেল
৭কাস্টমারের আগের কেনা দাম দেখানো

সবার প্রথমে কী করবেন (ধাপ ১)

১. পরিবেশ ঠিক করুন। Laravel 8 এর জন্য PHP 8.0 বা 8.1 ব্যবহার করুন। PHP 8.2 বা তার উপরে দিলে Laravel 8 এ warning আসতে পারে। Composer আর MySQL লাগবে (XAMPP বা Laragon হলেই হবে)।

২. প্রজেক্ট তৈরি:

bash
composer create-project laravel/laravel:^8.0 invoicebd
cd invoicebd

৩. .env এ ডাটাবেস সেট করুন:

DB_DATABASE=invoicebd
DB_USERNAME=root
DB_PASSWORD=

৪. শুরুতেই যে টেবিলগুলো লাগবে (এখন শুধু এগুলো):

  • users: নাম, ফোন/ইমেইল, পাসওয়ার্ড, দোকানের নাম
  • plans: নাম, দাম, মেয়াদ
  • subscriptions: user_id, plan_id, শুরু, শেষ, স্ট্যাটাস
  • settings: key, value (এখানেই ট্রায়াল অন/অফ আর ট্রায়ালের দিন থাকবে, যেমন trial_enabled = 1, trial_days = 60)

প্রোডাক্ট, সেল, কাস্টমার টেবিল পরে ঐ ধাপে বানাব, এখন না।

৫. লগইন/সাইন আপ: সবচেয়ে সহজ উপায়:

bash
composer require laravel/ui:^3.0
php artisan ui bootstrap --auth
npm install && npm run dev

এতে রেজিস্ট্রেশন, লগইন, লগআউট তৈরি হয়ে যাবে। এরপর সাইন আপের সময় সেটিং দেখে ফ্রি ট্রায়াল চালু করব (ধাপ ৪ এ)।

একটা পরামর্শ

Laravel 8 এখন পুরনো, এর সিকিউরিটি আপডেট বন্ধ। নতুন সিস্টেম হলে Laravel 10 বা 11 নেওয়া নিরাপদ। তবে আপনি ৮ দিয়ে বানাতে চাইলে আমি ৮ এর কোডই দেব।

ধাপ ১ এর কমান্ডগুলো চালিয়ে আমাকে জানান কোথাও আটকালে কি না। ঠিকঠাক হলে পরের মেসেজে ধাপ ২: হোমপেজ (হেডার, ফিচার, প্রাইসিং, ফুটার, মোবাইল রেসপন্সিভ) পুরো কোডসহ বানিয়ে দেব। আপনার হোমপেজের রঙ কি এখনকার নীল (#0d6efd) ই থাকবে, নাকি নতুন কিছু চান?

Windows PowerShell
Copyright (C) Microsoft Corporation. All rights reserved.

PS D:\Php Project\Php Project_Desktop\Invoice_Software\new_ui> composer create-project laravel/laravel:^8.0 invoicebd
Creating a "laravel/laravel:8.0" project at "./invoicebd"
Cannot use laravel/laravel's latest version v8.0.0 as it requires php ^7.3 which is not satisfied by your platform.

In CreateProjectCommand.php line 426:

Could not find package laravel/laravel with version 8.0 in a version installable using your PHP version, PHP extens
ions and Composer version.

create-project [-s|--stability STABILITY] [--prefer-source] [--prefer-dist] [--prefer-install PREFER-INSTALL] [--repository REPOSITORY] [--repository-url REPOSITORY-URL] [--add-repository] [--dev] [--no-dev] [--no-custom-installers] [--no-scripts] [--no-progress] [--no-secure-http] [--keep-vcs] [--remove-vcs] [--no-install] [--no-audit] [--audit-format AUDIT-FORMAT] [--no-security-blocking] [--ignore-platform-req IGNORE-PLATFORM-REQ] [--ignore-platform-reqs] [--ask] [--] [<package> [<directory> [<version>]]]

PS D:\Php Project\Php Project_Desktop\Invoice_Software\new_ui> cd invoicebd

প্রজেক্ট তৈরি হয়নি, কারণ Composer আপনার PHP ভার্সনে Laravel 8 বসাতে পারেনি। তাই cd invoicebd এ ফোল্ডার নাও পাওয়া যেতে পারে। এর মানে আপনার PHP সম্ভবত ৮.২ বা তার চেয়ে নতুন। আগে ভার্সন দেখুন:

powershell
php -v
composer -V

যা করতে পারেন

অপশন ১ (আমার সুপারিশ): Laravel 10 ব্যবহার করুন
এটা PHP 8.1+ এ চলে, সিকিউরিটি ফিক্স পায়, আর Laravel 8 এর মতোই সহজ। আমি যে কোড দেব তা প্রায় একই থাকবে।

powershell
cd ..
composer create-project laravel/laravel:^10.0 invoicebd

অপশন ২: Laravel 8 ই চান
তাহলে PHP 8.1 লাগবে। Laragon বা XAMPP এ PHP 8.1 ইনস্টল করে সেই PHP দিয়ে কমান্ড চালাতে হবে। যেমন Laragon এ PHP ভার্সন বদলে টার্মিনাল আবার খুলুন, তারপর আগের কমান্ড দিন।

অপশন ৩ (এড়িয়ে চলুন): --ignore-platform-reqs দিয়ে জোর করে ইনস্টল করা যায়, কিন্তু নতুন PHP তে ওয়ার্নিং আর অদ্ভুত এরর আসবে। নতুন প্রজেক্টে এটা ঝামেলা বাড়াবে।

php -v এর আউটপুট আমাকে পাঠান। কোন অপশনে যাবেন সেটাও জানান। তারপর সেই ভার্সন অনুযায়ী ধাপ ১ এর বাকি অংশ (ডাটাবেস, লগইন) আর ধাপ ২ এর হোমপেজ বানিয়ে দেব।

আমি এখন কিছু প্রজেক্টে কাজ করছি সেগুলো লারবেল এইট দিয়ে বানানো আছে রানিং কাজ এখন যদি আরেকটি প্রজেক্ট ওপেন করি ইন্সটল করি laravel 10 তাহলে কি কোন অন্য প্রজেক্টে সমস্যা হবে ?

না, সমস্যা হবে না। প্রতিটি Laravel প্রজেক্ট নিজের ফোল্ডারে আলাদা vendor নিয়ে চলে। নতুন প্রজেক্টে Laravel 10 ইনস্টল করলে পুরনো Laravel 8 প্রজেক্টের কোড, প্যাকেজ বা ডাটাবেসে কিছু বদলায় না।

সমস্যা হতে পারে শুধু PHP ভার্সন বদলালে, কারণ PHP পুরো কম্পিউটারে একটাই থাকে (Laragon/XAMPP এ যেটা সিলেক্ট করা)।

  • Laravel 8 চলে PHP 7.3 থেকে 8.1 পর্যন্ত। PHP 8.2 বা তার উপরে চালালে ওয়ার্নিং আসতে পারে।
  • Laravel 10 চলে PHP 8.1 থেকে 8.3 পর্যন্ত।

তাই PHP 8.1 এ দুটোই ঠিকভাবে চলে। এটাই সবচেয়ে নিরাপদ জায়গা।

করণীয়

১. php -v দিয়ে দেখুন এখন কোন ভার্সন চলছে।
২. PHP 8.1 হলে: কিছু বদলানোর দরকার নেই। Laravel 10 বসিয়ে দিন।
৩. PHP 8.2 বা 8.3 হলে: পুরনো প্রজেক্টগুলো আগে থেকেই চলছে, তাই সেগুলো ঠিক আছে ধরে নিয়ে গ্লোবাল PHP বদলাবেন না। Laravel 10 এই ভার্সনেও চলে, তাই নতুন প্রজেক্ট সরাসরি বানানো যাবে।
৪. PHP 8.0 বা তার নিচে হলে: Laravel 10 চলবে না। তখন Laragon এ PHP 8.1 যোগ করে দরকার মতো বদলাতে হবে। এতে পুরনো প্রজেক্ট ভাঙে না।

পাশাপাশি একসাথে দুটো প্রজেক্ট চালালে আলাদা পোর্ট দিন:

powershell
php artisan serve --port=8001

আর নতুন প্রজেক্টের জন্য আলাদা ডাটাবেস নাম রাখুন (যেমন invoicebd_new), যাতে পুরনো ডাটার সাথে মিশে না যায়।

php -v এর আউটপুট পাঠান, আমি বলে দেব আপনার কোন পথ নিতে হবে।

PS D:\Php Project\Php Project_Desktop\Invoice_Software\new_ui> php -v
PHP 8.0.30 (cli) (built: Sep 1 2023 14:15:38) ( ZTS Visual C++ 2019 x64 )
Copyright (c) The PHP Group
Zend Engine v4.0.30, Copyright (c) Zend Technologies
PS D:\Php Project\Php Project_Desktop\Invoice_Software\new_ui>




আপনার PHP 8.0.30, আর এটা Laravel 8 এর জন্য একদম ঠিক। পুরনো প্রজেক্টগুলোর সাথেও মিলে যাবে, তাই PHP বদলানোর দরকার নেই।

আগের এররের কারণ PHP নয়। Composer শুধু 8.0.0 ভার্সন খুঁজেছিল (যেটা শুধু PHP 7.3 সাপোর্ট করে), ^8.0 ঠিকমতো পড়েনি। কমান্ডটা এভাবে দিন:

powershell
cd ..
composer create-project laravel/laravel:"8.*" invoicebd

এটাও না চললে:

powershell
composer create-project --prefer-dist laravel/laravel invoicebd "8.*"

ইনস্টল হলে:

powershell
cd invoicebd
php artisan serve

ব্রাউজারে http://127.0.0.1:8000 এ Laravel এর ওয়েলকাম পেজ দেখা গেলে সেটআপ ঠিক আছে।

Laravel 10 এর জন্য PHP 8.1+ লাগে, তাই এই পিসিতে সেটা এখন চলবে না। আপনার সব প্রজেক্ট Laravel 8, তাই এটাই ভালো মানানসই। শুধু মনে রাখবেন Laravel 8 এর অফিশিয়াল সিকিউরিটি আপডেট বন্ধ। প্রজেক্ট বড় হলে পরে আপগ্রেড করতে পারবেন।

ওয়েলকাম পেজ এসে গেলে জানান, তারপর ডাটাবেস সেটআপ, লগইন/সাইন আপ (ধাপ ১) আর হোমপেজ (ধাপ ২) বানিয়ে দেব।

composer create-project laravel/laravel:"8.*" invoicebd "এটাই কাজ করেছে" .....> @php artisan key:generate --ansi
Application key set successfully.
PS D:\Php Project\Php Project_Desktop\Invoice_Software\new_ui> "http://127.0.0.1:8000/ is Live"

Next

দারুণ, সেটআপ ঠিক আছে। এখন ধাপ ১: ডাটাবেস + সাইন আপ/লগইন। সহজ রাখতে npm লাগবে না, Bootstrap CDN দিয়েই চলবে।

১. ডাটাবেস বানান

phpMyAdmin এ একটা খালি ডাটাবেস খুলুন, নাম invoicebd_new (পুরনো প্রজেক্টের ডাটার সাথে মিশবে না)। তারপর .env এ:

DB_DATABASE=invoicebd_new
DB_USERNAME=root
DB_PASSWORD=

২. মাইগ্রেশন তৈরি

powershell
php artisan make:migration add_shop_fields_to_users_table --table=users
php artisan make:model Plan -m
php artisan make:model Subscription -m
php artisan make:model Setting -m

database/migrations/..._add_shop_fields_to_users_table.php:

php
public function up()
{
    Schema::table('users', function (Blueprint $table) {
        $table->string('shop_name')->nullable()->after('name');
        $table->string('phone', 20)->nullable()->unique()->after('email');
        $table->boolean('is_admin')->default(false);
    });
}
public function down()
{
    Schema::table('users', function (Blueprint $table) {
        $table->dropColumn(['shop_name', 'phone', 'is_admin']);
    });
}

..._create_plans_table.php এর up():

php
Schema::create('plans', function (Blueprint $table) {
    $table->id();
    $table->string('name');
    $table->decimal('price', 10, 2)->default(0);
    $table->unsignedInteger('duration_days')->default(30);
    $table->boolean('is_active')->default(true);
    $table->timestamps();
});

..._create_subscriptions_table.php এর up():

php
Schema::create('subscriptions', function (Blueprint $table) {
    $table->id();
    $table->foreignId('user_id')->constrained()->cascadeOnDelete();
    $table->foreignId('plan_id')->nullable()->constrained()->nullOnDelete();
    $table->date('starts_at');
    $table->date('ends_at');
    $table->boolean('is_trial')->default(false);
    $table->string('status')->default('active');
    $table->timestamps();
});

..._create_settings_table.php এর up():

php
Schema::create('settings', function (Blueprint $table) {
    $table->id();
    $table->string('key')->unique();
    $table->text('value')->nullable();
    $table->timestamps();
});

তারপর:

powershell
php artisan migrate

৩. মডেল ঠিক করুন

app/Models/User.php এর $fillable:

php
protected $fillable = ['name', 'shop_name', 'phone', 'email', 'password'];

৪. কন্ট্রোলার

powershell
php artisan make:controller AuthController

app/Http/Controllers/AuthController.php:

php
<?php

namespace App\Http\Controllers;

use App\Models\User;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Hash;

class AuthController extends Controller
{
    public function showRegister() { return view('auth.register'); }
    public function showLogin() { return view('auth.login'); }

    public function register(Request $request)
    {
        $data = $request->validate([
            'name'      => 'required|string|max:100',
            'shop_name' => 'required|string|max:150',
            'phone'     => 'required|string|max:20|unique:users,phone',
            'email'     => 'required|email|unique:users,email',
            'password'  => 'required|min:6|confirmed',
        ]);

        $data['password'] = Hash::make($data['password']);
        $user = User::create($data);

        Auth::login($user);
        return redirect()->route('dashboard');
    }

    public function login(Request $request)
    {
        $cred = $request->validate([
            'email'    => 'required|email',
            'password' => 'required',
        ]);

        if (Auth::attempt($cred, $request->boolean('remember'))) {
            $request->session()->regenerate();
            return redirect()->intended(route('dashboard'));
        }

        return back()->withErrors(['email' => 'ইমেইল বা পাসওয়ার্ড ভুল'])->onlyInput('email');
    }

    public function logout(Request $request)
    {
        Auth::logout();
        $request->session()->invalidate();
        $request->session()->regenerateToken();
        return redirect('/');
    }
}

৫. রাউট

routes/web.php এর সব মুছে এটা দিন:

php
<?php

use Illuminate\Support\Facades\Route;
use App\Http\Controllers\AuthController;

Route::get('/', fn () => view('welcome'));   // ধাপ ২ এ হোমপেজ বসবে

Route::middleware('guest')->group(function () {
    Route::get('/login', [AuthController::class, 'showLogin'])->name('login');
    Route::post('/login', [AuthController::class, 'login']);
    Route::get('/register', [AuthController::class, 'showRegister'])->name('register');
    Route::post('/register', [AuthController::class, 'register']);
});

Route::middleware('auth')->group(function () {
    Route::get('/dashboard', fn () => view('dashboard'))->name('dashboard');
    Route::post('/logout', [AuthController::class, 'logout'])->name('logout');
});

৬. ভিউ

resources/views/auth/login.blade.php (ফোল্ডার auth নিজে বানান):

blade
<!doctype html>
<html lang="bn">
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <title>লগইন - InvoiceBD</title>
  <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet">
</head>
<body class="bg-light">
<div class="container py-5" style="max-width:420px">
  <div class="card shadow-sm">
    <div class="card-body p-4">
      <h4 class="mb-3 text-center">লগইন</h4>
      <form method="POST" action="{{ route('login') }}">
        @csrf
        <div class="mb-3">
          <label class="form-label">ইমেইল</label>
          <input type="email" name="email" value="{{ old('email') }}" class="form-control @error('email') is-invalid @enderror" required>
          @error('email')<div class="invalid-feedback">{{ $message }}</div>@enderror
        </div>
        <div class="mb-3">
          <label class="form-label">পাসওয়ার্ড</label>
          <input type="password" name="password" class="form-control" required>
        </div>
        <div class="form-check mb-3">
          <input type="checkbox" name="remember" class="form-check-input" id="rem">
          <label for="rem" class="form-check-label">মনে রাখুন</label>
        </div>
        <button class="btn btn-primary w-100">লগইন</button>
      </form>
      <p class="text-center mt-3 mb-0">একাউন্ট নেই? <a href="{{ route('register') }}">সাইন আপ</a></p>
    </div>
  </div>
</div>
</body>
</html>

resources/views/auth/register.blade.php:

blade
<!doctype html>
<html lang="bn">
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <title>সাইন আপ - InvoiceBD</title>
  <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet">
</head>
<body class="bg-light">
<div class="container py-4" style="max-width:460px">
  <div class="card shadow-sm">
    <div class="card-body p-4">
      <h4 class="mb-3 text-center">নতুন একাউন্ট</h4>
      <form method="POST" action="{{ route('register') }}">
        @csrf
        @foreach ([['name','আপনার নাম','text'],['shop_name','দোকানের নাম','text'],['phone','ফোন নম্বর','text'],['email','ইমেইল','email'],['password','পাসওয়ার্ড','password'],['password_confirmation','পাসওয়ার্ড আবার দিন','password']] as [$f,$label,$type])
        <div class="mb-3">
          <label class="form-label">{{ $label }}</label>
          <input type="{{ $type }}" name="{{ $f }}" value="{{ $type=='password' ? '' : old($f) }}" class="form-control @error($f) is-invalid @enderror" required>
          @error($f)<div class="invalid-feedback">{{ $message }}</div>@enderror
        </div>
        @endforeach
        <button class="btn btn-primary w-100">সাইন আপ</button>
      </form>
      <p class="text-center mt-3 mb-0">আগেই একাউন্ট আছে? <a href="{{ route('login') }}">লগইন</a></p>
    </div>
  </div>
</div>
</body>
</html>

resources/views/dashboard.blade.php (এখন শুধু পরীক্ষার জন্য):

blade
<!doctype html>
<html lang="bn">
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <title>ড্যাশবোর্ড</title>
  <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet">
</head>
<body class="p-4">
  <h4>স্বাগতম, {{ auth()->user()->name }} ({{ auth()->user()->shop_name }})</h4>
  <form method="POST" action="{{ route('logout') }}">@csrf
    <button class="btn btn-outline-danger btn-sm">লগআউট</button>
  </form>
</body>
</html>

৭. পরীক্ষা

powershell
php artisan serve

http://127.0.0.1:8000/register এ গিয়ে সাইন আপ করুন। সফল হলে ড্যাশবোর্ডে আপনার নাম দেখাবে, লগআউট করে আবার লগইনও করে দেখুন।

এতে কোনো এরর এলে এররটা কপি করে পাঠান। সব ঠিক থাকলে পরের ধাপে ধাপ ২: হোমপেজ বানাব (Hero, Features, Pricing, মোবাইল রেসপন্সিভ)।

Files hidden when shared

ডাটাবেজ এরকম দাও EX: "CREATE TABLE ad_checks ( id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT, ad_id bigint(20) NOT NULL, checked_by bigint(20) NOT NULL, checked_at datetime DEFAULT current_timestamp(), note varchar(255) DEFAULT NULL, PRIMARY KEY (id), UNIQUE KEY ad_checker (ad_id, checked_by) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;" "আমি mysql SQL বাটনে গিয়ে পেস্ট করে গো বাটনে ক্লিক করব" "এবং সব সময় এরকম ভাবে দিবা আমি এটা বুঝতে পারি এবং সহজ আমি শুধু পেস্ট করে গো বাটনে ক্লিক করব"

ঠিক আছে, এখন থেকে ডাটাবেস সবসময় এই ভাবেই দেব: পেস্ট করে Go চাপলেই হবে। আগের মাইগ্রেশন ধাপ (২) বাদ দিন, php artisan migrate চালাতে হবে না।

⚠️ আপনার স্ক্রিনশটে বাঁ দিকে invoicebd নামে ডাটাবেস সিলেক্ট করা আছে, ওটা পুরনো ডাটা থাকা ডাটাবেস হতে পারে। তাই নিচের কোডে নতুন ডাটাবেস invoicebd_new নিজেই বানিয়ে নেবে, পুরনোটায় হাত পড়বে না। SQL বাটনে গিয়ে পুরোটা একসাথে পেস্ট করে Go চাপুন:

sql
CREATE DATABASE IF NOT EXISTS `invoicebd_new` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
USE `invoicebd_new`;

CREATE TABLE `users` (
  `id` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT,
  `name` varchar(100) NOT NULL,
  `shop_name` varchar(150) DEFAULT NULL,
  `email` varchar(255) NOT NULL,
  `phone` varchar(20) DEFAULT NULL,
  `email_verified_at` timestamp NULL DEFAULT NULL,
  `password` varchar(255) NOT NULL,
  `is_admin` tinyint(1) NOT NULL DEFAULT 0,
  `remember_token` varchar(100) DEFAULT NULL,
  `created_at` timestamp NULL DEFAULT NULL,
  `updated_at` timestamp NULL DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `users_email_unique` (`email`),
  UNIQUE KEY `users_phone_unique` (`phone`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

CREATE TABLE `plans` (
  `id` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT,
  `name` varchar(100) NOT NULL,
  `price` decimal(10,2) NOT NULL DEFAULT 0.00,
  `duration_days` int(10) UNSIGNED NOT NULL DEFAULT 30,
  `is_active` tinyint(1) NOT NULL DEFAULT 1,
  `created_at` timestamp NULL DEFAULT NULL,
  `updated_at` timestamp NULL DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

CREATE TABLE `subscriptions` (
  `id` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT,
  `user_id` bigint(20) UNSIGNED NOT NULL,
  `plan_id` bigint(20) UNSIGNED DEFAULT NULL,
  `starts_at` date NOT NULL,
  `ends_at` date NOT NULL,
  `is_trial` tinyint(1) NOT NULL DEFAULT 0,
  `status` varchar(20) NOT NULL DEFAULT 'active',
  `created_at` timestamp NULL DEFAULT NULL,
  `updated_at` timestamp NULL DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `subscriptions_user_id` (`user_id`),
  KEY `subscriptions_plan_id` (`plan_id`),
  CONSTRAINT `subscriptions_user_fk` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE,
  CONSTRAINT `subscriptions_plan_fk` FOREIGN KEY (`plan_id`) REFERENCES `plans` (`id`) ON DELETE SET NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

CREATE TABLE `settings` (
  `id` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT,
  `key` varchar(100) NOT NULL,
  `value` text DEFAULT NULL,
  `created_at` timestamp NULL DEFAULT NULL,
  `updated_at` timestamp NULL DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `settings_key_unique` (`key`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

INSERT INTO `plans` (`name`, `price`, `duration_days`, `is_active`) VALUES
('Starter (Free)', 0.00, 60, 1),
('Full Access', 300.00, 30, 1);

INSERT INTO `settings` (`key`, `value`) VALUES
('trial_enabled', '1'),
('trial_days', '60');

শেষে বাঁ দিকে invoicebd_new ডাটাবেসে ৪টা টেবিল (users, plans, subscriptions, settings) দেখা গেলে ঠিক আছে। শেষের দুটো INSERT এ দুটো প্ল্যান আর ট্রায়ালের সেটিং (চালু, ৬০ দিন) আগে থেকেই বসে গেছে, ধাপ ৪ এ কাজে লাগবে।

এরপর .env এ এটা দিন:

DB_DATABASE=invoicebd_new
DB_USERNAME=root
DB_PASSWORD=

তারপর আগের মেসেজের ধাপ ৩ থেকে ৭ (User মডেলের $fillable, AuthController, রাউট, ভিউ, পরীক্ষা) যেমন ছিল তেমনই করুন। ওখানে কোনো বদল নেই। php artisan make:model ... -m দিয়ে যে মাইগ্রেশন ফাইলগুলো তৈরি হয়েছে সেগুলো ফেলে রাখুন, migrate না চালালে ওগুলো কিছুই করবে না।

সাইন আপ করে ড্যাশবোর্ডে নাম দেখা গেলে জানান, তারপর ধাপ ২: হোমপেজ বানিয়ে দেব।

ok, working, login, register http://127.0.0.1:8000/dashboard Next

ধাপ ২: হোমপেজ। এবার কোনো ডাটাবেস বদল নেই, শুধু তিনটা ফাইল।

১. রাউট বদলান

routes/web.php এ এই লাইনটা:

php
Route::get('/', fn () => view('welcome'));   // ধাপ ২ এ হোমপেজ বসবে

বদলে এটা দিন:

php
Route::view('/', 'home')->name('home');

২. লেআউট (হেডার + ফুটার সব পেজে কাজে লাগবে)

নতুন ফোল্ডার resources/views/layouts, ফাইল site.blade.php:

blade
<!doctype html>
<html lang="bn">
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <title>@yield('title', 'InvoiceBD - POS ও শপ ম্যানেজমেন্ট সফটওয়্যার')</title>
  <meta name="description" content="বিক্রি, স্টক, বিলিং ও ইনভয়েস সহজে সামলান। বাংলাদেশের সেরা POS ও শপ ম্যানেজমেন্ট সফটওয়্যার।">
  <meta name="theme-color" content="#0d6efd">
  <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet">
  <style>
    html { scroll-behavior: smooth; }
    section[id] { scroll-margin-top: 70px; }
    .hero { background: linear-gradient(135deg, #0d6efd, #0a3d91); color: #fff; padding: 80px 0; }
    .hero h1 { font-weight: 700; }
    .icon-box { width: 52px; height: 52px; border-radius: 12px; background: #e7f0ff;
                display: flex; align-items: center; justify-content: center; font-size: 26px; margin-bottom: 14px; }
    .feature-card, .price-card { background: #fff; border: 1px solid #e5e7eb; border-radius: 14px; padding: 24px; height: 100%; }
    .price-card.popular { border: 2px solid #0d6efd; box-shadow: 0 8px 24px rgba(13,110,253,.15); }
    .price { font-size: 2rem; font-weight: 700; color: #0d6efd; }
    .check-list { list-style: none; padding: 0; margin: 0 0 20px; }
    .check-list li { padding: 5px 0; }
    .check-list li.no { color: #9ca3af; text-decoration: line-through; }
    footer { background: #0f172a; color: #cbd5e1; }
    footer a { color: #cbd5e1; text-decoration: none; }
    @media (max-width: 576px) { .hero { padding: 50px 0; } .hero h1 { font-size: 1.7rem; } }
  </style>
</head>
<body>

<nav class="navbar navbar-expand-lg bg-white border-bottom sticky-top">
  <div class="container">
    <a class="navbar-brand fw-bold text-primary" href="{{ route('home') }}">Invoice-BD</a>
    <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#nav">
      <span class="navbar-toggler-icon"></span>
    </button>
    <div class="collapse navbar-collapse" id="nav">
      <ul class="navbar-nav ms-auto align-items-lg-center gap-lg-2">
        <li class="nav-item"><a class="nav-link" href="{{ route('home') }}#features">ফিচার</a></li>
        <li class="nav-item"><a class="nav-link" href="{{ route('home') }}#pricing">প্রাইসিং</a></li>
        @auth
          <li class="nav-item"><a class="btn btn-primary" href="{{ route('dashboard') }}">ড্যাশবোর্ড</a></li>
        @else
          <li class="nav-item"><a class="nav-link" href="{{ route('login') }}">লগইন</a></li>
          <li class="nav-item"><a class="btn btn-primary" href="{{ route('register') }}">শুরু করুন</a></li>
        @endauth
      </ul>
    </div>
  </div>
</nav>

@yield('content')

<footer class="py-4 mt-5">
  <div class="container d-flex flex-column flex-md-row justify-content-between gap-2 text-center text-md-start">
    <div>© {{ date('Y') }} Invoice-BD</div>
    <div>Design & Developed by BEST IT PARK</div>
  </div>
</footer>

<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js"></script>
</body>
</html>

৩. হোমপেজ

resources/views/home.blade.php:

blade
@extends('layouts.site')

@section('content')

{{-- Hero --}}
<section class="hero text-center text-lg-start">
  <div class="container">
    <div class="row align-items-center">
      <div class="col-lg-7">
        <h1 class="mb-3">আপনার দোকানের হিসাব হোক সহজ ও নির্ভুল</h1>
        <p class="lead mb-4">বিক্রি, স্টক, বিলিং আর ইনভয়েস, সবকিছু এক জায়গায়। মোবাইল থেকেও চালান।</p>
        <a href="{{ route('register') }}" class="btn btn-light btn-lg me-2 mb-2">ফ্রি ট্রায়াল শুরু করুন</a>
        <a href="#features" class="btn btn-outline-light btn-lg mb-2">ফিচার দেখুন</a>
      </div>
      <div class="col-lg-5 d-none d-lg-block text-center" style="font-size:120px">🧾</div>
    </div>
  </div>
</section>

{{-- Features --}}
<section id="features" class="py-5">
  <div class="container">
    <h2 class="text-center fw-bold mb-4">প্রধান ফিচার</h2>
    <div class="row g-3">
      @foreach ([
        ['📊','রিয়েল-টাইম রিপোর্ট','প্রফিট, দৈনিক ও ফিল্টার রিপোর্ট এক ক্লিকে।'],
        ['📦','স্মার্ট স্টক সিস্টেম','প্রোডাক্ট, সিরিয়াল নম্বর ও ড্যামেজ পণ্যের হিসাব।'],
        ['🧾','অটো বিলিং','দ্রুত ইনভয়েস তৈরি, PDF ও প্রিন্ট।'],
        ['👥','কাস্টমার ও বাকির হিসাব','কাস্টমারের পেমেন্ট ও আগের কেনা দাম ট্র্যাক।'],
        ['🚚','সাপ্লায়ার ও খরচ','সাপ্লায়ার, খরচ ও ক্যাশ লেজার এক জায়গায়।'],
        ['📱','মোবাইলে QR স্ক্যান','QR স্ক্যান করেই সরাসরি বিক্রি।'],
      ] as [$icon, $title, $desc])
      <div class="col-12 col-md-6 col-lg-4">
        <div class="feature-card">
          <div class="icon-box">{{ $icon }}</div>
          <h5>{{ $title }}</h5>
          <p class="text-muted mb-0">{{ $desc }}</p>
        </div>
      </div>
      @endforeach
    </div>
  </div>
</section>

{{-- Pricing --}}
<section id="pricing" class="py-5 bg-light">
  <div class="container">
    <h2 class="text-center fw-bold mb-4">প্রাইসিং প্ল্যান</h2>
    <div class="row g-3 justify-content-center">

      <div class="col-12 col-md-6 col-lg-4">
        <div class="price-card">
          <h5>স্টার্টার</h5>
          <div class="price">০ ৳ <small class="text-muted fs-6">/ ২ মাস ফ্রি</small></div>
          <ul class="check-list mt-3">
            <li>✔️ আনলিমিটেড প্রোডাক্ট</li>
            <li>✔️ রিপোর্ট ও ইনভয়েস</li>
            <li>✔️ কাস্টমার ও সাপ্লায়ার</li>
            <li>✔️ খরচ ও ক্যাশ লেজার</li>
            <li class="no">❌ SMS সিস্টেম</li>
            <li class="no">❌ প্রোডাক্ট ছবি</li>
          </ul>
          <a href="{{ route('register') }}" class="btn btn-outline-primary w-100">ফ্রি শুরু করুন</a>
        </div>
      </div>

      <div class="col-12 col-md-6 col-lg-4">
        <div class="price-card popular">
          <h5>ফুল অ্যাক্সেস</h5>
          <div class="price">৩০০ ৳ <small class="text-muted fs-6">/ মাস</small></div>
          <ul class="check-list mt-3">
            <li>✔️ স্টার্টারের সব ফিচার</li>
            <li>✔️ SMS সিস্টেম</li>
            <li>✔️ প্রোডাক্ট ছবি</li>
            <li>✔️ স্টাফ পেমেন্ট হিস্টোরি</li>
            <li>✔️ ইউজার ও রোল ম্যানেজমেন্ট</li>
            <li>✔️ সরাসরি সাপোর্ট</li>
          </ul>
          <a href="{{ route('register') }}" class="btn btn-primary w-100">এখনই কিনুন</a>
        </div>
      </div>

      <div class="col-12 col-md-6 col-lg-4">
        <div class="price-card">
          <h5>👑 এন্টারপ্রাইজ</h5>
          <div class="price">কাস্টম</div>
          <ul class="check-list mt-3">
            <li>✅ ফুল অ্যাক্সেসের সব ফিচার</li>
            <li>✅ কাস্টম ইনভয়েস ডিজাইন</li>
            <li>✅ ২৪/৭ প্রায়োরিটি সাপোর্ট</li>
            <li>✅ আপনার ব্যবসা অনুযায়ী প্ল্যান</li>
          </ul>
          <a href="#" class="btn btn-outline-primary w-100">যোগাযোগ করুন</a>
        </div>
      </div>

    </div>
  </div>
</section>

@endsection

৪. পরীক্ষা

http://127.0.0.1:8000 খুলুন। মোবাইল দেখতে ব্রাউজারে F12 চেপে ফোনের আইকন (Toggle device toolbar) দিন। মেনু ভাঁজ হয়ে ☰ বাটন হওয়া উচিত, আর কার্ডগুলো একটার নিচে আরেকটা সাজাবে।

দুটো জিনিস এখন ইচ্ছে করেই বাকি রাখা:

  • যোগাযোগ করুন বাটন এখন #, Contact পেজ পরে বানালে লিংক বসাব।
  • প্রাইসিং এখন স্ট্যাটিক লেখা, ধাপ ৪ (সাবস্ক্রিপশন) এ ডাটাবেসের plans থেকে আনব।

দেখতে ঠিক থাকলে জানান, পরের ধাপ ধাপ ৩: ড্যাশবোর্ড (tkinter স্টাইলের সাইডবার মেনু, উপরে হেডার, মোবাইলে ☰ মেনু)। রঙ নীলই রেখেছি, বদলাতে চাইলে বলবেন।

ok, working, Next

ধাপ ৩: ড্যাশবোর্ড। এবারও ডাটাবেস বদল নেই, শুধু দুটো ভিউ ফাইল। ডিজাইন Python tkinter এর মতো: ধূসর ব্যাকগ্রাউন্ড, বাঁ দিকে সাইডবার, LabelFrame স্টাইলের বক্স আর সমতল বাটন। মোবাইলে সাইডবার লুকিয়ে যাবে, ☰ চাপলে বাঁ দিক থেকে খুলবে।



আপনার PHP 8.0.30, আর এটা Laravel 8 এর জন্য একদম ঠিক। পুরনো প্রজেক্টগুলোর সাথেও মিলে যাবে, তাই PHP বদলানোর দরকার নেই।

আগের এররের কারণ PHP নয়। Composer শুধু 8.0.0 ভার্সন খুঁজেছিল (যেটা শুধু PHP 7.3 সাপোর্ট করে), ^8.0 ঠিকমতো পড়েনি। কমান্ডটা এভাবে দিন:

powershell
cd ..
composer create-project laravel/laravel:"8.*" invoicebd

এটাও না চললে:

powershell
composer create-project --prefer-dist laravel/laravel invoicebd "8.*"

ইনস্টল হলে:

powershell
cd invoicebd
php artisan serve

ব্রাউজারে http://127.0.0.1:8000 এ Laravel এর ওয়েলকাম পেজ দেখা গেলে সেটআপ ঠিক আছে।

Laravel 10 এর জন্য PHP 8.1+ লাগে, তাই এই পিসিতে সেটা এখন চলবে না। আপনার সব প্রজেক্ট Laravel 8, তাই এটাই ভালো মানানসই। শুধু মনে রাখবেন Laravel 8 এর অফিশিয়াল সিকিউরিটি আপডেট বন্ধ। প্রজেক্ট বড় হলে পরে আপগ্রেড করতে পারবেন।

ওয়েলকাম পেজ এসে গেলে জানান, তারপর ডাটাবেস সেটআপ, লগইন/সাইন আপ (ধাপ ১) আর হোমপেজ (ধাপ ২) বানিয়ে দেব।

composer create-project laravel/laravel:"8.*" invoicebd "এটাই কাজ করেছে" .....> @php artisan key:generate --ansi
Application key set successfully.
PS D:\Php Project\Php Project_Desktop\Invoice_Software\new_ui> "http://127.0.0.1:8000/ is Live"

Next

দারুণ, সেটআপ ঠিক আছে। এখন ধাপ ১: ডাটাবেস + সাইন আপ/লগইন। সহজ রাখতে npm লাগবে না, Bootstrap CDN দিয়েই চলবে।

১. ডাটাবেস বানান

phpMyAdmin এ একটা খালি ডাটাবেস খুলুন, নাম invoicebd_new (পুরনো প্রজেক্টের ডাটার সাথে মিশবে না)। তারপর .env এ:

DB_DATABASE=invoicebd_new
DB_USERNAME=root
DB_PASSWORD=

২. মাইগ্রেশন তৈরি

powershell
php artisan make:migration add_shop_fields_to_users_table --table=users
php artisan make:model Plan -m
php artisan make:model Subscription -m
php artisan make:model Setting -m

database/migrations/..._add_shop_fields_to_users_table.php:

php
public function up()
{
    Schema::table('users', function (Blueprint $table) {
        $table->string('shop_name')->nullable()->after('name');
        $table->string('phone', 20)->nullable()->unique()->after('email');
        $table->boolean('is_admin')->default(false);
    });
}
public function down()
{
    Schema::table('users', function (Blueprint $table) {
        $table->dropColumn(['shop_name', 'phone', 'is_admin']);
    });
}

..._create_plans_table.php এর up():

php
Schema::create('plans', function (Blueprint $table) {
    $table->id();
    $table->string('name');
    $table->decimal('price', 10, 2)->default(0);
    $table->unsignedInteger('duration_days')->default(30);
    $table->boolean('is_active')->default(true);
    $table->timestamps();
});

..._create_subscriptions_table.php এর up():

php
Schema::create('subscriptions', function (Blueprint $table) {
    $table->id();
    $table->foreignId('user_id')->constrained()->cascadeOnDelete();
    $table->foreignId('plan_id')->nullable()->constrained()->nullOnDelete();
    $table->date('starts_at');
    $table->date('ends_at');
    $table->boolean('is_trial')->default(false);
    $table->string('status')->default('active');
    $table->timestamps();
});

..._create_settings_table.php এর up():

php
Schema::create('settings', function (Blueprint $table) {
    $table->id();
    $table->string('key')->unique();
    $table->text('value')->nullable();
    $table->timestamps();
});

তারপর:

powershell
php artisan migrate

৩. মডেল ঠিক করুন

app/Models/User.php এর $fillable:

php
protected $fillable = ['name', 'shop_name', 'phone', 'email', 'password'];

৪. কন্ট্রোলার

powershell
php artisan make:controller AuthController

app/Http/Controllers/AuthController.php:

php
<?php

namespace App\Http\Controllers;

use App\Models\User;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Hash;

class AuthController extends Controller
{
    public function showRegister() { return view('auth.register'); }
    public function showLogin() { return view('auth.login'); }

    public function register(Request $request)
    {
        $data = $request->validate([
            'name'      => 'required|string|max:100',
            'shop_name' => 'required|string|max:150',
            'phone'     => 'required|string|max:20|unique:users,phone',
            'email'     => 'required|email|unique:users,email',
            'password'  => 'required|min:6|confirmed',
        ]);

        $data['password'] = Hash::make($data['password']);
        $user = User::create($data);

        Auth::login($user);
        return redirect()->route('dashboard');
    }

    public function login(Request $request)
    {
        $cred = $request->validate([
            'email'    => 'required|email',
            'password' => 'required',
        ]);

        if (Auth::attempt($cred, $request->boolean('remember'))) {
            $request->session()->regenerate();
            return redirect()->intended(route('dashboard'));
        }

        return back()->withErrors(['email' => 'ইমেইল বা পাসওয়ার্ড ভুল'])->onlyInput('email');
    }

    public function logout(Request $request)
    {
        Auth::logout();
        $request->session()->invalidate();
        $request->session()->regenerateToken();
        return redirect('/');
    }
}

৫. রাউট

routes/web.php এর সব মুছে এটা দিন:

php
<?php

use Illuminate\Support\Facades\Route;
use App\Http\Controllers\AuthController;

Route::get('/', fn () => view('welcome'));   // ধাপ ২ এ হোমপেজ বসবে

Route::middleware('guest')->group(function () {
    Route::get('/login', [AuthController::class, 'showLogin'])->name('login');
    Route::post('/login', [AuthController::class, 'login']);
    Route::get('/register', [AuthController::class, 'showRegister'])->name('register');
    Route::post('/register', [AuthController::class, 'register']);
});

Route::middleware('auth')->group(function () {
    Route::get('/dashboard', fn () => view('dashboard'))->name('dashboard');
    Route::post('/logout', [AuthController::class, 'logout'])->name('logout');
});

৬. ভিউ

resources/views/auth/login.blade.php (ফোল্ডার auth নিজে বানান):

blade
<!doctype html>
<html lang="bn">
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <title>লগইন - InvoiceBD</title>
  <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet">
</head>
<body class="bg-light">
<div class="container py-5" style="max-width:420px">
  <div class="card shadow-sm">
    <div class="card-body p-4">
      <h4 class="mb-3 text-center">লগইন</h4>
      <form method="POST" action="{{ route('login') }}">
        @csrf
        <div class="mb-3">
          <label class="form-label">ইমেইল</label>
          <input type="email" name="email" value="{{ old('email') }}" class="form-control @error('email') is-invalid @enderror" required>
          @error('email')<div class="invalid-feedback">{{ $message }}</div>@enderror
        </div>
        <div class="mb-3">
          <label class="form-label">পাসওয়ার্ড</label>
          <input type="password" name="password" class="form-control" required>
        </div>
        <div class="form-check mb-3">
          <input type="checkbox" name="remember" class="form-check-input" id="rem">
          <label for="rem" class="form-check-label">মনে রাখুন</label>
        </div>
        <button class="btn btn-primary w-100">লগইন</button>
      </form>
      <p class="text-center mt-3 mb-0">একাউন্ট নেই? <a href="{{ route('register') }}">সাইন আপ</a></p>
    </div>
  </div>
</div>
</body>
</html>

resources/views/auth/register.blade.php:

blade
<!doctype html>
<html lang="bn">
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <title>সাইন আপ - InvoiceBD</title>
  <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet">
</head>
<body class="bg-light">
<div class="container py-4" style="max-width:460px">
  <div class="card shadow-sm">
    <div class="card-body p-4">
      <h4 class="mb-3 text-center">নতুন একাউন্ট</h4>
      <form method="POST" action="{{ route('register') }}">
        @csrf
        @foreach ([['name','আপনার নাম','text'],['shop_name','দোকানের নাম','text'],['phone','ফোন নম্বর','text'],['email','ইমেইল','email'],['password','পাসওয়ার্ড','password'],['password_confirmation','পাসওয়ার্ড আবার দিন','password']] as [$f,$label,$type])
        <div class="mb-3">
          <label class="form-label">{{ $label }}</label>
          <input type="{{ $type }}" name="{{ $f }}" value="{{ $type=='password' ? '' : old($f) }}" class="form-control @error($f) is-invalid @enderror" required>
          @error($f)<div class="invalid-feedback">{{ $message }}</div>@enderror
        </div>
        @endforeach
        <button class="btn btn-primary w-100">সাইন আপ</button>
      </form>
      <p class="text-center mt-3 mb-0">আগেই একাউন্ট আছে? <a href="{{ route('login') }}">লগইন</a></p>
    </div>
  </div>
</div>
</body>
</html>

resources/views/dashboard.blade.php (এখন শুধু পরীক্ষার জন্য):

blade
<!doctype html>
<html lang="bn">
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <title>ড্যাশবোর্ড</title>
  <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet">
</head>
<body class="p-4">
  <h4>স্বাগতম, {{ auth()->user()->name }} ({{ auth()->user()->shop_name }})</h4>
  <form method="POST" action="{{ route('logout') }}">@csrf
    <button class="btn btn-outline-danger btn-sm">লগআউট</button>
  </form>
</body>
</html>

৭. পরীক্ষা

powershell
php artisan serve

http://127.0.0.1:8000/register এ গিয়ে সাইন আপ করুন। সফল হলে ড্যাশবোর্ডে আপনার নাম দেখাবে, লগআউট করে আবার লগইনও করে দেখুন।

এতে কোনো এরর এলে এররটা কপি করে পাঠান। সব ঠিক থাকলে পরের ধাপে ধাপ ২: হোমপেজ বানাব (Hero, Features, Pricing, মোবাইল রেসপন্সিভ)।

Files hidden when shared

ডাটাবেজ এরকম দাও EX: "CREATE TABLE ad_checks ( id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT, ad_id bigint(20) NOT NULL, checked_by bigint(20) NOT NULL, checked_at datetime DEFAULT current_timestamp(), note varchar(255) DEFAULT NULL, PRIMARY KEY (id), UNIQUE KEY ad_checker (ad_id, checked_by) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;" "আমি mysql SQL বাটনে গিয়ে পেস্ট করে গো বাটনে ক্লিক করব" "এবং সব সময় এরকম ভাবে দিবা আমি এটা বুঝতে পারি এবং সহজ আমি শুধু পেস্ট করে গো বাটনে ক্লিক করব"

ঠিক আছে, এখন থেকে ডাটাবেস সবসময় এই ভাবেই দেব: পেস্ট করে Go চাপলেই হবে। আগের মাইগ্রেশন ধাপ (২) বাদ দিন, php artisan migrate চালাতে হবে না।

⚠️ আপনার স্ক্রিনশটে বাঁ দিকে invoicebd নামে ডাটাবেস সিলেক্ট করা আছে, ওটা পুরনো ডাটা থাকা ডাটাবেস হতে পারে। তাই নিচের কোডে নতুন ডাটাবেস invoicebd_new নিজেই বানিয়ে নেবে, পুরনোটায় হাত পড়বে না। SQL বাটনে গিয়ে পুরোটা একসাথে পেস্ট করে Go চাপুন:

sql
CREATE DATABASE IF NOT EXISTS `invoicebd_new` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
USE `invoicebd_new`;

CREATE TABLE `users` (
  `id` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT,
  `name` varchar(100) NOT NULL,
  `shop_name` varchar(150) DEFAULT NULL,
  `email` varchar(255) NOT NULL,
  `phone` varchar(20) DEFAULT NULL,
  `email_verified_at` timestamp NULL DEFAULT NULL,
  `password` varchar(255) NOT NULL,
  `is_admin` tinyint(1) NOT NULL DEFAULT 0,
  `remember_token` varchar(100) DEFAULT NULL,
  `created_at` timestamp NULL DEFAULT NULL,
  `updated_at` timestamp NULL DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `users_email_unique` (`email`),
  UNIQUE KEY `users_phone_unique` (`phone`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

CREATE TABLE `plans` (
  `id` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT,
  `name` varchar(100) NOT NULL,
  `price` decimal(10,2) NOT NULL DEFAULT 0.00,
  `duration_days` int(10) UNSIGNED NOT NULL DEFAULT 30,
  `is_active` tinyint(1) NOT NULL DEFAULT 1,
  `created_at` timestamp NULL DEFAULT NULL,
  `updated_at` timestamp NULL DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

CREATE TABLE `subscriptions` (
  `id` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT,
  `user_id` bigint(20) UNSIGNED NOT NULL,
  `plan_id` bigint(20) UNSIGNED DEFAULT NULL,
  `starts_at` date NOT NULL,
  `ends_at` date NOT NULL,
  `is_trial` tinyint(1) NOT NULL DEFAULT 0,
  `status` varchar(20) NOT NULL DEFAULT 'active',
  `created_at` timestamp NULL DEFAULT NULL,
  `updated_at` timestamp NULL DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `subscriptions_user_id` (`user_id`),
  KEY `subscriptions_plan_id` (`plan_id`),
  CONSTRAINT `subscriptions_user_fk` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE,
  CONSTRAINT `subscriptions_plan_fk` FOREIGN KEY (`plan_id`) REFERENCES `plans` (`id`) ON DELETE SET NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

CREATE TABLE `settings` (
  `id` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT,
  `key` varchar(100) NOT NULL,
  `value` text DEFAULT NULL,
  `created_at` timestamp NULL DEFAULT NULL,
  `updated_at` timestamp NULL DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `settings_key_unique` (`key`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

INSERT INTO `plans` (`name`, `price`, `duration_days`, `is_active`) VALUES
('Starter (Free)', 0.00, 60, 1),
('Full Access', 300.00, 30, 1);

INSERT INTO `settings` (`key`, `value`) VALUES
('trial_enabled', '1'),
('trial_days', '60');

শেষে বাঁ দিকে invoicebd_new ডাটাবেসে ৪টা টেবিল (users, plans, subscriptions, settings) দেখা গেলে ঠিক আছে। শেষের দুটো INSERT এ দুটো প্ল্যান আর ট্রায়ালের সেটিং (চালু, ৬০ দিন) আগে থেকেই বসে গেছে, ধাপ ৪ এ কাজে লাগবে।

এরপর .env এ এটা দিন:

DB_DATABASE=invoicebd_new
DB_USERNAME=root
DB_PASSWORD=

তারপর আগের মেসেজের ধাপ ৩ থেকে ৭ (User মডেলের $fillable, AuthController, রাউট, ভিউ, পরীক্ষা) যেমন ছিল তেমনই করুন। ওখানে কোনো বদল নেই। php artisan make:model ... -m দিয়ে যে মাইগ্রেশন ফাইলগুলো তৈরি হয়েছে সেগুলো ফেলে রাখুন, migrate না চালালে ওগুলো কিছুই করবে না।

সাইন আপ করে ড্যাশবোর্ডে নাম দেখা গেলে জানান, তারপর ধাপ ২: হোমপেজ বানিয়ে দেব।

ok, working, login, register http://127.0.0.1:8000/dashboard Next

ধাপ ২: হোমপেজ। এবার কোনো ডাটাবেস বদল নেই, শুধু তিনটা ফাইল।

১. রাউট বদলান

routes/web.php এ এই লাইনটা:

php
Route::get('/', fn () => view('welcome'));   // ধাপ ২ এ হোমপেজ বসবে

বদলে এটা দিন:

php
Route::view('/', 'home')->name('home');

২. লেআউট (হেডার + ফুটার সব পেজে কাজে লাগবে)

নতুন ফোল্ডার resources/views/layouts, ফাইল site.blade.php:

blade
<!doctype html>
<html lang="bn">
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <title>@yield('title', 'InvoiceBD - POS ও শপ ম্যানেজমেন্ট সফটওয়্যার')</title>
  <meta name="description" content="বিক্রি, স্টক, বিলিং ও ইনভয়েস সহজে সামলান। বাংলাদেশের সেরা POS ও শপ ম্যানেজমেন্ট সফটওয়্যার।">
  <meta name="theme-color" content="#0d6efd">
  <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet">
  <style>
    html { scroll-behavior: smooth; }
    section[id] { scroll-margin-top: 70px; }
    .hero { background: linear-gradient(135deg, #0d6efd, #0a3d91); color: #fff; padding: 80px 0; }
    .hero h1 { font-weight: 700; }
    .icon-box { width: 52px; height: 52px; border-radius: 12px; background: #e7f0ff;
                display: flex; align-items: center; justify-content: center; font-size: 26px; margin-bottom: 14px; }
    .feature-card, .price-card { background: #fff; border: 1px solid #e5e7eb; border-radius: 14px; padding: 24px; height: 100%; }
    .price-card.popular { border: 2px solid #0d6efd; box-shadow: 0 8px 24px rgba(13,110,253,.15); }
    .price { font-size: 2rem; font-weight: 700; color: #0d6efd; }
    .check-list { list-style: none; padding: 0; margin: 0 0 20px; }
    .check-list li { padding: 5px 0; }
    .check-list li.no { color: #9ca3af; text-decoration: line-through; }
    footer { background: #0f172a; color: #cbd5e1; }
    footer a { color: #cbd5e1; text-decoration: none; }
    @media (max-width: 576px) { .hero { padding: 50px 0; } .hero h1 { font-size: 1.7rem; } }
  </style>
</head>
<body>

<nav class="navbar navbar-expand-lg bg-white border-bottom sticky-top">
  <div class="container">
    <a class="navbar-brand fw-bold text-primary" href="{{ route('home') }}">Invoice-BD</a>
    <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#nav">
      <span class="navbar-toggler-icon"></span>
    </button>
    <div class="collapse navbar-collapse" id="nav">
      <ul class="navbar-nav ms-auto align-items-lg-center gap-lg-2">
        <li class="nav-item"><a class="nav-link" href="{{ route('home') }}#features">ফিচার</a></li>
        <li class="nav-item"><a class="nav-link" href="{{ route('home') }}#pricing">প্রাইসিং</a></li>
        @auth
          <li class="nav-item"><a class="btn btn-primary" href="{{ route('dashboard') }}">ড্যাশবোর্ড</a></li>
        @else
          <li class="nav-item"><a class="nav-link" href="{{ route('login') }}">লগইন</a></li>
          <li class="nav-item"><a class="btn btn-primary" href="{{ route('register') }}">শুরু করুন</a></li>
        @endauth
      </ul>
    </div>
  </div>
</nav>

@yield('content')

<footer class="py-4 mt-5">
  <div class="container d-flex flex-column flex-md-row justify-content-between gap-2 text-center text-md-start">
    <div>© {{ date('Y') }} Invoice-BD</div>
    <div>Design & Developed by BEST IT PARK</div>
  </div>
</footer>

<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js"></script>
</body>
</html>

৩. হোমপেজ

resources/views/home.blade.php:

blade
@extends('layouts.site')

@section('content')

{{-- Hero --}}
<section class="hero text-center text-lg-start">
  <div class="container">
    <div class="row align-items-center">
      <div class="col-lg-7">
        <h1 class="mb-3">আপনার দোকানের হিসাব হোক সহজ ও নির্ভুল</h1>
        <p class="lead mb-4">বিক্রি, স্টক, বিলিং আর ইনভয়েস, সবকিছু এক জায়গায়। মোবাইল থেকেও চালান।</p>
        <a href="{{ route('register') }}" class="btn btn-light btn-lg me-2 mb-2">ফ্রি ট্রায়াল শুরু করুন</a>
        <a href="#features" class="btn btn-outline-light btn-lg mb-2">ফিচার দেখুন</a>
      </div>
      <div class="col-lg-5 d-none d-lg-block text-center" style="font-size:120px">🧾</div>
    </div>
  </div>
</section>

{{-- Features --}}
<section id="features" class="py-5">
  <div class="container">
    <h2 class="text-center fw-bold mb-4">প্রধান ফিচার</h2>
    <div class="row g-3">
      @foreach ([
        ['📊','রিয়েল-টাইম রিপোর্ট','প্রফিট, দৈনিক ও ফিল্টার রিপোর্ট এক ক্লিকে।'],
        ['📦','স্মার্ট স্টক সিস্টেম','প্রোডাক্ট, সিরিয়াল নম্বর ও ড্যামেজ পণ্যের হিসাব।'],
        ['🧾','অটো বিলিং','দ্রুত ইনভয়েস তৈরি, PDF ও প্রিন্ট।'],
        ['👥','কাস্টমার ও বাকির হিসাব','কাস্টমারের পেমেন্ট ও আগের কেনা দাম ট্র্যাক।'],
        ['🚚','সাপ্লায়ার ও খরচ','সাপ্লায়ার, খরচ ও ক্যাশ লেজার এক জায়গায়।'],
        ['📱','মোবাইলে QR স্ক্যান','QR স্ক্যান করেই সরাসরি বিক্রি।'],
      ] as [$icon, $title, $desc])
      <div class="col-12 col-md-6 col-lg-4">
        <div class="feature-card">
          <div class="icon-box">{{ $icon }}</div>
          <h5>{{ $title }}</h5>
          <p class="text-muted mb-0">{{ $desc }}</p>
        </div>
      </div>
      @endforeach
    </div>
  </div>
</section>

{{-- Pricing --}}
<section id="pricing" class="py-5 bg-light">
  <div class="container">
    <h2 class="text-center fw-bold mb-4">প্রাইসিং প্ল্যান</h2>
    <div class="row g-3 justify-content-center">

      <div class="col-12 col-md-6 col-lg-4">
        <div class="price-card">
          <h5>স্টার্টার</h5>
          <div class="price">০ ৳ <small class="text-muted fs-6">/ ২ মাস ফ্রি</small></div>
          <ul class="check-list mt-3">
            <li>✔️ আনলিমিটেড প্রোডাক্ট</li>
            <li>✔️ রিপোর্ট ও ইনভয়েস</li>
            <li>✔️ কাস্টমার ও সাপ্লায়ার</li>
            <li>✔️ খরচ ও ক্যাশ লেজার</li>
            <li class="no">❌ SMS সিস্টেম</li>
            <li class="no">❌ প্রোডাক্ট ছবি</li>
          </ul>
          <a href="{{ route('register') }}" class="btn btn-outline-primary w-100">ফ্রি শুরু করুন</a>
        </div>
      </div>

      <div class="col-12 col-md-6 col-lg-4">
        <div class="price-card popular">
          <h5>ফুল অ্যাক্সেস</h5>
          <div class="price">৩০০ ৳ <small class="text-muted fs-6">/ মাস</small></div>
          <ul class="check-list mt-3">
            <li>✔️ স্টার্টারের সব ফিচার</li>
            <li>✔️ SMS সিস্টেম</li>
            <li>✔️ প্রোডাক্ট ছবি</li>
            <li>✔️ স্টাফ পেমেন্ট হিস্টোরি</li>
            <li>✔️ ইউজার ও রোল ম্যানেজমেন্ট</li>
            <li>✔️ সরাসরি সাপোর্ট</li>
          </ul>
          <a href="{{ route('register') }}" class="btn btn-primary w-100">এখনই কিনুন</a>
        </div>
      </div>

      <div class="col-12 col-md-6 col-lg-4">
        <div class="price-card">
          <h5>👑 এন্টারপ্রাইজ</h5>
          <div class="price">কাস্টম</div>
          <ul class="check-list mt-3">
            <li>✅ ফুল অ্যাক্সেসের সব ফিচার</li>
            <li>✅ কাস্টম ইনভয়েস ডিজাইন</li>
            <li>✅ ২৪/৭ প্রায়োরিটি সাপোর্ট</li>
            <li>✅ আপনার ব্যবসা অনুযায়ী প্ল্যান</li>
          </ul>
          <a href="#" class="btn btn-outline-primary w-100">যোগাযোগ করুন</a>
        </div>
      </div>

    </div>
  </div>
</section>

@endsection

৪. পরীক্ষা

http://127.0.0.1:8000 খুলুন। মোবাইল দেখতে ব্রাউজারে F12 চেপে ফোনের আইকন (Toggle device toolbar) দিন। মেনু ভাঁজ হয়ে ☰ বাটন হওয়া উচিত, আর কার্ডগুলো একটার নিচে আরেকটা সাজাবে।

দুটো জিনিস এখন ইচ্ছে করেই বাকি রাখা:

  • যোগাযোগ করুন বাটন এখন #, Contact পেজ পরে বানালে লিংক বসাব।
  • প্রাইসিং এখন স্ট্যাটিক লেখা, ধাপ ৪ (সাবস্ক্রিপশন) এ ডাটাবেসের plans থেকে আনব।

দেখতে ঠিক থাকলে জানান, পরের ধাপ ধাপ ৩: ড্যাশবোর্ড (tkinter স্টাইলের সাইডবার মেনু, উপরে হেডার, মোবাইলে ☰ মেনু)। রঙ নীলই রেখেছি, বদলাতে চাইলে বলবেন।

ok, working, Next

ধাপ ৩: ড্যাশবোর্ড। এবারও ডাটাবেস বদল নেই, শুধু দুটো ভিউ ফাইল। ডিজাইন Python tkinter এর মতো: ধূসর ব্যাকগ্রাউন্ড, বাঁ দিকে সাইডবার, LabelFrame স্টাইলের বক্স আর সমতল বাটন। মোবাইলে সাইডবার লুকিয়ে যাবে, ☰ চাপলে বাঁ দিক থেকে খুলবে।


১. ড্যাশবোর্ড লেআউট

resources/views/layouts/app.blade.php (নতুন ফাইল):

blade
<!doctype html>
<html lang="bn">
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <title>@yield('title', 'ড্যাশবোর্ড') - InvoiceBD</title>
  <meta name="theme-color" content="#0d6efd">
  <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet">
  <style>
    :root { --tk-bg:#f0f0f0; --tk-panel:#fafafa; --tk-border:#b5b5b5; --tk-accent:#0d6efd; }
    body { background: var(--tk-bg); font-size: 15px; }

    /* সাইডবার */
    .app-sidebar { --bs-offcanvas-width: 250px; background:#e4e4e4; }
    @media (min-width: 992px) {
      .app-sidebar { flex: 0 0 230px; width: 230px !important; min-height: 100vh;
                     background:#e4e4e4 !important; border-right: 1px solid var(--tk-border) !important; }
    }
    .brand { background: var(--tk-accent); color:#fff; padding: 14px 16px; font-weight:700; font-size:18px; }
    .menu-title { font-size:12px; color:#666; padding: 12px 16px 4px; text-transform: uppercase; }
    .menu-btn { display:block; margin: 4px 10px; padding: 9px 12px; background:#f6f6f6; color:#222;
                border:1px solid var(--tk-border); border-radius:3px; text-decoration:none; }
    .menu-btn:hover { background:#dbe8ff; color:#000; }
    .menu-btn.active { background: var(--tk-accent); color:#fff; border-color: var(--tk-accent); }
    .menu-btn.scan { border-color:#198754; }

    /* টপবার */
    .topbar { background: var(--tk-panel); border-bottom:1px solid var(--tk-border); padding: 8px 14px; }

    /* tkinter LabelFrame স্টাইল বক্স */
    .lframe { position: relative; background: var(--tk-panel); border:1px solid var(--tk-border);
              border-radius:3px; padding: 22px 14px 14px; margin-top: 12px; height: calc(100% - 12px); }
    .lframe > .legend { position:absolute; top:-11px; left:10px; background: var(--tk-bg);
                        padding: 0 8px; font-weight:600; color:#333; }
    .stat-num { font-size: 26px; font-weight:700; color: var(--tk-accent); }
    .btn-tk { background:#e1e1e1; border:1px solid var(--tk-border); border-radius:3px; color:#222; padding: 8px 14px; }
    .btn-tk:hover { background:#d0e2ff; }
  </style>
</head>
<body>
@php
  $menu = [
    ['ড্যাশবোর্ড', 'dashboard', route('dashboard')],
    ['প্রোডাক্ট', null, '#'],
    ['বিক্রি (POS)', null, '#'],
    ['কাস্টমার', null, '#'],
    ['সাপ্লায়ার', null, '#'],
    ['খরচ', null, '#'],
    ['রিপোর্ট', null, '#'],
    ['সেটিং', null, '#'],
  ];
@endphp

<div class="d-flex">

  {{-- সাইডবার --}}
  <aside class="offcanvas-lg offcanvas-start app-sidebar" tabindex="-1" id="sidebar">
    <div class="offcanvas-body p-0 d-block">
      <div class="brand d-flex justify-content-between align-items-center">
        <span>Invoice-BD</span>
        <button type="button" class="btn-close btn-close-white d-lg-none" data-bs-dismiss="offcanvas" data-bs-target="#sidebar"></button>
      </div>

      <div class="menu-title">মেনু</div>
      @foreach ($menu as [$label, $route, $url])
        <a href="{{ $url }}" class="menu-btn {{ $route && request()->routeIs($route) ? 'active' : '' }}">{{ $label }}</a>
      @endforeach

      {{-- QR স্ক্যান টু সেল (ধাপ ৬ এ চালু হবে) --}}
      <div class="menu-title d-lg-none">মোবাইল</div>
      <a href="#" class="menu-btn scan d-lg-none">📷 QR স্ক্যান টু সেল</a>
    </div>
  </aside>

  {{-- মূল অংশ --}}
  <div class="flex-grow-1" style="min-width:0">
    <div class="topbar d-flex justify-content-between align-items-center">
      <div class="d-flex align-items-center gap-2">
        <button class="btn btn-tk d-lg-none" type="button" data-bs-toggle="offcanvas" data-bs-target="#sidebar">☰</button>
        <strong>{{ auth()->user()->shop_name ?: 'আমার দোকান' }}</strong>
      </div>
      <div class="d-flex align-items-center gap-2">
        <span class="d-none d-sm-inline text-muted">{{ auth()->user()->name }}</span>
        <form method="POST" action="{{ route('logout') }}">@csrf
          <button class="btn btn-tk btn-sm">লগআউট</button>
        </form>
      </div>
    </div>

    <main class="p-3">
      @yield('content')
    </main>
  </div>

</div>

<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js"></script>
</body>
</html>

২. ড্যাশবোর্ড পেজ

resources/views/dashboard.blade.php এর সব মুছে এটা দিন:

blade
@extends('layouts.app')

@section('title', 'ড্যাশবোর্ড')

@section('content')

<div class="row g-3">
  @foreach ([
    ['আজকের বিক্রি', '০ ৳'],
    ['মোট প্রোডাক্ট', '০'],
    ['মোট কাস্টমার', '০'],
    ['মোট বাকি', '০ ৳'],
  ] as [$title, $value])
  <div class="col-6 col-lg-3">
    <div class="lframe">
      <span class="legend">{{ $title }}</span>
      <div class="stat-num">{{ $value }}</div>
    </div>
  </div>
  @endforeach
</div>

<div class="row g-3 mt-1">
  <div class="col-12 col-lg-5">
    <div class="lframe">
      <span class="legend">দ্রুত কাজ</span>
      <div class="d-grid gap-2">
        <a href="#" class="btn btn-tk">🛒 নতুন বিক্রি</a>
        <a href="#" class="btn btn-tk">➕ প্রোডাক্ট যোগ করুন</a>
        <a href="#" class="btn btn-tk">👤 কাস্টমার যোগ করুন</a>
      </div>
    </div>
  </div>

  <div class="col-12 col-lg-7">
    <div class="lframe">
      <span class="legend">সাম্প্রতিক বিক্রি</span>
      <p class="text-muted mb-0">এখনো কোনো বিক্রি নেই।</p>
    </div>
  </div>
</div>

@endsection

৩. পরীক্ষা

http://127.0.0.1:8000/dashboard খুলুন (লগইন করা থাকতে হবে)।

  • কম্পিউটারে: বাঁ দিকে ধূসর সাইডবার, উপরে দোকানের নাম আর লগআউট, মাঝে ৪টা বক্স।
  • মোবাইলে (F12 চেপে ফোন মোড): সাইডবার নেই, ☰ চাপলে খুলবে। নিচে সবুজ বর্ডারের 📷 QR স্ক্যান টু সেল বাটন দেখা যাবে, এটা শুধু মোবাইল মেনুতে আসে।

মেনুর বাটনগুলো এখন # লিংক, একেকটা পেজ বানালে লিংক বসবে। QR বাটনও ধাপ ৬ এ চালু করব।

ঠিকঠাক দেখা গেলে জানান, পরের ধাপ ধাপ ৪: ফ্রি ট্রায়াল ও সাবস্ক্রিপশন। সাইন আপ করলেই সেটিং অনুযায়ী ট্রায়াল চালু হবে, মেয়াদ শেষ হলে ড্যাশবোর্ডে সাবস্ক্রিপশন নেওয়ার পেজ আসবে।

ok, nice working, Next

ধাপ ৪: ফ্রি ট্রায়াল ও সাবস্ক্রিপশন। টেবিল আগেই বানানো আছে, তাই ডাটাবেসে শুধু একটা ছোট আপডেট লাগবে। কাজের ধারা এমন:

  • সাইন আপ করলে সেটিং দেখে ট্রায়াল চালু হবে (ট্রায়াল অন থাকলে আর দিন দেওয়া থাকলে)।
  • মেয়াদ শেষ হলে বা সাবস্ক্রিপশন না থাকলে ইউজার সাবস্ক্রিপশন পেজে চলে যাবে।
  • আপনি (অ্যাডমিন) সেটিং পেজ থেকে ট্রায়াল অন/অফ আর দিন ঠিক করবেন।
  • পেমেন্ট গেটওয়ে এখন নেই। ইউজার আপনাকে টাকা পাঠাবে, আপনি অ্যাডমিন পেজ থেকে প্ল্যান চালু করে দেবেন।


Post a Comment

أحدث أقدم