Código Python: conteo físico vs sistema, diferencias y ajustes

Código Python: conteo físico vs sistema, diferencias y ajustes
En casi todo negocio pequeño llega el día del conteo físico y aparece la misma escena: el almacenista recorre las estanterías con la tabla en la mano, los números pasan al computador y la cifra final no coincide con lo que muestra el sistema. A partir de ahí empieza el problema de verdad, que no es contar sino decidir qué hacer con la diferencia. Si se ajusta todo de una sola vez y sin dejar soporte, cualquier revisión posterior se convierte en una discusión sin pruebas. Si no se ajusta nada, el inventario del sistema se aleja de la realidad y las compras del mes siguiente se hacen a ciegas. Este programa cubre ese paso intermedio: toma el conteo y las existencias del sistema, mide la diferencia en unidades y en dinero, separa lo que se puede ajustar de lo que conviene recontar, deja los productos sin contar en una lista aparte y guarda el soporte que después pide el contador. Está escrito para el dueño de una pyme, para el almacenista que hace el conteo con tabla y lápiz y para el contador que tiene que explicar el ajuste al cerrar el mes.
⬇ Descargar el código (ZIP)El ZIP trae todo lo necesario para ejecutarlo hoy mismo, sin conexión a internet y sin instalar librerías:
| Archivo | Qué contiene |
|---|---|
| conteo_fisico.py | El programa completo, comentado en español y probado con Python 3.11. |
| datos/conteo.csv | El conteo de ejemplo: diez productos con las existencias del sistema, el costo unitario y hasta dos conteos hechos en bodega. |
| salida_ejemplo.txt | La salida real del programa, para compararla con la que usted obtenga. |
| LEEME.md | Las instrucciones del paquete, paso a paso y en lenguaje sencillo. |
Qué hace el programa
El programa trabaja en cuatro momentos: leer, comparar, resumir y archivar. Producto por producto hace lo siguiente:
- Lee el archivo
datos/conteo.csv, donde cada línea trae el nombre del producto, las existencias que reporta el sistema, el costo unitario y hasta dos conteos hechos en bodega. - Toma el último conteo disponible: si hay un segundo conteo, es ese el que vale; si no lo hay, usa el primero. Así la recontada reemplaza el primer intento sin borrar el dato anterior.
- Calcula la diferencia en unidades restando las existencias del sistema a lo que se contó. Un resultado positivo es sobrante y uno negativo es faltante.
- Convierte esa diferencia a dinero multiplicándola por el costo unitario, con aritmética decimal exacta, en centavos y con redondeo comercial.
- Compara el tamaño de la diferencia contra la tolerancia. Lo que se pasa de la tolerancia no se ajusta: queda marcado para recontar, porque una diferencia grande casi siempre es un error de conteo y no un movimiento real del almacén.
- Deja en pendiente el producto que todavía no tiene ningún conteo, para que no desaparezca en el camino ni ensucie los totales del informe.
- Suma los sobrantes y los faltantes por separado, calcula el ajuste neto y comprueba por un segundo camino que la suma de todas las diferencias coincida con ese neto.
- Guarda dos archivos: el conteo completo con todas las filas y una hoja con solo las diferencias, que es la que se lleva a contabilidad junto al acta del conteo.
Cómo ejecutarlo
Lo único que hay que tener instalado es Python 3.11 o superior. El programa usa nada más la biblioteca estándar del lenguaje: no hay que instalar pandas, ni ninguna librería adicional, ni conectarse a internet para que funcione. Después de descomprimir el ZIP, se abre la terminal en la carpeta que quedó y se escribe un solo comando.
En Windows: python conteo_fisico.py. En Linux o Mac el comando puede ser python3 conteo_fisico.py. Si la máquina responde que no encuentra el comando python, se prueba con python3. Si responde que no encuentra el archivo, casi siempre es que la terminal quedó abierta en otra carpeta: el programa resuelve sus rutas desde su propia ubicación, de modo que basta con entrar a la carpeta descomprimida y repetir el comando. La carpeta de salida la crea el programa solo, no hay que crearla a mano ni preparar ninguna base de datos.
El código, explicado
No hace falta entender el archivo entero para aprovecharlo, pero sí vale la pena mirar cinco partes, que son las que llevan la lógica del negocio. El resto es presentación de la tabla y detalle de formato de números.
La primera parte son las rutas de entrada y de salida. El programa se pregunta dónde vive y a partir de ahí arma tres caminos, sin escribir ninguna ruta absoluta en el código. Ese detalle es el que permite mover la carpeta al escritorio, a una memoria USB o a una carpeta compartida de la red sin tocar una sola línea:
BASE = Path(__file__).resolve().parent
ENTRADA = BASE / "datos" / "conteo.csv" # conteo de ejemplo que viaja dentro del ZIP
SALIDA = BASE / "salida" / "conteo.csv" # resultado del conteo, listo para abrir en Excel
AJUSTES = BASE / "salida" / "ajustes.csv" # solo las diferencias: es el papel que va a contabilidad
ENTRADA apunta al conteo de ejemplo que viaja dentro del ZIP, SALIDA guarda el conteo completo y AJUSTES guarda solo las filas con diferencia, que son las que van a contabilidad. Las tres rutas se apoyan en pathlib, que arma los caminos con el separador del sistema operativo. En el bloque de importación aparece además la decisión más importante del programa: los números se manejan con Decimal y no con el tipo float de siempre, porque el dinero no se calcula con decimales binarios. Un centavo perdido por redondeo es un descuadre que después nadie quiere explicar, y aquí eso no ocurre porque cada valor se cuantiza a dos decimales con redondeo comercial.
La segunda parte define la tolerancia y las constantes de trabajo. La tolerancia es la línea de corte del informe: una diferencia grande no se ajusta, se cuenta otra vez. Cada negocio pone la suya, y en el ejemplo está en cinco unidades, que para un almacén de ferretería es un margen razonable:
TOLERANCIA = Decimal("5")
# Constantes de trabajo: cero y un centavo (no cambian nunca)
CERO = Decimal("0")
CENTAVO = Decimal("0.01")
La tercera parte es la función que compara. Recibe una fila del conteo, lee las existencias del sistema, el costo unitario y el último conteo disponible, y devuelve un registro con todo lo que el informe necesita mostrar:
def evaluar(fila: dict) -> dict:
"""Compara el conteo final con el sistema y clasifica la fila: diferencia, valor, resultado y acción."""
producto = fila["producto"]
sistema = Decimal(fila["sistema"])
costo = Decimal(fila["costo_unitario"])
final = ultimo_conteo(fila)
La cuarta parte es la decisión. Con la diferencia ya calculada, el programa clasifica la fila en tres resultados posibles y elige la acción. Fíjese en las dos últimas líneas: la acción no depende de si falta o sobra, sino del tamaño de la diferencia. Pasarse de la tolerancia no se ajusta, se cuenta otra vez, y ese es el criterio que separa un ajuste confiable de un ajuste a la loca:
# Diferencia = lo contado menos lo que dice el sistema (positiva: sobra)
diferencia = final - sistema
valor = redondear(diferencia * costo)
if diferencia == CERO:
resultado, accion = SIN_NOVEDAD, SIN_AJUSTE
else:
resultado = SOBRANTE if diferencia > CERO else FALTANTE
# Pasarse de la tolerancia no se ajusta: se cuenta otra vez
accion = RECONTAR if abs(diferencia) > TOLERANCIA else AJUSTAR
La quinta parte arma el ajuste neto. Aquí el programa suma los sobrantes y los faltantes por separado y después recalcula el total por otro camino, producto por producto, para comparar las dos vías. Si las dos no coinciden, la línea de comprobación avisa y el informe no debería usarse para ajustar el sistema:
sobrantes_u, faltantes_u = suma_unidades(sobrantes), suma_unidades(faltantes)
sobrantes_v, faltantes_v = suma_valor(sobrantes), suma_valor(faltantes)
neto_u, neto_v = sobrantes_u + faltantes_u, sobrantes_v + faltantes_v
suma_dif = sum((r["diferencia"] for r in con_conteo), CERO)
cuadra = suma_dif == neto_u and suma_valor(con_conteo) == neto_v
Qué vas a ver en pantalla
Al ejecutar el programa aparece primero el encabezado con el nombre del informe y la línea de tolerancia. Después viene la tabla del conteo, con una línea por producto y siete columnas: el nombre del producto, las existencias del sistema, el conteo final, la diferencia en unidades, el valor de esa diferencia, el resultado y la acción recomendada. La columna de la diferencia muestra el signo, para que se vea de un golpe qué sobra y qué falta, y la columna de la acción es la que se lleva al almacén: Ajustar quiere decir que la diferencia es pequeña y se puede corregir de una vez, Recontar quiere decir que la diferencia pasó la tolerancia y hay que volver a contar antes de tocar el sistema, y Contar es para el producto que quedó sin ningún conteo. Abajo aparece el resumen con los totales por grupo, el ajuste neto, la línea de comprobación y la lista de productos para recontar. Un pedazo de la salida real es este:
============================================================================================================ CONTEO FÍSICO VS SISTEMA Código Python didáctico · Kardex Tauro · kardex-tauro.muisca.co ============================================================================================================ Productos leídos: 10 Tolerancia: 5,00 unidades Producto Sistema Conteo final Diferencia Valor Resultado Acción ------------------------------------------------------------------------------------------------------------ Cemento gris 50 kg 120,00 120,00 0,00 0,00 SIN NOVEDAD Sin ajuste Cable THHN 12 AWG 45,00 48,00 +3,00 456.000,00 SOBRANTE Ajustar Tubo PVC 1/2 pulg x 6 m 200,00 206,00 +6,00 58.800,00 SOBRANTE Recontar Alambre de amarre 1/8 34,00 33,00 -1,00 -7.200,00 FALTANTE Ajustar Disco de corte 7 pulg 60,00 54,00 -6,00 -25.800,00 FALTANTE Recontar Cinta métrica 5 m 25,00 25,00 0,00 0,00 SIN NOVEDAD Sin ajuste Guantes de vaqueta 18,00 PENDIENTE Contar Pintura anticorrosiva 40,00 38,00 -2,00 -64.000,00 FALTANTE Ajustar Llave de paso 1/2 pulg 90,00 95,00 +5,00 43.000,00 SOBRANTE Ajustar Martillo de uña 16 oz 12,00 9,00 -3,00 -126.000,00 FALTANTE Ajustar ------------------------------------------------------------------------------------------------------------ ============================================================================================================ RESUMEN DEL CONTEO ============================================================================================================ SIN NOVEDAD 2 productos 0,00 unidades 0,00 SOBRANTE 3 productos +14,00 unidades +557.800,00 FALTANTE 4 productos -12,00 unidades -223.000,00 Total sobrantes: +14,00 unidades +557.800,00 Total faltantes: -12,00 unidades -223.000,00 Ajuste neto : +2,00 unidades +334.800,00 Productos sin conteo: 1 (no entran en el ajuste) Comprobación (suma de diferencias = ajuste neto): CUADRA Productos para recontar (2): Tubo PVC 1/2 pulg x 6 m, Disco de corte 7 pulg Archivo generado: salida/conteo.csv Archivo generado: salida/ajustes.csv
Fíjese en la línea de comprobación: cuando dice CUADRA, la suma de todas las diferencias coincide con el ajuste neto calculado por separado, y entonces el informe se puede pasar a contabilidad con tranquilidad. Si dijera REVISAR, hay algo mal escrito en el conteo y conviene arreglarlo antes de ajustar nada, porque un ajuste sobre un dato malo solo mueve el error de sitio. Mire también la columna del valor y no solo la de unidades: un faltante de tres unidades en un martillo pesa bastante más en dinero que un sobrante de cinco unidades en una llave de paso barata, y el ajuste contable se hace por el valor, no por el número de unidades. Por eso el programa trabaja con el costo unitario de cada producto y no con un promedio general.
Los dos archivos que quedan en la carpeta de salida se abren directamente en Excel o en cualquier hoja de cálculo. El conteo completo sirve para revisar y para firmar; el archivo de ajustes es corto a propósito, porque solo lleva las filas con diferencia y es el que se archiva con el acta del conteo.
Errores comunes y consejos
- Ejecutar el programa desde otra carpeta: como resuelve sus rutas desde su propio archivo, lo más simple es abrir la terminal dentro de la carpeta descomprimida y escribir ahí el comando.
- Guardar el CSV desde Excel en español: algunas versiones guardan con punto y coma como separador y entonces el archivo se lee como una sola columna. Hay que exportarlo con coma.
- Revisar bien las columnas de conteo: si se llenan las dos, el programa toma la segunda. Para comparar el primer conteo, la segunda columna debe quedar vacía.
- No poner la tolerancia en cero. Sin tolerancia, cualquier unidad de diferencia manda la fila a recontar y el informe pierde utilidad justo cuando el almacén está más desordenado.
- Revisar el costo unitario antes de ajustar. Un dato de costo viejo produce un ajuste equivocado aunque las unidades estén perfectas.
- Guardar el archivo de ajustes junto al acta del conteo y con la fecha a la vista. Cuando alguien pregunte por qué cambió el inventario, el soporte ya está listo.
- Si la comprobación dice REVISAR, no ajustar nada todavía: primero se corrige el conteo y se vuelve a ejecutar el programa.
Cuándo esto no alcanza
Este programa es un buen punto de partida, pero no es un sistema de inventario. Trabaja sobre un archivo CSV, guarda un resultado y se detiene: no tiene usuarios, no registra quién cambió qué, no guarda el historial de los conteos anteriores y no conversa con la facturación. Cuando el negocio hace conteo todos los meses en varias bodegas, cuando entran y salen productos todos los días y cuando el contador pide el rastro de cada ajuste, el archivo y el programa se quedan cortos. Ahí es donde entra Kardex Tauro, que es gratis y ordena el inventario con el kardex, las entradas, las salidas y los ajustes en un solo lugar, de modo que el conteo físico se compara contra algo que se mantiene al día. Si el inventario cabe en una hoja de cálculo y el conteo es de vez en cuando, este programa alcanza y sobra.
⬇ Descargar el código (ZIP)Descargue el ZIP, ejecute el ejemplo tal como viene y después reemplace datos/conteo.csv por su propio conteo: el programa no necesita nada más. Si el negocio sigue creciendo y el control se vuelve diario, vale la pena mirar Kardex Tauro con calma; mientras tanto, este programa deja el trabajo del conteo ordenado, medido en unidades y en dinero y con el soporte listo para el contador.