View source
<?php
namespace Drupal\uc_tax\Form;
use Drupal\Core\Entity\EntityForm;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Link;
use Drupal\Core\Url;
class TaxRateFormBase extends EntityForm {
public function getCancelUrl() {
return Url::fromRoute('entity.uc_tax_rate.collection');
}
public function buildForm(array $form, FormStateInterface $form_state) {
$form = parent::buildForm($form, $form_state);
$rate = $this->entity;
$form['label'] = [
'#type' => 'textfield',
'#title' => $this
->t('Label'),
'#description' => $this
->t('This name will appear to the customer when this tax is applied to an order.'),
'#default_value' => $rate
->label(),
'#required' => TRUE,
];
$form['id'] = [
'#type' => 'machine_name',
'#title' => $this
->t('Machine name'),
'#default_value' => $rate
->id(),
'#maxlength' => 32,
'#machine_name' => [
'exists' => [
$this,
'exists',
],
'replace_pattern' => '([^a-z0-9_]+)|(^custom$)',
'error' => 'The machine-readable name must be unique, and can only contain lowercase letters, numbers, and underscores. Additionally, it can not be the reserved word "custom".',
],
];
$form['rate'] = [
'#type' => 'textfield',
'#title' => $this
->t('Rate'),
'#description' => $this
->t('The tax rate as a percent or decimal. Examples: 6%, .06'),
'#size' => 15,
'#default_value' => (double) $rate
->getRate() * 100.0 . '%',
'#required' => TRUE,
];
$form['shippable'] = [
'#type' => 'radios',
'#title' => $this
->t('Taxed products'),
'#options' => [
0 => $this
->t('Apply tax to any product regardless of its shippability.'),
1 => $this
->t('Apply tax to shippable products only.'),
],
'#default_value' => (int) $rate
->isForShippable(),
];
$options = [];
foreach (node_type_get_names() as $type => $name) {
if ($type != 'product_kit' && uc_product_is_product($type)) {
$options[$type] = $name;
}
}
$options['blank-line'] = $this
->t('"Blank line" product');
$form['product_types'] = [
'#type' => 'checkboxes',
'#title' => $this
->t('Taxed product types'),
'#description' => $this
->t('Apply taxes to the specified product types/classes.'),
'#default_value' => $rate
->getProductTypes(),
'#options' => $options,
];
$options = [];
$definitions = \Drupal::service('plugin.manager.uc_order.line_item')
->getDefinitions();
foreach ($definitions as $id => $line_item) {
if (!in_array($id, [
'subtotal',
'tax_subtotal',
'total',
'tax_display',
])) {
$options[$id] = $line_item['title'];
}
}
$form['line_item_types'] = [
'#type' => 'checkboxes',
'#title' => $this
->t('Taxed line items'),
'#description' => $this
->t('Adds the checked line item types to the total before applying this tax.'),
'#default_value' => $rate
->getLineItemTypes(),
'#options' => $options,
];
$form['weight'] = [
'#type' => 'weight',
'#title' => $this
->t('Weight'),
'#description' => $this
->t('Taxes are sorted by weight and then applied to the order sequentially. This value is important when taxes need to include other tax line items.'),
'#default_value' => $rate
->getWeight(),
];
$form['display_include'] = [
'#type' => 'checkbox',
'#title' => $this
->t('Include this tax when displaying product prices.'),
'#default_value' => $rate
->isIncludedInPrice(),
];
$form['inclusion_text'] = [
'#type' => 'textfield',
'#title' => $this
->t('Tax inclusion text'),
'#description' => $this
->t('This text will be displayed near the price to indicate that it includes tax.'),
'#default_value' => $rate
->getInclusionText(),
];
return $form;
}
public function validate(array $form, FormStateInterface $form_state) {
parent::validate($form, $form_state);
$rate = $form_state
->getValue('rate');
$rate = trim($rate);
if (floatval($rate) < 0) {
$form_state
->setErrorByName('rate', $this
->t('Rate must be a positive number. No commas and only one decimal point.'));
}
$form_state
->setValue('rate', $rate);
}
public function save(array $form, FormStateInterface $form_state) {
$tax_rate = $this
->getEntity();
$rate = $form_state
->getValue('rate');
if (substr($rate, -1) == '%') {
$tax_rate
->setRate(floatval($rate) / 100.0);
}
$tax_rate
->setProductTypes(array_filter($form_state
->getValue('product_types')));
$tax_rate
->setLineItemTypes(array_filter($form_state
->getValue('line_item_types')));
$status = $tax_rate
->save();
$edit_link = Link::fromTextAndUrl($this
->t('Edit'), $tax_rate
->toUrl())
->toString();
if ($status == SAVED_UPDATED) {
$this
->messenger()
->addMessage($this
->t('Tax rate %label has been updated.', [
'%label' => $tax_rate
->label(),
]));
$this
->logger('uc_tax')
->notice('Tax rate %label has been updated.', [
'%label' => $tax_rate
->label(),
'link' => $edit_link,
]);
}
else {
$this
->messenger()
->addMessage($this
->t('Tax rate %label has been added.', [
'%label' => $tax_rate
->label(),
]));
$this
->logger('uc_tax')
->notice('Tax rate %label has been added.', [
'%label' => $tax_rate
->label(),
'link' => $edit_link,
]);
}
$form_state
->setRedirect('entity.uc_tax_rate.collection');
}
protected function actions(array $form, FormStateInterface $form_state) {
$actions = parent::actions($form, $form_state);
$actions['submit']['#value'] = $this
->t('Save');
$actions['submit']['#suffix'] = Link::fromTextAndUrl($this
->t('Cancel'), $this
->getCancelUrl())
->toString();
return $actions;
}
}