mirror of
https://github.com/Karaka-Management/oms-ClientManagement.git
synced 2026-01-11 07:18:41 +00:00
update
This commit is contained in:
parent
16aec56e72
commit
c717069fa9
43
Admin/Install/Search.php
Normal file
43
Admin/Install/Search.php
Normal 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']);
|
||||||
|
}
|
||||||
|
}
|
||||||
32
Admin/Install/SearchCommands.php
Normal file
32
Admin/Install/SearchCommands.php
Normal 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,
|
||||||
|
],
|
||||||
|
],
|
||||||
|
],
|
||||||
|
];
|
||||||
|
|
@ -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": {
|
||||||
|
|
|
||||||
|
|
@ -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",
|
||||||
|
|
|
||||||
|
|
@ -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,
|
||||||
|
|
|
||||||
|
|
@ -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();
|
||||||
|
|
|
||||||
111
Controller/SearchController.php
Normal file
111
Controller/SearchController.php
Normal 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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -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 */
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user