Qual o problema aqui? E de novo, o padrão sempre vem para resolver um problema. O meu use case, que é responsável por gerar fatura, ele não deveria ter a responsabilidade de saber qual formato você quer. Ele resolve o problema e ele diz, olha, está aqui a solução, conversa para o que você quiser. Ah, eu quero em Excel, eu quero em PDF, eu quero em CSV, eu quero em JSON, eu quero em, sei lá, em qualquer outro tipo de formato. Então, não é papel dele. E aí entra um padrão, entra um padrão interessante, que é o tal do Presenter, que muita gente conhece lá do Model View Presenter, mas o padrão Presenter existe e ele é responsável por basicamente formatar e adequar um determinado conteúdo para as necessidades, um determinado conteúdo das necessidades, um determinado conjunto de dados das necessidades do cliente. Ora um front-end precisa de JSON, ora um cliente precisa de PDF, de Excel, e não deveria ser responsabilidade do use case fazer isso. Pelo contrário, ele deveria delegar. De novo, padrões tem a ver com responsabilidades. Então, quando a gente vem aqui para o Generating Vice, não é bem assim que vai funcionar. Então, a gente vai precisar das duas uma. Ou passar esses dados para fora e fazer fora, mas aí a gente carrega o tempo todo esse tipo de responsabilidade. Ou vir aqui e dizer, olha, o useCase, eu vou te entregar um tipo de presenter e você faz o que você quiser. O que é o presenter? De novo, aquela mesma ideia de polimorfismo. Todo presenter que eu usar, e geralmente esses presenters podem ser por useCase, não acho que seja muito genérico, ele vai fazer um present e esse present vai ser em cima de dados, de um output. No caso desse use case, pessoal, como a gente tem esse output, vou desfazer, lembra que eu falei que ia voltar o código, output, segura um pouquinho esse final aí, esse é seguro. E aí aqui a gente poderia dar um export, export output, e aqui nesse presenter eu vou dizer, import output from generate noise agora a saída não dá pra saber né, quem manda o formato que cada implementação do Presenter quiser apresentar. Vamos importar aqui. Não gostei dessa referência circular aí, vamos ver se vai prestar. Aqui, já não justifica mais fazer nenhum dos dois. Entende? O contato está para o lado. Então, return this presenter presents output. Esse output aí, na verdade aqui é array, né? Output array, pronto. E agora sim. Olha, eu vou ter aqui, cadê o presenter? Eu vou ter um JSON presenter, export the full class JSON presenter. Supondo que seja mais simples, tá? Implement. Presenter. E olha, isso aqui é só output. Então, volta o output. Não tem nada, digamos assim, a ao output. Não tem nada a se fazer. Aham, missing symbol... O que está reclamando aqui, gente? Ah, porque eu botei promise. Não, não tem promise não. Estou viajando aqui. Pode ser até que tenha, mas não é o caso. Beleza. Pode ser até que tenha, mas não é o caso. Beleza. Agora, todo mundo aqui acabou quebrando. Então, uma coisa que a gente pode sempre fazer para não se perder muito é o seguinte. Vou quebrar essas linhas para facilitar a visualização. E atribuir um tipo padrão. Se você não precisa de nada, é o JSON. Aí fica o padrão. Fechou? E agora vamos criar o outro. Que é o CSV Presenter Agora a gente vai usar esse código. Para cá. Então vamos fazer as linhas usar esse código para cá então vai fazer as linhas do CSV ele tem o output dentro do output eu vou dizer que eu tenho data para cada data eu sei pelo output tipado que é a mouth e que é date aqui fiz uma conversão ou outra aqui pessoal poderia ter aquela conversão que a gente estava falando ah, eu quero que saia o formato, aqui é o lugar para isso esse é o lugar perfeito para isso para dizer que eu só quero dia a dia mês a mês você para a responsabilidade é só daqui não há ninguém ninguém precisa se contaminar com isso aí por sua vez o invoice também, o genetic invoice, não sabe para quem ele está entregando o que o cliente quer e aí a gente vai vir aqui para o CSV e vai dizer tem o seguinte e a gente não impede que a gente faça isso. Eu vou sobrecarregar, generating voices igual a new generating voices, usando o repositor, então o control repos E aí, aqui eu vou dizer, ó. E o CSV. Como parte dos testes não usam, né? E eu só vou liberar esse cara aqui. Aí, Contra Repository. Let Contra Repository. Repository. Fechou. Fechou. CSV, CSV, ok. Porque o formato está diferente, né? Vamos lá. Ah, não, já tinha passado. Eu acho que eu já tinha feito. Engraçado, né? Por que o outro funcionou? Ah, porque esse formato eu fiz fora. Segura. Espera aí. Espera aí. Aqui que eu me refiro que não era para fazer. Está vendo? E isso aqui não faz sentido. Agora a gente pode considerar um dado mais cru, que é date. Se alguém quiser pegar horário, que pegue entende? então vamos agora reparar o restante dos testes agora eu vou quebrar os outros que daí ele vai dizer, ah, vai ter que ser tudo a gente pega aqui que daí ele vai dizer, ah, vai ter que ser tudo deixa eu pegar aqui to be, peraí date to equal e o date dois quebrados dois quebrados, 2 quebrados, vamos lá, agora esse aqui, Então faz a conta. É 3 em Z. Igual a outro. Então, opa, peraí. Faltou 2 equal. 2 equal Z 2, 1. Não, é 01 beleza? então olha de novo o pattern é responsabilidade responsabilidade de apresentação formatação de data não é responsabilidade do use case então ele simplesmente o que? gerou o output padrão dele que é responsabilidade dele, a partir dos dados que ele está obtendo, e está delegando para o presenter, o presenter que se vira em fazer, a partir desses dados. E aí, temos aí, então, mais um padrão, que é o presenter. Beleza?