Към съдържанието
PN Scripts

Разработка

Данни за фактура с ЕИК и ДДС номер в поръчката на WooCommerce

  • PN Scripts
  • 8 мин четене

Българският онлайн магазин започва да продава на фирми по-рано, отколкото очаква. Офис поръчва кафе, работилница поръчва инструменти, детска градина поръчва хартия и всеки от тях иска фактура на фирмата. WooCommerce няма поле за фирмен идентификатор, затова магазините обикновено минават с бележка към поръчката („моля, фактура на Пример ЕООД, ЕИК ...“) или с телефонно обаждане. И двата начина свършват по един и същ начин: грешна цифра в деветцифрено число, фактура, издадена наново, и счетоводител, който търси данни в края на месеца. Тук показваме как да събирате данните за фактура както трябва в поръчката на WooCommerce, какво може да се провери автоматично и къде трябва да стигнат данните.

#Какво да питате и кога

Фактура към фирма в България обикновено съдържа тези данни:

  • името на фирмата, както е регистрирана;
  • ЕИК, идентификаторът на фирмата в Търговския регистър, или код по БУЛСТАТ;
  • ДДС номер, ако фирмата е регистрирана по ДДС;
  • материално отговорното лице (МОЛ), което много счетоводители още пишат във фактурите;
  • адреса на регистрация, който често не е адресът за доставка.

Кои от тях вашите фактури трябва да съдържат и кои са само обичайни, е въпрос към счетоводителя ви: Законът за ДДС определя съдържанието на фактурата, а практиката се различава при регистрираните и нерегистрираните по ДДС продавачи. Задачата на поръчката е по-проста. Тя трябва да събере това, което счетоводителят ви иска, чисто и само от клиентите, които искат фактура.

Последното е важно. Повечето поръчки идват от хора, на които не им трябва фактура, а пет допълнителни полета пред тях струват продажби. Обичайното решение е една отметка „Искам фактура“, която отваря полетата. Втори избор, „Фактура на: фирма / мен като физическо лице“, покрива частните клиенти, които искат фактура на свое име: за тях стигат името и адресът за плащане, а фирмените полета остават затворени.

#Блоковата и класическата поръчка са два различни свята

Много по-стари ръководства добавят полета за фактура с филтъра woocommerce_checkout_fields. Той още работи в класическата поръчка (шорткода [woocommerce_checkout]), но блоковата поръчка, която е по подразбиране в новите магазини с WooCommerce, не го вижда. Блоковата поръчка има собствен интерфейс за допълнителни полета: woocommerce_register_additional_checkout_field(). Регистрираните там полета изглеждат като останалата част от поръчката, записват се в нея, показват се в екрана на поръчката и в имейлите и се проверяват на сървъра през Store API.

От WooCommerce 9.9 тези полета могат да бъдат и условни: правило в JSON Schema казва кога полето е задължително и кога е скрито, а WooCommerce го проверява в браузъра и отново на сървъра. Скритите полета се изчистват, така че клиент, който отвори фирмените полета и после ги затвори, не оставя случаен ЕИК в поръчката. Съкратен вариант на регистрацията:

add_action('woocommerce_init', function () {
    $invoiceTicked = [
        'type' => 'object',
        'properties' => ['checkout' => ['properties' => ['additional_fields' => [
            'type' => 'object',
            'properties' => ['myshop/invoice' => ['const' => true]],
            'required' => ['myshop/invoice'],
        ]]]],
    ];

    woocommerce_register_additional_checkout_field([
        'id' => 'myshop/invoice',
        'label' => 'Искам фактура',
        'location' => 'order',
        'type' => 'checkbox',
    ]);

    woocommerce_register_additional_checkout_field([
        'id' => 'myshop/eik',
        'label' => 'ЕИК / БУЛСТАТ',
        'location' => 'order',
        'type' => 'text',
        'required' => $invoiceTicked,
        'hidden' => ['not' => $invoiceTicked],
    ]);
});

