Buchungsseite + Fancy Kalender

This commit is contained in:
Marc Wieland 2025-10-17 10:41:53 +02:00
parent de2c369350
commit 059218eb19
77 changed files with 1725 additions and 55 deletions

View File

@ -0,0 +1,139 @@
@page "/booking-entry"
@using OnProfNext.Client.Services
@using OnProfNext.Shared.Models.DTOs
@inject BookingApiService BookingService
@inject OrderApiService OrderService
@inject NavigationManager Navigation
<h3 class="mb-4 d-flex justify-content-between align-items-center">
<span class="text-primary">Zeit buchen</span>
<button class="btn btn-outline-secondary" @onclick="GoBack">
<i class="bi bi-arrow-left"></i> Zurück
</button>
</h3>
@if (isLoading)
{
<div class="text-center mt-5">
<div class="spinner-border text-primary" role="status"></div>
<p class="mt-3 text-secondary">Daten werden geladen...</p>
</div>
}
else if (errorMessage is not null)
{
<div class="alert alert-danger">@errorMessage</div>
}
else
{
<ul class="nav nav-tabs mb-3">
<li class="nav-item">
<button class="nav-link @(activeView == ViewType.Classic ? "active" : "")"
@onclick="() => activeView = ViewType.Classic">
<i class="bi bi-calendar-month me-1"></i> Klassische Ansicht
</button>
</li>
<li class="nav-item">
<button class="nav-link @(activeView == ViewType.Fancy ? "active" : "")"
@onclick="() => activeView = ViewType.Fancy">
<i class="bi bi-calendar-week me-1"></i> Fancy Ansicht
</button>
</li>
</ul>
<div class="tab-content p-3 border rounded bg-white shadow-sm">
@if (activeView == ViewType.Classic)
{
<ClassicView Bookings="MyBookings" Orders="AvailableOrders"
OnBookingCreated="ReloadBookings" OnError="ShowError" />
}
else
{
<FancyView Bookings="MyBookings" Orders="AvailableOrders"
OnBookingCreated="ReloadBookings" OnError="ShowError" />
}
</div>
}
@code {
private enum ViewType { Classic, Fancy }
private ViewType activeView = ViewType.Classic;
private bool isLoading = true;
private string? errorMessage;
private List<BookingDto> MyBookings = new();
private List<OrderDto> AvailableOrders = new();
protected override async Task OnInitializedAsync()
{
await LoadDataAsync();
isLoading = false;
}
private async Task LoadDataAsync()
{
try
{
// Lade Bookings des Users
var (bookingSuccess, bookings, bookingError) = await BookingService.GetMyBookingsAsync();
if (!bookingSuccess)
{
errorMessage = bookingError;
return;
}
MyBookings = bookings ?? new();
// Lade Orders des Users
var (orderSuccess, orders, orderError) = await OrderService.GetMyOrdersAsync();
if (!orderSuccess)
{
errorMessage = orderError;
return;
}
AvailableOrders = orders ?? new();
}
catch (Exception ex)
{
errorMessage = $"Fehler beim Laden der Daten: {ex.Message}";
}
}
private async Task ReloadBookings()
{
var (success, bookings, error) = await BookingService.GetMyBookingsAsync();
if (success)
{
MyBookings = bookings ?? new();
StateHasChanged();
}
else
{
errorMessage = error;
}
}
private void ShowError(string error)
{
errorMessage = error;
StateHasChanged();
}
private void GoBack() => Navigation.NavigateTo("/projects");
}
<style>
.nav-tabs .nav-link {
color: #495057;
border: none;
border-bottom: 3px solid transparent;
}
.nav-tabs .nav-link.active {
color: #0d6efd;
font-weight: 600;
border-color: #0d6efd;
background-color: transparent;
}
.tab-content {
border-radius: 0.5rem;
}
</style>

View File

@ -0,0 +1,209 @@
@using OnProfNext.Client.Services
@using OnProfNext.Shared.Models.DTOs
@inject BookingApiService BookingService
<div class="card shadow-sm border-0 mb-4">
<div class="card-body">
<div class="d-flex justify-content-between align-items-center mb-3">
<button class="btn btn-outline-primary" @onclick="PreviousMonth">
<i class="bi bi-chevron-left"></i> Vorheriger Monat
</button>
<h5 class="text-primary m-0">@CurrentMonth.ToString("MMMM yyyy")</h5>
<button class="btn btn-outline-primary" @onclick="NextMonth">
Nächster Monat <i class="bi bi-chevron-right"></i>
</button>
</div>
<div class="monthly-calendar">
<table class="table table-bordered text-center">
<thead class="table-light">
<tr>
<th>Mo</th>
<th>Di</th>
<th>Mi</th>
<th>Do</th>
<th>Fr</th>
<th>Sa</th>
<th>So</th>
</tr>
</thead>
<tbody>
@foreach (var week in GetCalendarWeeks())
{
<tr>
@foreach (var day in week)
{
<td class="@(day.Month == CurrentMonth.Month ? "" : "text-muted") @(IsWeekend(day) ? "weekend" : "")"
@onclick="() => OpenModal(day)">
@day.Day
<br />
<small class="@GetHoursColorClass(day)">@GetHoursForDay(day) h</small>
</td>
}
</tr>
}
</tbody>
</table>
</div>
</div>
</div>
@if (showModal)
{
<div class="modal fade show d-block" tabindex="-1" style="background-color: rgba(0,0,0,0.5);">
<div class="modal-dialog modal-dialog-centered" @onclick:stopPropagation>
<div class="modal-content border-0 shadow">
<div class="modal-header bg-primary text-white">
<h5 class="modal-title">Buchung für @selectedDate.ToString("dd.MM.yyyy")</h5>
<button type="button" class="btn-close btn-close-white" @onclick="CloseModal"></button>
</div>
<div class="modal-body">
<EditForm Model="newBooking" OnValidSubmit="SaveBookingAsync">
<DataAnnotationsValidator />
<ValidationSummary />
<div class="mb-3">
<label class="form-label">Auftrag</label>
<InputSelect class="form-select" @bind-Value="newBooking.OrderId">
<option value="0" disabled>Auswählen...</option>
@foreach (var order in Orders)
{
<option value="@order.Id">@order.Titel (@order.Auftragsnummer)</option>
}
</InputSelect>
</div>
<div class="mb-3">
<label class="form-label">Stunden</label>
<InputNumber class="form-control" @bind-Value="newBooking.Hours" />
</div>
<div class="mb-3">
<label class="form-label">Beschreibung</label>
<InputTextArea class="form-control" @bind-Value="newBooking.Description" />
</div>
<div class="d-flex justify-content-end">
<button type="button" class="btn btn-secondary me-2" @onclick="CloseModal">Abbrechen</button>
<button type="submit" class="btn btn-success">Speichern</button>
</div>
</EditForm>
</div>
</div>
</div>
</div>
}
@code {
[Parameter] public List<BookingDto> Bookings { get; set; } = new();
[Parameter] public List<OrderDto> Orders { get; set; } = new();
[Parameter] public EventCallback OnBookingCreated { get; set; }
[Parameter] public EventCallback<string> OnError { get; set; }
private DateTime CurrentMonth = DateTime.Today;
private bool showModal;
private DateTime selectedDate;
private BookingCreateDto newBooking = new();
private void PreviousMonth()
{
CurrentMonth = CurrentMonth.AddMonths(-1);
}
private void NextMonth()
{
CurrentMonth = CurrentMonth.AddMonths(1);
}
private List<DateTime[]> GetCalendarWeeks()
{
var weeks = new List<DateTime[]>();
var firstDayOfMonth = new DateTime(CurrentMonth.Year, CurrentMonth.Month, 1);
var firstMonday = firstDayOfMonth.AddDays(-(int)firstDayOfMonth.DayOfWeek + (firstDayOfMonth.DayOfWeek == DayOfWeek.Sunday ? 0 : 1));
var currentDay = firstMonday;
for (int weekCount = 0; weekCount < 6; weekCount++)
{
// Prüfe, ob currentDay noch im gültigen DateTime-Bereich liegt
if (currentDay.Year >= DateTime.MaxValue.Year)
break;
var week = new DateTime[7];
for (int i = 0; i < 7; i++)
{
week[i] = currentDay;
// Prüfe, ob das Hinzufügen eines Tages möglich ist
if (currentDay < DateTime.MaxValue.AddDays(-1))
currentDay = currentDay.AddDays(1);
else
break;
}
weeks.Add(week);
// Wenn currentDay nicht mehr incrementiert werden kann, beende die Schleife
if (currentDay >= DateTime.MaxValue.AddDays(-1))
break;
}
return weeks;
}
private bool IsWeekend(DateTime day)
{
return day.DayOfWeek == DayOfWeek.Saturday || day.DayOfWeek == DayOfWeek.Sunday;
}
private decimal GetHoursForDay(DateTime day)
{
return Bookings.Where(b => b.Date.Date == day.Date).Sum(b => b.Hours);
}
private string GetHoursColorClass(DateTime day)
{
var hours = GetHoursForDay(day);
if (hours >= 8)
return "text-success";
else if (hours > 6 && hours < 8)
return "text-warning";
else
return "text-danger";
}
private void OpenModal(DateTime date)
{
selectedDate = date;
newBooking = new() { Date = date, MandantId = 1 };
showModal = true;
}
private void CloseModal() => showModal = false;
private async Task SaveBookingAsync()
{
var (success, error) = await BookingService.CreateBookingAsync(newBooking);
if (success)
{
await OnBookingCreated.InvokeAsync();
CloseModal();
}
else
{
await OnError.InvokeAsync(error ?? "Fehler beim Speichern der Buchung.");
}
}
}
<style>
.monthly-calendar td {
cursor: pointer;
padding: 10px;
vertical-align: top;
height: 80px;
}
.monthly-calendar td:hover {
background-color: #f8f9fa;
}
.monthly-calendar td.weekend {
background-color: #f8f9fa;
}
</style>

View File

@ -0,0 +1,282 @@
@using OnProfNext.Client.Services
@using OnProfNext.Shared.Models.DTOs
@inject BookingApiService BookingService
@inject IJSRuntime JSRuntime
<div class="fancy-layout d-flex">
<div class="orders-sidebar card shadow-sm border-0 me-3" style="width: 250px;">
<div class="card-body">
<h5 class="text-primary mb-3">Verfügbare Aufträge</h5>
<div class="list-group">
@if (Orders == null || !Orders.Any())
{
<p class="text-muted">Keine Aufträge verfügbar</p>
}
else
{
@foreach (var order in Orders)
{
<div class="list-group-item list-group-item-action draggable-order"
draggable="true" @ondragstart="() => StartDrag(order.Id)">
@order.Titel (@order.Auftragsnummer)
</div>
}
}
</div>
</div>
</div>
<div class="week-calendar flex-grow-1">
<div class="d-flex justify-content-between align-items-center mb-3">
<button class="btn btn-outline-primary" @onclick="PreviousWeek">
<i class="bi bi-chevron-left"></i> Vorherige Woche
</button>
<h5 class="text-primary m-0">
Woche vom @CurrentWeekStart.ToString("dd.MM.yyyy") bis @CurrentWeekStart.AddDays(6).ToString("dd.MM.yyyy")
</h5>
<button class="btn btn-outline-primary" @onclick="NextWeek">
Nächste Woche <i class="bi bi-chevron-right"></i>
</button>
</div>
<table class="table table-bordered text-center">
<thead class="table-light">
<tr>
<th style="width: 80px;">Zeit</th>
@foreach (var day in WeekDays)
{
<th class="@(IsWeekend(day) ? "weekend" : "")">
@day.ToString("dd.MM") (@day.ToString("ddd"))
<br />
<small class="@GetHoursColorClass(day)">@GetHoursForDay(day) h</small>
</th>
}
</tr>
</thead>
<tbody>
@for (int hour = 8; hour <= 18; hour++)
{
var localHour = hour;
<tr>
<td>@localHour:00</td>
@foreach (var day in WeekDays)
{
var localDay = day;
<td class="@(IsWeekend(localDay) ? "weekend" : "")"
@ondrop="() => DropOnSlot(localDay, localHour)" @ondragover="AllowDrop"
style="height: 50px; position: relative;">
@foreach (var booking in GetBookingsForSlot(localDay, localHour))
{
<div class="booking-item bg-primary text-white p-1"
style="position: absolute; top: 0; left: 0; right: 0; height: @(booking.Hours * 50)px;"
title="@booking.OrderTitle: @booking.Hours h">
@booking.OrderTitle - @booking.Hours h
<button class="btn btn-sm btn-danger float-end"
@onclick="() => DeleteBooking(booking.Id)">
<i class="bi bi-trash"></i>
</button>
</div>
}
</td>
}
</tr>
}
</tbody>
</table>
</div>
</div>
@code {
[Parameter] public List<BookingDto>? Bookings { get; set; }
[Parameter] public List<OrderDto>? Orders { get; set; }
[Parameter] public EventCallback OnBookingCreated { get; set; }
[Parameter] public EventCallback<string> OnError { get; set; }
private DateTime CurrentWeekStart = DateTime.Today.AddDays(-(int)DateTime.Today.DayOfWeek + 1);
private List<DateTime> WeekDays => Enumerable.Range(0, 7).Select(d => CurrentWeekStart.AddDays(d)).ToList();
private int? draggedOrderId;
private void PreviousWeek()
{
if (CurrentWeekStart.Year > DateTime.MinValue.Year)
{
CurrentWeekStart = CurrentWeekStart.AddDays(-7);
StateHasChanged();
}
}
private void NextWeek()
{
if (CurrentWeekStart.Year < DateTime.MaxValue.Year)
{
CurrentWeekStart = CurrentWeekStart.AddDays(7);
StateHasChanged();
}
}
private void StartDrag(int orderId)
{
draggedOrderId = orderId;
Console.WriteLine($"Start drag for Order ID: {orderId}");
}
private async Task AllowDrop()
{
await JSRuntime.InvokeVoidAsync("onProfNext.preventDefault");
}
private async Task DropOnSlot(DateTime day, int hour)
{
if (draggedOrderId == null) return;
var bookingDate = new DateTime(day.Year, day.Month, day.Day, hour, 0, 0, DateTimeKind.Local);
Console.WriteLine($"Calculated booking date: {bookingDate.ToString("dd.MM.yyyy HH:mm")} (Kind: {bookingDate.Kind})");
var newBooking = new BookingCreateDto
{
OrderId = draggedOrderId.Value,
Date = bookingDate,
Hours = 1,
MandantId = 1
};
Console.WriteLine($"Sending to API: Date={newBooking.Date.ToString("dd.MM.yyyy HH:mm")} (Kind: {newBooking.Date.Kind})");
try
{
var (success, error) = await BookingService.CreateBookingAsync(newBooking);
if (success)
{
await OnBookingCreated.InvokeAsync();
Console.WriteLine("Booking created successfully.");
}
else
{
await OnError.InvokeAsync(error ?? "Fehler beim Erstellen der Buchung.");
Console.WriteLine($"API error: {error}");
}
}
catch (Exception ex)
{
await OnError.InvokeAsync($"Fehler beim Erstellen der Buchung: {ex.Message}");
Console.WriteLine($"Exception in DropOnSlot: {ex.Message}");
}
draggedOrderId = null;
}
private async Task DeleteBooking(int bookingId)
{
try
{
var (success, error) = await BookingService.DeleteBookingAsync(bookingId);
if (success)
{
await OnBookingCreated.InvokeAsync();
Console.WriteLine("Booking deleted successfully.");
}
else
{
await OnError.InvokeAsync(error ?? "Fehler beim Löschen der Buchung.");
Console.WriteLine($"API error: {error}");
}
}
catch (Exception ex)
{
await OnError.InvokeAsync($"Fehler beim Löschen der Buchung: {ex.Message}");
Console.WriteLine($"Exception in DeleteBooking: {ex.Message}");
}
}
private List<BookingDto> GetBookingsForSlot(DateTime day, int hour)
{
var bookings = Bookings?.Where(b => b.Date.Date == day.Date && b.Date.Hour == hour).ToList() ?? new();
if (bookings.Any())
{
Console.WriteLine($"Bookings for {day.ToString("dd.MM.yyyy")} {hour}:00: {bookings.Count}");
foreach (var booking in bookings)
{
Console.WriteLine($"Booking ID={booking.Id}, Date={booking.Date.ToString("dd.MM.yyyy HH:mm")}, Hours={booking.Hours}");
}
}
return bookings;
}
private bool IsWeekend(DateTime day)
{
return day.DayOfWeek == DayOfWeek.Saturday || day.DayOfWeek == DayOfWeek.Sunday;
}
private decimal GetHoursForDay(DateTime day)
{
var hours = Bookings?.Where(b => b.Date.Date == day.Date).Sum(b => b.Hours) ?? 0;
if (hours > 0)
{
Console.WriteLine($"Hours for {day.ToString("dd.MM.yyyy")}: {hours}");
}
return hours;
}
private string GetHoursColorClass(DateTime day)
{
var hours = GetHoursForDay(day);
if (hours >= 8)
return "text-success";
else if (hours > 6 && hours < 8)
return "text-warning";
else
return "text-danger";
}
}
<style>
.orders-sidebar {
min-width: 200px;
}
.draggable-order {
cursor: grab;
padding: 10px;
margin-bottom: 5px;
}
.week-calendar td {
vertical-align: top;
min-height: 50px;
position: relative;
}
.week-calendar th.weekend {
background-color: #f8f9fa;
}
.week-calendar td.weekend {
background-color: #f8f9fa;
}
.week-calendar td:hover {
background-color: #e9ecef;
}
.week-calendar td.weekend:hover {
background-color: #e2e6ea;
}
.booking-item {
border-radius: 4px;
margin: 2px;
font-size: 0.9em;
overflow: hidden;
}
.text-success {
font-weight: bold;
}
.text-warning {
font-weight: bold;
}
.text-danger {
font-weight: bold;
}
</style>

