mirror of
https://github.com/rickbarrette/redmine_qbo_lineitems.git
synced 2026-04-02 07:01:59 -04:00
Compare commits
7 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 1febdc3e04 | |||
| d1f8f027c0 | |||
| c5dd50a369 | |||
| 92ecf171b9 | |||
| 70dc594cb2 | |||
| 9736f1ac96 | |||
| 3463698f8d |
@@ -21,7 +21,7 @@ This plugin allows **billable line items** to be attached to a Redmine issue. Wh
|
||||
|
||||
| Plugin Version | Redmine Version | Ruby Version |
|
||||
| --- | --- | --- |
|
||||
| 2026.3.3+ | 6.1.x | 3.2+ |
|
||||
| 2026.3.5+ | 6.1.x | 3.2+ |
|
||||
|
||||
---
|
||||
|
||||
|
||||
@@ -15,6 +15,12 @@ class Item < ApplicationRecord
|
||||
validates :unit_price, numericality: { greater_than_or_equal_to: 0 }
|
||||
self.primary_key = :id
|
||||
|
||||
# Returns the last sync time formatted for display. If no sync has occurred, returns a default message.
|
||||
def self.last_sync
|
||||
return I18n.t(:label_qbo_never_synced) unless maximum(:updated_at)
|
||||
format_time(maximum(:updated_at))
|
||||
end
|
||||
|
||||
# Sync all items, typically triggered by a scheduled task or manual sync request
|
||||
def self.sync
|
||||
ItemSyncJob.perform_later(full_sync: true)
|
||||
|
||||
@@ -10,8 +10,6 @@
|
||||
|
||||
class ItemSyncService < SyncServiceBase
|
||||
|
||||
PAGE_SIZE = 10
|
||||
|
||||
private
|
||||
|
||||
# Specify the local model this service syncs
|
||||
@@ -19,6 +17,11 @@ class ItemSyncService < SyncServiceBase
|
||||
Item
|
||||
end
|
||||
|
||||
# Specify a page size of 20, as the API only returns 20 items at a time.
|
||||
def self.page_size
|
||||
20
|
||||
end
|
||||
|
||||
# Map relevant attributes from the QBO Employee to the local Employee model
|
||||
def process_attributes(local, remote)
|
||||
log "Processing Item ##{remote.id}"
|
||||
|
||||
@@ -23,9 +23,10 @@
|
||||
</td>
|
||||
|
||||
<td data-label="<%= t :label_price %>">
|
||||
<%= f.number_field :unit_price,
|
||||
step: 0.01,
|
||||
<%= f.text_field :unit_price,
|
||||
class: "price-field",
|
||||
inputmode: "decimal",
|
||||
autocomplete: "off",
|
||||
no_label: true,
|
||||
disabled: readonly %>
|
||||
</td>
|
||||
|
||||
5
app/views/line_items/_settings.html.erb
Normal file
5
app/views/line_items/_settings.html.erb
Normal file
@@ -0,0 +1,5 @@
|
||||
<div>
|
||||
<b><%=t(:label_item_count)%></b> <%= Item.count %> @ <%= Item.last_sync %>
|
||||
<br/>
|
||||
<%=t(:label_last_sync)%> </b> <%= Qbo.last_sync if Qbo.exists? %>
|
||||
</div>
|
||||
33
assets/javascripts/blur.js
Normal file
33
assets/javascripts/blur.js
Normal file
@@ -0,0 +1,33 @@
|
||||
function evaluateMathExpression(expr) {
|
||||
if (!expr) return null;
|
||||
|
||||
// allow only digits, decimal, operators, parentheses, spaces
|
||||
if (!/^[0-9+\-*/().\s]+$/.test(expr)) {
|
||||
return null;
|
||||
}
|
||||
|
||||
try {
|
||||
return Function('"use strict"; return (' + expr + ')')();
|
||||
} catch {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
document.addEventListener("blur", function(e) {
|
||||
|
||||
if (!e.target.classList.contains("price-field")) return;
|
||||
|
||||
const field = e.target;
|
||||
const value = field.value.trim();
|
||||
|
||||
const result = evaluateMathExpression(value);
|
||||
|
||||
if (result !== null && !isNaN(result)) {
|
||||
field.value = Number(result).toFixed(2);
|
||||
}
|
||||
|
||||
if (typeof updateLineItemTotals === "function") {
|
||||
updateLineItemTotals();
|
||||
}
|
||||
|
||||
}, true);
|
||||
@@ -13,6 +13,7 @@
|
||||
en:
|
||||
label_description: "Description"
|
||||
label_item: "Item"
|
||||
label_item_count: "Item Count:"
|
||||
label_line_items: "Line Items"
|
||||
label_price: "Unit Price"
|
||||
label_qty: "Quantity"
|
||||
|
||||
8
init.rb
8
init.rb
@@ -14,21 +14,21 @@ Redmine::Plugin.register :redmine_qbo_lineitems do
|
||||
name 'Redmine QBO Line Items plugin'
|
||||
author 'Rick Barrette'
|
||||
description 'A plugin for Redmine to extend the capabilitys of the Redmine QuickBooks Online plugin to attach billable line items to an isuue'
|
||||
version '2026.3.3'
|
||||
url 'https://github.com/rickbarrette/redmine_qbo'
|
||||
version '2026.3.5'
|
||||
url 'https://github.com/rickbarrette/redmine_qbo_lineitems'
|
||||
author_url 'https://barrettefabrication.com'
|
||||
requires_redmine version_or_higher: '6.1.0'
|
||||
settings partial: 'line_items/settings'
|
||||
|
||||
# Ensure redmine_qbo is installed
|
||||
begin
|
||||
requires_redmine_plugin :redmine_qbo, version_or_higher: '2026.3.3'
|
||||
requires_redmine_plugin :redmine_qbo, version_or_higher: '2026.3.5'
|
||||
rescue Redmine::PluginNotFound
|
||||
raise 'Please install the redmine_qbo plugin (https://github.com/rickbarrette/redmine_qbo)'
|
||||
end
|
||||
|
||||
# Add safe attributes for core models
|
||||
Issue.safe_attributes :line_items_attributes
|
||||
|
||||
end
|
||||
|
||||
# Dynamically load all Hooks & Patches recursively
|
||||
|
||||
@@ -19,6 +19,7 @@ module RedmineQboLineItems
|
||||
javascript_include_tag( 'nested_form_controller', plugin: :redmine_qbo_lineitems),
|
||||
javascript_include_tag("line_items", plugin: :redmine_qbo_lineitems),
|
||||
javascript_include_tag("autocomplete", plugin: :redmine_qbo_lineitems),
|
||||
javascript_include_tag("blur", plugin: :redmine_qbo_lineitems),
|
||||
stylesheet_link_tag("line_items", plugin: :redmine_qbo_lineitems)
|
||||
])
|
||||
end
|
||||
|
||||
Reference in New Issue
Block a user