WooCommerce пази стойностите като мета данни на поръчката под _wc_other/myshop/eik, които могат да четат и други инструменти, познаващи допълнителните полета. Ако магазинът ви още ползва класическата поръчка, трябват ви и двете: филтърът за класическата форма и регистрацията за блоковата, така че смяна на темата да не загуби полетата без никой да забележи.

#Проверявайте ЕИК, докато клиентът пише

ЕИК има 9 цифри или 13 за клон или единица по БУЛСТАТ, а последната му цифра е контролна, изчислена по алгоритъма на Агенцията по вписванията. Тринайсетцифреният вариант има втора контролна цифра в края. Това означава, че повечето грешки при писане могат да се хванат преди поръчката, без да питате външна услуга:

function clean_id(string $value): string
{
    return strtoupper((string) preg_replace('/[\s.\-\/]+/u', '', $value));
}

function eik_is_valid(string $value): bool
{
    $eik = clean_id($value);
    if (! preg_match('/^(\d{9}|\d{13})$/', $eik)) {
        return false;
    }
    $check = static function (array $digits, array $first, array $second): int {
        $sum = fn (array $w) => array_sum(array_map(fn ($d, $x) => $d * $x, $digits, $w)) % 11;
        $r = $sum($first);
        if ($r === 10) {
            $r = $sum($second);
        }
        return $r === 10 ? 0 : $r;
    };
    $d = array_map('intval', str_split($eik));
    if ($check(array_slice($d, 0, 8), [1, 2, 3, 4, 5, 6, 7, 8], [3, 4, 5, 6, 7, 8, 9, 10]) !== $d[8]) {
        return false;
    }
    return strlen($eik) === 9
        || $check(array_slice($d, 8, 4), [2, 7, 3, 5], [4, 9, 5, 7]) === $d[12];
}

Сравнихме тази функция с проверката в нашия плъгин на 200 000 случайни числа и двете дадоха един и същ отговор за всяко. Същите правила, заедно с ЕГН и IBAN, са обяснени стъпка по стъпка в ръководството ни за българска валидация в Laravel.

Два детайла правят проверката приятна. Първо изчистете въведеното: клиентите поставят числа с интервали, точки и тирета от собствените си документи. И кажете какво не е наред: „ЕИК има 9 или 13 цифри, а този има 8“ помага, „Невалидна стойност“ не. Проверявайте в браузъра, когато клиентът напусне полето, и отново на сървъра при поръчката, защото проверката в браузъра може да бъде заобиколена.

#ДДС номерът: първо формат, после VIES

Българският ДДС номер е „BG“, последвано от деветцифрения ЕИК на фирмата или от 10 цифри за физическо лице, регистрирано по ДДС. Клиентите често пропускат „BG“; спокойно може да се добави пред 9 или 10 цифри без префикс. Номерата от другите страни в ЕС имат свои публикувани формати (DE и девет цифри, NL с „B“ по средата и т.н.), а проверката на формата хваща очевидните грешки.

Верният формат не доказва, че номерът е регистриран. За това Европейската комисия поддържа VIES, която пита собствената база данни на държавата членка. VIES има прост REST интерфейс и към него се изпраща само ДДС номерът:

GET https://ec.europa.eu/taxation_customs/vies/rest-api/ms/BG/vat/123456786
Accept: application/json

{"isValid": false, "userError": "INVALID", "name": "", "address": "", ...}

Валидният отговор обикновено идва с регистрираното име и адрес, които е удобно да пазите в поръчката до това, което клиентът е написал. Някои държави членки не ги споделят и вместо тях връщат три тирета. Три практични правила:

  • Различавайте „недостъпно“ от „невалидно“. Националните бази спират за поддръжка и тогава VIES отговаря с грешки като MS_UNAVAILABLE. Да откажете поръчка, защото сървър в друга държава не работи, губи продажба; да я пуснете с отметка „не е проверен“ позволява някой да погледне по-късно.
  • Пазете отговора за известно време. Един ден е разумно. Клиентът може да изпрати поръчката три пъти, докато поправя адреса си.
  • Пазете отговора в поръчката. Резултатът, часът на проверката и върнатото име показват какво сте знаели, когато сте издали фактурата.

