From 6a37b332e0a47af23957aad03e1dbf1a9d524f13 Mon Sep 17 00:00:00 2001
From: mch987 <66570513+mch987@users.noreply.github.com>
Date: Sun, 26 Apr 2026 19:26:59 -0500
Subject: [PATCH] Add UPC support to product import, search, and duplicate scan
flow
---
backend/internal/data/repo/repo_entities.go | 16 +++++++++++-
frontend/components/Item/BarcodeModal.vue | 29 ++++++++++++++++++++-
frontend/components/Item/CreateModal.vue | 4 +++
frontend/lib/api/types/data-contracts.ts | 4 +++
frontend/locales/en.json | 1 +
frontend/pages/item/[id]/index/edit.vue | 6 +++++
6 files changed, 58 insertions(+), 2 deletions(-)
diff --git a/backend/internal/data/repo/repo_entities.go b/backend/internal/data/repo/repo_entities.go
index b9f88973c..404bf448e 100644
--- a/backend/internal/data/repo/repo_entities.go
+++ b/backend/internal/data/repo/repo_entities.go
@@ -93,6 +93,7 @@ type (
Name string `json:"name" validate:"required,min=1,max=255"`
Quantity float64 `json:"quantity"`
Description string `json:"description" validate:"max=1000"`
+ UPC string `json:"upc" validate:"max=64"`
AssetID AssetID `json:"-"`
EntityTypeID uuid.UUID `json:"entityTypeId"`
@@ -116,6 +117,7 @@ type (
TagIDs []uuid.UUID `json:"tagIds"`
// Identifications
+ UPC string `json:"upc" validate:"max=64"`
SerialNumber string `json:"serialNumber"`
ModelNumber string `json:"modelNumber"`
Manufacturer string `json:"manufacturer"`
@@ -156,6 +158,7 @@ type (
AssetID AssetID `json:"assetId,string"`
Name string `json:"name"`
Description string `json:"description"`
+ UPC string `json:"upc"`
Quantity float64 `json:"quantity"`
Insured bool `json:"insured"`
Archived bool `json:"archived"`
@@ -187,6 +190,7 @@ type (
SyncChildEntityLocations bool `json:"syncChildEntityLocations"`
SerialNumber string `json:"serialNumber"`
+ UPC string `json:"upc"`
ModelNumber string `json:"modelNumber"`
Manufacturer string `json:"manufacturer"`
@@ -258,6 +262,7 @@ func mapEntitySummary(e *ent.Entity) EntitySummary {
AssetID: AssetID(e.AssetID),
Name: e.Name,
Description: e.Description,
+ UPC: e.ImportRef,
ImportRef: e.ImportRef,
Quantity: e.Quantity,
CreatedAt: e.CreatedAt,
@@ -336,6 +341,7 @@ func mapEntityOut(e *ent.Entity) EntityOut {
SyncChildEntityLocations: e.SyncChildEntityLocations,
// Identification
+ UPC: e.ImportRef,
SerialNumber: e.SerialNumber,
ModelNumber: e.ModelNumber,
Manufacturer: e.Manufacturer,
@@ -587,6 +593,7 @@ func (r *EntityRepository) QueryByGroup(ctx context.Context, gid uuid.UUID, q En
entity.Or(
entity.NameContainsFold(q.Search),
entity.DescriptionContainsFold(q.Search),
+ entity.ImportRefContainsFold(q.Search),
entity.SerialNumberContainsFold(q.Search),
entity.ModelNumberContainsFold(q.Search),
entity.ManufacturerContainsFold(q.Search),
@@ -993,8 +1000,13 @@ func (r *EntityRepository) Create(ctx context.Context, gid uuid.UUID, data Entit
return EntityOut{}, err
}
+ importRef := data.ImportRef
+ if data.UPC != "" {
+ importRef = data.UPC
+ }
+
q := r.db.Entity.Create().
- SetImportRef(data.ImportRef).
+ SetImportRef(importRef).
SetName(data.Name).
SetQuantity(data.Quantity).
SetDescription(data.Description).
@@ -1425,6 +1437,7 @@ func (r *EntityRepository) UpdateByGroup(ctx context.Context, gid uuid.UUID, dat
q := r.db.Entity.Update().Where(entity.ID(data.ID), entity.HasGroupWith(group.ID(gid))).
SetName(data.Name).
SetDescription(data.Description).
+ SetImportRef(data.UPC).
SetSerialNumber(data.SerialNumber).
SetModelNumber(data.ModelNumber).
SetManufacturer(data.Manufacturer).
@@ -2113,6 +2126,7 @@ func (r *EntityRepository) Duplicate(ctx context.Context, gid, id uuid.UUID, opt
SetQuantity(originalEntity.Quantity).
SetGroupID(gid).
SetAssetID(int64(nextAssetID)).
+ SetImportRef(originalEntity.ImportRef).
SetSerialNumber(originalEntity.SerialNumber).
SetModelNumber(originalEntity.ModelNumber).
SetManufacturer(originalEntity.Manufacturer).
diff --git a/frontend/components/Item/BarcodeModal.vue b/frontend/components/Item/BarcodeModal.vue
index 86bc3cfeb..151c7e289 100644
--- a/frontend/components/Item/BarcodeModal.vue
+++ b/frontend/components/Item/BarcodeModal.vue
@@ -5,6 +5,21 @@