/// <summary>
        /// Obtem as definiões de exportação para o recibo verde, que indicam para que conta cada valor deve ir, etc..
        /// Porque para tipos de documento (fatura-recibo, etc.) e tipos de recibo (Pagamento, Adiantamento, etc.) são diferentes
        /// </summary>
        /// <param name="reciboVerde"></param>
        /// <returns></returns>
        private static DefinicoesExportTipoReciboVerde ObterDefinicoesExportacaoRecibo(ReciboVerde reciboVerde)
        {
            //Seleciona se usa as definicoes de Prestador ou Adquirente
            DefinicoesExportacao definicoesExportacaoTipo;

            if (reciboVerde.tipo == TipoReciboVerdePrestOUAdquir.Prestador)
            {
                definicoesExportacaoTipo = Definicoes.definicoesExportacaoPrestador;
            }
            else
            {
                definicoesExportacaoTipo = Definicoes.definicoesExportacaoAdquirente;
            }

            //Obtem para que conta cada valor deve ir, etc.
            //Seleciona consoante o tipo de documento (fatura-recibo, etc.)
            DefinicoesExportTipoDoc defExportFaturaRecibo;

            switch (reciboVerde.tipoDoc)
            {
            case "Fatura-Recibo":
                defExportFaturaRecibo = definicoesExportacaoTipo.defExportFaturaRecibo;
                break;

            case "Fatura":
                defExportFaturaRecibo = definicoesExportacaoTipo.defExportFatura;
                break;

            case "Recibo":
                defExportFaturaRecibo = definicoesExportacaoTipo.defExportRecibo;
                break;

            default:
                throw new Exception(String.Format("Não está previsto o tipo documento {0}", reciboVerde.tipoDoc));
            }

            //Seleciona consoante o tipo de Recibo Verde (Pagamento, Adiantamento, etc.)
            DefinicoesExportTipoReciboVerde definicoesExportTipoReciboVerde = new DefinicoesExportTipoReciboVerde();

            switch (reciboVerde.tipoReciboVerde)
            {
            case TipoReciboVerde.Pagamento:
                definicoesExportTipoReciboVerde = defExportFaturaRecibo.defExportTipoPagamento;
                break;

            case TipoReciboVerde.Adiantamento:
                definicoesExportTipoReciboVerde = defExportFaturaRecibo.defExportTipoAdiantamento;
                break;

            case TipoReciboVerde.AdiantamentoPagamento:
                definicoesExportTipoReciboVerde = defExportFaturaRecibo.defExportTipoAdiantamentoPagamento;
                break;
            }
            return(definicoesExportTipoReciboVerde);
        }
        /// <summary>
        /// Exporta o recibo, escrevendo várias linhas no ficheiro
        /// </summary>
        /// <param name="fileStream"></param>
        /// <param name="reciboVerde"></param>
        /// <returns></returns>
        private static bool WintouchExportarRecibo(StreamWriter fileStream, ReciboVerde reciboVerde)
        {
            //As definiões de exportação indicam para que conta cada valor deve ir, etc.. Porque para tipos de documento (fatura-recibo, etc.)
            // e tipos de recibo (Pagamento, Adiantamento, etc.) são diferentes
            DefinicoesExportTipoReciboVerde definicoesExportTipoReciboVerde = ObterDefinicoesExportacaoRecibo(reciboVerde);

            int numLinha = 1;

            //Exporta uma linha para cada valor (valor base, iva, etc.)

            //A conta para qual o valor base vai depende se o valor de IVA é 0 ou não
            if (reciboVerde.valores.valorIvaContinente > 0)
            {
                WintouchExportarLinha(fileStream, reciboVerde, definicoesExportTipoReciboVerde,
                                      reciboVerde.valores.valorBase, definicoesExportTipoReciboVerde.contaValBase, 'C', ref numLinha);
            }
            else
            {
                WintouchExportarLinha(fileStream, reciboVerde, definicoesExportTipoReciboVerde,
                                      reciboVerde.valores.valorBase, definicoesExportTipoReciboVerde.contaValBaseIsento, 'C', ref numLinha);
            }

            WintouchExportarLinha(fileStream, reciboVerde, definicoesExportTipoReciboVerde,
                                  reciboVerde.valores.valorIvaContinente, definicoesExportTipoReciboVerde.contaIVA, 'C', ref numLinha);

            WintouchExportarLinha(fileStream, reciboVerde, definicoesExportTipoReciboVerde,
                                  reciboVerde.valores.impostoSelo, definicoesExportTipoReciboVerde.contaSelo, 'C', ref numLinha);

            WintouchExportarLinha(fileStream, reciboVerde, definicoesExportTipoReciboVerde,
                                  reciboVerde.valores.irsSemRetencao, definicoesExportTipoReciboVerde.contaIRS, 'D', ref numLinha);

            WintouchExportarLinha(fileStream, reciboVerde, definicoesExportTipoReciboVerde,
                                  reciboVerde.valores.importanciaRecebida, definicoesExportTipoReciboVerde.contaValRecebida, 'D', ref numLinha);


            return(true);
        }
 public DefinicoesExportTipoDoc()
 {
     defExportTipoPagamento             = new DefinicoesExportTipoReciboVerde();
     defExportTipoAdiantamento          = new DefinicoesExportTipoReciboVerde();
     defExportTipoAdiantamentoPagamento = new DefinicoesExportTipoReciboVerde();
 }
        /// <summary>
        /// Escreve uma linha no ficheiro do wintouch, caso o valor não seja zero, na conta especificada
        /// Return: Devolve se escreveu alguma coisa ou não
        /// </summary>
        private static bool WintouchExportarLinha(StreamWriter fileStream, ReciboVerde reciboVerde, DefinicoesExportTipoReciboVerde definicoesExportTipoReciboVerde,
                                                  decimal valor, string codigoConta, char natureza, ref int numLinha)
        {
            if (valor == 0)
            {
                return(false); //Se o valor for 0 não escreve a linha
            }
            string codigoDiario    = definicoesExportTipoReciboVerde.diario;
            string codigoDocumento = definicoesExportTipoReciboVerde.tipoDoc;
            int    serie           = 1;

            string descricao = reciboVerde.descricao.Length > 50 ? reciboVerde.descricao.Substring(0, 50) : reciboVerde.descricao;

            int dia = reciboVerde.dataEmissao.Day;
            int mes = reciboVerde.dataEmissao.Month;

            string contibuinte;
            string nomeEntidade;

            if (reciboVerde.tipo == TipoReciboVerdePrestOUAdquir.Adquirente)
            {
                contibuinte  = reciboVerde.nifTransmitente;
                nomeEntidade = reciboVerde.nomeTrasmitente;
            }
            else
            {
                contibuinte  = reciboVerde.nifAdquirente;
                nomeEntidade = reciboVerde.nomeAdquirente;
            }
            nomeEntidade = nomeEntidade.Length > 50 ? nomeEntidade.Substring(0, 50) : nomeEntidade;

            int anulado = reciboVerde.anulado ? 1 : 0;

            string valorStr = String.Format("{0,18:F2}", valor).Replace(",", ".");
            //                            diario            serie             descric       nat  dia     mes      contrib       numLinha     nomeenti anulado
            string linha = String.Format("{0,10}{1,20}{2,20}{3,4}{4,10}{5,-20}{6,-50}{7,18}{8,1}{9,2:D2}{10,2:D2}{11,-20}F{12,20}{13,1}{14,5}{15,20}{16,-50}{17,1}",
                                         -1, codigoDiario, codigoDocumento,       //2
                                         serie, reciboVerde.numDoc, codigoConta,  //5
                                         descricao, valorStr, natureza, dia, mes, //10
                                         contibuinte, "", "C", numLinha, "",      //14
                                         nomeEntidade, anulado);

            fileStream.WriteLine(linha);
            numLinha++;
            return(true);
        }