Em relação às flags, eu pensaria numa solução mais ou menos assim:
public void insert(PagamentoAutonomoDTO dto) {
insert(dto, true, false);
}
private void insert(PagamentoAutonomoDTO dto, boolean carregarValores, boolean todasEmpresas) {
final Long idTabelaIRRFCalc;
final Long idFiscalManutencao;
final Long idContribuicaoInss;
// Se cair no insertTodos, não tem necessidade de passar aqui toda vez
if (carregarValores) {
valorValoresRelatorio = valoresRelatoriosRepository.findByCodigoMesAno("001", dto.getMesAno());
valorPrimeiroRegistro = valoresRelatoriosRepository.findByPrimeiroRegistro();
idTabelaIRRFCalc = irrfRepository.findIRRF(mesAno);
irrfCalc = irrfRepository.getOne(idTabelaIRRFCalc);
empresa = empresaRepository.getOne(dto.getEmpresaId());
inssEnquadramento = inssEnquadramentoRepository.findByEmpresaId(dto.getEmpresaId());
idFiscalManutencao = fiscalManutencaoRepository.findIdByEmpresaId(dto.getEmpresaId());
fiscalManutencao = fiscalManutencaoRepository.getOne(idFiscalManutencao);
idContribuicaoInss = contribuicaoInssRepository.findByMesAnoContribuicaoInss(dto.getMesAno());
contribuicaoInss = contribuicaoInssRepository.getOne(idContribuicaoInss);
}
Long idAutonomo = pagamentoAutonomoRepository.findAutonomoCpf(dto.getCpf());
Autonomo autonomo = autonomoRepository.getOne(idAutonomo);
if (todasEmpresas) {
Long idEmpresa = dto.getEmpresaId();
empresa = empresaRepository.getOne(idEmpresa);
}
var entity = new PagamentoAutonomo();
BeanUtils.copyProperties(dto, entity);
entity.setEmpresa(empresa);
entity.setAutonomo(autonomo);
Double valorReceber = 0.00;
Double valorReceberContrib = 0.00;
if (valorValoresRelatorio != null) {
// faz algo
} else if (valorPrimeiroRegistro != null) {
// faz algo
} else {
valorReceber = 0.00;
}
// cálculos necessários ...
LocalDate dataPagamento = LocalDate.parse(mesAno, DateTimeFormatter.ofPattern("dd/MM/yyyy"));
boolean salvar; // Ex: 20/01/2023 < 01/01/2023 - false
if (autonomo.getDesligamento() != null && !autonomo.getDesligamento().isBefore(dataPagamento)) {
salvar = true;
} else if (autonomo.getDesligamento() == null) {
salvar = true;
} else {
salvar = false;
}
if (salvar) {
pagamentoAutonomoRepository.save(entity);
}
}
public void insertTodos(PagamentoAutonomoDTO dto) {
List<String> listaCpfAutonomoPorEmpresa = pagamentoAutonomoRepository.findCpfAutonomoByEmpresaId(dto.getEmpresaId());
for (String cpf : listaCpfAutonomoPorEmpresa) {
dto.setCpf(cpf);
insert(dto, false, false);
}
}
public void insertTodasEmpresas(PagamentoAutonomoDTO dto) {
List<Long> empresas = empresaRepository.findEmpresas();
for (Long idEmpresa : empresas) {
List<String> autonomos = pagamentoAutonomoRepository.findCpfAutonomoByEmpresaId(idEmpresa);
for (String cpfAutonomo : autonomos) {
dto.setEmpresaId(idEmpresa);
dto.setCpf(cpfAutonomo);
insert(dto, false, true);
}
}
}
Teria um método privado que receberia flags para fazer o controle do processamento, e manteria o resto como estava e passaria os booleans de acordo com o que for necessário. Isso seria para responder sua dúvida inicial.
Agora o bacana mesmo seria uma refatoração no método de inserir para, talvez, quebrar esse método em outros para deixar a responsabilidade mais definida, fazendo que a cada parte seja chamada de acordo com o que precisa ser executado.