3 Commits

Author SHA1 Message Date
b939d834e9 2026.4.0 2026-04-03 11:59:28 -04:00
9b9a5c3505 Preventing Implicit Deletions 2026-04-03 11:58:56 -04:00
da49b996da removed redundant private 2026-03-22 18:31:24 -04:00
3 changed files with 33 additions and 8 deletions

View File

@@ -100,8 +100,6 @@ class ItemsController < ApplicationController
params.require(:item).permit(:name, :description, :sku, :unit_price, :active, :account_id, :type, :taxable)
end
private
def log(msg)
Rails.logger.info "[ItemsController] #{msg}"
end

View File

@@ -14,7 +14,7 @@ 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.12'
version '2026.4.0'
url 'https://github.com/rickbarrette/redmine_qbo_lineitems'
author_url 'https://barrettefabrication.com'
requires_redmine version_or_higher: '6.1.0'

View File

@@ -10,14 +10,41 @@
module LineItems
module Patches
module IssuePatch
extend ActiveSupport::Concern
module IssuePatch extend ActiveSupport::Concern
prepended do
has_many :line_items, dependent: :destroy
accepts_nested_attributes_for :line_items,
allow_destroy: true,
reject_if: proc { |attrs| attrs['description'].blank? }
accepts_nested_attributes_for :line_items, allow_destroy: true, reject_if: proc { |attrs| attrs['description'].blank? }
def line_items_attributes=(attrs)
attrs = attrs.stringify_keys
# IDs submitted in the form
submitted_ids = attrs.values.map { |a| a['id'] }.compact.map(&:to_s)
# Existing IDs in DB
existing_ids = line_items.pluck(:id).map(&:to_s)
# Find missing ones (these would be implicitly deleted by Rails)
missing_ids = existing_ids - submitted_ids
# Re-add missing records so Rails doesn't delete them
missing_ids.each do |id|
attrs["preserve_#{id}"] = { 'id' => id }
end
# Only allow explicit deletes or valid updates/creates
filtered = attrs.select do |_, item_attrs|
item_attrs['_destroy'] == '1' ||
item_attrs['id'].present? ||
item_attrs['description'].present?
end
super(filtered)
rescue => e
logger.error "Error processing line items attributes: #{e.message}"
end
end
end
end