eiru_payslip_payments.py 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233
  1. # -*- coding: utf-8 -*-
  2. from openerp import api, fields, models
  3. from openerp.exceptions import except_orm
  4. from datetime import datetime
  5. from pytz import timezone
  6. class HrPayslip(models.Model):
  7. _inherit = 'hr.payslip'
  8. '''
  9. Get timezone
  10. '''
  11. def get_timezone(self):
  12. tz_name = self._context.get('tz') or self.env.user.tz
  13. return timezone(tz_name)
  14. '''
  15. Get server date
  16. '''
  17. def get_server_datetime(self):
  18. return datetime.now(self.get_timezone()).strftime(DATE_FORMAT)
  19. '''
  20. GET Statement
  21. '''
  22. @api.model
  23. def get_bank_statement_available(self):
  24. '''
  25. Obtener las caja abierta/nueva del usuario
  26. '''
  27. BankStatement = []
  28. for statement in self.env['account.bank.statement'].search([('state','!=','confirm'),('user_id','=',self.env.user.id)]):
  29. if (statement.journal_id.type == 'cash' and statement.state =='draft'):
  30. continue
  31. BankStatement.append({
  32. 'id': statement.id,
  33. 'name': statement.name,
  34. 'journalID': statement.journal_id.id,
  35. 'userId': statement.user_id.id,
  36. 'date': statement.date,
  37. 'createDate': statement.create_date,
  38. 'periodId': statement.period_id.id,
  39. 'state': statement.state,
  40. 'journalType': statement.journal_id.type
  41. })
  42. return BankStatement
  43. '''
  44. ____ _ ____ _ _
  45. | _ \ __ _ _ _ _ __ ___ ___ _ __ | |_ ___ | _ \ __ _ _ _ ___| (_)_ __
  46. | |_) / _` | | | | '_ ` _ \ / _ \ '_ \| __/ __| | |_) / _` | | | / __| | | '_ \
  47. | __/ (_| | |_| | | | | | | __/ | | | |_\__ \ | __/ (_| | |_| \__ \ | | |_) |
  48. |_| \__,_|\__, |_| |_| |_|\___|_| |_|\__|___/ |_| \__,_|\__, |___/_|_| .__/
  49. |___/ |___/ |_|
  50. '''
  51. '''
  52. Verificar si la nomina ya esta en un registro de caja
  53. '''
  54. def verify_statement_line(self, payslip):
  55. return self.env['account.bank.statement.line'].search([('ref', 'in', [payslip.number])])
  56. '''
  57. Get Payslip
  58. '''
  59. def get_eiru_payslip_payments(self, id):
  60. return self.env['hr.payslip'].browse(id)
  61. '''
  62. Get payslip line
  63. '''
  64. def get_eiru_payslip_line_payments(self, payslipId, code):
  65. return self.env['hr.payslip.line'].search([('slip_id', '=', payslipId), ('code','=', code)])
  66. '''
  67. Get Journal
  68. '''
  69. def get_eiru_journal_payments(self, journalId):
  70. return self.env['account.journal'].browse(journalId)
  71. '''
  72. Get move line to payslip
  73. '''
  74. def get_eiru_move_line_payslip(self, payslip):
  75. 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)])
  76. line_move = []
  77. for line in moveline:
  78. line_move.append({
  79. 'name': ":/ "+str(line.name),
  80. 'debit': line.credit if line.credit > 0 else 0.0 ,
  81. 'credit': line.debit if line.debit > 0 else 0.0 ,
  82. 'counterpart_move_line_id': line.id,
  83. })
  84. return line_move
  85. '''
  86. create bank Statement
  87. '''
  88. def create_eiru_payslip_bank_statement(self, accountJournal, statementId, date_server, resUser):
  89. period = self.env['account.period'].search([('date_start', '<=', date_server),('date_stop', '>=', date_server)])
  90. ## Domian default
  91. domain = [('journal_id', '=', accountJournal.id),('user_id', '=', resUser)]
  92. if (statementId):
  93. domain.append(('id', '=', statementId))
  94. else:
  95. domain.append(('date', '=', date_server))
  96. bank_statement = self.env['account.bank.statement'].search(domain)
  97. bank = {
  98. 'journal_id': accountJournal.id,
  99. 'period_id': period.id,
  100. 'date': date_server,
  101. 'user_id': resUser,
  102. 'state': 'open' if accountJournal.type == 'cash' else 'draft',
  103. }
  104. bankStatement = bank_statement
  105. if bank_statement:
  106. if len(bank_statement) != 1:
  107. bankStatement = bank_statement[len(bank_statement) -1]
  108. bankStatement.write({'state': 'open' if accountJournal.type == 'cash' else 'draft'})
  109. else:
  110. bankStatement = bank_statement.create(bank)
  111. return bankStatement
  112. '''
  113. Create Account Bank Statement Line
  114. '''
  115. def create_eiru_payslip_bank_statement_line(self, statement, payslip, payslipline):
  116. bank_statement_line = {
  117. 'statement_id': statement.id,
  118. 'name': payslip.name,
  119. 'partner_id': payslip.employee_id.address_home_id.id,
  120. 'amount': (-1* payslipline.amount) ,
  121. 'ref': payslip.number
  122. }
  123. return self.env['account.bank.statement.line'].create(bank_statement_line)
  124. '''
  125. Process Reconciliation Payslip
  126. '''
  127. def eiru_payslip_process_reconciliation(self, statementLine, moveLine):
  128. return statementLine.process_reconciliation(moveLine)
  129. '''
  130. Paymnets Payslip
  131. '''
  132. @api.model
  133. def create_from_prayslip(self, values):
  134. ### Date server
  135. dateServer = self.get_server_datetime()
  136. ### UserID
  137. resUserId = self.env.user.id
  138. ### payslip
  139. payslip = self.get_eiru_payslip_payments(values['id'])
  140. if (not payslip):
  141. return {
  142. 'state': False,
  143. 'message': 'El registro de la nomina es errónea, por-favor actualice su pagina.'
  144. }
  145. ### Payslip line
  146. payslip_line = self.get_eiru_payslip_line_payments(payslip.id, 'NET')
  147. if (not payslip_line):
  148. return {
  149. 'state': False,
  150. 'message': 'No se pudo obtener el sueldo neto de la nomina'
  151. }
  152. ### Account Journal
  153. journal =self.get_eiru_journal_payments(values['journalId'])
  154. if (not journal):
  155. return {
  156. 'state': False,
  157. 'message': 'El método de pago no es valido.'
  158. }
  159. ### verify statement line
  160. payslipVerify = self.verify_statement_line(payslip)
  161. if (payslipVerify):
  162. return {
  163. 'state': False,
  164. '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)+')'
  165. }
  166. moveLine = self.get_eiru_move_line_payslip(payslip)
  167. if (not moveLine):
  168. return {
  169. 'state': False,
  170. 'message': 'No se puedo obtener las lineas para reconciliar el pagos.'
  171. }
  172. ### Create account bank Statement line
  173. statement = self.create_eiru_payslip_bank_statement(journal, values['statementId'], dateServer, resUserId)
  174. if (not statement):
  175. return {
  176. 'state': False,
  177. 'message': 'No se pudo crear la caja.'
  178. }
  179. ### Create account bank Statement line
  180. statementLine = self.create_eiru_payslip_bank_statement_line(statement, payslip, payslip_line)
  181. if (not statementLine):
  182. return {
  183. 'state': False,
  184. 'message': 'No se pudo crear el detalle de la caja.'
  185. }
  186. ### process_reconciliation
  187. reconciled = self.eiru_payslip_process_reconciliation(statementLine, moveLine)
  188. if (not reconciled):
  189. return {
  190. 'state': False,
  191. 'message': 'No se pudo reconciliar la nomina.'
  192. }
  193. payslip.write({'state': 'paid'})
  194. return {
  195. 'state': True,
  196. 'message': 'Guardado correctamente'
  197. }