from openerp.osv import fields, osv
import time
from openerp.tools import DEFAULT_SERVER_DATE_FORMAT,DEFAULT_SERVER_DATETIME_FORMAT
import re 
import base64, urllib
import os
import math
from openerp.tools.translate import _
class emp_year(osv.osv):
    _name="emp.year"
    def _check_year(self, cr, uid, ids, context=None):
        str="^-?[0-9]+$"
        obj=self.browse(cr, uid, ids)[0]
        ph=obj.name
        if ph and len(ph)!= 4:
            raise osv.except_osv(_('Invalid Year'), _(' Year must contain 4 digits only.'))
        if ph and re.match(str, ph) == None:
            return False
        return True
    
    _columns = {
                'name' :fields.char('Name',size=4, select=True),
                
                }
    _constraints =  [
        (_check_year, 'Must contain only integer values', [' Year ']),
         ]
    _sql_constraints=[('unique_year','unique(name)','Year must be unique !')]
class qualification_list(osv.osv):
    _name="qualification.list"
    _columns = {
                'name':fields.char('Name',size=64,select=True),
                }
class qualification(osv.osv):
    _name="qualification"
    _columns = {
                'name':fields.many2one('qualification.list','Qualification',select=True),
                'college' :fields.char('College Name', size=64,select=True),
                'employee_id':fields.many2one('hr.employee','Employee',select=True),
                'year':fields.many2one('emp.year','Year'),
                }
class experience(osv.osv):
    _name="experience"
    _columns = {
                'name' :fields.char('Company Name', size=64,select=True),
                'address' :fields.char('Company Address', size=512,select=True),
                'employee_id':fields.many2one('hr.employee','Employee',select=True),
                'year1':fields.many2one('emp.year','From Year'),
                'year2':fields.many2one('emp.year','To Year'),
                }
class salary(osv.osv):
    _name="salary"
    def onchange_food_amt(self,cr,uid,ids,basic,hra,convenience,medical,food_amt,context=None):
        result={}
        if context:
            gross = basic + hra + convenience + medical + food_amt
            result['value'] ={'gross':gross}
            return result
    
    def onchange_basic(self,cr,uid,ids,basic,hra,convenience,medical,context=None):
        result={}
        if context:
            gross = basic + hra + convenience + medical
            result['value'] = {'gross':gross} 
            return result 
    def onchange_hra(self,cr,uid,ids,basic,hra,convenience,medical,context=None):
        result={}
        if context:
            gross = basic + hra + convenience + medical
            result['value'] = {'gross':gross}   
            return result
    def onchange_convenience(self,cr,uid,ids,basic,hra,convenience,medical,context=None):
        result={}
        if context:
            gross = basic + hra + convenience + medical
            result['value'] = {'gross':gross}   
            return result 
    def onchange_medical(self,cr,uid,ids,basic,hra,convenience,medical,context=None):
        result={}
        if context:
            gross = basic + hra + convenience + medical
            result['value'] = {'gross':gross}   
            return result  
    def onchange_esi(self,cr,uid,ids,basic,hra,convenience,esi,context=None):  
        result={}
        if context:
            amt = basic+hra+convenience
            esi_amt = (amt * esi)/100
            print"esi_amt",esi_amt
            result['value'] = {'esi_amt':math.ceil(esi_amt)}
            return result  
    def onchange_epf(self,cr,uid,ids,basic,epf,context=None):  
        result={}
        if context:
            epf_amt = (basic * epf)/100
            result['value'] = {'epf_amt':math.ceil(epf_amt)}
            return result
    def onchange_esi_com(self,cr,uid,ids,basic,hra,convenience,esi_com,gross,context=None):  
        result={}
        if context:
            esi_amt_comp = ((basic+hra+convenience) * esi_com)/100
            ctc = gross + esi_amt_comp 
            result['value'] = {'esi_amt_comp':math.ceil(esi_amt_comp), 'ctc':ctc}
            return result  
    def onchange_epf_com(self,cr,uid,ids,basic,epf_com,context=None):  
        result={}
        if context:
            epf_amt_comp = (basic * epf_com)/100
            result['value'] = {'epf_amt_comp':math.ceil(epf_amt_comp)}
            return result        
             
    _columns = {
                'select':fields.boolean('Select'),
                'basic':fields.float('Basic'),
                'hra':fields.float('HRA'),
                'convenience':fields.float('Conveyance'),
                'medical':fields.float('Medical'),
                'esi':fields.float(' Employee ESI(%)'),
                'esi_com':fields.float('Company ESI(%)'),
                'epf_com':fields.float('Company EPF(%)'),
                'esi_amt_comp':fields.float('Comapny ESI Amount', readonly=True),
                'epf_amt_comp':fields.float('Company EPF Amount',readonly=True),
                'esi_amt':fields.float(' Employee ESI Amount',readonly=True),
                'epf':fields.float('Emoployee EPF(%)'),
                'epf_amt':fields.float(' Employee EPF Amount',readonly=True),
                'gross':fields.float('Gross'),
                'ctc':fields.float('CTC'),
                'food_tick':fields.boolean('Food'),
                'other_tick':fields.boolean('Other Expenses'),
                'other_amt':fields.float('Other Expenses Amount'),
                'food_amt':fields.float('Food Amount'),
                'employee_id':fields.many2one('hr.employee','Employee',select=True)
                }    
