diff --git a/Admin/Install/Media.install.json b/Admin/Install/Media.install.json index 58397fa..c012cd3 100755 --- a/Admin/Install/Media.install.json +++ b/Admin/Install/Media.install.json @@ -1,4 +1,18 @@ [ + { + "type": "type", + "name": "vehicle_profile_image", + "l11n": [ + { + "title": "Profile image", + "lang": "en" + }, + { + "title": "Profilbild", + "lang": "de" + } + ] + }, { "type": "collection", "create_directory": true, diff --git a/Admin/Install/Navigation.install.json b/Admin/Install/Navigation.install.json index b41258b..a82b041 100755 --- a/Admin/Install/Navigation.install.json +++ b/Admin/Install/Navigation.install.json @@ -75,7 +75,7 @@ "children": [ { "id": 1003503101, - "pid": "/sales", + "pid": "/fleet/vehicle/attribute", "type": 3, "subtype": 1, "name": "Types", @@ -90,7 +90,7 @@ }, { "id": 1003503201, - "pid": "/sales", + "pid": "/fleet/vehicle/attribute", "type": 3, "subtype": 1, "name": "Values", diff --git a/Admin/Install/vehicletype.json b/Admin/Install/vehicletype.json index f5485e0..e68fed8 100644 --- a/Admin/Install/vehicletype.json +++ b/Admin/Install/vehicletype.json @@ -76,13 +76,6 @@ "de": "Moped" } }, - { - "name": "RV", - "l11n": { - "en": "Recreational Vehicle", - "de": "Wohnmobil" - } - }, { "name": "tractor", "l11n": { @@ -96,40 +89,5 @@ "en": "Forklift", "de": "Gabelstapler" } - }, - { - "name": "skateboard", - "l11n": { - "en": "Skateboard", - "de": "Skateboard" - } - }, - { - "name": "snowmobile", - "l11n": { - "en": "Snowmobile", - "de": "Schneemobil" - } - }, - { - "name": "jet_ski", - "l11n": { - "en": "Jet Ski", - "de": "Jet Ski" - } - }, - { - "name": "quad_bike", - "l11n": { - "en": "Quad Bike", - "de": "Quad Bike" - } - }, - { - "name": "golf_cart", - "l11n": { - "en": "Golf Cart", - "de": "Golf Cart" - } } ] diff --git a/Controller/ApiController.php b/Controller/ApiController.php index 9cebf70..e75dab1 100755 --- a/Controller/ApiController.php +++ b/Controller/ApiController.php @@ -536,7 +536,9 @@ final class ApiController extends Controller private function validateVehicleCreate(RequestAbstract $request) : array { $val = []; - if (($val['name'] = !$request->hasData('name'))) { + if (($val['name'] = !$request->hasData('name')) + || ($val['type'] = !$request->hasData('type')) + ) { return $val; } @@ -1080,7 +1082,7 @@ final class ApiController extends Controller $vehicle->id, $media->id, VehicleMapper::class, - 'media', + 'files', '', $request->getOrigin() ); @@ -1128,14 +1130,14 @@ final class ApiController extends Controller $vehicle->id, (int) $media, VehicleMapper::class, - 'media', + 'files', '', $request->getOrigin() ); } } - $this->fillJsonResponse($request, $response, NotificationLevel::OK, 'Media', 'Media added to bill.', [ + $this->fillJsonResponse($request, $response, NotificationLevel::OK, 'Media', 'Media added to vehicle.', [ 'upload' => $uploaded, 'media' => $mediaFiles, ]); @@ -1154,7 +1156,6 @@ final class ApiController extends Controller { return '/Modules/FleetManagement/Vehicle/' . $this->app->unitId . '/' - . $vehicle->createdAt->format('Y/m/d') . '/' . $vehicle->id; } diff --git a/Controller/BackendController.php b/Controller/BackendController.php index 3405264..33b2c0e 100755 --- a/Controller/BackendController.php +++ b/Controller/BackendController.php @@ -14,7 +14,14 @@ declare(strict_types=1); namespace Modules\FleetManagement\Controller; +use Modules\FleetManagement\Models\VehicleAttributeTypeL11nMapper; +use Modules\FleetManagement\Models\VehicleAttributeTypeMapper; +use Modules\FleetManagement\Models\VehicleMapper; +use Modules\FleetManagement\Models\VehicleTypeMapper; +use Modules\Media\Models\MediaMapper; +use Modules\Media\Models\MediaTypeMapper; use phpOMS\Contract\RenderableInterface; +use phpOMS\DataStorage\Database\Query\Builder; use phpOMS\Message\RequestAbstract; use phpOMS\Message\ResponseAbstract; use phpOMS\Views\View; @@ -30,6 +37,35 @@ use phpOMS\Views\View; */ final class BackendController extends Controller { + /** + * 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 viewFleetManagementAttributeTypeList(RequestAbstract $request, ResponseAbstract $response, mixed $data = null) : RenderableInterface + { + $view = new View($this->app->l11nManager, $request, $response); + $view->setTemplate('/Modules/FleetManagement/Theme/Backend/attribute-type-list'); + $view->addData('nav', $this->app->moduleManager->get('Navigation')->createNavigationMid(1003503001, $request, $response)); + + /** @var \Modules\Attribute\Models\AttributeType[] $attributes */ + $attributes = VehicleAttributeTypeMapper::getAll() + ->with('l11n') + ->where('l11n/language', $response->getLanguage()) + ->execute(); + + $view->addData('attributes', $attributes); + + return $view; + } + /** * Routing end-point for application behaviour. * @@ -49,6 +85,50 @@ final class BackendController extends Controller $view->setTemplate('/Modules/FleetManagement/Theme/Backend/vehicle-list'); $view->addData('nav', $this->app->moduleManager->get('Navigation')->createNavigationMid(1003502001, $request, $response)); + $list = VehicleMapper::getAll() + ->with('type') + ->with('type/l11n') + ->where('type/l11n/language', $response->getLanguage()) + ->sort('id', 'DESC') + ->execute(); + + $view->setData('vehicles', $list); + + return $view; + } + + /** + * Routing end-point for application behaviour. + * + * @param RequestAbstract $request Request + * @param ResponseAbstract $response Response + * @param mixed $data Generic data + * + * @return RenderableInterface + * + * @since 1.0.0 + * @codeCoverageIgnore + */ + public function viewFleetManagementAttributeType(RequestAbstract $request, ResponseAbstract $response, mixed $data = null) : RenderableInterface + { + $view = new View($this->app->l11nManager, $request, $response); + $view->setTemplate('/Modules/FleetManagement/Theme/Backend/attribute-type'); + $view->addData('nav', $this->app->moduleManager->get('Navigation')->createNavigationMid(1004801001, $request, $response)); + + /** @var \Modules\Attribute\Models\AttributeType $attribute */ + $attribute = VehicleAttributeTypeMapper::get() + ->with('l11n') + ->where('id', (int) $request->getData('id')) + ->where('l11n/language', $response->getLanguage()) + ->execute(); + + $l11ns = VehicleAttributeTypeL11nMapper::getAll() + ->where('ref', $attribute->id) + ->execute(); + + $view->addData('attribute', $attribute); + $view->addData('l11ns', $l11ns); + return $view; } @@ -71,6 +151,52 @@ final class BackendController extends Controller $view->setTemplate('/Modules/FleetManagement/Theme/Backend/vehicle-profile'); $view->addData('nav', $this->app->moduleManager->get('Navigation')->createNavigationMid(1003502001, $request, $response)); + $vehicle = VehicleMapper::get() + ->with('attributes') + ->with('attributes/type') + ->with('attributes/value') + ->with('attributes/type/l11n') + ->with('type') + ->with('type/l11n') + ->with('fuelType') + ->with('fuelType/l11n') + ->where('id', (int) $request->getData('id')) + ->where('type/l11n/language', $response->getLanguage()) + ->where('fuelType/l11n/language', $response->getLanguage()) + ->where('attributes/type/l11n/language', $response->getLanguage()) + ->execute(); + + $view->setData('vehicle', $vehicle); + + $query = new Builder($this->app->dbPool->get()); + $results = $query->selectAs(VehicleMapper::HAS_MANY['files']['external'], 'file') + ->from(VehicleMapper::TABLE) + ->leftJoin(VehicleMapper::HAS_MANY['files']['table']) + ->on(VehicleMapper::HAS_MANY['files']['table'] . '.' . VehicleMapper::HAS_MANY['files']['self'], '=', VehicleMapper::TABLE . '.' . VehicleMapper::PRIMARYFIELD) + ->leftJoin(MediaMapper::TABLE) + ->on(VehicleMapper::HAS_MANY['files']['table'] . '.' . VehicleMapper::HAS_MANY['files']['external'], '=', MediaMapper::TABLE . '.' . MediaMapper::PRIMARYFIELD) + ->leftJoin(MediaMapper::HAS_MANY['types']['table']) + ->on(MediaMapper::TABLE . '.' . MediaMapper::PRIMARYFIELD, '=', MediaMapper::HAS_MANY['types']['table'] . '.' . MediaMapper::HAS_MANY['types']['self']) + ->leftJoin(MediaTypeMapper::TABLE) + ->on(MediaMapper::HAS_MANY['types']['table'] . '.' . MediaMapper::HAS_MANY['types']['external'], '=', MediaTypeMapper::TABLE . '.' . MediaTypeMapper::PRIMARYFIELD) + ->where(VehicleMapper::HAS_MANY['files']['self'], '=', $vehicle->id) + ->where(MediaTypeMapper::TABLE . '.' . MediaTypeMapper::getColumnByMember('name'), '=', 'vehicle_profile_image'); + + $vehicleImage = MediaMapper::get() + ->with('types') + ->where('id', $results) + ->limit(1) + ->execute(); + + $view->addData('vehicleImage', $vehicleImage); + + $vehicleTypes = VehicleTypeMapper::getAll() + ->with('l11n') + ->where('l11n/language', $response->getLanguage()) + ->execute(); + + $view->addData('types', $vehicleTypes); + return $view; } } diff --git a/Models/NullVehicle.php b/Models/NullVehicle.php index 41270a4..033c37c 100644 --- a/Models/NullVehicle.php +++ b/Models/NullVehicle.php @@ -34,6 +34,7 @@ final class NullVehicle extends Vehicle public function __construct(int $id = 0) { $this->id = $id; + parent::__construct(); } /** diff --git a/Models/Vehicle.php b/Models/Vehicle.php index e108627..b5840ee 100644 --- a/Models/Vehicle.php +++ b/Models/Vehicle.php @@ -40,12 +40,8 @@ class Vehicle implements \JsonSerializable public array $inspections = []; - public array $attributes = []; - public array $milage = []; - public array $media = []; - public array $notes = []; public int $unit = 0; @@ -78,4 +74,7 @@ class Vehicle implements \JsonSerializable { return $this->toArray(); } + + use \Modules\Media\Models\MediaListTrait; + use \Modules\Attribute\Models\AttributeHolderTrait; } diff --git a/Models/VehicleMapper.php b/Models/VehicleMapper.php index b8f697f..34a0f17 100644 --- a/Models/VehicleMapper.php +++ b/Models/VehicleMapper.php @@ -42,6 +42,8 @@ final class VehicleMapper extends DataMapperFactory 'fleetmgmt_vehicle_status' => ['name' => 'fleetmgmt_vehicle_status', 'type' => 'int', 'internal' => 'status'], 'fleetmgmt_vehicle_info' => ['name' => 'fleetmgmt_vehicle_info', 'type' => 'string', 'internal' => 'info'], 'fleetmgmt_vehicle_unit' => ['name' => 'fleetmgmt_vehicle_unit', 'type' => 'int', 'internal' => 'unit'], + 'fleetmgmt_vehicle_type' => ['name' => 'fleetmgmt_vehicle_type', 'type' => 'int', 'internal' => 'type'], + 'fleetmgmt_vehicle_fuel' => ['name' => 'fleetmgmt_vehicle_fuel', 'type' => 'int', 'internal' => 'fuelType'], 'fleetmgmt_vehicle_responsible' => ['name' => 'fleetmgmt_vehicle_responsible', 'type' => 'int', 'internal' => 'responsible'], 'fleetmgmt_vehicle_created_at' => ['name' => 'fleetmgmt_vehicle_created_at', 'type' => 'DateTimeImmutable', 'internal' => 'createdAt', 'readonly' => true], ]; @@ -53,7 +55,7 @@ final class VehicleMapper extends DataMapperFactory * @since 1.0.0 */ public const HAS_MANY = [ - 'media' => [ + 'files' => [ 'mapper' => MediaMapper::class, 'table' => 'fleetmgmt_vehicle_media', 'external' => 'fleetmgmt_vehicle_media_media', diff --git a/Models/VehicleStatus.php b/Models/VehicleStatus.php index 2adc3d9..5b2545a 100644 --- a/Models/VehicleStatus.php +++ b/Models/VehicleStatus.php @@ -33,4 +33,6 @@ abstract class VehicleStatus extends Enum public const DAMAGED = 3; public const OUT_OF_ORDER = 4; + + public const MAINTENANCE = 5; } diff --git a/Theme/Backend/Lang/en.lang.php b/Theme/Backend/Lang/en.lang.php index 8734b98..dcba1b7 100755 --- a/Theme/Backend/Lang/en.lang.php +++ b/Theme/Backend/Lang/en.lang.php @@ -14,4 +14,27 @@ declare(strict_types=1); return ['FleetManagement' => [ 'Vehicle' => 'Vehicle', + 'Vehicles' => 'Vehicles', + 'Status' => 'Status', + 'Name' => 'Name', + 'Type' => 'Type', + 'Make' => 'Make', + 'Model' => 'Model', + 'Start' => 'Start', + 'End' => 'End', + 'Profile' => 'Profile', + 'Attributes' => 'Attributes', + 'Files' => 'Files', + 'Notes' => 'Notes', + 'Inspections' => 'Inspections', + 'Drivers' => 'Drivers', + 'Milage' => 'Milage', + 'Driver' => 'Driver', + 'Vin' => 'Vin', + 'PurchasePrice' => 'Purchase Price', + 'LeasingFee' => 'Leasing Fee', + ':status1' => 'Active', + ':status2' => 'Inactive', + ':status3' => 'Damaged', + ':status4' => 'Out of order', ]]; diff --git a/Theme/Backend/attribute-type-list.tpl.php b/Theme/Backend/attribute-type-list.tpl.php new file mode 100755 index 0000000..e98dac5 --- /dev/null +++ b/Theme/Backend/attribute-type-list.tpl.php @@ -0,0 +1,71 @@ +getData('attributes'); + +echo $this->getData('nav')->render(); ?> + +
+
+
+
getHtml('AttributeTypes', 'Attribute', 'Backend'); ?>
+
+ + + + + $value) : ++$count; + $url = UriFactory::build('{/base}/fleet/vehicle/attribute/type?{?}&id=' . $value->id); + ?> + +
getHtml('ID', '0', '0'); ?> + + + + getHtml('Name'); ?> + + + +
id; ?> + printHtml($value->getL11n()); ?> + + +
getHtml('Empty', '0', '0'); ?> + +
+
+
+
+
diff --git a/Theme/Backend/attribute-type.tpl.php b/Theme/Backend/attribute-type.tpl.php new file mode 100755 index 0000000..c8306c7 --- /dev/null +++ b/Theme/Backend/attribute-type.tpl.php @@ -0,0 +1,98 @@ +getData('attribute'); +$l11ns = $this->getData('l11ns'); + +echo $this->getData('nav')->render(); ?> + +
+
+
+
getHtml('Attribute', 'Attribute', 'Backend'); ?>
+ +
+
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ +
+ +
+ +
+
+
+
+ +
+
+
getHtml('Language', '0', '0'); ?>
+ + + + + $value) : ++$c; ?> + +
+ + getHtml('Language', '0', '0'); ?> + getHtml('Title', 'Attribute', 'Backend'); ?> +
+ + getLanguage())); ?> + content; ?> + + +
getHtml('Empty', '0', '0'); ?> + +
+
+
+
diff --git a/Theme/Backend/vehicle-list.tpl.php b/Theme/Backend/vehicle-list.tpl.php index 407fe37..d8cb0b5 100755 --- a/Theme/Backend/vehicle-list.tpl.php +++ b/Theme/Backend/vehicle-list.tpl.php @@ -13,7 +13,6 @@ */ declare(strict_types=1); -use Modules\Media\Models\NullMedia; use phpOMS\Uri\UriFactory; /** @var \phpOMS\Views\View $this */ @@ -78,21 +77,18 @@ echo $this->getData('nav')->render(); ?> - $value) : ++$count; - $url = UriFactory::build('{/base}/sales/vehicle/profile?{?}&id=' . $value->id); - $image = $value->getFileByTypeName('vehicle_profile_image'); - ?> + $value) : + ++$count; + $url = UriFactory::build('{/base}/fleet/vehicle/profile?{?}&id=' . $value->id); + ?> - <?= $this->getHtml('IMG_alt_vehicle'); ?> - printHtml($value->number); ?> - printHtml($value->profile->account->name1); ?> printHtml($value->profile->account->name2); ?> - printHtml($value->mainAddress->city); ?> - printHtml($value->mainAddress->postal); ?> - printHtml($value->mainAddress->address); ?> - printHtml($value->mainAddress->getCountry()); ?> + + printHtml((string) $value->id); ?> + getHtml(':status' . $value->status); ?> + printHtml($value->name); ?> + printHtml($value->type->getL11n()); ?> getHtml('Empty', '0', '0'); ?> diff --git a/Theme/Backend/vehicle-profile.tpl.php b/Theme/Backend/vehicle-profile.tpl.php index 502d02b..9f6123f 100755 --- a/Theme/Backend/vehicle-profile.tpl.php +++ b/Theme/Backend/vehicle-profile.tpl.php @@ -13,17 +13,21 @@ declare(strict_types=1); use Modules\FleetManagement\Models\NullVehicle; -use Modules\Profile\Models\ContactType; +use Modules\FleetManagement\Models\VehicleStatus; +use Modules\Media\Models\NullMedia; use phpOMS\Uri\UriFactory; $countryCodes = \phpOMS\Localization\ISO3166TwoEnum::getConstants(); $countries = \phpOMS\Localization\ISO3166NameEnum::getConstants(); +$vehicleStatus = VehicleStatus::getConstants(); /** * @var \Modules\FleetManagement\Models\Vehicle $vehicle */ $vehicle = $this->getData('vehicle') ?? new NullVehicle(); -$files = $client->getFiles(); +$files = $vehicle->getFiles(); +$vehicleImage = $this->getData('vehicleImage') ?? new NullMedia(); +$vehicleTypes = $this->getData('types') ?? []; /** * @var \phpOMS\Views\View $this @@ -33,11 +37,11 @@ echo $this->getData('nav')->render();
@@ -45,69 +49,84 @@ echo $this->getData('nav')->render();
request->uri->fragment === 'c-tab-1' ? ' checked' : ''; ?>>
-
-
-
-
- - -
- -
- - -
- -
- - -
- -
- - -
- -
- - -
- -
- - -
- -
- - -
- -
- - -
-
-
- -
-
-
-
-
-
- +
getHtml('Profile'); ?>
+
+
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+
-
-
-
+
- +
+ +