104 lines
2.8 KiB
Elixir
104 lines
2.8 KiB
Elixir
defmodule ComponentsElixir.QRCode do
|
|
@moduledoc """
|
|
QR Code generation and parsing for storage locations.
|
|
|
|
Provides functionality to generate QR codes for storage locations
|
|
and parse them back to retrieve location information.
|
|
"""
|
|
|
|
@doc """
|
|
Generates a QR code data string for a storage location.
|
|
|
|
Format: SL:{level}:{qr_code}:{parent_qr_or_ROOT}
|
|
|
|
## Examples
|
|
|
|
iex> location = %StorageLocation{level: 1, qr_code: "ABC123", parent: nil}
|
|
iex> ComponentsElixir.QRCode.generate_qr_data(location)
|
|
"SL:1:ABC123:ROOT"
|
|
|
|
iex> parent = %StorageLocation{qr_code: "SHELF1"}
|
|
iex> drawer = %StorageLocation{level: 2, qr_code: "DRAW01", parent: parent}
|
|
iex> ComponentsElixir.QRCode.generate_qr_data(drawer)
|
|
"SL:2:DRAW01:SHELF1"
|
|
"""
|
|
def generate_qr_data(storage_location) do
|
|
parent_code =
|
|
case storage_location.parent do
|
|
nil -> "ROOT"
|
|
parent -> parent.qr_code
|
|
end
|
|
|
|
"SL:#{storage_location.level}:#{storage_location.qr_code}:#{parent_code}"
|
|
end
|
|
|
|
@doc """
|
|
Parses a QR code string and extracts components.
|
|
|
|
## Examples
|
|
|
|
iex> ComponentsElixir.QRCode.parse_qr_data("SL:1:ABC123:ROOT")
|
|
{:ok, %{level: 1, code: "ABC123", parent: "ROOT"}}
|
|
|
|
iex> ComponentsElixir.QRCode.parse_qr_data("invalid")
|
|
{:error, :invalid_format}
|
|
"""
|
|
def parse_qr_data(qr_string) do
|
|
case String.split(qr_string, ":") do
|
|
["SL", level_str, code, parent] ->
|
|
case Integer.parse(level_str) do
|
|
{level, ""} ->
|
|
{:ok, %{level: level, code: code, parent: parent}}
|
|
_ ->
|
|
{:error, :invalid_level}
|
|
end
|
|
_ ->
|
|
{:error, :invalid_format}
|
|
end
|
|
end
|
|
|
|
@doc """
|
|
Validates if a string looks like a storage location QR code.
|
|
|
|
## Examples
|
|
|
|
iex> ComponentsElixir.QRCode.valid_storage_qr?("SL:1:ABC123:ROOT")
|
|
true
|
|
|
|
iex> ComponentsElixir.QRCode.valid_storage_qr?("COMP:12345")
|
|
false
|
|
"""
|
|
def valid_storage_qr?(qr_string) do
|
|
case parse_qr_data(qr_string) do
|
|
{:ok, _} -> true
|
|
_ -> false
|
|
end
|
|
end
|
|
|
|
@doc """
|
|
Generates a printable label data structure for a storage location.
|
|
|
|
This could be used to generate PDF labels or send to a label printer.
|
|
"""
|
|
def generate_label_data(storage_location) do
|
|
qr_data = generate_qr_data(storage_location)
|
|
|
|
%{
|
|
qr_code: qr_data,
|
|
name: storage_location.name,
|
|
path: storage_location.path,
|
|
level: storage_location.level,
|
|
description: storage_location.description
|
|
}
|
|
end
|
|
|
|
@doc """
|
|
Generates multiple QR codes for disambiguation testing.
|
|
|
|
This is useful for testing multi-QR detection scenarios.
|
|
"""
|
|
def generate_test_codes(storage_locations) when is_list(storage_locations) do
|
|
Enum.map(storage_locations, &generate_qr_data/1)
|
|
end
|
|
end
|