class policy_line_ot(models.Model): _name = 'hr.policy.line.ot' def _tz_list(self, cr, uid, context=None): res = tuple() for name in common_timezones: res += ((name, name),) return res _columns = { 'name': fields.char('Name', size=64, required=True), 'policy_id': fields.many2one('hr.policy.ot', 'Policy'), 'type': fields.selection([('daily', 'Daily'), ('weekly', 'Weekly'), ('restday', 'Rest Day'), ('holiday', 'Public Holiday')], 'Type', required=True), 'weekly_working_days': fields.integer('Weekly Working Days'), 'active_after': fields.integer( 'Active After', help="Minutes after which this policy applies"), 'active_start_time': fields.char( 'Active Start Time', size=5, help="Time in 24 hour time format"), 'active_end_time': fields.char( 'Active End Time', size=5, help="Time in 24 hour time format"), 'tz': fields.selection(_tz_list, 'Time Zone'), 'rate': fields.float( 'Rate', required=True, help='Multiplier of employee wage.'), 'code': fields.char( 'Code', required=True, help="Use this code in the salary rules.") }
class policy_line_presence(models.Model): _name = 'hr.policy.line.presence' _columns = { 'name': fields.char('Name', size=64, required=True), 'policy_id': fields.many2one('hr.policy.presence', 'Policy'), 'code': fields.char('Code', required=True, help="Use this code in the salary rules."), 'rate': fields.float('Rate', required=True, help='Multiplier of employee wage.'), 'type': fields.selection([('normal', 'Normal Working Hours'), ('holiday', 'Holidays'), ('restday', 'Rest Days')], 'Type', required=True), 'active_after': fields.integer( 'Active After', required=True, help='Minutes after first punch of the day in which policy will ' 'take effect.'), 'duration': fields.integer('Duration', required=True, help="In minutes.") } _defaults = { 'rate': 1.0, }
class mrp_production_workcenter_line(osv.osv): _name = 'mrp.production.workcenter.line' _inherit = 'mrp.production.workcenter.line' _columns = { 'man_hour_standard': fields.float('Man Hour Standard', digits=(16, 2)), 'man_number_standard': fields.integer('Man Number Standard'), 'man_hour_actual': fields.float('Man Hour Actual', digits=(16, 2)), 'man_number_actual': fields.integer('Man Number Actual'), 'man_hour_diff': fields.float('Man Hour Diff', digits=(16, 2)), 'man_number_diff': fields.integer('Man Number Diff'), 'wo_machine_hour_lines': fields.one2many('vit_pharmacy_wo_hour.wo_machine_hour', 'mpwcl_id', 'Wo Machine Hour'), } @api.onchange('man_hour_actual', 'man_number_actual' ) # if these fields are changed, call method def on_change_nett_diff(self): self.man_hour_diff = self.man_hour_standard - self.man_hour_actual self.man_number_diff = self.man_number_standard - self.man_number_actual
class mrp_products_qty(orm.Model): _name = 'production.product' _columns = { 'product_id': fields.integer('producto'), 'product_qty': fields.integer('Cantidad producto'), 'product_name': fields.char('nombre producto'), 'id_gasto': fields.integer('id gasto') }
class journal_expenses(orm.Model): _name = 'journal.details' _columns = { 'journal_name': fields.char('Nombre diario'), 'id_periodo': fields.integer('id periodo'), 'period_name': fields.char('Nombre periodo'), 'gasto_detallado': fields.float('Gasto sin impuesto'), 'id_gasto': fields.integer('ID gasto') }
class generate_pairkey(models.Model): _name = 'crypto.generate_pairkey' _columns = { 'name': fields.char('Pair key name', size=63), 'key_length': fields.integer('Key lenght'), 'update': fields.boolean('Update key'), } _defaults = { 'key_length': 1024, } def on_generate(self, cr, uid, ids, context): if context is None: context = {} active_ids = context['active_ids'] pairkey_obj = self.pool.get('crypto.pairkey') for wizard in self.browse(cr, uid, ids): pairkey_obj.generate_keys(cr, uid, active_ids, key_length=wizard.key_length) pairkey_obj.action_validate(cr, uid, active_ids) return {'type': 'ir.actions.act_window_close'} def on_cancel(self, cr, uid, ids, context): return {}
class Sale_config_settings(osv.TransientModel): _inherit = 'sale.config.settings' _columns = { 'limit_discount': fields.integer( 'Discount limit requires approval %', required=True, help="Discount after which approval of sale is required."), 'module_sale_discount_approval': fields.boolean( "Force two levels of approvals", help= 'Provide a double validation mechanism for sale exceeding minimum discount.\n' ), } _defaults = { 'limit_discount': 40, } def get_default_limit_discount(self, cr, uid, ids, context=None): ir_values = self.pool.get('ir.values') limit_discount = ir_values.get_default(cr, uid, 'sale.config.settings', 'limit_discount') return { 'limit_discount': limit_discount, } def set_limit_discount(self, cr, uid, ids, context=None): ir_values = self.pool.get('ir.values') wizard = self.browse(cr, uid, ids)[0] if wizard.limit_discount: limit_discount = wizard.limit_discount ir_values.set_default(cr, SUPERUSER_ID, 'sale.config.settings', 'limit_discount', limit_discount) def get_default_module_sale_discount_approval(self, cr, uid, ids, context=None): ir_values = self.pool.get('ir.values') module_sale_discount_approval = ir_values.get_default( cr, uid, 'sale.config.settings', 'module_sale_discount_approval') return { 'module_sale_discount_approval': module_sale_discount_approval == 'True', } def set_module_sale_discount_approval(self, cr, uid, ids, context=None): ir_values = self.pool.get('ir.values') wizard = self.browse(cr, uid, ids)[0] if wizard.module_sale_discount_approval: module_sale_discount_approval = 'True' else: module_sale_discount_approval = 'False' ir_values.set_default(cr, SUPERUSER_ID, 'sale.config.settings', 'module_sale_discount_approval', module_sale_discount_approval)
class policy_presence(models.Model): _name = 'hr.policy.presence' _columns = { 'name': fields.char('Name', size=128, required=True), 'date': fields.date('Effective Date', required=True), 'work_days_per_month': fields.integer('Working Days/Month', required=True), 'line_ids': fields.one2many('hr.policy.line.presence', 'policy_id', 'Policy Lines'), } _defaults = { 'work_days_per_month': 26, } # Return records with latest date first _order = 'date desc' def get_codes(self, cr, uid, idx, context=None): res = [] [ res.append( (line.code, line.name, line.type, line.rate, line.duration)) for line in self.browse(cr, uid, idx, context=context).line_ids ] return res
class gamification_badge_wizard(osv.Model): _name = 'gamification.badge.user.wizard' _inherit = 'gamification.badge.user.wizard' _columns = { 'custom_value': fields.integer( string="Insignea ganada al") } def custom_grant_badge(self, cr, uid, ids, context=None): """Wizard action for sending a badge to a chosen user""" badge_user_obj = self.pool.get('gamification.badge.user') for wiz in self.browse(cr, uid, ids, context=context): if uid == wiz.user_id.id: raise UserError(_('You can not grant a badge to yourself')) #create the badge values = { 'user_id': wiz.user_id.id, 'sender_id': uid, 'badge_id': wiz.badge_id.id, 'comment': wiz.comment, 'custom_value': wiz.custom_value } badge_user = badge_user_obj.create(cr, uid, values, context=context) result = badge_user_obj._send_badge(cr, uid, badge_user, context=context) return result
class hr_holidays_status(osv.osv): _name = "hr.holidays.status" _inherit = "hr.holidays.status" _description = "Leave Type Extended" _columns = { 'year': fields.integer('Year'), }
class gamification_badge_user(osv.Model): _name = 'gamification.badge.user' _inherit = 'gamification.badge.user' _columns = { 'custom_value': fields.integer( string="Insignea ganada al") }
class gamification_badge(osv.Model): _name = 'gamification.badge' _inherit = 'gamification.badge' _columns = { 'custom_value': fields.integer( string="Valor de la Insignea") }
class wolftrakglobal_report_608(osv.osv): _name = 'wolftrakglobal.report608' _columns = { 'invoices': fields.many2many('account.invoice', domain=[('type', '=', 'out_refund'), ('company_id', '=', 3)], string="Facturas"), 'desde_608': fields.date('Desde:'), 'desde_str': fields.char(compute='_toma_desde'), 'hasta_608': fields.date('Hasta:'), 'hasta_str': fields.char(compute='_toma_hasta'), 'periodo': fields.char(compute='_toma_periodo', readonly=True, string='Periodo'), 'cant_reg': fields.integer('Cantidad de registros') } _defaults = { 'desde_608': lambda *a: time.strftime('%Y-%m-01'), 'hasta_608': lambda *a: str(datetime.now() + relativedelta.relativedelta( months=+1, day=1, days=-1))[:10], } @api.onchange('invoices') def _toma_registro(self): for value in self.invoices: self.cant_reg = len(self.invoices) @api.depends('hasta_608') def _toma_periodo(self): month = str(self.hasta_608[5:7]) year = str(self.hasta_608[:4]) self.periodo = year + month @api.depends('desde_608') def _toma_desde(self): year = str(self.desde_608[:4]) month = str(self.desde_608[5:7]) day = str(self.desde_608[8:10]) self.desde_str = year + month + day @api.depends('hasta_608') def _toma_hasta(self): year = str(self.hasta_608[:4]) month = str(self.hasta_608[5:7]) day = str(self.hasta_608[8:10]) self.hasta_str = year + month + day
class custom_calendar_event(osv.osv): _name = "calendar.event" _inherit = 'calendar.event' @api.depends('x_categ_id','x_partner_id') def _compute_categ_id_char(self): self.x_categ_id_char = self.x_categ_id.name if self.x_categ_id_char and self.x_partner_id.display_name and self.x_partner_id.phone: self.name = self.x_categ_id_char+' : '+self.x_partner_id.display_name+', '+self.x_partner_id.phone elif self.x_categ_id_char and self.x_partner_id.display_name: self.name = self.x_categ_id_char+' : '+self.x_partner_id.display_name elif self.x_partner_id.display_name: self.name = self.x_partner_id.display_name elif self.x_categ_id_char: self.name = self.x_categ_id_char else: _columns = { 'x_domicile': fields.boolean('A domicile'), 'x_partner_id': fields.many2one('res.partner', 'Attendee', default=''), 'x_categ_id': fields.many2one('calendar.event.type', 'Tags'), 'x_categ_id_char': fields.char(compute='_compute_categ_id_char', default=''), 'x_event_is_billed': fields.boolean('is_billed'), 'x_event_is_printed': fields.boolean('is_printed'), # related field res.partner # ------------------------- 'x_event_display_name' : fields.related('x_partner_id', 'display_name', type="char"), 'x_event_name' : fields.related('x_partner_id', 'name', type="char"), 'x_event_phone' : fields.related('x_partner_id', 'phone', type="char", default=''), 'x_event_patient_prenom': fields.related('x_partner_id', 'x_patient_prenom', type="char"), 'x_event_patient_sexe': fields.related('x_partner_id', 'x_patient_sexe', type="selection", selection=SEXE_SELECTION), 'x_event_patient_cafat': fields.related('x_partner_id', 'x_patient_cafat', type="char"), 'x_event_dob': fields.date(related='x_partner_id.dob'), 'x_event_age' : fields.integer(related='x_partner_id.age'), 'x_event_src_avatar' : fields.binary(related='x_partner_id.x_src_avatar'), 'x_event_medecin_traitant': fields.char(related='x_partner_id.x_medecin_traitant'), ########## MEDICAL INFO ??? # 'x_event_groupe_sang': fields.related('x_partner_id', 'x_groupe_sang', type="selection", selection=GRP_SANG_SELECTION), # 'x_event_taille': fields.float(related='x_partner_id.x_taille'), # 'x_event_poids': fields.float(related='x_partner_id.x_poids'), # 'x_event_IMC': fields.float(related='x_partner_id.x_IMC'), ########## # related field calendar_event_type # ------------------------- 'x_event_codeActe': fields.char(related='x_categ_id.x_code_acte', size=8), 'x_event_priceActe': fields.float(related='x_categ_id.x_price_acte', digits=(4,0)), # ------------------------- } _default = { 'x_domicile': False, }
class mrp_cost_category(models.Model): _name = 'mrp.cost.category' _description = "Cost Category" # valoare materiale determinate * procent + suma fixa # la costurile de tip view se face insmarea categoriilor inferioare name = field.Char( string='Name' ) #materiale , #manopera, #utilaje, # transport, #chirie, #altele #base = field.Selection([('bom_qty','BOM Quantity'),('bom_val','BOM Value')]) domain = field.Char( string="Domain", default='[()]') #se selecteaza din bom doar liniile utilizand domeniu percent = fields.Float( string='Percent', help="For Cost Value percent enter % ratio between 0-1.", default=1.0) type = fields.Selection( [('view', 'View'), ('normal', 'Normal')], 'Category Type', help= "A category of the view type is a virtual category that can be used as the parent of another category to create a hierarchical structure." ), parent_id = fields.Many2one('mrp.cost.category', string='Parent Category', select=True, ondelete='cascade') child_id = fields.One2many('mrp.cost.category', 'parent_id', string='Child Categories') parent_left = fields.integer(string='Left Parent', select=1) parent_right = fields.integer(string='Right Parent', select=1)
class barcode_rule(models.Model): _name = 'barcode.rule' _order = 'sequence asc' @api.model def _encoding_selection_list(self): return [ ('any', _('Any')), ('ean13', 'EAN-13'), ('ean8', 'EAN-8'), ('upca', 'UPC-A'), ] @api.model def _get_type_selection(self): return [('alias', _('Alias')), ('product', _('Unit Product'))] _columns = { 'name': fields.char('Rule Name', size=32, required=True, help='An internal identification for this barcode nomenclature rule'), 'barcode_nomenclature_id': fields.many2one('barcode.nomenclature','Barcode Nomenclature'), 'sequence': fields.integer('Sequence', help='Used to order rules such that rules with a smaller sequence match first'), 'encoding': fields.selection('_encoding_selection_list','Encoding',required=True,help='This rule will apply only if the barcode is encoded with the specified encoding'), 'type': fields.selection('_get_type_selection','Type', required=True), 'pattern': fields.char('Barcode Pattern', size=32, help="The barcode matching pattern", required=True), 'alias': fields.char('Alias',size=32,help='The matched pattern will alias to this barcode', required=True), } _defaults = { 'type': 'product', 'pattern': '.*', 'encoding': 'any', 'alias': "0", } @api.one @api.constrains('pattern') def _check_pattern(self): p = self.pattern.replace("\\\\", "X").replace("\{", "X").replace("\}", "X") findall = re.findall("[{]|[}]", p) # p does not contain escaped { or } if len(findall) == 2: if not re.search("[{][N]*[D]*[}]", p): raise ValidationError(_("There is a syntax error in the barcode pattern ") + self.pattern + _(": braces can only contain N's followed by D's.")) elif re.search("[{][}]", p): raise ValidationError(_("There is a syntax error in the barcode pattern ") + self.pattern + _(": empty braces.")) elif len(findall) != 0: raise ValidationError(_("There is a syntax error in the barcode pattern ") + self.pattern + _(": a rule can only contain one pair of braces.")) elif p == '*': raise ValidationError(_(" '*' is not a valid Regex Barcode Pattern. Did you mean '.*' ?"))
class account_journal_section_wizard(osv.osv_memory): _name = 'account.journal.section.wizard' _columns = { 'section_id': fields.many2one('crm.case.section', 'Sales Team'), 'point_of_sale': fields.integer(string='Punto de venta') } _defaults = {} def do_set_section(self, cr, uid, ids, context=None): journal = self.read(cr, uid, ids[0], ['section_id', 'point_of_sale']) cr.execute( """update account_journal set section_id=%s where point_of_sale=%s """, (journal['section_id'][0], journal['point_of_sale'])) return {}
class biblioteca_libro(osv.osv): _name = 'biblioteca.libro' _description = 'biblioteca' _columns = { #'libros_id': fields.many2one('tipo.libro', string="tipo de libro", # required=True, select=True, RELACION MUCHOS A UNO # help='Tipo de libro', store=True ), #RELACION MUCHOS A MUCHOS CON LA TABLA TIPO.LIBRO 'tipos_id': fields.many2many('tipo.libro', 'tipo_libro_rel', id1='libro_id', id2='tipo_id', string="tipo de libro"), 'prestamo_id': fields.many2one('prestamo.libro', string="prestamo de libro",required=False, select=True, store=True), 'name':fields.char('nombre', size=64, required=False, readonly=False), 'description': fields.text('Description'), 'date': fields.date('fecha publicacion'), 'autor':fields.char('autor', size=64, required=False, readonly=False), 'cantidad':fields.integer('numero de libros disponibles', required=True, store=True), } _defaults = { 'prestamo_id': "no hay prestamos" } @api.onchange('prestamo_id') # indicamos los campos que van a cambiar def _onchange_edad(self): self.cantidad = self.cantidad -1
class account_financial_report(osv.osv): _name = "afr" _columns = { 'name': fields.char('Name', size=128, required=True), 'company_id': fields.many2one('res.company', 'Company', required=True), 'currency_id': fields.many2one( 'res.currency', 'Currency', help= "Currency at which this report will be expressed. If not selected will be used the one set in the company" ), 'inf_type': fields.selection([('BS', 'Balance Sheet'), ('IS', 'Income Statement')], 'Type', required=True), 'columns': fields.selection([('one', 'End. Balance'), ('two', 'Debit | Credit'), ('four', 'Initial | Debit | Credit | YTD'), ('five', 'Initial | Debit | Credit | Period | YTD'), ('qtr', "4 QTR's | YTD"), ('thirteen', '12 Months | YTD')], 'Columns', required=True), 'display_account': fields.selection([('all', 'All Accounts'), ('bal', 'With Balance'), ('mov', 'With movements'), ('bal_mov', 'With Balance / Movements')], 'Display accounts'), 'display_account_level': fields.integer( 'Up to level', help='Display accounts up to this level (0 to show all)'), 'account_ids': fields.many2many('account.account', 'afr_account_rel', 'afr_id', 'account_id', 'Root accounts', required=True), 'fiscalyear_id': fields.many2one('account.fiscalyear', 'Fiscal year', help='Fiscal Year for this report', required=True), 'period_ids': fields.many2many('account.period', 'afr_period_rel', 'afr_id', 'period_id', 'Periods', help='All periods in the fiscal year if empty'), 'analytic_ledger': fields.boolean( 'Analytic Ledger', help= "Allows to Generate an Analytic Ledger for accounts with moves. Available when Balance Sheet and 'Initial | Debit | Credit | YTD' are selected" ), 'journal_ledger': fields.boolean( 'journal Ledger', help= "Allows to Generate an journal Ledger for accounts with moves. Available when Balance Sheet and 'Initial | Debit | Credit | YTD' are selected" ), 'partner_balance': fields.boolean( 'Partner Balance', help="Allows to " "Generate a Partner Balance for accounts with moves. Available when " "Balance Sheet and 'Initial | Debit | Credit | YTD' are selected"), 'tot_check': fields.boolean( 'Summarize?', help= 'Checking will add a new line at the end of the Report which will Summarize Columns in Report' ), 'lab_str': fields.char('Description', help='Description for the Summary', size=128), 'target_move': fields.selection( [ ('posted', 'All Posted Entries'), ('all', 'All Entries'), ], 'Entries to Include', required=True, help= 'Print All Accounting Entries or just Posted Accounting Entries'), #~ Deprecated fields 'filter': fields.selection([('bydate', 'By Date'), ('byperiod', 'By Period'), ('all', 'By Date and Period'), ('none', 'No Filter')], 'Date/Period Filter'), 'date_to': fields.date('End date'), 'date_from': fields.date('Start date'), } _defaults = { 'display_account_level': lambda *a: 0, 'inf_type': lambda *a: 'BS', 'company_id': lambda self, cr, uid, c: self.pool.get('res.company'). _company_default_get(cr, uid, 'account.invoice', context=c), 'fiscalyear_id': lambda self, cr, uid, c: self.pool.get('account.fiscalyear').find( cr, uid), 'display_account': lambda *a: 'bal_mov', 'columns': lambda *a: 'five', 'date_from': lambda *a: time.strftime('%Y-%m-%d'), 'date_to': lambda *a: time.strftime('%Y-%m-%d'), 'filter': lambda *a: 'byperiod', 'target_move': 'posted', } def copy(self, cr, uid, id, defaults, context=None): if context is None: context = {} previous_name = self.browse(cr, uid, id, context=context).name new_name = _('Copy of %s') % previous_name lst = self.search(cr, uid, [('name', 'like', new_name)], context=context) if lst: new_name = '%s (%s)' % (new_name, len(lst) + 1) defaults['name'] = new_name return (super(account_financial_report, self).copy(cr, uid, id, defaults, context=context)) @api.onchange('inf_type') def onchange_inf_type(self): if self.inf_type != 'BS': self.analytic_ledger = False @api.onchange('columns', 'fiscalyear_id', 'period_ids') def onchange_columns(self): if self.columns != 'four': self.analytic_ledger = False if self.columns in ('qtr', 'thirteen'): p_obj = self.env["account.period"] period_ids = p_obj.search([('fiscalyear_id', '=', self.fiscalyear_id.id), ('special', '=', False)]) self.period_ids = period_ids else: self.period_ids = [] @api.onchange('company_id', 'analytic_ledger') def onchange_analytic_ledger(self): self = self.with_context(company_id=self.company_id.id) cur_id = self.env['res.company'].browse(self.company_id).currency_id.id self.currency_id = cur_id @api.onchange('company_id') def onchange_company_id(self): self = self.with_context(company_id=self.company_id.id) cur_id = self.env['res.company'].browse(self.company_id).currency_id.id fy_id = self.env['account.fiscalyear'].find() self.fiscalyear_id = fy_id self.currency_id = cur_id self.account_ids = [] self.period_ids = []
class hr_policy_line(models.Model): _name = 'hr.policy.line.accrual' _description = 'Accrual Policy Line' _columns = { 'name': fields.char('Name', size=64, required=True), 'code': fields.char('Code', size=16, required=True), 'policy_id': fields.many2one('hr.policy.accrual', 'Accrual Policy'), 'accrual_id': fields.many2one('hr.accrual', 'Accrual Account', required=True), 'type': fields.selection([('standard', 'Standard'), ('calendar', 'Calendar')], 'Type', required=True), 'balance_on_payslip': fields.boolean( 'Display Balance on Pay Slip', help='The pay slip report must be modified to display this accrual' ' for this setting to have any effect.'), 'calculation_frequency': fields.selection([ ('weekly', 'Weekly'), ('monthly', 'Monthly'), ('annual', 'Annual'), ], 'Calculation Frequency', required=True), 'frequency_on_hire_date': fields.boolean('Frequency Based on Hire Date'), 'frequency_week_day': fields.selection([ ('0', 'Monday'), ('1', 'Tuesday'), ('2', 'Wednesday'), ('3', 'Thursday'), ('4', 'Friday'), ('5', 'Saturday'), ('6', 'Sunday'), ], 'Week Day'), 'frequency_month_day': fields.selection([ ('1', '1'), ('2', '2'), ('3', '3'), ('4', '4'), ('5', '5'), ('6', '6'), ('7', '7'), ('8', '8'), ('9', '9'), ('10', '10'), ('11', '11'), ('12', '12'), ('13', '13'), ('14', '14'), ('15', '15'), ('16', '16'), ('17', '17'), ('18', '18'), ('19', '19'), ('20', '20'), ('21', '21'), ('22', '22'), ('23', '23'), ('24', '24'), ('25', '25'), ('26', '26'), ('27', '27'), ('28', '28'), ('29', '29'), ('30', '30'), ('31', '31'), ], 'Day of Month'), 'frequency_annual_month': fields.selection([ ('1', 'January'), ('2', 'February'), ('3', 'March'), ('4', 'April'), ('5', 'May'), ('6', 'June'), ('7', 'July'), ('8', 'August'), ('9', 'September'), ('10', 'October'), ('11', 'November'), ('12', 'December'), ], 'Month'), 'frequency_annual_day': fields.selection([ ('1', '1'), ('2', '2'), ('3', '3'), ('4', '4'), ('5', '5'), ('6', '6'), ('7', '7'), ('8', '8'), ('9', '9'), ('10', '10'), ('11', '11'), ('12', '12'), ('13', '13'), ('14', '14'), ('15', '15'), ('16', '16'), ('17', '17'), ('18', '18'), ('19', '19'), ('20', '20'), ('21', '21'), ('22', '22'), ('23', '23'), ('24', '24'), ('25', '25'), ('26', '26'), ('27', '27'), ('28', '28'), ('29', '29'), ('30', '30'), ('31', '31'), ], 'Day of Month'), 'minimum_employed_days': fields.integer('Minimum Employed Days'), 'accrual_rate': fields.float('Accrual Rate', required=True, help='The rate, in days, accrued per year.'), 'accrual_rate_premium': fields.float( 'Accrual Rate Premium', required=True, help='The additional amount of time (beyond the standard rate) ' 'accrued per Premium Milestone of service.'), 'accrual_rate_premium_minimum': fields.integer( 'Months of Employment Before Premium', required=True, help="Minimum number of months the employee must be employed " "before the premium rate will start to accrue."), 'accrual_rate_premium_milestone': fields.integer( 'Accrual Premium Milestone', required=True, help="Number of milestone months after which the premium rate will" " be added."), 'accrual_rate_max': fields.float( 'Maximum Accrual Rate', required=True, help='The maximum amount of time that may accrue per year. ' 'Zero means the amount may keep increasing indefinitely.'), 'job_ids': fields.one2many('hr.policy.line.accrual.job', 'policy_line_id', 'Jobs', readonly=True), } _defaults = { 'type': 'calendar', 'minimum_employed_days': 0, 'accrual_rate_max': 0.0, 'accrual_rate_premium_minimum': 12, }
class wolftrakglobal_report_606(osv.osv): _name = 'wolftrakglobal.report606' def _toma_default_pagos(self, cr, uid, context=None): return self.pool.get('account.payment').search( cr, uid, []) # retorna una lista (importate) _columns = { 'invoices': fields.many2many('account.invoice', domain=[('type', '=', 'in_invoice'), ('state', '!=', 'draft'), ('company_id', '=', 3)]), 'payments': fields.many2many('account.payment'), 'dt_payments': fields.selection([('default', 'Default'), ('x', 'y'), ('z', 'aa')], string="Fecha Pagos"), 'desde_606': fields.date('Desde:'), 'desde_str': fields.char(compute='_toma_desde'), 'hasta_606': fields.date('Hasta:'), 'hasta_str': fields.char(compute='_toma_hasta'), 'periodo': fields.char(compute='_toma_periodo', string='Periodo', readonly=True), 'cant_reg': fields.integer('Cantidad de registros'), 'total_rtn': fields.float('ITBIS Retenido: '), 'total_cld': fields.float('Total Calculado: '), 'total_tax': fields.float('ITBIS Calculado: ') } _defaults = { 'desde_606': lambda *a: time.strftime('%Y-%m-01'), 'hasta_606': lambda *a: str(datetime.now() + relativedelta.relativedelta( months=+1, day=1, days=-1))[:10], 'payments': _toma_default_pagos } @api.depends('hasta_606') def _toma_periodo(self): month = str(self.hasta_606[5:7]) year = str(self.hasta_606[:4]) self.periodo = year + month @api.depends('desde_606') def _toma_desde(self): year = str(self.desde_606[:4]) month = str(self.desde_606[5:7]) day = str(self.desde_606[8:10]) self.desde_str = year + month + day @api.depends('hasta_606') def _toma_hasta(self): year = str(self.hasta_606[:4]) month = str(self.hasta_606[5:7]) day = str(self.hasta_606[8:10]) self.hasta_str = year + month + day @api.onchange('invoices') def total_calculado(self): self.total_cld = 0.0 self.total_tax = 0.0 self.total_rtn = 0.0 for value in self.invoices: self.total_cld += value.amount_untaxed self.total_tax += value.amount_tax self.total_rtn += float(value.tax_hold) self.cant_reg = len(self.invoices)
class wolftrak_report_609(osv.osv): _name = 'wolftrakglobal.report609' _columns = { 'invoices': fields.many2many('account.invoice', domain=[('type', '=', 'in_invoice'), ('company_id', '=', 3)]), 'desde_609': fields.date('Desde:'), 'desde_str': fields.char(compute='_toma_desde'), 'hasta_609': fields.date('Hasta:'), 'hasta_str': fields.char(compute='_toma_hasta'), 'periodo': fields.char(compute='_toma_periodo', readonly=True, string='Periodo'), 'cant_reg': fields.integer('Cantidad de registros'), 'total_cld': fields.float('Total monto facturado'), 'total_isr': fields.float('Total ISR Retenido') } _defaults = { 'desde_609': lambda *a: time.strftime('%Y-%m-01'), 'hasta_609': lambda *a: str(datetime.now() + relativedelta.relativedelta( months=+1, day=1, days=-1))[:10], } @api.onchange('invoices') def _toma_registro(self): for value in self.invoices: self.cant_reg = len(self.invoices) @api.depends('hasta_609') def _toma_periodo(self): month = str(self.hasta_609[5:7]) year = str(self.hasta_609[:4]) self.periodo = year + month @api.depends('desde_609') def _toma_desde(self): year = str(self.desde_609[:4]) month = str(self.desde_609[5:7]) day = str(self.desde_609[8:10]) self.desde_str = year + month + day @api.depends('hasta_609') def _toma_hasta(self): year = str(self.hasta_609[:4]) month = str(self.hasta_609[5:7]) day = str(self.hasta_609[8:10]) self.hasta_str = year + month + day @api.onchange('invoices') def total_calculado(self): self.total_cld = 0.0 self.total_isr = 0.0 for value in self.invoices: self.total_cld += value.amount_total self.total_isr += value.isr_hold
class custom_res_partner(osv.osv): _name = "res.partner" _inherit = 'res.partner' def _x_opportunity_meeting_count(self, cr, uid, ids, field_name, arg, context=None): res = dict( map( lambda x: (x, { 'x_opportunity_count': 0, 'x_meeting_count': 0 }), ids)) # the user may not have access rights for opportunities or meetings try: for partner in self.browse(cr, uid, ids, context): if partner.is_company: operator = 'child_of' else: operator = '=' opp_ids = self.pool['crm.lead'].search( cr, uid, [('partner_id', operator, partner.id), ('type', '=', 'opportunity'), ('probability', '<', '100')], context=context) res[partner.id] = { 'x_opportunity_count': len(opp_ids), 'x_meeting_count': len(partner.x_meeting_ids), } except: pass return res ########## MEDICAL INFO ??? # @api.one # @api.depends('x_poids','x_taille') # def _compute_IMC(self): # if self.x_taille == 0: # self.x_IMC = '0' # else: # self.x_IMC = self.x_poids / ((self.x_taille / 100) * (self.x_taille / 100)) ########## @api.one @api.depends('name', 'x_patient_prenom') def _compute_display_name(self): if self.x_patient_prenom == '': names = [self.name] else: names = [self.name, self.x_patient_prenom] self.display_name = ' '.join(filter(None, names)) _columns = { 'partner_id' : fields.many2one('res.partner','Customer', default=lambda self: self.env.user.partner_id), 'display_name' : fields.char(string='Name', compute='_compute_display_name'), 'x_patient_prenom': fields.char('Prénom', size=16), 'x_patient_sexe': fields.selection(SEXE_SELECTION, string='Sexe'), 'x_convention_type': fields.selection(CONVENTION_SELECTION, string='Protection'), 'x_patient_cafat': fields.char(string='Numéro assuré', size=8, help='Numéro CAFAT du patient'), 'x_is_pro': fields.boolean('is_pro_bool', help="Check if the contact is a professional, otherwise it is a patient"), 'x_compte_type': fields.selection(selection=[('patient', 'Patient'), ('pro', 'Pro')], string='Type compte'), 'dob': fields.date('Date de naissance'), 'age' : fields.integer('Age'), 'x_src_avatar' : fields.binary("x_src_avatar", attachment=True, help="This field holds the image used as avatar for this contact, limited to 1024x1024px"), 'x_medecin_traitant': fields.char('Médecin traitant', size=32), ########## MEDICAL INFO ??? # 'x_groupe_sang': fields.selection(GRP_SANG_SELECTION, string='Groupe sang.'), # 'x_taille': fields.float('Taille (cm)',digits=(4,6)), # 'x_poids': fields.float('Poids (kg)',digits=(4,6)), # 'x_IMC': fields.float(string='IMC', compute='_compute_IMC',digits=(4,6)), ########## # Reprise de CRM 'x_opportunity_ids': fields.one2many('crm.lead', 'partner_id',\ 'Opportunities', domain=[('type', '=', 'opportunity')]), 'x_meeting_ids': fields.one2many('calendar.event', 'x_partner_id', 'Meetings'), 'x_opportunity_count': fields.function(_x_opportunity_meeting_count, string="Opportunity", type='integer', multi='opp_meet'), 'x_meeting_count': fields.function(_x_opportunity_meeting_count, string="# Meetings", type='integer', multi='opp_meet'), } def redirect_partner_form(self, cr, uid, partner_id, context=None): search_view = self.pool.get('ir.model.data').get_object_reference( cr, uid, 'base', 'view_res_partner_filter') _order = 'name, x_patient_prenom' _default = { 'x_patient_sexe': 'masculin', 'x_patient_cafat': '', 'x_is_pro': False, 'x_compte_type': 'pro', 'x_medecin_traitant': ' ', 'x_groupe_sang': '', ########## MEDICAL INFO ??? # 'x_taille': '0,1', # 'x_poids': '0,1', ########## } _sql_constraints = [] ############# Changement Praticien <-> Patient ############# @api.multi def _on_change_compte_type(self, x_compte_type): return {'value': {'x_is_pro': x_compte_type == 'pro'}} ############# Changement de date de naissance ############# @api.onchange('dob') def _onchange_getage_id(self, cr, uid, ids, dob, context=None): current_date = datetime.now() current_year = current_date.year birth_date = parser.parse(dob) current_age = current_year - birth_date.year val = {'age': current_age} return {'value': val} ############# Donne l'image a utiliser comme avatar ############# ############# MODIFY ??? !!! @api.model def _get_default_avatar(self, vals): if getattr(threading.currentThread(), 'testing', False) or self.env.context.get('install_mode'): return False # ------------------ CABINET if self.is_company == True: img_path = openerp.modules.get_module_resource( 'AlloDoc', 'static/src/img', 'company_image.png') elif self.x_compte_type == 'pro': if self.x_patient_sexe == 'feminin': img_path = openerp.modules.get_module_resource( 'AlloDoc', 'static/src/img', 'avatar_medecin_femme.png') else: img_path = openerp.modules.get_module_resource( 'AlloDoc', 'static/src/img', 'avatar_medecin_homme.png') # ------------------ PATIENTS #----------------------- Adultes elif self.age > 18: if self.x_patient_sexe == 'feminin': img_path = openerp.modules.get_module_resource( 'AlloDoc', 'static/src/img', 'avatar_femme.png') else: img_path = openerp.modules.get_module_resource( 'AlloDoc', 'static/src/img', 'avatar_homme.png') #----------------------- Enfants elif self.age > 2: if self.x_patient_sexe == 'feminin': img_path = openerp.modules.get_module_resource( 'AlloDoc', 'static/src/img', 'avatar_fille.png') else: img_path = openerp.modules.get_module_resource( 'AlloDoc', 'static/src/img', 'avatar_garcon.png') #----------------------- Bebes elif self.age <= 2: if self.x_patient_sexe == 'feminin': img_path = openerp.modules.get_module_resource( 'AlloDoc', 'static/src/img', 'avatar_bebe_f.png') else: img_path = openerp.modules.get_module_resource( 'AlloDoc', 'static/src/img', 'avatar_bebe_g.png') #----------------------- Default else: img_path = openerp.modules.get_module_resource( 'AlloDoc', 'static/src/img', 'avatar_default.png') with open(img_path, 'rb') as f: x_src_avatar = f.read() # return img_avatar return tools.image_resize_image_big(x_src_avatar.encode('base64')) def name_get(self, cr, uid, ids, context=None): if context is None: context = {} if isinstance(ids, (int, long)): ids = [ids] res = [] for record in self.browse(cr, uid, ids, context=context): name = record.display_name or '' if record.parent_id and not record.is_company: if not name and record.type in [ 'invoice', 'delivery', 'other' ]: name = dict( self.fields_get( cr, uid, ['type'], context=context)['type']['selection'])[record.type] name = "%s, %s" % (record.parent_name, name) if context.get('show_address_only'): name = self._display_address(cr, uid, record, without_company=True, context=context) if context.get('show_address'): name = name + "\n" + self._display_address( cr, uid, record, without_company=True, context=context) name = name.replace('\n\n', '\n') name = name.replace('\n\n', '\n') if context.get('show_email') and record.email: name = "%s <%s>" % (name, record.email) if context.get('html_format'): name = name.replace('\n', '<br/>') res.append((record.id, name)) return res # Need to write these lines twice to get result I excepted... # if not, at save, avatar is not updated with value filled in form (_get_default_avatar), # but with values previously stored in DB @api.multi def write(self, vals): vals['x_src_avatar'] = self._get_default_avatar(vals) result = super(custom_res_partner, self).write(vals) vals['x_src_avatar'] = self._get_default_avatar(vals) result = super(custom_res_partner, self).write(vals) return result
class wolftrakglobal_report(osv.osv): _name = 'wolftrakglobal.report607' _columns = { 'desde_607': fields.date('Desde:'), 'desde_str': fields.char(compute='_toma_desde'), 'hasta_607': fields.date('Hasta:'), 'hasta_str': fields.char(compute='_toma_hasta'), 'total_cld': fields.float('Total Calculado: '), 'total_tax': fields.float('ITBIS Calculado: '), 'reporte': fields.many2many('account.invoice', 'name', 'amount_untaxed', 'amount_tax', string='Entradas: ', domain=[('type', '=', 'out_invoice'), ('state', '!=', 'draft'), ('company_id', '=', 3)]), 'periodo': fields.char(compute='_toma_periodo', string='Periodo', readonly=True), 'cant_reg': fields.integer('Cantidad de registros') } _defaults = { 'desde_607': lambda *a: time.strftime('%Y-%m-01'), 'hasta_607': lambda *a: str(datetime.now() + relativedelta.relativedelta( months=+1, day=1, days=-1))[:10], } @api.onchange('reporte') def total_calculado(self): self.total_cld = 0.0 self.total_tax = 0.0 for value in self.reporte: self.total_cld += value.amount_untaxed self.total_tax += value.amount_tax self.cant_reg = len(self.reporte) @api.depends('hasta_607') def _toma_periodo(self): month = str(self.hasta_607[5:7]) year = str(self.hasta_607[:4]) self.periodo = year + month @api.depends('desde_607') def _toma_desde(self): year = str(self.desde_607[:4]) month = str(self.desde_607[5:7]) day = str(self.desde_607[8:10]) self.desde_str = year + month + day @api.depends('hasta_607') def _toma_hasta(self): year = str(self.hasta_607[:4]) month = str(self.hasta_607[5:7]) day = str(self.hasta_607[8:10]) self.hasta_str = year + month + day
class generate_certificate(osv.osv_memory): def _get_company_id(self, cr, uid, context={}): res = self.pool.get('res.users').read(cr, uid, [uid], ['company_id'], context=context) if res and res[0]['company_id']: return res[0]['company_id'][0] return False _name = 'crypto.generate_certificate' _columns = { 'company_id': fields.many2one('res.company', 'Company'), 'serial_number': fields.integer('Serial number'), 'version': fields.integer('Version'), 'date_begin': fields.date('Begin date'), 'date_end': fields.date('Expiration date'), 'name_c': fields.char('Country (C)', size=2), 'name_sp': fields.char('State or Province Name (ST/SP)', size=64), 'name_l': fields.char('Locality Name (L)', size=64), 'name_o': fields.char('Organization Name (O)', size=64), 'name_ou': fields.char('Organization Unit Name (OU)', size=64), 'name_cn': fields.char('Common name (CN)', size=64), 'name_gn': fields.char('Given Name (GN)', size=64), 'name_sn': fields.char('Surname (SN)', size=64), 'name_email': fields.char('E-mail Addres (EMail)', size=64), 'name_serialnumber': fields.char('Serial Number (serialNumber)', size=64), } _defaults = { 'company_id': _get_company_id, 'serial_number': 1, 'version': 2, 'date_begin': (datetime.today() + timedelta(days=(0))).strftime('%Y-%m-%d'), 'date_end': (datetime.today() + timedelta(days=(365))).strftime('%Y-%m-%d'), } def onchange_company_id(self, cr, uid, ids, company_id, context=None): v={} if company_id: company=self.pool.get('res.company').browse(cr,uid,company_id) try: address=company.partner_id.address.pop() v['name_c'] = address.country_id.code v['name_sp'] = address.state_id.name v['name_l'] = address.city v['name_o'] = company.name #v['name_ou'] = '' v['name_cn'] = address.name #v['name_gn'] = '' #v['name_sn'] = '' v['name_email'] = address.email #v['name_serialnumber'] = '' except: pass return {'value': v } def on_generate(self, cr, uid, ids, context): if context is None: context = {} active_ids = context['active_ids'] certificate_obj = self.pool.get('crypto.certificate') for wizard in self.browse(cr, uid, ids): name = X509.X509_Name() if wizard.name_c: name.C = wizard.name_c if wizard.name_sp: name.SP = wizard.name_sp if wizard.name_l: name.L = wizard.name_l if wizard.name_o: name.O = wizard.name_o if wizard.name_ou: name.OU = wizard.name_ou if wizard.name_cn: name.CN = wizard.name_cn if wizard.name_gn: name.GN = wizard.name_gn if wizard.name_sn: name.SN = wizard.name_sn if wizard.name_email: name.EMail = wizard.name_email if wizard.name_serialnumber: name.serialNumber = wizard.name_serialnumber certificate_obj.generate_certificate(cr, uid, active_ids, name, ext=None, serial_number=wizard.serial_number, version=wizard.version, date_begin=datetime.strptime(wizard.date_begin, '%Y-%m-%d'), date_end=datetime.strptime(wizard.date_end, '%Y-%m-%d')) certificate_obj.action_validate(cr, uid, active_ids) return {'type': 'ir.actions.act_window_close'} def on_cancel(self, cr, uid, ids, context): return {}
class WizardReport(models.TransientModel): _name = "wizard.report" _columns = { 'afr_id': fields.many2one( 'afr', 'Custom Report', help='If you have already set a Custom Report, Select it Here.'), 'company_id': fields.many2one('res.company', 'Company', required=True), 'currency_id': fields.many2one( 'res.currency', 'Currency', help="Currency at which this report will be expressed. If not \ selected will be used the one set in the company"), 'inf_type': fields.selection([('BS', 'Balance Sheet'), ('IS', 'Income Statement')], 'Type', required=True), 'columns': fields.selection([('one', 'End. Balance'), ('two', 'Debit | Credit'), ('four', 'Initial | Debit | Credit | YTD'), ('five', 'Initial | Debit | Credit | Period | YTD'), ('qtr', "4 QTR's | YTD"), ('thirteen', '12 Months | YTD')], 'Columns', required=True), 'display_account': fields.selection([('all', 'All Accounts'), ('bal', 'With Balance'), ('mov', 'With movements'), ('bal_mov', 'With Balance / Movements')], 'Display accounts'), 'display_account_level': fields.integer( 'Up to level', help='Display accounts up to this level (0 to show all)'), 'account_list': fields.many2many('account.account', 'rel_wizard_account', 'account_list', 'account_id', 'Root accounts', required=True), 'fiscalyear': fields.many2one('account.fiscalyear', 'Fiscal year', help='Fiscal Year for this report', required=True), 'periods': fields.many2many('account.period', 'rel_wizard_period', 'wizard_id', 'period_id', 'Periods', help='All periods in the fiscal year if empty'), 'analytic_ledger': fields.boolean( 'Analytic Ledger', help="Allows to Generate an Analytic Ledger for accounts with \ moves. Available when Balance Sheet and 'Initial | Debit | Credit \ | YTD' are selected"), 'journal_ledger': fields.boolean( 'Journal Ledger', help="Allows to Generate an Journal Ledger for accounts with \ moves. Available when Balance Sheet and 'Initial | Debit | Credit \ | YTD' are selected"), 'partner_balance': fields.boolean( 'Partner Balance', help="Allows to Generate a Partner Balance for accounts with \ moves. Available when Balance Sheet and 'Initial | Debit | Credit \ | YTD' are selected"), 'tot_check': fields.boolean('Summarize?', help='Checking will add a new line at the \ end of the Report which will Summarize \ Columns in Report'), 'lab_str': fields.char('Description', help='Description for the Summary', size=128), 'target_move': fields.selection( [ ('posted', 'All Posted Entries'), ('all', 'All Entries'), ], 'Entries to Include', required=True, help='Print All Accounting Entries or just Posted Accounting \ Entries'), # ~ Deprecated fields 'filter': fields.selection([('bydate', 'By Date'), ('byperiod', 'By Period'), ('all', 'By Date and Period'), ('none', 'No Filter')], 'Date/Period Filter'), 'date_to': fields.date('End date'), 'date_from': fields.date('Start date'), } _defaults = { 'date_from': lambda *a: time.strftime('%Y-%m-%d'), 'date_to': lambda *a: time.strftime('%Y-%m-%d'), 'filter': lambda *a: 'byperiod', 'display_account_level': lambda *a: 0, 'inf_type': lambda *a: 'BS', 'company_id': lambda self, cr, uid, c: self.pool['res.company']._company_default_get( cr, uid, 'account.invoice', context=c), 'fiscalyear': lambda self, cr, uid, c: self.pool['account.fiscalyear'].find(cr, uid), 'display_account': lambda *a: 'bal_mov', 'columns': lambda *a: 'five', 'target_move': 'posted', } def onchange_inf_type(self, cr, uid, ids, inf_type, context=None): if context is None: context = {} res = {'value': {}} if inf_type != 'BS': res['value'].update({'analytic_ledger': False}) return res def onchange_columns(self, cr, uid, ids, columns, fiscalyear, periods, context=None): if context is None: context = {} res = {'value': {}} p_obj = self.pool.get("account.period") all_periods = p_obj.search(cr, uid, [('fiscalyear_id', '=', fiscalyear), ('special', '=', False)], context=context) s = set(periods[0][2]) t = set(all_periods) go = periods[0][2] and s.issubset(t) or False if columns != 'four': res['value'].update({'analytic_ledger': False}) if columns in ('qtr', 'thirteen'): res['value'].update({'periods': all_periods}) else: if go: res['value'].update({'periods': periods}) else: res['value'].update({'periods': []}) return res def onchange_analytic_ledger(self, cr, uid, ids, company_id, analytic_ledger, context=None): if context is None: context = {} context['company_id'] = company_id res = {'value': {}} cur_id = self.pool.get('res.company').browse( cr, uid, company_id, context=context).currency_id.id res['value'].update({'currency_id': cur_id}) return res def onchange_company_id(self, cr, uid, ids, company_id, context=None): if context is None: context = {} context['company_id'] = company_id res = {'value': {}} if not company_id: return res cur_id = self.pool.get('res.company').browse( cr, uid, company_id, context=context).currency_id.id fy_id = self.pool.get('account.fiscalyear').find(cr, uid, context=context) res['value'].update({'fiscalyear': fy_id}) res['value'].update({'currency_id': cur_id}) res['value'].update({'account_list': []}) res['value'].update({'periods': []}) res['value'].update({'afr_id': None}) return res def onchange_afr_id(self, cr, uid, ids, afr_id, context=None): if context is None: context = {} res = {'value': {}} if not afr_id: return res afr_brw = self.pool.get('afr').browse(cr, uid, afr_id, context=context) res['value'].update({ 'currency_id': afr_brw.currency_id and afr_brw.currency_id.id or afr_brw.company_id.currency_id.id, }) res['value'].update({'inf_type': afr_brw.inf_type or 'BS'}) res['value'].update({'columns': afr_brw.columns or 'five'}) res['value'].update({ 'display_account': afr_brw.display_account or 'bal_mov', }) res['value'].update( {'display_account_level': afr_brw.display_account_level or 0}) res['value'].update( {'fiscalyear': afr_brw.fiscalyear_id and afr_brw.fiscalyear_id.id}) res['value'].update( {'account_list': [acc.id for acc in afr_brw.account_ids]}) res['value'].update({'periods': [p.id for p in afr_brw.period_ids]}) res['value'].update( {'analytic_ledger': afr_brw.analytic_ledger or False}) res['value'].update({'tot_check': afr_brw.tot_check or False}) res['value'].update({ 'lab_str': afr_brw.lab_str or _('Write a Description for your Summary Total') }) return res def _get_defaults(self, cr, uid, data, context=None): if context is None: context = {} user = self.pool['res.users'].browse(cr, uid, uid, context=context) if user.company_id: company_id = user.company_id.id else: company_id = self.pool['res.company'].search( cr, uid, [('parent_id', '=', False)])[0] data['form']['company_id'] = company_id fiscalyear_obj = self.pool['account.fiscalyear'] data['form']['fiscalyear'] = fiscalyear_obj.find(cr, uid) data['form']['context'] = context return data['form'] def _check_state(self, cr, uid, data, context=None): if context is None: context = {} if data['form']['filter'] == 'bydate': self._check_date(cr, uid, data, context) return data['form'] def _check_date(self, cr, uid, data, context=None): if context is None: context = {} if data['form']['date_from'] > data['form']['date_to']: raise osv.except_osv( _('Error !'), ('La fecha final debe ser mayor a la inicial')) sql = """SELECT f.id, f.date_start, f.date_stop FROM account_fiscalyear f WHERE '%s' = f.id """ % (data['form']['fiscalyear']) cr.execute(sql) res = cr.dictfetchall() if res: if data['form']['date_to'] > res[0]['date_stop'] or\ data['form']['date_from'] < res[0]['date_start']: raise osv.except_osv( _('UserError'), 'Las fechas deben estar entre %s y %s' % (res[0]['date_start'], res[0]['date_stop'])) else: return 'report' else: raise osv.except_osv(_('UserError'), 'No existe periodo fiscal') def period_span(self, cr, uid, ids, fy_id, context=None): if context is None: context = {} ap_obj = self.pool.get('account.period') fy_id = fy_id and type(fy_id) in (list, tuple) and fy_id[0] or fy_id if not ids: # ~ No hay periodos return ap_obj.search(cr, uid, [('fiscalyear_id', '=', fy_id), ('special', '=', False)], order='date_start asc') ap_brws = ap_obj.browse(cr, uid, ids, context=context) date_start = min([period.date_start for period in ap_brws]) date_stop = max([period.date_stop for period in ap_brws]) return ap_obj.search(cr, uid, [('fiscalyear_id', '=', fy_id), ('special', '=', False), ('date_start', '>=', date_start), ('date_stop', '<=', date_stop)], order='date_start asc') def print_report(self, cr, uid, ids, data, context=None): if context is None: context = {} data = {} data['ids'] = context.get('active_ids', []) data['model'] = context.get('active_model', 'ir.ui.menu') data['form'] = self.read(cr, uid, ids[0]) if data['form']['filter'] == 'byperiod': del data['form']['date_from'] del data['form']['date_to'] data['form']['periods'] = self.period_span( cr, uid, data['form']['periods'], data['form']['fiscalyear']) elif data['form']['filter'] == 'bydate': self._check_date(cr, uid, data) del data['form']['periods'] elif data['form']['filter'] == 'none': del data['form']['date_from'] del data['form']['date_to'] del data['form']['periods'] else: self._check_date(cr, uid, data) lis2 = str(data['form']['periods']).replace("[", "(").replace("]", ")") sqlmm = """select min(p.date_start) as inicio, max(p.date_stop) as fin from account_period p where p.id in %s""" % lis2 cr.execute(sqlmm) minmax = cr.dictfetchall() if minmax: if (data['form']['date_to'] < minmax[0]['inicio']) \ or (data['form']['date_from'] > minmax[0]['fin']): raise osv.except_osv( _('Error !'), _('La interseccion entre el periodo y fecha es vacio')) if data['form']['columns'] == 'one': name = 'afr.1cols' if data['form']['columns'] == 'two': name = 'afr.2cols' if data['form']['columns'] == 'four': if data['form']['analytic_ledger'] \ and data['form']['inf_type'] == 'BS': name = 'afr.analytic.ledger' elif data['form']['journal_ledger'] \ and data['form']['inf_type'] == 'BS': name = 'afr.journal.ledger' elif data['form']['partner_balance'] \ and data['form']['inf_type'] == 'BS': name = 'afr.partner.balance' else: name = 'afr.4cols' if data['form']['columns'] == 'five': name = 'afr.5cols' if data['form']['columns'] == 'qtr': name = 'afr.qtrcols' if data['form']['columns'] == 'thirteen': name = 'afr.13cols' return { 'type': 'ir.actions.report.xml', 'report_name': name, 'datas': data }
class contract_init(models.Model): _name = 'hr.contract.init' _description = 'Initial Contract Settings' _inherit = 'ir.needaction_mixin' _columns = { 'name': fields.char( 'Name', size=64, required=True, readonly=True, states={'draft': [('readonly', False)]}, ), 'date': fields.date( 'Effective Date', required=True, readonly=True, states={'draft': [('readonly', False)]}, ), 'wage_ids': fields.one2many( 'hr.contract.init.wage', 'contract_init_id', 'Starting Wages', readonly=True, states={'draft': [('readonly', False)]}, ), 'struct_id': fields.many2one( 'hr.payroll.structure', 'Payroll Structure', readonly=True, states={'draft': [('readonly', False)]}, ), 'trial_period': fields.integer( 'Trial Period', readonly=True, states={'draft': [('readonly', False)]}, help="Length of Trial Period, in days", ), 'active': fields.boolean('Active', ), 'state': fields.selection( [ ('draft', 'Draft'), ('approve', 'Approved'), ('decline', 'Declined'), ], 'State', readonly=True, ), } _defaults = { 'trial_period': 0, 'active': True, 'state': 'draft', } # Return records with latest date first _order = 'date desc' def _needaction_domain_get(self, cr, uid, context=None): users_obj = self.pool.get('res.users') if users_obj.has_group(cr, uid, 'base.group_hr_director'): domain = [('state', 'in', ['draft'])] return domain return False def unlink(self, cr, uid, ids, context=None): if isinstance(ids, (int, long)): ids = [ids] data = self.read(cr, uid, ids, ['state'], context=context) for d in data: if d['state'] in ['approve', 'decline']: raise models.except_orm( _('Error'), _('You may not a delete a record that is not in a ' '"Draft" state')) return super(contract_init, self).unlink(cr, uid, ids, context=context) def set_to_draft(self, cr, uid, ids, context=None): self.write(cr, uid, ids, { 'state': 'draft', }, context=context) wf_service = netsvc.LocalService("workflow") for i in ids: wf_service.trg_delete(uid, 'hr.contract.init', i, cr) wf_service.trg_create(uid, 'hr.contract.init', i, cr) return True def state_approve(self, cr, uid, ids, context=None): self.write(cr, uid, ids, {'state': 'approve'}, context=context) return True def state_decline(self, cr, uid, ids, context=None): self.write(cr, uid, ids, {'state': 'decline'}, context=context) return True
class crm_pet(models.Model): _inherit = "crm.lead" _columns = { 'nombre_pet': fields.char('Nombre'), 'peso_pet': fields.float('Peso en kg'), 'sexo_pet': fields.char('Sexo'), 'edad_pet': fields.char('Edad Meses'), 'tamano_pet': fields.char('Tamaño'), 'condicion_pet': fields.char('Condición corporal'), 'actividad_pet': fields.char('Actividad Física'), '_raciones': fields.integer('Raciones por día'), '_sexo': fields.float('Sexo'), '_tamano': fields.float('Tamano'), '_condicion': fields.float('Condicion'), '_actividad': fields.float('Actividad'), '_valoracion': fields.float('Valoración'), 'contact_lastname': fields.char('Apellido'), 'precio': fields.float('Precio'), '_paquetes': fields.char('Paquetes'), 'frecuencia': fields.char('Frecuencia'), 'ref_bolsa': fields.char('Referencia'), } @api.multi def datos(self): #valoracion=0 if self.actividad_pet == 'muysedentario': self.write({'_actividad': -0.4}) if self.actividad_pet == 'sedentario': self.write({'_actividad': -0.2}) if self.actividad_pet == 'normal': self.write({'_actividad': 0}) if self.actividad_pet == 'activo': self.write({'_actividad': 0.2}) if self.actividad_pet == 'muyactivo': self.write({'_actividad': 0.4}) if self.sexo_pet == "macho": self.write({'_sexo': 0.2}) elif self.sexo_pet == "hembra": self.write({'_sexo': 0.1}) if self.edad_pet == 'puppy': self.write({'_raciones': 4}) if self.condicion_pet == "muydelgado": self.write({'_condicion': 0.4}) elif self.condicion_pet == "delgado": self.write({'_condicion': 0.2}) elif self.condicion_pet == "optimo": self.write({'_condicion': 0.0}) elif self.condicion_pet == "sobrepeso": self.write({'_condicion': -0.2}) elif self.condicion_pet == "obeso": self.write({'_condicion': -0.4}) if (self.peso_pet >= 0.35 and self.peso_pet <= 2.1): self.write({'tamano_pet': "miniatura"}) self.write({'_tamano': 9}) elif (self.peso_pet > 2.1 and self.peso_pet <= 5.2): self.write({'tamano_pet': "pequeno"}) self.write({'_tamano': 8}) elif (self.peso_pet > 5.2 and self.peso_pet <= 8.5): self.write({'tamano_pet': "mediano"}) self.write({'_tamano': 7}) elif (self.peso_pet > 8.5 and self.peso_pet <= 13): self.write({'tamano_pet': "grande"}) self.write({'_tamano': 6}) elif (self.peso_pet > 13): self.write({'tamano_pet': "muygrande"}) self.write({'_tamano': 5}) elif self.edad_pet == 'junior': self.write({'_raciones': 3}) if (self.peso_pet >= 0.7 and self.peso_pet <= 4.4): self.write({'tamano_pet': "miniatura"}) self.write({'_tamano': 6.5}) elif (self.peso_pet > 4.4 and self.peso_pet <= 13.5): self.write({'tamano_pet': "pequeno"}) self.write({'_tamano': 5.2}) elif (self.peso_pet > 13.5 and self.peso_pet <= 21.3): self.write({'tamano_pet': "mediano"}) self.write({'_tamano': 4.5}) elif (self.peso_pet > 21.3 and self.peso_pet <= 27.8): self.write({'tamano_pet': "grande"}) self.write({'_tamano': 3.7}) elif (self.peso_pet > 27.8): self.write({'tamano_pet': "muygrande"}) self.write({'_tamano': 3}) if self.condicion_pet == "muydelgado": self.write({'_condicion': 0.4}) elif self.condicion_pet == "delgado": self.write({'_condicion': 0.2}) elif self.condicion_pet == "optimo": self.write({'_condicion': 0.0}) elif self.condicion_pet == "sobrepeso": self.write({'_condicion': -0.2}) elif self.condicion_pet == "obeso": self.write({'_condicion': -0.4}) elif self.edad_pet == 'adult': self.write({'_raciones': 2}) if (self.peso_pet >= 1.5 and self.peso_pet <= 5): self.write({'tamano_pet': "miniatura"}) self.write({'_tamano': 4}) elif (self.peso_pet > 5 and self.peso_pet <= 15): self.write({'tamano_pet': "pequeno"}) self.write({'_tamano': 3}) elif (self.peso_pet > 15 and self.peso_pet <= 25): self.write({'tamano_pet': "mediano"}) self.write({'_tamano': 2.5}) elif (self.peso_pet > 25 and self.peso_pet <= 35): self.write({'tamano_pet': "grande"}) self.write({'_tamano': 2}) elif (self.peso_pet > 35): self.write({'tamano_pet': "muygrande"}) self.write({'_tamano': 1.7}) if self.condicion_pet == "muydelgado": self.write({'_condicion': 0.25}) elif self.condicion_pet == "delgado": self.write({'_condicion': 0.1}) elif self.condicion_pet == "optimo": self.write({'_condicion': 0.0}) elif self.condicion_pet == "sobrepeso": self.write({'_condicion': -0.1}) elif self.condicion_pet == "obeso": self.write({'_condicion': -0.25}) valoracion = self.peso_pet * (self._sexo + self._tamano + self._condicion + self._actividad) * 10 if valoracion < 300: valoracion = 50 * ((valoracion + 25) // 50) else: valoracion = 100 * ((valoracion + 50) // 100) self.write({'_valoracion': valoracion}) if self.city == 'medellin': if valoracion == 100: self.write({'_paquetes': '13'}) self.write({'precio': 32500}) self.write({'frecuencia': 'mensual'}) self.write({'ref_bolsa': '200'}) elif valoracion == 150: self.write({'_paquetes': '13'}) self.write({'precio': 35750}) self.write({'frecuencia': 'mensual'}) self.write({'ref_bolsa': '300'}) elif valoracion == 200: self.write({'_paquetes': '12'}) self.write({'precio': 30000}) self.write({'frecuencia': 'quincenal'}) self.write({'ref_bolsa': '200'}) elif valoracion == 250: self.write({'_paquetes': '12'}) self.write({'precio': 31500}) self.write({'frecuencia': 'quincenal'}) self.write({'ref_bolsa': '250'}) elif valoracion == 300: self.write({'_paquetes': '12'}) self.write({'ref_bolsa': '300'}) self.write({'frecuencia': 'quincenal'}) self.write({'precio': 33000}) elif valoracion == 400: self.write({'_paquetes': '12'}) self.write({'ref_bolsa': '200'}) self.write({'frecuencia': 'semanal'}) self.write({'precio': 30000}) elif valoracion == 500: self.write({'_paquetes': '12'}) self.write({'ref_bolsa': '250'}) self.write({'frecuencia': 'semanal'}) self.write({'precio': 31500}) elif valoracion == 600: self.write({'_paquetes': '12'}) self.write({'ref_bolsa': '300'}) self.write({'frecuencia': 'semanal'}) self.write({'precio': 33000}) elif valoracion == 700: self.write({'_paquetes': '6-6'}) self.write({'ref_bolsa': '300-400'}) self.write({'frecuencia': 'semanal'}) self.write({'precio': 36000}) elif valoracion == 800: self.write({'_paquetes': '12'}) self.write({'ref_bolsa': '400'}) self.write({'frecuencia': 'semanal'}) self.write({'precio': 39000}) elif valoracion == 900: self.write({'_paquetes': '6-6'}) self.write({'ref_bolsa': '400-500'}) self.write({'frecuencia': 'semanal'}) self.write({'precio': 42000}) elif valoracion == 1000: self.write({'_paquetes': '12'}) self.write({'ref_bolsa': '500'}) self.write({'frecuencia': 'semanal'}) self.write({'precio': 45000}) elif valoracion == 1100: self.write({'_paquetes': '6-6'}) self.write({'ref_bolsa': '500-600'}) self.write({'frecuencia': 'semanal'}) self.write({'precio': 48000}) elif valoracion == 1200: self.write({'_paquetes': '12'}) self.write({'ref_bolsa': '600'}) self.write({'frecuencia': 'semanal'}) self.write({'precio': 51000}) elif valoracion == 1300: self.write({'_paquetes': '6-6'}) self.write({'ref_bolsa': '600-700'}) self.write({'frecuencia': 'semanal'}) self.write({'precio': 54000}) elif valoracion == 1400: self.write({'_paquetes': '12'}) self.write({'ref_bolsa': '700'}) self.write({'frecuencia': 'semanal'}) self.write({'precio': 57000}) elif (self.city == 'otra' or self.city == 'bogota'): if valoracion == 100: self.write({'_paquetes': '13'}) self.write({'precio': 62500}) self.write({'frecuencia': 'mensual'}) self.write({'ref_bolsa': '200'}) elif valoracion == 150: self.write({'_paquetes': '13'}) self.write({'precio': 65750}) self.write({'frecuencia': 'mensual'}) self.write({'ref_bolsa': '300'}) elif valoracion == 200: self.write({'_paquetes': '26'}) self.write({'precio': 91000}) self.write({'frecuencia': 'mensual'}) self.write({'ref_bolsa': '200'}) elif valoracion == 250: self.write({'_paquetes': '26'}) self.write({'precio': 94250}) self.write({'frecuencia': 'mensual'}) self.write({'ref_bolsa': '250'}) elif valoracion == 300: self.write({'_paquetes': '26'}) self.write({'ref_bolsa': '300'}) self.write({'frecuencia': 'mensual'}) self.write({'precio': 97500}) elif valoracion == 400: self.write({'_paquetes': '24'}) self.write({'ref_bolsa': '200'}) self.write({'frecuencia': 'quincenal'}) self.write({'precio': 84000}) elif valoracion == 500: self.write({'_paquetes': '24'}) self.write({'ref_bolsa': '250'}) self.write({'frecuencia': 'quincenal'}) self.write({'precio': 87000}) elif valoracion == 600: self.write({'_paquetes': '24'}) self.write({'ref_bolsa': '300'}) self.write({'frecuencia': 'quincenal'}) self.write({'precio': 90000}) elif valoracion == 700: self.write({'_paquetes': '12-12'}) self.write({'ref_bolsa': '300-400'}) self.write({'frecuencia': 'quincenal'}) self.write({'precio': 96000}) elif valoracion == 800: self.write({'_paquetes': '24'}) self.write({'ref_bolsa': '400'}) self.write({'frecuencia': 'quincenal'}) self.write({'precio': 102000}) elif valoracion == 900: self.write({'_paquetes': '12-12'}) self.write({'ref_bolsa': '400-500'}) self.write({'frecuencia': 'quincenal'}) self.write({'precio': 108000}) elif valoracion == 1000: self.write({'_paquetes': '24'}) self.write({'ref_bolsa': '500'}) self.write({'frecuencia': 'quincenal'}) self.write({'precio': 114000}) elif valoracion == 1100: self.write({'_paquetes': '12-12'}) self.write({'ref_bolsa': '500-600'}) self.write({'frecuencia': 'quincenal'}) self.write({'precio': 120000}) elif valoracion == 1200: self.write({'_paquetes': '24'}) self.write({'ref_bolsa': '600'}) self.write({'frecuencia': 'quincenal'}) self.write({'precio': 126000}) elif valoracion == 1300: self.write({'_paquetes': '12-12'}) self.write({'ref_bolsa': '600-700'}) self.write({'frecuencia': 'quincenal'}) self.write({'precio': 132000}) elif valoracion == 1400: self.write({'_paquetes': '24'}) self.write({'ref_bolsa': '700'}) self.write({'frecuencia': 'quincenal'}) self.write({'precio': 138000})
class product_product(osv.osv): _inherit = "product.product" @api.one @api.onchange('lst_price') # if these fields are changed, call method def check_change_price(self): #import pdb;pdb.set_trace(); pricelists = self.env['product.pricelist'].search([]) pricelist = pricelists[0] return {} def product_meli_get_products( self, cr, uid, context=None ): user_obj = self.pool.get('res.users').browse(cr, uid, uid) company = user_obj.company_id product_obj = self.pool.get('product.product') #product = product_obj.browse(cr, uid, ids[0]) CLIENT_ID = company.mercadolibre_client_id CLIENT_SECRET = company.mercadolibre_secret_key ACCESS_TOKEN = company.mercadolibre_access_token REFRESH_TOKEN = company.mercadolibre_refresh_token meli = Meli(client_id=CLIENT_ID,client_secret=CLIENT_SECRET, access_token=ACCESS_TOKEN, refresh_token=REFRESH_TOKEN) url_login_meli = meli.auth_url(redirect_URI=REDIRECT_URI) #url_login_oerp = "/meli_login" response = meli.get("/users/"+company.mercadolibre_seller_id+"/items/search", {'access_token':meli.access_token}) print "product_meli_get_products: " + response.content rjson = response.json() if 'error' in rjson: if rjson['message']=='invalid_token' or rjson['message']=='expired_token': ACCESS_TOKEN = '' REFRESH_TOKEN = '' company.write({'mercadolibre_access_token': ACCESS_TOKEN, 'mercadolibre_refresh_token': REFRESH_TOKEN, 'mercadolibre_code': '' } ) return { "type": "ir.actions.act_url", "url": url_login_meli, "target": "new", } results = rjson['results'] if (results): for item_id in results: print item_id posting_id = self.pool.get('product.product').search(cr,uid,[('meli_id','=',item_id)]) response = meli.get("/items/"+item_id, {'access_token':meli.access_token}) rjson = response.json() if (posting_id): print "Item already in database: " + str(posting_id[0]) else: idcreated = self.pool.get('product.product').create(cr,uid,{ 'name': rjson['title'], 'meli_id': rjson['id'] }) if (idcreated): product = product_obj.browse(cr, uid, idcreated) product_obj.product_meli_get_product( cr, uid, [idcreated] ) return {} def product_meli_get_product( self, cr, uid, ids, context=None ): user_obj = self.pool.get('res.users').browse(cr, uid, uid) company = user_obj.company_id product_obj = self.pool.get('product.product') product = product_obj.browse(cr, uid, ids[0]) product_template_obj = self.pool.get('product.template') product_template = product_template_obj.browse(cr, uid, product.product_tmpl_id.id) CLIENT_ID = company.mercadolibre_client_id CLIENT_SECRET = company.mercadolibre_secret_key ACCESS_TOKEN = company.mercadolibre_access_token REFRESH_TOKEN = company.mercadolibre_refresh_token meli = Meli(client_id=CLIENT_ID,client_secret=CLIENT_SECRET, access_token=ACCESS_TOKEN, refresh_token=REFRESH_TOKEN) response = meli.get("/items/"+product.meli_id, {'access_token':meli.access_token}) print "product_meli_get_product: " + response.content rjson = response.json() des = '' desplain = '' vid = '' if 'error' in rjson: return {} #TODO: traer la descripcion: con #https://api.mercadolibre.com/items/{ITEM_ID}/description?access_token=$ACCESS_TOKEN if rjson['descriptions']: response2 = meli.get("/items/"+product.meli_id+"/description", {'access_token':meli.access_token}) rjson2 = response2.json() des = rjson2['text'] desplain = rjson2['plain_text'] if (len(des)>0): desplain = des #TODO: verificar q es un video if rjson['video_id']: vid = '' #TODO: traer las imagenes #TODO: pictures = rjson['pictures'] if pictures and len(pictures): thumbnail_url = pictures[0]['url'] image = urllib2.urlopen(thumbnail_url).read() image_base64 = base64.encodestring(image) product.image_medium = image_base64 #if (len(pictures)>1): #complete product images: #delete all images... #categories mlcatid = "" if ('category_id' in rjson): category_id = rjson['category_id'] ml_cat_id = self.pool.get('mercadolibre.category').search(cr,uid,[('meli_category_id','=',category_id)]) if (ml_cat_id): print "category exists!" + str(ml_cat_id) mlcatid = ml_cat_id[0] else: print "Creating category: " + str(category_id) #https://api.mercadolibre.com/categories/MLA1743 response_cat = meli.get("/categories/"+str(category_id), {'access_token':meli.access_token}) rjson_cat = response_cat.json() print "category:" + str(rjson_cat) fullname = "" if ("path_from_root" in rjson_cat): path_from_root = rjson_cat["path_from_root"] for path in path_from_root: fullname = fullname + "/" + path["name"] #fullname = fullname + "/" + rjson_cat['name'] print "category fullname:" + fullname cat_fields = { 'name': fullname, 'meli_category_id': ''+str(category_id), } ml_cat_id = self.pool.get('mercadolibre.category').create(cr,uid,(cat_fields)) if (ml_cat_id): mlcatid = ml_cat_id imagen_id = '' if (len(rjson['pictures'])>0): imagen_id = rjson['pictures'][0]['id'] meli_fields = { 'name': str(rjson['title']), 'meli_imagen_id': imagen_id, 'meli_post_required': True, 'meli_id': rjson['id'], 'meli_permalink': rjson['permalink'], 'meli_title': rjson['title'], 'meli_description': desplain, # 'meli_description_banner_id': , 'meli_category': mlcatid, 'meli_listing_type': rjson['listing_type_id'], 'meli_buying_mode':rjson['buying_mode'], 'meli_price': str(rjson['price']), 'meli_price_fixed': True, 'meli_currency': rjson['currency_id'], 'meli_condition': rjson['condition'], 'meli_available_quantity': rjson['available_quantity'], 'meli_warranty': rjson['warranty'], ## 'meli_imagen_logo': fields.char(string='Imagen Logo', size=256), ## 'meli_imagen_id': fields.char(string='Imagen Id', size=256), 'meli_imagen_link': rjson['thumbnail'], ## 'meli_multi_imagen_id': fields.char(string='Multi Imagen Ids', size=512), 'meli_video': str(vid) } tmpl_fields = { 'name': str(rjson['title']) } product.write( meli_fields ) product_template.write( tmpl_fields ) #{"id":"MLA639109219","site_id":"MLA","title":"Disco Vinilo Queen - Rock - A Kind Of Magic","subtitle":null,"seller_id":171329758,"category_id":"MLA2038","official_store_id":null,"price":31,"base_price":31,"original_price":null,"currency_id":"ARS","initial_quantity":5,"available_quantity":5,"sold_quantity":0,"buying_mode":"buy_it_now","listing_type_id":"free","start_time":"2016-10-17T20:36:22.000Z","stop_time":"2016-12-16T20:36:22.000Z","end_time":"2016-12-16T20:36:22.000Z","expiration_time":null,"condition":"used","permalink":"http://articulo.mercadolibre.com.ar/MLA-639109219-disco-vinilo-queen-rock-a-kind-of-magic-_JM","thumbnail":"http://mla-s1-p.mlstatic.com/256905-MLA25108641321_102016-I.jpg","secure_thumbnail":"https://mla-s1-p.mlstatic.com/256905-MLA25108641321_102016-I.jpg","pictures":[{"id":"256905-MLA25108641321_102016","url":"http://mla-s1-p.mlstatic.com/256905-MLA25108641321_102016-O.jpg","secure_url":"https://mla-s1-p.mlstatic.com/256905-MLA25108641321_102016-O.jpg","size":"500x400","max_size":"960x768","quality":""},{"id":"185215-MLA25150338489_112016","url":"http://www.mercadolibre.com/jm/img?s=STC&v=O&f=proccesing_image_es.jpg","secure_url":"https://www.mercadolibre.com/jm/img?s=STC&v=O&f=proccesing_image_es.jpg","size":"500x500","max_size":"500x500","quality":""}],"video_id":null,"descriptions":[{"id":"MLA639109219-1196717922"}],"accepts_mercadopago":true,"non_mercado_pago_payment_methods":[],"shipping":{"mode":"not_specified","local_pick_up":false,"free_shipping":false,"methods":[],"dimensions":null,"tags":[]},"international_delivery_mode":"none","seller_address":{"id":193196973,"comment":"3B","address_line":"Billinghurst 1711","zip_code":"1425","city":{"id":"TUxBQlBBTDI1MTVa","name":"Palermo"},"state":{"id":"AR-C","name":"Capital Federal"},"country":{"id":"AR","name":"Argentina"},"latitude":-34.5906131,"longitude":-58.4101982,"search_location":{"neighborhood":{"id":"TUxBQlBBTDI1MTVa","name":"Palermo"},"city":{"id":"TUxBQ0NBUGZlZG1sYQ","name":"Capital Federal"},"state":{"id":"TUxBUENBUGw3M2E1","name":"Capital Federal"}}},"seller_contact":null,"location":{},"geolocation":{"latitude":-34.5906131,"longitude":-58.4101982},"coverage_areas":[],"attributes":[],"warnings":[],"listing_source":"","variations":[],"status":"active","sub_status":[],"tags":[],"warranty":null,"catalog_product_id":null,"domain_id":null,"seller_custom_field":null,"parent_item_id":null,"differential_pricing":null,"deal_ids":[],"automatic_relist":false,"date_created":"2016-10-17T20:36:22.000Z","last_updated":"2016-11-07T21:38:10.000Z"} return {} def product_meli_login(self, cr, uid, ids, context=None ): user_obj = self.pool.get('res.users').browse(cr, uid, uid) company = user_obj.company_id REDIRECT_URI = company.mercadolibre_redirect_uri CLIENT_ID = company.mercadolibre_client_id CLIENT_SECRET = company.mercadolibre_secret_key meli = Meli(client_id=CLIENT_ID,client_secret=CLIENT_SECRET) url_login_meli = meli.auth_url(redirect_URI=REDIRECT_URI) #url_login_oerp = "/meli_login" return { "type": "ir.actions.act_url", "url": url_login_meli, "target": "new", } def product_get_meli_loginstate( self, cr, uid, ids, field_name, attributes, context=None ): # recoger el estado y devolver True o False (meli) #False if logged ok #True if need login user_obj = self.pool.get('res.users').browse(cr, uid, uid) company = user_obj.company_id CLIENT_ID = company.mercadolibre_client_id CLIENT_SECRET = company.mercadolibre_secret_key ACCESS_TOKEN = company.mercadolibre_access_token REFRESH_TOKEN = company.mercadolibre_refresh_token meli = Meli(client_id=CLIENT_ID,client_secret=CLIENT_SECRET, access_token=ACCESS_TOKEN, refresh_token=REFRESH_TOKEN) ML_state = False if ACCESS_TOKEN=='': ML_state = True else: response = meli.get("/users/me/", {'access_token':meli.access_token} ) rjson = response.json() if 'error' in rjson: if rjson['message']=='invalid_token' or rjson['message']=='expired_token': ACCESS_TOKEN = '' REFRESH_TOKEN = '' company.write({'mercadolibre_access_token': ACCESS_TOKEN, 'mercadolibre_refresh_token': REFRESH_TOKEN, 'mercadolibre_code': '' } ) ML_state = True #raise osv.except_osv( _('MELI WARNING'), _('INVALID TOKEN (must login, go to Edit Company and login): error: %s, message: %s, status: %s') % ( rjson["error"], rjson["message"],rjson["status"],)) res = {} for product in self.browse(cr,uid,ids): res[product.id] = ML_state return res def product_meli_status_close( self, cr, uid, ids, context=None ): user_obj = self.pool.get('res.users').browse(cr, uid, uid) company = user_obj.company_id product_obj = self.pool.get('product.product') product = product_obj.browse(cr, uid, ids[0]) CLIENT_ID = company.mercadolibre_client_id CLIENT_SECRET = company.mercadolibre_secret_key ACCESS_TOKEN = company.mercadolibre_access_token REFRESH_TOKEN = company.mercadolibre_refresh_token meli = Meli(client_id=CLIENT_ID,client_secret=CLIENT_SECRET, access_token=ACCESS_TOKEN, refresh_token=REFRESH_TOKEN) response = meli.put("/items/"+product.meli_id, { 'status': 'closed' }, {'access_token':meli.access_token}) #print "product_meli_status_close: " + response.content return {} def product_meli_status_pause( self, cr, uid, ids, context=None ): user_obj = self.pool.get('res.users').browse(cr, uid, uid) company = user_obj.company_id product_obj = self.pool.get('product.product') product = product_obj.browse(cr, uid, ids[0]) CLIENT_ID = company.mercadolibre_client_id CLIENT_SECRET = company.mercadolibre_secret_key ACCESS_TOKEN = company.mercadolibre_access_token REFRESH_TOKEN = company.mercadolibre_refresh_token meli = Meli(client_id=CLIENT_ID,client_secret=CLIENT_SECRET, access_token=ACCESS_TOKEN, refresh_token=REFRESH_TOKEN) response = meli.put("/items/"+product.meli_id, { 'status': 'paused' }, {'access_token':meli.access_token}) #print "product_meli_status_pause: " + response.content return {} def product_meli_status_active( self, cr, uid, ids, context=None ): user_obj = self.pool.get('res.users').browse(cr, uid, uid) company = user_obj.company_id product_obj = self.pool.get('product.product') product = product_obj.browse(cr, uid, ids[0]) CLIENT_ID = company.mercadolibre_client_id CLIENT_SECRET = company.mercadolibre_secret_key ACCESS_TOKEN = company.mercadolibre_access_token REFRESH_TOKEN = company.mercadolibre_refresh_token meli = Meli(client_id=CLIENT_ID,client_secret=CLIENT_SECRET, access_token=ACCESS_TOKEN, refresh_token=REFRESH_TOKEN) response = meli.put("/items/"+product.meli_id, { 'status': 'active' }, {'access_token':meli.access_token}) #print "product_meli_status_active: " + response.content return {} def product_meli_delete( self, cr, uid, ids, context=None ): user_obj = self.pool.get('res.users').browse(cr, uid, uid) company = user_obj.company_id product_obj = self.pool.get('product.product') product = product_obj.browse(cr, uid, ids[0]) if product.meli_status!='closed': self.product_meli_status_close( cr, uid, ids, context ) CLIENT_ID = company.mercadolibre_client_id CLIENT_SECRET = company.mercadolibre_secret_key ACCESS_TOKEN = company.mercadolibre_access_token REFRESH_TOKEN = company.mercadolibre_refresh_token meli = Meli(client_id=CLIENT_ID,client_secret=CLIENT_SECRET, access_token=ACCESS_TOKEN, refresh_token=REFRESH_TOKEN) response = meli.put("/items/"+product.meli_id, { 'deleted': 'true' }, {'access_token':meli.access_token}) #print "product_meli_delete: " + response.content rjson = response.json() ML_status = rjson["status"] if "error" in rjson: ML_status = rjson["error"] if "sub_status" in rjson: if len(rjson["sub_status"]) and rjson["sub_status"][0]=='deleted': product.write({ 'meli_id': '' }) return {} def product_meli_upload_image( self, cr, uid, ids, context=None ): user_obj = self.pool.get('res.users').browse(cr, uid, uid) company = user_obj.company_id product_obj = self.pool.get('product.product') product = product_obj.browse(cr, uid, ids[0]) CLIENT_ID = company.mercadolibre_client_id CLIENT_SECRET = company.mercadolibre_secret_key ACCESS_TOKEN = company.mercadolibre_access_token REFRESH_TOKEN = company.mercadolibre_refresh_token # meli = Meli(client_id=CLIENT_ID,client_secret=CLIENT_SECRET, access_token=ACCESS_TOKEN, refresh_token=REFRESH_TOKEN) if product.image==None or product.image==False: return { 'status': 'error', 'message': 'no image to upload' } # print "product_meli_upload_image" #print "product_meli_upload_image: " + response.content imagebin = base64.b64decode(product.image) imageb64 = product.image # print "data:image/png;base64,"+imageb64 # files = [ ('images', ('image_medium', imagebin, "image/png")) ] files = { 'file': ('image.jpg', imagebin, "image/jpeg"), } #print files response = meli.upload("/pictures", files, { 'access_token': meli.access_token } ) # print response.content rjson = response.json() if ("error" in rjson): raise osv.except_osv( _('MELI WARNING'), _('No se pudo cargar la imagen en MELI! Error: %s , Mensaje: %s, Status: %s') % ( rjson["error"], rjson["message"],rjson["status"],)) return { 'status': 'error', 'message': 'not uploaded'} _logger.info( rjson ) if ("id" in rjson): #guardar id product.write( { "meli_imagen_id": rjson["id"], "meli_imagen_link": rjson["variations"][0]["url"] }) #asociar imagen a producto if product.meli_id: response = meli.post("/items/"+product.meli_id+"/pictures", { 'id': rjson["id"] }, { 'access_token': meli.access_token } ) else: return { 'status': 'warning', 'message': 'uploaded but not assigned' } return { 'status': 'success', 'message': 'uploaded and assigned' } def product_meli_upload_multi_images( self, cr, uid, ids, context=None ): user_obj = self.pool.get('res.users').browse(cr, uid, uid) company = user_obj.company_id product_obj = self.pool.get('product.product') product = product_obj.browse(cr, uid, ids[0]) CLIENT_ID = company.mercadolibre_client_id CLIENT_SECRET = company.mercadolibre_secret_key ACCESS_TOKEN = company.mercadolibre_access_token REFRESH_TOKEN = company.mercadolibre_refresh_token # meli = Meli(client_id=CLIENT_ID,client_secret=CLIENT_SECRET, access_token=ACCESS_TOKEN, refresh_token=REFRESH_TOKEN) if product.images==None: return { 'status': 'error', 'message': 'no images to upload' } image_ids = [] c = 0 #loop over images for product_image in product.images: if (product_image.image): print "product_image.image:" + str(product_image.image) imagebin = base64.b64decode( product_image.image ) #files = { 'file': ('image.png', imagebin, "image/png"), } files = { 'file': ('image.jpg', imagebin, "image/jpeg"), } response = meli.upload("/pictures", files, { 'access_token': meli.access_token } ) print "meli upload:" + response.content rjson = response.json() if ("error" in rjson): raise osv.except_osv( _('MELI WARNING'), _('No se pudo cargar la imagen en MELI! Error: %s , Mensaje: %s, Status: %s') % ( rjson["error"], rjson["message"],rjson["status"],)) #return { 'status': 'error', 'message': 'not uploaded'} else: image_ids+= [ { 'id': rjson['id'] }] c = c + 1 print "image_ids:" + str(image_ids) product.write( { "meli_multi_imagen_id": "%s" % (image_ids) } ) return image_ids def product_on_change_meli_banner(self, cr, uid, ids, banner_id ): banner_obj = self.pool.get('mercadolibre.banner') #solo para saber si ya habia una descripcion completada product_obj = self.pool.get('product.product') if len(ids): product = product_obj.browse(cr, uid, ids[0]) else: product = product_obj.browse(cr, uid, ids) banner = banner_obj.browse( cr, uid, banner_id ) #banner.description _logger.info( banner.description ) result = "" if (banner.description!="" and banner.description!=False and product.meli_imagen_link!=""): imgtag = "<img style='width: 420px; height: auto;' src='%s'/>" % ( product.meli_imagen_link ) result = banner.description.replace( "[IMAGEN_PRODUCTO]", imgtag ) if (result): _logger.info( "result: %s" % (result) ) else: result = banner.description return { 'value': { 'meli_description' : result } } def product_get_meli_status( self, cr, uid, ids, field_name, attributes, context=None ): user_obj = self.pool.get('res.users').browse(cr, uid, uid) company = user_obj.company_id warningobj = self.pool.get('warning') product_obj = self.pool.get('product.product') product = product_obj.browse(cr, uid, ids[0]) CLIENT_ID = company.mercadolibre_client_id CLIENT_SECRET = company.mercadolibre_secret_key ACCESS_TOKEN = company.mercadolibre_access_token REFRESH_TOKEN = company.mercadolibre_refresh_token ML_status = "unknown" if ACCESS_TOKEN=='': ML_status = "unknown" else: meli = Meli(client_id=CLIENT_ID,client_secret=CLIENT_SECRET, access_token=ACCESS_TOKEN, refresh_token=REFRESH_TOKEN) if product.meli_id: response = meli.get("/items/"+product.meli_id, {'access_token':meli.access_token} ) rjson = response.json() ML_status = rjson["status"] if "error" in rjson: ML_status = rjson["error"] if "sub_status" in rjson: if len(rjson["sub_status"]) and rjson["sub_status"][0]=='deleted': product.write({ 'meli_id': '' }) res = {} for product in self.browse(cr,uid,ids): res[product.id] = ML_status return res def product_get_permalink( self, cr, uid, ids, field_name, attributes, context=None ): ML_permalink = '' user_obj = self.pool.get('res.users').browse(cr, uid, uid) company = user_obj.company_id product_obj = self.pool.get('product.product') product = product_obj.browse(cr, uid, ids[0]) CLIENT_ID = company.mercadolibre_client_id CLIENT_SECRET = company.mercadolibre_secret_key ACCESS_TOKEN = company.mercadolibre_access_token REFRESH_TOKEN = company.mercadolibre_refresh_token ML_permalink = "" if ACCESS_TOKEN=='': ML_permalink = "" else: meli = Meli(client_id=CLIENT_ID,client_secret=CLIENT_SECRET, access_token=ACCESS_TOKEN, refresh_token=REFRESH_TOKEN) if product.meli_id: response = meli.get("/items/"+product.meli_id, {'access_token':meli.access_token} ) rjson = response.json() if "permalink" in rjson: ML_permalink = rjson["permalink"] if "error" in rjson: ML_permalink = "" #if "sub_status" in rjson: #if len(rjson["sub_status"]) and rjson["sub_status"][0]=='deleted': # product.write({ 'meli_id': '' }) res = {} for product in self.browse(cr,uid,ids): res[product.id] = ML_permalink return res def product_post(self, cr, uid, ids, context=None): import pdb;pdb.set_trace(); # product_ids = context['active_ids'] product_ids = ids product_obj = self.pool.get('product.product') user_obj = self.pool.get('res.users').browse(cr, uid, uid) #user_obj.company_id.meli_login() company = user_obj.company_id warningobj = self.pool.get('warning') #company = self.pool.get('res.company').browse(cr,uid,1) REDIRECT_URI = company.mercadolibre_redirect_uri CLIENT_ID = company.mercadolibre_client_id CLIENT_SECRET = company.mercadolibre_secret_key ACCESS_TOKEN = company.mercadolibre_access_token REFRESH_TOKEN = company.mercadolibre_refresh_token meli = Meli(client_id=CLIENT_ID,client_secret=CLIENT_SECRET, access_token=ACCESS_TOKEN, refresh_token=REFRESH_TOKEN) if ACCESS_TOKEN=='': meli = Meli(client_id=CLIENT_ID,client_secret=CLIENT_SECRET) url_login_meli = meli.auth_url(redirect_URI=REDIRECT_URI) return { "type": "ir.actions.act_url", "url": url_login_meli, "target": "new", } for product_id in product_ids: product = product_obj.browse(cr,uid,product_id) if (product.meli_id): response = meli.get("/items/%s" % product.meli_id, {'access_token':meli.access_token}) # print product.meli_category.meli_category_id if product.meli_title==False: # print 'Assigning title: product.meli_title: %s name: %s' % (product.meli_title, product.name) product.meli_title = product.name if product.meli_price==False: # print 'Assigning price: product.meli_price: %s standard_price: %s' % (product.meli_price, product.standard_price) product.meli_price = product.standard_price body = { "title": product.meli_title or '', "description": product.meli_description or '', "category_id": product.meli_category.meli_category_id or '0', "listing_type_id": product.meli_listing_type or '0', "buying_mode": product.meli_buying_mode or '', "price": product.meli_price or '0', "currency_id": product.meli_currency or '0', "condition": product.meli_condition or '', "available_quantity": product.meli_available_quantity or '0', "warranty": product.meli_warranty or '', #"pictures": [ { 'source': product.meli_imagen_logo} ] , "video_id": product.meli_video or '', } # print body assign_img = False and product.meli_id #publicando imagen cargada en OpenERP if product.image==None: return warningobj.info(cr, uid, title='MELI WARNING', message="Debe cargar una imagen de base en el producto.", message_html="" ) elif product.meli_imagen_id==False: # print "try uploading image..." resim = product.product_meli_upload_image() if "status" in resim: if (resim["status"]=="error" or resim["status"]=="warning"): error_msg = 'MELI: mensaje de error: ', resim _logger.error(error_msg) else: assign_img = True and product.meli_imagen_id #modificando datos si ya existe el producto en MLA if (product.meli_id): body = { "title": product.meli_title or '', #"description": product.meli_description or '', #"category_id": product.meli_category.meli_category_id, #"listing_type_id": product.meli_listing_type, "buying_mode": product.meli_buying_mode or '', "price": product.meli_price or '0', #"currency_id": product.meli_currency, "condition": product.meli_condition or '', "available_quantity": product.meli_available_quantity or '0', "warranty": product.meli_warranty or '', "pictures": [], #"pictures": [ { 'source': product.meli_imagen_logo} ] , "video_id": product.meli_video or '', } #publicando multiples imagenes multi_images_ids = {} if (product.images): # print 'website_multi_images presente: ', product.images #recorrer las imagenes y publicarlas multi_images_ids = product.product_meli_upload_multi_images() #asignando imagen de logo (por source) if product.meli_imagen_logo: if product.meli_imagen_id: if 'pictures' in body.keys(): body["pictures"]+= [ { 'id': product.meli_imagen_id } ] else: body["pictures"] = [ { 'id': product.meli_imagen_id } ] if (multi_images_ids): if 'pictures' in body.keys(): body["pictures"]+= multi_images_ids else: body["pictures"] = multi_images_ids if 'pictures' in body.keys(): body["pictures"]+= [ { 'source': product.meli_imagen_logo} ] else: body["pictures"]+= [ { 'source': product.meli_imagen_logo} ] else: imagen_producto = "" if (product.meli_description!="" and product.meli_description!=False and product.meli_imagen_link!=""): imgtag = "<img style='width: 420px; height: auto;' src='%s'/>" % ( product.meli_imagen_link ) result = product.meli_description.replace( "[IMAGEN_PRODUCTO]", imgtag ) if (result): _logger.info( "result: %s" % (result) ) product.meli_description = result else: result = product.meli_description else: return warningobj.info(cr, uid, title='MELI WARNING', message="Debe completar el campo 'Imagen_Logo' con el url: http://www.nuevohorizonte-sa.com.ar/images/logo1.png", message_html="") #check fields if product.meli_description==False: return warningobj.info(cr, uid, title='MELI WARNING', message="Debe completar el campo 'description' (en html)", message_html="") #put for editing, post for creating if product.meli_id: response = meli.put("/items/"+product.meli_id, body, {'access_token':meli.access_token}) else: assign_img = True and product.meli_imagen_id response = meli.post("/items", body, {'access_token':meli.access_token}) #check response # print response.content rjson = response.json() #check error if "error" in rjson: #print "Error received: %s " % rjson["error"] error_msg = 'MELI: mensaje de error: %s , mensaje: %s, status: %s, cause: %s ' % (rjson["error"], rjson["message"], rjson["status"], rjson["cause"]) _logger.error(error_msg) missing_fields = error_msg #expired token if "message" in rjson and (rjson["message"]=='invalid_token' or rjson["message"]=="expired_token"): meli = Meli(client_id=CLIENT_ID,client_secret=CLIENT_SECRET) url_login_meli = meli.auth_url(redirect_URI=REDIRECT_URI) #print "url_login_meli:", url_login_meli #raise osv.except_osv( _('MELI WARNING'), _('INVALID TOKEN or EXPIRED TOKEN (must login, go to Edit Company and login): error: %s, message: %s, status: %s') % ( rjson["error"], rjson["message"],rjson["status"],)) return warningobj.info(cr, uid, title='MELI WARNING', message="Debe iniciar sesión en MELI. ", message_html="") else: #Any other errors return warningobj.info(cr, uid, title='MELI WARNING', message="Completar todos los campos! ", message_html="<br><br>"+missing_fields ) #last modifications if response is OK if "id" in rjson: product.write( { 'meli_id': rjson["id"]} ) posting_fields = {'posting_date': str(datetime.now()),'meli_id':rjson['id'],'product_id':product.id,'name': 'Post: ' + product.meli_title } posting_id = self.pool.get('mercadolibre.posting').search(cr,uid,[('meli_id','=',rjson['id'])]) if not posting_id: posting_id = self.pool.get('mercadolibre.posting').create(cr,uid,(posting_fields)) return {} _columns = { 'meli_imagen_id': fields.char(string='Imagen Id', size=256), 'meli_post_required': fields.boolean(string='Este producto es publicable en Mercado Libre'), 'meli_id': fields.char( string='Id del item asignado por Meli', size=256), 'meli_permalink': fields.function( product_get_permalink, method=True, type='char', size=256, string='PermaLink in MercadoLibre' ), 'meli_title': fields.char(string='Nombre del producto en Mercado Libre',size=256), 'meli_description': fields.html(string='Descripción'), 'meli_description_banner_id': fields.many2one("mercadolibre.banner","Banner"), 'meli_category': fields.many2one("mercadolibre.category","Categoría de MercadoLibre"), 'meli_listing_type': fields.selection([("free","Libre"),("bronze","Bronce"),("silver","Plata"),("gold","Oro"),("gold_premium","Gold Premium"),("gold_special","Gold Special"),("gold_pro","Oro Pro")], string='Tipo de lista'), 'meli_buying_mode': fields.selection( [("buy_it_now","Compre ahora"),("classified","Clasificado")], string='Método de compra'), 'meli_price': fields.char(string='Precio de venta', size=128), 'meli_price_fixed': fields.boolean(string='Price is fixed'), 'meli_currency': fields.selection([("ARS","Peso Argentino (ARS)")],string='Moneda (ARS)'), 'meli_condition': fields.selection([ ("new", "Nuevo"), ("used", "Usado"), ("not_specified","No especificado")],'Condición del producto'), 'meli_available_quantity': fields.integer(string='Cantidad disponible'), 'meli_warranty': fields.char(string='Garantía', size=256), 'meli_imagen_logo': fields.char(string='Imagen Logo', size=256), 'meli_imagen_id': fields.char(string='Imagen Id', size=256), 'meli_imagen_link': fields.char(string='Imagen Link', size=256), 'meli_multi_imagen_id': fields.char(string='Multi Imagen Ids', size=512), 'meli_video': fields.char( string='Video (id de youtube)', size=256), 'meli_state': fields.function( product_get_meli_loginstate, method=True, type='boolean', string="Inicio de sesión requerida", store=False ), 'meli_status': fields.function( product_get_meli_status, method=True, type='char', size=128, string="Estado del producto en MLA", store=False ), ### Agregar imagen/archivo uno o mas, y la descripcion en HTML... # TODO Agregar el banner } _defaults = { 'meli_imagen_logo': 'None', 'meli_video': '' }
class hr_job(models.Model): _name = 'hr.job' _inherit = 'hr.job' def _get_all_child_ids(self, cr, uid, ids, field_name, arg, context=None): result = dict.fromkeys(ids) for i in ids: result[i] = self.search(cr, uid, [('parent_id', 'child_of', i)], context=context) return result _columns = { 'department_manager': fields.boolean('Department Manager', ), 'parent_id': fields.many2one( 'hr.job', 'Immediate Superior', ondelete='cascade', ), 'child_ids': fields.one2many( 'hr.job', 'parent_id', 'Immediate Subordinates', ), 'all_child_ids': fields.function( _get_all_child_ids, type='many2many', relation='hr.job', ), 'parent_left': fields.integer( 'Left Parent', select=1, ), 'parent_right': fields.integer( 'Right Parent', select=1, ), } _parent_name = "parent_id" _parent_store = True _parent_order = 'name' _order = 'parent_left' def _check_recursion(self, cr, uid, ids, context=None): # Copied from product.category # This is a brute-force approach to the problem, but should be good # enough. # level = 100 while len(ids): cr.execute('select distinct parent_id from hr_job where id IN %s', (tuple(ids), )) ids = filter(None, map(lambda x: x[0], cr.fetchall())) if not level: return False level -= 1 return True def _rec_message(self, cr, uid, ids, context=None): return _('Error!\nYou cannot create recursive jobs.') _constraints = [ (_check_recursion, _rec_message, ['parent_id']), ] def write(self, cr, uid, ids, vals, context=None): res = super(hr_job, self).write(cr, uid, ids, vals, context=None) if isinstance(ids, (int, long)): ids = [ids] dept_obj = self.pool.get('hr.department') if vals.get('department_manager', False): for di in ids: job = self.browse(cr, uid, di, context=context) dept_id = False if vals.get('department_id', False): dept_id = vals['department_id'] else: dept_id = job.department_id.id employee_id = False for ee in job.employee_ids: employee_id = ee.id if employee_id: dept_obj.write(cr, uid, dept_id, { 'manager_id': employee_id, }, context=context) elif vals.get('department_id', False): for di in ids: job = self.browse(cr, uid, di, context=context) if job.department_manager: employee_id = False for ee in job.employee_ids: employee_id = ee.id dept_obj.write(cr, uid, vals['department_id'], { 'manager_id': employee_id, }, context=context) elif vals.get('parent_id', False): ee_obj = self.pool.get('hr.employee') parent_job = self.browse(cr, uid, vals['parent_id'], context=context) parent_id = False for ee in parent_job.employee_ids: parent_id = ee.id for job in self.browse(cr, uid, ids, context=context): ee_obj.write(cr, uid, [ee.id for ee in job.employee_ids], { 'parent_id': parent_id, }, context=context) return res