#Къде трябва да стигнат данните

Събирането на данните е половината работа. Те са полезни само там, където хората ги търсят:

  • на страницата след поръчката и в „Моят профил“, за да вижда клиентът какво е въвел;
  • в имейла за поръчката до магазина, с резултата от VIES;
  • в отделно поле в екрана на поръчката, с начин да ги копирате в програмата за фактури и да поправите грешка, която клиентът съобщи;
  • в месечен списък на поръчките с искана фактура, изнесен за счетоводителя.

За този файл CSV в UTF-8 с точка и запетая се отваря директно в Excel на български. Записвайте клетките, които започват с „=“, „+“, „-“ или „@“, като текст: име на фирма, написано като формула, никога не бива да се изпълни като формула на компютъра на счетоводителя.

#Плъгин, който прави всичко това

Вградихме тези стъпки в Rekvizit, плъгин за WooCommerce за български магазини. „Искам фактура“ отваря фирмените полета в блоковата поръчка (като условни допълнителни полета) и в класическата. Контролните цифри на ЕИК и форматът на ДДС номера се проверяват, докато клиентът пише, и отново на сървъра, а проверката във VIES може да се включи, като вие избирате какво става, когато VIES не отговаря. Данните се виждат в поръчката, в имейлите, в поле в екрана на поръчката с бутон за копиране и в месечен CSV за счетоводителя. Плъгинът събира и проверява данните; не издава и не номерира фактури. Тестван е с 69 автоматични теста и пълно изпълнение на WordPress 7.1.3 и WooCommerce 11.2.1 с двата начина за съхранение на поръчките и е обявен като „Очаквайте скоро“.

#Често задавани въпроси

Не мога ли просто да искам ЕИК в бележката към поръчката?

Можете, но нищо не го проверява, нищо не го пази в отделно поле и някой трябва да го преписва от свободен текст за всяка поръчка. Грешката се открива едва когато фактурата бъде върната.

Вярната контролна цифра означава ли, че фирмата съществува?

Не. Тя показва само, че числото може да е ЕИК. Повечето грешки при писане не минават проверката, но измислено число може да мине. VIES потвърждава регистрацията по ДДС, а Търговският регистър потвърждава фирмата.

Какво става, ако VIES не работи, когато клиентът поръчва?

Това е ваш избор. Ако пуснете поръчката и отбележите номера като непроверен, запазвате продажбата; ако я откажете, докато VIES отговори, сте по-строги. Повечето малки магазини избират първото.

Задължителен ли е ДДС номерът за всяка фирма?

Не. Само фирмите, регистрирани по ДДС, имат такъв номер, затова полето трябва да е по желание. Попитайте счетоводителя си дали фактурите ви трябва да го съдържат, когато клиентът има номер.

#Източници

Още по темата

Още по темата

Коментари

Коментари

Напишете първия коментар.

Оставете коментар

Следваща стъпка

pnscripts.com/bg/contact

Пишете на екипа

Попитайте за статия или ни разкажете за проект, който искате да изградим. Отговаряме до един работен ден.

Пишете ни

Семейството PN Scripts

Другите сайтове на PN Scripts

Хостингът, игрите и блогът имат свои сайтове, поддържани от същата компания.

  • pnscripts.com

    PN Scripts

    Софтуерно инженерство

    Уеб и мобилни приложения, API и игри по поръчка, плюс нашите продукти и плъгини с отворен код.

  • games.pnscripts.com

    Игри

    Игри и игрови сървъри

    Домът на игрите на PN Scripts: безплатни браузърни игри, които се играят веднага, а игровите сървъри предстоят.

  • hosting.pnscripts.com

    Хостинг

    Хостинг и инфраструктура

    Споделен хостинг, KVM VPS, самостоятелни сървъри и домейни от същата компания, която изработва проекта ви.

  • blog.pnscripts.com

    Блог

    Статии и бележки

    Практични статии за разработка на софтуер, хостинг, отворен код и игри, писани от хората, които ги създават.

    Вие сте тук