Updated WarehouseOrder and WarehouseOrderRequest

This commit is contained in:
Luca Haid
2025-03-06 10:29:48 +01:00
parent 9ce1c2a4fe
commit a4df764a49
21 changed files with 1236 additions and 721 deletions

View File

@@ -1,107 +1,56 @@
<?php
//TODO: enable switching distributors in the order preview
<?php /** @noinspection PhpVoidFunctionResultUsedInspection */
class WarehouseOrderRequestController extends TTCrud {
protected string $headerTitle = 'Bestellwünsche';
protected string $createText = 'Bestellwunsch erstellen';
protected string $createText = 'Neuer Bestellwunsch';
protected string $singleText = 'Bestellwunsch';
//@formatter:off
protected array $columns = [
['key' => 'id', 'text' => 'ID', 'modal' => false, 'table' => false],
['key' => 'ware',
'text' => 'Ware',
'required' => true,
'type' => 'autocomplete',
'table' => ['class' => 'text-nowrap', 'filter' => 'autocomplete'],
'modal' => [
'apiUrl' => 'WarehouseArticle/autocomplete',
'type' => 'autocomplete',
'returnText' => true]],
['key' => 'anzahl', 'text' => 'Anzahl', 'required' => true, 'type' => 'number'],
['key' => 'verwendungszweck', 'text' => 'Verwendungszweck', 'required' => true],
['key' => 'create', 'text' => 'Beauftragt am', 'required' => true, 'modal' => false, 'table' => ['filter' => 'datepicker']],
['key' => 'createBy',
'text' => 'Beauftragt von',
'required' => true,
'table' => ['filter' => 'select'],
'modal' => ['visible' => false, 'type' => 'select', 'items' => []]],
['key' => 'distributorId',
'text' => 'Lieferant',
'required' => false,
'type' => 'autocomplete',
'table' => ['class' => 'text-nowrap', 'filter' => 'autocomplete'],
'modal' => [
'apiUrl' => 'WarehouseDistributor/autocomplete',
'type' => 'autocomplete']],
['key' => 'order', 'text' => 'Bestellt am', 'required' => false, 'type' => 'datepicker', 'table' => ['filter' => 'datepicker']],
['key' => 'orderBy', 'text' => 'Bestellt von', 'required' => false, 'table' => ['filter' => 'select'], 'modal' => ['type' => 'select', 'items' => []]],
['key' => 'takeOver', 'text' => 'Übernommen am', 'required' => false, 'type' => 'datepicker', 'table' => ['filter' => 'datepicker']],
['key' => 'takeOverBy',
'text' => 'Übernommen von',
'required' => false,
'table' => ['filter' => 'select'],
'modal' => ['type' => 'select', 'items' => []]],
['key' => 'warehouseLocation', 'text' => 'Lagerort', 'required' => false, 'type' => 'varchar'],
['key' => 'canceled',
'text' => 'Storniert',
'required' => false,
'modal' => ['visible' => false, 'type' => 'select', 'items' => [['value' => 0, 'text' => 'Nein'], ['value' => 1, 'text' => 'Ja']]],
'table' => ['filter' => 'select']],
['key' => 'note', 'text' => 'Notiz', 'required' => false, 'type' => 'textarea'],
['key' => 'actions',
'text' => 'Aktionen',
'required' => false,
'modal' => false,
'table' => ['filter' => false, 'sortable' => false, 'class' => 'text-center']],
['key' => 'purpose', 'text' => 'Verwendungszweck', 'required' => true],
['key' => 'positions', 'text' => 'Positionen', 'required' => true, 'modal' => ['type' => 'positions-manager', 'config' => [
'header' => 'Positionen',
'fields' => [
'articleId' => [
'apiUrl' => '/WarehouseArticle/autoComplete',
'type' => 'autocomplete',
'emitDisplayValue' => true,
'customFieldReference' => 'WarehouseArticle',
'label' => 'Artikel',
],
'amount' => ['type' => 'input', 'label' => 'Menge', 'inputType' => 'number'],
'purpose' => ['type' => 'input', 'label' => 'Zweck'],
],
'validateFormOptions' => [
['key' => 'articleId', 'message' => 'Bitte füllen Sie den Artikel aus'],
['key' => 'amount', 'message' => 'Bitte füllen Sie die Menge aus'],
['key' => 'purpose', 'message' => 'Bitte füllen Sie den Zweck aus'],
],
]], 'table' => false],
['key' => 'linkedOrderIds', 'text' => 'Verlinkte Bestellung', 'modal' => false],
['key' => 'createBy', 'text' => 'Erstellt von', 'required' => true, 'modal' => ['visible' => false, 'type' => 'select'], 'table' => ['filter' => 'select']],
['key' => 'create', 'text' => 'Erstellt am', 'required' => true, 'modal' => false],
['key' => 'cancelled', 'text' => 'Storniert', 'modal' => ['visible' => false, 'type' => 'icon-select', 'items' => [
['value' => 0, 'text' => 'Bestellwunsch nicht storniert', 'icon' => 'fa-regular fa-circle-check text-success'],
['value' => 1, 'text' => 'Bestellwunsch storniert', 'icon' => 'fa-regular fa-circle-xmark text-danger']]], 'table' => ['filter' => 'iconSelect']
],
['key' => 'actions', 'text' => 'Aktionen', 'required' => false, 'modal' => false, 'table' => ['filter' => false, 'sortable' => false, 'class' => 'text-center']],
];
//@formatter:on
protected array $permissionCheck = ['WarehouseUser'];
protected array $additionalActions = [['key' => 'openHistory', 'title' => 'Historie', 'class' => 'fas fa-history text-primary']];
protected array $infoMessages = ['create' => 'Bestellwunsch wurde erstellt.',
'update' => 'Bestellwunsch wurde aktualisiert',
'delete' => 'Bestellwunsch wurde gelöscht',
'noChanges' => 'Keine Änderungen',];
protected array $additionalJSVariables = ['BASE_URL' => '/WarehouseOrderRequest', 'WAREHOUSE_ADMIN' => true];
protected array $additionalActions = [
['key' => 'openHistory', 'title' => 'Historie', 'class' => 'fas fa-history text-primary'],
['key' => 'createLog', 'title' => 'Log-Eintrag erstellen', 'class' => 'fas fa-plus text-primary'],
];
protected function prepareCrudConfig() {
// Fill Users in createBy column
$userArray = array_map(function ($user) {
return ['value' => intval($user->id), 'text' => $user->name];
}, UserModel::search(['employee' => true]));
$createByColumn = array_search('createBy', array_column($this->columns, 'key'));
$this->columns[$createByColumn]['modal']['items'] = $userArray;
$orderByColumn = array_search('orderBy', array_column($this->columns, 'key'));
$this->columns[$orderByColumn]['modal']['items'] = $userArray;
$takeOverByColumn = array_search('takeOverBy', array_column($this->columns, 'key'));
$this->columns[$takeOverByColumn]['modal']['items'] = $userArray;
// if this user can WarehouseAdmin is false then set modal false to warehouselocation, takeOverBy, takeOver, orderBy, order
if (!$this->user->can(["WarehouseAdmin"])) {
$warehouselocationColumn = array_search('warehouseLocation', array_column($this->columns, 'key'));
$this->columns[$warehouselocationColumn]['modal']['visible'] = false;
$takeOverByColumn = array_search('takeOverBy', array_column($this->columns, 'key'));
$this->columns[$takeOverByColumn]['modal']['visible'] = false;
$takeOverColumn = array_search('takeOver', array_column($this->columns, 'key'));
$this->columns[$takeOverColumn]['modal']['visible'] = false;
$orderByColumn = array_search('orderBy', array_column($this->columns, 'key'));
$this->columns[$orderByColumn]['modal']['visible'] = false;
$orderColumn = array_search('order', array_column($this->columns, 'key'));
$this->columns[$orderColumn]['modal']['visible'] = false;
}
$this->additionalJSVariables['user_id'] = $this->user->id;
if (!$this->user->can('WarehouseAdmin')) {
$this->additionalJSVariables['WAREHOUSE_ADMIN'] = false;
}
}
protected function customAutoCompleteWare($value) {
if (!is_numeric($value)) return ['id' => $value, 'title' => $value];
$article = WarehouseArticleModel::get(intval($value));
return ['id' => $article->id, 'title' => $article->title];
$this->additionalJSVariables = [
'user_id' => $this->user->id,
'BASE_URL' => '/WarehouseOrderRequest',
'WAREHOUSE_ADMIN' => $this->user->can('WarehouseAdmin')
];
}
protected function beforeUpdate($postData): bool {
@@ -110,62 +59,73 @@ class WarehouseOrderRequestController extends TTCrud {
}
protected function afterCreate($postData): void {
if ($_SERVER['HTTP_HOST'] == 'localhost') return;
if (is_numeric($postData['ware'])) {
$article = WarehouseArticleModel::get(intval($postData['ware']));
$postData['ware'] = $article->title;
}
if ($_SERVER['HTTP_HOST'] === 'localhost') return;
die("TODO we need this to work with new positions manager");
$email = new Emailnotification();
$postData['ware'] = is_numeric($postData['ware']) ? WarehouseArticleModel::get((int) $postData['ware'])->title : $postData['ware'];
$paddedId = str_pad($postData['id'], 5, '0', STR_PAD_LEFT);
$email->setSubject("TheTool: Neue Interne Bestellung #$paddedId");
$body = "Hallo,\n\nes wurde eine neue interne Bestellung erstellt.\n\n";
$body .= "Bestellnummer: #$paddedId\n";
$body .= "Ware: " . $postData['ware'] . "\n";
$body .= "Anzahl: " . $postData['anzahl'] . "\n";
$body .= "Verwendungszweck: " . $postData['verwendungszweck'] . "\n";
$body .= "Beauftragt von: " . $this->user->name . "\n";
$body .= "Beauftragt am: " . date('d.m.Y H:i') . "\n";
$body .= "Notiz: " . $postData['note'] . "\n\n";
$email->setSubject("TheTool: Neue Interne Bestellung #$paddedId")
->setBody(<<<BODY
Hallo,
$email->setBody($body);
$email->setFrom(TT_OUTGOING_EMAIL_2FA, TT_OUTGOING_EMAIL_2FA);
$email->setTo("einkauf@xinon.at", "Einkauf");
$email->send();
es wurde eine neue interne Bestellung erstellt.
Bestellnummer: #$paddedId
Ware: {$postData['ware']}
Anzahl: {$postData['anzahl']}
Verwendungszweck: {$postData['verwendungszweck']}
Beauftragt von: {$this->user->name}
Beauftragt am: {date('d.m.Y H:i')}
Notiz: {$postData['note']}
BODY
)
->setFrom(TT_OUTGOING_EMAIL_2FA, TT_OUTGOING_EMAIL_2FA)
->setTo("einkauf@xinon.at", "Einkauf")
->send();
}
protected function cancelAction() {
$id = $this->request->id;
$cancel = $this->request->cancel;
$id = filter_var($this->request->id, FILTER_VALIDATE_INT);
$cancel = filter_var($this->request->cancel, FILTER_VALIDATE_INT, ['options' => ['min_range' => 0, 'max_range' => 1]]);
if (!is_numeric($id) || !is_numeric($cancel)) {
self::returnJson(['error' => 'Invalid request']);
if (!$id || $cancel === false) self::returnJson(['error' => 'Ungültige Anfrage']);
if (!(WarehouseOrderRequestModel::get($id))) self::returnJson(['error' => 'Bestellwunsch nicht gefunden']);
WarehouseOrderRequestModel::update(['id' => $id, 'canceled' => $cancel]);
self::returnJson(['success' => true]);
}
protected function createNewLogAction() {
$postData = json_decode(file_get_contents('php://input'), true);
if (empty($postData['orderRequestId']) || empty($postData['note'])) {
self::returnJson(['error' => 'Order Request ID is required']);
return;
}
$order = (array) WarehouseOrderRequestModel::get($id);
WarehouseLogModel::create([
"table" => "WarehouseOrderRequest",
"rowId" => intval($postData['orderRequestId']),
"type" => 'noChanges',
"message" => $postData['note'],
"createBy" => intval($this->user->id),
"create" => time()
]);
self::returnJson(['success' => 'Log entry created']);
}
if (empty($order)) {
self::returnJson(['error' => 'Order not found']);
protected function getLogByIdAction() {
$orderRequestId = $this->request->orderRequestId;
if (empty($orderRequestId)) {
self::returnJson(['error' => 'Order ID is required']);
return;
}
// $cancel is either 0 for uncancelling or 1 for cancelling
if ($cancel == 1) {
$order['canceled'] = 1;
} else {
$order['canceled'] = 0;
}
$order['id'] = $id;
if (!WarehouseOrderRequestModel::update($order)) {
self::returnJson(['error' => 'Error updating order']);
}
self::returnJson(['success' => true, 'message' => 'Order updated']);
$log = WarehouseLogModel::getAll(['table' => 'WarehouseOrderRequest', 'rowId' => $orderRequestId]);
self::returnJson($log);
}
protected function getHistoryAction() {