Jump to content

Duplicitní referenční číslo objednávky


RobertJunek
 Share

Recommended Posts

Zdravím všechny,

v okamžiku, kdy zákazníci vytvoří objednávku ve stejnou vteřinu, tak se nám vytvoří sice dvě objednávky s různým ID ale se stejnou referencí. Reference generujeme ve formátu "20" + IDobjednávky, níže uvedená funkce se mi tak zdá zbytčně složitá a generující problémy.

Nebylo by podle vás prostě na tvrdo vzít id_order a před něj vložit řetězec se "20" a lze to tak vůbec udělat?

Díky moc za radu/navedení

 

public function getUniqReference()
    {
        $query = new DbQuery();
        $query->select('MIN(id_order) as min, MAX(id_order) as max');
        $query->from('orders');
        $query->where('id_cart = '.(int)$this->id_cart);

        $order = Db::getInstance()->getRow($query);

        if ($order['min'] == $order['max']) {
            return $this->reference;
        } else {
            return $this->reference.'#'.($this->id + 1 - $order['min']);
        }
    }

 

Share this post


Link to post
Share on other sites

On 11/15/2020 at 5:06 AM, knacky said:

Složitá ?

To určitě není.

Návod na vlastní formát čísla reference je zde od českého programátora:

Díky za odkaz. Problém ale generují objednávky, které proběhnou ve stejný čas; reálně se stává, že dva zákazníci objednají na vteřinu přesně. Tím, že se tahá poslední order id a z toho se generuje až následně reference, tak vzniká problém, že občas prostě dvě objednávky vzniklé ve stejný čas mají sice odlišné order id, ale stejnou referenci. Tam směřuje můj problém 😕

Share this post


Link to post
Share on other sites

Pokud script dělá problém, tak stačí upravit získání id_order z contextu.

Např.

id_order = $this->order->id;

nebo

id_order = Tools::getValue('id_order');

nebo odchytit číslo košíku a poté zjistit id_order ...

Ve tvém případě je to na programátorský zásah, zde již nestačí Ctrl + C / Ctrl + V

Edited by knacky (see edit history)

Share this post


Link to post
Share on other sites

V Prestashopu je to tak, že při přidání prvního produktu do košíku se vytvoří v tabulce ps_cart záznam, tedy je již možné získat číslo košíku. V pokladně se vytvoří číslo objednávky až po odeslání formuláře, takže id_order se vytváří až tehdy. Toto zřizuje PaymentModule.php, který volá funkci new Order.

Dále v Order.php se při vytvoření new Order volá funkce pro generování čísla reference. Je tedy možné při vytvoření new Order získat ihned id_order (buď jako insertID nebo $order->id), nebo pužít místo čísla objednávky číslo kiošíku.

Takže v Order.php by se měla vytvořit nová funkce, která podle id_order zapíše do databáze číslo reference a odstřihne se vestavěná funkce pro generování čísla reference podle max id_order + 1.

Script, který jsem dal k dispozici, s tím, že se ve stejnou chvíli provede více objednávek nepočítá a stejně jako vestavěná funkce používá max id_order.

 

Nejlepší a nejjednodušší řešení je, naprogramování minimodulu, který se připojí k háčku actionValidateOrder a vytvoří číslo reference ještě před zobrazením potvrzovací stránky a odeslání emailu.

Edited by Guest (see edit history)

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

Cookies ensure the smooth running of our services. Using these, you accept the use of cookies. Learn More