Eu vou programar todos esses cenários em inglês, então eu queria começar, como tudo, por meio de testes. E aí, o teste que eu vou criar aqui, ele vai ser em cima, e isso é interessante que a gente até comece a refletir, ele vai ser em cima de algo que eu chamo de use case. O que é o use case? O use case, quando a gente pensa em ports and adapters, quando a gente pensa em arquitetura hexagonal, é aquilo que eu exponho para um driver, seja para um teste, seja para uma API, seja para uma fila. Então, é exatamente pelo use case que eu vou começar, muito abordado também no próprio Clean Architecture. Então, beleza. Então, esse use case vai se chamar GenerateInvoices. Pest. TS. Eu estou usando TypeScript, então não estou pelo TS que eu estou usando TypeScript. Além disso, eu já deixei esse projeto com as dependências baixadas, até para agilizar um pouco. Essas são as dependências que eu estou usando ao longo da aula. Eu vou falando de cada uma delas, mas, em linhas gerais, é TypeScript com Express, Jest para testar, Axis para fazer requisições HTTP depois, PG Promise para acessar o banco, que é o Postgres, tá bom? Então, essa etapa de configuração é basicamente relacionada a instalar as dependências só que o que eu vou mostrar se aplica para qualquer linguagem então tá bom como tudo vamos começar com testes então deve gerar as notas fiscais estou usando aqui invoice como tradução de nota fiscal, algumas traduções você vai perceber que não são muito simples mas são traduções para que a gente consiga trazer o negócio geralmente em inglês, dando código à descrição do teste, a gente geralmente usa em português, mas isso é a critério de cada um. Então, o que eu vou fazer? Eu vou dizer, olha, GeneratingVoices igual a new, GeneratingVoices, então eu estou instanciando esse caso de uso eu estou instanciando porque eu estou usando uma linguagem orientada a objetos se eu estivesse usando uma linguagem funcional seria provavelmente diferente, então olha a decisão arquitetural que a gente tomou e aí, geralmente e isso você pode até encarar como um padrão eu gosto de atribuir um use case por classe. Eu acho que isso melhora a rastreabilidade desse use case, eu acho que isso deixa tudo mais claro para você manipular. E eu padronizo também que todo use case recebe um determinado input. Por enquanto, deixa quieto esse input. Todo use case retorna um output. Vou fazer um await aqui, porque provavelmente deve ter alguma operação relacionada com o banco de dados. E aí, vamos ver o que sai do outro lado. Por enquanto, eu só vou mostrar para você o que sai. Nem me dá o trabalho de criar uma condição. Brenas, te atrapalha muito se você der mais um zoom? Mais um? Deixa eu ver. De boa. De boa? Legal? Maravilha. Ótimo. Tá legal assim? Perfeito. Show de bola. Então, vamos lá. Vou criar aqui o meu generateInvoices.ts Vou dar uma classe. Vou criar aqui o meu generateInvoices.ts. Vou dar uma classe. Eu já tenho essa classe criada. Vou criar um método chamado execute. Beleza. E aí, esse método execute, ele vai voltar as notas fiscais que foram emitidas. Em que formato essas notas fiscais serão retornadas? Bom, aí a gente vai ver. A gente poderia voltar em CSV. Imagina que você vai emitir essas notas e mandar para a sua contabilidade. Você vai fazer alguma coisa com isso. Por ora, eu só vou botar um array vazio. Então, eu vou dizer que eu espero que esse output have length de 0. Só vou botar um async aqui e pro npx-gest rodando os testes. Passou os testes, está ok. Vamos lá. Como é que a gente vai começar a fazer isso aqui. Vou começar estruturando com vocês os dados. Porque eu vou tirar isso do banco para que a gente veja. Então, eu vou começar dropando um esquema e criando um esquema. Vou começar pelo modelo de dados. Esse esquema, pessoal ele vai ter três tabelas inicialmente mas duas são as mais relevantes para a gente que vai ser Create Table, Brands Contracts a tabela Contracts ela vai ser a tabela que vai ter o serviço que eu estou tomando lembra que eu vou emitir notas fiscais de serviço, não de produto então Contracts vai ser exatamente o contrato que eu vou emitir notas fiscais de serviço, não de produto. Então, contract vai ser exatamente o contrato que eu tenho, por exemplo, com uma faculdade, com uma empreiteira, com, sei lá, com algum profissional que eu estou contratando na minha empresa. E a outra tabela vai ser payment, já que eu falei que dependendo do regime, o pagamento importa, no regime de caixa o pagamento é importante. Muito bem, o que vamos ter aqui? idconfront, vamos usar um UUID que eu acho mais prático, notes null, e a gente vai usar uma funçãozinha chamada UUID generate, aí a gente vai usar v4, isso aqui é a primary key.. Aí a gente vai usar o V4. Isso aqui é a primary key. Além disso, a gente vai ter, então, a description. Vai ser text, ou seja, o que é o serviço que eu estou tomando. A month, que vai ser o preço desse serviço. Os periods. E esses periods são relevantes também, porque se eu estou cursando um semestre de faculdade, são seis períodos de prestação de serviço. Se eu estou contratando um empreiteiro que vai ficar três meses fazendo uma obra aqui em casa, são três meses também de prestação de serviço. Se eu estou, sei lá, alguns serviços são mensais, então o período... Se a escola de uma criança geralmente são 12 períodos, se a pós-graduação são 18 meses de aula, são 18 períodos e assim por diante, date a data de início quando que começou isso pagamento, mesma coisa eu até vou copiar essa primeira linha vou trazer pra cá vou chamar isso aqui de the payments e aqui eu vou relacionar com o ID Contract para assinar o pagamento para o ID Contract Reference, Branas Contract, ID Contracts. Todo pagamento, ele vai ter praticamente duas informações. Quanto, além do contrato, né? Que é numeric e date e timestamp. Ou seja, quando que foi pago. Fechou. É isso que eu preciso. Beleza? Claro que aqui no contrato a gente poderia ter as duas partes, né? De quem para quem, mas por enquanto isso não é tão... Não chega a ser tão relevante aqui para o nosso exemplo. Vou inserir, insert into, então vamos usar dados inseridos, depois a gente aprende a driblar isso. Brands Contracts, então aqui a gente vai ter o UUID inicial, vou ter a descrição, imagino que seja prestação de serviços escolares. A gente tem 12 meses. Quanto é que custaria uma escola? Quanto é que seria uma mensalidade escolar? Sei, R$ 500? R$ 1.000? Vou botar R$ 500. Então, R$ 6.000, 12 meses de prestação de serviço. Começando, lembra que a data a gente vai usar no padrão ISO 8601 8601 2022 0101 10 horas da manhã aqui seria o início da prestação do serviço no primeiro dia do ano não tem que ser exatamente nesse dia. O que mais? Vou botar agora o pagamento. Insert into payments. Aqui a gente tem, então, a chave do contrato, a chave do pagamento. O valor pago, R$6.000. Suponhamos que tenha sido pago à vista. Esse cenário de pagamento à vista é bom 2020 201 sei lá 05 0000 eu vou gerar dois euid aqui ó vou fazer com vocês tá ó fire crypto random uid pra dois pra um, o outro pro outro esse pra cá esse aqui e o outro aqui fechou, é isso vamos colocar aqui cascade, para já apagar tudo SQL df create está reclamando que, peraí, faltou o default aqui o default. Faltou agora os campos. Eu acho que se eu colocar values aqui ele pega na ordem. Então se eu entrar aqui no banco, como é que está? Select a series from, Branas, Contracts, está aí. Se eu posso sair aqui, fechou, está tudo ali. Então pessoal, o que vai acontecer? Vamos lá. Vamos juntos. Eu vou conectar nesse banco. Para isso eu vou importar biblioteca. Eu vou criar o contexto para daí a gente aplicar os padrões. É assim que funciona. Postgres. O usuário é Postgres. A senha é 26456. Em localhost 5432. Base de dados app, como vocês viram conectei vamos lá, então se eu estou gerando as notas fiscais da minha empresa, supondo que a minha empresa seja só esse banco de dados, não tem tenants, nada disso então eu vou fazer um await next query primeiro, quero todos os contratos vou fechando query, primeiro quero todos os contratos, vou fechando o mês, preciso de todos os contratos para mandar para minha contabilidade. Vou voltar para o teste para arrumar isso aí agora, só para vocês verem conectado, está bonitão, voltou os dados.