payslip_faults.py 11 KB

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