Skip to content

Commit ea81469

Browse files
committed
Allow admin to remove VAT rate
1 parent 07321e4 commit ea81469

File tree

13 files changed

+113
-10
lines changed

13 files changed

+113
-10
lines changed

ecommerce/taxes/lib/taxes.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ def call(event_store, command_bus)
1111
command_bus.register(SetVatRate, SetVatRateHandler.new(event_store))
1212
command_bus.register(DetermineVatRate, DetermineVatRateHandler.new(event_store))
1313
command_bus.register(AddAvailableVatRate, AddAvailableVatRateHandler.new(event_store))
14+
command_bus.register(RemoveAvailableVatRate, RemoveAvailableVatRateHandler.new(event_store))
1415
end
1516
end
1617
end

ecommerce/taxes/lib/taxes/commands.rb

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,4 +13,8 @@ class AddAvailableVatRate < Infra::Command
1313
attribute :available_vat_rate_id, Infra::Types::UUID
1414
attribute :vat_rate, Infra::Types::VatRate
1515
end
16+
17+
class RemoveAvailableVatRate < Infra::Command
18+
attribute :vat_rate_code, Infra::Types::String
19+
end
1620
end

ecommerce/taxes/lib/taxes/events.rb

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,4 +14,8 @@ class AvailableVatRateAdded < Infra::Event
1414
attribute :available_vat_rate_id, Infra::Types::UUID
1515
attribute :vat_rate, Infra::Types::VatRate
1616
end
17+
18+
class AvailableVatRateRemoved < Infra::Event
19+
attribute :vat_rate_code, Infra::Types::String
20+
end
1721
end

ecommerce/taxes/lib/taxes/services.rb

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
module Taxes
22
VatRateAlreadyExists = Class.new(StandardError)
33
VatRateNotApplicable = Class.new(StandardError)
4+
VatRateNotExists = Class.new(StandardError)
45
class SetVatRateHandler
56
def initialize(event_store)
67
@repository = Infra::AggregateRootRepository.new(event_store)
@@ -69,4 +70,29 @@ def stream_name(cmd)
6970
"Taxes::AvailableVatRate$#{cmd.vat_rate.code}"
7071
end
7172
end
73+
74+
class RemoveAvailableVatRateHandler
75+
def initialize(event_store)
76+
@catalog = VatRateCatalog.new(event_store)
77+
@event_store = event_store
78+
end
79+
80+
def call(cmd)
81+
raise VatRateNotExists unless catalog.vat_rate_by_code(cmd.vat_rate_code)
82+
83+
event_store.publish(available_vat_rate_removed_event(cmd), stream_name: stream_name(cmd))
84+
end
85+
86+
private
87+
88+
attr_reader :event_store, :catalog
89+
90+
def available_vat_rate_removed_event(cmd)
91+
AvailableVatRateRemoved.new(data: { vat_rate_code: cmd.vat_rate_code })
92+
end
93+
94+
def stream_name(cmd)
95+
"Taxes::AvailableVatRate$#{cmd.vat_rate_code}"
96+
end
97+
end
7298
end

ecommerce/taxes/lib/taxes/vat_rate_catalog.rb

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,17 @@ def vat_rate_for(product_id)
1616
end
1717

1818
def vat_rate_by_code(vat_rate_code)
19-
@event_store
19+
last_available_vat_rate_event = @event_store
2020
.read
2121
.stream("Taxes::AvailableVatRate$#{vat_rate_code}")
2222
.last
23-
&.data
24-
&.fetch(:vat_rate)
25-
&.then { |vat_rate| Infra::Types::VatRate.new(vat_rate) }
23+
24+
if last_available_vat_rate_event.instance_of?(AvailableVatRateAdded)
25+
last_available_vat_rate_event
26+
.data
27+
.fetch(:vat_rate)
28+
.then { |vat_rate| Infra::Types::VatRate.new(vat_rate) }
29+
end
2630
end
2731
end
2832
end

ecommerce/taxes/test/taxes_test.rb

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,22 @@ def test_should_not_allow_for_double_registration
5959
end
6060
end
6161

