Codificando Magazine 11a edicao

 

Embed or link this publication

Popular Pages


p. 1



[close]

p. 2

sumário 04 gerando boletos bancários ii edição 11 número 11 ano 03 2009 editores alexandre tarifa diego nogare emerson facunte sergio gonçalves revisÃo fernanda sallai giaccomo sabino montagem formataÇÃo milton carvalhaes editoraÇÃo e diagramaÇÃo adriano almeida colaboradores caio azevedo danilo marion munhóz diego nogare fabiano belmonte juliano schimiguel milton c filho ricardo quartier seiti yamashiro tiago tiguen sinzato continuação do artigo de como gerar boletos bancários usando o asp.net por seiti yamashiro 12 .net sap connector 2.0 aprenda como escrever nas tabelas do sap com o .net sap connector 2.0 por diego nogare 18 c 4.0 conheça as novas funcionalidades do c 4 por fabiano belmonte 23 tecnologia de jogos digitais introdução sobre tecnologias de jogos por tiago tiguen sinzato juliano schimiguel 28 introdução ao linq fale com editor É muito importante para a equipe saber a sua opinião sobre a revista caso tenha alguma critica sugestão ou elogio entre em contato caso tenha interesse em publicar um artigo na revista envie o título e um resumo do tema em formato word site@codificandomagazine.net conheça melhor essa nova tecnologia de manipulação de dados por milton c.filho 30 reporting services 2005 conheça esta poderosa plataforma de relatórios por caio azevedo 34 servidor no contexto de rede aprenda alguns conceitos de rede produzido por por danilo marion munhóz juliano schimiguel www.codificando.net 42 report sharp shooter como escolher o gerador de relatórios por ricardo quartier 03 editorial 48 .close

[close]

p. 3

edição 11 número 11 ano 03 2009 editorial pessoal como de costume estamos nos esforçando para montar a revista com artigos técnicos de alta qualidade e adequados às novidades/necessidades que surgem a cada dia no nosso universo nesta edição a 11ª publicada gratuitamente pelo grupo codificando .net aborda artigos sobre linq sql server sap asp .net entre outras tecnologias que são muito importantes hoje no mercado nacional os autores são grandes conhecedores dos assuntos abordados e conseguem passar de forma simples e direta os temas propostos um ponto super importante que começamos a plantar a algum tempo e que agora está dando ótimos frutos é a idéia de que os próprios membros da comunidade criem os materiais isso é tão bom pra todo mundo que cada vez mais membros ativos estão realizando atividades e conquistando seus espaços em meio às comunidades no brasil como sempre fiz em todas as edições deixo aqui o espaço aberto para que vocês possam nos enviar materiais produzidos por vocês que teremos o maior prazer em publicá-los muito obrigado pela confiança grande abraço diego nogare site@codificandomagazine.net editorial

[close]

p. 4

e-magazine gerando boletos bancários parte ii continuação do artigo de como gerar boletos bancários usando o asp.net por seiti yamashiro na parte i vimos como emitir um boleto para impressão o que falta é populá-lo com dados que façam sentido vamos então populá-lo com dados relevantes em primeiro lugar é necessário que você tenha os dados armazenados em algum lugar um banco de dados talvez mas vou presumir que seu código já trate dos dados e me ater à construção de duas partes fundamentais do boleto a linha digitável e o código de barras note que embora alguns dígitos da linha digitável sigam um padrão cada banco pode possuir regras próprias para gerá-la entre em contato com seu banco para ter essas informações linha digitável a linha digitável lembrando novamente que estou seguindo as instruções do itaú possui 47 dígitos abaixo segue a construção da linha lembrando que dac significa dígito de autoconferência ou simplesmente dígito verificador aaabc.ccddxddddd.defffyfgggg gghhhzkuuuuvvvvvvvvvv campo 1 10 dígitos campo 2 11 dígitos campo 3 11 dígitos 4 campo 5 14 dígitos campo 1 aaabc.ccddx · aaa código do banco ­ itaú 341 · b código da moeda ­ real 9 · ccc código da carteira de cobrança · dd dois primeiros dígitos do nosso número · x dac módulo 10 do campo 1 campo 2 ddddd.defffy · dddddd restante do nosso número · e dac do grupo agência/conta carteira/nosso número · fff três primeiros números da agência · y dac módulo 10 do campo 2 ago set 2009 codificando.net e-magazine www.codificando.net 4

