Changeset - b613a5072cbd
[Not reviewed]
0 3 0
Brett Smith - 4 years ago 2019-11-11 19:30:05
brettcsmith@brettcsmith.org
Initial code to report VAT on invoices.
3 files changed with 26 insertions and 1 deletions:
0 comments (0 inline, 0 general)
pinaxcon/settings.py
Show inline comments
 
import os
 
import dj_database_url
 

	
 
from decimal import Decimal
 

	
 
PROJECT_ROOT = os.path.abspath(os.path.join(os.path.dirname(__file__), os.pardir))
 
PACKAGE_ROOT = os.path.abspath(os.path.dirname(__file__))
 
BASE_DIR = PACKAGE_ROOT
 

	
 
DEBUG = bool(int(os.environ.get("DJANGO_DEBUG", "1")))
 

	
 
UNPREPEND_WWW = bool(int(os.environ.get("DJANGO_UNPREPEND_WWW", "0")))
 

	
 
APPEND_SLASH = True
 

	
 
# HEROKU: Update database configuration with $DATABASE_URL.
...
 
@@ -306,20 +307,27 @@ SYMPOSION_SPEAKER_FORM = "pinaxcon.proposals.forms.ConferenceSpeakerForm"
 
# Registrasion Attendee profile model
 
ATTENDEE_PROFILE_MODEL = "pinaxcon.registrasion.models.AttendeeProfile"
 
# Registrasion attendee profile form -- must act on ATTENDEE_PROFILE_FORM
 
# You only need to provide this if you're customising the form from the default
 
# ATTENDEE_PROFILE_FORM = "pinaxcon.registrasion.forms.ProfileForm"
 

	
 
# Ticket product category -- used to identify which products must be available
 
# in order to register.
 
TICKET_PRODUCT_CATEGORY = 1
 

	
 
INVOICE_CURRENCY = "USD"
 

	
 
# VAT rate is 21%
 
# When PINAX_VAT_RATE is set, this percentage of the invoice total is
 
# displayed as a line item as the amount of VAT paid.
 
INVOICE_VAT_RATE = Decimal(os.environ.get('PINAX_VAT_RATE') or 0)
 
if INVOICE_VAT_RATE > 1:
 
    INVOICE_VAT_RATE /= 100
 

	
 
MARKDOWN_DEUX_STYLES = {
 
    "default": {
 
        "safe_mode": False,
 
        "extras": {
 
            "tables": 1,
 
        }
 
    },
 
}
pinaxcon/templates/registrasion/invoice/details.html
Show inline comments
...
 
@@ -29,24 +29,31 @@
 
  {% if invoice.is_unpaid %}
 
    This is a registration summary for CopyleftConf 2020. It is not confirmed until paid in full.
 
  {% elif invoice.is_void %}
 
    This is a void registration summary for CopyleftConf 2020. It is provided for informational purposes only.
 
  {% elif invoice.is_refunded %}
 
    This is a refunded registration summary for CopyleftConf 2020. It is provided for informational purposes only.
 
  {% elif invoice.is_paid %}
 
    This is a confirmed registration summary for CopyleftConf 2020.
 
  {% endif %}
 
{% endblock %}
 

	
 
{% block extra_line_items_after_total %}
 
  {% vat_amount(invoice) as vat %}
 
  {% if vat %}
 
    <tr>
 
      <td colspan="3">Includes {{ vat_rate }} VAT:</td>
 
      <td class="text-right">${{ vat }}</td>
 
    </tr>
 
  {% endif %}
 
  {% donation_income invoice as donation %}
 
  {% if donation %}
 
    <tr>
 
      <td colspan="3">Includes donation eligible for tax deduction in the USA:</td>
 
      <td class="text-right">${{ donation }}</td>
 
    </tr>
 
  {% endif %}
 
{% endblock %}
 

	
 
{% block contact_info %}
 
  <p>Direct inquiries to <a href="mailto:contact@copyleftconf.org">contact@copyleftconf.org</a></p>
 
  <p>CopyleftConf is run by <a href="https://sfconservancy.org">Software Freedom Conservancy</a>, a 501(c)(3) not-for-profit public charity registered in New York. Software Freedom Conservancy's federal tax-exempt EIN is 41-2203632.</p>
pinaxcon/templatetags/nbpy_tags.py
Show inline comments
...
 
@@ -2,24 +2,34 @@ from registrasion.models import commerce
 
from registrasion.controllers.category import CategoryController
 
from registrasion.controllers.item import ItemController
 
from registrasion.templatetags import registrasion_tags
 

	
 
from decimal import Decimal
 
from django import template
 
from django.conf import settings
 
from django.db.models import Sum
 
from urllib import urlencode  # TODO: s/urllib/six.moves.urllib/
 

	
 
register = template.Library()
 

	
 
CENTS_QUANT = Decimal('.01')
 
VAT_RATE = str(settings.INVOICE_VAT_RATE * 100).rstrip('.0') + '%'
 

	
 
@register.simple_tag
 
def vat_amount(invoice):
 
    return (invoice.value * settings.INVOICE_VAT_RATE).quantize(CENTS_QUANT)
 

	
 
@register.simple_tag
 
def vat_rate():
 
    return VAT_RATE
 

	
 
@register.simple_tag(takes_context=True)
 
def donation_income(context, invoice):
 
    ''' Calculates the donation income for a given invoice.
 

	
 
    Returns:
 
        the donation income.
 

	
 
    '''
 

	
 
    # 15% (FSA) goes to Conservancy; 85% is real goods
 

	
...
 
@@ -33,25 +43,25 @@ def donation_income(context, invoice):
 
            if line.product.name.startswith("Unaffiliated Individual"):
 
                # Includes full price & discounts
 
                rbi.append(line.total_price * fsa_rate)
 
            else:
 
                if line.total_price > 0:
 
                    rbi.append(rbi_full_ticket)
 
                elif line.total_price < 0:
 
                    rbi.append(rbi_early_bird_discount)
 
        elif line.product.category.name == "T-Shirt":
 
            rbi.append(line.total_price * fsa_rate)
 

	
 
    donation = max(Decimal('0'), (invoice.value - sum(rbi)))
 
    return donation.quantize(Decimal('.01'))
 
    return donation.quantize(CENTS_QUANT)
 

	
 

	
 
# TODO: include van/de/van der/de la/etc etc etc
 

	
 
@register.simple_tag
 
def name_split(name, split_characters=None):
 

	
 
    tokens = name.split()
 
    if split_characters is None or len(name) > split_characters:
 
        even_split = int((len(tokens) + 1) / 2)  # Round up.
 
    else:
 
        even_split = len(tokens)
0 comments (0 inline, 0 general)