This commit is contained in:
Dennis Eichhorn 2024-02-04 20:34:11 +00:00
parent 16aec56e72
commit c717069fa9
9 changed files with 258 additions and 14 deletions

43
Admin/Install/Search.php Normal file
View File

@ -0,0 +1,43 @@
<?php
/**
* Jingga
*
* PHP Version 8.1
*
* @package Modules\ClientManagement\Admin\Install
* @copyright Dennis Eichhorn
* @license OMS License 2.0
* @version 1.0.0
* @link https://jingga.app
*/
declare(strict_types=1);
namespace Modules\ClientManagement\Admin\Install;
use phpOMS\Application\ApplicationAbstract;
/**
* Search class.
*
* @package Modules\ClientManagement\Admin\Install
* @license OMS License 2.0
* @link https://jingga.app
* @since 1.0.0
*/
final class Search
{
/**
* Install navigation providing
*
* @param ApplicationAbstract $app Application
* @param string $path Module path
*
* @return void
*
* @since 1.0.0
*/
public static function install(ApplicationAbstract $app, string $path) : void
{
\Modules\Search\Admin\Installer::installExternal($app, ['path' => __DIR__ . '/SearchCommands.php']);
}
}

View File

@ -0,0 +1,32 @@
<?php
/**
* Jingga
*
* PHP Version 8.1
*
* @package Modules\ClientManagement
* @copyright Dennis Eichhorn
* @license OMS License 2.0
* @version 1.0.0
* @link https://jingga.app
*/
declare(strict_types=1);
use Modules\ClientManagement\Controller\SearchController;
use Modules\ClientManagement\Models\PermissionCategory;
use phpOMS\Account\PermissionType;
use phpOMS\Router\RouteVerb;
return [
'^(?!:).+.*?' => [
[
'dest' => '\Modules\ClientManagement\Controller\SearchController:searchGeneral',
'verb' => RouteVerb::ANY,
'permission' => [
'module' => SearchController::NAME,
'type' => PermissionType::READ,
'state' => PermissionCategory::CLIENT,
],
],
],
];

View File

