Application Upgrade Jobs

Monitor and manage application upgrade tasks across your terminal fleet

Search & Filter

<.input name="batch_code" value={@filters["batch_code"] || ""} placeholder="Enter batch code" class="w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent" />
<.input name="model" value={@filters["model"] || ""} placeholder="Enter model" class="w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent" />
<.input name="version_name" value={@filters["version_name"] || ""} placeholder="Enter version name" class="w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent" />

Upgrade Jobs List

Track and manage application upgrade tasks

<%= for job <- @upgrades do %> <% end %> <%= if Enum.empty?(@upgrades) do %> <% end %>
Batch Code
Package Info
Upgrade Details
Created By
Status
Create Time
Actions
<%= job.batch_code %>
Job ID: <%= job.id %>
<%= job.package && job.package.version_name || "N/A" %>
<%= job.package && job.package.model || "N/A" %> v<%= job.package && job.package.app_version || "N/A" %>
<%= job.update_count %> devices
<%= if job.force_upgrade do %> Force Upgrade <% else %> Normal <% end %>
<%= String.first(to_string(job.created_by)) %>
<%= job.created_by %>
<%= case job.status do %> <% "completed" -> %>
Completed
<% "in_progress" -> %>
In Progress
<% "failed" -> %>
Failed
<% "pending" -> %>
Pending
<% _ -> %>
<%= String.capitalize(job.status || "unknown") %>
<% end %>
<%= Calendar.strftime(job.inserted_at, "%Y-%m-%d") %> <%= Calendar.strftime(job.inserted_at, "%H:%M:%S") %>

No upgrade jobs found

Get started by creating your first upgrade job.

<%= if @show_form do %> <.slide_over origin="right" title="Add Upgrade Task">

Create Upgrade Task

Configure a new application upgrade job for your terminals

<.form for={@form} phx-submit="save" phx-change="validate" class="space-y-6">

Basic Information

<.field field={@form[:batch_code]} label="Batch Code" class="w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent" />

Unique identifier for this upgrade batch

Choose the target version for upgrade

Upgrade Configuration

<.field field={@form[:force_upgrade]} label="" type="checkbox" class="w-4 h-4 text-blue-600 bg-gray-100 border-gray-300 rounded focus:ring-blue-500 focus:ring-2" />

Override version checks and force installation

<.field field={@form[:is_iterate]} label="" type="checkbox" class="w-4 h-4 text-blue-600 bg-gray-100 border-gray-300 rounded focus:ring-blue-500 focus:ring-2" />

Enable iterative upgrade process

<.field field={@form[:download_link]} label="Download Link" class="w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent" />

Direct download URL for the package

<.field field={@form[:update_count]} label="Update Count" type="number" class="w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent" />

Number of devices to upgrade

Schedule Configuration

<.field field={@form[:upgrade_start_at]} label="Upgrade Start Time" type="datetime-local" class="w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent" />

When to begin the upgrade process

<.field field={@form[:upgrade_end_at]} label="Upgrade End Time" type="datetime-local" class="w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent" />

When to complete the upgrade process

Current Version Requirements

<.field field={@form[:old_app_version]} label="Current App Version" class="w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent" />

Required current app version

<.field field={@form[:old_data_version]} label="Current Data Version" class="w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent" />

Required current data version

<.field field={@form[:old_sys_version]} label="Current System Version" class="w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent" />

Required current system version

<.field field={@form[:old_sp_version]} label="Current SP Version" class="w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent" />

Required current special version

Target Devices

<.field field={@form[:target_devices]} label="Target Devices" class="w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent" />

Format Options:

• JSON array: ["device1","device2","device3"]

• Comma separated: device1,device2,device3

<.button type="button" label="Cancel" color="white" phx-click="hide_form" class="inline-flex items-center px-4 py-2 bg-white hover:bg-gray-50 text-gray-700 font-medium rounded-lg border border-gray-300 shadow-sm transition-colors duration-200" /> <.button type="submit" label="Create Upgrade Task" color="primary" class="inline-flex items-center px-6 py-2 bg-blue-600 hover:bg-blue-700 text-white font-medium rounded-lg shadow-sm transition-colors duration-200" />
<% end %> <%= if @show_parameter_form do %> <.slide_over origin="right" title="Push Terminal Parameters & Templates">

Push Terminal Parameters & Templates

Apply parameter templates or send custom configuration parameters

Parameter Mode

<%= if @parameter_mode != "custom" do %>

Parameter Templates

<%= if @selected_template do %>

Template Preview: <%= @selected_template.name %>

<%= @selected_template.description %>

<%= if @template_preview && length(@template_preview) > 0 do %>
Parameters:
<%= for param <- Enum.take(@template_preview, 8) do %>
<%= param.parameter_key %>: <%= param.parameter_value %>
<% end %> <%= if length(@template_preview) > 8 do %>
... and <%= length(@template_preview) - 8 %> more parameters
<% end %>
<% end %>
<% end %>
<% end %> <%= if @parameter_mode == "custom" do %>

Custom Parameters

<% end %>

Target Devices

Enter device serial numbers separated by commas

<%= if @parameter_mode != "custom" && @selected_template do %> <% end %> <%= if @device_compatibility && Map.get(@device_compatibility, :total, 0) > 0 do %>

