payslip_faults.py 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324
  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. DATE_FORMAT = '%Y-%m-%d'
  7. class HrPayslip(models.Model):
  8. _inherit = 'hr.payslip'
  9. ''' GET Statement - Obtener las caja abierta/nueva del usuario '''
  10. @api.model
  11. def get_statement_available(self):
  12. BankStatement = []
  13. for statement in self.env['account.bank.statement'].search([('state','!=','confirm'),('user_id','=',self.env.user.id)]):
  14. if (statement.journal_id.type == 'cash' and statement.state =='draft'):
  15. continue
  16. BankStatement.append({
  17. 'id': statement.id,
  18. 'name': statement.name,
  19. 'journalID': statement.journal_id.id,
  20. 'userId': statement.user_id.id,
  21. 'date': statement.date,
  22. 'createDate': statement.create_date,
  23. 'periodId': statement.period_id.id,
  24. 'state': statement.state,
  25. 'journalType': statement.journal_id.type
  26. })
  27. return BankStatement
  28. ''' Recalcular las lineas de la nomina '''
  29. @api.model
  30. def recompute_sheet(self, values):
  31. payslip = self.env['hr.payslip'].browse(values)
  32. ''' Faltas de Funcionario '''
  33. payslip_worked = self.env['hr.payslip.worked_days'].search([('payslip_id', '=' ,payslip.id),('code', '=', 'FALTAS')])
  34. ''' Adelanto '''
  35. payslip_advancement = self.env['hr.payslip.input'].search([('payslip_id', '=' ,payslip.id),('code', '=', 'ADL')])
  36. ''' Comision '''
  37. payslip_commission = self.env['hr.payslip.input'].search([('payslip_id', '=' ,payslip.id),('code', '=', 'CMS')])
  38. ''' HORA_EXTRA '''
  39. payslip_horaExtra = self.env['hr.payslip.input'].search([('payslip_id', '=' ,payslip.id),('code', '=', 'HORA_EXTRA')])
  40. line_worked = None
  41. line_advancent = None
  42. line_commission = None
  43. lineHoraExtra = None
  44. if payslip_worked:
  45. days = 0
  46. for worked in payslip_worked:
  47. days = days + worked.number_of_days
  48. worked_days = {
  49. 'name': 'Total Faltas',
  50. 'code': 'FALTAS',
  51. 'number_of_days': days,
  52. 'number_of_hours': 0,
  53. 'payslip_id': payslip.id,
  54. 'contract_id': payslip.contract_id.id,
  55. 'sequence': 15
  56. }
  57. line_worked = self.env['hr.payslip.worked_days'].create(worked_days)
  58. if payslip_advancement:
  59. amount = 0
  60. for advancement in payslip_advancement:
  61. amount = amount + advancement.amount
  62. advancement_line = {
  63. 'name': "Total Adelantos",
  64. 'code': 'ADL',
  65. 'amount': amount,
  66. 'payslip_id': payslip.id,
  67. 'contract_id': payslip.contract_id.id,
  68. 'sequence': 15
  69. }
  70. line_advancent = self.env['hr.payslip.input'].create(advancement_line)
  71. if payslip_commission:
  72. amount = 0
  73. for commission in payslip_commission:
  74. amount = amount + commission.amount
  75. commission_line = {
  76. 'name': "Total Adelantos",
  77. 'code': 'CMS',
  78. 'amount': amount,
  79. 'payslip_id': payslip.id,
  80. 'contract_id': payslip.contract_id.id,
  81. 'sequence': 15
  82. }
  83. line_commission = self.env['hr.payslip.input'].create(commission_line)
  84. ''' Hora EXtra '''
  85. if payslip_horaExtra:
  86. amount = 0
  87. for horaExtra in payslip_horaExtra:
  88. amount = amount + horaExtra.amount
  89. horaExtra_line = {
  90. 'name': "Total Hora Extras",
  91. 'code': 'HORA_EXTRA',
  92. 'amount': amount,
  93. 'payslip_id': payslip.id,
  94. 'contract_id': payslip.contract_id.id,
  95. 'sequence': 15
  96. }
  97. lineHoraExtra = self.env['hr.payslip.input'].create(horaExtra_line)
  98. ''' Reclaculate '''
  99. payslip.cancel_sheet()
  100. payslip.hr_verify_sheet()
  101. payslip.process_sheet()
  102. if line_worked:
  103. line_worked.unlink()
  104. if line_advancent:
  105. line_advancent.unlink()
  106. if line_commission:
  107. line_commission.unlink()
  108. if lineHoraExtra:
  109. lineHoraExtra.unlink()
  110. return True if payslip else False
  111. ''' Crear nueva falta '''
  112. @api.model
  113. def join_payslip_faults(self, values):
  114. payslip = self.env['hr.payslip'].browse(values['id'])
  115. new_line = self.env['hr.payslip.worked_days']
  116. if values['faultsDays'] > 0:
  117. payslip_worked_days = {
  118. 'name': values['faultsDescri'] if values['faultsDescri'] else "Falta",
  119. 'code': 'FALTAS',
  120. 'number_of_days': values['faultsDays'],
  121. 'number_of_hours': 0,
  122. 'payslip_id': payslip.id,
  123. 'contract_id': payslip.contract_id.id,
  124. 'sequence': 10
  125. }
  126. new_line.create(payslip_worked_days)
  127. recompute_sheet = self.recompute_sheet(values['id'])
  128. return True if recompute_sheet else False
  129. ''' Eliminar falta '''
  130. @api.model
  131. def unlink_payslip_worked(self, values):
  132. worked_days = self.env['hr.payslip.worked_days'].search([('payslip_id', '=', values['id']),('id', '=', values['worked_id'])])
  133. unlink_work = worked_days.unlink()
  134. return True if unlink_work else False
  135. ''' Modificar Falta '''
  136. @api.model
  137. def write_payslip_worked(self, values):
  138. worked_days = self.env['hr.payslip.worked_days'].search([('payslip_id', '=', values['id']),('id', '=', values['worked_id'])])
  139. worked_update = {
  140. 'name': values['name'],
  141. 'number_of_days': values['days']
  142. }
  143. worked_days.write(worked_update)
  144. return True if worked_days else False
  145. ''' Get timezone '''
  146. def get_timezone(self):
  147. tz_name = self._context.get('tz') or self.env.user.tz
  148. return timezone(tz_name)
  149. ''' Get server date '''
  150. def get_server_datetime(self):
  151. return datetime.now(self.get_timezone()).strftime(DATE_FORMAT)
  152. ''' check_module Installed '''
  153. def check_module(self, module_name):
  154. '''
  155. Método para verificar si los modulo están instalado
  156. :param module_name : Nombre del moduloself.
  157. :return: True 'Modulo instalado', False 'no instalado'
  158. '''
  159. module = self.env['ir.module.module'].search([('name', '=', module_name), ('state', '=', 'installed')])
  160. return len(module) != 0
  161. ''' Create payslip input '''
  162. def cretae_eiru_payslip_input(self, values):
  163. return self.env['hr.payslip.input'].create(values)
  164. ''' Crear Adelanto/comision '''
  165. @api.model
  166. def create_payslip_input(self,values):
  167. date_server = self.get_server_datetime()
  168. resUser = self.env.user.id
  169. payslip = self.env['hr.payslip'].browse(values['id'])
  170. if (not payslip):
  171. return False
  172. input_line = {
  173. 'name': values['details'],
  174. 'code': values['salaryRule'],
  175. 'amount': values['amount'],
  176. 'contract_id': payslip.contract_id.id,
  177. 'sequence': 10,
  178. 'payslip_id': payslip.id
  179. }
  180. ''' Create line '''
  181. inputPayslip = self.cretae_eiru_payslip_input(input_line)
  182. if (inputPayslip) and (values['salaryRule'] == 'ADL'):
  183. statementId = None
  184. if (self.check_module('eiru_account_bank_statement_utility')):
  185. statementConfig = self.env['account.bank.statement.config'].browse(values['statementConfigId'])
  186. if (statementConfig):
  187. if (statementConfig.import_statement_payslip == 'manual_import'):
  188. statementId = values['statementId']
  189. statementBank = self.create_eiru_bank_statement(values['journal'], statementId, date_server, resUser)
  190. statementBankLine = self.create_eiru_bank_statement_line(date_server, statementBank, inputPayslip.id,payslip.id)
  191. return True
  192. ''' Create Statement '''
  193. def create_eiru_bank_statement(self, JournalId, statementId, date_server, resUser):
  194. accountJournal = self.env['account.journal'].browse(JournalId)
  195. period = self.env['account.period'].search([('date_start', '<=', date_server),('date_stop', '>=', date_server)])
  196. domain = [('journal_id', '=', JournalId),('user_id', '=', resUser)]
  197. if (statementId):
  198. domain.append(('id', '=', statementId))
  199. else:
  200. domain.append(('date', '=', date_server))
  201. bank_statement = self.env['account.bank.statement'].search(domain)
  202. bank = {
  203. 'journal_id': accountJournal.id,
  204. 'period_id': period.id,
  205. 'date': date_server,
  206. 'user_id': resUser,
  207. 'state': 'open' if accountJournal.type == 'cash' else 'draft',
  208. }
  209. bankStatement = bank_statement
  210. if bank_statement:
  211. if len(bank_statement) != 1:
  212. bankStatement = bank_statement[len(bank_statement) -1]
  213. bankStatement.write({'state': 'open' if accountJournal.type == 'cash' else 'draft'})
  214. else:
  215. bankStatement = bank_statement.create(bank)
  216. return bankStatement
  217. ''' Create statement Line '''
  218. def create_eiru_bank_statement_line(self, dateServer, statement, payslipInputID, payslipId):
  219. payslip_input = self.env['hr.payslip.input'].browse(payslipInputID)
  220. payslip = self.env['hr.payslip'].browse(payslipId)
  221. bank_statement_line = {
  222. 'date' : dateServer,
  223. 'statement_id' : statement.id,
  224. 'journal_id': statement.journal_id.id,
  225. 'amount': payslip_input.amount,
  226. 'account_id': statement.journal_id.internal_account_id.id,
  227. 'ref': payslip_input.code,
  228. 'name': payslip_input.name,
  229. 'partner_id': payslip.employee_id.address_home_id.id,
  230. 'note': payslip_input.id,
  231. }
  232. statementLine = self.env['account.bank.statement.line'].create(bank_statement_line)
  233. return statementLine
  234. ''' Export Statement '''
  235. @api.model
  236. def bank_statement_import(self, values):
  237. date_server = self.get_server_datetime()
  238. resUserId = self.env.user.id
  239. ''' consultar payslip'''
  240. payslip = self.env['hr.payslip'].browse(values['payslipId'])
  241. if (not payslip):
  242. return False
  243. ''' consultar payslip_input '''
  244. payslip_input = self.env['hr.payslip.input'].browse(values['imputId'])
  245. if (not payslip_input):
  246. return False
  247. ''' consultar accountJournal '''
  248. journal = self.env['account.journal'].browse(values['journalid'])
  249. if (not journal):
  250. return False
  251. statement = self.create_eiru_bank_statement(journal.id, values['statementId'], date_server, resUserId)
  252. statementLine = self.create_eiru_bank_statement_line(date_server, statement, payslip_input.id, payslip.id)
  253. ''' Eliminar Comision '''
  254. @api.model
  255. def unlink_payslip_input(self,values):
  256. payslip_input =self.env['hr.payslip.input'].search([('id', '=', values['input_id']),('payslip_id', '=', values['id'])])
  257. payslip_input.unlink()
  258. return True if payslip_input else False
  259. ''' Actualizar Comision '''
  260. @api.model
  261. def write_payslip_input(self, values):
  262. paylip_input = self.env['hr.payslip.input'].search([('payslip_id', '=', values['id']),('id', '=', values['input_id'])])
  263. input_update = {
  264. 'name': values['descript_input'],
  265. 'amount': values['amount_input']
  266. }
  267. paylip_input.write(input_update)
  268. return True if paylip_input else False