# -*- 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 ''' @api.model def get_statement_available(self): ''' Obtener las caja abierta/nueva del usuario ''' 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')]) line_worked = None line_advancent = None line_commission = 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) 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() 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 ''' Values[ id salaryRule details amount journal statementId statementConfigId ] ''' # import web_pdb; web_pdb.set_trace() 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) # input_payslip = payslip_input.create(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'] # valueStatement = { # 'imputID': InputPayslip.id, # 'journalId': values['journal'], # 'statementId': 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 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 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 @api.model def bank_statement_import(self, values): #period Actual period = self.env['account.period'].search([('date_start', '<=', fields.Date.context_today(self) ),('date_stop', '>=', fields.Date.context_today(self))]) ### consultar payslip_input payslip_input = self.env['hr.payslip.input'].search([('id', '=', values['id_imput'])]) ### consultar payslip payslip = self.env['hr.payslip'].search([('id', '=', payslip_input.payslip_id.id)]) ### consultar accountJournal journal = self.env['account.journal'].search([('id', '=', values['journal_id'])]) ### Consultar Caja Abierta, Método de Pagos, Fecha de Hoy bank_statement = self.env['account.bank.statement'].search([('journal_id', 'in', [journal.id]), ('date', '=', fields.Date.context_today(self))]) ### Instanciar lineas de la caja statement_line = self.env['account.bank.statement.line'] ## Crear o Actualizar statement bank = { 'journal_id': journal.id, 'period_id': period.id, 'date': fields.Date.context_today(self), 'user_id': self.env.user.id, 'state': 'open' if journal.type == 'cash' else 'draft', } # # if bank_statement: if len(bank_statement) == 1: bank_statement.write(bank) else: bank_statement[len(bank_statement) -1].write(bank) else: bank_statement = bank_statement.create(bank) ### Crear statement_line bank_statement_line = { 'date' : bank_statement.date, 'statement_id' : bank_statement.id, 'journal_id': bank_statement.journal_id.id, 'amount': payslip_input.amount, 'account_id': bank_statement.journal_id.internal_account_id.id, 'ref': payslip_input.code, 'name': str(payslip_input.name)+"(Ref. pago: "+str(values['journal_ref'])+")" if values['journal_ref'] else payslip_input.name, 'partner_id': payslip.employee_id.address_home_id.id, 'note': payslip_input.id, } statement_line.create(bank_statement_line) return True if statement_line else False ''' 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