backend phase 9

This commit is contained in:
hamid
2026-07-06 19:23:44 +03:30
parent 2cfc082a04
commit 12c7e51c32
101 changed files with 11666 additions and 8 deletions
@@ -0,0 +1,379 @@
using System;
using Microsoft.EntityFrameworkCore.Migrations;
#nullable disable
#pragma warning disable CA1814 // Prefer jagged arrays over multidimensional
namespace Baya.Infrastructure.Persistence.Migrations
{
/// <inheritdoc />
public partial class BookingsSessionsEvvCancellation : Migration
{
/// <inheritdoc />
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.CreateTable(
name: "Bookings",
schema: "booking",
columns: table => new
{
Id = table.Column<long>(type: "bigint", nullable: false)
.Annotation("SqlServer:Identity", "1, 1"),
BookingRequestId = table.Column<long>(type: "bigint", nullable: false),
CustomerId = table.Column<long>(type: "bigint", nullable: false),
NurseId = table.Column<long>(type: "bigint", nullable: false),
PatientId = table.Column<long>(type: "bigint", nullable: false),
VariantId = table.Column<long>(type: "bigint", nullable: false),
CustomerAddressId = table.Column<long>(type: "bigint", nullable: false),
PartnerCenterId = table.Column<long>(type: "bigint", nullable: true),
VariantSnapshotJson = table.Column<string>(type: "nvarchar(max)", nullable: false),
AddressSnapshotJson = table.Column<string>(type: "nvarchar(max)", nullable: false),
GrossPriceIrr = table.Column<long>(type: "bigint", nullable: false),
BalinyaarCommissionIrr = table.Column<long>(type: "bigint", nullable: false),
PlatformFeeRate = table.Column<decimal>(type: "decimal(5,4)", precision: 5, scale: 4, nullable: false),
NursePayoutAmount = table.Column<long>(type: "bigint", nullable: false),
PspFeeAmount = table.Column<long>(type: "bigint", nullable: true),
SessionCount = table.Column<short>(type: "smallint", nullable: false),
ScheduledDate = table.Column<DateOnly>(type: "date", nullable: false),
ScheduledTimeStart = table.Column<TimeOnly>(type: "time", nullable: false),
ScheduledTimeEnd = table.Column<TimeOnly>(type: "time", nullable: false),
Status = table.Column<string>(type: "nvarchar(30)", maxLength: 30, nullable: false),
ConfirmedAt = table.Column<DateTime>(type: "datetime2", nullable: true),
CancelledAt = table.Column<DateTime>(type: "datetime2", nullable: true),
CancellationReason = table.Column<string>(type: "nvarchar(500)", maxLength: 500, nullable: true),
CancelledBy = table.Column<string>(type: "nvarchar(20)", maxLength: 20, nullable: true),
CancellationPolicyCode = table.Column<string>(type: "nvarchar(50)", maxLength: 50, nullable: true),
CancellationRefundPercentage = table.Column<decimal>(type: "decimal(5,2)", precision: 5, scale: 2, nullable: true),
RefundableAmountIrr = table.Column<long>(type: "bigint", nullable: true),
CompletedAt = table.Column<DateTime>(type: "datetime2", nullable: true),
DisputeWindowEndsAt = table.Column<DateTime>(type: "datetime2", nullable: true),
DeletedAt = table.Column<DateTimeOffset>(type: "datetimeoffset", nullable: true),
CreatedAt = table.Column<DateTimeOffset>(type: "datetimeoffset", nullable: false),
ModifiedAt = table.Column<DateTimeOffset>(type: "datetimeoffset", nullable: true),
CreatedById = table.Column<int>(type: "int", nullable: true),
ModifiedById = table.Column<int>(type: "int", nullable: true)
},
constraints: table =>
{
table.PrimaryKey("PK_Bookings", x => x.Id);
table.CheckConstraint("CK_Bookings_AmountSplit", "[GrossPriceIrr] = [BalinyaarCommissionIrr] + [NursePayoutAmount] AND [GrossPriceIrr] >= 0 AND [BalinyaarCommissionIrr] >= 0 AND [NursePayoutAmount] >= 0");
table.ForeignKey(
name: "FK_Bookings_BookingRequests_BookingRequestId",
column: x => x.BookingRequestId,
principalSchema: "booking",
principalTable: "BookingRequests",
principalColumn: "Id",
onDelete: ReferentialAction.Restrict);
table.ForeignKey(
name: "FK_Bookings_CustomerAddresses_CustomerAddressId",
column: x => x.CustomerAddressId,
principalSchema: "usr",
principalTable: "CustomerAddresses",
principalColumn: "Id",
onDelete: ReferentialAction.Restrict);
table.ForeignKey(
name: "FK_Bookings_CustomerProfiles_CustomerId",
column: x => x.CustomerId,
principalSchema: "usr",
principalTable: "CustomerProfiles",
principalColumn: "Id",
onDelete: ReferentialAction.Restrict);
table.ForeignKey(
name: "FK_Bookings_NurseProfiles_NurseId",
column: x => x.NurseId,
principalSchema: "usr",
principalTable: "NurseProfiles",
principalColumn: "Id",
onDelete: ReferentialAction.Restrict);
table.ForeignKey(
name: "FK_Bookings_NurseServiceVariants_VariantId",
column: x => x.VariantId,
principalSchema: "catalog",
principalTable: "NurseServiceVariants",
principalColumn: "Id",
onDelete: ReferentialAction.Restrict);
table.ForeignKey(
name: "FK_Bookings_Patients_PatientId",
column: x => x.PatientId,
principalSchema: "usr",
principalTable: "Patients",
principalColumn: "Id",
onDelete: ReferentialAction.Restrict);
});
migrationBuilder.CreateTable(
name: "CancellationPolicies",
schema: "booking",
columns: table => new
{
Id = table.Column<long>(type: "bigint", nullable: false)
.Annotation("SqlServer:Identity", "1, 1"),
Code = table.Column<string>(type: "nvarchar(50)", maxLength: 50, nullable: false),
AppliesTo = table.Column<string>(type: "nvarchar(20)", maxLength: 20, nullable: false),
HoursBeforeStartMin = table.Column<int>(type: "int", nullable: true),
HoursBeforeStartMax = table.Column<int>(type: "int", nullable: true),
RefundPercentage = table.Column<decimal>(type: "decimal(5,2)", precision: 5, scale: 2, nullable: false),
FeeAmountIrr = table.Column<long>(type: "bigint", nullable: false),
FeeRate = table.Column<decimal>(type: "decimal(5,4)", precision: 5, scale: 4, nullable: true),
IsActive = table.Column<bool>(type: "bit", nullable: false),
DeletedAt = table.Column<DateTimeOffset>(type: "datetimeoffset", nullable: true),
CreatedAt = table.Column<DateTimeOffset>(type: "datetimeoffset", nullable: false),
ModifiedAt = table.Column<DateTimeOffset>(type: "datetimeoffset", nullable: true),
CreatedById = table.Column<int>(type: "int", nullable: true),
ModifiedById = table.Column<int>(type: "int", nullable: true)
},
constraints: table =>
{
table.PrimaryKey("PK_CancellationPolicies", x => x.Id);
});
migrationBuilder.CreateTable(
name: "BookingCareInstructions",
schema: "booking",
columns: table => new
{
Id = table.Column<long>(type: "bigint", nullable: false)
.Annotation("SqlServer:Identity", "1, 1"),
BookingId = table.Column<long>(type: "bigint", nullable: false),
CurrentConditions = table.Column<string>(type: "nvarchar(max)", nullable: true),
Medications = table.Column<string>(type: "nvarchar(max)", nullable: true),
Allergies = table.Column<string>(type: "nvarchar(max)", nullable: true),
SpecialInstructions = table.Column<string>(type: "nvarchar(max)", nullable: true),
EmergencyContactName = table.Column<string>(type: "nvarchar(max)", nullable: true),
EmergencyContactPhone = table.Column<string>(type: "nvarchar(max)", nullable: true),
DeletedAt = table.Column<DateTimeOffset>(type: "datetimeoffset", nullable: true),
CreatedAt = table.Column<DateTimeOffset>(type: "datetimeoffset", nullable: false),
ModifiedAt = table.Column<DateTimeOffset>(type: "datetimeoffset", nullable: true),
CreatedById = table.Column<int>(type: "int", nullable: true),
ModifiedById = table.Column<int>(type: "int", nullable: true)
},
constraints: table =>
{
table.PrimaryKey("PK_BookingCareInstructions", x => x.Id);
table.ForeignKey(
name: "FK_BookingCareInstructions_Bookings_BookingId",
column: x => x.BookingId,
principalSchema: "booking",
principalTable: "Bookings",
principalColumn: "Id",
onDelete: ReferentialAction.Restrict);
});
migrationBuilder.CreateTable(
name: "BookingSessions",
schema: "booking",
columns: table => new
{
Id = table.Column<long>(type: "bigint", nullable: false)
.Annotation("SqlServer:Identity", "1, 1"),
BookingId = table.Column<long>(type: "bigint", nullable: false),
SessionIndex = table.Column<int>(type: "int", nullable: false),
ScheduledDate = table.Column<DateOnly>(type: "date", nullable: false),
ScheduledTimeStart = table.Column<TimeOnly>(type: "time", nullable: false),
ScheduledTimeEnd = table.Column<TimeOnly>(type: "time", nullable: false),
VisitPayoutAmount = table.Column<long>(type: "bigint", nullable: false),
Status = table.Column<string>(type: "nvarchar(20)", maxLength: 20, nullable: false),
PayoutEligibleAt = table.Column<DateTime>(type: "datetime2", nullable: true),
CancellationEventId = table.Column<long>(type: "bigint", nullable: true),
DeletedAt = table.Column<DateTimeOffset>(type: "datetimeoffset", nullable: true),
CreatedAt = table.Column<DateTimeOffset>(type: "datetimeoffset", nullable: false),
ModifiedAt = table.Column<DateTimeOffset>(type: "datetimeoffset", nullable: true),
CreatedById = table.Column<int>(type: "int", nullable: true),
ModifiedById = table.Column<int>(type: "int", nullable: true)
},
constraints: table =>
{
table.PrimaryKey("PK_BookingSessions", x => x.Id);
table.ForeignKey(
name: "FK_BookingSessions_Bookings_BookingId",
column: x => x.BookingId,
principalSchema: "booking",
principalTable: "Bookings",
principalColumn: "Id",
onDelete: ReferentialAction.Restrict);
});
migrationBuilder.CreateTable(
name: "VisitVerifications",
schema: "booking",
columns: table => new
{
Id = table.Column<long>(type: "bigint", nullable: false)
.Annotation("SqlServer:Identity", "1, 1"),
BookingSessionId = table.Column<long>(type: "bigint", nullable: false),
CheckInAt = table.Column<DateTime>(type: "datetime2", nullable: true),
CheckInLat = table.Column<decimal>(type: "decimal(9,6)", precision: 9, scale: 6, nullable: true),
CheckInLng = table.Column<decimal>(type: "decimal(9,6)", precision: 9, scale: 6, nullable: true),
CheckOutAt = table.Column<DateTime>(type: "datetime2", nullable: true),
CheckOutLat = table.Column<decimal>(type: "decimal(9,6)", precision: 9, scale: 6, nullable: true),
CheckOutLng = table.Column<decimal>(type: "decimal(9,6)", precision: 9, scale: 6, nullable: true),
CheckInAddressMatch = table.Column<bool>(type: "bit", nullable: true),
CheckInDistanceMeters = table.Column<decimal>(type: "decimal(10,2)", precision: 10, scale: 2, nullable: true),
Status = table.Column<string>(type: "nvarchar(20)", maxLength: 20, nullable: false),
DeletedAt = table.Column<DateTimeOffset>(type: "datetimeoffset", nullable: true),
CreatedAt = table.Column<DateTimeOffset>(type: "datetimeoffset", nullable: false),
ModifiedAt = table.Column<DateTimeOffset>(type: "datetimeoffset", nullable: true),
CreatedById = table.Column<int>(type: "int", nullable: true),
ModifiedById = table.Column<int>(type: "int", nullable: true)
},
constraints: table =>
{
table.PrimaryKey("PK_VisitVerifications", x => x.Id);
table.ForeignKey(
name: "FK_VisitVerifications_BookingSessions_BookingSessionId",
column: x => x.BookingSessionId,
principalSchema: "booking",
principalTable: "BookingSessions",
principalColumn: "Id",
onDelete: ReferentialAction.Restrict);
});
migrationBuilder.InsertData(
schema: "booking",
table: "CancellationPolicies",
columns: new[] { "Id", "AppliesTo", "Code", "CreatedAt", "CreatedById", "DeletedAt", "FeeAmountIrr", "FeeRate", "HoursBeforeStartMax", "HoursBeforeStartMin", "IsActive", "ModifiedAt", "ModifiedById", "RefundPercentage" },
values: new object[,]
{
{ 1L, "customer", "standard_24h", new DateTimeOffset(new DateTime(2026, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified), new TimeSpan(0, 0, 0, 0, 0)), null, null, 0L, null, null, 24, true, null, null, 100m },
{ 2L, "customer", "standard_inside_24h", new DateTimeOffset(new DateTime(2026, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified), new TimeSpan(0, 0, 0, 0, 0)), null, null, 0L, null, 24, null, true, null, null, 50m },
{ 3L, "nurse", "nurse_no_show", new DateTimeOffset(new DateTime(2026, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified), new TimeSpan(0, 0, 0, 0, 0)), null, null, 0L, 0m, null, null, true, null, null, 100m },
{ 4L, "admin", "admin_cancellation", new DateTimeOffset(new DateTime(2026, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified), new TimeSpan(0, 0, 0, 0, 0)), null, null, 0L, null, null, null, true, null, null, 100m }
});
migrationBuilder.InsertData(
schema: "ops",
table: "PlatformConfigs",
columns: new[] { "Id", "CreatedAt", "CreatedById", "DataType", "Description", "Key", "ModifiedAt", "ModifiedById", "Value" },
values: new object[,]
{
{ 17L, new DateTimeOffset(new DateTime(2026, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified), new TimeSpan(0, 0, 0, 0, 0)), null, "int", "Minutes after a session's scheduled start with no EVV check-in before it is flagged a no-show.", "no_show_threshold_minutes", null, null, "60" },
{ 18L, new DateTimeOffset(new DateTime(2026, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified), new TimeSpan(0, 0, 0, 0, 0)), null, "int", "Hours between no-show sweeps (the scheduled cron is deferred; the sweep is admin-triggered today).", "no_show_scan_cadence_hours", null, null, "1" }
});
migrationBuilder.CreateIndex(
name: "IX_BookingCareInstructions_BookingId",
schema: "booking",
table: "BookingCareInstructions",
column: "BookingId",
unique: true);
migrationBuilder.CreateIndex(
name: "IX_Bookings_BookingRequestId",
schema: "booking",
table: "Bookings",
column: "BookingRequestId",
unique: true);
migrationBuilder.CreateIndex(
name: "IX_Bookings_CustomerAddressId",
schema: "booking",
table: "Bookings",
column: "CustomerAddressId");
migrationBuilder.CreateIndex(
name: "IX_Bookings_CustomerId_Status",
schema: "booking",
table: "Bookings",
columns: new[] { "CustomerId", "Status" });
migrationBuilder.CreateIndex(
name: "IX_Bookings_DisputeWindowEndsAt",
schema: "booking",
table: "Bookings",
column: "DisputeWindowEndsAt");
migrationBuilder.CreateIndex(
name: "IX_Bookings_NurseId_Status",
schema: "booking",
table: "Bookings",
columns: new[] { "NurseId", "Status" });
migrationBuilder.CreateIndex(
name: "IX_Bookings_PatientId",
schema: "booking",
table: "Bookings",
column: "PatientId");
migrationBuilder.CreateIndex(
name: "IX_Bookings_VariantId",
schema: "booking",
table: "Bookings",
column: "VariantId");
migrationBuilder.CreateIndex(
name: "IX_BookingSessions_BookingId_SessionIndex",
schema: "booking",
table: "BookingSessions",
columns: new[] { "BookingId", "SessionIndex" });
migrationBuilder.CreateIndex(
name: "IX_BookingSessions_Status_ScheduledDate",
schema: "booking",
table: "BookingSessions",
columns: new[] { "Status", "ScheduledDate" });
migrationBuilder.CreateIndex(
name: "IX_CancellationPolicies_AppliesTo_IsActive",
schema: "booking",
table: "CancellationPolicies",
columns: new[] { "AppliesTo", "IsActive" });
migrationBuilder.CreateIndex(
name: "IX_CancellationPolicies_Code",
schema: "booking",
table: "CancellationPolicies",
column: "Code",
unique: true);
migrationBuilder.CreateIndex(
name: "IX_VisitVerifications_BookingSessionId",
schema: "booking",
table: "VisitVerifications",
column: "BookingSessionId",
unique: true);
migrationBuilder.CreateIndex(
name: "IX_VisitVerifications_CheckInAddressMatch",
schema: "booking",
table: "VisitVerifications",
column: "CheckInAddressMatch");
}
/// <inheritdoc />
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropTable(
name: "BookingCareInstructions",
schema: "booking");
migrationBuilder.DropTable(
name: "CancellationPolicies",
schema: "booking");
migrationBuilder.DropTable(
name: "VisitVerifications",
schema: "booking");
migrationBuilder.DropTable(
name: "BookingSessions",
schema: "booking");
migrationBuilder.DropTable(
name: "Bookings",
schema: "booking");
migrationBuilder.DeleteData(
schema: "ops",
table: "PlatformConfigs",
keyColumn: "Id",
keyValue: 17L);
migrationBuilder.DeleteData(
schema: "ops",
table: "PlatformConfigs",
keyColumn: "Id",
keyValue: 18L);
}
}
}
@@ -98,6 +98,197 @@ namespace Baya.Infrastructure.Persistence.Migrations
b.ToTable("AuditLogs", "ops");
});
modelBuilder.Entity("Baya.Domain.Entities.Booking.Booking", b =>
{
b.Property<long>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("bigint");
SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<long>("Id"));
b.Property<string>("AddressSnapshotJson")
.IsRequired()
.HasColumnType("nvarchar(max)");
b.Property<long>("BalinyaarCommissionIrr")
.HasColumnType("bigint");
b.Property<long>("BookingRequestId")
.HasColumnType("bigint");
b.Property<string>("CancellationPolicyCode")
.HasMaxLength(50)
.HasColumnType("nvarchar(50)");
b.Property<string>("CancellationReason")
.HasMaxLength(500)
.HasColumnType("nvarchar(500)");
b.Property<decimal?>("CancellationRefundPercentage")
.HasPrecision(5, 2)
.HasColumnType("decimal(5,2)");
b.Property<DateTime?>("CancelledAt")
.HasColumnType("datetime2");
b.Property<string>("CancelledBy")
.HasMaxLength(20)
.HasColumnType("nvarchar(20)");
b.Property<DateTime?>("CompletedAt")
.HasColumnType("datetime2");
b.Property<DateTime?>("ConfirmedAt")
.HasColumnType("datetime2");
b.Property<DateTimeOffset>("CreatedAt")
.HasColumnType("datetimeoffset");
b.Property<int?>("CreatedById")
.HasColumnType("int");
b.Property<long>("CustomerAddressId")
.HasColumnType("bigint");
b.Property<long>("CustomerId")
.HasColumnType("bigint");
b.Property<DateTimeOffset?>("DeletedAt")
.HasColumnType("datetimeoffset");
b.Property<DateTime?>("DisputeWindowEndsAt")
.HasColumnType("datetime2");
b.Property<long>("GrossPriceIrr")
.HasColumnType("bigint");
b.Property<DateTimeOffset?>("ModifiedAt")
.HasColumnType("datetimeoffset");
b.Property<int?>("ModifiedById")
.HasColumnType("int");
b.Property<long>("NurseId")
.HasColumnType("bigint");
b.Property<long>("NursePayoutAmount")
.HasColumnType("bigint");
b.Property<long?>("PartnerCenterId")
.HasColumnType("bigint");
b.Property<long>("PatientId")
.HasColumnType("bigint");
b.Property<decimal>("PlatformFeeRate")
.HasPrecision(5, 4)
.HasColumnType("decimal(5,4)");
b.Property<long?>("PspFeeAmount")
.HasColumnType("bigint");
b.Property<long?>("RefundableAmountIrr")
.HasColumnType("bigint");
b.Property<DateOnly>("ScheduledDate")
.HasColumnType("date");
b.Property<TimeOnly>("ScheduledTimeEnd")
.HasColumnType("time");
b.Property<TimeOnly>("ScheduledTimeStart")
.HasColumnType("time");
b.Property<short>("SessionCount")
.HasColumnType("smallint");
b.Property<string>("Status")
.IsRequired()
.HasMaxLength(30)
.HasColumnType("nvarchar(30)");
b.Property<long>("VariantId")
.HasColumnType("bigint");
b.Property<string>("VariantSnapshotJson")
.IsRequired()
.HasColumnType("nvarchar(max)");
b.HasKey("Id");
b.HasIndex("BookingRequestId")
.IsUnique();
b.HasIndex("CustomerAddressId");
b.HasIndex("DisputeWindowEndsAt");
b.HasIndex("PatientId");
b.HasIndex("VariantId");
b.HasIndex("CustomerId", "Status");
b.HasIndex("NurseId", "Status");
b.ToTable("Bookings", "booking", t =>
{
t.HasCheckConstraint("CK_Bookings_AmountSplit", "[GrossPriceIrr] = [BalinyaarCommissionIrr] + [NursePayoutAmount] AND [GrossPriceIrr] >= 0 AND [BalinyaarCommissionIrr] >= 0 AND [NursePayoutAmount] >= 0");
});
});
modelBuilder.Entity("Baya.Domain.Entities.Booking.BookingCareInstruction", b =>
{
b.Property<long>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("bigint");
SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<long>("Id"));
b.Property<string>("Allergies")
.HasColumnType("nvarchar(max)");
b.Property<long>("BookingId")
.HasColumnType("bigint");
b.Property<DateTimeOffset>("CreatedAt")
.HasColumnType("datetimeoffset");
b.Property<int?>("CreatedById")
.HasColumnType("int");
b.Property<string>("CurrentConditions")
.HasColumnType("nvarchar(max)");
b.Property<DateTimeOffset?>("DeletedAt")
.HasColumnType("datetimeoffset");
b.Property<string>("EmergencyContactName")
.HasColumnType("nvarchar(max)");
b.Property<string>("EmergencyContactPhone")
.HasColumnType("nvarchar(max)");
b.Property<string>("Medications")
.HasColumnType("nvarchar(max)");
b.Property<DateTimeOffset?>("ModifiedAt")
.HasColumnType("datetimeoffset");
b.Property<int?>("ModifiedById")
.HasColumnType("int");
b.Property<string>("SpecialInstructions")
.HasColumnType("nvarchar(max)");
b.HasKey("Id");
b.HasIndex("BookingId")
.IsUnique();
b.ToTable("BookingCareInstructions", "booking");
});
modelBuilder.Entity("Baya.Domain.Entities.Booking.BookingRequest", b =>
{
b.Property<long>("Id")
@@ -187,6 +378,245 @@ namespace Baya.Infrastructure.Persistence.Migrations
b.ToTable("BookingRequests", "booking");
});
modelBuilder.Entity("Baya.Domain.Entities.Booking.BookingSession", b =>
{
b.Property<long>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("bigint");
SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<long>("Id"));
b.Property<long>("BookingId")
.HasColumnType("bigint");
b.Property<long?>("CancellationEventId")
.HasColumnType("bigint");
b.Property<DateTimeOffset>("CreatedAt")
.HasColumnType("datetimeoffset");
b.Property<int?>("CreatedById")
.HasColumnType("int");
b.Property<DateTimeOffset?>("DeletedAt")
.HasColumnType("datetimeoffset");
b.Property<DateTimeOffset?>("ModifiedAt")
.HasColumnType("datetimeoffset");
b.Property<int?>("ModifiedById")
.HasColumnType("int");
b.Property<DateTime?>("PayoutEligibleAt")
.HasColumnType("datetime2");
b.Property<DateOnly>("ScheduledDate")
.HasColumnType("date");
b.Property<TimeOnly>("ScheduledTimeEnd")
.HasColumnType("time");
b.Property<TimeOnly>("ScheduledTimeStart")
.HasColumnType("time");
b.Property<int>("SessionIndex")
.HasColumnType("int");
b.Property<string>("Status")
.IsRequired()
.HasMaxLength(20)
.HasColumnType("nvarchar(20)");
b.Property<long>("VisitPayoutAmount")
.HasColumnType("bigint");
b.HasKey("Id");
b.HasIndex("BookingId", "SessionIndex");
b.HasIndex("Status", "ScheduledDate");
b.ToTable("BookingSessions", "booking");
});
modelBuilder.Entity("Baya.Domain.Entities.Booking.CancellationPolicy", b =>
{
b.Property<long>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("bigint");
SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<long>("Id"));
b.Property<string>("AppliesTo")
.IsRequired()
.HasMaxLength(20)
.HasColumnType("nvarchar(20)");
b.Property<string>("Code")
.IsRequired()
.HasMaxLength(50)
.HasColumnType("nvarchar(50)");
b.Property<DateTimeOffset>("CreatedAt")
.HasColumnType("datetimeoffset");
b.Property<int?>("CreatedById")
.HasColumnType("int");
b.Property<DateTimeOffset?>("DeletedAt")
.HasColumnType("datetimeoffset");
b.Property<long>("FeeAmountIrr")
.HasColumnType("bigint");
b.Property<decimal?>("FeeRate")
.HasPrecision(5, 4)
.HasColumnType("decimal(5,4)");
b.Property<int?>("HoursBeforeStartMax")
.HasColumnType("int");
b.Property<int?>("HoursBeforeStartMin")
.HasColumnType("int");
b.Property<bool>("IsActive")
.HasColumnType("bit");
b.Property<DateTimeOffset?>("ModifiedAt")
.HasColumnType("datetimeoffset");
b.Property<int?>("ModifiedById")
.HasColumnType("int");
b.Property<decimal>("RefundPercentage")
.HasPrecision(5, 2)
.HasColumnType("decimal(5,2)");
b.HasKey("Id");
b.HasIndex("Code")
.IsUnique();
b.HasIndex("AppliesTo", "IsActive");
b.ToTable("CancellationPolicies", "booking");
b.HasData(
new
{
Id = 1L,
AppliesTo = "customer",
Code = "standard_24h",
CreatedAt = new DateTimeOffset(new DateTime(2026, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified), new TimeSpan(0, 0, 0, 0, 0)),
FeeAmountIrr = 0L,
HoursBeforeStartMin = 24,
IsActive = true,
RefundPercentage = 100m
},
new
{
Id = 2L,
AppliesTo = "customer",
Code = "standard_inside_24h",
CreatedAt = new DateTimeOffset(new DateTime(2026, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified), new TimeSpan(0, 0, 0, 0, 0)),
FeeAmountIrr = 0L,
HoursBeforeStartMax = 24,
IsActive = true,
RefundPercentage = 50m
},
new
{
Id = 3L,
AppliesTo = "nurse",
Code = "nurse_no_show",
CreatedAt = new DateTimeOffset(new DateTime(2026, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified), new TimeSpan(0, 0, 0, 0, 0)),
FeeAmountIrr = 0L,
FeeRate = 0m,
IsActive = true,
RefundPercentage = 100m
},
new
{
Id = 4L,
AppliesTo = "admin",
Code = "admin_cancellation",
CreatedAt = new DateTimeOffset(new DateTime(2026, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified), new TimeSpan(0, 0, 0, 0, 0)),
FeeAmountIrr = 0L,
IsActive = true,
RefundPercentage = 100m
});
});
modelBuilder.Entity("Baya.Domain.Entities.Booking.VisitVerification", b =>
{
b.Property<long>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("bigint");
SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<long>("Id"));
b.Property<long>("BookingSessionId")
.HasColumnType("bigint");
b.Property<bool?>("CheckInAddressMatch")
.HasColumnType("bit");
b.Property<DateTime?>("CheckInAt")
.HasColumnType("datetime2");
b.Property<decimal?>("CheckInDistanceMeters")
.HasPrecision(10, 2)
.HasColumnType("decimal(10,2)");
b.Property<decimal?>("CheckInLat")
.HasPrecision(9, 6)
.HasColumnType("decimal(9,6)");
b.Property<decimal?>("CheckInLng")
.HasPrecision(9, 6)
.HasColumnType("decimal(9,6)");
b.Property<DateTime?>("CheckOutAt")
.HasColumnType("datetime2");
b.Property<decimal?>("CheckOutLat")
.HasPrecision(9, 6)
.HasColumnType("decimal(9,6)");
b.Property<decimal?>("CheckOutLng")
.HasPrecision(9, 6)
.HasColumnType("decimal(9,6)");
b.Property<DateTimeOffset>("CreatedAt")
.HasColumnType("datetimeoffset");
b.Property<int?>("CreatedById")
.HasColumnType("int");
b.Property<DateTimeOffset?>("DeletedAt")
.HasColumnType("datetimeoffset");
b.Property<DateTimeOffset?>("ModifiedAt")
.HasColumnType("datetimeoffset");
b.Property<int?>("ModifiedById")
.HasColumnType("int");
b.Property<string>("Status")
.IsRequired()
.HasMaxLength(20)
.HasColumnType("nvarchar(20)");
b.HasKey("Id");
b.HasIndex("BookingSessionId")
.IsUnique();
b.HasIndex("CheckInAddressMatch");
b.ToTable("VisitVerifications", "booking");
});
modelBuilder.Entity("Baya.Domain.Entities.Catalog.NurseServiceVariant", b =>
{
b.Property<long>("Id")
@@ -707,6 +1137,24 @@ namespace Baya.Infrastructure.Persistence.Migrations
Description = "Hours between credential-expiry scans (the scheduled cron is deferred; the scan is admin-triggered today).",
Key = "verification_expiry_scan_cadence_hours",
Value = "24"
},
new
{
Id = 17L,
CreatedAt = new DateTimeOffset(new DateTime(2026, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified), new TimeSpan(0, 0, 0, 0, 0)),
DataType = "int",
Description = "Minutes after a session's scheduled start with no EVV check-in before it is flagged a no-show.",
Key = "no_show_threshold_minutes",
Value = "60"
},
new
{
Id = 18L,
CreatedAt = new DateTimeOffset(new DateTime(2026, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified), new TimeSpan(0, 0, 0, 0, 0)),
DataType = "int",
Description = "Hours between no-show sweeps (the scheduled cron is deferred; the sweep is admin-triggered today).",
Key = "no_show_scan_cadence_hours",
Value = "1"
});
});
@@ -3165,6 +3613,56 @@ namespace Baya.Infrastructure.Persistence.Migrations
.HasForeignKey("ActorUserId");
});
modelBuilder.Entity("Baya.Domain.Entities.Booking.Booking", b =>
{
b.HasOne("Baya.Domain.Entities.Booking.BookingRequest", null)
.WithOne()
.HasForeignKey("Baya.Domain.Entities.Booking.Booking", "BookingRequestId")
.OnDelete(DeleteBehavior.Restrict)
.IsRequired();
b.HasOne("Baya.Domain.Entities.Identity.CustomerAddress", null)
.WithMany()
.HasForeignKey("CustomerAddressId")
.OnDelete(DeleteBehavior.Restrict)
.IsRequired();
b.HasOne("Baya.Domain.Entities.Identity.CustomerProfile", null)
.WithMany()
.HasForeignKey("CustomerId")
.OnDelete(DeleteBehavior.Restrict)
.IsRequired();
b.HasOne("Baya.Domain.Entities.Identity.NurseProfile", null)
.WithMany()
.HasForeignKey("NurseId")
.OnDelete(DeleteBehavior.Restrict)
.IsRequired();
b.HasOne("Baya.Domain.Entities.Identity.Patient", null)
.WithMany()
.HasForeignKey("PatientId")
.OnDelete(DeleteBehavior.Restrict)
.IsRequired();
b.HasOne("Baya.Domain.Entities.Catalog.NurseServiceVariant", null)
.WithMany()
.HasForeignKey("VariantId")
.OnDelete(DeleteBehavior.Restrict)
.IsRequired();
});
modelBuilder.Entity("Baya.Domain.Entities.Booking.BookingCareInstruction", b =>
{
b.HasOne("Baya.Domain.Entities.Booking.Booking", "Booking")
.WithOne("CareInstructions")
.HasForeignKey("Baya.Domain.Entities.Booking.BookingCareInstruction", "BookingId")
.OnDelete(DeleteBehavior.Restrict)
.IsRequired();
b.Navigation("Booking");
});
modelBuilder.Entity("Baya.Domain.Entities.Booking.BookingRequest", b =>
{
b.HasOne("Baya.Domain.Entities.Identity.CustomerAddress", "CustomerAddress")
@@ -3208,6 +3706,28 @@ namespace Baya.Infrastructure.Persistence.Migrations
b.Navigation("Variant");
});
modelBuilder.Entity("Baya.Domain.Entities.Booking.BookingSession", b =>
{
b.HasOne("Baya.Domain.Entities.Booking.Booking", "Booking")
.WithMany("Sessions")
.HasForeignKey("BookingId")
.OnDelete(DeleteBehavior.Restrict)
.IsRequired();
b.Navigation("Booking");
});
modelBuilder.Entity("Baya.Domain.Entities.Booking.VisitVerification", b =>
{
b.HasOne("Baya.Domain.Entities.Booking.BookingSession", "Session")
.WithOne("Verification")
.HasForeignKey("Baya.Domain.Entities.Booking.VisitVerification", "BookingSessionId")
.OnDelete(DeleteBehavior.Restrict)
.IsRequired();
b.Navigation("Session");
});
modelBuilder.Entity("Baya.Domain.Entities.Catalog.NurseServiceVariant", b =>
{
b.HasOne("Baya.Domain.Entities.Identity.NurseProfile", "Nurse")
@@ -3578,6 +4098,18 @@ namespace Baya.Infrastructure.Persistence.Migrations
b.Navigation("StepType");
});
modelBuilder.Entity("Baya.Domain.Entities.Booking.Booking", b =>
{
b.Navigation("CareInstructions");
b.Navigation("Sessions");
});
modelBuilder.Entity("Baya.Domain.Entities.Booking.BookingSession", b =>
{
b.Navigation("Verification");
});
modelBuilder.Entity("Baya.Domain.Entities.Catalog.NurseServiceVariant", b =>
{
b.Navigation("Options");