switched 2 inputs
This commit is contained in:
@@ -148,5 +148,9 @@ TODO: enable option for showing prices
|
|||||||
</div>
|
</div>
|
||||||
<?php endif; ?>
|
<?php endif; ?>
|
||||||
|
|
||||||
|
<div style="padding-top: 16pt">
|
||||||
|
Die Ware bleibt bis zur vollständigen Bezahlung Eigentum der XINON GmbH.
|
||||||
|
</div>
|
||||||
|
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
@@ -498,4 +498,4 @@ class WarehouseShippingNoteController extends TTCrud {
|
|||||||
self::returnJson(['success' => true, 'distance' => $roundedDistanceKm]);
|
self::returnJson(['success' => true, 'distance' => $roundedDistanceKm]);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -9,7 +9,7 @@ class WarehouseShippingNoteModel extends TTCrudBaseModel {
|
|||||||
public string $deliveryAddressCity;
|
public string $deliveryAddressCity;
|
||||||
public string $deliveryAddressEMail;
|
public string $deliveryAddressEMail;
|
||||||
public string $note;
|
public string $note;
|
||||||
public string $status; // 'new'|'accepted'|'invoiced'
|
public string $status; // 'new'|'in_progress'|'accepted'|'invoiced' TODO: add to enum / migration
|
||||||
public string $positions;
|
public string $positions;
|
||||||
public string $textElements;
|
public string $textElements;
|
||||||
public string $hoursEntries;
|
public string $hoursEntries;
|
||||||
|
|||||||
26
db/migrations/20241121100000_warehouse_modify_3.php
Normal file
26
db/migrations/20241121100000_warehouse_modify_3.php
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
<?php /** @noinspection ALL */
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
use Phinx\Migration\AbstractMigration;
|
||||||
|
|
||||||
|
final class WarehouseModify3 extends AbstractMigration {
|
||||||
|
public function up(): void {
|
||||||
|
if ($this->getEnvironment() == "thetool") {
|
||||||
|
$WarehouseShippingNote = $this->table("WarehouseShippingNote", ["signed" => true]);
|
||||||
|
$WarehouseShippingNote->changeColumn("status", "enum", ["values" => ["new", "accepted", "invoiced", "in_progress"], "null" => false]);
|
||||||
|
$WarehouseShippingNote->save();
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($this->getEnvironment() == "addressdb") {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public function down(): void {
|
||||||
|
if ($this->getEnvironment() == "thetool") {
|
||||||
|
$WarehouseShippingNote = $this->table("WarehouseShippingNote");
|
||||||
|
$WarehouseShippingNote->changeColumn("status", "enum", ["values" => ["new", "accepted", "invoiced"], "null" => false]);
|
||||||
|
$WarehouseShippingNote->save();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -28,6 +28,10 @@ class Helper {
|
|||||||
} else if (!empty($filterValue)) {
|
} else if (!empty($filterValue)) {
|
||||||
if ($exactMatch) {
|
if ($exactMatch) {
|
||||||
$sql .= " AND `$columnName` = '" . $filterValue . "'";
|
$sql .= " AND `$columnName` = '" . $filterValue . "'";
|
||||||
|
} else if ($filterValue[0] === "%") {
|
||||||
|
$sql .= " AND `$columnName` LIKE '" . $filterValue . "'";
|
||||||
|
} else if ($filterValue[strlen($filterValue) - 1] === "%") {
|
||||||
|
$sql .= " AND `$columnName` LIKE '" . $filterValue . "'";
|
||||||
} else {
|
} else {
|
||||||
$filterItems = explode(" ", $filterValue);
|
$filterItems = explode(" ", $filterValue);
|
||||||
foreach ($filterItems as $item) {
|
foreach ($filterItems as $item) {
|
||||||
|
|||||||
@@ -124,6 +124,10 @@ class TTCrud extends mfBaseController {
|
|||||||
$page = $this->postData['pagination']['page'] ?? 1;
|
$page = $this->postData['pagination']['page'] ?? 1;
|
||||||
$perPage = $this->postData['pagination']['per_page'] ?? 10;
|
$perPage = $this->postData['pagination']['per_page'] ?? 10;
|
||||||
|
|
||||||
|
if ($order['key'] === null && isset($this->defaultOrder)) {
|
||||||
|
$order = $this->defaultOrder;
|
||||||
|
}
|
||||||
|
|
||||||
$rows = $this->model::getAll($filter, $perPage, ($page - 1) * $perPage, $order);
|
$rows = $this->model::getAll($filter, $perPage, ($page - 1) * $perPage, $order);
|
||||||
$filteredAvailable = $this->model::count($filter);
|
$filteredAvailable = $this->model::count($filter);
|
||||||
$totalRows = $this->model::count();
|
$totalRows = $this->model::count();
|
||||||
@@ -240,11 +244,19 @@ class TTCrud extends mfBaseController {
|
|||||||
|
|
||||||
if (strlen($searchedID) > 0) {
|
if (strlen($searchedID) > 0) {
|
||||||
$filter = ['id' => $searchedID];
|
$filter = ['id' => $searchedID];
|
||||||
|
$data = $this->model::getAll($filter, 10);
|
||||||
} else {
|
} else {
|
||||||
$filter = [$textKey => $this->request->q];
|
$filter = [$textKey => $this->request->q . '%'];
|
||||||
|
$data = $this->model::getAll($filter, 10);
|
||||||
|
if (count($data) < 11) {
|
||||||
|
$filter = [$textKey => $this->request->q];
|
||||||
|
$lazyData = $this->model::getAll($filter, 10);
|
||||||
|
$data = array_merge($data, $lazyData);
|
||||||
|
$data = array_unique($data, SORT_REGULAR);
|
||||||
|
$data = array_slice($data, 0, 10);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
$data = $this->model::getAll($filter, 10);
|
|
||||||
|
|
||||||
self::returnJson(array_map(function ($item) use ($textKey) {
|
self::returnJson(array_map(function ($item) use ($textKey) {
|
||||||
return ['value' => $item->id, 'text' => $item->$textKey];
|
return ['value' => $item->id, 'text' => $item->$textKey];
|
||||||
|
|||||||
@@ -246,6 +246,7 @@ Vue.component('warehouse-article-price-modal', {
|
|||||||
})
|
})
|
||||||
|
|
||||||
|
|
||||||
|
// noinspection EqualityComparisonWithCoercionJS
|
||||||
Vue.component('warehouse-article', {
|
Vue.component('warehouse-article', {
|
||||||
//language=Vue
|
//language=Vue
|
||||||
template: `
|
template: `
|
||||||
@@ -261,7 +262,7 @@ Vue.component('warehouse-article', {
|
|||||||
|
|
||||||
<template v-slot:cheapestsellprice="{ row }">
|
<template v-slot:cheapestsellprice="{ row }">
|
||||||
<template v-for="price in JSON.parse(row.cheapestSellPrice)">
|
<template v-for="price in JSON.parse(row.cheapestSellPrice)">
|
||||||
<span v-if="price && window.TT_CONFIG['WAREHOUSE_ADMIN'] === true">{{price.title}}: {{(price.price)}} €<br></span>
|
<span v-if="price && window.TT_CONFIG['WAREHOUSE_ADMIN'] == true">{{price.title}}: {{(price.price)}} €<br></span>
|
||||||
<span v-if="price && price.title === 'Verkauf'">{{(price.price)}} €</span>
|
<span v-if="price && price.title === 'Verkauf'">{{(price.price)}} €</span>
|
||||||
</template>
|
</template>
|
||||||
</template>
|
</template>
|
||||||
|
|||||||
@@ -57,7 +57,7 @@ Vue.component('warehouse-shipping-note-modal-hours-entry', {
|
|||||||
<tt-input v-model="hourCount" label="Stunden" sm/>
|
<tt-input v-model="hourCount" label="Stunden" sm/>
|
||||||
<tt-autocomplete v-model="carId" :api-url="carApiUrl" label="Fahrzeug" sm/>
|
<tt-autocomplete v-model="carId" :api-url="carApiUrl" label="Fahrzeug" sm/>
|
||||||
<tt-input v-model="hourlyPrice" label="Stundenlohn" type="number" sm v-if="showHourlyPrice"/>
|
<tt-input v-model="hourlyPrice" label="Stundenlohn" type="number" sm v-if="showHourlyPrice"/>
|
||||||
<tt-input v-model="kilometerCount" label="Kilometer" sm/>
|
<tt-input :disabled="carId === ''" v-model="kilometerCount" label="Kilometer" sm/>
|
||||||
<div class="warehouse-shipping-note-modal-hours-entry-actions">
|
<div class="warehouse-shipping-note-modal-hours-entry-actions">
|
||||||
<button @click="createOrUpdate" class="btn btn-sm btn-primary">Speichern</button>
|
<button @click="createOrUpdate" class="btn btn-sm btn-primary">Speichern</button>
|
||||||
</div>
|
</div>
|
||||||
@@ -87,6 +87,10 @@ Vue.component('warehouse-shipping-note-modal-hours-entry', {
|
|||||||
this.updateCarId().then();
|
this.updateCarId().then();
|
||||||
},
|
},
|
||||||
async updateKilometerCount() {
|
async updateKilometerCount() {
|
||||||
|
if (!this.carId) {
|
||||||
|
this.kilometerCount = '';
|
||||||
|
return;
|
||||||
|
}
|
||||||
const delAddr = this.$parent.$parent.$parent.delAddrLine +
|
const delAddr = this.$parent.$parent.$parent.delAddrLine +
|
||||||
' ' +
|
' ' +
|
||||||
this.$parent.$parent.$parent.delAddrCity +
|
this.$parent.$parent.$parent.delAddrCity +
|
||||||
@@ -122,6 +126,8 @@ Vue.component('warehouse-shipping-note-modal-hours-entry', {
|
|||||||
if (!this.kilometerCount) this.updateKilometerCount().then();
|
if (!this.kilometerCount) this.updateKilometerCount().then();
|
||||||
|
|
||||||
this.$parent.$parent.$parent.$watch('delAddrLine', this.updateKilometerCount);
|
this.$parent.$parent.$parent.$watch('delAddrLine', this.updateKilometerCount);
|
||||||
|
this.$watch('carId', this.updateKilometerCount);
|
||||||
|
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -429,6 +435,7 @@ Vue.component('warehouse-shipping-note-modal-positions', {
|
|||||||
})
|
})
|
||||||
|
|
||||||
|
|
||||||
|
// noinspection EqualityComparisonWithCoercionJS
|
||||||
Vue.component('warehouse-shipping-note-modal', {
|
Vue.component('warehouse-shipping-note-modal', {
|
||||||
props: {
|
props: {
|
||||||
id: {type: [String, Number], required: true},
|
id: {type: [String, Number], required: true},
|
||||||
@@ -464,10 +471,12 @@ Vue.component('warehouse-shipping-note-modal', {
|
|||||||
:del-addr-e-mail.sync="delAddrEMail"/>
|
:del-addr-e-mail.sync="delAddrEMail"/>
|
||||||
|
|
||||||
|
|
||||||
<div v-show="delAddrFilled === false">
|
<div v-show="delAddrFilled === true">
|
||||||
<hr>
|
<template v-if="window.TT_CONFIG['WAREHOUSE_ADMIN'] == true && 1 < 0">
|
||||||
<h4 class="text-center">Textelemente</h4>
|
<hr>
|
||||||
<warehouse-shipping-note-modal-text-elements :text-elements="textElements"/>
|
<h4 class="text-center">Textelemente</h4>
|
||||||
|
<warehouse-shipping-note-modal-text-elements :text-elements="textElements"/>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
|
||||||
<hr>
|
<hr>
|
||||||
@@ -484,14 +493,21 @@ Vue.component('warehouse-shipping-note-modal', {
|
|||||||
<warehouse-shipping-note-modal-positions :positions.sync="positions" :bill-addr-id="billAddrId"/>
|
<warehouse-shipping-note-modal-positions :positions.sync="positions" :bill-addr-id="billAddrId"/>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div v-show="delAddrFilled === true" class="text-center">Bitte füllen Sie die Rechnungs- und Lieferadresse aus</div>
|
<div v-show="delAddrFilled === false" class="text-center">Bitte füllen Sie die Rechnungs- und Lieferadresse aus</div>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
<!-- TODO: fix these buttons-->
|
<!-- TODO: fix these buttons-->
|
||||||
<template v-slot:footer-prepend v-if="id !== 'create'">
|
<template v-slot:footer-prepend v-if="id !== 'create'">
|
||||||
|
<button v-if="window.TT_CONFIG['WAREHOUSE_ADMIN'] == true && status === 'new'" class="btn btn-warning" @click="alert('In Bearbeitung')">In
|
||||||
|
Bearbeitung
|
||||||
|
</button>
|
||||||
|
<button v-if="window.TT_CONFIG['WAREHOUSE_ADMIN'] == true && (status === 'new' || status === 'in_progress')" class="btn btn-success"
|
||||||
|
@click="alert('Accepted')">Akzeptieren
|
||||||
|
</button>
|
||||||
|
<button v-if="window.TT_CONFIG['WAREHOUSE_ADMIN'] == true && status === 'accepted'" class="btn btn-info" @click="alert('Invoiced')">
|
||||||
|
Verrechnet
|
||||||
|
</button>
|
||||||
<button class="btn btn-info" @click="$emit('open-signing-modal', id)">Unterschreiben</button>
|
<button class="btn btn-info" @click="$emit('open-signing-modal', id)">Unterschreiben</button>
|
||||||
<!-- <button class="btn btn-success" @click="alert('Accept')">Akzeptieren</button>-->
|
|
||||||
<!-- <button class="btn btn-warning" @click="alert('Invoiced')">Verrechnet</button>-->
|
|
||||||
</template>
|
</template>
|
||||||
</tt-modal>
|
</tt-modal>
|
||||||
`,
|
`,
|
||||||
@@ -559,7 +575,8 @@ Vue.component('warehouse-shipping-note-modal', {
|
|||||||
return this.id === 'create' ? 'Lieferschein erstellen' : `Lieferschein #${this.id} bearbeiten`;
|
return this.id === 'create' ? 'Lieferschein erstellen' : `Lieferschein #${this.id} bearbeiten`;
|
||||||
},
|
},
|
||||||
delAddrFilled() {
|
delAddrFilled() {
|
||||||
return !this.delAddrName || !this.delAddrLine || !this.delAddrPLZ || !this.delAddrCity;
|
if (this.id !== 'create') return true;
|
||||||
|
return !!this.delAddrName && !!this.delAddrLine && !!this.delAddrPLZ && !!this.delAddrCity;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -576,14 +593,14 @@ Vue.component('warehouse-shipping-note-modal-address', {
|
|||||||
},
|
},
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
window: window,
|
window: window,
|
||||||
addressModes: [{text: 'Wie Rechnungsadresse', value: 'billing'},
|
addressModes: [{text: 'Wie Rechnungsadresse', value: 'billing'},
|
||||||
{text: 'Bestehende Lieferadresse', value: 'existing'},
|
{text: 'Bestehende Lieferadresse', value: 'existing'},
|
||||||
{text: 'Andere Lieferadresse', value: 'new'}],
|
{text: 'Andere Lieferadresse', value: 'new'}],
|
||||||
addressMode: 'existing',
|
addressMode: 'existing',
|
||||||
addresses: [],
|
addresses: [],
|
||||||
fetchedBillAddr: null,
|
fetchedBillAddr: null,
|
||||||
selectedAddr: '',
|
selectedAddr: '',
|
||||||
newAddrGeoLatLon: '',
|
newAddrGeoLatLon: '',
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -599,31 +616,48 @@ Vue.component('warehouse-shipping-note-modal-address', {
|
|||||||
<template v-else-if="addressMode === 'new'">
|
<template v-else-if="addressMode === 'new'">
|
||||||
<tt-input :value="delAddrName" @input="$emit('update:delAddrName', $event)" label="Lieferadresse Name*" sm row/>
|
<tt-input :value="delAddrName" @input="$emit('update:delAddrName', $event)" label="Lieferadresse Name*" sm row/>
|
||||||
<tt-input :value="delAddrEMail" @input="$emit('update:delAddrEMail', $event)" label="Lieferadresse E-Mail" sm row/>
|
<tt-input :value="delAddrEMail" @input="$emit('update:delAddrEMail', $event)" label="Lieferadresse E-Mail" sm row/>
|
||||||
<tt-autocomplete :api-url="window.TT_CONFIG['BASE_PATH'] + '/WarehouseShippingNote/geoAutocomplete'" @input="newAddrGeoLatLon = $event" label="Adresse*" sm row/>
|
<tt-autocomplete :api-url="window.TT_CONFIG['BASE_PATH'] + '/WarehouseShippingNote/geoAutocomplete'" @input="newAddrGeoLatLon = $event"
|
||||||
|
label="Adresse*" sm row/>
|
||||||
|
|
||||||
<span v-if="delAddrLine && delAddrPLZ && delAddrCity">Adresse: {{ delAddrLine }}, {{ delAddrPLZ }} {{ delAddrCity }}</span>
|
<span v-if="delAddrLine && delAddrPLZ && delAddrCity">Adresse: {{ delAddrLine }}, {{ delAddrPLZ }} {{ delAddrCity }}</span>
|
||||||
<!-- <tt-input :value="delAddrLine" @input="$emit('update:delAddrLine', $event)" label="Lieferadresse" sm row/>-->
|
<!-- <tt-input :value="delAddrLine" @input="$emit('update:delAddrLine', $event)" label="Lieferadresse" sm row/>-->
|
||||||
<!-- <tt-input :value="delAddrPLZ" @input="$emit('update:delAddrPLZ', $event)" label="Lieferadresse PLZ" sm row/>-->
|
<!-- <tt-input :value="delAddrPLZ" @input="$emit('update:delAddrPLZ', $event)" label="Lieferadresse PLZ" sm row/>-->
|
||||||
<!-- <tt-input :value="delAddrCity" @input="$emit('update:delAddrCity', $event)" label="Lieferadresse Ort" sm row/>-->
|
<!-- <tt-input :value="delAddrCity" @input="$emit('update:delAddrCity', $event)" label="Lieferadresse Ort" sm row/>-->
|
||||||
</template>
|
</template>
|
||||||
</div>
|
</div>
|
||||||
`,
|
`,
|
||||||
watch: {
|
watch: {
|
||||||
billAddrId: {handler: 'updateBillingMode', immediate: false},
|
billAddrId: {handler: 'updateBillingMode', immediate: false},
|
||||||
addressMode: {handler: 'fetchDeliveryAddresses', immediate: false},
|
addressMode: {handler: 'fetchDeliveryAddresses', immediate: false},
|
||||||
selectedAddr: {handler: 'setSelectedAddrValues', immediate: false},
|
selectedAddr: {handler: 'setSelectedAddrValues', immediate: false},
|
||||||
newAddrGeoLatLon: {handler: 'fetchGeoAddress', immediate: false},
|
newAddrGeoLatLon: {handler: 'fetchGeoAddress', immediate: false},
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
async fetchGeoAddress() {
|
async fetchGeoAddress() {
|
||||||
if (!this.newAddrGeoLatLon) return;
|
if (!this.newAddrGeoLatLon) {
|
||||||
|
this.$emit('update:delAddrLine', '');
|
||||||
|
this.$emit('update:delAddrPLZ', '');
|
||||||
|
this.$emit('update:delAddrCity', '');
|
||||||
|
return;
|
||||||
|
}
|
||||||
const [lat, lon] = this.newAddrGeoLatLon.split(',');
|
const [lat, lon] = this.newAddrGeoLatLon.split(',');
|
||||||
const response = await axios.get(window.TT_CONFIG["BASE_PATH"] + '/WarehouseShippingNote/geoReverse?lat=' + lat + '&lon=' + lon);
|
const response = await axios.get(window.TT_CONFIG["BASE_PATH"] + '/WarehouseShippingNote/geoReverse?lat=' + lat + '&lon=' + lon);
|
||||||
|
|
||||||
if (response.data.address.road) {
|
if (response.data.address.road) {
|
||||||
this.$emit('update:delAddrLine', `${response.data.address.road}${response.data.address.house_number ? ' ' + response.data.address.house_number : ''}`);
|
this.$emit('update:delAddrLine',
|
||||||
} else {
|
`${response.data.address.road}${response.data.address.house_number ? ' ' + response.data.address.house_number : ''}`);
|
||||||
this.$emit('update:delAddrLine', `${response.data.address.village}${response.data.address.house_number ? ' ' + response.data.address.house_number : ''}`);
|
} else if(response.data.address.village) {
|
||||||
|
this.$emit('update:delAddrLine',
|
||||||
|
`${response.data.address.village}${response.data.address.house_number ? ' ' + response.data.address.house_number : ''}`);
|
||||||
|
} else if(response.data.address.hamlet) {
|
||||||
|
this.$emit('update:delAddrLine',
|
||||||
|
`${response.data.address.hamlet}${response.data.address.house_number ? ' ' + response.data.address.house_number : ''}`);
|
||||||
|
} else if(response.data.address.residential) {
|
||||||
|
this.$emit('update:delAddrLine',
|
||||||
|
`${response.data.address.residential}${response.data.address.house_number ? ' ' + response.data.address.house_number : ''}`);
|
||||||
|
} else if(response.data.address.city) {
|
||||||
|
this.$emit('update:delAddrLine',
|
||||||
|
`${response.data.address.city}${response.data.address.house_number ? ' ' + response.data.address.house_number : ''}`);
|
||||||
}
|
}
|
||||||
|
|
||||||
this.$emit('update:delAddrPLZ', response.data.address.postcode);
|
this.$emit('update:delAddrPLZ', response.data.address.postcode);
|
||||||
|
|||||||
Reference in New Issue
Block a user