#Update 2, o erro era de lógica, esta resolvido no meu post mais abaixo.
#Update gente. Mudei o titulo pois agora entendi o erro.
Meu professor me mandou um email após ver o código.
ele disse que esta ok o que acontece é que o método calculaSalarioBruto() só é chamado la embaixo no método calculaSalarioLiquido()
Agora eu gostaria de saber se é possível fazer com que esse método calcule o valor ja quando o objeto é instanciado, pois eu passo os parâmetros necessários por teclado antes de instanciar… Tem como fazer o método apenas executar assim que o objeto é instanciado? Lembrando que ele é private e eu não consigo chamar ele no main.
Boa noite. Esta é a primeira vez que recorro a algum fórum para solicitar ajuda com java, eu costumo ler muito antes, mas dessa vez ta difícil pra mim.
O app calcula pagamento de colaboradores, deve retornar salario bruto, impostos, salario liquido, etc.
Quando eu utilizo um valor baixo para valor/hora e até 160 de quantidade de horas, ou seja, quando o valor liquido vai ser baixo, esta retornando o valor liquido certo, apenas o valor liquido, os impostos não, nem o bruto. Quando o valor do salario é muito alto, retorna tudo zerado.
Segue abaixo o código:
Aplicação:
[code]package Aplicacoes;
import Modelos.*;
public class ATPS {
public static void main(String[] args)
{
//Menu Principal
System.out.println("Selecione o tipo de colaborador para calculo de pagamento:");
System.out.println("Digite 1 para Celetista");
System.out.println("Digite 2 para Pessoa Juridica");
System.out.println("Digite 0 para Sair");
try{
int x = Keyboard.readInt();
if(x == 1){
//preenchendo os dados de Celetistas
System.out.println("Digite o NOME");
String n = Keyboard.readString();
System.out.println("Digite o ENDEREÇO");
String e = Keyboard.readString();
System.out.println("Digite o TELEFONE");
int tel = Keyboard.readInt();
System.out.println("Digite o RG");
int rg = Keyboard.readInt();
System.out.println("Digite o CPF");
String cpf = Keyboard.readString();
System.out.println("Digite o VALOR/HORA");
float valorH = Keyboard.readFloat();
System.out.println("Digite a quantidade de HORAS TRABALHADAS");
int hrs = Keyboard.readInt();
Celetistas c1 = new Celetistas(n, e, tel, rg, cpf, valorH, hrs);
System.out.println(c1.toString());
}
}catch(RuntimeException e){
System.out.println("Escolha uma opção válida (1,2 ou 0)");
}
}
}[/code]
Abaixo a classe colaboradores:
[code]package Modelos;
public class Colaboradores
{
public static String nome;
public static String endereco;
public static int telefone;
public Colaboradores(String n, String e, int tel)
{
nome = n;
endereco = e;
telefone = tel;
}
public void setNome(String valor)
{
nome=valor;
}
public void setEndereco(String valor)
{
endereco=valor;
}
public void setTelefone(int valor)
{
telefone=valor;
}
public String toString()
{
String colaborador = "Dados do colaborador: \nNome: "+nome+"\nEndereço: "+endereco+"\nTelefone: "+telefone;
return colaborador;
}
}[/code]
e abaixo a classe celetistas:
[code]package Modelos;
public class Celetistas extends Colaboradores
{
private int RG;
private String CPF;
private float valorHora;
private double salario;
private double salarioLiquido;
private int horas;
private double irrf;
private double inss;
public Celetistas(String n, String e, int tel, int rg, String cpf, float valorH, int hrs)
{
super(n, e, tel); // atributos da classe pai
RG = rg;
CPF = cpf;
valorHora = valorH;
horas = hrs;
}
public void setValorHora(int valorH)
{
valorHora=valorH;
}
public void setSalario(double valor) // set para modificar o valor do salario bruto mensal
{
salario=valor;
}
private double calculaSalarioBruto() //calculo do salario com ou sem hora extra
{
if(horas <= 160){ //até 160 horas o salario é o valor bruto
salario = horas * valorHora;
}
else if(horas >= 161){ // horas excedentes de 160 tem valor extra (valor do salario / 160 * total de horas trabalhadas
salario = (salario/160) * horas;
}
return salario;
}
public double getSalarioBruto() // get para pegar o salario bruto
{
double salarioBruto = salario;
return salarioBruto;
}
private double calculaIRRF() //calculo do IRRF/IRPF - Imposto retido pela fonte
{
if(salario <= 1495.15){
irrf=0; //imposto isento
}
else if(salario >= 1495.16 && salario <= 2246.75){
irrf=salario*(7.5/100)-112.43; //imposto de 7,5%, dedução de 112,43
}
else if(salario >= 2246.76 && salario <= 2995.70){
irrf=salario*(15/100)-280.94; //imposto de 15%, dedução de 280,94
}
else if(salario >= 2995.71 && salario <= 3743.19){
irrf=salario*(22.5/100)-505.62; //imposto de 22,5%, dedução de 505,62
}
else if(salario >= 3743.20){
irrf=salario*(27.5/100)-672.78; //imposto de 27,5%, dedução de 327,78
}
return irrf;
}
private double calculaINSS() //metodo calcula o INSS
{
if(salario < 965.67){
inss=salario*(8/100);
}
else if(salario >= 965.68 && salario <= 1609.45){
inss=salario*(9/100);
}
else if(salario > 1609.45){
inss=salario*(11/100);
if(inss > 354.08){ //se o INSS passar de 354.08, definir com esse valor pois não pode ser maior.
inss=354.08;
}
}
return inss;
}
private double calculaSalarioLiquido()// metodo calcula o salario liquido
{
salarioLiquido = (calculaSalarioBruto())-(calculaIRRF())-(calculaINSS());
return salarioLiquido;
}
public String getImpostos() // get dos impostos
{
String showImpostos = "O valor do IRRF é de: R$"+irrf+"\n"
+"O valor do INSS é de: R$"+inss;
return showImpostos;
}
public String toString() // toString geral, mostra todas as informações para o pagamento
{
String resumo = super.toString()+"\nCPF: "+CPF+"\nRG: "+RG
+"\nSalário bruto: R$"+getSalarioBruto()
+"\nImpostos:\n"+getImpostos()
+"\nSalario Liquido: R$"+calculaSalarioLiquido();
return resumo;
}
}[/code]
Obs.: eu ainda não fiz todo o código, então só funciona se eu escolher a opção 1 no aplicativo, que entra para o calculo dos celetistas que foi o que eu tentei implementar, mas ajustando esse o outro é bem parecido os métodos, então se eu enxergar meu erro aí eu consigo corrigir no outro também.
Coloquei o app em anexo, caso alguém queira testar, eu utilizo o NetBeans para estudar.
Se alguém puder me ajudar, agradeço.