PanCo Posted October 31, 2010 Share Posted October 31, 2010 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 BedaZkusí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_stockNezapomenout upravit v databázi tabulku ps_product sloupec quantity.Zrušit UNSIGNEDDáleNahradit celou funkci "public static function updateQuantity($product)" v /classes/Product.phpTento 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.phpOdstraní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 More sharing options...
Mamejeradi.cz Posted October 31, 2010 Share Posted October 31, 2010 Nastavení-zboží-povolit objednat zboží které není na skladě Link to comment Share on other sites More sharing options...
PanCo Posted October 31, 2010 Author Share Posted October 31, 2010 Já potřebuji aby hodnota skladu byla např. -15Po naskladnění 20 ks z dodáku by teda bylo 5Dík Link to comment Share on other sites More sharing options...
Mamejeradi.cz Posted October 31, 2010 Share Posted October 31, 2010 Nevim, jestli to presta umí Link to comment Share on other sites More sharing options...
Beda Posted November 6, 2010 Share Posted November 6, 2010 upravit product.tplV 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 More sharing options...
ramble Posted January 7, 2011 Share Posted January 7, 2011 Na verzi 1.3.3 se mi to zatím nepodařilo rozchodit. Po nakoupení zboží mi to (bez ohledu na kupované množství) hodí sklad na 0. Při opětovném nákupu se už nic nedečítá Link to comment Share on other sites More sharing options...
ramble Posted January 11, 2011 Share Posted January 11, 2011 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.2Bohuž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 More sharing options...
PanCo Posted January 11, 2011 Author Share Posted January 11, 2011 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 More sharing options...
ramble Posted January 11, 2011 Share Posted January 11, 2011 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 More sharing options...
volek08 Posted October 4, 2012 Share Posted October 4, 2012 (edited) Ahoj, omlouvám se, že obnovuju nějakou dobu staré téma, ale sklad se hodí do mínusu jen u prvního produktu v objednávce. Pokud si zákazník objedná více produktů, které mají sklad 0, záporná hodnota se uloží jen pro první produkt. Edited October 4, 2012 by volek08 (see edit history) Link to comment Share on other sites More sharing options...
volek08 Posted October 11, 2012 Share Posted October 11, 2012 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 More sharing options...
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now