Manejo de inventario

ssoulless's picture

Hola,

Estoy intentando crear un sitio que maneje inventario de forma sencilla, es decir, crear los productos como un tipo de contenido con un campo que diga "cantidad en bodega", y que se pueda agregar o disminuir la "cantidad en bodega" de una forma fácil e intuitiva.

Bueno la mayoría de módulos que he encontrado para el manejo de inventario funcionan es con sitios e-commerce, para este caso no va a haber nada que ver con pagos electrónicos.

Tal vez haya alguna forma manual de hacerlo, o algún módulo que me pueda servir? gracias de antemano.

Comments

Tutorial para desarrollar Inventario

dejahvuuu's picture

Hola

Mira este tutorial de como crear un control de inventario con Drupal 6 que tambièn puede ser aplicado a Drupal 7:

http://blog.tifon.cl/blog/moncadanicolas/tutorial-1-control-de-inventari...

Saludos

Inventario

FuLaNo_'s picture

Porque no lo haces a mano?

1 Creas un vocabulario de taxonomia llamado "Product Categories" en donde listas las posibles categorias del producto:

Vinos
- Sirah
- Merlot
- Blanco

2 Create un content-type que llamado "Product" en donde tenes:

Title - Text
Body - Longtext
Category - Term Reference -> Product Category
Stock - Integer

3 Luego tendrias que armarte una interfase como vos quieras para actualizar este stock... supongo que podria ser una grilla (quizas con views) en donde mostras los productos de X tipo, y le podes poner un filtro expuesto a la view para que te cree un seleccionable con las posibles categorias entonces con eso filtras.

4A Podrias hacer que el field de stock tenga un + y un - y que al presionarlo, via Ajax, se actualice el stock de este item.

No se que conocimientos tengas de programación como para hacer lo ultimo..

4B Si no tenes conocimientos de programacion lo que podes hacer es que la view muestre ademas un link al node edit page de cada item entonces cuando viene alguien y compra un vino blanco, filtras por esa categoria y le das click al "edit" del producto que haya comprado, se te abre el edit page y podes actualizar el stock ahi.

Para todo, salvo el punto 4A, no es necesario tener conocimientos de programación.

Espero haberte dado una guia...

Las dos opciones son buenas

ssoulless's picture

Hola, el tutorial que envió @dejahvuuu es muy bueno me dió ideas :)

En la demo de aquel tutorial cuando vas a editar la cantidad de productos me gustaría que fuera como dice @FuLaNo_ que tenga los botones +/-

Creo que se puede hacer un view con botones extra, tal vez el ajax sea la parte maluca, @FulaNo_ tal vez me puedas orientar un poco, creo que podría hacerlo así, no sé tu que dices, tal vez cree otra dicusión que trate específicamente como los botones +/- y actualizar vía ajax, bueno aquí te pongo como mas o menos creo que puedo hacerlo

Aquí solamente intento agregar un botón, pero si me gustaría que me ayudes con el ajax.

<?php
function miModulo_form_alter(&$form, &$form_state, $form_id) {
  switch (
$form_id) {
    case
'views_exposed_form':
      if (
$form['#id'] = 'views-exposed-form-miModulo-page-1') {
       
// Añadimos el botón
       
$form['miBoton']['#type'] = 'button';
       
$form['miBoton']['#value'] = t('Mi botón ejemplo');
       
$form['miBoton']['#submit'] = array('miModulo_button_handler');
      }
      break;
  }
}

function
miModulo_button_handler($form, &$form_state) {

    
//Aquí colocaría lo que hace el botón cuando le dan click, crees que puede ser así?

}
?>

Me gustaría que me orientaras no tengo mucha experiencia con el ajax...

Yo particularmente los

FuLaNo_'s picture

Yo particularmente los botones los agregaria directamente en la view

Por darte un ejemplo, en la parte de elementos a mostrar le dices que muestre el stock, luego sobreescribes ese field desde la view y haces algo como esto

-+

Como vez usas el field_stock y tambien tendrias que exponer el NID (lo pones como hidden).

Luego con jQuery lo que haces es attachearle eventtos a .less y .more y lo envias por ajax, junto al "rel" del input, que seria el ID del nodo en cuestion...

Si quieres me agregas al skype y te guio un poco

Skype: tomas.souto

Saludos!

vale!

ssoulless's picture

Vale te agrego, postearé el proceso aquí, seguramente a mas personas les servirá mas adelante.

Todavía no he podido implementar el ajax

ssoulless's picture

Hola, no estoy muy familiarizado con el framework de ajax que tiene Drupal, así que no sé como meterle ajax al inventario, pues lo hize de la forma tradicional implementando el hook_menu() y capturando la id del nodo por la URL desde la vista.

<?php
/**
*
* Implementing hook_menu()
*
**/
function ajax_inventory_menu(){
   
$items = array();
   
$items['inventory/plus/%'] = array(
   
'type' => MENU_CALLBACK,
   
'page callback' => 'ajax_add_inventory',
   
'page arguments' => array(2),
   
'access arguments' => array('access content'),
    );
   
$items['inventory/minus/%'] = array(
   
'type' => MENU_CALLBACK,
   
'page callback' => 'ajax_less_inventory',
   
'page arguments' => array(2),
   
'access arguments' => array('access content'),
    );
    return
$items;
}

