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 / includes / api / class-employees-controller.php

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

1,384 lines 48.0 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 use WeDevs\ERP\HRM\Employee;
8 use WeDevs\ERP\HRM\Models\Work_Experience;
9 use WeDevs\ERP\HRM\Models\Education;
10 use WeDevs\ERP\HRM\Models\Dependents;
11
12 class Employees_Controller extends REST_Controller {
13 /**
14 * Endpoint namespace.
15 *
16 * @var string
17 */
18 protected $namespace = 'erp/v1';
19
20 /**
21 * Route base.
22 *
23 * @var string
24 */
25 protected $rest_base = 'hrm/employees';
26
27 /**
28 * Register the routes for the objects of the controller.
29 */
30 public function register_routes() {
31 register_rest_route( $this->namespace, '/' . $this->rest_base, [
32 [
33 'methods' => WP_REST_Server::READABLE,
34 'callback' => [ $this, 'get_employees' ],
35 'args' => $this->get_collection_params(),
36 'permission_callback' => function ( $request ) {
37 return current_user_can( 'erp_list_employee' );
38 },
39 ],
40 [
41 'methods' => WP_REST_Server::CREATABLE,
42 'callback' => [ $this, 'create_employee' ],
43 'args' => $this->get_endpoint_args_for_item_schema( WP_REST_Server::CREATABLE ),
44 'permission_callback' => function ( $request ) {
45 return current_user_can( 'erp_create_employee' );
46 },
47 ],
48 'schema' => [ $this, 'get_public_item_schema' ],
49 ] );
50
51 register_rest_route( $this->namespace, '/' . $this->rest_base . '/bulk', [
52 [
53 'methods' => WP_REST_Server::CREATABLE,
54 'callback' => [ $this, 'create_employees' ],
55 'permission_callback' => function ( $request ) {
56 return current_user_can( 'erp_create_employee' );
57 },
58 ],
59 'schema' => [ $this, 'get_public_item_schema' ],
60 ] );
61
62 register_rest_route( $this->namespace, '/' . $this->rest_base . '/(?P<id>[\d]+)', [
63 [
64 'methods' => WP_REST_Server::READABLE,
65 'callback' => [ $this, 'get_employee' ],
66 'args' => [
67 'context' => $this->get_context_param( [ 'default' => 'view' ] ),
68 ],
69 'permission_callback' => function ( $request ) {
70 return current_user_can( 'erp_list_employee' );
71 },
72 ],
73 [
74 'methods' => WP_REST_Server::EDITABLE,
75 'callback' => [ $this, 'update_employee' ],
76 'args' => $this->get_endpoint_args_for_item_schema( WP_REST_Server::EDITABLE ),
77 'permission_callback' => function ( $request ) {
78 return current_user_can( 'erp_edit_employee' );
79 },
80 ],
81 [
82 'methods' => WP_REST_Server::DELETABLE,
83 'callback' => [ $this, 'delete_employee' ],
84 'permission_callback' => function ( $request ) {
85 return current_user_can( 'erp_delete_employee' );
86 },
87 ],
88 'schema' => [ $this, 'get_public_item_schema' ],
89 ] );
90
91 register_rest_route( $this->namespace, '/' . $this->rest_base . '/(?P<id>[\d]+)' . '/experiences', [
92 [
93 'methods' => WP_REST_Server::READABLE,
94 'callback' => [ $this, 'get_experiences' ],
95 'permission_callback' => function ( $request ) {
96 return current_user_can( 'erp_list_employee' );
97 },
98 ],
99 [
100 'methods' => WP_REST_Server::CREATABLE,
101 'callback' => [ $this, 'create_experience' ],
102 'permission_callback' => function ( $request ) {
103 return current_user_can( 'erp_edit_employee' );
104 },
105 ],
106 ] );
107
108 register_rest_route( $this->namespace, '/' . $this->rest_base . '/(?P<id>[\d]+)' . '/experiences' . '/(?P<exp_id>[\d]+)', [
109 [
110 'methods' => WP_REST_Server::READABLE,
111 'callback' => [ $this, 'get_experience' ],
112 'permission_callback' => function ( $request ) {
113 return current_user_can( 'erp_list_employee' );
114 },
115 ],
116 [
117 'methods' => WP_REST_Server::EDITABLE,
118 'callback' => [ $this, 'update_experience' ],
119 'permission_callback' => function ( $request ) {
120 return current_user_can( 'erp_edit_employee' );
121 },
122 ],
123 [
124 'methods' => WP_REST_Server::DELETABLE,
125 'callback' => [ $this, 'delete_experience' ],
126 'permission_callback' => function ( $request ) {
127 return current_user_can( 'erp_edit_employee' );
128 },
129 ],
130 ] );
131
132 register_rest_route( $this->namespace, '/' . $this->rest_base . '/(?P<id>[\d]+)' . '/educations', [
133 [
134 'methods' => WP_REST_Server::READABLE,
135 'callback' => [ $this, 'get_educations' ],
136 'permission_callback' => function ( $request ) {
137 return current_user_can( 'erp_list_employee' );
138 },
139 ],
140 [
141 'methods' => WP_REST_Server::CREATABLE,
142 'callback' => [ $this, 'create_education' ],
143 'permission_callback' => function ( $request ) {
144 return current_user_can( 'erp_edit_employee' );
145 },
146 ],
147 ] );
148
149 register_rest_route( $this->namespace, '/' . $this->rest_base . '/(?P<id>[\d]+)' . '/educations' . '/(?P<edu_id>[\d]+)', [
150 [
151 'methods' => WP_REST_Server::READABLE,
152 'callback' => [ $this, 'get_education' ],
153 'permission_callback' => function ( $request ) {
154 return current_user_can( 'erp_list_employee' );
155 },
156 ],
157 [
158 'methods' => WP_REST_Server::EDITABLE,
159 'callback' => [ $this, 'update_education' ],
160 'permission_callback' => function ( $request ) {
161 return current_user_can( 'erp_edit_employee' );
162 },
163 ],
164 [
165 'methods' => WP_REST_Server::DELETABLE,
166 'callback' => [ $this, 'delete_education' ],
167 'permission_callback' => function ( $request ) {
168 return current_user_can( 'erp_edit_employee' );
169 },
170 ],
171 ] );
172
173 register_rest_route( $this->namespace, '/' . $this->rest_base . '/(?P<id>[\d]+)' . '/dependents', [
174 [
175 'methods' => WP_REST_Server::READABLE,
176 'callback' => [ $this, 'get_dependents' ],
177 'permission_callback' => function ( $request ) {
178 return current_user_can( 'erp_list_employee' );
179 },
180 ],
181 [
182 'methods' => WP_REST_Server::CREATABLE,
183 'callback' => [ $this, 'create_dependent' ],
184 'permission_callback' => function ( $request ) {
185 return current_user_can( 'erp_edit_employee' );
186 },
187 ],
188 ] );
189
190 register_rest_route( $this->namespace, '/' . $this->rest_base . '/(?P<id>[\d]+)' . '/dependents' . '/(?P<dep_id>[\d]+)', [
191 [
192 'methods' => WP_REST_Server::READABLE,
193 'callback' => [ $this, 'get_dependent' ],
194 'permission_callback' => function ( $request ) {
195 return current_user_can( 'erp_list_employee' );
196 },
197 ],
198 [
199 'methods' => WP_REST_Server::EDITABLE,
200 'callback' => [ $this, 'update_dependent' ],
201 'permission_callback' => function ( $request ) {
202 return current_user_can( 'erp_edit_employee' );
203 },
204 ],
205 [
206 'methods' => WP_REST_Server::DELETABLE,
207 'callback' => [ $this, 'delete_dependent' ],
208 'permission_callback' => function ( $request ) {
209 return current_user_can( 'erp_edit_employee' );
210 },
211 ],
212 ] );
213 }
214
215 /**
216 * Get a collection of employees
217 *
218 * @param WP_REST_Request $request
219 *
220 * @return WP_Error|WP_REST_Response
221 */
222 public function get_employees( $request ) {
223 $args = [
224 'number' => $request['per_page'],
225 'offset' => ( $request['per_page'] * ( $request['page'] - 1 ) ),
226 ];
227
228 $items = erp_hr_get_employees( $args );
229
230 $args['count'] = true;
231 $total_items = erp_hr_get_employees( $args );
232
233 $formated_items = [];
234 foreach ( $items as $item ) {
235 $additional_fields = [];
236
237 $data = $this->prepare_item_for_response( $item, $request, $additional_fields );
238 $formated_items[] = $this->prepare_response_for_collection( $data );
239 }
240
241 $response = rest_ensure_response( $formated_items );
242 $response = $this->format_collection_response( $response, $request, $total_items );
243
244 return $response;
245 }
246
247 /**
248 * Get a specific employee
249 *
250 * @param WP_REST_Request $request
251 *
252 * @return WP_Error|WP_REST_Response
253 */
254 public function get_employee( $request ) {
255 $id = (int) $request['id'];
256 $item = new Employee( $id );
257
258 if ( empty( $id ) || empty( $item->id ) ) {
259 return new WP_Error( 'rest_employee_invalid_id', __( 'Invalid resource id.' ), [ 'status' => 404 ] );
260 }
261
262 $item = $this->prepare_item_for_response( $item, $request );
263 $response = rest_ensure_response( $item );
264
265 return $response;
266 }
267
268 /**
269 * Create an employee
270 *
271 * @param WP_REST_Request $request
272 *
273 * @return WP_Error|WP_REST_Request
274 */
275 public function create_employee( $request ) {
276 $item = $this->prepare_item_for_database( $request );
277
278 $id = erp_hr_employee_create( $item );
279 $employee = new Employee( $id );
280
281 $request->set_param( 'context', 'edit' );
282 $response = $this->prepare_item_for_response( $employee, $request );
283 $response = rest_ensure_response( $response );
284 $response->set_status( 201 );
285 $response->header( 'Location', rest_url( sprintf( '/%s/%s/%d', $this->namespace, $this->rest_base, $id ) ) );
286
287 return $response;
288 }
289
290 /**
291 * Create employees
292 *
293 * @param WP_REST_Request $request
294 *
295 * @return WP_Error|WP_REST_Request
296 */
297 public function create_employees( $request ) {
298 $employees = json_decode( $request->get_body(), true );
299
300 foreach ( $employees as $employee ) {
301 $item = $this->prepare_item_for_database( $employee );
302 $id = erp_hr_employee_create( $item );
303
304 if ( is_wp_error( $id ) ) {
305 return $id;
306 }
307 }
308
309 return new WP_REST_Response( true, 201 );
310 }
311
312 /**
313 * Update an employee
314 *
315 * @param WP_REST_Request $request
316 *
317 * @return WP_Error|WP_REST_Request
318 */
319 public function update_employee( $request ) {
320 $id = (int) $request['id'];
321
322 $employee = new Employee( $id );
323 if ( ! $employee ) {
324 return new WP_Error( 'rest_employee_invalid_id', __( 'Invalid resource id.' ), [ 'status' => 400 ] );
325 }
326
327 $item = $this->prepare_item_for_database( $request );
328 $id = erp_hr_employee_create( $item );
329
330 $request->set_param( 'context', 'edit' );
331 $response = $this->prepare_item_for_response( $employee, $request );
332 $response = rest_ensure_response( $response );
333 $response->set_status( 201 );
334 $response->header( 'Location', rest_url( sprintf( '/%s/%s/%d', $this->namespace, $this->rest_base, $id ) ) );
335
336 return $response;
337 }
338
339 /**
340 * Delete an employee
341 *
342 * @param WP_REST_Request $request
343 *
344 * @return WP_Error|WP_REST_Request
345 */
346 public function delete_employee( $request ) {
347 $id = (int) $request['id'];
348
349 erp_employee_delete( $id );
350
351 return new WP_REST_Response( true, 204 );
352 }
353
354 /**
355 * Prepare a single item for create or update
356 *
357 * @param WP_REST_Request $request Request object.
358 *
359 * @return array $prepared_item
360 */
361 protected function prepare_item_for_database( $request ) {
362 $prepared_item = [];
363
364 // required arguments.
365 if ( isset( $request['first_name'] ) ) {
366 $prepared_item['personal']['first_name'] = $request['first_name'];
367 }
368
369 if ( isset( $request['last_name'] ) ) {
370 $prepared_item['personal']['last_name'] = $request['last_name'];
371 }
372
373 if ( isset( $request['email'] ) ) {
374 $prepared_item['user_email'] = $request['email'];
375 }
376
377 // optional arguments.
378 if ( isset( $request['id'] ) ) {
379 $prepared_item['id'] = absint( $request['id'] );
380 }
381
382 if ( isset( $request['middle_name'] ) ) {
383 $prepared_item['personal']['middle_name'] = $request['middle_name'];
384 }
385
386 if ( isset( $request['designation'] ) ) {
387 $prepared_item['work']['designation'] = $request['designation'];
388 }
389
390 if ( isset( $request['department'] ) ) {
391 $prepared_item['work']['department'] = $request['department'];
392 }
393
394 if ( isset( $request['reporting_to'] ) ) {
395 $prepared_item['work']['reporting_to'] = $request['reporting_to'];
396 }
397
398 if ( isset( $request['location'] ) ) {
399 $prepared_item['work']['location'] = $request['location'];
400 }
401
402 if ( isset( $request['hiring_source'] ) ) {
403 $prepared_item['work']['hiring_source'] = $request['hiring_source'];
404 }
405
406 if ( isset( $request['hiring_date'] ) ) {
407 $prepared_item['work']['hiring_date'] = $request['hiring_date'];
408 }
409
410 if ( isset( $request['date_of_birth'] ) ) {
411 $prepared_item['work']['date_of_birth'] = $request['date_of_birth'];
412 }
413
414 if ( isset( $request['pay_rate'] ) ) {
415 $prepared_item['work']['pay_rate'] = $request['pay_rate'];
416 }
417
418 if ( isset( $request['pay_type'] ) ) {
419 $prepared_item['work']['pay_type'] = $request['pay_type'];
420 }
421
422 if ( isset( $request['type'] ) ) {
423 $prepared_item['work']['type'] = $request['type'];
424 }
425
426 if ( isset( $request['status'] ) ) {
427 $prepared_item['work']['status'] = $request['status'];
428 }
429
430 if ( isset( $request['other_email'] ) ) {
431 $prepared_item['personal']['other_email'] = $request['other_email'];
432 }
433
434 if ( isset( $request['phone'] ) ) {
435 $prepared_item['personal']['phone'] = $request['phone'];
436 }
437
438 if ( isset( $request['work_phone'] ) ) {
439 $prepared_item['personal']['work_phone'] = $request['work_phone'];
440 }
441
442 if ( isset( $request['mobile'] ) ) {
443 $prepared_item['personal']['mobile'] = $request['mobile'];
444 }
445
446 if ( isset( $request['address'] ) ) {
447 $prepared_item['personal']['address'] = $request['address'];
448 }
449
450 if ( isset( $request['gender'] ) ) {
451 $prepared_item['personal']['gender'] = $request['gender'];
452 }
453
454 if ( isset( $request['marital_status'] ) ) {
455 $prepared_item['personal']['marital_status'] = $request['marital_status'];
456 }
457
458 if ( isset( $request['nationality'] ) ) {
459 $prepared_item['personal']['nationality'] = $request['nationality'];
460 }
461
462 if ( isset( $request['driving_license'] ) ) {
463 $prepared_item['personal']['driving_license'] = $request['driving_license'];
464 }
465
466 if ( isset( $request['hobbies'] ) ) {
467 $prepared_item['personal']['hobbies'] = $request['hobbies'];
468 }
469
470 if ( isset( $request['user_url'] ) ) {
471 $prepared_item['personal']['user_url'] = $request['user_url'];
472 }
473
474 if ( isset( $request['description'] ) ) {
475 $prepared_item['personal']['description'] = $request['description'];
476 }
477
478 if ( isset( $request['street_1'] ) ) {
479 $prepared_item['personal']['street_1'] = $request['street_1'];
480 }
481
482 if ( isset( $request['street_2'] ) ) {
483 $prepared_item['personal']['street_2'] = $request['street_2'];
484 }
485
486 if ( isset( $request['city'] ) ) {
487 $prepared_item['personal']['city'] = $request['city'];
488 }
489
490 if ( isset( $request['country'] ) ) {
491 $prepared_item['personal']['country'] = $request['country'];
492 }
493
494 if ( isset( $request['state'] ) ) {
495 $prepared_item['personal']['state'] = $request['state'];
496 }
497
498 if ( isset( $request['postal_code'] ) ) {
499 $prepared_item['personal']['postal_code'] = $request['postal_code'];
500 }
501
502 return $prepared_item;
503 }
504
505 /**
506 * Prepare a single user output for response
507 *
508 * @param object $item
509 * @param WP_REST_Request $request Request object.
510 * @param array $additional_fields (optional)
511 *
512 * @return WP_REST_Response $response Response data.
513 */
514 public function prepare_item_for_response( $item, $request, $additional_fields = [] ) {
515 $data = [
516 'id' => (int) $item->id,
517 'first_name' => $item->first_name,
518 'middle_name' => $item->middle_name,
519 'last_name' => $item->last_name,
520 'email' => $item->user_email,
521 'location' => $item->location,
522 'hiring_source' => $item->hiring_source,
523 'hiring_date' => $item->hiring_date,
524 'date_of_birth' => $item->date_of_birth,
525 'pay_rate' => (int) $item->pay_rate,
526 'pay_type' => $item->pay_type,
527 'type' => $item->type,
528 'status' => $item->status,
529 'other_email' => $item->other_email,
530 'phone' => $item->phone,
531 'work_phone' => $item->work_phone,
532 'mobile' => $item->mobile,
533 'address' => $item->address,
534 'gender' => $item->gender,
535 'marital_status' => $item->marital_status,
536 'nationality' => $item->nationality,
537 'driving_license' => $item->driving_license,
538 'hobbies' => $item->hobbies,
539 'user_url' => $item->user_url,
540 'description' => $item->description,
541 'street_1' => $item->street_1,
542 'street_2' => $item->street_2,
543 'city' => $item->city,
544 'country' => $item->country,
545 'state' => $item->state,
546 'postal_code' => $item->postal_code,
547 ];
548
549 if ( isset( $request['include'] ) ) {
550 $include_params = explode( ',', str_replace( ' ', '', $request['include'] ) );
551
552 if ( in_array( 'department', $include_params ) ) {
553 $departments_controller = new Departments_Controller();
554
555 $department_id = (int) $item->department;
556 $data['department'] = null;
557
558 if ( $department_id ) {
559 $department = $departments_controller->get_department( ['id' => $department_id ] );
560 $data['department'] = ! is_wp_error( $department ) ? $department->get_data() : null;
561 }
562 }
563
564 if ( in_array( 'designation', $include_params ) ) {
565 $designations_controller = new Designations_Controller();
566
567 $designation_id = (int) $item->designation;
568 $data['designation'] = null;
569
570 if ( $designation_id ) {
571 $designation = $designations_controller->get_designation( ['id' => $designation_id ] );
572 $data['designation'] = ! is_wp_error( $designation ) ? $designation->get_data() : null;
573 }
574 }
575
576 if ( in_array( 'reporting_to', $include_params ) ) {
577 $reporting_to_id = (int) $item->reporting_to;
578 $data['reporting_to'] = null;
579
580 if ( $reporting_to_id ) {
581 $reporting_to = $this->get_employee( ['id' => $reporting_to_id ] );
582 $data['reporting_to'] = ! is_wp_error( $reporting_to ) ? $reporting_to->get_data() : null;
583 }
584 }
585 }
586
587 $data = array_merge( $data, $additional_fields );
588
589 // Wrap the data in a response object
590 $response = rest_ensure_response( $data );
591
592 $response = $this->add_links( $response, $item );
593
594 return $response;
595 }
596
597 /**
598 * Get a collection of employee's experiences
599 *
600 * @param WP_REST_Request $request
601 *
602 * @return WP_Error|WP_REST_Response
603 */
604 public function get_experiences( $request ) {
605 $employee_id = (int) $request['id'];
606 $employee = new Employee( $employee_id );
607 $items = $employee->get_experiences();
608
609 $formated_items = [];
610 foreach ( $items as $item ) {
611 $data = $this->prepare_experience_for_response( $item, $request );
612 $formated_items[] = $this->prepare_response_for_collection( $data );
613 }
614
615 $response = rest_ensure_response( $formated_items );
616 $response = $this->format_collection_response( $response, $request, $total_items );
617
618 return $response;
619 }
620
621 /**
622 * Get a specific experience of an employee
623 *
624 * @param WP_REST_Request $request
625 *
626 * @return WP_Error|WP_REST_Response
627 */
628 public function get_experience( $request ) {
629 $exp_id = (int) $request['exp_id'];
630 $employee_id = (int) $request['id'];
631
632 $experience = Work_Experience::where( ['id' => $exp_id, 'employee_id' => $employee_id] )->first();
633
634 if ( ! $experience ) {
635 return new WP_Error( 'rest_invalid_experience', __( 'Invalid experience id.' ), array( 'status' => 404 ) );
636 }
637
638 $response = $this->prepare_experience_for_response( $experience, $request );
639
640 return $response;
641 }
642
643 /**
644 * Create an experience
645 *
646 * @param WP_REST_Request $request
647 *
648 * @return WP_Error|WP_REST_Request
649 */
650 public function create_experience( $request ) {
651 $request['employee_id'] = $request['id'];
652 unset( $request['id'] );
653
654 if ( ! isset( $request['company_name'] ) ) {
655 return new WP_Error( 'rest_experience_required_fields', __( 'Required company_name.' ), array( 'status' => 400 ) );
656 }
657
658 if ( ! isset( $request['job_title'] ) ) {
659 return new WP_Error( 'rest_experience_required_fields', __( 'Required job_title.' ), array( 'status' => 400 ) );
660 }
661
662 if ( ! isset( $request['from'] ) ) {
663 return new WP_Error( 'rest_experience_required_fields', __( 'Required from.' ), array( 'status' => 400 ) );
664 }
665
666 if ( ! isset( $request['to'] ) ) {
667 return new WP_Error( 'rest_experience_required_fields', __( 'Required to.' ), array( 'status' => 400 ) );
668 }
669
670 $item = $this->prepare_experience_for_database( $request );
671 $experience = Work_Experience::create( $item );
672
673 $request->set_param( 'context', 'edit' );
674 $response = $this->prepare_experience_for_response( $experience, $request );
675
676 $response = rest_ensure_response( $response );
677 $response->set_status( 201 );
678 $response->header( 'Location', rest_url( sprintf( '/%s/%s/%d', $this->namespace, $this->rest_base, $id ) ) );
679
680 return $response;
681 }
682
683 /**
684 * Update an experience
685 *
686 * @param WP_REST_Request $request
687 *
688 * @return WP_Error|WP_REST_Request
689 */
690 public function update_experience( $request ) {
691 $request['employee_id'] = $request['id'];
692 unset( $request['id'] );
693 $request['id'] = (int) $request['exp_id'];
694
695 $item = $this->prepare_experience_for_database( $request );
696 $experience = Work_Experience::find( $request['id'] );
697 if ( $experience ) {
698 $is_updated = $experience->update( $item );
699 }
700
701 $request->set_param( 'context', 'edit' );
702 $response = $this->prepare_experience_for_response( $experience, $request );
703
704 $response = rest_ensure_response( $response );
705 $response->set_status( 201 );
706 $response->header( 'Location', rest_url( sprintf( '/%s/%s/%d', $this->namespace, $this->rest_base, $id ) ) );
707
708 return $response;
709 }
710
711 /**
712 * Delete an experience
713 *
714 * @param WP_REST_Request $request
715 *
716 * @return WP_Error|WP_REST_Request
717 */
718 public function delete_experience( $request ) {
719 $id = (int) $request['exp_id'];
720
721 Work_Experience::find( $id )->delete();
722
723 return new WP_REST_Response( true, 204 );
724 }
725
726 /**
727 * Prepare a single experience for create or update
728 *
729 * @param WP_REST_Request $request Request object.
730 *
731 * @return array $prepared_item
732 */
733 protected function prepare_experience_for_database( $request ) {
734 $prepared_item = [];
735
736 // required arguments.
737 if ( isset( $request['company_name'] ) ) {
738 $prepared_item['company_name'] = $request['company_name'];
739 }
740
741 if ( isset( $request['job_title'] ) ) {
742 $prepared_item['job_title'] = $request['job_title'];
743 }
744
745 if ( isset( $request['description'] ) ) {
746 $prepared_item['description'] = $request['description'];
747 }
748
749 if ( isset( $request['from'] ) ) {
750 $prepared_item['from'] = $request['from'];
751 }
752
753 if ( isset( $request['to'] ) ) {
754 $prepared_item['to'] = $request['to'];
755 }
756
757 if ( isset( $request['employee_id'] ) ) {
758 $prepared_item['employee_id'] = absint( $request['employee_id'] );
759 }
760
761 // optional arguments.
762 if ( isset( $request['id'] ) ) {
763 $prepared_item['id'] = absint( $request['id'] );
764 }
765
766 return $prepared_item;
767 }
768
769 /**
770 * Prepare a single experience output for response
771 *
772 * @param object $item
773 * @param WP_REST_Request $request Request object.
774 * @param array $additional_fields (optional)
775 *
776 * @return WP_REST_Response $response Response data.
777 */
778 public function prepare_experience_for_response( $item, $request, $additional_fields = [] ) {
779 $data = [
780 'id' => (int) $item->id,
781 'company_name' => $item->company_name,
782 'job_title' => $item->job_title,
783 'description' => $item->description,
784 'from' => $item->from,
785 'to' => $item->to,
786 ];
787
788 $data = array_merge( $data, $additional_fields );
789
790 // Wrap the data in a response object
791 $response = rest_ensure_response( $data );
792
793 return $response;
794 }
795
796 /**
797 * Get a collection of employee's educations
798 *
799 * @param WP_REST_Request $request
800 *
801 * @return WP_Error|WP_REST_Response
802 */
803 public function get_educations( $request ) {
804 $employee_id = (int) $request['id'];
805 $employee = new Employee( $employee_id );
806 $items = $employee->get_educations();
807
808 $formated_items = [];
809 foreach ( $items as $item ) {
810 $data = $this->prepare_education_for_response( $item, $request );
811 $formated_items[] = $this->prepare_response_for_collection( $data );
812 }
813
814 $response = rest_ensure_response( $formated_items );
815 $response = $this->format_collection_response( $response, $request, $total_items );
816
817 return $response;
818 }
819
820 /**
821 * Get a specific education of an employee
822 *
823 * @param WP_REST_Request $request
824 *
825 * @return WP_Error|WP_REST_Response
826 */
827 public function get_education( $request ) {
828 $edu_id = (int) $request['edu_id'];
829 $employee_id = (int) $request['id'];
830
831 $education = Education::where( ['id' => $edu_id, 'employee_id' => $employee_id] )->first();
832
833 if ( ! $education ) {
834 return new WP_Error( 'rest_invalid_education', __( 'Invalid education id.' ), array( 'status' => 404 ) );
835 }
836
837 $response = $this->prepare_education_for_response( $education, $request );
838
839 return $response;
840 }
841
842 /**
843 * Create an education
844 *
845 * @param WP_REST_Request $request
846 *
847 * @return WP_Error|WP_REST_Request
848 */
849 public function create_education( $request ) {
850 $request['employee_id'] = $request['id'];
851 unset( $request['id'] );
852
853 if ( ! isset( $request['school'] ) ) {
854 return new WP_Error( 'rest_experience_required_fields', __( 'Required school.' ), array( 'status' => 400 ) );
855 }
856
857 if ( ! isset( $request['degree'] ) ) {
858 return new WP_Error( 'rest_experience_required_fields', __( 'Required degree.' ), array( 'status' => 400 ) );
859 }
860
861 if ( ! isset( $request['field'] ) ) {
862 return new WP_Error( 'rest_experience_required_fields', __( 'Required field.' ), array( 'status' => 400 ) );
863 }
864
865 $item = $this->prepare_education_for_database( $request );
866 $education = Education::create( $item );
867
868 $request->set_param( 'context', 'edit' );
869 $response = $this->prepare_education_for_response( $education, $request );
870
871 $response = rest_ensure_response( $response );
872 $response->set_status( 201 );
873 $response->header( 'Location', rest_url( sprintf( '/%s/%s/%d', $this->namespace, $this->rest_base, $id ) ) );
874
875 return $response;
876 }
877
878 /**
879 * Update an education
880 *
881 * @param WP_REST_Request $request
882 *
883 * @return WP_Error|WP_REST_Request
884 */
885 public function update_education( $request ) {
886 $request['employee_id'] = $request['id'];
887 unset( $request['id'] );
888 $request['id'] = (int) $request['edu_id'];
889
890 $item = $this->prepare_education_for_database( $request );
891 $education = Education::find( $request['id'] );
892 if ( $education ) {
893 $is_updated = $education->update( $item );
894 }
895
896 $request->set_param( 'context', 'edit' );
897 $response = $this->prepare_education_for_response( $education, $request );
898
899 $response = rest_ensure_response( $response );
900 $response->set_status( 201 );
901 $response->header( 'Location', rest_url( sprintf( '/%s/%s/%d', $this->namespace, $this->rest_base, $id ) ) );
902
903 return $response;
904 }
905
906 /**
907 * Delete an education
908 *
909 * @param WP_REST_Request $request
910 *
911 * @return WP_Error|WP_REST_Request
912 */
913 public function delete_education( $request ) {
914 $id = (int) $request['edu_id'];
915
916 Education::find( $id )->delete();
917
918 return new WP_REST_Response( true, 204 );
919 }
920
921 /**
922 * Prepare a single education for create or update
923 *
924 * @param WP_REST_Request $request Request object.
925 *
926 * @return array $prepared_item
927 */
928 protected function prepare_education_for_database( $request ) {
929 $prepared_item = [];
930
931 // required arguments.
932 if ( isset( $request['school'] ) ) {
933 $prepared_item['school'] = $request['school'];
934 }
935
936 if ( isset( $request['degree'] ) ) {
937 $prepared_item['degree'] = $request['degree'];
938 }
939
940 if ( isset( $request['field'] ) ) {
941 $prepared_item['field'] = $request['field'];
942 }
943
944 if ( isset( $request['finished'] ) ) {
945 $prepared_item['finished'] = $request['finished'];
946 }
947
948 if ( isset( $request['notes'] ) ) {
949 $prepared_item['notes'] = $request['notes'];
950 }
951
952 if ( isset( $request['interest'] ) ) {
953 $prepared_item['interest'] = $request['interest'];
954 }
955
956 if ( isset( $request['employee_id'] ) ) {
957 $prepared_item['employee_id'] = absint( $request['employee_id'] );
958 }
959
960 // optional arguments.
961 if ( isset( $request['id'] ) ) {
962 $prepared_item['id'] = absint( $request['id'] );
963 }
964
965 return $prepared_item;
966 }
967
968 /**
969 * Prepare a single education output for response
970 *
971 * @param object $item
972 * @param WP_REST_Request $request Request object.
973 * @param array $additional_fields (optional)
974 *
975 * @return WP_REST_Response $response Response data.
976 */
977 public function prepare_education_for_response( $item, $request, $additional_fields = [] ) {
978 $data = [
979 'id' => (int) $item->id,
980 'school' => $item->school,
981 'degree' => $item->degree,
982 'field' => $item->field,
983 'finished' => $item->finished,
984 'notes' => $item->notes,
985 'interest' => $item->interest,
986 ];
987
988 $data = array_merge( $data, $additional_fields );
989
990 // Wrap the data in a response object
991 $response = rest_ensure_response( $data );
992
993 return $response;
994 }
995
996 /**
997 * Get a collection of employee's dependents
998 *
999 * @param WP_REST_Request $request
1000 *
1001 * @return WP_Error|WP_REST_Response
1002 */
1003 public function get_dependents( $request ) {
1004 $employee_id = (int) $request['id'];
1005 $employee = new Employee( $employee_id );
1006 $items = $employee->get_dependents();
1007
1008 $formated_items = [];
1009 foreach ( $items as $item ) {
1010 $data = $this->prepare_dependent_for_response( $item, $request );
1011 $formated_items[] = $this->prepare_response_for_collection( $data );
1012 }
1013
1014 $response = rest_ensure_response( $formated_items );
1015 $response = $this->format_collection_response( $response, $request, $total_items );
1016
1017 return $response;
1018 }
1019
1020 /**
1021 * Get a specific dependent of an employee
1022 *
1023 * @param WP_REST_Request $request
1024 *
1025 * @return WP_Error|WP_REST_Response
1026 */
1027 public function get_dependent( $request ) {
1028 $dep_id = (int) $request['dep_id'];
1029 $employee_id = (int) $request['id'];
1030
1031 $dependent = Dependents::where( ['id' => $dep_id, 'employee_id' => $employee_id] )->first();
1032
1033 if ( ! $dependent ) {
1034 return new WP_Error( 'rest_invalid_dependent', __( 'Invalid dependent id.' ), array( 'status' => 404 ) );
1035 }
1036
1037 $response = $this->prepare_dependent_for_response( $dependent, $request );
1038
1039 return $response;
1040 }
1041
1042 /**
1043 * Create a dependent
1044 *
1045 * @param WP_REST_Request $request
1046 *
1047 * @return WP_Error|WP_REST_Request
1048 */
1049 public function create_dependent( $request ) {
1050 $request['employee_id'] = $request['id'];
1051 unset( $request['id'] );
1052
1053 if ( ! isset( $request['name'] ) ) {
1054 return new WP_Error( 'rest_experience_required_fields', __( 'Required name.' ), array( 'status' => 400 ) );
1055 }
1056
1057 if ( ! isset( $request['relation'] ) ) {
1058 return new WP_Error( 'rest_experience_required_fields', __( 'Required relation.' ), array( 'status' => 400 ) );
1059 }
1060
1061 $item = $this->prepare_dependent_for_database( $request );
1062 $dependent = Dependents::create( $item );
1063
1064 $request->set_param( 'context', 'edit' );
1065 $response = $this->prepare_dependent_for_response( $dependent, $request );
1066
1067 $response = rest_ensure_response( $response );
1068 $response->set_status( 201 );
1069 $response->header( 'Location', rest_url( sprintf( '/%s/%s/%d', $this->namespace, $this->rest_base, $id ) ) );
1070
1071 return $response;
1072 }
1073
1074 /**
1075 * Update a dependent
1076 *
1077 * @param WP_REST_Request $request
1078 *
1079 * @return WP_Error|WP_REST_Request
1080 */
1081 public function update_dependent( $request ) {
1082 $request['employee_id'] = $request['id'];
1083 unset( $request['id'] );
1084 $request['id'] = (int) $request['dep_id'];
1085
1086 $item = $this->prepare_dependent_for_database( $request );
1087 $dependent = Dependents::find( $request['id'] );
1088 if ( $dependent ) {
1089 $is_updated = $dependent->update( $item );
1090 }
1091
1092 $request->set_param( 'context', 'edit' );
1093 $response = $this->prepare_dependent_for_response( $dependent, $request );
1094
1095 $response = rest_ensure_response( $response );
1096 $response->set_status( 201 );
1097 $response->header( 'Location', rest_url( sprintf( '/%s/%s/%d', $this->namespace, $this->rest_base, $id ) ) );
1098
1099 return $response;
1100 }
1101
1102 /**
1103 * Delete a dependent
1104 *
1105 * @param WP_REST_Request $request
1106 *
1107 * @return WP_Error|WP_REST_Request
1108 */
1109 public function delete_dependent( $request ) {
1110 $id = (int) $request['dep_id'];
1111
1112 Dependents::find( $id )->delete();
1113
1114 return new WP_REST_Response( true, 204 );
1115 }
1116
1117 /**
1118 * Prepare a single dependent for create or update
1119 *
1120 * @param WP_REST_Request $request Request object.
1121 *
1122 * @return array $prepared_item
1123 */
1124 protected function prepare_dependent_for_database( $request ) {
1125 $prepared_item = [];
1126
1127 // required arguments.
1128 if ( isset( $request['name'] ) ) {
1129 $prepared_item['name'] = $request['name'];
1130 }
1131
1132 if ( isset( $request['relation'] ) ) {
1133 $prepared_item['relation'] = $request['relation'];
1134 }
1135
1136 if ( isset( $request['date_of_birth'] ) ) {
1137 $prepared_item['dob'] = $request['date_of_birth'];
1138 }
1139
1140 if ( isset( $request['employee_id'] ) ) {
1141 $prepared_item['employee_id'] = absint( $request['employee_id'] );
1142 }
1143
1144 // optional arguments.
1145 if ( isset( $request['id'] ) ) {
1146 $prepared_item['id'] = absint( $request['id'] );
1147 }
1148
1149 return $prepared_item;
1150 }
1151
1152 /**
1153 * Prepare a single dependent output for response
1154 *
1155 * @param object $item
1156 * @param WP_REST_Request $request Request object.
1157 * @param array $additional_fields (optional)
1158 *
1159 * @return WP_REST_Response $response Response data.
1160 */
1161 public function prepare_dependent_for_response( $item, $request, $additional_fields = [] ) {
1162 $data = [
1163 'id' => (int) $item->id,
1164 'name' => $item->name,
1165 'relation' => $item->relation,
1166 'date_of_birth' => $item->dob,
1167 ];
1168
1169 $data = array_merge( $data, $additional_fields );
1170
1171 // Wrap the data in a response object
1172 $response = rest_ensure_response( $data );
1173
1174 return $response;
1175 }
1176
1177 /**
1178 * Get the User's schema, conforming to JSON Schema
1179 *
1180 * @return array
1181 */
1182 public function get_item_schema() {
1183 $schema = [
1184 '$schema' => 'http://json-schema.org/draft-04/schema#',
1185 'title' => 'employee',
1186 'type' => 'object',
1187 'properties' => [
1188 'id' => [
1189 'description' => __( 'Unique identifier for the resource.' ),
1190 'type' => 'integer',
1191 'context' => [ 'embed', 'view', 'edit' ],
1192 'readonly' => true,
1193 ],
1194 'first_name' => [
1195 'description' => __( 'First name for the resource.' ),
1196 'type' => 'string',
1197 'context' => [ 'edit' ],
1198 'arg_options' => [
1199 'sanitize_callback' => 'sanitize_text_field',
1200 ],
1201 'required' => true,
1202 ],
1203 'middle_name' => [
1204 'description' => __( 'Middle name for the resource.' ),
1205 'type' => 'string',
1206 'context' => [ 'edit' ],
1207 'arg_options' => [
1208 'sanitize_callback' => 'sanitize_text_field',
1209 ],
1210 ],
1211 'last_name' => [
1212 'description' => __( 'Last name for the resource.' ),
1213 'type' => 'string',
1214 'context' => [ 'edit' ],
1215 'arg_options' => [
1216 'sanitize_callback' => 'sanitize_text_field',
1217 ],
1218 'required' => true,
1219 ],
1220 'email' => [
1221 'description' => __( 'The email address for the resource.' ),
1222 'type' => 'string',
1223 'format' => 'email',
1224 'context' => [ 'edit' ],
1225 'required' => true,
1226 ],
1227 'location' => [
1228 'description' => __( 'Location for the resource.' ),
1229 'type' => 'string',
1230 'context' => [ 'edit' ],
1231 'arg_options' => [
1232 'sanitize_callback' => 'sanitize_text_field',
1233 ],
1234 ],
1235 'hiring_source' => [
1236 'description' => __( 'Hiring source for the resource.' ),
1237 'type' => 'string',
1238 'context' => [ 'edit' ],
1239 'arg_options' => [
1240 'sanitize_callback' => 'sanitize_text_field',
1241 ],
1242 ],
1243 'hiring_date' => [
1244 'description' => __( 'Hiring date for the resource.' ),
1245 'type' => 'string',
1246 'context' => [ 'edit' ],
1247 'arg_options' => [
1248 'sanitize_callback' => 'sanitize_text_field',
1249 ],
1250 ],
1251 'date_of_birth' => [
1252 'description' => __( 'Date of birth for the resource.' ),
1253 'type' => 'string',
1254 'context' => [ 'edit' ],
1255 'arg_options' => [
1256 'sanitize_callback' => 'sanitize_text_field',
1257 ],
1258 ],
1259 'pay_rate' => [
1260 'description' => __( 'Pay rate for the resource.' ),
1261 'type' => 'string',
1262 'context' => [ 'edit' ],
1263 'arg_options' => [
1264 'sanitize_callback' => 'sanitize_text_field',
1265 ],
1266 ],
1267 'pay_type' => [
1268 'description' => __( 'Pay type for the resource.' ),
1269 'type' => 'string',
1270 'context' => [ 'edit' ],
1271 'arg_options' => [
1272 'sanitize_callback' => 'sanitize_text_field',
1273 ],
1274 ],
1275 'type' => [
1276 'description' => __( 'Type for the resource.' ),
1277 'type' => 'string',
1278 'context' => [ 'edit' ],
1279 'arg_options' => [
1280 'sanitize_callback' => 'sanitize_text_field',
1281 ],
1282 'required' => true,
1283 ],
1284 'status' => [
1285 'description' => __( 'Status for the resource.' ),
1286 'type' => 'string',
1287 'context' => [ 'edit' ],
1288 'arg_options' => [
1289 'sanitize_callback' => 'sanitize_text_field',
1290 ],
1291 'required' => true,
1292 ],
1293 'phone' => [
1294 'description' => __( 'Phone for the resource.' ),
1295 'type' => 'string',
1296 'context' => [ 'edit' ],
1297 'arg_options' => [
1298 'sanitize_callback' => 'sanitize_text_field',
1299 ],
1300 ],
1301 'work_phone' => [
1302 'description' => __( 'Work phone for the resource.' ),
1303 'type' => 'string',
1304 'context' => [ 'edit' ],
1305 'arg_options' => [
1306 'sanitize_callback' => 'sanitize_text_field',
1307 ],
1308 ],
1309 'mobile' => [
1310 'description' => __( 'Mobile for the resource.' ),
1311 'type' => 'string',
1312 'context' => [ 'edit' ],
1313 'arg_options' => [
1314 'sanitize_callback' => 'sanitize_text_field',
1315 ],
1316 ],
1317 'other' => [
1318 'description' => __( 'Other for the resource.' ),
1319 'type' => 'string',
1320 'context' => [ 'edit' ],
1321 'arg_options' => [
1322 'sanitize_callback' => 'sanitize_text_field',
1323 ],
1324 ],
1325 'user_url' => [
1326 'description' => __( 'Website of the resource.' ),
1327 'type' => 'string',
1328 'format' => 'uri',
1329 'context' => [ 'embed', 'view', 'edit' ],
1330 ],
1331 'street_1' => [
1332 'description' => __( 'Street 1 of the resource.' ),
1333 'type' => 'string',
1334 'context' => [ 'embed', 'view', 'edit' ],
1335 'arg_options' => [
1336 'sanitize_callback' => 'sanitize_text_field',
1337 ],
1338 ],
1339 'street_2' => [
1340 'description' => __( 'Street 1 of the resource.' ),
1341 'type' => 'string',
1342 'context' => [ 'embed', 'view', 'edit' ],
1343 'arg_options' => [
1344 'sanitize_callback' => 'sanitize_text_field',
1345 ],
1346 ],
1347 'city' => [
1348 'description' => __( 'City of the resource.' ),
1349 'type' => 'string',
1350 'context' => [ 'embed', 'view', 'edit' ],
1351 'arg_options' => [
1352 'sanitize_callback' => 'sanitize_text_field',
1353 ],
1354 ],
1355 'state' => [
1356 'description' => __( 'State of the resource.' ),
1357 'type' => 'string',
1358 'context' => [ 'embed', 'view', 'edit' ],
1359 'arg_options' => [
1360 'sanitize_callback' => 'sanitize_text_field',
1361 ],
1362 ],
1363 'postal_code' => [
1364 'description' => __( 'Postal Code of the resource.' ),
1365 'type' => 'string',
1366 'context' => [ 'embed', 'view', 'edit' ],
1367 'arg_options' => [
1368 'sanitize_callback' => 'sanitize_text_field',
1369 ],
1370 ],
1371 'country' => [
1372 'description' => __( 'Country of the resource.' ),
1373 'type' => 'string',
1374 'context' => [ 'embed', 'view', 'edit' ],
1375 'arg_options' => [
1376 'sanitize_callback' => 'sanitize_text_field',
1377 ],
1378 ],
1379 ],
1380 ];
1381
1382 return $schema;
1383 }
1384 }