migrate to gtea from bistbucket
This commit is contained in:
@@ -0,0 +1,44 @@
|
||||
<?php
|
||||
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
|
||||
return new class extends Migration
|
||||
{
|
||||
public function up(): void
|
||||
{
|
||||
Schema::create('hotels', function (Blueprint $table) {
|
||||
$table->id();
|
||||
|
||||
// If a hotel belongs to a restaurant/business group
|
||||
$table->foreignId('restaurant_id')
|
||||
->nullable()
|
||||
->constrained('restaurants')
|
||||
->nullOnDelete();
|
||||
|
||||
$table->string('name');
|
||||
$table->string('location')->nullable();
|
||||
$table->string('email')->nullable();
|
||||
$table->string('phone')->nullable();
|
||||
$table->text('description')->nullable();
|
||||
|
||||
$table->decimal('latitude', 10, 7)->nullable();
|
||||
$table->decimal('longitude', 10, 7)->nullable();
|
||||
|
||||
$table->time('check_in_time')->default('14:00')->comment('Standard hotel check-in time');
|
||||
$table->time('check_out_time')->default('12:00')->comment('Standard hotel check-out time');
|
||||
|
||||
// Status: 1 = Active, 0 = Inactive (more standard)
|
||||
$table->smallInteger('status')->default(1)->comment('1=Active, 2=InActive');
|
||||
|
||||
$table->timestamps();
|
||||
$table->softDeletes();
|
||||
});
|
||||
}
|
||||
|
||||
public function down(): void
|
||||
{
|
||||
Schema::dropIfExists('hotels');
|
||||
}
|
||||
};
|
||||
@@ -0,0 +1,27 @@
|
||||
<?php
|
||||
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
|
||||
return new class extends Migration
|
||||
{
|
||||
public function up(): void
|
||||
{
|
||||
Schema::create('floors', function (Blueprint $table) {
|
||||
$table->id();
|
||||
$table->unsignedBigInteger('restaurant_id')->nullable();
|
||||
$table->unsignedBigInteger('hotel_id');
|
||||
$table->string('name'); // e.g., Lobby, 1st Floor
|
||||
$table->integer('level')->nullable(); // optional floor number
|
||||
$table->smallInteger('status')->default(1)->comment('1=Active, 2=InActive');
|
||||
$table->timestamps();
|
||||
$table->softDeletes();
|
||||
});
|
||||
}
|
||||
|
||||
public function down(): void
|
||||
{
|
||||
Schema::dropIfExists('floors');
|
||||
}
|
||||
};
|
||||
@@ -0,0 +1,57 @@
|
||||
<?php
|
||||
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
|
||||
return new class extends Migration
|
||||
{
|
||||
public function up(): void
|
||||
{
|
||||
Schema::create('room_types', function (Blueprint $table) {
|
||||
$table->id();
|
||||
|
||||
// Optional link if restaurants own hotels
|
||||
$table->foreignId('restaurant_id')
|
||||
->nullable()
|
||||
->constrained('restaurants')
|
||||
->nullOnDelete();
|
||||
|
||||
// Each room type belongs to a hotel
|
||||
$table->foreignId('hotel_id')
|
||||
->constrained('hotels')
|
||||
->cascadeOnDelete();
|
||||
|
||||
// Basic Info
|
||||
$table->string('name'); // e.g., Deluxe, Suite, Standard
|
||||
$table->integer('capacity')->default(1); // number of guests
|
||||
|
||||
// Room Features (real-world usage)
|
||||
$table->integer('beds')->default(1); // number of beds
|
||||
$table->string('bed_type')->nullable(); // Queen, King, Twin, etc.
|
||||
$table->boolean('has_ac')->default(true);
|
||||
$table->boolean('has_wifi')->default(true);
|
||||
$table->boolean('has_breakfast')->default(false);
|
||||
$table->boolean('is_refundable')->default(true);
|
||||
|
||||
// Pricing (standard hotel structure)
|
||||
$table->decimal('base_price', 10, 2); // base per-night price
|
||||
$table->decimal('weekend_price', 10, 2)->nullable(); // optional weekend price
|
||||
$table->decimal('extra_guest_price', 10, 2)->nullable();
|
||||
|
||||
// Optional description for UI
|
||||
$table->text('description')->nullable();
|
||||
|
||||
// Availability
|
||||
$table->smallInteger('status')->default(1)->comment('1=Active, 2=InActive');
|
||||
|
||||
$table->timestamps();
|
||||
$table->softDeletes();
|
||||
});
|
||||
}
|
||||
|
||||
public function down(): void
|
||||
{
|
||||
Schema::dropIfExists('room_types');
|
||||
}
|
||||
};
|
||||
@@ -0,0 +1,79 @@
|
||||
<?php
|
||||
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
|
||||
return new class extends Migration
|
||||
{
|
||||
public function up(): void
|
||||
{
|
||||
Schema::create('rooms', function (Blueprint $table) {
|
||||
$table->id();
|
||||
|
||||
// If the system belongs to a restaurant group
|
||||
$table->foreignId('restaurant_id')
|
||||
->nullable()
|
||||
->constrained('restaurants')
|
||||
->nullOnDelete();
|
||||
|
||||
// Main hotel reference
|
||||
$table->foreignId('hotel_id')
|
||||
->constrained('hotels')
|
||||
->cascadeOnDelete();
|
||||
|
||||
// Floor reference
|
||||
$table->foreignId('floor_id')
|
||||
->constrained('floors')
|
||||
->cascadeOnDelete();
|
||||
|
||||
// Room type reference
|
||||
$table->foreignId('room_type_id')
|
||||
->constrained('room_types')
|
||||
->cascadeOnDelete();
|
||||
|
||||
// Room Info
|
||||
$table->string('room_number'); // e.g. 101, 502A
|
||||
$table->string('room_code')->nullable(); // unique internal tracking code (optional)
|
||||
$table->integer('max_adults')->default(2);
|
||||
$table->integer('max_children')->default(0);
|
||||
|
||||
// Features
|
||||
$table->boolean('has_balcony')->default(false);
|
||||
$table->boolean('has_bathtub')->default(false);
|
||||
|
||||
// View type: sea, city, garden, mountain, pool, etc.
|
||||
$table->string('view_type')->nullable();
|
||||
$table->string('slug')->nullable();
|
||||
|
||||
// Media / Images
|
||||
$table->string('image')->nullable(); // main display image
|
||||
$table->string('banner_image')->nullable(); // top banner image
|
||||
$table->json('gallery_images')->nullable(); // multiple images stored as JSON
|
||||
|
||||
// Extra description
|
||||
$table->text('description')->nullable();
|
||||
|
||||
// Pricing
|
||||
$table->decimal('regular_price', 10, 2)->nullable()->comment('Base room price');
|
||||
$table->decimal('offer_price', 10, 2)->nullable()->comment('Discounted price if any');
|
||||
|
||||
// Room Availability
|
||||
$table->boolean('is_clean')->default(true); // housekeeping status
|
||||
$table->boolean('is_available')->default(true); // available or blocked
|
||||
|
||||
// Active/Inactive
|
||||
$table->smallInteger('status')->default(1)->comment('1=Active, 2=InActive');
|
||||
|
||||
$table->timestamps();
|
||||
$table->softDeletes();
|
||||
|
||||
$table->unique(['hotel_id', 'room_number'], 'hotel_room_number_unique');
|
||||
});
|
||||
}
|
||||
|
||||
public function down(): void
|
||||
{
|
||||
Schema::dropIfExists('rooms');
|
||||
}
|
||||
};
|
||||
@@ -0,0 +1,50 @@
|
||||
<?php
|
||||
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
|
||||
return new class extends Migration
|
||||
{
|
||||
public function up(): void
|
||||
{
|
||||
Schema::create('room_prices', function (Blueprint $table) {
|
||||
$table->id();
|
||||
|
||||
// Optional if restaurants own hotels
|
||||
$table->foreignId('restaurant_id')
|
||||
->nullable()
|
||||
->constrained('restaurants')
|
||||
->nullOnDelete();
|
||||
|
||||
$table->foreignId('room_id')->constrained('rooms')->cascadeOnDelete();
|
||||
|
||||
// Pricing period
|
||||
$table->date('start_date');
|
||||
$table->date('end_date');
|
||||
|
||||
// Day category: normal, weekend, holiday, peak, event
|
||||
$table->enum('day_type', ['normal', 'weekend', 'holiday', 'event', 'peak'])
|
||||
->default('normal');
|
||||
|
||||
// Price for that day/date range
|
||||
$table->decimal('price', 10, 2);
|
||||
|
||||
// For overlapping pricing rules → higher priority wins
|
||||
$table->integer('priority')->default(1);
|
||||
|
||||
// Status
|
||||
$table->boolean('is_active')
|
||||
->default(true)
|
||||
->comment('true = Active, false = Inactive');
|
||||
|
||||
$table->timestamps();
|
||||
$table->softDeletes();
|
||||
});
|
||||
}
|
||||
|
||||
public function down(): void
|
||||
{
|
||||
Schema::dropIfExists('room_prices');
|
||||
}
|
||||
};
|
||||
@@ -0,0 +1,77 @@
|
||||
<?php
|
||||
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
|
||||
return new class extends Migration
|
||||
{
|
||||
public function up(): void
|
||||
{
|
||||
Schema::create('bookings', function (Blueprint $table) {
|
||||
$table->id();
|
||||
|
||||
// Optional restaurant group owner
|
||||
$table->foreignId('restaurant_id')
|
||||
->nullable()
|
||||
->constrained('restaurants')
|
||||
->nullOnDelete();
|
||||
|
||||
$table->foreignId('hotel_id')
|
||||
->constrained('hotels')
|
||||
->cascadeOnDelete();
|
||||
|
||||
// Customer (guest)
|
||||
$table->foreignId('customer_id')
|
||||
->constrained('customers')
|
||||
->cascadeOnDelete();
|
||||
|
||||
// Stay period
|
||||
$table->date('check_in');
|
||||
$table->date('check_out');
|
||||
|
||||
// optionally store times (if check_in/out only date previously)
|
||||
$table->time('check_in_time')->nullable();
|
||||
$table->time('check_out_time')->nullable();
|
||||
|
||||
// Guest breakdown
|
||||
$table->integer('total_adults')->default(1);
|
||||
$table->integer('total_children')->default(0);
|
||||
|
||||
// Pricing
|
||||
$table->decimal('subtotal_amount', 10, 2)->default(0); // rooms only
|
||||
$table->decimal('tax_amount', 10, 2)->default(0);
|
||||
$table->decimal('discount_amount', 10, 2)->default(0);
|
||||
$table->decimal('total_amount', 10, 2)->default(0);
|
||||
|
||||
// Payment information
|
||||
$table->enum('payment_status', ['pending', 'paid', 'refunded'])->default('pending');
|
||||
$table->enum('payment_method', ['cash', 'card', 'online', 'bank'])->nullable();
|
||||
|
||||
// source/channel (website, ota, walkin)
|
||||
$table->string('channel')->nullable();
|
||||
|
||||
// Booking status
|
||||
$table->enum('status', ['pending', 'confirmed', 'checked_in', 'checked_out', 'canceled'])
|
||||
->default('pending');
|
||||
|
||||
// Cancellation tracking
|
||||
$table->timestamp('canceled_at')->nullable();
|
||||
$table->foreignId('canceled_by')->nullable()->constrained('users');
|
||||
|
||||
// Notes
|
||||
$table->text('remarks')->nullable();
|
||||
|
||||
$table->timestamps();
|
||||
$table->softDeletes();
|
||||
|
||||
// small optimization index
|
||||
$table->index(['hotel_id', 'status']);
|
||||
});
|
||||
}
|
||||
|
||||
public function down(): void
|
||||
{
|
||||
Schema::dropIfExists('bookings');
|
||||
}
|
||||
};
|
||||
@@ -0,0 +1,53 @@
|
||||
<?php
|
||||
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
|
||||
return new class extends Migration
|
||||
{
|
||||
public function up(): void
|
||||
{
|
||||
Schema::create('booking_items', function (Blueprint $table) {
|
||||
$table->id();
|
||||
|
||||
$table->foreignId('restaurant_id')
|
||||
->nullable()
|
||||
->constrained('restaurants')
|
||||
->nullOnDelete();
|
||||
|
||||
$table->foreignId('booking_id')
|
||||
->constrained('bookings')
|
||||
->cascadeOnDelete();
|
||||
|
||||
$table->foreignId('room_id')
|
||||
->constrained('rooms')
|
||||
->cascadeOnDelete();
|
||||
|
||||
// Guest count for this room
|
||||
$table->integer('adults')->default(1);
|
||||
$table->integer('children')->default(0);
|
||||
|
||||
// Price assigned to this room (per night * nights)
|
||||
$table->decimal('room_price', 10, 2); // final price for stay (no tax)
|
||||
|
||||
// Calculated nights
|
||||
$table->integer('nights')->default(1);
|
||||
|
||||
$table->decimal('tax_amount', 10, 2)->default(0);
|
||||
$table->decimal('total_amount', 10, 2)->default(0);
|
||||
|
||||
// Housekeeping status (optional)
|
||||
$table->enum('status', ['reserved', 'occupied', 'cleaning', 'completed', 'canceled'])
|
||||
->default('reserved');
|
||||
|
||||
$table->timestamps();
|
||||
$table->softDeletes();
|
||||
});
|
||||
}
|
||||
|
||||
public function down(): void
|
||||
{
|
||||
Schema::dropIfExists('booking_items');
|
||||
}
|
||||
};
|
||||
@@ -0,0 +1,72 @@
|
||||
<?php
|
||||
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
|
||||
return new class extends Migration
|
||||
{
|
||||
public function up(): void
|
||||
{
|
||||
Schema::create('room_availabilities', function (Blueprint $table) {
|
||||
$table->id();
|
||||
|
||||
$table->unsignedBigInteger('restaurant_id')->nullable();
|
||||
|
||||
$table->foreignId('hotel_id')
|
||||
->constrained('hotels')
|
||||
->cascadeOnDelete();
|
||||
|
||||
$table->foreignId('room_id')
|
||||
->constrained('rooms')
|
||||
->cascadeOnDelete();
|
||||
|
||||
// Support multiple room inventory (e.g., 10 deluxe rooms)
|
||||
$table->integer('total_inventory')->default(1);
|
||||
$table->integer('available_inventory')->default(1);
|
||||
|
||||
// Date (1 row per room per date)
|
||||
$table->date('date');
|
||||
|
||||
// Availability flags
|
||||
$table->boolean('is_available')->default(true);
|
||||
$table->boolean('is_closed_to_arrival')->default(false);
|
||||
$table->boolean('is_closed_to_departure')->default(false);
|
||||
|
||||
// Pricing for that day (smart dynamic rate support)
|
||||
$table->decimal('base_price', 10, 2)->nullable();
|
||||
$table->decimal('extra_adult_price', 10, 2)->nullable();
|
||||
$table->decimal('extra_child_price', 10, 2)->nullable();
|
||||
|
||||
// Minimum stay rules
|
||||
$table->integer('min_stay')->default(1);
|
||||
$table->integer('max_stay')->nullable(); // optional
|
||||
|
||||
// Reference to what blocked the inventory
|
||||
$table->foreignId('blocked_by_booking_id')
|
||||
->nullable()
|
||||
->constrained('bookings')
|
||||
->nullOnDelete();
|
||||
|
||||
// Maintenance / admin block info
|
||||
$table->enum('block_type', ['none', 'booking', 'maintenance', 'manual'])->default('none');
|
||||
$table->text('note')->nullable();
|
||||
|
||||
// Status
|
||||
$table->smallInteger('status')->default(1)->comment('1=Active, 2=InActive');
|
||||
|
||||
$table->timestamps();
|
||||
$table->softDeletes();
|
||||
|
||||
// Ensures 1 row per room per date
|
||||
$table->unique(['room_id', 'date'], 'room_date_unique');
|
||||
|
||||
$table->index(['hotel_id', 'date']);
|
||||
});
|
||||
}
|
||||
|
||||
public function down(): void
|
||||
{
|
||||
Schema::dropIfExists('room_availabilities');
|
||||
}
|
||||
};
|
||||
@@ -0,0 +1,71 @@
|
||||
<?php
|
||||
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
|
||||
return new class extends Migration
|
||||
{
|
||||
public function up(): void
|
||||
{
|
||||
Schema::create('room_blocks', function (Blueprint $table) {
|
||||
$table->id();
|
||||
|
||||
$table->unsignedBigInteger('restaurant_id')->nullable();
|
||||
|
||||
$table->foreignId('hotel_id')
|
||||
->nullable()
|
||||
->constrained('hotels')
|
||||
->cascadeOnDelete();
|
||||
|
||||
$table->foreignId('room_id')
|
||||
->constrained('rooms')
|
||||
->cascadeOnDelete();
|
||||
|
||||
// Flexible blocking
|
||||
$table->date('start_date');
|
||||
$table->date('end_date');
|
||||
|
||||
// Partial day support
|
||||
$table->time('start_time')->nullable(); // null = full day block
|
||||
$table->time('end_time')->nullable();
|
||||
|
||||
// New: Block type
|
||||
$table->enum('block_type', ['maintenance', 'deep_clean', 'renovation', 'owner_stay', 'event', 'other'])
|
||||
->default('maintenance');
|
||||
|
||||
// Multi-inventory rooms
|
||||
$table->integer('blocked_inventory')->default(1); // e.g., block 1 of 5 room-inventory
|
||||
|
||||
// Priority: higher wins (OTA, admin, system blocks)
|
||||
$table->integer('priority')->default(1);
|
||||
|
||||
// Reason for staff logs
|
||||
$table->string('reason')->nullable();
|
||||
|
||||
// Auto-expire block (optional)
|
||||
$table->boolean('auto_release')->default(true);
|
||||
|
||||
// Who created
|
||||
$table->foreignId('created_by')
|
||||
->nullable()
|
||||
->constrained('users')
|
||||
->nullOnDelete();
|
||||
|
||||
// Active/Inactive
|
||||
$table->smallInteger('status')->default(1)->comment('1=Active, 2=Inactive');
|
||||
|
||||
$table->timestamps();
|
||||
$table->softDeletes();
|
||||
|
||||
// Useful for availability engine
|
||||
$table->index(['room_id', 'start_date', 'end_date']);
|
||||
$table->index(['hotel_id', 'block_type']);
|
||||
});
|
||||
}
|
||||
|
||||
public function down(): void
|
||||
{
|
||||
Schema::dropIfExists('room_blocks');
|
||||
}
|
||||
};
|
||||
@@ -0,0 +1,23 @@
|
||||
<?php
|
||||
|
||||
namespace Modules\Booking\Database\Seeders;
|
||||
|
||||
use Illuminate\Database\Seeder;
|
||||
|
||||
class BookingDatabaseSeeder extends Seeder
|
||||
{
|
||||
/**
|
||||
* Run the database seeds.
|
||||
*/
|
||||
public function run(): void
|
||||
{
|
||||
$this->call([
|
||||
HotelTableSeeder::class,
|
||||
FloorTableSeeder::class,
|
||||
RoomTypeTableSeeder::class,
|
||||
RoomTableSeeder::class,
|
||||
RoomAvailabilityTableSeeder::class,
|
||||
RoomBlockTableSeeder::class,
|
||||
]);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,103 @@
|
||||
<?php
|
||||
|
||||
namespace Modules\Booking\Database\Seeders;
|
||||
|
||||
use Carbon\Carbon;
|
||||
use Illuminate\Database\Seeder;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
|
||||
class BookingTableSeeder extends Seeder
|
||||
{
|
||||
/**
|
||||
* Run the database seeds.
|
||||
*/
|
||||
public function run(): void
|
||||
{
|
||||
// Sample bookings
|
||||
$bookings = [
|
||||
[
|
||||
'restaurant_id' => 1,
|
||||
'hotel_id' => 1,
|
||||
'customer_id' => 2,
|
||||
'check_in' => Carbon::now()->addDays(2)->format('Y-m-d'),
|
||||
'check_out' => Carbon::now()->addDays(5)->format('Y-m-d'),
|
||||
'check_in_time' => '14:00:00',
|
||||
'check_out_time' => '12:00:00',
|
||||
'total_adults' => 2,
|
||||
'total_children' => 1,
|
||||
'subtotal_amount' => 360.00,
|
||||
'tax_amount' => 36.00,
|
||||
'discount_amount' => 20.00,
|
||||
'total_amount' => 376.00,
|
||||
'payment_status' => 'pending',
|
||||
'payment_method' => 'cash',
|
||||
'channel' => 'website',
|
||||
'status' => 'confirmed',
|
||||
'remarks' => 'VIP customer',
|
||||
'created_at' => Carbon::now(),
|
||||
'updated_at' => Carbon::now(),
|
||||
],
|
||||
[
|
||||
'restaurant_id' => 1,
|
||||
'hotel_id' => 1,
|
||||
'customer_id' => 3,
|
||||
'check_in' => Carbon::now()->addDays(3)->format('Y-m-d'),
|
||||
'check_out' => Carbon::now()->addDays(4)->format('Y-m-d'),
|
||||
'check_in_time' => '15:00:00',
|
||||
'check_out_time' => '11:00:00',
|
||||
'total_adults' => 1,
|
||||
'total_children' => 0,
|
||||
'subtotal_amount' => 120.00,
|
||||
'tax_amount' => 12.00,
|
||||
'discount_amount' => 0,
|
||||
'total_amount' => 132.00,
|
||||
'payment_status' => 'pending',
|
||||
'payment_method' => 'card',
|
||||
'channel' => 'walkin',
|
||||
'status' => 'pending',
|
||||
'remarks' => 'First-time guest',
|
||||
'created_at' => Carbon::now(),
|
||||
'updated_at' => Carbon::now(),
|
||||
],
|
||||
];
|
||||
|
||||
// Insert bookings and get inserted IDs
|
||||
foreach ($bookings as $bookingData) {
|
||||
$bookingId = DB::table('bookings')->insertGetId($bookingData);
|
||||
|
||||
// Sample booking items (rooms)
|
||||
$bookingItems = [
|
||||
[
|
||||
'restaurant_id' => $bookingData['restaurant_id'],
|
||||
'booking_id' => $bookingId,
|
||||
'room_id' => 1,
|
||||
'adults' => 2,
|
||||
'children' => 1,
|
||||
'room_price' => 120.00 * 3, // nights * per-night price
|
||||
'nights' => 3,
|
||||
'tax_amount' => 36.00,
|
||||
'total_amount' => 156.00, // room_price + tax
|
||||
'status' => 'reserved',
|
||||
'created_at' => Carbon::now(),
|
||||
'updated_at' => Carbon::now(),
|
||||
],
|
||||
[
|
||||
'restaurant_id' => $bookingData['restaurant_id'],
|
||||
'booking_id' => $bookingId,
|
||||
'room_id' => 2,
|
||||
'adults' => 0,
|
||||
'children' => 0,
|
||||
'room_price' => 0, // no extra room for first booking
|
||||
'nights' => 0,
|
||||
'tax_amount' => 0,
|
||||
'total_amount' => 0,
|
||||
'status' => 'reserved',
|
||||
'created_at' => Carbon::now(),
|
||||
'updated_at' => Carbon::now(),
|
||||
],
|
||||
];
|
||||
|
||||
DB::table('booking_items')->insert($bookingItems);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,84 @@
|
||||
<?php
|
||||
|
||||
namespace Modules\Booking\Database\Seeders;
|
||||
|
||||
use Carbon\Carbon;
|
||||
use Illuminate\Database\Seeder;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
|
||||
class FloorTableSeeder extends Seeder
|
||||
{
|
||||
/**
|
||||
* Run the database seeds.
|
||||
*/
|
||||
public function run(): void
|
||||
{
|
||||
$floors = [
|
||||
[
|
||||
'restaurant_id' => 1,
|
||||
'hotel_id' => 1,
|
||||
'name' => 'Lobby',
|
||||
'level' => 0,
|
||||
'status' => 1,
|
||||
'created_at' => Carbon::now(),
|
||||
'updated_at' => Carbon::now(),
|
||||
],
|
||||
[
|
||||
'restaurant_id' => 1,
|
||||
'hotel_id' => 1,
|
||||
'name' => '1st Floor',
|
||||
'level' => 1,
|
||||
'status' => 1,
|
||||
'created_at' => Carbon::now(),
|
||||
'updated_at' => Carbon::now(),
|
||||
],
|
||||
[
|
||||
'restaurant_id' => 1,
|
||||
'hotel_id' => 1,
|
||||
'name' => '2nd Floor',
|
||||
'level' => 2,
|
||||
'status' => 1,
|
||||
'created_at' => Carbon::now(),
|
||||
'updated_at' => Carbon::now(),
|
||||
],
|
||||
[
|
||||
'restaurant_id' => 1,
|
||||
'hotel_id' => 2,
|
||||
'name' => 'Lobby',
|
||||
'level' => 0,
|
||||
'status' => 1,
|
||||
'created_at' => Carbon::now(),
|
||||
'updated_at' => Carbon::now(),
|
||||
],
|
||||
[
|
||||
'restaurant_id' => 1,
|
||||
'hotel_id' => 2,
|
||||
'name' => '1st Floor',
|
||||
'level' => 1,
|
||||
'status' => 1,
|
||||
'created_at' => Carbon::now(),
|
||||
'updated_at' => Carbon::now(),
|
||||
],
|
||||
[
|
||||
'restaurant_id' => 1,
|
||||
'hotel_id' => 3,
|
||||
'name' => 'Lobby',
|
||||
'level' => 0,
|
||||
'status' => 1,
|
||||
'created_at' => Carbon::now(),
|
||||
'updated_at' => Carbon::now(),
|
||||
],
|
||||
[
|
||||
'restaurant_id' => 1,
|
||||
'hotel_id' => 3,
|
||||
'name' => '1st Floor',
|
||||
'level' => 1,
|
||||
'status' => 1,
|
||||
'created_at' => Carbon::now(),
|
||||
'updated_at' => Carbon::now(),
|
||||
],
|
||||
];
|
||||
|
||||
DB::table('floors')->insert($floors);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,66 @@
|
||||
<?php
|
||||
|
||||
namespace Modules\Booking\Database\Seeders;
|
||||
|
||||
use Carbon\Carbon;
|
||||
use Illuminate\Database\Seeder;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
|
||||
class HotelTableSeeder extends Seeder
|
||||
{
|
||||
/**
|
||||
* Run the database seeds.
|
||||
*/
|
||||
public function run(): void
|
||||
{
|
||||
$hotels = [
|
||||
[
|
||||
'restaurant_id' => 1,
|
||||
'name' => 'Sunrise Hotel',
|
||||
'location' => 'Dhaka, Bangladesh',
|
||||
'email' => 'info@sunrisehotel.com',
|
||||
'phone' => '+880123456789',
|
||||
'description' => 'A luxurious hotel with stunning sunrise views.',
|
||||
'latitude' => 23.8103,
|
||||
'longitude' => 90.4125,
|
||||
'check_in_time' => '14:00',
|
||||
'check_out_time' => '12:00',
|
||||
'status' => 1,
|
||||
'created_at' => Carbon::now(),
|
||||
'updated_at' => Carbon::now(),
|
||||
],
|
||||
[
|
||||
'restaurant_id' => 1,
|
||||
'name' => 'Moonlight Inn',
|
||||
'location' => 'Chittagong, Bangladesh',
|
||||
'email' => 'contact@moonlightinn.com',
|
||||
'phone' => '+880987654321',
|
||||
'description' => 'Comfortable stays under the moonlight.',
|
||||
'latitude' => 22.3569,
|
||||
'longitude' => 91.7832,
|
||||
'check_in_time' => '14:00',
|
||||
'check_out_time' => '12:00',
|
||||
'status' => 1,
|
||||
'created_at' => Carbon::now(),
|
||||
'updated_at' => Carbon::now(),
|
||||
],
|
||||
[
|
||||
'restaurant_id' => 1,
|
||||
'name' => 'Seaside Resort',
|
||||
'location' => 'Cox\'s Bazar, Bangladesh',
|
||||
'email' => 'info@seasideresort.com',
|
||||
'phone' => '+880192837465',
|
||||
'description' => 'Relax by the beach with scenic views.',
|
||||
'latitude' => 21.4272,
|
||||
'longitude' => 92.0058,
|
||||
'check_in_time' => '14:00',
|
||||
'check_out_time' => '12:00',
|
||||
'status' => 1,
|
||||
'created_at' => Carbon::now(),
|
||||
'updated_at' => Carbon::now(),
|
||||
],
|
||||
];
|
||||
|
||||
DB::table('hotels')->insert($hotels);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,52 @@
|
||||
<?php
|
||||
|
||||
namespace Modules\Booking\Database\Seeders;
|
||||
|
||||
use Carbon\Carbon;
|
||||
use Illuminate\Database\Seeder;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
|
||||
class RoomAvailabilityTableSeeder extends Seeder
|
||||
{
|
||||
/**
|
||||
* Run the database seeds.
|
||||
*/
|
||||
public function run(): void
|
||||
{
|
||||
$availabilities = [];
|
||||
// Example: generate availability for next 7 days for two rooms
|
||||
$roomIds = [1, 2]; // Room IDs from your rooms table
|
||||
$hotelId = 1;
|
||||
$restaurantId = 1;
|
||||
|
||||
for ($i = 0; $i < 7; $i++) {
|
||||
$date = Carbon::now()->addDays($i)->format('Y-m-d');
|
||||
foreach ($roomIds as $roomId) {
|
||||
$availabilities[] = [
|
||||
'restaurant_id' => $restaurantId,
|
||||
'hotel_id' => $hotelId,
|
||||
'room_id' => $roomId,
|
||||
'total_inventory' => 5,
|
||||
'available_inventory' => rand(1, 5),
|
||||
'date' => $date,
|
||||
'is_available' => true,
|
||||
'is_closed_to_arrival' => false,
|
||||
'is_closed_to_departure' => false,
|
||||
'base_price' => rand(80, 150),
|
||||
'extra_adult_price' => 20,
|
||||
'extra_child_price' => 10,
|
||||
'min_stay' => 1,
|
||||
'max_stay' => 10,
|
||||
'blocked_by_booking_id' => null,
|
||||
'block_type' => 'none',
|
||||
'note' => null,
|
||||
'status' => 1,
|
||||
'created_at' => Carbon::now(),
|
||||
'updated_at' => Carbon::now(),
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
DB::table('room_availabilities')->insert($availabilities);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,57 @@
|
||||
<?php
|
||||
|
||||
namespace Modules\Booking\Database\Seeders;
|
||||
|
||||
use Carbon\Carbon;
|
||||
use Illuminate\Database\Seeder;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
|
||||
class RoomBlockTableSeeder extends Seeder
|
||||
{
|
||||
/**
|
||||
* Run the database seeds.
|
||||
*/
|
||||
public function run(): void
|
||||
{
|
||||
$blocks = [
|
||||
[
|
||||
'restaurant_id' => 1,
|
||||
'hotel_id' => 1,
|
||||
'room_id' => 1,
|
||||
'start_date' => Carbon::now()->addDays(2)->format('Y-m-d'),
|
||||
'end_date' => Carbon::now()->addDays(3)->format('Y-m-d'),
|
||||
'start_time' => null,
|
||||
'end_time' => null,
|
||||
'block_type' => 'maintenance',
|
||||
'blocked_inventory' => 2,
|
||||
'priority' => 1,
|
||||
'reason' => 'AC maintenance',
|
||||
'auto_release' => true,
|
||||
'created_by' => 1, // admin user id
|
||||
'status' => 1,
|
||||
'created_at' => Carbon::now(),
|
||||
'updated_at' => Carbon::now(),
|
||||
],
|
||||
[
|
||||
'restaurant_id' => 1,
|
||||
'hotel_id' => 1,
|
||||
'room_id' => 2,
|
||||
'start_date' => Carbon::now()->addDays(1)->format('Y-m-d'),
|
||||
'end_date' => Carbon::now()->addDays(1)->format('Y-m-d'),
|
||||
'start_time' => '12:00:00',
|
||||
'end_time' => '18:00:00',
|
||||
'block_type' => 'deep_clean',
|
||||
'blocked_inventory' => 1,
|
||||
'priority' => 2,
|
||||
'reason' => 'Daily deep cleaning',
|
||||
'auto_release' => true,
|
||||
'created_by' => 1,
|
||||
'status' => 1,
|
||||
'created_at' => Carbon::now(),
|
||||
'updated_at' => Carbon::now(),
|
||||
],
|
||||
];
|
||||
|
||||
DB::table('room_blocks')->insert($blocks);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,82 @@
|
||||
<?php
|
||||
|
||||
namespace Modules\Booking\Database\Seeders;
|
||||
|
||||
use Carbon\Carbon;
|
||||
use Illuminate\Database\Seeder;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
|
||||
class RoomTableSeeder extends Seeder
|
||||
{
|
||||
public function run(): void
|
||||
{
|
||||
$roomTypes = [
|
||||
['id' => 1, 'name' => 'Deluxe Room', 'price_min' => 150, 'price_max' => 220],
|
||||
['id' => 2, 'name' => 'Superior Room', 'price_min' => 130, 'price_max' => 190],
|
||||
['id' => 3, 'name' => 'Premier Room', 'price_min' => 200, 'price_max' => 260],
|
||||
['id' => 4, 'name' => 'Executive Room', 'price_min' => 250, 'price_max' => 320],
|
||||
['id' => 5, 'name' => 'Family Room', 'price_min' => 180, 'price_max' => 240],
|
||||
['id' => 6, 'name' => 'Suite', 'price_min' => 350, 'price_max' => 500],
|
||||
];
|
||||
|
||||
$views = ['City View', 'Garden View', 'Pool View', 'Marina View', 'Skyline View'];
|
||||
$rooms = [];
|
||||
$imagePool = range(1, 46); // images 1–46
|
||||
|
||||
for ($i = 1; $i <= 20; $i++) {
|
||||
|
||||
$type = $roomTypes[array_rand($roomTypes)];
|
||||
|
||||
$image = $imagePool[array_rand($imagePool)].'.jpg';
|
||||
$banner = $imagePool[array_rand($imagePool)].'.jpg';
|
||||
|
||||
// Random gallery 6–8 images
|
||||
shuffle($imagePool);
|
||||
$galleryImages = array_slice($imagePool, 0, rand(6, 8));
|
||||
$galleryImages = array_map(fn ($img) => $img.'.jpg', $galleryImages);
|
||||
|
||||
$roomNumber = 100 + $i;
|
||||
$typeSlug = strtolower(str_replace(' ', '-', $type['name']));
|
||||
|
||||
$regular = rand($type['price_min'], $type['price_max']);
|
||||
$offer = $regular - rand(10, 30);
|
||||
|
||||
$rooms[] = [
|
||||
'restaurant_id' => 1,
|
||||
'hotel_id' => 1,
|
||||
'floor_id' => rand(1, 6),
|
||||
'room_type_id' => $type['id'],
|
||||
|
||||
'room_number' => $roomNumber,
|
||||
'room_code' => strtoupper(substr($typeSlug, 0, 3)).$roomNumber,
|
||||
|
||||
'max_adults' => rand(2, 4),
|
||||
'max_children' => rand(0, 2),
|
||||
|
||||
'has_balcony' => rand(0, 1),
|
||||
'has_bathtub' => rand(0, 1),
|
||||
|
||||
'view_type' => $views[array_rand($views)],
|
||||
'slug' => $roomNumber.'-'.$typeSlug,
|
||||
|
||||
'image' => $image,
|
||||
'banner_image' => $banner,
|
||||
'gallery_images' => json_encode($galleryImages),
|
||||
|
||||
'description' => $type['name'].' with modern amenities, designed for comfort and a premium Singapore hotel experience.',
|
||||
|
||||
'regular_price' => $regular,
|
||||
'offer_price' => $offer,
|
||||
|
||||
'is_clean' => true,
|
||||
'is_available' => true,
|
||||
'status' => 1,
|
||||
|
||||
'created_at' => Carbon::now(),
|
||||
'updated_at' => Carbon::now(),
|
||||
];
|
||||
}
|
||||
|
||||
DB::table('rooms')->insert($rooms);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,138 @@
|
||||
<?php
|
||||
|
||||
namespace Modules\Booking\Database\Seeders;
|
||||
|
||||
use Carbon\Carbon;
|
||||
use Illuminate\Database\Seeder;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
|
||||
class RoomTypeTableSeeder extends Seeder
|
||||
{
|
||||
/**
|
||||
* Run the database seeds.
|
||||
*/
|
||||
public function run(): void
|
||||
{
|
||||
$roomTypes = [
|
||||
// Hotel 1
|
||||
[
|
||||
'restaurant_id' => 1,
|
||||
'hotel_id' => 1,
|
||||
'name' => 'Deluxe Room',
|
||||
'capacity' => 2,
|
||||
'beds' => 1,
|
||||
'bed_type' => 'Queen',
|
||||
'has_ac' => true,
|
||||
'has_wifi' => true,
|
||||
'has_breakfast' => true,
|
||||
'is_refundable' => true,
|
||||
'base_price' => 120.00,
|
||||
'weekend_price' => 150.00,
|
||||
'extra_guest_price' => 30.00,
|
||||
'description' => 'Spacious deluxe room with modern amenities.',
|
||||
'status' => 1,
|
||||
'created_at' => Carbon::now(),
|
||||
'updated_at' => Carbon::now(),
|
||||
],
|
||||
[
|
||||
'restaurant_id' => 1,
|
||||
'hotel_id' => 1,
|
||||
'name' => 'Standard Room',
|
||||
'capacity' => 2,
|
||||
'beds' => 1,
|
||||
'bed_type' => 'Twin',
|
||||
'has_ac' => true,
|
||||
'has_wifi' => true,
|
||||
'has_breakfast' => false,
|
||||
'is_refundable' => true,
|
||||
'base_price' => 80.00,
|
||||
'weekend_price' => 100.00,
|
||||
'extra_guest_price' => 20.00,
|
||||
'description' => 'Cozy standard room for a comfortable stay.',
|
||||
'status' => 1,
|
||||
'created_at' => Carbon::now(),
|
||||
'updated_at' => Carbon::now(),
|
||||
],
|
||||
// Hotel 2
|
||||
[
|
||||
'restaurant_id' => 1,
|
||||
'hotel_id' => 2,
|
||||
'name' => 'Suite Room',
|
||||
'capacity' => 4,
|
||||
'beds' => 2,
|
||||
'bed_type' => 'King',
|
||||
'has_ac' => true,
|
||||
'has_wifi' => true,
|
||||
'has_breakfast' => true,
|
||||
'is_refundable' => true,
|
||||
'base_price' => 200.00,
|
||||
'weekend_price' => 250.00,
|
||||
'extra_guest_price' => 50.00,
|
||||
'description' => 'Luxury suite with separate living area.',
|
||||
'status' => 1,
|
||||
'created_at' => Carbon::now(),
|
||||
'updated_at' => Carbon::now(),
|
||||
],
|
||||
[
|
||||
'restaurant_id' => 1,
|
||||
'hotel_id' => 2,
|
||||
'name' => 'Standard Room',
|
||||
'capacity' => 2,
|
||||
'beds' => 1,
|
||||
'bed_type' => 'Queen',
|
||||
'has_ac' => true,
|
||||
'has_wifi' => true,
|
||||
'has_breakfast' => false,
|
||||
'is_refundable' => true,
|
||||
'base_price' => 90.00,
|
||||
'weekend_price' => 120.00,
|
||||
'extra_guest_price' => 25.00,
|
||||
'description' => 'Comfortable room suitable for short stays.',
|
||||
'status' => 1,
|
||||
'created_at' => Carbon::now(),
|
||||
'updated_at' => Carbon::now(),
|
||||
],
|
||||
// Hotel 3
|
||||
[
|
||||
'restaurant_id' => 1,
|
||||
'hotel_id' => 3,
|
||||
'name' => 'Seaside Deluxe',
|
||||
'capacity' => 3,
|
||||
'beds' => 2,
|
||||
'bed_type' => 'Queen',
|
||||
'has_ac' => true,
|
||||
'has_wifi' => true,
|
||||
'has_breakfast' => true,
|
||||
'is_refundable' => true,
|
||||
'base_price' => 150.00,
|
||||
'weekend_price' => 180.00,
|
||||
'extra_guest_price' => 35.00,
|
||||
'description' => 'Deluxe room with sea view.',
|
||||
'status' => 1,
|
||||
'created_at' => Carbon::now(),
|
||||
'updated_at' => Carbon::now(),
|
||||
],
|
||||
[
|
||||
'restaurant_id' => 1,
|
||||
'hotel_id' => 3,
|
||||
'name' => 'Seaside Standard',
|
||||
'capacity' => 2,
|
||||
'beds' => 1,
|
||||
'bed_type' => 'Twin',
|
||||
'has_ac' => true,
|
||||
'has_wifi' => true,
|
||||
'has_breakfast' => false,
|
||||
'is_refundable' => true,
|
||||
'base_price' => 100.00,
|
||||
'weekend_price' => 130.00,
|
||||
'extra_guest_price' => 25.00,
|
||||
'description' => 'Affordable standard room with a partial sea view.',
|
||||
'status' => 1,
|
||||
'created_at' => Carbon::now(),
|
||||
'updated_at' => Carbon::now(),
|
||||
],
|
||||
];
|
||||
|
||||
DB::table('room_types')->insert($roomTypes);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user