mirror of
https://github.com/LaCasemate/fab-manager.git
synced 2024-12-01 12:24:28 +01:00
266 lines
8.6 KiB
Ruby
266 lines
8.6 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
require 'test_helper'
|
|
|
|
module Invoices; end
|
|
|
|
class Invoices::RoundTest < ActionDispatch::IntegrationTest
|
|
def setup
|
|
@vlonchamp = User.find_by(username: 'vlonchamp')
|
|
@admin = User.find_by(username: 'admin')
|
|
login_as(@admin, scope: :user)
|
|
end
|
|
|
|
test 'invoice using percent coupon rounded up' do
|
|
machine = Machine.first
|
|
availability = machine.availabilities.first
|
|
plan = Plan.find(5)
|
|
|
|
# enable the VAT
|
|
Setting.set('invoice_VAT-active', true)
|
|
Setting.set('invoice_VAT-rate', 20)
|
|
|
|
post '/api/local_payment/confirm_payment', params: {
|
|
customer_id: @vlonchamp.id,
|
|
coupon_code: 'REDUC20',
|
|
items: [
|
|
{
|
|
reservation: {
|
|
reservable_id: machine.id,
|
|
reservable_type: machine.class.name,
|
|
slots_reservations_attributes: [
|
|
{
|
|
slot_id: availability.slots.first.id
|
|
}
|
|
]
|
|
}
|
|
},
|
|
{
|
|
subscription: {
|
|
plan_id: plan.id
|
|
}
|
|
}
|
|
]
|
|
}.to_json, headers: default_headers
|
|
|
|
# Check response format & status
|
|
assert_equal 201, response.status, response.body
|
|
assert_match Mime[:json].to_s, response.content_type
|
|
|
|
# in the invoice, we should have:
|
|
# - machine reservation = 121 (97, coupon applied)
|
|
# - subscription = 1498 (1198, coupon applied)
|
|
### intermediate total = 1619
|
|
# - coupon (20%) = -323.8 => round to 324
|
|
### total incl. taxes = 1295
|
|
# - vat = 216
|
|
# - total exct. taxes = 1079
|
|
### amount paid = 1295
|
|
|
|
invoice = Invoice.last
|
|
assert_equal 121, invoice.main_item.amount
|
|
assert_equal 1498, invoice.other_items.last.amount
|
|
assert_equal 1295, invoice.total
|
|
|
|
coupon_service = CouponService.new
|
|
total_without_coupon = coupon_service.invoice_total_no_coupon(invoice)
|
|
assert_equal 97, coupon_service.ventilate(total_without_coupon, invoice.main_item.amount, invoice.coupon)
|
|
assert_equal 1198, coupon_service.ventilate(total_without_coupon, invoice.other_items.last.amount, invoice.coupon)
|
|
assert_equal 324, total_without_coupon - invoice.total
|
|
|
|
vat_service = VatHistoryService.new
|
|
vat_rate_groups = vat_service.invoice_vat(invoice)
|
|
assert_equal 216, vat_rate_groups.values.pluck(:total_vat).reduce(:+)
|
|
assert_equal 1079, invoice.invoice_items.map(&:net_amount).reduce(:+)
|
|
end
|
|
|
|
test 'invoice using percent coupon rounded down' do
|
|
machine = Machine.find(3)
|
|
availability = machine.availabilities.first
|
|
plan = Plan.find(5)
|
|
|
|
# enable the VAT
|
|
Setting.set('invoice_VAT-active', true)
|
|
Setting.set('invoice_VAT-rate', 20)
|
|
|
|
post '/api/local_payment/confirm_payment', params: {
|
|
customer_id: @vlonchamp.id,
|
|
coupon_code: 'REDUC20',
|
|
items: [
|
|
{
|
|
reservation: {
|
|
reservable_id: machine.id,
|
|
reservable_type: machine.class.name,
|
|
slots_reservations_attributes: [
|
|
{
|
|
slot_id: availability.slots.first.id
|
|
}
|
|
]
|
|
}
|
|
},
|
|
{
|
|
subscription: {
|
|
plan_id: plan.id
|
|
}
|
|
}
|
|
]
|
|
}.to_json, headers: default_headers
|
|
|
|
# Check response format & status
|
|
assert_equal 201, response.status, response.body
|
|
assert_match Mime[:json].to_s, response.content_type
|
|
|
|
# in the invoice, we should have:
|
|
# - machine reservation = 1423 (1138, coupon applied)
|
|
# - subscription = 1498 (1198, coupon applied)
|
|
### intermediate total = 2921
|
|
# - coupon (20%) = -584.2 => round to 585
|
|
### total incl. taxes = 2336
|
|
# - vat = 390
|
|
# - total exct. taxes = 1946
|
|
### amount paid = 2336
|
|
|
|
invoice = Invoice.last
|
|
assert_equal 1423, invoice.main_item.amount
|
|
assert_equal 1498, invoice.other_items.last.amount
|
|
assert_equal 2336, invoice.total
|
|
|
|
coupon_service = CouponService.new
|
|
total_without_coupon = coupon_service.invoice_total_no_coupon(invoice)
|
|
assert_equal 1138, coupon_service.ventilate(total_without_coupon, invoice.main_item.amount, invoice.coupon)
|
|
assert_equal 1198, coupon_service.ventilate(total_without_coupon, invoice.other_items.last.amount, invoice.coupon)
|
|
assert_equal 585, total_without_coupon - invoice.total
|
|
|
|
vat_service = VatHistoryService.new
|
|
vat_rate_groups = vat_service.invoice_vat(invoice)
|
|
assert_equal 390, vat_rate_groups.values.pluck(:total_vat).reduce(:+)
|
|
assert_equal 1946, invoice.invoice_items.map(&:net_amount).reduce(:+)
|
|
end
|
|
|
|
test 'invoice using amount coupon rounded up' do
|
|
machine = Machine.first
|
|
availability = machine.availabilities.first
|
|
plan = Plan.find(5)
|
|
|
|
# enable the VAT
|
|
Setting.set('invoice_VAT-active', true)
|
|
Setting.set('invoice_VAT-rate', 19.6)
|
|
|
|
post '/api/local_payment/confirm_payment', params: {
|
|
customer_id: @vlonchamp.id,
|
|
coupon_code: 'GIME3EUR',
|
|
items: [
|
|
{
|
|
reservation: {
|
|
reservable_id: machine.id,
|
|
reservable_type: machine.class.name,
|
|
slots_reservations_attributes: [
|
|
{
|
|
slot_id: availability.slots.first.id
|
|
}
|
|
]
|
|
}
|
|
},
|
|
{
|
|
subscription: {
|
|
plan_id: plan.id
|
|
}
|
|
}
|
|
]
|
|
}.to_json, headers: default_headers
|
|
|
|
# Check response format & status
|
|
assert_equal 201, response.status, response.body
|
|
assert_match Mime[:json].to_s, response.content_type
|
|
|
|
# in the invoice, we should have:
|
|
# - machine reservation = 121 (99, coupon applied)
|
|
# - subscription = 1498 (1220, coupon applied)
|
|
### intermediate total = 1619
|
|
# - coupon (20%) = -300
|
|
### total incl. taxes = 1319
|
|
# - vat = 216
|
|
# - total exct. taxes = 1103
|
|
### amount paid = 1319
|
|
|
|
invoice = Invoice.last
|
|
assert_equal 121, invoice.main_item.amount
|
|
assert_equal 1498, invoice.other_items.last.amount
|
|
assert_equal 1319, invoice.total
|
|
|
|
coupon_service = CouponService.new
|
|
total_without_coupon = coupon_service.invoice_total_no_coupon(invoice)
|
|
assert_equal 99, coupon_service.ventilate(total_without_coupon, invoice.main_item.amount, invoice.coupon)
|
|
assert_equal 1220, coupon_service.ventilate(total_without_coupon, invoice.other_items.last.amount, invoice.coupon)
|
|
assert_equal 300, total_without_coupon - invoice.total
|
|
|
|
vat_service = VatHistoryService.new
|
|
vat_rate_groups = vat_service.invoice_vat(invoice)
|
|
assert_equal 216, vat_rate_groups.values.pluck(:total_vat).reduce(:+)
|
|
assert_equal 1103, invoice.invoice_items.map(&:net_amount).reduce(:+)
|
|
end
|
|
|
|
test 'invoice using amount coupon rounded down' do
|
|
machine = Machine.find(3)
|
|
availability = machine.availabilities.first
|
|
plan = Plan.find(5)
|
|
|
|
# enable the VAT
|
|
Setting.set('invoice_VAT-active', true)
|
|
Setting.set('invoice_VAT-rate', 20)
|
|
|
|
post '/api/local_payment/confirm_payment', params: {
|
|
customer_id: @vlonchamp.id,
|
|
coupon_code: 'GIME3EUR',
|
|
items: [
|
|
{
|
|
reservation: {
|
|
reservable_id: machine.id,
|
|
reservable_type: machine.class.name,
|
|
slots_reservations_attributes: [
|
|
{
|
|
slot_id: availability.slots.first.id
|
|
}
|
|
]
|
|
}
|
|
},
|
|
{
|
|
subscription: {
|
|
plan_id: plan.id
|
|
}
|
|
}
|
|
]
|
|
}.to_json, headers: default_headers
|
|
|
|
# Check response format & status
|
|
assert_equal 201, response.status, response.body
|
|
assert_match Mime[:json].to_s, response.content_type
|
|
|
|
# in the invoice, we should have:
|
|
# - machine reservation = 1423 (1277, coupon applied)
|
|
# - subscription = 1498 (1344, coupon applied)
|
|
### intermediate total = 2921
|
|
# - coupon (20%) = -300
|
|
### total incl. taxes = 2621
|
|
# - vat = 430
|
|
# - total exct. taxes = 2191
|
|
### amount paid = 2621
|
|
|
|
invoice = Invoice.last
|
|
assert_equal 1423, invoice.main_item.amount
|
|
assert_equal 1498, invoice.other_items.last.amount
|
|
assert_equal 2621, invoice.total
|
|
|
|
coupon_service = CouponService.new
|
|
total_without_coupon = coupon_service.invoice_total_no_coupon(invoice)
|
|
assert_equal 1277, coupon_service.ventilate(total_without_coupon, invoice.main_item.amount, invoice.coupon)
|
|
assert_equal 1344, coupon_service.ventilate(total_without_coupon, invoice.other_items.last.amount, invoice.coupon)
|
|
assert_equal 300, total_without_coupon - invoice.total
|
|
|
|
vat_service = VatHistoryService.new
|
|
vat_rate_groups = vat_service.invoice_vat(invoice)
|
|
assert_equal 437, vat_rate_groups.values.pluck(:total_vat).reduce(:+)
|
|
assert_equal 2184, invoice.invoice_items.map(&:net_amount).reduce(:+)
|
|
end
|
|
end
|