validateInvestmentCreate($request))) { $response->header->status = RequestStatusCode::R_400; $this->createInvalidCreateResponse($request, $response, $val); return; } /** @var Investment $investment */ $investment = $this->createInvestmentFromRequest($request); $this->createModel($request->header->account, $investment, InvestmentMapper::class, 'investment', $request->getOrigin()); if (!empty($request->files) || !empty($request->getDataJson('media')) ) { $this->createInvestmentMedia($investment, $request); } $this->createStandardCreateResponse($request, $response, $investment); } /** * Method to create investment from request. * * @param RequestAbstract $request Request * * @return Investment Returns the created investment from the request * * @since 1.0.0 */ public function createInvestmentFromRequest(RequestAbstract $request) : Investment { $investment = new Investment(); $investment->name = $request->getDataString('name') ?? ''; $investment->description = $request->getDataString('description') ?? ''; $investment->status = InvestmentStatus::tryFromValue($request->getDataInt('status')) ?? InvestmentStatus::DRAFT; $investment->description = $request->getDataString('description') ?? ''; $investment->unit = $request->getDataInt('unit') ?? $this->app->unitId; $investment->createdBy = new NullAccount($request->header->account); $investment->performanceDate = $request->getDataDateTime('performance') ?? new \DateTime($investment->createdAt->format('Y-m-d H:i:s')); //$investment->type = new NullBaseStringL11nType((int) ($request->getDataInt('type') ?? 0)); return $investment; } /** * Create media files for investment * * @param Investment $investment Investment * @param RequestAbstract $request Request incl. media do upload * * @return void * * @since 1.0.0 */ private function createInvestmentMedia(Investment $investment, RequestAbstract $request) : void { $path = $this->createInvestmentDir($investment); if (!empty($request->files)) { $this->app->moduleManager->get('Media', 'Api')->uploadFiles( names: [], fileNames: [], files: $request->files, account: $request->header->account, basePath: __DIR__ . '/../../../Modules/Media/Files' . $path, virtualPath: $path, pathSettings: PathSettings::FILE_PATH, rel: $investment->id, mapper: InvestmentMapper::class, field: 'files' ); } if (!empty($media = $request->getDataJson('media'))) { $this->app->moduleManager->get('Media', 'Api')->addMediaToCollectionAndModel( $request->header->account, $media, $investment->id, InvestmentMapper::class, 'files', $path ); } } /** * Api method to create a bill * * @param RequestAbstract $request Request * @param ResponseAbstract $response Response * @param array $data Generic data * * @return void * * @api * * @since 1.0.0 */ public function apiMediaAddToInvestment(RequestAbstract $request, ResponseAbstract $response, array $data = []) : void { if (!empty($val = $this->validateMediaAddToInvestment($request))) { $response->header->status = RequestStatusCode::R_400; $this->createInvalidAddResponse($request, $response, $val); return; } /** @var \Modules\InvestmentManagement\Models\Investment $investment */ $investment = InvestmentMapper::get()->where('id', (int) $request->getData('investment'))->execute(); $path = $this->createInvestmentDir($investment); $uploaded = new NullCollection(); if (!empty($request->files)) { $uploaded = $this->app->moduleManager->get('Media', 'Api')->uploadFiles( names: [], fileNames: [], files: $request->files, account: $request->header->account, basePath: __DIR__ . '/../../../Modules/Media/Files' . $path, virtualPath: $path, pathSettings: PathSettings::FILE_PATH, hasAccountRelation: false, readContent: $request->getDataBool('parse_content') ?? false, type: $request->getDataInt('type'), rel: $investment->id, mapper: InvestmentMapper::class, field: 'files' ); } if (!empty($media = $request->getDataJson('media'))) { $this->app->moduleManager->get('Media', 'Api')->addMediaToCollectionAndModel( $request->header->account, $media, $investment->id, InvestmentMapper::class, 'files', $path ); } $this->fillJsonResponse($request, $response, NotificationLevel::OK, '', $this->app->l11nManager->getText($response->header->l11n->language, '0', '0', 'SuccessfulAdd'), [ 'upload' => $uploaded->sources, 'media' => $media, ]); } /** * Method to validate bill creation from request * * @param RequestAbstract $request Request * * @return array * * @since 1.0.0 */ private function validateMediaAddToInvestment(RequestAbstract $request) : array { $val = []; if (($val['media'] = (!$request->hasData('media') && empty($request->files))) || ($val['investment'] = !$request->hasData('investment')) ) { return $val; } return []; } /** * Validate investment create request * * @param RequestAbstract $request Request * * @return array Returns the validation array of the request * * @since 1.0.0 */ private function validateInvestmentCreate(RequestAbstract $request) : array { $val = []; if (($val['name'] = !$request->hasData('name')) ) { return $val; } return []; } /** * Create media directory path * * @param Investment $investment Investment * * @return string * * @since 1.0.0 */ private function createInvestmentDir(Investment $investment) : string { return '/Modules/InvestmentManagement/Investment/' . $this->app->unitId . '/' . $investment->id; } /** * Create media directory path * * @param InvestmentObject $object Investment * * @return string * * @since 1.0.0 */ private function createInvestmentObjectDir(InvestmentObject $object) : string { return '/Modules/InvestmentManagement/Investment/' . $this->app->unitId . '/' . $object->investment; } /** * Api method to create a investment * * @param RequestAbstract $request Request * @param ResponseAbstract $response Response * @param array $data Generic data * * @return void * * @api * * @since 1.0.0 */ public function apiInvestmentOptionCreate(RequestAbstract $request, ResponseAbstract $response, array $data = []) : void { if (!empty($val = $this->validateInvestmentOptionCreate($request))) { $response->header->status = RequestStatusCode::R_400; $this->createInvalidCreateResponse($request, $response, $val); return; } /** @var InvestmentObject $investment */ $investment = $this->createInvestmentOptionFromRequest($request); $this->createModel($request->header->account, $investment, InvestmentObjectMapper::class, 'investment_option', $request->getOrigin()); if (!empty($request->files) || !empty($request->getDataJson('media')) ) { $this->createInvestmentObjectMedia($investment, $request); } $this->createStandardCreateResponse($request, $response, $investment); } /** * Validate investment create request * * @param RequestAbstract $request Request * * @return array Returns the validation array of the request * * @since 1.0.0 */ private function validateInvestmentOptionCreate(RequestAbstract $request) : array { $val = []; if (($val['name'] = !$request->hasData('name')) || ($val['investment'] = !$request->hasData('investment')) ) { return $val; } return []; } /** * Method to create investment from request. * * @param RequestAbstract $request Request * * @return InvestmentObject Returns the created investment from the request * * @since 1.0.0 */ public function createInvestmentOptionFromRequest(RequestAbstract $request) : InvestmentObject { $investment = new InvestmentObject(); $investment->name = $request->getDataString('name') ?? ''; $investment->description = $request->getDataString('description') ?? ''; $investment->link = $request->getDataString('link') ?? ''; $investment->investment = (int) $request->getData('investment'); $investment->parent = $request->getDataInt('parent'); $investment->supplier = $request->hasData('supplier') ? new NullSupplier((int) $request->getData('supplier')) : null; $investment->supplierName = $request->getDataString('suppliername') ?? ''; $investment->item = $request->hasData('item') ? new NullItem((int) $request->getData('item')) : null; // @todo reconsider the following lines. This seems rather complicated. if ($request->hasData('amount')) { /** @var BaseStringL11nType[] $types */ $types = AmountTypeMapper::getAll()->executeGetArray(); foreach ($types as $type) { if ($type->title === 'costs') { $defaultGroup = new AmountGroup(); $defaultGroup->name = 'Purchase Price'; // @todo replace with api l11n $defaultGroup->type = new NullBaseStringL11nType($type->id); $amount = new Amount(); $amount->amount = new FloatInt((int) $request->getDataInt('amount')); $defaultGroup->amounts[] = $amount; $investment->amountGroups[] = $defaultGroup; } elseif ($type->title === 'cashflow') { $defaultGroup = new AmountGroup(); $defaultGroup->name = 'Cashflow'; // @todo replace with api l11n $defaultGroup->type = new NullBaseStringL11nType($type->id); // @todo calculate date based on performance date + offer conditions / 30 days $amount = new Amount(); $amount->amount = new FloatInt((int) $request->getDataInt('amount')); $defaultGroup->amounts[] = $amount; $investment->amountGroups[] = $defaultGroup; } elseif ($type->title === 'depreciation') { $defaultGroup = new AmountGroup(); $defaultGroup->name = 'Depreciation'; // @todo replace with api l11n $defaultGroup->type = new NullBaseStringL11nType($type->id); // @todo calculate automatic depreciation; $amount = new Amount(); $amount->amount = new FloatInt((int) $request->getDataInt('amount')); $defaultGroup->amounts[] = $amount; $investment->amountGroups[] = $defaultGroup; } } } return $investment; } /** * Api method to create a investment * * @param RequestAbstract $request Request * @param ResponseAbstract $response Response * @param array $data Generic data * * @return void * * @api * * @since 1.0.0 */ public function apiAmountTypeCreate(RequestAbstract $request, ResponseAbstract $response, array $data = []) : void { if (!empty($val = $this->validateAmountTypeCreate($request))) { $response->header->status = RequestStatusCode::R_400; $this->createInvalidCreateResponse($request, $response, $val); return; } /** @var BaseStringL11nType $amount */ $amount = $this->createAmountTypeFromRequest($request); $this->createModel($request->header->account, $amount, AmountTypeMapper::class, 'amount_type', $request->getOrigin()); $this->createStandardCreateResponse($request, $response, $amount); } /** * Create media files for investment * * @param InvestmentObject $investment Investment * @param RequestAbstract $request Request incl. media do upload * * @return void * * @since 1.0.0 */ private function createInvestmentObjectMedia(InvestmentObject $investment, RequestAbstract $request) : void { $path = $this->createInvestmentObjectDir($investment); if (!empty($request->files)) { $this->app->moduleManager->get('Media', 'Api')->uploadFiles( names: [], fileNames: [], files: $request->files, account: $request->header->account, basePath: __DIR__ . '/../../../Modules/Media/Files' . $path, virtualPath: $path, pathSettings: PathSettings::FILE_PATH, rel: $investment->id, mapper: InvestmentMapper::class, field: 'files' ); } if (!empty($media = $request->getDataJson('media'))) { $this->app->moduleManager->get('Media', 'Api')->addMediaToCollectionAndModel( $request->header->account, $media, $investment->id, InvestmentMapper::class, 'files', $path ); } } /** * Api method to create a bill * * @param RequestAbstract $request Request * @param ResponseAbstract $response Response * @param array $data Generic data * * @return void * * @api * * @since 1.0.0 */ public function apiMediaAddToInvestmentObject(RequestAbstract $request, ResponseAbstract $response, array $data = []) : void { if (!empty($val = $this->validateMediaAddToInvestmentObject($request))) { $response->header->status = RequestStatusCode::R_400; $this->createInvalidAddResponse($request, $response, $val); return; } /** @var \Modules\InvestmentManagement\Models\InvestmentObject $investment */ $investment = InvestmentObjectMapper::get()->where('id', (int) $request->getData('option'))->execute(); $path = $this->createInvestmentObjectDir($investment); $uploaded = new NullCollection(); if (!empty($request->files)) { $uploaded = $this->app->moduleManager->get('Media', 'Api')->uploadFiles( names: [], fileNames: [], files: $request->files, account: $request->header->account, basePath: __DIR__ . '/../../../Modules/Media/Files' . $path, virtualPath: $path, pathSettings: PathSettings::FILE_PATH, hasAccountRelation: false, readContent: $request->getDataBool('parse_content') ?? false, type: $request->getDataInt('type'), rel: $investment->id, mapper: InvestmentObjectMapper::class, field: 'files' ); } if (!empty($media = $request->getDataJson('media'))) { $this->app->moduleManager->get('Media', 'Api')->addMediaToCollectionAndModel( $request->header->account, $media, $investment->id, InvestmentObjectMapper::class, 'files', $path ); } $this->fillJsonResponse($request, $response, NotificationLevel::OK, '', $this->app->l11nManager->getText($response->header->l11n->language, '0', '0', 'SuccessfulAdd'), [ 'upload' => $uploaded->sources, 'media' => $media, ]); } /** * Method to validate bill creation from request * * @param RequestAbstract $request Request * * @return array * * @since 1.0.0 */ private function validateMediaAddToInvestmentObject(RequestAbstract $request) : array { $val = []; if (($val['media'] = (!$request->hasData('media') && empty($request->files))) || ($val['investment'] = !$request->hasData('investment')) ) { return $val; } return []; } /** * Method to create investment from request. * * @param RequestAbstract $request Request * * @return BaseStringL11nType Returns the created investment from the request * * @since 1.0.0 */ public function createAmountTypeFromRequest(RequestAbstract $request) : BaseStringL11nType { $type = new BaseStringL11nType(); $type->title = $request->getDataString('name') ?? ''; $type->setL11n( $request->getDataString('title') ?? '', ISO639x1Enum::tryFromValue($request->getDataString('language')) ?? ISO639x1Enum::_EN ); return $type; } /** * Validate investment create request * * @param RequestAbstract $request Request * * @return array Returns the validation array of the request * * @since 1.0.0 */ private function validateAmountTypeCreate(RequestAbstract $request) : array { $val = []; if (($val['name'] = !$request->hasData('name')) || ($val['title'] = !$request->hasData('title')) ) { return $val; } return []; } /** * Api method to create investment attribute l11n * * @param RequestAbstract $request Request * @param ResponseAbstract $response Response * @param array $data Generic data * * @return void * * @api * * @since 1.0.0 */ public function apiAmountTypeL11nCreate(RequestAbstract $request, ResponseAbstract $response, array $data = []) : void { if (!empty($val = $this->validateAmountTypeL11nCreate($request))) { $response->header->status = RequestStatusCode::R_400; $this->createInvalidCreateResponse($request, $response, $val); return; } $typeL11n = $this->createAmountTypeL11nFromRequest($request); $this->createModel($request->header->account, $typeL11n, AmountTypeL11nMapper::class, 'amount_type_l11n', $request->getOrigin()); $this->createStandardCreateResponse($request, $response, $typeL11n); } /** * Method to create investment attribute l11n from request. * * @param RequestAbstract $request Request * * @return BaseStringL11n * * @since 1.0.0 */ private function createAmountTypeL11nFromRequest(RequestAbstract $request) : BaseStringL11n { $typeL11n = new BaseStringL11n(); $typeL11n->ref = $request->getDataInt('type') ?? 0; $typeL11n->language = ISO639x1Enum::tryFromValue($request->getDataString('language')) ?? $request->header->l11n->language; $typeL11n->content = $request->getDataString('title') ?? ''; return $typeL11n; } /** * Validate investment attribute l11n create request * * @param RequestAbstract $request Request * * @return array * * @since 1.0.0 */ private function validateAmountTypeL11nCreate(RequestAbstract $request) : array { $val = []; if (($val['title'] = !$request->hasData('title')) || ($val['type'] = !$request->hasData('type')) ) { return $val; } return []; } /** * Api method to create notes * * @param RequestAbstract $request Request * @param ResponseAbstract $response Response * @param array $data Generic data * * @return void * * @api * * @since 1.0.0 */ public function apiNoteCreate(RequestAbstract $request, ResponseAbstract $response, array $data = []) : void { if (!empty($val = $this->validateNoteCreate($request))) { $response->header->status = RequestStatusCode::R_400; $this->createInvalidCreateResponse($request, $response, $val); return; } $request->setData('virtualpath', '/Modules/InvestmentManagement/Investment/' . $request->getData('id'), true); $this->app->moduleManager->get('Editor', 'Api')->apiEditorCreate($request, $response, $data); if ($response->header->status !== RequestStatusCode::R_200) { return; } $responseData = $response->getDataArray($request->uri->__toString()); if (!\is_array($responseData)) { return; } $model = $responseData['response']; $this->createModelRelation($request->header->account, (int) $request->getData('id'), $model->id, InvestmentMapper::class, 'notes', '', $request->getOrigin()); } /** * Validate note create request * * @param RequestAbstract $request Request * * @return array * * @since 1.0.0 */ private function validateNoteCreate(RequestAbstract $request) : array { $val = []; if (($val['id'] = !$request->hasData('id')) ) { return $val; } return []; } /** * Api method to update note * * @param RequestAbstract $request Request * @param ResponseAbstract $response Response * @param array $data Generic data * * @return void * * @api * * @since 1.0.0 */ public function apiNoteEdit(RequestAbstract $request, ResponseAbstract $response, array $data = []) : void { $this->app->moduleManager->get('Editor', 'Api')->apiEditorUpdate($request, $response, $data); if ($response->header->status !== RequestStatusCode::R_200) { return; } $responseData = $response->getDataArray($request->uri->__toString()); if (!\is_array($responseData)) { return; } } }