class skill(osv.osv):
    _name="skill"
    _columns = {
                'name' :fields.char('Name', size=255,select=True),
                'note':fields.text('Description '),
                }
class hr_department(osv.osv):
    _inherit = "hr.department"
     
    def onchange_manager(self, cr, uid, ids,  manager_id,context=None):
        result={}
        arg=[]
        if manager_id:
            manager = self.pool.get('hr.employee').browse(cr, uid, manager_id, context=context)        
            if manager:    
                result = {'value': {'manager_name': manager.name }}
 
        return result 
     
    _columns = {
                'department_code':fields.char('Department Code',size=64),
                'manager_name':fields.char('Manager Name',size=256),
                'manager_id': fields.many2one('hr.employee', 'Manager'),
                }
     
    def create(self, cr, uid, vals, context=None):
        seq = self.pool.get('ir.sequence').get(cr, uid, 'hr.department')
        print"seqqq",seq
        vals['department_code'] = seq
        print"vallll",vals
        res = super(hr_department,self).create(cr, uid, vals, context)
        print"resss",res
        return res        
    
class hr_employee(osv.osv):
   _inherit = "hr.employee"
   
   _order =  'emp_id'
   def onchange_food_tick(self,cr,uid,ids,food_tick,context=None):
        result={}
        if context:
            if context.get('food_tick') == True:
                gross = gross + food_amt
                result['value'] ={'gross':gross}
                return result
   def get_image(self, cr, uid, ids):
        each = self.read(cr, uid, ids, ['image_url'])
        try:
            if each['image_url']:
                (filename, header) = urllib.urlretrieve('file://'+os.getcwd()+'/Photo/Employee/'+each['image_url'])
                f = open(filename , 'rb')
                img = base64.encodestring(f.read())
                f.close()
            else:
                (filename, header) = urllib.urlretrieve('file://'+os.getcwd()+'/addons/hr_employee/images/default.png')
                f = open(filename , 'rb')
                img = base64.encodestring(f.read())
                f.close()
              
        except:
            (filename, header) = urllib.urlretrieve('file://'+os.getcwd()+'/addons/hr_employee/images/default.png')
            f = open(filename , 'rb')
            img = base64.encodestring(f.read())
            f.close()
             
        return img
          
   def _get_image(self, cr, uid, ids, field_name, arg, context={}):
        res = {}
        for each in ids:
            img = self.get_image(cr, uid, each)
            res[each] = img
        return res
      
      
   def resize_image(self, cr, uid, ids, context=None):
        for each in self.browse(cr, uid, self.search(cr, uid, [])):
            img = self.get_image(cr, uid, each)
            image_url = each.image_url
                      
            import io, StringIO, Image
            image_stream = io.BytesIO(img.decode('base64'))
            img = Image.open(image_stream)
            img.thumbnail((240, 200), Image.ANTIALIAS)
            img_stream = StringIO.StringIO()
            img.save(img_stream, "JPEG")
            bin = base64.decodestring(img_stream.getvalue().encode('base64'))
            filename = str(os.getcwd()+'/Photo/Employee/'+image_url)
            f = open(filename , 'wb')
            f.write(bin)
        return True
   
   _columns={
            'jdate':fields.date('Joining Date'),
            'local_address':fields.char('Local Address'),
            'permanent_address':fields.char('Permanent Address'),
            'category1':fields.selection([('worker','WORKER'),('other','OTHER'),('office_staff','OFFICE STAFF')],'Employee Type'),
            'category2':fields.selection([('semi','Semi Skilled'),('skill','Skilled'),('super','Super Skilled'),('nskill','Non Skill')],'Employee Skill'),
            'father_name':fields.char('Father Name',size=64),
            'emp_id':fields.char('Employee ID',readonly=True),
            'shift_lines':fields.one2many('hr.shift.line','employee_id','Master Shift'),
            'shift_id':fields.many2one('attendance.shift','Shift',ondaelete="cascade"),
            'image_medium':fields.function(_get_image, type="binary", method=True),
            'image_url':fields.char('Image URL' , size=256, help="Specify complete path to image when, you are importing images from CSV file. example for local system path=file:///home/directoryname/imagedirectoryname/image.jpg",readonly=True),
            'education_id':fields.one2many('qualification','employee_id','Degree/Diploma'),
            'experience_id':fields.one2many('experience','employee_id','Experience'),
            'salary_lines':fields.one2many('salary','employee_id','Salary'),
            'skill_id':fields.many2many('skill','emp_skill_rel','skill_id','name','Skills'),
            'daily':fields.boolean('Daily'),
            'monthly':fields.boolean('Monthly'),
            'new_salary':fields.float('Joining Salary'),
            'salary':fields.float('Current Salary'),
            'parent_id':fields.many2one('hr.employee','Reporting Officer'),
            'job_id':fields.many2one('hr.job','Designation'),
            'work_phone': fields.char('Work Phone'),
            'emp_status':fields.selection([('working','Working'),('left','Left')],'Employee Status'),
            'mobile_phone': fields.char('Work Mobile'),
            'work_location': fields.char('Office Location'),
            'address_id': fields.many2one('res.partner', 'Working Address'),
            'card_no':fields.char('Employee Machine No'),
            'nominee_name':fields.char('Nominee Name', size=64),
            'nominee_rel':fields.char('Nominee Relation', size=64),
            'bank_name':fields.char('Bank Name', size=64),
            'account_number':fields.char('Bank Account Number', size=64),
            'ifsc_code':fields.char('IFSC Code', size=64),
            'leave_date':fields.date('Leaving Date'),
            'ot_tick':fields.boolean('OT'),
            'select_salary':fields.boolean('Select'),
           
        }
   def create(self, cr, uid, vals, context=None):
        if 'category1' in vals and vals['category1']:
            if vals['category1'] == 'office_staff':
                seq = self.pool.get('ir.sequence').get(cr, uid, 'hr.employee.staff')
                vals['emp_id'] = seq
            if vals['category1'] in ('worker'):
                seq = self.pool.get('ir.sequence').get(cr, uid, 'hr.employee.worker')
                vals['emp_id'] = seq
            if vals['category1'] == 'other':
                seq = self.pool.get('ir.sequence').get(cr, uid, 'hr.employee.other')
                vals['emp_id'] = seq     
        res = super(hr_employee,self).create(cr, uid, vals, context)
        return res 
    
