Merge pull request #10348 from demarches-simplifiees/fix_cron_operations_signature
Tech: repare le job de signature des operations
This commit is contained in:
commit
761ecf95b1
4 changed files with 50 additions and 49 deletions
|
@ -2,14 +2,17 @@ class Cron::OperationsSignatureJob < Cron::CronJob
|
||||||
self.schedule_expression = "every day at 6 am"
|
self.schedule_expression = "every day at 6 am"
|
||||||
|
|
||||||
def perform(*args)
|
def perform(*args)
|
||||||
|
start_date = DossierOperationLog.where(bill_signature: nil).order(:executed_at).pick(:executed_at).beginning_of_day
|
||||||
last_midnight = Time.zone.today.beginning_of_day
|
last_midnight = Time.zone.today.beginning_of_day
|
||||||
operations_by_day = BillSignatureService.grouped_unsigned_operation_until(last_midnight)
|
|
||||||
operations_by_day.each do |day, operations|
|
while start_date < last_midnight
|
||||||
begin
|
operations = DossierOperationLog
|
||||||
BillSignatureService.sign_operations(operations, day)
|
.select(:id, :digest)
|
||||||
rescue
|
.where(executed_at: start_date...start_date.tomorrow, bill_signature: nil)
|
||||||
raise # let errors show up on Sentry and delayed_jobs
|
|
||||||
end
|
BillSignatureService.sign_operations(operations, start_date) if operations.present?
|
||||||
|
|
||||||
|
start_date = start_date.tomorrow
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -1,12 +1,4 @@
|
||||||
class BillSignatureService
|
class BillSignatureService
|
||||||
def self.grouped_unsigned_operation_until(date)
|
|
||||||
date = date.in_time_zone
|
|
||||||
unsigned_operations = DossierOperationLog
|
|
||||||
.where(bill_signature: nil)
|
|
||||||
.where('executed_at < ?', date)
|
|
||||||
unsigned_operations.group_by { |e| e.executed_at.to_date }
|
|
||||||
end
|
|
||||||
|
|
||||||
def self.sign_operations(operations, day)
|
def self.sign_operations(operations, day)
|
||||||
return unless Certigna::API.enabled?
|
return unless Certigna::API.enabled?
|
||||||
bill = BillSignature.build_with_operations(operations, day)
|
bill = BillSignature.build_with_operations(operations, day)
|
||||||
|
|
40
spec/jobs/cron/operations_signature_job_spec.rb
Normal file
40
spec/jobs/cron/operations_signature_job_spec.rb
Normal file
|
@ -0,0 +1,40 @@
|
||||||
|
RSpec.describe Cron::OperationsSignatureJob, type: :job do
|
||||||
|
describe 'perform' do
|
||||||
|
subject { Cron::OperationsSignatureJob.perform_now }
|
||||||
|
|
||||||
|
let(:today) { Time.zone.parse('2018-01-05 00:06:00') }
|
||||||
|
|
||||||
|
before do
|
||||||
|
travel_to(today)
|
||||||
|
allow(BillSignatureService).to receive(:sign_operations)
|
||||||
|
end
|
||||||
|
|
||||||
|
context "with dol without signature executed_at two_days_ago" do
|
||||||
|
let(:two_days_ago_00_30) { Time.zone.parse('2018-01-03 00:30:00') }
|
||||||
|
let(:two_days_ago_00_00) { Time.zone.parse('2018-01-03 00:00:00') }
|
||||||
|
|
||||||
|
let(:one_day_ago_00_30) { Time.zone.parse('2018-01-04 00:30:00') }
|
||||||
|
let(:one_day_ago_00_00) { Time.zone.parse('2018-01-04 00:00:00') }
|
||||||
|
|
||||||
|
let!(:dol_1) { create(:dossier_operation_log, executed_at: two_days_ago_00_30) }
|
||||||
|
let!(:dol_2) { create(:dossier_operation_log, executed_at: one_day_ago_00_30) }
|
||||||
|
|
||||||
|
before { subject }
|
||||||
|
|
||||||
|
it do
|
||||||
|
expect(BillSignatureService).to have_received(:sign_operations).exactly(2).times
|
||||||
|
expect(BillSignatureService).to have_received(:sign_operations).with([dol_1], two_days_ago_00_00)
|
||||||
|
expect(BillSignatureService).to have_received(:sign_operations).with([dol_2], one_day_ago_00_00)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context "with dol without signature executed_at today past midnight" do
|
||||||
|
let(:today_00_01) { Time.zone.parse('2018-01-05 00:00:01') }
|
||||||
|
let!(:dol) { create(:dossier_operation_log, executed_at: today_00_01) }
|
||||||
|
|
||||||
|
before { subject }
|
||||||
|
|
||||||
|
it { expect(BillSignatureService).not_to have_received(:sign_operations) }
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
|
@ -1,38 +1,4 @@
|
||||||
describe BillSignatureService do
|
describe BillSignatureService do
|
||||||
describe ".grouped_unsigned_operation_until" do
|
|
||||||
subject { BillSignatureService.grouped_unsigned_operation_until(date).length }
|
|
||||||
|
|
||||||
let(:date) { Time.zone.now.beginning_of_day }
|
|
||||||
|
|
||||||
context "when operations of several days need to be signed" do
|
|
||||||
before do
|
|
||||||
create :dossier_operation_log, executed_at: 3.days.ago
|
|
||||||
create :dossier_operation_log, executed_at: 2.days.ago
|
|
||||||
create :dossier_operation_log, executed_at: 1.day.ago
|
|
||||||
end
|
|
||||||
|
|
||||||
it { is_expected.to eq 3 }
|
|
||||||
end
|
|
||||||
|
|
||||||
context "when operations on a single day need to be signed" do
|
|
||||||
before do
|
|
||||||
create :dossier_operation_log, executed_at: 1.day.ago
|
|
||||||
create :dossier_operation_log, executed_at: 1.day.ago
|
|
||||||
end
|
|
||||||
|
|
||||||
it { is_expected.to eq 1 }
|
|
||||||
end
|
|
||||||
|
|
||||||
context "when there are no operations to be signed" do
|
|
||||||
before do
|
|
||||||
create :dossier_operation_log, created_at: 1.day.ago, bill_signature: build(:bill_signature, :with_signature, :with_serialized)
|
|
||||||
create :dossier_operation_log, created_at: 1.day.from_now
|
|
||||||
end
|
|
||||||
|
|
||||||
it { is_expected.to eq 0 }
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
describe ".sign_operations" do
|
describe ".sign_operations" do
|
||||||
let(:date) { Date.today }
|
let(:date) { Date.today }
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue