View source
<?php
function commerce_eu_vat_default_rules_configuration() {
$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());
$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;
$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;
$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;
$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;
$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;
$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',
),
));
$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;
$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;
$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;
$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',
),
));
$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());
$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;
$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;
$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;
$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;
$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;
$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;
$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;
$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',
),
));
$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;
$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;
$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;
$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;
$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;
$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;
$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;
$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;
$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;
$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;
$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;
$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;
$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;
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;
}
function commerce_eu_vat_default_rules_configuration_alter(&$configs) {
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')));
}
$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'],
));
}
}
}