forked from Mapan/odoo17e
257 lines
11 KiB
Python
257 lines
11 KiB
Python
# coding: utf-8
|
|
from odoo import Command
|
|
from odoo.addons.account.tests.common import AccountTestInvoicingCommon
|
|
from odoo.tests import tagged
|
|
|
|
import base64
|
|
from freezegun import freeze_time
|
|
|
|
@tagged('post_install_l10n', "post_install", "-at_install")
|
|
class Test1099(AccountTestInvoicingCommon):
|
|
@classmethod
|
|
def setUpClass(cls, chart_template_ref=None):
|
|
super().setUpClass(chart_template_ref=chart_template_ref)
|
|
|
|
cls.env.company.write({
|
|
"street": "1 W Seneca St",
|
|
"street2": "Floor 26",
|
|
"city": "Buffalo",
|
|
"state_id": cls.env["res.country.state"].search([("name", "=", "New York")], limit=1).id,
|
|
"zip": "14203",
|
|
"country_id": cls.env.ref("base.us").id,
|
|
"phone": "(716) 249-2880",
|
|
"vat": "987654321",
|
|
})
|
|
|
|
cls.vendor_non_1099 = cls.env["res.partner"].create({
|
|
"name": "non-1099 vendor",
|
|
})
|
|
|
|
cls.vendor_1099 = cls.env["res.partner"].create({
|
|
"name": "1099 vendor",
|
|
"street": "250 Executive Park Blvd",
|
|
"street2": "#3400",
|
|
"city": "San Francisco",
|
|
"state_id": cls.env["res.country.state"].search([("name", "=", "California")], limit=1).id,
|
|
"zip": "94134",
|
|
"country_id": cls.env.ref("base.us").id,
|
|
"phone": "(650) 691-3277",
|
|
"vat": "123456789",
|
|
"email": "vendor@example.com",
|
|
"box_1099_id": cls.env.ref("l10n_us_1099.box_1099_misc_03").id,
|
|
})
|
|
|
|
cls.liquidity_account = cls.env["account.account"].search(
|
|
[("account_type", "=", "asset_cash")],
|
|
limit=1
|
|
)
|
|
cls.expense_account = cls.env["account.account"].search(
|
|
[("account_type", "=", "expense")],
|
|
limit=1
|
|
)
|
|
|
|
company_2_id = cls.company_data_2["company"].id
|
|
cls.liquidity_account_comp2 = cls.env["account.account"].search(
|
|
[
|
|
("company_id", "=", company_2_id),
|
|
("account_type", "=", "asset_cash"),
|
|
],
|
|
limit=1
|
|
)
|
|
cls.expense_account_comp2 = cls.env["account.account"].search(
|
|
[
|
|
("company_id", "=", company_2_id),
|
|
("account_type", "=", "expense")
|
|
],
|
|
limit=1
|
|
)
|
|
|
|
@freeze_time("2021-02-10")
|
|
def test1099Wizard(self):
|
|
move_vals = {
|
|
"date": "2020-06-06", # wizard includes last year by default
|
|
"line_ids": [
|
|
(0, 0, {
|
|
"name": "debit",
|
|
"partner_id": self.vendor_non_1099.id,
|
|
"account_id": self.expense_account.id,
|
|
"debit": 100.0,
|
|
"credit": 0.0,
|
|
}),
|
|
(0, 0, {
|
|
"name": "credit",
|
|
"partner_id": self.vendor_non_1099.id,
|
|
"account_id": self.liquidity_account.id,
|
|
"debit": 0.0,
|
|
"credit": 100.0,
|
|
}),
|
|
],
|
|
}
|
|
move = self.env["account.move"].create(move_vals)
|
|
move.action_post()
|
|
|
|
# these should not be included when the user is in company 1
|
|
move_vals_company_2 = {
|
|
"date": "2020-06-06", # wizard includes last year by default
|
|
"line_ids": [
|
|
(0, 0, {
|
|
"name": "debit",
|
|
"partner_id": self.vendor_1099.id,
|
|
"account_id": self.expense_account_comp2.id,
|
|
"debit": 200.0,
|
|
"credit": 0.0,
|
|
}),
|
|
(0, 0, {
|
|
"name": "credit",
|
|
"partner_id": self.vendor_1099.id,
|
|
"account_id": self.liquidity_account_comp2.id,
|
|
"debit": 0.0,
|
|
"credit": 200.0,
|
|
}),
|
|
],
|
|
}
|
|
self.env["account.move"].with_company(self.company_data_2["company"]).create(move_vals_company_2).action_post()
|
|
|
|
move_vals["line_ids"][0][2]["partner_id"] = self.vendor_1099.id
|
|
move_vals["line_ids"][1][2]["partner_id"] = self.vendor_1099.id
|
|
move = self.env["account.move"].create(move_vals)
|
|
move.action_post()
|
|
expected_lines = move.line_ids.filtered("credit")
|
|
|
|
move_vals["line_ids"][0][2]["debit"] = 150
|
|
move_vals["line_ids"][1][2]["credit"] = 150
|
|
move = self.env["account.move"].create(move_vals)
|
|
move.action_post()
|
|
expected_lines |= move.line_ids.filtered("credit")
|
|
|
|
# switch to company 1
|
|
self.env.user.company_ids = self.env.company
|
|
|
|
wizard = self.env["l10n_us_1099.wizard"].create({})
|
|
self.assertEqual(wizard.lines_to_export, expected_lines, "Wizard should contain the credit part of the 1099 vendor entry.")
|
|
|
|
wizard.action_generate()
|
|
csv_content = base64.b64decode(wizard.generated_csv_file).decode().splitlines()
|
|
|
|
self.maxDiff = None # show the full diff in case of errors
|
|
header = (
|
|
"Payer Name,Payer Address Line 1,Payer Address Line 2,Payer City,Payer State,Payer Zip,Payer Country,Payer Phone Number,Payer TIN,"
|
|
"Payee Name,Payee Address Line 1,Payee Address Line 2,Payee City,Payee State,Payee Zip,Payee Country,Payee Email,Payee TIN,NEC - 1 Nonemployee compensation,"
|
|
"MISC - 1 Rents,MISC - 2 Royalties,MISC - 3 Other income,MISC - 5 Fishing boat proceeds,MISC - 6 Medical and health care payments,"
|
|
"MISC - 8 Substitute payments in lieu of dividends or interest,MISC - 9 Crop insurance proceeds,MISC - 10 Gross proceeds paid to an attorney,"
|
|
"MISC - 11 Fish purchased for resale,MISC - 12 Section 409A deferrals,MISC - 13 Excess golden parachute payments,MISC - 14 Nonqualified deferred compensation"
|
|
)
|
|
self.assertEqual(csv_content[0], header, "Wizard did not generate the expected header.")
|
|
|
|
expected_line = (
|
|
"company_1_data,1 W Seneca St,Floor 26,Buffalo,New York,14203,United States,(716) 249-2880,987654321,1099 vendor,250 Executive Park Blvd,"
|
|
"#3400,San Francisco,California,94134,United States,vendor@example.com,123456789,0,0,0,250.0,0,0,0,0,0,0,0,0,0"
|
|
)
|
|
self.assertEqual(csv_content[1], expected_line, "Wizard did not generate the expected line for the 1099 vendor.")
|
|
self.assertEqual(len(csv_content), 2, "Wizard should exactly generate the two lines above.")
|
|
|
|
@freeze_time("2021-02-10")
|
|
def test_1099_wizard_manual_export_lines(self):
|
|
""" Test that lines added manually are computed correctly for 2 vendors """
|
|
vendor_x = self.env['res.partner'].create({
|
|
'name': 'Vendor X',
|
|
'street': '123 Test street',
|
|
'street2': '#6666',
|
|
'city': 'Brooklyn',
|
|
'state_id': self.env.ref('base.state_us_27').id,
|
|
'zip': '11202',
|
|
'country_id': self.env.ref('base.us').id,
|
|
'vat': '192837465',
|
|
'email': 'vendor_x@example.com',
|
|
'box_1099_id': self.env.ref('l10n_us_1099.box_1099_misc_03').id,
|
|
})
|
|
# create a first move for "1099 vendor"
|
|
move_1 = self.env['account.move'].create({
|
|
'date': '2020-06-06',
|
|
'line_ids': [
|
|
Command.create({
|
|
'name': 'debit',
|
|
'partner_id': self.vendor_1099.id,
|
|
'account_id': self.expense_account.id,
|
|
'debit': 100.0,
|
|
'credit': 0.0,
|
|
}),
|
|
Command.create({
|
|
'name': 'credit',
|
|
'partner_id': self.vendor_1099.id,
|
|
'account_id': self.liquidity_account.id,
|
|
'debit': 0.0,
|
|
'credit': 100.0,
|
|
}),
|
|
],
|
|
})
|
|
move_1.action_post()
|
|
# create a first move for "Vendor X"
|
|
move_2 = self.env['account.move'].create({
|
|
'date': '2020-06-07',
|
|
'line_ids': [
|
|
Command.create({
|
|
'name': 'debit',
|
|
'partner_id': vendor_x.id,
|
|
'account_id': self.expense_account.id,
|
|
'debit': 100.0,
|
|
'credit': 0.0,
|
|
}),
|
|
Command.create({
|
|
'name': 'credit',
|
|
'partner_id': vendor_x.id,
|
|
'account_id': self.liquidity_account.id,
|
|
'debit': 0.0,
|
|
'credit': 100.0,
|
|
}),
|
|
],
|
|
})
|
|
move_2.action_post()
|
|
# create a second move for "1099 vendor"
|
|
move_3 = self.env['account.move'].create({
|
|
'date': '2020-06-08',
|
|
'line_ids': [
|
|
Command.create({
|
|
'name': 'debit',
|
|
'partner_id': self.vendor_1099.id,
|
|
'account_id': self.expense_account.id,
|
|
'debit': 150.0,
|
|
'credit': 0.0,
|
|
}),
|
|
Command.create({
|
|
'name': 'credit',
|
|
'partner_id': self.vendor_1099.id,
|
|
'account_id': self.liquidity_account.id,
|
|
'debit': 0.0,
|
|
'credit': 150.0,
|
|
}),
|
|
],
|
|
})
|
|
move_3.action_post()
|
|
|
|
lines_to_export = (move_1 + move_2 + move_3).line_ids.filtered('credit')
|
|
wizard = self.env['l10n_us_1099.wizard'].create({'lines_to_export': lines_to_export})
|
|
wizard.action_generate()
|
|
csv_content = base64.b64decode(wizard.generated_csv_file).decode().splitlines()
|
|
|
|
self.maxDiff = None # show the full diff in case of errors
|
|
header = (
|
|
'Payer Name,Payer Address Line 1,Payer Address Line 2,Payer City,Payer State,Payer Zip,Payer Country,Payer Phone Number,Payer TIN,'
|
|
'Payee Name,Payee Address Line 1,Payee Address Line 2,Payee City,Payee State,Payee Zip,Payee Country,Payee Email,Payee TIN,NEC - 1 Nonemployee compensation,'
|
|
'MISC - 1 Rents,MISC - 2 Royalties,MISC - 3 Other income,MISC - 5 Fishing boat proceeds,MISC - 6 Medical and health care payments,'
|
|
'MISC - 8 Substitute payments in lieu of dividends or interest,MISC - 9 Crop insurance proceeds,MISC - 10 Gross proceeds paid to an attorney,'
|
|
'MISC - 11 Fish purchased for resale,MISC - 12 Section 409A deferrals,MISC - 13 Excess golden parachute payments,MISC - 14 Nonqualified deferred compensation'
|
|
)
|
|
self.assertEqual(csv_content[0], header, 'Wizard did not generate the expected header.')
|
|
|
|
expected_lines = [(
|
|
'company_1_data,1 W Seneca St,Floor 26,Buffalo,New York,14203,United States,(716) 249-2880,987654321,1099 vendor,250 Executive Park Blvd,'
|
|
'#3400,San Francisco,California,94134,United States,vendor@example.com,123456789,0,0,0,250.0,0,0,0,0,0,0,0,0,0'
|
|
), (
|
|
'company_1_data,1 W Seneca St,Floor 26,Buffalo,New York,14203,United States,(716) 249-2880,987654321,Vendor X,123 Test street,'
|
|
'#6666,Brooklyn,New York,11202,United States,vendor_x@example.com,192837465,0,0,0,100.0,0,0,0,0,0,0,0,0,0'
|
|
)]
|
|
self.assertEqual(csv_content[1], expected_lines[0], 'Wizard did not generate the expected line for 1099 vendor.')
|
|
self.assertEqual(csv_content[2], expected_lines[1], 'Wizard did not generate the expected line for Vendor X.')
|
|
self.assertEqual(len(csv_content), 3, 'Wizard should exactly generate the three lines above.')
|