mirror of
https://github.com/OCA/pms.git
synced 2025-01-29 00:17:45 +02:00
[IMP] pms_api_rest: add open and close cash methods
This commit is contained in:
committed by
Darío Lodeiros
parent
f425d24ea2
commit
cf9a55b0c4
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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,
|
||||
)
|
||||
)
|
||||
|
||||
@@ -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,
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user