[IMP] pms_api_rest: add open and close cash methods

This commit is contained in:
Sara Lago
2022-11-02 14:52:16 +01:00
committed by Darío Lodeiros
parent f425d24ea2
commit cf9a55b0c4
5 changed files with 136 additions and 2 deletions

View File

@@ -12,4 +12,5 @@ class PmsAccountJournalInfo(Datamodel):
_name = "pms.account.journal.info"
id = fields.Integer(required=False, allow_none=True)
name = fields.String(required=False, allow_none=True)
type = fields.String(required=False, allow_none=True)
allowedPayments = fields.Boolean(required=False, allow_none=True)

View File

@@ -38,7 +38,7 @@ class PmsPaymentSearchParam(Datamodel):
class PmsPaymentResults(Datamodel):
_name = "pms.payment.results"
payments = fields.List(NestedModel("pms.payment.info"))
total = fields.Integer(required=False, allow_none=True)
total = fields.Float(required=False, allow_none=True)
totalPayments = fields.Integer(required=False, allow_none=True)

View File

@@ -8,10 +8,25 @@ class PmsCashRegisterInfo(Datamodel):
id = fields.Integer(required=False, allow_none=True)
state = fields.String(required=False, allow_none=True)
userId = fields.Integer(required=False, allow_none=True)
balance = fields.Integer(required=False, allow_none=True)
balance = fields.Float(required=False, allow_none=True)
dateTime = fields.String(required=False, allow_none=True)
class PmsCashRegisterSearchParam(Datamodel):
_name = "pms.cash.register.search.param"
journalId = fields.Integer(required=False, allow_none=True)
class PmsCashRegisterAction(Datamodel):
_name = "pms.cash.register.action"
action = fields.String(required=False, allow_none=True)
pmsPropertyId = fields.Integer(required=False, allow_none=True)
amount = fields.Float(required=False, allow_none=True)
journalId = fields.Integer(required=False, allow_none=True)
forceAction = fields.Boolean(required=False, allow_none=True)
class PmsCashRegisterResult(Datamodel):
_name = "pms.cash.register.result"
result = fields.Boolean(required=False, allow_none=False)
diff = fields.Float(required=False, allow_none=True)

View File

@@ -39,6 +39,7 @@ class PmsAccountJournalService(Component):
PmsAccountJournalInfo(
id=payment_method.id,
name=payment_method.name,
type=payment_method.type,
allowedPayments=payment_method.allowed_pms_payments,
)
)

View File

@@ -1,4 +1,9 @@
from datetime import datetime
from odoo import _
from odoo.odoo import fields
from odoo.odoo.exceptions import ValidationError
from odoo.odoo.tools import get_lang
from odoo.osv import expression
from odoo.addons.base_rest import restapi
@@ -150,3 +155,115 @@ class PmsAccountPaymentService(Component):
if isOpen
else statement.date_done.strftime("%d/%m/%Y"),
)
@restapi.method(
[
(
[
"/p/cash-register",
],
"POST",
)
],
input_param=Datamodel("pms.cash.register.action", is_list=False),
output_param=Datamodel("pms.cash.register.result", is_list=False),
auth="jwt_api_pms",
)
def cash_register(self, cash_register_action):
PmsCashRegisterResult = self.env.datamodels["pms.cash.register.result"]
if cash_register_action.action == "open":
dict_result = self._action_open_cash_session(
pms_property_id=cash_register_action.pmsPropertyId,
amount=cash_register_action.amount,
journal_id=cash_register_action.journalId,
force=cash_register_action.forceAction,
)
elif cash_register_action.action == "close":
dict_result = self._action_close_cash_session(
pms_property_id=cash_register_action.pmsPropertyId,
amount=cash_register_action.amount,
journal_id=cash_register_action.journalId,
force=cash_register_action.forceAction,
)
else:
raise ValidationError(
_("No action cash register found (only allowed open/close actions")
)
return PmsCashRegisterResult(
result=dict_result["result"],
diff=dict_result["diff"],
)
def _action_open_cash_session(self, pms_property_id, amount, journal_id, force):
statement = (
self.env["account.bank.statement"]
.sudo()
.search(
[
("journal_id", "=", journal_id),
],
limit=1,
)
)
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 _action_close_cash_session(self, pms_property_id, amount, journal_id, force):
statement = (
self.env["account.bank.statement"]
.sudo()
.search(
[
("journal_id", "=", journal_id),
("state", "=", "open"),
("pms_property_id", "=", pms_property_id),
],
limit=1,
)
)
if round(statement.balance_end, 2) == round(amount, 2):
statement.sudo().balance_end_real = amount
statement.sudo().button_post()
return {
"result": True,
"diff": 0,
}
elif force:
# Not call to button post to avoid create profit/loss line
# (_check_balance_end_real_same_as_computed)
if not statement.name:
statement.sudo()._set_next_sequence()
statement.sudo().balance_end_real = amount
statement.write({"state": "posted"})
lines_of_moves_to_post = statement.line_ids.filtered(
lambda line: line.move_id.state != "posted"
)
if lines_of_moves_to_post:
lines_of_moves_to_post.move_id._post(soft=False)
diff = round(amount - statement.balance_end, 2)
return {
"result": True,
"diff": diff,
}
else:
diff = round(amount - statement.balance_end, 2)
return {
"result": False,
"diff": diff,
}