From 83e2a0cda9c82bb987fcd036b812365670e2fbb5 Mon Sep 17 00:00:00 2001 From: Mark Riedesel Date: Wed, 30 Mar 2011 21:17:00 -0500 Subject: [PATCH] added the first 3 record definitions --- .gitignore | 1 + fields.py | 38 +++++++++++++++-- record.py | 121 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 157 insertions(+), 3 deletions(-) create mode 100644 .gitignore create mode 100644 record.py diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..0d20b64 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +*.pyc diff --git a/fields.py b/fields.py index 790710e..801edce 100644 --- a/fields.py +++ b/fields.py @@ -5,11 +5,12 @@ class ValidationError(Exception): class Field(object): 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._value = None self.max_length = max_length self.required = required + self.uppercase = uppercase self.creation_counter = Field.creation_counter Field.creation_counter += 1 @@ -30,7 +31,6 @@ class Field(object): def __repr__(self): return self.name - class TextField(Field): def validate(self): if self.value == None and self.required: @@ -39,12 +39,44 @@ class TextField(Field): raise ValidationError("value is too long") 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): def __init__(self, name=None, required=True): 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): def validate(self): if self.value == None and self.required: diff --git a/record.py b/record.py new file mode 100644 index 0000000..f86592f --- /dev/null +++ b/record.py @@ -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) + + +