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-vendors-controller.php

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

519 lines 18.5 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 Vendors_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 = 'accounting/vendors';
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_vendors' ],
31 'args' => $this->get_collection_params(),
32 'permission_callback' => function ( $request ) {
33 return current_user_can( 'erp_ac_view_vendor' );
34 },
35 ],
36 [
37 'methods' => WP_REST_Server::CREATABLE,
38 'callback' => [ $this, 'create_vendor' ],
39 'args' => $this->get_endpoint_args_for_item_schema( WP_REST_Server::CREATABLE ),
40 'permission_callback' => function ( $request ) {
41 return current_user_can( 'erp_ac_create_vendor' );
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_vendor' ],
51 'args' => [
52 'context' => $this->get_context_param( [ 'default' => 'view' ] ),
53 ],
54 'permission_callback' => function ( $request ) {
55 return current_user_can( 'erp_ac_view_vendor' );
56 },
57 ],
58 [
59 'methods' => WP_REST_Server::EDITABLE,
60 'callback' => [ $this, 'update_vendor' ],
61 'args' => $this->get_endpoint_args_for_item_schema( WP_REST_Server::EDITABLE ),
62 'permission_callback' => function ( $request ) {
63 return current_user_can( 'erp_ac_edit_vendor' );
64 },
65 ],
66 [
67 'methods' => WP_REST_Server::DELETABLE,
68 'callback' => [ $this, 'delete_vendor' ],
69 'permission_callback' => function ( $request ) {
70 return current_user_can( 'erp_ac_delete_vendor' );
71 },
72 ],
73 'schema' => [ $this, 'get_public_item_schema' ],
74 ] );
75
76 register_rest_route( $this->namespace, '/' . $this->rest_base . '/(?P<id>[\d]+)' . '/transactions', [
77 [
78 'methods' => WP_REST_Server::READABLE,
79 'callback' => [ $this, 'get_transactions' ],
80 'args' => $this->get_collection_params(),
81 'permission_callback' => function ( $request ) {
82 return current_user_can( 'erp_ac_view_vendor' );
83 },
84 ],
85 ] );
86 }
87
88 /**
89 * Get a collection of vendors
90 *
91 * @param WP_REST_Request $request
92 *
93 * @return WP_Error|WP_REST_Response
94 */
95 public function get_vendors( $request ) {
96 $args = [
97 'number' => $request['per_page'],
98 'offset' => ( $request['per_page'] * ( $request['page'] - 1 ) ),
99 'type' => 'vendor'
100 ];
101
102 $items = erp_get_peoples( $args );
103 $total_items = erp_get_peoples( [ 'type' => 'vendor', 'count' => true ] );
104
105 $formated_items = [];
106 foreach ( $items as $item ) {
107 $additional_fields = [];
108
109 if ( isset( $request['include'] ) ) {
110 $include_params = explode( ',', str_replace( ' ', '', $request['include'] ) );
111
112 if ( in_array( 'owner', $include_params ) ) {
113 $vendor_owner_id = ( $item->user_id ) ? get_user_meta( $item->user_id, 'contact_owner', true ) : erp_people_get_meta( $item->id, 'contact_owner', true );
114
115 $item->owner = $this->get_user( $vendor_owner_id );
116 $additional_fields = ['owner' => $item->owner];
117 }
118 }
119
120 $data = $this->prepare_item_for_response( $item, $request, $additional_fields );
121 $formated_items[] = $this->prepare_response_for_collection( $data );
122 }
123
124 $response = rest_ensure_response( $formated_items );
125 $response = $this->format_collection_response( $response, $request, $total_items );
126
127 return $response;
128 }
129
130 /**
131 * Get a specific vendor
132 *
133 * @param WP_REST_Request $request
134 *
135 * @return WP_Error|WP_REST_Response
136 */
137 public function get_vendor( $request ) {
138 $id = (int) $request['id'];
139 $item = erp_get_people( $id );
140
141 if ( empty( $id ) || empty( $item->id ) ) {
142 return new WP_Error( 'rest_vendor_invalid_id', __( 'Invalid resource id.' ), [ 'status' => 404 ] );
143 }
144
145 $additional_fields = [];
146 if ( isset( $request['include'] ) ) {
147 $include_params = explode( ',', str_replace( ' ', '', $request['include'] ) );
148
149 if ( in_array( 'owner', $include_params ) ) {
150 $vendor_owner_id = ( $item->user_id ) ? get_user_meta( $item->user_id, 'contact_owner', true ) : erp_people_get_meta( $item->id, 'contact_owner', true );
151
152 $item->owner = $this->get_user( $vendor_owner_id );
153 $additional_fields = ['owner' => $item->owner];
154 }
155 }
156
157 $item = $this->prepare_item_for_response( $item, $request, $additional_fields );
158 $response = rest_ensure_response( $item );
159
160 return $response;
161 }
162
163 /**
164 * Create a vendor
165 *
166 * @param WP_REST_Request $request
167 *
168 * @return WP_Error|WP_REST_Request
169 */
170 public function create_vendor( $request ) {
171 $item = $this->prepare_item_for_database( $request );
172
173 $id = erp_insert_people( $item );
174
175 $vendor = erp_get_people( $id );
176
177 $request->set_param( 'context', 'edit' );
178 $response = $this->prepare_item_for_response( $vendor, $request );
179 $response = rest_ensure_response( $response );
180 $response->set_status( 201 );
181 $response->header( 'Location', rest_url( sprintf( '/%s/%s/%d', $this->namespace, $this->rest_base, $id ) ) );
182
183 return $response;
184 }
185
186 /**
187 * Update a vendor
188 *
189 * @param WP_REST_Request $request
190 *
191 * @return WP_Error|WP_REST_Request
192 */
193 public function update_vendor( $request ) {
194 $id = (int) $request['id'];
195
196 $item = erp_get_people( $id );
197 if ( ! $item ) {
198 return new WP_Error( 'rest_vendor_invalid_id', __( 'Invalid resource id.' ), [ 'status' => 400 ] );
199 }
200
201 $item = $this->prepare_item_for_database( $request );
202
203 erp_insert_people( $item );
204
205 $vendor = erp_get_people( $id );
206 $response = $this->prepare_item_for_response( $vendor, $request );
207 $response = rest_ensure_response( $response );
208 $response->set_status( 201 );
209 $response->header( 'Location', rest_url( sprintf( '/%s/%s/%d', $this->namespace, $this->rest_base, $id ) ) );
210
211 return $response;
212 }
213
214 /**
215 * Delete a vendor
216 *
217 * @param WP_REST_Request $request
218 *
219 * @return WP_Error|WP_REST_Request
220 */
221 public function delete_vendor( $request ) {
222 $id = (int) $request['id'];
223
224 $data = [
225 'id' => $id,
226 'hard' => false,
227 'type' => 'vendor'
228 ];
229
230 erp_delete_people( $data );
231
232 return new WP_REST_Response( true, 204 );
233 }
234
235 /**
236 * Get a collection of transactions
237 *
238 * @param WP_REST_Request $request
239 *
240 * @return WP_Error|WP_REST_Response
241 */
242 public function get_transactions( $request ) {
243 $id = (int) $request['id'];
244
245 $args = [
246 'number' => $request['per_page'],
247 'offset' => ( $request['per_page'] * ( $request['page'] - 1 ) ),
248 'type' => 'expense',
249 'user_id' => $id,
250 ];
251
252 $transactions = erp_ac_get_all_transaction( $args );
253
254 return new WP_REST_Response( $transactions, 200 );
255 }
256
257 /**
258 * Prepare a single item for create or update
259 *
260 * @param WP_REST_Request $request Request object.
261 *
262 * @return array $prepared_item
263 */
264 protected function prepare_item_for_database( $request ) {
265 $prepared_item = [];
266
267 // required arguments.
268 if ( isset( $request['first_name'] ) ) {
269 $prepared_item['first_name'] = $request['first_name'];
270 }
271 if ( isset( $request['last_name'] ) ) {
272 $prepared_item['last_name'] = $request['last_name'];
273 }
274 if ( isset( $request['email'] ) ) {
275 $prepared_item['email'] = $request['email'];
276 }
277
278 // optional arguments.
279 if ( isset( $request['id'] ) ) {
280 $prepared_item['id'] = absint( $request['id'] );
281 }
282 if ( isset( $request['vendor'] ) ) {
283 $prepared_item['company'] = $request['vendor'];
284 }
285 if ( isset( $request['phone'] ) ) {
286 $prepared_item['phone'] = $request['phone'];
287 }
288 if ( isset( $request['mobile'] ) ) {
289 $prepared_item['mobile'] = $request['mobile'];
290 }
291 if ( isset( $request['other'] ) ) {
292 $prepared_item['other'] = $request['other'];
293 }
294 if ( isset( $request['website'] ) ) {
295 $prepared_item['website'] = $request['website'];
296 }
297 if ( isset( $request['fax'] ) ) {
298 $prepared_item['fax'] = $request['fax'];
299 }
300 if ( isset( $request['notes'] ) ) {
301 $prepared_item['notes'] = $request['notes'];
302 }
303 if ( isset( $request['street_1'] ) ) {
304 $prepared_item['street_1'] = $request['street_1'];
305 }
306 if ( isset( $request['street_2'] ) ) {
307 $prepared_item['street_2'] = $request['street_2'];
308 }
309 if ( isset( $request['city'] ) ) {
310 $prepared_item['city'] = $request['city'];
311 }
312 if ( isset( $request['state'] ) ) {
313 $prepared_item['state'] = $request['state'];
314 }
315 if ( isset( $request['postal_code'] ) ) {
316 $prepared_item['postal_code'] = $request['postal_code'];
317 }
318 if ( isset( $request['country'] ) ) {
319 $prepared_item['country'] = $request['country'];
320 }
321 if ( isset( $request['currency'] ) ) {
322 $prepared_item['currency'] = $request['currency'];
323 }
324
325 $prepared_item['type'] = 'vendor';
326
327 return $prepared_item;
328 }
329
330 /**
331 * Prepare a single user output for response
332 *
333 * @param object $item
334 * @param WP_REST_Request $request Request object.
335 * @param array $additional_fields (optional)
336 *
337 * @return WP_REST_Response $response Response data.
338 */
339 public function prepare_item_for_response( $item, $request, $additional_fields = [] ) {
340 $data = [
341 'id' => (int) $item->id,
342 'first_name' => $item->first_name,
343 'last_name' => $item->last_name,
344 'email' => $item->email,
345 'vendor' => $item->company,
346 'phone' => $item->phone,
347 'mobile' => $item->mobile,
348 'other' => $item->other,
349 'website' => $item->website,
350 'fax' => $item->fax,
351 'notes' => $item->notes,
352 'street_1' => $item->street_1,
353 'street_2' => $item->street_2,
354 'city' => $item->city,
355 'state' => $item->state,
356 'postal_code' => $item->postal_code,
357 'country' => $item->country,
358 ];
359
360 $data = array_merge( $data, $additional_fields );
361
362 // Wrap the data in a response object
363 $response = rest_ensure_response( $data );
364
365 $response = $this->add_links( $response, $item );
366
367 return $response;
368 }
369
370 /**
371 * Get the User's schema, conforming to JSON Schema
372 *
373 * @return array
374 */
375 public function get_item_schema() {
376 $schema = [
377 '$schema' => 'http://json-schema.org/draft-04/schema#',
378 'title' => 'vendor',
379 'type' => 'object',
380 'properties' => [
381 'id' => [
382 'description' => __( 'Unique identifier for the resource.' ),
383 'type' => 'integer',
384 'context' => [ 'embed', 'view', 'edit' ],
385 'readonly' => true,
386 ],
387 'first_name' => [
388 'description' => __( 'First name for the resource.' ),
389 'type' => 'string',
390 'context' => [ 'edit' ],
391 'arg_options' => [
392 'sanitize_callback' => 'sanitize_text_field',
393 ],
394 ],
395 'last_name' => [
396 'description' => __( 'Last name for the resource.' ),
397 'type' => 'string',
398 'context' => [ 'edit' ],
399 'arg_options' => [
400 'sanitize_callback' => 'sanitize_text_field',
401 ],
402 ],
403 'email' => [
404 'description' => __( 'The email address for the resource.' ),
405 'type' => 'string',
406 'format' => 'email',
407 'context' => [ 'edit' ],
408 'required' => true,
409 ],
410 'vendor' => [
411 'description' => __( 'Vendor for the resource.' ),
412 'type' => 'string',
413 'context' => [ 'edit' ],
414 'arg_options' => [
415 'sanitize_callback' => 'sanitize_text_field',
416 ],
417 'required' => true,
418 ],
419 'phone' => [
420 'description' => __( 'Phone for the resource.' ),
421 'type' => 'string',
422 'context' => [ 'edit' ],
423 'arg_options' => [
424 'sanitize_callback' => 'sanitize_text_field',
425 ],
426 ],
427 'mobile' => [
428 'description' => __( 'Mobile for the resource.' ),
429 'type' => 'string',
430 'context' => [ 'edit' ],
431 'arg_options' => [
432 'sanitize_callback' => 'sanitize_text_field',
433 ],
434 ],
435 'other' => [
436 'description' => __( 'Other for the resource.' ),
437 'type' => 'string',
438 'context' => [ 'edit' ],
439 'arg_options' => [
440 'sanitize_callback' => 'sanitize_text_field',
441 ],
442 ],
443 'website' => [
444 'description' => __( 'Website of the resource.' ),
445 'type' => 'string',
446 'format' => 'uri',
447 'context' => [ 'embed', 'view', 'edit' ],
448 ],
449 'fax' => [
450 'description' => __( 'Fax of the resource.' ),
451 'type' => 'string',
452 'context' => [ 'embed', 'view', 'edit' ],
453 'arg_options' => [
454 'sanitize_callback' => 'sanitize_text_field',
455 ],
456 ],
457 'notes' => [
458 'description' => __( 'Notes of the resource.' ),
459 'type' => 'string',
460 'context' => [ 'embed', 'view', 'edit' ],
461 'arg_options' => [
462 'sanitize_callback' => 'sanitize_text_field',
463 ],
464 ],
465 'street_1' => [
466 'description' => __( 'Street 1 of the resource.' ),
467 'type' => 'string',
468 'context' => [ 'embed', 'view', 'edit' ],
469 'arg_options' => [
470 'sanitize_callback' => 'sanitize_text_field',
471 ],
472 ],
473 'street_2' => [
474 'description' => __( 'Street 1 of the resource.' ),
475 'type' => 'string',
476 'context' => [ 'embed', 'view', 'edit' ],
477 'arg_options' => [
478 'sanitize_callback' => 'sanitize_text_field',
479 ],
480 ],
481 'city' => [
482 'description' => __( 'City of the resource.' ),
483 'type' => 'string',
484 'context' => [ 'embed', 'view', 'edit' ],
485 'arg_options' => [
486 'sanitize_callback' => 'sanitize_text_field',
487 ],
488 ],
489 'state' => [
490 'description' => __( 'State of the resource.' ),
491 'type' => 'string',
492 'context' => [ 'embed', 'view', 'edit' ],
493 'arg_options' => [
494 'sanitize_callback' => 'sanitize_text_field',
495 ],
496 ],
497 'postal_code' => [
498 'description' => __( 'Postal Code of the resource.' ),
499 'type' => 'string',
500 'context' => [ 'embed', 'view', 'edit' ],
501 'arg_options' => [
502 'sanitize_callback' => 'sanitize_text_field',
503 ],
504 ],
505 'country' => [
506 'description' => __( 'Country of the resource.' ),
507 'type' => 'string',
508 'context' => [ 'embed', 'view', 'edit' ],
509 'arg_options' => [
510 'sanitize_callback' => 'sanitize_text_field',
511 ],
512 ],
513 ],
514 ];
515
516 return $schema;
517 }
518 }
519