diff --git a/config/data/parts.yml b/config/data/parts.yml index 88f881e..1b436dd 100644 --- a/config/data/parts.yml +++ b/config/data/parts.yml @@ -1,27 +1,183 @@ -- Back -- BusinessCard -- Card -- Carton -- Case -- ComplimentSlip -- Content -- ContinuationSheet -- Cover -- CoverLetter -- Endpaper -- Envelope -- Flyer -- Folder -- FoldingCard -- Insert -- Jacket -- Label -- Leaflet -- LetterHead -- Lid -- MapSheet -- Outsert -- Postcard -- Poster -- SelfMailer -- Sheet +Back: + worksteps: + ctp: + required: false + printing: + required: false + cutting: + required: true + folding: + required: false +BusinessCard: + worksteps: + ctp: + required: false + printing: + required: true + cutting: + required: true + folding: + required: false + finishings: + lamination: + required: false +Card: +Carton: +Case: + worksteps: + ctp: + required: false + printing: + required: true + cutting: + required: false + folding: + required: false + finishings: + lamination: + required: false +ComplimentSlip: +Content: + worksteps: + ctp: + required: false + printing: + required: true + cutting: + required: true + folding: + required: true + finishings: + thread_sewing: + required: false + lamination: + required: false +ContinuationSheet: +Cover: + worksteps: + ctp: + required: false + printing: + required: false + cutting: + required: false + folding: + required: false + finishings: + lamination: + required: false +CoverLetter: +Endpaper: + worksteps: + ctp: + required: false + printing: + required: false + cutting: + required: false + folding: + required: false + finishings: + lamination: + required: false +Envelope: +Flyer: + worksteps: + ctp: + required: false + printing: + required: true + cutting: + required: true +Folder: +FoldingCard: +Insert: + worksteps: + ctp: + required: false + printing: + required: true + cutting: + required: false + folding: + required: false +Jacket: + worksteps: + ctp: + required: false + printing: + required: true + cutting: + required: false + folding: + required: false + finishings: + lamination: + required: false +Label: + worksteps: + ctp: + required: false + printing: + required: false + cutting: + required: false +Leaflet: + worksteps: + ctp: + required: false + printing: + required: true + cutting: + required: true + folding: + required: true +LetterHead: +Lid: +MapSheet: + worksteps: + ctp: + required: false + printing: + required: true + cutting: + required: true + folding: + required: true +Outsert: + worksteps: + ctp: + required: false + printing: + required: true + cutting: + required: false + folding: + required: false +Postcard: + worksteps: + ctp: + required: false + printing: + required: false + cutting: + required: false +Poster: + worksteps: + ctp: + required: false + printing: + required: false + cutting: + required: false +SelfMailer: + worksteps: + ctp: + required: false + printing: + required: false + cutting: + required: false + folding: + required: false +Sheet: diff --git a/lib/zaikio/mission_control.rb b/lib/zaikio/mission_control.rb index e834f9e..5017710 100644 --- a/lib/zaikio/mission_control.rb +++ b/lib/zaikio/mission_control.rb @@ -3,8 +3,9 @@ require "zaikio-client-helpers" require "zaikio/mission_control/configuration" -# Jobs require "zaikio/mission_control/base" + +# Jobs require "zaikio/mission_control/jobs/base" # Parts @@ -20,24 +21,24 @@ require "zaikio/mission_control/intermediate_products/base" # Models -require "zaikio/mission_control/job" -require "zaikio/mission_control/part" require "zaikio/mission_control/color" require "zaikio/mission_control/contact" require "zaikio/mission_control/customer" require "zaikio/mission_control/desired_substrate" require "zaikio/mission_control/execution" +require "zaikio/mission_control/file_reference" require "zaikio/mission_control/finishing_application" require "zaikio/mission_control/finishing" -require "zaikio/mission_control/file_reference" +require "zaikio/mission_control/intermediate_product" +require "zaikio/mission_control/job" require "zaikio/mission_control/machine" -require "zaikio/mission_control/order" require "zaikio/mission_control/order_line_item" +require "zaikio/mission_control/order" +require "zaikio/mission_control/part" +require "zaikio/mission_control/production_frame" require "zaikio/mission_control/shipping_option" require "zaikio/mission_control/slot" -require "zaikio/mission_control/production_frame" require "zaikio/mission_control/workstep" -require "zaikio/mission_control/intermediate_product" module Zaikio module MissionControl diff --git a/lib/zaikio/mission_control/parts/base.rb b/lib/zaikio/mission_control/parts/base.rb index 657456a..818690d 100644 --- a/lib/zaikio/mission_control/parts/base.rb +++ b/lib/zaikio/mission_control/parts/base.rb @@ -5,8 +5,45 @@ class Base < Zaikio::MissionControl::Base require "yaml" RELATIVE_PATH_TO_PARTS_YML = "../../../../config/data/parts.yml".freeze parts = YAML.safe_load_file(File.join(File.dirname(__FILE__), RELATIVE_PATH_TO_PARTS_YML), symbolize_names: true) - parts.each do |klass_name| + + parts.each do |klass_name, attributes| Zaikio::MissionControl::Parts.const_set(klass_name, Class.new(Base)) + next if attributes.nil? + + Zaikio::MissionControl::Parts.const_get(klass_name).instance_variable_set(:@worksteps, attributes[:worksteps]) + Zaikio::MissionControl::Parts.const_get(klass_name).instance_variable_set(:@finishings, attributes[:finishings]) + end + + class << self + def finishings + @finishings ||= {} + + @finishings.keys.flat_map do |finishing, option| + option[:required] ? finishing : finishing.to_s.concat("_maybe").to_sym + end + end + + def worksteps_from_parts + @worksteps ||= {} + + @worksteps.flat_map do |workstep, option| + name = option[:required] ? workstep : workstep.to_s.concat("_maybe").to_sym + { name => Zaikio::MissionControl::Worksteps.const_get(workstep.to_s.classify).intermediate_products } + end + end + + def worksteps_from_finishings + @finishings ||= {} + + @finishings.flat_map do |finishing, option| + name = option[:required] ? finishing : finishing.to_s.concat("_maybe").to_sym + { name => Zaikio::MissionControl::Worksteps.const_get(finishing.to_s.classify).intermediate_products } + end + end + + def worksteps + worksteps_from_parts.concat(worksteps_from_finishings) + end end end end diff --git a/test/zaikio/mission_control/parts/parts_test.rb b/test/zaikio/mission_control/parts/parts_test.rb index 676a14c..82969c5 100644 --- a/test/zaikio/mission_control/parts/parts_test.rb +++ b/test/zaikio/mission_control/parts/parts_test.rb @@ -2,36 +2,170 @@ class Zaikio::MissionControl::PartsTest < ActiveSupport::TestCase test "all parts are present" do - expected = %i[ - Back - BusinessCard - Card - Carton - Case - ComplimentSlip - Content - ContinuationSheet - Cover - CoverLetter - Endpaper - Envelope - Flyer - Folder - FoldingCard - Insert - Jacket - Label - Leaflet - LetterHead - Lid - MapSheet - Outsert - Postcard - Poster - SelfMailer - Sheet - ].to_set + expected = { + Back: { + worksteps: { + ctp: { required: false }, + printing: { required: false }, + cutting: { required: true }, + folding: { required: false } + } + }, + BusinessCard: { + worksteps: { + ctp: { required: false }, + printing: { required: true }, + cutting: { required: true }, + folding: { required: false } + }, + finishings: { + lamination: { required: false } + } + }, + Card: {}, + Carton: {}, + Case: { + worksteps: { + ctp: { required: false }, + printing: { required: true }, + cutting: { required: false }, + folding: { required: false } + }, + finishings: { + lamination: { required: false } + } + }, + ComplimentSlip: {}, + Content: { + worksteps: { + ctp: { required: false }, + printing: { required: true }, + cutting: { required: true }, + folding: { required: true } + }, + finishings: { + thread_sewing: { required: false }, + lamination: { required: false } + } + }, + ContinuationSheet: {}, + Cover: { + worksteps: { + ctp: { required: false }, + printing: { required: false }, + cutting: { required: false }, + folding: { required: false } + }, + finishings: { + lamination: { required: false } + } + }, + CoverLetter: {}, + Endpaper: { + worksteps: { + ctp: { required: false }, + printing: { required: false }, + cutting: { required: false }, + folding: { required: false } + }, + finishings: { + lamination: { required: false } + } + }, + Envelope: {}, + Flyer: { + worksteps: { + ctp: { required: false }, + printing: { required: true }, + cutting: { required: true } + } + }, + Folder: {}, + FoldingCard: {}, + Insert: { + worksteps: { + ctp: { required: false }, + printing: { required: true }, + cutting: { required: false }, + folding: { required: false } + } + }, + Jacket: { + worksteps: { + ctp: { required: false }, + printing: { required: true }, + cutting: { required: false }, + folding: { required: false } + }, + finishings: { + lamination: { required: false } + } + }, + Label: { + worksteps: { + ctp: { required: false }, + printing: { required: false }, + cutting: { required: false } + } + }, + Leaflet: { + worksteps: { + ctp: { required: false }, + printing: { required: true }, + cutting: { required: true }, + folding: { required: true } + } + }, + LetterHead: {}, + Lid: {}, + MapSheet: { + worksteps: { + ctp: { required: false }, + printing: { required: true }, + cutting: { required: true }, + folding: { required: true } + } + }, + Outsert: { + worksteps: { + ctp: { required: false }, + printing: { required: true }, + cutting: { required: false }, + folding: { required: false } + } + }, + Postcard: { + worksteps: { + ctp: { required: false }, + printing: { required: false }, + cutting: { required: false } + } + }, + Poster: { + worksteps: { + ctp: { required: false }, + printing: { required: false }, + cutting: { required: false } + } + }, + SelfMailer: { + worksteps: { + ctp: { required: false }, + printing: { required: false }, + cutting: { required: false }, + folding: { required: false } + } + }, + Sheet: {} + } - assert_equal expected, Zaikio::MissionControl::Parts.constants.reject { _1 == :Base }.to_set + Zaikio::MissionControl::Parts.constants.reject { _1 == :Base }.each do |part_klass| + assert expected.fetch(part_klass) { false }, "Parts not found #{part_klass}" + assert_equal expected[part_klass][:worksteps], + Zaikio::MissionControl::Parts.const_get(part_klass).instance_variable_get(:@worksteps), + "Expected #{part_klass} to include workstep #{expected[part_klass][:worksteps]}" + assert_equal expected[part_klass][:finishings], + Zaikio::MissionControl::Parts.const_get(part_klass).instance_variable_get(:@finishings) + end end end