Olá pessoal
No post anterior(veja aqui), configuramos nosso ambiente e criamos a listagem de fornecedores, vamos agora continuar com os próximos passos. Vamos agora criar a rotina para cadastrar um novo fornecedor, para isso vamos usar a mesma API mas o verbo agora será POST ao invés de GET. Vamos primeiro testar nossa API e consultar se nosso backend está funcionando corretamente (essa etapa é opcional), para isso vamos usar novamente o Postman.
Desta vez usaremos o verbo post a url apontando para nossa API e o Body da requisição será um arquivo do tipo JSON com os dados do fornecedor que queremos incluir, como no print abaixo.

{
"type": 2,
"code": "805539",
"storeId": "01",
"shortName": "FORN 1 ",
"name": "FORNECEDOR 99 " ,
"strategicCustomerType": "J",
"entityType":"J",
"address": {
"address": "RUA SEMPREJU ",
"state": {
"stateId": "SP",
"stateInternalId": "SP"
},
"city": {
"cityCode": "00204"
}
}
}
A resposta deverá ser um arquivo JSON com todos os dados no nosso fornecedor, se tudo ocorreu corretamente aqui, vamos começar a tratar nosso frontend para usar a mesma API.
Criando Formulário para Inclusão do Fornecedor
A Primeira etapa do FrontEnd será criar o módulo, o serviço e o componente que iremos trabalhar, vamos executar os seguintes comandos(um de cada vez):
ng generate module supplier-form
ng generate service supplier-form\supplier-form
ng generate component supplier-form
Após isso deverá ter sido criada em seu projeto uma estrutura parecida com a imagem abaixo.

Antes de iniciarmos a codificação do nosso service e compomente, vamos criar alguns models para refletir o formato da entidade na TOTVS(Entidade Fornecedor retornada pelo WS, criamos somente os campos que vamos usar aqui no WS o correto seria criar a entidade toda). Para isso criamos uma pasta em nosso projeto chama model, e dentro dela os arquivos abaixo:
supplierModel.ts
import { Address } from './addressModel';
export class Supplier {
companyInternalId: string;
code: string ;
name: string;
storeId: string ;
shortName: string;
strategicCustomerType: string;
registerSituation: string;
type: number;
entityType: string;
address: Address = new Address();
constructor(obj = {}) {
Object.assign(this, obj);
}
}
addressModel.ts
import { State } from './stateModel';
import { City } from './cityModel';
export class Address {
address: string ;
number: string ;
zipCode: string ;
complement: string ;
district: string ;
city: City = new City();
state: State = new State();
constructor(obj = {}) {
Object.assign(this, obj);
}
}
cityModel.ts
export class City {
cityCode: string ;
cityInternalId: string ;
cityDescription: string ;
constructor(obj = {}) {
Object.assign(this, obj);
}
}
stateModel.ts
export class State {
stateId: string ;
stateInternalId: string ;
stateDescription: string ;
constructor(obj = {}) {
Object.assign(this, obj);
}
}
O resultado final deverá ser uma para como o print abaixo:

