You are here

commerce_eu_vat.rules_defaults.inc in Commerce European Union VAT 7

Same filename and directory in other branches
  1. 7.2 commerce_eu_vat.rules_defaults.inc

File

commerce_eu_vat.rules_defaults.inc
View source
<?php

/**
 * @file
 * commerce_eu_vat.rules_defaults.inc
 */

/**
 * Implements hook_default_rules_configuration().
 */
function commerce_eu_vat_default_rules_configuration() {

  // Create a base rule to build on for each country.
  $base_rule = rules_and(array(
    'customer_profile' => array(
      'label' => t('Customer Profile'),
      'type' => 'commerce_customer_profile',
    ),
  ));
  $base_rule->tags = array(
    'EU VAT',
    'Place of Supply - Address',
  );
  $base_rule
    ->condition('entity_has_field', array(
    'entity:select' => 'customer-profile',
    'field' => 'commerce_customer_address',
  ));
  $base_rule
    ->condition(rules_condition('data_is_empty', array(
    'data:select' => 'customer-profile:commerce-customer-address',
  ))
    ->negate());

  // Place of Supply = AT.
  $rule = clone $base_rule;
  $rule->label = t('Place of Supply: Address in AT');
  $rule
    ->condition('data_is', array(
    'data:select' => 'customer-profile:commerce-customer-address:country',
    'op' => 'IN',
    'value' => array(
      'AT',
    ),
  ));
  $configs['commerce_eu_vat_rules_place_of_supply_address_at'] = $rule;

  // Place of Supply = BE.
  $rule = clone $base_rule;
  $rule->label = t('Place of Supply: Address in BE');
  $rule
    ->condition('data_is', array(
    'data:select' => 'customer-profile:commerce-customer-address:country',
    'op' => 'IN',
    'value' => array(
      'BE',
    ),
  ));
  $configs['commerce_eu_vat_rules_place_of_supply_address_be'] = $rule;

  // Place of Supply = BG.
  $rule = clone $base_rule;
  $rule->label = t('Place of Supply: Address in BG');
  $rule
    ->condition('data_is', array(
    'data:select' => 'customer-profile:commerce-customer-address:country',
    'op' => 'IN',
    'value' => array(
      'BE',
    ),
  ));
  $configs['commerce_eu_vat_rules_place_of_supply_address_bg'] = $rule;

  // Place of Supply = CY.
  $rule = clone $base_rule;
  $rule->label = t('Place of Supply: Address in CY');
  $rule
    ->condition('data_is', array(
    'data:select' => 'customer-profile:commerce-customer-address:country',
    'op' => 'IN',
    'value' => array(
      'CY',
    ),
  ));
  $configs['commerce_eu_vat_rules_place_of_supply_address_cy'] = $rule;

  // Place of Supply = CZ.
  $rule = clone $base_rule;
  $rule->label = t('Place of Supply: Address in CZ');
  $rule
    ->condition('data_is', array(
    'data:select' => 'customer-profile:commerce-customer-address:country',
    'op' => 'IN',
    'value' => array(
      'CZ',
    ),
  ));
  $configs['commerce_eu_vat_rules_place_of_supply_address_cz'] = $rule;

  // Place of Supply = DE.
  $rule = clone $base_rule;
  $rule->label = t('Place of Supply: Address in DE');
  $rule
    ->condition('data_is', array(
    'data:select' => 'customer-profile:commerce-customer-address:country',
    'op' => 'IN',
    'value' => array(
      'DE',
    ),
  ));

  // Exclude Heligoland (27498) and B�singen (78266).
  $rule
    ->condition(rules_condition('data_is', array(
    'data:select' => 'customer-profile:commerce-customer-address:postal-code',
    'op' => 'IN',
    'value' => array(
      '27498',
      '78266',
    ),
  ))
    ->negate());
  $configs['commerce_eu_vat_rules_place_of_supply_address_de'] = $rule;

  // Place of Supply = DK.
  $rule = clone $base_rule;
  $rule->label = t('Place of Supply: Address in DK');
  $rule
    ->condition('data_is', array(
    'data:select' => 'customer-profile:commerce-customer-address:country',
    'op' => 'IN',
    'value' => array(
      'DK',
    ),
  ));
  $configs['commerce_eu_vat_rules_place_of_supply_address_dk'] = $rule;

  // Place of Supply = EE.
  $rule = clone $base_rule;
  $rule->label = t('Place of Supply: Address in EE');
  $rule
    ->condition('data_is', array(
    'data:select' => 'customer-profile:commerce-customer-address:country',
    'op' => 'IN',
    'value' => array(
      'EE',
    ),
  ));
  $configs['commerce_eu_vat_rules_place_of_supply_address_ee'] = $rule;

  // Place of Supply = ES.
  $rule = clone $base_rule;
  $rule->label = t('Place of Supply: Address in ES');
  $rule
    ->condition('data_is', array(
    'data:select' => 'customer-profile:commerce-customer-address:country',
    'op' => 'IN',
    'value' => array(
      'ES',
    ),
  ));

  // Exclude Canary Islands.
  $rule
    ->condition(rules_condition('text_matches', array(
    'text:select' => 'customer-profile:commerce-customer-address:postal-code',
    'operation' => 'regex',
    'match' => '(35|38)[0-9]{3}',
  ))
    ->negate());

  // Exclude Ceuta and Melilla.
  $rule
    ->condition(rules_condition('text_matches', array(
    'text:select' => 'customer-profile:commerce-customer-address:postal-code',
    'operation' => 'regex',
    'match' => '(51|52)[0-9]{3}',
  ))
    ->negate());
  $configs['commerce_eu_vat_rules_place_of_supply_address_es'] = $rule;

  // Place of Supply = FI.
  $rule = clone $base_rule;
  $rule->label = t('Place of Supply: Address in FI');
  $rule
    ->condition('data_is', array(
    'data:select' => 'customer-profile:commerce-customer-address:country',
    'op' => 'IN',
    'value' => array(
      'FI',
    ),
  ));
  $configs['commerce_eu_vat_rules_place_of_supply_address_fi'] = $rule;

  // Place of Supply = FR or MC.
  $rule = clone $base_rule;
  $rule->label = t('Place of Supply: Address in FR');
  $rule
    ->condition('data_is', array(
    'data:select' => 'customer-profile:commerce-customer-address:country',
    'op' => 'IN',
    'value' => array(
      'FR',
      'MC',
    ),
  ));
  $configs['commerce_eu_vat_rules_place_of_supply_address_fr'] = $rule;

  // Place of Supply = GB & IM.
  $rule = clone $base_rule;
  $rule->label = t('Place of Supply: Address in GB or IM');
  $rule
    ->condition('data_is', array(
    'data:select' => 'customer-profile:commerce-customer-address:country',
    'op' => 'IN',
    'value' => array(
      'GB',
      'IM',
    ),
  ));
  $configs['commerce_eu_vat_rules_place_of_supply_address_gb'] = $rule;

  // Place of Supply = GR.
  $rule = clone $base_rule;
  $rule->label = t('Place of Supply: Address in GR');
  $rule->tags = array(
    'EU VAT',
    'Place of Supply',
  );
  $rule
    ->condition('data_is', array(
    'data:select' => 'customer-profile:commerce-customer-address:country',
    'op' => 'IN',
    'value' => array(
      'GR',
    ),
  ));
  $configs['commerce_eu_vat_rules_place_of_supply_address_gr'] = $rule;

  // Place of Supply = HU.
  $rule = clone $base_rule;
  $rule->label = t('Place of Supply: Address in HU');
  $rule
    ->condition('data_is', array(
    'data:select' => 'customer-profile:commerce-customer-address:country',
    'op' => 'IN',
    'value' => array(
      'HU',
    ),
  ));
  $configs['commerce_eu_vat_rules_place_of_supply_address_hu'] = $rule;

  // Place of Supply = IE.
  $rule = clone $base_rule;
  $rule->label = t('Place of Supply: Address in IE');
  $rule
    ->condition('data_is', array(
    'data:select' => 'customer-profile:commerce-customer-address:country',
    'op' => 'IN',
    'value' => array(
      'IE',
    ),
  ));
  $configs['commerce_eu_vat_rules_place_of_supply_address_ie'] = $rule;

  // Place of Supply = IT.
  $rule = clone $base_rule;
  $rule->label = t('Place of Supply: Address in IT');
  $rule
    ->condition('data_is', array(
    'data:select' => 'customer-profile:commerce-customer-address:country',
    'op' => 'IN',
    'value' => array(
      'IT',
    ),
  ));

  // Exclude Livigno (23030), Campione d�Italia and
  // the territorial waters of Lake Lugano (22060).
  $rule
    ->condition(rules_condition('text_matches', array(
    'text:select' => 'customer-profile:commerce-customer-address:postal-code',
    'operation' => 'regex',
    'match' => '(23030|22060)',
  ))
    ->negate());
  $configs['commerce_eu_vat_rules_place_of_supply_address_it'] = $rule;

  // Place of Supply = LT.
  $rule = clone $base_rule;
  $rule->label = t('Place of Supply: Address in LT');
  $rule
    ->condition('data_is', array(
    'data:select' => 'customer-profile:commerce-customer-address:country',
    'op' => 'IN',
    'value' => array(
      'LT',
    ),
  ));
  $configs['commerce_eu_vat_rules_place_of_supply_address_lt'] = $rule;

  // Place of Supply = LU.
  $rule = clone $base_rule;
  $rule->label = t('Place of Supply: Address in LU');
  $rule
    ->condition('data_is', array(
    'data:select' => 'customer-profile:commerce-customer-address:country',
    'op' => 'IN',
    'value' => array(
      'LU',
    ),
  ));
  $configs['commerce_eu_vat_rules_place_of_supply_address_lu'] = $rule;

  // Place of Supply = LV.
  $rule = clone $base_rule;
  $rule->label = t('Place of Supply: Address in LV');
  $rule
    ->condition('data_is', array(
    'data:select' => 'customer-profile:commerce-customer-address:country',
    'op' => 'IN',
    'value' => array(
      'LV',
    ),
  ));
  $configs['commerce_eu_vat_rules_place_of_supply_address_lv'] = $rule;

  // Place of Supply = MT.
  $rule = clone $base_rule;
  $rule->label = t('Place of Supply: Address in MT');
  $rule
    ->condition('data_is', array(
    'data:select' => 'customer-profile:commerce-customer-address:country',
    'op' => 'IN',
    'value' => array(
      'MT',
    ),
  ));
  $configs['commerce_eu_vat_rules_place_of_supply_address_mt'] = $rule;

  // Place of Supply = NL.
  $rule = clone $base_rule;
  $rule->label = t('Place of Supply: Address in NL');
  $rule
    ->condition('data_is', array(
    'data:select' => 'customer-profile:commerce-customer-address:country',
    'op' => 'IN',
    'value' => array(
      'NL',
    ),
  ));
  $configs['commerce_eu_vat_rules_place_of_supply_address_nl'] = $rule;

  // Place of Supply = PL.
  $rule = clone $base_rule;
  $rule->label = t('Place of Supply: Address in PL');
  $rule
    ->condition('data_is', array(
    'data:select' => 'customer-profile:commerce-customer-address:country',
    'op' => 'IN',
    'value' => array(
      'PL',
    ),
  ));
  $configs['commerce_eu_vat_rules_place_of_supply_address_pl'] = $rule;

  // Place of Supply = PT.
  $rule = clone $base_rule;
  $rule->label = t('Place of Supply: Address in PT');
  $rule
    ->condition('data_is', array(
    'data:select' => 'customer-profile:commerce-customer-address:country',
    'op' => 'IN',
    'value' => array(
      'PT',
    ),
  ));
  $configs['commerce_eu_vat_rules_place_of_supply_address_pt'] = $rule;

  // Place of Supply = RO.
  $rule = clone $base_rule;
  $rule->label = t('Place of Supply: Address in RO');
  $rule
    ->condition('data_is', array(
    'data:select' => 'customer-profile:commerce-customer-address:country',
    'op' => 'IN',
    'value' => array(
      'RO',
    ),
  ));
  $configs['commerce_eu_vat_rules_place_of_supply_address_ro'] = $rule;

  // Place of Supply = SE.
  $rule = clone $base_rule;
  $rule->label = t('Place of Supply: Address in SE');
  $rule
    ->condition('data_is', array(
    'data:select' => 'customer-profile:commerce-customer-address:country',
    'op' => 'IN',
    'value' => array(
      'SE',
    ),
  ));
  $configs['commerce_eu_vat_rules_place_of_supply_address_se'] = $rule;

  // Place of Supply = SI.
  $rule = clone $base_rule;
  $rule->label = t('Place of Supply: Address in SI');
  $rule
    ->condition('data_is', array(
    'data:select' => 'customer-profile:commerce-customer-address:country',
    'op' => 'IN',
    'value' => array(
      'SI',
    ),
  ));
  $configs['commerce_eu_vat_rules_place_of_supply_address_si'] = $rule;

  // Place of Supply = SK.
  $rule = clone $base_rule;
  $rule->label = t('Place of Supply: Address in SK');
  $rule
    ->condition('data_is', array(
    'data:select' => 'customer-profile:commerce-customer-address:country',
    'op' => 'IN',
    'value' => array(
      'SK',
    ),
  ));
  $configs['commerce_eu_vat_rules_place_of_supply_address_sk'] = $rule;

  // Place of Supply = EU.
  $rule = rules_or(array(
    'customer_profile' => array(
      'label' => t('Customer Profile'),
      'type' => 'commerce_customer_profile',
    ),
  ));
  $rule->label = t('Place of Supply: Address in EU');
  $rule->tags = array(
    'EU VAT',
    'Place of Supply',
  );
  $rule
    ->condition('component_commerce_eu_vat_rules_place_of_supply_address_at', array(
    'customer_profile:select' => 'customer-profile',
  ))
    ->condition('component_commerce_eu_vat_rules_place_of_supply_address_be', array(
    'customer_profile:select' => 'customer-profile',
  ))
    ->condition('component_commerce_eu_vat_rules_place_of_supply_address_bg', array(
    'customer_profile:select' => 'customer-profile',
  ))
    ->condition('component_commerce_eu_vat_rules_place_of_supply_address_cy', array(
    'customer_profile:select' => 'customer-profile',
  ))
    ->condition('component_commerce_eu_vat_rules_place_of_supply_address_cz', array(
    'customer_profile:select' => 'customer-profile',
  ))
    ->condition('component_commerce_eu_vat_rules_place_of_supply_address_de', array(
    'customer_profile:select' => 'customer-profile',
  ))
    ->condition('component_commerce_eu_vat_rules_place_of_supply_address_dk', array(
    'customer_profile:select' => 'customer-profile',
  ))
    ->condition('component_commerce_eu_vat_rules_place_of_supply_address_ee', array(
    'customer_profile:select' => 'customer-profile',
  ))
    ->condition('component_commerce_eu_vat_rules_place_of_supply_address_es', array(
    'customer_profile:select' => 'customer-profile',
  ))
    ->condition('component_commerce_eu_vat_rules_place_of_supply_address_fi', array(
    'customer_profile:select' => 'customer-profile',
  ))
    ->condition('component_commerce_eu_vat_rules_place_of_supply_address_fr', array(
    'customer_profile:select' => 'customer-profile',
  ))
    ->condition('component_commerce_eu_vat_rules_place_of_supply_address_gb', array(
    'customer_profile:select' => 'customer-profile',
  ))
    ->condition('component_commerce_eu_vat_rules_place_of_supply_address_gr', array(
    'customer_profile:select' => 'customer-profile',
  ))
    ->condition('component_commerce_eu_vat_rules_place_of_supply_address_hu', array(
    'customer_profile:select' => 'customer-profile',
  ))
    ->condition('component_commerce_eu_vat_rules_place_of_supply_address_ie', array(
    'customer_profile:select' => 'customer-profile',
  ))
    ->condition('component_commerce_eu_vat_rules_place_of_supply_address_it', array(
    'customer_profile:select' => 'customer-profile',
  ))
    ->condition('component_commerce_eu_vat_rules_place_of_supply_address_lt', array(
    'customer_profile:select' => 'customer-profile',
  ))
    ->condition('component_commerce_eu_vat_rules_place_of_supply_address_lu', array(
    'customer_profile:select' => 'customer-profile',
  ))
    ->condition('component_commerce_eu_vat_rules_place_of_supply_address_lv', array(
    'customer_profile:select' => 'customer-profile',
  ))
    ->condition('component_commerce_eu_vat_rules_place_of_supply_address_mt', array(
    'customer_profile:select' => 'customer-profile',
  ))
    ->condition('component_commerce_eu_vat_rules_place_of_supply_address_nl', array(
    'customer_profile:select' => 'customer-profile',
  ))
    ->condition('component_commerce_eu_vat_rules_place_of_supply_address_pl', array(
    'customer_profile:select' => 'customer-profile',
  ))
    ->condition('component_commerce_eu_vat_rules_place_of_supply_address_pt', array(
    'customer_profile:select' => 'customer-profile',
  ))
    ->condition('component_commerce_eu_vat_rules_place_of_supply_address_ro', array(
    'customer_profile:select' => 'customer-profile',
  ))
    ->condition('component_commerce_eu_vat_rules_place_of_supply_address_se', array(
    'customer_profile:select' => 'customer-profile',
  ))
    ->condition('component_commerce_eu_vat_rules_place_of_supply_address_si', array(
    'customer_profile:select' => 'customer-profile',
  ))
    ->condition('component_commerce_eu_vat_rules_place_of_supply_address_sk', array(
    'customer_profile:select' => 'customer-profile',
  ));
  $configs['commerce_eu_vat_rules_place_of_supply_address_eu'] = $rule;

  // Create a place of supply rule for each address rules.
  foreach ($configs as $key => $config) {
    if (0 === strpos($key, 'commerce_eu_vat_rules_place_of_supply_address')) {
      $country = substr($key, -2);
      $rule = rules_or(array(
        'commerce_order' => array(
          'label' => t('Commerce Order'),
          'type' => 'commerce_order',
        ),
      ));
      $rule->label = t('Place of Supply is ' . strtoupper($country));
      $rule->tags = array(
        'EU VAT',
        'Place of Supply',
      );
      $billing_rule = rules_and()
        ->condition('entity_has_field', array(
        'entity:select' => 'commerce-order',
        'field' => 'commerce_customer_billing',
      ))
        ->condition(rules_condition('data_is_empty', array(
        'data:select' => 'commerce-order:commerce-customer-billing',
      ))
        ->negate())
        ->condition('component_commerce_eu_vat_rules_place_of_supply_address_' . $country, array(
        'customer_profile:select' => 'commerce-order:commerce-customer-billing',
      ));
      if (module_exists('commerce_shipping')) {
        $shipping_rule = rules_and()
          ->condition('entity_has_field', array(
          'entity:select' => 'commerce-order',
          'field' => 'commerce_customer_shipping',
        ))
          ->condition(rules_condition('data_is_empty', array(
          'data:select' => 'commerce-order:commerce-customer-shipping',
        ))
          ->negate())
          ->condition('component_commerce_eu_vat_rules_place_of_supply_address_' . $country, array(
          'customer_profile:select' => 'commerce-order:commerce-customer-shipping',
        ));
        $rule
          ->condition($shipping_rule);
        $billing_rule
          ->condition('entity_has_field', array(
          'entity:select' => 'commerce-order',
          'field' => 'commerce_customer_shipping',
        ))
          ->condition('data_is_empty', array(
          'data:select' => 'commerce-order:commerce-customer-shipping',
        ));
      }
      $rule
        ->condition($billing_rule);
      $configs['commerce_eu_vat_rules_place_of_supply_' . $country] = $rule;
    }
  }
  return $configs;
}

