Pregunta

Tenemos regla de precio de catálogo simple que es válida indefinidamente.

En nuestro feed de Google Shopping que se genera en la medianoche, la regla no se aplica el precio.

Mi teoría es que hay un marco de tiempo pequeño, donde los precios calculados no están disponibles.

He comprobado catalogrule_product_price - parece que hay sólo los precios calculados hasta hoy (2013-04-22), por lo que expirará a medianoche:

mysql> select distinct rule_date from catalogrule_product_price;
+------------+
| rule_date  |
+------------+
| 2013-04-20 |
| 2013-04-21 |
| 2013-04-22 |
+------------+
3 rows in set (0.05 sec)

¿Es esto normal? cron_schedule tiene entradas recientes así que creo que el sistema cron está ejecutando en general.

Estaba teniendo en cuenta, que las reglas de precios siempre se generan varios días de antelación, para evitar este tipo de espacios de tiempo con precios equivocados - que estaba mal con esta suposición? ¿Qué está pasando aquí?

EDIT: comprobado de nuevo hoy (2013-04-25) - mismo problema. Deseo lo comprobé ayer para ver si también 23., 24. y 25 donde existente y por lo que los precios se generan siempre en racimos o árbol de si los precios son siempre generados hasta hoy y tres días atrás.

mysql> select distinct rule_date from catalogrule_product_price;
+------------+
| rule_date  |
+------------+
| 2013-04-23 |
| 2013-04-24 |
| 2013-04-25 |
+------------+
3 rows in set (0.00 sec)
¿Fue útil?

Solución

No.

El trabajo de cron llama al método de observador Mage_CatalogRule_Model_Observer::dailyCatalogUpdate(). Éste llamadas Mage_CatalogRule_Model_Resource_Rule::applyAllRulesForDateRange() sin argumentos.

Si applyAllRulesForDateRange() se llama sin argumentos, un día +/- la fecha actual se asume.

Así que puede crear fechas anteriores o posteriores, pero el trabajo de cron noche no.

Otros consejos

Me pasar algún tiempo para entender esto :)

y los precios calcular guión de la día actual , el día anterior y el día siguiente .

en el que, actualizaciones incluyen intervalo de 3 días [en Magento 2.2.X]

  • día actual - 1 días antes de + 1 días después

Actualización diaria regla de precio de catálogo por cron

/vendor/magento/module-catalog-rule/Cron/DailyCatalogUpdate.php

  • Actualizar la inclusión de intervalos de 3 días - día actual - 1 días antes de + 1 días después
  • Este método es llamado desde proceso de cron, cron está trabajando en hora UTC y
  • que debe generar datos para el intervalo de -1 día 1 día ...

precios de los productos Reindex según parámetros de la regla.

/vendor/magento/module-catalog-rule/Model/Indexer/ReindexRuleProductPrice.php

public function execute(
    $batchCount,
    \Magento\Catalog\Model\Product $product = null,
    $useAdditionalTable = false
) {
    $fromDate = mktime(0, 0, 0, date('m'), date('d') - 1);
    $toDate = mktime(0, 0, 0, date('m'), date('d') + 1);

    /**
     * Update products rules prices per each website separately
     * because of max join limit in mysql
     */

    -
    -
    -

$ruleData['from_time'] = $this->roundTime($ruleData['from_time']);
$ruleData['to_time'] = $this->roundTime($ruleData['to_time']);
/**
 * Build prices for each day
 */
for ($time = $fromDate; $time <= $toDate; $time += IndexBuilder::SECONDS_IN_DAY) {
    if (($ruleData['from_time'] == 0 ||
            $time >= $ruleData['from_time']) && ($ruleData['to_time'] == 0 ||
            $time <= $ruleData['to_time'])
    ) {
        $priceKey = $time . '_' . $productKey;

        if (isset($stopFlags[$priceKey])) {
            continue;
        }

        if (!isset($dayPrices[$priceKey])) {
            $dayPrices[$priceKey] = [
                'rule_date' => $time,
                'website_id' => $ruleData['website_id'],
                'customer_group_id' => $ruleData['customer_group_id'],
                'product_id' => $ruleProductId,
                'rule_price' => $this->productPriceCalculator->calculate($ruleData),
                'latest_start_date' => $ruleData['from_time'],
                'earliest_end_date' => $ruleData['to_time'],
            ];
        } else {
            $dayPrices[$priceKey]['rule_price'] = $this->productPriceCalculator->calculate(
                $ruleData,
                $dayPrices[$priceKey]
            );
            $dayPrices[$priceKey]['latest_start_date'] = max(
                $dayPrices[$priceKey]['latest_start_date'],
                $ruleData['from_time']
            );
            $dayPrices[$priceKey]['earliest_end_date'] = min(
                $dayPrices[$priceKey]['earliest_end_date'],
                $ruleData['to_time']
            );
        }

        if ($ruleData['action_stop']) {
            $stopFlags[$priceKey] = true;
        }
    }
}

Así que la duración de cálculo

$fromDate = mktime(0, 0, 0, date('m'), date('d') - 1);
$toDate = mktime(0, 0, 0, date('m'), date('d') + 1);

En este Magento 1.X fallo si se produce usted está viviendo en una zona horaria cuales es más de 01: 00 a GMT. La tarea programada por defecto se ejecuta a las 01:00 y está utilizando la hora GMT para establecer el rule_date. En dicho caso la fecha se ser "ayer" por lo que no habría ninguna regla de precio para el día actual.

Ejemplo:

Current Datetime: 2017-07-19 01:00:00 (at current timezone)
Current Datetime at GMT: 2017-07-18 23:00:00
At 01:00 cronjob runs to write price rules with "$coreDate->gmtTimestamp('Today');"
Function will return "2017-07-18" which in this example is "yesterday"

Solución en 2.2.X

/vendor/magento/module-catalog-rule/Model/Indexer/IndexBuilder.php

$fromTime = strtotime($rule->getFromDate());
$toTime = strtotime($rule->getToDate());
$toTime = $toTime ? $toTime + self::SECONDS_IN_DAY - 1 : 0;

Referencias

  1. http://www.divisionlab.com/solvingmagento/magento-catalog -Price-rules /
  2. https://github.com/magento/magento2/issues/6610
  3. https: //ipfs-sec.stackexchange. cloudflare-ipfs.com/magento/A/question/3161.html
  4. https://support.google.com/merchants/answer/6069284? hl = es
Licenciado bajo: CC-BY-SA con atribución
No afiliado a magento.stackexchange
scroll top