@ -6,7 +6,7 @@
"de": "Bewertung" "de": "Bewertung"
}, },
"value_type": 2, "value_type": 2,
"is_custom_allowed": true, "is_custom_allowed": false,
"validation_pattern": "", "validation_pattern": "",
"is_required": false, "is_required": false,
"default_value": "", "default_value": "",
@ -55,23 +55,40 @@
} }
] ]
}, },
{
"name": "client_area",
"l11n": {
"en": "Client area",
"de": "Kundengebiet"
},
"value_type": 2,
"is_custom_allowed": false,
"validation_pattern": "",
"is_required": false,
"default_value": "01",
"values": [
{
"value": "01"
}
]
},
{ {
"name": "bill_emails", "name": "bill_emails",
"l11n": { "l11n": {
"en": "Send bills as emails", "en": "Send bills as emails",
"de": "Sende Rechnungen als Email" "de": "Sende Rechnungen als Email"
}, },
"value_type": 1, "value_type": 5,
"is_custom_allowed": false, "is_custom_allowed": false,
"validation_pattern": "", "validation_pattern": "",
"is_required": false, "is_required": false,
"default_value": 1, "default_value": 1,
"values": [ "values": [
{ {
"value": 0 "value": false
}, },
{ {
"value": 1 "value": true
} }
] ]
}, },
@ -88,6 +105,39 @@
"default_value": "", "default_value": "",
"values": [] "values": []
}, },
{
"name": "support_emails",
"l11n": {
"en": "Send support as emails",
"de": "Sende Support als Email"
},
"value_type": 5,
"is_custom_allowed": false,
"validation_pattern": "",
"is_required": false,
"default_value": true,
"values": [
{
"value": false
},
{
"value": true
}
]
},
{
"name": "support_email_address",
"l11n": {
"en": "Email address for support",
"de": "Emailadresse für Support"
},
"value_type": 2,
"is_custom_allowed": true,
"validation_pattern": "",
"is_required": false,
"default_value": "",
"values": []
},
{ {
"name": "segment", "name": "segment",
"l11n": { "l11n": {

View File

@ -12,8 +12,7 @@
"clientmgmt_client_no": { "clientmgmt_client_no": {
"name": "clientmgmt_client_no", "name": "clientmgmt_client_no",
"type": "VARCHAR(255)", "type": "VARCHAR(255)",
"null": false, "null": false
"unique": true
}, },
"clientmgmt_client_no_reverse": { "clientmgmt_client_no_reverse": {
"name": "clientmgmt_client_no_reverse", "name": "clientmgmt_client_no_reverse",

View File

@ -283,6 +283,9 @@ final class ApiController extends Controller
$account = new NullAccount((int) $request->getData('account')); $account = new NullAccount((int) $request->getData('account'));
} }
// @feature Create a way to let admins create a default account format for clients/suppliers
// https://github.com/Karaka-Management/oms-ClientManagement/issues/19
$client = new Client(); $client = new Client();
$client->number = $request->getDataString('number') ?? ''; $client->number = $request->getDataString('number') ?? '';
$client->account = $account; $client->account = $account;
@ -537,7 +540,7 @@ final class ApiController extends Controller
return; return;
} }
$uploaded = $this->app->moduleManager->get('Media')->uploadFiles( $uploaded = $this->app->moduleManager->get('Media', 'Api')->uploadFiles(
names: $request->getDataList('names'), names: $request->getDataList('names'),
fileNames: $request->getDataList('filenames'), fileNames: $request->getDataList('filenames'),
files: $uploadedFiles, files: $uploadedFiles,

View File

@ -257,10 +257,8 @@ final class BackendController extends Controller
->execute(); ->execute();
// Get item profile image // Get item profile image
// It might not be part of the 5 newest item files from above // @feature Create a new read mapper function that returns relation models instead of its own model
// @todo It would be nice to have something like this as a default method in the model e.g. // https://github.com/Karaka-Management/phpOMS/issues/320
// ItemManagement::getRelations()->with('types')->where(...);
// This should return the relations and NOT the model itself
$query = new Builder($this->app->dbPool->get()); $query = new Builder($this->app->dbPool->get());
$results = $query->selectAs(ClientMapper::HAS_MANY['files']['external'], 'file') $results = $query->selectAs(ClientMapper::HAS_MANY['files']['external'], 'file')
->from(ClientMapper::TABLE) ->from(ClientMapper::TABLE)
@ -276,7 +274,6 @@ final class BackendController extends Controller
->where(MediaTypeMapper::TABLE . '.' . MediaTypeMapper::getColumnByMember('name'), '=', 'client_profile_image'); ->where(MediaTypeMapper::TABLE . '.' . MediaTypeMapper::getColumnByMember('name'), '=', 'client_profile_image');
$view->data['clientImage'] = MediaMapper::get() $view->data['clientImage'] = MediaMapper::get()
->with('types')
->where('id', $results) ->where('id', $results)
->limit(1) ->limit(1)
->execute(); ->execute();

View File

@ -0,0 +1,111 @@
<?php
/**
* Jingga
*
* PHP Version 8.1
*
* @package Modules\ClientManagement
* @copyright Dennis Eichhorn
* @license OMS License 2.0
* @version 1.0.0
* @link https://jingga.app
*/
declare(strict_types=1);
namespace Modules\ClientManagement\Controller;
use Modules\Admin\Models\ContactType;
use Modules\ClientManagement\Models\ClientMapper;
use Modules\Media\Models\MediaMapper;
use Modules\Media\Models\MediaTypeMapper;
use phpOMS\DataStorage\Database\Query\Builder;
use phpOMS\Message\RequestAbstract;
use phpOMS\Message\ResponseAbstract;
use phpOMS\System\MimeType;
/**
* Search class.
*
* @package Modules\ClientManagement
* @license OMS License 2.0
* @link https://jingga.app
* @since 1.0.0
*/
final class SearchController extends Controller
{
/**
* Api method to search for tags
*
* @param RequestAbstract $request Request
* @param ResponseAbstract $response Response
* @param array $data Generic data
*
* @return void
*
* @api
*
* @since 1.0.0
*/
public function searchGeneral(RequestAbstract $request, ResponseAbstract $response, array $data = []) : void
{
$names = \explode(' ', ($request->getDataString('search') ?? ''));
$names[] = ($request->getDataString('search') ?? '');
$mapper = ClientMapper::getAll()
->with('account')
->with('mainAddress')
->with('account/contacts')
->limit(8);
foreach ($names as $name) {
$mapper->where('account/login', '%' . $name . '%', 'LIKE', 'OR')
->where('account/name1', '%' . $name . '%', 'LIKE', 'OR')
->where('account/name2', '%' . $name . '%', 'LIKE', 'OR')
->where('account/name3', '%' . $name . '%', 'LIKE', 'OR');
}
/** @var \Modules\ClientManagement\Models\Client[] $accounts */
$accounts = $mapper->execute();
$results = [];
foreach ($accounts as $account) {
// Get item profile image
// @feature Create a new read mapper function that returns relation models instead of its own model
// https://github.com/Karaka-Management/phpOMS/issues/320
$query = new Builder($this->app->dbPool->get());
$iResults = $query->selectAs(ClientMapper::HAS_MANY['files']['external'], 'file')
->from(ClientMapper::TABLE)
->leftJoin(ClientMapper::HAS_MANY['files']['table'])
->on(ClientMapper::HAS_MANY['files']['table'] . '.' . ClientMapper::HAS_MANY['files']['self'], '=', ClientMapper::TABLE . '.' . ClientMapper::PRIMARYFIELD)
->leftJoin(MediaMapper::TABLE)
->on(ClientMapper::HAS_MANY['files']['table'] . '.' . ClientMapper::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(ClientMapper::HAS_MANY['files']['self'], '=', $account->id)
->where(MediaTypeMapper::TABLE . '.' . MediaTypeMapper::getColumnByMember('name'), '=', 'client_profile_image');
$image = MediaMapper::get()
->where('id', $iResults)
->limit(1)
->execute();
$results[] = [
'title' => $account->account->name1 . ' ' . $account->account->name2,
'link' => '{/base}/sales/client/view?id=' . $account->id,
'email' => $account->account->getContactByType(ContactType::EMAIL)->content,
'phone' => $account->account->getContactByType(ContactType::PHONE)->content,
'city' => $account->mainAddress?->city,
'image' => $image->id === 0
? 'Web/Backend/img/logo_grey.png'
: $image->getPath(),
'type' => 'list_accounts',
'module' => 'Client Management',
];
}
$response->header->set('Content-Type', MimeType::M_JSON . '; charset=utf-8', true);
$response->add($request->uri->__toString(), $results);
}
}

View File

@ -13,6 +13,7 @@
declare(strict_types=1); declare(strict_types=1);
use Modules\Admin\Models\ContactType; use Modules\Admin\Models\ContactType;
use Modules\Billing\Models\BillMapper;
use Modules\Billing\Models\Price\PriceType; use Modules\Billing\Models\Price\PriceType;
use Modules\Billing\Models\SalesBillMapper; use Modules\Billing\Models\SalesBillMapper;
use Modules\Media\Models\NullMedia; use Modules\Media\Models\NullMedia;
@ -928,7 +929,14 @@ echo $this->data['nav']->render();
<td><?= $this->getHtml('Date'); ?> <td><?= $this->getHtml('Date'); ?>
<tbody> <tbody>
<?php <?php
$allInvoices = SalesBillMapper::getClientBills($client->id, SmartDateTime::startOfYear($this->data['business_start']), new SmartDateTime('now')); $allInvoices = BillMapper::getAll()
->with('type')
->with('type/l11n')
->where('client', $client->id)
->where('type/l11n/language', $this->response->header->l11n->language)
->where('billDate', SmartDateTime::startOfYear($this->data['business_start']), '>=')
->where('billDate', new \DateTime('now'), '<=')
->execute();
$count = 0; $count = 0;
/** @var \Modules\Billing\Models\Bill $invoice */ /** @var \Modules\Billing\Models\Bill $invoice */

View File

@ -25,7 +25,8 @@
"Navigation": "*", "Navigation": "*",
"Editor": "*", "Editor": "*",
"Media": "*", "Media": "*",
"Admin": "*" "Admin": "*",
"Search": "*"
}, },
"load": [ "load": [
{ {