//Aquí luego coloco las funciones ajax_add_inventory y ajax_less_inventory para modificar el campo field_stock y actualizar la página
?>

Como ven, tengo implementado los botones +/- que en realidad son links, ya que por alguna razón le vista no agarra la etiqueta <"input"> así que tocó utilizar <"a"><"/a">
De la forma en que lo hize toca actualizar la página, y se vuelve tedioso a la hora de modificar los valores así, sería excelente implementar el ajax pero no me pude comunicar con el colega @FuLaNo_

Alguien sabe como meterle ajax a esto? que presiones los botones +/- y que salga esa ruedita azul y que se acualize el stock sin recargar la página?

De antemano muchas gracias

Por fin lo logré =)

ssoulless's picture

Hola colegas, me puse a estudiar juicioso el framework ajax que trae la API de drupal y me di cuenta de lo potente de ese framework, la documentación es bien fácil de entender =b

Aquí les dejo como lo hize, lo explicaré pasito por pasito a alguien le puede servir:

  1. con el inventario creado, y con los links +/- cree un módulo que lo llame ajax_inventory, en el ajax_inventory.module lo primero que hize fue añadir hook_init para traer lo necesario para trabajar con el ajax de drupal, esto es por precaución y no es obligatorio

    <?php
    function ajax_inventory_init() {
     
    drupal_add_js('misc/jquery.form.js');
     
    drupal_add_library('system', 'drupal.ajax');
    }
    ?>

  2. Implementé el hook_menu para registrar las urls de los links de los botones +/-

    <?php

    function ajax_inventory_menu(){
       
       
    $items = array();
       
       
    $items['inventory/plus/%/%'] = array(
       
    'type' => MENU_CALLBACK,
       
    'page callback' => 'ajax_add_inventory',
       
    'page arguments' => array(2,3),
       
    'access arguments' => array('access content'),
        );
       
       
    $items['inventory/minus/%/%'] = array(
       
    'type' => MENU_CALLBACK,
       
    'page callback' => 'ajax_less_inventory',
       
    'page arguments' => array(2,3),
       
    'access arguments' => array('access content'),
        );
        return
    $items;
    }
    ?>

    en los "%" irán el nojs y el id del nodo a actualizar respectivamente, serán los parámetros de los 'page callback' que utilizaré...

  3. Aquí ya pasamos a los 'page callback' de las urls registradas arriba, solamente explicaré el del botón "-" ya que para el botón "+" es prácticamente lo mismo...
    Entonces, el 'page callback' del botón "-" es la función 'ajax_less_inventory' que recivirá como parámetros el array(2,3), que son los "%" de la URL.

<?php
function ajax_less_inventory($ajax,$nid){
 
 
//aquí llamamos la función que nos actualizará el nodo y nos devuelve el contenido del campo field_cantidad
 
$output = _ajax_inventory_less_load($nid); 
    if (
$ajax == 'ajax') {
   
$commands = array();
   
//aquí actualizamos donde mostramos la cantidad de artículos en la vista que está en un div con id="ajax-display-[id del nodo]"
   
$commands[] = ajax_command_replace('#ajax-display-'.$nid, '<div class="number-cant" id="ajax-display-'.$nid.'">' . $output . '</div>');
   
$page = array(
     
'#type' => 'ajax',
     
'#commands' => $commands
   
);
   
ajax_deliver($page);
  }
  else {
   
$output = '<div class="number-cant" id="ajax-display-'.$nid.'">' . $output . '</div>';
    return
$output;
  }
}
?>

4) Luego toca hacer la función _ajax_inventory_less_load que es la que nos va a actualizar el nodo, va a restarle -1 al campo que nos indica la cantidad de articulos del producto.

<?php
function _ajax_inventory_less_load($nid){
   
//cargamos el nodo
   
$node = node_load($nid);
   
//verificamos que el campo cantidad sea mayor que 0, no queremos numeros negativos en nuestro inventario xD
   
if($node->field_cantidad[$node->language][0]['value'] >0){
//aquí solamente cambias el - por un + en la función para el botón +
   
$node->field_cantidad[$node->language][0]['value'] -=1;
//actualizamos el nodo
   
node_save($node);
//retornamos el contenido del campo cantidad, este es el número que se verá en la vista
   
return $node->field_cantidad[$node->language][0]['value'];
    }else{
//si el campo ya contenía un 0 pues no pasa nada retorna 0
       
return 0;
    }
   
}
?>

5) Ahora solo falta darle el ajax a los links de los botones +/- para que funcione. En la vista que muestra el inventario, en las opciones avanzadas habilité el ajax (esto no es obligatorio), luego le di el formato a los links +/- hay que recordad que debemos linkear a nuestros hook_menus

siempre hay que colocarle la clase "use-ajax" y el nojs son importantísimos de otra forma no funcionará
<a href="inventory/plus/nojs/[id del nodo]" class="use-ajax">+</a>
<a href="inventory/minus/nojs/[id del ndo]" class="use-ajax">-</a>

Eso es todo al darle click a los botones +/- se actualiza la cantidad del producto en cuestión sin recargar la página. Espero haberme hecho entender y que a alguien mas le pueda servir. Salu2

Latin America

Group categories

Latin America

Group events

Add to calendar

Group notifications

This group offers an RSS feed. Or subscribe to these personalized, sitewide feeds:

Hot content this week