Я пытаюсь интегрировать наше приложение с веб-сайтом Exact Online, используя OAuth2, или, более конкретно, я пытаюсь создать часовую регистрацию, которая должна включать «Сотрудник», «Проект», «Часы», «Тип часов».
function registerTime($access_token_for_data) {
//$dataToFilterAccounts = array('$filter' => 'IsSales eq true');
$dataToRetrieveFromEmployees = array('$select' => 'ID');
// $queryToFilterAccounts = http_build_query($dataToFilterAccounts);
$queryToRetrieveFromEmployees = http_build_query($dataToRetrieveFromEmployees);
// $dataToFilterItems = array('$filter' =>'IsSalesItem eq true');
$dataToRetrieveProjects = array('$select' => 'ID');
//$queryToFilterItems = http_build_query($dataToFilterItems);
$queryToRetrieveProjects = http_build_query($dataToRetrieveProjects);
$urlProjects = 'https://start.exactonline.nl/api/v1/638842/project/Projects';
$urlEmployees = 'https://start.exactonline.nl/api/v1/638842/payroll/Employees';
$curlProjects = curl_init($urlProjects);
$curlEmployees = curl_init($urlEmployees);
$headers = array(
'Authorization: Bearer ' . $access_token_for_data,
'Accept: application/json',
'Content-type: application/json'
);
curl_setopt($curlProjects, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curlProjects, CURLOPT_HTTPHEADER, $headers);
curl_setopt($curlProjects, CURLOPT_URL, $urlProjects . '?' . $queryToRetrieveProjects);
curl_setopt($curlProjects, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($curlEmployees, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curlEmployees, CURLOPT_HTTPHEADER, $headers);
curl_setopt($curlEmployees, CURLOPT_URL, $urlEmployees . '?' . $queryToRetrieveFromEmployees);
curl_setopt($curlEmployees, CURLOPT_CUSTOMREQUEST, 'GET');$resultProjects = curl_exec($curlProjects);
$resultEmployees = curl_exec($curlEmployees);
$projectsData = json_decode($resultProjects, true);
$projectID = $projectsData["d"]["results"]["0"]["ID"];
$employeesData = json_decode($resultEmployees, true);
$employeeID = $employeesData["d"]["results"]["0"]["ID"];
curl_close($curlProjects);
curl_close($curlEmployees);
$urlTimeTransaction = 'https://start.exactonline.nl/api/v1/638842/project/TimeTransactions';
$curlTimeTransacation = curl_init($urlTimeTransaction);
$content = json_encode(array("Project" => $projectID, "Employee" => $employeeI));
curl_setopt($curlTimeTransacation, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curlTimeTransacation, CURLOPT_HTTPHEADER, $headers);
curl_setopt($curlTimeTransacation, CURLOPT_POST, true);
curl_setopt($curlTimeTransacation, CURLOPT_POSTFIELDS, $content);
$createdTimeTransaction = curl_exec($curlTimeTransacation);
$status = curl_getinfo($curlTimeTransacation, CURLINFO_HTTP_CODE);
if ($status != 201) {
die("Error: call to URL $curlTimeTransacation failed with status $status, response $createdTimeTransaction, curl_error " . curl_error($curlTimeTransacation) . ", curl_errno " . curl_errno($curlTimeTransacation));
}
echo "HTTP status $status creating time registartion<br/><br/>";
curl_close($curlTimeTransacation);
}
И это ошибка, которую я получаю
Ошибка: вызов URL ресурса № 56 с ошибкой со статусом 500, ответ {«error»: {«code»: «», «message»: {«lang»: «», «value»: «Обязательно: Employee \ r \ nОбязательный: Часы \ r \ nОбязательный: Тип часа «}}}, curl_error, curl_errno 0
Но когда я пытаюсь включить любой из этих файлов мандатрой, я получаю:
Ошибка: вызов URL-адреса ресурса № 56 с состоянием 400, ответ {«ошибка»: {«код»: «», «сообщение»: {«lang»: «», «значение»: «Поток запроса на обработку ошибок. Имя свойства ‘Часы’, указанное для типа ‘Exact.Web.Api.Models.TimeTransaction’, недопустимо. » }}}, curl_error, curl_errno 0
обратите внимание, что / api / v1 / 638842 содержит ваш идентификатор подразделения. Вы можете изменить это в переменную.
Относительно вашей проблемы: обратите внимание, что сообщения об ошибках содержат текст, предназначенный для использования людьми. Фактические технические названия могут быть разными. Я всегда делаю это наоборот: я запрашиваю существующие данные и просматриваю все поля, а затем знаю, что отправлять. Вы можете использовать Query Tool для Exact Online в центре приложений Exact, чтобы выполнить запрос к REST API Exact Online (но я предвзят, потому что вовлечен).
Как правильно указал Гвидо, нет поля с именем Hours
в TimeTransaction
на проектов, есть поле с именем Hours
на производство TimeTransaction
, Это немного сбивает с толку, тем более что сообщение об ошибке не очень понятно.
Вам нужно установить Quantity
на TimeTransactions
чтобы указать часы на временной транзакции проекта.