mirror of
https://github.com/OCA/pms.git
synced 2025-01-29 00:17:45 +02:00
[IMP]pms_api_rest: add qty_to_invoice in section sale lines, and auto-open cash session
This commit is contained in:
@@ -3,6 +3,7 @@ from datetime import datetime, timedelta
|
|||||||
from odoo import _, fields
|
from odoo import _, fields
|
||||||
from odoo.exceptions import MissingError, ValidationError
|
from odoo.exceptions import MissingError, ValidationError
|
||||||
from odoo.osv import expression
|
from odoo.osv import expression
|
||||||
|
from odoo.tools import get_lang
|
||||||
|
|
||||||
from odoo.addons.base_rest import restapi
|
from odoo.addons.base_rest import restapi
|
||||||
from odoo.addons.base_rest_datamodel.restapi import Datamodel
|
from odoo.addons.base_rest_datamodel.restapi import Datamodel
|
||||||
@@ -238,17 +239,27 @@ class PmsFolioService(Component):
|
|||||||
def create_folio_charge(self, folio_id, pms_account_payment_info):
|
def create_folio_charge(self, folio_id, pms_account_payment_info):
|
||||||
folio = self.env["pms.folio"].browse(folio_id)
|
folio = self.env["pms.folio"].browse(folio_id)
|
||||||
partner_id = self.env["res.partner"].browse(pms_account_payment_info.partnerId)
|
partner_id = self.env["res.partner"].browse(pms_account_payment_info.partnerId)
|
||||||
journal_id = self.env["account.journal"].browse(
|
journal = self.env["account.journal"].browse(pms_account_payment_info.journalId)
|
||||||
pms_account_payment_info.journalId
|
|
||||||
)
|
|
||||||
reservations = (
|
reservations = (
|
||||||
self.env["pms.reservation"].browse(pms_account_payment_info.reservationIds)
|
self.env["pms.reservation"].browse(pms_account_payment_info.reservationIds)
|
||||||
if pms_account_payment_info.reservationIds
|
if pms_account_payment_info.reservationIds
|
||||||
else False
|
else False
|
||||||
)
|
)
|
||||||
|
if journal.type == "cash":
|
||||||
|
# REVIEW: Temporaly, if not cash session open, create a new one automatically
|
||||||
|
# Review this in pms_folio_service (/charge & /refund)
|
||||||
|
# and in pms_transaction_service (POST)
|
||||||
|
last_session = self._get_last_cash_session(journal_id=journal.id)
|
||||||
|
if last_session.state != "open":
|
||||||
|
self._action_open_cash_session(
|
||||||
|
pms_property_id=folio.pms_property_id.id,
|
||||||
|
amount=last_session.balance_end_real,
|
||||||
|
journal_id=journal.id,
|
||||||
|
force=False,
|
||||||
|
)
|
||||||
self.env["pms.folio"].do_payment(
|
self.env["pms.folio"].do_payment(
|
||||||
journal_id,
|
journal,
|
||||||
journal_id.suspense_account_id,
|
journal.suspense_account_id,
|
||||||
self.env.user,
|
self.env.user,
|
||||||
pms_account_payment_info.amount,
|
pms_account_payment_info.amount,
|
||||||
folio,
|
folio,
|
||||||
@@ -273,12 +284,22 @@ class PmsFolioService(Component):
|
|||||||
def create_folio_refund(self, folio_id, pms_account_payment_info):
|
def create_folio_refund(self, folio_id, pms_account_payment_info):
|
||||||
folio = self.env["pms.folio"].browse(folio_id)
|
folio = self.env["pms.folio"].browse(folio_id)
|
||||||
partner_id = self.env["res.partner"].browse(pms_account_payment_info.partnerId)
|
partner_id = self.env["res.partner"].browse(pms_account_payment_info.partnerId)
|
||||||
journal_id = self.env["account.journal"].browse(
|
journal = self.env["account.journal"].browse(pms_account_payment_info.journalId)
|
||||||
pms_account_payment_info.journalId
|
if journal.type == "cash":
|
||||||
)
|
# REVIEW: Temporaly, if not cash session open, create a new one automatically
|
||||||
|
# Review this in pms_folio_service (/charge & /refund)
|
||||||
|
# and in pms_transaction_service (POST)
|
||||||
|
last_session = self._get_last_cash_session(journal_id=journal.id)
|
||||||
|
if last_session.state != "open":
|
||||||
|
self._action_open_cash_session(
|
||||||
|
pms_property_id=folio.pms_property_id.id,
|
||||||
|
amount=last_session.balance_end_real,
|
||||||
|
journal_id=journal.id,
|
||||||
|
force=False,
|
||||||
|
)
|
||||||
self.env["pms.folio"].do_refund(
|
self.env["pms.folio"].do_refund(
|
||||||
journal_id,
|
journal,
|
||||||
journal_id.suspense_account_id,
|
journal.suspense_account_id,
|
||||||
self.env.user,
|
self.env.user,
|
||||||
pms_account_payment_info.amount,
|
pms_account_payment_info.amount,
|
||||||
folio,
|
folio,
|
||||||
@@ -519,9 +540,9 @@ class PmsFolioService(Component):
|
|||||||
priceUnit=sale_line.price_unit
|
priceUnit=sale_line.price_unit
|
||||||
if sale_line.price_unit
|
if sale_line.price_unit
|
||||||
else None,
|
else None,
|
||||||
qtyToInvoice=sale_line.qty_to_invoice
|
qtyToInvoice=self._get_section_qty_to_invoice(sale_line)
|
||||||
if sale_line.qty_to_invoice
|
if sale_line.display_type == "line_section"
|
||||||
else None,
|
else sale_line.qty_to_invoice,
|
||||||
qtyInvoiced=sale_line.qty_invoiced
|
qtyInvoiced=sale_line.qty_invoiced
|
||||||
if sale_line.qty_invoiced
|
if sale_line.qty_invoiced
|
||||||
else None,
|
else None,
|
||||||
@@ -686,3 +707,69 @@ class PmsFolioService(Component):
|
|||||||
invoices.write({"narration": invoice_info.narration})
|
invoices.write({"narration": invoice_info.narration})
|
||||||
|
|
||||||
return invoices.ids
|
return invoices.ids
|
||||||
|
|
||||||
|
# TODO: Used for the temporary function of auto-open cash session
|
||||||
|
# (View: charge/refund endpoints)
|
||||||
|
def _get_last_cash_session(self, journal_id, pms_property_id=False):
|
||||||
|
domain = [("journal_id", "=", journal_id)]
|
||||||
|
if pms_property_id:
|
||||||
|
domain.append(("pms_property_id", "=", pms_property_id))
|
||||||
|
return (
|
||||||
|
self.env["account.bank.statement"]
|
||||||
|
.sudo()
|
||||||
|
.search(
|
||||||
|
domain,
|
||||||
|
order="date desc, id desc",
|
||||||
|
limit=1,
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
# TODO: Used for the temporary function of auto-open cash session
|
||||||
|
# (View: charge/refund endpoints))
|
||||||
|
def _action_open_cash_session(self, pms_property_id, amount, journal_id, force):
|
||||||
|
statement = self._get_last_cash_session(
|
||||||
|
journal_id=journal_id,
|
||||||
|
pms_property_id=pms_property_id,
|
||||||
|
)
|
||||||
|
if round(statement.balance_end_real, 2) == round(amount, 2) or force:
|
||||||
|
self.env["account.bank.statement"].sudo().create(
|
||||||
|
{
|
||||||
|
"name": datetime.today().strftime(get_lang(self.env).date_format)
|
||||||
|
+ " ("
|
||||||
|
+ self.env.user.login
|
||||||
|
+ ")",
|
||||||
|
"date": datetime.today(),
|
||||||
|
"balance_start": amount,
|
||||||
|
"journal_id": journal_id,
|
||||||
|
"pms_property_id": pms_property_id,
|
||||||
|
}
|
||||||
|
)
|
||||||
|
diff = round(amount - statement.balance_end_real, 2)
|
||||||
|
return {"result": True, "diff": diff}
|
||||||
|
else:
|
||||||
|
diff = round(amount - statement.balance_end_real, 2)
|
||||||
|
return {"result": False, "diff": diff}
|
||||||
|
|
||||||
|
def _get_section_qty_to_invoice(self, sale_line):
|
||||||
|
folio = sale_line.folio_id
|
||||||
|
if sale_line.display_type == "line_section":
|
||||||
|
# Get if the section has a lines to invoice
|
||||||
|
seq = sale_line.sequence
|
||||||
|
next_line_section = folio.sale_line_ids.filtered(
|
||||||
|
lambda l: l.sequence > seq and l.display_type == "line_section"
|
||||||
|
)
|
||||||
|
if next_line_section:
|
||||||
|
return sum(
|
||||||
|
folio.sale_line_ids.filtered(
|
||||||
|
lambda l: l.sequence > seq
|
||||||
|
and l.sequence < next_line_section[0].sequence
|
||||||
|
and l.display_type != "line_section"
|
||||||
|
).mapped("qty_to_invoice")
|
||||||
|
)
|
||||||
|
else:
|
||||||
|
return sum(
|
||||||
|
folio.sale_line_ids.filtered(
|
||||||
|
lambda l: l.sequence > seq and l.display_type != "line_section"
|
||||||
|
).mapped("qty_to_invoice")
|
||||||
|
)
|
||||||
|
return False
|
||||||
|
|||||||
@@ -273,8 +273,36 @@ class PmsTransactionService(Component):
|
|||||||
.bank_account_id.id
|
.bank_account_id.id
|
||||||
)
|
)
|
||||||
pay = self.env["account.payment"].create(vals)
|
pay = self.env["account.payment"].create(vals)
|
||||||
|
if journal.type == "cash":
|
||||||
|
# REVIEW: Temporaly, if not cash session open, create a new one automatically
|
||||||
|
# Review this in pms_folio_service (/charge & /refund)
|
||||||
|
# and in pms_transaction_service (POST)
|
||||||
|
last_session = self._get_last_cash_session(journal_id=journal.id)
|
||||||
|
if last_session.state != "open":
|
||||||
|
self._action_open_cash_session(
|
||||||
|
pms_property_id=journal.pms_property_ids[0].id
|
||||||
|
if journal.pms_property_ids
|
||||||
|
else False,
|
||||||
|
amount=last_session.balance_end_real,
|
||||||
|
journal_id=journal.id,
|
||||||
|
force=False,
|
||||||
|
)
|
||||||
pay.sudo().action_post()
|
pay.sudo().action_post()
|
||||||
if is_internal_transfer:
|
if is_internal_transfer:
|
||||||
|
if journal.type == "cash":
|
||||||
|
# REVIEW: Temporaly, if not cash session open, create a new one automatically
|
||||||
|
# Review this in pms_folio_service (/charge & /refund)
|
||||||
|
# and in pms_transaction_service (POST)
|
||||||
|
last_session = self._get_last_cash_session(journal_id=journal.id)
|
||||||
|
if last_session.state != "open":
|
||||||
|
self._action_open_cash_session(
|
||||||
|
pms_property_id=journal.pms_property_ids[0]
|
||||||
|
if journal.pms_property_ids
|
||||||
|
else False,
|
||||||
|
amount=last_session.balance_end_real,
|
||||||
|
journal_id=pms_transaction_info.destinationJournalId,
|
||||||
|
force=False,
|
||||||
|
)
|
||||||
counterpart_vals = {
|
counterpart_vals = {
|
||||||
"amount": pms_transaction_info.amount,
|
"amount": pms_transaction_info.amount,
|
||||||
"journal_id": pms_transaction_info.destinationJournalId,
|
"journal_id": pms_transaction_info.destinationJournalId,
|
||||||
|
|||||||
Reference in New Issue
Block a user