Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
63 changes: 63 additions & 0 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -139,6 +139,69 @@
<artifactId>jackson-databind</artifactId>
<version>2.13.0</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.24</version>
</dependency>

<!-- https://mvnrepository.com/artifact/com.mercadopago/sdk-java -->
<dependency>
<groupId>com.mercadopago</groupId>
<artifactId>sdk-java</artifactId>
<version>2.1.20</version>
</dependency>

<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itext7-core</artifactId>
<version>7.2.0</version> <!-- Verifique a versão mais recente -->
</dependency>

<dependency>
<groupId>com.sun.mail</groupId>
<artifactId>javax.mail</artifactId>
<version>1.6.2</version> <!-- Verifique a versão mais recente -->
</dependency>

<!-- https://mvnrepository.com/artifact/org.apache.xmlgraphics/batik-transcoder -->
<dependency>
<groupId>org.apache.xmlgraphics</groupId>
<artifactId>batik-transcoder</artifactId>
<version>1.14</version>
<exclusions>
<exclusion>
<groupId>xalan</groupId>
<artifactId>xalan</artifactId>
</exclusion>
</exclusions>
</dependency>

<!-- https://mvnrepository.com/artifact/com.google.zxing/core -->
<dependency>
<groupId>com.google.zxing</groupId>
<artifactId>core</artifactId>
<version>3.4.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.google.zxing/javase -->
<dependency>
<groupId>com.google.zxing</groupId>
<artifactId>javase</artifactId>
<version>3.4.1</version>
</dependency>

<!-- https://mvnrepository.com/artifact/org.apache.xmlgraphics/fop -->
<dependency>
<groupId>org.apache.xmlgraphics</groupId>
<artifactId>fop</artifactId>
<version>2.6</version>
<exclusions>
<exclusion>
<groupId>xalan</groupId>
<artifactId>xalan</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<build>
<plugins>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,13 @@
import br.edu.utfpr.servicebook.util.pagination.PaginationUtil;
import br.edu.utfpr.servicebook.util.UserTemplateInfo;
import br.edu.utfpr.servicebook.util.TemplateUtil;
import com.cloudinary.Cloudinary;
import com.cloudinary.utils.ObjectUtils;
import org.apache.batik.transcoder.TranscoderException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Sort;
Expand All @@ -31,11 +35,18 @@
import javax.annotation.security.RolesAllowed;
import javax.persistence.EntityNotFoundException;
import javax.servlet.http.HttpServletRequest;
import javax.xml.transform.TransformerException;
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.util.List;
import java.util.Optional;
import java.util.*;
import java.util.stream.Collectors;
import org.springframework.http.ResponseEntity;
import org.springframework.validation.BindingResult;
import com.google.zxing.WriterException;
import org.apache.batik.transcoder.TranscoderException;
import org.apache.fop.configuration.ConfigurationException;

