['type'=>'integer','default'=>1,'minimum'=>1],'per_page'=>['type'=>'integer','default'=>25,'minimum'=>1,'maximum'=>100]]; register_rest_route($ns,'/admin/daily-overview',['methods'=>'GET','permission_callback'=>[$this,'manage'],'args'=>['date'=>['type'=>'string','required'=>true]],'callback'=>fn($r)=>$this->respond(fn()=>$this->daily->get($r['date']))]); register_rest_route($ns,'/admin/receivables',['methods'=>'GET','permission_callback'=>[$this,'manage'],'args'=>$pagination+['search'=>['type'=>'string','default'=>'','maxLength'=>100],'currency'=>['type'=>'string','pattern'=>'^[A-Z]{3}$'],'customer_type'=>['type'=>'string','enum'=>['member','registered_non_member','external']],'sort'=>['type'=>'string','default'=>'oldest','enum'=>['oldest','largest']]],'callback'=>fn($r)=>$this->respond(fn()=>$this->receivables->getAdminDebtors($r->get_params()))]); register_rest_route($ns,'/admin/receivables/(?Pmember|registered_non_member|external|booking)/(?P[1-9][0-9]*)',['methods'=>'GET','permission_callback'=>[$this,'manage'],'args'=>$pagination,'callback'=>fn($r)=>$this->respond(fn()=>$this->receivables->adminDetail($r['customer_type'],(int)$r['id'],(int)$r['page'],(int)$r['per_page']))]); register_rest_route($ns,'/outstanding-balance',['methods'=>'GET','permission_callback'=>[$this,'login'],'callback'=>fn()=>$this->respond(fn()=>$this->receivables->forUser(get_current_user_id()))]); register_rest_route($ns,'/outstanding-balance/(?P[1-9][0-9]*)',['methods'=>'GET','permission_callback'=>[$this,'login'],'callback'=>fn($r)=>$this->respond(fn()=>$this->receivables->clientDetail(get_current_user_id(),(int)$r['id'],$this->payments))]); } public function login(): bool|WP_Error {return is_user_logged_in()?:new WP_Error('abece_booking_login_required',__('Log in to manage your bookings.','abece-booking'),['status'=>401]);} public function manage(): bool|WP_Error {return current_user_can(Capabilities::MANAGE_BOOKINGS)?:new WP_Error('abece_booking_booking_forbidden',__('You do not have permission to manage bookings.','abece-booking'),['status'=>rest_authorization_required_code()]);} private function respond(callable $operation): WP_REST_Response|WP_Error {try{$r=new WP_REST_Response($operation());$r->header('Cache-Control','private, no-store');$r->header('Vary','Cookie');return $r;}catch(CatalogException $e){return new WP_Error($e->errorCode,$e->getMessage(),['status'=>$e->status,'field'=>$e->field]);}} }