View File

@ -69,7 +69,7 @@
private void GoToBookings()
{
Nav.NavigateTo("/bookings");
Nav.NavigateTo("/booking-entry");
}
private void GoToAnalysis()

View File

@ -29,6 +29,10 @@ builder.Services.AddHttpClient<OrderApiService>(client =>
client.BaseAddress = new Uri("https://localhost:7271/");
}).AddHttpMessageHandler<AuthorizationMessageHandler>();
builder.Services.AddHttpClient<BookingApiService>(client =>
{
client.BaseAddress = new Uri("https://localhost:7271/");
}).AddHttpMessageHandler<AuthorizationMessageHandler>();
builder.Services.AddScoped(sp => new HttpClient
{

View File

@ -0,0 +1,104 @@
using OnProfNext.Shared.Models.DTOs;
using System.Net.Http.Json;
using System.Text.Json;
namespace OnProfNext.Client.Services
{
public class BookingApiService
{
private readonly HttpClient _httpClient;
public BookingApiService(HttpClient httpClient)
{
_httpClient = httpClient;
}
public async Task<(bool Success, List<BookingDto>? Data, string? Error)> GetMyBookingsAsync()
{
try
{
var bookings = await _httpClient.GetFromJsonAsync<List<BookingDto>>("api/bookings/mine");
Console.WriteLine($"Received bookings: {JsonSerializer.Serialize(bookings, new JsonSerializerOptions { WriteIndented = true })}");
return (true, bookings ?? new(), null);
}
catch (Exception ex)
{
return (false, null, $"Fehler beim Laden der Buchungen: {ex.Message}");
}
}
public async Task<(bool Success, List<BookingDto>? Data, string? Error)> GetBookingsByOrderAsync(int orderId)
{
try
{
var bookings = await _httpClient.GetFromJsonAsync<List<BookingDto>>($"api/bookings/byorder/{orderId}");
Console.WriteLine($"Received bookings for order {orderId}: {JsonSerializer.Serialize(bookings, new JsonSerializerOptions { WriteIndented = true })}");
return (true, bookings ?? new(), null);
}
catch (Exception ex)
{
return (false, null, $"Fehler beim Laden der Buchungen: {ex.Message}");
}
}
public async Task<(bool Success, string? Error)> CreateBookingAsync(BookingCreateDto dto)
{
try
{
// Explizite Serialisierung für Debugging
var jsonPayload = JsonSerializer.Serialize(new
{
dto.OrderId,
date = dto.Date.ToString("yyyy-MM-ddTHH:mm:ss"),
dto.Hours,
dto.MandantId,
dto.Description
}, new JsonSerializerOptions { PropertyNamingPolicy = JsonNamingPolicy.CamelCase });
Console.WriteLine($"Sending booking to API: {jsonPayload}");
var content = new StringContent(jsonPayload, System.Text.Encoding.UTF8, "application/json");
var response = await _httpClient.PostAsync("api/bookings", content);
if (response.IsSuccessStatusCode)
{
Console.WriteLine("Booking API call successful.");
return (true, null);
}
else
{
var errorContent = await response.Content.ReadAsStringAsync();
Console.WriteLine($"API error response: {errorContent}");
return (false, $"Fehler beim Speichern: {response.ReasonPhrase}");
}
}
catch (Exception ex)
{
Console.WriteLine($"Exception in CreateBookingAsync: {ex.Message}");
return (false, ex.Message);
}
}
public async Task<(bool Success, string? Error)> DeleteBookingAsync(int id)
{
try
{
var response = await _httpClient.DeleteAsync($"api/bookings/{id}");
if (response.IsSuccessStatusCode)
{
Console.WriteLine("Delete booking API call successful.");
return (true, null);
}
else
{
var errorContent = await response.Content.ReadAsStringAsync();
Console.WriteLine($"API error response: {errorContent}");
return (false, $"Fehler beim Löschen: {response.ReasonPhrase}");
}
}
catch (Exception ex)
{
Console.WriteLine($"Exception in DeleteBookingAsync: {ex.Message}");
return (false, ex.Message);
}
}
}
}

View File

@ -125,6 +125,23 @@ namespace OnProfNext.Client.Services
}
// In OrderApiService.cs
public async Task<(bool Success, List<OrderDto>? Data, string? Error)> GetMyOrdersAsync()
{
try
{
var orders = await _httpClient.GetFromJsonAsync<List<OrderDto>>("api/orders/mine");
return (true, orders ?? new List<OrderDto>(), null);
}
catch (Exception ex)
{
return (false, null, $"Fehler beim Laden der Aufträge: {ex.Message}");
}
}
}
}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1,7 +1,7 @@
{
"mainAssemblyName": "OnProfNext.Client",
"resources": {
"hash": "sha256-7KW3Qfm9CxYkbtb9+tRJYPyzmuj07fziiiVYwg4iZ/Y=",
"hash": "sha256-urElDnrJHnNHhcoIgh4qPQgw0DvL1p3uD2eDB4Wd3+M=",
"fingerprinting": {
"BlazorBootstrap.ym6tnrklwx.wasm": "BlazorBootstrap.wasm",
"Blazored.Typeahead.5g65vcuhxb.wasm": "Blazored.Typeahead.wasm",
@ -215,10 +215,10 @@
"icudt_CJK.tjcz0u77k5.dat": "icudt_CJK.dat",
"icudt_EFIGS.tptq2av103.dat": "icudt_EFIGS.dat",
"icudt_no_CJK.lfu7j35m59.dat": "icudt_no_CJK.dat",
"OnProfNext.Shared.ycdkuu8x8h.wasm": "OnProfNext.Shared.wasm",
"OnProfNext.Shared.bi3s6hw0ov.pdb": "OnProfNext.Shared.pdb",
"OnProfNext.Client.xxw7n209sx.wasm": "OnProfNext.Client.wasm",
"OnProfNext.Client.mwqxl9mbte.pdb": "OnProfNext.Client.pdb"
"OnProfNext.Shared.lyqfg82b63.wasm": "OnProfNext.Shared.wasm",
"OnProfNext.Shared.r9uf34g1jf.pdb": "OnProfNext.Shared.pdb",
"OnProfNext.Client.0dluezm643.wasm": "OnProfNext.Client.wasm",
"OnProfNext.Client.ape4q24e07.pdb": "OnProfNext.Client.pdb"
},
"jsModuleNative": {
"dotnet.native.9ih887ebfz.js": "sha256-oS7IRiQoVt9ThQ7Y2UM3XoeY0JqPD02cg9IvRdufn2w="
@ -442,12 +442,12 @@
"WindowsBase.vy2l5u79y6.wasm": "sha256-ufB9Mo5joMyUs3DzXWWBFFIZNEVrt6h9N5stYB6Oln4=",
"mscorlib.xd6mv31d55.wasm": "sha256-1YSLR2eZt3ceALFV//vZUF2AloxVil3VlrW1zZYPSEI=",
"netstandard.kaml52uspo.wasm": "sha256-HLEwBpLfzKw2/zGSVzHzFJxznCkt/WIjahrziiMrOpA=",
"OnProfNext.Shared.ycdkuu8x8h.wasm": "sha256-olapogpfRGpDGxXuzau/hIQ5o4cyZhq8h7xg3+iq8E4=",
"OnProfNext.Client.xxw7n209sx.wasm": "sha256-haEY6AqSymUCGlI0dfz7DhNA7AgCZibKuDrAYQRP8YA="
"OnProfNext.Shared.lyqfg82b63.wasm": "sha256-w7kYJP/DLlO8NXzgUXym1hiG2ch5+jRuO/UZ6krRm6w=",
"OnProfNext.Client.0dluezm643.wasm": "sha256-pOEBoGoioxlzoi9tDgJmWxFEJw9FAZpIlohDGRMcHvw="
},
"pdb": {
"OnProfNext.Shared.bi3s6hw0ov.pdb": "sha256-PVU32sYeYWTHZ/OZrfTWLqQEkEcm060yrjFwRiK7vs4=",
"OnProfNext.Client.mwqxl9mbte.pdb": "sha256-dh/Pyivioxp3QQaW9jirXIoZFcucZBQ24pD2oJva5IQ="
"OnProfNext.Shared.r9uf34g1jf.pdb": "sha256-AQbfy8ggW02znMrieOv1c4vomUo5cXk/ptky3fB99YI=",
"OnProfNext.Client.ape4q24e07.pdb": "sha256-knq9IhCJxfvepTeExvxDRJhO5nGuddjspkNtCOcBkIY="
}
},
"cacheBootResources": true,

View File

@ -13,7 +13,7 @@ using System.Reflection;
[assembly: System.Reflection.AssemblyCompanyAttribute("OnProfNext.Client")]
[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")]
[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")]
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+910ed8b8f84357d5f19f7be7f67be8f98b22e9c9")]
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+de2c3693508bfb15c93127034ea928d860f4ac56")]
[assembly: System.Reflection.AssemblyProductAttribute("OnProfNext.Client")]
[assembly: System.Reflection.AssemblyTitleAttribute("OnProfNext.Client")]
[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")]

View File

@ -1 +1 @@
23ad94e3cb51159ce56923b4c951a2f464f99f297debd052bd2c2b60700174d6
08aa3947a1274dbcd1ed8260838c173be7b9ae8231ae4f43fbcf8b894f4cc2ea

View File

@ -39,6 +39,18 @@ build_metadata.AdditionalFiles.CssScope =
build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xTaGFyZWRcUmVkaXJlY3RUb0xvZ2luLnJhem9y
build_metadata.AdditionalFiles.CssScope =
[C:/DEVQPDC/Proj2/OnProfNext/OnProfNext.Client/Pages/Bookings/BookingEntry.razor]
build_metadata.AdditionalFiles.TargetPath = UGFnZXNcQm9va2luZ3NcQm9va2luZ0VudHJ5LnJhem9y
build_metadata.AdditionalFiles.CssScope =
[C:/DEVQPDC/Proj2/OnProfNext/OnProfNext.Client/Pages/Bookings/ClassicView.razor]
build_metadata.AdditionalFiles.TargetPath = UGFnZXNcQm9va2luZ3NcQ2xhc3NpY1ZpZXcucmF6b3I=
build_metadata.AdditionalFiles.CssScope =
[C:/DEVQPDC/Proj2/OnProfNext/OnProfNext.Client/Pages/Bookings/FancyView.razor]
build_metadata.AdditionalFiles.TargetPath = UGFnZXNcQm9va2luZ3NcRmFuY3lWaWV3LnJhem9y
build_metadata.AdditionalFiles.CssScope =
[C:/DEVQPDC/Proj2/OnProfNext/OnProfNext.Client/Pages/Component.razor]
build_metadata.AdditionalFiles.TargetPath = UGFnZXNcQ29tcG9uZW50LnJhem9y
build_metadata.AdditionalFiles.CssScope =

View File

@ -1 +1 @@
b0b466ffbae46d8d02c9d283d2f26aafd6ee7de33cb9196e648f9e322f4b5669
50f06df8b13f05293ac10043b87476aa4a048151949bf50c4255adb1c0e403ae

View File

@ -1130,7 +1130,6 @@ C:\DEVQPDC\Proj2\OnProfNext\OnProfNext.Client\obj\Debug\net9.0\compressed\36w3eu
C:\DEVQPDC\Proj2\OnProfNext\OnProfNext.Client\obj\Debug\net9.0\compressed\mfzx4sb2rv-79hai7knhw.gz
C:\DEVQPDC\Proj2\OnProfNext\OnProfNext.Client\obj\Debug\net9.0\compressed\eojifsclv0-7t9tbfaemk.gz
C:\DEVQPDC\Proj2\OnProfNext\OnProfNext.Client\obj\Debug\net9.0\compressed\m2wv0pszba-ym6tnrklwx.gz
C:\DEVQPDC\Proj2\OnProfNext\OnProfNext.Client\obj\Debug\net9.0\compressed\9988w5h4ds-d03dgo8viw.gz
C:\DEVQPDC\Proj2\OnProfNext\OnProfNext.Client\bin\Debug\net9.0\wwwroot\_framework\Blazored.Typeahead.5g65vcuhxb.wasm
C:\DEVQPDC\Proj2\OnProfNext\OnProfNext.Client\bin\Debug\net9.0\wwwroot\_framework\Microsoft.Extensions.Localization.Abstractions.o4jp2hcm79.wasm
C:\DEVQPDC\Proj2\OnProfNext\OnProfNext.Client\bin\Debug\net9.0\wwwroot\_framework\Microsoft.Extensions.Localization.bvn14pws96.wasm
@ -1159,16 +1158,19 @@ C:\DEVQPDC\Proj2\OnProfNext\OnProfNext.Client\obj\Debug\net9.0\scopedcss\Compone
C:\DEVQPDC\Proj2\OnProfNext\OnProfNext.Client\obj\Debug\net9.0\scopedcss\Components\Layout\NavMenu.razor.rz.scp.css
C:\DEVQPDC\Proj2\OnProfNext\OnProfNext.Client\obj\Debug\net9.0\compressed\cmx4u86mij-jq0bgzcoc4.gz
C:\DEVQPDC\Proj2\OnProfNext\OnProfNext.Client\obj\Debug\net9.0\compressed\b3tztoi1cm-ob0l47m3ye.gz
C:\DEVQPDC\Proj2\OnProfNext\OnProfNext.Client\bin\Debug\net9.0\wwwroot\_framework\OnProfNext.Client.mwqxl9mbte.pdb
C:\DEVQPDC\Proj2\OnProfNext\OnProfNext.Client\bin\Debug\net9.0\wwwroot\_framework\OnProfNext.Client.xxw7n209sx.wasm
C:\DEVQPDC\Proj2\OnProfNext\OnProfNext.Client\bin\Debug\net9.0\wwwroot\_framework\OnProfNext.Shared.bi3s6hw0ov.pdb
C:\DEVQPDC\Proj2\OnProfNext\OnProfNext.Client\bin\Debug\net9.0\wwwroot\_framework\OnProfNext.Shared.ycdkuu8x8h.wasm
C:\DEVQPDC\Proj2\OnProfNext\OnProfNext.Client\bin\Debug\net9.0\wwwroot\_framework\OnProfNext.Client.mwqxl9mbte.pdb.gz
C:\DEVQPDC\Proj2\OnProfNext\OnProfNext.Client\bin\Debug\net9.0\wwwroot\_framework\OnProfNext.Client.xxw7n209sx.wasm.gz
C:\DEVQPDC\Proj2\OnProfNext\OnProfNext.Client\bin\Debug\net9.0\wwwroot\_framework\OnProfNext.Shared.ycdkuu8x8h.wasm.gz
C:\DEVQPDC\Proj2\OnProfNext\OnProfNext.Client\bin\Debug\net9.0\wwwroot\_framework\OnProfNext.Shared.bi3s6hw0ov.pdb.gz
C:\DEVQPDC\Proj2\OnProfNext\OnProfNext.Client\obj\Debug\net9.0\compressed\kzp5jtqdfd-ycdkuu8x8h.gz
C:\DEVQPDC\Proj2\OnProfNext\OnProfNext.Client\obj\Debug\net9.0\compressed\po7udqtwl2-bi3s6hw0ov.gz
C:\DEVQPDC\Proj2\OnProfNext\OnProfNext.Client\obj\Debug\net9.0\compressed\cez1jk5yrk-xxw7n209sx.gz
C:\DEVQPDC\Proj2\OnProfNext\OnProfNext.Client\obj\Debug\net9.0\compressed\b9lx0cbjbg-mwqxl9mbte.gz
C:\DEVQPDC\Proj2\OnProfNext\OnProfNext.Client\obj\Debug\net9.0\compressed\xzgxwa2yd7-2n5b5i9hx5.gz
C:\DEVQPDC\Proj2\OnProfNext\OnProfNext.Client\obj\Debug\net9.0\compressed\eb56ryutr6-wfgcz1v7r2.gz
C:\DEVQPDC\Proj2\OnProfNext\OnProfNext.Client\obj\Debug\net9.0\compressed\9988w5h4ds-804ig5h2xb.gz
C:\DEVQPDC\Proj2\OnProfNext\OnProfNext.Client\obj\Debug\net9.0\compressed\yyex9setpd-oxan0pzjgj.gz
C:\DEVQPDC\Proj2\OnProfNext\OnProfNext.Client\bin\Debug\net9.0\wwwroot\_framework\OnProfNext.Shared.r9uf34g1jf.pdb
C:\DEVQPDC\Proj2\OnProfNext\OnProfNext.Client\bin\Debug\net9.0\wwwroot\_framework\OnProfNext.Shared.lyqfg82b63.wasm
C:\DEVQPDC\Proj2\OnProfNext\OnProfNext.Client\bin\Debug\net9.0\wwwroot\_framework\OnProfNext.Shared.lyqfg82b63.wasm.gz
C:\DEVQPDC\Proj2\OnProfNext\OnProfNext.Client\bin\Debug\net9.0\wwwroot\_framework\OnProfNext.Shared.r9uf34g1jf.pdb.gz
C:\DEVQPDC\Proj2\OnProfNext\OnProfNext.Client\obj\Debug\net9.0\compressed\kzp5jtqdfd-lyqfg82b63.gz
C:\DEVQPDC\Proj2\OnProfNext\OnProfNext.Client\obj\Debug\net9.0\compressed\po7udqtwl2-r9uf34g1jf.gz
C:\DEVQPDC\Proj2\OnProfNext\OnProfNext.Client\bin\Debug\net9.0\wwwroot\_framework\OnProfNext.Client.ape4q24e07.pdb
C:\DEVQPDC\Proj2\OnProfNext\OnProfNext.Client\bin\Debug\net9.0\wwwroot\_framework\OnProfNext.Client.0dluezm643.wasm
C:\DEVQPDC\Proj2\OnProfNext\OnProfNext.Client\bin\Debug\net9.0\wwwroot\_framework\OnProfNext.Client.ape4q24e07.pdb.gz
C:\DEVQPDC\Proj2\OnProfNext\OnProfNext.Client\bin\Debug\net9.0\wwwroot\_framework\OnProfNext.Client.0dluezm643.wasm.gz
C:\DEVQPDC\Proj2\OnProfNext\OnProfNext.Client\obj\Debug\net9.0\compressed\cez1jk5yrk-0dluezm643.gz
C:\DEVQPDC\Proj2\OnProfNext\OnProfNext.Client\obj\Debug\net9.0\compressed\b9lx0cbjbg-ape4q24e07.gz
C:\DEVQPDC\Proj2\OnProfNext\OnProfNext.Client\obj\Debug\net9.0\compressed\xzgxwa2yd7-n8izp0ydfq.gz

View File

@ -1,7 +1,7 @@
{
"mainAssemblyName": "OnProfNext.Client",
"resources": {
"hash": "sha256-7KW3Qfm9CxYkbtb9+tRJYPyzmuj07fziiiVYwg4iZ/Y=",
"hash": "sha256-urElDnrJHnNHhcoIgh4qPQgw0DvL1p3uD2eDB4Wd3+M=",
"fingerprinting": {
"BlazorBootstrap.ym6tnrklwx.wasm": "BlazorBootstrap.wasm",
"Blazored.Typeahead.5g65vcuhxb.wasm": "Blazored.Typeahead.wasm",
@ -215,10 +215,10 @@
"icudt_CJK.tjcz0u77k5.dat": "icudt_CJK.dat",
"icudt_EFIGS.tptq2av103.dat": "icudt_EFIGS.dat",
"icudt_no_CJK.lfu7j35m59.dat": "icudt_no_CJK.dat",
"OnProfNext.Shared.ycdkuu8x8h.wasm": "OnProfNext.Shared.wasm",
"OnProfNext.Shared.bi3s6hw0ov.pdb": "OnProfNext.Shared.pdb",
"OnProfNext.Client.xxw7n209sx.wasm": "OnProfNext.Client.wasm",
"OnProfNext.Client.mwqxl9mbte.pdb": "OnProfNext.Client.pdb"
"OnProfNext.Shared.lyqfg82b63.wasm": "OnProfNext.Shared.wasm",
"OnProfNext.Shared.r9uf34g1jf.pdb": "OnProfNext.Shared.pdb",
"OnProfNext.Client.0dluezm643.wasm": "OnProfNext.Client.wasm",
"OnProfNext.Client.ape4q24e07.pdb": "OnProfNext.Client.pdb"
},
"jsModuleNative": {
"dotnet.native.9ih887ebfz.js": "sha256-oS7IRiQoVt9ThQ7Y2UM3XoeY0JqPD02cg9IvRdufn2w="
@ -442,12 +442,12 @@
"WindowsBase.vy2l5u79y6.wasm": "sha256-ufB9Mo5joMyUs3DzXWWBFFIZNEVrt6h9N5stYB6Oln4=",
"mscorlib.xd6mv31d55.wasm": "sha256-1YSLR2eZt3ceALFV//vZUF2AloxVil3VlrW1zZYPSEI=",
"netstandard.kaml52uspo.wasm": "sha256-HLEwBpLfzKw2/zGSVzHzFJxznCkt/WIjahrziiMrOpA=",
"OnProfNext.Shared.ycdkuu8x8h.wasm": "sha256-olapogpfRGpDGxXuzau/hIQ5o4cyZhq8h7xg3+iq8E4=",
"OnProfNext.Client.xxw7n209sx.wasm": "sha256-haEY6AqSymUCGlI0dfz7DhNA7AgCZibKuDrAYQRP8YA="
"OnProfNext.Shared.lyqfg82b63.wasm": "sha256-w7kYJP/DLlO8NXzgUXym1hiG2ch5+jRuO/UZ6krRm6w=",
"OnProfNext.Client.0dluezm643.wasm": "sha256-pOEBoGoioxlzoi9tDgJmWxFEJw9FAZpIlohDGRMcHvw="
},
"pdb": {
"OnProfNext.Shared.bi3s6hw0ov.pdb": "sha256-PVU32sYeYWTHZ/OZrfTWLqQEkEcm060yrjFwRiK7vs4=",
"OnProfNext.Client.mwqxl9mbte.pdb": "sha256-dh/Pyivioxp3QQaW9jirXIoZFcucZBQ24pD2oJva5IQ="
"OnProfNext.Shared.r9uf34g1jf.pdb": "sha256-AQbfy8ggW02znMrieOv1c4vomUo5cXk/ptky3fB99YI=",
"OnProfNext.Client.ape4q24e07.pdb": "sha256-knq9IhCJxfvepTeExvxDRJhO5nGuddjspkNtCOcBkIY="
}
},
"cacheBootResources": true,

File diff suppressed because one or more lines are too long

View File

@ -1 +1 @@
{"GlobalPropertiesHash":"mM8eeq7khgiV1Ho7QUmOpk+VtYcA7aET/3LQ1YVdmDk=","FingerprintPatternsHash":"8ZRc1sGeVrPBx4lD717BgRaQekyh78QKV9SKsdt638U=","PropertyOverridesHash":"R7Rea/YQmcweqCbKffD9oUelggfpJQX85r65aYZsas0=","InputHashes":["C0eOV9gOfsDqwL4SXmPo6JNLJCydTRLhkcoGopWE9zQ=","vH/H9umpzRku3bgc\u002BiW4S4uDtfRsbDxcDhLs2PsS30Q=","7WZ82wMbbKcJw5Bzbb6647eKVFT/bZswI1Tk5t/ft5c=","ic5b/oaCLRQ\u002BvimSCWMq87l01yIcHTPJx4IuEZbLqrQ=","1e6daLPfiNZ0xKyqXPZvlwnXNr5eNjSY9c8Z3RnpvOs=","DZJCRz9YgqDdyZ\u002B/alouUKBy2KmMsXUiWCxebbKZcLY=","vWEBwblz5Jyt6V3p5EhyGwNxk3wMO63rfUkzfFOe3Co=","C9OcPNxT/zZbgwoL1WFZpq/GpBvLVPp8hPakIqiapo4=","Kx8ACKSK3MtMAbYi7KCFurKiYppxi7vo\u002BEhh02NZdzQ=","yxPUUzlxTy4BFltCWE3KIA\u002BWyQYUg/IIzcE3ijpMcYA=","ImICJyEJwrMtMlwpdR3TUm1zynu8xRKgqQt/SKRWgb0=","TjgCDOh\u002B6hXrsF/SShk3ow5T50/kMKkKCND23t3bb\u002BE=","e9PcF/sfWnqLkh3xeQ7K0Y4jCrIxSFd3uA1X1PFIM5I=","Btp7jyWETg/2eqdAkcMf9vwDjYzaNjWz3CqRvFY2M/Y=","ceaaFJWn2DLR\u002BtltiUns0zSUqZdF95jtCiE8BsA8jCk=","HcuvE7OIR66cL63FjKUiVO27/7jyrWAkalbBFAty5\u002BY=","DLbhHN0wNZ5TZTU/daLOgA6HIQdIppdZ\u002B3ix\u002Bs0q00A=","h/xl0jd8/ccKraqSbuHrqHDKWlgX6yEhialHDeLi9Iw=","IWYbnI783m87kixei3nIgUzSgOSdvDKjZB7TBy1gZnw=","s580H7QKmm/8JfqJ1qQutyar6VmBZ2AS0yK3JBkUhEU=","cjzijXWkKx5xmzo7UM2\u002B\u002BlKHuiTCUBC6DbZKzZzvXRc=","y/HHWIq4FmFCjw1i5XGnkQFK9XF2josRhuQY2UApulw=","JsDoy0qI9Uyk0tJTn0NDNkmt4UmamBvAatx4XlfUC7o=","CvbWU7Giprnv46eIMwfS2bczbDe733bXEYIdjr9jRnc=","Q2XlrbHGFatJOngyPfc6Zcrv1B67MTXKJ\u002BIDqO25R00=","c814YcgxmsuSE3XnK1Nq1Hpb/DSHdHv707R8\u002BsMQUbw=","Tx7xdcxtqfZTa7P9vSMOGgAjrEUDs6YGz/BCDc9zoGs=","qhVXZuy2nCiZw2Uis/Ugu\u002BiclH4afrFxFZCNa2yxE74=","OSAu0TIFhkdeb0xVLS6et8a4aUHkzeUWk3v3s\u002BUn/Y8=","gQojZbGh9zdA6sHRPQKxtDLqvqsJtMNWSvtPxM60tlk=","ue76wb7ZOtUAF2M1UT3LzQtfATbywtmhro/\u002BDVQFo2E=","ujshobx1Okba2\u002BKCptByJRdUhAjHCnL7OEilWHSxvSE=","IMLMtCoq94G/iom6Kc9QnMjl26QBzo9A\u002BUpe\u002Bir5hSk=","cKIyhiSlhxBTpm0tfQp0N73HmTJ0PSk6OasdMHHU6hg=","5/pQTkPDIDKVOIdLIr8K2pqUMYjedXEDzrx/8i2FyMc=","ie4elz0/Yt0Jor8ZOASn7uqtUMQVIIi7iyxpmc\u002BP/3A=","/eDlK\u002BJ5ECzHYnnwNfs1ll7OzscxHc/T9AXptg3xTII=","iZtB7IwVOScbKME8XNDUHe8/LADtOuBuD5iUzZ\u002BTBHA=","VI7hpNtzA0lQFbtSBh2M5HmTFjxD4uLPevcNJtBDECY=","vpPBvnXuysK0e8FBbSO7k6I35HOVZLmZfMhVxlKPzck=","hdgfzdMO3XxPwCGNKDabyl/9YRagIr9KXozaMve1DE4=","4UP6pofGTsyh1E5XO2QVGfORoUAttdjUWvf1A4Mgngw=","AuV7BOj9roSnoQn4CCZRgJiQ9aP\u002Buuc3FxUaAtL4FUk=","3KIGpeODnLLCBrAStJV1hHEo7FwY/hgl7zW1wNeg/Wc=","a2NEK0jnyneLb7plUPbXxhY8oQ9LD9Lc35UnzZUXwJI=","B2ua8h4cGI1Vv8qhyD7sFVXpbxEgmYZbecw9dY4/rFA=","sp9HgH8YqRbHdraJhNz5JJIDCLSscO457uul374ES4I=","wMHpeMWv1hOAkS9kqsiqEALVMDdWAsC3p85glRB/FqI=","/KUhUbxyo/3Nrk2MhF57PAEu8wbud9Cg8Bp1MbxsxoA=","2DvTDD9FORsb164IPm6/PKUGfxUsYAOheM6lMXeQcuQ="],"CachedAssets":{},"CachedCopyCandidates":{}}
{"GlobalPropertiesHash":"mM8eeq7khgiV1Ho7QUmOpk+VtYcA7aET/3LQ1YVdmDk=","FingerprintPatternsHash":"8ZRc1sGeVrPBx4lD717BgRaQekyh78QKV9SKsdt638U=","PropertyOverridesHash":"R7Rea/YQmcweqCbKffD9oUelggfpJQX85r65aYZsas0=","InputHashes":["C0eOV9gOfsDqwL4SXmPo6JNLJCydTRLhkcoGopWE9zQ=","vH/H9umpzRku3bgc\u002BiW4S4uDtfRsbDxcDhLs2PsS30Q=","7WZ82wMbbKcJw5Bzbb6647eKVFT/bZswI1Tk5t/ft5c=","STdNBMOgbym9plIqVfeTQ5bMv4lCD2PqmCxFkhEIveY=","1e6daLPfiNZ0xKyqXPZvlwnXNr5eNjSY9c8Z3RnpvOs=","usnoV0rd/ueHPT6Pi8sOt97KMDrhrYfd19DwaKRbZLY=","DZJCRz9YgqDdyZ\u002B/alouUKBy2KmMsXUiWCxebbKZcLY=","vWEBwblz5Jyt6V3p5EhyGwNxk3wMO63rfUkzfFOe3Co=","C9OcPNxT/zZbgwoL1WFZpq/GpBvLVPp8hPakIqiapo4=","Kx8ACKSK3MtMAbYi7KCFurKiYppxi7vo\u002BEhh02NZdzQ=","yxPUUzlxTy4BFltCWE3KIA\u002BWyQYUg/IIzcE3ijpMcYA=","ImICJyEJwrMtMlwpdR3TUm1zynu8xRKgqQt/SKRWgb0=","TjgCDOh\u002B6hXrsF/SShk3ow5T50/kMKkKCND23t3bb\u002BE=","e9PcF/sfWnqLkh3xeQ7K0Y4jCrIxSFd3uA1X1PFIM5I=","Btp7jyWETg/2eqdAkcMf9vwDjYzaNjWz3CqRvFY2M/Y=","ceaaFJWn2DLR\u002BtltiUns0zSUqZdF95jtCiE8BsA8jCk=","HcuvE7OIR66cL63FjKUiVO27/7jyrWAkalbBFAty5\u002BY=","DLbhHN0wNZ5TZTU/daLOgA6HIQdIppdZ\u002B3ix\u002Bs0q00A=","h/xl0jd8/ccKraqSbuHrqHDKWlgX6yEhialHDeLi9Iw=","IWYbnI783m87kixei3nIgUzSgOSdvDKjZB7TBy1gZnw=","s580H7QKmm/8JfqJ1qQutyar6VmBZ2AS0yK3JBkUhEU=","cjzijXWkKx5xmzo7UM2\u002B\u002BlKHuiTCUBC6DbZKzZzvXRc=","y/HHWIq4FmFCjw1i5XGnkQFK9XF2josRhuQY2UApulw=","JsDoy0qI9Uyk0tJTn0NDNkmt4UmamBvAatx4XlfUC7o=","CvbWU7Giprnv46eIMwfS2bczbDe733bXEYIdjr9jRnc=","Q2XlrbHGFatJOngyPfc6Zcrv1B67MTXKJ\u002BIDqO25R00=","c814YcgxmsuSE3XnK1Nq1Hpb/DSHdHv707R8\u002BsMQUbw=","Tx7xdcxtqfZTa7P9vSMOGgAjrEUDs6YGz/BCDc9zoGs=","qhVXZuy2nCiZw2Uis/Ugu\u002BiclH4afrFxFZCNa2yxE74=","OSAu0TIFhkdeb0xVLS6et8a4aUHkzeUWk3v3s\u002BUn/Y8=","gQojZbGh9zdA6sHRPQKxtDLqvqsJtMNWSvtPxM60tlk=","ue76wb7ZOtUAF2M1UT3LzQtfATbywtmhro/\u002BDVQFo2E=","ujshobx1Okba2\u002BKCptByJRdUhAjHCnL7OEilWHSxvSE=","IMLMtCoq94G/iom6Kc9QnMjl26QBzo9A\u002BUpe\u002Bir5hSk=","cKIyhiSlhxBTpm0tfQp0N73HmTJ0PSk6OasdMHHU6hg=","5/pQTkPDIDKVOIdLIr8K2pqUMYjedXEDzrx/8i2FyMc=","ie4elz0/Yt0Jor8ZOASn7uqtUMQVIIi7iyxpmc\u002BP/3A=","/eDlK\u002BJ5ECzHYnnwNfs1ll7OzscxHc/T9AXptg3xTII=","iZtB7IwVOScbKME8XNDUHe8/LADtOuBuD5iUzZ\u002BTBHA=","VI7hpNtzA0lQFbtSBh2M5HmTFjxD4uLPevcNJtBDECY=","vpPBvnXuysK0e8FBbSO7k6I35HOVZLmZfMhVxlKPzck=","hdgfzdMO3XxPwCGNKDabyl/9YRagIr9KXozaMve1DE4=","4UP6pofGTsyh1E5XO2QVGfORoUAttdjUWvf1A4Mgngw=","AuV7BOj9roSnoQn4CCZRgJiQ9aP\u002Buuc3FxUaAtL4FUk=","3KIGpeODnLLCBrAStJV1hHEo7FwY/hgl7zW1wNeg/Wc=","a2NEK0jnyneLb7plUPbXxhY8oQ9LD9Lc35UnzZUXwJI=","2DvTDD9FORsb164IPm6/PKUGfxUsYAOheM6lMXeQcuQ=","B2ua8h4cGI1Vv8qhyD7sFVXpbxEgmYZbecw9dY4/rFA=","sp9HgH8YqRbHdraJhNz5JJIDCLSscO457uul374ES4I=","wMHpeMWv1hOAkS9kqsiqEALVMDdWAsC3p85glRB/FqI=","/KUhUbxyo/3Nrk2MhF57PAEu8wbud9Cg8Bp1MbxsxoA=","Xz7qwBV8mKNupyCnNDp6b\u002BbbCDqQIuiz/hLvV6WeHmw="],"CachedAssets":{},"CachedCopyCandidates":{}}

View File

@ -1 +1 @@
{"GlobalPropertiesHash":"HQrK/c2YdUjsysKaYGSoybSEyDguxRws1HNGGkzNr68=","FingerprintPatternsHash":"8ZRc1sGeVrPBx4lD717BgRaQekyh78QKV9SKsdt638U=","PropertyOverridesHash":"8ZRc1sGeVrPBx4lD717BgRaQekyh78QKV9SKsdt638U=","InputHashes":["wMWPZGfJtGeKkPw89r\u002BuOnYPKqx9sEcbqVKHPoYpTbg=","puDy0dzI5QvIsFKrWO6hrkZZcZnbTNSWaBqIyd5vS9E=","bNNyXhlBr3jQbNMkCOe8xcZdSkB7XoUpSNnehjUQlxA=","3Q171G9uNkjZ3lAgJDZDLi2eJw/8ixjkaHrw3rOC/vo=","TDAOXjznXPMZY6da8pxBF7r\u002BgikX9nuv6RoxA3r\u002BE1M=","HwFAFTSvCp26cdo1kx5ecfdA/\u002BXAkxgIq5fu6m8nIA0=","SHr5eqYzJxZNE5/PlzkQfEBMjakT5PcfDexn2iCZjyI=","rovhGZeu5lwGm9t06s1govZ9ZDUAyhGquT/zYxV9EMA=","n90/VXHLh5f/b\u002BenXJx5LvC2wVhxMsmGXsKTtLP1rGE=","M2F\u002BdirWJXRBR8xTEBUsBQq5ZBlMsGLrQuDu2Xoflo8=","QQfqB2d2lyRaoRCXHlFI1qDyAV8sb3YBC6sabNep4T8=","sCLTILGPMYZmM4Cq6VeXFDRKEU4zUeqi0zh34Zyl1\u002Bg=","KPtl\u002BIcYzJanv3TdGEjfu/58zjjSte7onQyK1z2UpSs=","UOD2algC0YxakRPAo\u002BdHBxw2nz\u002Bf3inCW8K/2sYv4hk=","2a4AqN7uSgiGGPijKrbGYp3zTiFaYviYMC4je9251Gg=","S1JDFpdG6oeT7HQg1q6p3OLFEq6MSuMk9DrbZZf85U0=","FcAp\u002BB\u002BMdtU4Jqt1qd8ZU0XGQCyIO1UaSwwwKyFcuRI=","KicT\u002BJLs/7POfopY2e6knubWrx25hvaxJ1zNKezbz9Y=","xL7/ma/CChAYqsGMi59uK6yIstcESmcirrh1RzpvMEw=","dnRdnpQc61NJ56ASQrUFLZkDTGNM0KNu\u002BtR3NDDE34A=","Grv4g6vNrL73s12N910v2w8Bfa5b3fgn3knYM4SPbTo=","biFvXP\u002Bh3VCB//g0WfQTKnZXpYAq5NNK8FOtNrSlluc=","JbXwwQIUN/GSNZKsNiMjv4ebWU2SviyhnVdlqdpCpmg=","nz\u002BZycBj/r0qxn/lLFHWJ8J6wFGlMsV/1mlRmZUo/4I=","aQycidQhGUbn4VCw/EJfF5iFRrN1xIgwHoIJjbOVZps=","qgUM6A/uKHiUkWc1/Ln9WXX1SAX8JoRvV74Ma6ZFmng=","iKkyE9MQsJaeQ\u002BwNmzP/yqlnE0DgDcGv\u002BmjdLoDxrRo=","uTVPNnHOvOCd/yTop9dVCWOMKn4tFTh\u002B\u002BvDB36ISZPs=","mfZpFq\u002BvCmodLP7zO9b0YsEWC/OcDyBoxhYqFD56fFk=","YWOs7JAKIsqIOVQG0w8okz7vUzx0CLjYsgFSeEvd8dY=","mhyeOUDBL5xq9Rlm12fZKRW\u002BewVdAloH3HpGO\u002B7GqeM=","dwYRUoBX6sjNOpgOukCSK6FYozMx5nQPuanV9jF0pug=","ozbr8RdoOPcWGZFTphPnXiPHqUXsUX48rNHT9DPxQQQ=","zNy/\u002Beenwd4rP3KmszLj/P9L4RfeJcIG51tiUMGKZUI=","JqnKg76tBTEDi4ygNmSbT8906THHzJuCJTZbK0K6Oe8=","JcACn0ymzW4JpJ5CgWCxT1NdaSHZxnxp\u002BAiJJM/kC6k=","k71DltJbtRqVXA3rGahMZgUq0B9sodbz2R43hsUcD1I=","aouiJcQV84ezpO9Cwpg\u002BId9XaiZVlGhgxGvxD6PaAGM=","b/Jk0Mr/B4BWzcJa6nZHbXC\u002BzU0I1a30M2AcH5fdjKY=","aK2OxKAVYxUxIEDqZnknDAW9qelpdYKLvlGPA3\u002B5OIE=","E4QT\u002B435PZZ\u002BRTzgvECRD1bOtElnkqeWREaoDzYrMdc=","FBxckgU98gb7vgTEM5V4Q\u002BEWV1Ztcp3Bssbx92n1keA=","gv3iSaKsj0CmcWFWMhUhYcA7l4\u002BnVTp1Jj85xAmbA8E=","mRQfJZfYrp6FVuPsI1970i6\u002Bg1zC7cMX1qaaf5X\u002BoCQ=","5BtfX2AAiOmDTGL34icHscY4eUpH3nbfHN/rb4e62rY=","6rueZEktdPrxLkoO8WfJXCckClsIUsg6sBnN1LTessM=","SZJz\u002B71xnWFevxgzVgPPCqih4KkGwhQhHvoh6BgiWFc=","u2aOXUOrTOrwIgVam12G9HzaU7QEbOQG66Q7IDjlMYY=","8DlE0XjBA/lhOGHaXiPZ5cQswwpo6NEUaebI9my2F4s=","1ldijbG/u6m3Wwq0OUgI3unhWdjWhqvOD\u002BI1PauI9GI=","WtqR0aLtM7t6m3NDyJiTfyz81jhBwyuQkg/iDou5f/k=","aNqGJzJ5xa0dNxSytzanVzqK6xNl85ZkIZfdb\u002BKhxHY=","TpcHV4OB3FaN8hILgTJGBWj6cGx2APNuu6cH90cA2Yw=","y2O\u002BMtvYW\u002BJsiXwnsSGokrtLoPU1BZKq/Rs6jBLWkBA=","XfkTfnoOOODr5Ke\u002BIvlGksb7y1tdjO9D3cio6nfgb6o=","sbScjs7uLbfBbWbJKERtvGeL8se13w0V5s0ufS/zDaQ=","9hC0wthPXB9k40lIbDKdWYtaw2axqBb91\u002BojeVYtTEY=","xLFIqNnTxWnQP99MmbgJqozQM9NzpZ0mMYZdGkZnBU4=","qOlED1ak4sYSTrFn1g6Y7mnsz3UFQEQ/RV3qKJGx0DQ=","Ijp03RBmTBHzhcCv1Sg/aWUghcNgib2sblPmYlOuDYk=","HCsDlEON4uTuZHQ/mLhoZSnOhDE/0YmD0\u002BPzbGk55jk=","DIlQgc8O3Rampq4\u002BuAU34qvAhOQ76ih6rEWZRuXbpGs=","87pLnLY3BRAM5qVJkJZ6NFQjQse85QaOsaRqbVei3f8=","gb5K/PglhYNjQ6udVditV5mmWe8pBL0bkbfqmDZJR3Q=","c//884XNSMx2fHCDDouqzztU4ZLBdyPK5IazFjEu3xg=","A5FwpPfGidgr2NgPt1ofZxg2nxXAcuozNEFd9BE7nsk="],"CachedAssets":{},"CachedCopyCandidates":{}}
{"GlobalPropertiesHash":"HQrK/c2YdUjsysKaYGSoybSEyDguxRws1HNGGkzNr68=","FingerprintPatternsHash":"8ZRc1sGeVrPBx4lD717BgRaQekyh78QKV9SKsdt638U=","PropertyOverridesHash":"8ZRc1sGeVrPBx4lD717BgRaQekyh78QKV9SKsdt638U=","InputHashes":["wMWPZGfJtGeKkPw89r\u002BuOnYPKqx9sEcbqVKHPoYpTbg=","puDy0dzI5QvIsFKrWO6hrkZZcZnbTNSWaBqIyd5vS9E=","bNNyXhlBr3jQbNMkCOe8xcZdSkB7XoUpSNnehjUQlxA=","e00HwqbAs5\u002BQP/isIc/1wdQEkEVLrYL4mZkRFgflGxc=","/pGZ5Ne8ls0AltJgWOhL5Yc9\u002BzFbkQwUFLLaEuzhySM=","TDAOXjznXPMZY6da8pxBF7r\u002BgikX9nuv6RoxA3r\u002BE1M=","PAgoRnO8hSCWHTmmLUrKojqhvOGsbhB9PUCqEOnuYrg=","HwFAFTSvCp26cdo1kx5ecfdA/\u002BXAkxgIq5fu6m8nIA0=","SHr5eqYzJxZNE5/PlzkQfEBMjakT5PcfDexn2iCZjyI=","rovhGZeu5lwGm9t06s1govZ9ZDUAyhGquT/zYxV9EMA=","n90/VXHLh5f/b\u002BenXJx5LvC2wVhxMsmGXsKTtLP1rGE=","M2F\u002BdirWJXRBR8xTEBUsBQq5ZBlMsGLrQuDu2Xoflo8=","QQfqB2d2lyRaoRCXHlFI1qDyAV8sb3YBC6sabNep4T8=","sCLTILGPMYZmM4Cq6VeXFDRKEU4zUeqi0zh34Zyl1\u002Bg=","KPtl\u002BIcYzJanv3TdGEjfu/58zjjSte7onQyK1z2UpSs=","UOD2algC0YxakRPAo\u002BdHBxw2nz\u002Bf3inCW8K/2sYv4hk=","2a4AqN7uSgiGGPijKrbGYp3zTiFaYviYMC4je9251Gg=","S1JDFpdG6oeT7HQg1q6p3OLFEq6MSuMk9DrbZZf85U0=","FcAp\u002BB\u002BMdtU4Jqt1qd8ZU0XGQCyIO1UaSwwwKyFcuRI=","KicT\u002BJLs/7POfopY2e6knubWrx25hvaxJ1zNKezbz9Y=","xL7/ma/CChAYqsGMi59uK6yIstcESmcirrh1RzpvMEw=","dnRdnpQc61NJ56ASQrUFLZkDTGNM0KNu\u002BtR3NDDE34A=","Grv4g6vNrL73s12N910v2w8Bfa5b3fgn3knYM4SPbTo=","biFvXP\u002Bh3VCB//g0WfQTKnZXpYAq5NNK8FOtNrSlluc=","JbXwwQIUN/GSNZKsNiMjv4ebWU2SviyhnVdlqdpCpmg=","nz\u002BZycBj/r0qxn/lLFHWJ8J6wFGlMsV/1mlRmZUo/4I=","aQycidQhGUbn4VCw/EJfF5iFRrN1xIgwHoIJjbOVZps=","qgUM6A/uKHiUkWc1/Ln9WXX1SAX8JoRvV74Ma6ZFmng=","iKkyE9MQsJaeQ\u002BwNmzP/yqlnE0DgDcGv\u002BmjdLoDxrRo=","uTVPNnHOvOCd/yTop9dVCWOMKn4tFTh\u002B\u002BvDB36ISZPs=","mfZpFq\u002BvCmodLP7zO9b0YsEWC/OcDyBoxhYqFD56fFk=","YWOs7JAKIsqIOVQG0w8okz7vUzx0CLjYsgFSeEvd8dY=","mhyeOUDBL5xq9Rlm12fZKRW\u002BewVdAloH3HpGO\u002B7GqeM=","dwYRUoBX6sjNOpgOukCSK6FYozMx5nQPuanV9jF0pug=","ozbr8RdoOPcWGZFTphPnXiPHqUXsUX48rNHT9DPxQQQ=","zNy/\u002Beenwd4rP3KmszLj/P9L4RfeJcIG51tiUMGKZUI=","JqnKg76tBTEDi4ygNmSbT8906THHzJuCJTZbK0K6Oe8=","JcACn0ymzW4JpJ5CgWCxT1NdaSHZxnxp\u002BAiJJM/kC6k=","k71DltJbtRqVXA3rGahMZgUq0B9sodbz2R43hsUcD1I=","aouiJcQV84ezpO9Cwpg\u002BId9XaiZVlGhgxGvxD6PaAGM=","b/Jk0Mr/B4BWzcJa6nZHbXC\u002BzU0I1a30M2AcH5fdjKY=","aK2OxKAVYxUxIEDqZnknDAW9qelpdYKLvlGPA3\u002B5OIE=","E4QT\u002B435PZZ\u002BRTzgvECRD1bOtElnkqeWREaoDzYrMdc=","FBxckgU98gb7vgTEM5V4Q\u002BEWV1Ztcp3Bssbx92n1keA=","gv3iSaKsj0CmcWFWMhUhYcA7l4\u002BnVTp1Jj85xAmbA8E=","mRQfJZfYrp6FVuPsI1970i6\u002Bg1zC7cMX1qaaf5X\u002BoCQ=","5BtfX2AAiOmDTGL34icHscY4eUpH3nbfHN/rb4e62rY=","6rueZEktdPrxLkoO8WfJXCckClsIUsg6sBnN1LTessM=","SZJz\u002B71xnWFevxgzVgPPCqih4KkGwhQhHvoh6BgiWFc=","u2aOXUOrTOrwIgVam12G9HzaU7QEbOQG66Q7IDjlMYY=","8DlE0XjBA/lhOGHaXiPZ5cQswwpo6NEUaebI9my2F4s=","1ldijbG/u6m3Wwq0OUgI3unhWdjWhqvOD\u002BI1PauI9GI=","WtqR0aLtM7t6m3NDyJiTfyz81jhBwyuQkg/iDou5f/k=","aNqGJzJ5xa0dNxSytzanVzqK6xNl85ZkIZfdb\u002BKhxHY=","TpcHV4OB3FaN8hILgTJGBWj6cGx2APNuu6cH90cA2Yw=","y2O\u002BMtvYW\u002BJsiXwnsSGokrtLoPU1BZKq/Rs6jBLWkBA=","XfkTfnoOOODr5Ke\u002BIvlGksb7y1tdjO9D3cio6nfgb6o=","wcROe0zOlvSplfU1neaBc6O9UQx0shY6TJh9t2ZSBYs=","10qLnXFiRep12dfNyKPtD4BUjDi86nt7iUeaDRzdFFg=","Aq6Wb82cwzIR34t\u002BKjNx2Bsbl4xPKot/OiCPUr8NcaA=","sbScjs7uLbfBbWbJKERtvGeL8se13w0V5s0ufS/zDaQ=","9hC0wthPXB9k40lIbDKdWYtaw2axqBb91\u002BojeVYtTEY=","oHrJ\u002Blbd6RhXKDeATc8FabZLEDUjbHWnd18rZBRbNBE=","qOlED1ak4sYSTrFn1g6Y7mnsz3UFQEQ/RV3qKJGx0DQ=","bkU1JrXkWH3R/7pZTq912KiH0qHTMuWrKp6\u002B3V8nWE0=","HCsDlEON4uTuZHQ/mLhoZSnOhDE/0YmD0\u002BPzbGk55jk=","DIlQgc8O3Rampq4\u002BuAU34qvAhOQ76ih6rEWZRuXbpGs=","87pLnLY3BRAM5qVJkJZ6NFQjQse85QaOsaRqbVei3f8=","gb5K/PglhYNjQ6udVditV5mmWe8pBL0bkbfqmDZJR3Q=","c//884XNSMx2fHCDDouqzztU4ZLBdyPK5IazFjEu3xg=","A5FwpPfGidgr2NgPt1ofZxg2nxXAcuozNEFd9BE7nsk="],"CachedAssets":{},"CachedCopyCandidates":{}}

View File

@ -1 +1 @@
{"GlobalPropertiesHash":"Q5kcht8XOSaXwErDHawVS9gd2nNuRy7EEG55Mop5u7E=","FingerprintPatternsHash":"8ZRc1sGeVrPBx4lD717BgRaQekyh78QKV9SKsdt638U=","PropertyOverridesHash":"8ZRc1sGeVrPBx4lD717BgRaQekyh78QKV9SKsdt638U=","InputHashes":["wMWPZGfJtGeKkPw89r\u002BuOnYPKqx9sEcbqVKHPoYpTbg=","puDy0dzI5QvIsFKrWO6hrkZZcZnbTNSWaBqIyd5vS9E=","bNNyXhlBr3jQbNMkCOe8xcZdSkB7XoUpSNnehjUQlxA=","3Q171G9uNkjZ3lAgJDZDLi2eJw/8ixjkaHrw3rOC/vo=","TDAOXjznXPMZY6da8pxBF7r\u002BgikX9nuv6RoxA3r\u002BE1M=","HwFAFTSvCp26cdo1kx5ecfdA/\u002BXAkxgIq5fu6m8nIA0=","SHr5eqYzJxZNE5/PlzkQfEBMjakT5PcfDexn2iCZjyI=","rovhGZeu5lwGm9t06s1govZ9ZDUAyhGquT/zYxV9EMA=","n90/VXHLh5f/b\u002BenXJx5LvC2wVhxMsmGXsKTtLP1rGE=","M2F\u002BdirWJXRBR8xTEBUsBQq5ZBlMsGLrQuDu2Xoflo8=","QQfqB2d2lyRaoRCXHlFI1qDyAV8sb3YBC6sabNep4T8=","sCLTILGPMYZmM4Cq6VeXFDRKEU4zUeqi0zh34Zyl1\u002Bg=","KPtl\u002BIcYzJanv3TdGEjfu/58zjjSte7onQyK1z2UpSs=","UOD2algC0YxakRPAo\u002BdHBxw2nz\u002Bf3inCW8K/2sYv4hk=","2a4AqN7uSgiGGPijKrbGYp3zTiFaYviYMC4je9251Gg=","S1JDFpdG6oeT7HQg1q6p3OLFEq6MSuMk9DrbZZf85U0=","FcAp\u002BB\u002BMdtU4Jqt1qd8ZU0XGQCyIO1UaSwwwKyFcuRI=","KicT\u002BJLs/7POfopY2e6knubWrx25hvaxJ1zNKezbz9Y=","xL7/ma/CChAYqsGMi59uK6yIstcESmcirrh1RzpvMEw=","dnRdnpQc61NJ56ASQrUFLZkDTGNM0KNu\u002BtR3NDDE34A=","Grv4g6vNrL73s12N910v2w8Bfa5b3fgn3knYM4SPbTo=","biFvXP\u002Bh3VCB//g0WfQTKnZXpYAq5NNK8FOtNrSlluc=","JbXwwQIUN/GSNZKsNiMjv4ebWU2SviyhnVdlqdpCpmg=","nz\u002BZycBj/r0qxn/lLFHWJ8J6wFGlMsV/1mlRmZUo/4I=","aQycidQhGUbn4VCw/EJfF5iFRrN1xIgwHoIJjbOVZps=","qgUM6A/uKHiUkWc1/Ln9WXX1SAX8JoRvV74Ma6ZFmng=","iKkyE9MQsJaeQ\u002BwNmzP/yqlnE0DgDcGv\u002BmjdLoDxrRo=","uTVPNnHOvOCd/yTop9dVCWOMKn4tFTh\u002B\u002BvDB36ISZPs=","mfZpFq\u002BvCmodLP7zO9b0YsEWC/OcDyBoxhYqFD56fFk=","YWOs7JAKIsqIOVQG0w8okz7vUzx0CLjYsgFSeEvd8dY=","mhyeOUDBL5xq9Rlm12fZKRW\u002BewVdAloH3HpGO\u002B7GqeM=","dwYRUoBX6sjNOpgOukCSK6FYozMx5nQPuanV9jF0pug=","ozbr8RdoOPcWGZFTphPnXiPHqUXsUX48rNHT9DPxQQQ=","zNy/\u002Beenwd4rP3KmszLj/P9L4RfeJcIG51tiUMGKZUI=","JqnKg76tBTEDi4ygNmSbT8906THHzJuCJTZbK0K6Oe8=","JcACn0ymzW4JpJ5CgWCxT1NdaSHZxnxp\u002BAiJJM/kC6k=","k71DltJbtRqVXA3rGahMZgUq0B9sodbz2R43hsUcD1I=","aouiJcQV84ezpO9Cwpg\u002BId9XaiZVlGhgxGvxD6PaAGM=","b/Jk0Mr/B4BWzcJa6nZHbXC\u002BzU0I1a30M2AcH5fdjKY=","aK2OxKAVYxUxIEDqZnknDAW9qelpdYKLvlGPA3\u002B5OIE=","E4QT\u002B435PZZ\u002BRTzgvECRD1bOtElnkqeWREaoDzYrMdc=","FBxckgU98gb7vgTEM5V4Q\u002BEWV1Ztcp3Bssbx92n1keA=","gv3iSaKsj0CmcWFWMhUhYcA7l4\u002BnVTp1Jj85xAmbA8E=","mRQfJZfYrp6FVuPsI1970i6\u002Bg1zC7cMX1qaaf5X\u002BoCQ=","5BtfX2AAiOmDTGL34icHscY4eUpH3nbfHN/rb4e62rY=","6rueZEktdPrxLkoO8WfJXCckClsIUsg6sBnN1LTessM=","SZJz\u002B71xnWFevxgzVgPPCqih4KkGwhQhHvoh6BgiWFc=","u2aOXUOrTOrwIgVam12G9HzaU7QEbOQG66Q7IDjlMYY=","8DlE0XjBA/lhOGHaXiPZ5cQswwpo6NEUaebI9my2F4s=","1ldijbG/u6m3Wwq0OUgI3unhWdjWhqvOD\u002BI1PauI9GI=","WtqR0aLtM7t6m3NDyJiTfyz81jhBwyuQkg/iDou5f/k=","aNqGJzJ5xa0dNxSytzanVzqK6xNl85ZkIZfdb\u002BKhxHY=","TpcHV4OB3FaN8hILgTJGBWj6cGx2APNuu6cH90cA2Yw=","y2O\u002BMtvYW\u002BJsiXwnsSGokrtLoPU1BZKq/Rs6jBLWkBA=","XfkTfnoOOODr5Ke\u002BIvlGksb7y1tdjO9D3cio6nfgb6o=","sbScjs7uLbfBbWbJKERtvGeL8se13w0V5s0ufS/zDaQ=","9hC0wthPXB9k40lIbDKdWYtaw2axqBb91\u002BojeVYtTEY=","xLFIqNnTxWnQP99MmbgJqozQM9NzpZ0mMYZdGkZnBU4=","qOlED1ak4sYSTrFn1g6Y7mnsz3UFQEQ/RV3qKJGx0DQ=","Ijp03RBmTBHzhcCv1Sg/aWUghcNgib2sblPmYlOuDYk=","HCsDlEON4uTuZHQ/mLhoZSnOhDE/0YmD0\u002BPzbGk55jk=","DIlQgc8O3Rampq4\u002BuAU34qvAhOQ76ih6rEWZRuXbpGs=","87pLnLY3BRAM5qVJkJZ6NFQjQse85QaOsaRqbVei3f8=","gb5K/PglhYNjQ6udVditV5mmWe8pBL0bkbfqmDZJR3Q=","c//884XNSMx2fHCDDouqzztU4ZLBdyPK5IazFjEu3xg=","A5FwpPfGidgr2NgPt1ofZxg2nxXAcuozNEFd9BE7nsk="],"CachedAssets":{},"CachedCopyCandidates":{}}
{"GlobalPropertiesHash":"Q5kcht8XOSaXwErDHawVS9gd2nNuRy7EEG55Mop5u7E=","FingerprintPatternsHash":"8ZRc1sGeVrPBx4lD717BgRaQekyh78QKV9SKsdt638U=","PropertyOverridesHash":"8ZRc1sGeVrPBx4lD717BgRaQekyh78QKV9SKsdt638U=","InputHashes":["wMWPZGfJtGeKkPw89r\u002BuOnYPKqx9sEcbqVKHPoYpTbg=","puDy0dzI5QvIsFKrWO6hrkZZcZnbTNSWaBqIyd5vS9E=","bNNyXhlBr3jQbNMkCOe8xcZdSkB7XoUpSNnehjUQlxA=","e00HwqbAs5\u002BQP/isIc/1wdQEkEVLrYL4mZkRFgflGxc=","/pGZ5Ne8ls0AltJgWOhL5Yc9\u002BzFbkQwUFLLaEuzhySM=","TDAOXjznXPMZY6da8pxBF7r\u002BgikX9nuv6RoxA3r\u002BE1M=","PAgoRnO8hSCWHTmmLUrKojqhvOGsbhB9PUCqEOnuYrg=","HwFAFTSvCp26cdo1kx5ecfdA/\u002BXAkxgIq5fu6m8nIA0=","SHr5eqYzJxZNE5/PlzkQfEBMjakT5PcfDexn2iCZjyI=","rovhGZeu5lwGm9t06s1govZ9ZDUAyhGquT/zYxV9EMA=","n90/VXHLh5f/b\u002BenXJx5LvC2wVhxMsmGXsKTtLP1rGE=","M2F\u002BdirWJXRBR8xTEBUsBQq5ZBlMsGLrQuDu2Xoflo8=","QQfqB2d2lyRaoRCXHlFI1qDyAV8sb3YBC6sabNep4T8=","sCLTILGPMYZmM4Cq6VeXFDRKEU4zUeqi0zh34Zyl1\u002Bg=","KPtl\u002BIcYzJanv3TdGEjfu/58zjjSte7onQyK1z2UpSs=","UOD2algC0YxakRPAo\u002BdHBxw2nz\u002Bf3inCW8K/2sYv4hk=","2a4AqN7uSgiGGPijKrbGYp3zTiFaYviYMC4je9251Gg=","S1JDFpdG6oeT7HQg1q6p3OLFEq6MSuMk9DrbZZf85U0=","FcAp\u002BB\u002BMdtU4Jqt1qd8ZU0XGQCyIO1UaSwwwKyFcuRI=","KicT\u002BJLs/7POfopY2e6knubWrx25hvaxJ1zNKezbz9Y=","xL7/ma/CChAYqsGMi59uK6yIstcESmcirrh1RzpvMEw=","dnRdnpQc61NJ56ASQrUFLZkDTGNM0KNu\u002BtR3NDDE34A=","Grv4g6vNrL73s12N910v2w8Bfa5b3fgn3knYM4SPbTo=","biFvXP\u002Bh3VCB//g0WfQTKnZXpYAq5NNK8FOtNrSlluc=","JbXwwQIUN/GSNZKsNiMjv4ebWU2SviyhnVdlqdpCpmg=","nz\u002BZycBj/r0qxn/lLFHWJ8J6wFGlMsV/1mlRmZUo/4I=","aQycidQhGUbn4VCw/EJfF5iFRrN1xIgwHoIJjbOVZps=","qgUM6A/uKHiUkWc1/Ln9WXX1SAX8JoRvV74Ma6ZFmng=","iKkyE9MQsJaeQ\u002BwNmzP/yqlnE0DgDcGv\u002BmjdLoDxrRo=","uTVPNnHOvOCd/yTop9dVCWOMKn4tFTh\u002B\u002BvDB36ISZPs=","mfZpFq\u002BvCmodLP7zO9b0YsEWC/OcDyBoxhYqFD56fFk=","YWOs7JAKIsqIOVQG0w8okz7vUzx0CLjYsgFSeEvd8dY=","mhyeOUDBL5xq9Rlm12fZKRW\u002BewVdAloH3HpGO\u002B7GqeM=","dwYRUoBX6sjNOpgOukCSK6FYozMx5nQPuanV9jF0pug=","ozbr8RdoOPcWGZFTphPnXiPHqUXsUX48rNHT9DPxQQQ=","zNy/\u002Beenwd4rP3KmszLj/P9L4RfeJcIG51tiUMGKZUI=","JqnKg76tBTEDi4ygNmSbT8906THHzJuCJTZbK0K6Oe8=","JcACn0ymzW4JpJ5CgWCxT1NdaSHZxnxp\u002BAiJJM/kC6k=","k71DltJbtRqVXA3rGahMZgUq0B9sodbz2R43hsUcD1I=","aouiJcQV84ezpO9Cwpg\u002BId9XaiZVlGhgxGvxD6PaAGM=","b/Jk0Mr/B4BWzcJa6nZHbXC\u002BzU0I1a30M2AcH5fdjKY=","aK2OxKAVYxUxIEDqZnknDAW9qelpdYKLvlGPA3\u002B5OIE=","E4QT\u002B435PZZ\u002BRTzgvECRD1bOtElnkqeWREaoDzYrMdc=","FBxckgU98gb7vgTEM5V4Q\u002BEWV1Ztcp3Bssbx92n1keA=","gv3iSaKsj0CmcWFWMhUhYcA7l4\u002BnVTp1Jj85xAmbA8E=","mRQfJZfYrp6FVuPsI1970i6\u002Bg1zC7cMX1qaaf5X\u002BoCQ=","5BtfX2AAiOmDTGL34icHscY4eUpH3nbfHN/rb4e62rY=","6rueZEktdPrxLkoO8WfJXCckClsIUsg6sBnN1LTessM=","SZJz\u002B71xnWFevxgzVgPPCqih4KkGwhQhHvoh6BgiWFc=","u2aOXUOrTOrwIgVam12G9HzaU7QEbOQG66Q7IDjlMYY=","8DlE0XjBA/lhOGHaXiPZ5cQswwpo6NEUaebI9my2F4s=","1ldijbG/u6m3Wwq0OUgI3unhWdjWhqvOD\u002BI1PauI9GI=","WtqR0aLtM7t6m3NDyJiTfyz81jhBwyuQkg/iDou5f/k=","aNqGJzJ5xa0dNxSytzanVzqK6xNl85ZkIZfdb\u002BKhxHY=","TpcHV4OB3FaN8hILgTJGBWj6cGx2APNuu6cH90cA2Yw=","y2O\u002BMtvYW\u002BJsiXwnsSGokrtLoPU1BZKq/Rs6jBLWkBA=","XfkTfnoOOODr5Ke\u002BIvlGksb7y1tdjO9D3cio6nfgb6o=","wcROe0zOlvSplfU1neaBc6O9UQx0shY6TJh9t2ZSBYs=","10qLnXFiRep12dfNyKPtD4BUjDi86nt7iUeaDRzdFFg=","Aq6Wb82cwzIR34t\u002BKjNx2Bsbl4xPKot/OiCPUr8NcaA=","sbScjs7uLbfBbWbJKERtvGeL8se13w0V5s0ufS/zDaQ=","9hC0wthPXB9k40lIbDKdWYtaw2axqBb91\u002BojeVYtTEY=","oHrJ\u002Blbd6RhXKDeATc8FabZLEDUjbHWnd18rZBRbNBE=","qOlED1ak4sYSTrFn1g6Y7mnsz3UFQEQ/RV3qKJGx0DQ=","bkU1JrXkWH3R/7pZTq912KiH0qHTMuWrKp6\u002B3V8nWE0=","HCsDlEON4uTuZHQ/mLhoZSnOhDE/0YmD0\u002BPzbGk55jk=","DIlQgc8O3Rampq4\u002BuAU34qvAhOQ76ih6rEWZRuXbpGs=","87pLnLY3BRAM5qVJkJZ6NFQjQse85QaOsaRqbVei3f8=","gb5K/PglhYNjQ6udVditV5mmWe8pBL0bkbfqmDZJR3Q=","c//884XNSMx2fHCDDouqzztU4ZLBdyPK5IazFjEu3xg=","A5FwpPfGidgr2NgPt1ofZxg2nxXAcuozNEFd9BE7nsk="],"CachedAssets":{},"CachedCopyCandidates":{}}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1 +1 @@
uItkRxd8HGmDpOGXSZUcgBl9qNJmoTF2VPg7ZNs3V00=
+3s8TTPcc657CtZZeHB/FwXsD8EuOVIHrdrZEjeJb9A=

File diff suppressed because one or more lines are too long

View File

@ -42,6 +42,8 @@
<script src="js/init.js"></script>
<script src="_framework/blazor.webassembly.js"></script>
<script src="_content/Blazor.Bootstrap/blazor.bootstrap.js"></script>
<script src="js/onProfNext.js"></script>
<script src="js/dragDrop.js"></script>
</body>

View File

@ -0,0 +1,37 @@
window.onProfNext = {
preventDefault: function (event) {
if (event) {
event.preventDefault();
event.stopPropagation();
}
},
startResize: function (event, bookingId, onResizeCallback) {
event.preventDefault();
const element = event.target.closest('.booking-item');
if (!element) return;
let startY = event.clientY;
let startHeight = parseInt(element.style.height) || 50; // Default 50px (1 hour)
const minHeight = 25; // Minimum 0.5 hours
const maxHeight = 400; // Maximum 8 hours
function onMouseMove(e) {
const deltaY = e.clientY - startY;
let newHeight = Math.max(minHeight, Math.min(maxHeight, startHeight + deltaY));
newHeight = Math.round(newHeight / 25) * 25; // Round to nearest 0.5 hours
element.style.height = `${newHeight}px`;
const hours = newHeight / 50; // 50px = 1 hour
window.onProfNext.currentHours = hours;
}
function onMouseUp() {
document.removeEventListener('mousemove', onMouseMove);
document.removeEventListener('mouseup', onMouseUp);
DotNet.invokeMethodAsync('OnProfNext.Client', 'UpdateBookingHours', bookingId, window.onProfNext.currentHours);
}
document.addEventListener('mousemove', onMouseMove);
document.addEventListener('mouseup', onMouseUp);
}
};

View File

@ -0,0 +1,15 @@

window.onProfNext = {
preventDefault: function () {
// Diese Funktion wird von Blazor aufgerufen, um preventDefault zu setzen
// Sie muss an einem Ort aufgerufen werden, wo das Event verfügbar ist
// In Blazor wird sie über @ondragover aufgerufen
return true; // Signalisiert, dass der Aufruf erfolgreich war
}
};
// Event-Listener für dragover, um preventDefault zu setzen
document.addEventListener('dragover', (event) => {
event.preventDefault();
event.dataTransfer.dropEffect = 'move';
});

View File

@ -0,0 +1,46 @@
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata.Builders;
using OnProfNext.Shared.Models;
namespace OnProfNext.Server.Data.Configurations
{
public class BookingConfiguration : IEntityTypeConfiguration<Booking>
{
public void Configure(EntityTypeBuilder<Booking> builder)
{
builder.ToTable("Bookings");
builder.HasKey(b => b.Id);
builder.Property(b => b.Hours)
.HasColumnType("decimal(5,2)")
.IsRequired();
builder.Property(b => b.Date)
.IsRequired();
builder.Property(b => b.Description)
.HasMaxLength(500);
builder.Property(b => b.MandantId)
.IsRequired();
builder.HasOne(b => b.Order)
.WithMany()
.HasForeignKey(b => b.OrderId)
.OnDelete(DeleteBehavior.Cascade);
builder.HasOne(b => b.User)
.WithMany()
.HasForeignKey(b => b.UserId)
.OnDelete(DeleteBehavior.Restrict);
builder.Property(b => b.CreatedAt)
.HasDefaultValueSql("GETUTCDATE()");
builder.Property(b => b.UpdatedAt)
.HasDefaultValueSql("GETUTCDATE()");
}
}
}

View File

@ -0,0 +1,163 @@
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using OnProfNext.Server.Data;
using OnProfNext.Shared.Models;
using OnProfNext.Shared.Models.DTOs;
using System.Text.Json;
namespace OnProfNext.Server.Controllers
{
[ApiController]
[Route("api/[controller]")]
[Authorize]
public class BookingsController : ControllerBase
{
private readonly AppDbContext _context;
public BookingsController(AppDbContext context)
{
_context = context;
}
private int GetCurrentUserId()
{
var userIdClaim = User.FindFirst("UserId")?.Value;
if (string.IsNullOrEmpty(userIdClaim))
throw new UnauthorizedAccessException("Kein User-Claim im Token gefunden.");
return int.Parse(userIdClaim);
}
[HttpGet("mine")]
public async Task<ActionResult<IEnumerable<BookingDto>>> GetMyBookings()
{
var userId = GetCurrentUserId();
var bookings = await _context.Bookings
.Include(b => b.Order)
.Where(b => b.UserId == userId)
.OrderByDescending(b => b.Date)
.Select(b => new BookingDto
{
Id = b.Id,
OrderId = b.OrderId,
OrderTitle = b.Order != null ? b.Order.Titel : "",
UserId = b.UserId,
Date = b.Date,
Hours = b.Hours,
Description = b.Description,
MandantId = b.MandantId,
IsPending = false
})
.ToListAsync();
Console.WriteLine($"Returning bookings: {JsonSerializer.Serialize(bookings, new JsonSerializerOptions { WriteIndented = true })}");
return Ok(bookings);
}
[HttpGet("byproject/{projectId}")]
public async Task<ActionResult<IEnumerable<BookingDto>>> GetBookingsByProject(int projectId)
{
var bookings = await _context.Bookings
.Include(b => b.Order)
.ThenInclude(o => o.Project)
.Include(b => b.User)
.Where(b => b.Order!.ProjectId == projectId)
.Select(b => new BookingDto
{
Id = b.Id,
OrderId = b.OrderId,
OrderTitle = b.Order!.Titel,
UserId = b.UserId,
Username = $"{b.User!.FirstName} {b.User.LastName}",
Date = b.Date,
Hours = b.Hours,
Description = b.Description,
MandantId = b.MandantId,
IsPending = false
})
.ToListAsync();
Console.WriteLine($"Returning bookings for project {projectId}: {JsonSerializer.Serialize(bookings, new JsonSerializerOptions { WriteIndented = true })}");
return Ok(bookings);
}
[HttpPost]
public async Task<ActionResult<BookingDto>> CreateBooking([FromBody] BookingCreateDto dto)
{
var userId = GetCurrentUserId();
// Logge die rohe HTTP-Payload
var rawRequest = await new StreamReader(Request.BodyReader.AsStream()).ReadToEndAsync();
Console.WriteLine($"Raw HTTP request body: {rawRequest}");
Console.WriteLine($"Received booking DTO: {JsonSerializer.Serialize(dto, new JsonSerializerOptions { WriteIndented = true })}");
Console.WriteLine($"Received booking: Date={dto.Date.ToString("dd.MM.yyyy HH:mm:ss")} (Kind: {dto.Date.Kind})");
var booking = new Booking
{
OrderId = dto.OrderId,
UserId = userId,
Date = dto.Date,
Hours = dto.Hours,
Description = dto.Description,
MandantId = dto.MandantId,
CreatedAt = DateTime.UtcNow,
UpdatedAt = DateTime.UtcNow
};
_context.Bookings.Add(booking);
await _context.SaveChangesAsync();
var createdDto = new BookingDto
{
Id = booking.Id,
OrderId = booking.OrderId,
UserId = booking.UserId,
Date = booking.Date,
Hours = booking.Hours,
Description = booking.Description,
MandantId = booking.MandantId,
IsPending = false
};
Console.WriteLine($"Created booking: ID={booking.Id}, Date={booking.Date.ToString("dd.MM.yyyy HH:mm:ss")} (Kind: {booking.Date.Kind})");
return CreatedAtAction(nameof(GetMyBookings), new { id = booking.Id }, createdDto);
}
[HttpPut("{id}")]
public async Task<IActionResult> UpdateBooking(int id, BookingCreateDto dto)
{
var userId = GetCurrentUserId();
Console.WriteLine($"Updating booking ID={id}: Date={dto.Date.ToString("dd.MM.yyyy HH:mm:ss")} (Kind: {dto.Date.Kind})");
var booking = await _context.Bookings.FirstOrDefaultAsync(b => b.Id == id && b.UserId == userId);
if (booking == null) return NotFound();
booking.OrderId = dto.OrderId;
booking.Date = dto.Date;
booking.Hours = dto.Hours;
booking.Description = dto.Description;
booking.UpdatedAt = DateTime.UtcNow;
await _context.SaveChangesAsync();
Console.WriteLine($"Updated booking ID={id}: Date={booking.Date.ToString("dd.MM.yyyy HH:mm:ss")} (Kind: {booking.Date.Kind})");
return NoContent();
}
[HttpDelete("{id}")]
public async Task<IActionResult> DeleteBooking(int id)
{
var userId = GetCurrentUserId();
var booking = await _context.Bookings.FirstOrDefaultAsync(b => b.Id == id && b.UserId == userId);
if (booking == null)
return NotFound();
Console.WriteLine($"Deleting booking ID={id}");
_context.Bookings.Remove(booking);
await _context.SaveChangesAsync();
Console.WriteLine($"Deleted booking ID={id}");
return NoContent();
}
}
}

View File

@ -178,5 +178,52 @@ namespace OnProfNext.Server.Controllers
return NoContent();
}
private int GetCurrentUserId()
{
var userIdClaim = User.FindFirst("UserId")?.Value;
if (string.IsNullOrEmpty(userIdClaim))
throw new UnauthorizedAccessException("Kein User-Claim im Token gefunden.");
return int.Parse(userIdClaim);
}
[HttpGet("mine")]
public async Task<ActionResult<IEnumerable<OrderDto>>> GetMyOrders()
{
var userId = GetCurrentUserId();
var orders = await _context.Orders
.Include(o => o.OrderUsers)
.ThenInclude(ou => ou.User)
.Where(o => o.OrderUsers.Any(ou => ou.UserId == userId))
.AsNoTracking()
.Select(o => new OrderDto
{
Id = o.Id,
ProjectId = o.ProjectId,
Auftragsnummer = o.Auftragsnummer,
Titel = o.Titel,
Status = o.Status,
Planstunden = o.Planstunden,
Iststunden = o.Iststunden,
Projektcode = o.Projektcode,
MandantId = o.MandantId,
CreatedAt = o.CreatedAt,
UpdatedAt = o.UpdatedAt,
Mitarbeiter = o.OrderUsers
.Select(ou => new UserDto
{
Id = ou.User!.Id,
Username = ou.User.Username,
FirstName = ou.User.FirstName,
LastName = ou.User.LastName,
Email = ou.User.Email
}).ToList()
})
.ToListAsync();
return Ok(orders);
}
}
}

View File

@ -1,5 +1,6 @@
using Microsoft.EntityFrameworkCore;
using OnProfNext.Server.Configurations;
using OnProfNext.Server.Data.Configurations;
using OnProfNext.Shared.Models;
namespace OnProfNext.Server.Data
@ -15,6 +16,7 @@ namespace OnProfNext.Server.Data
public DbSet<ProjectUser> ProjectUsers => Set<ProjectUser>();
public DbSet<OrderUser> OrderUsers => Set<OrderUser>();
public DbSet<Order> Orders => Set<Order>();
public DbSet<Booking> Bookings => Set<Booking>();
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
@ -26,6 +28,7 @@ namespace OnProfNext.Server.Data
modelBuilder.ApplyConfiguration(new ProjectUserConfiguration());
modelBuilder.ApplyConfiguration(new OrderUserConfiguration());
modelBuilder.ApplyConfiguration(new OrderConfiguration());
modelBuilder.ApplyConfiguration(new BookingConfiguration());
}
}
}

