Jump to content

Prodej do mínusu


PanCo

Recommended Posts

Zdravím, nevěděl by někdo jak donutit Prestu prodávat do mínusu?
Tak aby hodnota "Množství" mohla dostat i zápornou hodnotu a počítalo to sní i při naskladňování.
Děkuji Beda

Zkusím si odpovědět sám.
Vodítko jsem nalezl zde: http://www.prestashop.com/forums/viewthread/55662/configuration_et_utilisation_de_prestashop/decrementation_du_stock

Nezapomenout upravit v databázi tabulku ps_product sloupec quantity.
Zrušit UNSIGNED
Dále
Nahradit celou funkci "public static function updateQuantity($product)" v /classes/Product.php




Tento kód:

public static function updateQuantity($product)    {        if (!is_array($product))            die (Tools::displayError());        $result = Db::getInstance()->getRow('        SELECT `quantity`        FROM `'._DB_PREFIX_.($product['id_product_attribute'] ? 'product_attribute' : 'product').'`        WHERE `id_product` = '.intval($product['id_product']).($product['id_product_attribute'] ?        ' AND `id_product_attribute` = '.intval($product['id_product_attribute']) : ''));        if (!Configuration::get('PS_STOCK_MANAGEMENT'))            return true;        if (self::isAvailableWhenOutOfStock($product['out_of_stock']) AND intval($result['quantity']) == 0)            return -1;        if ($result['quantity'] < $product['quantity'])        {            Db::getInstance()->Execute('            UPDATE `'._DB_PREFIX_.($product['id_product_attribute'] ? 'product_attribute' : 'product').'`            SET `quantity` = 0            WHERE `id_product` = '.intval($product['id_product']).($product['id_product_attribute'] ?            ' AND `id_product_attribute` = '.intval($product['id_product_attribute']) : ''));            return false;        }        Db::getInstance()->Execute('        UPDATE `'._DB_PREFIX_.'product'.($product['id_product_attribute'] ? '_attribute' : '').'`        SET `quantity` = `quantity`-'.intval($product['quantity']).'        WHERE `id_product` = '.intval($product['id_product']).        ($product['id_product_attribute'] ? ' AND `id_product_attribute` = '.intval($product['id_product_attribute']) : ''));        return true;    }



Tímto:

public static function updateQuantity($product)    {        if (!is_array($product))            die (Tools::displayError());        $result = Db::getInstance()->getRow('        SELECT `quantity`        FROM `'._DB_PREFIX_.($product['id_product_attribute'] ? 'product_attribute' : 'product').'`        WHERE `id_product` = '.intval($product['id_product']).($product['id_product_attribute'] ?        ' AND `id_product_attribute` = '.intval($product['id_product_attribute']) : ''));        if (!Configuration::get('PS_STOCK_MANAGEMENT'))            return true;        $update = Db::getInstance()->Execute('        UPDATE `'._DB_PREFIX_.'product'.($product['id_product_attribute'] ? '_attribute' : '').'`        SET `quantity` = `quantity`-'.intval($product['quantity']).'        WHERE `id_product` = '.intval($product['id_product']).        ($product['id_product_attribute'] ? ' AND `id_product_attribute` = '.intval($product['id_product_attribute']) : ''));        if (self::isAvailableWhenOutOfStock($product['out_of_stock']) AND intval($result['quantity']) == 0) {            return -1;        }        if ($result['quantity'] < $product['quantity'])        {            return false;        }        return $update;    }



Dále v /classes/PaymentModule.php
Odstraníme chybu ve špatném odečítání ze stavu skladu (Týká se Presty 1.2.5) u vyšších verzí jsem nezaznamenal.
Nahradit tento kod:

if ($id_order_state != _PS_OS_OUTOFSTOCK_ AND (($updateResult = Product::updateQuantity($product)) === false OR $updateResult === -1)){    $id_order_state = _PS_OS_OUTOFSTOCK_;    $history = new OrderHistory();    $history->id_order = intval($order->id);    $history->changeIdOrderState(_PS_OS_OUTOFSTOCK_, intval($order->id));    $history->addWithemail();}


Tímto:

if (($id_order_state != _PS_OS_OUTOFSTOCK_) AND (($updateResult = Product::updateQuantity($product)) === false OR $updateResult === -1)){           $putOutOfStock = true;}


Dále sem:

} // end foreach ($products)


Přidat toto:

if (isset($putOutOfStock)) {    $id_order_state = _PS_OS_OUTOFSTOCK_;    $history = new OrderHistory();    $history->id_order = intval($order->id);    $history->changeIdOrderState(_PS_OS_OUTOFSTOCK_, intval($order->id));    $history->addWithemail();}



Toto řešení jsem nevymyslel, pouze převzal z výše uvedeného odkazu a zkouším ho nějak napasovat na svůj obchod.

