Code Monkey home page Code Monkey logo

dfebr-net's Introduction

DFeBR.Net

O que é o DFeBR.Net?

É um framework para emissão e logística de documentos fiscais para a plataforma .NET. Simples, eficiente, extensível e robusto, conta com as melhores abordagens em termos de design patterns para garantir ao desenvolvedor segurança e confiabilidade no funcionamento.

A quem se destina?

Desenvolvedores da plataforma .NET que atuam na área de automação comercial, sendo compatível com .NET Framework 4.x e .NET Core, através do .NET Standard 2.

Tecnologias e evoluções

O novo DFeBR.Net é a baseado no antigo Zeus.DFe Framework, criado por uma nova equipe de desenvolvedores extremamente capacitados para entregar a melhor solução possível em termos de tecnologia e arquitetura de software. Dentre as várias evoluções feitas, a mais significativa é a total compatibilidade com .NET Core e .NET 4.x, alem de diversas mudanças internas que tornam o novo framework extremamente confiável para o desenvolvedor. Incluímos também um novo conceito para construção dos objetos de documentos fiscais. Como é sabido que a estrutura de uma NFe é extensa e complexa, trabalhamos duro para simplificar o máximo possível a implementação e os resultados foram incríveis.

Transição menos dolorosa entre as versões dos serviços

A arquitetura do novo projeto facilita a transição ou migração de versões do serviços. Sempre que for implementada uma versão mais nova dos documentos fiscais, basta alterar a chamada das classes de construção do documento. Ex.:

  new DetalheNFe40(...); //construtor do detalhe da NFe 4.0
  new DetalheNFe50(...); //construtor do detalhe da NFe 5.0

Exemplo simples de uso

Configuração do framework

