public function validation_form(Request $request, $validation){
$messages = [
- '*.required' => __('Ce champs est requis'),
+ '*.required' => __('Veuillez remplir les champs obligatoires'),
'email.email' => __('Veuillez indiquer une adresse email valide'),
- 'email.unique' => __('Cette adresse existe déjà')
+ 'email.unique' => __('Cette adresse existe déjà'),
+ 'password.min' => __('Mot de passe trop court, minimum 8 caractères'),
+ 'firstname.max' => __("Maximum 255 caractères"),
+ 'phone.numeric' => __("Numéro de téléphone invalide"),
+ 'vat.min' => __("Numéro de TVA intracommunautaire trop court"),
+ 'vat.regex' => __("Numéro de TVA intracommunautaire invalide"),
+ 'siren.min' => __("Numéro de SIREN invalide"),
+ "*zipcode.numeric" => __("Code postal invalide")
];
$validator = Validator::make($request->all(), $validation, $messages);
throw new ValidationException($validator);
}
+
$validator->validate();
return $validator->validated();
}
'firstname' => 'required|string|max:255',
'phone' => 'required|numeric',
'company' => 'required|string',
- 'vat' => 'required|alpha_num|min:13',
- 'siren' => 'required|numeric',
+ 'vat' => 'required|string|min:13|max:13|regex:/^[a-zA-Z]{2}\d{11}$/',
+ 'siren' => 'required|string|min:9|max:9',
'address.*.address' => 'required|string|max:255',
'address.*.zipcode' => 'required|numeric',
'address.*.city' => 'required|string|max:255',
$data['status'] = 0;
$data['password'] = Hash::make($data['password']);
+ if (!strstr($data['vat'], $data['siren']) || substr($data['vat'], '-9') !== $data['siren']) {
+ throw ValidationException::withMessages(['siren' => __('Le numero de siren est incorrect')]);
+ }
+
$client = new Client($data);
$client->save();
}elseif(in_array($key,['phone'])){
$validation[$key] = 'required|numeric';
}elseif ($key === "actually_password"){
- $validation[$key] = 'required';
+ $validation[$key] = 'required|missing';
}elseif ($key === "password"){
$validation[$key] = 'required|confirmed|min:8';
}
'type' => 'Integer',
'attributes' => [
'disabled' => 'disabled'
- ],
- 'options' => [
- 'auto_increment' => true
]
]);
import PortalVue from 'portal-vue';
import Ar from "../../public/vendor/adminlte/bower_components/moment/src/locale/ar";
+import VueTheMask from 'vue-the-mask'
+Vue.use(VueTheMask)
Vue.use(PortalVue);
/**
validateRegister: false,
tab: 'infos',
addresses: [{}],
+ errorsForm: {},
user: '',
default_billing_address: null,
default_delivery_address: null
beforeMount() {
this.items = JSON.parse(this.$el.dataset.cartItems);
+ this.tab = window.location.hash.replace('#','') || 'infos'
this.getUser()
},
},
updated(){
- console.log(this.selected)
+ //console.log(this.selected)
},
computed: {
},
methods: {
+ resetUrlAccount() {
+ let hash = window.location.hash
+ let fullUrl = window.location.origin+window.location.pathname
+ if(hash)
+ history.pushState("", "", fullUrl);
+ },
saveCart(data) {
let root = this;
axios.post('/ajax/cart', data)
this.type = this.type === "password" ? "text" : "password"
},
removeErrors() {
- let errorMessage = document.querySelectorAll('.form-error')
+ let errorMessage = document.querySelectorAll('.form-error'),
+ errorInput = document.querySelectorAll('.error')
+
for (var i = 0; i < errorMessage.length; i++) {
errorMessage[i].remove();
}
+ for (var i = 0; i < errorInput.length; i++) {
+ errorInput[i].classList.remove('error');
+ }
},
checkEmailExist() {
let root = this,
})
root.validateRegister = true
root.email_signin = ''
+ root.errorsForm = {}
})
.catch(function (error) {
if (error.response) {
let errors = error.response.data.errors
+ root.errorsForm = errors
+ console.log(errors)
root.removeErrors()
for (let k in errors) {
+ if(k.indexOf('.')){
+ let keys = k.split('.')
+ for(let i = 0; i < keys.length; i++){
+ if(i !== 0){
+ k += '['+keys[i]+']'
+ }else{
+ k = keys[i]
+ }
+ }
+ console.log(k)
+ }
let el = document.querySelector('[name=' + k + ']')
- let span = document.createElement("span")
- span.classList.add('form-error')
- span.innerText = errors[k]
- el.after(span)
+ el.classList.add('error')
}
}
})
},
activeTab(tab){
this.tab = tab
+ this.resetUrlAccount()
},
getUser(){
let root = this
place-content: center
padding: 0
position: relative
+ &.error:before
+ border-color: theme('colors.red')
&:before
content: ""
width: 16px
.line-up
border-top: 1px solid #D5D7DF
+
+[class*="-form-errors"]
+ padding: 20px
+ background: rgba(248,30,96,.21)
+ li
+ color: theme('colors.red')
+ &:not(:last-child)
+ padding-bottom: 3px
</ul>
<div class="account-container-content bg-grey-200">
- <div id="account-infos" v-if="tab === 'infos'">
+ <div id="account-infos" v-cloak v-if="tab === 'infos'">
<div class="pb-12 border-b border-b-light-b">
<h2 class="text-2xl m-0">{{ $client->company }}</h2>
<p>
N° TVA : {{ $client->vat }}<br>
SIREN : {{ $client->siren }}
</p>
- <a href="">{{ __('Signaler une modification') }}</a>
+ <a href="/contact">{{ __('Signaler une modification') }}</a>
</div>
<div class="ajax-form flex flex-col pt-12">
<h2 class="text-2xl m-0">{{ __('Mes coordonnées') }}</h2>
@svg('icon-white-add')
</button>
</div>
- <div class="ajax-form flex flex-col pt-12" v-for="(address, key) in addresses" :key="key">
+ <div class="ajax-form flex flex-col pt-12" v-for="(address, key, index) in addresses" :key="key">
<address-form />
</div>
</div>
<div class="signup-form" v-cloak v-if="!emailExist && validateEmail">
<div class="ajax-form flex flex-col max-w-half">
<div class="form-info text-navy mb-10">
- <h1 class="text-4xl m-0">Créer un compte</h1>
+ <h1 class="text-4xl m-0">{{ __("Créer un compte") }}</h1>
+ </div>
+ <div class="signup-form-errors mb-10" v-if="errorsForm.length > 0">
+ <ul class="list-disc list-inside text-red">
+ <li class="leading-5" v-for="(errorName,errorKey) in errorsForm">
+ @{{ errorName[0] }}
+ </li>
+ </ul>
</div>
<form id="signup-form" class="form-portal" @submit.prevent="signup()">
@csrf
<div class="form-group mb-12">
<h2 class="text-2xl">{{ __('Profil') }}</h2>
<div class="fields grid">
- <label class="form-input half mb-6 text-navy">
- {{ __('Nom') }}<span>*</span>
- <input class="py-3 mt-3" type="text" required="required" name="lastname" />
- </label>
<label class="form-input half mb-6 text-navy">
{{ __('Prénom') }}<span>*</span>
<input class="py-3 mt-3" type="text" required="required" name="firstname" />
</label>
+ <label class="form-input half mb-6 text-navy">
+ {{ __('Nom') }}<span>*</span>
+ <input class="py-3 mt-3" type="text" required="required" name="lastname" />
+ </label>
<label class="form-input text-navy">
{{ __('Téléphone') }}<span>*</span>
<input class="py-3 mt-3" type="text" required="required" name="phone" />
<input class="py-3 mt-3" type="text" required="required" name="company" />
</label>
<label class="form-input mb-6 text-navy">
- {{ __('TVA') }}<span>*</span>
- <input class="py-3 mt-3" type="text" required="required" name="vat" />
+ {{ __('Numéro de TVA intracommunautaire') }}<span>*</span>
+ <input class="py-3 mt-3" type="text" v-mask="'SS###########'" required="required" name="vat" />
</label>
<label class="form-input text-navy">
{{ __('Siren') }}<span>*</span>
- <input class="py-3 mt-3" type="text" required="required" name="siren" />
+ <input class="py-3 mt-3" type="text" v-mask="'#########'" required="required" name="siren" />
</label>
</div>
<div class="form-group">
<input type="hidden" value="1" name="address[billing][billing_address]" />
<input type="hidden" :value="address_choice ? '1' : '0'" name="address[billing][delivery_address]" />
<input type="hidden" value="0" name="address[billing][id]" />
- <input type="hidden" :value="address_choice ? '0' : '1'" name="address[delivery][id]" />
+
+ <label class="flex mb-6">
+ <input type="checkbox" v-model="address_choice" checked name="same-address" class="w-4 h-4" />
+ <span class="ml-4">{{ __('Mon adresse de facturation est identique à mon adresse de livraison') }}</span>
+ </label>
<div class="form-group line-up mt-12 pt-12" v-if="!address_choice">
<label class="form-input mb-6 text-navy">
</div>
<input type="hidden" value="0" name="address[delivery][billing_address]" />
<input type="hidden" value="1" name="address[delivery][delivery_address]" />
+ <input type="hidden" :value="address_choice ? '0' : '1'" name="address[delivery][id]"/>
</div>
</div>
<div class="form-group">
- <label class="flex mb-6">
- <input type="checkbox" v-model="address_choice" checked name="same-address" class="w-4 h-4" />
- <span class="ml-4">{{ __('Mon adresse de facturation est identique à mon adresse de livraison') }}</span>
- </label>
<label class="flex mb-6">
<input type="checkbox" name="confirm_condition" class="w-4 h-4" />
<span class="ml-4">{{ __('J’accepte que PM Instrumentation utilise mes informations personnelles dans une démarche de relation clientèle') }}</span>
<div class="form-text mb-6">
En nous transmettant votre demande, vous acceptez que PM Instrumentation traite vos données
personnelles dans le but de vous offrir un service de qualité. Pour plus d’information sur
- la protection de vos données à caractère personnel, vous pouvez consulter la page Vie
- <a href="" target="_blank" rel="noopener">privée</a>
+ la protection de vos données à caractère personnel, vous pouvez consulter la page
+ <a href="/vie-privee" target="_blank" rel="noopener">Vie privée</a>
</div>
</div>
<div class="form-footer flex flex-wrap-reverse justify-between items-center">
<a href="/mon-compte">
<span>{{ __('Mon compte') }}</span>
</a>
+ <ul>
+ <li>
+ <a href="/mon-compte#address" @click.stop="tab = 'address'">
+ <span>{{ __('Mes adresses') }}</span>
+ </a>
+ </li>
+ </ul>
</li>
<li>
<a href="">