*/ /** * Delivery actions. * * @author Marcin Olejnczak * * @package stDeliveryPlugin * @subpackage actions * @property Delivery $delivery */ class stDeliveryBackendActions extends autoStDeliveryBackendActions { public function executeIndex() { return $this->redirect('stDeliveryBackend/list'); } protected function updateConfigFromRequest() { parent::updateConfigFromRequest(); $config = $this->getRequestParameter('config'); $ids = stJQueryToolsHelper::parseTokensFromRequest($config['alternate_deliveries'], true); $this->config->set('alternate_deliveries', $ids, false); } public function validateConfig() { $request = $this->getRequest(); if ($this->getRequest()->getMethod() == sfRequest::POST) { $timeValidator = new stTimeValidator(); $timeValidator->initialize($this->getContext()); $error = null; $value = $request->getParameter('config[express_delivery_order_time_limit]'); if (!$timeValidator->execute($value, $error)) { $request->setError('config{express_delivery_order_time_limit}', $error); } } return !$request->hasErrors(); } public function validateEdit() { $request = $this->getRequest(); $i18n = $this->getContext()->getI18N(); if ($this->getRequest()->getMethod() == sfRequest::POST) { $nv = new sfNumberValidator(); $nv->initialize($this->getContext(), array( 'min_error' => 'Wartość pola "%s" nie może być ujemna', 'nan_error' => 'Wartość pola "%s" posiada nieprawidłowy format (prawidłowy format: 10, 10.00)', 'min' => 0, 'type' => 'any' )); $sections = $this->getRequestParameter('delivery[sections]', array()); $deliveryType = DeliveryTypePeer::retrieveByPK($request->getParameter('delivery[type_id]')); if (null !== $deliveryType) { $this->validateDeliveryTypeConfiguration($deliveryType); if ($deliveryType->isType('ppk') || $deliveryType->isType('ppo')) { $params = $request->getParameter('delivery'); if (!isset($params['params']['usluga']) || $params['params']['usluga'] === "") { $request->setError('delivery{pp_usluga}', 'Musisz wybrać usługę dla Poczty Polskiej'); } } } if ($request->getParameter('delivery[section_cost_type]')) { if (empty($sections)) { $request->setError('delivery{sections}', 'Musisz zdefiniować przynajmniej jeden koszt dodatkowy'); } else { foreach ($sections as $k1 => $v1) { if (!$nv->execute($v1['from'], $error)) { $request->setError('delivery{sections}{' . $k1 . '}{from}', sprintf($error, 'Od')); $request->setError('delivery{sections}', 'Popraw błędy'); } if (!$nv->execute($v1['cost_netto'], $error)) { $request->setError('delivery{sections}{' . $k1 . '}{cost_netto}', sprintf($error, 'Koszt')); $request->setError('delivery{sections}', 'Popraw błędy'); } if (!$nv->execute($v1['cost_brutto'], $error)) { $request->setError('delivery{sections}{' . $k1 . '}{cost_brutto}', sprintf($error, 'Koszt')); $request->setError('delivery{sections}', 'Popraw błędy'); } foreach ($sections as $k2 => $v2) { if ($request->hasError('delivery{sections}{' . $k1 . '}{from}')) continue; if ($k1 != $k2 && floatval($v1['from']) == floatval($v2['from'])) { $request->setError('delivery{sections}{' . $k1 . '}{from}', 'Wartości pola "Od" nie mogą być takie same'); $request->setError('delivery{sections}', 'Popraw błędy'); break; } } } } } $payments = $this->getRequestParameter('delivery[payments]', array()); $one_payment_active = false; foreach ($payments as $payment) { if (isset($payment['is_active'])) { $one_payment_active = true; break; } } if (!$one_payment_active) { $request->setError('delivery{payments}', 'Musisz aktywować przynajmniej jedną płatność'); } else { foreach ($payments as $k => $payment) { if (!isset($payment['is_active'])) continue; if (!$nv->execute($payment['free_from'], $error)) { $request->setError('delivery{payments}{' . $k . '}{free_from}', sprintf($error, 'Darmowa od')); $request->setError('delivery{payments}', 'Popraw błędy'); } if (!$nv->execute($payment['cost_netto'], $error)) { $request->setError('delivery{payments}{' . $k . '}{cost_netto}', sprintf($error, 'Koszt')); $request->setError('delivery{payments}', 'Popraw błędy'); } if (!$nv->execute($payment['cost_brutto'], $error)) { $request->setError('delivery{payments}{' . $k . '}{cost_brutto}', sprintf($error, 'Koszt')); $request->setError('delivery{payments}', 'Popraw błędy'); } } } if ($request->hasParameter('delivery[express_delivery_order_time_limit]')) { $timeValidator = new stTimeValidator(); $timeValidator->initialize($this->getContext()); $error = null; $value = $request->getParameter('delivery[express_delivery_order_time_limit]'); if (!$timeValidator->execute($value, $error)) { $request->setError('delivery{express_delivery_order_time_limit}', $error); } } $data = $this->getRequestParameter('delivery'); if (isset($data['is_weekend_delivery'])) { $timeValidator = new stTimeValidator(); $timeValidator->initialize($this->getContext()); foreach (['weekend_delivery_availability_from', 'weekend_delivery_availability_to'] as $field) { $error = null; if (!empty($data[$field]['day']) && !$timeValidator->execute($data[$field]['time'], $error)) { $request->setError("delivery{{$field}}", $error); } } } } return !$request->hasErrors(); } protected function updateDeliveryFromRequest() { parent::updateDeliveryFromRequest(); $delivery = $this->getRequestParameter('delivery'); $this->delivery->setCostNetto($delivery['cost_netto']); $this->delivery->setCostBrutto($delivery['cost_brutto']); $this->delivery->setSectionCostType(!empty($delivery['section_cost_type']) ? $delivery['section_cost_type'] : null); $this->delivery->setIsDefault(isset($delivery['is_default']) ? $delivery['is_default'] : null); if ($this->delivery->getIsWeekendDelivery()) { $this->delivery->setWeekendDeliveryCostNetto($delivery['weekend_delivery_cost_netto']); $this->delivery->setWeekendDeliveryCostBrutto($delivery['weekend_delivery_cost_brutto']); } else { $this->delivery->setWeekendDeliveryCostNetto(null); $this->delivery->setWeekendDeliveryCostBrutto(null); } if ($this->delivery->getIsExpressDelivery()) { $this->delivery->setExpressDeliveryCostNetto($delivery['express_delivery_cost_netto']); $this->delivery->setExpressDeliveryCostBrutto($delivery['express_delivery_cost_brutto']); } else { $this->delivery->setExpressDeliveryCostNetto(null); $this->delivery->setExpressDeliveryCostBrutto(null); } if (isset($delivery['min_order_quantity'])) { $this->delivery->setMinOrderQuantity($delivery['min_order_quantity']); } if (isset($delivery['min_order_weight'])) { $this->delivery->setMinOrderWeight($delivery['min_order_weight']); } if (isset($delivery['min_order_amount'])) { $this->delivery->setMinOrderAmount($delivery['min_order_amount']); } if (isset($delivery['max_order_quantity'])) { $this->delivery->setMaxOrderQuantity($delivery['max_order_quantity']); } if (isset($delivery['max_order_weight'])) { $this->delivery->setMaxOrderWeight($delivery['max_order_weight']); } if (isset($delivery['max_order_amount'])) { $this->delivery->setMaxOrderAmount($delivery['max_order_amount']); } if (isset($delivery['params'])) { $this->delivery->setParams($delivery['params']); } else { $this->delivery->setParams(null); } $this->delivery->setCountriesAreaId(isset($delivery['countries_area_id']) ? $delivery['countries_area_id'] : null); if ($this->delivery->isType('inpostp')) { $this->delivery->setPaczkomatyType('ALL'); $this->delivery->setPaczkomatySize($delivery['paczkomaty_size']); $dimensions = json_decode($delivery['paczkomaty_dimension']); $this->delivery->setWidth($dimensions[1]); $this->delivery->setHeight($dimensions[0]); $this->delivery->setDepth($dimensions[2]); } else { $this->delivery->setPaczkomatyType('NONE'); $this->delivery->setPaczkomatySize(null); } if (!isset($delivery['express_delivery_order_time_limit'])) { $this->delivery->setExpressDeliveryOrderTimeLimit(null); } } /** * * @param Delivery $delivery */ protected function saveDelivery($delivery) { parent::saveDelivery($delivery); $this->savePayment($delivery); $this->saveSections($delivery); } protected function savePayment($delivery) { $delivery_payments = $this->getRequestParameter('delivery[payments]', array()); $is_default_payment = $this->getRequestParameter('delivery[is_default_payment]'); $c = new Criteria(); $c->add(DeliveryHasPaymentTypePeer::DELIVERY_ID, $delivery->getId()); DeliveryHasPaymentTypePeer::doDelete($c); foreach ($delivery_payments as $payment_id => $delivery_payment) { $dhp = new DeliveryHasPaymentType(); $dhp->setDeliveryId($delivery->getId()); $dhp->setPaymentTypeId($payment_id); $dhp->setCostNetto($delivery_payment['cost_type'] == '%' ? $delivery_payment['cost_brutto'] : $delivery_payment['cost_netto']); $dhp->setCostBrutto($delivery_payment['cost_brutto']); $dhp->setFreeFrom($delivery_payment['free_from']); $dhp->setCostType($delivery_payment['cost_type']); $dhp->setIsDefault($is_default_payment == $payment_id); $dhp->setIsActive(isset($delivery_payment['is_active'])); $dhp->setCourierCost($delivery_payment['courier_cost']); $dhp->save(); } } protected function saveSections($delivery) { $delivery_sections = $this->getRequestParameter('delivery[sections]', array()); $c = new Criteria(); $c->add(DeliverySectionsPeer::DELIVERY_ID, $delivery->getId()); DeliverySectionsPeer::doDelete($c); if ($this->getRequestParameter('delivery[section_cost_type]')) { foreach ($delivery_sections as $delivery_section) { $ds = new DeliverySections(); $ds->setFrom($delivery_section['from']); $ds->setCostNetto($delivery_section['cost_netto']); $ds->setCostBrutto($delivery_section['cost_brutto']); $ds->setDeliveryId($delivery->getId()); $ds->save(); } } } protected function getLabels() { $labels = parent::getLabels(); $labels['delivery{sections}'] = $labels['delivery{edit_additional_cost}']; $labels['delivery{payments}'] = $labels['delivery{edit_payment}']; $labels['delivery{max_order_quantity}'] = 'Ukryj wyświetlanie'; $labels['delivery{max_order_amount}'] = 'Ukryj wyświetlanie'; $labels['delivery{max_order_weight}'] = 'Ukryj wyświetlanie'; $labels['delivery{countries_area_id}'] = 'Strefa'; return $labels; } protected function getDeliveryOrCreate($id = 'id') { $delivery = parent::getDeliveryOrCreate($id); if (null !== $delivery->getDeliveryType()) { $this->validateDeliveryTypeConfiguration($delivery->getDeliveryType()); } return $delivery; } protected function getDeliveryTypeDeliveryTypeOrCreate($id = 'id') { $deliveryType = parent::getDeliveryTypeDeliveryTypeOrCreate($id); if ($deliveryType->getIsSystemDefault()) { return $this->redirect('@stDelivery?action=deliveryTypeList'); } return $deliveryType; } protected function validateDeliveryTypeConfiguration(DeliveryType $deliveryType) { $deliveryTypeConfigurationValidator = new stDeliveryTypeConfigurationValidator(); $deliveryTypeConfigurationValidator->initialize($this->getContext()); $currentDeliveryType = $deliveryType->getType(); if (!$deliveryTypeConfigurationValidator->execute($currentDeliveryType, $error)) { $this->getRequest()->setError('delivery{type_id}', $error); } } }