From 21c0fe1d5519f6972ef85592d40eca59312007d2 Mon Sep 17 00:00:00 2001 From: Dennis Eichhorn Date: Mon, 5 Jun 2023 03:37:27 +0200 Subject: [PATCH] Add notes and approved by --- Admin/Install/db.json | 42 ++++++++++++++++++++++++ Controller/ApiController.php | 58 +++++++++++++++++++++++++++++++++ Models/Expense.php | 4 +++ Models/ExpenseElement.php | 2 ++ Models/ExpenseElementMapper.php | 5 +++ Models/ExpenseMapper.php | 12 +++++++ 6 files changed, 123 insertions(+) diff --git a/Admin/Install/db.json b/Admin/Install/db.json index 4a948d3..ab8f69d 100644 --- a/Admin/Install/db.json +++ b/Admin/Install/db.json @@ -120,6 +120,14 @@ "type": "TINYINT(1)", "null": false }, + "bizexpenses_expense_approvedby": { + "name": "bizexpenses_expense_approvedby", + "type": "INT", + "null": true, + "default": null, + "foreignTable": "account", + "foreignKey": "account_id" + }, "bizexpenses_expense_paid": { "name": "bizexpenses_expense_paid", "type": "TINYINT(1)", @@ -199,6 +207,14 @@ "type": "TINYINT(1)", "null": false }, + "bizexpenses_expense_element_approvedby": { + "name": "bizexpenses_expense_element_approvedby", + "type": "INT", + "null": true, + "default": null, + "foreignTable": "account", + "foreignKey": "account_id" + }, "bizexpenses_expense_element_net": { "name": "bizexpenses_expense_element_net", "type": "BIGINT", @@ -329,5 +345,31 @@ "foreignKey": "media_id" } } + }, + "bizexpenses_expense_note": { + "name": "bizexpenses_expense_note", + "fields": { + "bizexpenses_expense_note_id": { + "name": "bizexpenses_expense_note_id", + "type": "INT", + "null": false, + "primary": true, + "autoincrement": true + }, + "bizexpenses_expense_note_expense": { + "name": "bizexpenses_expense_note_expense", + "type": "INT", + "null": false, + "foreignTable": "bizexpenses_expense", + "foreignKey": "bizexpenses_expense_id" + }, + "bizexpenses_expense_note_doc": { + "name": "bizexpenses_expense_note_doc", + "type": "INT", + "null": false, + "foreignTable": "editor_doc", + "foreignKey": "editor_doc_id" + } + } } } \ No newline at end of file diff --git a/Controller/ApiController.php b/Controller/ApiController.php index 170662f..f519cbd 100755 --- a/Controller/ApiController.php +++ b/Controller/ApiController.php @@ -684,4 +684,62 @@ final class ApiController extends Controller public function apiExpenseFromUpload(RequestAbstract $request, ResponseAbstract $response, mixed $data = null) : void { } + + /** + * Api method to create item files + * + * @param RequestAbstract $request Request + * @param ResponseAbstract $response Response + * @param mixed $data Generic data + * + * @return void + * + * @api + * + * @since 1.0.0 + */ + public function apiNoteCreate(RequestAbstract $request, ResponseAbstract $response, mixed $data = null) : void + { + if (!empty($val = $this->validateNoteCreate($request))) { + $response->data['expense_note_create'] = new FormValidation($val); + $response->header->status = RequestStatusCode::R_400; + + return; + } + + $request->setData('virtualpath', '/Modules/BusinessExpenses/Items/' . $request->getData('id'), true); + $this->app->moduleManager->get('Editor', 'Api')->apiEditorCreate($request, $response, $data); + + if ($response->header->status !== RequestStatusCode::R_200) { + return; + } + + $responseData = $response->get($request->uri->__toString()); + if (!\is_array($responseData)) { + return; + } + + $model = $responseData['response']; + $this->createModelRelation($request->header->account, (int) $request->getData('id'), $model->id, ExpenseMapper::class, 'notes', '', $request->getOrigin()); + } + + /** + * Validate item 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 []; + } } diff --git a/Models/Expense.php b/Models/Expense.php index 7d2269a..c13e777 100644 --- a/Models/Expense.php +++ b/Models/Expense.php @@ -33,6 +33,8 @@ class Expense public Account $from; + public ?Account $approvedBy = null; + public int $status = ExpenseStatus::DRAFT; public BaseStringL11nType $type; @@ -67,6 +69,8 @@ class Expense public string $country = ISO3166TwoEnum::_USA; + public array $notes = []; + public function __construct() { $this->type = new BaseStringL11nType(); diff --git a/Models/ExpenseElement.php b/Models/ExpenseElement.php index 968f06c..4e73a36 100644 --- a/Models/ExpenseElement.php +++ b/Models/ExpenseElement.php @@ -36,6 +36,8 @@ class ExpenseElement public bool $approved = false; + public ?Account $approvedBy = null; + public string $description = ''; public FloatInt $net; diff --git a/Models/ExpenseElementMapper.php b/Models/ExpenseElementMapper.php index e3f1689..ebe39e3 100644 --- a/Models/ExpenseElementMapper.php +++ b/Models/ExpenseElementMapper.php @@ -42,6 +42,7 @@ final class ExpenseElementMapper extends DataMapperFactory 'bizexpenses_expense_element_id' => ['name' => 'bizexpenses_expense_element_id', 'type' => 'int', 'internal' => 'id'], 'bizexpenses_expense_element_description' => ['name' => 'bizexpenses_expense_element_description', 'type' => 'string', 'internal' => 'description'], 'bizexpenses_expense_element_approved' => ['name' => 'bizexpenses_expense_element_approved', 'type' => 'bool', 'internal' => 'approved'], + 'bizexpenses_expense_element_approvedby' => ['name' => 'bizexpenses_expense_element_approvedby', 'type' => 'bool', 'internal' => 'approvedBy'], 'bizexpenses_expense_element_net' => ['name' => 'bizexpenses_expense_element_net', 'type' => 'Serializable', 'internal' => 'net'], 'bizexpenses_expense_element_gross' => ['name' => 'bizexpenses_expense_element_gross', 'type' => 'Serializable', 'internal' => 'gross'], 'bizexpenses_expense_element_taxp' => ['name' => 'bizexpenses_expense_element_taxp', 'type' => 'Serializable', 'internal' => 'taxP'], @@ -87,6 +88,10 @@ final class ExpenseElementMapper extends DataMapperFactory 'mapper' => SupplierMapper::class, 'external' => 'bizexpenses_expense_element_supplier', ], + 'approvedBy' => [ + 'mapper' => AccountMapper::class, + 'external' => 'bizexpenses_expense_element_approvedby', + ], ]; /** diff --git a/Models/ExpenseMapper.php b/Models/ExpenseMapper.php index 3c253db..3eb7581 100644 --- a/Models/ExpenseMapper.php +++ b/Models/ExpenseMapper.php @@ -17,6 +17,7 @@ namespace Modules\BusinessExpenses\Models; use Modules\Admin\Models\AccountMapper; use Modules\Media\Models\MediaMapper; use phpOMS\DataStorage\Database\Mapper\DataMapperFactory; +use Modules\Editor\Models\EditorDocMapper; /** * mapper class. @@ -42,6 +43,7 @@ final class ExpenseMapper extends DataMapperFactory 'bizexpenses_expense_status' => ['name' => 'bizexpenses_expense_status', 'type' => 'int', 'internal' => 'status'], 'bizexpenses_expense_description' => ['name' => 'bizexpenses_expense_description', 'type' => 'string', 'internal' => 'description'], 'bizexpenses_expense_approved' => ['name' => 'bizexpenses_expense_approved', 'type' => 'bool', 'internal' => 'approved'], + 'bizexpenses_expense_approvedby' => ['name' => 'bizexpenses_expense_approvedby', 'type' => 'bool', 'internal' => 'approvedBy'], 'bizexpenses_expense_paid' => ['name' => 'bizexpenses_expense_paid', 'type' => 'bool', 'internal' => 'paid'], 'bizexpenses_expense_net' => ['name' => 'bizexpenses_expense_net', 'type' => 'Serializable', 'internal' => 'net'], 'bizexpenses_expense_gross' => ['name' => 'bizexpenses_expense_gross', 'type' => 'Serializable', 'internal' => 'gross'], @@ -73,6 +75,12 @@ final class ExpenseMapper extends DataMapperFactory 'external' => 'bizexpenses_expense_media_dst', 'self' => 'bizexpenses_expense_media_src', ], + 'notes' => [ + 'mapper' => EditorDocMapper::class, /* mapper of the related object */ + 'table' => 'bizexpenses_expense_note', /* table of the related object, null if no relation table is used (many->1) */ + 'external' => 'bizexpenses_expense_note_doc', + 'self' => 'bizexpenses_expense_note_expense', + ], ]; /** @@ -86,6 +94,10 @@ final class ExpenseMapper extends DataMapperFactory 'mapper' => AccountMapper::class, 'external' => 'bizexpenses_expense_from', ], + 'approvedBy' => [ + 'mapper' => AccountMapper::class, + 'external' => 'bizexpenses_expense_approvedby', + ], ]; /**