@@ -11,7 +11,9 @@ mod types;
1111mod test;
1212
1313pub use errors:: Error ;
14- pub use types:: { Booking , BookingStatus , Workspace , WorkspaceType } ;
14+ pub use types:: {
15+ Booking , BookingStatus , UnavailabilityReason , Workspace , WorkspaceAvailability , WorkspaceType ,
16+ } ;
1517
1618use soroban_sdk:: {
1719 contract, contractimpl, contracttype, symbol_short, token, Address , Env , String , Vec ,
@@ -130,14 +132,14 @@ impl WorkspaceBookingContract {
130132 name : String ,
131133 workspace_type : WorkspaceType ,
132134 capacity : u32 ,
133- hourly_rate : i128 ,
135+ hourly_rate : u128 ,
134136 ) -> Result < ( ) , Error > {
135137 Self :: require_admin ( & env, & caller) ?;
136138
137139 if capacity == 0 {
138140 return Err ( Error :: InvalidCapacity ) ;
139141 }
140- if hourly_rate < = 0 {
142+ if hourly_rate = = 0 {
141143 return Err ( Error :: InvalidRate ) ;
142144 }
143145 if env
@@ -154,7 +156,7 @@ impl WorkspaceBookingContract {
154156 workspace_type : workspace_type. clone ( ) ,
155157 capacity,
156158 hourly_rate,
157- is_available : true ,
159+ availability : WorkspaceAvailability :: Available ,
158160 created_at : env. ledger ( ) . timestamp ( ) ,
159161 } ;
160162
@@ -193,7 +195,11 @@ impl WorkspaceBookingContract {
193195 . get ( & DataKey :: Workspace ( workspace_id. clone ( ) ) )
194196 . ok_or ( Error :: WorkspaceNotFound ) ?;
195197
196- workspace. is_available = is_available;
198+ workspace. availability = if is_available {
199+ WorkspaceAvailability :: Available
200+ } else {
201+ WorkspaceAvailability :: Unavailable ( UnavailabilityReason :: AdminHold )
202+ } ;
197203 env. storage ( )
198204 . persistent ( )
199205 . set ( & DataKey :: Workspace ( workspace_id. clone ( ) ) , & workspace) ;
@@ -208,11 +214,11 @@ impl WorkspaceBookingContract {
208214 env : Env ,
209215 caller : Address ,
210216 workspace_id : String ,
211- hourly_rate : i128 ,
217+ hourly_rate : u128 ,
212218 ) -> Result < ( ) , Error > {
213219 Self :: require_admin ( & env, & caller) ?;
214220
215- if hourly_rate < = 0 {
221+ if hourly_rate = = 0 {
216222 return Err ( Error :: InvalidRate ) ;
217223 }
218224
@@ -274,7 +280,7 @@ impl WorkspaceBookingContract {
274280 . get ( & DataKey :: Workspace ( workspace_id. clone ( ) ) )
275281 . ok_or ( Error :: WorkspaceNotFound ) ?;
276282
277- if ! workspace. is_available {
283+ if workspace. availability != WorkspaceAvailability :: Available {
278284 return Err ( Error :: WorkspaceUnavailable ) ;
279285 }
280286
@@ -285,14 +291,14 @@ impl WorkspaceBookingContract {
285291 // Cost = hourly_rate × ⌈duration_seconds / 3600⌉
286292 let duration_secs = end_time - start_time;
287293 let duration_hours = duration_secs. div_ceil ( 3600 ) ;
288- let amount: i128 = workspace. hourly_rate * duration_hours as i128 ;
294+ let amount: u128 = workspace. hourly_rate * duration_hours as u128 ;
289295
290296 // Collect payment from member → contract
291297 let payment_token = Self :: get_payment_token ( & env) ?;
292298 token:: Client :: new ( & env, & payment_token) . transfer (
293299 & member,
294300 env. current_contract_address ( ) ,
295- & amount,
301+ & ( amount as i128 ) ,
296302 ) ;
297303
298304 let booking = Booking {
@@ -304,6 +310,8 @@ impl WorkspaceBookingContract {
304310 status : BookingStatus :: Active ,
305311 amount_paid : amount,
306312 created_at : now,
313+ cancelled_at : None ,
314+ completed_at : None ,
307315 } ;
308316
309317 env. storage ( )
@@ -365,10 +373,11 @@ impl WorkspaceBookingContract {
365373 token:: Client :: new ( & env, & payment_token) . transfer (
366374 & env. current_contract_address ( ) ,
367375 & booking. member ,
368- & booking. amount_paid ,
376+ & ( booking. amount_paid as i128 ) ,
369377 ) ;
370378
371379 booking. status = BookingStatus :: Cancelled ;
380+ booking. cancelled_at = Some ( env. ledger ( ) . timestamp ( ) ) ;
372381 env. storage ( )
373382 . persistent ( )
374383 . set ( & DataKey :: Booking ( booking_id. clone ( ) ) , & booking) ;
@@ -397,6 +406,7 @@ impl WorkspaceBookingContract {
397406 }
398407
399408 booking. status = BookingStatus :: Completed ;
409+ booking. completed_at = Some ( env. ledger ( ) . timestamp ( ) ) ;
400410 env. storage ( )
401411 . persistent ( )
402412 . set ( & DataKey :: Booking ( booking_id. clone ( ) ) , & booking) ;
@@ -468,7 +478,7 @@ impl WorkspaceBookingContract {
468478 None => return false ,
469479 } ;
470480
471- if ! workspace. is_available {
481+ if workspace. availability != WorkspaceAvailability :: Available {
472482 return false ;
473483 }
474484
0 commit comments