Page 2 sur 4

Re: Besoin d'aide pour gestion de stock

MessagePublié: 03 Avr 2011, 15:47
par Imaxine
Sw00p a écrit:Je cherche une solution de gestion, comme sur prestashop : Qu'un article soit en stock ou pas, qu'il soit commandable (avertissement si un article n'est pas en stock)
Et surtout, idem avec les options.
Je ne vois pas où est ton problème !!

Un client peut commander un produit dont le stock est épuisé si le paramétrage est mis sur "Oui" dans > Système > Paramètres > Onglet "Options" > Commande en rupture > Oui

Re: Besoin d'aide pour gestion de stock

MessagePublié: 03 Avr 2011, 18:35
par Sw00p
Encore faut il qu'il soit prévenu, et que cela fonctionne avec les options.

Je vais quand même essayer, car la modif m'intrigue.

Je vous tiens au jus.

Re: Besoin d'aide pour gestion de stock

MessagePublié: 03 Avr 2011, 20:04
par Sw00p
Je n'arrive pas à modifier le product.tpl

Je ne trouve pas le paragraphe :

Code: Tout sélectionner
    <?php if($option_value['quantity'] == '0') {
        echo ' disabled="disabled">' . $option_value['name'] . ' (sold out)';
    } else {
        echo '>' . $option_value['name'];
    } ?>


Je vous joins mon product.tpl :

Code: Tout sélectionner
<?php echo $header; ?><?php echo $column_left; ?><?php echo $column_right; ?>
<div id="content">
  <div class="top">
    <div class="left"></div>
    <div class="right"></div>
    <div class="center">
      <h1><?php echo $heading_title; ?></h1>
    </div>
  </div>
  <div class="middle">
    <div style="width: 100%; margin-bottom: 30px;">
      <table style="width: 100%; border-collapse: collapse;">
        <tr>
          <td style="text-align: center; width: 250px; vertical-align: top;"><a href="<?php echo $popup; ?>" title="<?php echo $heading_title; ?>" class="thickbox" rel="gallery"><img src="<?php echo $thumb; ?>" title="<?php echo $heading_title; ?>" alt="<?php echo $heading_title; ?>" id="image" style="margin-bottom: 3px;" /></a><br />
            <span style="font-size: 11px;"><?php echo $text_enlarge; ?></span></td>
          <td style="padding-left: 15px; width: 296px; vertical-align: top;"><table width="100%">
              <?php if ($display_price) { ?>
              <tr>
                <td><b><?php echo $text_price; ?></b></td>
                <td><?php if (!$special) { ?>
                  <?php echo $price; ?>
                  <?php } else { ?>
                  <span style="text-decoration: line-through;"><?php echo $price; ?></span> <span style="color: #F00;"><?php echo $special; ?></span>
                  <?php } ?></td>
              </tr>
              <?php } ?>
              <tr>
                <td><b><?php echo $text_availability; ?></b></td>
                <td><?php echo $stock; ?></td>
              </tr>
              <tr>
                <td><b><?php echo $text_model; ?></b></td>
                <td><?php echo $model; ?></td>
              </tr>
              <?php if ($manufacturer) { ?>
              <tr>
                <td><b><?php echo $text_manufacturer; ?></b></td>
                <td><a href="<?php echo str_replace('&', '&amp;', $manufacturers); ?>"><?php echo $manufacturer; ?></a></td>
              </tr>
              <?php } ?>
              <?php if ($review_status) { ?>
           <tr>
                <td><b><?php echo $text_average; ?></b></td>
                <td><?php if ($average) { ?>
                  <img src="catalog/view/theme/default/image/stars_<?php echo $average . '.png'; ?>" alt="<?php echo $text_stars; ?>" style="margin-top: 2px;" />
                  <?php } else { ?>
                  <?php echo $text_no_rating; ?>
                  <?php } ?></td>
              </tr>
           <?php } ?>
            </table>
            <br />
            <?php if ($display_price) { ?>
            <form action="<?php echo str_replace('&', '&amp;', $action); ?>" method="post" enctype="multipart/form-data" id="product">
              <?php if ($options) { ?>
              <b><?php echo $text_options; ?></b><br />
              <div style="background: #FFFFCC; border: 1px solid #FFCC33; padding: 10px; margin-top: 2px; margin-bottom: 15px;">
                <table style="width: 100%;">
                  <?php foreach ($options as $option) { ?>
                  <tr>
                    <td><?php echo $option['name']; ?>:<br />
                      <select name="option[<?php echo $option['option_id']; ?>]">
                        <?php foreach ($option['option_value'] as $option_value) { ?>
                        <option value="<?php echo $option_value['option_value_id']; ?>"><?php echo $option_value['name']; ?>
                        <?php if ($option_value['price']) { ?>
                        <?php echo $option_value['prefix']; ?><?php echo $option_value['price']; ?>
                        <?php } ?>
                        </option>
                        <?php } ?>
                      </select></td>
                  </tr>
                  <?php } ?>
                </table>
              </div>
              <?php } ?>
              <?php if ($display_price) { ?>
              <?php if ($discounts) { ?>
              <b><?php echo $text_discount; ?></b><br />
              <div style="background: #F7F7F7; border: 1px solid #DDDDDD; padding: 10px; margin-top: 2px; margin-bottom: 15px;">
                <table style="width: 100%;">
                  <tr>
                    <td style="text-align: right;"><b><?php echo $text_order_quantity; ?></b></td>
                    <td style="text-align: right;"><b><?php echo $text_price_per_item; ?></b></td>
                  </tr>
                  <?php foreach ($discounts as $discount) { ?>
                  <tr>
                    <td style="text-align: right;"><?php echo $discount['quantity']; ?></td>
                    <td style="text-align: right;"><?php echo $discount['price']; ?></td>
                  </tr>
                  <?php } ?>
                </table>
              </div>
              <?php } ?>
              <?php } ?>
              <div class="content">
                <?php echo $text_qty; ?>
                <input type="text" name="quantity" size="3" value="<?php echo $minimum; ?>" />
                <a onclick="$('#product').submit();" id="add_to_cart" class="button"><span><?php echo $button_add_to_cart; ?></span></a>
                <?php if ($minimum > 1) { ?><br/><small><?php echo $text_minimum; ?></small><?php } ?>
              </div>
              <div>
                <input type="hidden" name="product_id" value="<?php echo $product_id; ?>" />
                <input type="hidden" name="redirect" value="<?php echo str_replace('&', '&amp;', $redirect); ?>" />               
              </div>
            </form>
            <?php } ?></td>
        </tr>
      </table>
    </div>
    <div class="tabs">
      <a tab="#tab_description"><?php echo $tab_description; ?></a>
      <a tab="#tab_image"><?php echo $tab_image; ?>  (<?php echo count($images); ?>)</a>
      <?php if ($review_status) { ?><a tab="#tab_review"><?php echo $tab_review; ?></a><?php } ?>
      <a tab="#tab_related"><?php echo $tab_related; ?> (<?php echo count($products); ?>)</a>
    </div>
    <div id="tab_description" class="tab_page"><?php echo $description; ?></div>
    <?php if ($review_status) { ?>
    <div id="tab_review" class="tab_page">
      <div id="review"></div>
      <div class="heading" id="review_title"><?php echo $text_write; ?></div>
      <div class="content"><b><?php echo $entry_name; ?></b><br />
        <input type="text" name="name" value="" />
        <br />
        <br />
        <b><?php echo $entry_review; ?></b>
        <textarea name="text" style="width: 98%;" rows="8"></textarea>
        <span style="font-size: 11px;"><?php echo $text_note; ?></span><br />
        <br />
        <b><?php echo $entry_rating; ?></b> <span><?php echo $entry_bad; ?></span>&nbsp;
        <input type="radio" name="rating" value="1" style="margin: 0;" />
        &nbsp;
        <input type="radio" name="rating" value="2" style="margin: 0;" />
        &nbsp;
        <input type="radio" name="rating" value="3" style="margin: 0;" />
        &nbsp;
        <input type="radio" name="rating" value="4" style="margin: 0;" />
        &nbsp;
        <input type="radio" name="rating" value="5" style="margin: 0;" />
        &nbsp; <span><?php echo $entry_good; ?></span><br />
        <br />
        <b><?php echo $entry_captcha; ?></b><br />
        <input type="text" name="captcha" value="" autocomplete="off" />
        <br />
        <img src="index.php?route=product/product/captcha" id="captcha" /></div>
      <div class="buttons">
        <table>
          <tr>
            <td align="right"><a onclick="review();" class="button"><span><?php echo $button_continue; ?></span></a></td>
          </tr>
        </table>
      </div>
    </div>
    <?php } ?>
    <div id="tab_image" class="tab_page">
      <?php if ($images) { ?>
      <div style="display: inline-block;">
        <?php foreach ($images as $image) { ?>
        <div style="display: inline-block; float: left; text-align: center; margin-left: 5px; margin-right: 5px; margin-bottom: 10px;"><a href="<?php echo $image['popup']; ?>" title="<?php echo $heading_title; ?>" class="thickbox" rel="gallery"><img src="<?php echo $image['thumb']; ?>" title="<?php echo $heading_title; ?>" alt="<?php echo $heading_title; ?>" style="border: 1px solid #DDDDDD; margin-bottom: 3px;" /></a><br />
          <span style="font-size: 11px;"><?php echo $text_enlarge; ?></span></div>
        <?php } ?>
      </div>
      <?php } else { ?>
      <div style="background: #F7F7F7; border: 1px solid #DDDDDD; padding: 10px; margin-bottom: 10px;"><?php echo $text_no_images; ?></div>
      <?php } ?>
    </div>
    <div id="tab_related" class="tab_page">
      <?php if ($products) { ?>
      <table class="list">
        <?php for ($i = 0; $i < sizeof($products); $i = $i + 4) { ?>
        <tr>
          <?php for ($j = $i; $j < ($i + 4); $j++) { ?>
          <td width="25%"><?php if (isset($products[$j])) { ?>
            <a href="<?php echo str_replace('&', '&amp;', $products[$j]['href']); ?>"><img src="<?php echo $products[$j]['thumb']; ?>" title="<?php echo $products[$j]['name']; ?>" alt="<?php echo $products[$j]['name']; ?>" /></a><br />
            <a href="<?php echo str_replace('&', '&amp;', $products[$j]['href']); ?>"><?php echo $products[$j]['name']; ?></a><br />
            <span style="color: #999; font-size: 11px;"><?php echo $products[$j]['model']; ?></span><br />
            <?php if ($display_price) { ?>
            <?php if (!$products[$j]['special']) { ?>
            <span style="color: #900; font-weight: bold;"><?php echo $products[$j]['price']; ?></span>
            <?php } else { ?>
            <span style="color: #900; font-weight: bold; text-decoration: line-through;"><?php echo $products[$j]['price']; ?></span> <span style="color: #F00;"><?php echo $products[$j]['special']; ?></span>
            <?php } ?>
         <a class="button_add_small" href="<?php echo $products[$j]['add']; ?>" title="<?php echo $button_add_to_cart; ?>" >&nbsp;</a>
            <?php } ?>
            <br />
            <?php if ($products[$j]['rating']) { ?>
            <img src="catalog/view/theme/default/image/stars_<?php echo $products[$j]['rating'] . '.png'; ?>" alt="<?php echo $products[$j]['stars']; ?>" />
            <?php } ?>
            <?php } ?></td>
          <?php } ?>
        </tr>
        <?php } ?>
      </table>
      <?php } else { ?>
      <div style="background: #F7F7F7; border: 1px solid #DDDDDD; padding: 10px; margin-bottom: 10px;"><?php echo $text_no_related; ?></div>
      <?php } ?>
    </div>
  </div>
  <div class="bottom">
    <div class="left"></div>
    <div class="right"></div>
    <div class="center"></div>
  </div>
  <?php if ($tags) { ?>
  <div class="tags"><?php echo $text_tags; ?>
  <?php foreach ($tags as $tag) { ?>
  <a href="<?php echo $tag['href']; ?>"><?php echo $tag['tag']; ?></a>,
  <?php } ?>
  </div>
  <?php } ?>
</div>
<script type="text/javascript"><!--
$('#review .pagination a').live('click', function() {
   $('#review').slideUp('slow');
      
   $('#review').load(this.href);
   
   $('#review').slideDown('slow');
   
   return false;
});         

$('#review').load('index.php?route=product/product/review&product_id=<?php echo $product_id; ?>');

function review() {
   $.ajax({
      type: 'POST',
      url: 'index.php?route=product/product/write&product_id=<?php echo $product_id; ?>',
      dataType: 'json',
      data: 'name=' + encodeURIComponent($('input[name=\'name\']').val()) + '&text=' + encodeURIComponent($('textarea[name=\'text\']').val()) + '&rating=' + encodeURIComponent($('input[name=\'rating\']:checked').val() ? $('input[name=\'rating\']:checked').val() : '') + '&captcha=' + encodeURIComponent($('input[name=\'captcha\']').val()),
      beforeSend: function() {
         $('.success, .warning').remove();
         $('#review_button').attr('disabled', 'disabled');
         $('#review_title').after('<div class="wait"><img src="catalog/view/theme/default/image/loading_1.gif" alt="" /> <?php echo $text_wait; ?></div>');
      },
      complete: function() {
         $('#review_button').attr('disabled', '');
         $('.wait').remove();
      },
      success: function(data) {
         if (data.error) {
            $('#review_title').after('<div class="warning">' + data.error + '</div>');
         }
         
         if (data.success) {
            $('#review_title').after('<div class="success">' + data.success + '</div>');
                        
            $('input[name=\'name\']').val('');
            $('textarea[name=\'text\']').val('');
            $('input[name=\'rating\']:checked').attr('checked', '');
            $('input[name=\'captcha\']').val('');
         }
      }
   });
}
//--></script>
<script type="text/javascript"><!--
$.tabs('.tabs a');
//--></script>
<?php echo $footer; ?>

Re: Besoin d'aide pour gestion de stock

MessagePublié: 03 Avr 2011, 21:13
par Imaxine
La modification citée ci-dessus ne devrait pas t'intéresser puisqu'elle neutralise la commande lorsque cela concerne des produits épuisés. A te lire, tu souhaites l'inverse, à savoir que le client puisse commander même si le produit ne se trouve pas en stock. Le réglage que je t'ai citée dans mon dernier post règle ce problème.

Re: Besoin d'aide pour gestion de stock

MessagePublié: 03 Avr 2011, 21:18
par Sw00p
Autant pour moi lol !

J'ai donc testé vite fait la 1.4.9.3 et dans tous les cas, dés qu'un produit possède une option, le stock n'est plus gérable.

C'est en "stock" ou "rupture de stock", quelle que soit l'option.

Vraiment dommage !

Re: Besoin d'aide pour gestion de stock

MessagePublié: 03 Avr 2011, 22:54
par Imaxine
Je viens de faire le test en commandant le produit iPhone dont j'ai mis la quantité à zéro ainsi sue la quantité de l'option "Mémoire taille 16GB" que j'ai mis aussi à zéro.

Lorsque je commande cet article dans cette option, la commande fonctionne, puisque j'ai paramétré cette fonction comme citée plus haut.

Je ne comprends vraiment pas ton besoin car cela fonctionne comme tu le désires, non !!

Re: Besoin d'aide pour gestion de stock

MessagePublié: 04 Avr 2011, 08:25
par Sw00p
Alors, moi j'ai fais comme cela :

Sur un article sans option, cela fonctionne parfaitement. Quand on met stock = 0, il est indiqué comme hors stock.
De ce coté là, aucun problème.

Maintenant, imaginons, que je propose ce même article en 2 coloris : Noir et blanc.

J'ai 3 noirs en stock et aucun stock en blanc.
On a beau mettre ce que l'on veut dans les quantités des options, ce qui sera pris en compte, c'est les quantités dans l'article en lui même.

Ce qui revient à ce que j'ai dis plus haut.
Si je met le noir avec un stock de 3 et blanc avec un stock de 0, cela n'aura aucune incidence sur le stock reel, puisque Opencart se base sur le stock produit en lui même.

Donc c'est soit en stock ou soit hors stock, mais on ne peut pas cumuler les 2 s'il y a des options sur l'article.

J’espère qu'on arrive à cerner mon problème.

Re: Besoin d'aide pour gestion de stock

MessagePublié: 04 Avr 2011, 08:41
par Imaxine
Dans ce cas, met 0 pour le stock général avec le paramétrage de pouvoir commander hors stock et fait la modif citée plus haut qui neutralise les options dont le stock est épuisé, et ton problème sera réglé.

Re: Besoin d'aide pour gestion de stock

MessagePublié: 04 Avr 2011, 08:46
par Sw00p
Ok, je vais faire comme tu dis.

Mais j'applique la modif que tu cites en page 1 ?

Re: Besoin d'aide pour gestion de stock

MessagePublié: 04 Avr 2011, 09:04
par Imaxine
Je met ci'-dessous cette modification.

Dans le fichier /catalog/model/catalog/product.php

Chercher cette ligne :
Code: Tout sélectionner
                  'prefix'         => $product_option_value['prefix']
Et la remplacer par ces lignes :
Code: Tout sélectionner
                  'prefix'         => $option_value['prefix'],
                  'quantity'         => $product_option_value['quantity']

Dans le fichier /catalog/controller/product/product.php

Après cette ligne :
Code: Tout sélectionner
         $this->data['text_minimum'] = sprintf($this->language->get('text_minimum'), $product_info['minimum']);
Ajouter celle-ci :
Code: Tout sélectionner
         $this->data['text_sold_out'] = $this->language->get('text_sold_out');
Chercher cette ligne :
Code: Tout sélectionner
                  'prefix'         => $option_value['prefix']
Et la remplacer par ces lignes :
Code: Tout sélectionner
                  'prefix'         => $option_value['prefix'],
                  'quantity'         => $option_value['quantity']

Dans le fichier /catalog/language/french/product/product.php

Ajouter cette ligne :
Code: Tout sélectionner
$_['text_sold_out']        = '(&Eacute;puis&eacute;)';
Ainsi que dans les autres langues.

Dans le fichier /catalog/view/theme/YOURTHEME/template/product/product.tpl

Chercher cette ligne :
Code: Tout sélectionner
                        <option value="<?php echo $option_value['option_value_id']; ?>"><?php echo $option_value['name']; ?>
Et la remplacer par ces lignes :
Code: Tout sélectionner
                        <option value="<?php echo $option_value['option_value_id']; ?>"
                  <?php if($option_value['quantity'] == '0') {
                     echo ' disabled="disabled">' . $option_value['name'] . ' ' . $text_sold_out;
                  } else {
                     echo '>' . $option_value['name'];
                  } ?>
Chercher ces lignes :
Code: Tout sélectionner
                <?php echo $text_qty; ?>
                <input type="text" name="quantity" size="3" value="<?php echo $minimum; ?>" />
                <a onclick="$('#product').submit();" id="add_to_cart" class="button"><span><?php echo $button_add_to_cart; ?></span></a>
                <?php if ($minimum > 1) { ?><br/><small><?php echo $text_minimum; ?></small><?php } ?>
Et les remplacer par ces lignes :
Code: Tout sélectionner
           <?php if($product_info['quantity'] == '0') { echo $stock; } else { echo $text_qty; ?>
            <input type="text" name="quantity" size="3" value="<?php echo $minimum; ?>" />
            <a onclick="$('#product').submit();" id="add_to_cart" class="button"><span><?php echo $button_add_to_cart; ?></span></a>
           <?php if ($minimum > 1) { ?><br/><small><?php echo $text_minimum; ?></small><?php } ?>
           <?php } ?>
out_of_stock_options.png
out_of_stock_options.png (100.43 Kio) Consulté 10111 fois

Re: Besoin d'aide pour gestion de stock

MessagePublié: 04 Avr 2011, 09:08
par Sw00p
Ok je te remercie.

Je teste ça dans la journée.

Re: Besoin d'aide pour gestion de stock

MessagePublié: 04 Avr 2011, 10:51
par Imaxine
Imaxine a écrit:Dans ce cas, met 0 pour le stock général avec le paramétrage de pouvoir commander hors stock et fait la modif citée plus haut qui neutralise les options dont le stock est épuisé, et ton problème sera réglé.

Rectification : Il faut mettre dans la quantité du stock général, la quantité du nombre de produit avec options.
Pour ton exemple, tu as 3 coloris noir et aucun coloris blanc, il te faudra mettre "3" dans la quantité du stock général.

Re: Besoin d'aide pour gestion de stock

MessagePublié: 04 Avr 2011, 13:08
par Imaxine
Étant donné en général, qu'une option peut avoir une référence propre lui étant spécifique et que cela n'est pas natif à OpenCart, j'ai créé une modification dans l'onglet "Options" en vue de faire apparaître cette référence.

Injecter cette requête dans la base de données via phpmyadmin :
Code: Tout sélectionner
ALTER TABLE `product_option_value` ADD `sku` VARCHAR( 64 ) NOT NULL AFTER `product_id`

Ensuite,

Dans le fichier /admin/mode/catalog/product.php

Chercher cette ligne :
Code: Tout sélectionner
                  $this->db->query("INSERT INTO " . DB_PREFIX . "product_option_value SET product_option_id = '" . (int)$product_option_id . "', product_id = '" . (int)$product_id . "', quantity = '" . (int)$product_option_value['quantity'] . "', subtract = '" . (int)$product_option_value['subtract'] . "', price = '" . (float)$product_option_value['price'] . "', prefix = '" . $this->db->escape($product_option_value['prefix']) . "', sort_order = '" . (int)$product_option_value['sort_order'] . "'");
Et la remplacer par celle-là :
Code: Tout sélectionner
                  $this->db->query("INSERT INTO " . DB_PREFIX . "product_option_value SET product_option_id = '" . (int)$product_option_id . "', product_id = '" . (int)$product_id . "', sku = '" . (int)$product_option_value['sku'] . "', quantity = '" . (int)$product_option_value['quantity'] . "', subtract = '" . (int)$product_option_value['subtract'] . "', price = '" . (float)$product_option_value['price'] . "', prefix = '" . $this->db->escape($product_option_value['prefix']) . "', sort_order = '" . (int)$product_option_value['sort_order'] . "'");

Chercher cette ligne :
Code: Tout sélectionner
                  $this->db->query("INSERT INTO " . DB_PREFIX . "product_option_value SET product_option_id = '" . (int)$product_option_id . "', product_id = '" . (int)$product_id . "', quantity = '" . (int)$product_option_value['quantity'] . "', subtract = '" . (int)$product_option_value['subtract'] . "', price = '" . (float)$product_option_value['price'] . "', prefix = '" . $this->db->escape($product_option_value['prefix']) . "', sort_order = '" . (int)$product_option_value['sort_order'] . "'");
Et la remplacer par celle-là :
Code: Tout sélectionner
                  $this->db->query("INSERT INTO " . DB_PREFIX . "product_option_value SET product_option_id = '" . (int)$product_option_id . "', product_id = '" . (int)$product_id . "', sku = '" . (int)$product_option_value['sku'] . "', quantity = '" . (int)$product_option_value['quantity'] . "', subtract = '" . (int)$product_option_value['subtract'] . "', price = '" . (float)$product_option_value['price'] . "', prefix = '" . $this->db->escape($product_option_value['prefix']) . "', sort_order = '" . (int)$product_option_value['sort_order'] . "'");

Chercher cette ligne (431) :
Code: Tout sélectionner
               'language'                => $product_option_value_description_data,
Et ajouter dessous, cette ligne :
Code: Tout sélectionner
                  'sku'                 => $product_option_value['sku'],


On peut avoir comme ceci une référence par option.

Re: Besoin d'aide pour gestion de stock

MessagePublié: 04 Avr 2011, 16:39
par Sw00p
J'ai pas eu le temps de tester, je test ça dés ce soir.

Re: Besoin d'aide pour gestion de stock

MessagePublié: 04 Avr 2011, 18:14
par Sw00p
Je n'ai pas encore appliquer ta modif.

On va prendre cet exemple : http://www.netbootik.net/opencart/index ... duct_id=48

J'ai fais ce que tu m'as dis :

J'ai mis "3" dans le stock général
Le 1gb "0" en stock
Le 8gb "3" en stock

Et bien, quelque soit l'option choisie (1gb ou 8gb), ca reste sur "en stock". Si le client veut commander un 1gb par exemple, il verra ce produit en stock, alors que réellement, il n'y ai pas.

Si j'applique ta modif, qu'est ce que cela change concrètement ? Cela ajout un "champs" supplémentaire ?
Car dans la fiche produit général, j'ai cette option "Référence "Gestion des stocks", mais je ne sais pas à quoi cela correspond.