Add kilometer-based Fahrtkosten billing, self-service distance entry, role deletion
Docker-Images bauen und veröffentlichen / build (, omsorgCore/Dockerfile, omsorgcore) (push) Successful in 16s
Docker-Images bauen und veröffentlichen / build (, omsorgWeb/Dockerfile, omsorgweb) (push) Successful in 5s
Docker-Images bauen und veröffentlichen / build (, omsorgapp/Dockerfile, omsorgapp) (push) Successful in 19s
Docker-Images bauen und veröffentlichen / build (, omsorgCore/Dockerfile, omsorgcore) (push) Successful in 16s
Docker-Images bauen und veröffentlichen / build (, omsorgWeb/Dockerfile, omsorgweb) (push) Successful in 5s
Docker-Images bauen und veröffentlichen / build (, omsorgapp/Dockerfile, omsorgapp) (push) Successful in 19s
- Facility: TravelCostMode (Pauschale/ProKilometer) + TravelCostPerKm, alongside the existing flat rate; fixes FacilityService.UpdateAsync silently dropping all Konditionen fields on update. - New EmployeeFacilityDistance (Mitarbeiter x Einrichtung -> km) with full office-side CRUD in omsorgapp, plus a self-service endpoint/UI so field staff can maintain their own commute distance via OMSORG Connect (new ModuleType.EmployeeFacilityDistances, Own-scope, no Facilities access needed). - Roles can now be deleted (blocked with a 409 while still assigned to a user). - Fix employeesApi.js missing the Date-object conversion for dateOfBirth/entryDate/ exitDate that crashed employee creation whenever a date was filled in; add a clear/remove control for those date fields. - Requirements: flesh out FR-REC-3 with a staged Akquise cadence, add FR-REC-5/6 for CRM feature scope and success metrics. - Regenerate api-client-ts and api-client-php for all of the above. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Sonnet 5
parent
09dce2ab98
commit
ffa2c4a9e7
@@ -0,0 +1,26 @@
|
||||
import { EmployeeFacilityDistancesApi } from "omsorgcore-client-ts";
|
||||
import { configFor, callApi } from "./apiClientHelpers.js";
|
||||
|
||||
// Kapselt /api/facilities/{facilityId}/employee-distances von omsorgCore
|
||||
// (EmployeeFacilityDistancesController) über den generierten Client (omsorgcore-client-ts).
|
||||
// Mitarbeiter-Einrichtung-Entfernungen sind eine 1:n-Unterressource von Facility (FR-EIN-4,
|
||||
// Grundlage für die kilometerbasierte Fahrtkostenabrechnung).
|
||||
export async function listEmployeeFacilityDistances(accessToken, facilityId) {
|
||||
const api = new EmployeeFacilityDistancesApi(configFor(accessToken));
|
||||
return callApi(api.apiFacilitiesFacilityIdEmployeeDistancesGetRaw({ facilityId }));
|
||||
}
|
||||
|
||||
export async function createEmployeeFacilityDistance(accessToken, facilityId, payload) {
|
||||
const api = new EmployeeFacilityDistancesApi(configFor(accessToken));
|
||||
return callApi(api.apiFacilitiesFacilityIdEmployeeDistancesPostRaw({ facilityId, createEmployeeFacilityDistanceRequest: payload }));
|
||||
}
|
||||
|
||||
export async function updateEmployeeFacilityDistance(accessToken, facilityId, id, payload) {
|
||||
const api = new EmployeeFacilityDistancesApi(configFor(accessToken));
|
||||
return callApi(api.apiFacilitiesFacilityIdEmployeeDistancesIdPutRaw({ facilityId, id, updateEmployeeFacilityDistanceRequest: payload }));
|
||||
}
|
||||
|
||||
export async function deleteEmployeeFacilityDistance(accessToken, facilityId, id) {
|
||||
const api = new EmployeeFacilityDistancesApi(configFor(accessToken));
|
||||
return callApi(api.apiFacilitiesFacilityIdEmployeeDistancesIdDeleteRaw({ facilityId, id }));
|
||||
}
|
||||
@@ -4,6 +4,19 @@ import { configFor, callApi } from "./apiClientHelpers.js";
|
||||
// Kapselt /api/employees von omsorgCore (EmployeesController) über den generierten
|
||||
// Client (omsorgcore-client-ts). Feldnamen sind camelCase, da ASP.NET Core
|
||||
// standardmäßig camelCase-JSON ausgibt.
|
||||
|
||||
// dateOfBirth/entryDate/exitDate müssen als Date-Objekte übergeben werden - die generierten
|
||||
// ...ToJSON-Funktionen rufen .toISOString() darauf auf, ein reiner "YYYY-MM-DD"-String aus einem
|
||||
// <input type="date"> würde dabei crashen (siehe ordersApi.js für dasselbe Muster).
|
||||
function toDatePayload(payload) {
|
||||
return {
|
||||
...payload,
|
||||
dateOfBirth: payload.dateOfBirth ? new Date(payload.dateOfBirth) : payload.dateOfBirth,
|
||||
entryDate: payload.entryDate ? new Date(payload.entryDate) : payload.entryDate,
|
||||
exitDate: payload.exitDate ? new Date(payload.exitDate) : payload.exitDate
|
||||
};
|
||||
}
|
||||
|
||||
export async function listEmployees(accessToken, { search, status, employmentType, page = 1, pageSize = 20 } = {}) {
|
||||
const api = new EmployeesApi(configFor(accessToken));
|
||||
return callApi(api.apiEmployeesGetRaw({ search, status, employmentType, page, pageSize }));
|
||||
@@ -11,7 +24,7 @@ export async function listEmployees(accessToken, { search, status, employmentTyp
|
||||
|
||||
export async function createEmployee(accessToken, payload) {
|
||||
const api = new EmployeesApi(configFor(accessToken));
|
||||
return callApi(api.apiEmployeesPostRaw({ createEmployeeRequest: payload }));
|
||||
return callApi(api.apiEmployeesPostRaw({ createEmployeeRequest: toDatePayload(payload) }));
|
||||
}
|
||||
|
||||
export async function getEmployee(accessToken, id) {
|
||||
@@ -21,7 +34,7 @@ export async function getEmployee(accessToken, id) {
|
||||
|
||||
export async function updateEmployee(accessToken, id, payload) {
|
||||
const api = new EmployeesApi(configFor(accessToken));
|
||||
return callApi(api.apiEmployeesIdPutRaw({ id, updateEmployeeRequest: payload }));
|
||||
return callApi(api.apiEmployeesIdPutRaw({ id, updateEmployeeRequest: toDatePayload(payload) }));
|
||||
}
|
||||
|
||||
export async function deleteEmployee(accessToken, id) {
|
||||
|
||||
@@ -5,6 +5,7 @@ import * as employeesApi from "./employeesApi.js";
|
||||
import * as facilitiesApi from "./facilitiesApi.js";
|
||||
import * as facilityContactsApi from "./facilityContactsApi.js";
|
||||
import * as facilityQualificationRatesApi from "./facilityQualificationRatesApi.js";
|
||||
import * as employeeFacilityDistancesApi from "./employeeFacilityDistancesApi.js";
|
||||
import * as ordersApi from "./ordersApi.js";
|
||||
import * as absencesApi from "./absencesApi.js";
|
||||
import * as timeEntriesApi from "./timeEntriesApi.js";
|
||||
@@ -127,6 +128,12 @@ export function buildOmsorgApi() {
|
||||
update: withAuth(facilityQualificationRatesApi.updateFacilityQualificationRate),
|
||||
delete: withAuth(facilityQualificationRatesApi.deleteFacilityQualificationRate)
|
||||
},
|
||||
employeeFacilityDistances: {
|
||||
list: withAuth(employeeFacilityDistancesApi.listEmployeeFacilityDistances),
|
||||
create: withAuth(employeeFacilityDistancesApi.createEmployeeFacilityDistance),
|
||||
update: withAuth(employeeFacilityDistancesApi.updateEmployeeFacilityDistance),
|
||||
delete: withAuth(employeeFacilityDistancesApi.deleteEmployeeFacilityDistance)
|
||||
},
|
||||
orders: {
|
||||
list: withAuth(ordersApi.listOrders),
|
||||
create: withAuth(ordersApi.createOrder),
|
||||
@@ -162,7 +169,8 @@ export function buildOmsorgApi() {
|
||||
list: withAuth(rolesApi.listRoles),
|
||||
get: withAuth(rolesApi.getRole),
|
||||
create: withAuth(rolesApi.createRole),
|
||||
updatePermissions: withAuth(rolesApi.updateRolePermissions)
|
||||
updatePermissions: withAuth(rolesApi.updateRolePermissions),
|
||||
delete: withAuth(rolesApi.deleteRole)
|
||||
},
|
||||
auditLog: {
|
||||
list: withAuth(auditLogApi.listAuditLog)
|
||||
@@ -190,6 +198,8 @@ export function buildOmsorgApi() {
|
||||
restoreFacilityContact: withAuth(trashApi.restoreFacilityContact),
|
||||
listFacilityQualificationRates: withAuth(trashApi.listDeletedFacilityQualificationRates),
|
||||
restoreFacilityQualificationRate: withAuth(trashApi.restoreFacilityQualificationRate),
|
||||
listEmployeeFacilityDistances: withAuth(trashApi.listDeletedEmployeeFacilityDistances),
|
||||
restoreEmployeeFacilityDistance: withAuth(trashApi.restoreEmployeeFacilityDistance),
|
||||
listAbsences: withAuth(trashApi.listDeletedAbsences),
|
||||
restoreAbsence: withAuth(trashApi.restoreAbsence),
|
||||
listTimeEntries: withAuth(trashApi.listDeletedTimeEntries),
|
||||
|
||||
@@ -22,3 +22,8 @@ export async function updateRolePermissions(accessToken, roleId, payload) {
|
||||
const api = new RolesApi(configFor(accessToken));
|
||||
return callApi(api.apiRolesIdPermissionsPutRaw({ id: roleId, updateRolePermissionsRequest: payload }));
|
||||
}
|
||||
|
||||
export async function deleteRole(accessToken, roleId) {
|
||||
const api = new RolesApi(configFor(accessToken));
|
||||
return callApi(api.apiRolesIdDeleteRaw({ id: roleId }));
|
||||
}
|
||||
|
||||
@@ -64,6 +64,16 @@ export async function restoreFacilityQualificationRate(accessToken, id) {
|
||||
return callApi(api.apiTrashFacilityQualificationRatesIdRestorePostRaw({ id }));
|
||||
}
|
||||
|
||||
export async function listDeletedEmployeeFacilityDistances(accessToken, search) {
|
||||
const api = new TrashApi(configFor(accessToken));
|
||||
return callApi(api.apiTrashEmployeeFacilityDistancesGetRaw({ search }));
|
||||
}
|
||||
|
||||
export async function restoreEmployeeFacilityDistance(accessToken, id) {
|
||||
const api = new TrashApi(configFor(accessToken));
|
||||
return callApi(api.apiTrashEmployeeFacilityDistancesIdRestorePostRaw({ id }));
|
||||
}
|
||||
|
||||
export async function listDeletedAbsences(accessToken, search) {
|
||||
const api = new TrashApi(configFor(accessToken));
|
||||
return callApi(api.apiTrashAbsencesGetRaw({ search }));
|
||||
|
||||
Reference in New Issue
Block a user