---
title: Dodatkowe pole Chcę otrzymać fakturę
description: "W tym przypadku dodajemy pole checkbox Chcę otrzymać fakturę. Po zaznaczeniu pojawia się pole number NIP oraz textarea Dane do faktury. Walidacja odbywa się zarówno w functions.php jak i w global.js. functions.php: ``` function custom_checkout_customer_field( $checkout ) { woocommerce_form_field( 'faktura',…"
url: "https://www.investnet.pl/baza-wiedzy/dodatkowe-pole-chce-otrzymac-fakture/"
updated: "2024-02-05"
category: Porady i tipy WooCommerce
---

# Dodatkowe pole Chcę otrzymać fakturę

W tym przypadku dodajemy pole checkbox Chcę otrzymać fakturę. Po zaznaczeniu pojawia się pole number NIP oraz textarea Dane do faktury. Walidacja odbywa się zarówno w functions.php jak i w global.js.

functions.php:

```
function custom_checkout_customer_field( $checkout ) {
		woocommerce_form_field( 'faktura', array(
			'type'            => 'checkbox',
			'label' => __('Chcę otrzymać fakturę'),
			'required'        => false,
			'class'           => array('faktura-field', 'form-row-wide'),
		), get_user_meta( get_current_user_id(), 'faktura' , true  ) );

		woocommerce_form_field( 'nip', array(
			'type'            => 'number',
			'label' => '',
			'placeholder'         => __('Numer NIP') . ' *',
			'required'        => true,
			'class'           => array('nip-field', 'form-row-wide'),
		), get_user_meta( get_current_user_id(), 'nip' , true  ) );

		woocommerce_form_field( 'dane_do_faktury', array(
			'type'            => 'textarea',
			'label' => '',
			'placeholder'         => __('Dane do faktury') . ' *',
			'required'        => true,
			'class'           => array('dane-do-faktury-field', 'form-row-wide'),
		), get_user_meta( get_current_user_id(), 'dane_do_faktury' , true  ) );
}
add_action( 'woocommerce_before_checkout_billing_form', 'custom_checkout_customer_field' );

function custom_checkout_customer_get_field_values() {
    $fields = [
      'faktura'	=> '',
	  'nip'			=> '',
	  'dane_do_faktury' => '',
    ];

    foreach( $fields as $field_name => $value ) {
      if( !empty( $_POST[ $field_name ] ) ) {
        $fields[ $field_name ] = sanitize_text_field( $_POST[ $field_name ] );
      } else {
        unset( $fields[ $field_name ] );
      }
    }
    return $fields;
}

function custom_checkout_customer_field_save( $order_id ) {
	$order = wc_get_order( $order_id );
    $field_values = custom_checkout_customer_get_field_values();
    foreach( $field_values as $field_name => $value ) {
      if( !empty( $field_values[ $field_name ] ) ) {
        update_post_meta( $order_id, $field_name, $value );
		 if( $order->get_user_id() > 0 ) {
            update_user_meta( $order->get_user_id(), $field_name, $value );
        }
      }
    }
}
add_action( 'woocommerce_checkout_update_order_meta', 'custom_checkout_customer_field_save' );

function custom_checkout_customer_field_validate() {
    $field_values = custom_checkout_customer_get_field_values();
	$faktura = filter_input(INPUT_POST, 'faktura');
	if($faktura == true) {
    if ( empty( $field_values['nip'] ) ) {
      wc_add_notice( __('Uzupełnij numer NIP.'), 'error' );
    }

	if ( !empty( $field_values['nip'] ) ) {
		$billing_nip = filter_input(INPUT_POST, 'nip');
		$valid = true;
		   $customer_country = WC()->customer->get_billing_country();
		   if ( in_array( $customer_country, WC()->countries->get_european_union_countries() ) ) {
			$valid = is_eu_vat_number_valid( $billing_nip, $customer_country );
		}
		if ( false === $valid ) {
			 wc_add_notice( sprintf( __( 'Niepoprawny numer NIP. Proszę podaj poprawny.' )), 'error', array('id'=>'nip') );
		}
	}
	}
}
add_action( 'woocommerce_checkout_process', 'custom_checkout_customer_field_validate' );
function is_eu_vat_number_valid( $id, $customer_country ) {
    $id = strtoupper( $id );
    $id = preg_replace( '/[ -,.]/', '', $id );
    if ( strlen( $id ) < 8 ) {
        return false;
    }
    $country                     = substr( $id, 0, 2 );
    $woocommerce_default_country = get_option( 'woocommerce_default_country', 0 );

    if ( ! in_array( $customer_country, WC()->countries->get_european_union_countries() ) ) {
        $id      = $customer_country . $id;
        $country = $customer_country;
    } else {
        if ( $woocommerce_default_country === $customer_country ) {
            if ( $country != $customer_country ) {
                $id      = $customer_country . $id;
                $country = $customer_country;
            }
        }
    }
    if ( $country !== $customer_country ) {
        return false;
    }

    switch ( $country ) {
        case 'AT': // AUSTRIA
            $isValid = (bool) preg_match( '/^(AT)U(d{8})$/', $id );
            break;
        case 'BE': // BELGIUM
            $isValid = (bool) preg_match( '/(BE)(0?d{9})$/', $id );
            break;
        case 'BG': // BULGARIA
            $isValid = (bool) preg_match( '/(BG)(d{9,10})$/', $id );
            break;
        case 'CHE': // Switzerland
            $isValid = (bool) preg_match( '/(CHE)(d{9})(MWST)?$/', $id );
            break;
        case 'CY': // CYPRUS
            $isValid = (bool) preg_match( '/^(CY)([0-5|9]d{7}[A-Z])$/', $id );
            break;
        case 'CZ': // CZECH REPUBLIC
            $isValid = (bool) preg_match( '/^(CZ)(d{8,10})(d{3})?$/', $id );
            break;
        case 'DE': // GERMANY
            $isValid = (bool) preg_match( '/^(DE)([1-9]d{8})/', $id );
            break;
        case 'DK': // DENMARK
            $isValid = (bool) preg_match( '/^(DK)(d{8})$/', $id );
            break;
        case 'EE': // ESTONIA
            $isValid = (bool) preg_match( '/^(EE)(10d{7})$/', $id );
            break;
        case 'EL': // GREECE
            $isValid = (bool) preg_match( '/^(EL)(d{9})$/', $id );
            break;
        case 'ES': // SPAIN
            $isValid = (bool) preg_match( '/^(ES)([A-Z]d{8})$/', $id )
                       || preg_match( '/^(ES)([A-H|N-S|W]d{7}[A-J])$/', $id )
                       || preg_match( '/^(ES)([0-9|Y|Z]d{7}[A-Z])$/', $id )
                       || preg_match( '/^(ES)([K|L|M|X]d{7}[A-Z])$/', $id );
            break;
        case 'EU': // EU type
            $isValid = (bool) preg_match( '/^(EU)(d{9})$/', $id );
            break;
        case 'FI': // FINLAND
            $isValid = (bool) preg_match( '/^(FI)(d{8})$/', $id );
            break;
        case 'FR': // FRANCE
            $isValid = (bool) preg_match( '/^(FR)(d{11})$/', $id )
                       || preg_match( '/^(FR)([(A-H)|(J-N)|(P-Z)]d{10})$/', $id )
                       || preg_match( '/^(FR)(d[(A-H)|(J-N)|(P-Z)]d{9})$/', $id )
                       || preg_match( '/^(FR)([(A-H)|(J-N)|(P-Z)]{2}d{9})$/', $id );
            break;
        case 'GB': // GREAT BRITAIN
            $isValid = (bool) preg_match( '/^(GB)?(d{9})$/', $id )
                       || preg_match( '/^(GB)?(d{12})$/', $id )
                       || preg_match( '/^(GB)?(GDd{3})$/', $id )
                       || preg_match( '/^(GB)?(HAd{3})$/', $id );
            break;
        case 'GR': // GREECE
            $isValid = (bool) preg_match( '/^(GR)(d{8,9})$/', $id );
            break;
        case 'HR': // CROATIA
            $isValid = (bool) preg_match( '/^(HR)(d{11})$/', $id );
            break;
        case 'HU': // HUNGARY
            $isValid = (bool) preg_match( '/^(HU)(d{8})$/', $id );
            break;
        case 'IE': // IRELAND
            $isValid = (bool) preg_match( '/^(IE)(d{7}[A-W])$/', $id )
                       || preg_match( '/^(IE)([7-9][A-Z*+)]d{5}[A-W])$/', $id )
                       || preg_match( '/^(IE)(d{7}[A-W][AH])$/', $id );
            break;
        case 'IT': // ITALY
            $isValid = (bool) preg_match( '/^(IT)(d{11})$/', $id );
            break;
        case 'LV': // LATVIA
            $isValid = (bool) preg_match( '/^(LV)(d{11})$/', $id );
            break;
        case 'LT': // LITHUNIA
            $isValid = (bool) preg_match( '/^(LT)(d{9}|d{12})$/', $id );
            break;
        case 'LU': // LUXEMBOURG
            $isValid = (bool) preg_match( '/^(LU)(d{8})$/', $id );
            break;
        case 'MT': // MALTA
            $isValid = (bool) preg_match( '/^(MT)([1-9]d{7})$/', $id );
            break;
        case 'NL': // NETHERLAND
            $isValid = (bool) preg_match( '/^(NL)(d{9})Bd{2}$/', $id );
            break;
        case 'NO': // NORWAY
            $isValid = (bool) preg_match( '/^(NO)(d{9})$/', $id );
            break;
        case 'PL': // POLAND
            $isValid = (bool) preg_match( '/^(PL)(d{10})$/', $id );
            break;
        case 'PT': // PORTUGAL
            $isValid = (bool) preg_match( '/^(PT)(d{9})$/', $id );
            break;
        case 'RO': // ROMANIA
            $isValid = (bool) preg_match( '/^(RO)([1-9]d{1,9})$/', $id );
            break;
        case 'RS': // SERBIA
            $isValid = (bool) preg_match( '/^(RS)(d{9})$/', $id );
            break;
        case 'SI': // SLOVENIA
            $isValid = (bool) preg_match( '/^(SI)([1-9]d{7})$/', $id );
            break;
        case 'SK': // SLOVAK REPUBLIC
            $isValid = (bool) preg_match( '/^(SK)([1-9]d[(2-4)|(6-9)]d{7})$/', $id );
            break;
        case 'SE': // SWEDEN
            $isValid = (bool) preg_match( '/^(SE)(d{10}01)$/', $id );
            break;
        default:
            $isValid = false;
    }

    return $isValid;
}
```

