Le modifiche sono state testate su Prestashop 1.6.0.11
Ho notato che Prestahop visualizza la quantità disponibile senza tener conto di eventuali prodotti messi nel proprio e/o nel carrello di altri utenti.
Ipotizziamo di aver 10 pezzi in magazzino di un prodotto denominato “PALLA” .
Se il cliente TIZIO mette nel proprio carrello nr 7 PALLA ed il cliente CAIO mette nel proprio carrello nr 6 PALLA il nostro Prestashop lo consente intervenendo solo al momento del pagamento negando l'operazione a colui che provvederà all'acquisto per secondo avvertendolo che un prodotto non è più disponibile.
Ho provato a verificare se esistesse una modalità di configurazione in admin che cambiasse il modo di calcolare la disponibilità del prodotto ma non l'ho trovata. (Se ci fosse sarei grato a chi me la indicasse).
Ho provato allora a scrivere due righe di codice per modificare le cose e siccome mi sembra funzionino bene le metto a disposizione di tutti.
1) creare in root una cartella denominata “arriba” ed inserire il file Arriba.php (vedi script alla fine)
2) con un editor aprire il file in classes/stock/StockAvaible.php
circa in riga 363
modificare la riga
Cache::store($key, (int)Db::getInstance(_PS_USE_SQL_SLAVE_)->getValue($query);
in
Cache::store($key, (int)Db::getInstance(_PS_USE_SQL_SLAVE_)->getValue($query)
-Arriba::qta_product_cart($id_product));
3)nel file classes/Product.php
circa in riga 3074
modificare la riga
return ($qty <= StockAvailable::getQuantityAvailableByProduct($this->id, $id_product_attribute));
in
return ($qty <= StockAvailable::getQuantityAvailableByProduct($this->id, $id_product_attribute)+Arriba::qta_product_order($this->id));
4) Nel file controller/FrontController.php
inserire in riga 2 in pratica sotto <?php
include_once("arriba/Arriba.php");
e circa a riga 268
modificare la riga
else
$this->context->cart = $cart;
in
else {
$this->context->cart = $cart;
define("ARRIBA_CART",$cart->id);
}
Dopo queste modifiche verrà visualizzato come disponibilità del prodotto la quantità in magazzino meno la quantità nei carrelli prima di essere venduti e quando l'utente inserirà il prodotto nel carrello si terrà conto delle quantità presenti nei vari carrelli.
Ricordiamo che ogni volta che aggiorneremo la versione di Prestashop oppure modiche che alterano i file
da noi rettificati dovremo verificare se esistono ancora le nostre modifiche ed eventualmente inserirle nuovamente.
Una cosa da tenere presente sono i CARRELLI ABBANDONATI che potrebbero alterare la disponibilità effettiva.
E' opportuno nella parte admin-Clienti verificare se nei Carrello della spesa ci siano carrelli abbandonati da molto tempo ed eventualmente eliminarli.
Spero che il mio lavoro sia utile ad altri.
Qua sotto il file Arriba.php da inserire nella cartella arriba
***Inizio file Arriba.php ***(utilizzato sul sito www.arribaarriba.it)***
<?php
class Arriba
{
public function qta_product_cart($idprod)
{
$query="select id_cart from "._DB_PREFIX_."cart where id_carrier!='0'";
$rows = Db::getInstance()->executeS("$query");
$notin='';
foreach ($rows as $r)
{
$notin.="'$r[id_cart]',";
}
$not=substr($notin,0,-1);
if($not!=''){$not=" and "._DB_PREFIX_."cart_product.id_cart not in($not)";}
$newquery="select sum("._DB_PREFIX_."cart_product.quantity) as qty
from "._DB_PREFIX_."cart_product
where "._DB_PREFIX_."cart_product.id_product='$idprod' $not";
return (int)Db::getInstance(_PS_USE_SQL_SLAVE_)->getValue($newquery);
}
public function qta_product_order($idprod)
{
$id_cart=ARRIBA_CART;
$newquery="select "._DB_PREFIX_."cart_product.quantity as qty
from "._DB_PREFIX_."cart_product
where "._DB_PREFIX_."cart_product.id_product='$idprod' and "._DB_PREFIX_."cart_product.id_cart='$id_cart'";
return (int)Db::getInstance(_PS_USE_SQL_SLAVE_)->getValue($newquery);
}
}
?>
*** fine file Arriba.php