payslip_faults.py 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374
  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. '''
  172. Values[
  173. id
  174. salaryRule
  175. details
  176. amount
  177. journal
  178. statementId
  179. statementConfigId
  180. ]
  181. '''
  182. # import web_pdb; web_pdb.set_trace()
  183. payslip = self.env['hr.payslip'].browse(values['id'])
  184. if (not payslip):
  185. return False
  186. input_line = {
  187. 'name': values['details'],
  188. 'code': values['salaryRule'],
  189. 'amount': values['amount'],
  190. 'contract_id': payslip.contract_id.id,
  191. 'sequence': 10,
  192. 'payslip_id': payslip.id
  193. }
  194. ## Create line
  195. inputPayslip = self.cretae_eiru_payslip_input(input_line)
  196. # input_payslip = payslip_input.create(input_line)
  197. if (inputPayslip) and (values['salaryRule'] == 'ADL'):
  198. statementId = None
  199. if (self.check_module('eiru_account_bank_statement_utility')):
  200. statementConfig = self.env['account.bank.statement.config'].browse(values['statementConfigId'])
  201. if (statementConfig):
  202. if (statementConfig.import_statement_payslip == 'manual_import'):
  203. statementId = values['statementId']
  204. # valueStatement = {
  205. # 'imputID': InputPayslip.id,
  206. # 'journalId': values['journal'],
  207. # 'statementId': statementId
  208. # }
  209. statementBank = self.create_eiru_bank_statement(values['journal'], statementId, date_server, resUser)
  210. statementBankLine = self.create_eiru_bank_statement_line(date_server, statementBank, inputPayslip.id,payslip.id)
  211. return True
  212. def create_eiru_bank_statement(self, JournalId, statementId, date_server, resUser):
  213. accountJournal = self.env['account.journal'].browse(JournalId)
  214. period = self.env['account.period'].search([('date_start', '<=', date_server),('date_stop', '>=', date_server)])
  215. domain = [('journal_id', '=', JournalId),('user_id', '=', resUser)]
  216. if (statementId):
  217. domain.append(('id', '=', statementId))
  218. else:
  219. domain.append(('date', '=', date_server))
  220. bank_statement = self.env['account.bank.statement'].search(domain)
  221. bank = {
  222. 'journal_id': accountJournal.id,
  223. 'period_id': period.id,
  224. 'date': date_server,
  225. 'user_id': resUser,
  226. 'state': 'open' if accountJournal.type == 'cash' else 'draft',
  227. }
  228. bankStatement = bank_statement
  229. if bank_statement:
  230. if len(bank_statement) != 1:
  231. bankStatement = bank_statement[len(bank_statement) -1]
  232. bankStatement.write({'state': 'open' if accountJournal.type == 'cash' else 'draft'})
  233. else:
  234. bankStatement = bank_statement.create(bank)
  235. return bankStatement
  236. def create_eiru_bank_statement_line(self, dateServer, statement, payslipInputID, payslipId):
  237. payslip_input = self.env['hr.payslip.input'].browse(payslipInputID)
  238. payslip = self.env['hr.payslip'].browse(payslipId)
  239. bank_statement_line = {
  240. 'date' : dateServer,
  241. 'statement_id' : statement.id,
  242. 'journal_id': statement.journal_id.id,
  243. 'amount': payslip_input.amount,
  244. 'account_id': statement.journal_id.internal_account_id.id,
  245. 'ref': payslip_input.code,
  246. 'name': payslip_input.name,
  247. 'partner_id': payslip.employee_id.address_home_id.id,
  248. 'note': payslip_input.id,
  249. }
  250. statementLine = self.env['account.bank.statement.line'].create(bank_statement_line)
  251. return statementLine
  252. @api.model
  253. def bank_statement_import(self, values):
  254. #period Actual
  255. period = self.env['account.period'].search([('date_start', '<=', fields.Date.context_today(self) ),('date_stop', '>=', fields.Date.context_today(self))])
  256. ### consultar payslip_input
  257. payslip_input = self.env['hr.payslip.input'].search([('id', '=', values['id_imput'])])
  258. ### consultar payslip
  259. payslip = self.env['hr.payslip'].search([('id', '=', payslip_input.payslip_id.id)])
  260. ### consultar accountJournal
  261. journal = self.env['account.journal'].search([('id', '=', values['journal_id'])])
  262. ### Consultar Caja Abierta, Método de Pagos, Fecha de Hoy
  263. bank_statement = self.env['account.bank.statement'].search([('journal_id', 'in', [journal.id]), ('date', '=', fields.Date.context_today(self))])
  264. ### Instanciar lineas de la caja
  265. statement_line = self.env['account.bank.statement.line']
  266. ## Crear o Actualizar statement
  267. bank = {
  268. 'journal_id': journal.id,
  269. 'period_id': period.id,
  270. 'date': fields.Date.context_today(self),
  271. 'user_id': self.env.user.id,
  272. 'state': 'open' if journal.type == 'cash' else 'draft',
  273. }
  274. # #
  275. if bank_statement:
  276. if len(bank_statement) == 1:
  277. bank_statement.write(bank)
  278. else:
  279. bank_statement[len(bank_statement) -1].write(bank)
  280. else:
  281. bank_statement = bank_statement.create(bank)
  282. ### Crear statement_line
  283. bank_statement_line = {
  284. 'date' : bank_statement.date,
  285. 'statement_id' : bank_statement.id,
  286. 'journal_id': bank_statement.journal_id.id,
  287. 'amount': payslip_input.amount,
  288. 'account_id': bank_statement.journal_id.internal_account_id.id,
  289. 'ref': payslip_input.code,
  290. 'name': str(payslip_input.name)+"(Ref. pago: "+str(values['journal_ref'])+")" if values['journal_ref'] else payslip_input.name,
  291. 'partner_id': payslip.employee_id.address_home_id.id,
  292. 'note': payslip_input.id,
  293. }
  294. statement_line.create(bank_statement_line)
  295. return True if statement_line else False
  296. '''
  297. Eliminar Comision
  298. '''
  299. @api.model
  300. def unlink_payslip_input(self,values):
  301. payslip_input =self.env['hr.payslip.input'].search([('id', '=', values['input_id']),('payslip_id', '=', values['id'])])
  302. payslip_input.unlink()
  303. return True if payslip_input else False
  304. '''
  305. Actualizar Comision
  306. '''
  307. @api.model
  308. def write_payslip_input(self, values):
  309. paylip_input = self.env['hr.payslip.input'].search([('payslip_id', '=', values['id']),('id', '=', values['input_id'])])
  310. input_update = {
  311. 'name': values['descript_input'],
  312. 'amount': values['amount_input']
  313. }
  314. paylip_input.write(input_update)
  315. return True if paylip_input else False