Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP

Loading…

VAT support for bills #72

Merged
merged 2 commits into from

2 participants

@annttu
Owner
  • Added VAT support for membership bills.
  • Modifed bill and reminder templates to support VAT percentage
@annttu annttu merged commit 4136cd0 into kapsiry:master
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Commits on Dec 18, 2013
  1. @guaq
Commits on Dec 25, 2013
  1. @annttu
This page is out of date. Refresh to see the latest.
View
115 membership/migrations/0003_auto__add_field_fee_vat_percentage.py
@@ -0,0 +1,115 @@
+# -*- coding: utf-8 -*-
+import datetime
+from south.db import db
+from south.v2 import SchemaMigration
+from django.db import models
+
+
+class Migration(SchemaMigration):
+
+ def forwards(self, orm):
+ # Adding field 'Fee.vat_percentage'
+ db.add_column('membership_fee', 'vat_percentage',
+ self.gf('django.db.models.fields.IntegerField')(default=0),
+ keep_default=False)
+
+
+ def backwards(self, orm):
+ # Deleting field 'Fee.vat_percentage'
+ db.delete_column('membership_fee', 'vat_percentage')
+
+
+ models = {
+ 'membership.applicationpoll': {
+ 'Meta': {'object_name': 'ApplicationPoll'},
+ 'answer': ('django.db.models.fields.CharField', [], {'max_length': '512'}),
+ 'date': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'membership': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['membership.Membership']"})
+ },
+ 'membership.bill': {
+ 'Meta': {'object_name': 'Bill'},
+ 'billingcycle': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['membership.BillingCycle']"}),
+ 'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
+ 'due_date': ('django.db.models.fields.DateTimeField', [], {}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'last_changed': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}),
+ 'reminder_count': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
+ 'type': ('django.db.models.fields.CharField', [], {'default': "'E'", 'max_length': '1'})
+ },
+ 'membership.billingcycle': {
+ 'Meta': {'object_name': 'BillingCycle'},
+ 'end': ('django.db.models.fields.DateTimeField', [], {}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'is_paid': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'membership': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['membership.Membership']"}),
+ 'reference_number': ('django.db.models.fields.CharField', [], {'max_length': '64'}),
+ 'start': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2013, 12, 18, 0, 0)'}),
+ 'sum': ('django.db.models.fields.DecimalField', [], {'max_digits': '6', 'decimal_places': '2'})
+ },
+ 'membership.contact': {
+ 'Meta': {'object_name': 'Contact'},
+ 'country': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
+ 'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
+ 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}),
+ 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'blank': 'True'}),
+ 'given_names': ('django.db.models.fields.CharField', [], {'max_length': '128', 'blank': 'True'}),
+ 'homepage': ('django.db.models.fields.URLField', [], {'max_length': '200', 'blank': 'True'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'last_changed': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}),
+ 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'blank': 'True'}),
+ 'organization_name': ('django.db.models.fields.CharField', [], {'max_length': '256', 'blank': 'True'}),
+ 'phone': ('django.db.models.fields.CharField', [], {'max_length': '64'}),
+ 'post_office': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
+ 'postal_code': ('django.db.models.fields.CharField', [], {'max_length': '10'}),
+ 'sms': ('django.db.models.fields.CharField', [], {'max_length': '64', 'blank': 'True'}),
+ 'street_address': ('django.db.models.fields.CharField', [], {'max_length': '128'})
+ },
+ 'membership.fee': {
+ 'Meta': {'object_name': 'Fee'},
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'start': ('django.db.models.fields.DateTimeField', [], {}),
+ 'sum': ('django.db.models.fields.DecimalField', [], {'max_digits': '6', 'decimal_places': '2'}),
+ 'type': ('django.db.models.fields.CharField', [], {'max_length': '1'}),
+ 'vat_percentage': ('django.db.models.fields.IntegerField', [], {})
+ },
+ 'membership.membership': {
+ 'Meta': {'object_name': 'Membership'},
+ 'approved': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
+ 'billing_contact': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'billing_set'", 'null': 'True', 'to': "orm['membership.Contact']"}),
+ 'birth_year': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}),
+ 'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
+ 'dissociated': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
+ 'dissociation_requested': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
+ 'extra_info': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'last_changed': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}),
+ 'locked': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
+ 'municipality': ('django.db.models.fields.CharField', [], {'max_length': '128', 'blank': 'True'}),
+ 'nationality': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
+ 'organization': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'organization_set'", 'null': 'True', 'to': "orm['membership.Contact']"}),
+ 'organization_registration_number': ('django.db.models.fields.CharField', [], {'max_length': '15', 'null': 'True', 'blank': 'True'}),
+ 'person': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'person_set'", 'null': 'True', 'to': "orm['membership.Contact']"}),
+ 'public_memberlist': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'status': ('django.db.models.fields.CharField', [], {'default': "'N'", 'max_length': '1'}),
+ 'tech_contact': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'tech_contact_set'", 'null': 'True', 'to': "orm['membership.Contact']"}),
+ 'type': ('django.db.models.fields.CharField', [], {'max_length': '1'})
+ },
+ 'membership.payment': {
+ 'Meta': {'object_name': 'Payment'},
+ 'amount': ('django.db.models.fields.DecimalField', [], {'max_digits': '9', 'decimal_places': '2'}),
+ 'billingcycle': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['membership.BillingCycle']", 'null': 'True'}),
+ 'comment': ('django.db.models.fields.CharField', [], {'max_length': '64', 'null': 'True'}),
+ 'duplicate': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'ignore': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'message': ('django.db.models.fields.CharField', [], {'max_length': '256', 'blank': 'True'}),
+ 'payer_name': ('django.db.models.fields.CharField', [], {'max_length': '64'}),
+ 'payment_day': ('django.db.models.fields.DateTimeField', [], {}),
+ 'reference_number': ('django.db.models.fields.CharField', [], {'max_length': '64', 'blank': 'True'}),
+ 'transaction_id': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}),
+ 'type': ('django.db.models.fields.CharField', [], {'max_length': '64'})
+ }
+ }
+
+ complete_apps = ['membership']
View
23 membership/models.py
@@ -490,9 +490,11 @@ class Fee(models.Model):
type = models.CharField(max_length=1, choices=MEMBER_TYPES, verbose_name=_('Fee type'))
start = models.DateTimeField(_('Valid from date'))
sum = models.DecimalField(_('Sum'), max_digits=6, decimal_places=2)
+ vat_percentage = models.IntegerField(_('VAT percentage'))
def __unicode__(self):
- return "Fee for %s, %s euros, %s--" % (self.get_type_display(), str(self.sum), str(self.start))
+ return "Fee for %s, %s euros, %s%% VAT, %s--" % \
+ (self.get_type_display(), str(self.sum), str(self.vat_percentage), str(self.start))
class BillingCycleManager(models.Manager):
@@ -609,6 +611,13 @@ def get_fee(self):
valid_fee = fees.latest('start').sum
return valid_fee
+ def get_vat_percentage(self):
+ for_this_type = Q(type=self.membership.type)
+ not_before_start = Q(start__lte=self.start)
+ fees = Fee.objects.filter(for_this_type, not_before_start)
+ vat_percentage = fees.latest('start').vat_percentage
+ return vat_percentage
+
def __unicode__(self):
return str(self.start.date()) + "--" + str(self.end.date())
@@ -651,8 +660,13 @@ def is_reminder(self):
# FIXME: different template based on class? should this code be here?
def render_as_text(self):
+ """
+ Renders the object as text suitable for sending as e-mail.
+ """
membership = self.billingcycle.membership
+ vat = Decimal(self.billingcycle.get_vat_percentage()) / Decimal(100)
if not self.is_reminder():
+ non_vat_amount = (self.billingcycle.sum / (Decimal(1) + vat))
return render_to_string('membership/bill.txt', {
'membership_type' : MEMBER_TYPES_DICT[membership.type],
'membership_type_raw' : membership.type,
@@ -672,6 +686,9 @@ def render_as_text(self):
'today': datetime.now(),
'reference_number': group_right(self.billingcycle.reference_number),
'sum': self.billingcycle.sum,
+ 'vat_amount': vat * non_vat_amount,
+ 'non_vat_amount': non_vat_amount,
+ 'vat_percentage': self.billingcycle.get_vat_percentage(),
'barcode': barcode_4(iban = settings.IBAN_ACCOUNT_NUMBER,
refnum = self.billingcycle.reference_number,
duedate = self.due_date,
@@ -680,6 +697,7 @@ def render_as_text(self):
else:
amount_paid = self.billingcycle.amount_paid()
sum = self.billingcycle.sum - amount_paid
+ non_vat_sum = sum / (Decimal(1) + vat)
return render_to_string('membership/reminder.txt', {
'membership_type' : MEMBER_TYPES_DICT[membership.type],
'membership_type_raw' : membership.type,
@@ -703,6 +721,9 @@ def render_as_text(self):
'original_sum': self.billingcycle.sum,
'amount_paid': amount_paid,
'sum': sum,
+ 'vat_amount': vat * non_vat_sum,
+ 'non_vat_amount': non_vat_sum,
+ 'vat_percentage': self.billingcycle.get_vat_percentage(),
'barcode': barcode_4(iban = settings.IBAN_ACCOUNT_NUMBER,
refnum = self.billingcycle.reference_number,
duedate = None,
View
9 membership/templates/membership/bill.txt
@@ -19,9 +19,10 @@ PL 11
Laskun erittely
----------------------------------------------------------------------
-Jäsenmaksu {{ membership_type|ljust:"15" }} {{ billingcycle.start|date:"SHORT_DATE_FORMAT" }} - {{ billingcycle.end|date:"SHORT_DATE_FORMAT" }} {{ sum|rjust:"5"}} e
+Jäsenmaksu {{ membership_type|ljust:"15" }} {{ billingcycle.start|date:"SHORT_DATE_FORMAT" }} - {{ billingcycle.end|date:"SHORT_DATE_FORMAT" }} {{ non_vat_amount|rjust:"5"|floatformat:2 }} euroa
+Arvonlisävero {{ vat_percentage|ljust:"3"|floatformat:0 }} % {{ vat_amount|rjust:"5"|floatformat:2 }} euroa
----------------------------------------------------------------------
-Loppusumma yhteensä {{ sum|rjust:"5"}} e
+Loppusumma yhteensä {{ sum|rjust:"5"|floatformat:2 }} e
Maksaminen
----------------------------------------------------------------------
@@ -35,9 +36,6 @@ Virtuaaliviivakoodi: {{ barcode }}
Viitenumeroa on ehdottomasti käytettävä maksaessa jotta maksu
kohdistuisi oikein!
-Voit myös maksaa enemmän, jolloin ylimenevä osuus tulkitaan
-lahjoitukseksi.
-
Laskuttaja
----------------------------------------------------------------------
Kapsi Internet-käyttäjät ry
@@ -45,6 +43,7 @@ PL 11
90571 OULU
Sähköposti: laskutus@tuki.kapsi.fi
Yhdistysrekisterinumero: 187.418
+Y-tunnus: 2447894-9
Huomautukset laskusta on tehtävä kirjallisesti kahdeksan (8) päivän
kuluessa laskun päivämäärästä. Maksun suorittamatta jättäminen
View
10 membership/templates/membership/reminder.txt
@@ -43,10 +43,11 @@ Kotipaikka: {{ municipality|ljust:"30" }}
Muistutettavat jäsenmaksut:
--------------------------------------------------------------------
-Jäsenmaksu {{ membership_type|ljust:"15" }} {{ billingcycle.start|date:"SHORT_DATE_FORMAT" }} - {{ billingcycle.end|date:"SHORT_DATE_FORMAT" }} {{ original_sum|rjust:"5"}} e{% if amount_paid %}
-Aiemmat suoritukset {{ amount_paid|rjust:"5"}} e{% endif %}
+Jäsenmaksu {{ membership_type|ljust:"15" }} {{ billingcycle.start|date:"SHORT_DATE_FORMAT" }} - {{ billingcycle.end|date:"SHORT_DATE_FORMAT" }} {{ non_vat_amount|rjust:"5"|floatformat:2}} euroa
+Arvonlisävero {{ vat_percentage|ljust:"3"|floatformat:0 }} % {{ vat_amount|rjust:"5"|floatformat:2 }} euroa{% if amount_paid %}
+Aiemmat suoritukset {{ amount_paid|rjust:"5"}} euroa{% endif %}
--------------------------------------------------------------------
- {{ sum|rjust:"5"}} e
+ {{ sum|rjust:"5"}} euroa
@@ -77,6 +78,7 @@ PL 11
90571 OULU
Sähköposti: laskutus@tuki.kapsi.fi
Yhdistysrekisterinumero: 187.418
+Y-tunnus: 2447894-9
____________________________________________________________________
@@ -91,5 +93,5 @@ TAPAHTUMAT
(Tapahtumalistaa ei vielä saatavilla)
---
+--
Kapsin laskutus <laskutus@tuki.kapsi.fi>
View
86 membership/tests.py
@@ -255,20 +255,32 @@ def test_fees(self):
H_FEE=0
soon = datetime.now() + timedelta(hours=1)
# Old fees
- Fee.objects.create(type='P', start=week_ago, sum=P_FEE/2)
- Fee.objects.create(type='O', start=week_ago, sum=O_FEE/2)
- Fee.objects.create(type='S', start=week_ago, sum=S_FEE/2)
- Fee.objects.create(type='H', start=week_ago, sum=H_FEE/2)
+ Fee.objects.create(type='P', start=week_ago, sum=P_FEE/2,
+ vat_percentage=24)
+ Fee.objects.create(type='O', start=week_ago, sum=O_FEE/2,
+ vat_percentage=24)
+ Fee.objects.create(type='S', start=week_ago, sum=S_FEE/2,
+ vat_percentage=24)
+ Fee.objects.create(type='H', start=week_ago, sum=H_FEE/2,
+ vat_percentage=24)
# Real fees
- p_fee = Fee.objects.create(type='P', start=now, sum=P_FEE)
- o_fee = Fee.objects.create(type='O', start=now, sum=O_FEE)
- s_fee = Fee.objects.create(type='S', start=now, sum=S_FEE)
- h_fee = Fee.objects.create(type='H', start=now, sum=H_FEE)
+ p_fee = Fee.objects.create(type='P', start=now, sum=P_FEE,
+ vat_percentage=24)
+ o_fee = Fee.objects.create(type='O', start=now, sum=O_FEE,
+ vat_percentage=24)
+ s_fee = Fee.objects.create(type='S', start=now, sum=S_FEE,
+ vat_percentage=24)
+ h_fee = Fee.objects.create(type='H', start=now, sum=H_FEE,
+ vat_percentage=24)
# Future fees that must not interfere
- Fee.objects.create(type='P', start=soon, sum=P_FEE*2)
- Fee.objects.create(type='O', start=soon, sum=O_FEE*2)
- Fee.objects.create(type='S', start=soon, sum=S_FEE*2)
- Fee.objects.create(type='H', start=soon, sum=H_FEE*2)
+ Fee.objects.create(type='P', start=soon, sum=P_FEE*2,
+ vat_percentage=24)
+ Fee.objects.create(type='O', start=soon, sum=O_FEE*2,
+ vat_percentage=24)
+ Fee.objects.create(type='S', start=soon, sum=S_FEE*2,
+ vat_percentage=24)
+ Fee.objects.create(type='H', start=soon, sum=H_FEE*2,
+ vat_percentage=24)
makebills()
c_p = BillingCycle.objects.get(membership__type='P')
c_o = BillingCycle.objects.get(membership__type='O')
@@ -861,11 +873,11 @@ def test_dash_delimiter_begins_with_plus(self):
class OrganizationRegistratioTest(TestCase):
def setUp(self):
self.field = OrganizationRegistrationNumber()
-
+
def test_valid(self):
self.assertEqual(u"1.11", self.field.clean(u"1.11"))
self.assertEqual(u"123.123", self.field.clean(u"123.123"))
-
+
def test_invalid(self):
self.assertRaises(ValidationError, self.field.clean, "str.str")
self.assertRaises(ValidationError, self.field.clean, "11111")
@@ -1285,3 +1297,49 @@ def test_membership_found_for_late_paper_reminder(self):
self.assertEquals(2, len(qs))
self.assertIn(self.m, qs)
self.assertIn(self.m2, qs)
+
+
+class CorrectVatAmountInBillTest(TestCase):
+ """
+ Test with cycle starting in 2013 and 2014. 2013 should have VAT 0% while
+ 2013 24%.
+
+ SingleMemberBillingTest has an example of how to catch e-mails.
+ """
+ fixtures = ['membership_fees.json', 'test_user.json']
+
+ def setUp(self):
+ #settings.BILLING_CC_EMAIL = None
+ self.user = User.objects.get(id=1)
+
+ self.m = create_dummy_member('N')
+ self.m.save()
+ self.m.preapprove(self.user)
+ self.m.approve(self.user)
+
+ cycle_start = datetime(year=2012, month=10, day=10)
+ self.cycle = BillingCycle(membership=self.m, start=cycle_start)
+ self.cycle.save()
+ cycle_start_2014 = datetime(year=2014, month=1, day=10)
+ self.cycle_2014 = BillingCycle(membership=self.m,
+ start=cycle_start_2014)
+ self.cycle_2014.save()
+ self.bill_2013 = Bill(billingcycle=self.cycle, type='P',
+ due_date=cycle_start)
+ self.bill_2014 = Bill(billingcycle=self.cycle_2014, type='P',
+ due_date=cycle_start_2014)
+ #mail.outbox = []
+
+ def tearDown(self):
+
+ #self.bill_2014.delete()
+ #self.bill_2013.delete()
+ self.cycle.delete()
+ self.cycle_2014.delete()
+ self.m.delete()
+
+ def test_should_contain_vat_percentage(self):
+ self.assertIn("vero 24", self.bill_2014.render_as_text())
+
+ def test_should_not_contain_vat_percentage(self):
+ self.assertNotIn("vero 24", self.bill_2013.render_as_text())
View
96 sikteeri/membership_fees.json
@@ -1,74 +1,122 @@
[
{
- "pk": 1,
+ "pk": 1,
"model": "membership.fee",
"fields": {
"type": "P",
- "start": "2003-01-01 00:00:00",
- "sum": "30.00"
+ "start": "2003-01-01 00:00:00",
+ "sum": "30.00",
+ "vat_percentage": "0"
}
},
{
- "pk": 2,
+ "pk": 2,
"model": "membership.fee",
"fields": {
"type": "O",
- "start": "2003-01-01 00:00:00",
- "sum": "100.00"
+ "start": "2003-01-01 00:00:00",
+ "sum": "100.00",
+ "vat_percentage": "0"
}
},
{
- "pk": 3,
+ "pk": 3,
"model": "membership.fee",
"fields": {
"type": "S",
- "start": "2003-01-01 00:00:00",
- "sum": "100.00"
+ "start": "2003-01-01 00:00:00",
+ "sum": "100.00",
+ "vat_percentage": "0"
}
},
{
- "pk": 4,
+ "pk": 4,
"model": "membership.fee",
"fields": {
"type": "H",
- "start": "2003-01-01 00:00:00",
- "sum": "0.00"
+ "start": "2003-01-01 00:00:00",
+ "sum": "0.00",
+ "vat_percentage": "0"
}
},
{
- "pk": 5,
+ "pk": 5,
"model": "membership.fee",
"fields": {
"type": "P",
- "start": "2011-01-01 00:00:00",
- "sum": "35.00"
+ "start": "2011-01-01 00:00:00",
+ "sum": "35.00",
+ "vat_percentage": "0"
}
},
{
- "pk": 6,
+ "pk": 6,
"model": "membership.fee",
"fields": {
"type": "O",
- "start": "2011-01-01 00:00:00",
- "sum": "60.00"
+ "start": "2011-01-01 00:00:00",
+ "sum": "60.00",
+ "vat_percentage": "0"
}
},
{
- "pk": 7,
+ "pk": 7,
"model": "membership.fee",
"fields": {
"type": "S",
- "start": "2011-01-01 00:00:00",
- "sum": "250.00"
+ "start": "2011-01-01 00:00:00",
+ "sum": "250.00",
+ "vat_percentage": "0"
}
},
{
- "pk": 8,
+ "pk": 8,
"model": "membership.fee",
"fields": {
"type": "H",
- "start": "2011-01-01 00:00:00",
- "sum": "0.00"
+ "start": "2011-01-01 00:00:00",
+ "sum": "0.00",
+ "vat_percentage": "0"
+ }
+ },
+ {
+ "pk": 9,
+ "model": "membership.fee",
+ "fields": {
+ "type": "P",
+ "start": "2014-01-01 00:00:00",
+ "sum": "40.00",
+ "vat_percentage": "24"
+ }
+ },
+ {
+ "pk": 10,
+ "model": "membership.fee",
+ "fields": {
+ "type": "O",
+ "start": "2014-01-01 00:00:00",
+ "sum": "60.00",
+ "vat_percentage": "24"
+ }
+ },
+ {
+ "pk": 11,
+ "model": "membership.fee",
+ "fields": {
+ "type": "S",
+ "start": "2014-01-01 00:00:00",
+ "sum": "250.00",
+ "vat_percentage": "24"
+ }
+ },
+ {
+ "pk": 12,
+ "model": "membership.fee",
+ "fields": {
+ "type": "H",
+ "start": "2014-01-01 00:00:00",
+ "sum": "0.00",
+ "vat_percentage": "24"
}
}
]
Something went wrong with that request. Please try again.