Untitled
unknown
plain_text
2 years ago
6.4 kB
9
Indexable
package br.com.senior.erpxcomfat.saleinvoice.service.impl;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Objects;
import java.util.UUID;
import java.util.stream.Collectors;
import javax.inject.Inject;
import org.lindberg.jpa.entitycloner.persistence.EntityCloner;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import br.com.senior.erpxcomfat.saleinvoice.E140nfsBatchEntity;
import br.com.senior.erpxcomfat.saleinvoice.E140nfsBatchInvoiceEntity;
import br.com.senior.erpxcomfat.saleinvoice.E140nfsEntity;
import br.com.senior.erpxcomfat.saleinvoice.E140obsEntity;
import br.com.senior.erpxcomfat.saleinvoice.EnumBatchProcessingType;
import br.com.senior.erpxcomfat.saleinvoice.EnumBatchStatus;
import br.com.senior.erpxcomfat.saleinvoice.EnumPrcNfs;
import br.com.senior.erpxcomfat.saleinvoice.EnumSitNfs;
import br.com.senior.erpxcomfat.saleinvoice.EnumTipNfs;
import br.com.senior.erpxcomfat.saleinvoice.dto.GenerateNumberInvoice;
import br.com.senior.erpxcomfat.saleinvoice.repository.E140nfsBatchRepository;
import br.com.senior.erpxcomfat.saleinvoice.repository.E140nfsRepository;
import br.com.senior.erpxcomfat.saleinvoice.repository.E140obsRepository;
import br.com.senior.erpxcomfat.saleinvoice.service.CloneSaleInvoiceService;
import br.com.senior.erpxcomfat.saleinvoice.service.FiscalDocumentIssuanceService;
import br.com.senior.erpxcomfat.saleinvoice.service.RecalculateInstallmentsService;
import br.com.senior.erpxcomfat.utils.DateUtils;
import br.com.senior.erpxcomfat.utils.NumberUtils;
@Service
public class CloneSaleInvoiceServiceImpl implements CloneSaleInvoiceService {
private List<EnumTipNfs> typesInvoiceOfService = Arrays.asList(EnumTipNfs.V21, EnumTipNfs.V20);
@Inject
private E140nfsRepository saleInvoiceRepository;
@Inject
private FiscalDocumentIssuanceService fiscalDocumentIssuanceService;
@Inject
private RecalculateInstallmentsService recalculateInstallmentsService;
@Inject
private E140obsRepository observationRepository;
@Inject
private E140nfsBatchRepository batchRepository;
@Override
@Transactional
public E140nfsEntity clone(E140nfsEntity saleInvoiceOrigin, Boolean copyData, EnumTipNfs type, EnumSitNfs situation, HashMap<Class, List<String>> fieldsToIgnore) {
E140nfsEntity saleInvoice = this.cloneSaleInvoice(saleInvoiceOrigin, fieldsToIgnore);
saleInvoice = this.setNewValuesAndUpdate(saleInvoice, type, situation);
if (Boolean.TRUE.equals(copyData)) {
this.cloneObservations(saleInvoiceOrigin.getId(), saleInvoice);
}
if (EnumTipNfs.V21 == type) {
this.recalculateInstallmentsService.recalculateInstallments(saleInvoice);
saleInvoice.setFatCon(saleInvoiceOrigin.getId());
if (EnumPrcNfs.V3 == saleInvoiceOrigin.getPrcNfs()) {
E140nfsBatchEntity e140nfsBatch = batchRepository.findBatchByInvoiceAndType(saleInvoiceOrigin.getId(), EnumBatchProcessingType.GERACAO_VIA_CONTRATO);
if (Objects.nonNull(e140nfsBatch)) {
cloneSaleAgreementBatch(e140nfsBatch.getIdeExt(), saleInvoice);
}
}
}
this.generateNumNfsSaleInvoice(saleInvoice);
return saleInvoiceRepository.saveAndFlush(saleInvoice);
}
private E140nfsEntity setNewValuesAndUpdate(E140nfsEntity saleInvoice, EnumTipNfs type, EnumSitNfs situation) {
saleInvoice.setTipNfs(type);
saleInvoice.setSitNfs(situation);
saleInvoice.setDthEmi(DateUtils.getDateEmi());
saleInvoice.setE140par(Collections.emptyList());
return saleInvoiceRepository.saveAndFlush(saleInvoice);
}
private void cloneObservations(UUID saleInvoiceOriginId, E140nfsEntity saleInvoice) {
List<E140obsEntity> observationsOrigin = observationRepository.findByE140nfs_Id(saleInvoiceOriginId);
if (Objects.nonNull(observationsOrigin)) {
List<E140obsEntity> observations = observationsOrigin.parallelStream().map(observationOrigin -> cloneObservation(observationOrigin, saleInvoice)).collect(Collectors.toList());
observationRepository.saveAll(observations);
}
}
public E140nfsBatchEntity cloneSaleAgreementBatch(String externalId, E140nfsEntity clonedInvoice) {
var batch = new E140nfsBatchEntity();
batch.setIdeExt(externalId);
batch.setTipBat(EnumBatchProcessingType.GERACAO_VIA_CONTRATO);
batch.setSitBat(EnumBatchStatus.SUCESSO);
batch.setCodBat(getLastBatchCode());
var e140nfsBatchInvoiceEntity = new E140nfsBatchInvoiceEntity();
e140nfsBatchInvoiceEntity.setE140nfs(clonedInvoice);
e140nfsBatchInvoiceEntity.setE140nfsBatch(batch);
batch.setE140nfsBatchInvoice(Arrays.asList(e140nfsBatchInvoiceEntity));
return batchRepository.saveAndFlush(batch);
}
public Long getLastBatchCode() {
return batchRepository.lastBatchCode();
}
private E140obsEntity cloneObservation(E140obsEntity observation, E140nfsEntity saleInvoice) {
HashMap<Class, List<String>> fieldsToIgnore = new HashMap<>();
fieldsToIgnore.put(E140obsEntity.class, Arrays.asList("id"));
EntityCloner<E140obsEntity> observationCloner = new EntityCloner<>(observation, fieldsToIgnore);
E140obsEntity observationClone = observationCloner.generateClone();
observationClone.setE140nfs(saleInvoice);
return observationClone;
}
private E140nfsEntity cloneSaleInvoice(E140nfsEntity saleInvoiceOrigin, HashMap<Class, List<String>> fieldsToIgnore) {
EntityCloner<E140nfsEntity> saleInvoiceCloner = new EntityCloner<>(saleInvoiceOrigin, fieldsToIgnore);
return saleInvoiceCloner.generateClone();
}
private void generateNumNfsSaleInvoice(E140nfsEntity saleInvoice) {
if (NumberUtils.convertNull(saleInvoice.getNumNfs()) == NumberUtils.ZERO) {
GenerateNumberInvoice response = fiscalDocumentIssuanceService.generateNumberSaleInvoice(saleInvoice.getE070fil(), saleInvoice.getE020snf(), saleInvoice.getDthEmi());
saleInvoice.setDthEmi(response.getIssueDate());
if (typesInvoiceOfService.contains(saleInvoice.getTipNfs())) {
saleInvoice.setNumRps(response.getIssueNumber());
} else {
saleInvoice.setNumNfs(response.getIssueNumber());
}
}
}
}Editor is loading...