[close]

p. 5

gerando boletos bancários e-magazine campo 3 fgggg.gghhhz · f último número da agência · gggggg conta corrente dac · hhh zeros · z dac módulo 10 do campo 3 campo 4 k · k dac módulo 11 do código de barras único dac que vai para o código de barras campo 5 uuuuvvvvvvvvvv · uuuu fator de vencimento · vvvvvvvvvv valor do boleto sem ponto e vírgula ou zeros no caso do valor ser preenchido pelo próprio sacado o fator de vencimento contém 4 dígitos e é o número de dias desde 7 de outubro de 1997 servindo para indicar a data de vencimento do boleto teremos o bug do milênio 21 de fevereiro de 2025 seu cálculo é bem simples como podemos ver pelo método abaixo os dac s o módulo 10 e o módulo 11 o cálculo do dac módulo 10 é realizado da seguinte forma tome o campo a ter calculado o dac multiplique cada algarismo do campo pela sequência de multiplicadores 2 1 2 1 2 1 posicionados da direita para a esquerda some os resultados que chamarei de n calcule o módulo 10 de n ­ mod10n ou n%10 o dac será 10 ­ mod10n caso o dac seja 10 considere-o como 0 segue abaixo um método para calcular o dac módulo 10 private int calculadacmod10 string campo int soma 0 int m caso exista um número par de algarismos inicia a mult por 1 if campo.length 2 0 m 1 else m 2 foreach char c in campo soma convert.toint32c m m 3 m regra aplicada x+y x y x+y y x int dac 10 soma 10 if dac 10 return 0 return dac codificando.net e-magazine private int fatorvencimento datetime date datetime zeroday new datetime1997 10 7 return date zeroday days dac analisando as regras anteriores temos que a maior parte do trabalho consiste-se em concatenar strings e calcular dacs para criar nossa linha digitável iremos dispor de dois algoritmos para calcular o cálculo do dac módulo 11 é bem semelhante.ele depois será utilizado para compor o dac do código de barras tendo o trecho a ter o dac calculado tome seus algarismos e multiplique-os iniciando-se da direita para a esquerda pela sequência numérica de 2 a 9 2 3 4 www.codificando.net ago set 2009 5

[close]

p. 6

gerando boletos bancários 5 6 7 8 9 2 3 4 e assim por diante some o resultado obtendo nosso n calcule agora o módulo 11 de n ­ mod11n ou n%11 o dac será 11 ­ mod11n caso o cálculo do dac tenha dado 0 10 ou 11 considere-o como 1 o método abaixo faz o cálculo do dac módulo 11 private int calculadacmod11 string campo int soma 0 int m 2 invertendo a string para facilitar o trabalho com os multiplicadores char arr campo.tochararray array.reversearr string reversed new string arr foreachchar c in reversed soma convert.toint32c m m m 1 9 2 m 1 int dac 11 soma 11 if dac 0 dac 10 dac 11 return 1 return dac e-magazine · treito é 0 os espaços também possuem significado por isso o intercalado este código de barras serve apenas para representar nossa linha digitável transformado o que é uma seqüência de números em uma imagem existem muitos controles por aí que fazem isto mas não encontrei nenhum gratuito para asp.net neste exemplo vou utilizar o arcodenet.net ele pode ser testado e é completamente funcional a diferença é que enquanto você não registrá-lo ele criará uma linha escrito barcodenet.net ou algo assim logo acima do código de barras embora a linha digitável possua 47 dígitos o número que será codificado em barras possui apenas 44 por quê porque devemos nos livrar de três dos quatro dacs que constam nela assim o código de barra terá apenas um dac outra diferença importante é de que a ordem em que os campos se apresentam na linha digitável não é a mesma da apresentada pelo código de barras segue como gerar então os dígitos que compõem o código de barras · · · · · · · · 3 dígitos do código do banco 341 1 dígito com o código da moeda 3 1 dígito do dac do código de barras 4 dígitos do fator de vencimento 10 dígitos do valor do título desconsiderando qualquer sinal de pontuação 3 dígitos da carteira 9 dígitos do nosso número mais seu próprio dac 4 dígitos da agência codificando.net e-magazine código de barras o padrão de código de barras para os boletos no brasil é o denominado 2 de 5 intercalado que pode ser resumido nas seguintes características · · codifica apenas caracteres numéricos 0-9 cada caractere é representado por 5 barras dentre os quais 2 são mais longas codificação binária ­ largo é 1 es · www.codificando.net ago set 2009 6