/**
 * Impliments hook_default_rules_configuration_alter().
 */
function commerce_eu_vat_default_rules_configuration_alter(&$configs) {

  // Add a fall back to use the sites default country if the
  // billing or shipping address has not been set.
  if (isset($configs['commerce_tax_type_eu_vat'])) {
    $configs['commerce_tax_type_eu_vat']
      ->condition(rules_or()
      ->condition('component_commerce_eu_vat_rules_place_of_supply_eu', array(
      'commerce_order:select' => 'commerce-line-item:order',
    ))
      ->condition(rules_and()
      ->condition('entity_has_field', array(
      'entity:select' => 'commerce-line-item:order',
      'field' => 'commerce_customer_billing',
    ))
      ->condition('data_is_empty', array(
      'data:select' => 'commerce-line-item:order:commerce-customer-billing',
    ))
      ->condition('commerce_eu_vat_rules_site_is_in_eu')));
  }

  // Add a condition to each component based on tax reference field.
  $tax_rates = commerce_tax_rates();
  foreach ($tax_rates as $tax_rate) {
    if (strpos($tax_rate['type'], 'eu_vat') === 0 && isset($configs[$tax_rate['rules_component']])) {
      $configs[$tax_rate['rules_component']]
        ->condition('entity_has_field', array(
        'entity:select' => 'commerce-line-item',
        'field' => 'commerce_product',
      ))
        ->condition('entity_has_field', array(
        'entity:select' => 'commerce-line-item:commerce-product',
        'field' => 'commerce_eu_vat_rate',
      ))
        ->condition('list_contains', array(
        'list:select' => 'commerce-line-item:commerce-product:commerce_eu_vat_rate',
        'item' => $tax_rate['name'],
      ));
    }
  }
}