Compatibility Check Results

✅ Compatible: <%= @device_compatibility.compatible %> ❌ Incompatible: <%= @device_compatibility.incompatible %>
<%= if @device_compatibility.incompatible > 0 do %>

Incompatible devices:

<%= for result <- @device_compatibility.results do %> <%= if not result.compatible do %>

• <%= result.device_serial %>: <%= result.reason %>

<% end %> <% end %>
<% end %>
<% end %>

Execution Schedule

<%= if @selected_template do %> <% end %>
<.button type="button" label="Cancel" color="white" phx-click="hide_parameter_form" class="inline-flex items-center px-4 py-2 bg-white hover:bg-gray-50 text-gray-700 font-medium rounded-lg border border-gray-300 shadow-sm transition-colors duration-200" /> <%= if @parameter_mode == "custom" do %> <.button type="submit" label="Push Custom Parameters" color="primary" class="inline-flex items-center px-6 py-2 bg-indigo-600 hover:bg-indigo-700 text-white font-medium rounded-lg shadow-sm transition-colors duration-200" /> <% else %> <%= if @selected_template do %> <.button type="submit" label="Apply Template" color="primary" class="inline-flex items-center px-6 py-2 bg-purple-600 hover:bg-purple-700 text-white font-medium rounded-lg shadow-sm transition-colors duration-200" /> <% else %> <.button type="button" label="Select Template First" color="gray" disabled={true} class="inline-flex items-center px-6 py-2 bg-gray-400 text-white font-medium rounded-lg shadow-sm cursor-not-allowed" /> <% end %> <% end %>
<%= if @last_operation_result do %>
<%= if @last_operation_result.success do %>
<%= @last_operation_result.message %>
<% else %>
Error: <%= @last_operation_result.error %>
<% end %>
<% end %>
<% end %> <%= if @show_custom_parameter_form do %> <.slide_over origin="right" title="Push Custom Parameters">

Push Custom Parameters

Send specific key-value parameters to devices

Target Devices

Enter device serial numbers separated by commas

Connection Parameters

System Parameters

<.button type="button" label="Cancel" color="white" phx-click="hide_custom_parameter_form" class="inline-flex items-center px-4 py-2 bg-white hover:bg-gray-50 text-gray-700 font-medium rounded-lg border border-gray-300 shadow-sm transition-colors duration-200" /> <.button type="submit" label="Push Parameters" color="primary" class="inline-flex items-center px-6 py-2 bg-indigo-600 hover:bg-indigo-700 text-white font-medium rounded-lg shadow-sm transition-colors duration-200" />
<% end %> <%= if @show_download_form do %> <.slide_over origin="right" title="Send File Download Command">

Send File Download Command

Instruct terminals to download files from specified URLs

Target Devices

Enter device serial numbers separated by commas

File Information

Complete URL where the file can be downloaded

Name to save the file as

Download Configuration

Optional: Expected file size in bytes

Number of retry attempts on failure

Auto-generated if empty

Mark this file as merchant-specific configuration

<.button type="button" label="Cancel" color="white" phx-click="hide_download_form" class="inline-flex items-center px-4 py-2 bg-white hover:bg-gray-50 text-gray-700 font-medium rounded-lg border border-gray-300 shadow-sm transition-colors duration-200" /> <.button type="submit" label="Send Download Command" color="warning" class="inline-flex items-center px-6 py-2 bg-yellow-600 hover:bg-yellow-700 text-white font-medium rounded-lg shadow-sm transition-colors duration-200" />
<% end %> <%= if @show_job_management do %> <.slide_over origin="right" title="Parameter Push Job Management">

Parameter Push Job Management

Monitor and manage parameter push job executions

Total Jobs
<%= @job_stats.total || 0 %>
Completed
<%= @job_stats.completed || 0 %>
Running
<%= @job_stats.running || 0 %>
Failed
<%= @job_stats.failed || 0 %>

Filter Jobs

<%= for job <- @parameter_jobs || [] do %> <% end %>
Job ID Template Devices Status Progress Created Actions
#<%= job.id %> <%= Map.get(job, :template_name, "Custom") %> <%= Map.get(job, :device_count, 0) %> devices <%= case job.status do %> <% "completed" -> %> Completed <% "running" -> %> Running <% "failed" -> %> Failed <% "pending" -> %> Pending <% _ -> %> Unknown <% end %>
<%= Map.get(job, :progress, 0) %>%
<%= Calendar.strftime(job.inserted_at, "%m/%d %H:%M") %> <%= if job.status == "running" do %> <% end %> <%= if job.status == "failed" do %> <% end %>
<% end %> <%= if @show_bulk_operations do %> <.slide_over origin="right" title="Bulk Parameter Operations">

Bulk Parameter Operations

Apply parameter templates to multiple devices

Select Template

Target Devices

Execution Options

<% end %> <%= if @show_device_groups do %> <.slide_over origin="right" title="Device Groups Management">

Device Groups Management

Organize devices into groups for efficient management

Create New Group

<%= for group <- @device_groups || [] do %> <% end %>
Group Name Description Device Count Created Actions
<%= group.name %> <%= Map.get(group, :description) || "-" %> <%= Map.get(group, :device_count, 0) %> devices <%= Calendar.strftime(group.inserted_at, "%m/%d %H:%M") %>
<% end %>