added the first 3 record definitions
This commit is contained in:
parent
e12557db2d
commit
83e2a0cda9
3 changed files with 157 additions and 3 deletions
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
|
@ -0,0 +1 @@
|
||||||
|
*.pyc
|
38
fields.py
38
fields.py
|
@ -5,11 +5,12 @@ class ValidationError(Exception):
|
||||||
class Field(object):
|
class Field(object):
|
||||||
creation_counter = 0
|
creation_counter = 0
|
||||||
|
|
||||||
def __init__(self, name=None, max_length=0, required=True):
|
def __init__(self, name=None, max_length=0, required=True, uppercase=True):
|
||||||
self.name = name
|
self.name = name
|
||||||
self._value = None
|
self._value = None
|
||||||
self.max_length = max_length
|
self.max_length = max_length
|
||||||
self.required = required
|
self.required = required
|
||||||
|
self.uppercase = uppercase
|
||||||
self.creation_counter = Field.creation_counter
|
self.creation_counter = Field.creation_counter
|
||||||
Field.creation_counter += 1
|
Field.creation_counter += 1
|
||||||
|
|
||||||
|
@ -30,7 +31,6 @@ class Field(object):
|
||||||
def __repr__(self):
|
def __repr__(self):
|
||||||
return self.name
|
return self.name
|
||||||
|
|
||||||
|
|
||||||
class TextField(Field):
|
class TextField(Field):
|
||||||
def validate(self):
|
def validate(self):
|
||||||
if self.value == None and self.required:
|
if self.value == None and self.required:
|
||||||
|
@ -39,12 +39,44 @@ class TextField(Field):
|
||||||
raise ValidationError("value is too long")
|
raise ValidationError("value is too long")
|
||||||
|
|
||||||
def get_data(self):
|
def get_data(self):
|
||||||
return (self.value or "").encode('ascii').ljust(self.max_length)
|
value = self.value or ""
|
||||||
|
if self.uppercase:
|
||||||
|
value = value.upper()
|
||||||
|
return value.ljust(self.max_length).encode('ascii')
|
||||||
|
|
||||||
class StateField(TextField):
|
class StateField(TextField):
|
||||||
def __init__(self, name=None, required=True):
|
def __init__(self, name=None, required=True):
|
||||||
return super(StateField, self).__init__(name=name, max_length=2, required=required)
|
return super(StateField, self).__init__(name=name, max_length=2, required=required)
|
||||||
|
|
||||||
|
class EmailField(TextField):
|
||||||
|
def __init__(self, name=None, required=True, max_length=None):
|
||||||
|
return super(EmailField, self).__init__(name=name, max_length=max_length,
|
||||||
|
required=required, uppercase=False)
|
||||||
|
class NumericField(TextField):
|
||||||
|
def validate(self):
|
||||||
|
super(NumericField, self).validate()
|
||||||
|
try:
|
||||||
|
int(self.value)
|
||||||
|
except ValueError:
|
||||||
|
raise ValidationError("field contains non-numeric characters")
|
||||||
|
|
||||||
|
class StaticField(TextField):
|
||||||
|
def __init__(self, name=None, required=True, value=None):
|
||||||
|
super(StaticField, self).__init__(name=name, required=required,
|
||||||
|
max_length=len(value))
|
||||||
|
self._value = value
|
||||||
|
|
||||||
|
class BlankField(TextField):
|
||||||
|
def get_data(self):
|
||||||
|
return " " * self.max_length
|
||||||
|
|
||||||
|
class BooleanField(Field):
|
||||||
|
def validate(self):
|
||||||
|
pass
|
||||||
|
|
||||||
|
def get_data(self):
|
||||||
|
return '1' if self._value else '0'
|
||||||
|
|
||||||
class MoneyField(Field):
|
class MoneyField(Field):
|
||||||
def validate(self):
|
def validate(self):
|
||||||
if self.value == None and self.required:
|
if self.value == None and self.required:
|
||||||
|
|
121
record.py
Normal file
121
record.py
Normal file
|
@ -0,0 +1,121 @@
|
||||||
|
from fields import *
|
||||||
|
import model
|
||||||
|
|
||||||
|
class SubmitterRecord(model.Model):
|
||||||
|
record_identifier = StaticField(value='ra')
|
||||||
|
submitter_ein = NumericField(max_length=9)
|
||||||
|
user_id = TextField(max_length=8)
|
||||||
|
software_vendor = TextField(max_length=4)
|
||||||
|
blank1 = BlankField(max_length=5)
|
||||||
|
resub_indictator = BooleanField()
|
||||||
|
resub_identifier = TextField(max_length=6, required=False)
|
||||||
|
software_code = StaticField(value='98') # In-house program
|
||||||
|
company_name = TextField(max_length=57)
|
||||||
|
company_address = TextField(max_length=22)
|
||||||
|
company_delivery_address = TextField(max_length=22)
|
||||||
|
company_city = TextField(max_length=22)
|
||||||
|
company_state = StateField()
|
||||||
|
company_zipcode = TextField(max_length=5)
|
||||||
|
company_zipcode_ext = TextField(max_length=4, required=False)
|
||||||
|
blank2 = BlankField(max_length=5)
|
||||||
|
company_foreign_state_province= TextField(max_length=23, required=False)
|
||||||
|
company_foreign_postal_code = TextField(max_length=15, required=False)
|
||||||
|
company_country_code = TextField(max_length=2)
|
||||||
|
submitter_name = TextField(max_length=57)
|
||||||
|
submitter_address = TextField(max_length=22)
|
||||||
|
submitter_delivery_address = TextField(max_length=22)
|
||||||
|
submitter_city = TextField(max_length=22)
|
||||||
|
submitter_state = StateField()
|
||||||
|
submitter_zipcode = TextField(max_length=5)
|
||||||
|
submitter_zipcode_ext = TextField(max_length=4, required=False)
|
||||||
|
blank3 = BlankField(max_length=5)
|
||||||
|
submitter_foreign_state_province = TextField(max_length=23, required=False)
|
||||||
|
submitter_foreign_postal_code = TextField(max_length=15, required=False)
|
||||||
|
submitter_country_code = TextField(max_length=2)
|
||||||
|
contact_name = TextField(max_length=27)
|
||||||
|
contact_phone = TextField(max_length=15)
|
||||||
|
contact_phone_ext = TextField(max_length=5, required=False)
|
||||||
|
blank4 = BlankField(max_length=3)
|
||||||
|
contact_email = EmailField(max_length=40)
|
||||||
|
blank5 = BlankField(max_length=3)
|
||||||
|
contact_fax = TextField(max_length=10, required=False)
|
||||||
|
preferred_notification = TextField(max_length=1)
|
||||||
|
preparer_code = TextField(max_length=1)
|
||||||
|
blank6 = BlankField(max_length=12)
|
||||||
|
|
||||||
|
class EmployerRecord(model.Model):
|
||||||
|
record_identifier = StaticField(value='re')
|
||||||
|
tax_year = NumericField(max_length=4)
|
||||||
|
agent_indicator = NumericField(max_length=1)
|
||||||
|
employer_ein = TextField(max_length=9)
|
||||||
|
agent_for_ein = TextField(max_length=9, required=False)
|
||||||
|
terminating_business_indicator = BooleanField()
|
||||||
|
establishment_number = TextField(max_length=4, required=False)
|
||||||
|
other_ein = TextField(max_length=9, required=False)
|
||||||
|
employer_name = TextField(max_length=57)
|
||||||
|
location_address = TextField(max_length=22)
|
||||||
|
delivery_address = TextField(max_length=22)
|
||||||
|
city = TextField(max_length=22)
|
||||||
|
state = StateField()
|
||||||
|
zipcode = TextField(max_length=5)
|
||||||
|
zipcode_ext = TextField(max_length=4, required=False)
|
||||||
|
blank1 = BlankField(max_length=5)
|
||||||
|
foreign_state_province = TextField(max_length=23)
|
||||||
|
foreign_postal_code = TextField(max_length=15)
|
||||||
|
country_code = TextField(max_length=2, required=False)
|
||||||
|
employment_code = TextField(max_length=1)
|
||||||
|
tax_jurisdiction_code = TextField(max_length=1)
|
||||||
|
third_party_sick_pay = BooleanField()
|
||||||
|
blank2 = BlankField(max_length=291)
|
||||||
|
|
||||||
|
class EmployeeWageRecord(model.Model):
|
||||||
|
record_identifier = StaticField(value='rw')
|
||||||
|
ssn = NumericField(max_length=9, required=False)
|
||||||
|
employee_first_name = TextField(max_length=15)
|
||||||
|
employee_middle_name = TextField(max_length=15)
|
||||||
|
employee_last_name = TextField(max_length=20)
|
||||||
|
employee_suffix = TextField(max_length=4)
|
||||||
|
location_address = TextField(max_length=22)
|
||||||
|
delivery_address = TextField(max_length=22)
|
||||||
|
city = TextField(max_length=22)
|
||||||
|
state = StateField()
|
||||||
|
zipcode = TextField(max_length=5, required=False)
|
||||||
|
zipcode_ext = TextField(max_length=4, required=False)
|
||||||
|
blank1 = BlankField(max_length=5)
|
||||||
|
foreign_state = TextField(max_length=23, required=False)
|
||||||
|
foreign_postal_code = TextField(max_length=15, required=False)
|
||||||
|
country = TextField(max_length=2)
|
||||||
|
wages_tips = NumericField(max_length=11)
|
||||||
|
federal_income_tax_withheld = NumericField(max_length=11)
|
||||||
|
social_security_wages = NumericField(max_length=11)
|
||||||
|
social_security_tax_withheld = NumericField(max_length=11)
|
||||||
|
medicare_wages_and_tips = NumericField(max_length=11)
|
||||||
|
medicare_tax_withheld = NumericField(max_length=11)
|
||||||
|
social_security_tips = NumericField(max_length=11)
|
||||||
|
advance_eic = NumericField(max_length=11)
|
||||||
|
dependent_care_benefits = NumericField(max_length=11)
|
||||||
|
deferred_compensation_401k = NumericField(max_length=11)
|
||||||
|
deferred_compensation_403b = NumericField(max_length=11)
|
||||||
|
deferred_compensation_408k = NumericField(max_length=11)
|
||||||
|
deferred_compensation_457b = NumericField(max_length=11)
|
||||||
|
deferred_compensation_501c = NumericField(max_length=11)
|
||||||
|
military_pay = NumericField(max_length=11)
|
||||||
|
non_qualified_457 = NumericField(max_length=11)
|
||||||
|
employer_contrib_to_hsa = NumericField(max_length=11)
|
||||||
|
non_qualified_not_457 = NumericField(max_length=11)
|
||||||
|
nontaxable_combat_pay = NumericField(max_length=11)
|
||||||
|
blank2 = BlankField(max_length=11)
|
||||||
|
cost_of_premiums_for_insurance = NumericField(max_length=11)
|
||||||
|
income_nonstatutory_stock_opts = NumericField(max_length=11)
|
||||||
|
deferred_compensation_409a = NumericField(max_length=11)
|
||||||
|
designated_roth_contrib_401k = NumericField(max_length=11)
|
||||||
|
designated_roth_contrib_403b = NumericField(max_length=11)
|
||||||
|
blank3 = BlankField(max_length=23)
|
||||||
|
statutory_employee_indicator = BooleanField()
|
||||||
|
blank4 = BlankField(max_length=1)
|
||||||
|
retirement_plan_indicator = BooleanField()
|
||||||
|
third_party_sick_pay = BooleanField()
|
||||||
|
blank5 = BlankField(max_length=23)
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue