Mamy tutaj kilka tematów :-)
Ad moje główne pytanie:
Ja to zrobiłem na moje potrzeby po prostu bezpośrednio w CRM_ContactsCommon modyfikując waszą funkcję
public static function check_tax_id_unique($data) {
if(trim($data['tax_id'])) {
if (substr(trim($data['tax_id']),0,3) <> '---'){ //PR150713 - omijaj walidację jeśli NIP zaczyna się od '---'
if(self::$rid)
$c = self::get_companies(array('tax_id'=>$data['tax_id'],'!id'=>self::$rid));
else
$c = self::get_companies(array('tax_id'=>$data['tax_id']));
if($c) {
$rec = array_shift($c);
return array('tax_id'=>__( 'Tax ID duplicate found: %s', array(Utils_RecordBrowserCommon::create_default_linked_label('company', $rec['id']))));
}
}
} //PR150713
return array();
}
Dodałem tylko jeden warunek.
Jak widać po prostu mamy omiń walidację jeśli NIP zaczyna się od '---' (dalej może być dowolnie)
Czyli: Jeśli zostawiamy puste to jest źle (to sprawdzam na etapie wydruku faktury)
Jeśli wpisujemy '--------' czyli co najmniej trzy kreski na początku - to nie sprawdzamy walidacji bo to nie jest NIP, ale wiemy, że ktoś to świadomie tak wpisał.
I tutaj mógłby się przydać Twój QFfield_tax_id do rysowania stałej zawsze ilości kresek (choć user wpisał np. ---647839 - co i tak jest niepoprawnym NIPem)].
Dla reszty ma walidować unikalność NIP (tak jak w 1.6.5) + rzeczywiście przydałaby się lepsza funkcja testująca poprawność NIP.
Mam takąż ale też uproszczoną - testuję tylko NIP'y polskie - robię to po prostu testując ilość cyfr po usunięciu wszystkich znaków nie będących cyframi (regex'em). (ma być 10 cyfr) i ew, sprawdzam czy na początku sa 2 litery (NIP unijny)
Wtedy uniezależniam się od tego kto gdzie wstawia kreski czy spacje.
Zastanawiając się nad taką funkcją myślę sobie, że w ogólności co kraj to może być inny format NIP. (choć się na tym nie znam)
Może należało by napisać ogólną funkcję check_tax_id, która powinna odwoływać się do definicji formatu tax_id umieszczonej może w CommonData lub generalnie w słowniku (commonData ma wadę, że tworzy tylko array(key=>value))
identycznie jak w "Krajach" kod kraju => definicja w regex'ie. (albo lepiej rozszerzyć kraje o kolejną kolumnę, ale trzeba by przebudowywać pewnie commondata jesli to jest w słowniku a nie osobnej tablicy (już nie sprawdzam).
Społeczność pewnie by dopisała te regex'y tylko trzeba by im zbudować gdzie mieli by to wpisywać. W sumie nie wydaje się to trudne.
Aczkolwiek zawsze jest problem z czasem :-)
Już nie kusze się na sprawdzanie sum kontrolnych (chociaż też by można było), aczkolwiek to zapewne rozwiązała by kolejna kolumna i pseudokod.
Pozdrawiam
Praski.