diff --git a/pms_api_rest/datamodels/pms_account_payment.py b/pms_api_rest/datamodels/pms_account_payment.py index fbf96adcb..490cd8c6a 100644 --- a/pms_api_rest/datamodels/pms_account_payment.py +++ b/pms_api_rest/datamodels/pms_account_payment.py @@ -1,15 +1,52 @@ from marshmallow import fields from odoo.addons.datamodel.core import Datamodel +from odoo.addons.datamodel.fields import NestedModel class PmsPaymentInfo(Datamodel): _name = "pms.payment.info" id = fields.Integer(required=False, allow_none=True) + name = fields.String(required=False, allow_none=True) amount = fields.Float(required=False, allow_none=True) journalId = fields.Integer(required=False, allow_none=True) date = fields.String(required=False, allow_none=True) + partnerName = fields.String(required=False, allow_none=True) + partnerId = fields.Integer(required=False, allow_none=True) paymentType = fields.String(required=False, allow_none=True) + partnerType = fields.String(required=False, allow_none=True) + isTransfer = fields.Boolean(required=False, allow_none=True) reference = fields.String(required=False, allow_none=True) + createUid = fields.Integer(required=False, allow_none=True) + + +class PmsPaymentSearchParam(Datamodel): + _name = "pms.payment.search.param" + _inherit = "pms.rest.metadata" + pmsPropertyId = fields.Integer(required=True, allow_none=False) + filter = fields.String(required=False, allow_none=True) + dateStart = fields.String(required=False, allow_none=True) + dateEnd = fields.String(required=False, allow_none=True) + paymentMethodId = fields.Integer(required=False, allow_none=True) + # TODO: paymentTypes filter + paymentTypes = fields.List(fields.Integer(required=False, allow_none=True)) + paymentType = fields.String(required=False, allow_none=True) + partnerType = fields.String(required=False, allow_none=True) + isTransfer = fields.Boolean(required=False, allow_none=True) + + +class PmsPaymentResults(Datamodel): + _name = "pms.payment.results" + payments = fields.List(NestedModel("pms.payment.info")) + total = fields.Integer(required=False, allow_none=True) + totalPayments = fields.Integer(required=False, allow_none=True) + + +class PmsAccountPaymentInfo(Datamodel): + _name = "pms.account.payment.short.info" + id = fields.Integer(required=False, allow_none=True) + date = fields.String(required=False, allow_none=True) + journalId = fields.Integer(required=False, allow_none=True) + amount = fields.Float(required=False, allow_none=True) partnerId = fields.Integer(required=False, allow_none=True) reservationIds = fields.List(fields.Integer(), required=False) diff --git a/pms_api_rest/services/__init__.py b/pms_api_rest/services/__init__.py index f38e8f73d..371cd165c 100644 --- a/pms_api_rest/services/__init__.py +++ b/pms_api_rest/services/__init__.py @@ -35,6 +35,7 @@ from . import pms_service_line_service from . import pms_room_closure_reason_service from . import res_lang_service +from . import pms_account_payment_service from . import pms_account_payment_terms_service from . import pms_account_journal_service from . import pms_invoice_service diff --git a/pms_api_rest/services/pms_account_payment_service.py b/pms_api_rest/services/pms_account_payment_service.py new file mode 100644 index 000000000..b23c8136d --- /dev/null +++ b/pms_api_rest/services/pms_account_payment_service.py @@ -0,0 +1,101 @@ +from datetime import datetime +from odoo.addons.base_rest import restapi +from odoo.addons.base_rest_datamodel.restapi import Datamodel +from odoo.addons.component.core import Component +from odoo.odoo import fields +from odoo.osv import expression + + +class PmsAccountPaymentService(Component): + _inherit = "base.rest.service" + _name = "pms.account.payment.service" + _usage = "payments" + _collection = "pms.services" + + @restapi.method( + [ + ( + [ + "/", + ], + "GET", + ) + ], + input_param=Datamodel("pms.payment.search.param", is_list=False), + output_param=Datamodel("pms.payment.results", is_list=False), + auth="jwt_api_pms", + ) + def get_payments(self, pms_payments_search_param): + result_payments = [] + domain_fields = [] + available_journals = () + if pms_payments_search_param.pmsPropertyId: + available_journals = self.env["account.journal"].search( + [ + "&", + ("pms_property_ids", "in", pms_payments_search_param.pmsPropertyId), + ("pms_property_ids", "!=", False), + ] + ) + domain_fields.append(("journal_id", "in", available_journals.ids)) + domain_filter=list() + if pms_payments_search_param.filter: + # TODO: filter by folio and invoice + for search in pms_payments_search_param.filter.split(" "): + subdomains = [ + [("name", "ilike", search)], + # [("folio_id.name", "ilike", search)], + [("partner_id.display_name", "ilike", search)], + ] + domain_filter.append(expression.OR(subdomains)) + + if pms_payments_search_param.dateStart and pms_payments_search_param.dateEnd: + date_from = fields.Date.from_string(pms_payments_search_param.dateStart) + date_to = fields.Date.from_string(pms_payments_search_param.dateEnd) + domain_fields.extend([ + "&", + ("date", ">=", date_from), + ("date", "<", date_to), + ]) + if pms_payments_search_param.paymentMethodId: + domain_fields.append(("journal_id","=",pms_payments_search_param.paymentMethodId)) + # TODO: payment tyope filter (partner_type, payment_type, is_transfer) + if domain_filter: + domain = expression.AND([domain_fields, domain_filter[0]]) + else: + domain = domain_fields + + PmsPaymentResults = self.env.datamodels["pms.payment.results"] + PmsPaymentInfo = self.env.datamodels["pms.payment.info"] + + total_payments = self.env["account.payment"].search_count(domain) + for payment in self.env["account.payment"].search( + domain, + order=pms_payments_search_param.orderBy, + limit=pms_payments_search_param.limit, + offset=pms_payments_search_param.offset, + ): + result_payments.append( + PmsPaymentInfo( + id=payment.id, + name=payment.name if payment.name else None, + amount=payment.amount, + journalId=payment.journal_id.id + if payment.journal_id + else None, + date=payment.date.strftime("%d/%m/%Y"), + partnerId = payment.partner_id.id + if payment.partner_id + else None, + partnerName = payment.partner_id.name + if payment.partner_id + else None, + paymentType=payment.payment_type, + partnerType=payment.partner_type, + isTransfer=payment.is_internal_transfer, + reference=payment.ref if payment.ref else None, + createUid=payment.create_uid if payment.create_uid else None, + ) + ) + + return PmsPaymentResults(payments=result_payments, total=23333, totalPayments=total_payments)