# -*- coding: utf-8 -*- from openerp import api, fields, models from openerp.exceptions import except_orm from datetime import datetime from pytz import timezone class HrPayslip(models.Model): _inherit = 'hr.payslip' ''' 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) ''' GET Statement ''' @api.model def get_bank_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 ''' ____ _ ____ _ _ | _ \ __ _ _ _ _ __ ___ ___ _ __ | |_ ___ | _ \ __ _ _ _ ___| (_)_ __ | |_) / _` | | | | '_ ` _ \ / _ \ '_ \| __/ __| | |_) / _` | | | / __| | | '_ \ | __/ (_| | |_| | | | | | | __/ | | | |_\__ \ | __/ (_| | |_| \__ \ | | |_) | |_| \__,_|\__, |_| |_| |_|\___|_| |_|\__|___/ |_| \__,_|\__, |___/_|_| .__/ |___/ |___/ |_| ''' ''' Verificar si la nomina ya esta en un registro de caja ''' def verify_statement_line(self, payslip): return self.env['account.bank.statement.line'].search([('ref', 'in', [payslip.number])]) ''' Get Payslip ''' def get_eiru_payslip_payments(self, id): return self.env['hr.payslip'].browse(id) ''' Get payslip line ''' def get_eiru_payslip_line_payments(self, payslipId, code): return self.env['hr.payslip.line'].search([('slip_id', '=', payslipId), ('code','=', code)]) ''' Get Journal ''' def get_eiru_journal_payments(self, journalId): return self.env['account.journal'].browse(journalId) ''' Get move line to payslip ''' def get_eiru_move_line_payslip(self, payslip): moveline = self.env['account.move.line'].search([('move_id', 'in', [payslip.move_id.id]),('partner_id', 'in', [payslip.employee_id.address_home_id.id]),('account_id', '=', 75)]) line_move = [] for line in moveline: line_move.append({ 'name': ":/ "+str(line.name), 'debit': line.credit if line.credit > 0 else 0.0 , 'credit': line.debit if line.debit > 0 else 0.0 , 'counterpart_move_line_id': line.id, }) return line_move ''' create bank Statement ''' def create_eiru_payslip_bank_statement(self, accountJournal, statementId, date_server, resUser): period = self.env['account.period'].search([('date_start', '<=', date_server),('date_stop', '>=', date_server)]) ## Domian default domain = [('journal_id', '=', accountJournal.id),('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 Account Bank Statement Line ''' def create_eiru_payslip_bank_statement_line(self, statement, payslip, payslipline): bank_statement_line = { 'statement_id': statement.id, 'name': payslip.name, 'partner_id': payslip.employee_id.address_home_id.id, 'amount': (-1* payslipline.amount) , 'ref': payslip.number } return self.env['account.bank.statement.line'].create(bank_statement_line) ''' Process Reconciliation Payslip ''' def eiru_payslip_process_reconciliation(self, statementLine, moveLine): return statementLine.process_reconciliation(moveLine) ''' Paymnets Payslip ''' @api.model def create_from_prayslip(self, values): ### Date server dateServer = self.get_server_datetime() ### UserID resUserId = self.env.user.id ### payslip payslip = self.get_eiru_payslip_payments(values['id']) if (not payslip): return { 'state': False, 'message': 'El registro de la nomina es errónea, por-favor actualice su pagina.' } ### Payslip line payslip_line = self.get_eiru_payslip_line_payments(payslip.id, 'NET') if (not payslip_line): return { 'state': False, 'message': 'No se pudo obtener el sueldo neto de la nomina' } ### Account Journal journal =self.get_eiru_journal_payments(values['journalId']) if (not journal): return { 'state': False, 'message': 'El método de pago no es valido.' } ### verify statement line payslipVerify = self.verify_statement_line(payslip) if (payslipVerify): return { 'state': False, 'message': 'No se pudo completar el pago de nomina, porque ya se encuentra en un registros de caja/extractos bancarios (Referencia: '+str(payslipVerify.statement_id.name)+')' } moveLine = self.get_eiru_move_line_payslip(payslip) if (not moveLine): return { 'state': False, 'message': 'No se puedo obtener las lineas para reconciliar el pagos.' } ### Create account bank Statement line statement = self.create_eiru_payslip_bank_statement(journal, values['statementId'], dateServer, resUserId) if (not statement): return { 'state': False, 'message': 'No se pudo crear la caja.' } ### Create account bank Statement line statementLine = self.create_eiru_payslip_bank_statement_line(statement, payslip, payslip_line) if (not statementLine): return { 'state': False, 'message': 'No se pudo crear el detalle de la caja.' } ### process_reconciliation reconciled = self.eiru_payslip_process_reconciliation(statementLine, moveLine) if (not reconciled): return { 'state': False, 'message': 'No se pudo reconciliar la nomina.' } payslip.write({'state': 'paid'}) return { 'state': True, 'message': 'Guardado correctamente' }