{# Copyright © 2020 Innovatie Ltd. All rights reserved. #} {# Payslip HTML Template. #} {# Add any department names to exclude below. Add any department names to include below; but change below 'not in filtered_departments' to 'in filtered_departments'. #} {% set filtered_departments = [] %} {% set co_pension_name = 'Pension contributions (company)' %} {% macro name_order(name) %} {{ name.split(',')|reverse|join(' ') }} {% endmacro %} {% macro name_and_address_block(name, address) %} {{ name }}
{% for line in ['line1', 'line2', 'line3', 'line4'] %} {{ emit_if(address.postaldetail[line]) }} {% endfor %} {{ emit_if(address.postaldetail.postcode) }}
{% endmacro %} {% macro emit_if(test, value='') %} {% if test != '' %} {{ value or test }}
{% endif %} {% endmacro %} {% macro emit_one(col1) %} {{ col1 }} {% endmacro %} {% macro emit_row(col1, col2) %} {{ col1 }} {{ col2 }} {% endmacro %} {% macro emit_row_if(test, col1, col2) %} {% if test %} {{ emit_row(col1, col2) }} {% endif %} {% endmacro %} {% macro label_and_value(label, value) %} {{ label }}: {{ value }} {% endmacro %} {% macro two_dp(value) %} {% if value is defined %} {{ '{:,.{}f}'.format(value|float, pay_run.places) }} {% endif %} {% endmacro %} {% macro date2human(value) %} {{ value.split('-')|reverse|join('/') }} {% endmacro %} {% macro emit_gross_pay(payslip, heading, gross_pay_item, extra_heading, extra_pay_item) %} {% set subtotal = namespace(result=0) %} {% for name, description, amount in payslip.get_pay_item_inputs(gross_pay_item) %} {% set amount = amount | float %} {{ emit_row(description, two_dp(amount)) }} {% set subtotal.result = subtotal.result + amount %} {% endfor %} {% if extra_heading %} {{ emit_row(extra_heading, two_dp(payslip.get_pay_item_output(extra_pay_item))) }} {% else %} {{ emit_row(heading, two_dp(payslip.get_pay_item_output(gross_pay_item))) }} {% endif %}
{{ heading }}
{{ heading }} {{ two_dp(subtotal.result) }}
{% endmacro %} {% macro emit_net_pay(payslip, heading, net_pay_item, ge_or_le, subtotal_heading, emit_subtotal, gross_pay_item) %} {% set subtotal = namespace(result=0) %} {% for name, description, amount in payslip.get_pay_item_inputs(net_pay_item) %} {% set amount = amount | float %} {% set ge_or_le = amount >= 0.0 if ge_or_le else amount <= 0.0 %} {% if not(ge_or_le or name in payslip.pay_items.get(gross_pay_item, {}).get('inputs', {})) %} {{ emit_row(description, two_dp(amount)) }} {% set subtotal.result = subtotal.result + amount %} {% endif %} {% endfor %} {% if subtotal_heading %} {% if emit_subtotal and subtotal.result %} {% endif %} {% else %} {{ emit_row(heading, two_dp(subtotal.result)) }} {% endif %}
{{ heading }}
{{ subtotal_heading }} {{ two_dp(subtotal.result) }}
{{ heading.upper() }} {{ two_dp(payslip.get_pay_item_output(net_pay_item)) }}
{% endmacro %} {%- block everything -%} Payslips {{ date2human(snapshot.pay_run.actual_t) }} {% set departments = dict() %} {% for n, dept in snapshot['department'].items() %} {% set x = departments.__setitem__(dept['id'], dept['name']) %} {% endfor %} {% set holiday_template = snapshot.get_items('pay_template', expect_one=False, name='Holiday') %} {% set holiday_defs = snapshot.get_items('pay_definition', expect_one=False, template=holiday_template[0][1]['id']) if holiday_template else [] %} {% set skipped = dict() %} {% set er = snapshot.company %} {% set pay_run = snapshot.pay_run %} {% for stree, ee in snapshot.employee.items()|sort(attribute='1.name') if departments[ee['department']] not in filtered_departments %} {% set payslip = snapshot.get_payslip(logger, stree) %} {% if payslip.is_not_empty %} {% set cis = ee.taxdetail.get('cis', '') %} {% if cis %} {% set heading = 'CIS Payments and Deductions ' + date2human(pay_run.actual_t) %} {% else %} {% set heading = name_order(ee.name) + date2human(pay_run.actual_t) + ' payslip' %} {% endif %}

{{ heading }} {% if not snapshot.pay_run.approved %} - Not approved{% endif %}


{{ name_and_address_block(ee.title + ' ' + name_order(ee.name), ee) }} {{ emit_if(ee.taxdetail.NI_number, label_and_value('NI number', ee.taxdetail.NI_number)) }} {% if cis %} {{ label_and_value("Unique Taxpayer reference (UTR)", ee.taxdetail.cis_utr) }}
{% if payslip.get_pay_item_input('CIS', 'Tax rate', 0) == 30 %} {{ label_and_value("Verification number", payslip.get_pay_item_input('CIS', 'Verification', '')) }}
{% endif %} {% else %} {{ label_and_value('Tax code', ee['ee_tax_basis']) }}
{% endif %} {{ label_and_value('Username', ee.username) }}
{{ name_and_address_block(er.legal_name, er) }} {{ label_and_value("PAYE Reference", er.taxdetail.employer_PAYE_reference) }}
{{ emit_if(ee.department, label_and_value('Department', departments[ee['department']])) }} {{ emit_if(ee.works_id, label_and_value('Works id', ee.works_id)) }}


{{ label_and_value('Pay period', date2human(pay_run.pay_period_first_day) + ' - ' + date2human(pay_run.pay_period_last_day)) }} {% if pay_run.frequency.startswith('m') %} {{ label_and_value('Tax month', snapshot.pay_run.tax_month) }} {% else %} {{ label_and_value('Tax week', pay_run.tax_week) }} {% endif %}
{{ emit_gross_pay(payslip, "Gross pay", "Gross pay", None, None) }} {% if cis %} {{ emit_gross_pay(payslip, "Materials", "CIS cost of materials", "Amount Liable to deduction", "Gross pay for CIS purposes") }} {% endif %} {% set add_deds_net_pay = payslip.get_pay_item_output('Addition to net pay') or payslip.get_pay_item_output('Deduction from net pay') %} {{ emit_net_pay(payslip, "Deductions", "Net pay", True, None, add_deds_net_pay, 'Gross pay') }} {{ emit_net_pay(payslip, "Net pay", "Net pay", False, "Net pay additions/deductions", add_deds_net_pay, 'Gross pay') }} {% for paytd, valuetd in payslip.employee.state.pay[''].items()|sort(attribute='0') %} {{ emit_row_if(paytd != 'ttp', paytd.replace('.YTD', ''), two_dp(valuetd)) }} {% endfor %} {% for tax in ['PAYE, Tax paid', 'NIC, Employee', 'NIC, Employer'] %} {{ emit_row_if(tax in payslip.pay_items, tax, two_dp(payslip.get_pay_item_state(tax, 'Total') | float)) }} {% endfor %} {{ emit_row_if(cis and 'CIS' in payslip.pay_items, 'Gross pay for CIS purposes', two_dp(payslip.get_pay_item_state('CIS', 'Gross pay.YTD') | float)) }} {% for stud_loan in ['SL deducted, YTD', 'PGL deducted, YTD'] %} {% if 'SL' in payslip.pay_items %} {% set sl_value = payslip.get_pay_item_state('SL', stud_loan) | float %} {{ emit_row_if(sl_value > 0, stud_loan.replace(', YTD', ''), two_dp(sl_value)) }} {% endif %} {% endfor %}
To date - this employment
{% set co_pension = payslip.get_pay_item_output(co_pension_name) %} {% if co_pension %} {{ emit_one(label_and_value(co_pension_name, two_dp(co_pension))) }} {% endif %} {% for message in payslip.messages.split('\n') %} {{ emit_one(message) }} {% endfor %} {% for str_id, holiday_def in holiday_defs %} {% if holiday_def['name'] in payslip['pay_items'] %} {{ emit_one(label_and_value('{0} booked, YTD'.format(holiday_def['name']), payslip.get_pay_item_state(holiday_def['name'], 'Booked, YTD', 0) | float)) }} {% endif %} {% endfor %} {% if cis %} {{ emit_one(label_and_value('CIS Deduction rate', '{0}%'.format(two_dp(payslip.get_pay_item_input('CIS', 'Tax rate', 0) | float)))) }} {{ emit_one("Subcontractors - Please keep this document safe") }} {% endif %}
Additional


Automated with {# Client Logo below. #}

{% else %} {% set x = skipped.__setitem__(stree, ee) %} {% endif %} {% endfor %} {% if snapshot.employee|length == skipped|length %}

Payslip {{ date2human(pay_run.actual_t) }} - No pay for this pay run

{% endif %} {%- endblock -%}