|
@@ -1,22 +1,91 @@
|
|
|
# -*- 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 create_from_prayslip(self, values):
|
|
|
- ### period Actual
|
|
|
- period = self.env['account.period'].search([('date_start', '<=', fields.Date.context_today(self) ),('date_stop', '>=', fields.Date.context_today(self))])
|
|
|
- ### Diario & Moneda
|
|
|
- journal = self.env['account.journal'].browse(int(values['journal_id']))
|
|
|
- ### payslip
|
|
|
- payslip = self.env['hr.payslip'].browse([(values['id'])])
|
|
|
- ### payslip line
|
|
|
- payslip_line = self.env['hr.payslip.line'].search([('slip_id', '=', payslip.id), ('code','=', 'NET')])
|
|
|
- # Move lines
|
|
|
- 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)])
|
|
|
+ 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({
|
|
@@ -25,45 +94,140 @@ class HrPayslip(models.Model):
|
|
|
'credit': line.debit if line.debit > 0 else 0.0 ,
|
|
|
'counterpart_move_line_id': line.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))])
|
|
|
- ### account.bank.statement.line
|
|
|
- statement_line = self.env['account.bank.statement.line'].search([('ref', 'in', [payslip.number])])
|
|
|
- if statement_line:
|
|
|
- return statement_line.statement_id.name
|
|
|
-
|
|
|
- ### Estructur statement
|
|
|
+
|
|
|
+ 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': journal.id,
|
|
|
+ 'journal_id': accountJournal.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',
|
|
|
+ '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:
|
|
|
- bank_statement.write(bank)
|
|
|
- else:
|
|
|
- bank_statement[len(bank_statement) -1].write(bank)
|
|
|
+ if len(bank_statement) != 1:
|
|
|
+ bankStatement = bank_statement[len(bank_statement) -1]
|
|
|
+
|
|
|
+ bankStatement.write({'state': 'open' if accountJournal.type == 'cash' else 'draft'})
|
|
|
else:
|
|
|
- bank_statement = bank_statement.create(bank)
|
|
|
+ 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': bank_statement.id,
|
|
|
+ 'statement_id': statement.id,
|
|
|
'name': payslip.name,
|
|
|
'partner_id': payslip.employee_id.address_home_id.id,
|
|
|
- 'amount': (-1* payslip_line.amount) ,
|
|
|
- 'ref': payslip.number,
|
|
|
- 'note': values['journal_ref']
|
|
|
+ 'amount': (-1* payslipline.amount) ,
|
|
|
+ 'ref': payslip.number
|
|
|
}
|
|
|
|
|
|
- line_statement = self.env['account.bank.statement.line'].create(bank_statement_line)
|
|
|
- reconciled = line_statement.process_reconciliation(line_move)
|
|
|
+ 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.'
|
|
|
+ }
|
|
|
|
|
|
- if reconciled:
|
|
|
- payslip.write({'state': 'paid'})
|
|
|
- else :
|
|
|
- payslip.write({'state': 'done'})
|
|
|
+ ### 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.'
|
|
|
+ }
|
|
|
|
|
|
- return True if (reconciled) else False
|
|
|
+ ### 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'
|
|
|
+ }
|