[IMP]pms: improvement invoice data and tests

This commit is contained in:
Darío Lodeiros
2022-03-20 08:48:13 +01:00
parent 26a9b2318b
commit 418b1f00dc
6 changed files with 101 additions and 73 deletions

View File

@@ -20,6 +20,13 @@
<field name="checkin_sequence_id" ref="pms.seq_pms_checkin" />
<field name="reservation_sequence_id" ref="pms.seq_pms_reservation" />
</record>
<!-- default partner simplified invoices -->
<record id="various_pms_partner" model="res.partner">
<field name="name">Various Clients</field>
<field
name="comment"
>Contact used for simplified invoices where no customer is available</field>
</record>
<!-- pms.users -->
<record id="base.user_root" model="res.users">
<field name="company_id" ref="base.main_company" />

View File

@@ -314,16 +314,16 @@ class AccountMove(models.Model):
)
return []
@api.model
def _check_pms_valid_invoice(self, move):
"""
Check invoice and receipts legal status
"""
self.ensure_one()
if (
move.is_invoice(include_receipts=True)
and not self.journal_id.is_simplified_invoice
and not move.journal_id.is_simplified_invoice
and (
not self.partner_id or not self.partner_id._check_enought_invoice_data()
not move.partner_id or not move.partner_id._check_enought_invoice_data()
)
):
raise UserError(
@@ -332,8 +332,8 @@ class AccountMove(models.Model):
" partner has the complete information required."
)
)
if self.journal_id.is_simplified_invoice:
self._check_simplified_restrictions()
if move.journal_id.is_simplified_invoice:
move._check_simplified_restrictions()
return True
def _check_simplified_restrictions(self):

View File

