refactor: fix typo in table name

This commit is contained in:
Max Hohlfeld 2025-05-12 21:16:13 +02:00
parent 1cf97b8c96
commit 3875f75f2a
49 changed files with 322 additions and 316 deletions

View File

@ -1,6 +1,6 @@
{ {
"db_name": "PostgreSQL", "db_name": "PostgreSQL",
"query": "UPDATE availabillity SET startTimestamp = $1, endTimestamp = $2, comment = $3 WHERE id = $4", "query": "UPDATE availability SET startTimestamp = $1, endTimestamp = $2, comment = $3 WHERE id = $4",
"describe": { "describe": {
"columns": [], "columns": [],
"parameters": { "parameters": {
@ -13,5 +13,5 @@
}, },
"nullable": [] "nullable": []
}, },
"hash": "a517738fabdf4a8c48778ea953f5ab6a3fa9a224ebacc32f75b60cbc91a11fea" "hash": "09dd3e14c1d48847a9618b188ee7e7ac51e23fe98c53e27c400cadc50ccd6c2f"
} }

View File

@ -1,6 +1,6 @@
{ {
"db_name": "PostgreSQL", "db_name": "PostgreSQL",
"query": "\n SELECT\n availabillity.id,\n availabillity.userId,\n availabillity.startTimestamp,\n availabillity.endTimestamp,\n availabillity.comment,\n user_.name,\n user_.email,\n user_.password,\n user_.salt,\n user_.role AS \"role: Role\",\n user_.function AS \"function: UserFunction\",\n user_.areaId,\n user_.locked,\n user_.lastLogin,\n user_.receiveNotifications\n FROM availabillity\n LEFT JOIN assignment ON availabillity.Id = assignment.availabillityId\n JOIN user_ ON availabillity.userId = user_.id\n WHERE availabillity.id = $1;\n ", "query": "\n SELECT\n availability.id,\n availability.userId,\n availability.startTimestamp,\n availability.endTimestamp,\n availability.comment,\n user_.name,\n user_.email,\n user_.password,\n user_.salt,\n user_.role AS \"role: Role\",\n user_.function AS \"function: UserFunction\",\n user_.areaId,\n user_.locked,\n user_.lastLogin,\n user_.receiveNotifications\n FROM availability\n LEFT JOIN assignment ON availability.Id = assignment.availabilityId\n JOIN user_ ON availability.userId = user_.id\n WHERE availability.id = $1;\n ",
"describe": { "describe": {
"columns": [ "columns": [
{ {
@ -131,5 +131,5 @@
false false
] ]
}, },
"hash": "890ac023f7b2a6517ca46dfff5fc10e5e1d0c4757aa097294f5d7d6b6368b558" "hash": "1b85bca9dc5c0ec4568a07846ccda76468e81d9335548ef6f8b25c6e290b9cd0"
} }

View File

@ -1,6 +1,6 @@
{ {
"db_name": "PostgreSQL", "db_name": "PostgreSQL",
"query": "DELETE FROM assignment WHERE assignment.eventId = $1 AND assignment.availabillityId = $2;", "query": "DELETE FROM assignment WHERE assignment.eventId = $1 AND assignment.availabilityId = $2;",
"describe": { "describe": {
"columns": [], "columns": [],
"parameters": { "parameters": {
@ -11,5 +11,5 @@
}, },
"nullable": [] "nullable": []
}, },
"hash": "7d2e4fcde5bee6c9dcd85e35fa5f0dd4ae6b638b85f0e3a54afc85a46de6ae3a" "hash": "1c9387e3723fe4b7d1b10908a3580e7ebf4d56250f8f008ee030a158b02cb86e"
} }

View File

@ -1,6 +1,6 @@
{ {
"db_name": "PostgreSQL", "db_name": "PostgreSQL",
"query": "SELECT * FROM vehicleAssignement WHERE vehicleAssignement.eventId = $1 AND vehicleAssignement.vehicleId = $2;", "query": "SELECT * FROM vehicleassignment WHERE vehicleassignment.eventId = $1 AND vehicleassignment.vehicleId = $2;",
"describe": { "describe": {
"columns": [ "columns": [
{ {
@ -37,5 +37,5 @@
false false
] ]
}, },
"hash": "159c257e9e7a164d369de950940166706b5adf4815de81481c9eb67d94b7ee0d" "hash": "22470315a6113d51ed84e262b6dd2e41a7c16d9dda06eb06c272345722f994ae"
} }

View File

@ -1,6 +1,6 @@
{ {
"db_name": "PostgreSQL", "db_name": "PostgreSQL",
"query": "\n INSERT INTO assignment (eventId, availabillityId, function, startTimestamp, endTimestamp)\n VALUES ($1, $2, $3, $4, $5);\n ", "query": "\n INSERT INTO assignment (eventId, availabilityId, function, startTimestamp, endTimestamp)\n VALUES ($1, $2, $3, $4, $5);\n ",
"describe": { "describe": {
"columns": [], "columns": [],
"parameters": { "parameters": {
@ -25,5 +25,5 @@
}, },
"nullable": [] "nullable": []
}, },
"hash": "1e0bac00becc335dbd0f71a3b65a91a77a9e4b1e323321fc41e29df7dda2b9da" "hash": "47bd20303899d5e804f8651c17428ee92f80321d1a5423be52e4f9a275180748"
} }

View File

@ -1,6 +1,6 @@
{ {
"db_name": "PostgreSQL", "db_name": "PostgreSQL",
"query": "SELECT * FROM availabillity WHERE id = $1", "query": "SELECT * FROM availability WHERE id = $1",
"describe": { "describe": {
"columns": [ "columns": [
{ {
@ -42,5 +42,5 @@
false false
] ]
}, },
"hash": "0342272c9798389c37e229018e30bed399723ca0dba70438ba519d3ee7dad01b" "hash": "686a344fde1d9d3d7cfb431b30cd455f37854d8b728a7aac679e5c60f84cb08c"
} }

View File

@ -1,6 +1,6 @@
{ {
"db_name": "PostgreSQL", "db_name": "PostgreSQL",
"query": "UPDATE assignment SET function = $1, startTimestamp = $2, endTimestamp = $3 WHERE eventId = $4 AND availabillityId = $5;", "query": "UPDATE assignment SET function = $1, startTimestamp = $2, endTimestamp = $3 WHERE eventId = $4 AND availabilityId = $5;",
"describe": { "describe": {
"columns": [], "columns": [],
"parameters": { "parameters": {
@ -25,5 +25,5 @@
}, },
"nullable": [] "nullable": []
}, },
"hash": "75d96d0b937b8e222aa2ad6b9fc0fc185e2b6b5f1a7c80507d39d813af3e3478" "hash": "6a95b789e0f9fc868d8695a33614184ae14ee690d03cd7455a80430d0cb8ba63"
} }

View File

@ -1,6 +1,6 @@
{ {
"db_name": "PostgreSQL", "db_name": "PostgreSQL",
"query": "\n SELECT\n availabillity.id,\n availabillity.userId,\n availabillity.startTimestamp,\n availabillity.endTimestamp,\n availabillity.comment,\n user_.name,\n user_.email,\n user_.password,\n user_.salt,\n user_.role AS \"role: Role\",\n user_.function AS \"function: UserFunction\",\n user_.areaId,\n user_.locked,\n user_.lastLogin,\n user_.receiveNotifications\n FROM availabillity\n JOIN user_ ON availabillity.userId = user_.id\n WHERE availabillity.starttimestamp::date = $1\n AND user_.areaId = $2\n AND availabillity.startTimestamp <= $3 AND availabillity.endTimestamp >= $4;\n ", "query": "\n SELECT\n availability.id,\n availability.userId,\n availability.startTimestamp,\n availability.endTimestamp,\n availability.comment,\n user_.name,\n user_.email,\n user_.password,\n user_.salt,\n user_.role AS \"role: Role\",\n user_.function AS \"function: UserFunction\",\n user_.areaId,\n user_.locked,\n user_.lastLogin,\n user_.receiveNotifications\n FROM availability\n JOIN user_ ON availability.userId = user_.id\n WHERE availability.starttimestamp::date = $1\n AND user_.areaId = $2\n AND availability.startTimestamp <= $3 AND availability.endTimestamp >= $4;\n ",
"describe": { "describe": {
"columns": [ "columns": [
{ {
@ -134,5 +134,5 @@
false false
] ]
}, },
"hash": "85dc89689632abde0930ca3fde05ac1b6f3acb52e5ac2d2a98b966f05d5b9953" "hash": "7b3d623440f6ab8060223289d13687921a5c27317ea27d1b2c960b5e809a7497"
} }

View File

@ -1,6 +1,6 @@
{ {
"db_name": "PostgreSQL", "db_name": "PostgreSQL",
"query": "SELECT * FROM vehicleAssignement WHERE vehicleAssignement.eventId = $1;", "query": "SELECT * FROM vehicleassignment WHERE vehicleassignment.eventId = $1;",
"describe": { "describe": {
"columns": [ "columns": [
{ {
@ -36,5 +36,5 @@
false false
] ]
}, },
"hash": "126a17ad3fe8937dfbf70e9a8c2bd7aee56eb35fdff0d0e47037b9af3e08b34f" "hash": "7c0145a715f40405e4401a6bb0bc27152a88c585d66da008d2729fb61d2d84b9"
} }

View File

@ -1,6 +1,6 @@
{ {
"db_name": "PostgreSQL", "db_name": "PostgreSQL",
"query": "\n SELECT\n vehicleAssignement.eventId,\n vehicleAssignement.vehicleId,\n vehicleAssignement.starttimestamp,\n vehicleAssignement.endtimestamp\n FROM vehicleAssignement\n JOIN event ON vehicleAssignement.eventId = event.id\n WHERE vehicleAssignement.vehicleid = $1\n AND event.starttimestamp::date = $2;\n ", "query": "\n SELECT\n vehicleassignment.eventId,\n vehicleassignment.vehicleId,\n vehicleassignment.starttimestamp,\n vehicleassignment.endtimestamp\n FROM vehicleassignment\n JOIN event ON vehicleassignment.eventId = event.id\n WHERE vehicleassignment.vehicleid = $1\n AND event.starttimestamp::date = $2;\n ",
"describe": { "describe": {
"columns": [ "columns": [
{ {
@ -37,5 +37,5 @@
false false
] ]
}, },
"hash": "4b3eebd13b23df2046dabf6ad161f1ec32d95ec24d6da507387e9a7cf8287eaf" "hash": "7d1f191fbff87ffc8d429221f6f42557a5ab9e6eab8e0f10f5bad6055a64f617"
} }

View File

@ -1,6 +1,6 @@
{ {
"db_name": "PostgreSQL", "db_name": "PostgreSQL",
"query": "DELETE FROM vehicleassignement WHERE eventId = $1 AND vehicleId = $2;", "query": "DELETE FROM vehicleassignment WHERE eventId = $1 AND vehicleId = $2;",
"describe": { "describe": {
"columns": [], "columns": [],
"parameters": { "parameters": {
@ -11,5 +11,5 @@
}, },
"nullable": [] "nullable": []
}, },
"hash": "48e3cab60736bf95958b063013090c64160aff1bad2f0db851db2e421711a156" "hash": "7db7ce0d13489ce3c0d967322f071a11174aa3c86ed405d352a3e3fb7ed10804"
} }

View File

@ -1,17 +0,0 @@
{
"db_name": "PostgreSQL",
"query": "\n INSERT INTO availabillity (userId, startTimestamp, endTimestamp, comment)\n VALUES ($1, $2, $3, $4);\n ",
"describe": {
"columns": [],
"parameters": {
"Left": [
"Int4",
"Timestamptz",
"Timestamptz",
"Text"
]
},
"nullable": []
},
"hash": "843da813342d6d7875667d43a76f6f2820ef97b85e1185b846ff245113889096"
}

View File

@ -1,6 +1,6 @@
{ {
"db_name": "PostgreSQL", "db_name": "PostgreSQL",
"query": "\n SELECT\n assignment.eventId,\n assignment.availabillityId,\n assignment.function AS \"function: Function\",\n assignment.startTimestamp,\n assignment.endTimestamp\n FROM assignment\n WHERE assignment.AvailabillityId = $1;\n ", "query": "\n SELECT\n assignment.eventId,\n assignment.availabilityId,\n assignment.function AS \"function: Function\",\n assignment.startTimestamp,\n assignment.endTimestamp\n FROM assignment\n WHERE assignment.AvailabilityId = $1;\n ",
"describe": { "describe": {
"columns": [ "columns": [
{ {
@ -10,7 +10,7 @@
}, },
{ {
"ordinal": 1, "ordinal": 1,
"name": "availabillityid", "name": "availabilityid",
"type_info": "Int4" "type_info": "Int4"
}, },
{ {
@ -53,5 +53,5 @@
false false
] ]
}, },
"hash": "40254661a2d8a7e4b803551419e082b6ae3a5cb32ddc30a8fa844a4be67564ff" "hash": "8893828aa4509fc81f078b313a88c34d05eb7c5988e4d595768bc7dd47a7892f"
} }

View File

@ -1,6 +1,6 @@
{ {
"db_name": "PostgreSQL", "db_name": "PostgreSQL",
"query": "\n SELECT\n assignment.eventId,\n assignment.availabillityId,\n assignment.function AS \"function: Function\",\n assignment.startTimestamp,\n assignment.endTimestamp\n FROM assignment\n WHERE assignment.eventId = $1;\n ", "query": "\n SELECT\n assignment.eventId,\n assignment.availabilityId,\n assignment.function AS \"function: Function\",\n assignment.startTimestamp,\n assignment.endTimestamp\n FROM assignment\n WHERE assignment.eventId = $1;\n ",
"describe": { "describe": {
"columns": [ "columns": [
{ {
@ -10,7 +10,7 @@
}, },
{ {
"ordinal": 1, "ordinal": 1,
"name": "availabillityid", "name": "availabilityid",
"type_info": "Int4" "type_info": "Int4"
}, },
{ {
@ -53,5 +53,5 @@
false false
] ]
}, },
"hash": "478a745b8953efab4fbc915d99a4ad6a47a5c83e7054bc9fda81a31e6555f4ff" "hash": "9315f185d76ae8e25c9bb0273fce388ca559c4494f82d31524f224c6b70000f9"
} }

View File

@ -1,6 +1,6 @@
{ {
"db_name": "PostgreSQL", "db_name": "PostgreSQL",
"query": "DELETE FROM availabillity WHERE id = $1", "query": "DELETE FROM availability WHERE id = $1",
"describe": { "describe": {
"columns": [], "columns": [],
"parameters": { "parameters": {
@ -10,5 +10,5 @@
}, },
"nullable": [] "nullable": []
}, },
"hash": "fc09093ce791d2d690b2e3f5ff2125a10757b06ff7d60c8843cb7814ea452f13" "hash": "96b1394c0dc24a9633af101d53af4844e919aca853ebeb9bab6b37a0d68c3b59"
} }

View File

@ -1,6 +1,6 @@
{ {
"db_name": "PostgreSQL", "db_name": "PostgreSQL",
"query": "\n SELECT\n availabillity.id,\n availabillity.userId,\n availabillity.startTimestamp,\n availabillity.endTimestamp,\n availabillity.comment,\n user_.name,\n user_.email,\n user_.password,\n user_.salt,\n user_.role AS \"role: Role\",\n user_.function AS \"function: UserFunction\",\n user_.areaId,\n user_.locked,\n user_.lastLogin,\n user_.receiveNotifications,\n area.name AS areaName\n FROM availabillity\n JOIN user_ ON availabillity.userId = user_.id\n JOIN area ON user_.areaId = area.id\n WHERE user_.areaId = $1 AND\n availabillity.starttimestamp::date >= $2 AND\n availabillity.starttimestamp::date <= $3;\n ", "query": "\n SELECT\n availability.id,\n availability.userId,\n availability.startTimestamp,\n availability.endTimestamp,\n availability.comment,\n user_.name,\n user_.email,\n user_.password,\n user_.salt,\n user_.role AS \"role: Role\",\n user_.function AS \"function: UserFunction\",\n user_.areaId,\n user_.locked,\n user_.lastLogin,\n user_.receiveNotifications,\n area.name AS areaName\n FROM availability\n JOIN user_ ON availability.userId = user_.id\n JOIN area ON user_.areaId = area.id\n WHERE user_.areaId = $1 AND\n availability.starttimestamp::date >= $2 AND\n availability.starttimestamp::date <= $3;\n ",
"describe": { "describe": {
"columns": [ "columns": [
{ {
@ -139,5 +139,5 @@
false false
] ]
}, },
"hash": "5ef1494706bb6c9d41f19f57d8120e57b274a5b38c0ded9f26824d4aba1822e9" "hash": "a05ae42af4e579697f6ddae93aa52fbc826a58edb71a23b54a589c56e1b50378"
} }

View File

@ -0,0 +1,17 @@
{
"db_name": "PostgreSQL",
"query": "\n INSERT INTO availability (userId, startTimestamp, endTimestamp, comment)\n VALUES ($1, $2, $3, $4);\n ",
"describe": {
"columns": [],
"parameters": {
"Left": [
"Int4",
"Timestamptz",
"Timestamptz",
"Text"
]
},
"nullable": []
},
"hash": "a55c1e8926f4aa039d8b14a054cb7d4e80387970467bf940c79433c08cb4f879"
}

View File

@ -1,6 +1,6 @@
{ {
"db_name": "PostgreSQL", "db_name": "PostgreSQL",
"query": "\n SELECT\n availabillity.id,\n availabillity.userId,\n availabillity.startTimestamp,\n availabillity.endTimestamp,\n availabillity.comment,\n user_.name,\n user_.email,\n user_.password,\n user_.salt,\n user_.role AS \"role: Role\",\n user_.function AS \"function: UserFunction\",\n user_.areaId,\n user_.locked,\n user_.lastLogin,\n user_.receiveNotifications\n FROM availabillity\n JOIN user_ ON availabillity.userId = user_.id\n WHERE availabillity.startTimestamp::date = $1\n AND user_.areaId = $2;\n ", "query": "\n SELECT\n availability.id,\n availability.userId,\n availability.startTimestamp,\n availability.endTimestamp,\n availability.comment,\n user_.name,\n user_.email,\n user_.password,\n user_.salt,\n user_.role AS \"role: Role\",\n user_.function AS \"function: UserFunction\",\n user_.areaId,\n user_.locked,\n user_.lastLogin,\n user_.receiveNotifications\n FROM availability\n JOIN user_ ON availability.userId = user_.id\n WHERE availability.startTimestamp::date = $1\n AND user_.areaId = $2;\n ",
"describe": { "describe": {
"columns": [ "columns": [
{ {
@ -132,5 +132,5 @@
false false
] ]
}, },
"hash": "18d37157e02280e00c1f3db9650775e04a665d5ac1475cc7a88f9b469438c942" "hash": "ae18073da63db05840fdd113a2a4727a7e2531cc54ca2bf35ba4f4f86d35a4d3"
} }

View File

@ -1,6 +1,6 @@
{ {
"db_name": "PostgreSQL", "db_name": "PostgreSQL",
"query": "INSERT INTO vehicleassignement (eventId, vehicleId, startTimestamp, endTimestamp) VALUES ($1, $2, $3, $4);", "query": "INSERT INTO vehicleassignment (eventId, vehicleId, startTimestamp, endTimestamp) VALUES ($1, $2, $3, $4);",
"describe": { "describe": {
"columns": [], "columns": [],
"parameters": { "parameters": {
@ -13,5 +13,5 @@
}, },
"nullable": [] "nullable": []
}, },
"hash": "bc79bfefe13543d35aca3443919dd4a2d4d8ee88a6bcdf0ee331cff0f7064811" "hash": "b76b8744228a18fee84e5f895d5b831e4fce2169daedc3d472c96bdaf4b29dae"
} }

View File

@ -1,6 +1,6 @@
{ {
"db_name": "PostgreSQL", "db_name": "PostgreSQL",
"query": "\n SELECT\n assignment.eventId,\n assignment.availabillityId,\n assignment.function AS \"function: Function\",\n assignment.startTimestamp,\n assignment.endTimestamp\n FROM assignment\n WHERE\n assignment.eventId = $1 AND\n assignment.availabillityId = $2;\n ", "query": "\n SELECT\n assignment.eventId,\n assignment.availabilityId,\n assignment.function AS \"function: Function\",\n assignment.startTimestamp,\n assignment.endTimestamp\n FROM assignment\n WHERE\n assignment.eventId = $1 AND\n assignment.availabilityId = $2;\n ",
"describe": { "describe": {
"columns": [ "columns": [
{ {
@ -10,7 +10,7 @@
}, },
{ {
"ordinal": 1, "ordinal": 1,
"name": "availabillityid", "name": "availabilityid",
"type_info": "Int4" "type_info": "Int4"
}, },
{ {
@ -54,5 +54,5 @@
false false
] ]
}, },
"hash": "9e77980b06e46b1c2d8cbcab7006b984c81afc8ef02fbe289170f48411147022" "hash": "d2014068ac3b84a3682054e13e20ada311b1c36389b60ce8800d52ba4047730c"
} }

View File

@ -1,6 +1,6 @@
{ {
"db_name": "PostgreSQL", "db_name": "PostgreSQL",
"query": "\n SELECT\n availabillity.id,\n availabillity.userId,\n availabillity.startTimestamp,\n availabillity.endTimestamp,\n availabillity.comment\n FROM availabillity\n WHERE availabillity.userId = $1\n AND availabillity.starttimestamp::date = $2;\n ", "query": "\n SELECT\n availability.id,\n availability.userId,\n availability.startTimestamp,\n availability.endTimestamp,\n availability.comment\n FROM availability\n WHERE availability.userId = $1\n AND availability.starttimestamp::date = $2;\n ",
"describe": { "describe": {
"columns": [ "columns": [
{ {
@ -43,5 +43,5 @@
true true
] ]
}, },
"hash": "13d164ba2c29ac2bb4ee9428309807693ff1b29c61e7d07cbf8fb5fcd553f233" "hash": "f90aa1fd76ddf0f667fc77f1cbb02b219aff6d73a3ee1e0afeb9eeea7e194f9d"
} }

View File

@ -0,0 +1,3 @@
ALTER TABLE availabillity RENAME TO availability;
ALTER TABLE assignment RENAME COLUMN availabillityId TO availabilityId;
ALTER TABLE vehicleassignement RENAME TO vehicleassignment;

View File

@ -11,6 +11,9 @@ snapshot_kind: text
<input type="hidden" name="date" value="2025-01-01"> <input type="hidden" name="date" value="2025-01-01">
<input type="hidden" name="voluntarywachhabender" id="voluntarywachhabender" value="false">
<input type="hidden" name="voluntaryfuehrungsassistent" id="voluntaryfuehrungsassistent"
value="false">
<div class="field is-horizontal"> <div class="field is-horizontal">
@ -109,9 +112,9 @@ snapshot_kind: text
<div class="control"> <div class="control">
<label class="checkbox"> <label class="checkbox">
<input class="checkbox" type="checkbox" name="voluntarywachhabender" value="true" <input class="checkbox" type="checkbox"
> _="on click put (the value of #voluntarywachhabender) as inverseBool into the value of #voluntarywachhabender">
</label> </label>
</div> </div>
@ -128,9 +131,9 @@ snapshot_kind: text
<div class="control"> <div class="control">
<label class="checkbox"> <label class="checkbox">
<input class="checkbox" type="checkbox" name="voluntaryfuehrungsassistent" value="true" <input class="checkbox" type="checkbox"
> _="on click put (the value of #voluntaryfuehrungsassistent) as inverseBool into the value of #voluntaryfuehrungsassistent">
</label> </label>
</div> </div>

View File

@ -7,7 +7,7 @@ use crate::{
models::{Assignment, Event, Role, User}, models::{Assignment, Event, Role, User},
utils::{ utils::{
event_planning_template::{ event_planning_template::{
generate_availabillity_assignment_list, generate_status_whether_staff_is_required, generate_availability_assignment_list, generate_status_whether_staff_is_required,
}, },
ApplicationError, TemplateResponse, ApplicationError, TemplateResponse,
}, },
@ -15,7 +15,7 @@ use crate::{
#[derive(Deserialize)] #[derive(Deserialize)]
struct AssignmentDeleteQuery { struct AssignmentDeleteQuery {
availabillity: i32, availability: i32,
event: i32, event: i32,
} }
@ -38,14 +38,14 @@ pub async fn delete(
return Err(ApplicationError::Unauthorized); return Err(ApplicationError::Unauthorized);
} }
let Some(assignment) = Assignment::read(pool.get_ref(), event.id, query.availabillity).await? let Some(assignment) = Assignment::read(pool.get_ref(), event.id, query.availability).await?
else { else {
return Ok(HttpResponse::NotFound().finish()); return Ok(HttpResponse::NotFound().finish());
}; };
Assignment::delete(pool.get_ref(), event.id, assignment.availabillity_id).await?; Assignment::delete(pool.get_ref(), event.id, assignment.availability_id).await?;
let availabillities = generate_availabillity_assignment_list(pool.get_ref(), &event).await?; let availabilities = generate_availability_assignment_list(pool.get_ref(), &event).await?;
let ( let (
further_posten_required, further_posten_required,
further_fuehrungsassistent_required, further_fuehrungsassistent_required,
@ -54,7 +54,7 @@ pub async fn delete(
let template = PlanEventPersonalTablePartialTemplate { let template = PlanEventPersonalTablePartialTemplate {
event, event,
availabillities, availabilities,
further_posten_required, further_posten_required,
further_fuehrungsassistent_required, further_fuehrungsassistent_required,
further_wachhabender_required, further_wachhabender_required,
@ -115,7 +115,7 @@ mod tests {
let app = context.app().await; let app = context.app().await;
let config = RequestConfig { let config = RequestConfig {
uri: "/assignments/delete?availabillity=1&event=1".to_string(), uri: "/assignments/delete?availability=1&event=1".to_string(),
role: Role::AreaManager, role: Role::AreaManager,
function: vec![Function::Posten], function: vec![Function::Posten],
user_area: 1, user_area: 1,
@ -139,7 +139,7 @@ mod tests {
let app = context.app().await; let app = context.app().await;
let config = RequestConfig { let config = RequestConfig {
uri: "/assignments/delete?availabillity=1&event=1".to_string(), uri: "/assignments/delete?availability=1&event=1".to_string(),
role: Role::Staff, role: Role::Staff,
function: vec![Function::Posten], function: vec![Function::Posten],
user_area: 1, user_area: 1,
@ -154,7 +154,7 @@ mod tests {
async fn doesnt_work_when_event_does_not_exist(context: &DbTestContext) { async fn doesnt_work_when_event_does_not_exist(context: &DbTestContext) {
let app = context.app().await; let app = context.app().await;
let config = RequestConfig { let config = RequestConfig {
uri: "/assignments/delete?availabillity=1&event=1".to_string(), uri: "/assignments/delete?availability=1&event=1".to_string(),
role: Role::AreaManager, role: Role::AreaManager,
function: vec![Function::Posten], function: vec![Function::Posten],
user_area: 1, user_area: 1,
@ -171,7 +171,7 @@ mod tests {
let app = context.app().await; let app = context.app().await;
let config = RequestConfig { let config = RequestConfig {
uri: "/assignments/delete?availabillity=2&event=1".to_string(), uri: "/assignments/delete?availability=2&event=1".to_string(),
role: Role::AreaManager, role: Role::AreaManager,
function: vec![Function::Posten], function: vec![Function::Posten],
user_area: 1, user_area: 1,

View File

@ -2,7 +2,7 @@ use askama::Template;
use crate::{ use crate::{
filters, filters,
models::{Availability, AvailabillityAssignmentState, Event}, models::{Availability, AvailabilityAssignmentState, Event},
}; };
pub mod delete; pub mod delete;
@ -12,7 +12,7 @@ pub mod post_new;
#[template(path = "events/plan_personal_table.html")] #[template(path = "events/plan_personal_table.html")]
pub struct PlanEventPersonalTablePartialTemplate { pub struct PlanEventPersonalTablePartialTemplate {
event: Event, event: Event,
availabillities: Vec<(Availability, AvailabillityAssignmentState)>, availabilities: Vec<(Availability, AvailabilityAssignmentState)>,
further_posten_required: bool, further_posten_required: bool,
further_fuehrungsassistent_required: bool, further_fuehrungsassistent_required: bool,
further_wachhabender_required: bool, further_wachhabender_required: bool,

View File

@ -11,7 +11,7 @@ use crate::{
}, },
utils::{ utils::{
event_planning_template::{ event_planning_template::{
generate_availabillity_assignment_list, generate_status_whether_staff_is_required, generate_availability_assignment_list, generate_status_whether_staff_is_required,
}, },
ApplicationError, TemplateResponse, ApplicationError, TemplateResponse,
}, },
@ -19,7 +19,7 @@ use crate::{
#[derive(Deserialize)] #[derive(Deserialize)]
pub struct AssignmentQuery { pub struct AssignmentQuery {
availabillity: i32, availability: i32,
function: u8, function: u8,
event: i32, event: i32,
} }
@ -43,14 +43,14 @@ pub async fn post(
return Err(ApplicationError::Unauthorized); return Err(ApplicationError::Unauthorized);
} }
let Some(availabillity) = let Some(availability) =
Availability::read_by_id_including_user(pool.get_ref(), query.availabillity).await? Availability::read_by_id_including_user(pool.get_ref(), query.availability).await?
else { else {
return Ok(HttpResponse::NotFound().finish()); return Ok(HttpResponse::NotFound().finish());
}; };
let availability_user_not_in_event_location_area = let availability_user_not_in_event_location_area =
availabillity.user.as_ref().unwrap().area_id != event.location.as_ref().unwrap().area_id; availability.user.as_ref().unwrap().area_id != event.location.as_ref().unwrap().area_id;
if availability_user_not_in_event_location_area { if availability_user_not_in_event_location_area {
return Ok(HttpResponse::BadRequest() return Ok(HttpResponse::BadRequest()
@ -65,23 +65,23 @@ pub async fn post(
}; };
let assignments_for_event = Assignment::read_all_by_event(pool.get_ref(), event.id).await?; let assignments_for_event = Assignment::read_all_by_event(pool.get_ref(), event.id).await?;
let assignments_for_availabillity = let assignments_for_availability =
Assignment::read_all_by_availabillity(pool.get_ref(), availabillity.id).await?; Assignment::read_all_by_availability(pool.get_ref(), availability.id).await?;
let context = AssignmentContext { let context = AssignmentContext {
event: event.clone(), event: event.clone(),
availabillity: availabillity.clone(), availability: availability.clone(),
user_function: availabillity.user.as_ref().unwrap().function.clone(), user_function: availability.user.as_ref().unwrap().function.clone(),
assignments_for_event, assignments_for_event,
assignments_for_availabillity, assignments_for_availability,
}; };
if let Err(e) = changeset.validate_with(&context) { if let Err(e) = changeset.validate_with(&context) {
return Ok(HttpResponse::BadRequest().body(e.to_string())); return Ok(HttpResponse::BadRequest().body(e.to_string()));
}; };
Assignment::create(pool.get_ref(), event.id, availabillity.id, changeset).await?; Assignment::create(pool.get_ref(), event.id, availability.id, changeset).await?;
let availabillities = generate_availabillity_assignment_list(pool.get_ref(), &event).await?; let availabilities = generate_availability_assignment_list(pool.get_ref(), &event).await?;
let ( let (
further_posten_required, further_posten_required,
@ -91,7 +91,7 @@ pub async fn post(
let template = PlanEventPersonalTablePartialTemplate { let template = PlanEventPersonalTablePartialTemplate {
event, event,
availabillities, availabilities,
further_posten_required, further_posten_required,
further_fuehrungsassistent_required, further_fuehrungsassistent_required,
further_wachhabender_required, further_wachhabender_required,

View File

@ -6,21 +6,21 @@ use crate::{
models::{Availability, User}, utils::ApplicationError, models::{Availability, User}, utils::ApplicationError,
}; };
#[actix_web::delete("/availabillity/delete/{id}")] #[actix_web::delete("/availability/delete/{id}")]
pub async fn delete( pub async fn delete(
user: web::ReqData<User>, user: web::ReqData<User>,
pool: web::Data<PgPool>, pool: web::Data<PgPool>,
path: web::Path<IdPath>, path: web::Path<IdPath>,
) -> Result<impl Responder, ApplicationError> { ) -> Result<impl Responder, ApplicationError> {
let Some(availabillity) = Availability::read_by_id(pool.get_ref(), path.id).await? else { let Some(availability) = Availability::read_by_id(pool.get_ref(), path.id).await? else {
return Ok(HttpResponse::NotFound().finish()); return Ok(HttpResponse::NotFound().finish());
}; };
if availabillity.user_id != user.id { if availability.user_id != user.id {
return Err(ApplicationError::Unauthorized); return Err(ApplicationError::Unauthorized);
} }
Availability::delete(pool.get_ref(), availabillity.id).await?; Availability::delete(pool.get_ref(), availability.id).await?;
Ok(HttpResponse::Ok().finish()) Ok(HttpResponse::Ok().finish())
} }

View File

@ -12,7 +12,7 @@ struct AvailabilityNewQuery {
date: NaiveDate, date: NaiveDate,
} }
#[actix_web::get("/availabillity/new")] #[actix_web::get("/availability/new")]
pub async fn get( pub async fn get(
user: web::ReqData<User>, user: web::ReqData<User>,
pool: web::Data<PgPool>, pool: web::Data<PgPool>,
@ -22,10 +22,10 @@ pub async fn get(
Availability::read_by_user_and_date(pool.get_ref(), user.id, &query.date).await?; Availability::read_by_user_and_date(pool.get_ref(), user.id, &query.date).await?;
let slot_suggestions = find_free_date_time_slots(&availabilities_from_user); let slot_suggestions = find_free_date_time_slots(&availabilities_from_user);
let user_can_create_availabillity = let user_can_create_availability =
availabilities_from_user.is_empty() || !slot_suggestions.is_empty(); availabilities_from_user.is_empty() || !slot_suggestions.is_empty();
if !user_can_create_availabillity { if !user_can_create_availability {
return Ok(HttpResponse::BadRequest().finish()); return Ok(HttpResponse::BadRequest().finish());
} }

View File

@ -24,7 +24,7 @@ pub struct CalendarQuery {
#[template(path = "index.html")] #[template(path = "index.html")]
struct CalendarTemplate { struct CalendarTemplate {
user: User, user: User,
user_can_create_availabillity: bool, user_can_create_availability: bool,
date: NaiveDate, date: NaiveDate,
selected_area: Option<i32>, selected_area: Option<i32>,
areas: Vec<Area>, areas: Vec<Area>,
@ -35,7 +35,7 @@ struct CalendarTemplate {
Option<String>, Option<String>,
Vec<Vehicle>, Vec<Vehicle>,
)>, )>,
availabillities: Vec<Availability>, availabilities: Vec<Availability>,
} }
#[actix_web::get("/")] #[actix_web::get("/")]
@ -62,7 +62,7 @@ async fn get(
None => None, None => None,
}; };
let availabillities = Availability::read_by_date_and_area_including_user( let availabilities = Availability::read_by_date_and_area_including_user(
pool.get_ref(), pool.get_ref(),
date, date,
query.area.unwrap_or(user.area_id), query.area.unwrap_or(user.area_id),
@ -73,10 +73,10 @@ async fn get(
Availability::read_by_user_and_date(pool.get_ref(), user.id, &date).await?; Availability::read_by_user_and_date(pool.get_ref(), user.id, &date).await?;
//println!("{availabilities_from_user:#?}"); //println!("{availabilities_from_user:#?}");
let user_can_create_availabillity = availabilities_from_user.is_empty() let user_can_create_availability = availabilities_from_user.is_empty()
|| !find_free_date_time_slots(&availabilities_from_user).is_empty(); || !find_free_date_time_slots(&availabilities_from_user).is_empty();
//println!("{} || {} || {} = {user_can_create_availabillity}", availabilities_from_user.is_empty(), //println!("{} || {} || {} = {user_can_create_availability}", availabilities_from_user.is_empty(),
// !only_one_availability_exists_and_is_whole_day(&availabilities_from_user), // !only_one_availability_exists_and_is_whole_day(&availabilities_from_user),
// !find_free_time_slots(&availabilities_from_user).is_empty()); // !find_free_time_slots(&availabilities_from_user).is_empty());
@ -104,9 +104,9 @@ async fn get(
posten posten
.into_iter() .into_iter()
.map(|p| { .map(|p| {
availabillities availabilities
.iter() .iter()
.find(|a| a.id == p.availabillity_id) .find(|a| a.id == p.availability_id)
.unwrap() .unwrap()
.user .user
.as_ref() .as_ref()
@ -116,9 +116,9 @@ async fn get(
}) })
.collect(), .collect(),
fuehrungsassistent.first().map(|fa| { fuehrungsassistent.first().map(|fa| {
availabillities availabilities
.iter() .iter()
.find(|a| a.id == fa.availabillity_id) .find(|a| a.id == fa.availability_id)
.unwrap() .unwrap()
.user .user
.as_ref() .as_ref()
@ -127,9 +127,9 @@ async fn get(
.clone() .clone()
}), }),
wachhabender.first().map(|wh| { wachhabender.first().map(|wh| {
availabillities availabilities
.iter() .iter()
.find(|a| a.id == wh.availabillity_id) .find(|a| a.id == wh.availability_id)
.unwrap() .unwrap()
.user .user
.as_ref() .as_ref()
@ -143,12 +143,12 @@ async fn get(
let template = CalendarTemplate { let template = CalendarTemplate {
user: user.into_inner(), user: user.into_inner(),
user_can_create_availabillity, user_can_create_availability,
date, date,
selected_area, selected_area,
areas, areas,
events_and_assignments, events_and_assignments,
availabillities, availabilities,
}; };
Ok(template.to_response()?) Ok(template.to_response()?)

View File

@ -8,7 +8,7 @@ use crate::{
utils::{ApplicationError, TemplateResponse}, utils::{ApplicationError, TemplateResponse},
}; };
#[actix_web::get("/availabillity/edit/{id}")] #[actix_web::get("/availability/edit/{id}")]
pub async fn get( pub async fn get(
user: web::ReqData<User>, user: web::ReqData<User>,
pool: web::Data<PgPool>, pool: web::Data<PgPool>,

View File

@ -27,7 +27,7 @@ struct NewOrEditAvailabilityTemplate<'a> {
} }
#[derive(Deserialize)] #[derive(Deserialize)]
pub struct AvailabillityForm { pub struct AvailabilityForm {
pub startdate: NaiveDate, pub startdate: NaiveDate,
pub enddate: NaiveDate, pub enddate: NaiveDate,
pub starttime: NaiveTime, pub starttime: NaiveTime,

View File

@ -3,16 +3,16 @@ use garde::Validate;
use sqlx::PgPool; use sqlx::PgPool;
use crate::{ use crate::{
endpoints::availability::{find_adjacend_availability, AvailabillityForm}, endpoints::availability::{find_adjacend_availability, AvailabilityForm},
models::{Availability, AvailabilityChangeset, AvailabilityContext, User}, models::{Availability, AvailabilityChangeset, AvailabilityContext, User},
utils::{self, ApplicationError}, utils::{self, ApplicationError},
}; };
#[actix_web::post("/availabillity/new")] #[actix_web::post("/availability/new")]
pub async fn post( pub async fn post(
user: web::ReqData<User>, user: web::ReqData<User>,
pool: web::Data<PgPool>, pool: web::Data<PgPool>,
form: web::Form<AvailabillityForm>, form: web::Form<AvailabilityForm>,
) -> Result<impl Responder, ApplicationError> { ) -> Result<impl Responder, ApplicationError> {
let existing_availabilities = let existing_availabilities =
Availability::read_by_user_and_date(pool.get_ref(), user.id, &form.startdate).await?; Availability::read_by_user_and_date(pool.get_ref(), user.id, &form.startdate).await?;

View File

@ -4,19 +4,19 @@ use sqlx::PgPool;
use crate::{ use crate::{
endpoints::{ endpoints::{
availability::{find_adjacend_availability, AvailabillityForm}, availability::{find_adjacend_availability, AvailabilityForm},
IdPath, IdPath,
}, },
models::{Availability, AvailabilityChangeset, AvailabilityContext, User}, models::{Availability, AvailabilityChangeset, AvailabilityContext, User},
utils::{self, ApplicationError}, utils::{self, ApplicationError},
}; };
#[actix_web::post("/availabillity/edit/{id}")] #[actix_web::post("/availability/edit/{id}")]
pub async fn post( pub async fn post(
user: web::ReqData<User>, user: web::ReqData<User>,
pool: web::Data<PgPool>, pool: web::Data<PgPool>,
path: web::Path<IdPath>, path: web::Path<IdPath>,
form: web::Form<AvailabillityForm>, form: web::Form<AvailabilityForm>,
) -> Result<impl Responder, ApplicationError> { ) -> Result<impl Responder, ApplicationError> {
let Some(availability) = Availability::read_by_id(pool.get_ref(), path.id).await? else { let Some(availability) = Availability::read_by_id(pool.get_ref(), path.id).await? else {
return Ok(HttpResponse::NotFound().finish()); return Ok(HttpResponse::NotFound().finish());

View File

@ -5,10 +5,10 @@ use sqlx::PgPool;
use crate::{ use crate::{
endpoints::IdPath, endpoints::IdPath,
filters, filters,
models::{Availability, AvailabillityAssignmentState, Event, Role, User, Vehicle}, models::{Availability, AvailabilityAssignmentState, Event, Role, User, Vehicle},
utils::{ utils::{
event_planning_template::{ event_planning_template::{
generate_availabillity_assignment_list, generate_status_whether_staff_is_required, generate_availability_assignment_list, generate_status_whether_staff_is_required,
generate_vehicles_assigned_and_available, generate_vehicles_assigned_and_available,
}, },
ApplicationError, TemplateResponse, ApplicationError, TemplateResponse,
@ -20,7 +20,7 @@ use crate::{
pub struct PlanEventTemplate { pub struct PlanEventTemplate {
user: User, user: User,
event: Event, event: Event,
availabillities: Vec<(Availability, AvailabillityAssignmentState)>, availabilities: Vec<(Availability, AvailabilityAssignmentState)>,
further_posten_required: bool, further_posten_required: bool,
further_fuehrungsassistent_required: bool, further_fuehrungsassistent_required: bool,
further_wachhabender_required: bool, further_wachhabender_required: bool,
@ -46,7 +46,7 @@ pub async fn get(
return Err(ApplicationError::Unauthorized); return Err(ApplicationError::Unauthorized);
} }
let availabillities = generate_availabillity_assignment_list(pool.get_ref(), &event).await?; let availabilities = generate_availability_assignment_list(pool.get_ref(), &event).await?;
let ( let (
further_posten_required, further_posten_required,
@ -60,7 +60,7 @@ pub async fn get(
let template = PlanEventTemplate { let template = PlanEventTemplate {
user: user.into_inner(), user: user.into_inner(),
event, event,
availabillities, availabilities,
further_posten_required, further_posten_required,
further_fuehrungsassistent_required, further_fuehrungsassistent_required,
further_wachhabender_required, further_wachhabender_required,

View File

@ -64,11 +64,11 @@ pub async fn post(
let mut common_time = (start.and_time(START_OF_DAY), end.and_time(END_OF_DAY)); let mut common_time = (start.and_time(START_OF_DAY), end.and_time(END_OF_DAY));
for assignment in &assignments_for_event { for assignment in &assignments_for_event {
let availability = Availability::read_by_id(pool.get_ref(), assignment.availabillity_id) let availability = Availability::read_by_id(pool.get_ref(), assignment.availability_id)
.await? .await?
.unwrap(); .unwrap();
let all_assignments = let all_assignments =
Assignment::read_all_by_availabillity(pool.get_ref(), assignment.availabillity_id) Assignment::read_all_by_availability(pool.get_ref(), assignment.availability_id)
.await?; .await?;
if all_assignments.len() == 1 { if all_assignments.len() == 1 {
@ -141,7 +141,7 @@ pub async fn post(
function: a.function, function: a.function,
time: changeset.time, time: changeset.time,
}; };
Assignment::update(pool.get_ref(), a.event_id, a.availabillity_id, c).await?; Assignment::update(pool.get_ref(), a.event_id, a.availability_id, c).await?;
} }
} }

View File

@ -25,11 +25,11 @@ struct Export {
year: u16, year: u16,
month: u8, month: u8,
area: String, area: String,
availabillities: Vec<ExportAvailabillity>, availabilities: Vec<ExportAvailability>,
} }
#[derive(Serialize)] #[derive(Serialize)]
struct ExportAvailabillity { struct ExportAvailability {
name: String, name: String,
area: String, area: String,
function: UserFunction, function: UserFunction,
@ -63,12 +63,12 @@ pub async fn get(
user.area_id user.area_id
}; };
let availabillities = let availabilities =
Availability::read_for_export(pool.get_ref(), (start_date, end_date), area_id).await?; Availability::read_for_export(pool.get_ref(), (start_date, end_date), area_id).await?;
let export_availabillities = availabillities let export_availabilities = availabilities
.into_iter() .into_iter()
.map(|a| ExportAvailabillity { .map(|a| ExportAvailability {
name: a.user.as_ref().unwrap().name.clone(), name: a.user.as_ref().unwrap().name.clone(),
area: a.user.as_ref().unwrap().area.as_ref().unwrap().name.clone(), area: a.user.as_ref().unwrap().area.as_ref().unwrap().name.clone(),
function: a.user.unwrap().function, function: a.user.unwrap().function,
@ -88,7 +88,7 @@ pub async fn get(
year: query.year, year: query.year,
month: query.month, month: query.month,
area, area,
availabillities: export_availabillities, availabilities: export_availabilities,
}; };
let (out, content_type) = match query.format.as_str() { let (out, content_type) = match query.format.as_str() {

View File

@ -4,7 +4,7 @@ use sqlx::PgPool;
use crate::{ use crate::{
endpoints::vehicle_assignment::PlanVehiclesPartialTemplate, endpoints::vehicle_assignment::PlanVehiclesPartialTemplate,
models::{Event, Role, User, VehicleAssignement}, models::{Event, Role, User, VehicleAssignment},
utils::{ utils::{
event_planning_template::generate_vehicles_assigned_and_available, ApplicationError, event_planning_template::generate_vehicles_assigned_and_available, ApplicationError,
TemplateResponse, TemplateResponse,
@ -37,12 +37,12 @@ pub async fn delete(
} }
let Some(vehicle_assignment) = let Some(vehicle_assignment) =
VehicleAssignement::read(pool.get_ref(), event.id, query.vehicle).await? VehicleAssignment::read(pool.get_ref(), event.id, query.vehicle).await?
else { else {
return Ok(HttpResponse::NotFound().finish()); return Ok(HttpResponse::NotFound().finish());
}; };
VehicleAssignement::delete( VehicleAssignment::delete(
pool.get_ref(), pool.get_ref(),
vehicle_assignment.event_id, vehicle_assignment.event_id,
vehicle_assignment.vehicle_id, vehicle_assignment.vehicle_id,

View File

@ -4,7 +4,7 @@ use sqlx::PgPool;
use crate::{ use crate::{
endpoints::vehicle_assignment::PlanVehiclesPartialTemplate, endpoints::vehicle_assignment::PlanVehiclesPartialTemplate,
models::{Event, Role, User, Vehicle, VehicleAssignement}, models::{Event, Role, User, Vehicle, VehicleAssignment},
utils::{ utils::{
event_planning_template::generate_vehicles_assigned_and_available, ApplicationError, event_planning_template::generate_vehicles_assigned_and_available, ApplicationError,
TemplateResponse, TemplateResponse,
@ -45,16 +45,16 @@ pub async fn post(
return Ok(HttpResponse::NotFound().finish()); return Ok(HttpResponse::NotFound().finish());
}; };
let existing_assignments_for_vehicle = VehicleAssignement::read_all_by_vehicle_and_date( let existing_assignments_for_vehicle = VehicleAssignment::read_all_by_vehicle_and_date(
pool.get_ref(), pool.get_ref(),
vehicle.id, vehicle.id,
event.start.date(), event.start.date(),
) )
.await?; .await?;
let has_start_time_during_event = let has_start_time_during_event =
|a: &VehicleAssignement| a.start >= event.start && a.start <= event.end; |a: &VehicleAssignment| a.start >= event.start && a.start <= event.end;
let has_end_time_during_event = let has_end_time_during_event =
|a: &VehicleAssignement| a.end >= event.start && a.end <= event.end; |a: &VehicleAssignment| a.end >= event.start && a.end <= event.end;
let availability_already_assigned = existing_assignments_for_vehicle let availability_already_assigned = existing_assignments_for_vehicle
.iter() .iter()
@ -65,7 +65,7 @@ pub async fn post(
.body("Vehicle already assigned to a timely conflicting event.")); .body("Vehicle already assigned to a timely conflicting event."));
} }
VehicleAssignement::create(pool.get_ref(), event.id, vehicle.id, event.start, event.end) VehicleAssignment::create(pool.get_ref(), event.id, vehicle.id, event.start, event.end)
.await?; .await?;
let (vehicles_assigned, vehicles_available) = let (vehicles_assigned, vehicles_available) =

View File

@ -5,7 +5,7 @@ use super::{assignment_changeset::AssignmentChangeset, Function, Result};
pub struct Assignment { pub struct Assignment {
pub event_id: i32, pub event_id: i32,
pub availabillity_id: i32, pub availability_id: i32,
pub function: Function, pub function: Function,
pub start: NaiveDateTime, pub start: NaiveDateTime,
pub end: NaiveDateTime, pub end: NaiveDateTime,
@ -15,16 +15,16 @@ impl Assignment {
pub async fn create( pub async fn create(
pool: &PgPool, pool: &PgPool,
event_id: i32, event_id: i32,
availabillity_id: i32, availability_id: i32,
changeset: AssignmentChangeset, changeset: AssignmentChangeset,
) -> Result<()> { ) -> Result<()> {
query!( query!(
r##" r##"
INSERT INTO assignment (eventId, availabillityId, function, startTimestamp, endTimestamp) INSERT INTO assignment (eventId, availabilityId, function, startTimestamp, endTimestamp)
VALUES ($1, $2, $3, $4, $5); VALUES ($1, $2, $3, $4, $5);
"##, "##,
event_id, event_id,
availabillity_id, availability_id,
changeset.function as Function, changeset.function as Function,
changeset.time.0.and_utc(), changeset.time.0.and_utc(),
changeset.time.1.and_utc() changeset.time.1.and_utc()
@ -35,22 +35,22 @@ impl Assignment {
Ok(()) Ok(())
} }
pub async fn read_all_by_availabillity( pub async fn read_all_by_availability(
pool: &PgPool, pool: &PgPool,
availabillity_id: i32, availability_id: i32,
) -> Result<Vec<Assignment>> { ) -> Result<Vec<Assignment>> {
let records = query!( let records = query!(
r##" r##"
SELECT SELECT
assignment.eventId, assignment.eventId,
assignment.availabillityId, assignment.availabilityId,
assignment.function AS "function: Function", assignment.function AS "function: Function",
assignment.startTimestamp, assignment.startTimestamp,
assignment.endTimestamp assignment.endTimestamp
FROM assignment FROM assignment
WHERE assignment.AvailabillityId = $1; WHERE assignment.AvailabilityId = $1;
"##, "##,
availabillity_id availability_id
) )
.fetch_all(pool) .fetch_all(pool)
.await?; .await?;
@ -59,7 +59,7 @@ impl Assignment {
.iter() .iter()
.map(|r| Assignment { .map(|r| Assignment {
event_id: r.eventid, event_id: r.eventid,
availabillity_id: r.availabillityid, availability_id: r.availabilityid,
function: r.function, function: r.function,
start: r.starttimestamp.naive_utc(), start: r.starttimestamp.naive_utc(),
end: r.endtimestamp.naive_utc(), end: r.endtimestamp.naive_utc(),
@ -74,7 +74,7 @@ impl Assignment {
r##" r##"
SELECT SELECT
assignment.eventId, assignment.eventId,
assignment.availabillityId, assignment.availabilityId,
assignment.function AS "function: Function", assignment.function AS "function: Function",
assignment.startTimestamp, assignment.startTimestamp,
assignment.endTimestamp assignment.endTimestamp
@ -90,7 +90,7 @@ impl Assignment {
.iter() .iter()
.map(|r| Assignment { .map(|r| Assignment {
event_id: r.eventid, event_id: r.eventid,
availabillity_id: r.availabillityid, availability_id: r.availabilityid,
function: r.function, function: r.function,
start: r.starttimestamp.naive_utc(), start: r.starttimestamp.naive_utc(),
end: r.endtimestamp.naive_utc(), end: r.endtimestamp.naive_utc(),
@ -103,30 +103,30 @@ impl Assignment {
pub async fn read( pub async fn read(
pool: &PgPool, pool: &PgPool,
event_id: i32, event_id: i32,
availabillity_id: i32, availability_id: i32,
) -> Result<Option<Assignment>> { ) -> Result<Option<Assignment>> {
let record = query!( let record = query!(
r##" r##"
SELECT SELECT
assignment.eventId, assignment.eventId,
assignment.availabillityId, assignment.availabilityId,
assignment.function AS "function: Function", assignment.function AS "function: Function",
assignment.startTimestamp, assignment.startTimestamp,
assignment.endTimestamp assignment.endTimestamp
FROM assignment FROM assignment
WHERE WHERE
assignment.eventId = $1 AND assignment.eventId = $1 AND
assignment.availabillityId = $2; assignment.availabilityId = $2;
"##, "##,
event_id, event_id,
availabillity_id availability_id
) )
.fetch_optional(pool) .fetch_optional(pool)
.await?; .await?;
let assignemnet = record.map(|r| Assignment { let assignemnet = record.map(|r| Assignment {
event_id: r.eventid, event_id: r.eventid,
availabillity_id: r.availabillityid, availability_id: r.availabilityid,
function: r.function, function: r.function,
start: r.starttimestamp.naive_utc(), start: r.starttimestamp.naive_utc(),
end: r.endtimestamp.naive_utc(), end: r.endtimestamp.naive_utc(),
@ -138,18 +138,18 @@ impl Assignment {
pub async fn update( pub async fn update(
pool: &PgPool, pool: &PgPool,
event_id: i32, event_id: i32,
availabillity_id: i32, availability_id: i32,
changeset: AssignmentChangeset, changeset: AssignmentChangeset,
) -> Result<()> { ) -> Result<()> {
query!("UPDATE assignment SET function = $1, startTimestamp = $2, endTimestamp = $3 WHERE eventId = $4 AND availabillityId = $5;", changeset.function as Function, changeset.time.0.and_utc(), changeset.time.1.and_utc(), event_id, availabillity_id).execute(pool).await?; query!("UPDATE assignment SET function = $1, startTimestamp = $2, endTimestamp = $3 WHERE eventId = $4 AND availabilityId = $5;", changeset.function as Function, changeset.time.0.and_utc(), changeset.time.1.and_utc(), event_id, availability_id).execute(pool).await?;
Ok(()) Ok(())
} }
pub async fn delete(pool: &PgPool, event_id: i32, availabillity_id: i32) -> Result<()> { pub async fn delete(pool: &PgPool, event_id: i32, availability_id: i32) -> Result<()> {
query!("DELETE FROM assignment WHERE assignment.eventId = $1 AND assignment.availabillityId = $2;", query!("DELETE FROM assignment WHERE assignment.eventId = $1 AND assignment.availabilityId = $2;",
event_id, event_id,
availabillity_id availability_id
) )
.execute(pool) .execute(pool)
.await?; .await?;

View File

@ -8,7 +8,7 @@ use super::{
#[derive(Validate)] #[derive(Validate)]
#[garde(allow_unvalidated)] #[garde(allow_unvalidated)]
#[garde(context(AssignmentContext as ctx))] #[garde(context(AssignmentContext as ctx))]
/// check before: event and availabillity and must exist and user of availabillity is in event location /// check before: event and availability and must exist and user of availability is in event location
pub struct AssignmentChangeset { pub struct AssignmentChangeset {
#[garde( #[garde(
custom(user_of_availability_has_function), custom(user_of_availability_has_function),
@ -18,24 +18,24 @@ pub struct AssignmentChangeset {
#[garde( #[garde(
custom(available_time_fits), custom(available_time_fits),
custom(start_date_time_lies_before_end_date_time), custom(start_date_time_lies_before_end_date_time),
custom(availabillity_not_already_assigned) custom(availability_not_already_assigned)
)] )]
pub time: (NaiveDateTime, NaiveDateTime), pub time: (NaiveDateTime, NaiveDateTime),
} }
pub struct AssignmentContext { pub struct AssignmentContext {
pub event: Event, pub event: Event,
pub availabillity: Availability, pub availability: Availability,
pub user_function: UserFunction, pub user_function: UserFunction,
pub assignments_for_event: Vec<Assignment>, pub assignments_for_event: Vec<Assignment>,
pub assignments_for_availabillity: Vec<Assignment>, pub assignments_for_availability: Vec<Assignment>,
} }
fn available_time_fits( fn available_time_fits(
value: &(NaiveDateTime, NaiveDateTime), value: &(NaiveDateTime, NaiveDateTime),
context: &AssignmentContext, context: &AssignmentContext,
) -> garde::Result { ) -> garde::Result {
if value.0 < context.availabillity.start || value.1 > context.availabillity.end { if value.0 < context.availability.start || value.1 > context.availability.end {
return Err(garde::Error::new( return Err(garde::Error::new(
"time not made available can't be assigned", "time not made available can't be assigned",
)); ));
@ -65,7 +65,7 @@ fn event_has_free_slot_for_function(
.assignments_for_event .assignments_for_event
.iter() .iter()
.filter(|a| { .filter(|a| {
a.availabillity_id != context.availabillity.id && a.event_id != context.event.id a.availability_id != context.availability.id && a.event_id != context.event.id
}) })
.collect(); .collect();
@ -86,15 +86,15 @@ fn event_has_free_slot_for_function(
Ok(()) Ok(())
} }
fn availabillity_not_already_assigned( fn availability_not_already_assigned(
value: &(NaiveDateTime, NaiveDateTime), value: &(NaiveDateTime, NaiveDateTime),
context: &AssignmentContext, context: &AssignmentContext,
) -> garde::Result { ) -> garde::Result {
let list: Vec<&Assignment> = context let list: Vec<&Assignment> = context
.assignments_for_availabillity .assignments_for_availability
.iter() .iter()
.filter(|a| { .filter(|a| {
a.availabillity_id != context.availabillity.id && a.event_id != context.event.id a.availability_id != context.availability.id && a.event_id != context.event.id
}) })
.collect(); .collect();
@ -107,7 +107,7 @@ fn availabillity_not_already_assigned(
.any(|a| has_start_time_during_assignment(a) || has_end_time_during_assignment(a)) .any(|a| has_start_time_during_assignment(a) || has_end_time_during_assignment(a))
{ {
return Err(garde::Error::new( return Err(garde::Error::new(
"availabillity is already assigned for that time", "availability is already assigned for that time",
)); ));
} }

View File

@ -14,7 +14,6 @@ pub struct Availability {
} }
impl Availability { impl Availability {
// TODO: fix db name
pub async fn create( pub async fn create(
pool: &PgPool, pool: &PgPool,
user_id: i32, user_id: i32,
@ -22,7 +21,7 @@ impl Availability {
) -> Result<()> { ) -> Result<()> {
query!( query!(
r#" r#"
INSERT INTO availabillity (userId, startTimestamp, endTimestamp, comment) INSERT INTO availability (userId, startTimestamp, endTimestamp, comment)
VALUES ($1, $2, $3, $4); VALUES ($1, $2, $3, $4);
"#, "#,
user_id, user_id,
@ -44,11 +43,11 @@ impl Availability {
let records = query!( let records = query!(
r##" r##"
SELECT SELECT
availabillity.id, availability.id,
availabillity.userId, availability.userId,
availabillity.startTimestamp, availability.startTimestamp,
availabillity.endTimestamp, availability.endTimestamp,
availabillity.comment, availability.comment,
user_.name, user_.name,
user_.email, user_.email,
user_.password, user_.password,
@ -59,9 +58,9 @@ impl Availability {
user_.locked, user_.locked,
user_.lastLogin, user_.lastLogin,
user_.receiveNotifications user_.receiveNotifications
FROM availabillity FROM availability
JOIN user_ ON availabillity.userId = user_.id JOIN user_ ON availability.userId = user_.id
WHERE availabillity.startTimestamp::date = $1 WHERE availability.startTimestamp::date = $1
AND user_.areaId = $2; AND user_.areaId = $2;
"##, "##,
date, date,
@ -70,7 +69,7 @@ impl Availability {
.fetch_all(pool) .fetch_all(pool)
.await?; .await?;
let availabillities = records let availabilities = records
.iter() .iter()
.map(|r| Availability { .map(|r| Availability {
id: r.id, id: r.id,
@ -95,7 +94,7 @@ impl Availability {
}) })
.collect(); .collect();
Ok(availabillities) Ok(availabilities)
} }
pub async fn read_by_date_time_area_including_user( pub async fn read_by_date_time_area_including_user(
@ -107,11 +106,11 @@ impl Availability {
let records = query!( let records = query!(
r##" r##"
SELECT SELECT
availabillity.id, availability.id,
availabillity.userId, availability.userId,
availabillity.startTimestamp, availability.startTimestamp,
availabillity.endTimestamp, availability.endTimestamp,
availabillity.comment, availability.comment,
user_.name, user_.name,
user_.email, user_.email,
user_.password, user_.password,
@ -122,11 +121,11 @@ impl Availability {
user_.locked, user_.locked,
user_.lastLogin, user_.lastLogin,
user_.receiveNotifications user_.receiveNotifications
FROM availabillity FROM availability
JOIN user_ ON availabillity.userId = user_.id JOIN user_ ON availability.userId = user_.id
WHERE availabillity.starttimestamp::date = $1 WHERE availability.starttimestamp::date = $1
AND user_.areaId = $2 AND user_.areaId = $2
AND availabillity.startTimestamp <= $3 AND availabillity.endTimestamp >= $4; AND availability.startTimestamp <= $3 AND availability.endTimestamp >= $4;
"##, "##,
date, date,
area_id, area_id,
@ -136,7 +135,7 @@ impl Availability {
.fetch_all(pool) .fetch_all(pool)
.await?; .await?;
let availabillities = records let availabilities = records
.iter() .iter()
.map(|r| Availability { .map(|r| Availability {
id: r.id, id: r.id,
@ -161,18 +160,18 @@ impl Availability {
}) })
.collect(); .collect();
Ok(availabillities) Ok(availabilities)
} }
pub async fn read_by_id_including_user(pool: &PgPool, id: i32) -> Result<Option<Availability>> { pub async fn read_by_id_including_user(pool: &PgPool, id: i32) -> Result<Option<Availability>> {
let record = query!( let record = query!(
r##" r##"
SELECT SELECT
availabillity.id, availability.id,
availabillity.userId, availability.userId,
availabillity.startTimestamp, availability.startTimestamp,
availabillity.endTimestamp, availability.endTimestamp,
availabillity.comment, availability.comment,
user_.name, user_.name,
user_.email, user_.email,
user_.password, user_.password,
@ -183,17 +182,17 @@ impl Availability {
user_.locked, user_.locked,
user_.lastLogin, user_.lastLogin,
user_.receiveNotifications user_.receiveNotifications
FROM availabillity FROM availability
LEFT JOIN assignment ON availabillity.Id = assignment.availabillityId LEFT JOIN assignment ON availability.Id = assignment.availabilityId
JOIN user_ ON availabillity.userId = user_.id JOIN user_ ON availability.userId = user_.id
WHERE availabillity.id = $1; WHERE availability.id = $1;
"##, "##,
id id
) )
.fetch_optional(pool) .fetch_optional(pool)
.await?; .await?;
let availabillity = record.map(|r| Availability { let availability = record.map(|r| Availability {
id: r.id, id: r.id,
user_id: r.userid, user_id: r.userid,
user: Some(User { user: Some(User {
@ -215,15 +214,15 @@ impl Availability {
comment: r.comment.clone(), comment: r.comment.clone(),
}); });
Ok(availabillity) Ok(availability)
} }
pub async fn read_by_id(pool: &PgPool, id: i32) -> Result<Option<Availability>> { pub async fn read_by_id(pool: &PgPool, id: i32) -> Result<Option<Availability>> {
let record = query!("SELECT * FROM availabillity WHERE id = $1", id) let record = query!("SELECT * FROM availability WHERE id = $1", id)
.fetch_optional(pool) .fetch_optional(pool)
.await?; .await?;
let availabillity = record.map(|record| Availability { let availability = record.map(|record| Availability {
id: record.id, id: record.id,
user_id: record.userid, user_id: record.userid,
user: None, user: None,
@ -232,7 +231,7 @@ impl Availability {
comment: record.comment.clone(), comment: record.comment.clone(),
}); });
Ok(availabillity) Ok(availability)
} }
pub async fn read_for_export( pub async fn read_for_export(
@ -243,11 +242,11 @@ impl Availability {
let records = query!( let records = query!(
r##" r##"
SELECT SELECT
availabillity.id, availability.id,
availabillity.userId, availability.userId,
availabillity.startTimestamp, availability.startTimestamp,
availabillity.endTimestamp, availability.endTimestamp,
availabillity.comment, availability.comment,
user_.name, user_.name,
user_.email, user_.email,
user_.password, user_.password,
@ -259,12 +258,12 @@ impl Availability {
user_.lastLogin, user_.lastLogin,
user_.receiveNotifications, user_.receiveNotifications,
area.name AS areaName area.name AS areaName
FROM availabillity FROM availability
JOIN user_ ON availabillity.userId = user_.id JOIN user_ ON availability.userId = user_.id
JOIN area ON user_.areaId = area.id JOIN area ON user_.areaId = area.id
WHERE user_.areaId = $1 AND WHERE user_.areaId = $1 AND
availabillity.starttimestamp::date >= $2 AND availability.starttimestamp::date >= $2 AND
availabillity.starttimestamp::date <= $3; availability.starttimestamp::date <= $3;
"##, "##,
area_id, area_id,
date_range.0, date_range.0,
@ -273,7 +272,7 @@ impl Availability {
.fetch_all(pool) .fetch_all(pool)
.await?; .await?;
let availabillities = records let availabilities = records
.iter() .iter()
.map(|r| Availability { .map(|r| Availability {
id: r.id, id: r.id,
@ -301,7 +300,7 @@ impl Availability {
}) })
.collect(); .collect();
Ok(availabillities) Ok(availabilities)
} }
pub async fn read_by_user_and_date( pub async fn read_by_user_and_date(
@ -312,14 +311,14 @@ impl Availability {
let records = query!( let records = query!(
r##" r##"
SELECT SELECT
availabillity.id, availability.id,
availabillity.userId, availability.userId,
availabillity.startTimestamp, availability.startTimestamp,
availabillity.endTimestamp, availability.endTimestamp,
availabillity.comment availability.comment
FROM availabillity FROM availability
WHERE availabillity.userId = $1 WHERE availability.userId = $1
AND availabillity.starttimestamp::date = $2; AND availability.starttimestamp::date = $2;
"##, "##,
user_id, user_id,
date date
@ -327,7 +326,7 @@ impl Availability {
.fetch_all(pool) .fetch_all(pool)
.await?; .await?;
let availabillities = records let availabilities = records
.iter() .iter()
.map(|r| Availability { .map(|r| Availability {
id: r.id, id: r.id,
@ -339,12 +338,12 @@ impl Availability {
}) })
.collect(); .collect();
Ok(availabillities) Ok(availabilities)
} }
pub async fn update(pool: &PgPool, id: i32, changeset: AvailabilityChangeset) -> Result<()> { pub async fn update(pool: &PgPool, id: i32, changeset: AvailabilityChangeset) -> Result<()> {
query!( query!(
"UPDATE availabillity SET startTimestamp = $1, endTimestamp = $2, comment = $3 WHERE id = $4", "UPDATE availability SET startTimestamp = $1, endTimestamp = $2, comment = $3 WHERE id = $4",
changeset.time.0.and_utc(), changeset.time.0.and_utc(),
changeset.time.1.and_utc(), changeset.time.1.and_utc(),
changeset.comment, changeset.comment,
@ -357,7 +356,7 @@ impl Availability {
} }
pub async fn delete(pool: &PgPool, id: i32) -> Result<()> { pub async fn delete(pool: &PgPool, id: i32) -> Result<()> {
query!("DELETE FROM availabillity WHERE id = $1", id) query!("DELETE FROM availability WHERE id = $1", id)
.execute(pool) .execute(pool)
.await?; .await?;
Ok(()) Ok(())

View File

@ -0,0 +1,14 @@
#[derive(PartialEq, Eq, Debug)]
pub enum AvailabilityAssignmentState {
// availability is not assigned at all or at least not timely conflicting
Unassigned,
// availability is assigned for another event that is timely conflicting
Conflicting,
// availability is assigned to this event as Posten
AssignedPosten(i32),
// availability is assigned to this event as Führungsassistent
AssignedFührungsassistent(i32),
// availability is assigned to this event as Wachhabender
AssignedWachhabender(i32),
}

View File

@ -1,14 +0,0 @@
#[derive(PartialEq, Eq, Debug)]
pub enum AvailabillityAssignmentState {
// availabillity is not assigned at all or at least not timely conflicting
Unassigned,
// availabillity is assigned for another event that is timely conflicting
Conflicting,
// availabillity is assigned to this event as Posten
AssignedPosten(i32),
// availabillity is assigned to this event as Führungsassistent
AssignedFührungsassistent(i32),
// availabillity is assigned to this event as Wachhabender
AssignedWachhabender(i32),
}

View File

@ -1,9 +1,9 @@
mod area; mod area;
mod assignement; mod assignment;
mod assignment_changeset; mod assignment_changeset;
mod availability;
mod availability_assignment_state;
mod availability_changeset; mod availability_changeset;
mod availabillity;
mod availabillity_assignment_state;
mod event; mod event;
mod event_changeset; mod event_changeset;
mod function; mod function;
@ -15,17 +15,16 @@ mod user;
mod user_changeset; mod user_changeset;
mod user_funtion; mod user_funtion;
mod vehicle; mod vehicle;
mod vehicle_assignement; mod vehicle_assignment;
pub use area::Area; pub use area::Area;
pub use assignement::Assignment; pub use assignment::Assignment;
pub use assignment_changeset::{AssignmentChangeset, AssignmentContext}; pub use assignment_changeset::{AssignmentChangeset, AssignmentContext};
pub use availability::Availability;
pub use availability_assignment_state::AvailabilityAssignmentState;
pub use availability_changeset::{ pub use availability_changeset::{
find_free_date_time_slots, AvailabilityChangeset, AvailabilityContext, find_free_date_time_slots, AvailabilityChangeset, AvailabilityContext,
}; };
pub use availabillity::Availability;
pub use availabillity_assignment_state::AvailabillityAssignmentState;
use chrono::NaiveDateTime;
pub use event::Event; pub use event::Event;
pub use event_changeset::{EventChangeset, EventContext}; pub use event_changeset::{EventChangeset, EventContext};
pub use function::Function; pub use function::Function;
@ -37,7 +36,9 @@ pub use user::User;
pub use user_changeset::UserChangeset; pub use user_changeset::UserChangeset;
pub use user_funtion::UserFunction; pub use user_funtion::UserFunction;
pub use vehicle::Vehicle; pub use vehicle::Vehicle;
pub use vehicle_assignement::VehicleAssignement; pub use vehicle_assignment::VehicleAssignment;
use chrono::NaiveDateTime;
type Result<T> = std::result::Result<T, sqlx::Error>; type Result<T> = std::result::Result<T, sqlx::Error>;

View File

@ -3,14 +3,14 @@ use sqlx::{query, PgPool};
use super::Result; use super::Result;
pub struct VehicleAssignement { pub struct VehicleAssignment {
pub event_id: i32, pub event_id: i32,
pub vehicle_id: i32, pub vehicle_id: i32,
pub start: NaiveDateTime, pub start: NaiveDateTime,
pub end: NaiveDateTime, pub end: NaiveDateTime,
} }
impl VehicleAssignement { impl VehicleAssignment {
pub async fn create( pub async fn create(
pool: &PgPool, pool: &PgPool,
event_id: i32, event_id: i32,
@ -19,7 +19,7 @@ impl VehicleAssignement {
end: NaiveDateTime, end: NaiveDateTime,
) -> Result<()> { ) -> Result<()> {
query!( query!(
"INSERT INTO vehicleassignement (eventId, vehicleId, startTimestamp, endTimestamp) VALUES ($1, $2, $3, $4);", "INSERT INTO vehicleassignment (eventId, vehicleId, startTimestamp, endTimestamp) VALUES ($1, $2, $3, $4);",
event_id, event_id,
vehicle_id, vehicle_id,
start.and_utc(), start.and_utc(),
@ -35,11 +35,11 @@ impl VehicleAssignement {
pool: &PgPool, pool: &PgPool,
event_id: i32, event_id: i32,
vehicle_id: i32, vehicle_id: i32,
) -> Result<Option<VehicleAssignement>> { ) -> Result<Option<VehicleAssignment>> {
let record = query!("SELECT * FROM vehicleAssignement WHERE vehicleAssignement.eventId = $1 AND vehicleAssignement.vehicleId = $2;", event_id, vehicle_id).fetch_optional(pool) let record = query!("SELECT * FROM vehicleassignment WHERE vehicleassignment.eventId = $1 AND vehicleassignment.vehicleId = $2;", event_id, vehicle_id).fetch_optional(pool)
.await?; .await?;
let vehicle_assignment = record.map(|r| VehicleAssignement { let vehicle_assignment = record.map(|r| VehicleAssignment {
event_id: r.eventid, event_id: r.eventid,
vehicle_id: r.vehicleid, vehicle_id: r.vehicleid,
start: r.starttimestamp.naive_utc(), start: r.starttimestamp.naive_utc(),
@ -52,9 +52,9 @@ impl VehicleAssignement {
pub async fn read_all_by_event( pub async fn read_all_by_event(
pool: &PgPool, pool: &PgPool,
event_id: i32, event_id: i32,
) -> Result<Vec<VehicleAssignement>> { ) -> Result<Vec<VehicleAssignment>> {
let records = query!( let records = query!(
"SELECT * FROM vehicleAssignement WHERE vehicleAssignement.eventId = $1;", "SELECT * FROM vehicleassignment WHERE vehicleassignment.eventId = $1;",
event_id event_id
) )
.fetch_all(pool) .fetch_all(pool)
@ -62,7 +62,7 @@ impl VehicleAssignement {
let vehicle_assignments = records let vehicle_assignments = records
.iter() .iter()
.map(|r| VehicleAssignement { .map(|r| VehicleAssignment {
event_id: r.eventid, event_id: r.eventid,
vehicle_id: r.vehicleid, vehicle_id: r.vehicleid,
start: r.starttimestamp.naive_utc(), start: r.starttimestamp.naive_utc(),
@ -77,17 +77,17 @@ impl VehicleAssignement {
pool: &PgPool, pool: &PgPool,
vehicle_id: i32, vehicle_id: i32,
date: NaiveDate, date: NaiveDate,
) -> Result<Vec<VehicleAssignement>> { ) -> Result<Vec<VehicleAssignment>> {
let records = query!( let records = query!(
r#" r#"
SELECT SELECT
vehicleAssignement.eventId, vehicleassignment.eventId,
vehicleAssignement.vehicleId, vehicleassignment.vehicleId,
vehicleAssignement.starttimestamp, vehicleassignment.starttimestamp,
vehicleAssignement.endtimestamp vehicleassignment.endtimestamp
FROM vehicleAssignement FROM vehicleassignment
JOIN event ON vehicleAssignement.eventId = event.id JOIN event ON vehicleassignment.eventId = event.id
WHERE vehicleAssignement.vehicleid = $1 WHERE vehicleassignment.vehicleid = $1
AND event.starttimestamp::date = $2; AND event.starttimestamp::date = $2;
"#, "#,
vehicle_id, vehicle_id,
@ -98,7 +98,7 @@ impl VehicleAssignement {
let vehicle_assignments = records let vehicle_assignments = records
.iter() .iter()
.map(|r| VehicleAssignement { .map(|r| VehicleAssignment {
event_id: r.eventid, event_id: r.eventid,
vehicle_id: r.vehicleid, vehicle_id: r.vehicleid,
start: r.starttimestamp.naive_utc(), start: r.starttimestamp.naive_utc(),
@ -111,7 +111,7 @@ impl VehicleAssignement {
pub async fn delete(pool: &PgPool, event_id: i32, vehicle_id: i32) -> Result<()> { pub async fn delete(pool: &PgPool, event_id: i32, vehicle_id: i32) -> Result<()> {
query!( query!(
"DELETE FROM vehicleassignement WHERE eventId = $1 AND vehicleId = $2;", "DELETE FROM vehicleassignment WHERE eventId = $1 AND vehicleId = $2;",
event_id, event_id,
vehicle_id vehicle_id
) )

View File

@ -1,17 +1,17 @@
use sqlx::PgPool; use sqlx::PgPool;
use crate::models::{ use crate::models::{
Assignment, Availability, AvailabillityAssignmentState, Event, Function, Vehicle, Assignment, Availability, AvailabilityAssignmentState, Event, Function, Vehicle,
VehicleAssignement, VehicleAssignment,
}; };
use super::ApplicationError; use super::ApplicationError;
pub async fn generate_availabillity_assignment_list( pub async fn generate_availability_assignment_list(
pool: &PgPool, pool: &PgPool,
event: &Event, event: &Event,
) -> Result<Vec<(Availability, AvailabillityAssignmentState)>, ApplicationError> { ) -> Result<Vec<(Availability, AvailabilityAssignmentState)>, ApplicationError> {
let availabillities_in_db = Availability::read_by_date_time_area_including_user( let availabilities_in_db = Availability::read_by_date_time_area_including_user(
pool, pool,
event.start.date(), event.start.date(),
(event.start, event.end), (event.start, event.end),
@ -19,9 +19,9 @@ pub async fn generate_availabillity_assignment_list(
) )
.await?; .await?;
let mut availabillities = Vec::new(); let mut availabilities = Vec::new();
for availabillity in availabillities_in_db { for availability in availabilities_in_db {
let assignments = Assignment::read_all_by_availabillity(pool, availabillity.id).await?; let assignments = Assignment::read_all_by_availability(pool, availability.id).await?;
if let Some(assignment) = assignments if let Some(assignment) = assignments
.iter() .iter()
@ -29,19 +29,19 @@ pub async fn generate_availabillity_assignment_list(
{ {
let state = match assignment.function { let state = match assignment.function {
Function::Posten => { Function::Posten => {
AvailabillityAssignmentState::AssignedPosten(assignment.availabillity_id) AvailabilityAssignmentState::AssignedPosten(assignment.availability_id)
} }
Function::Fuehrungsassistent => { Function::Fuehrungsassistent => {
AvailabillityAssignmentState::AssignedFührungsassistent( AvailabilityAssignmentState::AssignedFührungsassistent(
assignment.availabillity_id, assignment.availability_id,
) )
} }
Function::Wachhabender => { Function::Wachhabender => {
AvailabillityAssignmentState::AssignedWachhabender(assignment.availabillity_id) AvailabilityAssignmentState::AssignedWachhabender(assignment.availability_id)
} }
}; };
availabillities.push((availabillity, state)); availabilities.push((availability, state));
continue; continue;
} }
@ -53,15 +53,15 @@ pub async fn generate_availabillity_assignment_list(
.iter() .iter()
.any(|a| has_start_time_during_event(a) || has_end_time_during_event(a)) .any(|a| has_start_time_during_event(a) || has_end_time_during_event(a))
{ {
availabillities.push((availabillity, AvailabillityAssignmentState::Conflicting)); availabilities.push((availability, AvailabilityAssignmentState::Conflicting));
continue; continue;
} }
availabillities.push((availabillity, AvailabillityAssignmentState::Unassigned)); availabilities.push((availability, AvailabilityAssignmentState::Unassigned));
} }
//println!(" {availabillities:#?}"); //println!(" {availabilities:#?}");
Ok(availabillities) Ok(availabilities)
} }
pub async fn generate_status_whether_staff_is_required( pub async fn generate_status_whether_staff_is_required(
@ -100,7 +100,7 @@ pub async fn generate_vehicles_assigned_and_available(
) -> Result<(Vec<Vehicle>, Vec<Vehicle>), ApplicationError> { ) -> Result<(Vec<Vehicle>, Vec<Vehicle>), ApplicationError> {
let all_vehicles = Vehicle::read_all(pool).await?; let all_vehicles = Vehicle::read_all(pool).await?;
let existing_vehicle_assignments_for_event = let existing_vehicle_assignments_for_event =
VehicleAssignement::read_all_by_event(pool, event.id).await?; VehicleAssignment::read_all_by_event(pool, event.id).await?;
let (vehicles_assigned, vehicles_available): (Vec<Vehicle>, Vec<Vehicle>) = let (vehicles_assigned, vehicles_available): (Vec<Vehicle>, Vec<Vehicle>) =
all_vehicles.into_iter().partition(|v| { all_vehicles.into_iter().partition(|v| {
existing_vehicle_assignments_for_event existing_vehicle_assignments_for_event

View File

@ -4,7 +4,7 @@
<section class="section"> <section class="section">
<div class="container"> <div class="container">
{% let is_edit = id.is_some() %} {% let is_edit = id.is_some() %}
<form method="post" action="/availabillity/{% if is_edit %}edit/{{ id.unwrap() }}{% else %}new{% endif %}"> <form method="post" action="/availability/{% if is_edit %}edit/{{ id.unwrap() }}{% else %}new{% endif %}">
<h1 class="title">{% if is_edit %}Bearbeite{% else %}Neue{% endif %} Vefügbarkeit für den {{ date|date_d }}</h1> <h1 class="title">{% if is_edit %}Bearbeite{% else %}Neue{% endif %} Vefügbarkeit für den {{ date|date_d }}</h1>
<input type="hidden" name="startdate" value="{{ date }}"> <input type="hidden" name="startdate" value="{{ date }}">

View File

@ -19,35 +19,35 @@
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
{% for (availabillity, status) in availabillities %} {% for (availability, status) in availabilities %}
{% let u = availabillity.user.as_ref().unwrap() %} {% let u = availability.user.as_ref().unwrap() %}
<tr> <tr>
<td>{{ u.name }}</td> <td>{{ u.name }}</td>
<td> <td>
{{ u.function|show_tree|safe }} {{ u.function|show_tree|safe }}
</td> </td>
<td> <td>
{{ availabillity.start.format("%R") }} bis {{ availabillity.end.format("%d.%m.%Y %R") }} {{ availability.start.format("%R") }} bis {{ availability.end.format("%d.%m.%Y %R") }}
</td> </td>
<td> <td>
{{ availabillity.comment.as_deref().unwrap_or("") }} {{ availability.comment.as_deref().unwrap_or("") }}
</td> </td>
<td> <td>
<div class="dropdown"> <div class="dropdown">
<div class="dropdown-trigger"> <div class="dropdown-trigger">
<button class="button" aria-haspopup="true" aria-controls="dropdown-menu"> <button class="button" aria-haspopup="true" aria-controls="dropdown-menu">
{% match status %} {% match status %}
{% when AvailabillityAssignmentState::AssignedPosten(_) %} {% when AvailabilityAssignmentState::AssignedPosten(_) %}
<span>als Posten geplant</span> <span>als Posten geplant</span>
<svg class="icon"> <svg class="icon">
<use href="/static/feather-sprite.svg#edit-2" /> <use href="/static/feather-sprite.svg#edit-2" />
</svg> </svg>
{% when AvailabillityAssignmentState::AssignedFührungsassistent(_) %} {% when AvailabilityAssignmentState::AssignedFührungsassistent(_) %}
<span>als Führungsassistent geplant</span> <span>als Führungsassistent geplant</span>
<svg class="icon"> <svg class="icon">
<use href="/static/feather-sprite.svg#edit-2" /> <use href="/static/feather-sprite.svg#edit-2" />
</svg> </svg>
{% when AvailabillityAssignmentState::AssignedWachhabender(_) %} {% when AvailabilityAssignmentState::AssignedWachhabender(_) %}
<span>als Wachhabender geplant</span> <span>als Wachhabender geplant</span>
<svg class="icon"> <svg class="icon">
<use href="/static/feather-sprite.svg#edit-2" /> <use href="/static/feather-sprite.svg#edit-2" />
@ -64,27 +64,27 @@
<div class="dropdown-content" hx-target="closest table" hx-swap="outerHTML"> <div class="dropdown-content" hx-target="closest table" hx-swap="outerHTML">
{% if u.function.is_posten() %} {% if u.function.is_posten() %}
<a class="dropdown-item" <a class="dropdown-item"
hx-post="/assignments/new?event={{ event.id }}&availabillity={{ availabillity.id }}&function=1" {% if hx-post="/assignments/new?event={{ event.id }}&availability={{ availability.id }}&function=1" {% if
!further_posten_required || status !=AvailabillityAssignmentState::Unassigned|ref %}disabled{% endif %}> !further_posten_required || status !=AvailabilityAssignmentState::Unassigned|ref %}disabled{% endif %}>
als Posten planen</a> als Posten planen</a>
{% endif %} {% endif %}
{% if u.function.is_fuehrungsassistent() %} {% if u.function.is_fuehrungsassistent() %}
<a class="dropdown-item" <a class="dropdown-item"
hx-post="/assignments/new?event={{ event.id }}&availabillity={{ availabillity.id }}&function=5" {% if hx-post="/assignments/new?event={{ event.id }}&availability={{ availability.id }}&function=5" {% if
!further_fuehrungsassistent_required || status !=AvailabillityAssignmentState::Unassigned|ref !further_fuehrungsassistent_required || status !=AvailabilityAssignmentState::Unassigned|ref
%}disabled{% endif %}>als Führungsassistent planen</a> %}disabled{% endif %}>als Führungsassistent planen</a>
{% endif %} {% endif %}
{% if u.function.is_wachhabender() %} {% if u.function.is_wachhabender() %}
<a class="dropdown-item" <a class="dropdown-item"
hx-post="/assignments/new?event={{ event.id }}&availabillity={{ availabillity.id }}&function=10" {% if hx-post="/assignments/new?event={{ event.id }}&availability={{ availability.id }}&function=10" {% if
!further_wachhabender_required || status !=AvailabillityAssignmentState::Unassigned|ref %}disabled{% !further_wachhabender_required || status !=AvailabilityAssignmentState::Unassigned|ref %}disabled{%
endif %}>als Wachhabender planen</a> endif %}>als Wachhabender planen</a>
{% endif %} {% endif %}
{% if status != AvailabillityAssignmentState::Unassigned|ref && status != {% if status != AvailabilityAssignmentState::Unassigned|ref && status !=
AvailabillityAssignmentState::Conflicting|ref %} AvailabilityAssignmentState::Conflicting|ref %}
<hr class="dropdown-divider" /> <hr class="dropdown-divider" />
<a class="dropdown-item" <a class="dropdown-item"
hx-delete="/assignments/delete?event={{ event.id }}&availabillity={{ availabillity.id }}" hx-delete="/assignments/delete?event={{ event.id }}&availability={{ availability.id }}"
class="button is-small">entplanen</a> class="button is-small">entplanen</a>
{% endif %} {% endif %}
</div> </div>

View File

@ -185,8 +185,8 @@
</div> </div>
{% if selected_area.is_none() || selected_area.unwrap() == user.area_id %} {% if selected_area.is_none() || selected_area.unwrap() == user.area_id %}
<div class="level-right"> <div class="level-right">
{% let btn_disabled = !user_can_create_availabillity %} {% let btn_disabled = !user_can_create_availability %}
<button class="button is-link is-light" hx-get="/availabillity/new?date={{ date }}" {{ <button class="button is-link is-light" hx-get="/availability/new?date={{ date }}" {{
btn_disabled|cond_show("disabled") }} hx-target="closest body"> btn_disabled|cond_show("disabled") }} hx-target="closest body">
<svg class="icon"> <svg class="icon">
<use href="/static/feather-sprite.svg#plus-circle" /> <use href="/static/feather-sprite.svg#plus-circle" />
@ -197,7 +197,7 @@
{% endif %} {% endif %}
</div> </div>
{% if availabillities.len() == 0 %} {% if availabilities.len() == 0 %}
<div class="box"> <div class="box">
<h5 class="subtitle is-5">keine Verfügbarkeiten eingetragen</h5> <h5 class="subtitle is-5">keine Verfügbarkeiten eingetragen</h5>
</div> </div>
@ -214,30 +214,30 @@
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
{% for availabillity in availabillities %} {% for availability in availabilities %}
{% let u = availabillity.user.as_ref().unwrap() %} {% let u = availability.user.as_ref().unwrap() %}
<tr> <tr>
<td>{{ u.name }}</td> <td>{{ u.name }}</td>
<td> <td>
{{ u.function|show_tree|safe }} {{ u.function|show_tree|safe }}
</td> </td>
<td> <td>
{{ availabillity.start|dt_t }} Uhr bis {{ availabillity.end|dt_ff }} Uhr {{ availability.start|dt_t }} Uhr bis {{ availability.end|dt_ff }} Uhr
</td> </td>
<td> <td>
{{ availabillity.comment.as_deref().unwrap_or("") }} {{ availability.comment.as_deref().unwrap_or("") }}
</td> </td>
<td> <td>
{% if availabillity.user_id == user.id %} {% if availability.user_id == user.id %}
<div class="buttons is-right"> <div class="buttons is-right">
<a class="button is-primary is-light" hx-boost="true" <a class="button is-primary is-light" hx-boost="true"
href="/availabillity/edit/{{ availabillity.id }}"> href="/availability/edit/{{ availability.id }}">
<svg class="icon"> <svg class="icon">
<use href="/static/feather-sprite.svg#edit" /> <use href="/static/feather-sprite.svg#edit" />
</svg> </svg>
<span>Bearbeiten</span> <span>Bearbeiten</span>
</a> </a>
<button class="button is-danger is-light" hx-delete="/availabillity/delete/{{ availabillity.id }}" <button class="button is-danger is-light" hx-delete="/availability/delete/{{ availability.id }}"
hx-target="closest tr" hx-swap="delete" hx-trigger="confirmed"> hx-target="closest tr" hx-swap="delete" hx-trigger="confirmed">
<svg class="icon"> <svg class="icon">
<use href="/static/feather-sprite.svg#x-circle" /> <use href="/static/feather-sprite.svg#x-circle" />