@RequestMapping("/minha-conta/cliente")
@Controller
Expand Down Expand Up @@ -104,7 +115,32 @@ public class ClientController {
@Autowired
private ProfessionalMapper professionalMapper;

@Autowired
private PaymentService paymentService;

@Autowired
private PaymentMapper paymentMapper;

@Autowired
private PaymentVoucherService paymentVoucherService;

@Autowired
private PaymentVoucherMapper paymentVoucherMapper;

@Autowired
private PaymentJobService paymentJobService;

@Autowired
private PaymentJobMapper paymentJobMapper;

@Autowired
private Cloudinary cloudinary;

@Autowired
private ProfessionalServiceOfferingService professionalServiceOfferingService;

@Value("${svg.certificate.template}")
private String svgCertificateTemplate;
/**
* Método que apresenta a tela inicial do cliente
* @return
Expand Down Expand Up @@ -273,7 +309,7 @@ public ModelAndView showDetailsRequestCandidate(@PathVariable Optional<Long> job
public ModelAndView showAvailableJobs(
HttpServletRequest request,
@RequestParam(value = "pag", defaultValue = "1") int page,
@RequestParam(value = "siz", defaultValue = "3") int size,
@RequestParam(value = "siz", defaultValue = "4") int size,
@RequestParam(value = "ord", defaultValue = "id") String order,
@RequestParam(value = "dir", defaultValue = "ASC") String direction
) throws Exception {
Expand Down Expand Up @@ -764,16 +800,191 @@ public String markAsHided(@PathVariable Long jobId, @PathVariable Long userId, R
jobRequest.setStatus(JobRequest.Status.TO_HIRED);
jobRequestService.save(jobRequest);

System.out.println("JOBBBBBBBBB" + oJobRequest.get());

//guarda a data de contratação
Optional<JobContracted> oJobContracted = jobContractedService.findByJobRequest(jobRequest);
if(!oJobContracted.isPresent()) {
throw new EntityNotFoundException("O profissional não pode ser contratado!");
}
Optional<JobContracted> oJobContracted = jobContractedService.findByJobRequest(oJobRequest.get());
// if(!oJobContracted.isPresent()) {
// throw new EntityNotFoundException("O profissional não pode ser contratado!");
// }
Optional<User> oUser = userService.findById(userId);

JobContracted jobContracted = oJobContracted.get();
JobContracted jobContracted = new JobContracted();
jobContracted.setHiredDate(LocalDate.now());
jobContracted.setJobRequest(oJobRequest.get());
jobContracted.setUser(oUser.get());
jobContractedService.save(jobContracted);

return "redirect:/minha-conta/cliente/meus-pedidos/"+jobId;
}

/**
* Responsável por realizar o pagamento via API Mercado Pago.
*/
@PostMapping("/pagamento")
@RolesAllowed({RoleType.USER})
public ResponseEntity<?> createPayment(@RequestBody Map<String, Object> paymentData){
ResponseDTO response = new ResponseDTO();

try {
if (paymentData == null || paymentData.isEmpty()) {
response.setMessage("Erro ao enviar dados. Verifique os campos e tente novamente!");
return ResponseEntity.status(400).body(response);
}

Optional<User> oUser = (userService.findByEmail(authentication.getEmail()));

if (!oUser.isPresent()) {
response.setMessage("Usuário não autenticado! Por favor, realize sua autenticação no sistema.");
return ResponseEntity.status(401).body(response);
}

ResponseEntity<?> paymentResponse = paymentService.pay(paymentData);

if(!paymentResponse.getStatusCode().is2xxSuccessful()){
response.setMessage("Erro ao processar pagamento. Tente novamente");
return ResponseEntity.status(paymentResponse.getStatusCode()).body(response);
}

Object responseBody = paymentResponse.getBody();

Map<?, ?> responseMap = (Map<?, ?>) responseBody;
Integer paymentId = (Integer) responseMap.get("id");
String status = (String) responseMap.get("status");

PaymentDTO paymentDTO = new PaymentDTO(paymentId, status);
Payment payment = paymentMapper.toEntity(paymentDTO);

paymentService.save(payment);

response.setData(paymentResponse.getBody());



System.out.println("SATTSUS PAGAMENTO.....");
System.out.println(status);


return ResponseEntity.ok(response);


} catch (Exception e) {
response.setMessage("Erro ao fazer pagamento. Por favor, tente novamente.");
return ResponseEntity.status(400).body(response);
}
}

/**
* Apos processar o pagamento, ele é inserido na tabela payments_jobRequests
* contendo o id do pagamento e do serviço que foi realizado o pagamento.
* Finalizado este processo é preciso gerar um comprovante do pagamento
* tanto para cliente quanto profissional, que sera enviado por email
* **/
@PostMapping("/pagamento/jobRequest")
@RolesAllowed({RoleType.USER})
public ModelAndView savePaymentJob(@RequestBody PaymentJobDTO dto, BindingResult errors, RedirectAttributes redirectAttributes) throws ConfigurationException, TranscoderException, IOException, TransformerException, WriterException {
ModelAndView modelAndView = new ModelAndView();
final Date now = new Date();

Optional<Payment> oPayment = paymentService.find(dto.getPaymentId());
Optional<JobRequest> oJobRequest = jobRequestService.findById(dto.getJobRequestId());

PaymentJobRequest paymentJob = new PaymentJobRequest();
paymentJob.setJobRequestId(dto.getJobRequestId());
paymentJob.setPayment(oPayment.get());
paymentJob.setJobRequest(oJobRequest.get());
paymentJob.setDateCreated(now);

paymentJobService.save(paymentJob);

createVoucherPayment(paymentJob); // GERA O COMPROVANTE DE PAGAMENTO

modelAndView.addObject("mensagem", "Pagamento processado com sucesso!");

return modelAndView;
}

public String createVoucherPayment(PaymentJobRequest paymentJob) throws IOException, TranscoderException, ConfigurationException, TransformerException, WriterException, TransformerException {
/*Busca o job request - cliente*/
Optional<JobRequest> oJobRequest = jobRequestService.findById(paymentJob.getJobRequestId());

/*Traz o profissional*/
Optional<JobContracted> oJobContracted = jobContractedService.findByJobRequest(oJobRequest.get());

/*Traz o servico*/
Optional<Expertise> oExpertise = expertiseService.findById(oJobRequest.get().getExpertise().getId());

PaymentVoucher paymentVoucher = new PaymentVoucher();
paymentVoucher.setClient(oJobRequest.get().getUser());
paymentVoucher.setProfessional(oJobContracted.get().getUser());
paymentVoucher.setCode(gerarCodigoAlfanumerico());
paymentVoucher.setJobRequest(oJobRequest.get());

String emailProfissional = oJobContracted.get().getUser().getEmail();
String emailClient = oJobRequest.get().getUser().getEmail();

paymentVoucherService.save(paymentVoucher);
Date dataAtual = new Date();

// Converter LocalDate para Date
SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");

Calendar calendar = Calendar.getInstance();
calendar.setTime(dataAtual);

// Incrementando 15 dias
calendar.add(Calendar.DATE, 15);

// Obtendo a nova data após o incremento
Date dataFinal = calendar.getTime();
SimpleDateFormat sdfNovo = new SimpleDateFormat("dd/MM/yyyy");

String client_name = paymentVoucher.getClient().getName(); // NOME DO CLIENTE
String client_fone = paymentVoucher.getClient().getPhoneNumber(); // TELEFONE DO CLIENTE
String client_email = paymentVoucher.getClient().getEmail(); // EMAIL DO CLIENTE
String client_address_name = paymentVoucher.getClient().getAddress().getNeighborhood(); // ENDEREÇO DO CLIENTE
String client_address_number = paymentVoucher.getClient().getAddress().getNumber(); // NUMERO ENDEREÇO DO CLIENTE
String client_address = client_address_name + " - " + client_address_number; // ENDEREÇO DO CLIENTE

String profes_name = paymentVoucher.getProfessional().getName(); // NOME DO PROFISSIONAL
String profes_fone = paymentVoucher.getProfessional().getPhoneNumber(); // TELEFONE DO PROFISSIONAL
String profes_email = paymentVoucher.getProfessional().getEmail(); // EMAIL DO PROFISSIONAL
String profes_address_name = paymentVoucher.getProfessional().getAddress().getNeighborhood(); // ENDEREÇO DO PROFISSIONAL
String profes_address_number = paymentVoucher.getProfessional().getAddress().getNumber(); // NUMERO ENDEREÇO DO PROFISSIONAL
String profes_address = profes_address_name + " - " + profes_address_number; // ENDEREÇO DO PROFISSIONAL

String service_name = oJobRequest.get().getExpertise().getName();

Optional<ProfessionalServiceOffering> optionalProfessionalServiceOffering = professionalServiceOfferingService.findProfessionalServiceOfferingByExpertiseAAndUser(paymentVoucher.getProfessional().getId(), oJobRequest.get().getExpertise().getId());

String value_service = "0,00";
if (optionalProfessionalServiceOffering.isPresent()){
value_service = String.valueOf(optionalProfessionalServiceOffering.get().getPrice());
}

File pdfFile = paymentVoucherService.generateCertificate(svgCertificateTemplate, paymentVoucher.getCode(),service_name, sdfNovo.format(dataAtual), sdfNovo.format(dataFinal),
client_name, "111111111", client_fone, client_email, profes_name, "10444444440",
profes_email, profes_fone, profes_address, "PIX", value_service, "QRDCOD");
Map uploadResult = cloudinary.uploader().upload(pdfFile, ObjectUtils.asMap("folder", "certificates"));

String uploadURL = (String)uploadResult.get("url");

//envia um email com a URL do certificado
/*Envio de email para o profissional*/
quartzService.sendEmailPaymentVoucher(paymentVoucher.getCode(),
oJobRequest.get().getUser().getId(), oJobContracted.get().getUser().getId(), oExpertise.get().getName(), sdf.format(dataFinal), (String)uploadResult.get("url"));
pdfFile.delete();

// (url.openStream(), voucher, service,date, date_due,name_client,document_client,fone_client,mail_client,name_professional, document_professional,
// mail_professional, fone_professional, endereco_pro, payment_type, payment_value, qrCode);

return "redirect:/minha-conta/cliente#executados";
}

/* Gera código aleatorico e unico para gravação de comprovante */
private String gerarCodigoAlfanumerico() {
UUID uuid = UUID.randomUUID();
String codigo = uuid.toString().replace("-", "").substring(0, 10);
return codigo.toUpperCase();
}
}
Loading