payslip_faults.py 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341
  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.cancel_sheet()
  89. payslip.hr_verify_sheet()
  90. payslip.process_sheet()
  91. if line_worked:
  92. line_worked.unlink()
  93. if line_advancent:
  94. line_advancent.unlink()
  95. if line_commission:
  96. line_commission.unlink()
  97. return True if payslip else False
  98. '''
  99. Crear nueva falta
  100. '''
  101. @api.model
  102. def join_payslip_faults(self, values):
  103. payslip = self.env['hr.payslip'].browse(values['id'])
  104. new_line = self.env['hr.payslip.worked_days']
  105. if values['faultsDays'] > 0:
  106. payslip_worked_days = {
  107. 'name': values['faultsDescri'] if values['faultsDescri'] else "Falta",
  108. 'code': 'FALTAS',
  109. 'number_of_days': values['faultsDays'],
  110. 'number_of_hours': 0,
  111. 'payslip_id': payslip.id,
  112. 'contract_id': payslip.contract_id.id,
  113. 'sequence': 10
  114. }
  115. new_line.create(payslip_worked_days)
  116. recompute_sheet = self.recompute_sheet(values['id'])
  117. return True if recompute_sheet else False
  118. '''
  119. Eliminar falta
  120. '''
  121. @api.model
  122. def unlink_payslip_worked(self, values):
  123. worked_days = self.env['hr.payslip.worked_days'].search([('payslip_id', '=', values['id']),('id', '=', values['worked_id'])])
  124. unlink_work = worked_days.unlink()
  125. return True if unlink_work else False
  126. '''
  127. Modificar Falta
  128. '''
  129. @api.model
  130. def write_payslip_worked(self, values):
  131. worked_days = self.env['hr.payslip.worked_days'].search([('payslip_id', '=', values['id']),('id', '=', values['worked_id'])])
  132. worked_update = {
  133. 'name': values['name'],
  134. 'number_of_days': values['days']
  135. }
  136. worked_days.write(worked_update)
  137. return True if worked_days else False
  138. '''
  139. Get timezone
  140. '''
  141. def get_timezone(self):
  142. tz_name = self._context.get('tz') or self.env.user.tz
  143. return timezone(tz_name)
  144. '''
  145. Get server date
  146. '''
  147. def get_server_datetime(self):
  148. return datetime.now(self.get_timezone()).strftime(DATE_FORMAT)
  149. '''
  150. check_module Installed
  151. '''
  152. def check_module(self, module_name):
  153. '''
  154. Método para verificar si los modulo están instalado
  155. :param module_name : Nombre del moduloself.
  156. :return: True 'Modulo instalado', False 'no instalado'
  157. '''
  158. module = self.env['ir.module.module'].search([('name', '=', module_name), ('state', '=', 'installed')])
  159. return len(module) != 0
  160. '''
  161. Create payslip input
  162. '''
  163. def cretae_eiru_payslip_input(self, values):
  164. return self.env['hr.payslip.input'].create(values)
  165. '''
  166. Crear Adelanto/comision
  167. '''
  168. @api.model
  169. def create_payslip_input(self,values):
  170. date_server = self.get_server_datetime()
  171. resUser = self.env.user.id
  172. payslip = self.env['hr.payslip'].browse(values['id'])
  173. if (not payslip):
  174. return False
  175. input_line = {
  176. 'name': values['details'],
  177. 'code': values['salaryRule'],
  178. 'amount': values['amount'],
  179. 'contract_id': payslip.contract_id.id,
  180. 'sequence': 10,
  181. 'payslip_id': payslip.id
  182. }
  183. ## Create line
  184. inputPayslip = self.cretae_eiru_payslip_input(input_line)
  185. if (inputPayslip) and (values['salaryRule'] == 'ADL'):
  186. statementId = None
  187. if (self.check_module('eiru_account_bank_statement_utility')):
  188. statementConfig = self.env['account.bank.statement.config'].browse(values['statementConfigId'])
  189. if (statementConfig):
  190. if (statementConfig.import_statement_payslip == 'manual_import'):
  191. statementId = values['statementId']
  192. statementBank = self.create_eiru_bank_statement(values['journal'], statementId, date_server, resUser)
  193. statementBankLine = self.create_eiru_bank_statement_line(date_server, statementBank, inputPayslip.id,payslip.id)
  194. return True
  195. '''
  196. Create Statement
  197. '''
  198. def create_eiru_bank_statement(self, JournalId, statementId, date_server, resUser):
  199. accountJournal = self.env['account.journal'].browse(JournalId)
  200. period = self.env['account.period'].search([('date_start', '<=', date_server),('date_stop', '>=', date_server)])
  201. domain = [('journal_id', '=', JournalId),('user_id', '=', resUser)]
  202. if (statementId):
  203. domain.append(('id', '=', statementId))
  204. else:
  205. domain.append(('date', '=', date_server))
  206. bank_statement = self.env['account.bank.statement'].search(domain)
  207. bank = {
  208. 'journal_id': accountJournal.id,
  209. 'period_id': period.id,
  210. 'date': date_server,
  211. 'user_id': resUser,
  212. 'state': 'open' if accountJournal.type == 'cash' else 'draft',
  213. }
  214. bankStatement = bank_statement
  215. if bank_statement:
  216. if len(bank_statement) != 1:
  217. bankStatement = bank_statement[len(bank_statement) -1]
  218. bankStatement.write({'state': 'open' if accountJournal.type == 'cash' else 'draft'})
  219. else:
  220. bankStatement = bank_statement.create(bank)
  221. return bankStatement
  222. '''
  223. Create statement Line
  224. '''
  225. def create_eiru_bank_statement_line(self, dateServer, statement, payslipInputID, payslipId):
  226. payslip_input = self.env['hr.payslip.input'].browse(payslipInputID)
  227. payslip = self.env['hr.payslip'].browse(payslipId)
  228. bank_statement_line = {
  229. 'date' : dateServer,
  230. 'statement_id' : statement.id,
  231. 'journal_id': statement.journal_id.id,
  232. 'amount': payslip_input.amount,
  233. 'account_id': statement.journal_id.internal_account_id.id,
  234. 'ref': payslip_input.code,
  235. 'name': payslip_input.name,
  236. 'partner_id': payslip.employee_id.address_home_id.id,
  237. 'note': payslip_input.id,
  238. }
  239. statementLine = self.env['account.bank.statement.line'].create(bank_statement_line)
  240. return statementLine
  241. '''
  242. Export Statement
  243. '''
  244. @api.model
  245. def bank_statement_import(self, values):
  246. date_server = self.get_server_datetime()
  247. resUserId = self.env.user.id
  248. ### consultar payslip
  249. payslip = self.env['hr.payslip'].browse(values['payslipId'])
  250. if (not payslip):
  251. return False
  252. ### consultar payslip_input
  253. payslip_input = self.env['hr.payslip.input'].browse(values['imputId'])
  254. if (not payslip_input):
  255. return False
  256. ### consultar accountJournal
  257. journal = self.env['account.journal'].browse(values['journalid'])
  258. if (not journal):
  259. return False
  260. statement = self.create_eiru_bank_statement(journal.id, values['statementId'], date_server, resUserId)
  261. statementLine = self.create_eiru_bank_statement_line(date_server, statement, payslip_input.id, payslip.id)
  262. return {
  263. 'procc': True
  264. };
  265. '''
  266. Eliminar Comision
  267. '''
  268. @api.model
  269. def unlink_payslip_input(self,values):
  270. payslip_input =self.env['hr.payslip.input'].search([('id', '=', values['input_id']),('payslip_id', '=', values['id'])])
  271. payslip_input.unlink()
  272. return True if payslip_input else False
  273. '''
  274. Actualizar Comision
  275. '''
  276. @api.model
  277. def write_payslip_input(self, values):
  278. paylip_input = self.env['hr.payslip.input'].search([('payslip_id', '=', values['id']),('id', '=', values['input_id'])])
  279. input_update = {
  280. 'name': values['descript_input'],
  281. 'amount': values['amount_input']
  282. }
  283. paylip_input.write(input_update)
  284. return True if paylip_input else False