# -*- coding: utf-8 -*- from openerp import api, fields, models from openerp.exceptions import except_orm from datetime import datetime from pytz import timezone DATE_FORMAT = '%Y-%m-%d' class HrPayslip(models.Model): _inherit = 'hr.payslip' ''' GET Statement - Obtener las caja abierta/nueva del usuario ''' @api.model def get_statement_available(self): BankStatement = [] for statement in self.env['account.bank.statement'].search([('state','!=','confirm'),('user_id','=',self.env.user.id)]): if (statement.journal_id.type == 'cash' and statement.state =='draft'): continue BankStatement.append({ 'id': statement.id, 'name': statement.name, 'journalID': statement.journal_id.id, 'userId': statement.user_id.id, 'date': statement.date, 'createDate': statement.create_date, 'periodId': statement.period_id.id, 'state': statement.state, 'journalType': statement.journal_id.type }) return BankStatement ''' Recalcular las lineas de la nomina ''' @api.model def recompute_sheet(self, values): payslip = self.env['hr.payslip'].browse(values) ''' Faltas de Funcionario ''' payslip_worked = self.env['hr.payslip.worked_days'].search([('payslip_id', '=' ,payslip.id),('code', '=', 'FALTAS')]) ''' Adelanto ''' payslip_advancement = self.env['hr.payslip.input'].search([('payslip_id', '=' ,payslip.id),('code', '=', 'ADL')]) ''' Comision ''' payslip_commission = self.env['hr.payslip.input'].search([('payslip_id', '=' ,payslip.id),('code', '=', 'CMS')]) ''' HORA_EXTRA ''' payslip_horaExtra = self.env['hr.payslip.input'].search([('payslip_id', '=' ,payslip.id),('code', '=', 'HORA_EXTRA')]) line_worked = None line_advancent = None line_commission = None lineHoraExtra = None if payslip_worked: days = 0 for worked in payslip_worked: days = days + worked.number_of_days worked_days = { 'name': 'Total Faltas', 'code': 'FALTAS', 'number_of_days': days, 'number_of_hours': 0, 'payslip_id': payslip.id, 'contract_id': payslip.contract_id.id, 'sequence': 15 } line_worked = self.env['hr.payslip.worked_days'].create(worked_days) if payslip_advancement: amount = 0 for advancement in payslip_advancement: amount = amount + advancement.amount advancement_line = { 'name': "Total Adelantos", 'code': 'ADL', 'amount': amount, 'payslip_id': payslip.id, 'contract_id': payslip.contract_id.id, 'sequence': 15 } line_advancent = self.env['hr.payslip.input'].create(advancement_line) if payslip_commission: amount = 0 for commission in payslip_commission: amount = amount + commission.amount commission_line = { 'name': "Total Adelantos", 'code': 'CMS', 'amount': amount, 'payslip_id': payslip.id, 'contract_id': payslip.contract_id.id, 'sequence': 15 } line_commission = self.env['hr.payslip.input'].create(commission_line) ''' Hora EXtra ''' if payslip_horaExtra: amount = 0 for horaExtra in payslip_horaExtra: amount = amount + horaExtra.amount horaExtra_line = { 'name': "Total Hora Extras", 'code': 'HORA_EXTRA', 'amount': amount, 'payslip_id': payslip.id, 'contract_id': payslip.contract_id.id, 'sequence': 15 } lineHoraExtra = self.env['hr.payslip.input'].create(horaExtra_line) ''' Reclaculate ''' payslip.cancel_sheet() payslip.hr_verify_sheet() payslip.process_sheet() if line_worked: line_worked.unlink() if line_advancent: line_advancent.unlink() if line_commission: line_commission.unlink() if lineHoraExtra: lineHoraExtra.unlink() return True if payslip else False ''' Crear nueva falta ''' @api.model def join_payslip_faults(self, values): payslip = self.env['hr.payslip'].browse(values['id']) new_line = self.env['hr.payslip.worked_days'] if values['faultsDays'] > 0: payslip_worked_days = { 'name': values['faultsDescri'] if values['faultsDescri'] else "Falta", 'code': 'FALTAS', 'number_of_days': values['faultsDays'], 'number_of_hours': 0, 'payslip_id': payslip.id, 'contract_id': payslip.contract_id.id, 'sequence': 10 } new_line.create(payslip_worked_days) recompute_sheet = self.recompute_sheet(values['id']) return True if recompute_sheet else False ''' Eliminar falta ''' @api.model def unlink_payslip_worked(self, values): worked_days = self.env['hr.payslip.worked_days'].search([('payslip_id', '=', values['id']),('id', '=', values['worked_id'])]) unlink_work = worked_days.unlink() return True if unlink_work else False ''' Modificar Falta ''' @api.model def write_payslip_worked(self, values): worked_days = self.env['hr.payslip.worked_days'].search([('payslip_id', '=', values['id']),('id', '=', values['worked_id'])]) worked_update = { 'name': values['name'], 'number_of_days': values['days'] } worked_days.write(worked_update) return True if worked_days else False ''' Get timezone ''' def get_timezone(self): tz_name = self._context.get('tz') or self.env.user.tz return timezone(tz_name) ''' Get server date ''' def get_server_datetime(self): return datetime.now(self.get_timezone()).strftime(DATE_FORMAT) ''' check_module Installed ''' def check_module(self, module_name): ''' Método para verificar si los modulo están instalado :param module_name : Nombre del moduloself. :return: True 'Modulo instalado', False 'no instalado' ''' module = self.env['ir.module.module'].search([('name', '=', module_name), ('state', '=', 'installed')]) return len(module) != 0 ''' Create payslip input ''' def cretae_eiru_payslip_input(self, values): return self.env['hr.payslip.input'].create(values) ''' Crear Adelanto/comision ''' @api.model def create_payslip_input(self,values): date_server = self.get_server_datetime() resUser = self.env.user.id payslip = self.env['hr.payslip'].browse(values['id']) if (not payslip): return False input_line = { 'name': values['details'], 'code': values['salaryRule'], 'amount': values['amount'], 'contract_id': payslip.contract_id.id, 'sequence': 10, 'payslip_id': payslip.id } ''' Create line ''' inputPayslip = self.cretae_eiru_payslip_input(input_line) if (inputPayslip) and (values['salaryRule'] == 'ADL'): statementId = None if (self.check_module('eiru_account_bank_statement_utility')): statementConfig = self.env['account.bank.statement.config'].browse(values['statementConfigId']) if (statementConfig): if (statementConfig.import_statement_payslip == 'manual_import'): statementId = values['statementId'] statementBank = self.create_eiru_bank_statement(values['journal'], statementId, date_server, resUser) statementBankLine = self.create_eiru_bank_statement_line(date_server, statementBank, inputPayslip.id,payslip.id) return True ''' Create Statement ''' def create_eiru_bank_statement(self, JournalId, statementId, date_server, resUser): accountJournal = self.env['account.journal'].browse(JournalId) period = self.env['account.period'].search([('date_start', '<=', date_server),('date_stop', '>=', date_server)]) domain = [('journal_id', '=', JournalId),('user_id', '=', resUser)] if (statementId): domain.append(('id', '=', statementId)) else: domain.append(('date', '=', date_server)) bank_statement = self.env['account.bank.statement'].search(domain) bank = { 'journal_id': accountJournal.id, 'period_id': period.id, 'date': date_server, 'user_id': resUser, 'state': 'open' if accountJournal.type == 'cash' else 'draft', } bankStatement = bank_statement if bank_statement: if len(bank_statement) != 1: bankStatement = bank_statement[len(bank_statement) -1] bankStatement.write({'state': 'open' if accountJournal.type == 'cash' else 'draft'}) else: bankStatement = bank_statement.create(bank) return bankStatement ''' Create statement Line ''' def create_eiru_bank_statement_line(self, dateServer, statement, payslipInputID, payslipId): payslip_input = self.env['hr.payslip.input'].browse(payslipInputID) payslip = self.env['hr.payslip'].browse(payslipId) bank_statement_line = { 'date' : dateServer, 'statement_id' : statement.id, 'journal_id': statement.journal_id.id, 'amount': payslip_input.amount, 'account_id': statement.journal_id.internal_account_id.id, 'ref': payslip_input.code, 'name': payslip_input.name, 'partner_id': payslip.employee_id.address_home_id.id, 'note': payslip_input.id, } statementLine = self.env['account.bank.statement.line'].create(bank_statement_line) return statementLine ''' Export Statement ''' @api.model def bank_statement_import(self, values): date_server = self.get_server_datetime() resUserId = self.env.user.id ''' consultar payslip''' payslip = self.env['hr.payslip'].browse(values['payslipId']) if (not payslip): return False ''' consultar payslip_input ''' payslip_input = self.env['hr.payslip.input'].browse(values['imputId']) if (not payslip_input): return False ''' consultar accountJournal ''' journal = self.env['account.journal'].browse(values['journalid']) if (not journal): return False statement = self.create_eiru_bank_statement(journal.id, values['statementId'], date_server, resUserId) statementLine = self.create_eiru_bank_statement_line(date_server, statement, payslip_input.id, payslip.id) ''' Eliminar Comision ''' @api.model def unlink_payslip_input(self,values): payslip_input =self.env['hr.payslip.input'].search([('id', '=', values['input_id']),('payslip_id', '=', values['id'])]) payslip_input.unlink() return True if payslip_input else False ''' Actualizar Comision ''' @api.model def write_payslip_input(self, values): paylip_input = self.env['hr.payslip.input'].search([('payslip_id', '=', values['id']),('id', '=', values['input_id'])]) input_update = { 'name': values['descript_input'], 'amount': values['amount_input'] } paylip_input.write(input_update) return True if paylip_input else False