public string esRNS(XPathNodeIterator taxGroupNode)
{
  if (taxGroupNode.MoveNext())
  {
    if (taxGroupNode.Current.Value=="RNS")
      return "Y";
    else
      return "N";
  }
  else
    return "X";
}

public string obtenirTipusDesglos(String docType,int OCRD_ResidenNum,String licTradNum, String U_B1SYS_INV_TYPE, String U_B1SYS_SPEC_REGIME)
{
  String resultat="F";
  if ((OCRD_ResidenNum>=2 | licTradNum.Substring(0,3)=="ESN") & U_B1SYS_INV_TYPE!="F2" & U_B1SYS_INV_TYPE!="F4")
    resultat="O";
  return resultat;
}

public string obtenirEntregaOServei(XPathNodeIterator DOC1AcctCode)
{
  string resultat="E";
  int g70=0;
  string valor="";
  if (DOC1AcctCode.MoveNext()) 
  {
    XPathNavigator navegador = DOC1AcctCode.Current;
    XPathNodeIterator iterador = navegador.Select("//DataSource/DOC1/AcctCode");
    while (iterador.MoveNext())
	{
	  valor=iterador.Current.Value;
	  if (valor.StartsWith("70"))
	    g70=g70+1;
	}
	if (g70==0)
	  resultat="S";
  }
  return resultat;
}

public decimal INTRXGetSumOfBaseSum(XPathNodeIterator taxGroupNode)
{
    string taxCode = "";
    decimal lbaseSum = 0;
    if (taxGroupNode.MoveNext())
    {
        nfi.NumberDecimalSeparator = ".";
        taxCode = taxGroupNode.Current.Value;
        XPathNavigator navi = taxGroupNode.Current;
        if (gMapOfTaxGroups.ContainsKey(taxCode) && gMapOfTaxGroups[taxCode] != true)
        {
            gMapOfTaxGroups[taxCode] = true; // mark our gMap as already computed

            // the sum for given tax code was not yet computed
            XPathNodeIterator node = navi.Select(String.Format("//DataSource/TAX1/TaxCode[text()='{0}']/..", taxCode));
            while (node.MoveNext())
            {
                lbaseSum += decimal.Parse(node.Current.SelectSingleNode("BaseSum").Value, nfi);
            }
        }
        
        XPathNavigator navegador = taxGroupNode.Current;
        XPathNodeIterator iterador = navegador.Select("//DataSource/DOC9/Posted[text()='N']/..");
        decimal lsantiSum=0; 
        while (iterador.MoveNext())
	 {
          lsantiSum=lsantiSum+decimal.Parse(iterador.Current.SelectSingleNode("DrawnSum").Value, nfi);
	 }
        lbaseSum=lbaseSum+lsantiSum;
    }

    if (gIsCancelFlow)
    {
        lbaseSum *= -1;
    }
    return lbaseSum;
}

public decimal INTRXGetSumOfVatSum(XPathNodeIterator taxGroupNode)
{
    string taxCode = "";
    decimal lvatSum = 0;
    if (taxGroupNode.MoveNext())
    {
        taxCode = taxGroupNode.Current.Value;
        XPathNavigator navi = taxGroupNode.Current;

        XPathNodeIterator node = navi.Select(String.Format("//DataSource/TAX1/TaxCode[text()='{0}']/..", taxCode));
        while (node.MoveNext())
        {
            lvatSum += decimal.Parse(node.Current.SelectSingleNode("VatSum").Value, nfi);
        }

        XPathNavigator navegador = taxGroupNode.Current;
        XPathNodeIterator iterador = navegador.Select("//DataSource/DOC9/Posted[text()='N']/..");
        decimal lsantivatSum=0; 
        while (iterador.MoveNext())
	 {
          lsantivatSum=lsantivatSum+decimal.Parse(iterador.Current.SelectSingleNode("Vat").Value, nfi);
	 }

        lvatSum=lvatSum+lsantivatSum;
    }

    if (gIsCancelFlow)
    {
        lvatSum *= -1;
    }
    return lvatSum;
}

