diff --git a/ajax/manufacturers/create/newManufacturer.php b/ajax/manufacturers/create/newManufacturer.php new file mode 100644 index 0000000000000000000000000000000000000000..e6dcd86bd95d687e50c64c18fd2bbadf04b9c0cb --- /dev/null +++ b/ajax/manufacturers/create/newManufacturer.php @@ -0,0 +1,50 @@ +<?php + +use QUI\ERP\Manufacturers; +use QUI\Utils\Security\Orthos; +use QUI\ERP\Exception as ERPException; + +/** + * Create a new manufacturer users + * + * @param string $manufacturerId + * @param array $address + * @param array $groups + * @return integer - New user ID + */ +QUI::$Ajax->registerFunction( + 'package_quiqqer_erp_ajax_manufacturers_create_newManufacturer', + function ($manufacturerId, $address, $groupIds) { + $address = Orthos::clearArray(\json_decode($address, true)); + $groupIds = Orthos::clearArray(\json_decode($groupIds, true)); + $manufacturerId = Orthos::clear($manufacturerId); + + try { + $User = Manufacturers::createManufacturer($manufacturerId, $address, $groupIds); + } catch (ERPException $Exception) { + QUI\System\Log::writeDebugException($Exception); + throw $Exception; + } catch (\Exception $Exception) { + QUI\System\Log::writeException($Exception); + + throw new ERPException([ + 'quiqqer/erp', + 'exception.ajax.manufacturers.create.newManufacturer.error' + ]); + } + + QUI::getMessagesHandler()->addSuccess( + QUI::getLocale()->get( + 'quiqqer/erp', + 'message.ajax.manufacturers.create.newManufacturer.success', + [ + 'manufacturerId' => $manufacturerId + ] + ) + ); + + return $User->getId(); + }, + ['manufacturerId', 'address', 'groupIds'], + 'Permission::checkAdminUser' +); diff --git a/bin/backend/controls/manufacturers/Administration.js b/bin/backend/controls/manufacturers/Administration.js index 2744b37e5f4cee6cd6517496edb1acc56c8c9579..6663b0959e4ecc6a1f6c8f17f2156b50da9b59ad 100644 --- a/bin/backend/controls/manufacturers/Administration.js +++ b/bin/backend/controls/manufacturers/Administration.js @@ -232,7 +232,7 @@ define('package/quiqqer/erp/bin/backend/controls/manufacturers/Administration', buttons: [{ name : 'add', textimage: 'fa fa-plus', - text : QUILocale.get(lg, 'manufacturer.window.create.title'), + text : QUILocale.get(lg, 'controls.manufacturers.Administration.btn.create'), events : { onClick: self.openAddWindow } @@ -320,7 +320,7 @@ define('package/quiqqer/erp/bin/backend/controls/manufacturers/Administration', */ $gridDblClick: function () { var userId = this.$Grid.getSelectedData()[0].id; - QUIPanelUtils.openUserPanel(userId); + this.$openManufacturer(userId); }, /** @@ -432,11 +432,23 @@ define('package/quiqqer/erp/bin/backend/controls/manufacturers/Administration', options = this.$Grid.options, Form = this.$SearchContainer.getElement('form'); + var sortOn = options.sortOn; + + switch (options.sortOn) { + case 'active_status': + sortOn = 'active'; + break; + + case 'usergroup_display': + sortOn = 'usergroup'; + break; + } + var params = { perPage: options.perPage || 50, page : options.page || 1, sortBy : options.sortBy, - sortOn : options.sortOn, + sortOn : sortOn, search : this.$SearchInput.value, filter : { id : Form.elements.userId.checked ? 1 : 0, @@ -522,53 +534,8 @@ define('package/quiqqer/erp/bin/backend/controls/manufacturers/Administration', this.fireEvent('manufacturerOpenBegin', [this, userId]); - require([ - 'package/quiqqer/erp/bin/backend/controls/manufacturers/manufacturer/Panel', - 'utils/Panels' - ], function (Panel, PanelUtils) { - if (self.isInWindow()) { - var Container = new Element('div', { - 'class': 'quiqqer-erp-manufacturers-administration-manufacturer', - styles : { - left : -50, - opacity: 0 - } - }).inject(self.getElm()); - - self.$ManufacturerPanel = new Panel({ - header : false, - userId : userId, - showUserButton : true, - showDeleteButton: false, - events : { - onError: function (Instance) { - if (!Instance.$User) { - self.setAttribute('manufacturerId', false); - } - } - } - }).inject(Container); - - self.fireEvent('manufacturerOpen', [this, userId, self.$ManufacturerPanel]); - - moofx(Container).animate({ - left : 0, - opacity: 1 - }, { - callback: function () { - self.$ManufacturerPanel.fireEvent('show'); - self.fireEvent('manufacturerOpenEnd', [this, userId, self.$ManufacturerPanel]); - } - }); - - return; - } - - PanelUtils.openPanelInTasks( - new Panel({ - userId: userId - }) - ); + QUIPanelUtils.openUserPanel(userId).then(function () { + self.fireEvent('manufacturerOpenEnd', [this, userId, self.$ManufacturerPanel]); }); }, @@ -608,37 +575,37 @@ define('package/quiqqer/erp/bin/backend/controls/manufacturers/Administration', }); }, - /** - * opens the manufacturer delete window - */ - openDeleteWindow: function () { - var self = this; - - new QUIConfirm({ - title : QUILocale.get(lg, 'manufacturer.window.delete.title'), - text : QUILocale.get(lg, 'manufacturer.window.delete.text'), - information: QUILocale.get(lg, 'manufacturer.window.delete.information'), - icon : 'fa fa-trash', - texticon : 'fa fa-trash', - maxHeight : 400, - maxWidth : 600, - autoclose : false, - events : { - onSubmit: function (Win) { - Win.Loader.show(); - - var selected = self.$Grid.getSelectedData().map(function (entry) { - return entry.id; - }); - - Users.deleteUsers(selected).then(function () { - Win.close(); - self.refresh(); - }); - } - } - }).open(); - }, + ///** + // * opens the manufacturer delete window + // */ + //openDeleteWindow: function () { + // var self = this; + // + // new QUIConfirm({ + // title : QUILocale.get(lg, 'manufacturer.window.delete.title'), + // text : QUILocale.get(lg, 'manufacturer.window.delete.text'), + // information: QUILocale.get(lg, 'manufacturer.window.delete.information'), + // icon : 'fa fa-trash', + // texticon : 'fa fa-trash', + // maxHeight : 400, + // maxWidth : 600, + // autoclose : false, + // events : { + // onSubmit: function (Win) { + // Win.Loader.show(); + // + // var selected = self.$Grid.getSelectedData().map(function (entry) { + // return entry.id; + // }); + // + // Users.deleteUsers(selected).then(function () { + // Win.close(); + // self.refresh(); + // }); + // } + // } + // }).open(); + //}, //region filter diff --git a/bin/backend/controls/manufacturers/create/Manufacturer.css b/bin/backend/controls/manufacturers/create/Manufacturer.css index 97cabbae85b399009f434274d0b1987e48256e42..42422039e477887fe6b23e93b4dee05bfe0a72a0 100644 --- a/bin/backend/controls/manufacturers/create/Manufacturer.css +++ b/bin/backend/controls/manufacturers/create/Manufacturer.css @@ -72,3 +72,15 @@ .quiqqer-erp-manufacturers-create-manufacturerData-container table { margin-top: 20px; } + +.quiqqer-erp-manufacturers-create-manufacturerGroups-list { + margin-top: 10px !important; +} + +.quiqqer-erp-manufacturers-create-manufacturerGroups-list li { + padding: 5px 0; +} + +.quiqqer-erp-manufacturers-create-manufacturerGroups-list input { + margin: 0 5px 0 0; +} \ No newline at end of file diff --git a/bin/backend/controls/manufacturers/create/Manufacturer.html b/bin/backend/controls/manufacturers/create/Manufacturer.html index 6d2cb4bbd23348ed299520ee785e3c0b2eb9f38a..0185ce3ac4ef4adfbebb4aa8b6a44249558f4bb5 100644 --- a/bin/backend/controls/manufacturers/create/Manufacturer.html +++ b/bin/backend/controls/manufacturers/create/Manufacturer.html @@ -7,7 +7,7 @@ <label> <span>{{manufacturerNoInputHeader}}</span> - <input type="text" name="manufacturerId"/> + <input type="text" name="manufacturerId" maxlength="50"/> </label> </section> </li> @@ -24,7 +24,12 @@ <span class="field-container-item"> {{textAddressCompany}} </span> - <input type="text" name="address-company" value="" class="field-container-field"> + <input type="text" + name="address-company" + value="" + class="field-container-field" + maxlength="100" + > </label> </td> </tr> @@ -34,7 +39,12 @@ <span class="field-container-item"> {{textAddressSalutation}} </span> - <input type="text" name="address-salutation" value="" class="field-container-field"> + <input type="text" + name="address-salutation" + value="" + class="field-container-field" + maxlength="10" + > </label> </td> </tr> @@ -44,7 +54,12 @@ <span class="field-container-item"> {{textAddressFirstname}} </span> - <input type="text" name="address-firstname" value="" class="field-container-field"> + <input type="text" + name="address-firstname" + value="" + class="field-container-field" + maxlength="40" + > </label> </td> </tr> @@ -54,7 +69,12 @@ <span class="field-container-item"> {{textAddressLastname}} </span> - <input type="text" name="address-lastname" value="" class="field-container-field"> + <input type="text" + name="address-lastname" + value="" + class="field-container-field" + maxlength="40" + > </label> </td> </tr> @@ -100,6 +120,16 @@ </label> </td> </tr> + <tr> + <td> + <label class="field-container"> + <span class="field-container-item"> + {{textAddressEmail}} + </span> + <input type="text" name="address-email" value="" class="field-container-field"> + </label> + </td> + </tr> </table> </div> </section> diff --git a/bin/backend/controls/manufacturers/create/Manufacturer.js b/bin/backend/controls/manufacturers/create/Manufacturer.js index 0755c2f442365e02cafe04deaa2d0339da8c8780..f4fcca906ab6c73b970f6071cae51d076594e69c 100644 --- a/bin/backend/controls/manufacturers/create/Manufacturer.js +++ b/bin/backend/controls/manufacturers/create/Manufacturer.js @@ -1,6 +1,13 @@ /** + * Creation process for new manufacturer user + * * @module package/quiqqer/erp/bin/backend/controls/manufacturers/create/Manufacturer * @author www.pcsg.de (Patrick Müller) + * + * @event onLoad [this] - Fires when the control is fully loaded + * @event onCreateManufacturerBegin [this] - Fires right before the create request is sent to the server + * @event onCreateManufacturerEnd [this, manufacturerId] - Fires if the create requests finished successfully + * @event onCreateManufacturerError [this] - Fires if the create requests aborts due to an error */ define('package/quiqqer/erp/bin/backend/controls/manufacturers/create/Manufacturer', [ @@ -29,16 +36,18 @@ define('package/quiqqer/erp/bin/backend/controls/manufacturers/create/Manufactur Binds: [ '$onInject', 'next', - 'previous' + 'previous', + '$onGroupSelectChange' ], initialize: function (options) { this.parent(options); - this.$Container = null; - this.$List = null; - this.$Form = null; - this.$GroupList = null; + this.$Container = null; + this.$List = null; + this.$Form = null; + this.$GroupList = null; + this.$groupInputs = null; this.addEvents({ onInject: this.$onInject @@ -74,9 +83,7 @@ define('package/quiqqer/erp/bin/backend/controls/manufacturers/create/Manufactur textAddressZIP : QUILocale.get('quiqqer/quiqqer', 'zip'), textAddressCity : QUILocale.get('quiqqer/quiqqer', 'city'), textAddressCountry : QUILocale.get('quiqqer/quiqqer', 'country'), - - textGroup : QUILocale.get(lg, lgPrefix + 'textGroup'), - textGroups: QUILocale.get(lg, lgPrefix + 'textGroups'), + textAddressEmail : QUILocale.get('quiqqer/quiqqer', 'email'), previousButton: QUILocale.get(lg, lgPrefix + 'previousButton'), nextButton : QUILocale.get(lg, lgPrefix + 'nextButton') @@ -153,11 +160,14 @@ define('package/quiqqer/erp/bin/backend/controls/manufacturers/create/Manufactur new Element('li', { html: '<label>' + '<input type="checkbox" data-id="' + Group.id + '"/>' + - '<span>' + Group.name + '</span>' + + '<span>' + Group.name + ' (' + Group.id + ')</span>' + '</label>' }).inject(self.$GroupList); } + self.$groupInputs = self.$GroupList.getElements('input'); + self.$groupInputs.addEvent('change', self.$onGroupSelectChange); + // Country list var countries = result[1]; var CountrySelect = self.$Elm.getElement('[name="address-country"]'); @@ -188,9 +198,7 @@ define('package/quiqqer/erp/bin/backend/controls/manufacturers/create/Manufactur var manufacturerId = elements.manufacturerId.value; var groupIds = []; - var groupInputs = this.$GroupList.getElement('input'); - - groupInputs.forEach(function (Input) { + this.$groupInputs.forEach(function (Input) { if (Input.checked) { groupIds.push(Input.get('data-id')); } @@ -204,20 +212,29 @@ define('package/quiqqer/erp/bin/backend/controls/manufacturers/create/Manufactur 'street_no' : elements['address-street_no'].value, 'zip' : elements['address-zip'].value, 'city' : elements['address-city'].value, - 'country' : elements['address-country'].value + 'country' : elements['address-country'].value, + 'email' : elements['address-email'].value }; this.fireEvent('createManufacturerBegin', [this]); - QUIAjax.post('package_quiqqer_manufacturer_ajax_backend_create_createManufacturer', function (manufacturerId) { + QUIAjax.post('package_quiqqer_erp_ajax_manufacturers_create_newManufacturer', function (manufacturerId) { self.fireEvent('createManufacturerEnd', [self, manufacturerId]); }, { 'package' : 'quiqqer/erp', manufacturerId: manufacturerId, address : JSON.encode(Address), - groupIds : JSON.encode(groupIds) - }, function (e) { - console.log("TODO: hide loader"); + groupIds : JSON.encode(groupIds), + onError : function () { + self.fireEvent('createManufacturerError', [self]); + + // Not pretty but sufficient for now + self.previous().then(function () { + self.previous(); + }).then(function () { + self.showManufacturerNumber(); + }); + } }); }, @@ -240,8 +257,12 @@ define('package/quiqqer/erp/bin/backend/controls/manufacturers/create/Manufactur // change last step button if (newTop - height <= scrollHeight * -1) { - this.$Next.set('html', QUILocale.get(lg, 'window.manufacturer.creation.create')); + this.$Next.set( + 'html', + QUILocale.get(lg, 'controls.manufacturers.create.Manufacturer.tpl.createButton') + ); this.$Next.set('data-last', 1); + this.$Next.disabled = true; // Disable "create" button until at least one manufacturer group is selected } // check if last step @@ -269,8 +290,9 @@ define('package/quiqqer/erp/bin/backend/controls/manufacturers/create/Manufactur var height = this.$Container.getSize().y; var newTop = this.$roundToStepPos(top + height); - this.$Next.set('html', QUILocale.get(lg, 'window.manufacturer.creation.next')); + this.$Next.set('html', QUILocale.get(lg, 'controls.manufacturers.create.Manufacturer.tpl.nextButton')); this.$Next.set('data-last', null); + this.$Next.disabled = false; if (newTop > 0) { newTop = 0; @@ -297,6 +319,22 @@ define('package/quiqqer/erp/bin/backend/controls/manufacturers/create/Manufactur return pos * height * -1; }, + /** + * Triggers if the user (de)selects a manufacturer group + */ + $onGroupSelectChange: function () { + for (var i = 0, len = this.$groupInputs.length; i < len; i++) { + var Input = this.$groupInputs[i]; + + if (Input.checked) { + this.$Next.disabled = false; + return; + } + } + + this.$Next.disabled = true; + }, + /** * Show the manufacturer number step */ diff --git a/bin/backend/controls/manufacturers/create/ManufacturerWindow.js b/bin/backend/controls/manufacturers/create/ManufacturerWindow.js index 08314614bbf6e4cfe0db813a83637fd47a5183d8..5c1884443b4e7039ce5b26734c8f7da9b5e5cee9 100644 --- a/bin/backend/controls/manufacturers/create/ManufacturerWindow.js +++ b/bin/backend/controls/manufacturers/create/ManufacturerWindow.js @@ -11,7 +11,7 @@ define('package/quiqqer/erp/bin/backend/controls/manufacturers/create/Manufactur ], function (QUIPopup, QUILocale, CreateManufacturer) { "use strict"; - var lg = 'quiqqer/manufacturer'; + var lg = 'quiqqer/erp'; return new Class({ @@ -23,9 +23,10 @@ define('package/quiqqer/erp/bin/backend/controls/manufacturers/create/Manufactur ], options: { - maxHeight: 700, - maxWidth : 600, - buttons : false + maxHeight : 700, + maxWidth : 600, + buttons : false, + backgroundClosable: false }, initialize: function (options) { @@ -63,6 +64,10 @@ define('package/quiqqer/erp/bin/backend/controls/manufacturers/create/Manufactur onCreateManufacturerEnd: function (Instance, manufacturerId) { self.fireEvent('submit', [self, manufacturerId]); self.close(); + }, + + onCreateManufacturerError: function () { + self.Loader.hide(); } } }).inject(this.getContent()); diff --git a/locale.xml b/locale.xml index 45d4ecc857668eb3763fc6cd603fe21f0794e01f..0896b5819795415acb48945fca4f14e29d76790a 100644 --- a/locale.xml +++ b/locale.xml @@ -203,17 +203,49 @@ <de><![CDATA[Artikel ersetzen]]></de> <en><![CDATA[Replace article]]></en> </locale> + + <!-- Permissions --> + <locale name="permission.quiqqer.erp_manufacturers._header"> + <de><![CDATA[Shop - Hersteller]]></de> + <en><![CDATA[Shop - Manufacturers]]></en> + </locale> + <locale name="permission.quiqqer.erp_manufacturers.create"> + <de><![CDATA[Darf neue Hersteller anlegen]]></de> + <en><![CDATA[Is allowed to create new manufacturers]]></en> + </locale> + <locale name="permission.quiqqer.erp_manufacturers.view"> + <de><![CDATA[Darf die Hersteller-Verwaltung ansehen]]></de> + <en><![CDATA[Is allowed to view the manufacturer management]]></en> + </locale> + + <!-- Menu --> + <locale name="menu.erp.title"> + <de><![CDATA[Shop]]></de> + <en><![CDATA[Shop]]></en> + </locale> </groups> <groups name="quiqqer/erp" datatype="php"> + <locale name="message.ajax.manufacturers.create.newManufacturer.success" html="true"> + <de><![CDATA[Hersteller <b>[manufacturerId]</b> wurde erfolgreich erstellt.]]></de> + <en><![CDATA[Manufacturer <b>[manufacturerId]</b> was created successfully.]]></en> + </locale> + <locale name="exception.ajax.output.sendMail.error"> <de> <![CDATA[Leider ist beim E-Mail-Verand ein unerwarteter Fehler aufgetreten. Bitte wiederholen Sie den Vorgang, prüfen Sie die Fehler-Logs oder kontaktieren Sie einen Administator.]]></de> <en> <![CDATA[Unfortunately, an unexpected error has occurred when sending the e-mail. Please repeat the process, check the error logs or contact an administrator.]]></en> </locale> - + <locale name="exception.Manufacturers.createManufacturer.id_already_exists"> + <de><![CDATA[Die eingegebene Herstellernummer ist bereits vergeben. Bitte wählen Sie eine andere Herstellernummer.]]></de> + <en><![CDATA[The entered manufacturer number is already assigned. Please select a different manufacturer number.]]></en> + </locale> + <locale name="exception.ajax.manufacturers.create.newManufacturer.error"> + <de><![CDATA[Bei Erstellung des Herstellers ist ein unerwarteter Fehler aufgetreten. Bitte wiederholen Sie den Vorgang oder kontaktieren Sie einen Administrator.]]></de> + <en><![CDATA[An unexpected error occurred when creating the manufacturer. Please repeat the process or contact an administrator.]]></en> + </locale> <locale name="user.settings.title"> <de><![CDATA[Rechnungsdaten]]></de> <en><![CDATA[Billing Details]]></en> @@ -782,10 +814,59 @@ <de><![CDATA[bis]]></de> <en><![CDATA[to]]></en> </locale> + <locale name="controls.manufacturers.Administration.btn.create"> + <de><![CDATA[Neuer Hersteller]]></de> + <en><![CDATA[New manufacturer]]></en> + </locale> <locale name="controls.manufacturers.create.ManufacturerWindow.title"> <de><![CDATA[Neuen Hersteller anlegen]]></de> <en><![CDATA[Create new manufacturer]]></en> </locale> + <locale name="controls.manufacturers.create.Manufacturer.tpl.manufacturerNoHeader"> + <de><![CDATA[Neuen Hersteller anlegen]]></de> + <en><![CDATA[Create new manufacturer]]></en> + </locale> + <locale name="controls.manufacturers.create.Manufacturer.tpl.manufacturerNoText" html="true"> + <de><![CDATA[Bitte legen Sie eine Herstellernummer bzw. -bezeichner fest.<br/>Diese Angabe kann später jederzeit geändert werden.]]></de> + <en><![CDATA[Please define a unique manufacturer number / identifier.<br/>This number can be changed later at any time.]]></en> + </locale> + <locale name="controls.manufacturers.create.Manufacturer.tpl.manufacturerNoInputHeader"> + <de><![CDATA[Herstellernummer / -bezeichner]]></de> + <en><![CDATA[Manufacturer number / identifier]]></en> + </locale> + <locale name="controls.manufacturers.create.Manufacturer.tpl.manufacturerDataHeader"> + <de><![CDATA[Herstellerdaten]]></de> + <en><![CDATA[Manufacturer data]]></en> + </locale> + <locale name="controls.manufacturers.create.Manufacturer.tpl.manufacturerDataText"> + <de><![CDATA[Legen Sie hier die grundlegenden Herstellerdaten fest. Diese Daten können später noch geändert werden.]]></de> + <en><![CDATA[Define the basic manufacturer data here. These data can be changed later.]]></en> + </locale> + <locale name="controls.manufacturers.create.Manufacturer.tpl.manufacturerGroupsHeader"> + <de><![CDATA[Herstellergruppen]]></de> + <en><![CDATA[Manufacturer groups]]></en> + </locale> + <locale name="controls.manufacturers.create.Manufacturer.tpl.manufacturerGroupsText"> + <de><![CDATA[Bitte wählen Sie mindestens eine Hersteller-Gruppe aus, zu der der neue Hersteller zugewiesen wird.]]></de> + <en><![CDATA[Please select at least one manufacturer group to which the new manufacturer will be assigned.]]></en> + </locale> + <locale name="controls.manufacturers.create.Manufacturer.tpl.previousButton"> + <de><![CDATA[Zurück]]></de> + <en><![CDATA[Back]]></en> + </locale> + <locale name="controls.manufacturers.create.Manufacturer.tpl.nextButton"> + <de><![CDATA[Weiter]]></de> + <en><![CDATA[Continue]]></en> + </locale> + <locale name="controls.manufacturers.create.Manufacturer.tpl.createButton"> + <de><![CDATA[Hersteller anlegen]]></de> + <en><![CDATA[Create manufacturer]]></en> + </locale> + <locale name="controls.manufacturers.create.ManufacturerWindow.title"> + <de><![CDATA[Neuer Hersteller]]></de> + <en><![CDATA[New manufacturer]]></en> + </locale> + </groups> </locales> diff --git a/menu.xml b/menu.xml index df313d7bbc015eb17770b2d165cad4b77e6b72aa..3edccf38bd1f341448b6f600fdc4a9603038061a 100644 --- a/menu.xml +++ b/menu.xml @@ -1,11 +1,17 @@ <?xml version="1.0" encoding="UTF-8"?> <menu> - <item parent="/apps/" + <item parent="/extras/" + name="erp" + icon="fa fa-sun-o" + > + <locale group="quiqqer/erp" var="menu.erp.title" /> + </item> + <item parent="/extras/erp/" name="manufacturers" require="package/quiqqer/erp/bin/backend/controls/manufacturers/AdministrationPanel" icon="fa fa-wrench" - permission="quiqqer.erp.manufacturers.manage" + permission="quiqqer.erp_manufacturers.view" > <locale group="quiqqer/erp" var="menu.erp.manufacturers.title"/> </item> diff --git a/permissions.xml b/permissions.xml new file mode 100644 index 0000000000000000000000000000000000000000..c1e186e7a85de88ac25729ad59bc2ef7e9ce779f --- /dev/null +++ b/permissions.xml @@ -0,0 +1,11 @@ +<?xml version="1.0" encoding="UTF-8"?> +<permissions> + + <permission name="quiqqer.erp_manufacturers.view" type="bool"> + <defaultvalue>1</defaultvalue> + </permission> + <permission name="quiqqer.erp_manufacturers.create" type="bool"> + <defaultvalue>0</defaultvalue> + </permission> + +</permissions> diff --git a/src/QUI/ERP/Manufacturers.php b/src/QUI/ERP/Manufacturers.php index b98d1bcddfad3e40656aa76214b9f6fe946e9442..7bd04fba482e8d5e73c53987420afc335b879fb7 100644 --- a/src/QUI/ERP/Manufacturers.php +++ b/src/QUI/ERP/Manufacturers.php @@ -41,12 +41,114 @@ public static function getManufacturerGroupIds() return $groupIds; } + /** + * Create a new manufacturer user + * + * @param string $manufacturerId - QUIQQER username + * @param array $address + * @param array $groupIds - QUIQQER group IDs of manufacturer groups + * + * @return QUI\Users\User + * + * @throws Exception + * @throws QUI\Exception + * @throws QUI\Permissions\Exception + */ + public static function createManufacturer(string $manufacturerId, array $address = [], array $groupIds = []) + { + QUI\Permissions\Permission::checkPermission('quiqqer.erp_manufacturers.create'); + + $Users = QUI::getUsers(); + $manufacturerId = $Users::clearUsername($manufacturerId); + + // Check ID + if ($Users->usernameExists($manufacturerId)) { + throw new Exception([ + 'quiqqer/erp', + 'exception.Manufacturers.createManufacturer.id_already_exists', + [ + 'userId' => $manufacturerId + ] + ]); + } + + $SystemUser = $Users->getSystemUser(); + $User = $Users->createChild($manufacturerId, $SystemUser); + + if (!empty($address)) { + try { + $Address = $User->getStandardAddress(); + } catch (QUI\Exception $Exception) { + $Address = $User->addAddress(); + } + + $needles = [ + 'salutation', + 'firstname', + 'lastname', + 'company', + 'delivery', + 'street_no', + 'zip', + 'city', + 'country' + ]; + + foreach ($needles as $needle) { + if (!isset($address[$needle])) { + $address[$needle] = ''; + } + } + + $Address->setAttribute('salutation', $address['salutation']); + $Address->setAttribute('firstname', $address['firstname']); + $Address->setAttribute('lastname', $address['lastname']); + $Address->setAttribute('company', $address['company']); + $Address->setAttribute('delivery', $address['delivery']); + $Address->setAttribute('street_no', $address['street_no']); + $Address->setAttribute('zip', $address['zip']); + $Address->setAttribute('city', $address['city']); + $Address->setAttribute('country', $address['country']); + + // E-Mail + if (!empty($address['email'])) { + $User->setAttribute('email', $address['email']); + $Address->addMail($address['email']); + } + + $Address->save(); + + if (!$User->getAttribute('firstname') || $User->getAttribute('firstname') === '') { + $User->setAttribute('firstname', $address['firstname']); + } + + if (!$User->getAttribute('lastname') || $User->getAttribute('lastname') === '') { + $User->setAttribute('lastname', $address['lastname']); + } + } + + // groups + $manufacturerGroupIds = self::getManufacturerGroupIds(); + + foreach ($groupIds as $groupId) { + $groupId = (int)$groupId; + + if (\in_array($groupId, $manufacturerGroupIds)) { + $User->addToGroup($groupId); + } + } + + $User->save($SystemUser); + + return $User; + } + /** * Search manufacturers * * @param array $searchParams * @param bool $countOnly (optional) - get count for search result only [default: false] - * @return int[]|int - membership user IDs or count + * @return int[]|int - Manufacturer user IDs or count */ public static function search(array $searchParams, $countOnly = false) { @@ -72,7 +174,7 @@ public static function search(array $searchParams, $countOnly = false) foreach (self::getManufacturerGroupIds() as $groupId) { $whereOr[] = "u.`usergroup` LIKE :group".$gc; - $bind = 'group'.$gc; + $bind = 'group'.$gc++; $binds[$bind] = [ 'value' => '%,'.$groupId.',%',