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="checkin_sequence_id" ref="pms.seq_pms_checkin" />
|
||||||
<field name="reservation_sequence_id" ref="pms.seq_pms_reservation" />
|
<field name="reservation_sequence_id" ref="pms.seq_pms_reservation" />
|
||||||
</record>
|
</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 -->
|
<!-- pms.users -->
|
||||||
<record id="base.user_root" model="res.users">
|
<record id="base.user_root" model="res.users">
|
||||||
<field name="company_id" ref="base.main_company" />
|
<field name="company_id" ref="base.main_company" />
|
||||||
|
|||||||
@@ -314,16 +314,16 @@ class AccountMove(models.Model):
|
|||||||
)
|
)
|
||||||
return []
|
return []
|
||||||
|
|
||||||
|
@api.model
|
||||||
def _check_pms_valid_invoice(self, move):
|
def _check_pms_valid_invoice(self, move):
|
||||||
"""
|
"""
|
||||||
Check invoice and receipts legal status
|
Check invoice and receipts legal status
|
||||||
"""
|
"""
|
||||||
self.ensure_one()
|
|
||||||
if (
|
if (
|
||||||
move.is_invoice(include_receipts=True)
|
move.is_invoice(include_receipts=True)
|
||||||
and not self.journal_id.is_simplified_invoice
|
and not move.journal_id.is_simplified_invoice
|
||||||
and (
|
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(
|
raise UserError(
|
||||||
@@ -332,8 +332,8 @@ class AccountMove(models.Model):
|
|||||||
" partner has the complete information required."
|
" partner has the complete information required."
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
if self.journal_id.is_simplified_invoice:
|
if move.journal_id.is_simplified_invoice:
|
||||||
self._check_simplified_restrictions()
|
move._check_simplified_restrictions()
|
||||||
return True
|
return True
|
||||||
|
|
||||||
def _check_simplified_restrictions(self):
|
def _check_simplified_restrictions(self):
|
||||||
|
|||||||
@@ -656,13 +656,14 @@ class PmsFolio(models.Model):
|
|||||||
and self.autoinvoice_date <= fields.Date.today()
|
and self.autoinvoice_date <= fields.Date.today()
|
||||||
and len(target_lines) < len(lines_to_invoice)
|
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
|
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(
|
groups_invoice_lines.append(
|
||||||
{
|
{
|
||||||
"partner_id": second_partner_to_invoice
|
"partner_id": other_partner_to_invoice.id,
|
||||||
and second_partner_to_invoice.id,
|
|
||||||
"lines": lines_to_invoice - target_lines,
|
"lines": lines_to_invoice - target_lines,
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
@@ -670,12 +671,15 @@ class PmsFolio(models.Model):
|
|||||||
|
|
||||||
def _get_default_partner_invoice_id(self):
|
def _get_default_partner_invoice_id(self):
|
||||||
self.ensure_one()
|
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
|
folio_partner_invoice_id = self.partner_id.id
|
||||||
else:
|
if not folio_partner_invoice_id:
|
||||||
folio_partner_invoice_id = (
|
folio_partner_invoice_id = (
|
||||||
self.partner_invoice_ids[0].id if self.partner_invoice_ids else False
|
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
|
return folio_partner_invoice_id
|
||||||
|
|
||||||
def _get_tax_amount_by_group(self):
|
def _get_tax_amount_by_group(self):
|
||||||
@@ -1794,8 +1798,9 @@ class PmsFolio(models.Model):
|
|||||||
self.ensure_one()
|
self.ensure_one()
|
||||||
pms_property = self.pms_property_id
|
pms_property = self.pms_property_id
|
||||||
partner = self.env["res.partner"].browse(partner_invoice_id)
|
partner = self.env["res.partner"].browse(partner_invoice_id)
|
||||||
if not partner._check_enought_invoice_data() and self._context.get(
|
if not partner or (
|
||||||
"autoinvoice"
|
not partner._check_enought_invoice_data()
|
||||||
|
and self._context.get("autoinvoice")
|
||||||
):
|
):
|
||||||
return pms_property.journal_simplified_invoice_id
|
return pms_property.journal_simplified_invoice_id
|
||||||
return pms_property.journal_normal_invoice_id
|
return pms_property.journal_normal_invoice_id
|
||||||
@@ -1820,12 +1825,15 @@ class PmsFolio(models.Model):
|
|||||||
"""
|
"""
|
||||||
if not pay_type:
|
if not pay_type:
|
||||||
pay_type = journal.type
|
pay_type = journal.type
|
||||||
|
reference = folio.name
|
||||||
|
if folio.external_reference:
|
||||||
|
reference += " - " + folio.external_reference
|
||||||
vals = {
|
vals = {
|
||||||
"journal_id": journal.id,
|
"journal_id": journal.id,
|
||||||
"partner_id": partner.id,
|
"partner_id": partner.id,
|
||||||
"amount": amount,
|
"amount": amount,
|
||||||
"date": date or fields.Date.today(),
|
"date": date or fields.Date.today(),
|
||||||
"ref": folio.name + " - " + folio.external_reference,
|
"ref": reference,
|
||||||
"folio_ids": [(6, 0, [folio.id])],
|
"folio_ids": [(6, 0, [folio.id])],
|
||||||
"payment_type": "inbound",
|
"payment_type": "inbound",
|
||||||
"partner_type": "customer",
|
"partner_type": "customer",
|
||||||
@@ -1901,13 +1909,15 @@ class PmsFolio(models.Model):
|
|||||||
"""
|
"""
|
||||||
if not pay_type:
|
if not pay_type:
|
||||||
pay_type = journal.type
|
pay_type = journal.type
|
||||||
|
reference = folio.name
|
||||||
|
if folio.external_reference:
|
||||||
|
reference += " - " + folio.external_reference
|
||||||
vals = {
|
vals = {
|
||||||
"journal_id": journal.id,
|
"journal_id": journal.id,
|
||||||
"partner_id": partner.id,
|
"partner_id": partner.id,
|
||||||
"amount": amount if amount > 0 else -amount,
|
"amount": amount if amount > 0 else -amount,
|
||||||
"date": date or fields.Date.today(),
|
"date": date or fields.Date.today(),
|
||||||
"ref": folio.name,
|
"ref": reference,
|
||||||
"folio_ids": [(6, 0, [folio.id])],
|
"folio_ids": [(6, 0, [folio.id])],
|
||||||
"payment_type": "outbound",
|
"payment_type": "outbound",
|
||||||
"partner_type": "customer",
|
"partner_type": "customer",
|
||||||
|
|||||||
@@ -628,3 +628,9 @@ class PmsProperty(models.Model):
|
|||||||
_("Journal %s is not allowed to be used for normal invoices")
|
_("Journal %s is not allowed to be used for normal invoices")
|
||||||
% pms_property.journal_normal_invoice_id.name
|
% 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",
|
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(
|
vat_document_type = fields.Selection(
|
||||||
string="Document Type",
|
string="Document Type",
|
||||||
help="""The vat document type of the partner,
|
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))
|
vat_document_types.append((doc_type.name, doc_type.name))
|
||||||
return vat_document_types
|
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")
|
@api.depends("pms_checkin_partner_ids", "pms_checkin_partner_ids.gender")
|
||||||
def _compute_gender(self):
|
def _compute_gender(self):
|
||||||
if hasattr(super(), "_compute_gender"):
|
if hasattr(super(), "_compute_gender"):
|
||||||
@@ -617,12 +598,7 @@ class ResPartner(models.Model):
|
|||||||
|
|
||||||
def _check_enought_invoice_data(self):
|
def _check_enought_invoice_data(self):
|
||||||
self.ensure_one()
|
self.ensure_one()
|
||||||
if (
|
if self.vat and self.country_id and self.city and self.street:
|
||||||
self.document_number_to_invoice
|
|
||||||
and self.country_id
|
|
||||||
and self.city
|
|
||||||
and self.street
|
|
||||||
):
|
|
||||||
return True
|
return True
|
||||||
return False
|
return False
|
||||||
|
|
||||||
@@ -637,3 +613,11 @@ class ResPartner(models.Model):
|
|||||||
continue
|
continue
|
||||||
else:
|
else:
|
||||||
super(ResPartner, partner).check_vat()
|
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(
|
self.room_type_availability = self.env["pms.availability.plan"].create(
|
||||||
{"name": "Availability plan for TEST"}
|
{"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
|
# create a property
|
||||||
self.property = self.env["pms.property"].create(
|
self.property = self.env["pms.property"].create(
|
||||||
{
|
{
|
||||||
"name": "MY PMS TEST",
|
"name": "MY PMS TEST",
|
||||||
"company_id": self.env.ref("base.main_company").id,
|
"company_id": self.env.ref("base.main_company").id,
|
||||||
"default_pricelist_id": self.pricelist1.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(
|
self.partner_id = self.env["res.partner"].create(
|
||||||
{
|
{
|
||||||
"name": "Miguel",
|
"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}
|
{"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(
|
self.reservation1 = self.env["pms.reservation"].create(
|
||||||
{
|
{
|
||||||
"pms_property_id": self.property.id,
|
"pms_property_id": self.property.id,
|
||||||
@@ -313,13 +323,21 @@ class TestPmsFolioInvoice(TestPms):
|
|||||||
"adults": 2,
|
"adults": 2,
|
||||||
"room_type_id": self.room_type_double.id,
|
"room_type_id": self.room_type_double.id,
|
||||||
"partner_id": self.partner_id.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 = dict()
|
||||||
dict_lines[
|
dict_lines[
|
||||||
self.reservation1.folio_id.sale_line_ids.filtered("service_id")[0].id
|
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.reservation1.folio_id._create_invoices(lines_to_invoice=dict_lines)
|
||||||
self.assertEqual(
|
self.assertEqual(
|
||||||
self.reservation1.folio_id.sale_line_ids.filtered("service_id")[
|
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}
|
{"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(
|
self.reservation1 = self.env["pms.reservation"].create(
|
||||||
{
|
{
|
||||||
"pms_property_id": self.property.id,
|
"pms_property_id": self.property.id,
|
||||||
@@ -354,9 +365,17 @@ class TestPmsFolioInvoice(TestPms):
|
|||||||
"adults": 2,
|
"adults": 2,
|
||||||
"room_type_id": self.room_type_double.id,
|
"room_type_id": self.room_type_double.id,
|
||||||
"partner_id": self.partner_id.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 = dict()
|
||||||
service_lines = self.reservation1.folio_id.sale_line_ids.filtered("service_id")
|
service_lines = self.reservation1.folio_id.sale_line_ids.filtered("service_id")
|
||||||
for line in service_lines:
|
for line in service_lines:
|
||||||
@@ -381,13 +400,6 @@ class TestPmsFolioInvoice(TestPms):
|
|||||||
{"name": "Test Product 1", "per_day": True, "list_price": 10}
|
{"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(
|
self.reservation1 = self.env["pms.reservation"].create(
|
||||||
{
|
{
|
||||||
"pms_property_id": self.property.id,
|
"pms_property_id": self.property.id,
|
||||||
@@ -396,9 +408,17 @@ class TestPmsFolioInvoice(TestPms):
|
|||||||
"adults": 2,
|
"adults": 2,
|
||||||
"room_type_id": self.room_type_double.id,
|
"room_type_id": self.room_type_double.id,
|
||||||
"partner_id": self.partner_id.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(
|
expected_qty_to_invoice = sum(
|
||||||
self.reservation1.folio_id.sale_line_ids.filtered("service_id").mapped(
|
self.reservation1.folio_id.sale_line_ids.filtered("service_id").mapped(
|
||||||
"qty_to_invoice"
|
"qty_to_invoice"
|
||||||
@@ -665,13 +685,7 @@ class TestPmsFolioInvoice(TestPms):
|
|||||||
self.product2 = self.env["product.product"].create(
|
self.product2 = self.env["product.product"].create(
|
||||||
{
|
{
|
||||||
"name": "Test Product 2",
|
"name": "Test Product 2",
|
||||||
}
|
"lst_price": 100,
|
||||||
)
|
|
||||||
|
|
||||||
self.service = self.env["pms.service"].create(
|
|
||||||
{
|
|
||||||
"is_board_service": False,
|
|
||||||
"product_id": self.product2.id,
|
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -679,6 +693,7 @@ class TestPmsFolioInvoice(TestPms):
|
|||||||
{
|
{
|
||||||
"name": "Test Board Service 1",
|
"name": "Test Board Service 1",
|
||||||
"default_code": "CB1",
|
"default_code": "CB1",
|
||||||
|
"amount": 10,
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -706,7 +721,13 @@ class TestPmsFolioInvoice(TestPms):
|
|||||||
"room_type_id": self.room_type_double.id,
|
"room_type_id": self.room_type_double.id,
|
||||||
"partner_id": self.partner_id.id,
|
"partner_id": self.partner_id.id,
|
||||||
"board_service_room_id": self.board_service_room_type1.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()
|
self.property.autoinvoicing()
|
||||||
|
|||||||
Reference in New Issue
Block a user