mirror of
https://github.com/OCA/pms.git
synced 2025-01-29 00:17:45 +02:00
151 lines
5.6 KiB
Python
151 lines
5.6 KiB
Python
# -*- coding: utf-8 -*-
|
|
# Copyright 2018 Alexandre Díaz
|
|
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
|
from decimal import Decimal
|
|
# For Python 3.0 and later
|
|
from urllib.request import urlopen
|
|
from openerp import models, fields, api, _
|
|
|
|
|
|
class CurrencyExchangeRate(models.Model):
|
|
|
|
_name = "currency.exchange"
|
|
_description = "currency"
|
|
|
|
name = fields.Char('Reg Number', readonly=True, default='New')
|
|
today_date = fields.Datetime('Date Ordered',
|
|
required=True,
|
|
default=(lambda *a:
|
|
time.strftime
|
|
(DEFAULT_SERVER_DATETIME_FORMAT)))
|
|
input_curr = fields.Many2one('res.currency', string='Input Currency',
|
|
track_visibility='always')
|
|
in_amount = fields.Float('Amount Taken', size=64, default=1.0)
|
|
out_curr = fields.Many2one('res.currency', string='Output Currency',
|
|
track_visibility='always')
|
|
out_amount = fields.Float('Subtotal', size=64)
|
|
folio_no = fields.Many2one('hotel.folio', 'Folio Number')
|
|
guest_name = fields.Many2one('res.partner', string='Guest Name')
|
|
room_number = fields.Char(string='Room Number')
|
|
state = fields.Selection([('draft', 'Draft'), ('done', 'Done'),
|
|
('cancel', 'Cancel')], 'State', default='draft')
|
|
rate = fields.Float('Rate(per unit)', size=64)
|
|
hotel_id = fields.Many2one('stock.warehouse', 'Hotel Name')
|
|
type = fields.Selection([('cash', 'Cash')], 'Type', default='cash')
|
|
tax = fields.Selection([('2', '2%'), ('5', '5%'), ('10', '10%')],
|
|
'Service Tax', default='2')
|
|
total = fields.Float('Amount Given')
|
|
|
|
@api.model
|
|
def create(self, vals):
|
|
"""
|
|
Overrides orm create method.
|
|
@param self: The object pointer
|
|
@param vals: dictionary of fields value.
|
|
"""
|
|
if not vals:
|
|
vals = {}
|
|
if self._context is None:
|
|
self._context = {}
|
|
seq_obj = self.env['ir.sequence']
|
|
vals['name'] = seq_obj.next_by_code('currency.exchange') or 'New'
|
|
return super(CurrencyExchangeRate, self).create(vals)
|
|
|
|
@api.onchange('folio_no')
|
|
def get_folio_no(self):
|
|
'''
|
|
When you change folio_no, based on that it will update
|
|
the guest_name,hotel_id and room_number as well
|
|
---------------------------------------------------------
|
|
@param self: object pointer
|
|
'''
|
|
for rec in self:
|
|
self.guest_name = False
|
|
self.hotel_id = False
|
|
self.room_number = False
|
|
if rec.folio_no and len(rec.folio_no.room_lines) != 0:
|
|
self.guest_name = rec.folio_no.partner_id.id
|
|
self.hotel_id = rec.folio_no.warehouse_id.id
|
|
self.room_number = rec.folio_no.room_lines[0].product_id.name
|
|
|
|
@api.multi
|
|
def act_cur_done(self):
|
|
"""
|
|
This method is used to change the state
|
|
to done of the currency exchange
|
|
---------------------------------------
|
|
@param self: object pointer
|
|
"""
|
|
self.write({'state': 'done'})
|
|
return True
|
|
|
|
@api.multi
|
|
def act_cur_cancel(self):
|
|
"""
|
|
This method is used to change the state
|
|
to cancel of the currency exchange
|
|
---------------------------------------
|
|
@param self: object pointer
|
|
"""
|
|
self.write({'state': 'cancel'})
|
|
return True
|
|
|
|
@api.multi
|
|
def act_cur_cancel_draft(self):
|
|
"""
|
|
This method is used to change the state
|
|
to draft of the currency exchange
|
|
---------------------------------------
|
|
@param self: object pointer
|
|
"""
|
|
self.write({'state': 'draft'})
|
|
return True
|
|
|
|
@api.model
|
|
def get_rate(self, a, b):
|
|
'''
|
|
Calculate rate between two currency
|
|
-----------------------------------
|
|
@param self: object pointer
|
|
'''
|
|
try:
|
|
url = 'http://finance.yahoo.com/d/quotes.csv?s=%s%s=X&f=l1' % (a,
|
|
b)
|
|
rate = urllib2.urlopen(url).read().rstrip()
|
|
return Decimal(rate)
|
|
except:
|
|
return Decimal('-1.00')
|
|
|
|
@api.onchange('input_curr', 'out_curr', 'in_amount')
|
|
def get_currency(self):
|
|
'''
|
|
When you change input_curr, out_curr or in_amount
|
|
it will update the out_amount of the currency exchange
|
|
------------------------------------------------------
|
|
@param self: object pointer
|
|
'''
|
|
self.out_amount = 0.0
|
|
if self.input_curr:
|
|
for rec in self:
|
|
result = rec.get_rate(self.input_curr.name,
|
|
self.out_curr.name)
|
|
if self.out_curr:
|
|
self.rate = result
|
|
if self.rate == Decimal('-1.00'):
|
|
raise except_orm(_('Warning'),
|
|
_('Please Check Your \
|
|
Network Connectivity.'))
|
|
self.out_amount = (float(result) * float(self.in_amount))
|
|
|
|
@api.onchange('out_amount', 'tax')
|
|
def tax_change(self):
|
|
'''
|
|
When you change out_amount or tax
|
|
it will update the total of the currency exchange
|
|
-------------------------------------------------
|
|
@param self: object pointer
|
|
'''
|
|
if self.out_amount:
|
|
ser_tax = ((self.out_amount) * (float(self.tax))) / 100
|
|
self.total = self.out_amount - ser_tax
|