diff --git a/app/controllers/jobs_controller.rb b/app/controllers/jobs_controller.rb index e88475b..2906473 100644 --- a/app/controllers/jobs_controller.rb +++ b/app/controllers/jobs_controller.rb @@ -3,7 +3,7 @@ class JobsController < ApplicationController # GET /jobs or /jobs.json def index - @jobs = Job.current_jobs_of_today + @jobs = Job.currently_working_on end # GET /jobs/1 or /jobs/1.json @@ -23,7 +23,7 @@ class JobsController < ApplicationController respond_to do |format| if @job.save - format.html { redirect_to jobs_url(Job.current_jobs_of_today), notice: 'Job was successfully created.' } + format.html { redirect_to jobs_url(Job.currently_working_on), notice: 'Job was successfully created.' } format.json { render :show, status: :created, location: @job } else format.html { render :new, status: :unprocessable_entity } diff --git a/app/models/job.rb b/app/models/job.rb index ae06782..b5d9524 100644 --- a/app/models/job.rb +++ b/app/models/job.rb @@ -5,6 +5,11 @@ class Job < ApplicationRecord has_one_attached :pdf validates_presence_of :costumer_firstname, :costumer_lastname, :privacy_policy_accepted, :pdf + validate :acceptable_pdf + + before_save :update_printed_at, if: :will_save_change_to_status? + before_save :update_paid_at, if: :will_save_change_to_status? + before_save :update_status_changed_at, if: :will_save_change_to_status? # NOTE: Multiple status if paing before brinting? enum status: { @@ -15,37 +20,55 @@ class Job < ApplicationRecord canceled: 4 } - scope :of_the_day, ->(date) { where('created_at >= ? AND created_at <= ?', date.beginning_of_day, date.end_of_day) } - scope :of_today, -> { of_the_day(Time.now) } # NOTE: only named status are returned because of WHERE/IN clause for the enum values scope :in_status_order, -> { in_order_of(:status, %w[open printing ready_for_pickup paid canceled]) } - # TODO: add logic (all with status: open, printing, ready_for_pickup. with status paid and canceled only from today) - scope :done_on_day, ->(date) { where('created_at >= ? AND created_at <= ?', date.beginning_of_day, date.end_of_day) } - - def self.current_jobs_of_today + scope :created_today, -> { created_on_day(Time.now) } + scope :created_on_day, lambda { |date| + where('created_at >= ? AND created_at <= ?', date.beginning_of_day, date.end_of_day) + } + scope :upgraded_today, -> { upgraded_on_day(Time.now) } + scope :upgraded_on_day, lambda { |date| + where('upgraded_at >= ? AND upgraded_at <= ?', date.beginning_of_day, date.end_of_day) + } + # Returns all jobs with status: open print ready_for_pickup and jobs from today with status: paid canceled + # paid: only printed_at today + # canceled: only updated_at today + def self.currently_working_on # NOTE: use Time.now instead of Date.today to take the timezone into account - of_the_day(Time.now).in_status_order - end - - def self.current_jobs_of_(date) - # NOTE: use Time.now instead of Date.today to take the timezone into account - of_the_day(date).in_status_order + where(status: %i[open printing ready_for_pickup]) + .or(Job.where(status: %i[paid canceled]) + .where('status_changed_at >= ?', Time.now.beginning_of_day)) + # .in_status_order + .order(created_at: :asc) end def fullname [costumer_firstname, ' ', costumer_lastname].join end - # TODO: Implement validation def acceptable_pdf return unless pdf.attached? - errors.add(:main_image, 'is too big') unless main_image.blob.byte_size <= 100.megabyte + errors.add(:pdf, 'is too big') unless pdf.blob.byte_size <= 100.megabyte acceptable_types = ['application/pdf'] - return if acceptable_types.include?(main_image.content_type) + return if acceptable_types.include?(pdf.content_type) - errors.add(:main_image, 'must be a PDF') + errors.add(:pdf, 'must be a PDF') + end + + private + + def update_printed_at + self.printed_at = Time.now if ready_for_pickup? || (paid? && printed_at.nil?) + end + + def update_paid_at + self.paid_at = Time.now if paid? + end + + def update_status_changed_at + self.status_changed_at = Time.now end end diff --git a/db/migrate/20240727101347_create_jobs.rb b/db/migrate/20240727101347_create_jobs.rb index d68a33e..fee7ba4 100644 --- a/db/migrate/20240727101347_create_jobs.rb +++ b/db/migrate/20240727101347_create_jobs.rb @@ -10,6 +10,7 @@ class CreateJobs < ActiveRecord::Migration[7.1] t.boolean :printed, default: false t.boolean :paid, default: false t.datetime :printed_at + t.datetime :status_changed_at t.datetime :paid_at t.boolean :intern, default: false t.string :cost_center @@ -19,7 +20,7 @@ class CreateJobs < ActiveRecord::Migration[7.1] t.integer :number_of_plans_a2, default: 0 t.integer :number_of_plans_a3, default: 0 t.float :costum_qm_plan, default: 0 - t.string :pdf + t.boolean :privacy_policy_accepted, default: false t.timestamps end diff --git a/db/migrate/20240801205025_add_privacy_policy_accepted_to_job.rb b/db/migrate/20240801205025_add_privacy_policy_accepted_to_job.rb deleted file mode 100644 index 2e270e3..0000000 --- a/db/migrate/20240801205025_add_privacy_policy_accepted_to_job.rb +++ /dev/null @@ -1,5 +0,0 @@ -class AddPrivacyPolicyAcceptedToJob < ActiveRecord::Migration[7.1] - def change - add_column :jobs, :privacy_policy_accepted, :boolean, default: false - end -end diff --git a/db/pdfs/DasNächsteMalGeheIchWoAndersHin.pdf b/db/pdfs/DasNächsteMalGeheIchWoAndersHin.pdf new file mode 100644 index 0000000..a206c49 Binary files /dev/null and b/db/pdfs/DasNächsteMalGeheIchWoAndersHin.pdf differ diff --git a/db/pdfs/DenPlanBezahleIchNicht.pdf b/db/pdfs/DenPlanBezahleIchNicht.pdf new file mode 100644 index 0000000..a206c49 Binary files /dev/null and b/db/pdfs/DenPlanBezahleIchNicht.pdf differ diff --git a/db/pdfs/DerPlanDerImmerProblemeMacht.pdf b/db/pdfs/DerPlanDerImmerProblemeMacht.pdf new file mode 100644 index 0000000..0c4239c Binary files /dev/null and b/db/pdfs/DerPlanDerImmerProblemeMacht.pdf differ diff --git a/db/pdfs/DieFarbenGefallenMirNicht.pdf b/db/pdfs/DieFarbenGefallenMirNicht.pdf new file mode 100644 index 0000000..a206c49 Binary files /dev/null and b/db/pdfs/DieFarbenGefallenMirNicht.pdf differ diff --git a/db/pdfs/GanzWichtig.pdf b/db/pdfs/GanzWichtig.pdf new file mode 100644 index 0000000..fef7a2c Binary files /dev/null and b/db/pdfs/GanzWichtig.pdf differ diff --git a/db/pdfs/IchBinIn5MinDran.pdf b/db/pdfs/IchBinIn5MinDran.pdf new file mode 100644 index 0000000..0c4239c Binary files /dev/null and b/db/pdfs/IchBinIn5MinDran.pdf differ diff --git a/db/pdfs/IchWarAlsErstesDran.pdf b/db/pdfs/IchWarAlsErstesDran.pdf new file mode 100644 index 0000000..a206c49 Binary files /dev/null and b/db/pdfs/IchWarAlsErstesDran.pdf differ diff --git a/db/pdfs/MachHinIchHabsEilig.pdf b/db/pdfs/MachHinIchHabsEilig.pdf new file mode 100644 index 0000000..a206c49 Binary files /dev/null and b/db/pdfs/MachHinIchHabsEilig.pdf differ diff --git a/db/pdfs/WarumDauertDasSoLange.pdf b/db/pdfs/WarumDauertDasSoLange.pdf new file mode 100644 index 0000000..a206c49 Binary files /dev/null and b/db/pdfs/WarumDauertDasSoLange.pdf differ diff --git a/db/pdfs/WarumIstDerPlotterDefekt.pdf b/db/pdfs/WarumIstDerPlotterDefekt.pdf new file mode 100644 index 0000000..a206c49 Binary files /dev/null and b/db/pdfs/WarumIstDerPlotterDefekt.pdf differ diff --git a/db/schema.rb b/db/schema.rb index 9d862d4..918bd83 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,7 +10,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema[7.1].define(version: 2024_08_01_205025) do +ActiveRecord::Schema[7.1].define(version: 2024_08_01_153403) do create_table "active_storage_attachments", force: :cascade do |t| t.string "name", null: false t.string "record_type", null: false @@ -49,6 +49,7 @@ ActiveRecord::Schema[7.1].define(version: 2024_08_01_205025) do t.boolean "printed", default: false t.boolean "paid", default: false t.datetime "printed_at" + t.datetime "status_changed_at" t.datetime "paid_at" t.boolean "intern", default: false t.string "cost_center" @@ -58,10 +59,9 @@ ActiveRecord::Schema[7.1].define(version: 2024_08_01_205025) do t.integer "number_of_plans_a2", default: 0 t.integer "number_of_plans_a3", default: 0 t.float "costum_qm_plan", default: 0.0 - t.string "pdf" + t.boolean "privacy_policy_accepted", default: false t.datetime "created_at", null: false t.datetime "updated_at", null: false - t.boolean "privacy_policy_accepted", default: false t.index ["costumer_id"], name: "index_jobs_on_costumer_id" t.index ["operator_id"], name: "index_jobs_on_operator_id" t.index ["status"], name: "index_jobs_on_status" diff --git a/db/seeds.rb b/db/seeds.rb index 0e67c8c..84ddca8 100644 --- a/db/seeds.rb +++ b/db/seeds.rb @@ -15,7 +15,7 @@ Faker::Config.locale = :de end ['GanzWichtig.pdf', 'IchBinIn5MinDran.pdf', 'DerPlanDerImmerProblemeMacht.pdf', 'DieFarbenGefallenMirNicht.pdf', 'MachHinIchHabsEilig.pdf', 'WarumDauertDasSoLange.pdf', - 'DenPlanBezahleIchNicht.pdf', 'IchWarAlsErstesDran.pdf', 'WarumIstDerPlotterDefekt.pdf', 'DasNächsteMalGeheIchWoAndersHin'].shuffle.each do |pdf| + 'DenPlanBezahleIchNicht.pdf', 'IchWarAlsErstesDran.pdf', 'WarumIstDerPlotterDefekt.pdf', 'DasNächsteMalGeheIchWoAndersHin.pdf'].shuffle.each do |pdf| a0 = rand(0...7) a1 = rand(0...7) a2 = rand(0...7) @@ -23,9 +23,12 @@ end a0.zero? || a1 = 0 && a2 = 0 && a3 = 0 a1.zero? || a2 = 0 && a3 = 0 a2.zero? || a3 = 0 - status = %i[open printing ready_for_pickup paid cancelled].sample + status = %i[open printing ready_for_pickup paid canceled].sample - Job.new(costumer_firstname: Faker::Name.unique.first_name, costumer_lastname: Faker::Name.unique.last_name, - number_of_plans_a0: a0, number_of_plans_a1: a1, number_of_plans_a2: a2, number_of_plans_a3: a3, - pdf:, status:).save + job = Job.new(costumer_firstname: Faker::Name.unique.first_name, costumer_lastname: Faker::Name.unique.last_name, + number_of_plans_a0: a0, number_of_plans_a1: a1, number_of_plans_a2: a2, number_of_plans_a3: a3, + status:, privacy_policy_accepted: true) + job.pdf = File.open(Rails.root.join('db/pdfs/', pdf)) + job.save! + sleep 1 end