62+
def test_removing_available_vat_rate
63+
vat_rate = Infra::Types::VatRate.new(code: "50", rate: 50)
64+
add_available_vat_rate(vat_rate)
65+
available_vat_rate_removed = AvailableVatRateRemoved.new(data: { vat_rate_code: vat_rate.code })
66+
67+
assert_events("Taxes::AvailableVatRate$#{vat_rate.code}", available_vat_rate_removed) do
68+
remove_available_vat_rate(vat_rate.code)
69+
end
70+
end
71+
72+
def test_cannot_remove_non_existing_vat_rate
73+
assert_raises(VatRateNotExists) do
74+
remove_available_vat_rate("50")
75+
end
76+
end
77+
6278
private
6379

6480
def set_vat_rate(product_id, vat_rate_code)
@@ -72,5 +88,9 @@ def determine_vat_rate(order_id, product_id, vat_rate)
7288
def add_available_vat_rate(vat_rate, available_vat_rate_id = SecureRandom.uuid)
7389
run_command(AddAvailableVatRate.new(available_vat_rate_id: available_vat_rate_id, vat_rate: vat_rate))
7490
end
91+
92+
def remove_available_vat_rate(vat_rate_code)
93+
run_command(RemoveAvailableVatRate.new(vat_rate_code: vat_rate_code))
94+
end
7595
end
7696
end

ecommerce/taxes/test/vat_rate_catalog_test.rb

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,12 @@ def test_returns_available_vat_rate
1515
def test_returns_nil_when_vat_rate_is_not_available
1616
assert_nil catalog.vat_rate_by_code("60")
1717
end
18+
19+
def test_returns_nil_when_vat_rate_was_removed
20+
run_command(RemoveAvailableVatRate.new(vat_rate_code: "50"))
21+
22+
assert_nil catalog.vat_rate_by_code("50")
23+
end
1824
end
1925

2026
private

rails_application/app/controllers/available_vat_rates_controller.rb

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,17 +26,24 @@ def create
2626
end
2727

2828
add_available_vat_rate(available_vat_rate_form.code, available_vat_rate_form.rate, available_vat_rate_id)
29-
rescue Taxes::VatRateAlreadyExists
30-
flash.now[:notice] = "VAT rate already exists"
31-
render "new", status: :unprocessable_entity
32-
else
29+
rescue Taxes::VatRateAlreadyExists
30+
flash.now[:alert] = "VAT rate already exists"
31+
render "new", status: :unprocessable_entity
32+
else
3333
redirect_to available_vat_rates_path, notice: "VAT rate was successfully created"
3434
end
3535

3636
def index
3737
@available_vat_rates = VatRates::AvailableVatRate.all
3838
end
3939

40+
def destroy
41+
remove_available_vat_rate(params[:vat_rate_code])
42+
redirect_to available_vat_rates_path, notice: "VAT rate was successfully removed"
43+
rescue Taxes::VatRateNotExists
44+
redirect_to available_vat_rates_path, alert: "VAT rate does not exist"
45+
end
46+
4047
private
4148

4249
def add_available_vat_rate(code, rate, available_vat_rate_id)
@@ -50,6 +57,14 @@ def add_available_vat_rate_cmd(code, rate, available_vat_rate_id)
5057
)
5158
end
5259

60+
def remove_available_vat_rate(vat_rate_code)
61+
command_bus.(remove_available_vat_rate_cmd(vat_rate_code))
62+
end
63+
64+
def remove_available_vat_rate_cmd(vat_rate_code)
65+
Taxes::RemoveAvailableVatRate.new(vat_rate_code: vat_rate_code)
66+
end
67+
5368
def available_vat_rate_params
5469
params.permit(:code, :rate)
5570
end

rails_application/app/read_models/vat_rates/configuration.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ class AvailableVatRate < ApplicationRecord
66
class Configuration
77
def call(event_store)
88
event_store.subscribe(AddAvailableVatRate, to: [Taxes::AvailableVatRateAdded])
9+
event_store.subscribe(RemoveAvailableVatRate, to: [Taxes::AvailableVatRateRemoved])
910
end
1011
end
1112
end
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
module VatRates
2+
class RemoveAvailableVatRate
3+
def call(event)
4+
AvailableVatRate.destroy_by(code: event.data.fetch(:vat_rate_code))
5+
end
6+
end
7+
end

0 commit comments

Comments
 (0)