Budu to testovat.

Chybně vyhodnocuje dostupnost zboží.
Náprava je v odpovědi č. #4 (==0 změnit na <=0)
Malý problém je v Administraci, kde to na kartě zboží testuje zda-li je množství větší nebo rovno nule. Pokud je menší než nula hodí to při uložení hlášku "1 error the field quantity is invalid" . To nějak nemůžu najít, nějaká idea? Možná něco v Validate.php

Link to comment
Share on other sites

upravit product.tpl
V sekci <!-- availability -->

{if $product->quantity <= 0}{if $allow_oosp}{$product->available_later}{else}{l s='This product is no longer in stock'}{/if}{else}{$product->available_now}{/if}

Link to comment
Share on other sites

  • 2 months later...

Tak přepsáním celé funkce "public static function updateQuantity" (/classes/Product.php) následujícím kódem mi funguje prodej do mínusu na PS 1.3.2

Bohužel v Objednávkách přestaly funguvat funkce "Stornovat zboží" a "Znovu naskladnit zboží"

public static function updateQuantity($product)
       {
               if (!is_array($product))
                       die (Tools::displayError());

               if (Pack::isPack(intval($product['id_product'])))
               {
                       $products_pack = Pack::getItems(intval($product['id_product']), intval(Configuration::get('PS_LANG_DEFAULT')));
                       foreach($products_pack AS $product_pack)
                       {
                               $tab_product_pack['id_product'] = intval($product_pack->id);
                               $tab_product_pack['id_product_attribute'] = self::getDefaultAttribute($tab_product_pack['id_product'], 1);
                               $tab_product_pack['cart_quantity'] = intval($product_pack->pack_quantity * $product['cart_quantity']);
                               self::updateQuantity($tab_product_pack);
                       }
               }

               $result = Db::getInstance()->getRow('
               SELECT `quantity`
               FROM `'._DB_PREFIX_.($product['id_product_attribute'] ? 'product_attribute' : 'product').'`
               WHERE `id_product` = '.intval($product['id_product']).($product['id_product_attribute'] ?
               ' AND `id_product_attribute` = '.intval($product['id_product_attribute']) : ''));

               if (!Configuration::get('PS_STOCK_MANAGEMENT'))
                       return true;

               Db::getInstance()->Execute('
               UPDATE `'._DB_PREFIX_.'product'.($product['id_product_attribute'] ? '_attribute' : '').'`
               SET `quantity` = `quantity`-'.intval($product['cart_quantity']).'
               WHERE `id_product` = '.intval($product['id_product']).
               ($product['id_product_attribute'] ? ' AND `id_product_attribute` = '.intval($product['id_product_attribute']) : ''));


               if (self::isAvailableWhenOutOfStock($product['out_of_stock']) AND intval($result['quantity']) == 0)
                       return -1;

               if ($result['quantity'] < $product['cart_quantity'])
               {
                       return false;
               }

               return true;
       } 



A taky jak už bylo zmíněno výše není možné při mínusovém stavu zásob daný produkt jakkoli aktualizovat (cenu, slevu, atd.)

Uměl by někdo poradit ?

Link to comment
Share on other sites

Tady to je jeden z důvodů, proč přemýšlím o nahrazení Presty jiným systémem. Toto je totiž tak důležitá vlastnost pr e-shop, že pokud neumí dobře prodávat do mínusu, plus ještě nějaké vyhodnocování objednávek po naskladnění zboži je komerční nasazení prakticky nemožné...
Nevím proč toto vývojáři opomenuli. Také je tu zbytečně moc kroků k potvrzení objednávek, takže se stává, že zákazník to prostě nedokončí...

Link to comment
Share on other sites

Jestli se nepletu tak nová verze PS 1.4 řeší oba problémy. Jak prodej do mínusu tak platba na jedné sránce.

Bohužel to je zatím v beta verzi. A přetahovat z téhle nebo i z hotové verze soubory na starou 1.3 asi taky nebude nejlepší řešení.

Tak jsem si našel řešení. Není ještě 100%. Ale funguje editace zboží.

Satčio upravit v product.php (classes)

'quantity' => 'isUnsignedInt'



na

'quantity' => 'isInt'



"Stornování" i "Znovunaskladňování" hlásí provedeno ale přičtení na sklad se neuskuteční :(

Pokud by někdo pohnul i s tím bylo by to kompletní.

Link to comment
Share on other sites

  • 1 year later...

Tak sem to vyřešil, stačí umazat následující řádky v classes/Product.php:

 

 

if (self::isAvailableWhenOutOfStock($product['out_of_stock']) AND intval($result['quantity']) == 0) {

return -1;

}

if ($result['quantity'] < $product['quantity'])

{ return false; }

return $update; }

Link to comment
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
×
×
  • Create New...