diff --git a/__init__.py b/__init__.py index 5087ffd..c72374e 100644 --- a/__init__.py +++ b/__init__.py @@ -6,16 +6,17 @@ RECORD_TYPES = [ 'EmployeeWageRecord', 'OptionalEmployeeWageRecord', 'TotalRecord', + 'StateWageRecord', 'OptionalTotalRecord', 'StateTotalRecord', - 'FinalRecord', + 'FinalRecord' ] def test(): import record, model for rname in RECORD_TYPES: inst = record.__dict__[rname]() - print type(inst), len(inst.output()) + print type(inst), inst.record_identifier, len(inst.output()) def test_dump(): diff --git a/fields.py b/fields.py index e557ee9..5119211 100644 --- a/fields.py +++ b/fields.py @@ -32,7 +32,6 @@ class Field(object): def read(self, fp): if fp.tell() + self.max_length <= fp.len: data = fp.read(self.max_length) - print self, self.max_length, data return self.parse(data) return None @@ -87,7 +86,6 @@ class StaticField(TextField): self._value = value def parse(self, s): - print 'STATIC', self.max_length, s, len(s) pass class BlankField(TextField): @@ -124,3 +122,6 @@ class MoneyField(Field): def parse(self, s): self.value = decimal.Decimal(s) * decimal.Decimal('0.01') +class DateField(TextField): + #FIXME I NEED TO BE WRITTEN! + pass diff --git a/record.py b/record.py index 62a4e8c..af3cc65 100644 --- a/record.py +++ b/record.py @@ -93,31 +93,31 @@ class EmployeeWageRecord(model.Model): 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) + wages_tips = MoneyField(max_length=11) + federal_income_tax_withheld = MoneyField(max_length=11) + social_security_wages = MoneyField(max_length=11) + social_security_tax_withheld = MoneyField(max_length=11) + medicare_wages_and_tips = MoneyField(max_length=11) + medicare_tax_withheld = MoneyField(max_length=11) + social_security_tips = MoneyField(max_length=11) + advance_eic = MoneyField(max_length=11) + dependent_care_benefits = MoneyField(max_length=11) + deferred_compensation_401k = MoneyField(max_length=11) + deferred_compensation_403b = MoneyField(max_length=11) + deferred_compensation_408k = MoneyField(max_length=11) + deferred_compensation_457b = MoneyField(max_length=11) + deferred_compensation_501c = MoneyField(max_length=11) + military_pay = MoneyField(max_length=11) + non_qualified_457 = MoneyField(max_length=11) + employer_contrib_to_hsa = MoneyField(max_length=11) + non_qualified_not_457 = MoneyField(max_length=11) + nontaxable_combat_pay = MoneyField(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) + cost_of_premiums_for_insurance = MoneyField(max_length=11) + income_nonstatutory_stock_opts = MoneyField(max_length=11) + deferred_compensation_409a = MoneyField(max_length=11) + designated_roth_contrib_401k = MoneyField(max_length=11) + designated_roth_contrib_403b = MoneyField(max_length=11) blank3 = BlankField(max_length=23) statutory_employee_indicator = BooleanField() blank4 = BlankField(max_length=1) @@ -129,33 +129,103 @@ class EmployeeWageRecord(model.Model): class OptionalEmployeeWageRecord(model.Model): record_identifier = 'RO' - blank1 = BlankField(max_length=9) - allocated_tips = NumericField(max_length=11) - uncollected_tax_on_tips = NumericField(max_length=11) - medical_savings_account = NumericField(max_length=11) - simple_retirement_account = NumericField(max_length=11) - qualified_adoption_expenses = NumericField(max_length=11) - uncollected_ss_life_ins = NumericField(max_length=11) - uncollected_medicare_life_ins = NumericField(max_length=11) - income_under_409a = NumericField(max_length=11) - hire_exempt_wages_and_tips = NumericField(max_length=11) - blank2 = BlankField(max_length=164) - wages_subject_to_puerto_rico_tax = NumericField(max_length=11, required=False) - commissions_subject_to_puerto_rico_tax = NumericField(max_length=11, required=False) - allowances_subject_to_puerto_rico_tax = NumericField(max_length=11, required=False) - tips_subject_to_puerto_rico_tax = NumericField(max_length=11, required=False) - total_wages_subject_to_puerto_rico_tax = NumericField(max_length=11, required=False) - puerto_rico_tax_withheld = NumericField(max_length=11, required=False) - retirement_fund_contrib = NumericField(max_length=11, required=False) + blank1 = BlankField(max_length=9) + allocated_tips = MoneyField(max_length=11) + uncollected_tax_on_tips = MoneyField(max_length=11) + medical_savings_account = MoneyField(max_length=11) + simple_retirement_account = MoneyField(max_length=11) + qualified_adoption_expenses = MoneyField(max_length=11) + uncollected_ss_life_ins = MoneyField(max_length=11) + uncollected_medicare_life_ins = MoneyField(max_length=11) + income_under_409a = MoneyField(max_length=11) + hire_exempt_wages_and_tips = MoneyField(max_length=11) + blank2 = BlankField(max_length=164) + wages_subject_to_puerto_rico_tax = MoneyField(max_length=11, required=False) + commissions_subject_to_puerto_rico_tax = MoneyField(max_length=11, required=False) + allowances_subject_to_puerto_rico_tax = MoneyField(max_length=11, required=False) + tips_subject_to_puerto_rico_tax = MoneyField(max_length=11, required=False) + total_wages_subject_to_puerto_rico_tax = MoneyField(max_length=11, required=False) + puerto_rico_tax_withheld = MoneyField(max_length=11, required=False) + retirement_fund_contrib = MoneyField(max_length=11, required=False) blank3 = BlankField(max_length=11) - total_wages_tips_virgin_islands = NumericField(max_length=11, required=False) - virgin_islands_income_tax_withheld = NumericField(max_length=11, required=False) + total_wages_tips_virgin_islands = MoneyField(max_length=11, required=False) + virgin_islands_income_tax_withheld = MoneyField(max_length=11, required=False) blank4 = BlankField(max_length=128) +class StateWageRecord(model.Model): + record_identifier = 'RS' + + state_code = NumericField(max_length=2) + taxing_entity_code = TextField(max_length=5) + 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_province = TextField(max_length=23, required=False) + foreign_postal_code = TextField(max_length=15, required=False) + country_code = TextField(max_length=2) + optional_code = TextField(max_length=2, required=False) + reporting_period = NumericField(max_length=6) # MAYBE MAKE A CUSTOM FIELD TYPE FOR THIS + quarterly_unemp_ins_wages = MoneyField(max_length=11) + quarterly_unemp_ins_taxable_wages = MoneyField(max_length=11) + number_of_weeks_worked = NumericField(max_length=2) + date_first_employed = TextField(max_length=8)#DateField() + date_of_separation = TextField(max_length=8)#DateField() + blank2 = BlankField(max_length=5) + state_code_2 = NumericField(max_length=2) + state_taxable_wages = MoneyField(max_length=11) + state_income_tax_wh = MoneyField(max_length=11) + other_state_data = TextField(max_length=10) + tax_type_code = TextField(max_length=1) # VALIDATE C, D, E, or F + local_taxable_wages = MoneyField(max_length=11) + local_income_tax_wh = MoneyField(max_length=11) + state_control_number = NumericField(max_length=7, required=False) + supplemental_data1 = TextField(max_length=75) + supplemental_data2 = TextField(max_length=75) + blank3 = BlankField(max_length=25) + class TotalRecord(model.Model): record_identifier = 'RT' + number_of_rw_records = NumericField(max_length=7) + wages_tips = NumericField(max_length=15) + federal_income_tax_withheld = NumericField(max_length=15) + social_security_wages = NumericField(max_length=15) + social_security_tax_withheld = NumericField(max_length=15) + medicare_wages_and_tips = NumericField(max_length=15) + medicare_tax_withheld = NumericField(max_length=15) + social_security_tips = NumericField(max_length=15) + advance_eic = NumericField(max_length=15) + dependent_care_benefits = NumericField(max_length=15) + deferred_compensation_401k = NumericField(max_length=15) + deferred_compensation_403b = NumericField(max_length=15) + deferred_compensation_408k = NumericField(max_length=15) + deferred_compensation_457b = NumericField(max_length=15) + deferred_compensation_501c = NumericField(max_length=15) + military_pay = NumericField(max_length=15) + non_qualified_457 = NumericField(max_length=15) + employer_contrib_to_hsa = NumericField(max_length=15) + non_qualified_not_457 = NumericField(max_length=15) + nontaxable_combat_pay = NumericField(max_length=15) + blank1 = BlankField(max_length=15) + employer_cost_term_life_ins = NumericField(max_length=15) + income_tax_wh_sick_pay = NumericField(max_length=15) + income_exercise_nonstat_stock_opts = NumericField(max_length=15) + deferred_409a_compensation_plan = NumericField(max_length=15) + designated_roth_contribs_401k = NumericField(max_length=15) + disignated_roth_contribs_403b = NumericField(max_length=15) + blank2 = BlankField(max_length=113) + + class OptionalTotalRecord(model.Model): record_identifier = 'RU'