View source
<?php
namespace Drupal\uc_fulfillment\Form;
use Drupal\Component\Utility\Unicode;
use Drupal\Core\Form\FormBase;
use Drupal\Core\Form\FormStateInterface;
use Drupal\uc_fulfillment\Package;
use Drupal\uc_order\OrderInterface;
class NewPackageForm extends FormBase {
public function getFormId() {
return 'uc_fulfillment_new_package';
}
public function buildForm(array $form, FormStateInterface $form_state, OrderInterface $uc_order = NULL) {
$form['#tree'] = TRUE;
$form['#attached']['library'][] = 'uc_fulfillment/uc_fulfillment.scripts';
$shipping_types_products = [];
foreach ($uc_order->products as $product) {
if (uc_order_product_is_shippable($product)) {
$shipping_type = uc_product_get_shipping_type($product);
$shipping_types_products[$shipping_type][] = $product;
}
}
$quote_config = $this
->config('uc_quote.settings');
$shipping_type_weights = $quote_config
->get('type_weight');
$result = \Drupal::database()
->query('SELECT op.order_product_id, SUM(pp.qty) AS quantity FROM {uc_packaged_products} pp LEFT JOIN {uc_packages} p ON pp.package_id = p.package_id LEFT JOIN {uc_order_products} op ON op.order_product_id = pp.order_product_id WHERE p.order_id = :id GROUP BY op.order_product_id', [
':id' => $uc_order
->id(),
]);
$packaged_products = $result
->fetchAllKeyed();
$form['shipping_types'] = [];
$header = [
[
'data' => '',
'class' => [
'select-all',
],
],
'model' => $this
->t('SKU'),
'name' => $this
->t('Title'),
'qty' => $this
->t('Quantity'),
'package' => $this
->t('Package'),
];
$shipping_type_options = uc_quote_shipping_type_options();
foreach ($shipping_types_products as $shipping_type => $products) {
$form['shipping_types'][$shipping_type] = [
'#type' => 'fieldset',
'#title' => isset($shipping_type_options[$shipping_type]) ? $shipping_type_options[$shipping_type] : Unicode::ucwords(str_replace('_', ' ', $shipping_type)),
'#weight' => isset($shipping_type_weights[$shipping_type]) ? $shipping_type_weights[$shipping_type] : 0,
];
$form['shipping_types'][$shipping_type]['table'] = [
'#type' => 'table',
'#header' => $header,
'#empty' => $this
->t('There are no products available for this type of package.'),
];
foreach ($products as $product) {
$unboxed_qty = $product->qty->value;
if (isset($packaged_products[$product->order_product_id->value])) {
$unboxed_qty -= $packaged_products[$product->order_product_id->value];
}
if ($unboxed_qty > 0) {
$row = [];
$row['checked'] = [
'#type' => 'checkbox',
'#default_value' => 0,
];
$row['model'] = [
'#plain_text' => $product->model->value,
];
$row['name'] = [
'#markup' => $product->title->value,
];
$range = range(1, $unboxed_qty);
$row['qty'] = [
'#type' => 'select',
'#title' => $this
->t('Quantity'),
'#title_display' => 'invisible',
'#options' => array_combine($range, $range),
'#default_value' => $unboxed_qty,
];
$range = range(0, count($uc_order->products));
$options = array_combine($range, $range);
$options[0] = $this
->t('Sep.');
$row['package'] = [
'#type' => 'select',
'#title' => $this
->t('Package'),
'#title_display' => 'invisible',
'#options' => $options,
'#default_value' => 0,
];
$form['shipping_types'][$shipping_type]['table'][$product->order_product_id->value] = $row;
}
}
}
$form['order_id'] = [
'#type' => 'hidden',
'#value' => $uc_order
->id(),
];
$form['actions'] = [
'#type' => 'actions',
];
$form['actions']['create'] = [
'#type' => 'submit',
'#value' => $this
->t('Make packages'),
];
$form['actions']['combine'] = [
'#type' => 'submit',
'#value' => $this
->t('Create one package'),
];
$form['actions']['cancel'] = [
'#type' => 'submit',
'#value' => $this
->t('Cancel'),
];
return $form;
}
public function validateForm(array &$form, FormStateInterface $form_state) {
if ($this
->t('Cancel') != (string) $form_state
->getValue('op')) {
foreach ($form_state
->getValue('shipping_types') as $shipping_type => $products) {
foreach ($products['table'] as $id => $product) {
if ($product['checked']) {
return;
}
}
}
$form_state
->setErrorByName($shipping_type, $this
->t('Packages must contain at least one product.'));
}
}
public function submitForm(array &$form, FormStateInterface $form_state) {
if ($this
->t('Cancel') != (string) $form_state
->getValue('op')) {
$packages = [
0 => [],
];
foreach ($form_state
->getValue('shipping_types') as $shipping_type => $products) {
foreach ($products['table'] as $id => $product) {
if ($product['checked']) {
if ($this
->t('Create one package') == (string) $form_state
->getValue('op')) {
$product['package'] = 1;
}
if ($product['package'] != 0) {
if (empty($packages[$product['package']])) {
$packages[$product['package']] = Package::create();
}
$packages[$product['package']]
->addProducts([
$id => (object) $product,
]);
if (!$packages[$product['package']]
->getShippingType()) {
$packages[$product['package']]
->setShippingType($shipping_type);
}
}
else {
$packages[0][$shipping_type][$id] = (object) $product;
}
}
}
if (isset($packages[0][$shipping_type])) {
foreach ($packages[0][$shipping_type] as $id => $product) {
$qty = $product->qty;
$product->qty = 1;
for ($i = 0; $i < $qty; $i++) {
$packages[] = Package::create([
'products' => [
$id => $product,
],
'shipping_type' => $shipping_type,
]);
}
}
}
unset($packages[0][$shipping_type]);
}
if (empty($packages[0])) {
unset($packages[0]);
}
foreach ($packages as $package) {
$package
->setOrderId($form_state
->getValue('order_id'));
$package
->save();
}
$form_state
->setRedirect('uc_fulfillment.packages', [
'uc_order' => $form_state
->getValue('order_id'),
]);
}
else {
$form_state
->setRedirect('entity.uc_order.canonical', [
'uc_order' => $form_state
->getValue('order_id'),
]);
}
}
}