# Copyright 2018 Dario Lodeiros # Copyright 2018 Alexandre Díaz # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). from decimal import Decimal import time # For Python 3.0 and later from urllib.request import urlopen from openerp import models, fields, api, _ from odoo.tools import DEFAULT_SERVER_DATETIME_FORMAT 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