A configuração do framework é feita através da classe "EmissorServicoConfig". Nos pontos onde se vê "..." são parâmetros de métodos.

   private EmissorServicoConfig GetConfig()
   {
      var config = new EmissorServicoConfig(...);
      config.ConfiguraEmitente(...);
      config.ConfiguraCertificadoA1Repositorio("serial do certificado");
      config.ConfiguraCSC("CscID", "CscToken");
      config.ConfiguraArquivoRetorno(true, @"C:\XML\");

      return config;
  }

Construindo os "pedaços" da nota fiscal

Cada seção da nota fiscal é constituida por classes distintas, específicas da versão do serviço, que simplifica a confecção da estrutura Ex.:

  private DetalheNFe40 GetDetalhe()
  {
      var detalhe = new DetalheNFe40(...); //dados basicos do produto
      detalhe.SetICMS20(...); //dados para o ICMS20
      detalhe.SetIPI(...); //dados para o IPI
      detalhe.SetPISOutr(...); //dados para PIS
      detalhe.SetII(...); //dados para II
      detalhe.SetCOFINSOutr(...); //dados para COFINS

      return detalhe;
  }

Emitindo sua primeira NFe

Segundo as dicas acima, você deve construir seus objetos para confecção da NFe e informá-los na classe "NFeBuilder", e por fim, submetê-la ao serviço de autorização

  private IServicoStrategy ObterServico()
  {
		return new ServNFe4(GetConfig());
  }

  public void EmitirNFeComBuilder()
  {
      NFeBuilder builder = new NFeBuilder(GetConfig());
      builder.SetIdentificacao(new IdentificacaoNFe40(...));
      builder.SetDestinatario(new DestinatarioNFe40(...));
      builder.AddDetalhe(GetDetalhe());
      builder.SetTotal(new TotalNFe40(.....));
      builder.SetTransporte(new TransporteNFe40());
      builder.SetCobranca(GetCobranca());
      builder.AddPagamento(GetPagamento());
      builder.SetResponsavel(new ResponsavelTecNFe40(....));

      var servNfe = ObterServico();
      IRetAutorz retorno = servNfe.Autorizar(builder.NFe);
  }

Caso prefira, você também pode manipular diretamente as classes originais que compõe a NFe e submetê-las ao serviço de autorização da mesma forma, porém a quantidade e complexidade do código vai ser consideravelmente maior.

Principais mantenedores

O novo projeto conta com uma equipe seleta de experientes desenvolvedores da plataforma .NET, pessoas com alta carga de conhecimento e extremamente capacitados para entregar a comunidade a melhor solução possível para facilitar o árduo trabalho de emissão de documentos fiscais.

A equipe está organizada por áreas de projeto, cujo elas são:

“Core-Framework” - Camada de mais baixo nível do projeto, responsável por de fato fazer todo o processo de transmissão de documentos e manipulação de XML’s

“Support-Layers” - Camada de mais alto nível do projeto, responsável por interagir direta/indiretamente com o desenvolvedor-usuário, afim de garantir que todas as informações que chegarem no “Core-Framework” estejam devidamente tratadas e válidas.

“Code Revisor” - Membros do projeto responsáveis pela revisão de código enviado pela comunidade a fim de contribuir com o projeto.

“Suporte Fiscal e Regras de Negócio” - Membros do projeto responsáveis por estar antenados as legislações fiscais e orquestrar a correta implementação das evoluções mais recentes estabelecidas pelas Sefaz’es.

Os membros são:

Eduardo Moreira “Core-Framework”

Henrique Felipe “Core-Framework”

Leo Vitor Sousa “Support-Layers”

Marco P. Viana “Suporte Fiscal e Regras de Negócio”

Paulo Cesar Filho “Code Revisor, Core-Framework, Support-Layers "

Ricardo I.T.S.A “Support-Layers”

Rodrigo Navas “Core-Framework”

Valnei Batista “Core-Framework”

Vigo Marcelo “Support-Layers, Core-Framework"

Marcos Vinícius “Support-Layers”

dfebr-net's People

Contributors

dfebr avatar dsbrbrasil avatar farukaf avatar laranjeiras avatar marcopoloviana avatar marcos8154 avatar paulinhoamc avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

dfebr-net's Issues

Troco na DANFE

Corrigir DANFE (campo de troco nao estava sendo exibido - ja corrigido)

Impressão em ESCPOS

Boa noite,

Estou concluindo este projeto: https://github.com/marcosgerene/Gerene.DFe.EscPos

Infelizmente o Zeus não me atende, então pretendo mudar o "motor" para NFe.

Preciso basicamente ler o xml e navegar entre os objetos.

Como fazer?

Código no Zeus:

public void Imprimir(string xmlcontent)
{
	_NFCe = new NotaFiscal().CarregarDeXmlString(xmlcontent);

	_Printer = new Printer(NomeImpressora, TipoImpressora);

	#region Cabeçalho

	#region Logotipo
	if (Logotipo != null)
	{
		//Impressão do logotipo ainda não implementada
	}
	#endregion

	#region Dados do Emitente
	_Printer.AlignCenter();
	_Printer.BoldMode(PrinterModeState.On);
	_Printer.Append(_NFCe.NFe.infNFe.emit.xFant.RemoverAcentos());

	_Printer.AlignLeft();
	_Printer.BoldMode(PrinterModeState.Off);
	_Printer.Append(_NFCe.NFe.infNFe.emit.xNome.RemoverAcentos());

	_Printer.CondensedMode(PrinterModeState.On);
	_Printer.Append(GereneHelpers.TextoEsquerda_Direita($"Cnpj: {_NFCe.NFe.infNFe.emit.CNPJ.FormatoCpfCnpj()}", $"I.E.: {_NFCe.NFe.infNFe.emit.IE}", _Printer.ColsCondensed));

	_Printer.AppendWithoutLf("End.: ");
	_Printer.Append($"{_NFCe.NFe.infNFe.emit.enderEmit.xLgr.RemoverAcentos()},{_NFCe.NFe.infNFe.emit.enderEmit.nro.RemoverAcentos()} {_NFCe.NFe.infNFe.emit.enderEmit.xCpl.RemoverAcentos()}");

	_Printer.AppendWithoutLf("Bairro: ");
	_Printer.Append($"{_NFCe.NFe.infNFe.emit.enderEmit.xBairro.RemoverAcentos()} - {_NFCe.NFe.infNFe.emit.enderEmit.xMun.RemoverAcentos()} - {_NFCe.NFe.infNFe.emit.enderEmit.CEP.FormatoCep()}");

	_Printer.CondensedMode(PrinterModeState.Off);
	_Printer.Separator();
	#endregion

	#region DANFE e Via
	_Printer.AlignLeft();
	_Printer.CondensedMode(PrinterModeState.On);
	_Printer.BoldMode("DANFE NFC-e - Documento Auxiliar da Nota Fiscal de Consumidor Eletronica");
	_Printer.Append(NomeDaVia);
	_Printer.CondensedMode(PrinterModeState.Off);
	_Printer.NewLine();
	#endregion

	#region Homologação
	if (_NFCe.NFe.infNFe.ide.tpAmb == TipoAmbiente.Homologacao)
	{
		_Printer.Separator();
		_Printer.AlignCenter();
		_Printer.BoldMode(PrinterModeState.On);
		_Printer.Append("AMBIENTE DE HOMOLOGACAO - SEM VALOR FISCAL");
		_Printer.BoldMode(PrinterModeState.Off);
		_Printer.Separator();
	}
	#endregion

	#region Documento Cancelado
	if (DocumentoCancelado)
	{
		_Printer.Separator();
		_Printer.AlignCenter();
		_Printer.BoldMode(PrinterModeState.On);
		_Printer.Append("***DOCUMENTO CANCELADO ***");
		_Printer.BoldMode(PrinterModeState.Off);
		_Printer.Separator();
	}
	#endregion

	_Printer.Separator();
	#endregion

	#region Detalhes
	_Printer.AlignCenter();
	_Printer.BoldMode("#|COD|DESC|QTD|UN|VL UN|DESC|VL ITEM");
	_Printer.Separator();

	#region Produtos
	_Printer.AlignLeft();
	_Printer.CondensedMode(PrinterModeState.On);
	foreach (var det in _NFCe.NFe.infNFe.det)
	{
		string textoE = string.Empty;

		string codProd = det.prod.cProd;
		if (UsarBarrasComoCodigo)
			codProd = $"{(UsarBarrasComoCodigo && det.prod.cEAN.IsNotNull() ? det.prod.cEAN : det.prod.cProd).PadRight(13)}";

		if (ProdutoDuasLinhas)
			textoE = $"{ det.nItem:D3} | {codProd}";
		else
			textoE = $"{ det.nItem:D3} | {codProd} {det.prod.xProd}";

		string textoR = $"{det.prod.qCom:N3} {det.prod.uCom} x {det.prod.vUnCom:N2} = {det.prod.vProd:N2}";

		_Printer.Append(GereneHelpers.TextoEsquerda_Direita(textoE, textoR, _Printer.ColsCondensed));

		if (ProdutoDuasLinhas)
			_Printer.Append(det.prod.xProd);

		if (det.prod.vOutro.HasValue && det.prod.vOutro.Value > 0)
			_Printer.Append(GereneHelpers.TextoEsquerda_Direita("Acrescimos:", det.prod.vOutro.Value.ToString("C2", _Cultura), _Printer.ColsCondensed));

		if (det.prod.vDesc.HasValue && det.prod.vDesc.Value > 0)
			_Printer.Append(GereneHelpers.TextoEsquerda_Direita("Descontos:", det.prod.vDesc.Value.ToString("C2", _Cultura), _Printer.ColsCondensed));
	}
	_Printer.CondensedMode(PrinterModeState.Off);
	_Printer.Separator();

	#region Totais
	_Printer.BoldMode(PrinterModeState.On);
	_Printer.CondensedMode(PrinterModeState.On);

	_Printer.Append(GereneHelpers.TextoEsquerda_Direita("Subtotal:", _NFCe.NFe.infNFe.total.ICMSTot.vProd.ToString("C2", _Cultura), _Printer.ColsCondensed));

	if (_NFCe.NFe.infNFe.total.ICMSTot.vOutro > 0)
		_Printer.Append(GereneHelpers.TextoEsquerda_Direita("Acrescimos:", _NFCe.NFe.infNFe.total.ICMSTot.vOutro.ToString("C2", _Cultura), _Printer.ColsCondensed));

	if (_NFCe.NFe.infNFe.total.ICMSTot.vDesc > 0)
		_Printer.Append(GereneHelpers.TextoEsquerda_Direita("Descontos:", _NFCe.NFe.infNFe.total.ICMSTot.vDesc.ToString("C2", _Cultura), _Printer.ColsCondensed));

	if (_NFCe.NFe.infNFe.total.ICMSTot.vFrete > 0)
		_Printer.Append(GereneHelpers.TextoEsquerda_Direita("Frete:", _NFCe.NFe.infNFe.total.ICMSTot.vFrete.ToString("C2", _Cultura), _Printer.ColsCondensed));

	if (_NFCe.NFe.infNFe.total.ICMSTot.vSeg > 0)
		_Printer.Append(GereneHelpers.TextoEsquerda_Direita("Seguro:", _NFCe.NFe.infNFe.total.ICMSTot.vSeg.ToString("C2", _Cultura), _Printer.ColsCondensed));

	if (_NFCe.NFe.infNFe.total.ICMSTot.vDesc > 0)
		_Printer.Append(GereneHelpers.TextoEsquerda_Direita("Descontos:", _NFCe.NFe.infNFe.total.ICMSTot.vDesc.ToString("C2", _Cultura), _Printer.ColsCondensed));


	_Printer.CondensedMode(PrinterModeState.Off);

	_Printer.BoldMode(GereneHelpers.TextoEsquerda_Direita("Valor TOTAL:", _NFCe.NFe.infNFe.total.ICMSTot.vNF.ToString("C2", _Cultura), _Printer.ColsNomal));

	_Printer.BoldMode(PrinterModeState.Off);
	#endregion
	#endregion

	_Printer.NewLine();
	#endregion

	#region Pagamentos
	_Printer.AlignLeft();

	foreach (var _pagto in _NFCe.NFe.infNFe.pag)
	{
		_Printer.CondensedMode(PrinterModeState.On);

		foreach (var _detpagto in _pagto.detPag)
			_Printer.Append(GereneHelpers.TextoEsquerda_Direita(_detpagto.tPag.Descricao(), _detpagto.vPag.ToString("C2", _Cultura), _Printer.ColsCondensed));

		_Printer.CondensedMode(PrinterModeState.Off);

		if (_pagto.vTroco.HasValue && _pagto.vTroco.Value > 0)
			_Printer.Append(GereneHelpers.TextoEsquerda_Direita("Troco:", _pagto.vTroco.Value.ToString("C2", _Cultura), _Printer.ColsNomal));
	}

	_Printer.NewLine();
	#endregion

	#region Rodape
	#region Dados da entrega            
	if (_NFCe.NFe.infNFe.entrega != null && !_NFCe.NFe.infNFe.entrega.xLgr.IsNull())
	{
		_Printer.AlignCenter();
		_Printer.BoldMode(PrinterModeState.On);
		_Printer.Append("DADOS PARA ENTREGA");

		_Printer.AlignLeft();
		_Printer.BoldMode(PrinterModeState.Off);
		_Printer.CondensedMode(PrinterModeState.On);
		_Printer.AppendWithoutLf("End.: ");
		_Printer.Append($"{_NFCe.NFe.infNFe.entrega.xLgr.RemoverAcentos()}, {_NFCe.NFe.infNFe.entrega.nro.RemoverAcentos()} {_NFCe.NFe.infNFe.entrega.xCpl.RemoverAcentos()}");
		_Printer.AppendWithoutLf("Bairro: ");
		_Printer.Append($"{_NFCe.NFe.infNFe.entrega.xBairro.RemoverAcentos()} - {_NFCe.NFe.infNFe.entrega.xMun.RemoverAcentos()}/{_NFCe.NFe.infNFe.entrega.UF}");
		_Printer.CondensedMode(PrinterModeState.Off);

		_Printer.Separator();
	}
	#endregion

	#region Observações do Fisco         
	if (_NFCe.NFe.infNFe.infAdic.obsFisco.Any() || _NFCe.NFe.infNFe.infAdic.infAdFisco.IsNotNull())
	{
		_Printer.AlignLeft();
		_Printer.CondensedMode(PrinterModeState.On);
		_Printer.BoldMode("Observacoes do Fisco");

		foreach (var fisco in _NFCe.NFe.infNFe.infAdic.obsFisco)
		{
			string texto = $"{fisco.xCampo} - {fisco.xTexto}";

			foreach (var txt in texto.Split(40))
				_Printer.Append(txt.RemoverAcentos());
		}

		if (_NFCe.NFe.infNFe.infAdic.infAdFisco.IsNotNull())
			_Printer.Append(_NFCe.NFe.infNFe.infAdic.infAdFisco.RemoverAcentos());

		_Printer.NewLine();

		_Printer.CondensedMode(PrinterModeState.Off);

	}
	#endregion

	#region Observações do Contribuinte          
	_Printer.AlignLeft();
	_Printer.CondensedMode(PrinterModeState.On);
	_Printer.BoldMode("Observacoes do Contribuinte");

	if (_NFCe.NFe.infNFe.infAdic.infCpl.IsNotNull())
		foreach (var txt in _NFCe.NFe.infNFe.infAdic.infCpl.Split(40))
			_Printer.Append(txt.RemoverAcentos());

	_Printer.NewLine();

	_Printer.CondensedMode(PrinterModeState.Off);

	#endregion

	#region Tributos
	_Printer.AlignLeft();
	_Printer.BoldMode(PrinterModeState.Off);
	_Printer.CondensedMode(PrinterModeState.On);

	_Printer.Append(GereneHelpers.TextoEsquerda_Direita("Valor aproximado dos Tributos deste Cupom", _NFCe.NFe.infNFe.total.ICMSTot.vTotTrib.ToString("C2", _Cultura), _Printer.ColsCondensed));
	_Printer.Append("(Conforme Lei Fed. 12.741/2012)");

	_Printer.NewLine();

	_Printer.CondensedMode(PrinterModeState.Off);

	#endregion

	#region Número e série do documento
	_Printer.Separator(); 
	_Printer.AlignCenter();
	_Printer.BoldMode(PrinterModeState.On);
	_Printer.Append($"No.: {_NFCe.NFe.infNFe.ide.nNF:D9} Série: {_NFCe.NFe.infNFe.ide.serie:D3} Emissão: {_NFCe.NFe.infNFe.ide.dhEmi:@dd/MM/yyyy HH:mm:ss}");
	_Printer.BoldMode(PrinterModeState.Off);
	_Printer.Separator();
	#endregion

	#region Chave de Acesso
	_Printer.CondensedMode(PrinterModeState.On);

	_Printer.AlignCenter();

	_Printer.Append("Consulte pela chave de acesso em:");
	_Printer.Append(_NFCe.NFe.infNFeSupl.urlChave);

	_Printer.Append("Chave de Acesso");
	_Printer.BoldMode(Regex.Replace(_NFCe.NFe.infNFe.Id.OnlyNumber(), ".{4}", "$0 "));

	_Printer.NewLine();

	_Printer.CondensedMode(PrinterModeState.Off);
	#endregion

	#region Consumidor
	_Printer.Separator();
	if (_NFCe.NFe.infNFe.dest != null)
	{
		_Printer.AlignLeft();
		_Printer.CondensedMode(PrinterModeState.On);
		_Printer.AppendWithoutLf("CPF/CNPJ do Consumidor: ");
		_Printer.Append(_NFCe.NFe.infNFe.dest?.CPF.IsNotNull() == true ? _NFCe.NFe.infNFe.dest.CPF.FormatoCpfCnpj() :
						_NFCe.NFe.infNFe.dest?.CNPJ.IsNotNull() == true ? _NFCe.NFe.infNFe.dest.CNPJ.FormatoCpfCnpj() :
						"000.000.000-00");
		_Printer.AppendWithoutLf("Razao Social/Nome: ");
		_Printer.Append(_NFCe.NFe.infNFe.dest?.xNome ?? "CONSUMIDOR");
		_Printer.CondensedMode(PrinterModeState.Off);
	}
	else
	{
		_Printer.AlignLeft();
		_Printer.CondensedMode(PrinterModeState.On);
		_Printer.BoldMode("CONSUMIDOR NÃO IDENTIFICADO");
		_Printer.CondensedMode(PrinterModeState.Off);

	}
	_Printer.Separator();
	#endregion

	#region QrCode
	if (_NFCe.NFe.infNFeSupl != null && _NFCe.NFe.infNFeSupl.qrCode.IsNotNull())
	{
		_Printer.AlignCenter();
		_Printer.CondensedMode(PrinterModeState.On);
		_Printer.BoldMode("Consulta via leitor de QR Code");
		_Printer.CondensedMode(PrinterModeState.Off);

		_Printer.AlignCenter();
		_Printer.QrCode(_NFCe.NFe.infNFeSupl.qrCode, QrCodeSize.Size1);

		_Printer.NewLine();
	}
	#endregion

	_Printer.AlignCenter();
	_Printer.CondensedMode(PrinterModeState.On);

	_Printer.Append("Protocolo de autorização");
	_Printer.Append($"{_NFCe.protNFe.infProt.nProt} {_NFCe.protNFe.infProt.dhRecbto:@dd/MM/yyyy HH:mm:ss}");

	_Printer.CondensedMode(PrinterModeState.Off);
	#endregion

	if (CortarPapel)
		_Printer.PartialPaperCut();

	_Printer.PrintDocument();
}

Escopo e Tarefas

  • Especificar tarefas e escopo
  • Logotipo Projeto

  • Módulo Builder

    • NFe - Nota Fiscal Eletrônica

      • Montagem XML
      • Transmissão XML
        • Normal
        • Compactada
        • Contingência
        • Assíncrona
        • Síncrona
      • Retorno
      • Consultas
        • Por Chave de acesso
        • Status do Serviço
      • Inutilização
      • Cancelamento
      • Endereçadores Sefaz
    • NFCe - Nota Fiscal Consumidor Eletrônica

      • Montagem XML
      • Transmissão XML
        • Normal
        • Compactada
        • OFF-Line
        • Assíncrona
        • Síncrona
      • Retorno
      • Consultas
        • Por Chave de acesso
        • Status do Serviço
      • Inutilização
      • Cancelamento
      • Endereçadores Sefaz
    • CTe - Conhecimento Transporte Eletrônico

    • MDFe -

    • SAT -

    • MFe -

  • Módulo Danfe

    • NFe
      • FastReport
      • ReportViewer
      • HTML
      • PDF
    • NFCe
      • FastReport
      • ReportViewer
      • HTML
      • PDF
  • Módulo Serviços

    • Leitura Certificados
    • Assinatura Documentos
    • QrCode

Exceptions

Permitir que ao levantar um excpetion as informação de envio sejam incorporadas na mensagem de exeption

Alteração do construtor da DANFE

Alteração do construtor da DANFE ( possibilitar a passagem do XML (NFE) por parametro para que o metodo se encarregue de obter as propriedades da xml para compor os dados da DANFE)

Interface para reports

Criar interface que possibilite o usuario de usar qualquer programa de report anexo como extensão do emissor (observer pattern)

Atualizar Readme

Alterar o arquiivo Readme para recomendar o uso de interface ao inves de instancia o objeto em várias partes do programa.

String de XmlEnviado difere do XmlEnviado

No método RetornoProcessamento da classe ServAutorzTemplate, ao gerar o XmlEnviado está atribuindo valores diferentes do Xml que realmente foi enviado.

Atual:
var xmlEnviado = Utils.ObterStringXML(enviNFe.NFe);

Como eu acho que deveria estar:
var xmlEnviado = Utils.ObterStringXML(enviNFe);

Protocolo de segurança

Possibilitar a parametrizaçao do tipo de protocolo de segurança,( ou default do S.O ou customizado)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.