Compare commits

...

14 Commits

Author SHA1 Message Date
2701dfbf85 Merge branch 'main' of https://gitea.sekidesu.xyz/SekiDesu01/SekiPOS 2026-02-26 02:26:09 -03:00
6aa3421f0c tajetitas 2026-02-26 02:25:48 -03:00
Shiro-Nek0
b6cc945adb Merge branch 'main' of https://gitea.sekidesu.xyz/SekiDesu01/SekiPOS 2026-02-26 02:00:58 -03:00
Shiro-Nek0
a22d808b7b modified: README.md 2026-02-26 01:59:16 -03:00
3198696c46 new file: KeyGenerator/generate_keys.py 2026-02-26 00:46:51 -03:00
Shiro-Nek0
a90efc621d oops typo :3 2026-02-26 00:35:22 -03:00
Shiro-Nek0
d8b710805f docker FIX 2026-02-26 00:34:36 -03:00
1e6778f2bf modified: Dockerfile 2026-02-26 00:25:32 -03:00
574ee7773c modified: Dockerfile 2026-02-26 00:24:16 -03:00
Shiro-Nek0
fbb868c244 dockerfile v2 2026-02-26 00:19:59 -03:00
Shiro-Nek0
3a68431a21 finish 2026-02-26 00:10:36 -03:00
ad0fb66b7a modified: README.md 2026-02-26 00:09:41 -03:00
788867c1af new file: ScannerPython/scanner.py 2026-02-26 00:04:55 -03:00
a695640009 modified: README.md 2026-02-26 00:03:39 -03:00
188 changed files with 3825 additions and 7 deletions

3
.gitignore vendored
View File

@@ -1 +1,2 @@
pos_database.db
pos_database.db
ScannerGO/ScannerGO-*

View File

@@ -2,10 +2,21 @@ FROM python:3.11-slim
WORKDIR /app
COPY requirements.txt ./
# Install dependencies
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
# Copy source code
COPY app.py .
COPY templates/ ./templates/
COPY static/ ./static/
# Create the folder structure for the volume mounts
RUN mkdir -p /app/static/cache
EXPOSE 5000
# Run with unbuffered output so you can actually see the logs in Portainer
ENV PYTHONUNBUFFERED=1
CMD ["python", "app.py"]

View File

@@ -0,0 +1,51 @@
import pandas as pd
import json
import os
file_path = r'C:\Users\Pepitho\Desktop\SekiPOS\KeyGenerator\wea.xlsx'
sheet_name = 'Non FTL'
new_url_base = "https://server-ifps.accurateig.com/assets/commodities/"
def get_one_of_each():
if not os.path.exists(file_path):
print("❌ Excel file not found.")
return
# 1. Load Excel
df = pd.read_excel(file_path, sheet_name=sheet_name)
# 2. Drop rows missing the essentials
df = df.dropna(subset=['IMAGE', 'PLU', 'COMMODITY'])
# 3. CRITICAL: Drop duplicates by COMMODITY only
# This ignores Variety and Size, giving us exactly one row per fruit type.
df_unique = df.drop_duplicates(subset=['COMMODITY'], keep='first')
data_output = []
for _, row in df_unique.iterrows():
# Extract filename from the messy URL in Excel
original_link = str(row['IMAGE'])
filename = original_link.split('/')[-1]
# Build the final working URL
image_url = f"{new_url_base}{filename}"
# Get the clean Commodity name
commodity = str(row['COMMODITY']).title()
plu_code = str(row['PLU'])
data_output.append({
"name": commodity,
"plu": plu_code,
"image": image_url
})
# 4. Save to JSON
with open('one_of_each.json', 'w', encoding='utf-8') as f:
json.dump(data_output, f, indent=4, ensure_ascii=False)
print(f"✅ Success! Generated 'one_of_each.json' with {len(data_output)} unique commodities.")
if __name__ == "__main__":
get_one_of_each()

View File

