Skip to content
Code-Schnipsel Gruppen Projekte
Commit e9cbeb50 erstellt von Henning Leutz's avatar Henning Leutz :martial_arts_uniform:
Dateien durchsuchen

feat: Adresse anlegen wenn der Benutzer keine Adresse hat

Übergeordneter cdacf3ad
Keine zugehörigen Branchen gefunden
Keine zugehörigen Tags gefunden
Keine zugehörigen Merge Requests gefunden
<?php
/**
* This file contains package_quiqqer_invoice_ajax_address_create
*/
/**
* Creates a new invoice address for the user
*
* @param int $userId
* @param array $data
* @return string
*/
QUI::$Ajax->registerFunction(
'package_quiqqer_invoice_ajax_address_create',
function ($userId, $data) {
$User = QUI::getUsers()->get($userId);
$Address = $User->addAddress(
json_decode($data, true)
);
$User->setAttribute('quiqqer.erp.address', $Address->getId());
$User->save();
},
array('userId', 'data'),
'Permission::checkAdminUser'
);
......@@ -84,7 +84,7 @@ define('package/quiqqer/invoice/bin/backend/controls/InvoiceArticleList', [
titleQuantity : QUILocale.get(lg, 'invoice.products.quantity'),
titleUnitPrice : QUILocale.get(lg, 'invoice.products.unitPrice'),
titlePrice : QUILocale.get(lg, 'invoice.products.price'),
titleVAT : QUILocale.get(lg, 'invoice.products.vat'),
titleVAT : QUILocale.get(lg, 'invoice.products.table.vat'),
titleDiscount : QUILocale.get(lg, 'invoice.products.discount'),
titleSum : QUILocale.get(lg, 'invoice.products.sum')
})
......
.quiqqer-invoice-address-create {
margin-bottom: 20px;
}
\ No newline at end of file
<div class="quiqqer-invoice-address-create">
{{{message}}}
</div>
<form>
<table class="data-table data-table-flexbox">
<thead>
<tr>
<th>
{{textData}}
</th>
</tr>
</thead>
<tbody>
<tr>
<td>
<label class="field-container">
<span class="field-container-item">
{{textCompany}}
</span>
<input type="text"
name="company"
class="field-container-field"
autofocus
/>
</label>
</td>
</tr>
<tr>
<td>
<label class="field-container">
<span class="field-container-item">
{{textSalutation}}
</span>
<input type="text"
name="salutation"
class="field-container-field"
/>
</label>
</td>
</tr>
<tr>
<td>
<label class="field-container">
<span class="field-container-item">
{{textFirstName}}
</span>
<input type="text"
name="firstname"
class="field-container-field"
/>
</label>
</td>
</tr>
<tr>
<td>
<label class="field-container">
<span class="field-container-item">
{{textLastName}}
</span>
<input type="text"
name="lastname"
value=""
class="field-container-field"
/>
</label>
</td>
</tr>
</tbody>
</table>
<table class="data-table data-table-flexbox">
<thead>
<tr>
<th colspan="2">
{{textAddress}}
</th>
</tr>
</thead>
<tbody>
<tr>
<td>
<label class="field-container">
<span class="field-container-item">
{{textStreet}}
</span>
<input type="text"
name="street_no"
value=""
class="field-container-field"
/>
</label>
</td>
</tr>
<tr>
<td>
<label class="field-container">
<span class="field-container-item">
{{textZIP}}
</span>
<input type="text"
name="zip"
value=""
class="field-container-field"
/>
</label>
</td>
</tr>
<tr>
<td>
<label class="field-container">
<span class="field-container-item">
{{textCity}}
</span>
<input type="text"
name="city"
value=""
class="field-container-field"
/>
</label>
</td>
</tr>
<tr>
<td>
<label class="field-container">
<span class="field-container-item">
{{textCountry}}
</span>
<select name="country" class="field-container-field">
<option value=""></option>
</select>
</label>
</td>
</tr>
</tbody>
</table>
</form>
\ No newline at end of file
/**
* @module package/quiqqer/invoice/bin/backend/controls/address/Create
*
* @requires qui/QUI
* @requires qui/controls/Control
* @requires Mustache
* @requires Locale
* @requires Ajax
* @requires text!package/quiqqer/invoice/bin/backend/controls/address/Create.html
*
* @event onLoad [self]
*/
define('package/quiqqer/invoice/bin/backend/controls/address/Create', [
'qui/QUI',
'qui/controls/Control',
'qui/utils/Form',
'Mustache',
'Locale',
'Ajax',
'Users',
'text!package/quiqqer/invoice/bin/backend/controls/address/Create.html',
'css!package/quiqqer/invoice/bin/backend/controls/address/Create.css'
], function (QUI, QUIControl, QUIFormUtils, Mustache, QUILocale, QUIAjax, Users, template) {
"use strict";
var lg = 'quiqqer/invoice';
var pkg = 'quiqqer/invoice';
return new Class({
Extends: QUIControl,
Type : 'package/quiqqer/invoice/bin/backend/controls/address/Create',
Binds: [
'$onInject'
],
options: {
userId: false
},
/**
* @param options
*/
initialize: function (options) {
this.parent(options);
this.$Elm = null;
this.$Form = null;
this.addEvents({
onInject: this.$onInject
});
},
/**
* Create the DOMNode Element
*
* @return {Element}
*/
create: function () {
this.parent();
this.$Elm = new Element('div', {
html: Mustache.render(template, {
message : QUILocale.get(lg, 'invoice.create.address.message'),
textData : QUILocale.get('quiqqer/quiqqer', 'data'),
textCompany : QUILocale.get('quiqqer/system', 'company'),
textSalutation: QUILocale.get('quiqqer/system', 'salutation'),
textFirstName : QUILocale.get('quiqqer/system', 'firstname'),
textLastName : QUILocale.get('quiqqer/system', 'lastname'),
textAddress : QUILocale.get('quiqqer/system', 'address'),
textStreet : QUILocale.get('quiqqer/system', 'street'),
textZIP : QUILocale.get('quiqqer/system', 'zip'),
textCity : QUILocale.get('quiqqer/system', 'city'),
textCountry : QUILocale.get('quiqqer/system', 'country')
})
});
this.$Elm.getElement('form').addEvent('submit', function (event) {
event.stop();
});
this.$Form = this.$Elm.getElement('form');
return this.$Elm;
},
/**
* event : on inject
*/
$onInject: function () {
var self = this;
var User = Users.get(this.getAttribute('userId'));
var UserData = Promise.resolve(User);
if (!User.isLoaded()) {
UserData = User.load();
}
// load countries and user data
QUIAjax.get('package_quiqqer_countries_ajax_getCountries', function (countries) {
var Countries = self.$Form.elements['country'];
for (var country in countries) {
if (!countries.hasOwnProperty(country)) {
continue;
}
new Element('option', {
html : countries[country],
value: country
}).inject(Countries);
}
UserData.then(function (User) {
var attributes = User.getAttributes();
self.$Form.elements.firstname.value = attributes.firstname;
self.$Form.elements.lastname.value = attributes.lastname;
});
self.fireEvent('load', [self]);
}, {
'package': 'quiqqer/countries',
lang : QUILocale.getCurrent()
});
},
/**
* Create the new invoice address
*
* @return {Promise}
*/
submit: function () {
var self = this,
Form = this.$Elm.getElement('form'),
data = QUIFormUtils.getFormData(Form);
return new Promise(function (resolve, reject) {
QUIAjax.post('package_quiqqer_invoice_ajax_address_create', resolve, {
package: pkg,
userId : self.getAttribute('userId'),
data : JSON.encode(data),
onError: reject
});
});
}
});
});
\ No newline at end of file
/**
* @module package/quiqqer/invoice/bin/backend/controls/address/Window
*
* @requires qui/QUI
* @requires qui/controls/windows/Popup
* @requires qui/controls/buttons/Button
* @requires package/quiqqer/invoice/bin/backend/controls/address/Create
* @requires Locale
*/
define('package/quiqqer/invoice/bin/backend/controls/address/Window', [
'qui/QUI',
'qui/controls/windows/Popup',
'qui/controls/buttons/Button',
'package/quiqqer/invoice/bin/backend/controls/address/Create',
'Locale'
], function (QUI, QUIPopup, QUIButton, Create, QUILocale) {
"use strict";
var lg = 'quiqqer/invoice';
var pkg = 'quiqqer/invoice';
return new Class({
Extends: QUIPopup,
Type : 'package/quiqqer/invoice/bin/backend/controls/address/Window',
Binds: [
'submit',
'$onOpen'
],
options: {
userId: null
},
initialize: function (options) {
this.setAttributes({
icon : 'fa fa-address-card-o',
title : QUILocale.get(lg, 'dialog.create.address.title'),
maxHeight : 600,
maxWidth : 800,
closeButton: false
});
this.parent(options);
this.$Create = null;
this.addEvents({
onOpen: this.$onOpen
});
},
/**
* event: on open
*/
$onOpen: function () {
this.getContent().set('html', '');
this.addButton(
new QUIButton({
textimage: 'fa fa-plus',
text : 'Addresse anlegen', // #locale
events : {
onClick: this.submit
}
})
);
this.$Create = new Create({
userId: this.getAttribute('userId')
}).inject(this.getContent());
},
/**
* Submit the address and create it
*
* @return {Promise}
*/
submit: function () {
var self = this;
return new Promise(function (resolve, reject) {
self.Loader.show();
self.$Create.submit().then(function (addressId, addressData) {
self.fireEvent('submit', [self, addressId, addressData]);
self.close();
resolve(addressId, addressData);
}).catch(reject);
});
}
});
});
......@@ -17,6 +17,7 @@ define('package/quiqqer/invoice/bin/backend/controls/panels/TemporaryInvoice.Use
'qui/QUI',
'qui/controls/Control',
'qui/controls/buttons/Button',
'qui/controls/windows/Popup',
'controls/users/address/Display',
'controls/users/search/Window',
'Users',
......@@ -26,11 +27,13 @@ define('package/quiqqer/invoice/bin/backend/controls/panels/TemporaryInvoice.Use
'text!package/quiqqer/invoice/bin/backend/controls/panels/TemporaryInvoice.UserData.html'
], function (QUI, QUIControl, QUIButton, AddressDisplay, UserSearch, Users, QUILocale, QUIAjax,
], function (QUI, QUIControl, QUIButton, QUIPopup,
AddressDisplay, UserSearch, Users, QUILocale, QUIAjax,
Mustache, template) {
"use strict";
var lg = 'quiqqer/invoice';
var lg = 'quiqqer/invoice';
var pkg = 'quiqqer/invoice';
return new Class({
......@@ -67,6 +70,7 @@ define('package/quiqqer/invoice/bin/backend/controls/panels/TemporaryInvoice.Use
this.$rows = [];
this.$extrasAreOpen = false;
this.$oldUserId = false;
},
......@@ -137,13 +141,16 @@ define('package/quiqqer/invoice/bin/backend/controls/panels/TemporaryInvoice.Use
/**
* Refresh the display
*
* @return {Promise}
*/
refresh: function () {
if (!this.$Elm) {
if (!this.$Elm || !this.$AddressSelect) {
return Promise.resolve();
}
var userId = this.getAttribute('userId');
var self = this,
userId = this.getAttribute('userId');
if (!userId || userId === '') {
this.$Company.set('value', '');
......@@ -161,31 +168,32 @@ define('package/quiqqer/invoice/bin/backend/controls/panels/TemporaryInvoice.Use
return [];
}
return User.getAddressList();
return self.getAddressList(User);
}).then(function (addresses) {
this.$AddressSelect.set('html', '');
console.info(addresses);
self.$AddressSelect.set('html', '');
if (!addresses.length) {
this.$AddressRow.setStyle('display', 'none');
self.$AddressRow.setStyle('display', 'none');
return;
}
// @todo rechnungsadresse auswählen wenn keine value gesetzt ist
this.$AddressRow.setStyle('display', null);
self.$AddressRow.setStyle('display', null);
for (var i = 0, len = addresses.length; i < len; i++) {
new Element('option', {
value: addresses[i].id,
html : addresses[i].text
}).inject(this.$AddressSelect);
}).inject(self.$AddressSelect);
}
var addressId = this.getAttribute('addressId');
var addressId = self.getAttribute('addressId');
this.$AddressSelect.value = addressId || addresses[0].id;
}.bind(this));
self.$AddressSelect.value = addressId || addresses[0].id;
});
},
/**
......@@ -195,17 +203,23 @@ define('package/quiqqer/invoice/bin/backend/controls/panels/TemporaryInvoice.Use
* @return {Promise}
*/
setUserId: function (userId) {
var self = this;
this.$oldUserId = this.getAttribute('userId');
this.setAttribute('userId', userId);
if (!this.$Elm) {
return Promise.resolve();
}
this.fireEvent('change', [this]);
return this.refresh().then(function () {
this.$AddressSelect.fireEvent('change');
}.bind(this));
self.fireEvent('change', [self]);
self.$AddressSelect.fireEvent('change');
}, function () {
self.setAttribute('userId', self.$oldUserId);
self.$CustomerSelect.addItem(self.$oldUserId);
});
},
/**
......@@ -256,6 +270,28 @@ define('package/quiqqer/invoice/bin/backend/controls/panels/TemporaryInvoice.Use
return User.load();
},
/**
*
* @param User
* @return {Promise}
*/
getAddressList: function (User) {
var self = this;
return new Promise(function (resolve, reject) {
return User.getAddressList().then(function (result) {
if (result.length) {
return resolve(result);
}
// create new address
return self.openCreateAddressDialog(User).then(function () {
return User.getAddressList().then(resolve);
}).catch(reject);
});
});
},
/**
* Events
*/
......@@ -283,6 +319,33 @@ define('package/quiqqer/invoice/bin/backend/controls/panels/TemporaryInvoice.Use
}.bind(this));
},
/**
* Address creation
*/
/**
*
* @param User
* @return {Promise}
*/
openCreateAddressDialog: function (User) {
return new Promise(function (resolve, reject) {
require([
'package/quiqqer/invoice/bin/backend/controls/address/Window'
], function (Win) {
new Win({
userId: User.getId(),
events: {
onSubmit: resolve,
onCancel: function () {
reject('No User selected');
}
}
}).open();
});
});
},
/**
* Extras
*/
......
......@@ -97,6 +97,26 @@ define('package/quiqqer/invoice/bin/backend/controls/panels/TemporaryInvoice', [
});
},
/**
* Panel refresh
*/
refresh: function () {
var title = this.getAttribute('invoiceId');
title = title + ' (';
if (this.getAttribute('isbrutto')) {
title = title + QUILocale.get(lg, 'brutto');
} else {
title = title + QUILocale.get(lg, 'netto');
}
title = title + ')';
this.setAttribute('title', title);
this.parent();
},
/**
* Saves the current data
*
......@@ -624,9 +644,10 @@ define('package/quiqqer/invoice/bin/backend/controls/panels/TemporaryInvoice', [
}
Invoices.getTemporaryInvoice(this.getAttribute('invoiceId')).then(function (data) {
this.setAttribute('title', data.id);
this.setAttributes(data);
console.log(data);
if (data.articles.articles.length) {
this.$serializedList = {
articles: data.articles.articles
......
......@@ -91,6 +91,10 @@
<de><![CDATA[MwSt.]]></de>
<en><![CDATA[VAT]]></en>
</locale>
<locale name="invoice.products.table.vat">
<de><![CDATA[MwSt. Satz]]></de>
<en><![CDATA[VAT rate]]></en>
</locale>
<locale name="invoice.products.discount">
<de><![CDATA[Rabatt]]></de>
<en><![CDATA[Discount]]></en>
......@@ -138,6 +142,14 @@
<en><![CDATA[Close the extended view]]></en>
</locale>
<locale name="netto">
<de><![CDATA[Netto]]></de>
<en><![CDATA[Net]]></en>
</locale>
<locale name="brutto">
<de><![CDATA[Brutto]]></de>
<en><![CDATA[Gross]]></en>
</locale>
</groups>
<groups name="quiqqer/invoice" datatype="js">
......@@ -374,6 +386,22 @@
<de><![CDATA[Der Artikel wird unwiderruflich gelöscht.]]></de>
<en><![CDATA[The article is irrevocably deleted.]]></en>
</locale>
<locale name="dialog.create.address.title">
<de><![CDATA[Rechnungsadresse anlegen]]></de>
<en><![CDATA[Create invoice address]]></en>
</locale>
<locale name="invoice.create.address.message" html="true">
<de><![CDATA[
Der Benutzer besitzt keine Adresse. Bitte legen Sie für den Benutzer eine neue Adresse an.<br />
Diese Adresse dient gleichzeitig auch als Rechnungsadresse
]]></de>
<en><![CDATA[
The User does not have an address. Please create a new address for the user. <br />
This address also serves as an invoice address
]]></en>
</locale>
</groups>
<groups name="quiqqer/invoice" datatype="php">
......
......@@ -288,6 +288,21 @@ public function getTemporaryInvoiceData($id)
);
}
$result[0]['id'] = (int)$result[0]['id'];
$result[0]['customer_id'] = (int)$result[0]['customer_id'];
$result[0]['order_id'] = (int)$result[0]['order_id'];
$result[0]['address_id'] = (int)$result[0]['address_id'];
$result[0]['isbrutto'] = (int)$result[0]['isbrutto'];
$result[0]['paid_status'] = (int)$result[0]['paid_status'];
$result[0]['processing_status'] = (int)$result[0]['processing_status'];
$result[0]['time_for_payment'] = (int)$result[0]['time_for_payment'];
$result[0]['canceled'] = (int)$result[0]['canceled'];
$result[0]['c_user'] = (int)$result[0]['c_user'];
$result[0]['nettosum'] = (float)$result[0]['nettosum'];
$result[0]['subsum'] = (float)$result[0]['subsum'];
$result[0]['sum'] = (float)$result[0]['sum'];
return $result[0];
}
}
......@@ -66,6 +66,8 @@ public function __construct($id, Handler $Handler)
$this->setAttributes($data);
}
//region Getter
/**
* @return string
*/
......@@ -84,6 +86,26 @@ public function getCleanId()
return (int)str_replace(self::ID_PREFIX, '', $this->getId());
}
/**
* Return the customer
*
* @return false|null|QUI\Users\Nobody|QUI\Users\SystemUser|QUI\Users\User
*/
public function getCustomer()
{
$uid = $this->getAttribute('customer_id');
try {
return QUI::getUsers()->get($uid);
} catch (QUI\Users\Exception $Exception) {
QUI\System\Log::addWarning($Exception->getMessage());
}
return null;
}
//endregion
/**
* Save the current temporary invoice data to the database
*
......@@ -130,13 +152,19 @@ public function save($User = null)
$this->Articles->calc();
$listCalculations = $this->Articles->getCalculations();
QUI\System\Log::writeRecursive($this->Articles->toJSON());
//QUI\System\Log::writeRecursive($this->Articles->toJSON());
// attributes
$projectName = '';
$timeForPayment = '';
$date = '';
$isBrutto = QUI\ERP\Defaults::getBruttoNettoUserStatus();
if ($this->getCustomer()
&& !QUI\ERP\Utils\User::isNettoUser($this->getCustomer())
) {
$isBrutto = 1;
}
if ($this->getAttribute('project_name')) {
$projectName = $this->getAttribute('project_name');
......@@ -173,7 +201,7 @@ public function save($User = null)
'data' => '',
'articles' => $this->Articles->toJSON(),
'customer_data' => '', // @todo 'history' => '',
'isbrutto' => '',
'isbrutto' => $isBrutto,
'currency_data' => json_encode($listCalculations['currencyData']),
'nettosum' => $listCalculations['nettoSum'],
'subsum' => $listCalculations['subSum'],
......@@ -408,7 +436,7 @@ protected function getHTMLFooter()
//endregion
//region Article Management Methods
//region Article Management
/**
* Add an article
......
0% Lade oder .
You are about to add 0 people to the discussion. Proceed with caution.
Bearbeitung dieser Nachricht zuerst beenden!
Bitte registrieren oder zum Kommentieren