This commit is contained in:
Dennis Eichhorn 2023-08-28 22:06:34 +00:00
parent c655c739b1
commit 733386df2d
17 changed files with 585 additions and 162 deletions

View File

@ -140,7 +140,7 @@
"type": 3,
"subtype": 1,
"name": "VehicleInspectionTypes",
"uri": "{/base}/fleet/vehicle/inspection/type/list?{?}",
"uri": "{/base}/fleet/inspection/type/list?{?}",
"target": "self",
"icon": null,
"order": 5,
@ -148,21 +148,6 @@
"permission": { "permission": 4, "category": null, "element": null },
"parent": 1003504001,
"children": []
},
{
"id": 1003504301,
"pid": "/fleet/inspection",
"type": 3,
"subtype": 1,
"name": "DriverInspectionTypes",
"uri": "{/base}/fleet/driver/inspection/type/list?{?}",
"target": "self",
"icon": null,
"order": 10,
"from": "FleetManagement",
"permission": { "permission": 4, "category": null, "element": null },
"parent": 1003504001,
"children": []
}
]
},

View File

@ -225,7 +225,7 @@
},
"fleetmgmt_vehicle_inspection_interval": {
"name": "fleetmgmt_vehicle_inspection_interval",
"type": "TINYINT(3)",
"type": "INT",
"null": false
},
"fleetmgmt_vehicle_inspection_next": {
@ -234,12 +234,25 @@
"null": true,
"default": null
},
"fleetmgmt_vehicle_inspection_date": {
"name": "fleetmgmt_vehicle_inspection_date",
"type": "DATETIME",
"null": true,
"default": null
},
"fleetmgmt_vehicle_inspection_type": {
"name": "fleetmgmt_vehicle_inspection_type",
"type": "INT",
"null": false,
"foreignTable": "fleetmgmt_inspection_type",
"foreignKey": "fleetmgmt_inspection_type_id"
},
"fleetmgmt_vehicle_inspection_vehicle": {
"name": "fleetmgmt_vehicle_inspection_vehicle",
"type": "INT",
"null": false,
"foreignTable": "fleetmgmt_vehicle",
"foreignKey": "fleetmgmt_vehicle_id"
}
}
},
@ -338,7 +351,7 @@
},
"fleetmgmt_driver_inspection_interval": {
"name": "fleetmgmt_driver_inspection_interval",
"type": "TINYINT(3)",
"type": "INT",
"null": false
},
"fleetmgmt_driver_inspection_next": {
@ -347,12 +360,25 @@
"null": true,
"default": null
},
"fleetmgmt_driver_inspection_date": {
"name": "fleetmgmt_driver_inspection_date",
"type": "DATETIME",
"null": true,
"default": null
},
"fleetmgmt_driver_inspection_type": {
"name": "fleetmgmt_driver_inspection_type",
"type": "INT",
"null": false,
"foreignTable": "fleetmgmt_driver_inspection_type",
"foreignKey": "fleetmgmt_driver_inspection_type_id"
},
"fleetmgmt_driver_inspection_driver": {
"name": "fleetmgmt_driver_inspection_driver",
"type": "INT",
"null": false,
"foreignTable": "fleetmgmt_driver",
"foreignKey": "fleetmgmt_driver_id"
}
}
},
@ -957,5 +983,64 @@
"foreignKey": "editor_doc_id"
}
}
},
"fleetmgmt_milage": {
"name": "fleetmgmt_milage",
"fields": {
"fleetmgmt_milage_id": {
"name": "fleetmgmt_milage_id",
"type": "INT",
"null": false,
"primary": true,
"autoincrement": true
},
"fleetmgmt_milage_status": {
"name": "fleetmgmt_milage_status",
"type": "TINYINT(1)",
"null": false
},
"fleetmgmt_milage_description": {
"name": "fleetmgmt_milage_description",
"type": "TEXT",
"null": false
},
"fleetmgmt_milage_start": {
"name": "fleetmgmt_milage_start",
"type": "DATETIME",
"null": true,
"default": null
},
"fleetmgmt_milage_end": {
"name": "fleetmgmt_milage_end",
"type": "DATETIME",
"null": true,
"default": null
},
"fleetmgmt_milage_milage": {
"name": "fleetmgmt_milage_milage",
"type": "INT",
"null": false
},
"fleetmgmt_milage_fuel": {
"name": "fleetmgmt_milage_fuel",
"type": "INT",
"null": false
},
"fleetmgmt_milage_driver": {
"name": "fleetmgmt_milage_driver",
"type": "INT",
"null": true,
"default": null,
"foreignTable": "fleetmgmt_driver",
"foreignKey": "fleetmgmt_driver_id"
},
"fleetmgmt_milage_vehicle": {
"name": "fleetmgmt_milage_vehicle",
"type": "INT",
"null": false,
"foreignTable": "fleetmgmt_vehicle",
"foreignKey": "fleetmgmt_vehicle_id"
}
}
}
}