@@ -0,0 +1,116 @@
import os
import json
import requests
import barcode
import urllib3
import re
from barcode.writer import ImageWriter
from PIL import Image, ImageDraw, ImageFont
from io import BytesIO
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
# --- CONFIGURATION ---
JSON_FILE = 'frutas.json'
OUTPUT_DIR = 'keychain_cards'
IMG_CACHE_DIR = 'image_cache'
os.makedirs(OUTPUT_DIR, exist_ok=True)
os.makedirs(IMG_CACHE_DIR, exist_ok=True)
def clean_filename(name):
"""Prevents Windows path errors by stripping illegal characters."""
return re.sub(r'[\\/*?:"<>|]', "_", name)
def get_ean_from_plu(plu):
"""Standard 4-digit PLU to EAN-13 padding."""
return f"000000{str(plu).zfill(4)}00"
def get_cached_image(url, plu):
"""Checks local cache before downloading."""
cache_path = os.path.join(IMG_CACHE_DIR, f"{plu}.jpg")
if os.path.exists(cache_path):
return cache_path
try:
headers = {'User-Agent': 'Mozilla/5.0'}
res = requests.get(url, headers=headers, timeout=10, verify=False)
if res.status_code == 200:
with open(cache_path, 'wb') as f:
f.write(res.content)
return cache_path
except Exception as e:
print(f"❌ Error downloading {plu}: {e}")
return None
def generate_card(item):
name = item['name']
plu = item['plu']
img_url = item['image']
# Use original English name for filename and display
safe_name = clean_filename(name).replace(' ', '_')
final_path = os.path.join(OUTPUT_DIR, f"PLU_{plu}_{safe_name}.png")
# 1. Skip if already done
if os.path.exists(final_path):
return
# 2. Local Image Fetch
local_img_path = get_cached_image(img_url, plu)
# 3. Canvas Setup
card = Image.new('RGB', (300, 450), color='white')
draw = ImageDraw.Draw(card)
# Thicker frame as requested (width=3)
draw.rectangle([0, 0, 299, 449], outline="black", width=3)
if local_img_path:
try:
img = Image.open(local_img_path).convert("RGB")
w, h = img.size
size = min(w, h)
img = img.crop(((w-size)//2, (h-size)//2, (w+size)//2, (h+size)//2))
img = img.resize((200, 200), Image.Resampling.LANCZOS)
card.paste(img, (50, 40))
except:
draw.text((150, 140), "[IMG ERROR]", anchor="mm", fill="red")
else:
draw.text((150, 140), "[NOT FOUND]", anchor="mm", fill="red")
# 4. Text
try:
# Standard Windows font path
f_name = ImageFont.truetype("arialbd.ttf", 22)
f_plu = ImageFont.truetype("arial.ttf", 18)
except:
f_name = f_plu = ImageFont.load_default()
draw.text((150, 260), name.upper(), fill="black", font=f_name, anchor="mm")
draw.text((150, 295), f"PLU: {plu}", fill="#333333", font=f_plu, anchor="mm")
# 5. Barcode
EAN = barcode.get_barcode_class('ean13')
ean = EAN(get_ean_from_plu(plu), writer=ImageWriter())
tmp = f"tmp_{plu}"
ean.save(tmp, options={'module_height': 12.0, 'font_size': 10, 'text_distance': 4})
if os.path.exists(f"{tmp}.png"):
b_img = Image.open(f"{tmp}.png")
b_img = b_img.resize((280, 120))
card.paste(b_img, (10, 320))
os.remove(f"{tmp}.png")
card.save(final_path)
print(f"✅ Card created: {name} ({plu})")
if __name__ == "__main__":
if not os.path.exists(JSON_FILE):
print(f"❌ Missing {JSON_FILE}")
else:
with open(JSON_FILE, 'r', encoding='utf-8') as f:
data = json.load(f)
print(f"Processing {len(data)} cards...")
for entry in data:
generate_card(entry)
print("\nAll done. Try not to lose your keys.")

BIN
KeyGenerator/wea.xlsx Normal file

Binary file not shown.

View File

@@ -1,2 +1,85 @@
# SekiPOS
# SekiPOS v1.0 🍫🥤
A reactive POS inventory system for software engineers with a snack addiction. Features real-time UI updates, automatic product discovery via Open Food Facts, and local image caching.
## 🚀 Features
- **Real-time UI:** Instant updates via Socket.IO.
- **Smart Fetch:** Pulls product names/images from Open Food Facts if not found locally.
- **Local Cache:** Saves images locally to `static/cache` to avoid IP bans.
- **CLP Ready:** Chilean Peso formatting ($1.234) for local commerce.
- **Secure:** Hashed password authentication via Flask-Login.
## 🐳 Docker Deployment (Server)
Build and run the central inventory server:
```bash
# Build the image
docker build -t sekipos:latest .
# Run the container (Map port 5000 and persist the database/cache)
docker run -d \
-p 5000:5000 \
-v $(pwd)/sekipos/db:/app/db \
-v $(pwd)/sekipos/static/cache:/app/static/cache \
--name sekipos-server \
sekipos:latest
```
Or use this stack:
```yml
name: sekipos
services:
sekipos:
ports:
- 5000:5000
volumes:
- YOUR_PATH/sekipos/db:/app/db
- YOUR_PATH/sekipos/static/cache:/app/static/cache
container_name: sekipos-server
image: sekipos:latest
```
## 🔌 Hardware Scanner Bridge (`ScannerGO`)
The server needs a bridge to talk to your physical COM port. Use the `ScannerGO` binary on the machine where the scanner is plugged in.
### 🐧 Linux
```bash
chmod +x ScannerGO-linux
./ScannerGO-linux -port "/dev/ttyACM0" -baud 115200 -url "http://<SERVER_IP>:5000/scan"
```
### 🪟 Windows
```powershell
.\ScannerGO-windows.exe -port "COM3" -baud 115200 -url "http://<SERVER_IP>:5000/scan"
```
*Note: Ensure the `-url` points to your Docker container's IP address.*
All this program does its send the COM data from the scanner gun to:
```
https://scanner.sekidesu.xyz/scan?content=BAR-CODE
```
## 📦 Local Installation (Development)
If you're too afraid of Docker:
```bash
pip install -r requirements.txt
python app.py
```
## 🔐 Credentials
- **Username:** `admin`
- **Password:** `seki123` (Change this in `app.py` or you'll be hacked by a smart-fridge)
## 📁 Structure
- `app.py`: The inventory/web server.
- `static/cache/`: Local repository for product images.
- `db/pos_database.db`: SQLite storage.
## 📋 TODOs?
- Fruits and vegetables list
- Better admin registration(?)
- Cache user edited pictures

41
ScannerPython/scanner.py Normal file
View File

@@ -0,0 +1,41 @@
import serial
import requests
import time
# --- CONFIGURATION ---
COM_PORT = 'COM5' # Change to /dev/ttyUSB0 on Linux
BAUD_RATE = 115200
# The IP of the PC running your Flask WebUI
SERVER_URL = "https://scanner.sekidesu.xyz/scan" # Change to your server's URL
def run_bridge():
try:
# Initialize serial connection
ser = serial.Serial(COM_PORT, BAUD_RATE, timeout=0.1)
print(f"Connected to {COM_PORT} at {BAUD_RATE} bauds.")
print("Ready to scan. Try not to break it.")
while True:
# Read line from scanner (most scanners send \r or \n at the end)
if ser.in_waiting > 0:
barcode = ser.readline().decode('utf-8').strip()
if barcode:
print(f"Scanned: {barcode}")
try:
# Send to your existing Flask server
# We use the same parameter 'content' so your server doesn't know the difference
resp = requests.get(SERVER_URL, params={'content': barcode})
print(f"Server responded: {resp.status_code}")
except Exception as e:
print(f"Failed to send to server: {e}")
time.sleep(0.01) # Don't melt your CPU
except serial.SerialException as e:
print(f"Error opening {COM_PORT}: {e}")
except KeyboardInterrupt:
print("\nBridge stopped by user. Quitter.")
if __name__ == "__main__":
run_bridge()

4
app.py
View File

@@ -14,7 +14,7 @@ socketio = SocketIO(app, cors_allowed_origins="*")
login_manager = LoginManager(app)
login_manager.login_view = 'login'
DB_FILE = 'pos_database.db'
DB_FILE = 'db/pos_database.db'
CACHE_DIR = 'static/cache'
os.makedirs(CACHE_DIR, exist_ok=True)
@@ -151,4 +151,4 @@ def serve_cache(filename):
if __name__ == '__main__':
init_db()
socketio.run(app, host='0.0.0.0', port=5000, debug=True)
socketio.run(app, host='0.0.0.0', port=5000, debug=True)

2202
commodities.json Normal file

File diff suppressed because it is too large Load Diff

2
db/.gitignore vendored Normal file
View File

@@ -0,0 +1,2 @@
*
!.gitignore

437
frutas.json Normal file
View File

@@ -0,0 +1,437 @@
[
{
"name": "Almendras",
"plu": "4924",
"image": "https://server-ifps.accurateig.com/assets/commodities/4924-almonds_1630598936.jpg"
},
{
"name": "Manzanas",
"plu": "4099",
"image": "https://server-ifps.accurateig.com/assets/commodities/apples-akane_1629314651.png"
},
{
"name": "Damascos",
"plu": "3044",
"image": "https://server-ifps.accurateig.com/assets/commodities/3044-apricots-black-velvet-03_1614619576.jpg"
},
{
"name": "Alcachofas",
"plu": "4519",
"image": "https://server-ifps.accurateig.com/assets/commodities/4519-artichokes-baby-02_1625671366.jpg"
},
{
"name": "Espárragos",
"plu": "4521",
"image": "https://server-ifps.accurateig.com/assets/commodities/4521-asparagus-01_1625671446.jpg"
},
{
"name": "Paltas",
"plu": "3509",
"image": "https://server-ifps.accurateig.com/assets/commodities/3509-gem-avocado_1625011346.JPG"
},
{
"name": "Babaco",
"plu": "3303",
"image": "https://server-ifps.accurateig.com/assets/commodities/3303-babacoa_1614719281.JPG"
},
{
"name": "Plátanos",
"plu": "4235",
"image": "https://server-ifps.accurateig.com/assets/commodities/4235-plantains-01_1625076376.jpg"
},
{
"name": "Porotos verdes / Porotos",
"plu": "4527",
"image": "https://server-ifps.accurateig.com/assets/commodities/4527-beans-chinese-long-07_1625671743.jpg"
},
{
"name": "Betarragas",
"plu": "4537",
"image": "https://server-ifps.accurateig.com/assets/commodities/4537-baby-golden-beets_1635173500.jpg"
},
{
"name": "Moras / Berries",
"plu": "4239",
"image": "https://server-ifps.accurateig.com/assets/commodities/4239-berries-blackberries-01_1625076478.jpg"
},
{
"name": "Nueces de Brasil",
"plu": "4926",
"image": "https://server-ifps.accurateig.com/assets/commodities/4926-brazil-nuts-02_1625756785.JPG"
},
{
"name": "Repollo",
"plu": "4069",
"image": "https://server-ifps.accurateig.com/assets/commodities/4069-green-cabbage_1633958066.jpg"
},
{
"name": "Zanahorias",
"plu": "4560",
"image": "https://server-ifps.accurateig.com/assets/commodities/4560-carrots-baby_1625673556.jpg"
},
{
"name": "Castañas de cajú",
"plu": "3105",
"image": "https://server-ifps.accurateig.com/assets/commodities/3105-cashews-03_1614635878.JPG"
},
{
"name": "Apionabo",
"plu": "3321",
"image": "https://server-ifps.accurateig.com/assets/commodities/3321-celery-root-03_1614720213.jpg"
},
{
"name": "Cerezas",
"plu": "3549",
"image": "https://server-ifps.accurateig.com/assets/commodities/screenshot-2023-05-02-100428_1683036305.png"
},
{
"name": "Castañas",
"plu": "4927",
"image": "https://server-ifps.accurateig.com/assets/commodities/4927-chestnuts-italian-02_1625756943.jpg"
},
{
"name": "Cocos",
"plu": "4261",
"image": "https://server-ifps.accurateig.com/assets/commodities/4261-coconuts-02_1625077777.jpg"
},
{
"name": "Choclo",
"plu": "3087",
"image": "https://server-ifps.accurateig.com/assets/commodities/3087-corn-04_1614633780.jpg"
},
{
"name": "Dátiles",
"plu": "4862",
"image": "https://server-ifps.accurateig.com/assets/commodities/4862-dates_1630598790.jpg"
},
{
"name": "Eneldo",
"plu": "4892",
"image": "https://server-ifps.accurateig.com/assets/commodities/4892-dill-baby-02_1625755376.jpg"
},
{
"name": "Berenjena",
"plu": "4599",
"image": "https://server-ifps.accurateig.com/assets/commodities/4599-baby-eggplant-aubergine_1633372314.jpg"
},
{
"name": "Helechos",
"plu": "4606",
"image": "https://server-ifps.accurateig.com/assets/commodities/4606-fiddlehead-ferns-07_1625679559.jpg"
},
{
"name": "Higos",
"plu": "4266",
"image": "https://server-ifps.accurateig.com/assets/commodities/4266-figs-03_1625077969.jpg"
},
{
"name": "Ajo",
"plu": "4608",
"image": "https://server-ifps.accurateig.com/assets/commodities/4608-garlic-regular_1637184640.jpg"
},
{
"name": "Jengibre",
"plu": "4612",
"image": "https://server-ifps.accurateig.com/assets/commodities/4612-ginger-root-06_1625679690.jpg"
},
{
"name": "Bardana",
"plu": "3091",
"image": "https://server-ifps.accurateig.com/assets/commodities/3091gobo-root-02_1614634374.jpg"
},
{
"name": "Pomelo",
"plu": "4279",
"image": "https://server-ifps.accurateig.com/assets/commodities/4279-pummelos-02_1625078575.jpg"
},
{
"name": "Uvas",
"plu": "3491",
"image": "https://server-ifps.accurateig.com/assets/commodities/arra-15-grape_1518122851.JPG"
},
{
"name": "Hojas de col / Verdes",
"plu": "4614",
"image": "https://server-ifps.accurateig.com/assets/commodities/4614-collard-greens-trimmed_1625679839.JPG"
},
{
"name": "Rábano picante",
"plu": "4625",
"image": "https://server-ifps.accurateig.com/assets/commodities/4625-horseradish-root-04_1625680026.jpg"
},
{
"name": "Jícama",
"plu": "4626",
"image": "https://server-ifps.accurateig.com/assets/commodities/4626-jicama_1635179919.jpg"
},
{
"name": "Kiwi",
"plu": "3279",
"image": "https://server-ifps.accurateig.com/assets/commodities/3279-kiwi-gold-03_1614718637.jpg"
},
{
"name": "Kumquat",
"plu": "4303",
"image": "https://server-ifps.accurateig.com/assets/commodities/4303-kumquats-03_1625079229.jpg"
},
{
"name": "Puerros",
"plu": "4629",
"image": "https://server-ifps.accurateig.com/assets/commodities/4629-leeks-02_1625680225.jpg"
},
{
"name": "Limones",
"plu": "3626",
"image": "https://server-ifps.accurateig.com/assets/commodities/3626-meyer-lemons_1460404763.jpg"
},
{
"name": "Limequats",
"plu": "4328",
"image": "https://server-ifps.accurateig.com/assets/commodities/4328-limequats-01_1625081231.jpg"
},
{
"name": "Limas",
"plu": "4305",
"image": "https://server-ifps.accurateig.com/assets/commodities/4305-limes-key-03_1625079363.jpg"
},
{
"name": "Nísperos",
"plu": "4308",
"image": "https://server-ifps.accurateig.com/assets/commodities/4308-lychees-5_1625079574.jpg"
},
{
"name": "Raíz de loto",
"plu": "3099",
"image": "https://server-ifps.accurateig.com/assets/commodities/3099-lotus-root-03_1614635240.jpg"
},
{
"name": "Macadamia",
"plu": "3106",
"image": "https://server-ifps.accurateig.com/assets/commodities/3106-macadamias_1614705972.JPG"
},
{
"name": "Malanga",
"plu": "4644",
"image": "https://server-ifps.accurateig.com/assets/commodities/4644-malanga_1633956612.jpg"
},
{
"name": "Menta",
"plu": "3475",
"image": "https://server-ifps.accurateig.com/assets/commodities/peppermint-3475_1625790587.jpg"
},
{
"name": "Hongos / Callampas",
"plu": "4647",
"image": "https://server-ifps.accurateig.com/assets/commodities/4647-mushrooms-chanterelles-1_1625681503.jpg"
},
{
"name": "Ñame",
"plu": "3276",
"image": "https://server-ifps.accurateig.com/assets/commodities/3276-name-white_1634146226.jpg"
},
{
"name": "Nectarinas",
"plu": "3437",
"image": "https://server-ifps.accurateig.com/assets/commodities/yellow-fleshed-flat-nectarine_1629140965.jpg"
},
{
"name": "Cebollines / Cebollas",
"plu": "4068",
"image": "https://server-ifps.accurateig.com/assets/commodities/4068-onions-green-2_1625063600.jpg"
},
{
"name": "Naranjas",
"plu": "4381",
"image": "https://server-ifps.accurateig.com/assets/commodities/4381-oranges-blood-01_1625082045.jpg"
},
{
"name": "Chirivía",
"plu": "4672",
"image": "https://server-ifps.accurateig.com/assets/commodities/4672-parsnip_1633958885.jpg"
},
{
"name": "Maracuyá",
"plu": "3311",
"image": "https://server-ifps.accurateig.com/assets/commodities/3311-passion-fruit-02_1614719436.jpg"
},
{
"name": "Duraznos",
"plu": "3113",
"image": "https://server-ifps.accurateig.com/assets/commodities/3113-peaches-donut-04_1614707155.jpg"
},
{
"name": "Maníes",
"plu": "4931",
"image": "https://server-ifps.accurateig.com/assets/commodities/4931-peanuts_1625757234.JPG"
},
{
"name": "Peras",
"plu": "3317",
"image": "https://server-ifps.accurateig.com/assets/commodities/3317-angelys-pear_1460402454.jpg"
},
{
"name": "Arvejas",
"plu": "4673",
"image": "https://server-ifps.accurateig.com/assets/commodities/4673-peas-black-eyed-01_1625684339.jpg"
},
{
"name": "Nueces pecán",
"plu": "4936",
"image": "https://server-ifps.accurateig.com/assets/commodities/4936-pecans-01_1625757366.JPG"
},
{
"name": "Caqui",
"plu": "4428",
"image": "https://server-ifps.accurateig.com/assets/commodities/4428-persimmons-fuyu-01_1625667410.jpg"
},
{
"name": "Physalis",
"plu": "3039",
"image": "https://server-ifps.accurateig.com/assets/commodities/3039-cape-gooseberry_1630596655.jpg"
},
{
"name": "Piña",
"plu": "4430",
"image": "https://server-ifps.accurateig.com/assets/commodities/4430-pineapple-05_1625667649.jpg"
},
{
"name": "Pistacho",
"plu": "4939",
"image": "https://server-ifps.accurateig.com/assets/commodities/4939-pistachios_1625757519.JPG"
},
{
"name": "Pitahaya",
"plu": "3040",
"image": "https://server-ifps.accurateig.com/assets/commodities/3040-pitaya-dragon-fruit-01_1614282658.jpg"
},
{
"name": "Plumcot",
"plu": "3611",
"image": "https://server-ifps.accurateig.com/assets/commodities/interspecific-plum-black-picture_1629142350.JPG"
},
{
"name": "Ciruelas",
"plu": "4435",
"image": "https://server-ifps.accurateig.com/assets/commodities/4435-plums-greengage-01_1625667846.jpg"
},
{
"name": "Granada",
"plu": "3440",
"image": "https://server-ifps.accurateig.com/assets/commodities/3440-large-pomegranate_1486484749.JPG"
},
{
"name": "Papas",
"plu": "3414",
"image": "https://server-ifps.accurateig.com/assets/commodities/3414-baking-potato-white_1635179333.jpg"
},
{
"name": "Zapallo",
"plu": "4734",
"image": "https://server-ifps.accurateig.com/assets/commodities/4734-mini-pumpkin_1633964765.jpg"
},
{
"name": "Guía de zapallo",
"plu": "3480",
"image": "https://server-ifps.accurateig.com/assets/commodities/pumpkin-vine-3480_1625790222.jpg"
},
{
"name": "Quelites",
"plu": "3478",
"image": "https://server-ifps.accurateig.com/assets/commodities/quelite-3478_1625790359.jpg"
},
{
"name": "Membrillo",
"plu": "4447",
"image": "https://server-ifps.accurateig.com/assets/commodities/4447-quince-1_1625668926.jpg"
},
{
"name": "Radicchio",
"plu": "3168",
"image": "https://server-ifps.accurateig.com/assets/commodities/3168-radicchio-castelfranco-02_1614718366.jpg"
},
{
"name": "Rábanos",
"plu": "4739",
"image": "https://server-ifps.accurateig.com/assets/commodities/4739-radish-black-03_1625751544.jpg"
},
{
"name": "Ruibarbo",
"plu": "4745",
"image": "https://server-ifps.accurateig.com/assets/commodities/4745-rhubarb-01_1625751764.jpg"
},
{
"name": "Rutabagas",
"plu": "4747",
"image": "https://server-ifps.accurateig.com/assets/commodities/4747-rutabaga_1635168852.jpg"
},
{
"name": "Zapote",
"plu": "3137",
"image": "https://server-ifps.accurateig.com/assets/commodities/3137-sapote-white_1635264028.jpg"
},
{
"name": "Zapallo italiano / Zapallo",
"plu": "4750",
"image": "https://server-ifps.accurateig.com/assets/commodities/4750-squash-acorn-01_1625751871.jpg"
},
{
"name": "Caña de azúcar",
"plu": "4790",
"image": "https://server-ifps.accurateig.com/assets/commodities/4790-sugar-cane_1630598686.jpg"
},
{
"name": "Tupinambo",
"plu": "4791",
"image": "https://server-ifps.accurateig.com/assets/commodities/4791-sunchokes-03_1625753005.jpg"
},
{
"name": "Semillas de maravilla",
"plu": "4942",
"image": "https://server-ifps.accurateig.com/assets/commodities/4942-sunflower-seeds_1630599026.jpg"
},
{
"name": "Camote",
"plu": "4816",
"image": "https://server-ifps.accurateig.com/assets/commodities/4816-sweet-potatoes-02_1625754367.jpg"
},
{
"name": "Tamarindo",
"plu": "4448",
"image": "https://server-ifps.accurateig.com/assets/commodities/4448-tamarindo-01_1625669100.jpg"
},
{
"name": "Mandarinas",
"plu": "3524",
"image": "https://server-ifps.accurateig.com/assets/commodities/noble-juicycrunch-productisolated-900x900-rgb-copy_1627662136.png"
},
{
"name": "Taro",
"plu": "4795",
"image": "https://server-ifps.accurateig.com/assets/commodities/4795-taro-root-01_1625753179.jpg"
},
{
"name": "Nabo",
"plu": "4811",
"image": "https://server-ifps.accurateig.com/assets/commodities/4811-turnip-purple-top_1635177577.jpg"
},
{
"name": "Nueces",
"plu": "4943",
"image": "https://server-ifps.accurateig.com/assets/commodities/4943-walnuts_1625757652.JPG"
},
{
"name": "Castañas de agua",
"plu": "4814",
"image": "https://server-ifps.accurateig.com/assets/commodities/4814-waterchestnuts-01_1625753939.jpg"
},
{
"name": "Xpelón",
"plu": "3481",
"image": "https://server-ifps.accurateig.com/assets/commodities/expelon-3481_1625790150.jpg"
},
{
"name": "Yuca",
"plu": "4819",
"image": "https://server-ifps.accurateig.com/assets/commodities/4819-yucca-root-03_1625754507.jpg"
}
]

BIN
image_cache/3039.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 717 KiB

BIN
image_cache/3040.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 MiB

BIN
image_cache/3044.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 MiB

BIN
image_cache/3087.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 MiB

BIN
image_cache/3091.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 207 KiB

BIN
image_cache/3099.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 MiB

BIN
image_cache/3105.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 MiB

BIN
image_cache/3106.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.5 MiB

BIN
image_cache/3113.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 819 KiB

BIN
image_cache/3137.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 879 KiB

BIN
image_cache/3168.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 216 KiB

BIN
image_cache/3276.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 MiB

BIN
image_cache/3279.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 213 KiB

BIN
image_cache/3303.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 MiB

BIN
image_cache/3311.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 MiB

BIN
image_cache/3317.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 118 KiB

BIN
image_cache/3321.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 MiB

BIN
image_cache/3414.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 MiB

BIN
image_cache/3437.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

BIN
image_cache/3440.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 578 KiB

BIN
image_cache/3475.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

BIN
image_cache/3478.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 MiB

BIN
image_cache/3480.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 83 KiB

BIN
image_cache/3481.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 188 KiB

BIN
image_cache/3491.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 76 KiB

BIN
image_cache/3509.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 MiB

BIN
image_cache/3524.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 MiB

BIN
image_cache/3549.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 MiB

BIN
image_cache/3611.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 651 KiB

BIN
image_cache/3626.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

BIN
image_cache/4068.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 444 KiB

BIN
image_cache/4069.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 MiB

BIN
image_cache/4099.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 72 KiB

BIN
image_cache/4235.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 814 KiB

BIN
image_cache/4239.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 MiB

BIN
image_cache/4261.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 MiB

BIN
image_cache/4266.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 786 KiB

BIN
image_cache/4279.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 730 KiB

BIN
image_cache/4303.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 MiB

BIN
image_cache/4305.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 636 KiB

BIN
image_cache/4308.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 MiB

BIN
image_cache/4328.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 MiB

BIN
image_cache/4381.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 438 KiB

BIN
image_cache/4428.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 MiB

BIN
image_cache/4430.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 MiB

BIN
image_cache/4435.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 MiB

BIN
image_cache/4447.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.2 MiB

BIN
image_cache/4448.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 MiB

BIN
image_cache/4519.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 213 KiB

BIN
image_cache/4521.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 MiB

BIN
image_cache/4527.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 280 KiB

BIN
image_cache/4537.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 464 KiB

BIN
image_cache/4560.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 MiB

BIN
image_cache/4599.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 148 KiB

BIN
image_cache/4606.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 MiB

BIN
image_cache/4608.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 MiB

BIN
image_cache/4612.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 MiB

BIN
image_cache/4614.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 MiB

BIN
image_cache/4625.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 906 KiB

BIN
image_cache/4626.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 MiB

BIN
image_cache/4629.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 MiB

BIN
image_cache/4644.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 MiB

BIN
image_cache/4647.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.9 MiB

BIN
image_cache/4672.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 MiB

BIN
image_cache/4673.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 MiB

BIN
image_cache/4734.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 994 KiB

BIN
image_cache/4739.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 827 KiB

BIN
image_cache/4745.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 403 KiB

BIN
image_cache/4747.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 834 KiB

BIN
image_cache/4750.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 MiB

BIN
image_cache/4790.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 MiB

BIN
image_cache/4791.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 658 KiB

BIN
image_cache/4795.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 156 KiB

BIN
image_cache/4811.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 MiB

BIN
image_cache/4814.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 MiB

BIN
image_cache/4816.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 MiB

BIN
image_cache/4819.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 820 KiB

BIN
image_cache/4862.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 444 KiB

BIN
image_cache/4892.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 MiB

BIN
image_cache/4924.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 365 KiB

BIN
image_cache/4926.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.5 MiB

BIN
image_cache/4927.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 MiB

BIN
image_cache/4931.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.6 MiB

BIN
image_cache/4936.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 MiB

BIN
image_cache/4939.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.6 MiB

BIN
image_cache/4942.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 MiB

BIN
image_cache/4943.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 73 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 78 KiB

Some files were not shown because too many files have changed in this diff Show More