View File

@ -0,0 +1,368 @@
// <auto-generated />
using System;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Metadata;
using Microsoft.EntityFrameworkCore.Migrations;
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
using OnProfNext.Server.Data;
#nullable disable
namespace OnProfNext.Server.Migrations
{
[DbContext(typeof(AppDbContext))]
[Migration("20251015131954_AddBookingsConfiguration")]
partial class AddBookingsConfiguration
{
/// <inheritdoc />
protected override void BuildTargetModel(ModelBuilder modelBuilder)
{
#pragma warning disable 612, 618
modelBuilder
.HasAnnotation("ProductVersion", "9.0.9")
.HasAnnotation("Relational:MaxIdentifierLength", 128);
SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder);
modelBuilder.Entity("OnProfNext.Shared.Models.Booking", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("int");
SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("Id"));
b.Property<DateTime>("CreatedAt")
.ValueGeneratedOnAdd()
.HasColumnType("datetime2")
.HasDefaultValueSql("GETUTCDATE()");
b.Property<DateTime>("Date")
.HasColumnType("datetime2");
b.Property<string>("Description")
.HasMaxLength(500)
.HasColumnType("nvarchar(500)");
b.Property<decimal>("Hours")
.HasColumnType("decimal(5,2)");
b.Property<int>("MandantId")
.HasColumnType("int");
b.Property<int>("OrderId")
.HasColumnType("int");
b.Property<DateTime>("UpdatedAt")
.ValueGeneratedOnAdd()
.HasColumnType("datetime2")
.HasDefaultValueSql("GETUTCDATE()");
b.Property<int>("UserId")
.HasColumnType("int");
b.HasKey("Id");
b.HasIndex("OrderId");
b.HasIndex("UserId");
b.ToTable("Bookings", (string)null);
});
modelBuilder.Entity("OnProfNext.Shared.Models.Order", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("int");
SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("Id"));
b.Property<string>("Auftragsnummer")
.IsRequired()
.HasMaxLength(50)
.HasColumnType("nvarchar(50)");
b.Property<DateTime>("CreatedAt")
.ValueGeneratedOnAdd()
.HasColumnType("datetime2")
.HasDefaultValueSql("GETUTCDATE()");
b.Property<decimal>("Iststunden")
.ValueGeneratedOnAdd()
.HasPrecision(10, 2)
.HasColumnType("decimal(10,2)")
.HasDefaultValue(0m);
b.Property<int>("MandantId")
.HasColumnType("int");
b.Property<decimal>("Planstunden")
.ValueGeneratedOnAdd()
.HasPrecision(10, 2)
.HasColumnType("decimal(10,2)")
.HasDefaultValue(0m);
b.Property<int>("ProjectId")
.HasColumnType("int");
b.Property<string>("Projektcode")
.HasColumnType("nvarchar(max)");
b.Property<string>("Status")
.IsRequired()
.ValueGeneratedOnAdd()
.HasMaxLength(50)
.HasColumnType("nvarchar(50)")
.HasDefaultValue("Geplant");
b.Property<string>("Titel")
.IsRequired()
.HasMaxLength(255)
.HasColumnType("nvarchar(255)");
b.Property<DateTime>("UpdatedAt")
.ValueGeneratedOnAdd()
.HasColumnType("datetime2")
.HasDefaultValueSql("GETUTCDATE()");
b.HasKey("Id");
b.HasIndex("ProjectId");
b.ToTable("Orders", (string)null);
});
modelBuilder.Entity("OnProfNext.Shared.Models.OrderUser", b =>
{
b.Property<int>("OrderId")
.HasColumnType("int");
b.Property<int>("UserId")
.HasColumnType("int");
b.HasKey("OrderId", "UserId");
b.HasIndex("UserId");
b.ToTable("OrderUsers", (string)null);
});
modelBuilder.Entity("OnProfNext.Shared.Models.Project", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("int");
SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("Id"));
b.Property<DateTime>("CreatedAt")
.ValueGeneratedOnAdd()
.HasColumnType("datetime2")
.HasDefaultValueSql("SYSDATETIME()");
b.Property<string>("Description")
.HasMaxLength(1000)
.HasColumnType("nvarchar(1000)");
b.Property<DateTime?>("EndDate")
.HasColumnType("datetime2");
b.Property<int>("MandantId")
.ValueGeneratedOnAdd()
.HasColumnType("int")
.HasDefaultValue(1);
b.Property<string>("ProjectManager")
.HasMaxLength(100)
.HasColumnType("nvarchar(100)");
b.Property<string>("ProjectName")
.IsRequired()
.HasMaxLength(200)
.HasColumnType("nvarchar(200)");
b.Property<DateTime>("StartDate")
.ValueGeneratedOnAdd()
.HasColumnType("datetime2")
.HasDefaultValueSql("SYSDATETIME()");
b.Property<string>("Status")
.IsRequired()
.ValueGeneratedOnAdd()
.HasMaxLength(50)
.HasColumnType("nvarchar(50)")
.HasDefaultValue("Geplant");
b.Property<DateTime>("UpdatedAt")
.ValueGeneratedOnAddOrUpdate()
.HasColumnType("datetime2")
.HasDefaultValueSql("SYSDATETIME()");
b.HasKey("Id");
b.ToTable("Projects", (string)null);
});
modelBuilder.Entity("OnProfNext.Shared.Models.ProjectUser", b =>
{
b.Property<int>("ProjectId")
.HasColumnType("int");
b.Property<int>("UserId")
.HasColumnType("int");
b.HasKey("ProjectId", "UserId");
b.HasIndex("UserId");
b.ToTable("ProjectUsers", (string)null);
});
modelBuilder.Entity("OnProfNext.Shared.Models.User", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("int");
SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("Id"));
b.Property<DateTime>("CreatedAt")
.ValueGeneratedOnAdd()
.HasColumnType("datetime2")
.HasDefaultValueSql("SYSDATETIME()");
b.Property<string>("Email")
.IsRequired()
.HasMaxLength(100)
.HasColumnType("nvarchar(100)");
b.Property<string>("FirstName")
.IsRequired()
.HasMaxLength(100)
.HasColumnType("nvarchar(100)");
b.Property<bool>("IsActive")
.ValueGeneratedOnAdd()
.HasColumnType("bit")
.HasDefaultValue(true);
b.Property<string>("LastName")
.IsRequired()
.HasMaxLength(100)
.HasColumnType("nvarchar(100)");
b.Property<int>("MandantId")
.ValueGeneratedOnAdd()
.HasColumnType("int")
.HasDefaultValue(1);
b.Property<string>("PasswordHash")
.IsRequired()
.HasMaxLength(512)
.HasColumnType("nvarchar(512)");
b.Property<DateTime>("UpdatedAt")
.ValueGeneratedOnAddOrUpdate()
.HasColumnType("datetime2")
.HasDefaultValueSql("SYSDATETIME()");
b.Property<string>("Username")
.IsRequired()
.HasMaxLength(50)
.HasColumnType("nvarchar(50)");
b.HasKey("Id");
b.ToTable("Users", (string)null);
});
modelBuilder.Entity("OnProfNext.Shared.Models.Booking", b =>
{
b.HasOne("OnProfNext.Shared.Models.Order", "Order")
.WithMany()
.HasForeignKey("OrderId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.HasOne("OnProfNext.Shared.Models.User", "User")
.WithMany()
.HasForeignKey("UserId")
.OnDelete(DeleteBehavior.Restrict)
.IsRequired();
b.Navigation("Order");
b.Navigation("User");
});
modelBuilder.Entity("OnProfNext.Shared.Models.Order", b =>
{
b.HasOne("OnProfNext.Shared.Models.Project", "Project")
.WithMany("Orders")
.HasForeignKey("ProjectId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("Project");
});
modelBuilder.Entity("OnProfNext.Shared.Models.OrderUser", b =>
{
b.HasOne("OnProfNext.Shared.Models.Order", "Order")
.WithMany("OrderUsers")
.HasForeignKey("OrderId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.HasOne("OnProfNext.Shared.Models.User", "User")
.WithMany()
.HasForeignKey("UserId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("Order");
b.Navigation("User");
});
modelBuilder.Entity("OnProfNext.Shared.Models.ProjectUser", b =>
{
b.HasOne("OnProfNext.Shared.Models.Project", "Project")
.WithMany("ProjectUsers")
.HasForeignKey("ProjectId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.HasOne("OnProfNext.Shared.Models.User", "User")
.WithMany("ProjectUsers")
.HasForeignKey("UserId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("Project");
b.Navigation("User");
});
modelBuilder.Entity("OnProfNext.Shared.Models.Order", b =>
{
b.Navigation("OrderUsers");
});
modelBuilder.Entity("OnProfNext.Shared.Models.Project", b =>
{
b.Navigation("Orders");
b.Navigation("ProjectUsers");
});
modelBuilder.Entity("OnProfNext.Shared.Models.User", b =>
{
b.Navigation("ProjectUsers");
});
#pragma warning restore 612, 618
}
}
}

View File

@ -0,0 +1,64 @@
using System;
using Microsoft.EntityFrameworkCore.Migrations;
#nullable disable
namespace OnProfNext.Server.Migrations
{
/// <inheritdoc />
public partial class AddBookingsConfiguration : Migration
{
/// <inheritdoc />
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.CreateTable(
name: "Bookings",
columns: table => new
{
Id = table.Column<int>(type: "int", nullable: false)
.Annotation("SqlServer:Identity", "1, 1"),
OrderId = table.Column<int>(type: "int", nullable: false),
UserId = table.Column<int>(type: "int", nullable: false),
Date = table.Column<DateTime>(type: "datetime2", nullable: false),
Hours = table.Column<decimal>(type: "decimal(5,2)", nullable: false),
Description = table.Column<string>(type: "nvarchar(500)", maxLength: 500, nullable: true),
MandantId = table.Column<int>(type: "int", nullable: false),
CreatedAt = table.Column<DateTime>(type: "datetime2", nullable: false, defaultValueSql: "GETUTCDATE()"),
UpdatedAt = table.Column<DateTime>(type: "datetime2", nullable: false, defaultValueSql: "GETUTCDATE()")
},
constraints: table =>
{
table.PrimaryKey("PK_Bookings", x => x.Id);
table.ForeignKey(
name: "FK_Bookings_Orders_OrderId",
column: x => x.OrderId,
principalTable: "Orders",
principalColumn: "Id",
onDelete: ReferentialAction.Cascade);
table.ForeignKey(
name: "FK_Bookings_Users_UserId",
column: x => x.UserId,
principalTable: "Users",
principalColumn: "Id",
onDelete: ReferentialAction.Restrict);
});
migrationBuilder.CreateIndex(
name: "IX_Bookings_OrderId",
table: "Bookings",
column: "OrderId");
migrationBuilder.CreateIndex(
name: "IX_Bookings_UserId",
table: "Bookings",
column: "UserId");
}
/// <inheritdoc />
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropTable(
name: "Bookings");
}
}
}

View File

@ -22,6 +22,52 @@ namespace OnProfNext.Server.Migrations
SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder);
modelBuilder.Entity("OnProfNext.Shared.Models.Booking", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("int");
SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("Id"));
b.Property<DateTime>("CreatedAt")
.ValueGeneratedOnAdd()
.HasColumnType("datetime2")
.HasDefaultValueSql("GETUTCDATE()");
b.Property<DateTime>("Date")
.HasColumnType("datetime2");
b.Property<string>("Description")
.HasMaxLength(500)
.HasColumnType("nvarchar(500)");
b.Property<decimal>("Hours")
.HasColumnType("decimal(5,2)");
b.Property<int>("MandantId")
.HasColumnType("int");
b.Property<int>("OrderId")
.HasColumnType("int");
b.Property<DateTime>("UpdatedAt")
.ValueGeneratedOnAdd()
.HasColumnType("datetime2")
.HasDefaultValueSql("GETUTCDATE()");
b.Property<int>("UserId")
.HasColumnType("int");
b.HasKey("Id");
b.HasIndex("OrderId");
b.HasIndex("UserId");
b.ToTable("Bookings", (string)null);
});
modelBuilder.Entity("OnProfNext.Shared.Models.Order", b =>
{
b.Property<int>("Id")
@ -229,6 +275,25 @@ namespace OnProfNext.Server.Migrations
b.ToTable("Users", (string)null);
});
modelBuilder.Entity("OnProfNext.Shared.Models.Booking", b =>
{
b.HasOne("OnProfNext.Shared.Models.Order", "Order")
.WithMany()
.HasForeignKey("OrderId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.HasOne("OnProfNext.Shared.Models.User", "User")
.WithMany()
.HasForeignKey("UserId")
.OnDelete(DeleteBehavior.Restrict)
.IsRequired();
b.Navigation("Order");
b.Navigation("User");
});
modelBuilder.Entity("OnProfNext.Shared.Models.Order", b =>
{
b.HasOne("OnProfNext.Shared.Models.Project", "Project")

View File

@ -13,7 +13,7 @@ using System.Reflection;
[assembly: System.Reflection.AssemblyCompanyAttribute("OnProfNext.Server")]
[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")]
[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")]
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+910ed8b8f84357d5f19f7be7f67be8f98b22e9c9")]
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+de2c3693508bfb15c93127034ea928d860f4ac56")]
[assembly: System.Reflection.AssemblyProductAttribute("OnProfNext.Server")]
[assembly: System.Reflection.AssemblyTitleAttribute("OnProfNext.Server")]
[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")]

View File

@ -1 +1 @@
9c6fea68571aa14755a5757920f4a71a3ea78617a0cb2d16e4a85d871afee2d4
6191c4c96e4f8f9f841e487d0768c67ec53b0fed8c42c63b4c486985ad7f5fd2

View File

@ -1 +1 @@
8805535874ac805970a5fc9ba19ba7716e78a205f536b46f85b434f940fcc2fa
067ac0315eda1d3c337d3bdde0526e8a65108b2be306c92658058c3200f07343

View File

@ -1 +1 @@
{"GlobalPropertiesHash":"FgKIeBZ9Ztoqric5Nb7d8Ix++iErS9q0YOlj6fkVIbM=","FingerprintPatternsHash":"8ZRc1sGeVrPBx4lD717BgRaQekyh78QKV9SKsdt638U=","PropertyOverridesHash":"8ZRc1sGeVrPBx4lD717BgRaQekyh78QKV9SKsdt638U=","InputHashes":["PmzPzDLX5kem67gWwuODY2y/hyQd8nKfjwCe/ukzc7c=","LY\u002BzkbCH4BDCRNsN4e4hLpvYL/q343HA7aPqxLAnut4=","JcRKU2Zb4DUaR9Im1Nhj21bq9CS6zqrEyUlIptRQGPk=","oWGMgCB3vBEn8UDnk8gLGSmHUQp9nje0xZwa9jbcJds=","j4zvFombPCFDsE\u002BVLdnMhkrq8OLrHidrxFTLuLU5vMQ=","KJJmmS83E4AFqRDn5z9krFmkNtj5EIaWLgIS37POGr8=","xQg7Ozplq1cFDQPPrR5U6g5tfTz0Tx8zEGJriilBzbY=","xXIxgYvMtC9sEkafVNlrcH1Pv5l0FLdyBQPAp5BPAeY=","tf9mfbbiGyrn8DwXufw5UsDjSSX2bb4/v03tlENYAyQ=","HCEmdDnOaqxSVlCudFM7kXBMB\u002BTnSOIqCZaIDo2\u002BkmY=","OKkUjMjTxHumPV8kCwmKIe5EWTGXpicq5nPdBf1UjgU=","nGJ1y3WFrH56ZKC6r2VTpPKOcPajDLQnhXocDhcXmRg=","cGx77cv7nA0DdmaIS2X36NmMdiNb53a\u002BFYrSSYo5FuI=","FtlA9l0oAxySvxoKIT9fzLZajRC\u002Bb\u002B5TJipa9p57wiQ=","eFkUF78KbACBytwdzYneghMgzZWrsA02z0/ACTjf1LY=","YMmNzNRYlNUaY02cz66xLjTOWrv1loEdDwImShCe1jo=","PeS/S8mByULK0UONqH\u002ByZPgxm1uqX9tdeBSbGFZXR4s=","jKTJ7g0eCxEdDl05oVJEtlTpRXiB2qnvMi2PxRdZ9zc=","rzYf1UGwzK\u002Bt/dnYYqlMR7QuKGfkx/vU7t8YI/Qdey0=","Ww0AK17g0XIkjndgpYH6uveAS5QZvgE6TKFMPxHZgK8=","GA1u7GN8CpPjgtVF9p5meRcHD1sfLghHWP4j/Dqg1Lg=","SF9qmJCiNAHDHHnVc2cEt2z1mO82I0VggENUI8NSZqk=","qCDwNzaKuXnkV0G76t21N4pVOCPzJWmMDrEdjFbCXoc=","iMVw0eiXFIR8VogqY0SuhHCe3w\u002BRtCVecwImsxPMzTw=","HZFxsQaTWeyRUw50nxUt9gRfpEPRI3OFp6NOU5frds0=","2E2DXizaWyyz5hJGy5kQ608yc9QroQLLKm2qQtr4/kU=","GJfwFUk2fZZkZmk0TMk\u002BrB1iqzGaYrLg7MFHXI9oaQM=","XFwG7JLxXxSp7GJoSb8NffDaAy8YL0bpfxI4XZ0qH0s=","rpaQmELSXW5qZL9CsRJ8FOFKY1yeKUdSxG9xjxoX0is=","M\u002BbooiExb8jG2y5dZyG\u002BDf0sAUlX/4mYxMHP4XWh2d4="],"CachedAssets":{},"CachedCopyCandidates":{}}
{"GlobalPropertiesHash":"FgKIeBZ9Ztoqric5Nb7d8Ix++iErS9q0YOlj6fkVIbM=","FingerprintPatternsHash":"8ZRc1sGeVrPBx4lD717BgRaQekyh78QKV9SKsdt638U=","PropertyOverridesHash":"8ZRc1sGeVrPBx4lD717BgRaQekyh78QKV9SKsdt638U=","InputHashes":["PmzPzDLX5kem67gWwuODY2y/hyQd8nKfjwCe/ukzc7c=","LY\u002BzkbCH4BDCRNsN4e4hLpvYL/q343HA7aPqxLAnut4=","JcRKU2Zb4DUaR9Im1Nhj21bq9CS6zqrEyUlIptRQGPk=","oWGMgCB3vBEn8UDnk8gLGSmHUQp9nje0xZwa9jbcJds=","j4zvFombPCFDsE\u002BVLdnMhkrq8OLrHidrxFTLuLU5vMQ=","KJJmmS83E4AFqRDn5z9krFmkNtj5EIaWLgIS37POGr8=","xQg7Ozplq1cFDQPPrR5U6g5tfTz0Tx8zEGJriilBzbY=","xXIxgYvMtC9sEkafVNlrcH1Pv5l0FLdyBQPAp5BPAeY=","tf9mfbbiGyrn8DwXufw5UsDjSSX2bb4/v03tlENYAyQ=","HCEmdDnOaqxSVlCudFM7kXBMB\u002BTnSOIqCZaIDo2\u002BkmY=","OKkUjMjTxHumPV8kCwmKIe5EWTGXpicq5nPdBf1UjgU=","nGJ1y3WFrH56ZKC6r2VTpPKOcPajDLQnhXocDhcXmRg=","cGx77cv7nA0DdmaIS2X36NmMdiNb53a\u002BFYrSSYo5FuI=","FtlA9l0oAxySvxoKIT9fzLZajRC\u002Bb\u002B5TJipa9p57wiQ=","eFkUF78KbACBytwdzYneghMgzZWrsA02z0/ACTjf1LY=","YMmNzNRYlNUaY02cz66xLjTOWrv1loEdDwImShCe1jo=","PeS/S8mByULK0UONqH\u002ByZPgxm1uqX9tdeBSbGFZXR4s=","jKTJ7g0eCxEdDl05oVJEtlTpRXiB2qnvMi2PxRdZ9zc=","rzYf1UGwzK\u002Bt/dnYYqlMR7QuKGfkx/vU7t8YI/Qdey0=","Ww0AK17g0XIkjndgpYH6uveAS5QZvgE6TKFMPxHZgK8=","GA1u7GN8CpPjgtVF9p5meRcHD1sfLghHWP4j/Dqg1Lg=","SF9qmJCiNAHDHHnVc2cEt2z1mO82I0VggENUI8NSZqk=","qCDwNzaKuXnkV0G76t21N4pVOCPzJWmMDrEdjFbCXoc=","iMVw0eiXFIR8VogqY0SuhHCe3w\u002BRtCVecwImsxPMzTw=","HZFxsQaTWeyRUw50nxUt9gRfpEPRI3OFp6NOU5frds0=","2E2DXizaWyyz5hJGy5kQ608yc9QroQLLKm2qQtr4/kU=","GJfwFUk2fZZkZmk0TMk\u002BrB1iqzGaYrLg7MFHXI9oaQM=","XFwG7JLxXxSp7GJoSb8NffDaAy8YL0bpfxI4XZ0qH0s=","rpaQmELSXW5qZL9CsRJ8FOFKY1yeKUdSxG9xjxoX0is=","z9QzyKI\u002BWUa1kxi33RqVyzyLVbCve834yD/zpLFlt2Q="],"CachedAssets":{},"CachedCopyCandidates":{}}

View File

@ -1 +1 @@
{"GlobalPropertiesHash":"TJ2LTRuPMY5dh+Ys0sp6meZCDAgoVVT755nQ9dkxJ+U=","FingerprintPatternsHash":"8ZRc1sGeVrPBx4lD717BgRaQekyh78QKV9SKsdt638U=","PropertyOverridesHash":"8ZRc1sGeVrPBx4lD717BgRaQekyh78QKV9SKsdt638U=","InputHashes":["PmzPzDLX5kem67gWwuODY2y/hyQd8nKfjwCe/ukzc7c=","LY\u002BzkbCH4BDCRNsN4e4hLpvYL/q343HA7aPqxLAnut4=","JcRKU2Zb4DUaR9Im1Nhj21bq9CS6zqrEyUlIptRQGPk=","oWGMgCB3vBEn8UDnk8gLGSmHUQp9nje0xZwa9jbcJds=","j4zvFombPCFDsE\u002BVLdnMhkrq8OLrHidrxFTLuLU5vMQ=","KJJmmS83E4AFqRDn5z9krFmkNtj5EIaWLgIS37POGr8=","xQg7Ozplq1cFDQPPrR5U6g5tfTz0Tx8zEGJriilBzbY=","xXIxgYvMtC9sEkafVNlrcH1Pv5l0FLdyBQPAp5BPAeY=","tf9mfbbiGyrn8DwXufw5UsDjSSX2bb4/v03tlENYAyQ=","HCEmdDnOaqxSVlCudFM7kXBMB\u002BTnSOIqCZaIDo2\u002BkmY=","OKkUjMjTxHumPV8kCwmKIe5EWTGXpicq5nPdBf1UjgU=","nGJ1y3WFrH56ZKC6r2VTpPKOcPajDLQnhXocDhcXmRg=","cGx77cv7nA0DdmaIS2X36NmMdiNb53a\u002BFYrSSYo5FuI=","FtlA9l0oAxySvxoKIT9fzLZajRC\u002Bb\u002B5TJipa9p57wiQ=","eFkUF78KbACBytwdzYneghMgzZWrsA02z0/ACTjf1LY=","YMmNzNRYlNUaY02cz66xLjTOWrv1loEdDwImShCe1jo=","PeS/S8mByULK0UONqH\u002ByZPgxm1uqX9tdeBSbGFZXR4s=","jKTJ7g0eCxEdDl05oVJEtlTpRXiB2qnvMi2PxRdZ9zc=","rzYf1UGwzK\u002Bt/dnYYqlMR7QuKGfkx/vU7t8YI/Qdey0=","Ww0AK17g0XIkjndgpYH6uveAS5QZvgE6TKFMPxHZgK8=","GA1u7GN8CpPjgtVF9p5meRcHD1sfLghHWP4j/Dqg1Lg=","SF9qmJCiNAHDHHnVc2cEt2z1mO82I0VggENUI8NSZqk=","qCDwNzaKuXnkV0G76t21N4pVOCPzJWmMDrEdjFbCXoc=","iMVw0eiXFIR8VogqY0SuhHCe3w\u002BRtCVecwImsxPMzTw=","HZFxsQaTWeyRUw50nxUt9gRfpEPRI3OFp6NOU5frds0=","2E2DXizaWyyz5hJGy5kQ608yc9QroQLLKm2qQtr4/kU=","GJfwFUk2fZZkZmk0TMk\u002BrB1iqzGaYrLg7MFHXI9oaQM=","XFwG7JLxXxSp7GJoSb8NffDaAy8YL0bpfxI4XZ0qH0s=","rpaQmELSXW5qZL9CsRJ8FOFKY1yeKUdSxG9xjxoX0is=","M\u002BbooiExb8jG2y5dZyG\u002BDf0sAUlX/4mYxMHP4XWh2d4="],"CachedAssets":{},"CachedCopyCandidates":{}}
{"GlobalPropertiesHash":"TJ2LTRuPMY5dh+Ys0sp6meZCDAgoVVT755nQ9dkxJ+U=","FingerprintPatternsHash":"8ZRc1sGeVrPBx4lD717BgRaQekyh78QKV9SKsdt638U=","PropertyOverridesHash":"8ZRc1sGeVrPBx4lD717BgRaQekyh78QKV9SKsdt638U=","InputHashes":["PmzPzDLX5kem67gWwuODY2y/hyQd8nKfjwCe/ukzc7c=","LY\u002BzkbCH4BDCRNsN4e4hLpvYL/q343HA7aPqxLAnut4=","JcRKU2Zb4DUaR9Im1Nhj21bq9CS6zqrEyUlIptRQGPk=","oWGMgCB3vBEn8UDnk8gLGSmHUQp9nje0xZwa9jbcJds=","j4zvFombPCFDsE\u002BVLdnMhkrq8OLrHidrxFTLuLU5vMQ=","KJJmmS83E4AFqRDn5z9krFmkNtj5EIaWLgIS37POGr8=","xQg7Ozplq1cFDQPPrR5U6g5tfTz0Tx8zEGJriilBzbY=","xXIxgYvMtC9sEkafVNlrcH1Pv5l0FLdyBQPAp5BPAeY=","tf9mfbbiGyrn8DwXufw5UsDjSSX2bb4/v03tlENYAyQ=","HCEmdDnOaqxSVlCudFM7kXBMB\u002BTnSOIqCZaIDo2\u002BkmY=","OKkUjMjTxHumPV8kCwmKIe5EWTGXpicq5nPdBf1UjgU=","nGJ1y3WFrH56ZKC6r2VTpPKOcPajDLQnhXocDhcXmRg=","cGx77cv7nA0DdmaIS2X36NmMdiNb53a\u002BFYrSSYo5FuI=","FtlA9l0oAxySvxoKIT9fzLZajRC\u002Bb\u002B5TJipa9p57wiQ=","eFkUF78KbACBytwdzYneghMgzZWrsA02z0/ACTjf1LY=","YMmNzNRYlNUaY02cz66xLjTOWrv1loEdDwImShCe1jo=","PeS/S8mByULK0UONqH\u002ByZPgxm1uqX9tdeBSbGFZXR4s=","jKTJ7g0eCxEdDl05oVJEtlTpRXiB2qnvMi2PxRdZ9zc=","rzYf1UGwzK\u002Bt/dnYYqlMR7QuKGfkx/vU7t8YI/Qdey0=","Ww0AK17g0XIkjndgpYH6uveAS5QZvgE6TKFMPxHZgK8=","GA1u7GN8CpPjgtVF9p5meRcHD1sfLghHWP4j/Dqg1Lg=","SF9qmJCiNAHDHHnVc2cEt2z1mO82I0VggENUI8NSZqk=","qCDwNzaKuXnkV0G76t21N4pVOCPzJWmMDrEdjFbCXoc=","iMVw0eiXFIR8VogqY0SuhHCe3w\u002BRtCVecwImsxPMzTw=","HZFxsQaTWeyRUw50nxUt9gRfpEPRI3OFp6NOU5frds0=","2E2DXizaWyyz5hJGy5kQ608yc9QroQLLKm2qQtr4/kU=","GJfwFUk2fZZkZmk0TMk\u002BrB1iqzGaYrLg7MFHXI9oaQM=","XFwG7JLxXxSp7GJoSb8NffDaAy8YL0bpfxI4XZ0qH0s=","rpaQmELSXW5qZL9CsRJ8FOFKY1yeKUdSxG9xjxoX0is=","z9QzyKI\u002BWUa1kxi33RqVyzyLVbCve834yD/zpLFlt2Q="],"CachedAssets":{},"CachedCopyCandidates":{}}

View File

@ -0,0 +1,41 @@
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace OnProfNext.Shared.Models
{
public class Booking
{
[Key]
public int Id { get; set; }
[Required]
public int OrderId { get; set; }
[Required]
public int UserId { get; set; }
[Required]
public DateTime Date { get; set; }
[Required]
[Column(TypeName = "decimal(5,2)")]
public decimal Hours { get; set; }
[MaxLength(500)]
public string? Description { get; set; }
public int MandantId { get; set; } = 1;
public DateTime CreatedAt { get; set; } = DateTime.UtcNow;
public DateTime UpdatedAt { get; set; } = DateTime.UtcNow;
//Nav Properties
public virtual Order? Order { get; set; }
public virtual User? User { get; set; }
}
}

View File

@ -0,0 +1,27 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.Json.Serialization;
using System.Threading.Tasks;
namespace OnProfNext.Shared.Models.DTOs
{
public class BookingCreateDto
{
public int OrderId { get; set; }
[JsonIgnore]
public DateTime Date { get; set; }
[JsonPropertyName("date")]
public string DateAsString
{
get => Date.ToString("yyyy-MM-ddTHH:mm:ss");
set => Date = DateTime.Parse(value, null, System.Globalization.DateTimeStyles.AssumeLocal);
}
public decimal Hours { get; set; }
public string? Description { get; set; }
public int MandantId { get; set; } = 1;
}
}

View File

@ -0,0 +1,22 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace OnProfNext.Shared.Models.DTOs
{
public class BookingDto
{
public int Id { get; set; }
public int OrderId { get; set; }
public string? OrderTitle { get; set; }
public int UserId { get; set; }
public string? Username { get; set; }
public DateTime Date { get; set; } = DateTime.UtcNow;
public decimal Hours { get; set; }
public string? Description { get; set; }
public int MandantId { get; set; }
public bool IsPending { get; set; }
}
}

View File

@ -1,6 +1,7 @@
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
// Runtime Version:4.0.30319.42000
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
@ -13,7 +14,7 @@ using System.Reflection;
[assembly: System.Reflection.AssemblyCompanyAttribute("OnProfNext.Shared")]
[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")]
[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")]
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+910ed8b8f84357d5f19f7be7f67be8f98b22e9c9")]
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+de2c3693508bfb15c93127034ea928d860f4ac56")]
[assembly: System.Reflection.AssemblyProductAttribute("OnProfNext.Shared")]
[assembly: System.Reflection.AssemblyTitleAttribute("OnProfNext.Shared")]
[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")]

View File

@ -1 +1 @@
57cdff878469b70b9b012776a3c6832ee54e415f6e69489a92366cc8882adf20
9968ae41b8342606115e05ef64f540975f553877571d12df6c981aad7138922c

View File

@ -1 +1 @@
fa8e53161e67297b52957cf0faf7326687b0354015518dfaa162c27176b15dc3
6327964d4d933dfc1cc0dac3925a1a78b9c313c4d98dae3b1838f8af318b5a96