Files
pms/hotel/models/currency_exchange.py
Dario Lodeiros a9a4e59882 First Commit
2018-07-26 13:06:48 +02:00

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