def _compute_name_holiday(self): """ Função que configura o nome automaticamente do holidays. Se começar e terminar em dias diferentes, mostre a data inicial e final do holidays, senão só mostra a data que acontecerá o holidays """ for holiday in self: if holiday.data_inicio and holiday.data_fim and \ holiday.holiday_status_id and holiday.employee_id: date_from = data.formata_data(holiday.data_inicio) date_to = data.formata_data(holiday.data_fim) if date_from == date_to: holiday.name = holiday.holiday_status_id.name[:30] + \ '[' + holiday.employee_id.name[:10] + '] ' + \ ' (' + date_to + ')' else: holiday.name = \ '[' + holiday.employee_id.name + '] ' + \ holiday.holiday_status_id.name[:30] + \ ' (' + date_from + '-' + date_to + ')' elif holiday.holiday_status_id and holiday.employee_id: holiday.name = holiday.holiday_status_id.name[:30] + \ '[' + holiday.employee_id.name[:10] + '] ' if holiday.controle_ferias_ids and holiday.type == 'add': holiday.name = \ 'Periodo Aquisitivo ' + \ ' (' + data.formata_data(holiday.controle_ferias_ids[0].inicio_aquisitivo) + \ ' - ' + \ data.formata_data(holiday.controle_ferias_ids[0].fim_aquisitivo) + ') '
def _compute_datas_formatadas(self): for contrato in self: if contrato.notice_of_termination_date: contrato.aviso_previo_fmt = data.formata_data( contrato.notice_of_termination_date) if contrato.resignation_date: contrato.data_afastamento_fmt = data.formata_data( contrato.resignation_date)
def _compute_name(self): for subs in self: if subs.data_inicio and subs.data_fim: subs.name = 'Substituição {} {} - {}'.format( subs.department_id.name, formata_data(subs.data_inicio), formata_data(subs.data_fim) )
def payslip_autonomo_report(pool, cr, uid, local_context, context): payslip_autonomo_pool = pool['hr.payslip.autonomo'] payslip_id = payslip_autonomo_pool.browse(cr, uid, context['active_id']) print("\n\n\n Vai report") company_logo = payslip_id.company_id.logo company_nfe_logo = payslip_id.company_id.nfe_logo local_context['company_logo'] = \ company_nfe_logo if company_nfe_logo else company_logo local_context['company_logo2'] = \ company_nfe_logo if company_nfe_logo else company_logo # CPF DO Autonomo if payslip_id.employee_id.cpf: local_context['cpf'] = formata_cpf(payslip_id.employee_id.cpf) else: local_context['cpf'] = '' # Formatar Data da emissao do do RG local_context['rg_emission'] = \ formata_data(payslip_id.employee_id.rg_emission) # Campo de conta bancária no formato para exibição do relatório conta_bancaria = '' if payslip_id.employee_id.address_home_id.bank_ids: conta_bancaria_id = payslip_id.employee_id.address_home_id.bank_ids[0] conta_bancaria = conta_bancaria_id.bank.bic + ' / ' + \ conta_bancaria_id.bra_number + ' / ' + \ conta_bancaria_id.acc_number local_context['conta_bancaria'] = conta_bancaria # Data de pagamento if payslip_id.data_pagamento_autonomo: local_context['data_pagamento'] = \ 'Data de Pagamento: ' + \ formata_data(payslip_id.data_pagamento_autonomo) else: local_context['data_pagamento'] = '' # Numero maximo de linhas por holerites, se ultrapassar esse limite será # dividido em 2 grupos para ser exibido em uma segunda pagina max_linhas = 10 local_context['grupo_rubricas_1'] = payslip_id.line_resume_ids[:max_linhas] local_context['grupo_rubricas_2'] = False if len(payslip_id.line_resume_ids) > max_linhas: local_context['grupo_rubricas_2'] = \ payslip_id.line_resume_ids[max_linhas:]
def _compute_nome_contrato(self): for contrato in self: if contrato.employee_id and contrato.matricula: nome = contrato.employee_id.name nome_contrato = '[%s] %s' % (contrato.matricula, nome) contrato.nome_contrato = nome_contrato if nome else '' if contrato.tipo == 'autonomo' and \ contrato.employee_id and contrato.date_start: nome = contrato.employee_id.name nome_contrato = '%s - [%s]' % \ (nome, formata_data(contrato.date_start)) contrato.nome_contrato = nome_contrato if nome else '' if contrato.date_end: nome_contrato = nome_contrato.replace( ']', ' - ' + formata_data(contrato.date_end) + ']') contrato.nome_contrato = nome_contrato
def _compute_data_aviso_previo(self): for payslip_id in self: if payslip_id.dias_aviso_previo_trabalhados: payslip_id.data_aviso_previo_fmt = \ data.formata_data(payslip_id.dias_aviso_previo_trabalhados) or ' ' else: payslip_id.data_aviso_previo_fmt = ' / / '
def _compute_data_afastamento(self): for payslip_id in self: if payslip_id.data_afastamento: payslip_id.data_afastamento_fmt = \ data.formata_data(payslip_id.data_afastamento) else: payslip_id.data_aviso_previo_fmt = ' / / '
def _descricao(self): if self.tipo == TIPO_CERTIFICADO_A1: self.descricao = 'A1' else: self.descricao = 'A3' if self.proprietario: self.descricao += ' - ' + self.proprietario if self.cnpj_cpf: self.descricao += ' - ' + self.cnpj_cpf if self.data_inicio_validade and self.data_fim_validade: self.descricao += ', válido de ' self.descricao += formata_data(self.data_inicio_validade) self.descricao += ' até ' self.descricao += formata_data(self.data_fim_validade)
def _compute_descricao(self): for certificado in self: if certificado.tipo == TIPO_CERTIFICADO_A1: certificado.descricao = u'A1' else: certificado.descricao = u'A3' if certificado.proprietario: certificado.descricao += u' - ' + certificado.proprietario if certificado.cnpj_cpf: certificado.descricao += u' - ' + certificado.cnpj_cpf if (certificado.data_inicio_validade and certificado.data_fim_validade): certificado.descricao += u', válido de ' certificado.descricao += formata_data( certificado.data_inicio_validade) certificado.descricao += u' até ' certificado.descricao += formata_data( certificado.data_fim_validade)
def _compute_name_holiday(self): """ Função que configura o nome automaticamente do holidays. Se começar e terminar em dias diferentes, mostre a data inicial e final do holidays, senão só mostra a data que acontecerá o holidays """ for holiday in self: if holiday.employee_id: # Pegar apenas os dois primeiros nomes employee_name = filter( lambda x: len(x) != 2, holiday.employee_id.name.split()) employee_name = ' '.join(employee_name[:2]) if holiday.data_inicio and holiday.data_fim and \ holiday.holiday_status_id and holiday.employee_id: date_from = data.formata_data(holiday.data_inicio) date_to = data.formata_data(holiday.data_fim) if date_from == date_to: holiday.name = holiday.holiday_status_id.name[:30] + \ ' [' + employee_name + '] ' + \ ' (' + date_to + ')' else: holiday.name = \ holiday.holiday_status_id.name[:30] + \ ' [' + employee_name + '] ' + \ ' (' + date_from + '-' + date_to + ')' elif holiday.holiday_status_id and holiday.employee_id: holiday.name = holiday.holiday_status_id.name[:30] + \ ' [' + employee_name + '] ' if holiday.controle_ferias_ids and holiday.type == 'add': holiday.name = \ 'Periodo Aquisitivo ' + \ ' (' + data.formata_data(holiday.controle_ferias_ids[0].inicio_aquisitivo) + \ ' - ' + \ data.formata_data(holiday.controle_ferias_ids[0].fim_aquisitivo) + ') '
def _validar(self, word, tam, tipo='AN'): """ Função Genérica utilizada para validação de campos que são gerados nos arquivos TXT's :param tipo: str - Tipo de palavras validadas: - A -> Alfabéticas -> Apenas letras do alfabeto - D -> Data -> Apenas numeral - V -> Valor -> Valores decimais, retirando a virgula - N -> Numerico -> Apenas numeros preechidos com zero a esq. - AN -> Alfanumericos -> Aceita nuemros e caracateres sem acentos :param word: str - palavra a ser validada :param tam: int - Tamanho que a palavra deve ser :return: str - Palavra formatada de acordo com tipo e tamanho """ if not word: word = u'' if tipo == 'A': # Alfabetico word = tira_acentos(word) # tirar tudo que nao for letra do alfabeto word = re.sub('[^a-zA-Z]', ' ', word) # Retirar 2 espaços seguidos word = re.sub('[ ]+', ' ', word) return unicode.ljust(unicode(word), tam)[:tam] elif tipo == 'D': # Data # Retira tudo que nao for numeral word = data.formata_data(word) word = re.sub(u'[^0-9]', '', str(word)) return unicode.ljust(unicode(word), tam)[:tam] elif tipo == 'V': # Valor # Pega a parte decimal como inteiro e nas duas ultimas casas word = int(word * 100) if word else 0 # Preenche com zeros a esquerda word = str(word).zfill(tam) return word[:tam] elif tipo == 'N': # Numerico # Preenche com zeros a esquerda word = re.sub('[^0-9]', '', str(word)) word = str(word).zfill(tam) return word[:tam] elif tipo == 'AN': # Alfanumerico # Tira acentos da palavras word = tira_acentos(word) # Preenche com espaço vazio a esquerda return unicode.ljust(unicode(word), tam)[:tam]
def payslip_report(pool, cr, uid, local_context, context): payslip_pool = pool['hr.payslip'] payslip_id = payslip_pool.browse(cr, uid, context['active_id']) local_context['footer'] = \ u'Telefone: 61-3246-6200 | E-mail: [email protected] | ' \ u'Site: http://www.abgf.gov.br' company_logo = payslip_id.company_id.logo company_nfe_logo = payslip_id.company_id.nfe_logo local_context['company_logo'] = \ company_nfe_logo if company_nfe_logo else company_logo local_context['company_logo2'] = \ company_nfe_logo if company_nfe_logo else company_logo local_context['linhas_holerites'] = payslip_id.line_resume_ids local_context['data_pagamento'] = \ formata_data(payslip_id.payment_line_ids[0].order_id.date_scheduled) \ if payslip_id.payment_line_ids else '' # Competencia competencia = dict(payslip_id._fields.get('mes_do_ano').selection).get( payslip_id.mes_do_ano) + ' de ' + str(payslip_id.ano) local_context['competencia'] = competencia # Calculo da quantidade de dependentes ativos. qty_dependent_values = 0 for dependente in payslip_id.employee_id.dependent_ids: if dependente.dependent_verification and \ dependente.dependent_dob < payslip_id.date_from: qty_dependent_values += 1 # Bloco para montar as observacoes do Holerite msg_dependentes = 'OBS.: Nº Dependente{} IR: {}'.format( 's' if qty_dependent_values != 1 else '', qty_dependent_values) \ if qty_dependent_values else '' local_context['msg_dependentes'] = msg_dependentes # Mensagem de felcitações msg_aniversario = '' aniversario = str(payslip_id.ano) + payslip_id.employee_id.birthday[-6:] if aniversario >= payslip_id.date_from and \ aniversario <= payslip_id.date_to: msg_aniversario = '\n\n\n FELIZ ANIVERSÁRIO! =) ' local_context['msg_aniversario'] = msg_aniversario
def action_back_to_draft(self): """ Permitir Suporte Voltar alterações para Rascunho, desfazendo a alteração no contrato :return: """ for alteracao in self: # verificar se selecionou a ultima alteracao, pois nao sera # possível desfazer alterações que nao forem a ultima ultima_alteracao = self.search([ ('change_type', '=', alteracao.change_type), ('contract_id', '=', alteracao.contract_id.id), ('state', '=', 'applied'), ], order='change_date DESC', limit=1) if not ultima_alteracao.id == self.id: raise UserError( u'Só é possível desfazer a última alteração contratual.' u'\nA última alteração é do dia %s' % formata_data(ultima_alteracao.change_date)) # Aplicar a penultima alteração contratual penultima_alteracao = self.search([ ('id', '!=', alteracao.id), ('change_type', '=', alteracao.change_type), ('contract_id', '=', alteracao.contract_id.id), ('state', '=', 'applied'), ], order='change_date DESC', limit=1) # Se nao tiver uma alteração anterior, isso é, # se for a primeira alteração contratual não é possível desfazer if not penultima_alteracao: raise UserError( u'Não é possível desfazer a primeira alteração contratual.' u'\nA primeira alteração contem as informações iniciais ' u'do contrato.') penultima_alteracao.apply_contract_changes() self.state = 'draft'
def _check_date(self): ''' Não permitir incluir uma alteração de remuneração com data anterior a última :return: ''' ultima_alteracao = self.search([ ('id', '!=', self.id), ('change_type', '=', self.change_type), ('contract_id', '=', self.contract_id.id), ('state', '=', 'applied'), ], order='change_date DESC', limit=1) if ultima_alteracao and \ self.change_date <= ultima_alteracao.change_date: raise UserError( u'Não é possível criar uma alteração contratual com ' u'data inferior à última alteração.' u'\n Data da última alteração contratual: %s' % formata_data(ultima_alteracao.change_date))
def _compute_descricao(self): for documento in self: txt = TIPO_EMISSAO_DICT[documento.emissao] if documento.emissao == TIPO_EMISSAO_PROPRIA: txt += ' - ' + ENTRADA_SAIDA_DICT[documento.entrada_saida] txt += ' - ' + documento.modelo txt += ' - ' + (documento.serie or '') txt += ' - ' + formata_valor(documento.numero, casas_decimais=0) txt += ' - ' + formata_data(documento.data_emissao) if not documento.participante_id.cnpj_cpf: txt += ' - Consumidor não identificado' elif documento.participante_id.razao_social: txt += ' - ' + documento.participante_id.razao_social txt += ' - ' + documento.participante_id.cnpj_cpf else: txt += ' - ' + documento.participante_id.nome txt += ' - ' + documento.participante_id.cnpj_cpf documento.descricao = txt
def header_remessa_400(self, remessa): boleto = remessa.boletos[0] beneficiario = boleto.beneficiario # # Header do arquivo # texto = '0' texto += '1' texto += 'REMESSA' # Na fase de teste informar REM.TST, em produção REMESSA texto += '01' texto += 'COBRANCA'.ljust(15) texto += str(beneficiario.agencia.numero).zfill(4) texto += '00' texto += str(beneficiario.conta.numero).zfill(5)[:5] texto += str(beneficiario.conta.digito).zfill(1) texto += ''.ljust(8) texto += beneficiario.nome.ljust(30)[:30] texto += '341' texto += 'BANCO ITAU SA'.ljust(15) texto += formata_data(remessa.data_hora, '%d%m%y') texto += ''.ljust(294) texto += '1'.zfill(6) return self.tira_acentos(texto.upper())
def create(self, vals): # Criação de um nome para o _rec_name # PS.: Nao consegui criar um campo computed. =( change_type = vals.get('change_type') or \ self.env.context.get('default_change_type') if change_type and vals.get('contract_id') and \ vals.get('change_date'): contrato_id = \ self.env['hr.contract'].browse(vals.get('contract_id')) nome_contrato = \ 'Contrato ' + contrato_id.nome_contrato[:6] + ' ' + \ contrato_id.employee_id.name nome_alteracao = \ u'Alteração de ' + \ dict(CHANGE_TYPE).get(change_type) + \ ' ' + u'em ' + \ formata_data(vals.get('change_date')) + ' ' + \ nome_contrato vals.update({ 'nome_alteracao' : nome_alteracao, 'name': nome_alteracao, 'change_type': change_type, }) return super(HrContractChange, self).create(vals)
def _compute_valor_total_folha(self): for holerite in self: total = 0.00 total_proventos = 0.00 total_descontos = 0.00 base_inss = 0.00 base_irpf = 0.00 base_fgts = 0.00 fgts = 0.00 inss = 0.00 irpf = 0.00 # codigo = {} # codigo['BASE_FGTS'] = \ # holerite.env\ # .ref('l10n_br_hr_payroll.hr_salary_rule_BASE_FGTS').code # codigo['BASE_INSS'] = \ # holerite.env\ # .ref('l10n_br_hr_payroll.hr_salary_rule_BASE_INSS').code # codigo['BASE_IRPF'] = \ # holerite.env\ # .ref('l10n_br_hr_payroll.hr_salary_rule_BASE_IRPF').code # codigo['FGTS'] = \ # holerite.env\ # .ref('l10n_br_hr_payroll.hr_salary_rule_FGTS').code # codigo['INSS'] = \ # holerite.env\ # .ref('l10n_br_hr_payroll.hr_salary_rule_INSS').code # codigo['IRPF'] = \ # holerite.env\ # .ref('l10n_br_hr_payroll.hr_salary_rule_IRPF').code for line in holerite.line_ids: total += line.valor_provento - line.valor_deducao total_proventos += line.valor_provento total_descontos += line.valor_deducao if line.code in ['BASE_FGTS', 'BASE_FGTS_13']: base_fgts += line.total elif line.code in ['BASE_INSS', 'BASE_INSS_13']: base_inss += line.total elif line.code == 'BASE_IRPF': base_irpf = line.total elif line.code == 'FGTS': fgts = line.total elif line.code == 'INSS': inss = line.total elif line.code == 'IRPF': irpf = line.total holerite.total_folha = total holerite.total_proventos = total_proventos holerite.total_descontos = total_descontos holerite.base_fgts = base_fgts holerite.base_inss = base_inss holerite.base_irpf = base_irpf holerite.fgts = fgts holerite.inss = inss holerite.irpf = irpf # Formato holerite.data_admissao_fmt = \ data.formata_data(holerite.contract_id.date_start) holerite.salario_base_fmt = \ valor.formata_valor(holerite.contract_id.wage) holerite.total_folha_fmt = \ valor.formata_valor(holerite.total_folha) holerite.total_proventos_fmt = \ valor.formata_valor(holerite.total_proventos) holerite.total_descontos_fmt = \ valor.formata_valor(holerite.total_descontos) holerite.base_fgts_fmt = valor.formata_valor(holerite.base_fgts) holerite.base_inss_fmt = valor.formata_valor(holerite.base_inss) holerite.base_irpf_fmt = valor.formata_valor(holerite.base_irpf) holerite.fgts_fmt = valor.formata_valor(holerite.fgts) holerite.inss_fmt = valor.formata_valor(holerite.inss) holerite.irpf_fmt = valor.formata_valor(holerite.irpf) holerite.data_extenso = data.data_por_extenso(fields.Date.today())
def gerar_holerites(self): self.verificar_holerites_gerados() for contrato in self.contract_id: # Provisionamento de ferias if self.tipo_de_folha == 'provisao_ferias': # recuperar primeiro dia do mes inicio_mes = str(self.ano).zfill(4) + '-' + \ str(self.mes_do_ano).zfill(2) + '-01' # se o contrato iniciou na metade do mes corrente # ex.: provisionando mes marco e contrato iniciou 15/03 if contrato.date_start > inicio_mes: inicio_mes = contrato.date_start data_inicio = fields.Date.to_string(ultimo_dia_mes(inicio_mes)) contrato.action_button_update_controle_ferias( data_referencia=data_inicio) for periodo in contrato.vacation_control_ids: if periodo.saldo > 0 and not periodo.inicio_gozo: try: data_fim = fields.Date.from_string(inicio_mes) + \ relativedelta(days=periodo.saldo) payslip_obj = self.env['hr.payslip'] periodo_aquisitivo_provisao = \ str(int(periodo.saldo)) + \ ' dias referente a ' + \ formata_data(periodo.inicio_aquisitivo) + \ ' - ' + \ formata_data(periodo.fim_aquisitivo) payslip = payslip_obj.create({ 'contract_id': contrato.id, 'periodo_aquisitivo': periodo.id, 'mes_do_ano': self.mes_do_ano, 'mes_do_ano2': self.mes_do_ano, 'date_from': inicio_mes, 'date_to': data_fim, 'ano': self.ano, 'employee_id': contrato.employee_id.id, 'tipo_de_folha': self.tipo_de_folha, 'payslip_run_id': self.id, 'periodo_aquisitivo_provisao': periodo_aquisitivo_provisao, }) # payslip._compute_set_dates() payslip.compute_sheet() self.env.cr.commit() _logger.info(u"Holerite " + contrato.name + u" processado com sucesso!") except: _logger.warning(u"Holerite " + contrato.name + u" falhou durante o cálculo!") payslip.unlink() continue contrato.action_button_update_controle_ferias() else: try: tipo_de_folha = self.tipo_de_folha if tipo_de_folha == 'adiantamento_13': tipo_de_folha = 'decimo_terceiro' payslip_obj = self.env['hr.payslip'] mes_do_ano = self.mes_do_ano if mes_do_ano == 13: mes_do_ano = 12 payslip = payslip_obj.create({ 'contract_id': contrato.id, 'mes_do_ano': self.mes_do_ano, 'mes_do_ano2': mes_do_ano, 'ano': self.ano, 'employee_id': contrato.employee_id.id, 'tipo_de_folha': tipo_de_folha, 'payslip_run_id': self.id, }) payslip._compute_set_dates() payslip._compute_set_employee_id() payslip.compute_sheet() _logger.info( u"Holerite " + contrato.name + u" processado com sucesso!") self.env.cr.commit() except: _logger.warning( u"Holerite " + contrato.name + u" falhou durante o cálculo!") payslip.unlink() continue self.verificar_holerites_gerados()
def _compute_birthday_formatado(self): for empregado in self: if empregado.birthday: empregado.birthday_fmt = data.formata_data(empregado.birthday)
def _valor_total_folha(self): for holerite in self: total = 0.00 total_proventos = 0.00 total_descontos = 0.00 base_inss = 0.00 base_irpf = 0.00 base_fgts = 0.00 fgts = 0.00 inss = 0.00 irpf = 0.00 codigo = {} codigo['BASE_FGTS'] = \ holerite.env\ .ref('l10n_br_hr_payroll.hr_salary_rule_BASE_FGTS').code codigo['BASE_INSS'] = \ holerite.env\ .ref('l10n_br_hr_payroll.hr_salary_rule_BASE_INSS').code codigo['BASE_IRPF'] = \ holerite.env\ .ref('l10n_br_hr_payroll.hr_salary_rule_BASE_IRPF').code codigo['FGTS'] = \ holerite.env\ .ref('l10n_br_hr_payroll.hr_salary_rule_FGTS').code codigo['INSS'] = \ holerite.env\ .ref('l10n_br_hr_payroll.hr_salary_rule_INSS').code codigo['IRPF'] = \ holerite.env\ .ref('l10n_br_hr_payroll.hr_salary_rule_IRPF').code for line in holerite.line_ids: total += line.valor_provento - line.valor_deducao total_proventos += line.valor_provento total_descontos += line.valor_deducao if codigo['BASE_FGTS']: base_fgts = line.total elif codigo['BASE_INSS']: base_inss = line.total elif codigo('BASE_IRPF'): base_irpf = line.total elif codigo['FGTS']: fgts = line.total elif codigo['INSS']: inss = line.total elif codigo['IRPF']: irpf = line.total holerite.total_folha = total holerite.total_proventos = total_proventos holerite.total_descontos = total_descontos holerite.base_fgts = base_fgts holerite.base_inss = base_inss holerite.base_irpf = base_irpf holerite.fgts = fgts holerite.inss = inss holerite.irpf = irpf # Formato holerite.data_admissao_fmt =\ data.formata_data(holerite.contract_id.date_start) holerite.salario_base_fmt =\ valor.formata_valor(holerite.contract_id.wage) holerite.total_folha_fmt =\ valor.formata_valor(holerite.total_folha) holerite.total_proventos_fmt =\ valor.formata_valor(holerite.total_proventos) holerite.total_descontos_fmt =\ valor.formata_valor(holerite.total_descontos) holerite.base_fgts_fmt = valor.formata_valor(holerite.base_fgts) holerite.base_inss_fmt = valor.formata_valor(holerite.base_inss) holerite.base_irpf_fmt = valor.formata_valor(holerite.base_irpf) holerite.fgts_fmt = valor.formata_valor(holerite.fgts) holerite.inss_fmt = valor.formata_valor(holerite.inss) holerite.irpf_fmt = valor.formata_valor(holerite.irpf)