first commit
This commit is contained in:
385
class/deliveries/class.Zasilkovna.php
Normal file
385
class/deliveries/class.Zasilkovna.php
Normal file
@@ -0,0 +1,385 @@
|
||||
<?php
|
||||
|
||||
use KupShop\KupShopBundle\Context\CurrencyContext;
|
||||
use KupShop\KupShopBundle\Util\Compat\ServiceContainer;
|
||||
use KupShop\OrderingBundle\Exception\DeliveryException;
|
||||
|
||||
class Zasilkovna extends Delivery
|
||||
{
|
||||
use DatabaseCommunication;
|
||||
|
||||
public static $type = Delivery::TYPE_POINT;
|
||||
public static $className = 'Zásilkovna';
|
||||
|
||||
protected $templateDescription = 'deliveries/delivery.Zasilkovna.widget.tpl';
|
||||
protected $templateInit = 'deliveries/delivery.Zasilkovna.init.tpl';
|
||||
|
||||
protected $AdminTemplateSettings = 'deliveries/block.delivery.Zasilkovna.tpl';
|
||||
protected $adminWindowTemplate = 'delivery/settings.Zasilkovna.tpl';
|
||||
|
||||
public static $tableName = '`kupshop_shared`.`delivery_zasilkovna`';
|
||||
|
||||
protected $track_and_trace = [
|
||||
'CZ' => 'https://tracking.packeta.com/cs/?id=[PACKAGE_ID]',
|
||||
'DE' => 'https://tracking.packeta.com/de/?id=[PACKAGE_ID]',
|
||||
'HR' => 'https://tracking.packeta.com/hr/?id=[PACKAGE_ID]',
|
||||
'SI' => 'https://tracking.packeta.com/sl/?id=[PACKAGE_ID]',
|
||||
'RO' => 'https://tracking.packeta.com/ro/?id=[PACKAGE_ID]',
|
||||
'SK' => 'https://tracking.packeta.com/sk/?id=[PACKAGE_ID]',
|
||||
'HU' => 'https://tracking.packeta.com/hu/?id=[PACKAGE_ID]',
|
||||
'DK' => 'https://tracking.packeta.com/dk/?id=[PACKAGE_ID]',
|
||||
'ES' => 'https://tracking.packeta.com/es/?id=[PACKAGE_ID]',
|
||||
'FI' => 'https://tracking.packeta.com/fi/?id=[PACKAGE_ID]',
|
||||
'FR' => 'https://tracking.packeta.com/fr/?id=[PACKAGE_ID]',
|
||||
'BE' => 'https://tracking.packeta.com/fr/?id=[PACKAGE_ID]',
|
||||
'IE' => 'https://tracking.packeta.com/en/?id=[PACKAGE_ID]',
|
||||
'IT' => 'https://tracking.packeta.com/it/?id=[PACKAGE_ID]',
|
||||
'PL' => 'https://tracking.packeta.com/pl/?id=[PACKAGE_ID]',
|
||||
'SV' => 'https://tracking.packeta.com/sv/?id=[PACKAGE_ID]',
|
||||
'LV' => 'https://tracking.packeta.com/lv/?id=[PACKAGE_ID]',
|
||||
'LT' => 'https://tracking.packeta.com/lt/?id=[PACKAGE_ID]',
|
||||
'EE' => 'https://tracking.packeta.com/et/?id=[PACKAGE_ID]',
|
||||
'UA' => 'https://tracking.packeta.com/uk/?id=[PACKAGE_ID]',
|
||||
'GR' => 'https://tracking.packeta.com/el/?id=[PACKAGE_ID]',
|
||||
];
|
||||
|
||||
public static $jsonDelivery = 'http://www.zasilkovna.cz/api/v4/80aa13c913f62111/branch.json';
|
||||
|
||||
protected $heureka_delivery_id = 'ZASILKOVNA';
|
||||
protected $zbozi_delivery_id = 'ZASILKOVNA';
|
||||
|
||||
public $zip;
|
||||
|
||||
public $config = [
|
||||
'maxCOD' => 20000,
|
||||
'maxWeight' => 10.0,
|
||||
'maxLength' => 120.0, // Maximální rozměr strany položky
|
||||
'maxSumOfDimensions' => 150.0, // Maximální součet rozměrů všech tří stran položky
|
||||
// legacy config:
|
||||
'limit' => [
|
||||
'CZK' => 20000,
|
||||
'EUR' => 700,
|
||||
],
|
||||
'weight_limit' => 15,
|
||||
'max_length' => 70, // Maximální rozměr jedné strany zásilky: 70 cm
|
||||
'max_dimensions' => 150, // Maximální součet rozměrů všech tří stran zásilky
|
||||
];
|
||||
|
||||
public $defaultIcon = '../../common/static/deliveries/zasilkovna.svg';
|
||||
|
||||
public static function getSettingsConfiguration(): array
|
||||
{
|
||||
return [
|
||||
'fields' => [
|
||||
'apiKey' => [
|
||||
'title' => 'API klíč',
|
||||
'type' => 'text',
|
||||
],
|
||||
],
|
||||
];
|
||||
}
|
||||
|
||||
public function getName()
|
||||
{
|
||||
$info = self::getInfo();
|
||||
|
||||
return parent::getName().' - '.$info['name'];
|
||||
}
|
||||
|
||||
public function storeDeliveryInfo($data): array
|
||||
{
|
||||
parent::storeDeliveryInfo($data);
|
||||
|
||||
$pointData = $data['zasilkovna_point_data'] ?? '';
|
||||
$pointData = json_decode($pointData, true);
|
||||
|
||||
if (empty($pointData)) {
|
||||
return [];
|
||||
}
|
||||
|
||||
$label = getVal('routingCode', $pointData) ?? getVal('labelRouting', $pointData);
|
||||
|
||||
return $this->data += [
|
||||
'fromWidget' => true,
|
||||
'idZ' => $pointData['id'] ?? $pointData['idZ'] ?? '',
|
||||
'carrierId' => $pointData['carrierId'] ?? null,
|
||||
'zip' => getVal('zip', $pointData),
|
||||
'hours' => getVal('openingHours', $pointData) ?? getVal('hours', $pointData),
|
||||
'street' => getVal('street', $pointData),
|
||||
'country' => strtoupper(getVal('country', $pointData)),
|
||||
'city' => getVal('city', $pointData),
|
||||
'place_name' => getVal('name', $pointData),
|
||||
'place' => getVal('place', $pointData),
|
||||
'labelRouting' => $label,
|
||||
'directions' => getVal('directions', $pointData),
|
||||
];
|
||||
}
|
||||
|
||||
public function setPointId($id): self
|
||||
{
|
||||
$this->data['idZ'] = $id;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function getPointId()
|
||||
{
|
||||
return $this->data['idZ'] ?? null;
|
||||
}
|
||||
|
||||
public function getInfo($idZ = null)
|
||||
{
|
||||
$data = null;
|
||||
|
||||
if (is_null($idZ)) {
|
||||
$idZ = $this->data['idZ'] ?? null;
|
||||
}
|
||||
|
||||
if (getVal('fromWidget', $this->data)) {
|
||||
$data = $this->data;
|
||||
$data['name'] = getVal('name', $this->data) ?? getVal('place_name', $this->data);
|
||||
unset($data['place_name']);
|
||||
} elseif ($idZ) {
|
||||
$data = sqlFetchAssoc(sqlQuery('SELECT * FROM '.self::$tableName.'
|
||||
WHERE id=:id',
|
||||
['id' => $idZ]));
|
||||
|
||||
if ($data) {
|
||||
$data['idZ'] = $data['id'];
|
||||
$data['hours'] = unserialize($data['hours']);
|
||||
$data['address'] = $data['street'].', '.$data['zip'].', '.$data['city'];
|
||||
}
|
||||
}
|
||||
|
||||
if (!$data) {
|
||||
return [
|
||||
'name' => 'Neznámá pobočka',
|
||||
'city' => 'Neznámé',
|
||||
'place' => 'Neznámé',
|
||||
'street' => 'Neznámé',
|
||||
'zip' => 'Neznámé',
|
||||
'country' => 'Neznámé',
|
||||
'idZ' => $idZ,
|
||||
];
|
||||
}
|
||||
|
||||
return $data;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param $data admin order data
|
||||
* @param Order $order
|
||||
*
|
||||
* @return bool|string
|
||||
*/
|
||||
public function applyToOrder(&$data, $order)
|
||||
{
|
||||
parent::applyToOrder($data, $order);
|
||||
|
||||
$info = $this->getInfo();
|
||||
if (empty($info['labelRouting'])) {
|
||||
$this->data['labelRouting'] = null;
|
||||
|
||||
return 'Není zvolena zásilkovna!';
|
||||
}
|
||||
$data['delivery_zip'] = $info['zip'];
|
||||
$data['delivery_street'] = $info['street'];
|
||||
$data['delivery_city'] = $info['city'];
|
||||
$data['delivery_country'] = $info['country'];
|
||||
$data['delivery_firm'] = $info['place'];
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param $cart CartBase
|
||||
*/
|
||||
public function applyToCart(CartBase $cart)
|
||||
{
|
||||
parent::applyToCart($cart);
|
||||
|
||||
$info = $this->getInfo();
|
||||
|
||||
if (empty($info['labelRouting'])) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (isset($cart->invoice['name'])) {
|
||||
$cart->delivery['name'] = $cart->invoice['name'];
|
||||
$cart->delivery['surname'] = $cart->invoice['surname'];
|
||||
}
|
||||
|
||||
$cart->delivery['zip'] = $info['zip'];
|
||||
$cart->delivery['street'] = $info['street'];
|
||||
$cart->delivery['city'] = $info['city'];
|
||||
$cart->delivery['country'] = $info['country'];
|
||||
$cart->delivery['firm'] = $info['place'];
|
||||
}
|
||||
|
||||
public function printDeliveryInfo()
|
||||
{
|
||||
$info = $this->getInfo();
|
||||
|
||||
return "<strong>{$info['city']}</strong>, {$info['street']}, {$info['place']}, <strong>{$info['zip']}</strong>";
|
||||
}
|
||||
|
||||
public function check(Cart $cart)
|
||||
{
|
||||
if ($weight_limit = ($this->config['weight_limit'] ?? 0)) {
|
||||
if ($cart->getTotalWeight() > $weight_limit) {
|
||||
// Vahovy limit pro tento typ dopravy byl prekrocen
|
||||
throw new DeliveryException(translate_shop('weight_limit', 'delivery'),
|
||||
translate_shop('weight_limit_short', 'delivery'),
|
||||
DeliveryException::ERROR_DELIVERY_DISABLED);
|
||||
}
|
||||
}
|
||||
|
||||
return parent::check($cart);
|
||||
}
|
||||
|
||||
public function checkSelected(Cart $cart, ?Payment $payment = null)
|
||||
{
|
||||
// check selected combination of delivery and payment
|
||||
|
||||
if (($cart->max_step != 0) && ($payment instanceof Dobirka)) {
|
||||
$currencyContext = ServiceContainer::getService(CurrencyContext::class);
|
||||
$currency = $currencyContext->getActive();
|
||||
if (!empty($this->config['limit'][$currency->getId()])) {
|
||||
$limit = toDecimal($this->config['limit'][$currency->getId()]);
|
||||
if (!$cart->totalPricePay->lowerThan($limit)) {
|
||||
throw new DeliveryException(sprintf(translate_shop('zasilkovna_dobirka_limit', 'delivery'),
|
||||
$limit->printValue().' '.$currency->getSymbol()), '', DeliveryException::ERROR_DELIVERY_DISABLED);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ($cart->hasData('delivery')) {
|
||||
if (empty($this->data['labelRouting'])) {
|
||||
throw new DeliveryException(translate('branch_missing_zip', 'delivery'));
|
||||
}
|
||||
|
||||
$info = $this->getInfo();
|
||||
if (empty($info['labelRouting'])) {
|
||||
throw new DeliveryException('Neznámá pobočka.');
|
||||
}
|
||||
$currencyContext = ServiceContainer::getService(CurrencyContext::class);
|
||||
$currency = $this->custom_data['balikobot']['currency'] ?? $currencyContext->getActiveId();
|
||||
|
||||
if (
|
||||
!empty($this->data['labelRouting'])
|
||||
&& !in_array($info['country'], $this->getCountryByCurrency($currency))
|
||||
) {
|
||||
throw new DeliveryException(translate('branch_currency_not_supported', 'delivery'));
|
||||
}
|
||||
}
|
||||
|
||||
return parent::checkSelected($cart, $payment);
|
||||
}
|
||||
|
||||
public function import()
|
||||
{
|
||||
$json = file_get_contents(self::$jsonDelivery);
|
||||
$data = json_decode_strict($json, true);
|
||||
|
||||
if (count($data) > 0) {
|
||||
sqlGetConnection()->transactional(function () use ($data) {
|
||||
sqlQuery('UPDATE '.self::$tableName.' SET visible = "N" ');
|
||||
$separatedCol = [
|
||||
'id',
|
||||
'zip',
|
||||
'street',
|
||||
'country',
|
||||
'city',
|
||||
'name',
|
||||
'place',
|
||||
'labelRouting',
|
||||
'directions',
|
||||
'url',
|
||||
];
|
||||
|
||||
$excludeColumns = [
|
||||
'photos',
|
||||
];
|
||||
|
||||
foreach ($data['data'] as $id => $branch) {
|
||||
$data = [];
|
||||
foreach ($branch as $title => $value) {
|
||||
if (in_array($title, $separatedCol)) {
|
||||
if ($title == 'zip') {
|
||||
$data[$title] = str_replace(' ', '', $value);
|
||||
} elseif ($title == 'url') {
|
||||
if (is_array($value)) {
|
||||
$data[$title] = serialize($value);
|
||||
} else {
|
||||
$data[$title] = $value;
|
||||
}
|
||||
} elseif ($title == 'country') {
|
||||
$data[$title] = strtoupper($value);
|
||||
} else {
|
||||
if ($value === []) { // Sulini tam obcas misto prazdnyho stringu maji prazdny objekt
|
||||
$value = '';
|
||||
}
|
||||
$data[$title] = $value;
|
||||
}
|
||||
} elseif ($title == 'openingHours') {
|
||||
// foreach ($value['regular'] as $day => $hours) {
|
||||
// $formatter = new IntlDateFormatter('cs_CZ', IntlDateFormatter::FULL, IntlDateFormatter::FULL);
|
||||
// $formatter->setPattern('EEEE');
|
||||
// $p = $formatter->format(new DateTime($day));
|
||||
//
|
||||
// $openingHours[mb_convert_case($p, MB_CASE_TITLE, 'UTF-8')] = $hours;
|
||||
// }
|
||||
$data['hours'] = serialize($value['compactShort']);
|
||||
} elseif (!in_array($title, $excludeColumns)) {
|
||||
$data['data'][$title] = $value;
|
||||
}
|
||||
}
|
||||
$data['data'] = serialize($data['data']);
|
||||
$data['visible'] = 'Y';
|
||||
|
||||
$this->replaceSQL(self::$tableName, $data);
|
||||
}
|
||||
});
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
protected function getCountryByCurrency($currency): array
|
||||
{
|
||||
switch ($currency) {
|
||||
case 'CZK':
|
||||
return ['CZ'];
|
||||
break;
|
||||
case 'EUR':
|
||||
return ['SK', 'DE', 'AT', 'FR', 'ES', 'HR', 'IT'];
|
||||
break;
|
||||
case 'HUF':
|
||||
return ['HU'];
|
||||
break;
|
||||
case 'RON':
|
||||
return ['RO'];
|
||||
break;
|
||||
case 'PLN':
|
||||
return ['PL'];
|
||||
break;
|
||||
default:
|
||||
return [];
|
||||
}
|
||||
}
|
||||
|
||||
public function ZBOXOnly(): bool
|
||||
{
|
||||
$vendors = $this->getCustomData()['widget_options']['vendors'] ?? [];
|
||||
|
||||
foreach ($vendors as $vendor) {
|
||||
if (($vendor['group'] ?? '') != 'zbox') {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user