if ($output == false) {
$output = curl_error($ch);
}
// DEVOLVEMOS EL CODIGO HTTP (404, 500, 200...)
if ($return_http_code) {
$output = curl_getinfo($ch, CURLINFO_HTTP_CODE);
}
curl_close($ch);
return $output;
}
/**
* Truncate strings
*
* @param string $str
* @param int $max_length Max length
* @param string $suffix Suffix optional
*
* @return string $str truncated
*/
/* CAUTION : Use it only on module hookEvents.
* * For other purposes use the smarty function instead */
public static function truncate($str, $max_length, $suffix = '...')
{
if (Tools::strlen($str) <= $max_length) {
return $str;
}
$str = utf8_decode($str);
return utf8_encode(substr($str, 0, $max_length - Tools::strlen($suffix)).$suffix);
}
public static function isMobile()
{// return true;
if (defined('IS_MOBILE')) {
return IS_MOBILE;
}
return false;
}
public static function calculateDaysTransit($days, $productId = null, $extern = false)
{
$syncronisedException = ($extern) ? Product::isSincronisedSendException($productId) : false;
if ($days <= 2) {
return [
'days' => 1,
'text_product' => self::l('%s uds.', 'Tools'),
'text_cart' => (!$syncronisedException) ? self::l('Envío inmediato', 'Tools') : self::l('24/48h', 'Tools'),
];
}
$tmpDays = (int)ceil($days / 5);
switch ($tmpDays) {
case 0:
case 1:
$days_range = '2/5';
$tmpDays = 1;
break;
case 2:
$days_range = '5/10';
break;
case 3:
$days_range = '10/15';
break;
case 4:
$days_range = '15/20';
break;
default:
$days_range = '20/30';
}
return [
'days' => $tmpDays * 5,
'text_product' => sprintf(self::l('%s uds. envío %s días', 'Tools'), '%s', $days_range),
'text_cart' => sprintf(self::l('%s días', 'Tools'), $days_range),
];
}
public static function divideString($name, $separador = '<br />', $num_lines = 2)
{
$blank_spaces = ceil(substr_count($name, ' ') / $num_lines);
$nameEnd = '';
$count_spaces = 0;
$nameTmp = str_split($name);
$br = false;
foreach ($nameTmp as $c) {
if ($c == ' ') {
$count_spaces++;
}
if ($count_spaces == $blank_spaces && $blank_spaces > 0 && !$br) {
$nameEnd .= $separador;
$br = true;
} else {
$nameEnd .= $c;
}
}
return $nameEnd;
}
/**
* Añadimos la cookie de la secure Key del carriro
*/
public static function processCookieSecureKey()
{
if (empty($_COOKIE['secure_key'])) {
$secureKey = uniqid(rand(0, 9).rand(0, 9).rand(0, 9), true);
setcookie('secure_key', $secureKey, time() + (60 * 60 * 24 * 7), '/');
Session::set('secure_key', $secureKey);
}
}
/**
* @param $timestamp
* @param $supplierId
*
* @return int
*/
public static function getClosestNonHolidayTimestampInFuture($timestamp, $supplierId, $additionalDaysToSkip = 0): int
{
$dateTimeHelper = new DatetimeHelper();
$dateTime = $dateTimeHelper->getDatetimeFromTimestamp($timestamp);
$weekendDays = [DatetimeHelper::SATURDAY, DatetimeHelper::SUNDAY];
$dateHolidays = Tools::jsonDecode(Configuration::get('HOLIDAYS', true), true);
if ($supplierId) {
/** @var SupplierHolidaysManager $supplierHolidayManager */
$supplierHolidayManager = Tools::getSfService(SupplierHolidaysManager::class);
$supplierHoliday = $supplierHolidayManager->findOneById((int)$supplierId);
$dateSupplierHolidays = ($supplierHoliday) ? json_decode($supplierHoliday->getHolidays(), true) : [];
}
while (true) {
$isHoliday = isset($dateHolidays[$dateTime->format('Y-m-d')]);
$isWeekend = in_array($dateTime->format('w'), $weekendDays);
if ($supplierId) {
$isHolidaySuplier = in_array($dateTime->format('Y-m-d'), $dateSupplierHolidays);
if (!$isHoliday && !$isWeekend && !$isHolidaySuplier) {
if ($additionalDaysToSkip === 0) {
return $dateTime->getTimestamp();
} else {
$additionalDaysToSkip--;
}
}
} else {
if (!$isHoliday && !$isWeekend) {
if ($additionalDaysToSkip === 0) {
return $dateTime->getTimestamp();
} else {
$additionalDaysToSkip--;
}
}
}
$dateTime->modify('+1 day');
}
}
/**
* @return int
*
* @throws Exception
*
* @var
*/
public static function getExpeditionTimestampByDefault(?int $customerId, $supplierId): int
{
return self::calculateExpeditionTimestamp($customerId, ShippingDateService::DEFAULT_EXPEDITION_MESSAGE_TIME, $supplierId, 0, 0, false);
}
/**
* @param int $idSupplier
* @param int|null $timestampToCompare
*
* @return int
*
* @throws Exception
*/
public static function getExpeditionTimestampBySupplier(?int $customerId, int $idSupplier, ?int $timestampToCompare, bool $stock_3_5): int
{
$supplierExpeditionConfig = plazo_aprovisionamiento_proveedor::getExpeditionInformation($idSupplier);
$cutTimeString = $supplierExpeditionConfig['expedition_message_time'];
$expeditionAdditionalDaysDelay = (int)$supplierExpeditionConfig['expedition_days'];
if ($stock_3_5) {
$expeditionAdditionalDaysDelay = (int)$supplierExpeditionConfig['expedition_days_3_5'];
}
return self::calculateExpeditionTimestamp($customerId, $cutTimeString, $idSupplier, $expeditionAdditionalDaysDelay, $timestampToCompare, true);
}
/**
* @param array $product
*
* @return int
*
* @throws Exception
*/
public static function getExpeditionTimestampForFutureStock(array $product): int
{
$daysUntilStockWillBeHere = \stock_venideros::calculateDaysTransit($product['id_product'], $product['id_product_attribute']);
if (!$daysUntilStockWillBeHere) {
$daysUntilStockWillBeHere = (int)self::jsonDecode(Configuration::get('STOCK_VENIDERO_DIAS_CORTESIA'), true);
}
$transitDaysData = self::calculateDaysTransit($daysUntilStockWillBeHere, $product['id_product']);
$datetimeHelper = new DatetimeHelper();
$tmpExpeditionTimestamp = $datetimeHelper->getCurrentTimestamp();
// Add
$tmpExpeditionTimestamp += $transitDaysData['days'] * DatetimeHelper::SECONDS_A_DAY;
return self::getClosestNonHolidayTimestampInFuture($tmpExpeditionTimestamp, null);
}
/**
* @param string $cutTimeString
* @param int $supplierId
* @param int $supplierAdditionalDaysDelay
* @param int|null $timestampToCompare
*
* @return int
*
* @throws Exception Calculates expedition timestamp taking into account:
* 1. Customer specific delays (Ex: Workhuman 3 hour delay)
* 2. Whether cut time has passed or not
* 3. Supplier specific delays
* 4. Skip holidays and weekends
*
* Accepts a $timestampToCompare argument that will be returned if its greater than the value calculated by the function
*/
private static function calculateExpeditionTimestamp(
?int $customerId,
string $cutTimeString,
int $supplierId,
int $supplierAdditionalDaysDelay,
?int $timestampToCompare,
bool $includeSupplierHolidays
): int {
$datetimeHelper = new DatetimeHelper();
$currentTimestamp = $datetimeHelper->getCurrentTimestamp();
// Init to current timestamp
$tmpExpeditionTimestamp = $currentTimestamp;
// Apply customer-defined delay
if (!empty($customerId)) {
$tmpExpeditionTimestamp = self::addCustomerSpecificDelay($tmpExpeditionTimestamp, $customerId);
}
// If the temporary expedition timestamp exceeds the cut time, add a day
if (self::timestampExceedsCutTime($tmpExpeditionTimestamp, $cutTimeString)) {
$tmpExpeditionTimestamp = $tmpExpeditionTimestamp + DatetimeHelper::SECONDS_A_DAY;
}
// if $tmpExpeditionTimestamp is not a working day, get closest one
$closestNonHolidayTimestampInFuture = Tools::getClosestNonHolidayTimestampInFuture($tmpExpeditionTimestamp, $includeSupplierHolidays ? $supplierId : null, 0);
// Add as many more days as 'expedition_days' value and get closest working day again
if ($supplierAdditionalDaysDelay > 0) {
$closestNonHolidayTimestampInFuture = Tools::getClosestNonHolidayTimestampInFuture($tmpExpeditionTimestamp, $includeSupplierHolidays ? $supplierId : null, $supplierAdditionalDaysDelay);
}
if ($timestampToCompare > $closestNonHolidayTimestampInFuture) {
return $timestampToCompare;
}
return $closestNonHolidayTimestampInFuture;
}
public static function replaceByAbsoluteURL($matches)
{
if (array_key_exists(1, $matches) && array_key_exists(2, $matches)) {
if (!preg_match('/^(?:https?:)?\/\//iUs', $matches[2])) {
return $matches[1].BASE_URL.'public/css/'.$matches[2];
}
return $matches[0];
}
return false;
}
/**
* @param int $tmpExpeditionTimestamp
* @param string $cutTimeString
*
* @return bool
*/
private static function timestampExceedsCutTime(int $tmpExpeditionTimestamp, string $cutTimeString): bool
{
$datetimeHelper = new DatetimeHelper();
$tmpDatetime = $datetimeHelper->getDatetimeFromTimestamp($tmpExpeditionTimestamp);
$cutTimeComponents = explode(':', $cutTimeString);
$cutTimeHours = (int)trim($cutTimeComponents[0]);
$cutTimeMinutes = (int)trim($cutTimeComponents[1]);
$cutTimeSeconds = (int)trim($cutTimeComponents[2]);
$cutDatetime = $datetimeHelper->getCurrentDateTime()->setTime($cutTimeHours, $cutTimeMinutes, $cutTimeSeconds);
return $tmpDatetime > $cutDatetime;
}
/**
* Retornamos un array con la lista de todos los productos tienda disponibles
*
* @return array Listado de productos tienda
*/
public static function getProductShopListArray()
{
$prestashopList = explode(',', Configuration::get('ID_SHOPS'));
return array_merge(\App\Entity\System\Product::SHOPIFY_PRODUCTS_IDS, $prestashopList);
}
public static function getPackName($packName, $subscriptionName = '')
{
if ($packName == $subscriptionName) {
return $subscriptionName;
}
return $packName.' '.$subscriptionName;
}
public static function getGenericServerError($errorCode)
{
return sprintf(
self::l('Ha habido una incidencia y no ha podido completarse su pedido. Vaya a la sección %sContacto > Soporte técnico%s, seleccione Web BigBuy e indíquenos el código de la incidencia %s para poder ayudarle.', 'subscriptionController'),
'<a href="'.Link::getFrontLink('contact#tabpanel3').'" class="link color-blue">',
'</a>',
$errorCode
);
}
/**
* Clean Url of <script> tags
* This method use HTMLPurifier lib from composer
*
* @param string $url
*/
public static function htmlPurifier($url): string
{
$config = HTMLPurifier_Config::createDefault();
$config->set('Cache.DefinitionImpl', null);
$purifier = new HTMLPurifier($config);
$newParam = $purifier->purify($url); // this convert
$searchParams = ['<script>', '</script>'];
$replaceParams = '';
$newParam = str_ireplace($searchParams, $replaceParams, $newParam);
$newParam = trim($newParam);
return $newParam;
}
/**
* @template T
*
* @param class-string<T> $serviceFqn
*
* @return T
*/
public static function getSfService(string $serviceFqn)
{
/** @var ContainerInterface $container */
$container = $GLOBALS['kernel']->getContainer();
return $container->get($serviceFqn);
}
public static function getSfParameter(string $parameterName)
{
/** @var ContainerInterface $container */
$container = $GLOBALS['kernel']->getContainer();
return $container->getParameter($parameterName);
}
/**
* @throws Exception
*/
public static function getExpeditionDateTextForAvailableStock(?int $customerId, $supplierId, $languageId): string
{
$expeditionTimestamp = self::getExpeditionTimestampByDefault($customerId, $supplierId);
/** @var \App\Application\Service\Helper\ShippingDateService $shippingDateService */
$shippingDateService = self::getSfService(ShippingDateService::class);
return $shippingDateService->getBuyItNowAndWeSendItOnDateText($expeditionTimestamp, false, $languageId);
}
/**
* @throws Exception
*/
public static function getExpeditionDateTextForSupplierStock($customerId, $idSupplier, $dateToCompare, $stockSupplier_3_5, $languageId): string
{
$expeditionTimestamp = self::getExpeditionTimestampBySupplier($customerId, $idSupplier, $dateToCompare, $stockSupplier_3_5);
$shippingDateService = self::getSfService(ShippingDateService::class);
return $shippingDateService->getBuyItNowAndWeSendItOnDateText($expeditionTimestamp, false, $languageId);
}
/**
* @param string $data
*
* @return string|null
*/
public static function cleanNonPrintableCharacters(string $data): ?string
{
return preg_replace('/[[:^print:]]/', '', $data);
}
/**
* @deprecated use Symfony translator instead
*/
public static function trans(string $key, ?array $parameters = [], ?string $domain = 'messages'): ?string
{
return Tools::getSfService('translator')->trans($key, $parameters, $domain);
}
public static function displayIban(string $iban)
{
return self::substr($iban, 0, 4).' ****** '.self::substr($iban, -4, 4);
}
/**
* @param int $tmpExpeditionTimestamp
* @param int $customerId
* @return float|int
*/
protected static function addCustomerSpecificDelay(int $tmpExpeditionTimestamp, int $customerId): int
{
// If customer order confirmation delay exists, add to the timestamp
$customerManager = self::getSfService(CustomerManager::class);
$customer = $customerManager->findOneById($customerId);
if (!empty($customer->getOrderConfirmationDelay())) {
$tmpExpeditionTimestamp = $tmpExpeditionTimestamp + ($customer->getOrderConfirmationDelay() * DatetimeHelper::SECONDS_AN_HOUR);
}
return $tmpExpeditionTimestamp;
}
}