shift-build-2464
Nadim Salloum 2021-06-19 16:36:10 +03:00
parent 88655172b2
commit 97e389bf90
20 changed files with 115451 additions and 125533 deletions

View File

@ -15,7 +15,7 @@ class BuyContractsSheet extends ContractsSheet
public function headings(): array public function headings(): array
{ {
return [ return [
['Kaufverträge ' . $this->year], ['Ankaufsverträge ' . $this->year],
[ [
'Datum', 'Datum',
'Auto', 'Auto',
@ -39,6 +39,6 @@ class BuyContractsSheet extends ContractsSheet
public function title(): string public function title(): string
{ {
return 'Ankaufverträge'; return 'Ankaufsverträge';
} }
} }

View File

@ -16,7 +16,7 @@ class SellContractsSheet extends ContractsSheet
public function headings(): array public function headings(): array
{ {
return [ return [
['Verkaufverträge ' . $this->year], ['Verkaufsverträge ' . $this->year],
[ [
'Datum', 'Datum',
'Auto', 'Auto',
@ -46,13 +46,6 @@ class SellContractsSheet extends ContractsSheet
public function title(): string public function title(): string
{ {
return 'Verkaufverträge'; return 'Verkaufsverträge';
}
public static function afterSheet(AfterSheet $event)
{
$event->sheet->appendRows([
[null, null, null, null, 'Total', 1112, 100, 1002],
], $event);
} }
} }

View File

@ -200,10 +200,9 @@ class CarController extends Controller
'stammnummer' => $car->stammnummer, 'stammnummer' => $car->stammnummer,
'vin' => $car->vin, 'vin' => $car->vin,
'buy_contract' => $this->getContractFields($car->latestBuyContract()), 'buy_contract' => $this->getContractFields($car->latestBuyContract()),
'sell_contract' => $car->isSold() ? $this->getContractFields($car->latestSellContract()) : null, 'sell_contract' => $this->getContractFields($car->latestSellContract()),
'car_model' => $car->carModel->only('name'), 'car_model' => $car->carModel->only('name'),
'name' => $car->name, 'name' => $car->name_with_year,
'initial_date' => $car->initial_date_formatted,
'deleted_at' => $car->deleted_at, 'deleted_at' => $car->deleted_at,
'link' => route('cars.show', $car), 'link' => route('cars.show', $car),
]), ]),
@ -340,7 +339,7 @@ class CarController extends Controller
{ {
return [ return [
'stammnummer' => ['required', 'unique:cars', 'string', 'size:11', 'regex:/[0-9]{3}[.][0-9]{3}[.][0-9]{3}/i'], 'stammnummer' => ['required', 'unique:cars', 'string', 'size:11', 'regex:/[0-9]{3}[.][0-9]{3}[.][0-9]{3}/i'],
'vin' => ['required', 'unique:cars', 'string', 'size:17', 'min:17', 'max:17'], 'vin' => ['required', 'unique:cars', 'string', 'size:17'],
'initial_date' => ['required', 'date'], 'initial_date' => ['required', 'date'],
'last_check_date' => ['required', 'date'], 'last_check_date' => ['required', 'date'],
'colour' => ['nullable', 'max:75'], 'colour' => ['nullable', 'max:75'],
@ -426,7 +425,7 @@ class CarController extends Controller
$car->update( $car->update(
$request->validate([ $request->validate([
'stammnummer' => ['required', 'unique:cars,stammnummer,' . $car->id, 'string', 'size:11', 'regex:/[0-9]{3}[.][0-9]{3}[.][0-9]{3}/i'], 'stammnummer' => ['required', 'unique:cars,stammnummer,' . $car->id, 'string', 'size:11', 'regex:/[0-9]{3}[.][0-9]{3}[.][0-9]{3}/i'],
'vin' => ['required', 'unique:cars,vin,' . $car->id, 'string', 'size:17', 'min:17', 'max:17'], 'vin' => ['required', 'unique:cars,vin,' . $car->id, 'string', 'size:17'],
'initial_date' => ['required', 'date'], 'initial_date' => ['required', 'date'],
'last_check_date' => ['required', 'date'], 'last_check_date' => ['required', 'date'],
'colour' => ['nullable', 'max:75'], 'colour' => ['nullable', 'max:75'],

View File

@ -7,7 +7,9 @@ use App\Models\Car;
use Inertia\Inertia; use Inertia\Inertia;
use App\Models\Brand; use App\Models\Brand;
use App\Models\Contact; use App\Models\Contact;
use App\Models\Payment;
use App\Models\Contract; use App\Models\Contract;
use App\Enums\PaymentType;
use App\Enums\ContractType; use App\Enums\ContractType;
use App\Enums\InsuranceType; use App\Enums\InsuranceType;
use Illuminate\Http\Request; use Illuminate\Http\Request;
@ -55,7 +57,7 @@ class ContractController extends Controller
public function create(Request $request) public function create(Request $request)
{ {
$type = (string)($request->get('type') ?: '1'); $type = (string)($request->get('type') ?? '1');
$car = Car::find($request->get('car')); $car = Car::find($request->get('car'));
$contact = Contact::find($request->get('contact')); $contact = Contact::find($request->get('contact'));
@ -140,6 +142,7 @@ class ContractController extends Controller
{ {
$request->merge([ $request->merge([
'type' => (string)$request->get('type'), 'type' => (string)$request->get('type'),
'payment_type' => (string)$request->get('payment_type'),
'insurance_type' => (string)$request->get('insurance_type'), 'insurance_type' => (string)$request->get('insurance_type'),
'date' => Carbon::parse($request->get('date'))->format('Y-m-d'), 'date' => Carbon::parse($request->get('date'))->format('Y-m-d'),
'delivery_date' => Carbon::parse($request->get('delivery_date'))->format('Y-m-d'), 'delivery_date' => Carbon::parse($request->get('delivery_date'))->format('Y-m-d'),
@ -158,6 +161,20 @@ class ContractController extends Controller
]) ])
); );
$request->merge([
'type' => (string)$request->get('payment_type'),
'contract_id' => $contract->id,
]);
Payment::create(
$request->validate([
'date' => ['required', 'date'],
'amount' => ['required', 'integer'],
'type' => ['required', 'string', Rule::in(PaymentType::getValues())],
'contract_id' => ['required', 'exists:App\Models\Contract,id'],
])
);
session()->flash('flash.banner', 'Vertrag erstellt.'); session()->flash('flash.banner', 'Vertrag erstellt.');
return Redirect::route('contracts.show', $contract); return Redirect::route('contracts.show', $contract);

View File

@ -25,7 +25,7 @@ class PaymentController extends Controller
'date' => Carbon::parse($request->get('date'))->format('Y-m-d'), 'date' => Carbon::parse($request->get('date'))->format('Y-m-d'),
]); ]);
$Payment = Payment::create( $payment = Payment::create(
$request->validate([ $request->validate([
'date' => ['required', 'date'], 'date' => ['required', 'date'],
'amount' => ['required', 'integer'], 'amount' => ['required', 'integer'],
@ -35,7 +35,7 @@ class PaymentController extends Controller
); );
session()->flash('flash.banner', 'Einzahlung gespeichert.'); session()->flash('flash.banner', 'Einzahlung gespeichert.');
return Redirect::route('contracts.show', $Payment->contract); return Redirect::route('contracts.show', $payment->contract);
} }
public function destroy(Request $request, Contract $contract) public function destroy(Request $request, Contract $contract)

View File

@ -91,7 +91,7 @@ class Contract extends Model
public function getTypeFormattedAttribute() public function getTypeFormattedAttribute()
{ {
return $this->isSellContract() ? 'Kaufsvertrag' : 'Ankaufsvertrag'; return $this->isSellContract() ? 'Kaufvertrag' : 'Ankaufsvertrag';
} }
public function documents() public function documents()

View File

@ -20,7 +20,7 @@ class RouteServiceProvider extends ServiceProvider
* *
* @var string * @var string
*/ */
public const HOME = '/dashboard'; public const HOME = '/';
/** /**
* The controller namespace for the application. * The controller namespace for the application.

13698
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -27,13 +27,13 @@
}, },
"dependencies": { "dependencies": {
"@inertiajs/inertia-vue3": "^0.3.5", "@inertiajs/inertia-vue3": "^0.3.5",
"axios": "^0.21",
"lodash": "^4.17.21",
"vue": "^3.0.5",
"vue-currency-input": "^2.0.0", "vue-currency-input": "^2.0.0",
"vue-multiselect": "^3.0.0-alpha.2", "vue-multiselect": "^3.0.0-alpha.2",
"vue-unicons": "^3.2.1", "vue-unicons": "^3.2.1",
"vue3-datepicker": "^0.2.4", "vue3-datepicker": "^0.2.4",
"vuex": "^4.0.0", "vuex": "^4.0.0"
"axios": "^0.21",
"lodash": "^4.17.21",
"vue": "^3.0.5"
} }
} }

226280
public/css/app.css vendored

File diff suppressed because it is too large Load Diff

816
public/js/app.js vendored

File diff suppressed because it is too large Load Diff

View File

@ -12,7 +12,7 @@
<template v-else #form> <template v-else #form>
<div class="col-span-3"> <div class="col-span-3">
<jet-label for="car" value="Auto" /> <jet-label for="car" value="Auto" />
<multiselect @select="onCarChange" :disabled="createCar" v-model="car" label="name" track-by="id" :options="carsChoice" class="mt-1 block w-full" placeholder="Auto auswählen" /> <multiselect :allow-empty="false" @select="onCarChange" :disabled="createCar" v-model="car" label="name" track-by="id" :options="carsChoice" class="mt-1 block w-full" placeholder="Auto auswählen" />
</div> </div>
<div class="col-span-6"> <div class="col-span-6">
<car-card v-if="car.id" class="mt-3 col-span-3" :car="car" hideEmpty="true" /> <car-card v-if="car.id" class="mt-3 col-span-3" :car="car" hideEmpty="true" />

View File

@ -3,8 +3,8 @@
<template #header> <template #header>
<slot name="header"></slot> <slot name="header"></slot>
</template> </template>
<div class="grid grid-cols-12 gap-12 mb-8"> <div class="grid grid-cols-12 gap-12 mb-8 max-w-5xl mx-auto">
<div class="xl:col-span-6 col-span-12"> <div class="xl:col-span-9 col-span-12">
<slot name="info"></slot> <slot name="info"></slot>
</div> </div>
<div class="xl:col-span-3 xl:col-end-13 col-span-12"> <div class="xl:col-span-3 xl:col-end-13 col-span-12">
@ -13,10 +13,10 @@
<slot name="actions"></slot> <slot name="actions"></slot>
</div> </div>
</div> </div>
</div> <div class="xl:col-span-9 col-span-12">
<div class="grid grid-cols-12 gap-12">
<slot name="more"></slot> <slot name="more"></slot>
</div> </div>
</div>
</layout> </layout>
</template> </template>

View File

@ -1,7 +1,7 @@
<template> <template>
<div class="col-span-6 sm:col-span-4"> <div class="col-span-6 sm:col-span-4">
<jet-label for="brand" value="Marke" /> <jet-label for="brand" value="Marke" />
<multiselect v-model="brandSelection" @SearchChange="updateBrandSearch" @select="updateBrand" label="name" track-by="id" :options="brands" class="mt-1 block w-full border-gray-300" placeholder="Marke auswählen"> <multiselect :allow-empty="false" v-model="brandSelection" @SearchChange="updateBrandSearch" @select="updateBrand" label="name" track-by="id" :options="brands" class="mt-1 block w-full border-gray-300" placeholder="Marke auswählen">
<template v-slot:noResult> <template v-slot:noResult>
<span @click="addBrand"> <span @click="addBrand">
<b>{{ brandSearch }}</b> als neue Marke speichern? <b>{{ brandSearch }}</b> als neue Marke speichern?
@ -12,7 +12,7 @@
<div v-if="brandSelection" class="col-span-6 sm:col-span-4"> <div v-if="brandSelection" class="col-span-6 sm:col-span-4">
<jet-label for="model" value="Modell" /> <jet-label for="model" value="Modell" />
<multiselect v-model="car_modelSelection" @SearchChange="updateCarModelSearch" @select="updateCarModel" label="name" track-by="id" :options="carModels" class="mt-1 block w-full border-gray-300" placeholder="Modell auswählen"> <multiselect :allow-empty="false" v-model="car_modelSelection" @SearchChange="updateCarModelSearch" @select="updateCarModel" label="name" track-by="id" :options="carModels" class="mt-1 block w-full border-gray-300" placeholder="Modell auswählen">
<template v-slot:noResult> <template v-slot:noResult>
<span @click="addCarModel"> <span @click="addCarModel">
<b>{{ modelSearch }}</b> als neues {{ brand.name }}-Modell speichern? <b>{{ modelSearch }}</b> als neues {{ brand.name }}-Modell speichern?
@ -31,7 +31,7 @@
</div> </div>
<div class="col-span-12 sm:col-span-7"> <div class="col-span-12 sm:col-span-7">
<jet-label for="vin" value="Chassisnummer" /> <jet-label for="vin" value="Chassisnummer" />
<jet-input id="vin" type="text" class="mt-1 block w-full" v-model="form.vin" ref="vin" autocomplete="vin" /> <jet-input id="vin" type="text" class="mt-1 block w-full" minlength="17" maxlength="17" v-model="form.vin" ref="vin" autocomplete="vin" />
<jet-input-error :message="form.errors.vin" class="mt-2" /> <jet-input-error :message="form.errors.vin" class="mt-2" />
</div> </div>
</div> </div>

View File

@ -7,6 +7,7 @@
</h2> </h2>
</template> </template>
<template #info> <template #info>
<small-title title="Auto" class="mb-3" />
<car-card :car="car" /> <car-card :car="car" />
</template> </template>
<template #actions> <template #actions>
@ -18,7 +19,6 @@
</div> </div>
</template> </template>
<template #more> <template #more>
<div class="xl:col-span-6 col-span-12">
<contract-table <contract-table
:contracts="car.buy_contracts" :contracts="car.buy_contracts"
:type="0" :type="0"
@ -26,16 +26,14 @@
:show_upload="!car.deleted_at" :show_upload="!car.deleted_at"
:title="car.buy_contracts.length > 1 ? car.buy_contracts.length + ' Ankaufsverträge' : 'Ankaufsvertrag'" :title="car.buy_contracts.length > 1 ? car.buy_contracts.length + ' Ankaufsverträge' : 'Ankaufsvertrag'"
/> />
</div>
<div class="xl:col-span-6 col-span-12">
<contract-table <contract-table
:contracts="car.sell_contracts" :contracts="car.sell_contracts"
:type="1" :type="1"
:carId="car.id" :carId="car.id"
class="mt-10"
:show_upload="!car.deleted_at" :show_upload="!car.deleted_at"
:title="car.sell_contracts.length > 1 ? car.sell_contracts.length + ' Verkaufsverträge' : 'Verkaufsvertrag'" :title="car.sell_contracts.length > 1 ? car.sell_contracts.length + ' Verkaufsverträge' : 'Verkaufsvertrag'"
/> />
</div>
</template> </template>
</show-page> </show-page>
</template> </template>
@ -48,6 +46,7 @@ import EditButton from '@/Components/Buttons/EditButton.vue';
import DeleteButton from '@/Components/Buttons/DeleteButton.vue'; import DeleteButton from '@/Components/Buttons/DeleteButton.vue';
import RestoreButton from '@/Components/Buttons/RestoreButton.vue'; import RestoreButton from '@/Components/Buttons/RestoreButton.vue';
import ContractTable from '../../Components/Contracts/ContractTable.vue'; import ContractTable from '../../Components/Contracts/ContractTable.vue';
import SmallTitle from '../../Components/SmallTitle.vue';
export default { export default {
components: { components: {
@ -58,6 +57,7 @@ export default {
DeleteButton, DeleteButton,
RestoreButton, RestoreButton,
ContractTable, ContractTable,
SmallTitle,
}, },
props: { props: {
car: Object, car: Object,

View File

@ -34,7 +34,6 @@ export default {
columns: [ columns: [
{ key: 'name', value: 'Marke & Modell', sortable: true }, { key: 'name', value: 'Marke & Modell', sortable: true },
{ key: 'stammnummer', value: 'Stammnummer', sortable: true }, { key: 'stammnummer', value: 'Stammnummer', sortable: true },
{ key: 'initial_date', value: 'Inverkehrssetzung', sortable: true },
{ key: 'buy_contract.date', value: 'Einkaufsdatum', sortable: true }, { key: 'buy_contract.date', value: 'Einkaufsdatum', sortable: true },
{ key: 'buy_contract.price', value: 'Einkaufspreis', sortable: true }, { key: 'buy_contract.price', value: 'Einkaufspreis', sortable: true },
], ],
@ -42,3 +41,4 @@ export default {
}, },
}; };
</script> </script>
§

View File

@ -8,6 +8,7 @@
</template> </template>
<template #info> <template #info>
<small-title title="Kontakt" class="mb-3" />
<contact-card :contact="contact" /> <contact-card :contact="contact" />
</template> </template>
@ -21,7 +22,6 @@
</template> </template>
<template #more> <template #more>
<div class="xl:col-span-6 col-span-12">
<contract-table <contract-table
:contracts="contact.buy_contracts" :contracts="contact.buy_contracts"
:type="0" :type="0"
@ -29,16 +29,14 @@
:show_upload="!contact.deleted_at" :show_upload="!contact.deleted_at"
:title="contact.buy_contracts.length > 1 ? contact.buy_contracts.length + ' Ankaufsverträge' : 'Ankaufsvertrag'" :title="contact.buy_contracts.length > 1 ? contact.buy_contracts.length + ' Ankaufsverträge' : 'Ankaufsvertrag'"
/> />
</div>
<div class="xl:col-span-6 col-span-12">
<contract-table <contract-table
:contracts="contact.sell_contracts" :contracts="contact.sell_contracts"
:type="1" :type="1"
class="mt-10"
:contactId="contact.id" :contactId="contact.id"
:show_upload="!contact.deleted_at" :show_upload="!contact.deleted_at"
:title="contact.sell_contracts.length > 1 ? contact.sell_contracts.length + ' Verkaufsverträge' : 'Verkaufsvertrag'" :title="contact.sell_contracts.length > 1 ? contact.sell_contracts.length + ' Verkaufsverträge' : 'Verkaufsvertrag'"
/> />
</div>
</template> </template>
</show-page> </show-page>
</template> </template>
@ -51,6 +49,7 @@ import EditButton from '@/Components/Buttons/EditButton.vue';
import DeleteButton from '@/Components/Buttons/DeleteButton.vue'; import DeleteButton from '@/Components/Buttons/DeleteButton.vue';
import RestoreButton from '@/Components/Buttons/RestoreButton.vue'; import RestoreButton from '@/Components/Buttons/RestoreButton.vue';
import ContractTable from '../../Components/Contracts/ContractTable.vue'; import ContractTable from '../../Components/Contracts/ContractTable.vue';
import SmallTitle from '../../Components/SmallTitle.vue';
export default { export default {
components: { components: {
@ -61,6 +60,7 @@ export default {
DeleteButton, DeleteButton,
RestoreButton, RestoreButton,
ContractTable, ContractTable,
SmallTitle,
}, },
props: { props: {

View File

@ -22,11 +22,26 @@
</div> </div>
<div class="col-span-6 sm:col-span-4"> <div class="col-span-6 sm:col-span-4">
<jet-label for="price" value="Betrag" /> <jet-label for="price" :value="form.type === '0' ? 'Einkaufspreis' : 'Verkaufspreis'" />
<currency-input v-model="form.price" :options="currencyOptions" id="price" class="w-full mt-1 block border-gray-300 rounded-md shadow-sm" ref="price"/> <currency-input v-model="form.price" :options="currencyOptions" id="price" class="w-full mt-1 block border-gray-300 rounded-md shadow-sm" ref="price"/>
<jet-input-error :message="form.errors.price" class="mt-2" /> <jet-input-error :message="form.errors.price" class="mt-2" />
</div> </div>
<div class="col-span-6 sm:col-span-4">
<jet-label for="amount" value="Anzahlung" />
<currency-input v-model="form.amount" :options="currencyOptions" id="price" class="w-full mt-1 block border-gray-300 rounded-md shadow-sm" ref="amount"/>
<jet-input-error :message="form.errors.amount" class="mt-2" />
</div>
<div class="col-span-6 sm:col-span-4">
<jet-label for="payment_type" value="Einzahlungsart" />
<select v-model="form.payment_type" class="mt-1 block w-full border-gray-300 rounded-md shadow-sm">
<option value="0" :selected="form.payment_type == '0'">Banküberweisung</option>
<option value="1" :selected="form.payment_type == '1'">Barzahlung</option>
</select>
<jet-input-error :message="form.errors.type" class="mt-2" />
</div>
<div v-if="form.is_sell_contract" class="col-span-6 sm:col-span-4"> <div v-if="form.is_sell_contract" class="col-span-6 sm:col-span-4">
<jet-label for="insurance_type" value="Versicherung" /> <jet-label for="insurance_type" value="Versicherung" />
<select v-model="form.insurance_type" class="mt-1 block w-full border-gray-300 rounded-md shadow-sm"> <select v-model="form.insurance_type" class="mt-1 block w-full border-gray-300 rounded-md shadow-sm">
@ -48,7 +63,7 @@
{{ meta.on_success }} {{ meta.on_success }}
</jet-action-message> </jet-action-message>
<jet-button :class="{ 'opacity-25': form.processing }" :disabled="form.processing"> <jet-button :class="{ 'opacity-25': form.processing }" :disabled="form.processing || !data.contact_id || !data.car_id">
{{ meta.button_text }} {{ meta.button_text }}
</jet-button> </jet-button>
</template> </template>

View File

@ -68,6 +68,8 @@ export default {
car_id: this.car?.id ?? null, car_id: this.car?.id ?? null,
contact_id: this.contact?.id ?? null, contact_id: this.contact?.id ?? null,
is_sell_contract: this.type === '0', is_sell_contract: this.type === '0',
amount: null,
payment_type: '0',
}, },
}; };
}, },

View File

@ -76,16 +76,12 @@
</div> </div>
</template> </template>
<template #more> <template #more>
<div class="xl:col-span-6 col-span-12"> <span class="inline-flex items-end w-full justify-between mb-3">
<span class="w-full inline-flex items-end justify-between mb-3">
<small-title title="Einzahlungen" /> <small-title title="Einzahlungen" />
<payments-upload v-if="!contract.deleted_at" :show_upload="!contract.deleted_at" :contract="contract" /> <payments-upload v-if="!contract.deleted_at" :show_upload="!contract.deleted_at" :contract="contract" />
</span> </span>
<payments-view :payments="contract.payments" :contract="contract" /> <payments-view :payments="contract.payments" :contract="contract" />
</div>
<div class="xl:col-span-6 col-span-12 mt-4">
<documents-view :initial_documents="contract.documents" :id="contract.id" :show_upload="!contract.deleted_at" /> <documents-view :initial_documents="contract.documents" :id="contract.id" :show_upload="!contract.deleted_at" />
</div>
</template> </template>
</show-page> </show-page>
</template> </template>