2017. január elsejétől szigorodtak a számlakiállításra vonatkozó jogszabályok, melynek eredményeképp bizonyos esetekben (“amennyiben a számla áfatartalma több mint 100 000 Ft”) ténylegesen kötelező feltüntetni az adószámot. Erről bővebben ITT, vagy a szamlazz.hu blogjában olvashatsz.
Ha szeretnéd kötelezően kitöltendő adatnak minősíteni az adószámot a Prestashop-odban, nehézségekbe fogsz ütközni.
A probléma
A fő gond az, hogy jelenleg ha kitöltöd a “Cég” mezőt akkor az “Adószám” mező ettől még nem lesz kötelezően kitöltendő, pedig így lenne logikus.
Az Admin felületen a Vásárlók => Címekben (Customers => Addresses) legalul kötelezővé tudod tenni az adószám mezőt az “Állítsa be a kötelező mezőket” fülön belül. Ezáltal valóban kötelező lesz kitölteni, de…
- mindenkinél: független attól, hogy a “Cég” mező ki van-e töltve vagy sem, valamint
- a jelenlegi sablonoknál ha a “Cég” mező nincs kitöltve az “Adószám” mező meg sem jelenik, így a vásárló nem fogja érteni, hogy az adatok elmentésekor miféle kötelezően kitöltendő adószámot kér a rendszer holott ő nem lát ilyen mezőt. Azt meg nem teheted meg, hogy kötelezővé teszed a “Cég” mezőt is (ezáltal kerülve el azt, hogy ne jelenjen meg az “Adószám”) mert így annak is ki kellene töltenie ezt a mezőt aki egyébként nem cégként akar regisztrálni hanem egyszerű magánszemélyként.
Tehát ez egyáltalán nem járható út. A megoldás az lenne, ha lenne…
- opció az admin felületen az adószám kötelező bekérésére akkor, ha a “Cég” mezőt kitöltötték, vagy
- úgy működne a Lokalizáció => Országok => Magyarország => “Kötelező az adószám?” IGEN-NEM-es opciója ahogyan azt a magyar ember elvárná a fordítás alapján. Ha ezt IGEN-re tesszük, a regisztrációs (vagy címmegadási) folyamat végén megjelenik egy új blokk “Adóazonosító” címen, alatta egy szövegmező “Azonosító szám”-mal, magyarázatként “Igazolványszám”-mal. Meglehetősen érthetetlen. Főleg, mivel ennek semmi köze nincs ahhoz, hogy a fenti “Cég” mezőt kitöltöm-e, vagy sem. Ez az opció az eredeti nyelven már érthetőbb: “Tax identification number (DNI / NIF / NIE)” ami nem mást jelent, mint az adóazonosító számot ami magát a személyt azonosítja. Erről bővebben ITT olvashatsz. Nekünk ebben az esetben nem erre van szükségünk.
A megoldás
Egy biztos gyógyír a fenti problémára az, ha az “Adószám” mezőt kötelezővé tesszük akkor, ha a regisztrálni kívánó kitölti a “Cég” mezőt. Két helyen fogunk a kódba nyúlni: egy a regisztrációhoz kell, egy a címmódosításhoz/címkészítéshez.
Az alábbi kódrészletet fogjuk beépíteni:
if ( isset($address->company)&& $address->company !="")
{
if((isset($_POST['vat_number']) && $_POST['vat_number']=='') || !isset($_POST['vat_number']))
$this->errors[] = Tools::displayError('Kötelező a céges adószám!');
}
Szerkesztőben:
A képen a DNI kódja is látható, pont azért hagytam benne mert ezt a részt fogjuk keresni. Mint említettem két fájlra lesz szükségünk: az “AddressController.php
“-re és az “AuthController.php
“-re, mindkettő a “/controllers/front/
” mappában lesz. Előbbi a címért felel, utóbbi a regisztrációnál létrehozott címért.
Nyissuk meg az egyiket és keressünk rá a “DNI” szócskára. Mindkét fájl esetében egyetlen blokkot fogunk találni ami ezzel foglalkozik. Ha megleltük, üssünk pár entert utána, hogy üres sorokat – helyet – kapjunk magunknak és illesszük be a fenti kódot (mely mindkét fájlnál alkalmazható).
Ha kész (remélem mondanom sem kell: mentés mindig legyen!) töltsük vissza és próbáljuk ki, működik-e. Adjuk meg a “Cég“-et, de adószámot ne. Ha az alábbi hibaüzenetet kapjuk:
Akkor sikerült 🙂 Ha nem látod a változást, ellenőrizd a cache/gyorsítótár dolgokat és nézd meg, hogy a sablonkompilálás engedélyezett-e.
Sok sikert! Eladásra fel! 🙂
Szerkesztés 2020.06.26.-án:
Sajnos az 1.7-es ezt a részt sokkal bonyolultabban oldja meg egyhatos elődjénél (legalábbis nekem).
Tekintve a határidő közeledtét (2020. július elseje) tűzoltásképp kiegészítettem a megrendelés forráskódját, mely nem real-time figyeli az adószám meglétét a cím megadásánál hanem azt a kosárban, a cím kiválasztásakor ellenőrzi. Amennyiben a kiválasztott címnél hiányosnak érzékeli azt (cégnév ki van töltve de a hozzá tartozó adószám nem) úgy javascript alert ablakkal szól, majd automatikusan átirányít az adott cím szerkesztéséhez.
Átirányítás után tudod szerkeszteni a hiányzó címet:
Majd ha kész, visszamész a kosárba és befejezed a rendelést.
Alapvetően az OrderController.php
-t kellene szerkeszteni (/controllers/front/OrderController.php
), de természetesen elkészítheted override-ként is. Fontos azonban, hogy legyen mentésed/backup-od a fájlról. A szóban forgó kontrollerben keresd ki a “restorePersistedData
” function-t, majd az abban lévő “if (!$customer->isGuest() && !empty($invalidAddressIds)) {
” else ágába (a checksum után) másold be a következőt:
$address = new Address($this->context->cart->id_address_delivery);
if ( $address->company > "" AND $address->vat_number == "" ) {
echo '<script language="javascript">';
echo 'alert("A kiválasztott címednél ('.$address->alias.') kitöltötted a cégnevet, de nem adtál meg hozzá adószámot. Kattints az OK gombra, átirányítunk a címed szerkesztéséhez ahol pótolhatod a hiányosságot. Ha nem akarsz adószámot megadni akkor töröld a cégnevet a címedből.");';
echo 'window.location.replace("https://'.$_SERVER['SERVER_NAME'].'/address?id_address='.$cart->id_address_delivery.'");';
echo '</script>';
}
Közelebbről:
Tudom, hogy ez nem a legszebb módszer (az lenne a legjobb ha minden címes form-nál real-time ellenőrizne) de azt még nem sikerült abszolválni. Később minden bizonnyal előállok valami szofisztikáltabb módszerrel. A fenti kód természetesen nem változik a nyelvekkel (ha többnyelvű a shopod), ebben az esetben használhatod a:
$this->context->customer->id_lang;
változót, mely visszatér az éppen használatban lévő nyelv ID-jével – erre pedig már tudsz írni könnyedén egy if-else feltételes utasítást, majd a szöveget ettől függően adod meg az alert-ben.
Utólagos megjegyzés: mint látod a https:// égetve van. Úgy gondolom ma már nincs webshop SSL nélkül, de ha mégis… hát az baj. 😀 Javítsd minél előbb! Ettől függetlenül ha kell, módosítsd ezt a részt (akár a https, akár a www miatt).
Szerkesztés 2021.04.01.-én:
alkottunk egy javascript alapú szofisztikáltabb megoldást. Nyisd meg a témádon belüli custom.js-t ( /public_html/themes/classic/assets/js/custom.js ) és írd bele (ha van már benne tartalom, akkor állj a fájl végére és illeszd be):
/*
* Custom code goes here.
* A template should always ship with an empty custom.js
*/
$( document ).ready(function() {
$("input[name='vat_number']").parents(":eq(1)").addClass('vat-number-div');
$(".vat-number-div").hide('slow');
$( "input[name='company']" ).keyup(function() {
if (($("input[name='company']").val().length) > 0) {
$(".vat-number-div").fadeIn('slow');
} else {
$(".vat-number-div").hide('slow');
$("input[name='vat_number']").val('');
}
});
$( ".js-country" ).click(function() {
setInterval(function(){
if ($("input[name='company']").val().length) {
$(".vat-number-div").fadeIn('slow');
$("input[name='vat_number']").attr('required', 'required');
}
if ($("input[name='company']").val().length == 0) {
$("input[name='vat_number']").parents(":eq(1)").addClass('vat-number-div');
$("input[name='vat_number']").removeAttr('required');
$(".vat-number-div").hide('slow');
}
}, 3000);
});
$( ".js-address-form .btn[type='submit']" ).click(function() {
if ($("input[name='company']").val().length) {
$(".vat-number-div").fadeIn('slow');
$("input[name='vat_number']").attr('required', 'required');
}
if (($("input[name='company']").val().length) == 0) {
$("input[name='vat_number']").removeAttr('required');
$("input[name='vat_number']").parents(":eq(1)").addClass('vat-number-div');
}
});
$( "button[name='confirm-addresses']" ).click(function() {
if ($("input[name='company']").val().length) {
$(".vat-number-div").fadeIn('slow');
$("input[name='vat_number']").attr('required', 'required');
}
if (($("input[name='company']").val().length) == 0) {
$("input[name='vat_number']").removeAttr('required');
$("input[name='vat_number']").parents(":eq(1)").addClass('vat-number-div');
}
});
});
Képekben:
De a fájl innen le is tölthető:
https://prestashop.keszites.net/cikkek/custom.js
Ez azt eredményezi, hogy mindenhol ahol címet kell megadni vagy szerkeszteni ott elrejti az Adószám mezőt mindaddig, míg a Cégnév ki nincs töltve. Amint kitöltjük az Adószám mező megjelenik és kötelezővé válik:
Amint elkezdjük kitölteni a Cégnevet, az Adószám megjelenik és kötelezővé válik:
A javascript berakása után ürítsünk cache-t a Prestashop adminban (Haladó Beállítások => Teljesítmény):
Illetve érdemes a saját böngészőkben is üríteni (Előzmények => Böngészési adatok törlése), vagy esetleg Google Chrome használata esetén használhatjuk a ctrl + shift + r billentyűkombinációt is.
Kedves Attila! Köszönjük a remek megoldást 🙂
Szia Attila!
Köszi szépen a leírást, én magamtól kezdtem el megoldást találni, de férfiasan bevallom, nem jutottam sokra és abba a hibába futottam bele, amit írtál is problémának.
Annyi kiegészítést tennék az PS 1.6-os verzióhoz, hogy – bár tény, nem is írtad, de sokan, többek közt én is belefutottam ebbe – nem kell kötelező tenni az adószámot a Vásárlók / Címek / Kötelező mezőknél, mert akkor a Cégtől függetlenül is kérni fogja. Esetleg sablonban lehet manuálisan “megcsillagozni” és a fordításoknál hozzáírni, amit te is írtál, hogy Adószám (cég esetén kötelező)
Még egyszer köszi!
Kedves Attila!
Így közel két év elteltével minden esetben kötelező lett cégek esetén az adószám megadása. Ha PS 1.7-re is sikerülne megoldást találni, biztosan sokan hálásak lennénk érte 🙂
Kedves Csaba!
Mások is kérték már illetve hajt a határidő, szóval biztosan kitalálok valamit rá napokon belül.
Kedves Attila, ennek a módszernek 1.7-es verziónál is működnie kellene? Megnyitottam a jelzett file-okat, de nincs bennük DNI-s rész.
Kedves Ilcsy,
sajnos biztos hogy nem, de utánanézünk! 🙂