PluginProbe
ERP: Complete HR, Accounting & CRM Suite Built for WooCommerce / 1.2.6
ERP: Complete HR, Accounting & CRM Suite Built for WooCommerce v1.2.6
1.17.9 1.17.8 1.17.7 1.17.6 1.17.5 1.17.4 1.2.2 1.2.3 1.2.4 1.2.5 1.2.6 1.2.7 1.2.8 1.3.0 1.3.1 1.3.11 1.3.12 1.3.13 1.3.14 1.3.2 1.3.3 1.3.4 1.3.5 1.3.6 1.3.7 All 143 releases
erp / includes / api / class-leave-requests-controller.php

class-leave-requests-controller.php in ERP: Complete HR, Accounting & CRM Suite Built for WooCommerce 1.2.6, at includes/api/class-leave-requests-controller.php

284 lines 9.7 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 namespace WeDevs\ERP\API;
3
4 use WP_REST_Server;
5 use WP_REST_Response;
6 use WP_Error;
7
8 class Leave_Requests_Controller extends REST_Controller {
9 /**
10 * Endpoint namespace.
11 *
12 * @var string
13 */
14 protected $namespace = 'erp/v1';
15
16 /**
17 * Route base.
18 *
19 * @var string
20 */
21 protected $rest_base = 'hrm/leaves/requests';
22
23 /**
24 * Register the routes for the objects of the controller.
25 */
26 public function register_routes() {
27 register_rest_route( $this->namespace, '/' . $this->rest_base, [
28 [
29 'methods' => WP_REST_Server::READABLE,
30 'callback' => [ $this, 'get_leave_requests' ],
31 'args' => $this->get_collection_params(),
32 'permission_callback' => function ( $request ) {
33 return current_user_can( 'erp_leave_manage' );
34 },
35 ],
36 [
37 'methods' => WP_REST_Server::CREATABLE,
38 'callback' => [ $this, 'create_leave_request' ],
39 'args' => $this->get_endpoint_args_for_item_schema( WP_REST_Server::CREATABLE ),
40 'permission_callback' => function ( $request ) {
41 return current_user_can( 'erp_leave_manage' );
42 },
43 ],
44 'schema' => [ $this, 'get_public_item_schema' ],
45 ] );
46
47 register_rest_route( $this->namespace, '/' . $this->rest_base . '/(?P<id>[\d]+)', [
48 [
49 'methods' => WP_REST_Server::READABLE,
50 'callback' => [ $this, 'get_leave_request' ],
51 'args' => [
52 'context' => $this->get_context_param( [ 'default' => 'view' ] ),
53 ],
54 'permission_callback' => function ( $request ) {
55 return current_user_can( 'erp_leave_manage' );
56 },
57 ],
58 'schema' => [ $this, 'get_public_item_schema' ],
59 ] );
60 }
61
62 /**
63 * Get a collection of leave requests
64 *
65 * @param WP_REST_Request $request
66 *
67 * @return WP_Error|WP_REST_Response
68 */
69 public function get_leave_requests( $request ) {
70 $args = [
71 'number' => $request['per_page'],
72 'offset' => ( $request['per_page'] * ( $request['page'] - 1 ) ),
73 ];
74
75 $items = erp_hr_get_leave_requests( $args );
76 $leave_count = erp_hr_leave_get_requests_count();
77 $total_items = $leave_count['all']['count'];
78
79 $formated_items = [];
80 foreach ( $items as $item ) {
81 $data = $this->prepare_item_for_response( $item, $request );
82 $formated_items[] = $this->prepare_response_for_collection( $data );
83 }
84
85 $response = rest_ensure_response( $formated_items );
86 $response = $this->format_collection_response( $response, $request, $total_items );
87
88 return $response;
89 }
90
91 /**
92 * Get a specific leave request
93 *
94 * @param WP_REST_Request $request
95 *
96 * @return WP_Error|WP_REST_Response
97 */
98 public function get_leave_request( $request ) {
99 $id = (int) $request['id'];
100 $item = erp_hr_get_leave_request( $id );
101
102 if ( empty( $id ) || empty( $item->id ) ) {
103 return new WP_Error( 'rest_leave_request_invalid_id', __( 'Invalid resource id.' ), [ 'status' => 404 ] );
104 }
105
106 $item = $this->prepare_item_for_response( $item, $request );
107 $response = rest_ensure_response( $item );
108
109 return $response;
110 }
111
112 /**
113 * Create a leave request
114 *
115 * @param WP_REST_Request $request
116 *
117 * @return WP_Error|WP_REST_Request
118 */
119 public function create_leave_request( $request ) {
120 $item = $this->prepare_item_for_database( $request );
121
122 $policies = erp_hr_get_assign_policy_from_entitlement( $request['employee_id'] );
123 if ( ! $policies ) {
124 return new WP_Error( 'rest_leave_request_required_entitlement', __( 'Set entitlement to the employee first.' ), [ 'status' => 400 ] );
125 }
126
127 $id = erp_hr_leave_insert_request( $item );
128 $leave_request = erp_hr_get_leave_request( $id );
129
130 $request->set_param( 'context', 'edit' );
131 $response = $this->prepare_item_for_response( $leave_request, $request );
132 $response = rest_ensure_response( $response );
133 $response->set_status( 201 );
134 $response->header( 'Location', rest_url( sprintf( '/%s/%s/%d', $this->namespace, $this->rest_base, $id ) ) );
135
136 return $response;
137 }
138
139 /**
140 * Prepare a single item for create or update
141 *
142 * @param WP_REST_Request $request Request object.
143 *
144 * @return array $prepared_item
145 */
146 protected function prepare_item_for_database( $request ) {
147 $prepared_item = [];
148
149 // required arguments.
150 if ( isset( $request['employee_id'] ) ) {
151 $prepared_item['user_id'] = absint( $request['employee_id'] );
152 }
153
154 if ( isset( $request['start_date'] ) ) {
155 $prepared_item['start_date'] = date( 'Y-m-d', strtotime( $request['start_date'] ) );
156 }
157
158 if ( isset( $request['end_date'] ) ) {
159 $prepared_item['end_date'] = date( 'Y-m-d', strtotime( $request['end_date'] ) );
160 }
161
162 if ( isset( $request['policy'] ) ) {
163 $prepared_item['leave_policy'] = absint( $request['policy'] );
164 }
165
166 // optional arguments.
167 if ( isset( $request['id'] ) ) {
168 $prepared_item['id'] = absint( $request['id'] );
169 }
170
171 if ( isset( $request['reason'] ) ) {
172 $prepared_item['reason'] = $request['reason'];
173 }
174
175 return $prepared_item;
176 }
177
178 /**
179 * Prepare a single user output for response
180 *
181 * @param object $item
182 * @param WP_REST_Request $request Request object.
183 * @param array $additional_fields (optional)
184 *
185 * @return WP_REST_Response $response Response data.
186 */
187 public function prepare_item_for_response( $item, $request, $additional_fields = [] ) {
188 $data = [
189 'id' => (int) $item->id,
190 'employee_id' => (int) $item->user_id,
191 'employee_name' => $item->display_name,
192 'start_date' => date( 'Y-m-d', strtotime( $item->start_date ) ),
193 'end_date' => date( 'Y-m-d', strtotime( $item->end_date ) ),
194 'reason' => $item->reason,
195 'comments' => $item->comments,
196 ];
197
198 if ( isset( $request['include'] ) ) {
199 $include_params = explode( ',', str_replace( ' ', '', $request['include'] ) );
200
201 if ( in_array( 'policy', $include_params ) ) {
202 $policies_controller = new Leave_Policies_Controller();
203
204 $policy_id = (int) $item->policy_id;
205 $data['policy'] = null;
206
207 if ( $policy_id ) {
208 $policy = $policies_controller->get_policy( ['id' => $policy_id ] );
209 $data['policy'] = ! is_wp_error( $policy ) ? $policy->get_data() : null;
210 }
211 }
212 }
213
214 $data = array_merge( $data, $additional_fields );
215
216 // Wrap the data in a response object
217 $response = rest_ensure_response( $data );
218
219 $response = $this->add_links( $response, $item );
220
221 return $response;
222 }
223
224 /**
225 * Get the User's schema, conforming to JSON Schema
226 *
227 * @return array
228 */
229 public function get_item_schema() {
230 $schema = [
231 '$schema' => 'http://json-schema.org/draft-04/schema#',
232 'title' => 'request',
233 'type' => 'object',
234 'properties' => [
235 'id' => [
236 'description' => __( 'Unique identifier for the resource.' ),
237 'type' => 'integer',
238 'context' => [ 'embed', 'view', 'edit' ],
239 'readonly' => true,
240 ],
241 'employee_id' => [
242 'description' => __( 'Employee id for the resource.' ),
243 'type' => 'integer',
244 'context' => [ 'edit' ],
245 'required' => true,
246 ],
247 'policy' => [
248 'description' => __( 'Employee id for the resource.' ),
249 'type' => 'integer',
250 'context' => [ 'edit' ],
251 'required' => true,
252 ],
253 'start_date' => [
254 'description' => __( 'Start date for the resource.' ),
255 'type' => 'string',
256 'context' => [ 'edit' ],
257 'arg_options' => [
258 'sanitize_callback' => 'sanitize_text_field',
259 ],
260 'required' => true,
261 ],
262 'end_date' => [
263 'description' => __( 'End date for the resource.' ),
264 'type' => 'string',
265 'context' => [ 'edit' ],
266 'arg_options' => [
267 'sanitize_callback' => 'sanitize_text_field',
268 ],
269 'required' => true,
270 ],
271 'reason' => [
272 'description' => __( 'Reason for the resource.' ),
273 'type' => 'string',
274 'context' => [ 'edit' ],
275 'arg_options' => [
276 'sanitize_callback' => 'sanitize_text_field',
277 ],
278 ],
279 ],
280 ];
281
282 return $schema;
283 }
284 }