Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

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 from
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.