예제 #1
0
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.")
    }
예제 #2
0
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,
    }
예제 #3
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
예제 #4
0
파일: product.py 프로젝트: turbodavid/dme
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')
    }
예제 #5
0
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')
    }
예제 #6
0
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)
예제 #8
0
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
예제 #9
0
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
예제 #10
0
class hr_holidays_status(osv.osv):
    _name = "hr.holidays.status"
    _inherit = "hr.holidays.status"
    _description = "Leave Type Extended"
    
    _columns = {
                'year': fields.integer('Year'),
                }
예제 #11
0
class gamification_badge_user(osv.Model):
	_name = 'gamification.badge.user'
	_inherit = 'gamification.badge.user'

	_columns = {
		'custom_value': fields.integer(
		string="Insignea ganada al")
	}
예제 #12
0
class gamification_badge(osv.Model):
	_name = 'gamification.badge'
	_inherit = 'gamification.badge'

	_columns = {
		'custom_value': fields.integer(
		string="Valor de la Insignea")
	}
예제 #13
0
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
예제 #14
0
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,
    }
예제 #15
0
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)
예제 #16
0
파일: barcodes.py 프로젝트: vak0160/odoo-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 '.*' ?"))
예제 #17
0
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 {}
예제 #18
0
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
예제 #19
0
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 = []
예제 #20
0
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,
    }
예제 #21
0
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)
예제 #22
0
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
예제 #23
0
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
예제 #24
0
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
예제 #25
0
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
        }
예제 #27
0
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
예제 #28
0
파일: crm.py 프로젝트: elmonitor/addons
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})
예제 #29
0
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': ''
    }
예제 #30
0
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