Criaremos a seguir a rota para o nosso novo componente, para isso edite o arquivo app-routing.module.ts e adicione as informações do novo componente, abaixo o resultado deve ser semelhante ao fonte abaixo:
import { NgModule } from '@angular/core';
import { Routes, RouterModule } from '@angular/router';
import { SupplierListComponent } from './supplier-list/supplier-list.component';
import { SupplierFormComponent } from './supplier-form/supplier-form.component';
const routes: Routes = [
{ path: '', component: SupplierListComponent },
{ path: 'supplier', component: SupplierListComponent }, //lista de fornecedor
{ path: 'supplierform', component: SupplierFormComponent }, //form do fornecedor - inlcuir
];
@NgModule({
imports: [RouterModule.forRoot(routes)],
exports: [RouterModule]
})
export class AppRoutingModule { }
Agora só falta incluirmos nosso novo componente dentro do arquivo app.module.ts para podermos iniciar a codificação do formulário, o resultado final será semelhante ao código abaixo:
import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
import { AppRoutingModule } from './app-routing.module';
import { AppComponent } from './app.component';
import { PoModule } from '@po-ui/ng-components';
import { RouterModule } from '@angular/router';
import { PoNotificationModule } from '@po-ui/ng-components';
import { PoDynamicModule } from '@po-ui/ng-components';
import { PoButtonModule } from '@po-ui/ng-components';
import {PoTemplatesModule } from '@po-ui/ng-templates';
//incluir o componente para lista de fornecedores
import { SupplierListComponent } from './supplier-list/supplier-list.component';
import { SupplierFormComponent } from './supplier-form/supplier-form.component'; //formulario de inclusão/alteração
@NgModule({
declarations: [
AppComponent,SupplierListComponent,SupplierFormComponent
],
imports: [
PoNotificationModule,PoDynamicModule,PoButtonModule ,PoTemplatesModule,
BrowserModule,
AppRoutingModule,
PoModule,
RouterModule.forRoot([])
],
providers: [],
bootstrap: [AppComponent]
})
export class AppModule { }
No arquivo supplier-form.service.ts vamos criar o serviço responsável por enviar para nossa API os dados de um novo fornecedor para ser registrado, por agora esse aquivo é bem simples e somente realizar um post na API, abaixo o fonte que usamos(atenção para o endereço do seu backend):
import { HttpClient, HttpHeaders } from '@angular/common/http';
import { Injectable } from '@angular/core';
import { Supplier } from '../model/supplierModel';
@Injectable({
providedIn: 'root'
})
export class SupplierFormService {
//Endereço de nosso backend
ApiRest = 'http://localhost:8084/rest/api/crm/v1/customerVendor';
constructor(private http: HttpClient) { }
//Metódo para criar um novo Fornecedor
postNewSupplier(body: string) {
return this.http.post(this.ApiRest, body );
}
}
No arquivo supplier-form.component.ts vamos criar o nosso tratamento do formulário, vamos usar o componente do PO.UI chamado po-dynami-form que facilita bastante a criação de formulário, no nosso componente vamos definir as colunas do formulário através do array fields , o método getSupplierFromForm, será responsável de pegar as informações no form e incluir no modelo “Supplier” (json esperado pela nossa API), e o método insertSupplier, será o reponsavel de chamar nosso serviço de post na API e apresetar mensagem de sucesso (em caso de sucesso, vamos redirecionar o usuári para nossa lista de fornecedores) ou falha, o código final deverá ser semelhante ao fonte abaixo:
import { Component, OnInit } from '@angular/core';
import { ActivatedRoute, Router } from '@angular/router';
import { PoDynamicFormField, PoNotificationService } from '@po-ui/ng-components';
import { Supplier } from '../model/supplierModel';
import { SupplierFormService } from './supplier-form.service';
import { first } from 'rxjs/operators';
@Component({
selector: 'app-supplier-form',
templateUrl: './supplier-form.component.html',
styleUrls: ['./supplier-form.component.css']
})
export class SupplierFormComponent implements OnInit {
//fields: Array<PoDynamicFormField> = []; //campos "dinamicos" para usar no formulário
supplier: Supplier = new Supplier();//model de um fornecedor
supplierValues = { type: 2, code: "", storeId: "", shortName: "", name: "", strategicCustomerType: "J", entityType: "J",
number: "", address: "", zipCode: "", stateId: "", stateInternalId: "",
stateDescription: "", complement: "", district: "", cityCode: "", cityDescription: ""}; //array com os valores do fomulário
supplierType: string | any = '2'; //no nosso exemplo será sempre 2=fornecedor, mas poderia ser 1=cliente
supplierId: string | any;
title = 'Inclusão de Fornecedor';
constructor(private supplierFormService: SupplierFormService, //servico do form
private poNotification: PoNotificationService, //usar as notificações do PO.UI
private route: ActivatedRoute,
private router: Router,
) { }
ngOnInit(): void {
//define valores padrão para formulário
this.supplierValues = {
type: 2, code: "", storeId: "", shortName: "", name: "", strategicCustomerType: "J", entityType: "J",
number: "", address: "", zipCode: "", stateId: "", stateInternalId: "",
stateDescription: "", complement: "", district: "", cityCode: "", cityDescription: ""
}
}
//Método para inserir um novo fornecedor
insertSupplier(): void {
this.getSupplierFromForm();
this.supplierFormService.postNewSupplier(JSON.stringify(this.supplier)) //grava o novo fornecedor
.pipe(first())
.subscribe(() => {
this.poNotification.success('Fornecedor foi inserido com Sucesso');
this.router.navigate(['/supplier']); //redireciona para lista de fornecedor
}, err => {
//se error devolve o erro do Backend para o usuário
let messErr = JSON.parse(err.error.errorMessage);
this.poNotification.error(`Erro código ${messErr.code}, ${decodeURIComponent(escape(messErr.message))}, detalhe: ${decodeURIComponent(escape(messErr.detailedMessage))}.`)
}
); //exibe erro ao inserir fornecedor
}
//alimenta o modelo de dados
private getSupplierFromForm(): void {
// dados pessoais
this.supplier.code = this.supplierValues.code;
this.supplier.storeId = this.supplierValues.storeId;
this.supplier.name = this.supplierValues.name;
this.supplier.shortName = this.supplierValues.shortName;
this.supplier.strategicCustomerType = this.supplierValues.strategicCustomerType;
this.supplier.entityType = this.supplierValues.entityType;
this.supplier.type = this.supplierValues.type;
// sistemicos
// this.supplier.branchId = this.supplierValues.branchId;
// this.supplier.companyInternalId = this.supplierValues.companyInternalId;
// Endereço
this.supplier.address.address = this.supplierValues.address;
this.supplier.address.city.cityCode = this.supplierValues.cityCode;
this.supplier.address.city.cityDescription = this.supplierValues.cityCode;
this.supplier.address.city.cityInternalId = this.supplierValues.cityCode;
this.supplier.address.state.stateId = this.supplierValues.stateId;
this.supplier.address.state.stateInternalId = this.supplierValues.stateId;
}
//array para definir os nomes dos campos do formulário
fields: Array<PoDynamicFormField> = [
{
property: 'code',
label: 'Código',
divider: 'Dados Pessoais',
maxLength: 6
},
{
property: 'storeId',
label: 'Loja',
maxLength: 2
},
{
property: 'name',
label: 'Nome',
maxLength: 40
},
{
property: 'shortName',
label: 'Nome Reduzido',
maxLength: 20
},
{
property: 'strategicCustomerType',
label: 'Tipo do cliente',
options: [
{ label: 'Cons. Final', value: 'F' },
{ label: 'Produtor Rural', value: 'L' },
{ label: 'Revendedor', value: 'R' },
{ label: 'Solidario', value: 'S' },
{ label: 'Exportação', value: 'X' }
]
},
{
property: 'entityType',
label: 'Tipo da entidade',
options: [
{ label: 'Juridica', value: 'J' },
{ label: 'Fisica', value: 'F' }
]
},
{
property: 'registerSituation',
label: 'Situação',
options: [
{ label: 'Inativo', value: '1' },
{ label: 'Ativo', value: '2' }
]
},
{
property: 'type',
label: 'Tipo',
options: [
{ label: 'Cliente', value: 1 },
{ label: 'Fornecedor', value: 2 }
]
},
{
property: 'zipCode',
label: 'CEP',
divider: 'Endereço',
maxLength: 9
},
{
property: 'address',
label: 'Endereço'
},
{
property: 'cityCode',
label: 'Cidade',
options: [
{ label: 'Adolfo', value: '00204' },
{ label: 'São José do Rio Preto', value: '49805' },
{ label: 'José Bonifácio', value: '25706' },
{ label: 'Joinville', value: '09102' }
]
},
{
property: 'stateId',
label: 'Estado',
options: [
{ label: 'Santa Catarina', value: 'SC' },
{ label: 'São Paulo', value: 'SP' },
{ label: 'Rio de Janeiro', value: 'RJ' },
{ label: 'Minas Gerais', value: 'MG' }
]
},
/*{
property: 'branchId',
label: 'Filial',
divider: 'Sistemico'
},
{
property: 'companyInternalId',
label: 'Empresa'
}*/
]
}
Agora a ultima etapa é ajustar o html que irá exibir os dados do nosso formulário para o usuário, para isso, edite o arquivo supplier-form.component.html, e deixe com a seguinte informação:
<po-page-default [p-title]="title">
<po-dynamic-form #dynamicForm
[p-fields]="fields"
[p-value]="supplierValues">
</po-dynamic-form>
<div class="thf-row">
<po-button
class="thf-md-3"
*ngIf="!this.supplierId"
p-label="Inserir"
(p-click)="insertSupplier()">
</po-button>
</div>
</po-page-default>
Após todas essas etapas, ao acessar o endereço http://localhost:4200/supplierform, deve ser exibida o form permitindo a inclusão em nosso backend e exibindo os erros encontrados se existirem, o resultado final será semelhante ao print abaixo:

O código fonte desse e de outros exemplos podem ser encontrados em nosso git oficial.
Post interessantes:
Aprenda a instalar o Protheus no Windows aqui.
Aprenda a instalar o Protheus no Linux aqui.
configurar serviço rest aqui.
Retornar datas por extenso aqui.
Barras de progresso aqui.
Dúvidas e sugestões, entre em contato.
Obrigado e até a próxima!
0 comentário