@@ -656,13 +656,14 @@ class PmsFolio(models.Model):
and self.autoinvoice_date <= fields.Date.today()
and len(target_lines) < len(lines_to_invoice)
):
second_partner_to_invoice = self.partner_invoice_ids.filtered(
other_partner_to_invoice = self.partner_invoice_ids.filtered(
lambda p: p.id != partner_invoice_id
)
if not other_partner_to_invoice:
other_partner_to_invoice = self.env.ref("pms.various_pms_partner")
groups_invoice_lines.append(
{
"partner_id": second_partner_to_invoice
and second_partner_to_invoice.id,
"partner_id": other_partner_to_invoice.id,
"lines": lines_to_invoice - target_lines,
}
)
@@ -670,12 +671,15 @@ class PmsFolio(models.Model):
def _get_default_partner_invoice_id(self):
self.ensure_one()
if self.partner_id and self.partner_id.document_number_to_invoice:
folio_partner_invoice_id = False
if self.partner_id and self.partner_id.vat:
folio_partner_invoice_id = self.partner_id.id
else:
if not folio_partner_invoice_id:
folio_partner_invoice_id = (
self.partner_invoice_ids[0].id if self.partner_invoice_ids else False
)
if not folio_partner_invoice_id:
folio_partner_invoice_id = self.env.ref("pms.various_pms_partner").id
return folio_partner_invoice_id
def _get_tax_amount_by_group(self):
@@ -1794,8 +1798,9 @@ class PmsFolio(models.Model):
self.ensure_one()
pms_property = self.pms_property_id
partner = self.env["res.partner"].browse(partner_invoice_id)
if not partner._check_enought_invoice_data() and self._context.get(
"autoinvoice"
if not partner or (
not partner._check_enought_invoice_data()
and self._context.get("autoinvoice")
):
return pms_property.journal_simplified_invoice_id
return pms_property.journal_normal_invoice_id
@@ -1820,12 +1825,15 @@ class PmsFolio(models.Model):
"""
if not pay_type:
pay_type = journal.type
reference = folio.name
if folio.external_reference:
reference += " - " + folio.external_reference
vals = {
"journal_id": journal.id,
"partner_id": partner.id,
"amount": amount,
"date": date or fields.Date.today(),
"ref": folio.name + " - " + folio.external_reference,
"ref": reference,
"folio_ids": [(6, 0, [folio.id])],
"payment_type": "inbound",
"partner_type": "customer",
@@ -1901,13 +1909,15 @@ class PmsFolio(models.Model):
"""
if not pay_type:
pay_type = journal.type
reference = folio.name
if folio.external_reference:
reference += " - " + folio.external_reference
vals = {
"journal_id": journal.id,
"partner_id": partner.id,
"amount": amount if amount > 0 else -amount,
"date": date or fields.Date.today(),
"ref": folio.name,
"ref": reference,
"folio_ids": [(6, 0, [folio.id])],
"payment_type": "outbound",
"partner_type": "customer",

View File

@@ -628,3 +628,9 @@ class PmsProperty(models.Model):
_("Journal %s is not allowed to be used for normal invoices")
% pms_property.journal_normal_invoice_id.name
)
@api.constrains("journal_simplified_invoice_id")
def _check_journal_simplified_invoice(self):
for pms_property in self.filtered("journal_simplified_invoice_id"):
if not pms_property.journal_simplified_invoice_id.is_simplified_invoice:
pms_property.journal_simplified_invoice_id.is_simplified_invoice = True

View File

@@ -175,15 +175,6 @@ class ResPartner(models.Model):
],
default="all",
)
document_number_to_invoice = fields.Char(
string="Document Number to invoices",
help="""Technical field to compute the partner reference to invoice,
it can be the VAT, if its set, or the document number, if its set,
else it will be False""",
compute="_compute_document_number_to_invoice",
readonly=False,
store=True,
)
vat_document_type = fields.Selection(
string="Document Type",
help="""The vat document type of the partner,
@@ -207,16 +198,6 @@ class ResPartner(models.Model):
vat_document_types.append((doc_type.name, doc_type.name))
return vat_document_types
@api.depends("vat", "id_numbers", "id_numbers.name")
def _compute_document_number_to_invoice(self):
for partner in self:
if partner.vat:
partner.document_number_to_invoice = partner.vat
elif partner.id_numbers:
partner.document_number_to_invoice = partner.id_numbers[0].name
else:
partner.document_number_to_invoice = False
@api.depends("pms_checkin_partner_ids", "pms_checkin_partner_ids.gender")
def _compute_gender(self):
if hasattr(super(), "_compute_gender"):
@@ -617,12 +598,7 @@ class ResPartner(models.Model):
def _check_enought_invoice_data(self):
self.ensure_one()
if (
self.document_number_to_invoice
and self.country_id
and self.city
and self.street
):
if self.vat and self.country_id and self.city and self.street:
return True
return False
@@ -637,3 +613,11 @@ class ResPartner(models.Model):
continue
else:
super(ResPartner, partner).check_vat()
def unlink(self):
dummy, various_partner_id = self.env["ir.model.data"].get_object_reference(
"pms", "various_pms_partner"
)
if various_partner_id in self.ids:
raise ValidationError(_("The partner 'Various Clients' cannot be deleted"))
return super().unlink()

View File

@@ -10,12 +10,24 @@ class TestPmsFolioInvoice(TestPms):
self.room_type_availability = self.env["pms.availability.plan"].create(
{"name": "Availability plan for TEST"}
)
# journal to simplified invoices
self.simplified_journal = self.env["account.journal"].create(
{
"name": "Simplified journal",
"code": "SMP",
"type": "sale",
"company_id": self.env.ref("base.main_company").id,
}
)
# create a property
self.property = self.env["pms.property"].create(
{
"name": "MY PMS TEST",
"company_id": self.env.ref("base.main_company").id,
"default_pricelist_id": self.pricelist1.id,
"journal_simplified_invoice_id": self.simplified_journal.id,
}
)
@@ -62,6 +74,11 @@ class TestPmsFolioInvoice(TestPms):
self.partner_id = self.env["res.partner"].create(
{
"name": "Miguel",
"vat": "ES123456789",
"country_id": self.env.ref("base.es").id,
"city": "Madrid",
"zip": "28013",
"street": "Calle de la calle",
}
)
@@ -298,13 +315,6 @@ class TestPmsFolioInvoice(TestPms):
{"name": "Test Product 1", "per_day": True, "list_price": 10}
)
self.service1 = self.env["pms.service"].create(
{
"is_board_service": False,
"product_id": self.product1.id,
}
)
self.reservation1 = self.env["pms.reservation"].create(
{
"pms_property_id": self.property.id,
@@ -313,13 +323,21 @@ class TestPmsFolioInvoice(TestPms):
"adults": 2,
"room_type_id": self.room_type_double.id,
"partner_id": self.partner_id.id,
"service_ids": [(6, 0, [self.service1.id])],
}
)
self.service1 = self.env["pms.service"].create(
{
"is_board_service": False,
"product_id": self.product1.id,
"reservation_id": self.reservation1.id,
}
)
dict_lines = dict()
dict_lines[
self.reservation1.folio_id.sale_line_ids.filtered("service_id")[0].id
] = 1
] = 3
self.reservation1.folio_id._create_invoices(lines_to_invoice=dict_lines)
self.assertEqual(
self.reservation1.folio_id.sale_line_ids.filtered("service_id")[
@@ -339,13 +357,6 @@ class TestPmsFolioInvoice(TestPms):
{"name": "Test Product 1", "per_day": True, "list_price": 10}
)
self.service1 = self.env["pms.service"].create(
{
"is_board_service": False,
"product_id": self.product1.id,
}
)
self.reservation1 = self.env["pms.reservation"].create(
{
"pms_property_id": self.property.id,
@@ -354,9 +365,17 @@ class TestPmsFolioInvoice(TestPms):
"adults": 2,
"room_type_id": self.room_type_double.id,
"partner_id": self.partner_id.id,
"service_ids": [(6, 0, [self.service1.id])],
}
)
self.service1 = self.env["pms.service"].create(
{
"is_board_service": False,
"product_id": self.product1.id,
"reservation_id": self.reservation1.id,
}
)
dict_lines = dict()
service_lines = self.reservation1.folio_id.sale_line_ids.filtered("service_id")
for line in service_lines:
@@ -381,13 +400,6 @@ class TestPmsFolioInvoice(TestPms):
{"name": "Test Product 1", "per_day": True, "list_price": 10}
)
self.service1 = self.env["pms.service"].create(
{
"is_board_service": False,
"product_id": self.product1.id,
}
)
self.reservation1 = self.env["pms.reservation"].create(
{
"pms_property_id": self.property.id,
@@ -396,9 +408,17 @@ class TestPmsFolioInvoice(TestPms):
"adults": 2,
"room_type_id": self.room_type_double.id,
"partner_id": self.partner_id.id,
"service_ids": [(6, 0, [self.service1.id])],
}
)
self.service1 = self.env["pms.service"].create(
{
"is_board_service": False,
"product_id": self.product1.id,
"reservation_id": self.reservation1.id,
}
)
expected_qty_to_invoice = sum(
self.reservation1.folio_id.sale_line_ids.filtered("service_id").mapped(
"qty_to_invoice"
@@ -665,13 +685,7 @@ class TestPmsFolioInvoice(TestPms):
self.product2 = self.env["product.product"].create(
{
"name": "Test Product 2",
}
)
self.service = self.env["pms.service"].create(
{
"is_board_service": False,
"product_id": self.product2.id,
"lst_price": 100,
}
)
@@ -679,6 +693,7 @@ class TestPmsFolioInvoice(TestPms):
{
"name": "Test Board Service 1",
"default_code": "CB1",
"amount": 10,
}
)
@@ -706,7 +721,13 @@ class TestPmsFolioInvoice(TestPms):
"room_type_id": self.room_type_double.id,
"partner_id": self.partner_id.id,
"board_service_room_id": self.board_service_room_type1.id,
"service_ids": [(4, self.service.id)],
}
)
self.service = self.env["pms.service"].create(
{
"is_board_service": False,
"product_id": self.product2.id,
"reservation_id": self.reservation1.id,
}
)
self.property.autoinvoicing()