class wiz_image_hr(osv.TransientModel):
    _name = 'wiz.image.hr'
     
    _columns = {
                'image':fields.binary('Image'),
                'image_name':fields.char('Image Name',size=64,required=True,readonly=True),
                 
                }
     
    def default_get(self, cr, uid, fields, context=None):
        if not context:
            context = {}
        ids = context.get('active_ids',[])
        res = super(wiz_image_hr, self).default_get(cr, uid, fields, context=context)
        for line in self.pool.get('hr.employee').browse(cr, uid, ids):
            if 'image_name' in fields:
                res.update({'image_name':line.emp_id+'.jpg'})
        return res
         
    def clear_image(self, cr, uid, ids, context=None):
        if not context:
            context = {}
        hr_ids = context.get('active_ids',[])
        model = context.get('active_model')
        if model == None:
            return {'type':'ir.actions.act_window_close'}
        try:
            self.pool.get('hr.employee').write(cr, uid, hr_ids, {'image_url':False})
        except:
            pass
                
        return {'type':'ir.actions.act_window_close'}
         
    def create_image(self, cr, uid, ids, context=None):
        if not context:
            context = {}
        hr_ids = context.get('active_ids',[])
        each = self.read(cr, uid, ids, ['image_name','image'])
        if each[0]['image_name'] and not each[0]['image']:
            raise osv.except_osv(_('UserError'), _('Please select the image..'))
        try:
            if each[0]['image_name'] and each[0]['image']:
                 
                import io, StringIO, Image
                image_stream = io.BytesIO(each[0]['image'].decode('base64'))
                img = Image.open(image_stream)
                img.thumbnail((240, 200), Image.ANTIALIAS)
                img_stream = StringIO.StringIO()
                img.save(img_stream, "JPEG")
                bin = base64.decodestring(img_stream.getvalue().encode('base64'))
                filename = str(os.getcwd()+'/Photo/Employee/'+each[0]['image_name'])
                f = open(filename , 'wb')
                f.write(bin)
                self.pool.get('hr.employee').write(cr, uid, hr_ids, {'image_url':each[0]['image_name']})
             
        except:
            pass
                
        return {'type':'ir.actions.act_window_close'}
 
can you post your code ?