diff --git a/CHANGELOG.md b/CHANGELOG.md index e396a1be3..82dc50bdc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,7 +12,10 @@ - Updated bootsnap to 1.16 - Updated pg to 1.4 - Updated nodejs to 18.15 +- Updated oj to 3.14 +- Updated multi_json to 1.15 - Fix a bug: broken display after a plan category was deleted +- [TODO DEPLOY] `rails fablab:restore_order_number` THEN `rails fablab:fix_references` ## v5.9.1 2023 March 22 diff --git a/Gemfile b/Gemfile index fa6371d02..87b0c492c 100644 --- a/Gemfile +++ b/Gemfile @@ -43,6 +43,7 @@ group :development do # Preview mail in the browser gem 'listen', '~> 3.0.5' gem 'overcommit' + gem 'pry' gem 'rb-readline' # Spring speeds up development by keeping your application running in the background. Read more: https://github.com/rails/spring gem 'railroady' @@ -56,7 +57,6 @@ group :test do gem 'database_cleaner' gem 'faker' gem 'minitest-reporters' - gem 'pdf-reader' gem 'rubyXL' gem 'vcr', '~> 6.1.0' gem 'webmock' @@ -101,6 +101,7 @@ gem 'stripe', '5.29.0' gem 'recurrence' # PDF +gem 'pdf-reader' gem 'prawn' gem 'prawn-table' diff --git a/Gemfile.lock b/Gemfile.lock index 8b61b06b2..b9b663b55 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,7 +1,7 @@ GEM remote: https://rubygems.org/ specs: - Ascii85 (1.0.3) + Ascii85 (1.1.0) aasm (5.0.8) concurrent-ruby (~> 1.0) actioncable (6.1.7.2) @@ -113,6 +113,7 @@ GEM childprocess (4.1.0) chroma (0.2.0) cldr-plurals-runtime-rb (1.0.1) + coderay (1.1.3) coercible (1.0.0) descendants_tracker (~> 0.0.1) concurrent-ruby (1.2.2) @@ -245,7 +246,7 @@ GEM minitest (>= 5.0) ruby-progressbar msgpack (1.6.1) - multi_json (1.14.1) + multi_json (1.15.0) multi_xml (0.6.0) multipart-post (2.1.1) net-imap (0.3.4) @@ -266,7 +267,7 @@ GEM multi_json (~> 1.3) multi_xml (~> 0.5) rack (>= 1.2, < 3) - oj (3.10.5) + oj (3.14.2) omniauth (1.9.2) hashie (>= 3.4.6) rack (>= 1.6.2, < 3) @@ -301,8 +302,8 @@ GEM parser (3.1.2.0) ast (~> 2.4.1) pdf-core (0.9.0) - pdf-reader (2.4.0) - Ascii85 (~> 1.0.0) + pdf-reader (2.11.0) + Ascii85 (~> 1.0) afm (~> 0.2.1) hashery (~> 2.0) ruby-rc4 @@ -316,6 +317,9 @@ GEM ttfunk (~> 1.7) prawn-table (0.2.2) prawn (>= 1.3.0, < 3.0.0) + pry (0.14.2) + coderay (~> 1.1) + method_source (~> 1.0) public_suffix (4.0.6) puma (6.1.0) nio4r (~> 2.0) @@ -568,6 +572,7 @@ DEPENDENCIES pg_search prawn prawn-table + pry puma (= 6.1.0) pundit railroady diff --git a/app/models/chained_element.rb b/app/models/chained_element.rb index ac043ff05..44e76d689 100644 --- a/app/models/chained_element.rb +++ b/app/models/chained_element.rb @@ -15,10 +15,19 @@ class ChainedElement < ApplicationRecord # @return [Boolean] def corrupted? - comparable(FootprintService.chained_data(element, previous&.footprint)) != comparable(content) || + comparable(FootprintService.chained_data(element, previous&.footprint, columns)) != comparable(content) || footprint != Integrity::Checksum.text(comparable(content).to_json) end + # return ths list of columns in the saved JSON. This is used to do the comparison with the + # saved item, as it may have changed between (some columns may have been added) + # @return [Array] + def columns + %w[id].concat(content.keys.delete_if do |column| + %w[id previous].concat(element.class.columns_out_of_footprint).include?(column) + end.sort) + end + private def set_content diff --git a/app/models/footprintable.rb b/app/models/footprintable.rb index 8d84a65d3..18f17d1e5 100644 --- a/app/models/footprintable.rb +++ b/app/models/footprintable.rb @@ -19,6 +19,7 @@ class Footprintable < ApplicationRecord def check_footprint return false unless persisted? + reload footprint_children.map(&:check_footprint).all? && !chained_element.corrupted? end diff --git a/app/models/history_value.rb b/app/models/history_value.rb index 68bfc1d7f..39bd30e9f 100644 --- a/app/models/history_value.rb +++ b/app/models/history_value.rb @@ -6,6 +6,7 @@ class HistoryValue < Footprintable belongs_to :invoicing_profile has_one :chained_element, as: :element, dependent: :restrict_with_exception + delegate :footprint, to: :chained_element delegate :user, to: :invoicing_profile after_create :chain_record diff --git a/app/models/invoice.rb b/app/models/invoice.rb index b1a0da9aa..74878638b 100644 --- a/app/models/invoice.rb +++ b/app/models/invoice.rb @@ -23,9 +23,10 @@ class Invoice < PaymentDocument has_many :accounting_lines, dependent: :destroy delegate :user, to: :invoicing_profile + delegate :footprint, to: :chained_element before_create :add_environment - after_create :update_reference, :chain_record + after_create :generate_order_number, :update_reference, :chain_record after_update :log_changes after_commit :generate_and_send_invoice, on: [:create], if: :persisted? @@ -50,12 +51,15 @@ class Invoice < PaymentDocument "#{prefix}-#{id}_#{created_at.strftime('%d%m%Y')}.pdf" end - def order_number - return order.reference unless order.nil? || order.reference.nil? + def generate_order_number + self.order_number = order.reference and return unless order.nil? || order.reference.nil? - return payment_schedule_item.payment_schedule.order_number if !payment_schedule_item.nil? && !payment_schedule_item.first? + if !payment_schedule_item.nil? && !payment_schedule_item.first? + self.order_number = payment_schedule_item.payment_schedule.order_number + return + end - PaymentDocumentService.generate_order_number(self) + super end # for debug & used by rake task "fablab:maintenance:regenerate_invoices" diff --git a/app/models/invoice_item.rb b/app/models/invoice_item.rb index b37751b74..1cb37f6e2 100644 --- a/app/models/invoice_item.rb +++ b/app/models/invoice_item.rb @@ -13,6 +13,8 @@ class InvoiceItem < Footprintable after_create :chain_record after_update :log_changes + delegate :footprint, to: :chained_element + def amount_after_coupon # deduct coupon discount coupon_service = CouponService.new diff --git a/app/models/payment_document.rb b/app/models/payment_document.rb index 56016867e..52206565e 100644 --- a/app/models/payment_document.rb +++ b/app/models/payment_document.rb @@ -8,6 +8,10 @@ class PaymentDocument < Footprintable self.reference = PaymentDocumentService.generate_reference(self, date: date) end + def generate_order_number + self.order_number = PaymentDocumentService.generate_order_number(self) + end + def update_reference generate_reference save diff --git a/app/models/payment_schedule.rb b/app/models/payment_schedule.rb index edfbd43e5..54083962f 100644 --- a/app/models/payment_schedule.rb +++ b/app/models/payment_schedule.rb @@ -17,10 +17,12 @@ class PaymentSchedule < PaymentDocument has_many :payment_schedule_objects, dependent: :destroy before_create :add_environment - after_create :update_reference, :chain_record + after_create :generate_order_number, :update_reference, :chain_record after_commit :generate_and_send_document, on: [:create], if: :persisted? after_commit :generate_initial_invoice, on: [:create], if: :persisted? + delegate :footprint, to: :chained_element + def file dir = "payment_schedules/#{invoicing_profile.id}" @@ -39,10 +41,6 @@ class PaymentSchedule < PaymentDocument "#{prefix}-#{id}_#{created_at.strftime('%d%m%Y')}.pdf" end - def order_number - ordered_items.first&.invoice&.order_number || PaymentDocumentService.generate_order_number(self) - end - ## # This is useful to check the first item because its amount may be different from the others ## diff --git a/app/models/payment_schedule_item.rb b/app/models/payment_schedule_item.rb index a00a2d120..a8f921212 100644 --- a/app/models/payment_schedule_item.rb +++ b/app/models/payment_schedule_item.rb @@ -9,6 +9,8 @@ class PaymentScheduleItem < Footprintable after_create :chain_record + delegate :footprint, to: :chained_element + def first? payment_schedule.ordered_items.first == self end diff --git a/app/models/payment_schedule_object.rb b/app/models/payment_schedule_object.rb index e6fd8108f..d2fe1127a 100644 --- a/app/models/payment_schedule_object.rb +++ b/app/models/payment_schedule_object.rb @@ -10,4 +10,6 @@ class PaymentScheduleObject < Footprintable has_one :chained_element, as: :element, dependent: :restrict_with_exception after_create :chain_record + + delegate :footprint, to: :chained_element end diff --git a/app/pdfs/pdf/invoice.rb b/app/pdfs/pdf/invoice.rb index 110d1520f..fd8c82120 100644 --- a/app/pdfs/pdf/invoice.rb +++ b/app/pdfs/pdf/invoice.rb @@ -44,8 +44,7 @@ class Pdf::Invoice < Prawn::Document end text I18n.t('invoices.code', **{ CODE: Setting.get('invoice_code-value') }), leading: 3 if Setting.get('invoice_code-active') if invoice.main_item&.object_type != WalletTransaction.name - order_number = invoice.main_item&.object_type == OrderItem.name ? invoice.main_item&.object&.order&.reference : invoice.order_number - text I18n.t('invoices.order_number', **{ NUMBER: order_number }), leading: 3 + text I18n.t('invoices.order_number', **{ NUMBER: invoice.order_number }), leading: 3 end if invoice.is_a?(Avoir) text I18n.t('invoices.refund_invoice_issued_on_DATE', **{ DATE: I18n.l(invoice.avoir_date.to_date) }) diff --git a/app/services/footprint_service.rb b/app/services/footprint_service.rb index 121130289..5c51ef3f3 100644 --- a/app/services/footprint_service.rb +++ b/app/services/footprint_service.rb @@ -8,9 +8,10 @@ class FootprintService class << self # @param item [Footprintable] # @param previous_footprint [String,NilClass] - # @return {HashString,Integer,Hash>} - def chained_data(item, previous_footprint = nil) - columns = footprint_columns(item.class) + # @param columns [Array] + # @return [HashString,Integer,Hash>] + def chained_data(item, previous_footprint = nil, columns = nil) + columns ||= footprint_columns(item.class) res = {} columns.each do |column| next if column.blank? || item[column].blank? @@ -35,7 +36,7 @@ class FootprintService # @param klass [Class] a class inheriting from Footprintable # @param item [Footprintable] an instance of the provided class def debug_footprint(klass, item) - current = chained_data(item, item.chained_element.previous&.footprint) + current = chained_data(item, item.chained_element.previous&.footprint, item.chained_element.columns) saved = item.chained_element&.content&.sort&.to_h&.transform_values { |val| val.is_a?(Hash) ? val.sort.to_h : val } if saved.nil? diff --git a/app/services/payment_document_service.rb b/app/services/payment_document_service.rb index 5209f0b3d..aad4e1c40 100644 --- a/app/services/payment_document_service.rb +++ b/app/services/payment_document_service.rb @@ -55,6 +55,7 @@ class PaymentDocumentService # @param document [PaymentDocument] # @param periodicity [String] 'day' | 'month' | 'year' | 'global' + # @return [HashFootprintable,Number>] def previous_order(document, periodicity) start = periodicity == 'global' ? nil : document.created_at.send("beginning_of_#{periodicity}") ending = document.created_at @@ -67,11 +68,30 @@ class PaymentDocumentService .where('created_at < :end_date', end_date: db_time(ending)) invoices = invoices.where('created_at >= :start_date', start_date: db_time(start)) unless start.nil? - [ - orders.order(created_at: :desc).limit(1).first, - schedules.order(created_at: :desc).limit(1).first, - invoices.order(created_at: :desc).limit(1).first + last_with_number = [ + orders.where.not(reference: nil).order(created_at: :desc).limit(1).first, + schedules.where.not(order_number: nil).order(created_at: :desc).limit(1).first, + invoices.where.not(order_number: nil).order(created_at: :desc).limit(1).first ].filter(&:present?).max_by { |item| item&.created_at } + { + last_order: last_with_number, + unnumbered: orders_without_number(orders, schedules, invoices, last_with_number) + } + end + + def orders_without_number(orders, schedules, invoices, last_item_with_number = nil) + items_after(orders.where(reference: nil), last_item_with_number).count + + items_after(schedules.where(order_number: nil), last_item_with_number).count + + items_after(invoices.where(order_number: nil), last_item_with_number).count + end + + # @param items [ActiveRecord::Relation] + # @param previous_item [Footprintable,NilClass] + # @return [ActiveRecord::Relation] + def items_after(items, previous_item = nil) + return items if previous_item.nil? + + items.where('created_at > :date', date: previous_item&.created_at) end # @param document [PaymentDocument] invoice to exclude @@ -145,12 +165,12 @@ class PaymentDocumentService # @return [Integer] def order_number(document, periodicity) previous = previous_order(document, periodicity) - if Invoices::NumberService.number_periodicity(previous, 'invoice_order-nb') == periodicity - number = Invoices::NumberService.number(previous, 'invoice_order-nb') + if Invoices::NumberService.number_periodicity(previous[:last_order], 'invoice_order-nb') == periodicity + number = Invoices::NumberService.number(previous[:last_order], 'invoice_order-nb') end number ||= 0 - number + 1 + number + previous[:unnumbered] + 1 end # Replace the document number elements in the provided pattern with counts from the database diff --git a/db/migrate/20230324095639_add_order_number.rb b/db/migrate/20230324095639_add_order_number.rb new file mode 100644 index 000000000..47eaa9ff9 --- /dev/null +++ b/db/migrate/20230324095639_add_order_number.rb @@ -0,0 +1,9 @@ +# frozen_string_literal: true + +# We now store the order number in DB, instead of generating it on every access +class AddOrderNumber < ActiveRecord::Migration[6.1] + def change + add_column :invoices, :order_number, :string + add_column :payment_schedules, :order_number, :string + end +end diff --git a/db/structure.sql b/db/structure.sql index 3d998a563..754457f44 100644 --- a/db/structure.sql +++ b/db/structure.sql @@ -1490,7 +1490,8 @@ CREATE TABLE public.invoices ( environment character varying, invoicing_profile_id integer, operator_profile_id integer, - statistic_profile_id integer + statistic_profile_id integer, + order_number character varying ); @@ -2217,7 +2218,8 @@ CREATE TABLE public.payment_schedules ( operator_profile_id bigint, created_at timestamp without time zone NOT NULL, updated_at timestamp without time zone NOT NULL, - start_at timestamp without time zone + start_at timestamp without time zone, + order_number character varying ); @@ -7383,14 +7385,6 @@ CREATE INDEX proof_of_identity_type_id_and_proof_of_identity_refusal_id ON publi CREATE UNIQUE INDEX unique_not_null_external_id ON public.invoicing_profiles USING btree (external_id) WHERE (external_id IS NOT NULL); --- --- Name: accounting_periods accounting_periods_del_protect; Type: RULE; Schema: public; Owner: - --- - -CREATE RULE accounting_periods_del_protect AS - ON DELETE TO public.accounting_periods DO INSTEAD NOTHING; - - -- -- Name: accounting_periods accounting_periods_upd_protect; Type: RULE; Schema: public; Owner: - -- @@ -7400,6 +7394,15 @@ CREATE RULE accounting_periods_upd_protect AS WHERE ((new.start_at <> old.start_at) OR (new.end_at <> old.end_at) OR (new.closed_at <> old.closed_at) OR (new.period_total <> old.period_total) OR (new.perpetual_total <> old.perpetual_total)) DO INSTEAD NOTHING; +-- +-- Name: chained_elements chained_elements_upd_protect; Type: RULE; Schema: public; Owner: - +-- + +CREATE RULE chained_elements_upd_protect AS + ON UPDATE TO public.chained_elements + WHERE ((new.content <> old.content) OR ((new.footprint)::text <> (old.footprint)::text) OR (new.previous_id <> old.previous_id) OR (new.element_id <> old.element_id) OR ((new.element_type)::text <> (old.element_type)::text)) DO INSTEAD NOTHING; + + -- -- Name: projects projects_search_content_trigger; Type: TRIGGER; Schema: public; Owner: - -- @@ -8675,6 +8678,7 @@ INSERT INTO "schema_migrations" (version) VALUES ('20230323085947'), ('20230323104259'), ('20230323104727'), -('20230324090312'); +('20230324090312'), +('20230324095639'); diff --git a/lib/tasks/fablab/fix_references.rake b/lib/tasks/fablab/fix_references.rake index 77240ffa9..f9c80272a 100644 --- a/lib/tasks/fablab/fix_references.rake +++ b/lib/tasks/fablab/fix_references.rake @@ -1,16 +1,12 @@ # frozen_string_literal: true -require 'integrity/archive_helper' - namespace :fablab do - desc 'Fill the holes in the logical sequence of invoices references and regenerate invoices w/ duplicate reference' + desc 'Fill the holes in the logical sequence of invoices references' task fix_references: :environment do |_task, _args| include ActionView::Helpers::NumberHelper user = User.adminsys || User.admins.first - # check the footprints - Integrity::ArchiveHelper.check_footprints ActiveRecord::Base.transaction do missing_references = {} @@ -48,11 +44,6 @@ namespace :fablab do ) end end - - # chain records - puts 'Chaining all record. This may take a while...' - not_closed(InvoiceItem).order(:id).find_each(&:chain_record) - not_closed(Invoice).order(:id).find_each(&:chain_record) end end diff --git a/lib/tasks/fablab/restore_order_number.rake b/lib/tasks/fablab/restore_order_number.rake new file mode 100644 index 000000000..cfb4fe262 --- /dev/null +++ b/lib/tasks/fablab/restore_order_number.rake @@ -0,0 +1,50 @@ +# frozen_string_literal: true + +namespace :fablab do + desc 'Scans PDF files of invoices to find order numbers' + task restore_order_number: :environment do |_task, _args| + order_text = [ + I18n.t('invoices.order_number', **{ NUMBER: 'REPLACE' }).gsub('REPLACE', ''), + I18n.t('invoices.order_number', locale: 'en', **{ NUMBER: 'REPLACE' }).gsub('REPLACE', ''), + I18n.t('invoices.order_number', locale: 'fr', **{ NUMBER: 'REPLACE' }).gsub('REPLACE', '') + ] + Invoice.order(id: :asc).find_each do |invoice| + next unless File.exist?(invoice.file) + + found = false + reader = PDF::Reader.new(invoice.file) + page = reader.pages.first + page.text.scan(/^.+/).each do |line| + next unless order_text.any? { |label| line.include? label } + break if found + + order_text.each do |label| + next unless line.include? label + + number = line.gsub(label, '').strip + invoice.update(order_number: number) + found = true + end + end + end + Order.where(reference: nil).order(id: :asc).find_each do |order| + order.update(reference: PaymentDocumentService.generate_order_number(order)) + end + Invoice.where(order_number: nil).order(id: :asc).find_each do |invoice| + next unless invoice.payment_schedule_item.nil? + + unless invoice.order.nil? + invoice.update(order_number: invoice.order.reference) + next + end + + invoice.update(order_number: PaymentDocumentService.generate_order_number(invoice)) + end + PaymentSchedule.order(id: :asc).find_each do |schedule| + schedule.update(order_number: PaymentDocumentService.generate_order_number(schedule)) + schedule.ordered_items.each do |item| + item.invoice&.update(order_number: schedule.order_number) + end + end + end +end diff --git a/test/fixtures/invoices.yml b/test/fixtures/invoices.yml index e39f3e3c4..ee25fc100 100644 --- a/test/fixtures/invoices.yml +++ b/test/fixtures/invoices.yml @@ -4,7 +4,7 @@ invoice_1: total: 10000 created_at: '2012-03-12 11:03:31.651441' updated_at: '2021-05-27 09:26:26.481266' - reference: 1604001/VL + reference: 1203001/VL payment_method: card avoir_date: invoice_id: @@ -18,13 +18,14 @@ invoice_1: invoicing_profile_id: 3 operator_profile_id: 3 statistic_profile_id: 3 + order_number: 000001-03-12 invoice_2: id: 2 total: 2000 created_at: '2012-03-12 13:40:22.342717' updated_at: '2021-05-27 09:26:26.485839' - reference: '1604002' + reference: '1203002' payment_method: avoir_date: invoice_id: @@ -38,6 +39,7 @@ invoice_2: invoicing_profile_id: 4 operator_profile_id: 1 statistic_profile_id: 4 + order_number: 000002-03-12 invoice_3: id: 3 @@ -58,13 +60,14 @@ invoice_3: invoicing_profile_id: 7 operator_profile_id: 1 statistic_profile_id: 7 + order_number: 000003-06-15 invoice_4: id: 4 total: 0 created_at: '2016-04-05 08:35:52.931187' updated_at: '2021-05-27 09:26:26.494005' - reference: '1203002' + reference: '1604002' payment_method: avoir_date: invoice_id: @@ -78,13 +81,14 @@ invoice_4: invoicing_profile_id: 7 operator_profile_id: 1 statistic_profile_id: 7 + order_number: 000004-04-16 invoice_5: id: 5 total: 1500 created_at: '2016-04-05 08:36:46.853368' updated_at: '2021-05-27 09:26:26.498207' - reference: '1506031' + reference: '1604031' payment_method: avoir_date: invoice_id: @@ -98,6 +102,7 @@ invoice_5: invoicing_profile_id: 3 operator_profile_id: 1 statistic_profile_id: 3 + order_number: 000005-04-16 invoice_6: id: 6 @@ -118,6 +123,7 @@ invoice_6: invoicing_profile_id: 8 operator_profile_id: 1 statistic_profile_id: 8 + order_number: 000006-01-21 invoice_5811: id: 5811 total: 4500 @@ -137,6 +143,7 @@ invoice_5811: invoicing_profile_id: 3 operator_profile_id: 1 statistic_profile_id: 3 + order_number: 000009-08-22 invoice_5812: id: 5812 total: 6000 @@ -156,6 +163,7 @@ invoice_5812: invoicing_profile_id: 7 operator_profile_id: 1 statistic_profile_id: 7 + order_number: 005877-09-22 invoice_5816: id: 5816 total: 319 @@ -175,6 +183,7 @@ invoice_5816: invoicing_profile_id: 4 operator_profile_id: 4 statistic_profile_id: 4 + order_number: 005888-10-22 invoice_5817: id: 5817 total: 1295 @@ -194,6 +203,7 @@ invoice_5817: invoicing_profile_id: 4 operator_profile_id: 4 statistic_profile_id: 4 + order_number: 005890-10-22 invoice_5818: id: 5818 total: 1000 @@ -213,6 +223,7 @@ invoice_5818: invoicing_profile_id: 4 operator_profile_id: 4 statistic_profile_id: 4 + order_number: 005892-10-22 invoice_5819: id: 5819 total: 4002 @@ -232,6 +243,7 @@ invoice_5819: invoicing_profile_id: 4 operator_profile_id: 4 statistic_profile_id: 4 + order_number: 005894-10-22 invoice_5820: id: 5820 total: 12000 @@ -251,6 +263,7 @@ invoice_5820: invoicing_profile_id: 3 operator_profile_id: 1 statistic_profile_id: 3 + order_number: 005882-09-22 invoice_5821: id: 5821 total: 12000 @@ -270,6 +283,7 @@ invoice_5821: invoicing_profile_id: 2 operator_profile_id: 1 statistic_profile_id: 2 + order_number: 005898-10-22 invoice_5822: id: 5822 total: 3000 @@ -289,3 +303,4 @@ invoice_5822: invoicing_profile_id: 2 operator_profile_id: 1 statistic_profile_id: 2 + order_number: 005900-10-22 diff --git a/test/fixtures/orders.yml b/test/fixtures/orders.yml index 6ece87147..1ec135803 100644 --- a/test/fixtures/orders.yml +++ b/test/fixtures/orders.yml @@ -3,7 +3,7 @@ order_1: statistic_profile_id: 3 operator_profile_id: 1 token: 3R9wtsPjyYMHKqy-I2V5Cg1661868752184 - reference: + reference: 000009-08-22 state: paid total: 4500 created_at: '2022-08-30 14:12:32.213832' diff --git a/test/fixtures/payment_schedules.yml b/test/fixtures/payment_schedules.yml index 9499fd0a9..da3d4b32f 100644 --- a/test/fixtures/payment_schedules.yml +++ b/test/fixtures/payment_schedules.yml @@ -12,6 +12,7 @@ payment_schedule_12: operator_profile_id: 1 created_at: '2021-06-14 12:24:45.843714' updated_at: '2021-06-14 12:24:45.908386' + order_number: 000007-06-21 payment_schedule_13: id: 13 @@ -27,3 +28,4 @@ payment_schedule_13: operator_profile_id: 10 created_at: <%= 9.months.ago.utc.strftime('%Y-%m-%d %H:%M:%S.%9N Z') %> updated_at: <%= 9.months.ago.utc.strftime('%Y-%m-%d %H:%M:%S.%9N Z') %> + order_number: <%= 9.months.ago.utc.strftime('000008-%m-%y') %> diff --git a/test/integration/open_id_connect_test.rb b/test/integration/open_id_connect_test.rb index f570c204f..1dc8ff638 100644 --- a/test/integration/open_id_connect_test.rb +++ b/test/integration/open_id_connect_test.rb @@ -55,5 +55,8 @@ class OpenIdConnectTest < ActionDispatch::IntegrationTest # end # User.devise :omniauthable, omniauth_providers: [db_provider&.strategy_name&.to_sym] # Rails.application.reload_routes! + # + # === OR === (need to try) + # Rails.application.reloader.reload! end end diff --git a/test/models/chained_element_test.rb b/test/models/chained_element_test.rb index c0a32c712..af99b86cc 100644 --- a/test/models/chained_element_test.rb +++ b/test/models/chained_element_test.rb @@ -36,6 +36,7 @@ class ChainedElementTest < ActiveSupport::TestCase source1 = sample_reservation_invoice(users(:user2), users(:user1)) element1 = source1.chained_element assert element1.persisted? + assert source1.check_footprint source2 = sample_reservation_invoice(users(:user3), users(:user1)) element2 = source2.chained_element @@ -46,6 +47,7 @@ class ChainedElementTest < ActiveSupport::TestCase assert_not element1.corrupted? assert_not element2.corrupted? + assert source2.check_footprint end test 'chain element with children embedded json' do @@ -78,5 +80,6 @@ class ChainedElementTest < ActiveSupport::TestCase previous = element end + assert source.check_footprint end end