PluginProbe
ERP: Complete HR, Accounting & CRM Suite Built for WooCommerce / 1.3.13
ERP: Complete HR, Accounting & CRM Suite Built for WooCommerce v1.3.13
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 / modules / hrm / includes / api / class-leave-requests-controller.php

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

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