mirror of
https://github.com/OCA/pms.git
synced 2025-01-29 00:17:45 +02:00
[IMP]pms: improvement invoice data and tests
This commit is contained in:
@@ -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" />
|
||||
|
||||
@@ -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):
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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()
|
||||
|
||||
Reference in New Issue
Block a user