View File

@ -134,7 +134,18 @@ return [
'^.*/fleet/inspection/list.*$' => [
[
'dest' => '\Modules\FleetManagement\Controller\BackendController:viewFleetManagementVehicleList',
'dest' => '\Modules\FleetManagement\Controller\BackendController:viewFleetManagementInspectionList',
'verb' => RouteVerb::GET,
'permission' => [
'module' => BackendController::NAME,
'type' => PermissionType::READ,
'state' => PermissionCategory::VEHICLE,
],
],
],
'^.*/fleet/inspection/type/list.*$' => [
[
'dest' => '\Modules\FleetManagement\Controller\BackendController:viewFleetManagementInspectionTypeList',
'verb' => RouteVerb::GET,
'permission' => [
'module' => BackendController::NAME,
@ -145,7 +156,7 @@ return [
],
'^.*/fleet/inspection/create.*$' => [
[
'dest' => '\Modules\FleetManagement\Controller\BackendController:viewFleetManagementVehicleCreate',
'dest' => '\Modules\FleetManagement\Controller\BackendController:viewFleetManagementInspectionCreate',
'verb' => RouteVerb::GET,
'permission' => [
'module' => BackendController::NAME,

View File

@ -18,8 +18,11 @@ use Modules\Admin\Models\NullAccount;
use Modules\FleetManagement\Models\Driver\DriverInspectionTypeL11nMapper;
use Modules\FleetManagement\Models\Driver\DriverInspectionTypeMapper;
use Modules\FleetManagement\Models\Driver\Driver;
use Modules\FleetManagement\Models\Driver\DriverInspectionMapper;
use Modules\FleetManagement\Models\Driver\DriverMapper;
use Modules\FleetManagement\Models\Driver\DriverStatus;
use Modules\FleetManagement\Models\Inspection;
use Modules\FleetManagement\Models\InspectionStatus;
use Modules\Media\Models\CollectionMapper;
use Modules\Media\Models\MediaMapper;
use Modules\Media\Models\NullMedia;
@ -29,6 +32,7 @@ use Modules\Media\Models\ReferenceMapper;
use phpOMS\Localization\BaseStringL11n;
use phpOMS\Localization\BaseStringL11nType;
use phpOMS\Localization\ISO639x1Enum;
use phpOMS\Localization\NullBaseStringL11nType;
use phpOMS\Message\Http\RequestStatusCode;
use phpOMS\Message\NotificationLevel;
use phpOMS\Message\RequestAbstract;
@ -44,6 +48,76 @@ use phpOMS\Message\ResponseAbstract;
*/
final class ApiDriverController extends Controller
{
/**
* Api method to create a vehicle
*
* @param RequestAbstract $request Request
* @param ResponseAbstract $response Response
* @param mixed $data Generic data
*
* @return void
*
* @api
*
* @since 1.0.0
*/
public function apiInspectionCreate(RequestAbstract $request, ResponseAbstract $response, mixed $data = null) : void
{
if (!empty($val = $this->validateInspectionCreate($request))) {
$response->header->status = RequestStatusCode::R_400;
$this->createInvalidCreateResponse($request, $response, $val);
return;
}
/** @var \Modules\FleetManagement\Models\DriverInspection $inspection */
$inspection = $this->createInspectionFromRequest($request);
$this->createModel($request->header->account, $inspection, DriverInspectionMapper::class, 'inspection', $request->getOrigin());
$this->createStandardCreateResponse($request, $response, $inspection);
}
/**
* Method to create vehicle from request.
*
* @param RequestAbstract $request Request
*
* @return Inspection Returns the created vehicle from the request
*
* @since 1.0.0
*/
public function createInspectionFromRequest(RequestAbstract $request) : Inspection
{
$inspection = new Inspection();
$inspection->reference = (int) $request->getData('ref');
$inspection->description = $request->getDataString('description') ?? '';
$inspection->status = (int) $request->getDataInt('status') ?? InspectionStatus::TODO;
$inspection->next = $request->getDataDateTime('next') ?? null;
$inspection->date = $request->getDataDateTime('date') ?? null;
$inspection->interval = $request->getDataInt('interval') ?? 0;
$inspection->type = new NullBaseStringL11nType((int) $request->getData('type'));
return $inspection;
}
/**
* Validate vehicle create request
*
* @param RequestAbstract $request Request
*
* @return array<string, bool> Returns the validation array of the request
*
* @since 1.0.0
*/
private function validateInspectionCreate(RequestAbstract $request) : array
{
$val = [];
if (($val['ref'] = !$request->hasData('ref'))) {
return $val;
}
return [];
}
/**
* Api method to create a driver
*
@ -92,7 +166,7 @@ final class ApiDriverController extends Controller
{
$driver = new Driver();
$driver->account = new NullAccount($request->getDataInt('account') ?? 1);
$driver->status = (int) ($request->getDataInt('status') ?? DriverStatus::INACTIVE);
$driver->status = $request->getDataInt('status') ?? DriverStatus::INACTIVE;
return $driver;
}
@ -267,7 +341,7 @@ final class ApiDriverController extends Controller
virtualPath: $path,
pathSettings: PathSettings::FILE_PATH,
hasAccountRelation: false,
readContent: (bool) ($request->getData('parse_content') ?? false)
readContent: $request->getDataBool('parse_content') ?? false
);
$collection = null;

View File

@ -15,10 +15,16 @@ declare(strict_types=1);
namespace Modules\FleetManagement\Controller;
use Modules\Admin\Models\NullAccount;
use Modules\FleetManagement\Models\Driver\NullDriver;
use Modules\FleetManagement\Models\InspectionStatus;
use Modules\FleetManagement\Models\FuelTypeL11nMapper;
use Modules\FleetManagement\Models\FuelTypeMapper;
use Modules\FleetManagement\Models\Inspection;
use Modules\FleetManagement\Models\InspectionMapper;
use Modules\FleetManagement\Models\InspectionTypeL11nMapper;
use Modules\FleetManagement\Models\InspectionTypeMapper;
use Modules\FleetManagement\Models\Milage;
use Modules\FleetManagement\Models\MilageMapper;
use Modules\FleetManagement\Models\Vehicle;
use Modules\FleetManagement\Models\VehicleMapper;
use Modules\FleetManagement\Models\VehicleStatus;
@ -49,6 +55,149 @@ use phpOMS\Message\ResponseAbstract;
*/
final class ApiVehicleController extends Controller
{
/**
* Api method to create a vehicle
*
* @param RequestAbstract $request Request
* @param ResponseAbstract $response Response
* @param mixed $data Generic data
*
* @return void
*
* @api
*
* @since 1.0.0
*/
public function apiMilageCreate(RequestAbstract $request, ResponseAbstract $response, mixed $data = null) : void
{
if (!empty($val = $this->validateMilageCreate($request))) {
$response->header->status = RequestStatusCode::R_400;
$this->createInvalidCreateResponse($request, $response, $val);
return;
}
/** @var \Modules\FleetManagement\Models\Milage $milage */
$milage = $this->createMilageFromRequest($request);
$this->createModel($request->header->account, $milage, MilageMapper::class, 'milage', $request->getOrigin());
$this->createStandardCreateResponse($request, $response, $milage);
}
/**
* Method to create vehicle from request.
*
* @param RequestAbstract $request Request
*
* @return Milage Returns the created vehicle from the request
*
* @since 1.0.0
*/
public function createMilageFromRequest(RequestAbstract $request) : Milage
{
$milage = new Milage();
$milage->vehicle = (int) $request->getData('vehicle');
$milage->driver = $request->hasData('driver') ? new NullDriver((int) $request->getData('driver')) : null;
$milage->milage = $request->getDataInt('milage') ?? 0;
$milage->status = $request->getDataInt('status') ?? 0;
$milage->fuelUsage = $request->getDataInt('fuel') ?? 0;
$milage->description = $request->getDataString('description') ?? '';
$milage->from = $request->getDataString('from') ?? '';
$milage->to = $request->getDataString('to') ?? '';
$milage->start = $request->getDataDateTime('start');
$milage->end = $request->getDataDateTime('end');
return $milage;
}
/**
* Validate vehicle create request
*
* @param RequestAbstract $request Request
*
* @return array<string, bool> Returns the validation array of the request
*
* @since 1.0.0
*/
private function validateMilageCreate(RequestAbstract $request) : array
{
$val = [];
if (($val['vehicle'] = !$request->hasData('vehicle'))) {
return $val;
}
return [];
}
/**
* Api method to create a vehicle
*
* @param RequestAbstract $request Request
* @param ResponseAbstract $response Response
* @param mixed $data Generic data
*
* @return void
*
* @api
*
* @since 1.0.0
*/
public function apiInspectionCreate(RequestAbstract $request, ResponseAbstract $response, mixed $data = null) : void
{
if (!empty($val = $this->validateInspectionCreate($request))) {
$response->header->status = RequestStatusCode::R_400;
$this->createInvalidCreateResponse($request, $response, $val);
return;
}
/** @var \Modules\FleetManagement\Models\Inspection $inspection */
$inspection = $this->createInspectionFromRequest($request);
$this->createModel($request->header->account, $inspection, InspectionMapper::class, 'inspection', $request->getOrigin());
$this->createStandardCreateResponse($request, $response, $inspection);
}
/**
* Method to create vehicle from request.
*
* @param RequestAbstract $request Request
*
* @return Inspection Returns the created vehicle from the request
*
* @since 1.0.0
*/
public function createInspectionFromRequest(RequestAbstract $request) : Inspection
{
$inspection = new Inspection();
$inspection->reference = (int) $request->getData('ref');
$inspection->description = $request->getDataString('description') ?? '';
$inspection->status = (int) $request->getDataInt('status') ?? InspectionStatus::TODO;
$inspection->next = $request->getDataDateTime('next') ?? null;
$inspection->date = $request->getDataDateTime('date') ?? null;
$inspection->interval = $request->getDataInt('interval') ?? 0;
$inspection->type = new NullBaseStringL11nType((int) $request->getData('type'));
return $inspection;
}
/**
* Validate vehicle create request
*
* @param RequestAbstract $request Request
*
* @return array<string, bool> Returns the validation array of the request
*
* @since 1.0.0
*/
private function validateInspectionCreate(RequestAbstract $request) : array
{
$val = [];
if (($val['ref'] = !$request->hasData('ref'))) {
return $val;
}
return [];
}
/**
* Api method to create a vehicle
*
@ -372,7 +521,7 @@ final class ApiVehicleController extends Controller
$vehicle->info = $request->getDataString('info') ?? '';
$vehicle->type = new NullBaseStringL11nType((int) ($request->getDataInt('type') ?? 0));
$vehicle->fuelType = new NullBaseStringL11nType((int) ($request->getDataInt('fuel') ?? 0));
$vehicle->status = (int) ($request->getDataInt('status') ?? VehicleStatus::INACTIVE);
$vehicle->status = $request->getDataInt('status') ?? VehicleStatus::INACTIVE;
$vehicle->unit = $request->getDataInt('unit') ?? $this->app->unitId;
return $vehicle;
@ -549,7 +698,7 @@ final class ApiVehicleController extends Controller
virtualPath: $path,
pathSettings: PathSettings::FILE_PATH,
hasAccountRelation: false,
readContent: (bool) ($request->getData('parse_content') ?? false)
readContent: $request->getDataBool('parse_content') ?? false
);
$collection = null;
@ -853,7 +1002,7 @@ final class ApiVehicleController extends Controller
}
/**
* Api method to update note
* Api method to update Note
*
* @param RequestAbstract $request Request
* @param ResponseAbstract $response Response
@ -865,17 +1014,28 @@ final class ApiVehicleController extends Controller
*
* @since 1.0.0
*/
public function apiNoteEdit(RequestAbstract $request, ResponseAbstract $response, mixed $data = null) : void
public function apiNoteUpdate(RequestAbstract $request, ResponseAbstract $response, mixed $data = null) : void
{
$this->app->moduleManager->get('Editor', 'Api')->apiEditorUpdate($request, $response, $data);
// @todo: check permissions
$this->app->moduleManager->get('Editor', 'Api')->apiEditorDocUpdate($request, $response, $data);
}
if ($response->header->status !== RequestStatusCode::R_200) {
return;
}
$responseData = $response->get($request->uri->__toString());
if (!\is_array($responseData)) {
return;
}
/**
* Api method to delete Note
*
* @param RequestAbstract $request Request
* @param ResponseAbstract $response Response
* @param mixed $data Generic data
*
* @return void
*
* @api
*
* @since 1.0.0
*/
public function apiNoteDelete(RequestAbstract $request, ResponseAbstract $response, mixed $data = null) : void
{
// @todo: check permissions
$this->app->moduleManager->get('Editor', 'Api')->apiEditorDocDelete($request, $response, $data);
}
}

View File

@ -16,8 +16,10 @@ namespace Modules\FleetManagement\Controller;
use Modules\Admin\Models\LocalizationMapper;
use Modules\Admin\Models\SettingsEnum;
use Modules\FleetManagement\Models\VehicleAttributeTypeL11nMapper;
use Modules\FleetManagement\Models\VehicleAttributeTypeMapper;
use Modules\FleetManagement\Models\InspectionMapper;
use Modules\FleetManagement\Models\Attribute\VehicleAttributeTypeL11nMapper;
use Modules\FleetManagement\Models\Attribute\VehicleAttributeTypeMapper;
use Modules\FleetManagement\Models\Driver\DriverMapper;
use Modules\FleetManagement\Models\VehicleMapper;
use Modules\FleetManagement\Models\VehicleTypeMapper;
use Modules\Media\Models\MediaMapper;
@ -129,6 +131,34 @@ final class BackendController extends Controller
return $view;
}
/**
* Routing end-point for application behaviour.
*
* @param RequestAbstract $request Request
* @param ResponseAbstract $response Response
* @param mixed $data Generic data
*
* @return RenderableInterface Returns a renderable object
*
* @since 1.0.0
* @codeCoverageIgnore
*/
public function viewFleetManagementInspectionList(RequestAbstract $request, ResponseAbstract $response, mixed $data = null) : RenderableInterface
{
$view = new View($this->app->l11nManager, $request, $response);
$view->setTemplate('/Modules/FleetManagement/Theme/Backend/inspection-list');
$view->data['nav'] = $this->app->moduleManager->get('Navigation')->createNavigationMid(1003502001, $request, $response);
$list = InspectionMapper::getAll()
->sort('id', 'DESC')
->execute();
$view->data['inspectionss'] = $list;
return $view;
}
/**
* Routing end-point for application behaviour.
*
@ -236,6 +266,15 @@ final class BackendController extends Controller
$view->data['vehicle'] = $vehicle;
$inspections = InspectionMapper::getAll()
->with('type')
->with('type/l11n')
->where('reference', $vehicle->id)
->where('type/l11n/language', $response->header->l11n->language)
->execute();
$view->data['inspections'] = $inspections;
$query = new Builder($this->app->dbPool->get());
$results = $query->selectAs(VehicleMapper::HAS_MANY['files']['external'], 'file')
->from(VehicleMapper::TABLE)

View File

@ -1,78 +0,0 @@
<?php
/**
* Jingga
*
* PHP Version 8.1
*
* @package Modules\FleetManagement\Models\Driver
* @copyright Dennis Eichhorn
* @license OMS License 2.0
* @version 1.0.0
* @link https://jingga.app
*/
declare(strict_types=1);
namespace Modules\FleetManagement\Models\Driver;
use phpOMS\Localization\BaseStringL11nType;
/**
* Inspection class.
*
* @package Modules\FleetManagement\Models\Driver
* @license OMS License 2.0
* @link https://jingga.app
* @since 1.0.0
*/
class DriverInspection implements \JsonSerializable
{
public int $id = 0;
public string $description = '';
public BaseStringL11nType $type;
public int $status = DriverInspectionStatus::TODO;
// Automatically get's filled from the previous inspection if available
// Alternatively define default interval from inspection type?
public ?\DateTime $next = null;
/**
* Inspectio interval in months
*
* @var int
* @since 1.0.0
*/
public int $interval = 0;
/**
* Constructor.
*
* @since 1.0.0
*/
public function __construct()
{
$this->type = new BaseStringL11nType();
}
/**
* {@inheritdoc}
*/
public function toArray() : array
{
return [
'id' => $this->id,
];
}
/**
* {@inheritdoc}
*/
public function jsonSerialize() : mixed
{
return $this->toArray();
}
use \Modules\Media\Models\MediaListTrait;
}

View File

@ -14,8 +14,8 @@ declare(strict_types=1);
namespace Modules\FleetManagement\Models\Driver;
use Modules\FleetManagement\Models\Inspection;
use phpOMS\DataStorage\Database\Mapper\DataMapperFactory;
use phpOMS\Localization\BaseStringL11n;
/**
* mapper class.
@ -25,7 +25,7 @@ use phpOMS\Localization\BaseStringL11n;
* @link https://jingga.app
* @since 1.0.0
*
* @template T of DriverInspection
* @template T of Inspection
* @extends DataMapperFactory<T>
*/
final class DriverInspectionMapper extends DataMapperFactory
@ -38,10 +38,12 @@ final class DriverInspectionMapper extends DataMapperFactory
*/
public const COLUMNS = [
'fleetmgmt_driver_inspection_id' => ['name' => 'fleetmgmt_driver_inspection_id', 'type' => 'int', 'internal' => 'id'],
'fleetmgmt_driver_inspection_driver' => ['name' => 'fleetmgmt_driver_inspection_driver', 'type' => 'int', 'internal' => 'reference'],
'fleetmgmt_driver_inspection_description' => ['name' => 'fleetmgmt_driver_inspection_description', 'type' => 'string', 'internal' => 'description'],
'fleetmgmt_driver_inspection_status' => ['name' => 'fleetmgmt_driver_inspection_status', 'type' => 'int', 'internal' => 'status'],
'fleetmgmt_driver_inspection_interval' => ['name' => 'fleetmgmt_driver_inspection_interval', 'type' => 'int', 'internal' => 'interval'],
'fleetmgmt_driver_inspection_next' => ['name' => 'fleetmgmt_driver_inspection_next', 'type' => 'DateTime', 'internal' => 'next'],
'fleetmgmt_driver_inspection_date' => ['name' => 'fleetmgmt_driver_inspection_date', 'type' => 'DateTime', 'internal' => 'date'],
'fleetmgmt_driver_inspection_type' => ['name' => 'fleetmgmt_driver_inspection_type', 'type' => 'int', 'internal' => 'type'],
];
@ -80,5 +82,5 @@ final class DriverInspectionMapper extends DataMapperFactory
* @var class-string<T>
* @since 1.0.0
*/
public const MODEL = DriverInspection::class;
public const MODEL = Inspection::class;
}

View File

@ -1,36 +0,0 @@
<?php
/**
* Jingga
*
* PHP Version 8.1
*
* @package Modules\FleetManagement\Models\Driver
* @copyright Dennis Eichhorn
* @license OMS License 2.0
* @version 1.0.0
* @link https://jingga.app
*/
declare(strict_types=1);
namespace Modules\FleetManagement\Models\Driver;
use phpOMS\Stdlib\Base\Enum;
/**
* Inspection status enum.
*
* @package Modules\FleetManagement\Models\Driver
* @license OMS License 2.0
* @link https://jingga.app
* @since 1.0.0
*/
abstract class DriverInspectionStatus extends Enum
{
public const DONE = 1;
public const PASSED = 2;
public const ONGOING = 4;
public const TODO = 5;
}

View File

@ -18,6 +18,7 @@ use Modules\Admin\Models\AccountMapper;
use Modules\Media\Models\MediaMapper;
use phpOMS\DataStorage\Database\Mapper\DataMapperFactory;
use Modules\Editor\Models\EditorDocMapper;
use Modules\FleetManagement\Models\Attribute\DriverAttributeMapper;
/**
* Mapper class.

View File

@ -14,6 +14,7 @@ declare(strict_types=1);
namespace Modules\FleetManagement\Models;
use Modules\Admin\Models\Account;
use phpOMS\Localization\BaseStringL11nType;
/**
@ -38,14 +39,25 @@ class Inspection implements \JsonSerializable
// Alternatively define default interval from inspection type?
public ?\DateTime $next = null;
public ?\DateTime $date = null;
/**
* Inspectio interval in months
* Inspection duration in hours
*/
public int $duration = 0;
/**
* Inspection interval in months
*
* @var int
* @since 1.0.0
*/
public int $interval = 0;
public int $reference = 0;
public ?Account $responsible = null;
/**
* Constructor
*

View File

@ -25,7 +25,7 @@ use phpOMS\Localization\BaseStringL11n;
* @link https://jingga.app
* @since 1.0.0
*
* @template T of BaseStringL11n
* @template T of Inspection
* @extends DataMapperFactory<T>
*/
final class InspectionMapper extends DataMapperFactory
@ -38,10 +38,12 @@ final class InspectionMapper extends DataMapperFactory
*/
public const COLUMNS = [
'fleetmgmt_vehicle_inspection_id' => ['name' => 'fleetmgmt_vehicle_inspection_id', 'type' => 'int', 'internal' => 'id'],
'fleetmgmt_vehicle_inspection_vehicle' => ['name' => 'fleetmgmt_vehicle_inspection_vehicle', 'type' => 'int', 'internal' => 'reference'],
'fleetmgmt_vehicle_inspection_description' => ['name' => 'fleetmgmt_vehicle_inspection_description', 'type' => 'string', 'internal' => 'description'],
'fleetmgmt_vehicle_inspection_status' => ['name' => 'fleetmgmt_vehicle_inspection_status', 'type' => 'int', 'internal' => 'status'],
'fleetmgmt_vehicle_inspection_interval' => ['name' => 'fleetmgmt_vehicle_inspection_interval', 'type' => 'int', 'internal' => 'interval'],
'fleetmgmt_vehicle_inspection_next' => ['name' => 'fleetmgmt_vehicle_inspection_next', 'type' => 'DateTime', 'internal' => 'next'],
'fleetmgmt_vehicle_inspection_date' => ['name' => 'fleetmgmt_vehicle_inspection_date', 'type' => 'DateTime', 'internal' => 'date'],
'fleetmgmt_vehicle_inspection_type' => ['name' => 'fleetmgmt_vehicle_inspection_type', 'type' => 'int', 'internal' => 'type'],
];

75
Models/Milage.php Normal file
View File

@ -0,0 +1,75 @@
<?php
/**
* Jingga
*
* PHP Version 8.1
*
* @package Modules\FleetManagement\Models
* @copyright Dennis Eichhorn
* @license OMS License 2.0
* @version 1.0.0
* @link https://jingga.app
*/
declare(strict_types=1);
namespace Modules\FleetManagement\Models;
use Modules\FleetManagement\Models\Driver\Driver;
/**
* Milage class.
*
* @package Modules\Attribute\Models
* @license OMS License 2.0
* @link https://jingga.app
* @since 1.0.0
*/
class Milage implements \JsonSerializable
{
public int $id = 0;
public int $vehicle = 0;
public ?Driver $driver = null;
public ?\DateTime $start = null;
public ?\DateTime $end = null;
public string $from = '';
public string $to = '';
/**
* Milage in km
*
* @var int
*/
public int $milage = 0;
/**
* Fuel usage in l
*
* @var int
*/
public int $fuelUsage = 0;
public string $description = '';
public int $status = 0;
/**
* {@inheritdoc}
*/
public function toArray() : array
{
return [
'id' => $this->id,
];
}
/**
* {@inheritdoc}
*/
public function jsonSerialize() : mixed
{
return $this->toArray();
}
}

91
Models/MilageMapper.php Normal file
View File

@ -0,0 +1,91 @@
<?php
/**
* Jingga
*
* PHP Version 8.1
*
* @package Modules\FleetManagement\Models
* @copyright Dennis Eichhorn
* @license OMS License 2.0
* @version 1.0.0
* @link https://jingga.app
*/
declare(strict_types=1);
namespace Modules\FleetManagement\Models;
use Modules\FleetManagement\Models\Driver\DriverMapper;
use phpOMS\DataStorage\Database\Mapper\DataMapperFactory;
/**
* mapper class.
*
* @package Modules\FleetManagement\Models
* @license OMS License 2.0
* @link https://jingga.app
* @since 1.0.0
*
* @template T of Milage
* @extends DataMapperFactory<T>
*/
final class MilageMapper extends DataMapperFactory
{
/**
* Columns.
*
* @var array<string, array{name:string, type:string, internal:string, autocomplete?:bool, readonly?:bool, writeonly?:bool, annotations?:array}>
* @since 1.0.0
*/
public const COLUMNS = [
'fleetmgmt_milage_id' => ['name' => 'fleetmgmt_milage_id', 'type' => 'int', 'internal' => 'id'],
'fleetmgmt_milage_description' => ['name' => 'fleetmgmt_milage_description', 'type' => 'string', 'internal' => 'description'],
'fleetmgmt_milage_status' => ['name' => 'fleetmgmt_milage_status', 'type' => 'int', 'internal' => 'status'],
'fleetmgmt_milage_driver' => ['name' => 'fleetmgmt_milage_driver', 'type' => 'int', 'internal' => 'driver'],
'fleetmgmt_milage_vehicle' => ['name' => 'fleetmgmt_milage_vehicle', 'type' => 'int', 'internal' => 'vehicle'],
'fleetmgmt_milage_start' => ['name' => 'fleetmgmt_milage_start', 'type' => 'DateTime', 'internal' => 'start'],
'fleetmgmt_milage_end' => ['name' => 'fleetmgmt_milage_end', 'type' => 'DateTime', 'internal' => 'end'],
'fleetmgmt_milage_milage' => ['name' => 'fleetmgmt_milage_milage', 'type' => 'int', 'internal' => 'milage'],
'fleetmgmt_milage_fuel' => ['name' => 'fleetmgmt_milage_fuel', 'type' => 'int', 'internal' => 'fuelUsage'],
];
/**
* Has one relation.
*
* @var array<string, array{mapper:class-string, external:string, by?:string, column?:string, conditional?:bool}>
* @since 1.0.0
*/
public const OWNS_ONE = [
'driver' => [
'mapper' => DriverMapper::class,
'external' => 'fleetmgmt_milage_driver',
],
'vehicle' => [
'mapper' => VehicleMapper::class,
'external' => 'fleetmgmt_milage_vehicle',
],
];
/**
* Primary table.
*
* @var string
* @since 1.0.0
*/
public const TABLE = 'fleetmgmt_milage';
/**
* Primary field name.
*
* @var string
* @since 1.0.0
*/
public const PRIMARYFIELD = 'fleetmgmt_milage_id';
/**
* Model to use by the mapper.
*
* @var class-string<T>
* @since 1.0.0
*/
public const MODEL = Milage::class;
}

View File

@ -22,7 +22,7 @@ echo $this->data['nav']->render(); ?>
<div class="row">
<div class="col-xs-12">
<section class="portlet">
<div class="portlet-head"><?= $this->getHtml('Vehicles'); ?><i class="lni lni-download download btn end-xs"></i></div>
<div class="portlet-head"><?= $this->getHtml('Drivers'); ?><i class="lni lni-download download btn end-xs"></i></div>
<div class="slider">
<table id="iSalesClientList" class="default sticky">
<thead>

View File

@ -179,10 +179,12 @@ echo $this->data['nav']->render();
<td class="wf-100"><?= $this->getHtml('Type'); ?>
<td><?= $this->getHtml('Responsible'); ?>
<tbody>
<?php foreach ($this->data['inspections'] as $inspection) : ?>
<tr>
<td><?= $inspection->next?->format('Y-m-d H:i') ?>
<td><?= $this->printHtml($inspection->type->getL11n()); ?>
<td>
<td>
<td>
<?php endforeach; ?>
</table>
</section>
</div>

View File

@ -71,14 +71,12 @@ final class Autoloader
*
* @return void
*
* @throws AutoloadException Throws this exception if the class to autoload doesn't exist. This could also be related to a wrong namespace/file path correlation.
*
* @since 1.0.0
*/
public static function defaultAutoloader(string $class) : void
{
$class = \ltrim($class, '\\');
$class = \str_replace(['_', '\\'], '/', $class);
$class = \strtr($class, '_\\', '//');
foreach (self::$paths as $path) {
$file = $path . $class . '.php';