- Add parsing logic for users, departments, and products, supporting array inputs with IDs or objects. - Filter out invalid entries and update relevant criteria properties.
134 lines
4.5 KiB
PHP
134 lines
4.5 KiB
PHP
<?php
|
|
|
|
namespace goals\classes;
|
|
|
|
use goals\helpers\goals_criteria_type;
|
|
use goals\interfaces\goals_criteria_i;
|
|
use goals\traits\goals_result_parser_t;
|
|
use goals\traits\goals_target_t;
|
|
use goals\traits\goals_timeframe_t;
|
|
|
|
class goals_criteria implements goals_criteria_i
|
|
{
|
|
use goals_timeframe_t,
|
|
goals_target_t,
|
|
goals_result_parser_t;
|
|
/**
|
|
* The users criteria
|
|
* @var goals_criteria_users $users
|
|
*/
|
|
public goals_criteria_users $users;
|
|
/**
|
|
* The departments criteria
|
|
* @var goals_criteria_departments $departments
|
|
*/
|
|
public goals_criteria_departments $departments;
|
|
/**
|
|
* Criteria type (products sold, etc.)
|
|
* @var goals_criteria_type $type
|
|
*/
|
|
public goals_criteria_type $type = goals_criteria_type::NONE;
|
|
/**
|
|
* Products criteria
|
|
* @var goals_criteria_products|null $products
|
|
*/
|
|
public ?goals_criteria_products $products;
|
|
/**
|
|
* Constructor
|
|
*/
|
|
public function __construct()
|
|
{
|
|
$this->users = new goals_criteria_users();
|
|
$this->departments = new goals_criteria_departments();
|
|
$this->products = new goals_criteria_products();
|
|
$this->start = new \DateTime();
|
|
$this->end = new \DateTime();
|
|
|
|
}
|
|
|
|
/**
|
|
* @throws \Exception If the JSON is invalid
|
|
*/
|
|
public static function fromJson(string $json): goals_criteria
|
|
{
|
|
$data = json_decode($json, true);
|
|
$criteria = new goals_criteria();
|
|
|
|
if (isset($data['type'])) {
|
|
$criteria->type = goals_criteria_type::tryFrom($data['type']);
|
|
}
|
|
if (isset($data['target'])) {
|
|
$criteria->target = $data['target'];
|
|
}
|
|
if (isset($data['start'])) {
|
|
$criteria->start = new \DateTime($data['start']);
|
|
}
|
|
if (isset($data['end'])) {
|
|
$criteria->end = new \DateTime($data['end']);
|
|
}
|
|
// Parse users (expects array of customer_numbers or objects with customer_number)
|
|
if (isset($data['users']) && is_array($data['users'])) {
|
|
$users = array_map(function ($item) {
|
|
$customerNumber = null;
|
|
if (is_array($item)) {
|
|
if (isset($item['customer_number'])) {
|
|
$customerNumber = (int)$item['customer_number'];
|
|
} elseif (isset($item['customerNumber'])) { // allow camelCase
|
|
$customerNumber = (int)$item['customerNumber'];
|
|
}
|
|
} elseif (is_numeric($item)) {
|
|
$customerNumber = (int)$item;
|
|
}
|
|
if ($customerNumber === null) {
|
|
return null;
|
|
}
|
|
return (new \objects\users_o())->getUserByCustomerNumber($customerNumber);
|
|
}, $data['users']);
|
|
// Filter out nulls in case of malformed entries
|
|
$users = array_values(array_filter($users));
|
|
$criteria->users->set($users);
|
|
}
|
|
|
|
// Parse departments (expects array of IDs or objects with id)
|
|
if (isset($data['departments']) && is_array($data['departments'])) {
|
|
$departments = array_map(function ($item) {
|
|
$id = null;
|
|
if (is_array($item)) {
|
|
if (isset($item['id'])) {
|
|
$id = (int)$item['id'];
|
|
}
|
|
} elseif (is_numeric($item)) {
|
|
$id = (int)$item;
|
|
}
|
|
if ($id === null) {
|
|
return null;
|
|
}
|
|
return (new \objects\departments_o())->select($id);
|
|
}, $data['departments']);
|
|
$departments = array_values(array_filter($departments));
|
|
$criteria->departments->set($departments);
|
|
}
|
|
|
|
// Parse products (expects array of IDs or objects with id)
|
|
if (isset($data['products']) && is_array($data['products'])) {
|
|
$products = array_map(function ($item) {
|
|
$id = null;
|
|
if (is_array($item)) {
|
|
if (isset($item['id'])) {
|
|
$id = (int)$item['id'];
|
|
}
|
|
} elseif (is_numeric($item)) {
|
|
$id = (int)$item;
|
|
}
|
|
if ($id === null) {
|
|
return null;
|
|
}
|
|
return (new \objects\products_o())->select($id);
|
|
}, $data['products']);
|
|
$products = array_values(array_filter($products));
|
|
$criteria->products->set($products);
|
|
}
|
|
|
|
return $criteria;
|
|
}
|
|
} |