public string numeroDocument(string objecte, string nomSerie, string docNum)
{
  string resultat;
  if (nomSerie.Length>0)
  {
    if (objecte.Equals("13"))
      resultat=nomSerie+"/"+docNum;
    else
      resultat=nomSerie+"_"+docNum;
  }
  else
    resultat=docNum;
  return resultat;
}

public decimal INTRXGetSumLineTotal(XPathNodeIterator taxGroupNode)
{
    string taxCode = "";
    decimal lbaseSum = 0;
    if (taxGroupNode.MoveNext())
    {
        nfi.NumberDecimalSeparator = ".";
        taxCode = taxGroupNode.Current.Value;        
        XPathNavigator navegador = taxGroupNode.Current;
        XPathNodeIterator iterador = navegador.Select("//DataSource/DOC1");
        while (iterador.MoveNext())
	 {
          lbaseSum=lbaseSum
		+decimal.Parse(iterador.Current.SelectSingleNode("LineTotal").Value, nfi)
		+decimal.Parse(iterador.Current.SelectSingleNode("LineVat").Value, nfi);
	    lbaseSum+=decimal.Parse(iterador.Current.SelectSingleNode("EquVatSum").Value, nfi);
	 }
        iterador = navegador.Select("//DataSource/DOC3");
        while (iterador.MoveNext())
	 {
          lbaseSum=lbaseSum
		+decimal.Parse(iterador.Current.SelectSingleNode("LineTotal").Value, nfi)
		+decimal.Parse(iterador.Current.SelectSingleNode("LineVat").Value, nfi);
	    lbaseSum+=decimal.Parse(iterador.Current.SelectSingleNode("EquVatSum").Value, nfi);
	 }
    }

    if (gIsCancelFlow)
    {
        lbaseSum *= -1;
    }

    return lbaseSum;
}

public string obtenirConcepte(XPathNodeIterator DOC1AcctCode)
{
  string resultat="";
  int g70=0;
  string valor="";
  if (DOC1AcctCode.MoveNext()) 
  {
    XPathNavigator navegador = DOC1AcctCode.Current;
    XPathNodeIterator iterador = navegador.Select("//DataSource/DOC1/AcctCode");
    while (iterador.MoveNext())
    {
      valor=iterador.Current.Value;
      if (valor.StartsWith("70"))
        g70=g70+1;
    }
    if (g70>0)
      resultat="Venta de mercancias";
    else
      resultat="Prestación de servicios";	
  }
  return resultat;
}

// Obtenir la naturalessa de la transacció (E=Entrega de bens S=Prestació de serveis)
public string obtenirNaturaTransaccio(XPathNodeIterator DOC1AcctCode)
{
  string resultat="E";
  int g70=0;
  string valor="";
  if (DOC1AcctCode.MoveNext()) 
  {
    XPathNavigator navegador = DOC1AcctCode.Current;
    XPathNodeIterator iterador = navegador.Select("//DataSource/DOC1/AcctCode");
    while (iterador.MoveNext())
	{
	  valor=iterador.Current.Value;
	  if (valor.StartsWith("70"))
	    g70=g70+1;
	}
	if (g70==0)
	  resultat="S";
  }
  return resultat;
}

// Obtenir el tipus de desglos (O=Operacio F=Factura)
// Obligatoriament seran amb desglos les factures a clients extrangers o que tinguin un NIF que comenci amb N
// i que no suguin factures simplificades o assentaments resum (F2 o F4)
public string obtenirTipusDesglos(String docType,int OCRD_ResidenNum,String licTradNum, String U_B1SYS_INV_TYPE)
{
  String resultat="F";
  if ((OCRD_ResidenNum>=2 | licTradNum.Substring(0,3)=="ESN") & U_B1SYS_INV_TYPE!="F2" & U_B1SYS_INV_TYPE!="F4")
    resultat="O";
  return resultat;
}