global.js:

```
// CHECKOUT FIELDS VALIDATION

	$(document).ready(function() {
        var customerField       		= $('#faktura'),
			billingCompanyField			= $('#dane_do_faktury_field');
			billingCompanyFieldInput	= $('#dane_do_faktury');
			billingNIPField				= $('#nip_field');
			billingNIPFieldInput		= $('#nip');
        // Check that all fields exist
        if( !customerField.length || !billingCompanyField.length || !billingNIPField.length ) { return; }
        function toggleVisibleFields() {
          var selectedAnswer = customerField;
          if(!selectedAnswer.is(':checked')) {
            billingCompanyField.hide();
			billingCompanyFieldInput.prop( "disabled", true );
			billingNIPField.hide();
			billingNIPFieldInput.prop( "disabled", true );
          } else {
            billingCompanyField.show();
			billingCompanyFieldInput.prop( "disabled", false );
			billingNIPField.show();
			billingNIPFieldInput.prop( "disabled", false );
          }
        }

		$(document).on('change', 'input[name=faktura]', toggleVisibleFields);
		$('body').on('updated_checkout', toggleVisibleFields);
		toggleVisibleFields();

	});
	function validateVAT() {
		if($('.woocommerce-error li[data-id="vat-number"]').length > 0) {
			$('#nip_field').addClass('woocommerce-invalid-vat');
		} else {
			$('#nip_field').removeClass('woocommerce-invalid-vat');
		}
	}
```