[close]

p. 7

gerando boletos bancários · · 6 dígitos da conta corrente com seu próprio dac 3 dígitos não utilizados e composto por zeros 000 e-magazine depois de gerar os dígitos que compõem o código de barras é questão de torná-lo em imagem utilizando o controle comentado anteriormente public byte codigobarras barcodenetweb barcode new barcodenetweb barcode.barcodetext digitoscodigobarrascomdac barcode.barcodetype barcode_type.int2of5 return barcode.getbarcodebitmap file_format.png código segue então a listagem do código fonte utilizado neste trabalho claro que há muito o que melhorar nele mas isto fica como exercício note que modifiquei a classe dados do post anterior public class linhadigitavel public int banco get private set public int moeda get {return 9 public string carteiracobranca get private set public string nossonumero get private set public string agencia get private set public string contacorrente get private set public datetime vencimento get private set public decimal valor get private set public linhadigitavel int banco,string carteira string nossonumero string agencia string contacorrente datetime vencimento decimal valor this.banco banco this.carteiracobranca carteira this.nossonumero nossonumero this.agencia agencia this.contacorrente contacorrente this.vencimento vencimento this.valor valor public linhadigitaveldados dados this.banco dados.banco this.carteiracobranca dados.carteira this.nossonumero dados.nossonumero this.agencia dados.agencia this.contacorrente dados.contacorrente this.vencimento dados.datavencimento this.valor dados.valordocumento public string formatoparaimpressao return campo1 substring0 5 campo1 substring5 campo2 substring0 5 campo2 substring5 campo3 substring0 5 campo3 substring5 campo4 campo5 public byte codigobarras barcodenetweb barcode new barcodenetweb barcode.barcodetext digitoscodigobarrascomdac barcode.barcodetype barcode_type.int2of5 return barcode.getbarcodebitmap file_format.png private string campo1 string campo this.banco.tostring 000 this.moeda.tostring 0 this.carteiracobranca.trim this.nossonumero.split [0 substring0 2 codificando.net e-magazine www.codificando.net ago set 2009 7

[close]

p. 8

gerando boletos bancários if campo.length 9 throw new exception entrada inválida return campo calculadacmod10 campo tostring 0 private string campo2 string campo this.nossonumero.split [0 substring2 6 this.dacagenciacontacarteiranoss numero tostring 0 this.agencia.substring0 3 if campo.length 10 throw new exception entrada inválida return campo calculadacmod10campo tostring 0 private string campo3 string campo this.agencia.substring3 1 this.contacorrente.split [0 this.contacorrente.split [1 sinto falta de explode implode 000 if campo.length 10 throw new exception entrada inválida return campo calculadacmod10campo tostring 0 private string campo4 return daccodigobarras tostring 0 private string campo5 return this.fatorvencimento tostring 0000 formatavalorthis.valor private string formatavalor decimal valor string value this.valor.tostring 00000000.00 system.globalization.cultureinfo.in variantculture split return value[0 value[1 e-magazine private int dacagenciacontacarteiranossnumero string termo this.agencia this.contacorrente.split 0 this.carteiracobranca this.nossonumero.split 0 if termo.length 20 throw new exception entrada inválida return calculadacmod10termo private int daccodigobarras return calculadacmod11 digitoscodigobarrassemdac private string digitoscodigobarrassemdac string termo this.banco.tostring 000 this.moeda.tostring 0 this.fatorvencimento tostring 0000 this.valor.tostring 0000000000 this.carteiracobranca this.nossonumero.split 0 this.nossonumero.split 1 this.agencia this.contacorrente.split 0 this.contacorrente.split [1 sinto falta de explode implode 000 return termo private string digitoscodigobarrascomdac string termo digitoscodigobarrassemdac return termo.substring0 4 daccodigobarras tostring 0 termo.substring4 private int fatorvencimento datetime zeroday new datetime1997 10 7 return this.vencimento zeroday days dac módulo 10 exemplo considerando-se a seguinte representação numérica do código de barras 34191.1012 34567.88005 71234.57000 6 16670000012345 temos codificando.net e-magazine www.codificando.net ago set 2009 8

[close]

p. 9

gerando boletos bancários a multiplicando a sequência dos campos pelo módulo 10 campo 1 341911012 campo 2 3456788005 campo 3 7123457000 x 212121212 x 1212121212 x 1212121212 observação os campos 4 e 5 não tem dac b some individualmente os algarismos dos resultados do produtos campo 1 6 4 2 9 2 1 0 1 4 29 campo 2 3 8 5 1 2 7 1 6 8 0 0 1 0 42 campo 3 7 2 2 6 4 1 0 7 0 0 0 29 c divida o total encontrado por 10 a fim de determinar o resto da divisão campo 1 29 10 2 resto 9 campo 2 42 10 4 resto 2 campo 3 29 10 2 resto 9 d calculando o dac campo 1 dac 10 9 dac 1 campo 2 dac 10 2 dac 8 campo 3 dac 10 9 dac 1 portanto a sequência correta da linha digitável será 34191.10121 34567.880058 71234.570001 6 16670000012345 private int calculadacmod10 string campo int soma 0 int m caso exista um número par de algarismos inicia a mult por 1 if campo.length 2 0 m 1 else m 2 foreach char c in campo soma convert.toint32c m m 3 m regra aplicada x+y x y x+y y x int dac 10 soma 10 if dac 10 return 0 return dac e-magazine considerando o seguinte conteúdo do código de barras 3419 1667000001234511012345678800571423 457000 onde 341 código do banco 9 código da moeda dac do código de barras 1667 fator de vencimento 01/05/2002 0000012345 valor do título 123,45 110123456788 carteira/nosso número/dac 110/12345678-8 0057123457 agência/conta corrente/dac 0057/12345-7 000 posições livres zeros temos a multiplica-se a sequência do código de barras pelo módulo 11 3419166700000123451101234567880057 123457000 x 4329876543298765432987654329876543 298765432 b soma-se o resultado dos produtos obtidos no item a acima 12 12 2 81 8 42 36 35 0 0 0 0 0 7 12 +15 16 15 2 9 0 7 12 15 16 15 12 63 64 56 0 0 20 21 2 18 24 28 30 35 0 0 0 742 c determina-se o resto da divisão 742 11 67 resto 5 d calcula-se o dac dac 11 ­ 5 então dac 6 portanto a sequência correta do código de barras será 3419616670000012345110123456788005 7123457000 dac private int calculadacmod11 string campo int soma 0 int m 2 invertendo a string para facilitar o trabalho com os multiplicadores char arr campo.tochararray array.reversearr codificando.net e-magazine www.codificando.net ago set 2009 9

[close]

p. 10

gerando boletos bancários string reversed new string arr foreachchar c in reversed soma convert.toint32c m m m 1 9 2 m 1 int dac 11 soma 11 if dac 0 dac 10 dac 11 return 1 return dac public class dados public datetime datadocumento get set public datetime datavencimento get set public datetime dataprocessamento get set public string cedente get set public string sacadoresumido get set public string sacadocompleto get set public int banco get set public string agencia get set public string contacorrente get set public string codigocedente get set public int numerodocumento get set public string especiedocumento get set public string aceite get set public string nossonumero get set public string carteira get set public string instrucoes get set public int quantidade get set public decimal valor get set public decimal valordocumento get set public string codigobaixa get set public byte codigobarra get linhadigitavel linha new linhadigitavelthis e-magazine return linha.codigobarras public string linhadigitavel get linhadigitavel linha new linhadigitavelthis return linha.formatoparaimpressao um exemplo de uso do gerador de boletos protected void btngeraboleto_onclickobject sender eventargs e boleto boleto new boleto portal.controles.boleto.banco.itau server list dados new list dados.add new portal.controles.boleto.dados aceite n agencia 1234 banco 341 carteira 109 cedente indústria acme codigobaixa 109/12345678-9 codigocedente 12345-6 contacorrente 12345-6 datadocumento datetime.now dataprocessamento datetime.now datavencimento new datetime 2009 4 5 especiedocumento dm instrucoes não receber após o vencimento nossonumero 12345678-9 numerodocumento 0000000012 quantidade 0 sacadocompleto padoca do zé ltda cnpj 12.345.678/0001-23 rua das casas 123 01234-123 vl do bairro sao paulo sp sacadoresumido padoca do zé ltda valor 0 valordocumento 2637.00m boleto.baixaresponse dados codificando.net e-magazine www.codificando.net ago set 2009 10

[close]

p. 11

gerando boletos bancários e-magazine embora existam outras opções como cartões de crédito e pagamento direto online o boleto ainda é utilizado devido à familiaridade e facilidade de pagamento por parte do comprador por isso temos de saber gerá-lo em nossos sistemas mesmo que utilizemos soluções prontas vimos que gerar um boleto na plataforma .net é algo simples composto por uma guia impressa alguma lógica para a geração da linha digitável e uma ferramenta de terceiros para a criação do código de barras a parte mais difícil fica no sistema subjacente não abordada onde entra o retorno do pagamento do boleto e finalmente na remessa da mercadoria mas isto fica para uma próxima seiti yamashiro graduando em ciência da computação desenvolvedor web em c asp.net com banco de dados ms sql server nas hora vagas costuma programar em php e implantar sistemas livres em linux além de alimentar um blog http seiti.eti.br codificando.net e-magazine www.codificando.net ago set 2009 11

[close]

p. 12

e-magazine escrevendo nas tabelas do sap com o .net sap connector 2.0 através de rfc aprenda como escrever nas tabelas do sap com o .net sap connector 2.0 por diego nogare no artigo anterior sobre sap lendo as tabelas do sap com .net sap connector 2.0 através de rfc que pode ser acessado na 10ª edição da revista codificando .net emagazine foi explicado sucintamente o que é o sap e quais são as atividades recursos envolvidos para conseguir utilizar rfcs para se trabalhar com o sap se sentir necessidade pode consultar o artigo anterior para esclarecer e alinhar as idéias neste artigo faremos o inverso do que foi feito anteriormente desta vez ao invés de ler informação do sap iremos escrever informação no sap para isso será desenvolvida uma aplicação windows forms em c que fará a escrita em uma rfc do sap com base em um datatable mas a origem da informação fica a seu critério vou partir diretamente para a aplicação entendendo que já esteja tudo configurado como explicado no artigo sobre ler tabelas do sap após a instalação do conector um novo ícone será adicionado nos templates que podem fazer parte do projeto figura 1 este novo item é o sap connector proxy este proxy receberá todos os itens das rfcs que serão conectadas através do .net e montará automaticamente as classes de acessos com suas respectivas properties métodos get e set entre outras coisas para utilizar este proxy será necessário adicionar um novo item ao projeto então vá até a solution explorer clique com o botão direito do mouse e aponte para add new item acompanhe este passo na figura 1 a tela de template dos itens a serem inseridos pode ser acompanhado na figura 2 codificando.net e-magazine figura 1 adicionando novo item ao projeto www.codificando.net ago set 2009 12

[close]

p. 13

escrevendo as tabelas do sap com o .net sap connector 2.0 e-magazine figura 2 adicionando o proxy ao projeto rer para se poder visualizar as rfcs que estão liberadas pra acesso vá até o server explorer procure o item do sap que foi inserido após a instalação do sap .net connector 2.0 expanda a árvore do sap e clique com o botão direito no item application servers então adicione os dados appserverhost client password systemnumber e username acompanhe este passo na figura 4 após a adição o item aparecerá no solution explorer neste exemplo foi adicionado na própria raiz do projeto mas ele pode ser adicionado dentro de alguma outra pasta para melhorar a organização como mostra a figura 3 figura 3 proxy na solution explorer figura 4 inserindo os dados de acesso no server explorer codificando.net e-magazine dê dois cliques no proxy adicionado e uma tela sem nenhum controle será aberta no painel principal do visual studio 2003 esta tela que se abriu servirá de container para as rfcs gerarem automaticamente os códigos das classes de acesso este processo será explicado com mais detalhes adiante agora para conseguir utilizar as rfcs que foram criadas pelos abaps lembra é necessário adicionar os dados do servidor do sap que serão fornecidos pelo pessoal de basis isso você também lembra né no server explo após este passo será possível expandir o application servers e visualizar o servidor que você adicionou terá o nome fornecido ao campo appserverhost ao expandir este item será necessário configurar o filtro das functions para aparecer as rfcs crie um novo filtro e coloque os dados para filtrar retorna todas que poderão ser utilizadas na aplicação acompanhe as rfcs fornecidas na figura 5 agora que as rfcs já estão listadas é só arrastar a rfc que será acessada para ago set 2009 www.codificando.net 13

[close]

p. 14

escrevendo as tabelas do sap com o .net sap connector 2.0 e-magazine figura 5 rfcs que poderão ser utilizadas dentro do proxy na tela que já deve estar aberta no painel principal do visual studio caso isso ainda não esteja feito dê dois cliques no item do proxy na solution explorer quando arrastar a rfc para cima do proxy os dados da classe desta rfc serão criados automaticamente permitindo o acesso à seus campos através de suas properties acompanhe na figura 6 o proxy com uma rfc já arrastada agora que a rfc foi arrastada para o figura 7 as classes criadas automaticamente pelo proxy está faltando pouco agora o mais complicado já passou vamos ao código do método acessarsap criado e chamado pelo método load do formulário acompanhe a listagem 1 onde os códigos deste método foram inseridos private void acessarsap escrevendosap proxy null try proxy new escrevendosap string de conexão proxy.connection.open codificando.net e-magazine figura 6 rfc arrastada para o proxy proxy as classes para acessar os dados do sap foram criados automaticamente dentro do proxy se for até a solution explorer e exibir os itens ocultos show all files expandindo o proxy é possível ver as classes criadas classes exibidas na figura 7 zcprheadrtable tabelasap new zcprheadrtable zcprheadr linha new zcprheadr datatable dt new datatable montarcolunasref dt foreach datarow dr in dt.rows linha.codca dr codigo tostring linha.locen dr nome tostring linha.numrg dr telefone tostring tabelasap.add linha proxy.bay2_n2rfi_rfc_upda_zcprh eadrref tabelasap proxy.commitwork www.codificando.net ago set 2009 14

[close]

p. 15

escrevendo as tabelas do sap com o .net sap connector 2.0 catch exception ex messagebox.showex.message finally proxy.connection.close proxy null e-magazine private void montarcolunasref datatable dt listagem 1 código para utilizar o proxy e as classes criadas proxy será criada uma variável do tipo tabela da rfc zcprheadrtable tabelasap new zcprheadrtable esta variável criada será passada por parâmetro de referência para o método com o nome da rfc proxy.bay2_n2rfi_rfc_upda_zcprheadr ref tabelasap que está dentro do proxy como o parâmetro foi por referência a variável criada passará a ter os dados lidos no datatable e que serão escritos no sap através da rfc este foreach é criado para percorrer todos os itens do datatable utilizado como exemplo e preencher a tabela do sap veja que em todas as iterações do foreach a variável linha do sap possui seus campos populados e a rfc de escrita no sap é chamada a figura 8 é do sap após receber o valor que inserimos dentro do datatable no método montarcolunas repare que os campos com marcação em vermelho apontam para os campos que foram preenchidos dentro do foreach no código da listagem 1 dt.columns.add codigo dt.columns.add nome dt.columns.add telefone datarow dr dt.newrow dr codigo 1 dr nome diego dr telefone 12345678 dt.rows.adddr a aplicação utilizará o proxy criado que listagem 2 código para criar um datatable e popular com dados ficticios foi chamado de escrevendosap para criar uma conexão com outro servidor sap não precisa ser necessariamente o mesmo utilizado no server explorer mas pode ser sem problema os itens que precisam ser inseridos na string de conexão podem ser encontrados abaixo na listagem 3 substitua estes itens em vermelho pelos dados fornecidos pelo pessoal de basis como foi feito no server explorer ashost=appserverhost sysnr=systemnumber client=client user=username passwd=password após a informação de conexão do listagem 3 dados da string de conexão codificando.net e-magazine figura 8 resultado da informação inserida no sap após esta análise simples e direta é possível fazer uma escrita em tabelas do sap www.codificando.net ago set 2009 15

[close]

Comments

no comments yet

YOUBLISHER
About
What Others Say
Sitemap
Impressum

PUBLISHERS
Login
Signup
Tutorials
FAQ
Support

BUSINESS
Overview
Advertising
Support

DEVELOPERS
API

LEGAL
Report a Copyright Violation
Copyright FAQ
Terms of Use
Privacy Policy