#!/usr/bin/env python
# -*- coding: UTF-8 -*-

# ficsql.py
# Ultimo cambio: Thu 31 Mar 2016 04:07:57 PM MST
# jorgericarte@asuni.com.mx	
# Sat Sep 08 16:41:19 MDT 2007  
# Ficnx - ficsql
# Funciones SQL 

# Para test de un sleep en 5401
import time

import logging

import psycopg2
#import psycopg
import ficdef
# import ficxml
import codecs

#from mx.DateTime import now
import datetime
import decimal

# import os, sys, string
from os import path, system, environ, remove
from xml.dom import minidom
from string import center

# from email.mime.text import MIMEText
# from email.mime.application import MIMEApplication
# from email.mime.multipart import MIMEMultipart
# from smtplib import SMTP_SSL, SMTP

# db
dbusr='ficnx'
dbpas='ficnx'
#dbusr='duso'
#dbpas='duso'

dbase='ficnx'
#dbase='asuni'
#dbase='nextstep'
#dbase='duso'
#dbase='anaisabel'
#dbase='amama'
#dbase='liliav'
#dbase='rociof'


dbhos='localhost'
lrows=''
#
# psycopg2 
# Fri Feb 22 20:28:06 MST 2013 Cambio a psycopg2
conn=psycopg2.connect("dbname='"+dbase+"' host='"+dbhos+"' user='"+dbusr+"' password='"+dbpas+"'")
# psycopg2 no funciona todo como esta actualemente Thu Jan 29 12:11:29 MST 2009 jr
#conn=psycopg.connect("dbname='"+dbase+"' host='"+dbhos+"' user='"+dbusr+"' password='"+dbpas+"'")
cur=conn.cursor()

#  print cur.statusmessage

# Start Funcion

# Log
now=datetime.datetime.now()
flogger = "tmp/"+now.strftime("%Y%m%d")+".log"
logging.basicConfig( level=logging.DEBUG, format='%(asctime)s : %(levelname)s : %(message)s', filename=flogger)
#f = open(LOG_FILENAME, 'rt')
# FileLog=ficdef.fOpenLog(flogger)
"""
logging.debug('Comienza el programa')
logging.info('Procesando con normalidad')
logging.warning('Advertencia')
"""

# Wed May 20 17:20:42 MDT 2015 
# Envio a multiples correos separados por (coma)

def fSenDoc(ftPrTm,fmFacAct,fmDirCfd,fCliCor,lDebug=False,flMsg=''):
  fMsg=''
  lCorDes=fCliCor.split(",")
  if lDebug: fLog(flMsg+" - mXml[CliCor] ",lCorDes)
  for i in range(len(lCorDes)):
    CliCor=lCorDes[i]
    if lDebug: fLog(flMsg+" - CorDes ",CliCor)
    fMsg+=fSendF(ftPrTm,fmFacAct,fmDirCfd,CliCor)
  if lDebug: fLog(flMsg+" - fSendF ",fMsg)
  return(fMsg)

# Tue Sep 01 14:29:05 MDT 2015
# Cambia codigos de caracteres especial utf8 - html
def fUtf8HTML(lkVar,lEsTxt=False):
  lkTex=lkVar.encode("utf-8")
  if not lEsTxt:
    lkTex=lkTex.replace("Ñ","&Ntilde;") 
    lkTex=lkTex.replace("ñ","&ntilde;")
  return(lkTex) 

def fTOUnicodeUTF8(lVal):
 lVal=lVal.replace("  "," ")
 lVal=unicode(lVal.strip(),'utf-8')
 return lVal 

def fLog(lNamVar,lValVar,lWriLog=False):
#  FileLog=ficdef.fOpenLog(flogger)
  sipremo=environ['REMOTE_ADDR']
#  lok=system("/usr/bin/logger "+sipremo+" - "+lNamVar+" "+str(lValVar))
  logging.info(sipremo+" - "+lNamVar+" "+str(lValVar))
#  ficdef.fWriLog(FileLog,sipremo+" - "+lNamVar+" "+str(lValVar))
  if lWriLog:
    system('/usr/bin/logger '+sipremo+" - "+lNamVar+' = "'+str(lValVar)+'"')
#  ficdef.fCloLog(FileLog)
  return

def fCopyFROM(lFRead, lTable):
  global cur
  fread=open(lFRead,'r')
  cur.copy_from(fread,lTable)
  fread.close()
  return

def fCopyTO(lFout, lTable):
  global cur
  fout = open(lFout,'w')
  cur.copy_to(fout, lTable)                        
  fout.close() 
  return

def MyTrim(lStr):
  while "  " in lStr:
    lStr=lStr.replace("  "," ")
  return(lStr)

def fConsTb(lfs,lEnc,lCam,lTab,lWhe,lOrd,lLim,lsf,lfses='',llip='',lmTotRen='',lmRenIni=''):
  lkReturn='Ok'
  lktip="R"
#  lHoy=now()
  lHoy=datetime.datetime.now()
  llHoy = lHoy.strftime("%Y-%m-%d")
  (lanio,lmes,ldia)=llHoy.split('-')
  lFecAct=datetime.date(int(lanio),int(lmes),10)
  
  if (lEnc.find(':') != -1) :
    tTupla=lEnc.split(':')
    (lktip, lEnc)=tTupla

  lscriptnm=lfs+"ficgal.py?fop=1&boton=Continuar&ltr="+lmTotRen+"&lri="+lmRenIni+"&fses="+lfses
#  print lCam,"<br>"
  lrows=fFetchAll("SELECT "+lCam+" FROM "+lTab+lWhe+lOrd+lLim)
# Thu Oct 04 16:39:30 MDT 2012 JR
# Para ver si es mas de un registro
  if len(lrows)==1 and lTab!="fnsatcfd ":
    for lrow in lrows:
      lkReturn=str(lrow[0]).strip()+":Modificar:1:N"
  else: 
    print ficdef.fTable("ID='tabla' BORDER=1 WIDTH=100%")
    lIni=lEnc.find(',')
    lFin=len(lEnc)
    lEnca=lEnc[0:lIni]
    print ficdef.fTabRen('1:TH',lEnca,"C",lsf)
    lEnc=lEnc[lIni+1:lFin]
    lnEnc=''

    while ',' in lEnc:
      lIni=lEnc.find(',')
      lFin=len(lEnc)
      lEnca=lEnc[0:lIni]
      print ficdef.fTabRen('4:TH',lEnca,"C",lsf)
      lnEnc+='1'
      lEnc=lEnc[lIni+1:lFin]

    print ficdef.fTabRen('2:TH',lEnc,"C",lsf)

#  Gris
#  lcbg='#999999'	 
# Verde 
    lcbg='#3CB371'
    lfPar='*'
    j=1
    for lrow in lrows:
#    if lTab=="fnkard ":
      if lTab in ('fnkard ','fnhmin '):
        if lfPar!=lrow[5]: 
          lfPar=lrow[5]
          lcbg=ficdef.fcolbg(lcbg)
      else: lcbg=ficdef.fcolbg(lcbg)

# Tue Jul 15 13:14:18 MDT 2008 JR
# se asume que el primer campo va a ser el serial de la tabla
      if lktip=='R':
        print ficdef.fTabRen('1',ficdef.fInput('R','fnd',str(lrow[0])+":"+str(j)),'C',lsf,lcbg)
      else:
        print ficdef.fTabRen('1',ficdef.fInput('C','fnd'+str(j),str(lrow[0])+":"+str(j)),'C',lsf,lcbg)
      j+=1

      l=1
      for i in lnEnc:
#        print "Tipooooo ",type(lrow[l])," ficdef ",ficdef.fKtype(lrow[1]),"<br>"
        if type(lrow[l])==int or type(lrow[l])==float or \
           type(lrow[l])==long or type(lrow[l])==complex or \
           type(lrow[l])==decimal.Decimal:
          print ficdef.fTabRen('4',str(lrow[l]),'R',lsf,lcbg)
        elif type(lHoy)==type(lrow[l]) :		# datetime.datetime
          print ficdef.fTabRen('4',lrow[l].date,'R',lsf,lcbg)
        elif type(lFecAct)==type(lrow[l]) :		# datetime.date
          print ficdef.fTabRen('4',str(lrow[l]),'R',lsf,lcbg)
        else:
#	Sat Feb 28 11:50:52 MST 2009 Nota para modificacion
#	Condicion para Consultas de articulos
#	Se debe cambiar l==2 por el nombre del campo
          if lTab=="fnarti " and l==2:
            lpartes=fTotReg("SELECT * FROM pa_parte WHERE numparte='"+lrow[l].strip()+"'")
            if lpartes==0:
              print ficdef.fTabRen('4',lrow[l],'L',lsf,lcbg)
            else:
#            print ficdef.fTabRen('4',"PARTES",'L',lsf,lcbg)
              lnp=lrow[l].strip()
              print ficdef.fTabRen('4',"<A HREF='http://"+llip+lscriptnm+"&lnp="+lnp+"'>"+\
                    lnp+"</A>",'L',lsf,lcbg)
# Mon Apr 09 17:45:43 MDT 2012 OT
# Ordenes de Trabajo
          elif lTab=="fnorcl " and l==2:
            lscriptnm=lfs+"ficpre.py?fop=1&boton=Continua&fses="+lfses+"&fbrw=*"
            lpartes=fTotReg("SELECT * FROM fnorre WHERE or_numdoc='"+lrow[l].strip()+"'")
            if lpartes==0:
              print ficdef.fTabRen('4',lrow[l],'L',lsf,lcbg)
            else:
              lnd=lrow[l].strip()
              print ficdef.fTabRen('4',"<A HREF='http://"+llip+lscriptnm+"&lnd=OT:"+lnd+"&lcl="+lrow[3].strip()+"'>"+\
                    lnd+"</A>",'L',lsf,lcbg)
          else:
            print ficdef.fTabRen('4',lrow[l],'L',lsf,lcbg)
        l+=1
      """
      print "<PRE>"
      print "Tipooooo ",type(lrow[l])," =- ",lrow[l],"<br>"
      print "Tipooooo ",type(lHoy)," =- ",lHoy,"<br>"
      print "</PRE>"
      """
      if type(lrow[l])==int or type(lrow[l])==float or \
         type(lrow[l])==long or type(lrow[l])==complex or \
         type(lrow[l])==decimal.Decimal:
        print ficdef.fTabRen('2',str(lrow[l]),'R',lsf,lcbg)
      elif type(lHoy)==type(lrow[l]) :
#        print ficdef.fTabRen('4',lrow[l].date,'R',lsf,lcbg)
        print ficdef.fTabRen('4',str(lrow[l]).strip(),'R',lsf,lcbg)
      elif type(lFecAct)==type(lrow[l]) :		# datetime.date
        print ficdef.fTabRen('4',str(lrow[l]),'R',lsf,lcbg)
      else:
        print ficdef.fTabRen('2',lrow[l],'L',lsf,lcbg)

  return(lkReturn) 

def fSql(lsql, lTst=True):
  global cur
  if lTst:
    if "UPDATE" in lsql.upper() :
      lsql="COMMIT;BEGIN;"+lsql+";"+"COMMIT;BEGIN;"
    if "DROP" in lsql.upper() :
      lsql="COMMIT;BEGIN;"+lsql+";"+"COMMIT;BEGIN;"
    if "INSERT" in lsql.upper() :
      lsql="COMMIT;BEGIN;"+lsql+";"+"COMMIT;BEGIN;"
#  print lsql,"<br>"  
  return cur.execute(lsql)

def fTstDb(lTabla):
  global cur
  mquery1="SELECT * FROM pg_class WHERE relname='"+lTabla+"'"
  fSql(mquery1)
  totreg=cur.rowcount
  return totreg

def fTotReg(tsql):
  global cur
#  cur.execute(tsql)
  fSql(tsql)
  return cur.rowcount

def fFetchOne(tsql,lFo=True):
  global cur
#  cur.execute(tsql)
  fSql(tsql,lFo)
  return cur.fetchone()

def fFetchAll(tsql):
  global cur
#  cur.execute(tsql)
  fSql(tsql)
  return cur.fetchall()

def fCommit():
  conn.commit()
  return

def fClose():
  conn.close()
  return

def fValAcc(lfusr,lfper,lfimp='0',lfent='0',lcod='0'):
  """
  lfusr		- Usuario
  lfper 	- Permiso 
  		- Se puede pedir por posicion y valor o por comparacion de string
		 lfper = (posicion : valor)
  lfimp		- Impresora	0 = No regresa valor 	1 = regresa valor de IMPRESOR
  Wed Sep 09 13:21:57 MDT 2009 
  lfent		- Comando o opcion de entrada al sistema
  lcod		- Codigos del usuario
  """
  tTupla=kri=krf=''

  lrow=fFetchOne("SELECT * FROM fnusers WHERE usid='"+lfusr+"'")

#  print "<PRE>/ValAcc"
#  if lfusr : print "lfusr = ",lfusr
#  if lfper : print "lfper = ",lfper
#  if lfimp : print "lfimp = ",lfimp
#  if lfent : print "lfent = ",lfent
  
  if (lfper.find(':') != -1) :
    tTupla=lfper.split(':')

#    if tTupla : print "tTupla = ",tTupla

    (kri, ktp)=tTupla
    krf=int(kri)+1
    kri=int(kri)

#    if kri : print "kri = ",kri
#    if krf : print "krf = ",krf
#    if ktp : print "ktp = ",ktp,'=',lrow[3][kri:krf]

    if lrow[3][kri:krf]==ktp or lrow[3][kri:krf]=='9':
      lfReturn=True
    elif ktp=='?':
      lfimp=lfent=''
      lfReturn=lrow[3][kri:krf]
    else:
      lfReturn=False
  else:
#                                  0123456789
    if lrow[3]==lfper or lrow[3]=='9999999999':
      lfReturn=True
    else:
      lfReturn=False 

#  print "</PRE>ValAcc/"

#  print "</PRE>"
#Tue Mar 09 13:40:25 MST 2010 
#Cambio tipo de permisos
  if lfper=='inv':
    lfimp=lfent=''
    lfReturn=lrow[3][0:3]
    lval=int(lrow[3][0:1])+int(lrow[3][1:2])+int(lrow[3][2:3])
    if lval>0 : lfReturn=(True,lfReturn)
    else: lfReturn=(False,lfReturn)

  if lfper=='cxc':
    lfimp=lfent=''
    lfReturn=lrow[3][3:6]
    lval=int(lrow[3][3:4])+int(lrow[3][4:5])+int(lrow[3][5:6])
    if lval>0 : lfReturn=(True,lfReturn)
    else: lfReturn=(False,lfReturn)

  if lfper=='gen':
    lfimp=lfent=''
    lfReturn=lrow[3][9:10]
    lval=int(lrow[3][9:10])
    if lval>0 : lfReturn=(True,lfReturn)
    else: lfReturn=(False,lfReturn)

#  print "<PRE>"
#  if lfimp : print "lfimp = ",lfimp
#  if lfent : print "lfent = ",lfent
#  if kri   : print "kri = ",kri
#  if krf   : print "krf = ",krf
#  if tTupla : print "tTupla = ",tTupla

  if   lfimp=='1' and lfent=='1':
     if lcod=='0': 
       lfReturn=(lfReturn,lrow[5],lrow[6])
     else:
       lfReturn=(lfReturn,lrow[5],lrow[6],lrow[9])
  elif lfimp=='0' and lfent=='1':
     if lcod=='0': 
       lfReturn=(lfReturn,'',lrow[6])
     else:
       lfReturn=(lfReturn,'',lrow[6],lrow[9])
  elif lfimp=='0' and lfent=='0':
     if lcod=='0': 
       lfReturn=(lfReturn,'','')
     else:
       lfReturn=(lfReturn,'','',lrow[9])
  elif lfimp=='1' and lfent=='0':
     if lcod=='0': 
       lfReturn=(lfReturn,lrow[5],'')
     else:
       lfReturn=(lfReturn,lrow[5],'',lrow[9])

#  if lfReturn : print "lfReturn = ",lfReturn
#  print "</PRE>"
 
  return lfReturn

def fPrintFact(lfnd,lfusr,lHoy,lHor,lSerCon):

    (lanio,lmes,ldia)=lHoy.split('-')

    lrows=fFetchAll("SELECT \
      fc_clipro,cl_nombre,cl_nombre2,cl_domicil1,cl_domicil2,cl_colonia,cl_ciudad,cl_estado,cl_codipost,cl_telefono, \
      cl_rfc, \
      fc_tipdoc,fc_numdoc,fc_refer,fc_fecha,fc_vende,fc_gpo,fc_numpar,fc_descrip,fc_salida,fc_importe,fc_impuesto, \
      fc_total, fc_numpre, fc_precio, (fc_fecha + fc_plazo),ve_nombre \
      FROM fnfact, fnclie, fnvend WHERE NOT fc_impresa AND fc_clipro=cl_cliente AND \
      fc_numdoc='"+lfnd+"' AND fc_vende=ve_clave;")

    """
      Sat Jan 30 17:27:30 MST 2010  
      Para cuando no se tiene vendedor o vendedor en blanco
    """
    totreg=0
    totreg=len(lrows)
    if totreg==0:
      lrows=fFetchAll("SELECT \
        fc_clipro,cl_nombre,cl_nombre2,cl_domicil1,cl_domicil2,cl_colonia,cl_ciudad,cl_estado,cl_codipost,cl_telefono, \
        cl_rfc, \
        fc_tipdoc,fc_numdoc,fc_refer,fc_fecha,fc_vende,fc_gpo,fc_numpar,fc_descrip,fc_salida,fc_importe,fc_impuesto,   \
        fc_total, fc_numpre, fc_precio, (fc_fecha + fc_plazo),'NV' \
        FROM fnfact, fnclie WHERE NOT fc_impresa AND fc_clipro=cl_cliente AND \
        fc_numdoc='"+lfnd+"' ;")


    tPrTm="/tmp/"+lfusr
    f=open(tPrTm,'w')
    ESC  = chr(27)
    CRLF = chr(13) + chr(10)
    FF   = chr(12)
    NEGRITA_ON  = chr(69)
    NEGRITA_OFF = chr(70)
    CONDENSADA_ON  = chr(15)
    CONDENSADA_OFF = chr(18)
    GRANDE_ON  = chr(14)
    GRANDE_OFF = chr(20)
    timpflete=tivaflete=ttotflete=0
    timporte=timpuesto=ttotal=i=0;
    lHayRFC=True
    for lrow in lrows:
      if i==0:

        if len(lrow[10].strip())>0: lHayRFC=True
        else: lHayRFC=False

#        f.write(row[0]+row[23]+row[9]+row[15]+ficdef.fRepit(' ',20)+GRANDE_ON+row[12]+CRLF)
        plin="%6s %1s %20s %3s" % (lrow[0],lrow[23],lrow[9],lrow[15])
        plin=plin+ficdef.fRepit(' ',10)+lrow[12]+"  "+GRANDE_ON+lSerCon+GRANDE_OFF+CRLF
        f.write(plin)									# Numero de Cliente, .... , Serie:NumeroFactura

        f.write(lrow[1][0:54]+"     "+str(lrow[14])+CRLF)				# Nombre1, Fecha
        f.write(lrow[2][0:54]+"     "+lrow[10]+CRLF)					# Nombre2, RFC
        
        if lrow[11]=="FR":
          f.write(lrow[3]+" "+lrow[26]+"  "+GRANDE_ON+"CREDITO"+GRANDE_OFF+CRLF) 	# Domicilio1, Nombre Vendedor, Nombre Documento
        else:
          f.write(lrow[3]+" "+lrow[26]+"  "+GRANDE_ON+"CONTADO"+GRANDE_OFF+CRLF)

        dVence = lrow[25].strftime("%Y-%m-%d")
        (aVen, mVen, dVen) = dVence.split("-")
        f.write(lrow[6]+" "+lrow[7]+" "+lrow[8]+" "+lrow[5]+CONDENSADA_ON+CRLF)		# Ciudad, Estado, Colonia, Codigo Postal
        f.write(lrow[4]+CRLF)								# Domicilio2

      i+=1
      if not lHayRFC: 
        lPrecio=lrow[24]
        lImporte=lrow[20]+lrow[21]
        lImpuesto=0
        lTotal=lrow[22]
      else:
        lPrecio=lrow[24]
        lImporte=lrow[20]
        lImpuesto=lrow[21]
        lTotal=lrow[22]
      
      if lrow[17].strip()=='FLETE':
        timpflete=lImporte
        tivaflete=lImpuesto
        ttotflete=lTotal
      else:  
#      plin="%4d %15s %-68s %12.2f %12.2f" % (lrow[19],lrow[17],lrow[18][0:68],lrow[24],lrow[20])
#      timporte=timporte+lrow[20]
#      timpuesto=timpuesto+lrow[21]
#      ttotal=ttotal+lrow[22]
        plin="%4d %15s %-68s %12.2f %12.2f" % (lrow[19],lrow[17],lrow[18][0:68],lPrecio,lImporte)
        timporte=timporte+lImporte
        timpuesto=timpuesto+lImpuesto
        ttotal=ttotal+lTotal

        f.write(plin+CRLF)

# Renglone por Factura
    while i < 13:
      f.write(CRLF)
      i+=1

    cmes=ficdef.fDatExt(lHoy,3)
    mVen=ficdef.fDatExt(dVence,3)
    """
#   Tue Oct 26 16:53:38 MDT 2010 Antes de agregar FLETE
    plin="%20s %60s %20s %12.2f" % (lHor,dVen,"SUBTOTAL",timporte)
    f.write(plin+CRLF)
    plin="%25s %6s" % (mVen, aVen)
    f.write(plin+CRLF)
    """

    plin="%20s %60s %20s %12.2f" % (lHor,dVen,"SUBTOTAL",timporte)
    f.write(plin+CRLF)
    if timpflete>0:
      plin="%25s %6s %51s %17s %12.2f" % (mVen,aVen," ","SEGURO y M.N.",timpflete)
      ttotal+=ttotflete
      timpuesto+=tivaflete
      timporte+=timpflete
    else:
      plin="%25s %6s" % (mVen, aVen)
    f.write(plin+CRLF)

    plin=ficdef.fPesos(ttotal)
    f.write(plin+CRLF)
    plin="%102s %12.2f" %("IMPORTE",timporte)
    f.write(plin+CRLF)
    plin="%102s %12.2f" %("16% I.V.A.",timpuesto)
    f.write(plin+CRLF)
    plin="%15s %24s %15s %45s %12.2f" % (ldia,cmes,lanio,"TOTAL",ttotal)
    f.write(plin+CONDENSADA_OFF+CRLF)
    f.close()

    return tPrTm

def fPrintDevo(lfnd,lfusr,lHoy,lHor,lSerCon,lObserva):

    (lanio,lmes,ldia)=lHoy.split('-')

    if (lSerCon.find(':') != -1) :
      tTupla=lSerCon.split(':')
      (ltipdoc, lnumdoc)=tTupla
    else:
      ltipdoc=lnumdoc=''

    lrows=fFetchAll("SELECT \
      di_clipro,cl_nombre,cl_nombre2,cl_domicil1,cl_domicil2,cl_colonia,cl_ciudad,cl_estado,cl_codipost,cl_telefono, \
      cl_rfc, \
      di_tipdoc,di_numdoc,di_refer,di_fecha,di_vende,di_gpo,di_numpar,di_descrip,di_entrada,di_importe,di_impuesto, \
      di_total, di_numpre, di_precio, (di_fecha + di_plazo) \
      FROM "+lfnd+", fnclie  \
      WHERE di_clipro=cl_cliente ;")

    tPrTm="/tmp/"+lfusr
    f=open(tPrTm,'w')
    ESC  = chr(27)
    CRLF = chr(13) + chr(10)
    FF   = chr(12)
    NEGRITA_ON  = chr(69)
    NEGRITA_OFF = chr(70)
    CONDENSADA_ON  = chr(15)
    CONDENSADA_OFF = chr(18)
    GRANDE_ON  = chr(14)
    GRANDE_OFF = chr(20)
    timporte=timpuesto=ttotal=i=0;
    for lrow in lrows:
      if i==0:

        if len(lrow[10].strip())>0: lHayRFC=True
        else: lHayRFC=False

#        f.write(row[0]+row[23]+row[9]+row[15]+ficdef.fRepit(' ',20)+GRANDE_ON+row[12]+CRLF)
        plin="%6s %1s %20s %3s" % (lrow[0],lrow[23],lrow[9],lrow[15])
        plin=plin+ficdef.fRepit(' ',10)+lrow[12]+"  "+GRANDE_ON+lSerCon+GRANDE_OFF+CRLF
        f.write(plin)

        f.write(lrow[1][0:54]+"     "+str(lrow[14].date)+CRLF)
        f.write(lrow[2][0:54]+"     "+lrow[10]+CRLF)
        if ltipdoc=="DR":
          f.write(lrow[3]+"   "+GRANDE_ON+"DEV.CREDITO"+GRANDE_OFF+CRLF)
        else:
          f.write(lrow[3]+"   "+GRANDE_ON+"DEV.CONTADO"+GRANDE_OFF+CRLF)

        dVence = lrow[25].strftime("%Y-%m-%d")
        (aVen, mVen, dVen) = dVence.split("-")
        f.write(CONDENSADA_ON+CRLF)

      i+=1

      lPrecio=lrow[24]
      if not lHayRFC: 
        lImporte=lrow[20]+lrow[21]
        lImpuesto=0
      else:
        lImporte=lrow[20]
        lImpuesto=lrow[21]
      lTotal=lrow[22]

#      plin="%4d %15s %-68s %12.2f %12.2f" % (lrow[19],lrow[17],lrow[18][0:68],lrow[24],lrow[20])
      plin="%4d %15s %-68s %12.2f %12.2f" % (lrow[19],lrow[17],lrow[18][0:68],lPrecio,lImporte)
#      timporte=timporte+lrow[20]
#      timpuesto=timpuesto+lrow[21]
#      ttotal=ttotal+lrow[22]
      timporte=timporte+lImporte
      timpuesto=timpuesto+lImpuesto
      ttotal=ttotal+lTotal
      f.write(plin+CRLF)

    while i < 13:
      f.write(CRLF)
      i+=1

    cmes=ficdef.fDatExt(lHoy,3)
    mVen=ficdef.fDatExt(dVence,3)
    plin="%20s %60s %20s %12.2f" % (lHor,dVen,"SUBTOTAL",timporte)
    f.write(plin+CRLF)
    plin="%25s %6s" % (mVen, aVen)
    f.write(plin+CRLF)
    plin=ficdef.fPesos(ttotal)
    f.write(plin+CRLF)
    plin="%102s %12.2f" %("IMPORTE",timporte)
    f.write(plin+CRLF)
    plin="%102s %12.2f" %("16% I.V.A.",timpuesto)
    f.write(plin+CRLF)
    plin="%15s %24s %15s %45s %12.2f" % (ldia,cmes,lanio,"TOTAL",ttotal)
    f.write(plin+CONDENSADA_OFF+CRLF)
    f.write(lObserva+CRLF)
    f.close()

    return tPrTm


def fPrintFactHP(lfnd,lfusr,lHoy,lHor,lSerCon):

    (lanio,lmes,ldia)=lHoy.split('-')

    lrows=fFetchAll("SELECT \
      fc_clipro,cl_nombre,cl_nombre2,cl_domicil1,cl_domicil2,cl_colonia,cl_ciudad,cl_estado,cl_codipost,cl_telefono, \
      cl_rfc, \
      fc_tipdoc,fc_numdoc,fc_refer,fc_fecha,fc_vende,fc_gpo,fc_numpar,fc_descrip,fc_salida,fc_importe,fc_impuesto, \
      fc_total, fc_numpre, fc_precio, (fc_fecha + fc_plazo),ve_nombre \
      FROM fnfact, fnclie, fnvend WHERE NOT fc_impresa AND fc_clipro=cl_cliente AND \
      fc_numdoc='"+lfnd+"' AND fc_vende=ve_clave;")

    """
      Sat Jan 30 17:27:30 MST 2010  
      Para cuando no se tiene vendedor o vendedor en blanco
    """
    totreg=0
    totreg=len(lrows)
    if totreg==0:
      lrows=fFetchAll("SELECT \
        fc_clipro,cl_nombre,cl_nombre2,cl_domicil1,cl_domicil2,cl_colonia,cl_ciudad,cl_estado,cl_codipost,cl_telefono, \
        cl_rfc, \
        fc_tipdoc,fc_numdoc,fc_refer,fc_fecha,fc_vende,fc_gpo,fc_numpar,fc_descrip,fc_salida,fc_importe,fc_impuesto,   \
        fc_total, fc_numpre, fc_precio, (fc_fecha + fc_plazo),'NV' \
        FROM fnfact, fnclie WHERE NOT fc_impresa AND fc_clipro=cl_cliente AND \
        fc_numdoc='"+lfnd+"' ;")

    tPrTm="/tmp/"+lfusr
    f=open(tPrTm,'w')
    ESC  = chr(27)
    CRLF = chr(13) + chr(10)
    FF   = chr(12)
    NEGRITA_ON  = chr(69)
    NEGRITA_OFF = chr(70)
    CONDENSADA_ON  = chr(15)
    CONDENSADA_OFF = chr(18)
    GRANDE_ON  = chr(14)
    GRANDE_OFF = chr(20)
    FORMA = chr(27)+"C"+"23"
    timporte=timpuesto=ttotal=i=0;
    lHayRFC=True
    lSpace=ficdef.fRepit(' ',6)
    for lrow in lrows:
      if i==0:

        if len(lrow[10].strip())>0: lHayRFC=True
        else: lHayRFC=False

        plin=FORMA+ficdef.fRepit(' ',55)+GRANDE_ON+lSerCon+GRANDE_OFF+CRLF			# Serie Numero de Documento
        f.write(plin)

        if lrow[11]=="FR":									# 
#          f.write(ficdef.fRepit(' ',52)+GRANDE_ON+"FAC.CREDITO"+GRANDE_OFF+CRLF)
          f.write(ficdef.fRepit(' ',62)+"CREDITO"+CRLF)
        else:
#          f.write(ficdef.fRepit(' ',52)+GRANDE_ON+"FAC.CONTADO"+GRANDE_OFF+CRLF)
          f.write(ficdef.fRepit(' ',62)+"CONTADO"+CRLF)

#        plin="%6s %-60s" % (lrow[0],lrow[1])							# Codigo y Nombre de cliente
        plin="%6s %-60s" % (lSpace,lrow[2])							# Codigo y Nombre de cliente
        plin=plin+CRLF										# Nombre2
        f.write(plin)

        plin="%6s %-60s" % (lSpace,lrow[1])							# Razon Social
        plin=plin+CRLF
        f.write(plin)

        plin="%6s %-60s" % (lSpace,lrow[3])							# Domicilio1
        plin=plin+CRLF
        f.write(plin)

        plin="%6s %-20s %-30s %-10s" % (lSpace,lrow[6],ficdef.fRepit(" ",20),lrow[8])		# Ciudad, Codigo Postal
        plin=plin+CRLF
        f.write(plin)

        mFecha=ficdef.fDatExt(lrow[14].date,1)
        f.write(lSpace+lrow[9]+ficdef.fRepit(" ",24)+lrow[10]+"    "+mFecha+CRLF)		# Telefono,RFC, Fecha de documento

        f.write(lSpace+lrow[0]+lSpace+" Vendedor : "+lrow[26]+ficdef.fRepit(" ",20)+lHor+CRLF)	# Cliente, Vendedor, Hora

        f.write(CRLF)
        f.write(CRLF)

        dVence = lrow[25].strftime("%Y-%m-%d")
        (aVen, mVen, dVen) = dVence.split("-")

# Renglones de Factura
      i+=1
      if not lHayRFC: 
        lPrecio=lrow[24]
        lImporte=lrow[20]+lrow[21]
        lImpuesto=0
        lTotal=lrow[22]
      else:
        lPrecio=lrow[24]
        lImporte=lrow[20]
        lImpuesto=lrow[21]
        lTotal=lrow[22]
        
#      plin="%4d %15s %-68s %12.2f %12.2f" % (lrow[19],lrow[17],lrow[18][0:68],lPrecio,lImporte)
      plin="%15s %-30s %4d %12.2f %12.2f" % (lrow[17],lrow[18][0:30],lrow[19],lPrecio,lImporte)
#      timporte=timporte+lrow[20]
#      timpuesto=timpuesto+lrow[21]
#      ttotal=ttotal+lrow[22]
      timporte=timporte+lImporte
      timpuesto=timpuesto+lImpuesto
      ttotal=ttotal+lTotal
      f.write(plin+CRLF)

# Renglone en blanco por Factura
    while i < 11:
      f.write(CRLF)
      i+=1

    cmes=ficdef.fDatExt(lHoy,3)
    mVen=ficdef.fDatExt(dVence,1)
    plin="%63s %12.2f" % ("Base Gravable",timporte)
    f.write(plin+CRLF)
    plin="%63s %12.2f" %("16% I.V.A.",timpuesto)
    f.write(plin+CRLF)
    plin="%63s %12.2f" %("Total a pagar",ttotal)
    f.write(plin+CRLF)
    plin=ficdef.fPesos(ttotal)
    f.write(CONDENSADA_ON+plin+CONDENSADA_OFF+CRLF)
    plin="%70s" %("Pago en una sola exhibicion")
    f.write(plin+CRLF)

    f.write(CRLF)
    f.write(CRLF)

    plin="%38s %12.2f" % (mVen, ttotal)
    f.write(plin+FF)
    f.close()

    return tPrTm
"""
def fXML(lfnd,lDirCfd):

  return (mfactura,ksello)
"""

def fFacHTML(lHoy,lfacact,lSello,lXml,lfnd,lDirCfd,lTipDoc):
  """
  aXml["Cliente"]=lCliente=mov[0]
  aXml["SubTotal"]=lSubTotal=str(mov[1])
  aXml["TotImpue"]=lTotImpue=str(mov[2])
  aXml["TotTotal"]=lTotTotal=str(mov[3])
  aXml["lSerie"]=lserie=fol[0].strip()
  aXml["lActual"]=lactual=("%10d" % (fol[1])).strip()
  aXml["Aproba"]=laproba=fol[2].strip()
  aXml["AnioAp"]=lanioap=fol[3].strip()
  aXml["FecAct"]=mfecact=mov[0].strip()
  aXml["NoCer"]=mNoCer=mov[1].strip()
  aXml["EmiNom"]=mEmiNom=row[0].strip()
  aXml["EmiRfc"]=mEmiRfc=row[1].strip()
  aXml["EmiCal"]=mEmiCal=row[2].strip()
  aXml["EmiNoE"]=mEmiNoE=row[3].strip()
  aXml["EmiCol"]=mEmiCol=row[4].strip()
  aXml["EmiLoc"]=mEmiLoc=row[5].strip()
  aXml["EmiMun"]=mEmiMun=row[6].strip()
  aXml["EmiEst"]=mEmiEst=row[7].strip()
  aXml["EmiPai"]=mEmiPai=row[8].strip()
  aXml["EmiCod"]=mEmiCod=row[9].strip()
  aXml["CliRfc"]=mCliRfc=cli[0].strip()
  aXml["CliNom"]=mCliNom=cli[1].strip()
  aXml["CliRfc"]=mCliRfc
  aXml["CliDom"]=mCliDom=cli[2].strip()
  aXml["CliCol"]=mCliCol=cli[3].strip()
  aXml["CliLoc"]=mCliLoc=cli[4].strip()
  aXml["CliMun"]=mCliMun=cli[5].strip()
  aXml["CliEst"]=mCliEst=cli[6].strip()
  aXml["CliPai"]=mCliPai=cli[7].strip()
  aXml["CliCoP"]=mCliCoP=cli[8].strip()
  aXml["CliPla"]=("%4d" % (cli[9])).strip()
  """
  mcadori=lDirCfd+lfacact+".cadenaoriginal"
  fichero = open(path.realpath(mcadori), "r")
  lCadOri=fichero.readline()
  fichero.closed
  lfactura=lDirCfd+lfacact+".html"
  f = open(path.realpath(lfactura), "w")
# Emisor
  f.write( "<HTML>\n" )
  f.write( "<BODY>\n" )
  f.write( "<CENTER>\n")
  f.write( "<TABLE BORDER=0 WIDTH=100%>\n" )
  f.write( "<TR>\n")
  f.write( "  <TD ALIGN=CENTER ROWSPAN=7> <IMG SRC=\"logo.jpg\"> </TD> \n")
  f.write( "  <TD ALIGN=CENTER>EMISOR</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR>\n")
  f.write( "  <TD ALIGN=CENTER>"+lXml["EmiNom"]+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR>\n")
  f.write( "  <TD ALIGN=CENTER>"+lXml["EmiCal"]+" "+lXml["EmiNoE"]+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR>\n")
  f.write( "  <TD ALIGN=CENTER>"+lXml["EmiCol"]+" "+lXml["EmiLoc"]+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR>\n")
  f.write( "  <TD ALIGN=CENTER>"+lXml["EmiMun"]+" "+lXml["EmiEst"]+" "+lXml["EmiPai"]+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR>\n")
  f.write( "  <TD ALIGN=CENTER>"+lXml["EmiCod"]+" RFC. "+lXml["EmiRfc"]+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR>\n")
  f.write( "  <TD ALIGN=CENTER>&nbsp;</TD>\n")
  f.write( "</TR>\n")
  f.write( "</TABLE>\n")
  f.write( "<HR>\n")
# Cliente
  f.write( "<TABLE BORDER=0 WIDTH=100%>\n" )
  f.write( "<TR>\n")
  f.write( "  <TD ALIGN=CENTER><B>CLIENTE</B></TD>\n")
  if lTipDoc=='FC':
    f.write( "  <TD ALIGN=CENTER><B>FACTURA CONTADO</B></TD>\n")
  else:
    f.write( "  <TD ALIGN=CENTER><B>FACTURA CREDITO</B></TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR>\n")
#  lTex=lXml["CliNom"]
  lTex=lXml["CliNom"].encode("utf-8")
  lTex=lTex.replace("Ñ","&Ntilde;") 
  lTex=lTex.replace("ñ","&ntilde;")
  f.write( "  <TD ALIGN=LEFT>"+lTex+"</TD>\n")
  f.write( "  <TD ALIGN=CENTER>"+lfacact+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR> \n")
  f.write( "  <TD ALIGN=LEFT>"+lXml["CliDom"]+"</TD>\n")
  f.write( "  <TD ALIGN=CENTER>FECHA</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR> \n")
  f.write( "  <TD ALIGN=LEFT>"+lXml["CliCol"]+" "+lXml["CliLoc"]+"</TD>\n")
  lTex=lXml["FecAct"].replace("T"," ")
  f.write( "  <TD ALIGN=CENTER>"+lTex+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR> \n")
  f.write( "  <TD ALIGN=LEFT>"+lXml["CliMun"]+" "+lXml["CliEst"]+" "+lXml["CliPai"]+"</TD>\n")
  f.write( "  <TD ALIGN=CENTER>A&ntilde;o y No. de Aprobaci&oacute;n de Folios</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR> \n")
  f.write( "  <TD ALIGN=LEFT>"+lXml["CliCoP"]+" RFC. "+lXml["CliRfc"]+"</TD>\n")
  f.write( "  <TD ALIGN=CENTER>"+lXml["AnioAp"]+" "+lXml["Aproba"]+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "</TABLE>\n")
  f.write( "<HR>\n")
# Movimientos
  movs=fFetchAll("SELECT fc_salida,fc_unimed,fc_descrip,fc_precio,fc_importe,(fc_fecha + fc_plazo),fc_numpar,fc_impuesto, \
    fc_clipro,fc_numpre,fc_vende,ve_nombre,fc_numdoc FROM fnfact, fnvend WHERE fc_numdoc='"+lfnd+"' AND fc_vende=ve_clave;")
  f.write( "<TABLE BORDER=0 WIDTH=100%>\n" )
  f.write( "<TR> \n")
  f.write( "<TH ALIGN=LEFT> Cantidad </TH>\n")
  f.write( "<TH ALIGN=LEFT> Unidad </TH>\n")
  f.write( "<TH ALIGN=LEFT> Parte </TH>\n")
  f.write( "<TH ALIGN=LEFT> Descripcion </TH>\n")
  f.write( "<TH ALIGN=RIGHT> Precio </TH>\n")
  f.write( "<TH ALIGN=RIGHT> Importe </TH>\n")
  f.write( "</TR> \n")
  for mov in movs:
    f.write( "<TR> \n")
    f.write( "<TD ALIGN=LEFT> "+str(mov[0])+"</TD>\n")
    f.write( "<TD ALIGN=LEFT> "+str(mov[1])+"</TD>\n")
    f.write( "<TD ALIGN=LEFT> "+str(mov[6])+"</TD>\n")
    f.write( "<TD ALIGN=LEFT> "+str(mov[2])+"</TD>\n")
    lPre="%12.2f" % (mov[3])
    f.write( "<TD ALIGN=RIGHT> "+lPre.strip()+"</TD>\n")
    lImp="%12.2f" % (mov[4])
    if lXml["CliRfc"]=="XAXX010101000":
      lImp="%12.2f" % (mov[4]+mov[7])
      
    f.write( "<TD ALIGN=RIGHT> "+lImp.strip()+"</TD>\n")
    f.write( "</TR> \n")
    dVence = mov[5].strftime("%Y-%m-%d")
    (aVen, mVen, dVen) = dVence.split("-")
    mCli=mov[8]
    mNpr=mov[9]
    mVee=mov[10]
    mVno=mov[11]
    mTik=lfnd

  mVen=ficdef.fDatExt(dVence,3)
  f.write( "<TR>\n")
  f.write( "<TD>&nbsp;</TD>\n") 
  f.write( "<TD>&nbsp;</TD>\n") 
  f.write( "<TD>&nbsp;</TD>\n") 
  f.write( "<TD>&nbsp;</TD>\n") 
  f.write( "<TD ALIGN=RIGHT>SUBTOTAL</TD>\n")
  if lXml["CliRfc"]=="XAXX010101000":
    f.write( "<TD ALIGN=RIGHT>"+lXml["TotTotal"]+"</TD>\n")
  else:
    f.write( "<TD ALIGN=RIGHT>"+lXml["SubTotal"]+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR>\n")
  plin=ficdef.fPesos(float(lXml["TotTotal"]))
  f.write( "<TD COLSPAN=4 ROWSPAN=4 ALIGN=LEFT>Importe con letra: "+plin+"</TD>\n")
  f.write( "<TD ALIGN=RIGHT>16% IVA</TD>\n")
  if lXml["CliRfc"]=="XAXX010101000":
    f.write( "<TD ALIGN=RIGHT>&nbsp;</TD>\n")
  else:
    f.write( "<TD ALIGN=RIGHT>"+lXml["TotImpue"]+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR>\n")
  f.write( "<TD ALIGN=RIGHT>TOTAL</TD>\n")
  f.write( "<TD ALIGN=RIGHT>"+lXml["TotTotal"]+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "</TABLE>\n")
  f.write( "<TABLE BORDER=0 WIDTH=100%>\n" )
  f.write( "<TR>\n")
  f.write( "<TD ALIGN=LEFT>"+mCli+"</TD>\n")
  f.write( "<TD ALIGN=LEFT>"+mNpr+"</TD>\n")
  f.write( "<TD ALIGN=LEFT>"+mTik+"</TD>\n")
  f.write( "<TD ALIGN=LEFT>"+mVee+"</TD>\n")
  f.write( "<TD ALIGN=LEFT>"+mVno+"</TD>\n")
  f.write( "<TD ALIGN=RIGHT><FONT SIZE=-2>Regimen Fiscal:<FONT></TD>\n")
  f.write( "<TD ALIGN=LEFT><FONT SIZE=-2>"+lXml["RegFis"]+"<FONT></TD>\n")
  f.write( "<TD ALIGN=RIGHT><FONT SIZE=-2>Metodo de Pago:<FONT></TD>\n")
  f.write( "<TD ALIGN=LEFT><FONT SIZE=-2>"+lXml["CliFpa"]+"<FONT></TD>\n")
  if lXml["CliDpa"]:
    f.write( "<TD ALIGN=RIGHT><FONT SIZE=-2>Cta:<FONT></TD>\n")
    f.write( "<TD ALIGN=LEFT><FONT SIZE=-2>"+lXml["CliDpa"]+"<FONT></TD>\n")
#  f.write( "<TD ALIGN=LEFT>&nbsp;</TD>\n")
  f.write( "</TR>\n")
  f.write( "</TABLE>\n")
  f.write( "<HR>\n")
# Cadena Original, Sello digital
  f.write( "<TABLE BORDER=0 WIDTH=100%>\n" )
  f.write( "<TR>\n")
  f.write( "<TD ALIGN=LEFT><FONT SIZE=-2>Cadena original<FONT></TD>\n")
  f.write( "<TD ALIGN=RIGHT><FONT SIZE=-2>Numero de Certificado<FONT></TD>\n")
  f.write( "<TD ALIGN=LEFT><FONT SIZE=-2>"+lXml["NoCer"]+"<FONT></TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR>\n")
  lCadOri=lCadOri.replace("Ñ","&Ntilde;") 
  lCadOri=lCadOri.replace("ñ","&ntilde;")
  f.write( "<TD COLSPAN=3><FONT SIZE=-2>"+lCadOri+"<FONT></TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR>\n")
  f.write( "<TD ALIGN=LEFT COLSPAN=3><FONT SIZE=-2>Sello digital<FONT></TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR>\n")
  f.write( "<TD COLSPAN=3><FONT SIZE=-2>"+lSello+"</FONT></TD>\n")
  f.write( "</TR>\n")
  f.write( "</TABLE>\n")
  f.write( "<HR>\n")
# Pagare
  f.write( "<TABLE BORDER=1 WIDTH=100%>\n" )
  f.write( "<TR>\n")
  f.write( "<TD><FONT SIZE=-1>POR ESTE PAGARE ME(NOS) COMPROMETO(EMOS) A PAGAR INCONDICIONALMENTE EL DIA <B>"+dVen+" DE \
"+mVen+" DE "+aVen+"</B> A LA ORDEN DE <B>PEDRO OVIEDO CHAVIRA SEPULVEDA</B>, EN SU DOMICILIO\
LA CANTIDAD DE "+plin+" MERCANCIAS RECIBIDAS DE CONFORMIDAD. SI ESTE PAGARE NO FUERA CUBIERTO A SU VENCIMIENTO \
CAUSARA UN INTERES MORATORIO DEL ..... % MENSUAL HASTA SU TOTAL LIQUIDACION.</FONT></TD>\n")
  f.write( "</TR>\n")
#  f.write( "<TR>\n")
#  f.write( "<TD ALIGN=RIGHT><FONT SIZE=-1>.................................<FONT></TD>\n")
#  f.write( "</TR>\n")
  f.write( "<TR>\n")
  f.write( "<TD ALIGN=RIGHT><FONT SIZE=-1>           F  I  R  M  A        .<FONT></TD>\n")
  f.write( "</TR>\n")
  f.write( "</TABLE>\n")
  f.write( "<TABLE BORDER=0 WIDTH=100%>\n" )
  (lanio,lmes,ldia)=lHoy.split('-')
  lTex=ficdef.fDatExt(lHoy,1)
  f.write( "<TR>\n")
  f.write( "<TD ALIGN=LEFT><FONT SIZE=-1>CHIHUAHUA, CHIH. a "+lTex+".<FONT></TD>\n")
  f.write( "<TD ALIGN=RIGHT><FONT SIZE=-1>Efectos fiscales al pago. Pago en una sola exhibicion<FONT></TD>\n")
  f.write( "</TR>\n")
  f.write( "</TABLE>\n")
# 
  f.write( "<TABLE BORDER=0 WIDTH=100%>\n" )
  f.write( "<TR>\n")
#  f.write( "<TD ALIGN=CENTER>Este documento es una impresi&oacute;n de un comprobante fiscal digital</TD>\n")
  f.write( "<TD ALIGN=CENTER>Este documento es una representaci&oacute;n impresa de un CFD</TD>\n")
  f.write( "</TR>\n")
  f.write( "</TABLE>\n")
  f.write( "<HR>\n")
# 
  f.write( "<TABLE BORDER=0 WIDTH=100%>\n" )
  f.write( "<TR>\n")
  f.write( "<TD ALIGN=CENTER>TODA DEVOLUCION CAUSA UN 10% POR FALSO MANEJO</TD>\n")
  f.write( "<TD ALIGN=CENTER>DEVOLUCION SOLO EL DIA DE LA VENTA, FORANEAS 5 DIAS DESPUES</TD>\n")
  f.write( "<TD ALIGN=CENTER>EN PARTES ELECTRICAS NO HAY GARANTIA NI DEVOLUCION</TD>\n")
  f.write( "<TD ALIGN=CENTER>SOLO ACEPTAMOS DEVOLUCIONES PRESENTANDO LA FACTURA</TD>\n")
  f.write( "</TR>\n")
  f.write( "</TABLE>\n")

  f.write( "</BODY>\n" )
  f.write( "</HTML>\n" )
  f.closed
  return

def fFacPDFSP(lfacact,lDirCfd):
  lfactura=lDirCfd+lfacact+".html"
  lfactpdf=lDirCfd+lfacact+".pdf"
  environ['HTMLDOC_NOCGI']='1'
  lok=system("/usr/bin/htmldoc --bottom 0.20in --top 0.20in --right 0.30in --left 0.30in --fontsize 8 --size letter --webpage -f "\
  +lfactpdf+" "+lfactura)
  return (lfactpdf)

def fFacPDF(lfacact,lDirCfd):
  lfactura=lDirCfd+lfacact+".html"
  lfactpdf=lDirCfd+lfacact+".pdf"
  lok=system("/usr/bin/recode utf8..iso-8859-1 "+lfactura)
  environ['HTMLDOC_NOCGI']='1'
  lok=system("/usr/bin/htmldoc --bottom 0.20in --top 0.20in --right 0.30in --left 0.30in --fontsize 8 --size letter --webpage -f "\
  +lfactpdf+" "+lfactura)
  lok=system("/usr/bin/recode iso-8859-1..utf8 "+lfactura)
  return (lfactpdf)

def fFacIns(lTipDoc,lfacact,lSerie,lConsec,lDirCfd,lCbb=0):

  if lCbb==1:
    fCbb=lDirCfd+lfacact+".png"
    fichero = open(path.realpath(fCbb), "rb")
    mCbb=fichero.read()
    fichero.closed
  else:
    mCbb='' 

  fcadori=lDirCfd+lfacact+".cadenaoriginal"
  fichero = open(path.realpath(fcadori), "r")
  mcadori=fichero.readline()
  fichero.closed

  fhtml=lDirCfd+lfacact+".html"
  fichero = open(path.realpath(fhtml), "r")
  mhtml=''
  for line in fichero:
    mhtml+=line
#  fichero.readline()
  mhtml.replace("'",'"')
  fichero.closed

  fsello=lDirCfd+lfacact+".sello"
  fichero = open(path.realpath(fsello), "r")
  msello=fichero.readline()
  fichero.closed

  ffacsel=lDirCfd+lfacact+"_sello.xml"
  fichero = open(path.realpath(ffacsel), "r")
  mfacsel=fichero.readline()
  fichero.closed

  fxml=lDirCfd+lfacact+".xml"
  fichero = open(path.realpath(fxml), "r")
  mxml=fichero.readline()
  fichero.closed

  if lCbb==1:
    bCbb = psycopg2.Binary(mCbb)
    cur.execute("INSERT INTO fnsatcfd(cftipdoc,cfserie,cfnumdoc,cfcadori,cfhtml,cfsello,cffacsel,cffacxml,cfcbb)\
      VALUES (%s,%s,%s,%s,%s,%s,%s,%s,%s)", \
      (lTipDoc,lSerie,lConsec,mcadori,mhtml,msello,mfacsel,mxml,bCbb) )
  else:
    mquery1="INSERT INTO fnsatcfd(cftipdoc,cfserie,cfnumdoc,cfcadori,cfhtml,cfsello,cffacsel,cffacxml)\
      VALUES ('"+lTipDoc+"','"+lSerie+"','"+lConsec+"','"+mcadori+"','"+mhtml+"','"+msello+"','"+mfacsel+"','"+mxml+"')"
    fSql(mquery1)

# cfdi
# Thu Oct 13 17:32:00 MDT 2011 CC
  lok=system("/bin/cp "+path.realpath(ffacsel)+" timbre")
#  lok=system("/usr/bin/scp "+path.realpath(ffacsel)+" Carlos@192.168.1.115:/cygdrive/c/ATEB/Timbrador/Entrada")
  
#  remove(path.realpath(fcadori))
#  remove(path.realpath(fhtml))
#  remove(path.realpath(fsello))
#  remove(path.realpath(ffacsel))
#  remove(path.realpath(fxml))

  return

def fFacActSell(lfacact,lfnd,lDirCfd):
  fcadori=lDirCfd+lfacact+".cadenaoriginal"
  fichero = open(path.realpath(fcadori), "r")
  mcadori=fichero.readline()
  fichero.closed

  fsello=lDirCfd+lfacact+".sello"
  fichero = open(path.realpath(fsello), "r")
  msello=fichero.readline()
  fichero.closed

  ffacsel=lDirCfd+lfacact+"_sello.xml"
  fichero = open(path.realpath(ffacsel), "r")
  mfacsel=fichero.readline()
  fichero.closed

  fxml=lDirCfd+lfacact+".xml"
  fichero = open(path.realpath(fxml), "r")
  mxml=fichero.readline()
  fichero.closed

  # mquery1="INSERT INTO fnsatcfd(cftipdoc,cfserie,cfnumdoc,cfcadori,cfhtml,cfsello,cffacsel,cffacxml)\
  #   VALUES ('"+lTipDoc+"','"+lSerie+"','"+lConsec+"','"+mcadori+"','"+mhtml+"','"+msello+"','"+mfacsel+"','"+mxml+"')"
  mquery1="UPDATE fnsatcfd SET cfcadori='"+mcadori+"', cfsello='"+msello+"', cffacsel='"+mfacsel+\
    "', cffacxml='"+mxml+"' WHERE cfserial="+lfnd

  fSql(mquery1)

# cfdi
# Thu Oct 13 17:32:00 MDT 2011 CC
  lok=system("/bin/cp "+path.realpath(ffacsel)+" timbre")
#  lok=system("/usr/bin/scp "+path.realpath(ffacsel)+" Carlos@192.168.1.115:/cygdrive/c/ATEB/Timbrador/Entrada")
  
  remove(path.realpath(fcadori))
  remove(path.realpath(fsello))
  remove(path.realpath(ffacsel))
  remove(path.realpath(fxml))


def fFacHTMLdb(lHoy,lfacact,lSello,lXml,lfnd,lDirCfd,lObserva,lAplicar,lTipDoc):
  """
  aXml["Cliente"]=lCliente=mov[0]
  aXml["SubTotal"]=lSubTotal=str(mov[1])
  aXml["TotImpue"]=lTotImpue=str(mov[2])
  aXml["TotTotal"]=lTotTotal=str(mov[3])
  aXml["lSerie"]=lserie=fol[0].strip()
  aXml["lActual"]=lactual=("%10d" % (fol[1])).strip()
  aXml["Aproba"]=laproba=fol[2].strip()
  aXml["AnioAp"]=lanioap=fol[3].strip()
  aXml["FecAct"]=mfecact=mov[0].strip()
  aXml["NoCer"]=mNoCer=mov[1].strip()
  aXml["EmiNom"]=mEmiNom=row[0].strip()
  aXml["EmiRfc"]=mEmiRfc=row[1].strip()
  aXml["EmiCal"]=mEmiCal=row[2].strip()
  aXml["EmiNoE"]=mEmiNoE=row[3].strip()
  aXml["EmiCol"]=mEmiCol=row[4].strip()
  aXml["EmiLoc"]=mEmiLoc=row[5].strip()
  adminXml["EmiMun"]=mEmiMun=row[6].strip()
  aXml["EmiEst"]=mEmiEst=row[7].strip()
  aXml["EmiPai"]=mEmiPai=row[8].strip()
  aXml["EmiCod"]=mEmiCod=row[9].strip()
  aXml["CliRfc"]=mCliRfc=cli[0].strip()
  aXml["CliNom"]=mCliNom=cli[1].strip()
  aXml["CliRfc"]=mCliRfc
  aXml["CliDom"]=mCliDom=cli[2].strip()
  aXml["CliCol"]=mCliCol=cli[3].strip()
  aXml["CliLoc"]=mCliLoc=cli[4].strip()
  aXml["CliMun"]=mCliMun=cli[5].strip()
  aXml["CliEst"]=mCliEst=cli[6].strip()
  aXml["CliPai"]=mCliPai=cli[7].strip()
  aXml["CliCoP"]=mCliCoP=cli[8].strip()
  aXml["CliPla"]=("%4d" % (cli[9])).strip()
  """
  mcadori=lDirCfd+lfacact+".cadenaoriginal"
  fichero = open(path.realpath(mcadori), "r")
  lCadOri=fichero.readline()
  fichero.closed
  lfactura=lDirCfd+lfacact+".html"
  f = open(path.realpath(lfactura), "w")
# Emisor
  f.write( "<HTML>\n" )
  f.write( "<BODY>\n" )
  f.write( "<CENTER>\n")
  f.write( "<TABLE BORDER=0 WIDTH=100%>\n" )
  f.write( "<TR>\n")
  f.write( "  <TD ALIGN=CENTER ROWSPAN=6> <IMG SRC=\"logo.jpg\"> </TD> \n")
  f.write( "  <TD ALIGN=CENTER>EMISOR</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR>\n")
  f.write( "  <TD ALIGN=CENTER>"+lXml["EmiNom"]+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR>\n")
  f.write( "  <TD ALIGN=CENTER>"+lXml["EmiCal"]+" "+lXml["EmiNoE"]+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR>\n")
  f.write( "  <TD ALIGN=CENTER>"+lXml["EmiCol"]+" "+lXml["EmiLoc"]+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR>\n")
  f.write( "  <TD ALIGN=CENTER>"+lXml["EmiMun"]+" "+lXml["EmiEst"]+" "+lXml["EmiPai"]+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR>\n")
  f.write( "  <TD ALIGN=CENTER>"+lXml["EmiCod"]+" RFC. "+lXml["EmiRfc"]+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "</TABLE>\n")
  f.write( "<HR>\n")
# Cliente
  f.write( "<TABLE BORDER=0 WIDTH=100%>\n" )
  f.write( "<TR>\n")
  f.write( "  <TD ALIGN=CENTER><B>CLIENTE</B></TD>\n")
  if lTipDoc=='DR':
    f.write( "  <TD ALIGN=CENTER>NOTA DE CREDITO "+lTipDoc+" <B>CREDITO</B></TD>\n")
  else:
    f.write( "  <TD ALIGN=CENTER>NOTA DE CREDITO "+lTipDoc+" <B>CONTADO</B></TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR>\n")
#  lTex=lXml["CliNom"]
  lTex=lXml["CliNom"].encode("utf-8")
  lTex=lTex.replace("Ñ","&Ntilde;") 
  lTex=lTex.replace("ñ","&ntilde;")
  f.write( "  <TD ALIGN=LEFT>"+lTex+"</TD>\n")
  f.write( "  <TD ALIGN=CENTER>"+lfacact+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR> \n")
  f.write( "  <TD ALIGN=LEFT>"+lXml["CliDom"]+"</TD>\n")
  f.write( "  <TD ALIGN=CENTER>FECHA</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR> \n")
  f.write( "  <TD ALIGN=LEFT>"+lXml["CliCol"]+" "+lXml["CliLoc"]+"</TD>\n")
  lTex=lXml["FecAct"].replace("T"," ")
  f.write( "  <TD ALIGN=CENTER>"+lTex+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR> \n")
  f.write( "  <TD ALIGN=LEFT>"+lXml["CliMun"]+" "+lXml["CliEst"]+" "+lXml["CliPai"]+"</TD>\n")
  f.write( "  <TD ALIGN=CENTER>A&ntilde;o y No. de Aprobaci&oacute;n de Folios</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR> \n")
  f.write( "  <TD ALIGN=LEFT>"+lXml["CliCoP"]+" RFC. "+lXml["CliRfc"]+"</TD>\n")
  f.write( "  <TD ALIGN=CENTER>"+lXml["AnioAp"]+" "+lXml["Aproba"]+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "</TABLE>\n")
  f.write( "<HR>\n")
# Movimientos
  movs=fFetchAll("SELECT di_entrada,'PZ',di_descrip,di_precio,di_importe,di_numpar,di_impuesto FROM "+lfnd)
  f.write( "<TABLE BORDER=0 WIDTH=100%>\n" )
  f.write( "<TR> \n")
  f.write( "<TH ALIGN=LEFT> Cantidad </TH>\n")
  f.write( "<TH ALIGN=LEFT> Unidad </TH>\n")
  f.write( "<TH ALIGN=LEFT> Parte </TH>\n")
  f.write( "<TH ALIGN=LEFT> Descripcion </TH>\n")
  f.write( "<TH ALIGN=RIGHT> Precio </TH>\n")
  f.write( "<TH ALIGN=RIGHT> Importe </TH>\n")
  f.write( "</TR> \n")
  for mov in movs:
    f.write( "<TR> \n")
    f.write( "<TD ALIGN=LEFT> "+str(mov[0])+"</TD>\n")
    f.write( "<TD ALIGN=LEFT> "+str(mov[1])+"</TD>\n")
    f.write( "<TD ALIGN=LEFT> "+str(mov[5])+"</TD>\n")
    f.write( "<TD ALIGN=LEFT> "+str(mov[2])+"</TD>\n")
    lPre="%12.2f" % (mov[3])
    f.write( "<TD ALIGN=RIGHT> "+lPre.strip()+"</TD>\n")
    lImp="%12.2f" % (mov[4])
    if lXml["CliRfc"]=="XAXX010101000":
      lImp="%12.2f" % (float(mov[4])+float(mov[6]))
    f.write( "<TD ALIGN=RIGHT> "+lImp.strip()+"</TD>\n")
    f.write( "</TR> \n")
  f.write( "<TR>\n")
  f.write( "<TD>&nbsp;</TD>\n") 
  f.write( "<TD>&nbsp;</TD>\n") 
  f.write( "<TD>&nbsp;</TD>\n") 
  f.write( "<TD>&nbsp;</TD>\n") 
  f.write( "<TD ALIGN=RIGHT>SUBTOTAL</TD>\n")
  if lXml["CliRfc"]=="XAXX010101000":
    f.write( "<TD ALIGN=RIGHT>"+lXml["TotTotal"]+"</TD>\n")
  else:
    f.write( "<TD ALIGN=RIGHT>"+lXml["SubTotal"]+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR>\n")
  plin=ficdef.fPesos(float(lXml["TotTotal"]))
  f.write( "<TD COLSPAN=4 ROWSPAN=4 ALIGN=LEFT>Importe con letra: "+plin+"</TD>\n")
  f.write( "<TD ALIGN=RIGHT>16% IVA</TD>\n")
  if lXml["CliRfc"]=="XAXX010101000":
    f.write( "<TD ALIGN=RIGHT>&nbsp;</TD>\n")
  else:
    f.write( "<TD ALIGN=RIGHT>"+lXml["TotImpue"]+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR>\n")
  f.write( "<TD ALIGN=RIGHT>TOTAL</TD>\n")
  f.write( "<TD ALIGN=RIGHT>"+lXml["TotTotal"]+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "</TABLE>\n")
  f.write( "<HR>\n")
# Cadena Original, Sello digital
  f.write( "<TABLE BORDER=0 WIDTH=100%>\n" )
  f.write( "<TR>\n")
  f.write( "<TD ALIGN=LEFT><FONT SIZE=-2>Cadena original<FONT></TD>\n")
  f.write( "<TD ALIGN=RIGHT><FONT SIZE=-2>Numero de Certificado<FONT></TD>\n")
  f.write( "<TD ALIGN=LEFT><FONT SIZE=-2>"+lXml["NoCer"]+"<FONT></TD>\n")
  f.write( "<TD ALIGN=RIGHT><FONT SIZE=-2>Metodo de Pago:<FONT></TD>\n")
  f.write( "<TD ALIGN=LEFT><FONT SIZE=-2>"+lXml["CliFpa"]+"<FONT></TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR>\n")
  lCadOri=lCadOri.replace("Ñ","&Ntilde;") 
  lCadOri=lCadOri.replace("ñ","&ntilde;")
  f.write( "<TD COLSPAN=3><FONT SIZE=-2>"+lCadOri+"<FONT></TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR>\n")
  f.write( "<TD ALIGN=LEFT COLSPAN=3><FONT SIZE=-2>Sello digital<FONT></TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR>\n")
  f.write( "<TD COLSPAN=3><FONT SIZE=-2>"+lSello+"</FONT></TD>\n")
  f.write( "</TR>\n")
  f.write( "</TABLE>\n")
  f.write( "<HR>\n")
# Observaciones y aplicar
  f.write( "<TABLE BORDER=0 WIDTH=100%>\n" )
  f.write( "<TR>\n")
  f.write( "<TD><FONT>"+lAplicar+" "+lObserva+"</FONT></TD>\n")
  f.write( "</TR>\n")
  (lanio,lmes,ldia)=lHoy.split('-')
  lTex=ficdef.fDatExt(lHoy,1)
  f.write( "<TR>\n")
  f.write( "<TD ALIGN=RIGHT>CHIHUAHUA, CHIH. a "+lTex+".</TD>\n")
  f.write( "</TR>\n")
  f.write( "</TABLE>\n")
  f.write( "<HR>\n")
# 
  f.write( "<TABLE BORDER=0 WIDTH=100%>\n" )
  f.write( "<TR>\n")
#  f.write( "<TD ALIGN=CENTER>Este documento es una impresi&oacute;n de un comprobante fiscal digital</TD>\n")
  f.write( "<TD ALIGN=CENTER>Este documento es una representaci&oacute;n impresa de un CFD</TD>\n")
  f.write( "</TR>\n")
  f.write( "</TABLE>\n")

  f.write( "</BODY>\n" )
  f.write( "</HTML>\n" )
  f.closed
  return

def fFacHTMLdbHP(lHoy,lfacact,lSello,lXml,lfnd,lDirCfd,lObserva,lAplicar,lTipDoc):
  """
  aXml["Cliente"]=lCliente=mov[0]
  aXml["SubTotal"]=lSubTotal=str(mov[1])
  aXml["TotImpue"]=lTotImpue=str(mov[2])
  aXml["TotTotal"]=lTotTotal=str(mov[3])
  aXml["lSerie"]=lserie=fol[0].strip()
  aXml["lActual"]=lactual=("%10d" % (fol[1])).strip()
  aXml["Aproba"]=laproba=fol[2].strip()
  aXml["AnioAp"]=lanioap=fol[3].strip()
  aXml["FecAct"]=mfecact=mov[0].strip()
  aXml["NoCer"]=mNoCer=mov[1].strip()
  aXml["EmiNom"]=mEmiNom=row[0].strip()
  aXml["EmiRfc"]=mEmiRfc=row[1].strip()
  aXml["EmiCal"]=mEmiCal=row[2].strip()
  aXml["EmiNoE"]=mEmiNoE=row[3].strip()
  aXml["EmiCol"]=mEmiCol=row[4].strip()
  aXml["EmiLoc"]=mEmiLoc=row[5].strip()
  adminXml["EmiMun"]=mEmiMun=row[6].strip()
  aXml["EmiEst"]=mEmiEst=row[7].strip()
  aXml["EmiPai"]=mEmiPai=row[8].strip()
  aXml["EmiCod"]=mEmiCod=row[9].strip()
  aXml["CliRfc"]=mCliRfc=cli[0].strip()
  aXml["CliNom"]=mCliNom=cli[1].strip()
  aXml["CliRfc"]=mCliRfc
  aXml["CliDom"]=mCliDom=cli[2].strip()
  aXml["CliCol"]=mCliCol=cli[3].strip()
  aXml["CliLoc"]=mCliLoc=cli[4].strip()
  aXml["CliMun"]=mCliMun=cli[5].strip()
  aXml["CliEst"]=mCliEst=cli[6].strip()
  aXml["CliPai"]=mCliPai=cli[7].strip()
  aXml["CliCoP"]=mCliCoP=cli[8].strip()
  aXml["CliPla"]=("%4d" % (cli[9])).strip()
  """
  mcadori=lDirCfd+lfacact+".cadenaoriginal"
  fichero = open(path.realpath(mcadori), "r")
  lCadOri=fichero.readline()
  fichero.closed
  lfactura=lDirCfd+lfacact+".html"
  f = open(path.realpath(lfactura), "w")
# Emisor
  f.write( "<HTML>\n" )
  f.write( "<BODY>\n" )
  f.write( "<CENTER>\n")
  f.write( "<TABLE BORDER=0 WIDTH=100%>\n" )
# Mon Apr 25 12:38:32 MDT 2011 agregar imagen 
  f.write( "<TR>\n")
  f.write( "  <TD ALIGN=CENTER ROWSPAN=7> <IMG SRC=\"logo.jpg\" width=\"180\" height=\"110\" border=\"0\"> </TD> \n")
  f.write( "  <TD ALIGN=CENTER>EMISOR</TD>\n")
  f.write( "</TR>\n")

#  f.write( "<TR>\n")
#  f.write( "  <TD ALIGN=CENTER ROWSPAN=6> <IMG SRC=\"logo.jpg\"> </TD> \n")
#  f.write( "  <TD ALIGN=CENTER>EMISOR</TD>\n")
#  f.write( "</TR>\n")

  f.write( "<TR>\n")
  f.write( "  <TD ALIGN=CENTER>"+lXml["EmiNom"]+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR>\n")
  f.write( "  <TD ALIGN=CENTER>"+lXml["EmiCal"]+" "+lXml["EmiNoE"]+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR>\n")
  f.write( "  <TD ALIGN=CENTER>"+lXml["EmiCol"]+" "+lXml["EmiLoc"]+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR>\n")
  f.write( "  <TD ALIGN=CENTER>"+lXml["EmiMun"]+" "+lXml["EmiEst"]+" "+lXml["EmiPai"]+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR>\n")
  f.write( "  <TD ALIGN=CENTER>"+lXml["EmiCod"]+" RFC. "+lXml["EmiRfc"]+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "</TABLE>\n")
  f.write( "<HR>\n")
# Cliente
  f.write( "<TABLE BORDER=0 WIDTH=100%>\n" )
  f.write( "<TR>\n")
  f.write( "  <TD ALIGN=CENTER><B>CLIENTE</B></TD>\n")
  if lTipDoc=='DR':
    f.write( "  <TD ALIGN=CENTER>NOTA DE CREDITO "+lTipDoc+" <B>CREDITO</B></TD>\n")
  else:
    f.write( "  <TD ALIGN=CENTER>NOTA DE CREDITO "+lTipDoc+" <B>CONTADO</B></TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR>\n")
  lTex=lXml["CliNom"]
  lTex=lTex.replace("Ñ","&Ntilde;") 
  lTex=lTex.replace("ñ","&ntilde;")
  f.write( "  <TD ALIGN=LEFT>"+lTex+"</TD>\n")
  f.write( "  <TD ALIGN=CENTER>"+lfacact+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR> \n")
  f.write( "  <TD ALIGN=LEFT>"+lXml["CliDom"]+"</TD>\n")
  f.write( "  <TD ALIGN=CENTER>FECHA</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR> \n")
  f.write( "  <TD ALIGN=LEFT>"+lXml["CliCol"]+" "+lXml["CliLoc"]+"</TD>\n")
  lTex=lXml["FecAct"].replace("T"," ")
  f.write( "  <TD ALIGN=CENTER>"+lTex+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR> \n")
  f.write( "  <TD ALIGN=LEFT>"+lXml["CliMun"]+" "+lXml["CliEst"]+" "+lXml["CliPai"]+"</TD>\n")
  f.write( "  <TD ALIGN=CENTER>A&ntilde;o y No. de Aprobaci&oacute;n de Folios</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR> \n")
  f.write( "  <TD ALIGN=LEFT>"+lXml["CliCoP"]+" RFC. "+lXml["CliRfc"]+"</TD>\n")
  f.write( "  <TD ALIGN=CENTER>"+lXml["AnioAp"]+" "+lXml["Aproba"]+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "</TABLE>\n")
  f.write( "<HR>\n")
# Movimientos
  movs=fFetchAll("SELECT di_entrada,'PZ',di_descrip,di_precio,di_importe,di_numpar,di_impuesto FROM "+lfnd)
  f.write( "<TABLE BORDER=0 WIDTH=100%>\n" )
  f.write( "<TR> \n")
  f.write( "<TH ALIGN=LEFT> Cantidad </TH>\n")
  f.write( "<TH ALIGN=LEFT> Unidad </TH>\n")
  f.write( "<TH ALIGN=LEFT> Parte </TH>\n")
  f.write( "<TH ALIGN=LEFT> Descripcion </TH>\n")
  f.write( "<TH ALIGN=RIGHT> Precio </TH>\n")
  f.write( "<TH ALIGN=RIGHT> Importe </TH>\n")
  f.write( "</TR> \n")
  for mov in movs:
    f.write( "<TR> \n")
    f.write( "<TD ALIGN=LEFT> "+str(mov[0])+"</TD>\n")
    f.write( "<TD ALIGN=LEFT> "+str(mov[1])+"</TD>\n")
    f.write( "<TD ALIGN=LEFT> "+str(mov[5])+"</TD>\n")
    f.write( "<TD ALIGN=LEFT> "+str(mov[2])+"</TD>\n")
    lPre="%12.2f" % (mov[3])
    f.write( "<TD ALIGN=RIGHT> "+lPre.strip()+"</TD>\n")
    lImp="%12.2f" % (mov[4])
    if lXml["CliRfc"]=="XAXX010101000":
      lImp="%12.2f" % (float(mov[4])+float(mov[6]))
    f.write( "<TD ALIGN=RIGHT> "+lImp.strip()+"</TD>\n")
    f.write( "</TR> \n")
  f.write( "<TR>\n")
  f.write( "<TD>&nbsp;</TD>\n") 
  f.write( "<TD>&nbsp;</TD>\n") 
  f.write( "<TD>&nbsp;</TD>\n") 
  f.write( "<TD>&nbsp;</TD>\n") 
  f.write( "<TD ALIGN=RIGHT>SUBTOTAL</TD>\n")
  if lXml["CliRfc"]=="XAXX010101000":
    f.write( "<TD ALIGN=RIGHT>"+lXml["TotTotal"]+"</TD>\n")
  else:
    f.write( "<TD ALIGN=RIGHT>"+lXml["SubTotal"]+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR>\n")
  plin=ficdef.fPesos(float(lXml["TotTotal"]))
  f.write( "<TD COLSPAN=3 ROWSPAN=4 ALIGN=LEFT>Importe con letra: "+plin+"</TD>\n")
  f.write( "<TD ALIGN=RIGHT>16% IVA</TD>\n")
  if lXml["CliRfc"]=="XAXX010101000":
    f.write( "<TD ALIGN=RIGHT>&nbsp;</TD>\n")
  else:
    f.write( "<TD ALIGN=RIGHT>"+lXml["TotImpue"]+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR>\n")
  f.write( "<TD ALIGN=RIGHT>TOTAL</TD>\n")
  f.write( "<TD ALIGN=RIGHT>"+lXml["TotTotal"]+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "</TABLE>\n")
  f.write( "<HR>\n")
# Cadena Original, Sello digital
  f.write( "<TABLE BORDER=0 WIDTH=100%>\n" )
  f.write( "<TR>\n")
  f.write( "<TD ALIGN=LEFT><FONT SIZE=-2>Cadena original<FONT></TD>\n")
  f.write( "<TD ALIGN=RIGHT><FONT SIZE=-2>Numero de Certificado<FONT></TD>\n")
  f.write( "<TD ALIGN=LEFT><FONT SIZE=-2>"+lXml["NoCer"]+"<FONT></TD>\n")
  f.write( "<TD ALIGN=RIGHT><FONT SIZE=-2>Metodo de Pago:<FONT></TD>\n")
  f.write( "<TD ALIGN=LEFT><FONT SIZE=-2>"+lXml["CliFpa"]+"<FONT></TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR>\n")
  lCadOri=lCadOri.replace("Ñ","&Ntilde;") 
  lCadOri=lCadOri.replace("ñ","&ntilde;")
  f.write( "<TD COLSPAN=3><FONT SIZE=-2>"+lCadOri+"<FONT></TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR>\n")
  f.write( "<TD ALIGN=LEFT COLSPAN=3><FONT SIZE=-2>Sello digital<FONT></TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR>\n")
  f.write( "<TD COLSPAN=3><FONT SIZE=-2>"+lSello+"</FONT></TD>\n")
  f.write( "</TR>\n")
  f.write( "</TABLE>\n")
  f.write( "<HR>\n")
# Observaciones y aplicar
  f.write( "<TABLE BORDER=0 WIDTH=100%>\n" )
  f.write( "<TR>\n")
  f.write( "<TD><FONT>"+lAplicar+" "+lObserva+"</FONT></TD>\n")
  f.write( "</TR>\n")
  (lanio,lmes,ldia)=lHoy.split('-')
  lTex=ficdef.fDatExt(lHoy,1)
  f.write( "<TR>\n")
  f.write( "<TD ALIGN=RIGHT>CHIHUAHUA, CHIH. a "+lTex+".</TD>\n")
  f.write( "</TR>\n")
  f.write( "</TABLE>\n")
  f.write( "<HR>\n")
# 
  f.write( "<TABLE BORDER=0 WIDTH=100%>\n" )
  f.write( "<TR>\n")
#  f.write( "<TD ALIGN=CENTER>Este documento es una impresi&oacute;n de un comprobante fiscal digital</TD>\n")
  f.write( "<TD ALIGN=CENTER>Este documento es una representaci&oacute;n impresa de un CFD</TD>\n")
  f.write( "</TR>\n")
  f.write( "</TABLE>\n")

  f.write( "</BODY>\n" )
  f.write( "</HTML>\n" )
  f.closed
  return

# Ticket de Contado
def fTicHTML_LOGO(lHoy,lfacact,lSello,lXml,lfnd,lDirCfd,TipDoc):
  """
  aXml["Cliente"]=lCliente=mov[0]
  aXml["SubTotal"]=lSubTotal=str(mov[1])
  aXml["TotImpue"]=lTotImpue=str(mov[2])
  aXml["TotTotal"]=lTotTotal=str(mov[3])
  aXml["lSerie"]=lserie=fol[0].strip()
  aXml["lActual"]=lactual=("%10d" % (fol[1])).strip()
  aXml["Aproba"]=laproba=fol[2].strip()
  aXml["AnioAp"]=lanioap=fol[3].strip()
  aXml["FecAct"]=mfecact=mov[0].strip()
  aXml["NoCer"]=mNoCer=mov[1].strip()
  aXml["EmiNom"]=mEmiNom=row[0].strip()
  aXml["EmiRfc"]=mEmiRfc=row[1].strip()
  aXml["EmiCal"]=mEmiCal=row[2].strip()
  aXml["EmiNoE"]=mEmiNoE=row[3].strip()
  aXml["EmiCol"]=mEmiCol=row[4].strip()
  aXml["EmiLoc"]=mEmiLoc=row[5].strip()
  aXml["EmiMun"]=mEmiMun=row[6].strip()
  aXml["EmiEst"]=mEmiEst=row[7].strip()
  aXml["EmiPai"]=mEmiPai=row[8].strip()
  aXml["EmiCod"]=mEmiCod=row[9].strip()
  aXml["CliRfc"]=mCliRfc=cli[0].strip()
  aXml["CliNom"]=mCliNom=cli[1].strip()
  aXml["CliRfc"]=mCliRfc
  aXml["CliDom"]=mCliDom=cli[2].strip()
  aXml["CliCol"]=mCliCol=cli[3].strip()
  aXml["CliLoc"]=mCliLoc=cli[4].strip()
  aXml["CliMun"]=mCliMun=cli[5].strip()
  aXml["CliEst"]=mCliEst=cli[6].strip()
  aXml["CliPai"]=mCliPai=cli[7].strip()
  aXml["CliCoP"]=mCliCoP=cli[8].strip()
  aXml["CliPla"]=("%4d" % (cli[9])).strip()
  """
  mcadori=lDirCfd+lfacact+".cadenaoriginal"
  fichero = open(path.realpath(mcadori), "r")
  lCadOri=fichero.readline()
  fichero.closed
  lfactura=lDirCfd+lfacact+".html"
  f = open(path.realpath(lfactura), "w")
# Emisor
  f.write( "<HTML>\n" )
  f.write( "<BODY>\n" )
  f.write( "<CENTER>\n")
  f.write( "<TABLE BORDER=0 WIDTH=100%>\n" )
  f.write( "<TR>\n")
  f.write( "  <TD ALIGN=CENTER <IMG SRC=\"logoCha1.jpg\"> </TD> \n")
  f.write( "</TR>\n")
  f.write( "<TR>\n")
  f.write( "  <TD ALIGN=CENTER <IMG SRC=\"logoSuc.jpg\"> </TD> \n")
  f.write( "</TR>\n")
  f.write( "<TR>\n")
  f.write( "  <TD ALIGN=CENTER>EMISOR</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR>\n")
  f.write( "  <TD ALIGN=CENTER>"+lXml["EmiNom"]+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR>\n")
  f.write( "  <TD ALIGN=CENTER>"+lXml["EmiCal"]+" "+lXml["EmiNoE"]+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR>\n")
  f.write( "  <TD ALIGN=CENTER>"+lXml["EmiCol"]+" "+lXml["EmiLoc"]+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR>\n")
  f.write( "  <TD ALIGN=CENTER>"+lXml["EmiMun"]+" "+lXml["EmiEst"]+" "+lXml["EmiPai"]+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR>\n")
  f.write( "  <TD ALIGN=CENTER>"+lXml["EmiCod"]+" RFC. "+lXml["EmiRfc"]+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "</TABLE>\n")
  f.write( "<HR>\n")

# 
  f.write( "<TABLE BORDER=0 WIDTH=100%>\n" )
  f.write( "<TR>\n")
  f.write( "  <TD ALIGN=CENTER><B>FOLIO</B></TD>\n")
  f.write( "  <TD ALIGN=CENTER>"+lfacact+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR>\n")
  f.write( "  <TD ALIGN=CENTER>FECHA</TD>\n")
  lTex=lXml["FecAct"].replace("T"," ")
  f.write( "  <TD ALIGN=CENTER>"+lTex+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR>\n")
  f.write( "  <TD ALIGN=CENTER>A&ntilde;o y No. de Aprobaci&oacute;n de Folios</TD>\n")
  f.write( "  <TD ALIGN=CENTER>"+lXml["AnioAp"]+" "+lXml["Aproba"]+"</TD>\n")
  f.write( "</TR>\n")

# Cliente
  f.write( "<TABLE BORDER=0 WIDTH=100%>\n" )
  f.write( "<TR>\n")
  f.write( "  <TD ALIGN=CENTER><B>CLIENTE</B></TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR>\n")
  lTex=lXml["CliNom"]
  lTex=lTex.replace("Ñ","&Ntilde;") 
  lTex=lTex.replace("ñ","&ntilde;")
  f.write( "  <TD ALIGN=LEFT>"+lTex+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR> \n")
  f.write( "  <TD ALIGN=LEFT>"+lXml["CliDom"]+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR> \n")
  f.write( "  <TD ALIGN=LEFT>"+lXml["CliCol"]+" "+lXml["CliLoc"]+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR> \n")
  f.write( "  <TD ALIGN=LEFT>"+lXml["CliMun"]+" "+lXml["CliEst"]+" "+lXml["CliPai"]+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR> \n")
  f.write( "  <TD ALIGN=LEFT>"+lXml["CliCoP"]+" RFC. "+lXml["CliRfc"]+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "</TABLE>\n")
  f.write( "<HR>\n")
# Movimientos
  movs=fFetchAll("SELECT fc_salida,fc_unimed,fc_descrip,fc_precio,fc_importe,(fc_fecha + fc_plazo),fc_numpar,fc_impuesto FROM fnfact WHERE fc_numdoc='"+lfnd+"';")
  f.write( "<TABLE BORDER=0 WIDTH=100%>\n" )
  f.write( "<TR> \n")
  f.write( "<TH ALIGN=LEFT> Cantidad </TH>\n")
  f.write( "<TH ALIGN=LEFT> Parte </TH>\n")
#  f.write( "<TH ALIGN=LEFT> Descripcion </TH>\n")
  f.write( "<TH ALIGN=RIGHT> Precio </TH>\n")
  f.write( "<TH ALIGN=RIGHT> Importe </TH>\n")
  f.write( "</TR> \n")
  for mov in movs:
    f.write( "<TR> \n")
    f.write( "<TD ALIGN=LEFT> "+str(mov[0])+"</TD>\n")
    f.write( "<TD ALIGN=LEFT> "+str(mov[6])+"</TD>\n")
#    f.write( "<TD ALIGN=LEFT> "+str(mov[2])+"</TD>\n")
    lPre="%12.2f" % (mov[3])
    f.write( "<TD ALIGN=RIGHT> "+lPre.strip()+"</TD>\n")
    lImp="%12.2f" % (mov[4])
    if lXml["CliRfc"]=="XAXX010101000":
      lImp="%12.2f" % (mov[4]+mov[7])
      
    f.write( "<TD ALIGN=RIGHT> "+lImp.strip()+"</TD>\n")
    f.write( "</TR> \n")
    dVence = mov[5].strftime("%Y-%m-%d")
    (aVen, mVen, dVen) = dVence.split("-")
  mVen=ficdef.fDatExt(dVence,3)
  f.write( "</TABLE>\n")
  f.write( "<TABLE BORDER=0 WIDTH=100%>\n" )
  f.write( "<TR>\n")
  f.write( "<TD ALIGN=RIGHT>SUBTOTAL</TD>\n")
  if lXml["CliRfc"]=="XAXX010101000":
    f.write( "<TD ALIGN=RIGHT>"+lXml["TotTotal"]+"</TD>\n")
  else:
    f.write( "<TD ALIGN=RIGHT>"+lXml["SubTotal"]+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR>\n")
  f.write( "<TD ALIGN=RIGHT>16% IVA</TD>\n")
  if lXml["CliRfc"]=="XAXX010101000":
    f.write( "<TD ALIGN=RIGHT>&nbsp;</TD>\n")
  else:
    f.write( "<TD ALIGN=RIGHT>"+lXml["TotImpue"]+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR>\n")
  f.write( "<TD ALIGN=RIGHT>TOTAL</TD>\n")
  f.write( "<TD ALIGN=RIGHT>"+lXml["TotTotal"]+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "</TABLE>\n")
  f.write( "<TABLE BORDER=0 WIDTH=100%>\n" )
  f.write( "<TR>\n")
  plin=ficdef.fPesos(float(lXml["TotTotal"]))
  f.write( "<TD COLSPAN=3 ROWSPAN=4 ALIGN=LEFT>Importe con letra: "+plin+"</TD>\n")
  f.write( "</TABLE>\n")
  f.write( "<HR>\n")
# Cadena Original, Sello digital
  f.write( "<TABLE BORDER=0 WIDTH=100%>\n" )
  f.write( "<TR>\n")
  f.write( "<TD ALIGN=LEFT><FONT SIZE=-2>Cadena original<FONT></TD>\n")
  f.write( "<TD ALIGN=RIGHT><FONT SIZE=-2>Numero de Certificado<FONT></TD>\n")
  f.write( "<TD ALIGN=LEFT><FONT SIZE=-2>"+lXml["NoCer"]+"<FONT></TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR>\n")
  lCadOri=lCadOri.replace("Ñ","&Ntilde;") 
  lCadOri=lCadOri.replace("ñ","&ntilde;")
  f.write( "<TD COLSPAN=3><FONT SIZE=-2>"+lCadOri+"<FONT></TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR>\n")
  f.write( "<TD ALIGN=LEFT COLSPAN=3><FONT SIZE=-2>Sello digital<FONT></TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR>\n")
  f.write( "<TD COLSPAN=3><FONT SIZE=-2>"+lSello+"</FONT></TD>\n")
  f.write( "</TR>\n")
  f.write( "</TABLE>\n")
  f.write( "<HR>\n")
  f.write( "<TABLE BORDER=0 WIDTH=100%>\n" )
# Fecha de hoy
  (lanio,lmes,ldia)=lHoy.split('-')
  lTex=ficdef.fDatExt(lHoy,1)
  f.write( "<TR>\n")
  f.write( "<TD ALIGN=RIGHT>CHIHUAHUA, CHIH. a "+lTex+".</TD>\n")
  f.write( "</TR>\n")
  f.write( "</TABLE>\n")
  f.write( "<HR>\n")
# 
  f.write( "<TABLE BORDER=0 WIDTH=100%>\n" )
  f.write( "<TR>\n")
#  f.write( "<TD ALIGN=CENTER>Este documento es una impresi&oacute;n de un comprobante fiscal digital</TD>\n")
  f.write( "<TD ALIGN=CENTER>Este documento es una representaci&oacute;n impresa de un CFD</TD>\n")
  f.write( "</TR>\n")
  f.write( "</TABLE>\n")

  f.write( "</BODY>\n" )
  f.write( "</HTML>\n" )
  f.closed
  return

def fTicPDF(lfacact,lDirCfd):
  lfactura=lDirCfd+lfacact+".html"
  lfactpdf=lDirCfd+lfacact+".html"
#  environ['HTMLDOC_NOCGI']='1'
#  lok=system("/usr/bin/htmldoc --bottom 0.20in --top 0.20in --right 0.20in --left 0.20in --fontsize 1 --size 75x279mm --continuous --webpage -f "\
#  +lfactpdf+" "+lfactura)
  return (lfactpdf)

def fTicHTMLtxt(lHoy,lfacact,lSello,lXml,lfnd,lDirCfd,lTipDoc):
  n="\n"
#     # Codigos para Impresas Tickets
  ESC  = chr(27)
  NoC1 = chr(77)
  NoC2 = chr(100)
  NoC3 = chr(29)
  NoC4 = chr(86)

  mcadori=lDirCfd+lfacact+".cadenaoriginal"
  fichero = open(path.realpath(mcadori), "r")
  lCadOri=fichero.readline()
  fichero.closed
  lfactura=lDirCfd+lfacact+".html"
  f = open(path.realpath(lfactura), "w")
# Emisor
  f.write( center("EMISOR",40)+n)
  f.write( center(lXml["EmiNom"],40)+n)
  f.write( center(lXml["EmiCal"]+" "+lXml["EmiNoE"],40)+n)
  f.write( center(lXml["EmiCol"]+" "+lXml["EmiLoc"],40)+n)
  f.write( center(lXml["EmiMun"]+" "+lXml["EmiEst"]+" "+lXml["EmiPai"],40)+n)
  f.write( center(lXml["EmiCod"]+" RFC. "+lXml["EmiRfc"],40)+n)
# 
  lLin="FOLIO : "+lfacact
  f.write( lLin+n )
#  lLin=center("FECHA",40)
#  f.write( lLin+n )
  lLin="FECHA : "+lXml["FecAct"].replace("T"," ")
  f.write( lLin+n )
  lLin="Año y No. de Aprobación de Folios"
  f.write( lLin+n )
  lLin=lXml["AnioAp"]+" "+lXml["Aproba"]
  f.write( lLin+n )

# Cliente
  lLin=center("CLIENTE",40)
  f.write( lLin+n )
  lTex=lXml["CliNom"]
  lTex=lTex.replace("Ñ","&Ntilde;") 
  lTex=lTex.replace("ñ","&ntilde;")
  lLin=lTex
  f.write( lLin+n )
  lLin=lXml["CliDom"]
  f.write( lLin+n )
  lLin=lXml["CliCol"]+" "+lXml["CliLoc"]
  f.write( lLin+n )
  lLin=lXml["CliMun"]+" "+lXml["CliEst"]+" "+lXml["CliPai"]
  f.write( lLin+n )
  lLin=lXml["CliCoP"]+" RFC. "+lXml["CliRfc"]
  f.write( lLin+n )

  if lTipDoc=='FR':
    lLin="C R E D I T O"
  else:
    lLin="C O N T A D O"
  f.write( center(lLin,40)+n )

# Movimientos
#  movs=fFetchAll("SELECT fc_salida,fc_unimed,fc_descrip,fc_precio,fc_importe,(fc_fecha + fc_plazo),fc_numpar,fc_impuesto FROM fnfact WHERE fc_numdoc='"+lfnd+"';")
  movs=fFetchAll("SELECT fc_salida,fc_unimed,fc_descrip,fc_precio,fc_importe,(fc_fecha + fc_plazo),fc_numpar,fc_impuesto, \
    fc_clipro,fc_numpre,fc_vende,ve_nombre,fc_numdoc FROM fnfact, fnvend WHERE fc_numdoc='"+lfnd+"' AND fc_vende=ve_clave;")
#                1         2         3         4
#       1234567890123456789012345678901234567890
  lLin="Cant.   P a r t e      Precio   Importe"
  f.write( lLin+n )

  for mov in movs:
    lPre=mov[3]
    lImp=mov[4]
    if lXml["CliRfc"]=="XAXX010101000":
      lImp=mov[4]+mov[7]
    lLin="%4i %15s %8.2f %10.2f" % (mov[0],mov[6],lPre,lImp)
    f.write( lLin+n )
    lLin="%-40s" % (mov[2])
    f.write( lLin+n )
    dVence = mov[5].strftime("%Y-%m-%d")
    (aVen, mVen, dVen) = dVence.split("-")
    mCli=mov[8]
    mNpr=mov[9]
    mVee=mov[10]
    mVno=mov[11]
    mTik=lfnd

  mVen=ficdef.fDatExt(dVence,3)

  if lXml["CliRfc"]=="XAXX010101000":
    """ revisar si imprimir esto en ticket contado sin RF """
#    lLin="%26s  %12.2f" % ("SubTotal",float(lXml["TotTotal"]))
#    f.write(lLin+n)
  else:
    lLin="%26s  %12.2f" % ("SubTotal",float(lXml["SubTotal"]))
    f.write(lLin+n)

  if lXml["CliRfc"]=="XAXX010101000":
    f.write( n)
  else:
    lLin="%26s  %12.2f" % ("Iva",float(lXml["TotImpue"]))
    f.write(lLin+n)

  lLin="%26s  %12.2f" % ("Total",float(lXml["TotTotal"]))
  f.write(lLin+n)

  lLin="%s %s %s %s %s" % (mCli, mNpr, mTik, mVee, mVno)
  f.write(lLin+n)

  lLin="Importe con letra: "
  f.write(lLin+n)
  lLin=ficdef.fPesos(float(lXml["TotTotal"]))
  f.write(lLin+n)

# Cadena Original, Sello digital
  lLin="Numero de Certificado "+lXml["NoCer"]
  f.write(lLin+n)
  lLin="Cadena Original"
  f.write(lLin+n)
  lLin=lCadOri
  f.write(lLin+n)
  lLin="Sello"
  f.write(lLin+n)
  lLin=lSello
  f.write(lLin+n)

# Fecha de hoy
  (lanio,lmes,ldia)=lHoy.split('-')
  lTex=ficdef.fDatExt(lHoy,1)
  lLin="CHIHUAHUA, CHIH. a "+lTex+"."
  f.write(lLin+n)
# 
#  lLin="Este documento es una impresión de un comprobante fiscal digital"
  lLin="Este documento es una representaci&oacute;n impresa de un CFD"
  f.write( lLin+n )
  f.write("."+n)

#  1234567890123456789012345678901234567890
  lLin="TODA DEVOLUCION CAUSA UN 10% POR FALSO MANEJO"
  f.write( lLin+n )
  lLin="DEVOLUCION SOLO EL DIA DE LA VENTA, FORANEAS 5 DIAS DESPUES"
  f.write( lLin+n )
  lLin="EN PARTES ELECTRICAS NO HAY GARANTIA NI DEVOLUCION"
  f.write( lLin+n )
  lLin="SOLO ACEPTAMOS DEVOLUCIONES PRESENTANDO LA FACTURA"
  f.write( lLin+n )

  f.write("."+n)
  f.write("."+n)
  f.write("."+n)
  f.write("."+n)

  f.write(NoC3+NoC4+"0")

  f.closed

  return

def fRecode(lfacact,lDirCfd):
  lfactura=lDirCfd+lfacact+".html"
  lok=system("/usr/bin/recode utf8..msdos "+lfactura)
  return (lfactura)

def fFacHTMLSP(lHoy,lfacact,lSello,lXml,lfnd,lDirCfd,lTipDoc,lEsOriginal):
  mcadori=lDirCfd+lfacact+".cadenaoriginal"
  fichero = open(path.realpath(mcadori), "r")
  lCadOri=fichero.readline()
  fichero.closed
  lfactura=lDirCfd+lfacact+".html"
  f = open(path.realpath(lfactura), "w")
# Emisor
  f.write( "<HTML>\n" )
  f.write( "<BODY>\n" )
  f.write( "<CENTER>\n")
  f.write( "<TABLE BORDER=0 WIDTH=100%>\n" )
#  f.write( "<TR>\n")
#  f.write( "  <TD ALIGN=CENTER ROWSPAN=7> <IMG SRC=\"logo.jpg\"> </TD> \n")
#  f.write( "  <TD ALIGN=CENTER>EMISOR</TD>\n")
#  f.write( "</TR>\n")
  f.write( "<TR>\n")
  f.write( "  <TD ALIGN=CENTER>"+lXml["EmiNom"]+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR>\n")
  f.write( "  <TD ALIGN=CENTER>"+lXml["EmiCal"]+" "+lXml["EmiNoE"]+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR>\n")
  f.write( "  <TD ALIGN=CENTER>"+lXml["EmiCol"]+" "+lXml["EmiLoc"]+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR>\n")
  f.write( "  <TD ALIGN=CENTER>"+lXml["EmiMun"]+" "+lXml["EmiEst"]+" "+lXml["EmiPai"]+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR>\n")
  f.write( "  <TD ALIGN=CENTER>"+lXml["EmiCod"]+" RFC. "+lXml["EmiRfc"]+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR>\n")
  f.write( "  <TD ALIGN=CENTER>&nbsp;</TD>\n")
  f.write( "</TR>\n")
  f.write( "</TABLE>\n")
  f.write( "<HR>\n")
# Cliente
  f.write( "<TABLE BORDER=0 WIDTH=100%>\n" )
  f.write( "<TR>\n")
  f.write( "  <TD ALIGN=CENTER><B>CLIENTE</B></TD>\n")
  if lTipDoc=='FC':
    f.write( "  <TD ALIGN=CENTER><B>FACTURA CONTADO</B></TD>\n")
  else:
    f.write( "  <TD ALIGN=CENTER><B>FACTURA CREDITO</B></TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR>\n")
  lTex=lXml["CliNom"]
  lTex=lTex.replace("Ñ","&Ntilde;") 
  lTex=lTex.replace("ñ","&ntilde;")
  f.write( "  <TD ALIGN=LEFT>"+lTex+"</TD>\n")
  f.write( "  <TD ALIGN=CENTER>"+lfacact+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR> \n")
  f.write( "  <TD ALIGN=LEFT>"+lXml["CliDom"]+"</TD>\n")
  f.write( "  <TD ALIGN=CENTER>FECHA</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR> \n")
  f.write( "  <TD ALIGN=LEFT>"+lXml["CliCol"]+" "+lXml["CliLoc"]+"</TD>\n")
  lTex=lXml["FecAct"].replace("T"," ")
  f.write( "  <TD ALIGN=CENTER>"+lTex+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR> \n")
  f.write( "  <TD ALIGN=LEFT>"+lXml["CliMun"]+" "+lXml["CliEst"]+" "+lXml["CliPai"]+"</TD>\n")
  f.write( "  <TD ALIGN=CENTER>A&ntilde;o y No. de Aprobaci&oacute;n de Folios</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR> \n")
  f.write( "  <TD ALIGN=LEFT>"+lXml["CliCoP"]+" RFC. "+lXml["CliRfc"]+"</TD>\n")
  f.write( "  <TD ALIGN=CENTER>"+lXml["AnioAp"]+" "+lXml["Aproba"]+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "</TABLE>\n")
  f.write( "<HR>\n")
# Movimientos
  movs=fFetchAll("SELECT fc_salida,fc_unimed,fc_descrip,fc_precio,fc_importe,(fc_fecha + fc_plazo),fc_numpar,fc_impuesto, \
    fc_clipro,fc_numpre,fc_vende,ve_nombre,fc_numdoc FROM fnfact, fnvend WHERE fc_numdoc='"+lfnd+"' AND fc_vende=ve_clave ORDER BY fc_serial;")
  f.write( "<TABLE BORDER=0 WIDTH=100%>\n" )
  f.write( "<TR> \n")
  f.write( "<TH ALIGN=LEFT> Cantidad </TH>\n")
  f.write( "<TH ALIGN=LEFT> Unidad </TH>\n")
  f.write( "<TH ALIGN=LEFT> Parte </TH>\n")
  f.write( "<TH ALIGN=LEFT> Descripcion </TH>\n")
  f.write( "<TH ALIGN=RIGHT> Precio </TH>\n")
  f.write( "<TH ALIGN=RIGHT> Importe </TH>\n")
  f.write( "</TR> \n")
  for mov in movs:
    f.write( "<TR> \n")
    f.write( "<TD ALIGN=LEFT> "+str(mov[0])+"</TD>\n")
    f.write( "<TD ALIGN=LEFT> "+str(mov[1])+"</TD>\n")
    f.write( "<TD ALIGN=LEFT> "+str(mov[6])+"</TD>\n")
    f.write( "<TD ALIGN=LEFT> "+str(mov[2])+"</TD>\n")
    lPre="%12.2f" % (mov[3])
    f.write( "<TD ALIGN=RIGHT> "+lPre.strip()+"</TD>\n")
    lImp="%12.2f" % (mov[4])
    if lXml["CliRfc"]=="XAXX010101000":
      lImp="%12.2f" % (mov[4]+mov[7])
      
    f.write( "<TD ALIGN=RIGHT> "+lImp.strip()+"</TD>\n")
    f.write( "</TR> \n")
    dVence = mov[5].strftime("%Y-%m-%d")
    (aVen, mVen, dVen) = dVence.split("-")
    mCli=mov[8]
    mNpr=mov[9]
    mVee=mov[10]
    mVno=mov[11]
    mTik=lfnd

  mVen=ficdef.fDatExt(dVence,3)
  f.write( "<TR>\n")
  f.write( "<TD>&nbsp;</TD>\n") 
  f.write( "<TD>&nbsp;</TD>\n") 
  f.write( "<TD>&nbsp;</TD>\n") 
  f.write( "<TD>&nbsp;</TD>\n") 
  f.write( "<TD ALIGN=RIGHT>SUBTOTAL</TD>\n")
  if lXml["CliRfc"]=="XAXX010101000":
    f.write( "<TD ALIGN=RIGHT>"+lXml["TotTotal"]+"</TD>\n")
  else:
    f.write( "<TD ALIGN=RIGHT>"+lXml["SubTotal"]+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR>\n")
  plin=ficdef.fPesos(float(lXml["TotTotal"]))
  f.write( "<TD COLSPAN=4 ROWSPAN=4 ALIGN=LEFT>Importe con letra: "+plin+"</TD>\n")
  f.write( "<TD ALIGN=RIGHT>16% IVA</TD>\n")
  if lXml["CliRfc"]=="XAXX010101000":
    f.write( "<TD ALIGN=RIGHT>&nbsp;</TD>\n")
  else:
    f.write( "<TD ALIGN=RIGHT>"+lXml["TotImpue"]+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR>\n")
  f.write( "<TD ALIGN=RIGHT>TOTAL</TD>\n")
  f.write( "<TD ALIGN=RIGHT>"+lXml["TotTotal"]+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "</TABLE>\n")
  f.write( "<TABLE BORDER=0 WIDTH=100%>\n" )
  f.write( "<TR>\n")
  f.write( "<TD ALIGN=LEFT>"+mCli+"</TD>\n")
  f.write( "<TD ALIGN=LEFT>"+mNpr+"</TD>\n")
  f.write( "<TD ALIGN=LEFT>"+mTik+"</TD>\n")
#  f.write( "<TD ALIGN=LEFT>"+mVee+"</TD>\n")
#  f.write( "<TD ALIGN=LEFT>"+mVno+"</TD>\n")
  f.write( "<TD ALIGN=LEFT>&nbsp;</TD>\n")
  f.write( "<TD ALIGN=LEFT>&nbsp;</TD>\n")
  f.write( "<TD ALIGN=LEFT>&nbsp;</TD>\n")
  f.write( "</TR>\n")
  f.write( "</TABLE>\n")
  f.write( "<HR>\n")
# Cadena Original, Sello digital
  if lEsOriginal==1:
    f.write( "<TABLE BORDER=0 WIDTH=100%>\n" )
    f.write( "<TR>\n")
    f.write( "<TD ALIGN=LEFT><FONT SIZE=-2>Cadena original<FONT></TD>\n")
    f.write( "<TD ALIGN=RIGHT><FONT SIZE=-2>Numero de Certificado:<FONT></TD>\n")
    f.write( "<TD ALIGN=LEFT><FONT SIZE=-2>"+lXml["NoCer"]+"<FONT></TD>\n")
#    f.write( "<TD ALIGN=RIGHT><FONT SIZE=-2>Metodo de Pago:<FONT></TD>\n")
#    f.write( "<TD ALIGN=LEFT><FONT SIZE=-2>"+lXml["CliFpa"]+"<FONT></TD>\n")

    f.write( "<TD ALIGN=LEFT><FONT SIZE=-2>Regimen Fiscal:<FONT></TD>\n")
    f.write( "<TD ALIGN=LEFT><FONT SIZE=-2>"+lXml["RegFis"]+"<FONT></TD>\n")
    f.write( "<TD ALIGN=LEFT><FONT SIZE=-2>Metodo de Pago:<FONT></TD>\n")
    f.write( "<TD ALIGN=LEFT><FONT SIZE=-2>"+lXml["CliFpa"]+"<FONT></TD>\n")
    if lXml["CliDpa"]:
      f.write( "<TD ALIGN=RIGHT><FONT SIZE=-2>Cta:<FONT></TD>\n")
      f.write( "<TD ALIGN=LEFT><FONT SIZE=-2>"+lXml["CliDpa"]+"<FONT></TD>\n")


    f.write( "</TR>\n")
    f.write( "<TR>\n")
    lCadOri=lCadOri.replace("Ñ","&Ntilde;") 
    lCadOri=lCadOri.replace("ñ","&ntilde;")
    f.write( "<TD COLSPAN=3><FONT SIZE=-2>"+lCadOri+"<FONT></TD>\n")
    f.write( "</TR>\n")
    f.write( "<TR>\n")
    f.write( "<TD ALIGN=LEFT COLSPAN=3><FONT SIZE=-2>Sello digital<FONT></TD>\n")
    f.write( "</TR>\n")
    f.write( "<TR>\n")
    f.write( "<TD COLSPAN=3><FONT SIZE=-2>"+lSello+"</FONT></TD>\n")
    f.write( "</TR>\n")
    f.write( "</TABLE>\n")
    f.write( "<HR>\n")
# Pagare
  f.write( "<TABLE BORDER=1 WIDTH=100%>\n" )
  f.write( "<TR>\n")
  f.write( "<TD><FONT SIZE=-1>POR ESTE PAGARE ME(NOS) COMPROMETO(EMOS) A PAGAR INCONDICIONALMENTE EL DIA <B>"+dVen+" DE \
"+mVen+" DE "+aVen+"</B> A LA ORDEN DE <B>SAUL ALONSO PONCE PEREZ</B>, EN SU DOMICILIO\
LA CANTIDAD DE "+plin+" MERCANCIAS RECIBIDAS DE CONFORMIDAD. SI ESTE PAGARE NO FUERA CUBIERTO A SU VENCIMIENTO \
CAUSARA UN INTERES MORATORIO DEL ..... % MENSUAL HASTA SU TOTAL LIQUIDACION.</FONT></TD>\n")
  f.write( "</TR>\n")
#  f.write( "<TR>\n")
#  f.write( "<TD ALIGN=RIGHT><FONT SIZE=-1>.................................<FONT></TD>\n")
#  f.write( "</TR>\n")
  f.write( "<TR>\n")
  f.write( "<TD ALIGN=RIGHT><FONT SIZE=-1>           F  I  R  M  A        .<FONT></TD>\n")
  f.write( "</TR>\n")
  f.write( "</TABLE>\n")
  f.write( "<TABLE BORDER=0 WIDTH=100%>\n" )
  (lanio,lmes,ldia)=lHoy.split('-')
  lTex=ficdef.fDatExt(lHoy,1)
  f.write( "<TR>\n")
  f.write( "<TD ALIGN=LEFT><FONT SIZE=-1>CHIHUAHUA, CHIH. a "+lTex+".<FONT></TD>\n")
  f.write( "<TD ALIGN=RIGHT><FONT SIZE=-1>Efectos fiscales al pago. Pago en una sola exhibicion<FONT></TD>\n")
  f.write( "</TR>\n")
  f.write( "</TABLE>\n")
# 
  f.write( "<TABLE BORDER=0 WIDTH=100%>\n" )
  f.write( "<TR>\n")
#  f.write( "<TD ALIGN=CENTER>Este documento es una impresi&oacute;n de un comprobante fiscal digital</TD>\n")
  f.write( "<TD ALIGN=CENTER>Este documento es una representaci&oacute;n impresa de un CFD</TD>\n")
  f.write( "</TR>\n")
  f.write( "</TABLE>\n")
  f.write( "<HR>\n")
  
#  f.write( "<TABLE BORDER=0 WIDTH=100%>\n" )
#  f.write( "<TR>\n")
#  f.write( "<TD ALIGN=CENTER>TODA DEVOLUCION CAUSA UN 10% POR FALSO MANEJO</TD>\n")
#  f.write( "<TD ALIGN=CENTER>DEVOLUCION SOLO EL DIA DE LA VENTA, FORANEAS 5 DIAS DESPUES</TD>\n")
#  f.write( "<TD ALIGN=CENTER>EN PARTES ELECTRICAS NO HAY GARANTIA NI DEVOLUCION</TD>\n")
#  f.write( "<TD ALIGN=CENTER>SOLO ACEPTAMOS DEVOLUCIONES PRESENTANDO LA FACTURA</TD>\n")
#  f.write( "</TR>\n")
#  f.write( "</TABLE>\n")

  f.write( "</BODY>\n" )
  f.write( "</HTML>\n" )
  f.closed
  return

#def fFacPDFSP(lfacact,lDirCfd):
#  lfactura=lDirCfd+lfacact+".html"
#  lfactpdf=lDirCfd+lfacact+".pdf"
#  environ['HTMLDOC_NOCGI']='1'
#  lok=system("/usr/bin/htmldoc --bottom 0.20in --top 0.20in --right 0.20in --left 0.20in --fontsize 8 --size letter --webpage -f "\
#  +lfactpdf+" "+lfactura)
#  return (lfactpdf)

def fFacHTMLHP(lHoy,lfacact,lSello,lXml,lfnd,lDirCfd,lTipDoc,lEsOriginal):
  mcadori=lDirCfd+lfacact+".cadenaoriginal"
  fichero = open(path.realpath(mcadori), "r")
  lCadOri=fichero.readline()
  fichero.closed
  lfactura=lDirCfd+lfacact+".html"
  f = open(path.realpath(lfactura), "w")
# Emisor
  f.write( "<HTML>\n" )
  f.write( "<BODY>\n" )
  f.write( "<CENTER>\n")
  f.write( "<TABLE BORDER=0 WIDTH=100%>\n" )
  f.write( "<TR>\n")
  f.write( "  <TD ALIGN=CENTER ROWSPAN=7> <IMG SRC=\"logo.jpg\" width=\"180\" height=\"110\" border=\"0\"> </TD> \n")
  f.write( "  <TD ALIGN=CENTER>EMISOR</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR>\n")
  f.write( "  <TD ALIGN=CENTER>"+lXml["EmiNom"]+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR>\n")
  f.write( "  <TD ALIGN=CENTER>"+lXml["EmiCal"]+" "+lXml["EmiNoE"]+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR>\n")
  f.write( "  <TD ALIGN=CENTER>"+lXml["EmiCol"]+" "+lXml["EmiLoc"]+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR>\n")
  f.write( "  <TD ALIGN=CENTER>"+lXml["EmiMun"]+" "+lXml["EmiEst"]+" "+lXml["EmiPai"]+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR>\n")
  f.write( "  <TD ALIGN=CENTER>"+lXml["EmiCod"]+" RFC. "+lXml["EmiRfc"]+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR>\n")
  f.write( "  <TD ALIGN=CENTER>&nbsp;</TD>\n")
  f.write( "</TR>\n")
  f.write( "</TABLE>\n")
  f.write( "<HR>\n")
# Cliente
  f.write( "<TABLE BORDER=0 WIDTH=100%>\n" )
  f.write( "<TR>\n")
  f.write( "  <TD ALIGN=CENTER><B>CLIENTE</B></TD>\n")
  if lTipDoc=='FC':
    f.write( "  <TD ALIGN=CENTER><B>FACTURA CONTADO</B></TD>\n")
  else:
    f.write( "  <TD ALIGN=CENTER><B>FACTURA CREDITO</B></TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR>\n")
  lTex=lXml["CliNom"]
  lTex=lTex.replace("Ñ","&Ntilde;") 
  lTex=lTex.replace("ñ","&ntilde;")
  f.write( "  <TD ALIGN=LEFT>"+lTex+"</TD>\n")
  f.write( "  <TD ALIGN=CENTER>"+lfacact+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR> \n")
  f.write( "  <TD ALIGN=LEFT>"+lXml["CliDom"]+"</TD>\n")
  f.write( "  <TD ALIGN=CENTER>FECHA</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR> \n")
  f.write( "  <TD ALIGN=LEFT>"+lXml["CliCol"]+" "+lXml["CliLoc"]+"</TD>\n")
  lTex=lXml["FecAct"].replace("T"," ")
  f.write( "  <TD ALIGN=CENTER>"+lTex+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR> \n")
  f.write( "  <TD ALIGN=LEFT>"+lXml["CliMun"]+" "+lXml["CliEst"]+" "+lXml["CliPai"]+"</TD>\n")
  f.write( "  <TD ALIGN=CENTER>A&ntilde;o y No. de Aprobaci&oacute;n de Folios</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR> \n")
  f.write( "  <TD ALIGN=LEFT>"+lXml["CliCoP"]+" RFC. "+lXml["CliRfc"]+"</TD>\n")
  f.write( "  <TD ALIGN=CENTER>"+lXml["AnioAp"]+" "+lXml["Aproba"]+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "</TABLE>\n")
  f.write( "<HR>\n")
# Movimientos
  movs=fFetchAll("SELECT fc_salida,fc_unimed,fc_descrip,fc_precio,fc_importe,(fc_fecha + fc_plazo),fc_numpar,fc_impuesto, \
    fc_clipro,fc_numpre,fc_vende,ve_nombre,fc_numdoc FROM fnfact, fnvend WHERE fc_numdoc='"+lfnd+"' AND fc_vende=ve_clave;")
  f.write( "<TABLE BORDER=0 WIDTH=100%>\n" )
  f.write( "<TR> \n")
  f.write( "<TH ALIGN=LEFT> Cantidad </TH>\n")
  f.write( "<TH ALIGN=LEFT> Unidad </TH>\n")
  f.write( "<TH ALIGN=LEFT> Parte </TH>\n")
  f.write( "<TH ALIGN=LEFT> Descripcion </TH>\n")
  f.write( "<TH ALIGN=RIGHT> Precio </TH>\n")
  f.write( "<TH ALIGN=RIGHT> Importe </TH>\n")
  f.write( "</TR> \n")
  for mov in movs:
    f.write( "<TR> \n")
    f.write( "<TD ALIGN=LEFT> "+str(mov[0])+"</TD>\n")
    f.write( "<TD ALIGN=LEFT> "+str(mov[1])+"</TD>\n")
    f.write( "<TD ALIGN=LEFT> "+str(mov[6])+"</TD>\n")
    f.write( "<TD ALIGN=LEFT> "+str(mov[2])+"</TD>\n")
    lPre="%12.2f" % (mov[3])
    f.write( "<TD ALIGN=RIGHT> "+lPre.strip()+"</TD>\n")
    lImp="%12.2f" % (mov[4])
    if lXml["CliRfc"]=="XAXX010101000":
      lImp="%12.2f" % (mov[4]+mov[7])
      
    f.write( "<TD ALIGN=RIGHT> "+lImp.strip()+"</TD>\n")
    f.write( "</TR> \n")
    dVence = mov[5].strftime("%Y-%m-%d")
    (aVen, mVen, dVen) = dVence.split("-")
    mCli=mov[8]
    mNpr=mov[9]
    mVee=mov[10]
    mVno=mov[11]
    mTik=lfnd

  mVen=ficdef.fDatExt(dVence,3)
  f.write( "<TR>\n")
  f.write( "<TD>&nbsp;</TD>\n") 
  f.write( "<TD>&nbsp;</TD>\n") 
  f.write( "<TD>&nbsp;</TD>\n") 
  f.write( "<TD>&nbsp;</TD>\n") 
  f.write( "<TD ALIGN=RIGHT>SUBTOTAL</TD>\n")
  if lXml["CliRfc"]=="XAXX010101000":
    f.write( "<TD ALIGN=RIGHT>"+lXml["TotTotal"]+"</TD>\n")
  else:
    f.write( "<TD ALIGN=RIGHT>"+lXml["SubTotal"]+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR>\n")
  plin=ficdef.fPesos(float(lXml["TotTotal"]))
  f.write( "<TD COLSPAN=4 ROWSPAN=4 ALIGN=LEFT>Importe con letra: "+plin+"</TD>\n")
  f.write( "<TD ALIGN=RIGHT>16% IVA</TD>\n")
  if lXml["CliRfc"]=="XAXX010101000":
    f.write( "<TD ALIGN=RIGHT>&nbsp;</TD>\n")
  else:
    f.write( "<TD ALIGN=RIGHT>"+lXml["TotImpue"]+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR>\n")
  f.write( "<TD ALIGN=RIGHT>TOTAL</TD>\n")
  f.write( "<TD ALIGN=RIGHT>"+lXml["TotTotal"]+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "</TABLE>\n")
  f.write( "<TABLE BORDER=0 WIDTH=100%>\n" )
  f.write( "<TR>\n")
  f.write( "<TD ALIGN=LEFT>"+mCli+"</TD>\n")
  f.write( "<TD ALIGN=LEFT>"+mNpr+"</TD>\n")
  f.write( "<TD ALIGN=LEFT>"+mTik+"</TD>\n")
  f.write( "<TD ALIGN=LEFT>"+mVee+"</TD>\n")
  f.write( "<TD ALIGN=LEFT>"+mVno+"</TD>\n")
  f.write( "<TD ALIGN=LEFT>&nbsp;</TD>\n")
  f.write( "</TR>\n")
  f.write( "</TABLE>\n")
  f.write( "<HR>\n")
# Cadena Original, Sello digital
  if lEsOriginal==1:
    f.write( "<TABLE BORDER=0 WIDTH=100%>\n" )
    f.write( "<TR>\n")
    f.write( "<TD ALIGN=LEFT><FONT SIZE=-2>Cadena original<FONT></TD>\n")
    f.write( "<TD ALIGN=RIGHT><FONT SIZE=-2>Numero de Certificado<FONT></TD>\n")
    f.write( "<TD ALIGN=LEFT><FONT SIZE=-2>"+lXml["NoCer"]+"<FONT></TD>\n")
#    f.write( "<TD ALIGN=RIGHT><FONT SIZE=-2>Metodo de Pago:<FONT></TD>\n")
#    f.write( "<TD ALIGN=LEFT><FONT SIZE=-2>"+lXml["CliFpa"]+"<FONT></TD>\n")

    f.write( "<TD ALIGN=RIGHT><FONT SIZE=-2>Regimen Fiscal:<FONT></TD>\n")
    f.write( "<TD ALIGN=LEFT><FONT SIZE=-2>"+lXml["RegFis"]+"<FONT></TD>\n")
    f.write( "<TD ALIGN=RIGHT><FONT SIZE=-2>Metodo de Pago:<FONT></TD>\n")
    f.write( "<TD ALIGN=LEFT><FONT SIZE=-2>"+lXml["CliFpa"]+"<FONT></TD>\n")
    if lXml["CliDpa"]:
      f.write( "<TD ALIGN=RIGHT><FONT SIZE=-2>Cta:<FONT></TD>\n")
      f.write( "<TD ALIGN=LEFT><FONT SIZE=-2>"+lXml["CliDpa"]+"<FONT></TD>\n")
#  f.write( "<TD ALIGN=LEFT>&nbsp;</TD>\n")

    f.write( "</TR>\n")
    f.write( "<TR>\n")
    lCadOri=lCadOri.replace("Ñ","&Ntilde;") 
    lCadOri=lCadOri.replace("ñ","&ntilde;")
    f.write( "<TD COLSPAN=3><FONT SIZE=-2>"+lCadOri+"<FONT></TD>\n")
    f.write( "</TR>\n")
    f.write( "<TR>\n")
    f.write( "<TD ALIGN=LEFT COLSPAN=3><FONT SIZE=-2>Sello digital<FONT></TD>\n")
    f.write( "</TR>\n")
    f.write( "<TR>\n")
    f.write( "<TD COLSPAN=3><FONT SIZE=-2>"+lSello+"</FONT></TD>\n")
    f.write( "</TR>\n")
    f.write( "</TABLE>\n")
    f.write( "<HR>\n")
# Pagare
  f.write( "<TABLE BORDER=1 WIDTH=100%>\n" )
  f.write( "<TR>\n")
  f.write( "<TD><FONT SIZE=-1>POR ESTE PAGARE ME(NOS) COMPROMETO(EMOS) A PAGAR INCONDICIONALMENTE EL DIA <B>"+dVen+" DE \
"+mVen+" DE "+aVen+"</B> A LA ORDEN DE <B>HERRAMIENTA PORTATILES DE CHIHUAHUA SA DE CV</B>, EN SU DOMICILIO\
LA CANTIDAD DE "+plin+" MERCANCIAS RECIBIDAS DE CONFORMIDAD. SI ESTE PAGARE NO FUERA CUBIERTO A SU VENCIMIENTO \
CAUSARA UN INTERES MORATORIO DEL ..... % MENSUAL HASTA SU TOTAL LIQUIDACION.</FONT></TD>\n")
  f.write( "</TR>\n")
#  f.write( "<TR>\n")
#  f.write( "<TD ALIGN=RIGHT><FONT SIZE=-1>.................................<FONT></TD>\n")
#  f.write( "</TR>\n")
  f.write( "<TR>\n")
  f.write( "<TD ALIGN=RIGHT><FONT SIZE=-1>           F  I  R  M  A        .<FONT></TD>\n")
  f.write( "</TR>\n")
  f.write( "</TABLE>\n")
  f.write( "<TABLE BORDER=0 WIDTH=100%>\n" )
  (lanio,lmes,ldia)=lHoy.split('-')
  lTex=ficdef.fDatExt(lHoy,1)
  f.write( "<TR>\n")
  f.write( "<TD ALIGN=LEFT><FONT SIZE=-1>CHIHUAHUA, CHIH. a "+lTex+".<FONT></TD>\n")
  f.write( "<TD ALIGN=RIGHT><FONT SIZE=-1>Efectos fiscales al pago. Pago en una sola exhibicion<FONT></TD>\n")
  f.write( "</TR>\n")
  f.write( "</TABLE>\n")
# 
  f.write( "<TABLE BORDER=0 WIDTH=100%>\n" )
  f.write( "<TR>\n")
#  f.write( "<TD ALIGN=CENTER>Este documento es una impresi&oacute;n de un comprobante fiscal digital</TD>\n")
  f.write( "<TD ALIGN=CENTER>Este documento es una representaci&oacute;n impresa de un CFD</TD>\n")
  f.write( "</TR>\n")
  f.write( "</TABLE>\n")
  f.write( "<HR>\n")
# 
  f.write( "<TABLE BORDER=0 WIDTH=100%>\n" )
  f.write( "<TR>\n")
  f.write( "<TD ALIGN=CENTER>TODA DEVOLUCION CAUSA UN 10% POR FALSO MANEJO</TD>\n")
  f.write( "<TD ALIGN=CENTER>DEVOLUCION SOLO EL DIA DE LA VENTA, FORANEAS 5 DIAS DESPUES</TD>\n")
  f.write( "<TD ALIGN=CENTER>EN PARTES ELECTRICAS NO HAY GARANTIA NI DEVOLUCION</TD>\n")
  f.write( "<TD ALIGN=CENTER>SOLO ACEPTAMOS DEVOLUCIONES PRESENTANDO LA FACTURA</TD>\n")
  f.write( "</TR>\n")
  f.write( "</TABLE>\n")

  f.write( "</BODY>\n" )
  f.write( "</HTML>\n" )
  f.closed
  return

def fFacHTMLCC(lHoy,lfacact,lSello,lXml,lfnd,lDirCfd,lTipDoc,lEsOriginal):
  """
  aXml["Cliente"]=lCliente=mov[0]
  aXml["SubTotal"]=lSubTotal=str(mov[1])
  aXml["TotImpue"]=lTotImpue=str(mov[2])
  aXml["TotTotal"]=lTotTotal=str(mov[3])
  aXml["lSerie"]=lserie=fol[0].strip()
  aXml["lActual"]=lactual=("%10d" % (fol[1])).strip()
  aXml["Aproba"]=laproba=fol[2].strip()
  aXml["AnioAp"]=lanioap=fol[3].strip()
  aXml["FecAct"]=mfecact=mov[0].strip()
  aXml["NoCer"]=mNoCer=mov[1].strip()
  aXml["EmiNom"]=mEmiNom=row[0].strip()
  aXml["EmiRfc"]=mEmiRfc=row[1].strip()
  aXml["EmiCal"]=mEmiCal=row[2].strip()
  aXml["EmiNoE"]=mEmiNoE=row[3].strip()
  aXml["EmiCol"]=mEmiCol=row[4].strip()
  aXml["EmiLoc"]=mEmiLoc=row[5].strip()
  aXml["EmiMun"]=mEmiMun=row[6].strip()
  aXml["EmiEst"]=mEmiEst=row[7].strip()
  aXml["EmiPai"]=mEmiPai=row[8].strip()
  aXml["EmiCod"]=mEmiCod=row[9].strip()
  aXml["CliRfc"]=mCliRfc=cli[0].strip()
  aXml["CliNom"]=mCliNom=cli[1].strip()
  aXml["CliRfc"]=mCliRfc
  aXml["CliDom"]=mCliDom=cli[2].strip()
  aXml["CliCol"]=mCliCol=cli[3].strip()
  aXml["CliLoc"]=mCliLoc=cli[4].strip()
  aXml["CliMun"]=mCliMun=cli[5].strip()
  aXml["CliEst"]=mCliEst=cli[6].strip()
  aXml["CliPai"]=mCliPai=cli[7].strip()
  aXml["CliCoP"]=mCliCoP=cli[8].strip()
  aXml["CliPla"]=("%4d" % (cli[9])).strip()
  """
  lReTim=False
  if ":" in lfnd:
    lfnd,lKk=lfnd.split(":")
    lReTim=True

  if lEsOriginal==0:
#    lFilTim="timbre/"+lfacact+"t.xml"
    lFilTim=lDirCfd+lfacact+"t.xml"
    lPngTim=lDirCfd+lfacact+".png"
    doc=minidom.parse(lFilTim)
    lUUID=doc.childNodes[0].childNodes[4].childNodes[0].getAttributeNS(None,"UUID")
    lselloSAT=doc.childNodes[0].childNodes[4].childNodes[0].getAttributeNS(None,"selloSAT")
    lCertiSAT=doc.childNodes[0].childNodes[4].childNodes[0].getAttributeNS(None,"noCertificadoSAT")
    lselloCFD=doc.childNodes[0].childNodes[4].childNodes[0].getAttributeNS(None,"selloCFD")
    lFechaCFD=doc.childNodes[0].childNodes[4].childNodes[0].getAttributeNS(None,"FechaTimbrado")
    lCertiCSD=doc.childNodes[0].getAttributeNS(None,"noCertificado")
    lFormPAG=doc.childNodes[0].getAttributeNS(None,"formaDePago")
    lMetoPAG=doc.childNodes[0].getAttributeNS(None,"metodoDePago")
    lok=system("/usr/bin/qrencode -m 1 -v 1 -s 4 -o '"+lPngTim+\
      "' '?re="+lXml["EmiRfc"]+"&rr="+lXml["CliRfc"]+"&tt="+lXml["TotTotal"]+"&id="+lUUID+"'")
    """
    qrencode -d 200 -m 1 -v 1 -s 4 -o 'Timbre.png' \
    '?re=ROAF641217K94&rr=INC101109Q36&tt=1234567890.123456&id=ad662d33-6934-459c-a128-BDf0393f0f44
    """
  mcadori=lDirCfd+lfacact+".cadenaoriginal"
  fichero = open(path.realpath(mcadori), "r")
  lCadOri=fichero.readline()
  fichero.closed
  lfactura=lDirCfd+lfacact+".html"
  f = open(path.realpath(lfactura), "w")
# Emisor
  f.write( "<HTML>\n" )
  f.write( "<BODY>\n" )
  f.write( "<CENTER>\n")
  f.write( "<TABLE BORDER=0 WIDTH=100%>\n" )
  f.write( "<TR>\n")
#  f.write( "  <TD ALIGN=CENTER ROWSPAN=7> <IMG SRC=\"logo.jpg\"> </TD> \n")
  if lEsOriginal==0:
    f.write( "  <TD ALIGN=CENTER ROWSPAN=7> <IMG SRC=\""+lfacact+".png\" width=\"120\" height=\"120\" border=\"0\"> </TD> \n")
  f.write( "  <TD ALIGN=CENTER>EMISOR</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR>\n")
  f.write( "  <TD ALIGN=CENTER>"+lXml["EmiNom"]+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR>\n")
  f.write( "  <TD ALIGN=CENTER>"+lXml["EmiCal"]+" "+lXml["EmiNoE"]+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR>\n")
  f.write( "  <TD ALIGN=CENTER>"+lXml["EmiCol"]+" "+lXml["EmiLoc"]+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR>\n")
  f.write( "  <TD ALIGN=CENTER>"+lXml["EmiMun"]+" "+lXml["EmiEst"]+" "+lXml["EmiPai"]+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR>\n")
  f.write( "  <TD ALIGN=CENTER>"+lXml["EmiCod"]+" RFC. "+lXml["EmiRfc"]+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR>\n")
  f.write( "  <TD ALIGN=CENTER>&nbsp;</TD>\n")
  f.write( "</TR>\n")
  f.write( "</TABLE>\n")
  f.write( "<HR>\n")
# Cliente
  f.write( "<TABLE BORDER=0 WIDTH=100%>\n" )
  f.write( "<TR>\n")
  f.write( "  <TD ALIGN=CENTER><B>CLIENTE</B></TD>\n")
  if lTipDoc=='FC':
    f.write( "  <TD ALIGN=CENTER><B>FACTURA CONT.</B></TD>\n")
  else:
    f.write( "  <TD ALIGN=CENTER><B>FACTURA CRED.</B></TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR>\n")
  lTex=lXml["CliNom"].encode("utf-8")
  lTex=lTex.replace("Ñ","&Ntilde;") 
  lTex=lTex.replace("ñ","&ntilde;")
  f.write( "  <TD ALIGN=LEFT>"+lTex+"</TD>\n")
  f.write( "  <TD ALIGN=CENTER>"+lfacact+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR> \n")
  lTex=lXml["CliDom"].encode("utf-8")
  lTex=lTex.replace("Ñ","&Ntilde;") 
  lTex=lTex.replace("ñ","&ntilde;")
#  f.write( "  <TD ALIGN=LEFT>"+lXml["CliDom"]+"</TD>\n")
  f.write( "  <TD ALIGN=LEFT>"+lTex+"</TD>\n")
#  f.write( "  <TD ALIGN=CENTER>FECHA</TD>\n")
  f.write( "  <TD ALIGN=CENTER>FECHA Y HORA DE EMISION</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR> \n")
  lTex=lXml["CliCol"].encode("utf-8")
  lTex=lTex.replace("Ñ","&Ntilde;")
  lTex=lTex.replace("ñ","&ntilde;")
#  f.write( "  <TD ALIGN=LEFT>"+lXml["CliCol"]+" "+lXml["CliLoc"]+"</TD>\n")
  f.write( "  <TD ALIGN=LEFT>"+lTex+" "+lXml["CliLoc"]+"</TD>\n")
  lTex=lXml["FecAct"].replace("T"," ")
  f.write( "  <TD ALIGN=CENTER>"+lTex+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR> \n")
  lTex=fUtf8HTML(lXml["CliMun"],lEsTxt=False)
  f.write( "  <TD ALIGN=LEFT>"+lTex+" "+lXml["CliEst"]+" "+lXml["CliPai"]+"</TD>\n")
#  f.write( "  <TD ALIGN=LEFT>"+lXml["CliMun"]+" "+lXml["CliEst"]+" "+lXml["CliPai"]+"</TD>\n")
#  f.write( "  <TD ALIGN=CENTER>A&ntilde;o y No. de Aprobaci&oacute;n de Folios</TD>\n")
  if lEsOriginal==0:
    f.write( "  <TD ALIGN=CENTER>FOLIO FISCAL</TD>\n")
  else:
    f.write( "  <TD ALIGN=CENTER>&nbsp;</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR> \n")
  f.write( "  <TD ALIGN=LEFT>"+lXml["CliCoP"]+" RFC. "+lXml["CliRfc"]+"</TD>\n")
#  f.write( "  <TD ALIGN=CENTER>"+lXml["AnioAp"]+" "+lXml["Aproba"]+"</TD>\n")
  if lEsOriginal==0:
    f.write( "  <TD ALIGN=CENTER>"+lUUID+"</TD>\n")
  else:
    f.write( "  <TD ALIGN=CENTER>&nbsp;</TD>\n")
  f.write( "</TR>\n")
  f.write( "</TABLE>\n")
  f.write( "<HR>\n")
# Movimientos
  if lReTim:
    movs=fFetchAll("SELECT fc_salida,fc_unimed,fc_descrip,fc_precio,fc_importe,(fc_fecha + fc_plazo),fc_numpar,fc_impuesto, \
      fc_clipro,fc_numpre,fc_vende,ve_nombre,fc_numdoc FROM "+lfnd+", fnvend WHERE fc_vende=ve_clave ORDER BY fc_numpar;")
  else:
    movs=fFetchAll("SELECT fc_salida,fc_unimed,fc_descrip,fc_precio,fc_importe,(fc_fecha + fc_plazo),fc_numpar,fc_impuesto, \
      fc_clipro,fc_numpre,fc_vende,ve_nombre,fc_numdoc FROM fnfact, fnvend WHERE fc_numdoc='"+lfnd+"' AND fc_vende=ve_clave ORDER BY fc_numpar;")
  f.write( "<TABLE BORDER=0 WIDTH=100%>\n" )
  f.write( "<TR> \n")
  f.write( "<TH ALIGN=LEFT> Cantidad </TH>\n")
  f.write( "<TH ALIGN=LEFT> Unidad </TH>\n")
  f.write( "<TH ALIGN=LEFT> Parte </TH>\n")
  f.write( "<TH ALIGN=LEFT> Descripcion </TH>\n")
  f.write( "<TH ALIGN=RIGHT> Precio </TH>\n")
  f.write( "<TH ALIGN=RIGHT> Importe </TH>\n")
  f.write( "</TR> \n")
  for mov in movs:
    if lReTim: lfnd=mov[12].strip()
    f.write( "<TR> \n")
    f.write( "<TD ALIGN=LEFT> "+str(mov[0])+"</TD>\n")

    if mov[1]=='PZ':
      mUniMed='PIEZA'
    elif mov[1]=='SE':
      mUniMed='SERVICIO'
    elif mov[1]=='JG':
      mUniMed='JUEGO'
    else:
      mUniMed=mov[1]
    f.write( "<TD ALIGN=LEFT> "+mUniMed+"</TD>\n")

#    f.write( "<TD ALIGN=LEFT> "+str(mov[1])+"</TD>\n")
    f.write( "<TD ALIGN=LEFT> "+str(mov[6])+"</TD>\n")
    lTex=fTOUnicodeUTF8(mov[2])
    lTex=fUtf8HTML(lTex)
    f.write( "<TD ALIGN=LEFT> "+str(lTex)+"</TD>\n")
#    f.write( "<TD ALIGN=LEFT> "+str(mov[2])+"</TD>\n")
    lPre="%12.2f" % (mov[3])
    f.write( "<TD ALIGN=RIGHT> "+lPre.strip()+"</TD>\n")
    lImp="%12.2f" % (mov[4])
    if lXml["CliRfc"]=="XAXX010101000":
      lImp="%12.2f" % (mov[4]+mov[7])
      
    f.write( "<TD ALIGN=RIGHT> "+lImp.strip()+"</TD>\n")
    f.write( "</TR> \n")
    dVence = mov[5].strftime("%Y-%m-%d")
    (aVen, mVen, dVen) = dVence.split("-")
    mCli=mov[8]
    mNpr=mov[9]
    mVee=mov[10]
    mVno=mov[11]
    mTik=lfnd

  mVen=ficdef.fDatExt(dVence,3)
  f.write( "<TR>\n")
  f.write( "<TD>&nbsp;</TD>\n") 
  f.write( "<TD>&nbsp;</TD>\n") 
  f.write( "<TD>&nbsp;</TD>\n") 
  f.write( "<TD>&nbsp;</TD>\n") 
  f.write( "<TD ALIGN=RIGHT>SUBTOTAL</TD>\n")
  lTotTot="%12.2f" % (float(lXml["TotTotal"]))
  if lXml["CliRfc"]=="XAXX010101000":
    f.write( "<TD ALIGN=RIGHT>"+lTotTot+"</TD>\n")
  else:
    f.write( "<TD ALIGN=RIGHT>"+lXml["SubTotal"]+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR>\n")
  plin=ficdef.fPesos(float(lXml["TotTotal"]))
  f.write( "<TD COLSPAN=4 ROWSPAN=4 ALIGN=LEFT>Importe con letra: "+plin+"</TD>\n")
  f.write( "<TD ALIGN=RIGHT>16% IVA</TD>\n")
  if lXml["CliRfc"]=="XAXX010101000":
    f.write( "<TD ALIGN=RIGHT>&nbsp;</TD>\n")
  else:
    f.write( "<TD ALIGN=RIGHT>"+lXml["TotImpue"]+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR>\n")
  f.write( "<TD ALIGN=RIGHT>TOTAL</TD>\n")
  f.write( "<TD ALIGN=RIGHT>"+lTotTot+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "</TABLE>\n")
  f.write( "<TABLE BORDER=0 WIDTH=100%>\n" )
  f.write( "<TR>\n")
  f.write( "<TD ALIGN=LEFT>"+mCli+"</TD>\n")
  f.write( "<TD ALIGN=LEFT>"+mNpr+"</TD>\n")
  f.write( "<TD ALIGN=LEFT>"+mTik+"</TD>\n")
  f.write( "<TD ALIGN=LEFT>"+mVee+"</TD>\n")
  f.write( "<TD ALIGN=LEFT>"+mVno+"</TD>\n")
  f.write( "<TD ALIGN=LEFT>&nbsp;</TD>\n")
  f.write( "</TR>\n")
  f.write( "</TABLE>\n")
  f.write( "<HR>\n")
  if lEsOriginal==0:
    f.write( "<TABLE BORDER=0 WIDTH=100%>\n" )
    lCadOri=lCadOri.replace("Ñ","&Ntilde;") 
    lCadOri=lCadOri.replace("ñ","&ntilde;")
    lCadOri="||1.0|"+lUUID.strip()+"|"+lFechaCFD.strip()+"|"+lselloCFD.strip()+"|"+lCertiSAT.strip()+"||"
    lCadOri=lCadOri.encode("utf-8")
    f.write( "<TR>\n")
    f.write( "  <TD ALIGN=LEFT><FONT SIZE=-2>Sello SAT<FONT></TD>\n")
    f.write( "</TR>\n")
    f.write( "<TR>\n")
    f.write( "  <TD ALIGN=LEFT><FONT SIZE=-2>"+lselloSAT+"</FONT></TD>\n")
    f.write( "</TR>\n")
    f.write( "<TR>\n")
    f.write( "  <TD ALIGN=LEFT><FONT SIZE=-2>Sello Digital del CFDI<FONT></TD>\n")
    f.write( "</TR>\n")
    f.write( "<TR>\n")
    f.write( "  <TD ALIGN=LEFT><FONT SIZE=-2>"+lselloCFD+"</FONT></TD>\n")
    f.write( "</TR>\n")
    f.write( "<TR>\n")
    f.write( "  <TD ALIGN=LEFT><FONT SIZE=-2>Cadena original del complemento de certificacion digital del SAT</FONT></TD>\n")
    f.write( "</TR>\n")
    f.write( "<TR>\n")
    f.write( "  <TD ALIGN=LEFT><FONT SIZE=-2>"+lCadOri[:190]+" "+lCadOri[190:]+"<FONT></TD>\n")
    f.write( "</TR>\n")
    f.write( "</TABLE>\n")
    f.write( "<TABLE BORDER=0 WIDTH=100%>\n" )
    f.write( "<TR>\n")
#    f.write( "  <TD ALIGN=CENTER ROWSPAN=7> <IMG SRC=\""+lfacact+".png\" width=\"120\" height=\"120\" border=\"0\"> </TD> \n")
    f.write( "  <TD ALIGN=LEFT><FONT SIZE=-2>Fecha y Hora de certificado "+lFechaCFD+"<FONT></TD>\n")
    f.write( "  <TD ALIGN=RIGHT><FONT SIZE=-2>Numero de Certificado SAT "+lCertiSAT+"<FONT></TD>\n")
    f.write( "  <TD ALIGN=RIGHT><FONT SIZE=-2>Numero de Certificado CSD "+lCertiCSD+"<FONT></TD>\n")
    f.write( "</TR>\n")
    f.write( "</TABLE>\n")
    f.write( "<TABLE BORDER=0 WIDTH=100%>\n" )
    f.write( "<TR>\n")
    f.write( "  <TD ALIGN=LEFT><FONT SIZE=-2>Forma de Pago "+lFormPAG+"<FONT></TD>\n")
    f.write( "  <TD ALIGN=RIGHT><FONT SIZE=-2>Regimen Fiscal:<FONT></TD>\n")
    f.write( "  <TD ALIGN=LEFT><FONT SIZE=-2>"+lXml["RegFis"]+"<FONT></TD>\n")
    f.write( "  <TD ALIGN=RIGHT><FONT SIZE=-2>Metodo de Pago:<FONT></TD>\n")
    f.write( "  <TD ALIGN=LEFT><FONT SIZE=-2>"+lXml["CliFpa"]+"<FONT></TD>\n")
    if lXml["CliDpa"]:
      f.write( "<TD ALIGN=RIGHT><FONT SIZE=-2>Cta:<FONT></TD>\n")
      f.write( "<TD ALIGN=LEFT><FONT SIZE=-2>"+lXml["CliDpa"]+"<FONT></TD>\n")
    f.write( "</TR>\n")

    f.write( "</TABLE>\n")
    f.write( "<TABLE BORDER=0 WIDTH=100%>\n" )
    f.write( "<TR>\n")
    f.write( "  <TD ALIGN=CENTER>Este documento es una representacion impresa de un CFDI</TD>\n")
    f.write( "</TR>\n")
    f.write( "</TABLE>\n")
    f.write( "<HR>\n")
# Pagare
  f.write( "<TABLE BORDER=1 WIDTH=100%>\n" )
  f.write( "<TR>\n")
  f.write( "<TD><FONT SIZE=-1>POR ESTE PAGARE ME(NOS) COMPROMETO(EMOS) A PAGAR INCONDICIONALMENTE EL DIA <B>"+dVen+" DE \
"+mVen+" DE "+aVen+"</B> A LA ORDEN DE <B>"+lXml["EmiNom"]+"</B>, EN SU DOMICILIO \
LA CANTIDAD DE "+plin+" MERCANCIAS RECIBIDAS DE CONFORMIDAD. SI ESTE PAGARE NO FUERA CUBIERTO A SU VENCIMIENTO \
CAUSARA UN INTERES MORATORIO DEL ..... % MENSUAL HASTA SU TOTAL LIQUIDACION.</FONT></TD>\n")
  f.write( "</TR>\n")
#  f.write( "<TR>\n")
#  f.write( "<TD ALIGN=RIGHT><FONT SIZE=-1>.................................<FONT></TD>\n")
#  f.write( "</TR>\n")
  f.write( "<TR>\n")
  f.write( "<TD ALIGN=RIGHT><FONT SIZE=-1>           F  I  R  M  A        .<FONT></TD>\n")
  f.write( "</TR>\n")
  f.write( "</TABLE>\n")
  f.write( "<TABLE BORDER=0 WIDTH=100%>\n" )
  (lanio,lmes,ldia)=lHoy.split('-')
  lTex=ficdef.fDatExt(lHoy,1)
  f.write( "<TR>\n")
  f.write( "<TD ALIGN=LEFT>CHIHUAHUA, CHIH. a "+lTex+".</TD>\n")
  f.write( "<TD ALIGN=RIGHT>Efectos fiscales al pago.</TD>\n")
  f.write( "</TR>\n")
  f.write( "</TABLE>\n")
# 
#  f.write( "<TABLE BORDER=0 WIDTH=100%>\n" )
#  f.write( "<TR>\n")
##  f.write( "<TD ALIGN=CENTER>Este documento es una impresi&oacute;n de un comprobante fiscal digital</TD>\n")
#  f.write( "<TD ALIGN=CENTER>Este documento es una representaci&oacute;n impresa de un CFD</TD>\n")
#  f.write( "</TR>\n")
#  f.write( "</TABLE>\n")
  f.write( "<HR>\n")
# 
  f.write( "<TABLE BORDER=0 WIDTH=100%>\n" )
  f.write( "<TR>\n")
#  f.write( "<TD ALIGN=CENTER>TODA DEVOLUCION CAUSA UN 10% POR FALSO MANEJO</TD>\n")
#  f.write( "<TD ALIGN=CENTER>DEVOLUCION SOLO EL DIA DE LA VENTA, FORANEAS 5 DIAS DESPUES</TD>\n")
#  f.write( "<TD ALIGN=CENTER>EN PARTES ELECTRICAS NO HAY GARANTIA NI DEVOLUCION</TD>\n")
#  f.write( "<TD ALIGN=CENTER>SOLO ACEPTAMOS DEVOLUCIONES PRESENTANDO LA FACTURA</TD>\n")
  f.write( "<TD ALIGN=CENTER>"+lXml["Let001"]+"</TD>\n")
  f.write( "<TD ALIGN=CENTER>"+lXml["Let002"]+"</TD>\n")
  f.write( "<TD ALIGN=CENTER>"+lXml["Let003"]+"</TD>\n")
  f.write( "<TD ALIGN=CENTER>"+lXml["Let004"]+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "</TABLE>\n")
  if lEsOriginal==1:
    f.write( "<TABLE BORDER=0 WIDTH=100%>\n" )
    f.write( "<TR>\n")
    f.write( "<TD ALIGN=CENTER>*** C O P I A ***</TD>\n")
    f.write( "</TR>\n")
    f.write( "</TABLE>\n")
    f.write( "<HR>\n")

  f.write( "</BODY>\n" )
  f.write( "</HTML>\n" )
  f.closed
  return


def fFacHTMLdbCC(lHoy,lfacact,lSello,lXml,lfnd,lDirCfd,lObserva,lAplicar,lTipDoc):
  """
  aXml["Cliente"]=lCliente=mov[0]
  aXml["SubTotal"]=lSubTotal=str(mov[1])
  aXml["TotImpue"]=lTotImpue=str(mov[2])
  aXml["TotTotal"]=lTotTotal=str(mov[3])
  aXml["lSerie"]=lserie=fol[0].strip()
  aXml["lActual"]=lactual=("%10d" % (fol[1])).strip()
  aXml["Aproba"]=laproba=fol[2].strip()
  aXml["AnioAp"]=lanioap=fol[3].strip()
  aXml["FecAct"]=mfecact=mov[0].strip()
  aXml["NoCer"]=mNoCer=mov[1].strip()
  aXml["EmiNom"]=mEmiNom=row[0].strip()
  aXml["EmiRfc"]=mEmiRfc=row[1].strip()
  aXml["EmiCal"]=mEmiCal=row[2].strip()
  aXml["EmiNoE"]=mEmiNoE=row[3].strip()
  aXml["EmiCol"]=mEmiCol=row[4].strip()
  aXml["EmiLoc"]=mEmiLoc=row[5].strip()
  adminXml["EmiMun"]=mEmiMun=row[6].strip()
  aXml["EmiEst"]=mEmiEst=row[7].strip()
  aXml["EmiPai"]=mEmiPai=row[8].strip()
  aXml["EmiCod"]=mEmiCod=row[9].strip()
  aXml["CliRfc"]=mCliRfc=cli[0].strip()
  aXml["CliNom"]=mCliNom=cli[1].strip()
  aXml["CliRfc"]=mCliRfc
  aXml["CliDom"]=mCliDom=cli[2].strip()
  aXml["CliCol"]=mCliCol=cli[3].strip()
  aXml["CliLoc"]=mCliLoc=cli[4].strip()
  aXml["CliMun"]=mCliMun=cli[5].strip()
  aXml["CliEst"]=mCliEst=cli[6].strip()
  aXml["CliPai"]=mCliPai=cli[7].strip()
  aXml["CliCoP"]=mCliCoP=cli[8].strip()
  aXml["CliPla"]=("%4d" % (cli[9])).strip()
  """
  lEsOriginal=0
  if lEsOriginal==0:
#    lFilTim="timbre/"+lfacact+"t.xml"
    lFilTim=lDirCfd+lfacact+"t.xml"
    lPngTim=lDirCfd+lfacact+".png"
    doc=minidom.parse(lFilTim)
    lUUID=doc.childNodes[0].childNodes[4].childNodes[0].getAttributeNS(None,"UUID")
    lselloSAT=doc.childNodes[0].childNodes[4].childNodes[0].getAttributeNS(None,"selloSAT")
    lCertiSAT=doc.childNodes[0].childNodes[4].childNodes[0].getAttributeNS(None,"noCertificadoSAT")
    lselloCFD=doc.childNodes[0].childNodes[4].childNodes[0].getAttributeNS(None,"selloCFD")
    lFechaCFD=doc.childNodes[0].childNodes[4].childNodes[0].getAttributeNS(None,"FechaTimbrado")
    lCertiCSD=doc.childNodes[0].getAttributeNS(None,"noCertificado")
    lFormPAG=doc.childNodes[0].getAttributeNS(None,"formaDePago")
    lMetoPAG=doc.childNodes[0].getAttributeNS(None,"metodoDePago")
    lok=system("/usr/bin/qrencode -m 1 -v 1 -s 4 -o '"+lPngTim+\
      "' '?re="+lXml["EmiRfc"]+"&rr="+lXml["CliRfc"]+"&tt="+lXml["TotTotal"]+"&id="+lUUID+"'")
    """
    qrencode -d 200 -m 1 -v 1 -s 4 -o 'Timbre.png' \
    '?re=ROAF641217K94&rr=INC101109Q36&tt=1234567890.123456&id=ad662d33-6934-459c-a128-BDf0393f0f44
    """
  mcadori=lDirCfd+lfacact+".cadenaoriginal"
  fichero = open(path.realpath(mcadori), "r")
  lCadOri=fichero.readline()
  fichero.closed
  lfactura=lDirCfd+lfacact+".html"
  f = open(path.realpath(lfactura), "w")
# Emisor
  f.write( "<HTML>\n" )
  f.write( "<BODY>\n" )
  f.write( "<CENTER>\n")
  f.write( "<TABLE BORDER=0 WIDTH=100%>\n" )
# Mon Apr 25 12:38:32 MDT 2011 agregar imagen 
  f.write( "<TR>\n")
  if lEsOriginal==0:
    f.write( "  <TD ALIGN=CENTER ROWSPAN=7> <IMG SRC=\""+lfacact+".png\" width=\"120\" height=\"120\" border=\"0\"> </TD> \n")
#  f.write( "  <TD ALIGN=CENTER ROWSPAN=7> <IMG SRC=\"logo.jpg\" width=\"180\" height=\"110\" border=\"0\"> </TD> \n")
  f.write( "  <TD ALIGN=CENTER>EMISOR</TD>\n")
  f.write( "</TR>\n")

#  f.write( "<TR>\n")
#  f.write( "  <TD ALIGN=CENTER ROWSPAN=6> <IMG SRC=\"logo.jpg\"> </TD> \n")
#  f.write( "  <TD ALIGN=CENTER>EMISOR</TD>\n")
#  f.write( "</TR>\n")

  f.write( "<TR>\n")
  f.write( "  <TD ALIGN=CENTER>"+lXml["EmiNom"]+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR>\n")
  f.write( "  <TD ALIGN=CENTER>"+lXml["EmiCal"]+" "+lXml["EmiNoE"]+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR>\n")
  f.write( "  <TD ALIGN=CENTER>"+lXml["EmiCol"]+" "+lXml["EmiLoc"]+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR>\n")
  f.write( "  <TD ALIGN=CENTER>"+lXml["EmiMun"]+" "+lXml["EmiEst"]+" "+lXml["EmiPai"]+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR>\n")
  f.write( "  <TD ALIGN=CENTER>"+lXml["EmiCod"]+" RFC. "+lXml["EmiRfc"]+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "</TABLE>\n")
  f.write( "<HR>\n")
# Cliente
  f.write( "<TABLE BORDER=0 WIDTH=100%>\n" )
  f.write( "<TR>\n")
  f.write( "  <TD ALIGN=CENTER><B>CLIENTE</B></TD>\n")
  if lTipDoc=='DR':
    f.write( "  <TD ALIGN=CENTER>NOTA DE CREDITO "+lTipDoc+" <B>CREDITO</B></TD>\n")
  else:
    f.write( "  <TD ALIGN=CENTER>NOTA DE CREDITO "+lTipDoc+" <B>CONTADO</B></TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR>\n")
#  lTex=lXml["CliNom"]
#  lTex=lTex.replace("Ñ","&Ntilde;") 
#  lTex=lTex.replace("ñ","&ntilde;")
  lTex=fUtf8HTML(lXml["CliNom"])
  f.write( "  <TD ALIGN=LEFT>"+lTex+"</TD>\n")
  f.write( "  <TD ALIGN=CENTER>"+lfacact+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR> \n")
#  f.write( "  <TD ALIGN=LEFT>"+lXml["CliDom"]+"</TD>\n")
  lTex=fUtf8HTML(lXml["CliDom"])
  f.write( "  <TD ALIGN=LEFT>"+lTex+"</TD>\n")
  f.write( "  <TD ALIGN=CENTER>FECHA</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR> \n")
  lTex=fUtf8HTML(lXml["CliCol"])
  f.write( "  <TD ALIGN=LEFT>"+lTex+" "+fUtf8HTML(lXml["CliLoc"])+"</TD>\n")
#  f.write( "  <TD ALIGN=LEFT>"+lXml["CliCol"]+" "+lXml["CliLoc"]+"</TD>\n")
  lTex=lXml["FecAct"].replace("T"," ")
  f.write( "  <TD ALIGN=CENTER>"+lTex+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR> \n")
  f.write( "  <TD ALIGN=LEFT>"+lXml["CliMun"]+" "+lXml["CliEst"]+" "+lXml["CliPai"]+"</TD>\n")
#  f.write( "  <TD ALIGN=CENTER>A&ntilde;o y No. de Aprobaci&oacute;n de Folios</TD>\n")
  if lEsOriginal==0:
    f.write( "  <TD ALIGN=CENTER>FOLIO FISCAL</TD>\n")
  else:
    f.write( "  <TD ALIGN=CENTER>&nbsp;</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR> \n")
  f.write( "  <TD ALIGN=LEFT>"+lXml["CliCoP"]+" RFC. "+lXml["CliRfc"]+"</TD>\n")
#  f.write( "  <TD ALIGN=CENTER>"+lXml["AnioAp"]+" "+lXml["Aproba"]+"</TD>\n")
  if lEsOriginal==0:
    f.write( "  <TD ALIGN=CENTER>"+lUUID+"</TD>\n")
  else:
    f.write( "  <TD ALIGN=CENTER>&nbsp;</TD>\n")
  f.write( "</TR>\n")
  f.write( "</TABLE>\n")
  f.write( "<HR>\n")
# Movimientos
  movs=fFetchAll("SELECT di_entrada,'PZ',di_descrip,di_precio,di_importe,di_numpar,di_impuesto FROM "+lfnd)
  f.write( "<TABLE BORDER=0 WIDTH=100%>\n" )
  f.write( "<TR> \n")
  f.write( "<TH ALIGN=LEFT> Cantidad </TH>\n")
  f.write( "<TH ALIGN=LEFT> Parte </TH>\n")
  f.write( "<TH ALIGN=LEFT> Descripcion </TH>\n")
  f.write( "<TH ALIGN=RIGHT> Precio </TH>\n")
  f.write( "<TH ALIGN=RIGHT> Importe </TH>\n")
  f.write( "</TR> \n")
  for mov in movs:
    f.write( "<TR> \n")
    f.write( "<TD ALIGN=LEFT> "+str(mov[0])+"</TD>\n")
    f.write( "<TD ALIGN=LEFT> "+str(mov[5])+"</TD>\n")
    lTex=fTOUnicodeUTF8(mov[2])
    lTex=fUtf8HTML(lTex)
#    lTex=mov[2]
#    lTex=lTex.replace("Ñ","&Ntilde;") 
#    lTex=lTex.replace("ñ","&ntilde;")
#    f.write( "<TD ALIGN=LEFT> "+str(lTex)+"</TD>\n")
    f.write( "<TD ALIGN=LEFT> "+lTex+"</TD>\n")
    lPre="%12.2f" % (mov[3])
    f.write( "<TD ALIGN=RIGHT> "+lPre.strip()+"</TD>\n")
    lImp="%12.2f" % (mov[4])
    if lXml["CliRfc"]=="XAXX010101000":
      lImp="%12.2f" % (float(mov[4])+float(mov[6]))
    f.write( "<TD ALIGN=RIGHT> "+lImp.strip()+"</TD>\n")
    f.write( "</TR> \n")
  f.write( "<TR>\n")
  f.write( "<TD>&nbsp;</TD>\n") 
  f.write( "<TD>&nbsp;</TD>\n") 
  f.write( "<TD>&nbsp;</TD>\n") 
  f.write( "<TD ALIGN=RIGHT>SUBTOTAL</TD>\n")
  lTotTot="%12.2f" % (float(lXml["TotTotal"]))
  if lXml["CliRfc"]=="XAXX010101000":
    f.write( "<TD ALIGN=RIGHT>"+lTotTot+"</TD>\n")
  else:
    f.write( "<TD ALIGN=RIGHT>"+lXml["SubTotal"]+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR>\n")
  plin=ficdef.fPesos(float(lXml["TotTotal"]))
  f.write( "<TD COLSPAN=3 ROWSPAN=4 ALIGN=LEFT>Importe con letra: "+plin+"</TD>\n")
  f.write( "<TD ALIGN=RIGHT>16% IVA</TD>\n")
  if lXml["CliRfc"]=="XAXX010101000":
    f.write( "<TD ALIGN=RIGHT>&nbsp;</TD>\n")
  else:
    f.write( "<TD ALIGN=RIGHT>"+lXml["TotImpue"]+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR>\n")
  f.write( "<TD ALIGN=RIGHT>TOTAL</TD>\n")
  f.write( "<TD ALIGN=RIGHT>"+lTotTot+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "</TABLE>\n")
  f.write( "<HR>\n")
  if lEsOriginal==0:
    f.write( "<TABLE BORDER=0 WIDTH=100%>\n" )
    lCadOri=lCadOri.replace("Ñ","&Ntilde;") 
    lCadOri=lCadOri.replace("ñ","&ntilde;")
    lCadOri="||1.0|"+lUUID.strip()+"|"+lFechaCFD.strip()+"|"+lselloCFD.strip()+"|"+lCertiSAT.strip()+"||"
    lCadOri=lCadOri.encode("utf-8")
    f.write( "<TR>\n")
    f.write( "  <TD ALIGN=LEFT><FONT SIZE=-2>Sello SAT<FONT></TD>\n")
    f.write( "</TR>\n")
    f.write( "<TR>\n")
    f.write( "  <TD ALIGN=LEFT><FONT SIZE=-2>"+lselloSAT+"</FONT></TD>\n")
    f.write( "</TR>\n")
    f.write( "<TR>\n")
    f.write( "  <TD ALIGN=LEFT><FONT SIZE=-2>Sello Digital del CFDI<FONT></TD>\n")
    f.write( "</TR>\n")
    f.write( "<TR>\n")
    f.write( "  <TD ALIGN=LEFT><FONT SIZE=-2>"+lselloCFD+"</FONT></TD>\n")
    f.write( "</TR>\n")
    f.write( "<TR>\n")
    f.write( "  <TD ALIGN=LEFT><FONT SIZE=-2>Cadena original del complemento de certificacion digital del SAT</FONT></TD>\n")
    f.write( "</TR>\n")
    f.write( "<TR>\n")
    f.write( "  <TD ALIGN=LEFT><FONT SIZE=-2>"+lCadOri[:190]+" "+lCadOri[190:]+"<FONT></TD>\n")
    f.write( "</TR>\n")
    f.write( "</TABLE>\n")
    f.write( "<TABLE BORDER=0 WIDTH=100%>\n" )
    f.write( "<TR>\n")
#    f.write( "  <TD ALIGN=CENTER ROWSPAN=7> <IMG SRC=\""+lfacact+".png\" width=\"120\" height=\"120\" border=\"0\"> </TD> \n")
    f.write( "  <TD ALIGN=LEFT><FONT SIZE=-2>Fecha y Hora de certificado "+lFechaCFD+"<FONT></TD>\n")
    f.write( "  <TD ALIGN=RIGHT><FONT SIZE=-2>Numero de Certificado SAT "+lCertiSAT+"<FONT></TD>\n")
    f.write( "  <TD ALIGN=RIGHT><FONT SIZE=-2>Numero de Certificado CSD "+lCertiCSD+"<FONT></TD>\n")
    f.write( "</TR>\n")
    f.write( "</TABLE>\n")
    f.write( "<TABLE BORDER=0 WIDTH=100%>\n" )
    f.write( "<TR>\n")
    f.write( "  <TD ALIGN=LEFT><FONT SIZE=-2>Forma de Pago "+lFormPAG+"<FONT></TD>\n")
    f.write( "  <TD ALIGN=RIGHT><FONT SIZE=-2>Regimen Fiscal:<FONT></TD>\n")
    f.write( "  <TD ALIGN=LEFT><FONT SIZE=-2>"+lXml["RegFis"]+"<FONT></TD>\n")
    f.write( "  <TD ALIGN=RIGHT><FONT SIZE=-2>Metodo de Pago:<FONT></TD>\n")
    f.write( "  <TD ALIGN=LEFT><FONT SIZE=-2>"+lXml["CliFpa"]+"<FONT></TD>\n")
    if lXml["CliDpa"]:
      f.write( "<TD ALIGN=RIGHT><FONT SIZE=-2>Cta:<FONT></TD>\n")
      f.write( "<TD ALIGN=LEFT><FONT SIZE=-2>"+lXml["CliDpa"]+"<FONT></TD>\n")
    f.write( "</TR>\n")

    f.write( "</TABLE>\n")
    f.write( "<TABLE BORDER=0 WIDTH=100%>\n" )
    f.write( "<TR>\n")
    f.write( "  <TD ALIGN=CENTER>Este documento es una representacion impresa de un CFDI</TD>\n")
    f.write( "</TR>\n")
    f.write( "</TABLE>\n")
    f.write( "<HR>\n")
# Cadena Original, Sello digital
#  f.write( "<TABLE BORDER=0 WIDTH=100%>\n" )
#  f.write( "<TR>\n")
#  f.write( "<TD ALIGN=LEFT><FONT SIZE=-2>Cadena original<FONT></TD>\n")
#  f.write( "<TD ALIGN=RIGHT><FONT SIZE=-2>Numero de Certificado<FONT></TD>\n")
#  f.write( "<TD ALIGN=LEFT><FONT SIZE=-2>"+lXml["NoCer"]+"<FONT></TD>\n")
#  f.write( "</TR>\n")
#  f.write( "<TR>\n")
#  lCadOri=lCadOri.replace("Ñ","&Ntilde;") 
#  lCadOri=lCadOri.replace("ñ","&ntilde;")
#  f.write( "<TD COLSPAN=3><FONT SIZE=-2>"+lCadOri+"<FONT></TD>\n")
#  f.write( "</TR>\n")
#  f.write( "<TR>\n")
#  f.write( "<TD ALIGN=LEFT COLSPAN=3><FONT SIZE=-2>Sello digital<FONT></TD>\n")
#  f.write( "</TR>\n")
#  f.write( "<TR>\n")
#  f.write( "<TD COLSPAN=3><FONT SIZE=-2>"+lSello+"</FONT></TD>\n")
#  f.write( "</TR>\n")
#  f.write( "</TABLE>\n")
#  f.write( "<HR>\n")
# Observaciones y aplicar
  f.write( "<TABLE BORDER=0 WIDTH=100%>\n" )
  f.write( "<TR>\n")
  f.write( "<TD><FONT>"+lAplicar+" "+lObserva+"</FONT></TD>\n")
  f.write( "</TR>\n")
  (lanio,lmes,ldia)=lHoy.split('-')
  lTex=ficdef.fDatExt(lHoy,1)
  f.write( "<TR>\n")
  f.write( "<TD ALIGN=RIGHT>CHIHUAHUA, CHIH. a "+lTex+".</TD>\n")
  f.write( "</TR>\n")
  f.write( "</TABLE>\n")
  f.write( "<HR>\n")
# 
#  f.write( "<TABLE BORDER=0 WIDTH=100%>\n" )
#  f.write( "<TR>\n")
#  f.write( "<TD ALIGN=CENTER>Este documento es una impresi&oacute;n de un comprobante fiscal digital</TD>\n")
#  f.write( "<TD ALIGN=CENTER>Este documento es una representaci&oacute;n impresa de un CFD</TD>\n")
#  f.write( "</TR>\n")
#  f.write( "</TABLE>\n")

  f.write( "</BODY>\n" )
  f.write( "</HTML>\n" )
  f.closed
  return

"""
# XML Ingreso (cargo por flete)
def fXMLca(lfnd,lDirCfd):

#    lrows=fFetchAll("SELECT \
#      di_clipro,cl_nombre,cl_nombre2,cl_domicil1,cl_domicil2,cl_colonia,cl_ciudad,cl_estado,cl_codipost,cl_telefono, \
#      cl_rfc, \
#      di_tipdoc,di_numdoc,di_refer,di_fecha,di_vende,di_gpo,di_numpar,di_descrip,di_entrada,di_importe,di_impuesto, \
#      di_total, di_numpre, di_precio, (di_fecha + di_plazo) \
#      FROM "+lfnd+", fnclie  \
#      WHERE di_clipro=cl_cliente ;")

  aXml={}

  mov=fFetchOne("SELECT dc_cliente,sum(dc_importe),sum(dc_impuesto),sum(dc_total) FROM "+lfnd+" GROUP BY dc_cliente;")
  aXml["Cliente"]=lCliente=mov[0]
  aXml["SubTotal"]=lSubTotal="%12.2f" % (mov[1])
  aXml["TotImpue"]=lTotImpue="%12.2f" % (mov[2])
  aXml["TotTotal"]=lTotTotal="%12.2f" % (mov[3])
# Create the minidom document for cadenaoriginal
  doc = minidom.Document()

# Create the <Comprabante> base element
  fol=fFetchOne("SELECT fo_serie,fo_actual,fo_aproba,fo_anio FROM fnfolca")
  fSql("UPDATE fnfolca set fo_actual=fo_actual+1")
  aXml["lSerie"]=lserie=fol[0].strip()
  aXml["lActual"]=lactual=("%10d" % (fol[1])).strip()
  aXml["Aproba"]=laproba=fol[2].strip()
  aXml["AnioAp"]=lanioap=fol[3].strip()
#  mov=fFetchOne("SELECT fc_fecha||'T'||extract(hour from fc_hora)||':'||extract(minute from fc_hora)||':'||extract(second from fc_hora) FROM fnfact WHERE fc_numdoc='"+lfnd+"'")
  mov=fFetchOne("SELECT to_char(dc_fecha,'YYYY-MM-DD')||'T'||to_char(dc_fecmov, 'HH24:MI:SS') FROM "+lfnd)
  aXml["FecAct"]=mfecact=mov[0].strip()
  mfacact=lserie+lactual
  mov=fFetchOne("SELECT * FROM fncert")
  aXml["NoCer"]=mNoCer=mov[1].strip()
  Comprobante = doc.createElement("Comprobante")
  Comprobante.setAttribute("xmlns","http://www.sat.gob.mx/cfd/2")
  Comprobante.setAttribute("xmlns:xsi","http://www.w3.org/2001/XMLSchema-instance")
  Comprobante.setAttribute("xsi:schemaLocation","http://www.sat.gob.mx/cfd/2 http://www.sat.gob.mx/sitio_internet/cfd/2/cfdv2.xsd")
  Comprobante.setAttribute("version","2.0")
  Comprobante.setAttribute("serie",lserie)
  Comprobante.setAttribute("folio",lactual)
  Comprobante.setAttribute("fecha",mfecact)
  Comprobante.setAttribute("noAprobacion",laproba)
  Comprobante.setAttribute("anoAprobacion",lanioap)
  Comprobante.setAttribute("formaDePago","Pago en una sola exhibicion")
  Comprobante.setAttribute("subTotal",lSubTotal)
  Comprobante.setAttribute("total",lTotTotal)
  Comprobante.setAttribute("metodoDePago","Efectivo")
  Comprobante.setAttribute("tipoDeComprobante","ingreso")
  Comprobante.setAttribute("noCertificado",mNoCer)
  doc.appendChild(Comprobante)

# Create the main <Emisor> element
  row=fFetchOne("SELECT cn_rsocial,cn_rfc,cn_direccion,cn_noexte,cn_coloni,cn_locali,cn_munici,cn_estado,cn_pais,cn_codpos FROM fncontrol")
  aXml["EmiNom"]=mEmiNom=row[0].strip()
  aXml["EmiRfc"]=mEmiRfc=row[1].strip()
  aXml["EmiCal"]=mEmiCal=row[2].strip()
  aXml["EmiNoE"]=mEmiNoE=row[3].strip()
  aXml["EmiCol"]=mEmiCol=row[4].strip()
  aXml["EmiLoc"]=mEmiLoc=row[5].strip()
  aXml["EmiMun"]=mEmiMun=row[6].strip()
  aXml["EmiEst"]=mEmiEst=row[7].strip()
  aXml["EmiPai"]=mEmiPai=row[8].strip()
  aXml["EmiCod"]=mEmiCod=row[9].strip()
  Emisor = doc.createElement("Emisor")
  Emisor.setAttribute("nombre", mEmiNom)
  Emisor.setAttribute("rfc", mEmiRfc)
  Comprobante.appendChild(Emisor)

# Create a <DomicilioFiscal> element
  DomicilioFiscal = doc.createElement("DomicilioFiscal")
  DomicilioFiscal.setAttribute("calle",mEmiCal)
  DomicilioFiscal.setAttribute("noExterior",mEmiNoE)
  DomicilioFiscal.setAttribute("colonia",mEmiCol)
  DomicilioFiscal.setAttribute("localidad",mEmiLoc)
  DomicilioFiscal.setAttribute("municipio",mEmiMun)
  DomicilioFiscal.setAttribute("estado",mEmiEst)
  DomicilioFiscal.setAttribute("pais",mEmiPai)
  DomicilioFiscal.setAttribute("codigoPostal",mEmiCod)
  Emisor.appendChild(DomicilioFiscal)

  
# Create a <ExpedidoEn> element
#  ExpedidoEn = doc.createElement("ExpedidoEn")
#  ExpedidoEn.setAttribute("calle","")
#  ExpedidoEn.setAttribute("noExterior","")
#  ExpedidoEn.setAttribute("colonia","")
#  ExpedidoEn.setAttribute("localidad","")
#  ExpedidoEn.setAttribute("municipio","")
#  ExpedidoEn.setAttribute("estado","")
#  ExpedidoEn.setAttribute("pais","")
#  ExpedidoEn.setAttribute("codigoPostal","")
#  Emisor.appendChild(ExpedidoEn)

# Give the <p> elemenet some text
# ptext = doc.createTextNode("This is a test!")
# DomicilioFiscal.appendChild(ptext)

  cli=fFetchOne("SELECT cl_rfc,cl_nombre||cl_nombre2,cl_domicil1||cl_domicil2,cl_colonia,cl_colonia as localidad,cl_ciudad as municipio,\
  cl_estado,'MEXICO',cl_codipost,cl_plazo,cl_monfac FROM fnclie WHERE cl_cliente='"+lCliente+"'")
  if cli[0].strip() :
    aXml["CliRfc"]=mCliRfc=cli[0].strip()
  else:
    aXml["CliRfc"]=mCliRfc='XAXX010101000'
  aXml["CliNom"]=mCliNom=cli[1].strip()
  mCliRfc=mCliRfc.replace("-","")
  mCliRfc=mCliRfc.replace(" ","")
  mCliRfc=mCliRfc.replace(".","")
  aXml["CliRfc"]=mCliRfc
  aXml["CliDom"]=mCliDom=cli[2].strip()
  aXml["CliCol"]=mCliCol=cli[3].strip()
  aXml["CliLoc"]=mCliLoc=cli[4].strip()
  aXml["CliMun"]=mCliMun=cli[5].strip()
  aXml["CliEst"]=mCliEst=cli[6].strip()
  aXml["CliPai"]=mCliPai=cli[7].strip()
  aXml["CliCoP"]=mCliCoP=cli[8].strip()
  aXml["CliPla"]=("%4d" % (cli[9])).strip()
  aXml["CliMof"]=mCliMof=cli[10].strip()
# Create the main <Receptor> element
  Receptor = doc.createElement("Receptor")
  Receptor.setAttribute("rfc", mCliRfc)
  Receptor.setAttribute("nombre", mCliNom)
  Comprobante.appendChild(Receptor)

# Create a <Domicilio> element
  Domicilio = doc.createElement("Domicilio")
  Domicilio.setAttribute("calle",mCliDom)
  Domicilio.setAttribute("noExterior","9")
  if mCliCol: Domicilio.setAttribute("colonia",mCliCol)
  if mCliLoc: Domicilio.setAttribute("localidad",mCliLoc)
  if mCliMun: Domicilio.setAttribute("municipio",mCliMun)
  if mCliEst: Domicilio.setAttribute("estado",mCliEst)
  if mCliPai: Domicilio.setAttribute("pais",mCliPai)
  if mCliCoP: Domicilio.setAttribute("codigoPostal",mCliCoP)
  Receptor.appendChild(Domicilio)

# Create the main <Conceptos> element
#  movs=fFetchAll("SELECT di_entrada,'PZ',di_descrip,di_precio,di_importe,di_tipdoc FROM "+lfnd)
  movs=fFetchAll("SELECT '1','PZ','FLETE',dc_total/1.16,dc_total/1.16,dc_tipodocu FROM "+lfnd)
  Conceptos = doc.createElement("Conceptos")
  Comprobante.appendChild(Conceptos)

# Create a <Concepto> element
  for mov in movs:
    aXml["TipDoc"]=mov[5].strip()
    Concepto = doc.createElement("Concepto")
    Concepto.setAttribute("cantidad",str(mov[0]))
#    Concepto.setAttribute("unidad",mov[1])
    Concepto.setAttribute("descripcion",mov[2])
    lPre="%12.2f" % (mov[3])
    Concepto.setAttribute("valorUnitario",lPre.strip())
    lImp="%12.2f" % (mov[4])
    Concepto.setAttribute("importe",lImp.strip())
    Conceptos.appendChild(Concepto)

# Create the main <Impuestos> element
  Impuestos = doc.createElement("Impuestos")
  Impuestos.setAttribute("totalImpuestosTrasladados", lTotImpue)
  Comprobante.appendChild(Impuestos)

# Create the main <Traslados> element
  Traslados = doc.createElement("Traslados")
# Create the main <Traslado> element
  Traslado = doc.createElement("Traslado")
  Traslado.setAttribute("impuesto", "IVA")
  Traslado.setAttribute("tasa", "16.00")
  Traslado.setAttribute("importe", lTotImpue)
  Traslados.appendChild(Traslado)
  Impuestos.appendChild(Traslados)

# Print our newly created XML
#  print doc.toprettyxml(indent="  ")

# Write file XML
  mfactura=lDirCfd+mfacact+".xml"
  fichero = open(path.realpath(mfactura), "w")
  doc.writexml(fichero, encoding="UTF-8")
  fichero.closed

# ############### fXML2
  lfacact=mfacact
  mfactura=lDirCfd+lfacact+".xml"
  mcadori=lDirCfd+lfacact+".cadenaoriginal"
  msello=lDirCfd+lfacact+".sello"
# Sun Nov 28 21:02:22 MST 2010 
# Crear Cadena original
  lCommand="/usr/bin/xsltproc lcadenaoriginal_2_0.xslt "+mfactura+" >"+mcadori
  lok=system(lCommand)

## Genera llave Privada
#  lCommand="/usr/bin/openssl pkcs8 -inform DER -in sat/certificado.key -passin pass:a0123456789 -out sat/llaveprivada.pem.txt"
#  lok=ststem(lCommand)

# Genera Sello Digital
#  lCommand="/usr/bin/openssl dgst -md5 -sign sat/llaveprivada.pem.txt "+mcadori+" | openssl enc -base64 -A >"+msello
# para 2011
  lCommand="/usr/bin/openssl dgst -sha1 -sign sat/llaveprivada.pem.txt "+mcadori+" | openssl enc -base64 -A >"+msello
  lok=system(lCommand)
# ######

  return (mfacact,lserie,lactual,aXml)
"""


def fFacHTMLca(lHoy,lfacact,lSello,lXml,lfnd,lDirCfd,lObserva,lAplicar,lTipDoc):
  """
  aXml["Cliente"]=lCliente=mov[0]
  aXml["SubTotal"]=lSubTotal=str(mov[1])
  aXml["TotImpue"]=lTotImpue=str(mov[2])
  aXml["TotTotal"]=lTotTotal=str(mov[3])
  aXml["lSerie"]=lserie=fol[0].strip()
  aXml["lActual"]=lactual=("%10d" % (fol[1])).strip()
  aXml["Aproba"]=laproba=fol[2].strip()
  aXml["AnioAp"]=lanioap=fol[3].strip()
  aXml["FecAct"]=mfecact=mov[0].strip()
  aXml["NoCer"]=mNoCer=mov[1].strip()
  aXml["EmiNom"]=mEmiNom=row[0].strip()
  aXml["EmiRfc"]=mEmiRfc=row[1].strip()
  aXml["EmiCal"]=mEmiCal=row[2].strip()
  aXml["EmiNoE"]=mEmiNoE=row[3].strip()
  aXml["EmiCol"]=mEmiCol=row[4].strip()
  aXml["EmiLoc"]=mEmiLoc=row[5].strip()
  adminXml["EmiMun"]=mEmiMun=row[6].strip()
  aXml["EmiEst"]=mEmiEst=row[7].strip()
  aXml["EmiPai"]=mEmiPai=row[8].strip()
  aXml["EmiCod"]=mEmiCod=row[9].strip()
  aXml["CliRfc"]=mCliRfc=cli[0].strip()
  aXml["CliNom"]=mCliNom=cli[1].strip()
  aXml["CliRfc"]=mCliRfc
  aXml["CliDom"]=mCliDom=cli[2].strip()
  aXml["CliCol"]=mCliCol=cli[3].strip()
  aXml["CliLoc"]=mCliLoc=cli[4].strip()
  aXml["CliMun"]=mCliMun=cli[5].strip()
  aXml["CliEst"]=mCliEst=cli[6].strip()
  aXml["CliPai"]=mCliPai=cli[7].strip()
  aXml["CliCoP"]=mCliCoP=cli[8].strip()
  aXml["CliPla"]=("%4d" % (cli[9])).strip()
  """
  mcadori=lDirCfd+lfacact+".cadenaoriginal"
  fichero = open(path.realpath(mcadori), "r")
  lCadOri=fichero.readline()
  fichero.closed
  lfactura=lDirCfd+lfacact+".html"
  f = open(path.realpath(lfactura), "w")
# Emisor
  f.write( "<HTML>\n" )
  f.write( "<BODY>\n" )
  f.write( "<CENTER>\n")
  f.write( "<TABLE BORDER=0 WIDTH=100%>\n" )
  f.write( "<TR>\n")
  f.write( "  <TD ALIGN=CENTER ROWSPAN=6> <IMG SRC=\"logo.jpg\"> </TD> \n")
  f.write( "  <TD ALIGN=CENTER>EMISOR</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR>\n")
  f.write( "  <TD ALIGN=CENTER>"+lXml["EmiNom"]+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR>\n")
  f.write( "  <TD ALIGN=CENTER>"+lXml["EmiCal"]+" "+lXml["EmiNoE"]+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR>\n")
  f.write( "  <TD ALIGN=CENTER>"+lXml["EmiCol"]+" "+lXml["EmiLoc"]+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR>\n")
  f.write( "  <TD ALIGN=CENTER>"+lXml["EmiMun"]+" "+lXml["EmiEst"]+" "+lXml["EmiPai"]+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR>\n")
  f.write( "  <TD ALIGN=CENTER>"+lXml["EmiCod"]+" RFC. "+lXml["EmiRfc"]+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "</TABLE>\n")
  f.write( "<HR>\n")
# Cliente
  f.write( "<TABLE BORDER=0 WIDTH=100%>\n" )
  f.write( "<TR>\n")
  f.write( "  <TD ALIGN=CENTER><B>CLIENTE</B></TD>\n")
  if lTipDoc=='FL':
    f.write( "  <TD ALIGN=CENTER>NOTA DE CARGO "+lTipDoc+" <B>CREDITO</B></TD>\n")
  else:
    f.write( "  <TD ALIGN=CENTER>NOTA DE CARGO "+lTipDoc+" <B>CONTADO</B></TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR>\n")
  lTex=lXml["CliNom"]
  lTex=lTex.replace("Ñ","&Ntilde;") 
  lTex=lTex.replace("ñ","&ntilde;")
  f.write( "  <TD ALIGN=LEFT>"+lTex+"</TD>\n")
  f.write( "  <TD ALIGN=CENTER>"+lfacact+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR> \n")
  f.write( "  <TD ALIGN=LEFT>"+lXml["CliDom"]+"</TD>\n")
  f.write( "  <TD ALIGN=CENTER>FECHA</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR> \n")
  f.write( "  <TD ALIGN=LEFT>"+lXml["CliCol"]+" "+lXml["CliLoc"]+"</TD>\n")
  lTex=lXml["FecAct"].replace("T"," ")
  f.write( "  <TD ALIGN=CENTER>"+lTex+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR> \n")
  f.write( "  <TD ALIGN=LEFT>"+lXml["CliMun"]+" "+lXml["CliEst"]+" "+lXml["CliPai"]+"</TD>\n")
  f.write( "  <TD ALIGN=CENTER>A&ntilde;o y No. de Aprobaci&oacute;n de Folios</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR> \n")
  f.write( "  <TD ALIGN=LEFT>"+lXml["CliCoP"]+" RFC. "+lXml["CliRfc"]+"</TD>\n")
  f.write( "  <TD ALIGN=CENTER>"+lXml["AnioAp"]+" "+lXml["Aproba"]+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "</TABLE>\n")
  f.write( "<HR>\n")
# Movimientos
#  movs=fFetchAll("SELECT di_entrada,'PZ',di_descrip,di_precio,di_importe,di_numpar,di_impuesto FROM "+lfnd)
  movs=fFetchAll("SELECT '1','PZ','FLETE',dc_total/1.16,dc_total/1.16,'FL',dc_total-(dc_total/1.16) FROM "+lfnd)
  f.write( "<TABLE BORDER=0 WIDTH=100%>\n" )
  f.write( "<TR> \n")
  f.write( "<TH ALIGN=LEFT> Cantidad </TH>\n")
  f.write( "<TH ALIGN=LEFT> Unidad </TH>\n")
  f.write( "<TH ALIGN=LEFT> Parte </TH>\n")
  f.write( "<TH ALIGN=LEFT> Descripcion </TH>\n")
  f.write( "<TH ALIGN=RIGHT> Precio </TH>\n")
  f.write( "<TH ALIGN=RIGHT> Importe </TH>\n")
  f.write( "</TR> \n")
  for mov in movs:
    f.write( "<TR> \n")
    f.write( "<TD ALIGN=LEFT> "+str(mov[0])+"</TD>\n")
    f.write( "<TD ALIGN=LEFT> "+str(mov[1])+"</TD>\n")
    f.write( "<TD ALIGN=LEFT> "+str(mov[5])+"</TD>\n")
    f.write( "<TD ALIGN=LEFT> "+str(mov[2])+"</TD>\n")
    lPre="%12.2f" % (mov[3])
    f.write( "<TD ALIGN=RIGHT> "+lPre.strip()+"</TD>\n")
    lImp="%12.2f" % (mov[4])
    if lXml["CliRfc"]=="XAXX010101000":
      lImp="%12.2f" % (float(mov[4])+float(mov[6]))
    f.write( "<TD ALIGN=RIGHT> "+lImp.strip()+"</TD>\n")
    f.write( "</TR> \n")
  f.write( "<TR>\n")
  f.write( "<TD>&nbsp;</TD>\n") 
  f.write( "<TD>&nbsp;</TD>\n") 
  f.write( "<TD>&nbsp;</TD>\n") 
  f.write( "<TD>&nbsp;</TD>\n") 
  f.write( "<TD ALIGN=RIGHT>SUBTOTAL</TD>\n")
  if lXml["CliRfc"]=="XAXX010101000":
    f.write( "<TD ALIGN=RIGHT>"+lXml["TotTotal"]+"</TD>\n")
  else:
    f.write( "<TD ALIGN=RIGHT>"+lXml["SubTotal"]+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR>\n")
  plin=ficdef.fPesos(float(lXml["TotTotal"]))
  f.write( "<TD COLSPAN=3 ROWSPAN=4 ALIGN=LEFT>Importe con letra: "+plin+"</TD>\n")
  f.write( "<TD ALIGN=RIGHT>16% IVA</TD>\n")
  if lXml["CliRfc"]=="XAXX010101000":
    f.write( "<TD ALIGN=RIGHT>&nbsp;</TD>\n")
  else:
    f.write( "<TD ALIGN=RIGHT>"+lXml["TotImpue"]+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR>\n")
  f.write( "<TD ALIGN=RIGHT>TOTAL</TD>\n")
  f.write( "<TD ALIGN=RIGHT>"+lXml["TotTotal"]+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "</TABLE>\n")
  f.write( "<HR>\n")
# Cadena Original, Sello digital
  f.write( "<TABLE BORDER=0 WIDTH=100%>\n" )
  f.write( "<TR>\n")
  f.write( "<TD ALIGN=LEFT><FONT SIZE=-2>Cadena original<FONT></TD>\n")
  f.write( "<TD ALIGN=RIGHT><FONT SIZE=-2>Numero de Certificado<FONT></TD>\n")
  f.write( "<TD ALIGN=LEFT><FONT SIZE=-2>"+lXml["NoCer"]+"<FONT></TD>\n")
  f.write( "<TD ALIGN=RIGHT><FONT SIZE=-2>Metodo de Pago:<FONT></TD>\n")
  f.write( "<TD ALIGN=LEFT><FONT SIZE=-2>"+lXml["CliFpa"]+"<FONT></TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR>\n")
  lCadOri=lCadOri.replace("Ñ","&Ntilde;") 
  lCadOri=lCadOri.replace("ñ","&ntilde;")
  f.write( "<TD COLSPAN=3><FONT SIZE=-2>"+lCadOri+"<FONT></TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR>\n")
  f.write( "<TD ALIGN=LEFT COLSPAN=3><FONT SIZE=-2>Sello digital<FONT></TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR>\n")
  f.write( "<TD COLSPAN=3><FONT SIZE=-2>"+lSello+"</FONT></TD>\n")
  f.write( "</TR>\n")
  f.write( "</TABLE>\n")
  f.write( "<HR>\n")
# Observaciones y aplicar
  f.write( "<TABLE BORDER=0 WIDTH=100%>\n" )
  f.write( "<TR>\n")
  f.write( "<TD><FONT>"+lAplicar+" "+lObserva+"</FONT></TD>\n")
  f.write( "</TR>\n")
  (lanio,lmes,ldia)=lHoy.split('-')
  lTex=ficdef.fDatExt(lHoy,1)
  f.write( "<TR>\n")
  f.write( "<TD ALIGN=RIGHT>CHIHUAHUA, CHIH. a "+lTex+".</TD>\n")
  f.write( "</TR>\n")
  f.write( "</TABLE>\n")
  f.write( "<HR>\n")
# 
  f.write( "<TABLE BORDER=0 WIDTH=100%>\n" )
  f.write( "<TR>\n")
#  f.write( "<TD ALIGN=CENTER>Este documento es una impresi&oacute;n de un comprobante fiscal digital</TD>\n")
  f.write( "<TD ALIGN=CENTER>Este documento es una representaci&oacute;n impresa de un CFD</TD>\n")
  f.write( "</TR>\n")
  f.write( "</TABLE>\n")

  f.write( "</BODY>\n" )
  f.write( "</HTML>\n" )
  f.closed
  return

# Mon Jan 30 10:38:20 MST 2012 Devolucion SP
def fFacHTMLdbSP(lHoy,lfacact,lSello,lXml,lfnd,lDirCfd,lObserva,lAplicar,lTipDoc):
  """
  aXml["Cliente"]=lCliente=mov[0]
  aXml["SubTotal"]=lSubTotal=str(mov[1])
  aXml["TotImpue"]=lTotImpue=str(mov[2])
  aXml["TotTotal"]=lTotTotal=str(mov[3])
  aXml["lSerie"]=lserie=fol[0].strip()
  aXml["lActual"]=lactual=("%10d" % (fol[1])).strip()
  aXml["Aproba"]=laproba=fol[2].strip()
  aXml["AnioAp"]=lanioap=fol[3].strip()
  aXml["FecAct"]=mfecact=mov[0].strip()
  aXml["NoCer"]=mNoCer=mov[1].strip()
  aXml["EmiNom"]=mEmiNom=row[0].strip()
  aXml["EmiRfc"]=mEmiRfc=row[1].strip()
  aXml["EmiCal"]=mEmiCal=row[2].strip()
  aXml["EmiNoE"]=mEmiNoE=row[3].strip()
  aXml["EmiCol"]=mEmiCol=row[4].strip()
  aXml["EmiLoc"]=mEmiLoc=row[5].strip()
  adminXml["EmiMun"]=mEmiMun=row[6].strip()
  aXml["EmiEst"]=mEmiEst=row[7].strip()
  aXml["EmiPai"]=mEmiPai=row[8].strip()
  aXml["EmiCod"]=mEmiCod=row[9].strip()
  aXml["CliRfc"]=mCliRfc=cli[0].strip()
  aXml["CliNom"]=mCliNom=cli[1].strip()
  aXml["CliRfc"]=mCliRfc
  aXml["CliDom"]=mCliDom=cli[2].strip()
  aXml["CliCol"]=mCliCol=cli[3].strip()
  aXml["CliLoc"]=mCliLoc=cli[4].strip()
  aXml["CliMun"]=mCliMun=cli[5].strip()
  aXml["CliEst"]=mCliEst=cli[6].strip()
  aXml["CliPai"]=mCliPai=cli[7].strip()
  aXml["CliCoP"]=mCliCoP=cli[8].strip()
  aXml["CliPla"]=("%4d" % (cli[9])).strip()
  """
  mcadori=lDirCfd+lfacact+".cadenaoriginal"
  fichero = open(path.realpath(mcadori), "r")
  lCadOri=fichero.readline()
  fichero.closed
  lfactura=lDirCfd+lfacact+".html"
  f = open(path.realpath(lfactura), "w")
# Emisor
  f.write( "<HTML>\n" )
  f.write( "<BODY>\n" )
  f.write( "<CENTER>\n")
  f.write( "<TABLE BORDER=0 WIDTH=100%>\n" )
# Mon Apr 25 12:38:32 MDT 2011 agregar imagen 
  f.write( "<TR>\n")
  f.write( "  <TD ALIGN=CENTER ROWSPAN=7> <IMG SRC=\"logo.jpg\" width=\"180\" height=\"110\" border=\"0\"> </TD> \n")
  f.write( "  <TD ALIGN=CENTER>EMISOR</TD>\n")
  f.write( "</TR>\n")

#  f.write( "<TR>\n")
#  f.write( "  <TD ALIGN=CENTER ROWSPAN=6> <IMG SRC=\"logo.jpg\"> </TD> \n")
#  f.write( "  <TD ALIGN=CENTER>EMISOR</TD>\n")
#  f.write( "</TR>\n")

  f.write( "<TR>\n")
  f.write( "  <TD ALIGN=CENTER>"+lXml["EmiNom"]+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR>\n")
  f.write( "  <TD ALIGN=CENTER>"+lXml["EmiCal"]+" "+lXml["EmiNoE"]+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR>\n")
  f.write( "  <TD ALIGN=CENTER>"+lXml["EmiCol"]+" "+lXml["EmiLoc"]+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR>\n")
  f.write( "  <TD ALIGN=CENTER>"+lXml["EmiMun"]+" "+lXml["EmiEst"]+" "+lXml["EmiPai"]+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR>\n")
  f.write( "  <TD ALIGN=CENTER>"+lXml["EmiCod"]+" RFC. "+lXml["EmiRfc"]+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "</TABLE>\n")
  f.write( "<HR>\n")
# Cliente
  f.write( "<TABLE BORDER=0 WIDTH=100%>\n" )
  f.write( "<TR>\n")
  f.write( "  <TD ALIGN=CENTER><B>CLIENTE</B></TD>\n")
  if lTipDoc=='DR':
    f.write( "  <TD ALIGN=CENTER>NOTA DE CREDITO "+lTipDoc+" <B>CREDITO</B></TD>\n")
  else:
    f.write( "  <TD ALIGN=CENTER>NOTA DE CREDITO "+lTipDoc+" <B>CONTADO</B></TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR>\n")
  lTex=lXml["CliNom"]
  lTex=lXml["CliNom"].encode("utf-8")
  lTex=lTex.replace("Ñ","&Ntilde;") 
  lTex=lTex.replace("ñ","&ntilde;")
  f.write( "  <TD ALIGN=LEFT>"+lTex+"</TD>\n")
  f.write( "  <TD ALIGN=CENTER>"+lfacact+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR> \n")
  f.write( "  <TD ALIGN=LEFT>"+lXml["CliDom"]+"</TD>\n")
  f.write( "  <TD ALIGN=CENTER>FECHA</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR> \n")
  f.write( "  <TD ALIGN=LEFT>"+lXml["CliCol"]+" "+lXml["CliLoc"]+"</TD>\n")
  lTex=lXml["FecAct"].replace("T"," ")
  f.write( "  <TD ALIGN=CENTER>"+lTex+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR> \n")
  f.write( "  <TD ALIGN=LEFT>"+lXml["CliMun"]+" "+lXml["CliEst"]+" "+lXml["CliPai"]+"</TD>\n")
  f.write( "  <TD ALIGN=CENTER>A&ntilde;o y No. de Aprobaci&oacute;n de Folios</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR> \n")
  f.write( "  <TD ALIGN=LEFT>"+lXml["CliCoP"]+" RFC. "+lXml["CliRfc"]+"</TD>\n")
  f.write( "  <TD ALIGN=CENTER>"+lXml["AnioAp"]+" "+lXml["Aproba"]+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "</TABLE>\n")
  f.write( "<HR>\n")
# Movimientos
  movs=fFetchAll("SELECT di_entrada,'PZ',di_descrip,di_precio,di_importe,di_numpar,di_impuesto FROM "+lfnd)
  f.write( "<TABLE BORDER=0 WIDTH=100%>\n" )
  f.write( "<TR> \n")
  f.write( "<TH ALIGN=LEFT> Cantidad </TH>\n")
  f.write( "<TH ALIGN=LEFT> Unidad </TH>\n")
  f.write( "<TH ALIGN=LEFT> Parte </TH>\n")
  f.write( "<TH ALIGN=LEFT> Descripcion </TH>\n")
  f.write( "<TH ALIGN=RIGHT> Precio </TH>\n")
  f.write( "<TH ALIGN=RIGHT> Importe </TH>\n")
  f.write( "</TR> \n")
  for mov in movs:
    f.write( "<TR> \n")
    f.write( "<TD ALIGN=LEFT> "+str(mov[0])+"</TD>\n")
    f.write( "<TD ALIGN=LEFT> "+str(mov[1])+"</TD>\n")
    f.write( "<TD ALIGN=LEFT> "+str(mov[5])+"</TD>\n")
    f.write( "<TD ALIGN=LEFT> "+str(mov[2])+"</TD>\n")
    lPre="%12.2f" % (mov[3])
    f.write( "<TD ALIGN=RIGHT> "+lPre.strip()+"</TD>\n")
    lImp="%12.2f" % (mov[4])
    if lXml["CliRfc"]=="XAXX010101000":
      lImp="%12.2f" % (float(mov[4])+float(mov[6]))
    f.write( "<TD ALIGN=RIGHT> "+lImp.strip()+"</TD>\n")
    f.write( "</TR> \n")
  f.write( "<TR>\n")
  f.write( "<TD>&nbsp;</TD>\n") 
  f.write( "<TD>&nbsp;</TD>\n") 
  f.write( "<TD>&nbsp;</TD>\n") 
  f.write( "<TD>&nbsp;</TD>\n") 
  f.write( "<TD ALIGN=RIGHT>SUBTOTAL</TD>\n")
  if lXml["CliRfc"]=="XAXX010101000":
    f.write( "<TD ALIGN=RIGHT>"+lXml["TotTotal"]+"</TD>\n")
  else:
    f.write( "<TD ALIGN=RIGHT>"+lXml["SubTotal"]+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR>\n")
  plin=ficdef.fPesos(float(lXml["TotTotal"]))
  f.write( "<TD COLSPAN=3 ROWSPAN=4 ALIGN=LEFT>Importe con letra: "+plin+"</TD>\n")
  f.write( "<TD ALIGN=RIGHT>16% IVA</TD>\n")
  if lXml["CliRfc"]=="XAXX010101000":
    f.write( "<TD ALIGN=RIGHT>&nbsp;</TD>\n")
  else:
    f.write( "<TD ALIGN=RIGHT>"+lXml["TotImpue"]+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR>\n")
  f.write( "<TD ALIGN=RIGHT>TOTAL</TD>\n")
  f.write( "<TD ALIGN=RIGHT>"+lXml["TotTotal"]+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "</TABLE>\n")
  f.write( "<HR>\n")
# Cadena Original, Sello digital
  f.write( "<TABLE BORDER=0 WIDTH=100%>\n" )
  f.write( "<TR>\n")
  f.write( "<TD ALIGN=LEFT><FONT SIZE=-2>Cadena original<FONT></TD>\n")
  f.write( "<TD ALIGN=RIGHT><FONT SIZE=-2>Numero de Certificado<FONT></TD>\n")
  f.write( "<TD ALIGN=LEFT><FONT SIZE=-2>"+lXml["NoCer"]+"<FONT></TD>\n")
  f.write( "<TD ALIGN=RIGHT><FONT SIZE=-2>Metodo de Pago:<FONT></TD>\n")
  f.write( "<TD ALIGN=LEFT><FONT SIZE=-2>"+lXml["CliFpa"]+"<FONT></TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR>\n")
  lCadOri=lCadOri.replace("Ñ","&Ntilde;") 
  lCadOri=lCadOri.replace("ñ","&ntilde;")
  f.write( "<TD COLSPAN=3><FONT SIZE=-2>"+lCadOri+"<FONT></TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR>\n")
  f.write( "<TD ALIGN=LEFT COLSPAN=3><FONT SIZE=-2>Sello digital<FONT></TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR>\n")
  f.write( "<TD COLSPAN=3><FONT SIZE=-2>"+lSello+"</FONT></TD>\n")
  f.write( "</TR>\n")
  f.write( "</TABLE>\n")
  f.write( "<HR>\n")
# Observaciones y aplicar
  f.write( "<TABLE BORDER=0 WIDTH=100%>\n" )
  f.write( "<TR>\n")
  f.write( "<TD><FONT>"+lAplicar+" "+lObserva+"</FONT></TD>\n")
  f.write( "</TR>\n")
  (lanio,lmes,ldia)=lHoy.split('-')
  lTex=ficdef.fDatExt(lHoy,1)
  f.write( "<TR>\n")
  f.write( "<TD ALIGN=RIGHT>CHIHUAHUA, CHIH. a "+lTex+".</TD>\n")
  f.write( "</TR>\n")
  f.write( "</TABLE>\n")
  f.write( "<HR>\n")
# 
  f.write( "<TABLE BORDER=0 WIDTH=100%>\n" )
  f.write( "<TR>\n")
#  f.write( "<TD ALIGN=CENTER>Este documento es una impresi&oacute;n de un comprobante fiscal digital</TD>\n")
  f.write( "<TD ALIGN=CENTER>Este documento es una representaci&oacute;n impresa de un CFD</TD>\n")
  f.write( "</TR>\n")
  f.write( "</TABLE>\n")

  f.write( "</BODY>\n" )
  f.write( "</HTML>\n" )
  f.closed
  return

                                                                                                                                   

"""
# XMLi egreso
# Mon Feb 13 16:30:05 MST 2012 CC
def fXMLidb(lfnd,lDirCfd):

#    lrows=fFetchAll("SELECT \
#      di_clipro,cl_nombre,cl_nombre2,cl_domicil1,cl_domicil2,cl_colonia,cl_ciudad,cl_estado,cl_codipost,cl_telefono, \
#      cl_rfc, \
#      di_tipdoc,di_numdoc,di_refer,di_fecha,di_vende,di_gpo,di_numpar,di_descrip,di_entrada,di_importe,di_impuesto, \
#      di_total, di_numpre, di_precio, (di_fecha + di_plazo) \
#      FROM "+lfnd+", fnclie  \
#      WHERE di_clipro=cl_cliente ;")

  aXml={}

  mov=fFetchOne("SELECT di_clipro,sum(di_importe),sum(di_impuesto),sum(di_total) FROM "+lfnd+" GROUP BY di_clipro;")
  aXml["Cliente"]=lCliente=mov[0]
  aXml["SubTotal"]=lSubTotal=("%12.2f" % (mov[1])).strip()
  aXml["TotImpue"]=lTotImpue=("%12.2f" % (mov[2])).strip()
  aXml["TotTotal"]=lTotTotal=("%12.2f" % (mov[3])).strip()
# Create the minidom document for cadenaoriginal
  doc = minidom.Document()

# Create the <Comprabante> base element
  fol=fFetchOne("SELECT fo_serie,fo_actual,fo_aproba,fo_anio FROM fnfoldb")
  fSql("UPDATE fnfoldb set fo_actual=fo_actual+1")
  aXml["lSerie"]=lserie=fol[0].strip()
  aXml["lActual"]=lactual=("%10d" % (fol[1])).strip()
  aXml["Aproba"]=laproba=fol[2].strip()
  aXml["AnioAp"]=lanioap=fol[3].strip()
#  mov=fFetchOne("SELECT fc_fecha||'T'||extract(hour from fc_hora)||':'||extract(minute from fc_hora)||':'||extract(second from fc_hora) FROM fnfact WHERE fc_numdoc='"+lfnd+"'")
  mov=fFetchOne("SELECT to_char(di_fecha,'YYYY-MM-DD')||'T'||to_char(di_actual, 'HH24:MI:SS') FROM "+lfnd)
  aXml["FecAct"]=mfecact=mov[0].strip()
  mfacact=lserie+lactual
  mov=fFetchOne("SELECT * FROM fncert")
  aXml["NoCer"]=mNoCer=mov[1].strip()
  Comprobante = doc.createElement("cfdi:Comprobante")
  Comprobante.setAttribute("xmlns:cfdi","http://www.sat.gob.mx/cfd/3")
  Comprobante.setAttribute("xmlns:xsi","http://www.w3.org/2001/XMLSchema-instance")
  Comprobante.setAttribute("xsi:schemaLocation","http://www.sat.gob.mx/cfd http://www.sat.gob.mx/sitio_internet/cfd/3/cfdv3.xsd")
  Comprobante.setAttribute("version","3.0")
  Comprobante.setAttribute("serie",lserie)
  Comprobante.setAttribute("folio",lactual)
  Comprobante.setAttribute("fecha",mfecact)
#  Comprobante.setAttribute("noAprobacion",laproba)
#  Comprobante.setAttribute("anoAprobacion",lanioap)
  Comprobante.setAttribute("formaDePago","Pago en una sola exhibicion")
  Comprobante.setAttribute("subTotal",lSubTotal)
  Comprobante.setAttribute("total",lTotTotal)
  Comprobante.setAttribute("metodoDePago","Efectivo")
  Comprobante.setAttribute("tipoDeComprobante","egreso")
  Comprobante.setAttribute("noCertificado",mNoCer)
  doc.appendChild(Comprobante)

# Create the main <Emisor> element
  row=fFetchOne("SELECT cn_rsocial,cn_rfc,cn_direccion,cn_noexte,cn_coloni,cn_locali,cn_munici,cn_estado,cn_pais,cn_codpos FROM fncontrol")
  aXml["EmiNom"]=mEmiNom=row[0].strip()
  aXml["EmiRfc"]=mEmiRfc=row[1].strip()
  aXml["EmiCal"]=mEmiCal=row[2].strip()
  aXml["EmiNoE"]=mEmiNoE=row[3].strip()
  aXml["EmiCol"]=mEmiCol=row[4].strip()
  aXml["EmiLoc"]=mEmiLoc=row[5].strip()
  aXml["EmiMun"]=mEmiMun=row[6].strip()
  aXml["EmiEst"]=mEmiEst=row[7].strip()
  aXml["EmiPai"]=mEmiPai=row[8].strip()
  aXml["EmiCod"]=mEmiCod=row[9].strip()
  Emisor = doc.createElement("cfdi:Emisor")
  Emisor.setAttribute("nombre", mEmiNom)
  Emisor.setAttribute("rfc", mEmiRfc)
  Comprobante.appendChild(Emisor)

# Create a <DomicilioFiscal> element
  DomicilioFiscal = doc.createElement("cfdi:DomicilioFiscal")
  DomicilioFiscal.setAttribute("calle",mEmiCal)
  DomicilioFiscal.setAttribute("noExterior",mEmiNoE)
  DomicilioFiscal.setAttribute("colonia",mEmiCol)
  DomicilioFiscal.setAttribute("localidad",mEmiLoc)
  DomicilioFiscal.setAttribute("municipio",mEmiMun)
  DomicilioFiscal.setAttribute("estado",mEmiEst)
  DomicilioFiscal.setAttribute("pais",mEmiPai)
  DomicilioFiscal.setAttribute("codigoPostal",mEmiCod)
  Emisor.appendChild(DomicilioFiscal)


# Create a <ExpedidoEn> element
#  ExpedidoEn = doc.createElement("ExpedidoEn")
#  ExpedidoEn.setAttribute("calle","")
#  ExpedidoEn.setAttribute("noExterior","")
#  ExpedidoEn.setAttribute("colonia","")
#  ExpedidoEn.setAttribute("localidad","")
#  ExpedidoEn.setAttribute("municipio","")
#  ExpedidoEn.setAttribute("estado","")
#  ExpedidoEn.setAttribute("pais","")
#  ExpedidoEn.setAttribute("codigoPostal","")
#  Emisor.appendChild(ExpedidoEn)


# Give the <p> elemenet some text
# ptext = doc.createTextNode("This is a test!")
# DomicilioFiscal.appendChild(ptext)

  cli=fFetchOne("SELECT cl_rfc,cl_nombre||cl_nombre2,cl_domicil1||cl_domicil2,cl_colonia,cl_colonia as localidad,cl_ciudad as municipio,\
  cl_estado,'MEXICO',cl_codipost,cl_plazo,cl_monfac FROM fnclie WHERE cl_cliente='"+lCliente+"'")
  if cli[0].strip() :
    aXml["CliRfc"]=mCliRfc=cli[0].strip()
  else:
    aXml["CliRfc"]=mCliRfc='XAXX010101000'
  aXml["CliNom"]=mCliNom=cli[1].strip()
  mCliRfc=mCliRfc.replace("-","")
  mCliRfc=mCliRfc.replace(" ","")
  mCliRfc=mCliRfc.replace(".","")
  aXml["CliRfc"]=mCliRfc
  aXml["CliDom"]=mCliDom=cli[2].strip()
  aXml["CliCol"]=mCliCol=cli[3].strip()
  aXml["CliLoc"]=mCliLoc=cli[4].strip()
  aXml["CliMun"]=mCliMun=cli[5].strip()
  aXml["CliEst"]=mCliEst=cli[6].strip()
  aXml["CliPai"]=mCliPai=cli[7].strip()
  aXml["CliCoP"]=mCliCoP=cli[8].strip()
  aXml["CliPla"]=("%4d" % (cli[9])).strip()
  aXml["CliMof"]=mCliMof=cli[10].strip()
# Create the main <Receptor> element
  Receptor = doc.createElement("cfdi:Receptor")
  Receptor.setAttribute("rfc", mCliRfc)
  Receptor.setAttribute("nombre", mCliNom)
  Comprobante.appendChild(Receptor)

# Create a <Domicilio> element
  Domicilio = doc.createElement("cfdi:Domicilio")
  Domicilio.setAttribute("calle",mCliDom)
  Domicilio.setAttribute("noExterior","9")
  if mCliCol: Domicilio.setAttribute("colonia",mCliCol)
  if mCliLoc: Domicilio.setAttribute("localidad",mCliLoc)
  if mCliMun: Domicilio.setAttribute("municipio",mCliMun)
  if mCliEst: Domicilio.setAttribute("estado",mCliEst)
  if mCliPai: Domicilio.setAttribute("pais",mCliPai)
  if mCliCoP: Domicilio.setAttribute("codigoPostal",mCliCoP)
  Receptor.appendChild(Domicilio)

# Create the main <Conceptos> element
  movs=fFetchAll("SELECT di_entrada,'PZ',di_descrip,di_precio,di_importe,di_tipdoc FROM "+lfnd)
  Conceptos = doc.createElement("cfdi:Conceptos")
  Comprobante.appendChild(Conceptos)

# Create a <Concepto> element
  for mov in movs:
    aXml["TipDoc"]=mov[5].strip()
    Concepto = doc.createElement("cfdi:Concepto")
    Concepto.setAttribute("cantidad",str(mov[0]))
#    Concepto.setAttribute("unidad",mov[1])
    Concepto.setAttribute("descripcion",mov[2])
    lPre="%12.2f" % (mov[3])
    Concepto.setAttribute("valorUnitario",lPre.strip())
    lImp="%12.2f" % (mov[4])
    Concepto.setAttribute("importe",lImp.strip())
    Conceptos.appendChild(Concepto)

# Create the main <Impuestos> element
  Impuestos = doc.createElement("cfdi:Impuestos")
  Impuestos.setAttribute("totalImpuestosTrasladados", lTotImpue)
  Comprobante.appendChild(Impuestos)

# Create the main <Traslados> element
  Traslados = doc.createElement("cfdi:Traslados")
# Create the main <Traslado> element
  Traslado = doc.createElement("cfdi:Traslado")
  Traslado.setAttribute("impuesto", "IVA")
  Traslado.setAttribute("tasa", "16.00")
  Traslado.setAttribute("importe", lTotImpue)
  Traslados.appendChild(Traslado)
  Impuestos.appendChild(Traslados)

# Print our newly created XML
#  print doc.toprettyxml(indent="  ")

# Write file XML
  mfactura=lDirCfd+mfacact+".xml"
  fichero = open(path.realpath(mfactura), "w")
  doc.writexml(fichero, encoding="UTF-8")
  fichero.closed

# fXMLidb
# # ############### fXML2
#   lfacact=mfacact
#   mfactura=lDirCfd+lfacact+".xml"
#   mcadori=lDirCfd+lfacact+".cadenaoriginal"
#   msello=lDirCfd+lfacact+".sello"
# # Sun Nov 28 21:02:22 MST 2010 
# # Crear Cadena original
#   lCommand="/usr/bin/xsltproc lcadenaoriginal_2_0.xslt "+mfactura+" >"+mcadori
#   lok=system(lCommand)

# ## Genera llave Privada
# #  lCommand="/usr/bin/openssl pkcs8 -inform DER -in sat/certificado.key -passin pass:a0123456789 -out sat/llaveprivada.pem.txt"
# #  lok=ststem(lCommand)

# # Genera Sello Digital
# #  lCommand="/usr/bin/openssl dgst -md5 -sign sat/llaveprivada.pem.txt "+mcadori+" | openssl enc -base64 -A >"+msello
# # para 2011
#   lCommand="/usr/bin/openssl dgst -sha1 -sign sat/llaveprivada.pem.txt "+mcadori+" | openssl enc -base64 -A >"+msello
#   lok=system(lCommand)
# # ######

  return (mfacact,lserie,lactual,aXml)
"""

# Thu Mar 08 12:20:51 MST 2012  HP Ordenes de Trabajo
#def fHTMLotHP(lHoy,lfacact,lSello,lXml,lfnd,lDirCfd,lObserva,lAplicar,lTipDoc):     
def fHTMLotHP(lHoy,lfacact,lfnd,lDirCfd,lEsOriginal):
  lfactura=lDirCfd+lfacact+".html"
  f = open(path.realpath(lfactura), "w")
  kControl=fFetchOne("SELECT * FROM fncontrol")
  movs=fFetchOne("SELECT * FROM "+lfnd)
  lKtra="REPARACION"
  if movs[23]=='2': lKtra="PRESUPUESTO"
  elif movs[23]=='3': lKtra="GARANTIA"
# Emisor
  f.write( "<HTML>\n" )
  f.write( "<BODY>\n" )
  f.write( "<CENTER>\n")
  f.write( "<TABLE BORDER=0 WIDTH=100%>\n" )
  f.write( "<TR>\n")
#  f.write( "  <TD ALIGN=CENTER ROWSPAN=6> <IMG SRC=\"logo.jpg\" width=\"180\" height=\"110\" border=\"0\"> </TD> \n")
#  f.write( "  <TD ALIGN=CENTER ROWSPAN=6> <IMG SRC=\"logo.jpg\" width=\"160\" height=\"90\" border=\"0\"> </TD> \n")
  f.write( "  <TD ALIGN=CENTER ROWSPAN=7> <IMG SRC=\"logo.jpg\" width=\"180\" height=\"110\" border=\"0\"> </TD> \n")
  f.write( "  <TD ALIGN=CENTER></TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR>\n")
  f.write( "  <TD ALIGN=CENTER>"+kControl[1]+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR>\n")
  f.write( "  <TD ALIGN=CENTER>"+(kControl[3].strip()+" "+kControl[50].strip()).strip()+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR>\n")
  f.write( "  <TD ALIGN=CENTER>"+(kControl[55].strip()+" "+kControl[51].strip()).strip()+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR>\n")
  f.write( "  <TD ALIGN=CENTER>"+(kControl[52].strip()+" "+kControl[53].strip()+" "+kControl[54].strip()).strip()+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR>\n")
  f.write( "  <TD ALIGN=CENTER>"+(kControl[6].strip()+" RFC. "+kControl[7].strip()).strip()+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR>\n")
  f.write( "  <TD ALIGN=CENTER> TEL."+kControl[5].strip()+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "</TABLE>\n")
  f.write( "<HR>\n")
# Cliente
  f.write( "<TABLE BORDER=0 WIDTH=100%>\n" )
  f.write( "<TR>\n")
  f.write( "  <TD ALIGN=CENTER><B>CLIENTE</B></TD>\n")
  f.write( "  <TD ALIGN=RIGHT><B>ORDEN DE TRABAJO</B></TD>\n")
  f.write( "  <TD ALIGN=RIGHT><B><H2>"+lfacact+"</H2></B></TD>\n")
  f.write( "</TR>\n")
  f.write( "</TABLE>\n")
#  lTex=movs[4]
  lTex=movs[4].encode("utf-8")
  lTex=lTex.replace("Ñ","&Ntilde;") 
  lTex=lTex.replace("ñ","&ntilde;")
  f.write( "<TABLE BORDER=0 WIDTH=100%>\n" )
  f.write( "<TR>\n")
  f.write( "  <TD ALIGN=LEFT>"+lTex+"</TD>\n")
  f.write( "  <TD ALIGN=CENTER></TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR> \n")
  f.write( "  <TD ALIGN=LEFT>"+movs[6].strip()+" "+movs[7].strip()+"</TD>\n")
  f.write( "  <TD ALIGN=CENTER>TRABAJO REQUERIDO</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR> \n")
  f.write( "  <TD ALIGN=LEFT>"+movs[8].strip()+" "+movs[36].strip()+"</TD>\n")
  f.write( "  <TD ALIGN=CENTER><B><H2>"+lKtra+"</H2></B></TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR> \n")
  f.write( "  <TD ALIGN=LEFT>"+movs[9].strip()+" "+movs[10].strip()+" "+movs[11].strip()+" RFC. "+movs[30].strip()+"</TD>\n")
  f.write( "  <TD ALIGN=CENTER></TD>\n")
  f.write( "</TR>\n")
#  f.write( "<TR> \n")
#  f.write( "  <TD ALIGN=LEFT>"+movs[11].strip()+" RFC. "+movs[30].strip()+"</TD>\n")
#  f.write( "  <TD ALIGN=CENTER></TD>\n")
#  f.write( "</TR>\n")
  f.write( "</TABLE>\n")
  f.write( "<HR>\n")

  f.write( "<TABLE BORDER=0 WIDTH=100%>\n" )
  f.write( "<TR> \n")
  f.write( "  <TD ALIGN=LEFT><B>HERRAMIENTA</B></TD>\n")
  f.write( "  <TD ALIGN=LEFT>"+movs[22].strip()+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR> \n")
  f.write( "  <TD ALIGN=LEFT><B>ACCESORIOS</B></TD>\n")
  f.write( "  <TD ALIGN=LEFT>"+movs[26].strip()+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR> \n")
  f.write( "  <TD ALIGN=LEFT><B>CONDICIONES EN QUE SE RECIBE LA HERRAMIENTA</B></TD>\n")
  f.write( "  <TD ALIGN=LEFT>"+movs[25].strip()+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR> \n")
  f.write( "  <TD ALIGN=LEFT><B>PROBLEMA</B></TD>\n")
  f.write( "  <TD ALIGN=LEFT>"+movs[24].strip()+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR> \n")
  f.write( "  <TD ALIGN=LEFT><B>INSTRUCCIONES DE REPARACION</B></TD>\n")
  f.write( "  <TD ALIGN=LEFT>"+movs[27].strip()+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "</TABLE>\n")
  f.write( "<TABLE BORDER=0 WIDTH=100%>\n" )
  f.write( "<TR> \n")
  f.write( "  <TD ALIGN=LEFT><B>LIMITE DE INVERSION</B></TD>\n")
  f.write( "  <TD ALIGN=LEFT>"+movs[28].strip()+"</TD>\n")
  f.write( "  <TD ALIGN=LEFT><B>ANTICIPO</B></TD>\n")
  f.write( "  <TD ALIGN=LEFT>"+movs[29].strip()+"</TD>\n")
  f.write( "  <TD ALIGN=LEFT></TD>\n")
  f.write( "  <TD ALIGN=LEFT></TD>\n")
  f.write( "</TR>\n")
  f.write( "</TABLE>\n")
  f.write( "<HR>\n")
  (lanio,lmes,ldia)=lHoy.split('-')
  lTex=ficdef.fDatExt(lHoy,1)
  f.write( "<TABLE BORDER=0 WIDTH=100%>\n" )
  f.write( "<TR> \n")
  f.write( "  <TD ALIGN=LEFT>Las condiciones y presupuestos estan sujetos a cambios sin previo aviso, variaran de acuerdo a los cambios de precios de nuestros proveedores</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR>\n")
  f.write( "  <TD ALIGN=LEFT>El plazo para recoger las herramientas reaparadas o no, es de 90 dias a partir de la fecha de recibo. Cumplido el plazo se cobrara el 20% de salario minimo vigente a la fecha de recoger la herrameinta por cada dia en nuestro local. </TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR> \n")
  f.write( "  <TD ALIGN=LEFT>Revise las condiciones en las que deje mi herramienta a reparar y coinciden con las descritas en el apartado <U>CONDICIONES EN QUE SE RECIBE LA HERRAMIENTA</U> de esta orde de trabajo</TD>\n")
  f.write( "</TR>\n")
  f.write( "</TABLE>\n")
  f.write( "<TABLE BORDER=0 WIDTH=100%>\n" )
  f.write( "<TR> \n")
  if movs[23]=='3':
    f.write( "<TD ALIGN=LEFT><B><H4>REPARACION POR GARANTIA</H4></B></TD>\n")
  f.write( "<TD ALIGN=RIGHT>CHIHUAHUA, CHIH. a "+lTex+".</TD>\n")
  f.write( "</TR>\n")
  f.write( "</TABLE>\n")
  f.write( "<HR>\n")
  f.write( "<TABLE BORDER=0 WIDTH=100%>\n" )
  f.write( "<TR> \n")
  f.write( "  <TD ALIGN=CENTER><B>O R I G I N A L</B></TD>\n")
  f.write( "</TR>\n")
  f.write( "</TABLE>\n")
  f.write( "<HR>\n")
  f.write( "<HR>\n")

# =====================================================================================================================================================

# Emisor
#  f.write( "<CENTER>\n")
#  f.write( "<TABLE BORDER=0 WIDTH=100%>\n" )
#  f.write( "<TR>\n")
#  f.write( "  <TD ALIGN=CENTER ROWSPAN=7> <IMG SRC=\"logo.jpg\" width=\"180\" height=\"110\" border=\"0\"> </TD> \n")
#  f.write( "  <TD ALIGN=CENTER></TD>\n")
#  f.write( "</TR>\n")
#  f.write( "<TR>\n")
#  f.write( "  <TD ALIGN=CENTER>"+kControl[1]+"</TD>\n")
#  f.write( "</TR>\n")
#  f.write( "<TR>\n")
#  f.write( "  <TD ALIGN=CENTER>"+(kControl[3].strip()+" "+kControl[50].strip()).strip()+"</TD>\n")
#  f.write( "</TR>\n")
#  f.write( "<TR>\n")
#  f.write( "  <TD ALIGN=CENTER>"+(kControl[55].strip()+" "+kControl[51].strip()).strip()+"</TD>\n")
#  f.write( "</TR>\n")
#  f.write( "<TR>\n")
#  f.write( "  <TD ALIGN=CENTER>"+(kControl[52].strip()+" "+kControl[53].strip()+" "+kControl[54].strip()).strip()+"</TD>\n")
#  f.write( "</TR>\n")
#  f.write( "<TR>\n")
#  f.write( "  <TD ALIGN=CENTER>"+(kControl[6].strip()+" RFC. "+kControl[7].strip()).strip()+"</TD>\n")
#  f.write( "</TR>\n")
#  f.write( "<TR>\n")
#  f.write( "  <TD ALIGN=LEFT></TD>\n")
#  f.write( "</TR>\n")
#  f.write( "</TABLE>\n")
  f.write( "<HR>\n")
# Cliente
  f.write( "<TABLE BORDER=0 WIDTH=100%>\n" )
  f.write( "<TR>\n")
  f.write( "  <TD ALIGN=CENTER><B>CLIENTE</B></TD>\n")
  f.write( "  <TD ALIGN=RIGHT><B>ORDEN DE TRABAJO</B></TD>\n")
  f.write( "  <TD ALIGN=RIGHT><B><H2>"+lfacact+"</H2></B></TD>\n")
  f.write( "</TR>\n")
  f.write( "</TABLE>\n")
  lTex=movs[4]
  lTex=movs[4].encode("utf-8")
  lTex=lTex.replace("Ñ","&Ntilde;") 
  lTex=lTex.replace("ñ","&ntilde;")
  f.write( "<TABLE BORDER=0 WIDTH=100%>\n" )
  f.write( "<TR>\n")
  f.write( "  <TD ALIGN=LEFT>"+lTex+"</TD>\n")
  f.write( "  <TD ALIGN=CENTER></TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR> \n")
  f.write( "  <TD ALIGN=LEFT>"+movs[6].strip()+" "+movs[7].strip()+"</TD>\n")
  f.write( "  <TD ALIGN=CENTER>TRABAJO REQUERIDO</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR> \n")
  f.write( "  <TD ALIGN=LEFT>"+movs[8].strip()+" "+movs[36].strip()+"</TD>\n")
  f.write( "  <TD ALIGN=CENTER><B><H2>"+lKtra+"</H2></B></TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR> \n")
#  f.write( "  <TD ALIGN=LEFT>"+movs[9].strip()+" "+movs[10].strip()+"</TD>\n")
  f.write( "  <TD ALIGN=LEFT>"+movs[9].strip()+" "+movs[10].strip()+" "+movs[11].strip()+" RFC. "+movs[30].strip()+"</TD>\n")
  f.write( "  <TD ALIGN=CENTER></TD>\n")
  f.write( "</TR>\n")
#  f.write( "<TR> \n")
#  f.write( "  <TD ALIGN=LEFT>"+movs[11].strip()+" RFC. "+movs[30].strip()+"</TD>\n")
#  f.write( "  <TD ALIGN=CENTER></TD>\n")
#  f.write( "</TR>\n")
  f.write( "</TABLE>\n")
  f.write( "<HR>\n")

  f.write( "<TABLE BORDER=0 WIDTH=100%>\n" )
  f.write( "<TR> \n")
  f.write( "  <TD ALIGN=LEFT><B>HERRAMIENTA</B></TD>\n")
  f.write( "  <TD ALIGN=LEFT>"+movs[22].strip()+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR> \n")
  f.write( "  <TD ALIGN=LEFT><B>ACCESORIOS</B></TD>\n")
  f.write( "  <TD ALIGN=LEFT>"+movs[26].strip()+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR> \n")
  f.write( "  <TD ALIGN=LEFT><B>CONDICIONES EN QUE SE RECIBE LA HERRAMIENTA</B></TD>\n")
  f.write( "  <TD ALIGN=LEFT>"+movs[25].strip()+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR> \n")
  f.write( "  <TD ALIGN=LEFT><B>PROBLEMA</B></TD>\n")
  f.write( "  <TD ALIGN=LEFT>"+movs[24].strip()+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR> \n")
  f.write( "  <TD ALIGN=LEFT><B>INSTRUCCIONES DE REPARACION</B></TD>\n")
  f.write( "  <TD ALIGN=LEFT>"+movs[27].strip()+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "</TABLE>\n")
  f.write( "<TABLE BORDER=0 WIDTH=100%>\n" )
  f.write( "<TR> \n")
  f.write( "  <TD ALIGN=LEFT><B>LIMITE DE INVERSION</B></TD>\n")
  f.write( "  <TD ALIGN=LEFT>"+movs[28].strip()+"</TD>\n")
  f.write( "  <TD ALIGN=LEFT><B>ANTICIPO</B></TD>\n")
  f.write( "  <TD ALIGN=LEFT>"+movs[29].strip()+"</TD>\n")
  f.write( "  <TD ALIGN=LEFT></TD>\n")
  f.write( "  <TD ALIGN=LEFT></TD>\n")
  f.write( "</TR>\n")
  f.write( "</TABLE>\n")
  f.write( "<HR>\n")
  (lanio,lmes,ldia)=lHoy.split('-')
  lTex=ficdef.fDatExt(lHoy,1)
  f.write( "<TABLE BORDER=0 WIDTH=100%>\n" )
  f.write( "<TR> \n")
  f.write( "  <TD ALIGN=LEFT>Las condiciones y presupuestos estan sujetos a cambios sin previo aviso, variaran de acuerdo a los cambios de precios de nuestros proveedores</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR>\n")
  f.write( "  <TD ALIGN=LEFT>El plazo para recoger las herramientas reaparadas o no, es de 90 dias a partir de la fecha de recibo. Cumplido el plazo se cobrara el 20% de salario minimo vigente a la fecha de recoger la herrameinta por cada dia en nuestro local. </TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR> \n")
  f.write( "  <TD ALIGN=LEFT>Revise las condiciones en las que deje mi herramienta a reparar y coinciden con las descritas en el apartado <U>CONDICIONES EN QUE SE RECIBE LA HERRAMIENTA</U> de esta orde de trabajo</TD>\n")
  f.write( "</TR>\n")
  f.write( "</TABLE>\n")
  f.write( "<TABLE BORDER=0 WIDTH=100%>\n" )
  f.write( "<TR> \n")
  if movs[23]=='3':
    f.write( "<TD ALIGN=LEFT><B><H4>REPARACION POR GARANTIA</H4></B></TD>\n")
  f.write( "<TD ALIGN=RIGHT>CHIHUAHUA, CHIH. a "+lTex+".</TD>\n")
  f.write( "</TR>\n")
  f.write( "</TABLE>\n")
  f.write( "<HR>\n")
  f.write( "<TABLE BORDER=0 WIDTH=100%>\n" )
  f.write( "<TR> \n")
  f.write( "  <TD ALIGN=CENTER><B>C O P I A</B></TD>\n")
  f.write( "</TR>\n")
  f.write( "</TABLE>\n")

# 
  f.write( "</BODY>\n" )
  f.write( "</HTML>\n" )
  f.closed
  return

# Thu Jan 23 17:42:50 MST 2014 
def fFacHTMLdbDU32(lHoy,lfacact,lSello,lXml,lfnd,lDirCfd,lObserva,lAplicar,lTipDoc):
  lEsOriginal=0
  if lEsOriginal==0:
#    lFilTim="timbre/"+lfacact+"t.xml"
    lFilTim=lDirCfd+lfacact+"t.xml"
    lPngTim=lDirCfd+lfacact+".png"
    doc=minidom.parse(lFilTim)
    lUUID=doc.childNodes[0].childNodes[4].childNodes[0].getAttributeNS(None,"UUID")
    lselloSAT=doc.childNodes[0].childNodes[4].childNodes[0].getAttributeNS(None,"selloSAT")
    lCertiSAT=doc.childNodes[0].childNodes[4].childNodes[0].getAttributeNS(None,"noCertificadoSAT")
    lselloCFD=doc.childNodes[0].childNodes[4].childNodes[0].getAttributeNS(None,"selloCFD")
    lFechaCFD=doc.childNodes[0].childNodes[4].childNodes[0].getAttributeNS(None,"FechaTimbrado")
    lCertiCSD=doc.childNodes[0].getAttributeNS(None,"noCertificado")
    lFormPAG=doc.childNodes[0].getAttributeNS(None,"formaDePago")
    lMetoPAG=doc.childNodes[0].getAttributeNS(None,"metodoDePago")
    lok=system("/usr/bin/qrencode -m 1 -v 1 -s 4 -o '"+lPngTim+\
      "' '?re="+lXml["EmiRfc"]+"&rr="+lXml["CliRfc"]+"&tt="+lXml["TotTotal"]+"&id="+lUUID+"'")
    """
    qrencode -d 200 -m 1 -v 1 -s 4 -o 'Timbre.png' \
    '?re=ROAF641217K94&rr=INC101109Q36&tt=1234567890.123456&id=ad662d33-6934-459c-a128-BDf0393f0f44
    """
  mcadori=lDirCfd+lfacact+".cadenaoriginal"
  fichero = open(path.realpath(mcadori), "r")
  lCadOri=fichero.readline()
  fichero.closed
  lfactura=lDirCfd+lfacact+".html"
  f = open(path.realpath(lfactura), "w")
# Emisor
  f.write( "<HTML>\n" )
  f.write( "<BODY>\n" )
  f.write( "<CENTER>\n")
  f.write( "<TABLE BORDER=0 WIDTH=100%>\n" )
  f.write( "<TR>\n")
  f.write( "  <TD ALIGN=CENTER ROWSPAN=6> <IMG SRC=\"logo.jpg\"> </TD> \n")
  f.write( "  <TD ALIGN=CENTER>EMISOR</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR>\n")
  f.write( "  <TD ALIGN=CENTER>"+lXml["EmiNom"]+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR>\n")
  f.write( "  <TD ALIGN=CENTER>"+lXml["EmiCal"]+" "+lXml["EmiNoE"]+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR>\n")
  f.write( "  <TD ALIGN=CENTER>"+lXml["EmiCol"]+" "+lXml["EmiLoc"]+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR>\n")
  f.write( "  <TD ALIGN=CENTER>"+lXml["EmiMun"]+" "+lXml["EmiEst"]+" "+lXml["EmiPai"]+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR>\n")
  f.write( "  <TD ALIGN=CENTER>"+lXml["EmiCod"]+" RFC. "+lXml["EmiRfc"]+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "</TABLE>\n")
  f.write( "<HR>\n")
# Cliente
  f.write( "<TABLE BORDER=0 WIDTH=100%>\n" )
  f.write( "<TR>\n")
  f.write( "  <TD ALIGN=CENTER><B>CLIENTE</B></TD>\n")
  if lTipDoc=='DR':
    f.write( "  <TD ALIGN=CENTER>NOTA DE CREDITO "+lTipDoc+" <B>CREDITO</B></TD>\n")
  else:
    f.write( "  <TD ALIGN=CENTER>NOTA DE CREDITO "+lTipDoc+" <B>CONTADO</B></TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR>\n")
#  lTex=lXml["CliNom"]
  lTex=lXml["CliNom"].encode("utf-8")
  lTex=lTex.replace("Ñ","&Ntilde;") 
  lTex=lTex.replace("ñ","&ntilde;")
  f.write( "  <TD ALIGN=LEFT>"+lTex+"</TD>\n")
  f.write( "  <TD ALIGN=CENTER>"+lfacact+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR> \n")
  f.write( "  <TD ALIGN=LEFT>"+lXml["CliDom"]+"</TD>\n")
  f.write( "  <TD ALIGN=CENTER>FECHA</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR> \n")
  f.write( "  <TD ALIGN=LEFT>"+lXml["CliCol"]+" "+lXml["CliLoc"]+"</TD>\n")
  lTex=lXml["FecAct"].replace("T"," ")
  f.write( "  <TD ALIGN=CENTER>"+lTex+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR> \n")
  f.write( "  <TD ALIGN=LEFT>"+lXml["CliMun"]+" "+lXml["CliEst"]+" "+lXml["CliPai"]+"</TD>\n")
  f.write( "  <TD ALIGN=CENTER>A&ntilde;o y No. de Aprobaci&oacute;n de Folios</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR> \n")
  f.write( "  <TD ALIGN=LEFT>"+lXml["CliCoP"]+" RFC. "+lXml["CliRfc"]+"</TD>\n")
  f.write( "  <TD ALIGN=CENTER>"+lXml["AnioAp"]+" "+lXml["Aproba"]+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "</TABLE>\n")
  f.write( "<HR>\n")
# Movimientos
  movs=fFetchAll("SELECT di_entrada,'PZ',di_descrip,di_precio,di_importe,di_numpar,di_impuesto FROM "+lfnd)
  f.write( "<TABLE BORDER=0 WIDTH=100%>\n" )
  f.write( "<TR> \n")
  f.write( "<TH ALIGN=LEFT> Cantidad </TH>\n")
  f.write( "<TH ALIGN=LEFT> Parte </TH>\n")
  f.write( "<TH ALIGN=LEFT> Unidad </TH>\n")
  f.write( "<TH ALIGN=LEFT> Descripcion </TH>\n")
  f.write( "<TH ALIGN=RIGHT> Precio </TH>\n")
  f.write( "<TH ALIGN=RIGHT> Importe </TH>\n")
  f.write( "</TR> \n")
  for mov in movs:
    f.write( "<TR> \n")
    f.write( "<TD ALIGN=LEFT> "+str(mov[0])+"</TD>\n")
    f.write( "<TD ALIGN=LEFT> "+str(mov[1])+"</TD>\n")
    f.write( "<TD ALIGN=LEFT> "+str(mov[5])+"</TD>\n")
    f.write( "<TD ALIGN=LEFT> "+str(mov[2])+"</TD>\n")
    lPre="%12.2f" % (mov[3])
    f.write( "<TD ALIGN=RIGHT> "+lPre.strip()+"</TD>\n")
    lImp="%12.2f" % (mov[4])
    if lXml["CliRfc"]=="XAXX010101000":
      lImp="%12.2f" % (float(mov[4])+float(mov[6]))
    f.write( "<TD ALIGN=RIGHT> "+lImp.strip()+"</TD>\n")
    f.write( "</TR> \n")
  f.write( "<TR>\n")
  f.write( "<TD>&nbsp;</TD>\n") 
  f.write( "<TD>&nbsp;</TD>\n") 
  f.write( "<TD>&nbsp;</TD>\n") 
  f.write( "<TD>&nbsp;</TD>\n") 
  f.write( "<TD ALIGN=RIGHT>SUBTOTAL</TD>\n")
  if lXml["CliRfc"]=="XAXX010101000":
    f.write( "<TD ALIGN=RIGHT>"+lXml["TotTotal"]+"</TD>\n")
  else:
    f.write( "<TD ALIGN=RIGHT>"+lXml["SubTotal"]+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR>\n")
  plin=ficdef.fPesos(float(lXml["TotTotal"]))
  if lXml["CliMof"]=="D":
    plin=plin.replace("Pesos","Dolares").replace("M.N.","USD")
  f.write( "<TD COLSPAN=4 ROWSPAN=4 ALIGN=LEFT>Importe con letra: "+plin+"</TD>\n")
  f.write( "<TD ALIGN=RIGHT>16% IVA</TD>\n")
  if lXml["CliRfc"]=="XAXX010101000":
    f.write( "<TD ALIGN=RIGHT>&nbsp;</TD>\n")
  else:
    f.write( "<TD ALIGN=RIGHT>"+lXml["TotImpue"]+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR>\n")
  f.write( "<TD ALIGN=RIGHT>TOTAL</TD>\n")
#  f.write( "<TD ALIGN=RIGHT>"+lXml["TotTotal"]+"</TD>\n")
  f.write( "<TD ALIGN=RIGHT>"+lXml["TotTotal"][:-4]+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "</TABLE>\n")
  f.write( "<HR>\n")

# Cadena Original, Sello digital
  f.write( "<TABLE BORDER=0 WIDTH=100%>\n" )
  f.write( "<TR>\n")
  if lEsOriginal==0:
    f.write( "  <TD ALIGN=CENTER ROWSPAN=9> <IMG SRC=\""+lfacact+".png\" width=\"120\" height=\"120\" border=\"0\"> </TD> \n")
    f.write( "  <TD ALIGN=LEFT>FOLIO FISCAL : "+lUUID+"</TD>\n")
    f.write( "</TR>\n")
#    f.write( "<TABLE BORDER=0 WIDTH=100%>\n" )
    lCadOri=lCadOri.replace("Ñ","&Ntilde;")
    lCadOri=lCadOri.replace("ñ","&ntilde;")
    lCadOri="||1.0|"+lUUID.strip()+"|"+lFechaCFD.strip()+"|"+lselloCFD.strip()+"|"+lCertiSAT.strip()+"||"
    lCadOri=lCadOri.encode("utf-8")
    f.write( "<TR>\n")
    f.write( "  <TD ALIGN=LEFT><FONT SIZE=-2>Sello SAT</FONT></TD>\n")
    f.write( "</TR>\n")
    f.write( "<TR>\n")
    f.write( "  <TD ALIGN=LEFT><FONT SIZE=-2>"+lselloSAT[:120]+"</FONT></TD>\n")
    f.write( "</TR>\n")
    f.write( "<TR>\n")
    f.write( "  <TD ALIGN=LEFT><FONT SIZE=-2>"+lselloSAT[120:]+"</FONT></TD>\n")
    f.write( "</TR>\n")
    f.write( "<TR>\n")
    f.write( "  <TD ALIGN=LEFT><FONT SIZE=-2>Sello Digital del CFDI</FONT></TD>\n")
    f.write( "</TR>\n")
    f.write( "<TR>\n")
    f.write( "  <TD ALIGN=LEFT><FONT SIZE=-2>"+lselloCFD[:140]+" "+lselloCFD[140:]+"</FONT></TD>\n")
    f.write( "</TR>\n")
    f.write( "<TR>\n")
    f.write( "  <TD ALIGN=LEFT><FONT SIZE=-2>Cadena original del complemento de certificacion digital del SAT</FONT></TD>\n")
    f.write( "</TR>\n")
    f.write( "<TR>\n")
    f.write( "  <TD ALIGN=LEFT><FONT SIZE=-2>"+lCadOri[:150]+" "+lCadOri[150:]+"</FONT></TD>\n")
    f.write( "</TR>\n")
    f.write( "<TR>\n")
    f.write( "  <TD ALIGN=LEFT><FONT SIZE=-2>&nbsp;</FONT></TD>\n")
    f.write( "</TR>\n")
    f.write( "</TABLE>\n")
    f.write( "<TABLE BORDER=0 WIDTH=100%>\n" )
    f.write( "<TR>\n")
#    f.write( "  <TD ALIGN=CENTER ROWSPAN=7> <IMG SRC=\""+lfacact+".png\" width=\"120\" height=\"120\" border=\"0\"> </TD> \n")
    f.write( "  <TD ALIGN=LEFT><FONT SIZE=-2>Fecha y Hora de certificado "+lFechaCFD+"</FONT></TD>\n")
    f.write( "  <TD ALIGN=RIGHT><FONT SIZE=-2>Numero de Certificado SAT "+lCertiSAT+"</FONT></TD>\n")
    f.write( "  <TD ALIGN=RIGHT><FONT SIZE=-2>Numero de Certificado CSD "+lCertiCSD+"</FONT></TD>\n")
    f.write( "</TR>\n")
    f.write( "</TABLE>\n")
# Observaciones y aplicar
  f.write( "<TABLE BORDER=0 WIDTH=100%>\n" )
  f.write( "<TR>\n")
  f.write( "<TD><FONT>"+lAplicar+" "+lObserva+"</FONT></TD>\n")
  f.write( "</TR>\n")
  (lanio,lmes,ldia)=lHoy.split('-')
  lTex=ficdef.fDatExt(lHoy,1)
  f.write( "<TR>\n")
  f.write( "<TD ALIGN=RIGHT>CHIHUAHUA, CHIH. a "+lTex+".</TD>\n")
  f.write( "</TR>\n")
  f.write( "</TABLE>\n")
  f.write( "<HR>\n")
# 
  f.write( "<TABLE BORDER=0 WIDTH=100%>\n" )
  f.write( "<TR>\n")
#  f.write( "<TD ALIGN=CENTER>Este documento es una impresi&oacute;n de un comprobante fiscal digital</TD>\n")
  f.write( "<TD ALIGN=CENTER>Este documento es una representaci&oacute;n impresa de un CFDI</TD>\n")
  f.write( "</TR>\n")
  f.write( "</TABLE>\n")

  f.write( "</BODY>\n" )
  f.write( "</HTML>\n" )
  f.closed
  return

# Sun Jul 29 11:12:28 MDT 2012 DU integracion
def fFacHTMLDU32(lHoy,lfacact,lSello,lXml,lfnd,lDirCfd,lTipDoc,lEsOriginal):
  lReTim=False
  if ":" in lfnd:
    lfnd,lKk=lfnd.split(":")
    lReTim=True

  if lEsOriginal==1:
#    lFilTim="timbre/"+lfacact+"t.xml"
    lFilTim=lDirCfd+lfacact+"t.xml"
    lPngTim=lDirCfd+lfacact+".png"
    doc=minidom.parse(lFilTim)
    lUUID=doc.childNodes[0].childNodes[4].childNodes[0].getAttributeNS(None,"UUID")
    lselloSAT=doc.childNodes[0].childNodes[4].childNodes[0].getAttributeNS(None,"selloSAT")
    lCertiSAT=doc.childNodes[0].childNodes[4].childNodes[0].getAttributeNS(None,"noCertificadoSAT")
    lselloCFD=doc.childNodes[0].childNodes[4].childNodes[0].getAttributeNS(None,"selloCFD")
    lFechaCFD=doc.childNodes[0].childNodes[4].childNodes[0].getAttributeNS(None,"FechaTimbrado")
    lCertiCSD=doc.childNodes[0].getAttributeNS(None,"noCertificado")
    lFormPAG=doc.childNodes[0].getAttributeNS(None,"formaDePago")
    lMetoPAG=doc.childNodes[0].getAttributeNS(None,"metodoDePago")
    lok=system("/usr/bin/qrencode -m 1 -v 1 -s 4 -o '"+lPngTim+\
      "' '?re="+lXml["EmiRfc"]+"&rr="+lXml["CliRfc"]+"&tt="+lXml["TotTotal"]+"&id="+lUUID+"'")

    """
    qrencode -d 200 -m 1 -v 1 -s 4 -o 'Timbre.png' \
    '?re=ROAF641217K94&rr=INC101109Q36&tt=1234567890.123456&id=ad662d33-6934-459c-a128-BDf0393f0f44
    """
    mcadori=lDirCfd+lfacact+".cadenaoriginal"
    fichero = open(path.realpath(mcadori), "r")
    lCadOri=fichero.readline()
    fichero.closed

  lfactura=lDirCfd+lfacact+".html"
  f = open(path.realpath(lfactura), "w")
# Emisor
  f.write( "<HTML>\n" )
  f.write( "<BODY>\n" )
  f.write( "<CENTER>\n")
  f.write( "<TABLE BORDER=0 WIDTH=100%>\n" )
  f.write( "<TR>\n")
  f.write( "  <TD ALIGN=CENTER ROWSPAN=7> <IMG SRC=\"logo.jpg\"> </TD> \n")
  f.write( "  <TD ALIGN=CENTER>EMISOR</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR>\n")
  f.write( "  <TD ALIGN=CENTER>"+lXml["EmiNom"]+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR>\n")
  f.write( "  <TD ALIGN=CENTER>"+lXml["EmiCal"]+" "+lXml["EmiNoE"]+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR>\n")
  f.write( "  <TD ALIGN=CENTER>"+lXml["EmiCol"]+" "+lXml["EmiLoc"]+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR>\n")
  f.write( "  <TD ALIGN=CENTER>"+lXml["EmiMun"]+" "+lXml["EmiEst"]+" "+lXml["EmiPai"]+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR>\n")
  f.write( "  <TD ALIGN=CENTER>"+lXml["EmiCod"]+" RFC. "+lXml["EmiRfc"]+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR>\n")
  f.write( "  <TD ALIGN=CENTER>&nbsp;</TD>\n")
  f.write( "</TR>\n")
  f.write( "</TABLE>\n")
  f.write( "<HR>\n")
# Cliente
  f.write( "<TABLE BORDER=0 WIDTH=100%>\n" )
  f.write( "<TR>\n")
  f.write( "  <TD ALIGN=CENTER><B>CLIENTE</B></TD>\n")
  if lTipDoc=='FC':
    f.write( "  <TD ALIGN=CENTER><B>FACTURA CONTADO</B></TD>\n")
  else:
    f.write( "  <TD ALIGN=CENTER><B>FACTURA CREDITO</B></TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR>\n")
#  lTex=lXml["CliNom"]
  lTex=lXml["CliNom"].encode("utf-8")
  lTex=lTex.replace("Ñ","&Ntilde;") 
  lTex=lTex.replace("ñ","&ntilde;")
  f.write( "  <TD ALIGN=LEFT>"+lTex+"</TD>\n")
  f.write( "  <TD ALIGN=CENTER>"+lfacact+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR> \n")
  f.write( "  <TD ALIGN=LEFT>"+lXml["CliDom"]+"</TD>\n")
  f.write( "  <TD ALIGN=CENTER>FECHA</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR> \n")
  f.write( "  <TD ALIGN=LEFT>"+lXml["CliCol"]+" "+lXml["CliLoc"]+"</TD>\n")
  lTex=lXml["FecAct"].replace("T"," ")
  f.write( "  <TD ALIGN=CENTER>"+lTex+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR> \n")
  f.write( "  <TD ALIGN=LEFT>"+lXml["CliMun"]+" "+lXml["CliEst"]+" "+lXml["CliPai"]+"</TD>\n")
  f.write( "  <TD ALIGN=CENTER>A&ntilde;o y No. de Aprobaci&oacute;n de Folios</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR> \n")
  f.write( "  <TD ALIGN=LEFT>"+lXml["CliCoP"]+" RFC. "+lXml["CliRfc"]+"</TD>\n")
  f.write( "  <TD ALIGN=CENTER>"+lXml["AnioAp"]+" "+lXml["Aproba"]+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "</TABLE>\n")
  f.write( "<HR>\n")
# Movimientos
  movs=fFetchAll("SELECT fc_salida,fc_unimed,fc_descrip,fc_precio,fc_importe,(fc_fecha + fc_plazo),fc_numpar,fc_impuesto, \
    fc_clipro,fc_numpre,fc_vende,ve_nombre,fc_numdoc FROM fnfact, fnvend WHERE fc_numdoc='"+lfnd+"' AND fc_vende=ve_clave;")
  f.write( "<TABLE BORDER=0 WIDTH=100%>\n" )
  f.write( "<TR> \n")
  f.write( "<TH ALIGN=LEFT> Cantidad </TH>\n")
  f.write( "<TH ALIGN=LEFT> Unidad </TH>\n")
#  f.write( "<TH ALIGN=LEFT> Parte </TH>\n")
  f.write( "<TH ALIGN=LEFT> Descripcion </TH>\n")
  f.write( "<TH ALIGN=RIGHT> Precio </TH>\n")
  f.write( "<TH ALIGN=RIGHT> Importe </TH>\n")
  f.write( "</TR> \n")
  for mov in movs:
    f.write( "<TR> \n")
    f.write( "<TD ALIGN=LEFT> "+str(mov[0])+"</TD>\n")
    f.write( "<TD ALIGN=LEFT> "+str(mov[1])+"</TD>\n")
#    f.write( "<TD ALIGN=LEFT> "+str(mov[6])+"</TD>\n")
    f.write( "<TD ALIGN=LEFT> "+str(mov[2])+"</TD>\n")
    lPre="%12.2f" % (mov[3])
    f.write( "<TD ALIGN=RIGHT> "+lPre.strip()+"</TD>\n")
    lImp="%12.2f" % (mov[4])
    if lXml["CliRfc"]=="XAXX010101000":
      lImp="%12.2f" % (mov[4]+mov[7])
      
    f.write( "<TD ALIGN=RIGHT> "+lImp.strip()+"</TD>\n")
    f.write( "</TR> \n")
    dVence = mov[5].strftime("%Y-%m-%d")
    (aVen, mVen, dVen) = dVence.split("-")
    mCli=mov[8]
    mNpr=mov[9]
    mVee=mov[10]
    mVno=mov[11]
    mTik=lfnd

  mVen=ficdef.fDatExt(dVence,3)
  f.write( "<TR>\n")
  f.write( "<TD>&nbsp;</TD>\n") 
  f.write( "<TD>&nbsp;</TD>\n") 
  f.write( "<TD>&nbsp;</TD>\n") 
  f.write( "<TD ALIGN=RIGHT>SUBTOTAL</TD>\n")
  if lXml["CliRfc"]=="XAXX010101000":
    f.write( "<TD ALIGN=RIGHT>"+lXml["TotTotal"]+"</TD>\n")
  else:
    f.write( "<TD ALIGN=RIGHT>"+lXml["SubTotal"]+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR>\n")
  plin=ficdef.fPesos(float(lXml["TotTotal"]))
# Wed Mar 23 17:48:51 MDT 2011 
# Facturacion en Dollares
  if lXml["CliMof"]=="D":
    plin=plin.replace("Pesos","Dolares").replace("M.N.","USD")
#  f.write( "<TD COLSPAN=3 ROWSPAN=4 ALIGN=LEFT>Importe con letra: "+plin+"</TD>\n")
  f.write( "<TD COLSPAN=3 ROWSPAN=4 ALIGN=LEFT>Importe con letra: "+plin+"</TD>\n")
  f.write( "<TD ALIGN=RIGHT>16% IVA</TD>\n")
  if lXml["CliRfc"]=="XAXX010101000":
    f.write( "<TD ALIGN=RIGHT>&nbsp;</TD>\n")
  else:
    f.write( "<TD ALIGN=RIGHT>"+lXml["TotImpue"]+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR>\n")
  f.write( "<TD ALIGN=RIGHT>TOTAL</TD>\n")
#  f.write( "<TD ALIGN=RIGHT>"+lXml["TotTotal"]+"</TD>\n")
  f.write( "<TD ALIGN=RIGHT>"+lXml["TotTotal"][:-4]+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "</TABLE>\n")
#  f.write( "<TABLE BORDER=0 WIDTH=100%>\n" )
#  f.write( "<TR>\n")
#  f.write( "<TD ALIGN=LEFT>"+mCli+"</TD>\n")
#  f.write( "<TD ALIGN=LEFT>"+mNpr+"</TD>\n")
#  f.write( "<TD ALIGN=LEFT>"+mTik+"</TD>\n")
#  f.write( "<TD ALIGN=LEFT>"+mVee+"</TD>\n")
#  f.write( "<TD ALIGN=LEFT>"+mVno+"</TD>\n")
#  f.write( "<TD ALIGN=LEFT>&nbsp;</TD>\n")
#  f.write( "<TD ALIGN=LEFT>&nbsp;</TD>\n")
#  f.write( "<TD ALIGN=LEFT>&nbsp;</TD>\n")
#  f.write( "</TR>\n")
#  f.write( "</TABLE>\n")
  f.write( "<HR>\n")
# Cadena Original, Sello digital
  if lEsOriginal==1:
    f.write( "<TABLE BORDER=0 WIDTH=100%>\n" )
    f.write( "<TR>\n")
    f.write( "  <TD ALIGN=CENTER ROWSPAN=9> <IMG SRC=\""+lfacact+".png\" width=\"120\" height=\"120\" border=\"0\"> </TD> \n")
    f.write( "  <TD ALIGN=LEFT>FOLIO FISCAL : "+lUUID+"</TD>\n")
    f.write( "</TR>\n")
#    f.write( "<TABLE BORDER=0 WIDTH=100%>\n" )
    lCadOri=lCadOri.replace("Ñ","&Ntilde;")
    lCadOri=lCadOri.replace("ñ","&ntilde;")
    lCadOri="||1.0|"+lUUID.strip()+"|"+lFechaCFD.strip()+"|"+lselloCFD.strip()+"|"+lCertiSAT.strip()+"||"
    lCadOri=lCadOri.encode("utf-8")
    f.write( "<TR>\n")
    f.write( "  <TD ALIGN=LEFT><FONT SIZE=-2>Sello SAT</FONT></TD>\n")
    f.write( "</TR>\n")
    f.write( "<TR>\n")
    f.write( "  <TD ALIGN=LEFT><FONT SIZE=-2>"+lselloSAT[:120]+"</FONT></TD>\n")
    f.write( "</TR>\n")
    f.write( "<TR>\n")
    f.write( "  <TD ALIGN=LEFT><FONT SIZE=-2>"+lselloSAT[120:]+"</FONT></TD>\n")
    f.write( "</TR>\n")
    f.write( "<TR>\n")
    f.write( "  <TD ALIGN=LEFT><FONT SIZE=-2>Sello Digital del CFDI</FONT></TD>\n")
    f.write( "</TR>\n")
    f.write( "<TR>\n")
    f.write( "  <TD ALIGN=LEFT><FONT SIZE=-2>"+lselloCFD[:140]+" "+lselloCFD[140:]+"</FONT></TD>\n")
    f.write( "</TR>\n")
    f.write( "<TR>\n")
    f.write( "  <TD ALIGN=LEFT><FONT SIZE=-2>Cadena original del complemento de certificacion digital del SAT</FONT></TD>\n")
    f.write( "</TR>\n")
    f.write( "<TR>\n")
    f.write( "  <TD ALIGN=LEFT><FONT SIZE=-2>"+lCadOri[:150]+" "+lCadOri[150:]+"</FONT></TD>\n")
    f.write( "</TR>\n")
    f.write( "<TR>\n")
    f.write( "  <TD ALIGN=LEFT><FONT SIZE=-2>&nbsp;</FONT></TD>\n")
    f.write( "</TR>\n")
    f.write( "</TABLE>\n")
    f.write( "<TABLE BORDER=0 WIDTH=100%>\n" )
    f.write( "<TR>\n")
#    f.write( "  <TD ALIGN=CENTER ROWSPAN=7> <IMG SRC=\""+lfacact+".png\" width=\"120\" height=\"120\" border=\"0\"> </TD> \n")
    f.write( "  <TD ALIGN=LEFT><FONT SIZE=-2>Fecha y Hora de certificado "+lFechaCFD+"</FONT></TD>\n")
    f.write( "  <TD ALIGN=RIGHT><FONT SIZE=-2>Numero de Certificado SAT "+lCertiSAT+"</FONT></TD>\n")
    f.write( "  <TD ALIGN=RIGHT><FONT SIZE=-2>Numero de Certificado CSD "+lCertiCSD+"</FONT></TD>\n")
    f.write( "</TR>\n")
    f.write( "</TABLE>\n")

  f.write( "<TABLE BORDER=0 WIDTH=100%>\n" )
  f.write( "<TD ALIGN=LEFT><FONT SIZE=-2>Regimen Fiscal:<FONT></TD>\n")
  f.write( "<TD ALIGN=LEFT><FONT SIZE=-2>"+lXml["RegFis"]+"<FONT></TD>\n")
  f.write( "<TD ALIGN=LEFT><FONT SIZE=-2>Metodo de Pago:<FONT></TD>\n")
  f.write( "<TD ALIGN=LEFT><FONT SIZE=-2>"+lXml["CliFpa"]+"<FONT></TD>\n")
  if lXml["CliDpa"]:
    f.write( "<TD ALIGN=RIGHT><FONT SIZE=-2>Cta:<FONT></TD>\n")
    f.write( "<TD ALIGN=LEFT><FONT SIZE=-2>"+lXml["CliDpa"]+"<FONT></TD>\n")

  f.write( "</TR>\n")
  """
  f.write( "<TR>\n")
  lCadOri=lCadOri.replace("Ñ","&Ntilde;") 
  lCadOri=lCadOri.replace("ñ","&ntilde;")
  f.write( "<TD COLSPAN=3><FONT SIZE=-2>"+lCadOri+"<FONT></TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR>\n")
  f.write( "<TD ALIGN=LEFT COLSPAN=3><FONT SIZE=-2>Sello digital<FONT></TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR>\n")
  f.write( "<TD COLSPAN=3><FONT SIZE=-2>"+lSello+"</FONT></TD>\n")
  f.write( "</TR>\n")
  """
  f.write( "</TABLE>\n")
  f.write( "<HR>\n")
# Pagare
#  f.write( "<TABLE BORDER=1 WIDTH=100%>\n" )
#  f.write( "<TR>\n")
#  f.write( "<TD><FONT SIZE=-1>POR ESTE PAGARE ME(NOS) COMPROMETO(EMOS) A PAGAR INCONDICIONALMENTE EL DIA <B>"+dVen+" DE \
#"+mVen+" DE "+aVen+"</B> A LA ORDEN DE <B>SAUL ALONSO PONCE PEREZ</B>, EN SU DOMICILIO\
#LA CANTIDAD DE "+plin+" MERCANCIAS RECIBIDAS DE CONFORMIDAD. SI ESTE PAGARE NO FUERA CUBIERTO A SU VENCIMIENTO \
#CAUSARA UN INTERES MORATORIO DEL ..... % MENSUAL HASTA SU TOTAL LIQUIDACION.</FONT></TD>\n")
#  f.write( "</TR>\n")
#  f.write( "<TR>\n")
#  f.write( "<TD ALIGN=RIGHT><FONT SIZE=-1>.................................<FONT></TD>\n")
#  f.write( "</TR>\n")
#  f.write( "<TR>\n")
#  f.write( "<TD ALIGN=RIGHT><FONT SIZE=-1>           F  I  R  M  A        .<FONT></TD>\n")
#  f.write( "</TR>\n")
#  f.write( "</TABLE>\n")
  f.write( "<TABLE BORDER=0 WIDTH=100%>\n" )
  (lanio,lmes,ldia)=lHoy.split('-')
  lTex=ficdef.fDatExt(lHoy,1)
  f.write( "<TR>\n")
  f.write( "<TD ALIGN=LEFT><FONT SIZE=-1>CHIHUAHUA, CHIH. a "+lTex+".<FONT></TD>\n")
  f.write( "<TD ALIGN=RIGHT><FONT SIZE=-1>Efectos fiscales al pago. Pago en una sola exhibicion<FONT></TD>\n")
  f.write( "</TR>\n")
  f.write( "</TABLE>\n")
# 
  f.write( "<TABLE BORDER=0 WIDTH=100%>\n" )
  f.write( "<TR>\n")
#  f.write( "<TD ALIGN=CENTER>Este documento es una impresi&oacute;n de un comprobante fiscal digital</TD>\n")
  f.write( "<TD ALIGN=CENTER>Este documento es una representaci&oacute;n impresa de un CFDI</TD>\n")
  f.write( "</TR>\n")
  f.write( "</TABLE>\n")
  f.write( "<HR>\n")
  
#  f.write( "<TABLE BORDER=0 WIDTH=100%>\n" )
#  f.write( "<TR>\n")
#  f.write( "<TD ALIGN=CENTER>TODA DEVOLUCION CAUSA UN 10% POR FALSO MANEJO</TD>\n")
#  f.write( "<TD ALIGN=CENTER>DEVOLUCION SOLO EL DIA DE LA VENTA, FORANEAS 5 DIAS DESPUES</TD>\n")
#  f.write( "<TD ALIGN=CENTER>EN PARTES ELECTRICAS NO HAY GARANTIA NI DEVOLUCION</TD>\n")
#  f.write( "<TD ALIGN=CENTER>SOLO ACEPTAMOS DEVOLUCIONES PRESENTANDO LA FACTURA</TD>\n")
#  f.write( "</TR>\n")
#  f.write( "</TABLE>\n")

  f.write( "</BODY>\n" )
  f.write( "</HTML>\n" )
  f.closed
  return
                                                                                                              
# Sun Mar 31 12:51:27 MST 2013  NvaEspaña
def fTicFac(lHoy,lfacact,lSello,lXml,lfnd,lDirCfd,lTipDoc):
  n="\n"
#     # Codigos para Impresas Tickets
  ESC  = chr(27)
  NoC1 = chr(77)
  NoC2 = chr(100)
  NoC3 = chr(29)
  NoC4 = chr(86)

# Thu Mar 28 17:58:49 MST 2013 
  InitPrin      = chr(0x1B)+chr(0x40)           # Dec 27 + 64
  EmphasOFF     = chr(0x1B)+chr(0x45)+"0"       # Dec 27 + 69 + 0 
  EmphasON      = chr(0x1B)+chr(0x45)+"1"       # Dec 27 + 69 + 1 
  FontA         = chr(0x1B)+chr(0x4D)+"0"       # Dec 17 + 77 + 0
  FontB         = chr(0x1B)+chr(0x4D)+"1"       # Dec 17 + 77 + 1
  FontC         = chr(0x1B)+chr(0x4D)+"2"       # Dec 17 + 77 + 2
  Quadruple	= chr(0x1D)+"!"+chr(17)		# 	

  mcadori=lDirCfd+lfacact+".cadenaoriginal"
  fichero = open(path.realpath(mcadori), "r")
  lCadOri=fichero.readline()
  fichero.closed
  lfactura=lDirCfd+lfacact+".html"
  f = open(path.realpath(lfactura), "w")
  f.write(Quadruple)
  f.write( center("CHAVITAR",20)+n)
#  f.write( center("C H A V I T A R",40)+n)
# Emisor
  f.write( InitPrin+EmphasON )
#  f.write( center("EMISOR",40)+n)
  f.write( center(lXml["EmiNom"],40)+n)
  f.write( center(lXml["EmiCal"]+" "+lXml["EmiNoE"],40)+n)
  f.write( center(lXml["EmiCol"]+" "+lXml["EmiLoc"],40)+n)
  f.write( center(lXml["EmiMun"]+" "+lXml["EmiEst"]+" "+lXml["EmiPai"],40)+n)
  f.write( center(lXml["EmiCod"]+" RFC. "+lXml["EmiRfc"],40)+n)
  f.write( InitPrin+n )
# 
  f.write( InitPrin+FontB )
  lLin="FOLIO : "+EmphasON+lfacact+EmphasOFF
#  f.write( lLin+n )
#  lLin=center("FECHA",40)
#  f.write( lLin+n )
  lLin+="     FECHA : "+lXml["FecAct"].replace("T"," ")
  f.write( center(lLin,56)+n )
#                                                      ñ        ó 
  lLin="A%1so y No. de Aprobaci%1sn de Folios" % (chr(164),chr(162))
#  f.write( lLin+n )
  lLin+="  "+lXml["AnioAp"]+" "+lXml["Aproba"]
  f.write( center(lLin,56)+n )

# Cliente
  lLin=InitPrin+FontA+EmphasON
  lLin+=center("CLIENTE",40)
  f.write( lLin+n )
  lLin=EmphasOFF+InitPrin+FontB
  lTex=lXml["CliNom"]
  Tex=lTex.replace("Ñ","&Ntilde;") 
  Tex=lTex.replace("ñ","&ntilde;")
  lLin+=lTex
  f.write( lLin+n )
  lLin=lXml["CliDom"]
  f.write( lLin+n )
  lLin=lXml["CliCol"]+" "+lXml["CliLoc"]
  f.write( lLin+n )
  lLin=lXml["CliMun"]+" "+lXml["CliEst"]+" "+lXml["CliPai"]
  f.write( lLin+n )
  lLin=lXml["CliCoP"]
  f.write( lLin+n )
  lLin=''

  lLin+=EmphasON+" RFC. "+lXml["CliRfc"]+EmphasOFF

  if lTipDoc=='FR':
    lLin+="     C R E D I T O"
  else:
    lLin+="     C O N T A D O"
  f.write( center(lLin,56)+n )

# Movimientos
#  movs=fFetchAll("SELECT fc_salida,fc_unimed,fc_descrip,fc_precio,fc_importe,(fc_fecha + fc_plazo),fc_numpar,fc_impuesto FROM fnfact WHERE fc_numdoc='"+lfnd+"';")
  movs=fFetchAll("SELECT fc_salida,fc_unimed,fc_descrip,fc_precio,fc_importe,(fc_fecha + fc_plazo),fc_numpar,fc_impuesto, \
    fc_clipro,fc_numpre,fc_vende,ve_nombre,fc_numdoc FROM fnfact, fnvend WHERE fc_numdoc='"+lfnd+"' AND fc_vende=ve_clave;")
#                1         2         3         4
#       1234567890123456789012345678901234567890
#                1         2         3         4         5
#       12345678901234567890123456789012345678901234567890123456
  lLin="Cant.   P  a  r  t  e       UM      Precio     Importe"
  f.write( lLin+n )

  for mov in movs:
    lPre=mov[3]
    lImp=mov[4]
    if lXml["CliRfc"]=="XAXX010101000":
      lImp=mov[4]+mov[7]
    lLin="%4i %15s       %3s    %8.2f  %10.2f" % (mov[0],mov[6],mov[1],lPre,lImp)
    f.write( lLin+n )
    lLin="%-54s" % (mov[2])
    f.write( lLin+n )
    dVence = mov[5].strftime("%Y-%m-%d")
    (aVen, mVen, dVen) = dVence.split("-")
    mCli=mov[8]
    mNpr=mov[9]
    mVee=mov[10]
    mVno=mov[11]
    mTik=lfnd

  mVen=ficdef.fDatExt(dVence,3)

  if lXml["CliRfc"]=="XAXX010101000":
    """ revisar si imprimir esto en ticket contado sin RF """
#    lLin="%26s  %12.2f" % ("SubTotal",float(lXml["TotTotal"]))
#    f.write(lLin+n)
  else:
    lLin="%40s  %12.2f" % ("SubTotal",float(lXml["SubTotal"]))
    f.write(lLin+n)

  if lXml["CliRfc"]=="XAXX010101000":
    f.write( n)
  else:
    lLin="%40s  %12.2f" % ("Iva",float(lXml["TotImpue"]))
    f.write(lLin+n)

  lLin=EmphasON+"%40s  %12.2f" % ("Total",float(lXml["TotTotal"]))+EmphasOFF
  f.write(lLin+n)

  LmCli=EmphasON+mCli+EmphasOFF
  lLin="%s %s %s %s %s" % (LmCli, mNpr, mTik, mVee, mVno)
  f.write(lLin+n)

  lLin="Importe con letra: "
  f.write(lLin+n)
  lLin=ficdef.fPesos(float(lXml["TotTotal"]))
  f.write(lLin+n)

# Cadena Original, Sello digital
  lLin="Numero de Certificado "+lXml["NoCer"]
  f.write(lLin+n)
  lLin="Cadena Original"
  f.write(lLin+n)
  lLin=lCadOri
  f.write(lLin+n)
  lLin="Sello"
  f.write(lLin+n)
  lLin=lSello
  f.write(lLin+n)

# Fecha de hoy
  (lanio,lmes,ldia)=lHoy.split('-')
  lTex=ficdef.fDatExt(lHoy,1)
  lLin="CHIHUAHUA, CHIH. a "+lTex+"."
  f.write(lLin+n)
# 
#  lLin="Este documento es una impresión de un comprobante fiscal digital"
  lLin="Este documento es una representaci%1sn impresa de un CFD" % (chr(162))
  f.write( lLin+n )
  f.write("."+n)

#  1234567890123456789012345678901234567890
  lLin="TODA DEVOLUCION CAUSA UN 10% POR FALSO MANEJO"
  f.write( lLin+n )
  lLin="DEVOLUCION SOLO EL DIA DE LA VENTA,"
  f.write( lLin+n )
  lLin="FORANEAS 5 DIAS DESPUES"
  f.write( lLin+n )
  lLin="EN PARTES ELECTRICAS NO HAY GARANTIA NI DEVOLUCION"
  f.write( lLin+n )
  lLin="SOLO ACEPTAMOS DEVOLUCIONES PRESENTANDO LA FACTURA"
  f.write( lLin+n )
  lLin="PARA CUALQUIER DEVOLUCION/ACLARACION CONSERVE SU TICKET"
  f.write( lLin+n )
  lLin="PARA CUALQUIER DEVOLUCION/ACLARACION CONSERVE SU TICKET"
  f.write( lLin+n )

  f.write("."+n)
  f.write("."+n)
  f.write("."+n)
  f.write("."+n)

  f.write(NoC3+NoC4+"0")

  f.closed

  return

def fFacHTMLRU(lHoy,lfacact,lSello,lXml,lfnd,lDirCfd,lTipDoc,lEsOriginal):
  mcadori=lDirCfd+lfacact+".cadenaoriginal"
  fichero = open(path.realpath(mcadori), "r") 
  lCadOri=fichero.readline()
  fichero.closed
  lfactura=lDirCfd+lfacact+".html"
  f = open(path.realpath(lfactura), "w") 
# Emisor
  f.write( "<HTML>\n" )
  f.write( "<BODY>\n" )
  f.write( "<CENTER>\n")
  f.write( "<TABLE BORDER=0 WIDTH=100%>\n" )
  f.write( "<TR>\n")
  f.write( "  <TD ALIGN=CENTER> <IMG SRC=\"logo.jpg\" width=\"580\" height=\"120\" border=\"0\"> </TD> \n")
#  f.write( "  <TD ALIGN=CENTER ROWSPAN=7> <IMG SRC=\"logo.jpg\"> </TD> \n")
#  f.write( "  <TD ALIGN=CENTER>EMISOR</TD>\n")
  f.write( "</TR>\n")
  """  
  f.write( "<TR>\n")
  f.write( "  <TD ALIGN=CENTER>"+lXml["EmiNom"]+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR>\n")
  f.write( "  <TD ALIGN=CENTER>"+lXml["EmiCal"]+" "+lXml["EmiNoE"]+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR>\n")
  f.write( "  <TD ALIGN=CENTER>"+lXml["EmiCol"]+" "+lXml["EmiLoc"]+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR>\n")
  f.write( "  <TD ALIGN=CENTER>"+lXml["EmiMun"]+" "+lXml["EmiEst"]+" "+lXml["EmiPai"]+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR>\n")
  f.write( "  <TD ALIGN=CENTER>"+lXml["EmiCod"]+" RFC. "+lXml["EmiRfc"]+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR>\n")
  f.write( "  <TD ALIGN=CENTER>&nbsp;</TD>\n")
  f.write( "</TR>\n")
  """
  f.write( "</TABLE>\n")
  f.write( "<HR>\n")
# Cliente
  f.write( "<TABLE BORDER=0 WIDTH=100%>\n" )
  f.write( "<TR>\n")
  f.write( "  <TD ALIGN=CENTER><B>CLIENTE</B></TD>\n")
  if lTipDoc=='FC':
    f.write( "  <TD ALIGN=CENTER><B>FACTURA CONTADO</B></TD>\n")
  else:
    f.write( "  <TD ALIGN=CENTER><B>FACTURA CREDITO</B></TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR>\n")
  lTex=lXml["CliNom"]
  lTex=lTex.replace("Ñ","&Ntilde;") 
  lTex=lTex.replace("ñ","&ntilde;")
  f.write( "  <TD ALIGN=LEFT>"+lTex+"</TD>\n")
  f.write( "  <TD ALIGN=CENTER>"+lfacact+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR> \n")
  f.write( "  <TD ALIGN=LEFT>"+lXml["CliDom"]+"</TD>\n")
  f.write( "  <TD ALIGN=CENTER>FECHA</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR> \n")
  f.write( "  <TD ALIGN=LEFT>"+lXml["CliCol"]+" "+lXml["CliLoc"]+"</TD>\n")
  lTex=lXml["FecAct"].replace("T"," ")
  f.write( "  <TD ALIGN=CENTER>"+lTex+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR> \n")
  f.write( "  <TD ALIGN=LEFT>"+lXml["CliMun"]+" "+lXml["CliEst"]+" "+lXml["CliPai"]+"</TD>\n")
  f.write( "  <TD ALIGN=CENTER>A&ntilde;o y No. de Aprobaci&oacute;n de Folios</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR> \n")
  f.write( "  <TD ALIGN=LEFT>"+lXml["CliCoP"]+" RFC. "+lXml["CliRfc"]+"</TD>\n")
  f.write( "  <TD ALIGN=CENTER>"+lXml["AnioAp"]+" "+lXml["Aproba"]+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "</TABLE>\n")
  f.write( "<HR>\n")
# Movimientos
  movs=fFetchAll("SELECT fc_salida,fc_unimed,fc_descrip,fc_precio,fc_importe,(fc_fecha + fc_plazo),fc_numpar,fc_impuesto, \
    fc_clipro,fc_numpre,fc_vende,ve_nombre,fc_numdoc,fc_fecha FROM fnfact, fnvend WHERE fc_numdoc='"+lfnd+"' AND fc_vende=ve_clave;")
  f.write( "<TABLE BORDER=0 WIDTH=100%>\n" )
  f.write( "<TR> \n")
  f.write( "<TH ALIGN=LEFT> Cantidad </TH>\n")
  f.write( "<TH ALIGN=LEFT> Unidad </TH>\n")
#  f.write( "<TH ALIGN=LEFT> Parte </TH>\n")
  f.write( "<TH ALIGN=LEFT> Descripcion </TH>\n")
  f.write( "<TH ALIGN=RIGHT> Precio </TH>\n")
  f.write( "<TH ALIGN=RIGHT> Importe </TH>\n")
  f.write( "</TR> \n")
  for mov in movs:
    f.write( "<TR> \n")
    f.write( "<TD ALIGN=LEFT> "+str(mov[0])+"</TD>\n")
    if mov[1]=='PZ':
      mUniMed='PIEZA'
    elif mov[1]=='SE':
      mUniMed='SERVICIO'
    elif mov[1]=='JG':
      mUniMed='JUEGO'
    else:
      mUniMed=mov[1]
    f.write( "<TD ALIGN=LEFT> "+mUniMed+"</TD>\n")
#    f.write( "<TD ALIGN=LEFT> "+str(mov[6])+"</TD>\n")
    f.write( "<TD ALIGN=LEFT> "+str(mov[2])+"</TD>\n")
    lPre="%12.2f" % (mov[3])
    f.write( "<TD ALIGN=RIGHT> "+lPre.strip()+"</TD>\n")
    lImp="%12.2f" % (mov[4])
    if lXml["CliRfc"]=="XAXX010101000":
      lImp="%12.2f" % (mov[4]+mov[7])
     
    f.write( "<TD ALIGN=RIGHT> "+lImp.strip()+"</TD>\n")
    f.write( "</TR> \n")
    dFactu = mov[13].strftime("%Y-%m-%d")
    dVence = mov[5].strftime("%Y-%m-%d")
    (aVen, mVen, dVen) = dVence.split("-")
    mCli=mov[8]
    mNpr=mov[9]
    mVee=mov[10]
    mVno=mov[11]
    mTik=lfnd

  mVen=ficdef.fDatExt(dVence,3)
  f.write( "<TR>\n")
  f.write( "<TD>&nbsp;</TD>\n") 
  f.write( "<TD>&nbsp;</TD>\n") 
  f.write( "<TD>&nbsp;</TD>\n") 
  f.write( "<TD ALIGN=RIGHT>SUBTOTAL</TD>\n")
  if lXml["CliRfc"]=="XAXX010101000":
    f.write( "<TD ALIGN=RIGHT>"+lXml["TotTotal"]+"</TD>\n")
  else:
    f.write( "<TD ALIGN=RIGHT>"+lXml["SubTotal"]+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR>\n")
  plin=ficdef.fPesos(float(lXml["TotTotal"]))
  f.write( "<TD COLSPAN=3 ROWSPAN=4 ALIGN=LEFT>Importe con letra: "+plin+"</TD>\n")
  f.write( "<TD ALIGN=RIGHT>16% IVA</TD>\n")
  if lXml["CliRfc"]=="XAXX010101000":
    f.write( "<TD ALIGN=RIGHT>&nbsp;</TD>\n")
  else:
    f.write( "<TD ALIGN=RIGHT>"+lXml["TotImpue"]+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR>\n")
  f.write( "<TD ALIGN=RIGHT>TOTAL</TD>\n")
  f.write( "<TD ALIGN=RIGHT>"+lXml["TotTotal"]+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "</TABLE>\n")
  """  
  f.write( "<TABLE BORDER=0 WIDTH=100%>\n" )
  f.write( "<TR>\n")
  f.write( "<TD ALIGN=LEFT>"+mCli+"</TD>\n")
  f.write( "<TD ALIGN=LEFT>"+mNpr+"</TD>\n")
  f.write( "<TD ALIGN=LEFT>"+mTik+"</TD>\n")
  f.write( "<TD ALIGN=LEFT>"+mVee+"</TD>\n")
  f.write( "<TD ALIGN=LEFT>"+mVno+"</TD>\n")
  f.write( "<TD ALIGN=LEFT>&nbsp;</TD>\n")
  f.write( "</TR>\n")
  f.write( "</TABLE>\n")
  """
  f.write( "<HR>\n")
  f.write( "<TABLE BORDER=0 WIDTH=100%>\n" )
  f.write( "<TR>\n")
  f.write( "<TD ALIGN=RIGHT><FONT SIZE=-2>Reguimen Fiscal:<FONT></TD>\n")
  f.write( "<TD ALIGN=LEFT><FONT SIZE=-2>"+lXml["RegFis"]+"<FONT></TD>\n")
  f.write( "<TD ALIGN=RIGHT><FONT SIZE=-2>Metodo de Pago:<FONT></TD>\n")
  f.write( "<TD ALIGN=LEFT><FONT SIZE=-2>"+lXml["CliFpa"]+"<FONT></TD>\n")
  if lXml["CliDpa"]:
    f.write( "<TD ALIGN=RIGHT><FONT SIZE=-2>Cta:<FONT></TD>\n")
    f.write( "<TD ALIGN=LEFT><FONT SIZE=-2>"+lXml["CliDpa"]+"<FONT></TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR>\n")

# Cadena Original, Sello digital
  """ 
  f.write( "<TABLE BORDER=0 WIDTH=100%>\n" )
  f.write( "<TR>\n")
  f.write( "<TD ALIGN=LEFT><FONT SIZE=-2>Cadena original<FONT></TD>\n")
  f.write( "<TD ALIGN=RIGHT><FONT SIZE=-2>Numero de Certificado<FONT></TD>\n")
  f.write( "<TD ALIGN=LEFT><FONT SIZE=-2>"+lXml["NoCer"]+"<FONT></TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR>\n")
  lCadOri=lCadOri.replace("Ñ","&Ntilde;") 
  lCadOri=lCadOri.replace("ñ","&ntilde;")
  f.write( "<TD COLSPAN=3><FONT SIZE=-2>"+lCadOri+"<FONT></TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR>\n")
  f.write( "<TD ALIGN=LEFT COLSPAN=3><FONT SIZE=-2>Sello digital<FONT></TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR>\n")
  f.write( "<TD COLSPAN=3><FONT SIZE=-2>"+lSello+"</FONT></TD>\n")
  f.write( "</TR>\n")
  f.write( "</TABLE>\n")
  f.write( "<HR>\n")
  """
# Pagare
  f.write( "<TABLE BORDER=0 WIDTH=100%>\n" )
  f.write( "<TR>\n")
  f.write( "  <TD ALIGN=CENTER ROWSPAN=7> <IMG SRC=\"cbb.png\" width=\"100\" height=\"100\" border=\"0\"> </TD> \n")
#  f.write( "  <TD ALIGN=CENTER> <IMG SRC=\"cbb.png\" width=\"100\" height=\"100\" border=\"0\"> </TD> \n")
  f.write( "  <TD><FONT SIZE=-1>POR ESTE PAGARE ME(NOS) COMPROMETO(EMOS) A PAGAR INCONDICIONALMENTE EL DIA <B>"+dVen+" DE \
"+mVen+" DE "+aVen+"</B> A LA ORDEN DE <B>MARIA DEL ROSARIO UGARTE</B>, EN SU DOMICILIO\
LA CANTIDAD DE "+plin+" MERCANCIAS RECIBIDAS DE CONFORMIDAD. SI ESTE PAGARE NO FUERA CUBIERTO A SU VENCIMIENTO \
CAUSARA UN INTERES MORATORIO DEL ..... % MENSUAL HASTA SU TOTAL LIQUIDACION.</FONT></TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR>\n")
  f.write( "<TD ALIGN=RIGHT><FONT SIZE=-1>.......................................................<FONT></TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR>\n")
  f.write( "<TD ALIGN=RIGHT><FONT SIZE=-1>.                     F  I  R  M  A                   .<FONT></TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR>\n")
  f.write( "<TD ALIGN=CENTER>La reproduccion ap&oacute;crifa de este comprobante constituye un delito en los t&eacute;rminos de las disposiciones fiscales</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR>\n")
  f.write( "<TD ALIGN=CENTER>Este comprobante tendr&aacute; una vigencia de dos a&ntilde;os a partir de la fecha de aprobaci&oacute;n de la asignaci&oacute;n de folios, la cuals es: 03/05/2011</TD>\n")
  f.write( "</TR>\n")
  f.write( "</TABLE>\n")
  f.write( "<TABLE BORDER=0 WIDTH=100%>\n" )
  (lanio,lmes,ldia)=lHoy.split('-')
  lTex=ficdef.fDatExt(lHoy,1)
  lTex=ficdef.fDatExt(dFactu,1)
  f.write( "<TR>\n")
  f.write( "<TD ALIGN=LEFT><FONT SIZE=-1>CHIHUAHUA, CHIH. a "+lTex+".<FONT></TD>\n")
  f.write( "<TD ALIGN=RIGHT><FONT SIZE=-1>Efectos fiscales al pago. Pago en una sola exhibicion<FONT></TD>\n")
  f.write( "</TR>\n")
  f.write( "</TABLE>\n")
# 
  """
  f.write( "<TABLE BORDER=0 WIDTH=100%>\n" )
  f.write( "<TR>\n")
#  f.write( "<TD ALIGN=CENTER>Este documento es una impresi&oacute;n de un comprobante fiscal digital</TD>\n")
#  f.write( "<TD ALIGN=CENTER>Este documento es una representaci&oacute;n impresa de un CFD</TD>\n")
  f.write( "<TD ALIGN=CENTER>La reproduccion ap&oacute;crifa de este comprobante constituye un delito en los t&eacute;rminos de las disposiciones fiscales</TD>\n")
  f.write( "<TD ALIGN=CENTER>Este comprobante tendr&aacute; una vigencia de dos a&ntilde;os a partir de la fecha de aprobaci&oacute;n de la asignaci&oacute;n de folios,</TD>\n")
  f.write( "<TD ALIGN=CENTER>la cual es : 03/05/2011 </TD>\n")
  f.write( "</TR>\n")
  f.write( "</TABLE>\n")
  """
  f.write( "<HR>\n")
# 
  """
  f.write( "<TABLE BORDER=0 WIDTH=100%>\n" )
  f.write( "<TR>\n")
  f.write( "<TD ALIGN=CENTER>TODA DEVOLUCION CAUSA UN 10% POR FALSO MANEJO</TD>\n")
  f.write( "<TD ALIGN=CENTER>DEVOLUCION SOLO EL DIA DE LA VENTA, FORANEAS 5 DIAS DESPUES</TD>\n")
  f.write( "<TD ALIGN=CENTER>EN PARTES ELECTRICAS NO HAY GARANTIA NI DEVOLUCION</TD>\n")
  f.write( "<TD ALIGN=CENTER>SOLO ACEPTAMOS DEVOLUCIONES PRESENTANDO LA FACTURA</TD>\n")
  f.write( "</TR>\n")
  f.write( "</TABLE>\n")
  """
  if lEsOriginal==1:
    f.write( "<TABLE BORDER=0 WIDTH=100%>\n" )
    f.write( "<TR>\n")
    f.write( "<TD ALIGN=CENTER>*** C O P I A ***</TD>\n")
    f.write( "</TR>\n")
    f.write( "</TABLE>\n")
    f.write( "<HR>\n")

  f.write( "</BODY>\n" )
  f.write( "</HTML>\n" )
  f.closed
  return


def fSendF(lPdf,lfacact,lDirCfd,lCorD):

  lDebug=False
 
  from email.mime.text import MIMEText
  from email.mime.application import MIMEApplication
  from email.mime.multipart import MIMEMultipart
#  from smtplib import SMTP_SSL, SMTP
  import smtplib 

  mMail=fFetchOne("SELECT * FROM fnmail")

# Var
  smtp=''
  lkFue='Correo Enviado'
  lCorO=mMail[1].strip()			# Correo de Origen
  lUsr=mMail[2].strip()				# Usuario de Correo Origen
  lPas=mMail[3].strip()				# Contraseña de Correo Origen
#  lCorD="jorgericarte@asuni.com.mx"		# Correo Destino
  lCoCC=mMail[9].strip()			# Correo para CC

# Construimos un mensaje Multipart, con un texto y una imagen adjunta
  msg = MIMEMultipart()

# Es correo de CXC
  if lfacact.find(":") > 0: (lfacact,fusr)=lfacact.split(":")
  if lfacact=="*cxc*":
    mAsuCor=mMsgCor=''
    fMailCxc="var/MailCxc."+fusr
    file=open(fMailCxc,"r")
    i=0
    for linea in file.readlines():
      if i==0:
        mAsuCor=linea
      elif i>=1:
        mMsgCor+=linea
      i+=1
    file.close()
#  msg['Subject']="Tienes un correo"
    mAsuCor=mAsuCor.strip()
    mMsgCor=mMsgCor.strip()
    if lDebug:fLog("* CXC * ",mAsuCor+"\n"+mMsgCor)
    msg['Subject']=mAsuCor
    msg['From']=lCorO
#  msg['Reply-to']='iofran2035@gmail.com'
    msg['To']=lCorD
    if lCoCC:
      msg['Cc']=lCoCC

#    if lDebug:fLog("msg['From'] = ",lCorO)
# Esto es lo que se ve si uno no tiene un lector de mails :
    msg.preamble = 'Mensaje de multiples partes.\n'

# Esta es la parte textual:
#  part = MIMEText("Hola, te paso un archivo interesante")
    part = MIMEText(mMsgCor)

  else:  
#  msg['Subject']="Tienes un correo"
    msg['Subject']=mMail[7].strip()
    msg['From']=lCorO
#  msg['Reply-to']='iofran2035@gmail.com'
    msg['To']=lCorD
    if lCoCC:
      msg['Cc']=lCoCC

# Esto es lo que se ve si uno no tiene un lector de mails :
    msg.preamble = 'Mensaje de multiples partes.\n'

# Esta es la parte textual:
#  part = MIMEText("Hola, te paso un archivo interesante")
    part = MIMEText(mMail[8].strip())


  msg.attach(part)

# Esta es la parte binaria (puede ser cualquier extensión):
  file = open(lPdf, "rb")
  part = MIMEApplication(file.read())
  file.close() 
  (lPath,lFileName)=lPdf.split('/')
  if lDebug:fLog("lPath = ",lPath)
  if lDebug:fLog("lFileName = ",lFileName)
  part.add_header('Content-Disposition', 'attachment', filename=lFileName)
  msg.attach(part)

  if lfacact!="*cxc*":
    lXml=lDirCfd+lfacact+"t.xml"
    file = open(lXml, "rb")
    part = MIMEApplication(file.read())
    file.close() 
    (lPath,lFileName)=lXml.split('/')
    part.add_header('Content-Disposition', 'attachment', filename=lFileName)
    msg.attach(part)

# Crear una instancia del servidor para envio de correo (hacerlo una sola vez)
  lsmtp=mMail[4]
  lSSL=mMail[5]
  lPort=mMail[6]
  lOkSMTP=True
  if lSSL==True:
    try:
      smtp = smtplib.SMTP_SSL(lsmtp,lPort)
    except:
      lkFue = " Coneccion Rechazada por servidor de correo saliente "
      lOkSMTP=False
  else:
    smtp = smtplib.SMTP(lsmtp,lPort)

  if lOkSMTP:
# Iniciar sesión en el servidor (si es necesario):
    smtp.ehlo()

# Login 
    try:
      smtp.login(lUsr, lPas)
    except smtplib.SMTPAuthenticationError :
      lkFue="Error: Fallo Autentificacion de correo"
      lOkSMTP=False
    except:
#    lkFue= "Unexpected error:", sys.exc_info()[0]
      lkFue="Error login correo"
      lOkSMTP=False

# Debug smtp
#  smtp.set_debuglevel(True) 

  if lDebug:fLog("msg['From'] = ",msg['From'])
  if lDebug:fLog("msg['To'] = ",msg['To'])
#  if lDebug:fLog("msg.as_string()",msg.as_string())

# Enviar el mail (o los mails)
  if lOkSMTP:
    try:
      smtp.sendmail(msg['From'], msg['To'], msg.as_string())
    except smtplib.SMTPSenderRefused :
      lkFue="Error: cuenta de envio rechazada"
    except smtplib.SMTPRecipientsRefused:
      lkFue="Error: cuenta rechazada"
    except smtplib.SMTPConnectError:
      lkFue="Error: Error de coneccion"
    except Exception, error:
#    lkFue= "Unexpected error:", sys.exc_info()[0]
      lkFue="Error send-mail "

# Cierre de la conexion
  if smtp:
    smtp.close()
  
  return lkFue
 
# ************************************************************************************************************** CH Cfdi 32
# <Start/>
# ************************************************************************************************************** CH Cfdi 32
def fTicNV(lHoy,lfacact,lSello,lXml,lfnd,lDirCfd,lTipDoc):
  n="\n"
#     # Codigos para Impresas Tickets
  ESC  = chr(27)
  NoC1 = chr(77)
  NoC2 = chr(100)
  NoC3 = chr(29)
  NoC4 = chr(86)

# Thu Mar 28 17:58:49 MST 2013 
  InitPrin      = chr(0x1B)+chr(0x40)           # Dec 27 + 64
  EmphasOFF     = chr(0x1B)+chr(0x45)+"0"       # Dec 27 + 69 + 0 
  EmphasON      = chr(0x1B)+chr(0x45)+"1"       # Dec 27 + 69 + 1 
  FontA         = chr(0x1B)+chr(0x4D)+"0"       # Dec 17 + 77 + 0
  FontB         = chr(0x1B)+chr(0x4D)+"1"       # Dec 17 + 77 + 1
  FontC         = chr(0x1B)+chr(0x4D)+"2"       # Dec 17 + 77 + 2
  Quadruple	= chr(0x1D)+"!"+chr(17)		# 	

#  mcadori=lDirCfd+lfacact+".cadenaoriginal"
#  fichero = open(path.realpath(mcadori), "r")
#  lCadOri=fichero.readline()
#  fichero.closed
  lfactura=lDirCfd+lfacact+".html"
  f = open(path.realpath(lfactura), "w")
  f.write(Quadruple)
  f.write( center("CHAVITAR",20)+n)
#  f.write( center("C H A V I T A R",40)+n)
# Emisor
  f.write( InitPrin+EmphasON )
#  f.write( center("EMISOR",40)+n)
  f.write( center(lXml["EmiNom"],40)+n)
  f.write( center(lXml["EmiCal"]+" "+lXml["EmiNoE"],40)+n)
  f.write( center(lXml["EmiCol"]+" "+lXml["EmiLoc"],40)+n)
  f.write( center(lXml["EmiMun"]+" "+lXml["EmiEst"]+" "+lXml["EmiPai"],40)+n)
  f.write( center(lXml["EmiCod"]+" RFC. "+lXml["EmiRfc"],40)+n)
  f.write( center(lXml["EmiSuc"],40)+n)
  f.write( InitPrin+n )
# 
  f.write( InitPrin+FontB )
  lLin="FOLIO : "+EmphasON+lfacact+EmphasOFF
#  f.write( lLin+n )
#  lLin=center("FECHA",40)
#  f.write( lLin+n )
  lLin+="     FECHA : "+lXml["FecAct"].replace("T"," ")
  f.write( center(lLin,56)+n )
#                                                      ñ        ó 
#  lLin="A%1so y No. de Aprobaci%1sn de Folios" % (chr(164),chr(162))
#  f.write( lLin+n )
#  lLin+="  "+lXml["AnioAp"]+" "+lXml["Aproba"]
#  f.write( center(lLin,56)+n )

# Cliente
  lLin=InitPrin+FontA+EmphasON
  lLin+=center("CLIENTE",40)
  f.write( lLin+n )
  lLin=EmphasOFF+InitPrin+FontB
#  lTex=lXml["CliNom"]
  lTex=fUtf8HTML(lXml["CliNom"],True)
#  lTex=lXml["CliNom"].encode("utf-8")
#  Tex=lTex.replace("Ñ","&Ntilde;") 
#  Tex=lTex.replace("ñ","&ntilde;")
  lLin+=lTex
  f.write( lLin+n )
#  lLin=lXml["CliDom"]
  lLin=fUtf8HTML(lXml["CliDom"],True)
  f.write( lLin+n )
  lLin=fUtf8HTML(lXml["CliCol"],True)+" "+fUtf8HTML(lXml["CliLoc"],True)
#  lLin=lXml["CliCol"]+" "+lXml["CliLoc"]
  f.write( lLin+n )
  lLin=fUtf8HTML(lXml["CliMun"],True)+" "+lXml["CliEst"]+" "+lXml["CliPai"]
#  lLin=lXml["CliMun"]+" "+lXml["CliEst"]+" "+lXml["CliPai"]
  f.write( lLin+n )
  lLin=lXml["CliCoP"]
  f.write( lLin+n )
  lLin=''

  lLin+=EmphasON+" RFC. "+lXml["CliRfc"]+EmphasOFF

  if lTipDoc=='FR':
    lLin+="     C R E D I T O"
  else:
    lLin+="     C O N T A D O"
  f.write( center(lLin,56)+n )

# Movimientos
#  movs=fFetchAll("SELECT fc_salida,fc_unimed,fc_descrip,fc_precio,fc_importe,(fc_fecha + fc_plazo),fc_numpar,fc_impuesto FROM fnfact WHERE fc_numdoc='"+lfnd+"';")
  movs=fFetchAll("SELECT fc_salida,fc_unimed,fc_descrip,fc_precio,fc_importe,(fc_fecha + fc_plazo),fc_numpar,fc_impuesto, \
    fc_clipro,fc_numpre,fc_vende,ve_nombre,fc_numdoc FROM fnfact, fnvend WHERE fc_numdoc='"+lfnd+"' AND fc_vende=ve_clave;")
#                1         2         3         4
#       1234567890123456789012345678901234567890
#                1         2         3         4         5
#       12345678901234567890123456789012345678901234567890123456
  lLin="Cant.   P  a  r  t  e       UM      Precio     Importe"
  f.write( lLin+n )

  for mov in movs:
    lPre=mov[3]
    lImp=mov[4]
    if lXml["CliRfc"]=="XAXX010101000":
      lImp=mov[4]+mov[7]
    lLin="%4i %15s       %3s    %8.2f  %10.2f" % (mov[0],mov[6],mov[1],lPre,lImp)
    f.write( lLin+n )
#    lLin="%-54s" % (mov[2])
    lLin=fTOUnicodeUTF8(mov[2])
    lLin="%-54s" % (fUtf8HTML(lLin,True))
    f.write( lLin+n )
    dVence = mov[5].strftime("%Y-%m-%d")
    (aVen, mVen, dVen) = dVence.split("-")
    mCli=mov[8]
    mNpr=mov[9]
    mVee=mov[10]
    mVno=mov[11]
    mTik=lfnd

  mVen=ficdef.fDatExt(dVence,3)

  if lXml["CliRfc"]=="XAXX010101000":
    """ revisar si imprimir esto en ticket contado sin RF """
#    lLin="%26s  %12.2f" % ("SubTotal",float(lXml["TotTotal"]))
#    f.write(lLin+n)
  else:
    lLin="%40s  %12.2f" % ("SubTotal",float(lXml["SubTotal"]))
    f.write(lLin+n)

  if lXml["CliRfc"]=="XAXX010101000":
    f.write( n)
  else:
    lLin="%40s  %12.2f" % ("Iva",float(lXml["TotImpue"]))
    f.write(lLin+n)

  lLin=EmphasON+"%40s  %12.2f" % ("Total",float(lXml["TotTotal"]))+EmphasOFF
  f.write(lLin+n)

  LmCli=EmphasON+mCli+EmphasOFF
  lLin="%s %s %s %s %s" % (LmCli, mNpr, mTik, mVee, mVno)
  f.write(lLin+n)

  lLin="Importe con letra: "
  f.write(lLin+n)
  lLin=ficdef.fPesos(float(lXml["TotTotal"]))
  f.write(lLin+n)

# Cadena Original, Sello digital
#  lLin="Numero de Certificado "+lXml["NoCer"]
#  f.write(lLin+n)
#  lLin="Cadena Original"
#  f.write(lLin+n)
#  lLin=lCadOri
#  f.write(lLin+n)
#  lLin="Sello"
#  f.write(lLin+n)
#  lLin=lSello
#  f.write(lLin+n)

# Fecha de hoy
  (lanio,lmes,ldia)=lHoy.split('-')
  lTex=ficdef.fDatExt(lHoy,1)
  lLin="CHIHUAHUA, CHIH. a "+lTex+"."
  f.write(lLin+n)
# 
#  lLin="Este documento es una impresión de un comprobante fiscal digital"
#  lLin="Este documento es una representaci%1sn impresa de un CFD" % (chr(162))
#  f.write( lLin+n )
#  f.write("."+n)

#  1234567890123456789012345678901234567890
  lLin="TODA DEVOLUCION CAUSA UN 10% POR FALSO MANEJO"
  lLin=lXml["Let001"]
  f.write( lLin+n )

  lLin="DEVOLUCION SOLO EL DIA DE LA VENTA,"
  lLin=lXml["Let002"]
  f.write( lLin+n )

  lLin="FORANEAS 5 DIAS DESPUES"
  lLin=lXml["Let003"]
  f.write( lLin+n )

  lLin="EN PARTES ELECTRICAS NO HAY GARANTIA NI DEVOLUCION"
  lLin=lXml["Let004"]
  f.write( lLin+n )

  lLin="SOLO ACEPTAMOS DEVOLUCIONES PRESENTANDO LA FACTURA"
  lLin=lXml["Let005"]
  f.write( lLin+n )

  lLin="PARA CUALQUIER DEVOLUCION/ACLARACION CONSERVE SU TICKET"
  lLin=lXml["Let005"]
  f.write( lLin+n )

  lLin="PARA CUALQUIER DEVOLUCION/ACLARACION CONSERVE SU TICKET"
  lLin=lXml["Let005"]
  f.write( lLin+n )

  f.write("."+n)
  f.write("."+n)
  f.write("."+n)
  f.write("."+n)

  f.write(NoC3+NoC4+"0")

  f.closed

  return

def fTicFac32(lHoy,lfacact,lSello,lXml,lfnd,lDirCfd,lTipDoc,lEsOriginal):
  """
  Fri Nov 08 09:45:39 MST 2013 
  Ticket Factura Contado CH CFDi 3.2
  """
  n="\n"
#     # Codigos para Impresas Tickets
  ESC  = chr(27)
  NoC1 = chr(77)
  NoC2 = chr(100)
  NoC3 = chr(29)
  NoC4 = chr(86)

# Thu Mar 28 17:58:49 MST 2013 
  InitPrin      = chr(0x1B)+chr(0x40)           # Dec 27 + 64
  EmphasOFF     = chr(0x1B)+chr(0x45)+"0"       # Dec 27 + 69 + 0 
  EmphasON      = chr(0x1B)+chr(0x45)+"1"       # Dec 27 + 69 + 1 
  FontA         = chr(0x1B)+chr(0x4D)+"0"       # Dec 17 + 77 + 0
  FontB         = chr(0x1B)+chr(0x4D)+"1"       # Dec 17 + 77 + 1
  FontC         = chr(0x1B)+chr(0x4D)+"2"       # Dec 17 + 77 + 2
  Quadruple	= chr(0x1D)+"!"+chr(17)		# 	

  lReTim=False
  if ":" in lfnd:
    lfnd,lKk=lfnd.split(":")
    lReTim=True

  if lEsOriginal==0:
#    lFilTim="timbre/"+lfacact+"t.xml"
    lFilTim=lDirCfd+lfacact+"t.xml"
    lPngTim=lDirCfd+lfacact+".png"
    doc=minidom.parse(lFilTim)
    lUUID=doc.childNodes[0].childNodes[4].childNodes[0].getAttributeNS(None,"UUID")
    lselloSAT=doc.childNodes[0].childNodes[4].childNodes[0].getAttributeNS(None,"selloSAT")
    lCertiSAT=doc.childNodes[0].childNodes[4].childNodes[0].getAttributeNS(None,"noCertificadoSAT")
    lselloCFD=doc.childNodes[0].childNodes[4].childNodes[0].getAttributeNS(None,"selloCFD")
    lFechaCFD=doc.childNodes[0].childNodes[4].childNodes[0].getAttributeNS(None,"FechaTimbrado")
    lCertiCSD=doc.childNodes[0].getAttributeNS(None,"noCertificado")
    lFormPAG=doc.childNodes[0].getAttributeNS(None,"formaDePago")
    lMetoPAG=doc.childNodes[0].getAttributeNS(None,"metodoDePago")
    lok=system("/usr/bin/qrencode -m 1 -v 1 -s 4 -o '"+lPngTim+\
      "' '?re="+lXml["EmiRfc"]+"&rr="+lXml["CliRfc"]+"&tt="+lXml["TotTotal"]+"&id="+lUUID+"'")
    """
    qrencode -d 200 -m 1 -v 1 -s 4 -o 'Timbre.png' \
    '?re=ROAF641217K94&rr=INC101109Q36&tt=1234567890.123456&id=ad662d33-6934-459c-a128-BDf0393f0f44
    """
  mcadori=lDirCfd+lfacact+".cadenaoriginal"
  fichero = open(path.realpath(mcadori), "r")
  lCadOri=fichero.readline()
  fichero.closed
  lfactura=lDirCfd+lfacact+".html"
  f = open(path.realpath(lfactura), "w")
  f.write(Quadruple)
  f.write( center("CHAVITAR",20)+n)
#  f.write( center("C H A V I T A R",40)+n)
# Emisor
  f.write( InitPrin+EmphasON )
#  f.write( center("EMISOR",40)+n)
  f.write( center(lXml["EmiNom"],40)+n)
  f.write( center(lXml["EmiCal"]+" "+lXml["EmiNoE"],40)+n)
  f.write( center(lXml["EmiCol"]+" "+lXml["EmiLoc"],40)+n)
  f.write( center(lXml["EmiMun"]+" "+lXml["EmiEst"]+" "+lXml["EmiPai"],40)+n)
  f.write( center(lXml["EmiCod"]+" RFC. "+lXml["EmiRfc"],40)+n)
  f.write( center(lXml["EmiSuc"],40)+n)
  f.write( InitPrin+n )
# 
  f.write( InitPrin+FontB )
  lLin="FOLIO : "+EmphasON+lfacact+EmphasOFF
#  f.write( lLin+n )
#  lLin=center("FECHA",40)
#  f.write( lLin+n )
  lLin+="     FECHA : "+lXml["FecAct"].replace("T"," ")
  f.write( center(lLin,56)+n )
#                                                      ñ        ó 
  lLin="A%1so y No. de Aprobaci%1sn de Folios" % (chr(164),chr(162))
#  f.write( lLin+n )
  lLin+="  "+lXml["AnioAp"]+" "+lXml["Aproba"]
  f.write( center(lLin,56)+n )

# Cliente
  lLin=InitPrin+FontA+EmphasON
  lLin+=center("CLIENTE",40)
  f.write( lLin+n )
  lLin=EmphasOFF+InitPrin+FontB
  lTex=lXml["CliNom"]
  Tex=lTex.replace("Ñ","&Ntilde;") 
  Tex=lTex.replace("ñ","&ntilde;")
  lLin+=lTex
  f.write( lLin+n )
  lLin=lXml["CliDom"]
  f.write( lLin+n )
  lLin=lXml["CliCol"]+" "+lXml["CliLoc"]
  f.write( lLin+n )
  lLin=lXml["CliMun"]+" "+lXml["CliEst"]+" "+lXml["CliPai"]
  f.write( lLin+n )
  lLin=lXml["CliCoP"]
  f.write( lLin+n )
  lLin=''

  lLin+=EmphasON+" RFC. "+lXml["CliRfc"]+EmphasOFF

  if lTipDoc=='FR':
    lLin+="     C R E D I T O"
  else:
    lLin+="     C O N T A D O"
  f.write( center(lLin,56)+n )

# Movimientos
#  movs=fFetchAll("SELECT fc_salida,fc_unimed,fc_descrip,fc_precio,fc_importe,(fc_fecha + fc_plazo),fc_numpar,fc_impuesto FROM fnfact WHERE fc_numdoc='"+lfnd+"';")
  movs=fFetchAll("SELECT fc_salida,fc_unimed,fc_descrip,fc_precio,fc_importe,(fc_fecha + fc_plazo),fc_numpar,fc_impuesto, \
    fc_clipro,fc_numpre,fc_vende,ve_nombre,fc_numdoc FROM fnfact, fnvend WHERE fc_numdoc='"+lfnd+"' AND fc_vende=ve_clave;")
#                1         2         3         4
#       1234567890123456789012345678901234567890
#                1         2         3         4         5
#       12345678901234567890123456789012345678901234567890123456
  lLin="Cant.   P  a  r  t  e       UM      Precio     Importe"
  f.write( lLin+n )

  for mov in movs:
    lPre=mov[3]
    lImp=mov[4]
    if lXml["CliRfc"]=="XAXX010101000":
      lImp=mov[4]+mov[7]
    lLin="%4i %15s       %3s    %8.2f  %10.2f" % (mov[0],mov[6],mov[1],lPre,lImp)
    f.write( lLin+n )
    lLin="%-54s" % (mov[2])
    f.write( lLin+n )
    dVence = mov[5].strftime("%Y-%m-%d")
    (aVen, mVen, dVen) = dVence.split("-")
    mCli=mov[8]
    mNpr=mov[9]
    mVee=mov[10]
    mVno=mov[11]
    mTik=lfnd

  mVen=ficdef.fDatExt(dVence,3)

  if lXml["CliRfc"]=="XAXX010101000":
    """ revisar si imprimir esto en ticket contado sin RF """
#    lLin="%26s  %12.2f" % ("SubTotal",float(lXml["TotTotal"]))
#    f.write(lLin+n)
  else:
    lLin="%40s  %12.2f" % ("SubTotal",float(lXml["SubTotal"]))
    f.write(lLin+n)

  if lXml["CliRfc"]=="XAXX010101000":
    f.write( n)
  else:
    lLin="%40s  %12.2f" % ("Iva",float(lXml["TotImpue"]))
    f.write(lLin+n)

  lLin=EmphasON+"%40s  %12.2f" % ("Total",float(lXml["TotTotal"]))+EmphasOFF
  f.write(lLin+n)

  LmCli=EmphasON+mCli+EmphasOFF
  lLin="%s %s %s %s %s" % (LmCli, mNpr, mTik, mVee, mVno)
  f.write(lLin+n)

  lLin="Importe con letra: "
  f.write(lLin+n)
  lLin=ficdef.fPesos(float(lXml["TotTotal"]))
  f.write(lLin+n)

# Cadena Original, Sello digital
  if lEsOriginal==0:
#    f.write( "  <TD ALIGN=CENTER ROWSPAN=7> <IMG SRC=\""+lfacact+".png\" width=\"120\" height=\"120\" border=\"0\"> </TD> \n")
    f.write( lfacact )
    f.write( "Folio Fiscal "+lUUID)
    lCadOri=lCadOri.replace("Ñ","&Ntilde;")
    lCadOri=lCadOri.replace("ñ","&ntilde;")
    lCadOri="||1.0|"+lUUID.strip()+"|"+lFechaCFD.strip()+"|"+lselloCFD.strip()+"|"+lCertiSAT.strip()+"||"
    lCadOri=lCadOri.encode("utf-8")
    f.write( "Sello SAT ")
    f.write( lselloSAT )
    f.write( "Sello Digital del CFDI ") 
    f.write( lselloCFD )
    f.write( "Cadena original del complemento de certificacion digital del SAT")
#    f.write( lCadOri[:190]+" "+lCadOri[190:]+"<FONT></TD>\n")
    f.write( lCadOri )
    f.write( " Fecha y Hora de certificado "+lFechaCFD)
    f.write( " Numero de Certificado SAT "+lCertiSAT)
    f.write( " Numero de Certificado CSD "+lCertiCSD)
    f.write( " Forma de Pago "+lFormPAG)
    f.write( " Regimen Fiscal:"+lXml["RegFis"])
    f.write( " Metodo de Pago:"+lXml["CliFpa"])
    if lXml["CliDpa"]:
      f.write( "Cta: "+lXml["CliDpa"]+"<FONT></TD>\n")

  lLin="Numero de Certificado "+lXml["NoCer"]
  f.write(lLin+n)
  lLin="Cadena Original"
  f.write(lLin+n)
  lLin=lCadOri
  f.write(lLin+n)
  lLin="Sello"
  f.write(lLin+n)
  lLin=lSello
  f.write(lLin+n)

# Fecha de hoy
  (lanio,lmes,ldia)=lHoy.split('-')
  lTex=ficdef.fDatExt(lHoy,1)
  lLin="CHIHUAHUA, CHIH. a "+lTex+"."
  f.write(lLin+n)
# 
#  lLin="Este documento es una impresión de un comprobante fiscal digital"
  if lEsOriginal==0:
    lLin="Este documento es una representaci%1sn impresa de un CFDI" % (chr(162))
    f.write( lLin+n )
    f.write("."+n)

#  1234567890123456789012345678901234567890
  lLin="TODA DEVOLUCION CAUSA UN 10% POR FALSO MANEJO"
  f.write( lLin+n )
  lLin="DEVOLUCION SOLO EL DIA DE LA VENTA,"
  f.write( lLin+n )
  lLin="FORANEAS 5 DIAS DESPUES"
  f.write( lLin+n )
  lLin="EN PARTES ELECTRICAS NO HAY GARANTIA NI DEVOLUCION"
  f.write( lLin+n )
  lLin="SOLO ACEPTAMOS DEVOLUCIONES PRESENTANDO LA FACTURA"
  f.write( lLin+n )
  lLin="PARA CUALQUIER DEVOLUCION/ACLARACION CONSERVE SU TICKET"
  f.write( lLin+n )
  lLin="PARA CUALQUIER DEVOLUCION/ACLARACION CONSERVE SU TICKET"
  f.write( lLin+n )

  f.write("."+n)
  f.write("."+n)
  f.write("."+n)
  f.write("."+n)

  f.write(NoC3+NoC4+"0")

  f.closed

  return

def fFacHTML32(lHoy,lfacact,lSello,lXml,lfnd,lDirCfd,lTipDoc,lEsOriginal):
  lReTim=False
  if ":" in lfnd:
    lfnd,lKk=lfnd.split(":")
    lReTim=True

  if lEsOriginal==1:
#    lFilTim="timbre/"+lfacact+"t.xml"
    lFilTim=lDirCfd+lfacact+"t.xml"
    lPngTim=lDirCfd+lfacact+".png"
    doc=minidom.parse(lFilTim)
    lUUID=doc.childNodes[0].childNodes[4].childNodes[0].getAttributeNS(None,"UUID")
    lselloSAT=doc.childNodes[0].childNodes[4].childNodes[0].getAttributeNS(None,"selloSAT")
    lCertiSAT=doc.childNodes[0].childNodes[4].childNodes[0].getAttributeNS(None,"noCertificadoSAT")
    lselloCFD=doc.childNodes[0].childNodes[4].childNodes[0].getAttributeNS(None,"selloCFD")
    lFechaCFD=doc.childNodes[0].childNodes[4].childNodes[0].getAttributeNS(None,"FechaTimbrado")
    lCertiCSD=doc.childNodes[0].getAttributeNS(None,"noCertificado")
    lFormPAG=doc.childNodes[0].getAttributeNS(None,"formaDePago")
    lMetoPAG=doc.childNodes[0].getAttributeNS(None,"metodoDePago")
    lok=system("/usr/bin/qrencode -m 1 -v 1 -s 4 -o '"+lPngTim+\
      "' '?re="+lXml["EmiRfc"]+"&rr="+lXml["CliRfc"]+"&tt="+lXml["TotTotal"]+"&id="+lUUID+"'")

    """
    qrencode -d 200 -m 1 -v 1 -s 4 -o 'Timbre.png' \
    '?re=ROAF641217K94&rr=INC101109Q36&tt=1234567890.123456&id=ad662d33-6934-459c-a128-BDf0393f0f44
    """
    mcadori=lDirCfd+lfacact+".cadenaoriginal"
    fichero = open(path.realpath(mcadori), "r")
    lCadOri=fichero.readline()
    fichero.closed
    
#    time.sleep(5)

  lfactura=lDirCfd+lfacact+".html"
  f = open(path.realpath(lfactura), "w")
# Emisor
  f.write( "<HTML>\n" )
  f.write( "<BODY>\n" )
  f.write( "<CENTER>\n")
  f.write( "<TABLE BORDER=0 WIDTH=100%>\n" )
  f.write( "<TR>\n")
  f.write( "  <TD ALIGN=CENTER ROWSPAN=7> <IMG SRC=\"logo.jpg\" width=\"533\" height=\"141\" border=\"0\"> </TD> \n")
#  f.write( "  <TD ALIGN=CENTER ROWSPAN=7> <IMG SRC=\"logo.jpg\"> </TD> \n")
  f.write( "  <TD ALIGN=CENTER>EMISOR</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR>\n")
  f.write( "  <TD ALIGN=CENTER>"+lXml["EmiNom"]+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR>\n")
  f.write( "  <TD ALIGN=CENTER>"+lXml["EmiCal"]+" "+lXml["EmiNoE"]+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR>\n")
  f.write( "  <TD ALIGN=CENTER>"+lXml["EmiCol"]+" "+lXml["EmiLoc"]+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR>\n")
  f.write( "  <TD ALIGN=CENTER>"+lXml["EmiMun"]+" "+lXml["EmiEst"]+" "+lXml["EmiPai"]+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR>\n")
  f.write( "  <TD ALIGN=CENTER>"+lXml["EmiCod"]+" RFC. "+lXml["EmiRfc"]+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR>\n")
# Sat Dec 14 11:14:54 MST 2013 
# Datos de Sucursal
  if len(lXml["EmiSuc"])>0:
    f.write( "  <TD ALIGN=CENTER>SUCURSAL: "+lXml["EmiSuc"]+"</TD>\n")
  else:  
    f.write( "  <TD ALIGN=CENTER>&nbsp;</TD>\n")
  f.write( "</TR>\n")
  f.write( "</TABLE>\n")
  f.write( "<HR>\n")
# Cliente
  f.write( "<TABLE BORDER=0 WIDTH=100%>\n" )
  f.write( "<TR>\n")
  f.write( "  <TD ALIGN=CENTER><B>CLIENTE</B></TD>\n")
  if lTipDoc=='FC':
    f.write( "  <TD ALIGN=CENTER><B>FACTURA CONTADO</B></TD>\n")
  elif lTipDoc=='FR':
    f.write( "  <TD ALIGN=CENTER><B>FACTURA CREDITO</B></TD>\n")
  elif lTipDoc=='VR':
    f.write( "  <TD ALIGN=CENTER><B>VENTA CREDITO</B></TD>\n")
  elif lTipDoc=='VC':
    f.write( "  <TD ALIGN=CENTER><B>VENTA CONTADO</B></TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR>\n")
#  lTex=lXml["CliNom"]
  lTex=lXml["CliNom"].encode("utf-8")
  lTex=lTex.replace("Ñ","&Ntilde;") 
  lTex=lTex.replace("ñ","&ntilde;")
  f.write( "  <TD ALIGN=LEFT>"+lTex+"</TD>\n")
  f.write( "  <TD ALIGN=CENTER>"+lfacact+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR> \n")
  lTex=lXml["CliDom"].encode("utf-8")
  lTex=lTex.replace("Ñ","&Ntilde;") 
  lTex=lTex.replace("ñ","&ntilde;")
#  f.write( "  <TD ALIGN=LEFT>"+lXml["CliDom"]+"</TD>\n")
  f.write( "  <TD ALIGN=LEFT>"+lTex+"</TD>\n")
  f.write( "  <TD ALIGN=CENTER>FECHA</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR> \n")
#  f.write( "  <TD ALIGN=LEFT>"+lXml["CliCol"]+" "+lXml["CliLoc"]+"</TD>\n")
  lTex=lXml["CliCol"].encode("utf-8")
  lTex=lTex.replace("Ñ","&Ntilde;") 
  lTex=lTex.replace("ñ","&ntilde;")
  f.write( "  <TD ALIGN=LEFT>"+lTex+" "+lXml["CliLoc"]+"</TD>\n")
  lTex=lXml["FecAct"].replace("T"," ")
  f.write( "  <TD ALIGN=CENTER>"+lTex+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR> \n")
#  f.write( "  <TD ALIGN=LEFT>"+lXml["CliMun"]+" "+lXml["CliEst"]+" "+lXml["CliPai"]+"</TD>\n")
  lTex=fUtf8HTML(lXml["CliMun"],lEsTxt=False) 
#  lTex=lXml["CliMun"].encode("utf-8")
  f.write( "  <TD ALIGN=LEFT>"+lTex+" "+lXml["CliEst"]+" "+lXml["CliPai"]+"</TD>\n")
  if lEsOriginal==1:
    f.write( "  <TD ALIGN=CENTER>A&ntilde;o y No. de Aprobaci&oacute;n de Folios</TD>\n")
  else:
    f.write( "  <TD ALIGN=CENTER>&nbsp;</TD>\n")

  f.write( "</TR>\n")
  f.write( "<TR> \n")
  f.write( "  <TD ALIGN=LEFT>"+lXml["CliCoP"]+" RFC. "+lXml["CliRfc"]+"</TD>\n")

  if lEsOriginal==1:
    f.write( "  <TD ALIGN=CENTER>"+lXml["AnioAp"]+" "+lXml["Aproba"]+"</TD>\n")
  else:
    f.write( "  <TD ALIGN=CENTER>&nbsp;</TD>\n")

  f.write( "</TR>\n")
  f.write( "</TABLE>\n")
  f.write( "<HR>\n")
# Movimientos
  if lReTim:
    movs=fFetchAll("SELECT fc_salida,fc_unimed,fc_descrip,fc_precio,fc_importe,(fc_fecha + fc_plazo),fc_numpar,fc_impuesto, \
      fc_clipro,fc_numpre,fc_vende,ve_nombre,fc_numdoc FROM "+lfnd+", fnvend WHERE fc_vende=ve_clave ORDER BY fc_numpar;")
  else:
    if lXml["Cliente"]=='XAXX':
      movs=fFetchAll("SELECT fc_salida,fc_unimed,fc_descrip,fc_precio,fc_importe,(fc_fecha + fc_plazo),fc_numpar,fc_impuesto, \
  fc_clipro,fc_numpre,fc_vende,ve_nombre,fc_numdoc FROM fnfact, fnvend WHERE fc_numdoc='"+lfnd+"' AND fc_vende=ve_clave ORDER BY fc_descrip;")
    else: 
      movs=fFetchAll("SELECT fc_salida,fc_unimed,fc_descrip,fc_precio,fc_importe,(fc_fecha + fc_plazo),fc_numpar,fc_impuesto, \
      fc_clipro,fc_numpre,fc_vende,ve_nombre,fc_numdoc FROM fnfact, fnvend WHERE fc_numdoc='"+lfnd+"' AND fc_vende=ve_clave;")
  f.write( "<TABLE BORDER=0 WIDTH=100%>\n" )
  f.write( "<TR> \n")
  f.write( "<TH ALIGN=LEFT> Cantidad </TH>\n")
  f.write( "<TH ALIGN=LEFT> Unidad </TH>\n")
  f.write( "<TH ALIGN=LEFT> Parte </TH>\n")
  f.write( "<TH ALIGN=LEFT> Descripcion </TH>\n")
  f.write( "<TH ALIGN=RIGHT> Precio </TH>\n")
  f.write( "<TH ALIGN=RIGHT> Importe </TH>\n")
  f.write( "</TR> \n")
  for mov in movs:
    if lReTim: lfnd=mov[12].strip()
    f.write( "<TR> \n")
    f.write( "<TD ALIGN=LEFT> "+str(mov[0])+"</TD>\n")
    f.write( "<TD ALIGN=LEFT> "+str(mov[1])+"</TD>\n")
    f.write( "<TD ALIGN=LEFT> "+str(mov[6])+"</TD>\n")
    lTex=fTOUnicodeUTF8(mov[2])
    lTex=fUtf8HTML(lTex)
#    f.write( "<TD ALIGN=LEFT> "+str(mov[2])+"</TD>\n")
    f.write( "<TD ALIGN=LEFT> "+str(lTex)+"</TD>\n")
    lPre="%12.2f" % (mov[3])
    f.write( "<TD ALIGN=RIGHT> "+lPre.strip()+"</TD>\n")
    lImp="%12.2f" % (mov[4])
    if lXml["CliRfc"]=="XAXX010101000":
      lImp="%12.2f" % (mov[4]+mov[7])
      
    f.write( "<TD ALIGN=RIGHT> "+lImp.strip()+"</TD>\n")
    f.write( "</TR> \n")
    dVence = mov[5].strftime("%Y-%m-%d")
    (aVen, mVen, dVen) = dVence.split("-")
    mCli=mov[8]
    mNpr=mov[9]
    mVee=mov[10]
    mVno=mov[11]
    mTik=lfnd

  mVen=ficdef.fDatExt(dVence,3)
  f.write( "<TR>\n")
  f.write( "<TD>&nbsp;</TD>\n") 
  f.write( "<TD>&nbsp;</TD>\n") 
  f.write( "<TD>&nbsp;</TD>\n") 
  f.write( "<TD>&nbsp;</TD>\n") 
  f.write( "<TD ALIGN=RIGHT>SUBTOTAL</TD>\n")
  lTotTot="%12.2f" % (float(lXml["TotTotal"]))
  if lXml["CliRfc"]=="XAXX010101000":
    f.write( "<TD ALIGN=RIGHT>"+lTotTot+"</TD>\n")
  else:
    f.write( "<TD ALIGN=RIGHT>"+lXml["SubTotal"]+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR>\n")
  plin=ficdef.fPesos(float(lXml["TotTotal"]))
  f.write( "<TD COLSPAN=4 ROWSPAN=4 ALIGN=LEFT>Importe con letra: "+plin+"</TD>\n")
  f.write( "<TD ALIGN=RIGHT>16% IVA</TD>\n")
  if lXml["CliRfc"]=="XAXX010101000":
    f.write( "<TD ALIGN=RIGHT>&nbsp;</TD>\n")
  else:
    f.write( "<TD ALIGN=RIGHT>"+lXml["TotImpue"]+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR>\n")
  f.write( "<TD ALIGN=RIGHT>TOTAL</TD>\n")
  f.write( "<TD ALIGN=RIGHT>"+lTotTot+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "</TABLE>\n")
  f.write( "<TABLE BORDER=0 WIDTH=100%>\n" )
  f.write( "<TR>\n")
  f.write( "<TD ALIGN=LEFT>"+mCli+"</TD>\n")
  f.write( "<TD ALIGN=LEFT>"+mNpr+"</TD>\n")
  f.write( "<TD ALIGN=LEFT>"+mTik+"</TD>\n")
  f.write( "<TD ALIGN=LEFT>"+mVee+"</TD>\n")
  f.write( "<TD ALIGN=LEFT>"+mVno+"</TD>\n")

  if lEsOriginal==1:
    f.write( "<TD ALIGN=RIGHT><FONT SIZE=-2>Regimen Fiscal:</FONT></TD>\n")
    f.write( "<TD ALIGN=LEFT><FONT SIZE=-2>"+lXml["RegFis"]+"</FONT></TD>\n")
    f.write( "<TD ALIGN=RIGHT><FONT SIZE=-2>Metodo de Pago:</FONT></TD>\n")
    f.write( "<TD ALIGN=LEFT><FONT SIZE=-2>"+lXml["CliFpa"]+"</FONT></TD>\n")
    if lXml["CliDpa"]:
      f.write( "<TD ALIGN=RIGHT><FONT SIZE=-2>Cta:</FONT></TD>\n")
      f.write( "<TD ALIGN=LEFT><FONT SIZE=-2>"+lXml["CliDpa"]+"</FONT></TD>\n")
#  f.write( "<TD ALIGN=LEFT>&nbsp;</TD>\n")
  f.write( "</TR>\n")
  f.write( "</TABLE>\n")
  f.write( "<HR>\n")
# Cadena Original, Sello digital
  if lEsOriginal==1:
    f.write( "<TABLE BORDER=0 WIDTH=100%>\n" )
    f.write( "<TR>\n")
    f.write( "  <TD ALIGN=CENTER ROWSPAN=9> <IMG SRC=\""+lfacact+".png\" width=\"120\" height=\"120\" border=\"0\"> </TD> \n")
    f.write( "  <TD ALIGN=LEFT>FOLIO FISCAL : "+lUUID+"</TD>\n")
    f.write( "</TR>\n")
#    f.write( "<TABLE BORDER=0 WIDTH=100%>\n" )
    lCadOri=lCadOri.replace("Ñ","&Ntilde;")
    lCadOri=lCadOri.replace("ñ","&ntilde;")
    lCadOri="||1.0|"+lUUID.strip()+"|"+lFechaCFD.strip()+"|"+lselloCFD.strip()+"|"+lCertiSAT.strip()+"||"
    lCadOri=lCadOri.encode("utf-8")
    f.write( "<TR>\n")
    f.write( "  <TD ALIGN=LEFT><FONT SIZE=-2>Sello SAT</FONT></TD>\n")
    f.write( "</TR>\n")
    f.write( "<TR>\n")
    f.write( "  <TD ALIGN=LEFT><FONT SIZE=-2>"+lselloSAT[:120]+"</FONT></TD>\n")
    f.write( "</TR>\n")
    f.write( "<TR>\n")
    f.write( "  <TD ALIGN=LEFT><FONT SIZE=-2>"+lselloSAT[120:]+"</FONT></TD>\n")
    f.write( "</TR>\n")
    f.write( "<TR>\n")
    f.write( "  <TD ALIGN=LEFT><FONT SIZE=-2>Sello Digital del CFDI</FONT></TD>\n")
    f.write( "</TR>\n")
    f.write( "<TR>\n")
    f.write( "  <TD ALIGN=LEFT><FONT SIZE=-2>"+lselloCFD[:140]+" "+lselloCFD[140:]+"</FONT></TD>\n")
    f.write( "</TR>\n")
    f.write( "<TR>\n")
    f.write( "  <TD ALIGN=LEFT><FONT SIZE=-2>Cadena original del complemento de certificacion digital del SAT</FONT></TD>\n")
    f.write( "</TR>\n")
    f.write( "<TR>\n")
    f.write( "  <TD ALIGN=LEFT><FONT SIZE=-2>"+lCadOri[:150]+" "+lCadOri[150:]+"</FONT></TD>\n")
    f.write( "</TR>\n")
    f.write( "<TR>\n")
    f.write( "  <TD ALIGN=LEFT><FONT SIZE=-2>&nbsp;</FONT></TD>\n")
    f.write( "</TR>\n")
    f.write( "</TABLE>\n")
    f.write( "<TABLE BORDER=0 WIDTH=100%>\n" )
    f.write( "<TR>\n")
#    f.write( "  <TD ALIGN=CENTER ROWSPAN=7> <IMG SRC=\""+lfacact+".png\" width=\"120\" height=\"120\" border=\"0\"> </TD> \n")
    f.write( "  <TD ALIGN=LEFT><FONT SIZE=-2>Fecha y Hora de certificado "+lFechaCFD+"</FONT></TD>\n")
    f.write( "  <TD ALIGN=RIGHT><FONT SIZE=-2>Numero de Certificado SAT "+lCertiSAT+"</FONT></TD>\n")
    f.write( "  <TD ALIGN=RIGHT><FONT SIZE=-2>Numero de Certificado CSD "+lCertiCSD+"</FONT></TD>\n")
    f.write( "</TR>\n")
    f.write( "</TABLE>\n")
#    f.write( "<TABLE BORDER=0 WIDTH=100%>\n" )
#    f.write( "<TR>\n")
#    f.write( "  <TD ALIGN=LEFT><FONT SIZE=-2>Forma de Pago "+lFormPAG+"<FONT></TD>\n")
#    f.write( "  <TD ALIGN=RIGHT><FONT SIZE=-2>Regimen Fiscal:<FONT></TD>\n")
#    f.write( "  <TD ALIGN=LEFT><FONT SIZE=-2>"+lXml["RegFis"]+"<FONT></TD>\n")
#    f.write( "  <TD ALIGN=RIGHT><FONT SIZE=-2>Metodo de Pago:<FONT></TD>\n")
#    f.write( "  <TD ALIGN=LEFT><FONT SIZE=-2>"+lXml["CliFpa"]+"<FONT></TD>\n")
#    if lXml["CliDpa"]:
#      f.write( "<TD ALIGN=RIGHT><FONT SIZE=-2>Cta:<FONT></TD>\n")
#      f.write( "<TD ALIGN=LEFT><FONT SIZE=-2>"+lXml["CliDpa"]+"<FONT></TD>\n")
#    f.write( "</TR>\n")

#    f.write( "</TABLE>\n")
#    f.write( "<TABLE BORDER=0 WIDTH=100%>\n" )
#    f.write( "<TR>\n")
#    f.write( "  <TD ALIGN=CENTER>Este documento es una representacion impresa de un CFDI</TD>\n")
#    f.write( "</TR>\n")
#    f.write( "</TABLE>\n")
    f.write( "<HR>\n")


#  f.write( "<TD ALIGN=LEFT><FONT SIZE=-2>Cadena original<FONT></TD>\n")
#  f.write( "<TD ALIGN=RIGHT><FONT SIZE=-2>Numero de Certificado<FONT></TD>\n")
#  f.write( "<TD ALIGN=LEFT><FONT SIZE=-2>"+lXml["NoCer"]+"<FONT></TD>\n")
#  f.write( "</TR>\n")
#  f.write( "<TR>\n")
#  lCadOri=lCadOri.replace("Ñ","&Ntilde;") 
#  lCadOri=lCadOri.replace("ñ","&ntilde;")
#  f.write( "<TD COLSPAN=3><FONT SIZE=-2>"+lCadOri+"<FONT></TD>\n")
#  f.write( "</TR>\n")
#  f.write( "<TR>\n")
#  f.write( "<TD ALIGN=LEFT COLSPAN=3><FONT SIZE=-2>Sello digital<FONT></TD>\n")
#  f.write( "</TR>\n")
#  f.write( "<TR>\n")
#  f.write( "<TD COLSPAN=3><FONT SIZE=-2>"+lSello+"</FONT></TD>\n")
#  f.write( "</TR>\n")
#  f.write( "</TABLE>\n")
#  f.write( "<HR>\n")
# Pagare
  f.write( "<TABLE BORDER=1 WIDTH=100%>\n" )
  f.write( "<TR>\n")
  f.write( "<TD><FONT SIZE=-1>POR ESTE PAGARE ME(NOS) COMPROMETO(EMOS) A PAGAR INCONDICIONALMENTE EL DIA <B>"+dVen+" DE \
"+mVen+" DE "+aVen+"</B> A LA ORDEN DE <B>PEDRO OVIEDO CHAVIRA SEPULVEDA</B>, EN SU DOMICILIO\
LA CANTIDAD DE "+plin+" MERCANCIAS RECIBIDAS DE CONFORMIDAD. SI ESTE PAGARE NO FUERA CUBIERTO A SU VENCIMIENTO \
CAUSARA UN INTERES MORATORIO DEL ..... % MENSUAL HASTA SU TOTAL LIQUIDACION.</FONT></TD>\n")
  f.write( "</TR>\n")
#  f.write( "<TR>\n")
#  f.write( "<TD ALIGN=RIGHT><FONT SIZE=-1>.................................<FONT></TD>\n")
#  f.write( "</TR>\n")
  f.write( "<TR>\n")
  f.write( "<TD ALIGN=RIGHT><FONT SIZE=-1>           F  I  R  M  A        .<FONT></TD>\n")
  f.write( "</TR>\n")
  f.write( "</TABLE>\n")
  f.write( "<TABLE BORDER=0 WIDTH=100%>\n" )
  (lanio,lmes,ldia)=lHoy.split('-')
  lTex=ficdef.fDatExt(lHoy,1)
  f.write( "<TR>\n")
  f.write( "<TD ALIGN=LEFT><FONT SIZE=-1>CHIHUAHUA, CHIH. a "+lTex+".<FONT></TD>\n")
  if lEsOriginal==1:
    f.write( "<TD ALIGN=RIGHT><FONT SIZE=-1>Efectos fiscales al pago. Pago en una sola exhibicion<FONT></TD>\n")
  else:
    f.write( "<TD ALIGN=RIGHT>&nbsp;</TD>\n")
  f.write( "</TR>\n")
  f.write( "</TABLE>\n")
# 
  if lEsOriginal==1:
    f.write( "<TABLE BORDER=0 WIDTH=100%>\n" )
    f.write( "<TR>\n")
#  f.write( "<TD ALIGN=CENTER>Este documento es una impresi&oacute;n de un comprobante fiscal digital</TD>\n")
    f.write( "<TD ALIGN=CENTER>Este documento es una representaci&oacute;n impresa de un CFDI</TD>\n")
    f.write( "</TR>\n")
    f.write( "</TABLE>\n")
    f.write( "<HR>\n")
# 
  f.write( "<TABLE BORDER=0 WIDTH=100%>\n" )
  f.write( "<TR>\n")
#  f.write( "<TD ALIGN=CENTER>TODA DEVOLUCION CAUSA UN 10% POR FALSO MANEJO</TD>\n")
#  f.write( "<TD ALIGN=CENTER>DEVOLUCION SOLO EL DIA DE LA VENTA, FORANEAS 5 DIAS DESPUES</TD>\n")
#  f.write( "<TD ALIGN=CENTER>EN PARTES ELECTRICAS NO HAY GARANTIA NI DEVOLUCION</TD>\n")
#  f.write( "<TD ALIGN=CENTER>SOLO ACEPTAMOS DEVOLUCIONES PRESENTANDO LA FACTURA</TD>\n")
  f.write( "<TD ALIGN=CENTER>"+lXml["Let001"]+"</TD>\n")
  f.write( "<TD ALIGN=CENTER>"+lXml["Let002"]+"</TD>\n")
  f.write( "<TD ALIGN=CENTER>"+lXml["Let003"]+"</TD>\n")
  f.write( "<TD ALIGN=CENTER>"+lXml["Let004"]+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "</TABLE>\n")

  f.write( "</BODY>\n" )
  f.write( "</HTML>\n" )
  f.closed
  return

def fFacHTMLdb32(lHoy,lfacact,lSello,lXml,lfnd,lDirCfd,lObserva,lAplicar,lTipDoc):
  lEsOriginal=0
  if lEsOriginal==0:
#    lFilTim="timbre/"+lfacact+"t.xml"
    lFilTim=lDirCfd+lfacact+"t.xml"
    lPngTim=lDirCfd+lfacact+".png"
    doc=minidom.parse(lFilTim)
    lUUID=doc.childNodes[0].childNodes[4].childNodes[0].getAttributeNS(None,"UUID")
    lselloSAT=doc.childNodes[0].childNodes[4].childNodes[0].getAttributeNS(None,"selloSAT")
    lCertiSAT=doc.childNodes[0].childNodes[4].childNodes[0].getAttributeNS(None,"noCertificadoSAT")
    lselloCFD=doc.childNodes[0].childNodes[4].childNodes[0].getAttributeNS(None,"selloCFD")
    lFechaCFD=doc.childNodes[0].childNodes[4].childNodes[0].getAttributeNS(None,"FechaTimbrado")
    lCertiCSD=doc.childNodes[0].getAttributeNS(None,"noCertificado")
    lFormPAG=doc.childNodes[0].getAttributeNS(None,"formaDePago")
    lMetoPAG=doc.childNodes[0].getAttributeNS(None,"metodoDePago")
    lok=system("/usr/bin/qrencode -m 1 -v 1 -s 4 -o '"+lPngTim+\
      "' '?re="+lXml["EmiRfc"]+"&rr="+lXml["CliRfc"]+"&tt="+lXml["TotTotal"]+"&id="+lUUID+"'")
    """
    qrencode -d 200 -m 1 -v 1 -s 4 -o 'Timbre.png' \
    '?re=ROAF641217K94&rr=INC101109Q36&tt=1234567890.123456&id=ad662d33-6934-459c-a128-BDf0393f0f44
    """
  mcadori=lDirCfd+lfacact+".cadenaoriginal"
  fichero = open(path.realpath(mcadori), "r")
  lCadOri=fichero.readline()
  fichero.closed
  lfactura=lDirCfd+lfacact+".html"
  f = open(path.realpath(lfactura), "w")
# Emisor
  f.write( "<HTML>\n" )
  f.write( "<BODY>\n" )
  f.write( "<CENTER>\n")
  f.write( "<TABLE BORDER=0 WIDTH=100%>\n" )
  f.write( "<TR>\n")
  f.write( "  <TD ALIGN=CENTER ROWSPAN=6> <IMG SRC=\"logo.jpg\"> </TD> \n")
  f.write( "  <TD ALIGN=CENTER>EMISOR</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR>\n")
  f.write( "  <TD ALIGN=CENTER>"+lXml["EmiNom"]+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR>\n")
  f.write( "  <TD ALIGN=CENTER>"+lXml["EmiCal"]+" "+lXml["EmiNoE"]+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR>\n")
  f.write( "  <TD ALIGN=CENTER>"+lXml["EmiCol"]+" "+lXml["EmiLoc"]+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR>\n")
  f.write( "  <TD ALIGN=CENTER>"+lXml["EmiMun"]+" "+lXml["EmiEst"]+" "+lXml["EmiPai"]+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR>\n")
  f.write( "  <TD ALIGN=CENTER>"+lXml["EmiCod"]+" RFC. "+lXml["EmiRfc"]+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "</TABLE>\n")
  f.write( "<HR>\n")
# Cliente
  f.write( "<TABLE BORDER=0 WIDTH=100%>\n" )
  f.write( "<TR>\n")
  f.write( "  <TD ALIGN=CENTER><B>CLIENTE</B></TD>\n")
  if lTipDoc=='DR':
    f.write( "  <TD ALIGN=CENTER>NOTA DE CREDITO "+lTipDoc+" <B>CREDITO</B></TD>\n")
  else:
    f.write( "  <TD ALIGN=CENTER>NOTA DE CREDITO "+lTipDoc+" <B>CONTADO</B></TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR>\n")
#  lTex=lXml["CliNom"]
  lTex=fUtf8HTML(lXml["CliNom"])
#  lTex=lXml["CliNom"].encode("utf-8")
#  lTex=lTex.replace("Ñ","&Ntilde;") 
#  lTex=lTex.replace("ñ","&ntilde;")
  f.write( "  <TD ALIGN=LEFT>"+lTex+"</TD>\n")
  f.write( "  <TD ALIGN=CENTER>"+lfacact+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR> \n")
  lTex=fUtf8HTML(lXml["CliDom"])
#  f.write( "  <TD ALIGN=LEFT>"+lXml["CliDom"]+"</TD>\n")
  f.write( "  <TD ALIGN=LEFT>"+lTex+"</TD>\n")
  f.write( "  <TD ALIGN=CENTER>FECHA</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR> \n")
  lTex=fUtf8HTML(lXml["CliCol"])
  f.write( "  <TD ALIGN=LEFT>"+lTex+" "+fUtf8HTML(lXml["CliLoc"])+"</TD>\n")
#  f.write( "  <TD ALIGN=LEFT>"+lXml["CliCol"]+" "+lXml["CliLoc"]+"</TD>\n")
  lTex=lXml["FecAct"].replace("T"," ")
  f.write( "  <TD ALIGN=CENTER>"+lTex+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR> \n")
  lTex=fUtf8HTML(lXml["CliMun"])
  f.write( "  <TD ALIGN=LEFT>"+lTex+" "+lXml["CliEst"]+" "+lXml["CliPai"]+"</TD>\n")
#  f.write( "  <TD ALIGN=LEFT>"+lXml["CliMun"]+" "+lXml["CliEst"]+" "+lXml["CliPai"]+"</TD>\n")
  f.write( "  <TD ALIGN=CENTER>A&ntilde;o y No. de Aprobaci&oacute;n de Folios</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR> \n")
  f.write( "  <TD ALIGN=LEFT>"+lXml["CliCoP"]+" RFC. "+lXml["CliRfc"]+"</TD>\n")
  f.write( "  <TD ALIGN=CENTER>"+lXml["AnioAp"]+" "+lXml["Aproba"]+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "</TABLE>\n")
  f.write( "<HR>\n")
# Movimientos
  movs=fFetchAll("SELECT di_entrada,'PZ',di_descrip,di_precio,di_importe,di_numpar,di_impuesto FROM "+lfnd)
  f.write( "<TABLE BORDER=0 WIDTH=100%>\n" )
  f.write( "<TR> \n")
  f.write( "<TH ALIGN=LEFT> Cantidad </TH>\n")
  f.write( "<TH ALIGN=LEFT> Unidad </TH>\n")
  f.write( "<TH ALIGN=LEFT> Parte </TH>\n")
  f.write( "<TH ALIGN=LEFT> Descripcion </TH>\n")
  f.write( "<TH ALIGN=RIGHT> Precio </TH>\n")
  f.write( "<TH ALIGN=RIGHT> Importe </TH>\n")
  f.write( "</TR> \n")
  for mov in movs:
    f.write( "<TR> \n")
    f.write( "<TD ALIGN=LEFT> "+str(mov[0])+"</TD>\n")
    f.write( "<TD ALIGN=LEFT> "+str(mov[1])+"</TD>\n")
    f.write( "<TD ALIGN=LEFT> "+str(mov[5])+"</TD>\n")
    lTex=fTOUnicodeUTF8(mov[2])
    lTex=fUtf8HTML(lTex)
#    lTex=mov[2]
#    lTex=lTex.replace("Ñ","&Ntilde;") 
#    lTex=lTex.replace("ñ","&ntilde;")
#    f.write( "<TD ALIGN=LEFT> "+str(mov[2])+"</TD>\n")
    f.write( "<TD ALIGN=LEFT> "+lTex+"</TD>\n")
    lPre="%12.2f" % (mov[3])
    f.write( "<TD ALIGN=RIGHT> "+lPre.strip()+"</TD>\n")
    lImp="%12.2f" % (mov[4])
    if lXml["CliRfc"]=="XAXX010101000":
      lImp="%12.2f" % (float(mov[4])+float(mov[6]))
    f.write( "<TD ALIGN=RIGHT> "+lImp.strip()+"</TD>\n")
    f.write( "</TR> \n")
  f.write( "<TR>\n")
  f.write( "<TD>&nbsp;</TD>\n") 
  f.write( "<TD>&nbsp;</TD>\n") 
  f.write( "<TD>&nbsp;</TD>\n") 
  f.write( "<TD>&nbsp;</TD>\n") 
  f.write( "<TD ALIGN=RIGHT>SUBTOTAL</TD>\n")
  if lXml["CliRfc"]=="XAXX010101000":
    f.write( "<TD ALIGN=RIGHT>"+lXml["TotTotal"]+"</TD>\n")
  else:
    f.write( "<TD ALIGN=RIGHT>"+lXml["SubTotal"]+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR>\n")
  plin=ficdef.fPesos(float(lXml["TotTotal"]))
  f.write( "<TD COLSPAN=4 ROWSPAN=4 ALIGN=LEFT>Importe con letra: "+plin+"</TD>\n")
  f.write( "<TD ALIGN=RIGHT>16% IVA</TD>\n")
  if lXml["CliRfc"]=="XAXX010101000":
    f.write( "<TD ALIGN=RIGHT>&nbsp;</TD>\n")
  else:
    f.write( "<TD ALIGN=RIGHT>"+lXml["TotImpue"]+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR>\n")
  f.write( "<TD ALIGN=RIGHT>TOTAL</TD>\n")
  f.write( "<TD ALIGN=RIGHT>"+lXml["TotTotal"]+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "</TABLE>\n")
  f.write( "<HR>\n")

# Cadena Original, Sello digital
  f.write( "<TABLE BORDER=0 WIDTH=100%>\n" )
  f.write( "<TR>\n")
  if lEsOriginal==0:
    f.write( "  <TD ALIGN=CENTER ROWSPAN=9> <IMG SRC=\""+lfacact+".png\" width=\"120\" height=\"120\" border=\"0\"> </TD> \n")
    f.write( "  <TD ALIGN=LEFT>FOLIO FISCAL : "+lUUID+"</TD>\n")
    f.write( "</TR>\n")
#    f.write( "<TABLE BORDER=0 WIDTH=100%>\n" )
    lCadOri=lCadOri.replace("Ñ","&Ntilde;")
    lCadOri=lCadOri.replace("ñ","&ntilde;")
    lCadOri="||1.0|"+lUUID.strip()+"|"+lFechaCFD.strip()+"|"+lselloCFD.strip()+"|"+lCertiSAT.strip()+"||"
    lCadOri=lCadOri.encode("utf-8")
    f.write( "<TR>\n")
    f.write( "  <TD ALIGN=LEFT><FONT SIZE=-2>Sello SAT</FONT></TD>\n")
    f.write( "</TR>\n")
    f.write( "<TR>\n")
    f.write( "  <TD ALIGN=LEFT><FONT SIZE=-2>"+lselloSAT[:120]+"</FONT></TD>\n")
    f.write( "</TR>\n")
    f.write( "<TR>\n")
    f.write( "  <TD ALIGN=LEFT><FONT SIZE=-2>"+lselloSAT[120:]+"</FONT></TD>\n")
    f.write( "</TR>\n")
    f.write( "<TR>\n")
    f.write( "  <TD ALIGN=LEFT><FONT SIZE=-2>Sello Digital del CFDI</FONT></TD>\n")
    f.write( "</TR>\n")
    f.write( "<TR>\n")
    f.write( "  <TD ALIGN=LEFT><FONT SIZE=-2>"+lselloCFD[:140]+" "+lselloCFD[140:]+"</FONT></TD>\n")
    f.write( "</TR>\n")
    f.write( "<TR>\n")
    f.write( "  <TD ALIGN=LEFT><FONT SIZE=-2>Cadena original del complemento de certificacion digital del SAT</FONT></TD>\n")
    f.write( "</TR>\n")
    f.write( "<TR>\n")
    f.write( "  <TD ALIGN=LEFT><FONT SIZE=-2>"+lCadOri[:150]+" "+lCadOri[150:]+"</FONT></TD>\n")
    f.write( "</TR>\n")
    f.write( "<TR>\n")
    f.write( "  <TD ALIGN=LEFT><FONT SIZE=-2>&nbsp;</FONT></TD>\n")
    f.write( "</TR>\n")
    f.write( "</TABLE>\n")
    f.write( "<TABLE BORDER=0 WIDTH=100%>\n" )
    f.write( "<TR>\n")
#    f.write( "  <TD ALIGN=CENTER ROWSPAN=7> <IMG SRC=\""+lfacact+".png\" width=\"120\" height=\"120\" border=\"0\"> </TD> \n")
    f.write( "  <TD ALIGN=LEFT><FONT SIZE=-2>Fecha y Hora de certificado "+lFechaCFD+"</FONT></TD>\n")
    f.write( "  <TD ALIGN=RIGHT><FONT SIZE=-2>Numero de Certificado SAT "+lCertiSAT+"</FONT></TD>\n")
    f.write( "  <TD ALIGN=RIGHT><FONT SIZE=-2>Numero de Certificado CSD "+lCertiCSD+"</FONT></TD>\n")
    f.write( "</TR>\n")
    f.write( "</TABLE>\n")

# Observaciones y aplicar
  f.write( "<TABLE BORDER=0 WIDTH=100%>\n" )
  f.write( "<TR>\n")
# f.write( "<TD><FONT>"+lAplicar+" "+lObserva+"</FONT></TD>\n")
  lTex=fUtf8HTML(lObserva)
  f.write( "<TD><FONT>"+lAplicar+" "+lTex+"</FONT></TD>\n")
  f.write( "</TR>\n")
  (lanio,lmes,ldia)=lHoy.split('-')
  lTex=ficdef.fDatExt(lHoy,1)
  f.write( "<TR>\n")
  f.write( "<TD ALIGN=RIGHT>CHIHUAHUA, CHIH. a "+lTex+".</TD>\n")
  f.write( "</TR>\n")
  f.write( "</TABLE>\n")
  f.write( "<HR>\n")
# 
  f.write( "<TABLE BORDER=0 WIDTH=100%>\n" )
  f.write( "<TR>\n")
#  f.write( "<TD ALIGN=CENTER>Este documento es una impresi&oacute;n de un comprobante fiscal digital</TD>\n")
  f.write( "<TD ALIGN=CENTER>Este documento es una representaci&oacute;n impresa de un CFD</TD>\n")
  f.write( "</TR>\n")
  f.write( "</TABLE>\n")

  f.write( "</BODY>\n" )
  f.write( "</HTML>\n" )
  f.closed
  return

# ************************************************************************************************************** CH Cfdi 32
# </Start>
# ************************************************************************************************************** CH Cfdi 32


# ************************************************************************************************************** HP Cfdi 32
# <Start/>
# ************************************************************************************************************** HP Cfdi 32

def fFacHTMLHP32(lHoy,lfacact,lSello,lXml,lfnd,lDirCfd,lTipDoc,lEsOriginal):
  lReTim=False
  if ":" in lfnd:
    lfnd,lKk=lfnd.split(":")
    lReTim=True

  if lEsOriginal==1:
#    lFilTim="timbre/"+lfacact+"t.xml"
    lFilTim=lDirCfd+lfacact+"t.xml"
    lPngTim=lDirCfd+lfacact+".png"
    doc=minidom.parse(lFilTim)
    lUUID=doc.childNodes[0].childNodes[4].childNodes[0].getAttributeNS(None,"UUID")
    lselloSAT=doc.childNodes[0].childNodes[4].childNodes[0].getAttributeNS(None,"selloSAT")
    lCertiSAT=doc.childNodes[0].childNodes[4].childNodes[0].getAttributeNS(None,"noCertificadoSAT")
    lselloCFD=doc.childNodes[0].childNodes[4].childNodes[0].getAttributeNS(None,"selloCFD")
    lFechaCFD=doc.childNodes[0].childNodes[4].childNodes[0].getAttributeNS(None,"FechaTimbrado")
    lCertiCSD=doc.childNodes[0].getAttributeNS(None,"noCertificado")
    lFormPAG=doc.childNodes[0].getAttributeNS(None,"formaDePago")
    lMetoPAG=doc.childNodes[0].getAttributeNS(None,"metodoDePago")
    lok=system("/usr/bin/qrencode -m 1 -v 1 -s 4 -o '"+lPngTim+\
      "' '?re="+lXml["EmiRfc"]+"&rr="+lXml["CliRfc"]+"&tt="+lXml["TotTotal"]+"&id="+lUUID+"'")
    """
    qrencode -d 200 -m 1 -v 1 -s 4 -o 'Timbre.png' \
    '?re=ROAF641217K94&rr=INC101109Q36&tt=1234567890.123456&id=ad662d33-6934-459c-a128-BDf0393f0f44
    """
  mcadori=lDirCfd+lfacact+".cadenaoriginal"
  mcadori=lDirCfd+lfacact+".cadenaoriginal"
  fichero = open(path.realpath(mcadori), "r")
  lCadOri=fichero.readline()
  fichero.closed
  lfactura=lDirCfd+lfacact+".html"
  f = open(path.realpath(lfactura), "w")
# Emisor
  f.write( "<HTML>\n" )
  f.write( "<BODY>\n" )
  f.write( "<CENTER>\n")
  f.write( "<TABLE BORDER=0 WIDTH=100%>\n" )
  f.write( "<TR>\n")
  f.write( "  <TD ALIGN=CENTER ROWSPAN=7> <IMG SRC=\"logo.jpg\" width=\"180\" height=\"110\" border=\"0\"> </TD> \n")
  f.write( "  <TD ALIGN=CENTER>EMISOR</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR>\n")
  f.write( "  <TD ALIGN=CENTER>"+lXml["EmiNom"]+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR>\n")
  f.write( "  <TD ALIGN=CENTER>"+lXml["EmiCal"]+" "+lXml["EmiNoE"]+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR>\n")
  f.write( "  <TD ALIGN=CENTER>"+lXml["EmiCol"]+" "+lXml["EmiLoc"]+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR>\n")
  f.write( "  <TD ALIGN=CENTER>"+lXml["EmiMun"]+" "+lXml["EmiEst"]+" "+lXml["EmiPai"]+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR>\n")
  f.write( "  <TD ALIGN=CENTER>"+lXml["EmiCod"]+" RFC. "+lXml["EmiRfc"]+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR>\n")
  f.write( "  <TD ALIGN=CENTER>&nbsp;</TD>\n")
  f.write( "</TR>\n")
  f.write( "</TABLE>\n")
  f.write( "<HR>\n")
# Cliente
  f.write( "<TABLE BORDER=0 WIDTH=100%>\n" )
  f.write( "<TR>\n")
  f.write( "  <TD ALIGN=CENTER><B>CLIENTE</B></TD>\n")
  if lTipDoc=='FC':
    f.write( "  <TD ALIGN=CENTER><B>FACTURA CONTADO</B></TD>\n")
  else:
    f.write( "  <TD ALIGN=CENTER><B>FACTURA CREDITO</B></TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR>\n")
#  lTex=lXml["CliNom"]
  lTex=lXml["CliNom"].encode("utf-8")
  lTex=lTex.replace("Ñ","&Ntilde;") 
  lTex=lTex.replace("ñ","&ntilde;")
  f.write( "  <TD ALIGN=LEFT>"+lTex+"</TD>\n")
  f.write( "  <TD ALIGN=CENTER>"+lfacact+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR> \n")
  f.write( "  <TD ALIGN=LEFT>"+lXml["CliDom"]+"</TD>\n")
  f.write( "  <TD ALIGN=CENTER>FECHA</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR> \n")
  f.write( "  <TD ALIGN=LEFT>"+lXml["CliCol"]+" "+lXml["CliLoc"]+"</TD>\n")
  lTex=lXml["FecAct"].replace("T"," ")
  f.write( "  <TD ALIGN=CENTER>"+lTex+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR> \n")
  f.write( "  <TD ALIGN=LEFT>"+lXml["CliMun"]+" "+lXml["CliEst"]+" "+lXml["CliPai"]+"</TD>\n")
  f.write( "  <TD ALIGN=CENTER>A&ntilde;o y No. de Aprobaci&oacute;n de Folios</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR> \n")
  f.write( "  <TD ALIGN=LEFT>"+lXml["CliCoP"]+" RFC. "+lXml["CliRfc"]+"</TD>\n")
  f.write( "  <TD ALIGN=CENTER>"+lXml["AnioAp"]+" "+lXml["Aproba"]+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "</TABLE>\n")
  f.write( "<HR>\n")
# Movimientos
  movs=fFetchAll("SELECT fc_salida,fc_unimed,fc_descrip,fc_precio,fc_importe,(fc_fecha + fc_plazo),fc_numpar,fc_impuesto, \
    fc_clipro,fc_numpre,fc_vende,ve_nombre,fc_numdoc FROM fnfact, fnvend WHERE fc_numdoc='"+lfnd+"' AND fc_vende=ve_clave;")
  f.write( "<TABLE BORDER=0 WIDTH=100%>\n" )
  f.write( "<TR> \n")
  f.write( "<TH ALIGN=LEFT> Cantidad </TH>\n")
  f.write( "<TH ALIGN=LEFT> Unidad </TH>\n")
  f.write( "<TH ALIGN=LEFT> Parte </TH>\n")
  f.write( "<TH ALIGN=LEFT> Descripcion </TH>\n")
  f.write( "<TH ALIGN=RIGHT> Precio </TH>\n")
  f.write( "<TH ALIGN=RIGHT> Importe </TH>\n")
  f.write( "</TR> \n")
  for mov in movs:
    f.write( "<TR> \n")
    f.write( "<TD ALIGN=LEFT> "+str(mov[0])+"</TD>\n")
    f.write( "<TD ALIGN=LEFT> "+str(mov[1])+"</TD>\n")
    f.write( "<TD ALIGN=LEFT> "+str(mov[6])+"</TD>\n")
    f.write( "<TD ALIGN=LEFT> "+str(mov[2])+"</TD>\n")
    lPre="%12.2f" % (mov[3])
    f.write( "<TD ALIGN=RIGHT> "+lPre.strip()+"</TD>\n")
    lImp="%12.2f" % (mov[4])
    if lXml["CliRfc"]=="XAXX010101000":
      lImp="%12.2f" % (mov[4]+mov[7])
      
    f.write( "<TD ALIGN=RIGHT> "+lImp.strip()+"</TD>\n")
    f.write( "</TR> \n")
    dVence = mov[5].strftime("%Y-%m-%d")
    (aVen, mVen, dVen) = dVence.split("-")
    mCli=mov[8]
    mNpr=mov[9]
    mVee=mov[10]
    mVno=mov[11]
    mTik=lfnd

  mVen=ficdef.fDatExt(dVence,3)
  f.write( "<TR>\n")
  f.write( "<TD>&nbsp;</TD>\n") 
  f.write( "<TD>&nbsp;</TD>\n") 
  f.write( "<TD>&nbsp;</TD>\n") 
  f.write( "<TD>&nbsp;</TD>\n") 
  f.write( "<TD ALIGN=RIGHT>SUBTOTAL</TD>\n")
  if lXml["CliRfc"]=="XAXX010101000":
    f.write( "<TD ALIGN=RIGHT>"+lXml["TotTotal"]+"</TD>\n")
  else:
    f.write( "<TD ALIGN=RIGHT>"+lXml["SubTotal"]+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR>\n")
  plin=ficdef.fPesos(float(lXml["TotTotal"]))
  f.write( "<TD COLSPAN=4 ROWSPAN=4 ALIGN=LEFT>Importe con letra: "+plin+"</TD>\n")
  f.write( "<TD ALIGN=RIGHT>16% IVA</TD>\n")
  if lXml["CliRfc"]=="XAXX010101000":
    f.write( "<TD ALIGN=RIGHT>&nbsp;</TD>\n")
  else:
    f.write( "<TD ALIGN=RIGHT>"+lXml["TotImpue"]+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR>\n")
  f.write( "<TD ALIGN=RIGHT>TOTAL</TD>\n")
  f.write( "<TD ALIGN=RIGHT>"+lXml["TotTotal"]+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "</TABLE>\n")
  f.write( "<TABLE BORDER=0 WIDTH=100%>\n" )
  f.write( "<TR>\n")
  f.write( "<TD ALIGN=LEFT>"+mCli+"</TD>\n")
  f.write( "<TD ALIGN=LEFT>"+mNpr+"</TD>\n")
  f.write( "<TD ALIGN=LEFT>"+mTik+"</TD>\n")
  f.write( "<TD ALIGN=LEFT>"+mVee+"</TD>\n")
  f.write( "<TD ALIGN=LEFT>"+mVno+"</TD>\n")
  f.write( "<TD ALIGN=LEFT>&nbsp;</TD>\n")
  f.write( "</TR>\n")
  f.write( "</TABLE>\n")
  f.write( "<HR>\n")
# Cadena Original, Sello digital
  if lEsOriginal==1:
    f.write( "<TABLE BORDER=0 WIDTH=100%>\n" )
    f.write( "  <TD ALIGN=CENTER ROWSPAN=9> <IMG SRC=\""+lfacact+".png\" width=\"120\" height=\"120\" border=\"0\"> </TD> \n")
    f.write( "  <TD ALIGN=LEFT>FOLIO FISCAL : "+lUUID+"</TD>\n")
    f.write( "</TR>\n")
#    f.write( "<TABLE BORDER=0 WIDTH=100%>\n" )
    lCadOri=lCadOri.replace("Ñ","&Ntilde;")
    lCadOri=lCadOri.replace("ñ","&ntilde;")
    lCadOri="||1.0|"+lUUID.strip()+"|"+lFechaCFD.strip()+"|"+lselloCFD.strip()+"|"+lCertiSAT.strip()+"||"
    lCadOri=lCadOri.encode("utf-8")
    f.write( "<TR>\n")
    f.write( "  <TD ALIGN=LEFT><FONT SIZE=-2>Sello SAT</FONT></TD>\n")
    f.write( "</TR>\n")
    f.write( "<TR>\n")
    f.write( "  <TD ALIGN=LEFT><FONT SIZE=-2>"+lselloSAT[:120]+"</FONT></TD>\n")
    f.write( "</TR>\n")
    f.write( "<TR>\n")
    f.write( "  <TD ALIGN=LEFT><FONT SIZE=-2>"+lselloSAT[120:]+"</FONT></TD>\n")
    f.write( "</TR>\n")
    f.write( "<TR>\n")
    f.write( "  <TD ALIGN=LEFT><FONT SIZE=-2>Sello Digital del CFDI</FONT></TD>\n")
    f.write( "</TR>\n")
    f.write( "<TR>\n")
    f.write( "  <TD ALIGN=LEFT><FONT SIZE=-2>"+lselloCFD[:140]+" "+lselloCFD[140:]+"</FONT></TD>\n")
    f.write( "</TR>\n")
    f.write( "<TR>\n")
    f.write( "  <TD ALIGN=LEFT><FONT SIZE=-2>Cadena original del complemento de certificacion digital del SAT</FONT></TD>\n")
    f.write( "</TR>\n")
    f.write( "<TR>\n")
    f.write( "  <TD ALIGN=LEFT><FONT SIZE=-2>"+lCadOri[:150]+" "+lCadOri[150:]+"</FONT></TD>\n")
    f.write( "</TR>\n")
    f.write( "<TR>\n")
    f.write( "  <TD ALIGN=LEFT><FONT SIZE=-2>&nbsp;</FONT></TD>\n")
    f.write( "</TR>\n")
    f.write( "</TABLE>\n")
    f.write( "<TABLE BORDER=0 WIDTH=100%>\n" )
    f.write( "<TR>\n")
#    f.write( "  <TD ALIGN=CENTER ROWSPAN=7> <IMG SRC=\""+lfacact+".png\" width=\"120\" height=\"120\" border=\"0\"> </TD> \n")
    f.write( "  <TD ALIGN=LEFT><FONT SIZE=-2>Fecha y Hora de certificado "+lFechaCFD+"</FONT></TD>\n")
    f.write( "  <TD ALIGN=RIGHT><FONT SIZE=-2>Numero de Certificado SAT "+lCertiSAT+"</FONT></TD>\n")
    f.write( "  <TD ALIGN=RIGHT><FONT SIZE=-2>Numero de Certificado CSD "+lCertiCSD+"</FONT></TD>\n")
    f.write( "</TR>\n")
    f.write( "</TABLE>\n")
#    f.write( "<TABLE BORDER=0 WIDTH=100%>\n" )
#    f.write( "<TR>\n")
#    f.write( "  <TD ALIGN=LEFT><FONT SIZE=-2>Forma de Pago "+lFormPAG+"<FONT></TD>\n")
#    f.write( "  <TD ALIGN=RIGHT><FONT SIZE=-2>Regimen Fiscal:<FONT></TD>\n")
#    f.write( "  <TD ALIGN=LEFT><FONT SIZE=-2>"+lXml["RegFis"]+"<FONT></TD>\n")
#    f.write( "  <TD ALIGN=RIGHT><FONT SIZE=-2>Metodo de Pago:<FONT></TD>\n")
#    f.write( "  <TD ALIGN=LEFT><FONT SIZE=-2>"+lXml["CliFpa"]+"<FONT></TD>\n")
#    if lXml["CliDpa"]:
#      f.write( "<TD ALIGN=RIGHT><FONT SIZE=-2>Cta:<FONT></TD>\n")
#      f.write( "<TD ALIGN=LEFT><FONT SIZE=-2>"+lXml["CliDpa"]+"<FONT></TD>\n")
#    f.write( "</TR>\n")

#    f.write( "</TABLE>\n")
#    f.write( "<TABLE BORDER=0 WIDTH=100%>\n" )
#    f.write( "<TR>\n")
#    f.write( "  <TD ALIGN=CENTER>Este documento es una representacion impresa de un CFDI</TD>\n")
#    f.write( "</TR>\n")
#    f.write( "</TABLE>\n")

    f.write( "<TABLE BORDER=0 WIDTH=100%>\n" )
    f.write( "<TD ALIGN=RIGHT><FONT SIZE=-2>Regimen Fiscal:<FONT></TD>\n")
    f.write( "<TD ALIGN=LEFT><FONT SIZE=-2>"+lXml["RegFis"]+"<FONT></TD>\n")
    f.write( "<TD ALIGN=RIGHT><FONT SIZE=-2>Metodo de Pago:<FONT></TD>\n")
    f.write( "<TD ALIGN=LEFT><FONT SIZE=-2>"+lXml["CliFpa"]+"<FONT></TD>\n")
    if lXml["CliDpa"]:
      f.write( "<TD ALIGN=RIGHT><FONT SIZE=-2>Cta:<FONT></TD>\n")
      f.write( "<TD ALIGN=LEFT><FONT SIZE=-2>"+lXml["CliDpa"]+"<FONT></TD>\n")
#  f.write( "<TD ALIGN=LEFT>&nbsp;</TD>\n")
    f.write( "</TR>\n")
    f.write( "<HR>\n")

# Pagare
  f.write( "<TABLE BORDER=1 WIDTH=100%>\n" )
  f.write( "<TR>\n")
  f.write( "<TD><FONT SIZE=-1>POR ESTE PAGARE ME(NOS) COMPROMETO(EMOS) A PAGAR INCONDICIONALMENTE EL DIA <B>"+dVen+" DE \
"+mVen+" DE "+aVen+"</B> A LA ORDEN DE <B>HERRAMIENTA PORTATILES DE CHIHUAHUA SA DE CV</B>, EN SU DOMICILIO\
LA CANTIDAD DE "+plin+" MERCANCIAS RECIBIDAS DE CONFORMIDAD. SI ESTE PAGARE NO FUERA CUBIERTO A SU VENCIMIENTO \
CAUSARA UN INTERES MORATORIO DEL ..... % MENSUAL HASTA SU TOTAL LIQUIDACION.</FONT></TD>\n")
  f.write( "</TR>\n")
#  f.write( "<TR>\n")
#  f.write( "<TD ALIGN=RIGHT><FONT SIZE=-1>.................................<FONT></TD>\n")
#  f.write( "</TR>\n")
  f.write( "<TR>\n")
  f.write( "<TD ALIGN=RIGHT><FONT SIZE=-1>           F  I  R  M  A        .<FONT></TD>\n")
  f.write( "</TR>\n")
  f.write( "</TABLE>\n")
  f.write( "<TABLE BORDER=0 WIDTH=100%>\n" )
  (lanio,lmes,ldia)=lHoy.split('-')
  lTex=ficdef.fDatExt(lHoy,1)
  f.write( "<TR>\n")
  f.write( "<TD ALIGN=LEFT><FONT SIZE=-1>CHIHUAHUA, CHIH. a "+lTex+".<FONT></TD>\n")
  f.write( "<TD ALIGN=RIGHT><FONT SIZE=-1>Efectos fiscales al pago. Pago en una sola exhibicion<FONT></TD>\n")
  f.write( "</TR>\n")
  f.write( "</TABLE>\n")
# 
  f.write( "<TABLE BORDER=0 WIDTH=100%>\n" )
  f.write( "<TR>\n")
#  f.write( "<TD ALIGN=CENTER>Este documento es una impresi&oacute;n de un comprobante fiscal digital</TD>\n")
  f.write( "<TD ALIGN=CENTER>Este documento es una representaci&oacute;n impresa de un CFDI</TD>\n")
  f.write( "</TR>\n")
  f.write( "</TABLE>\n")
  f.write( "<HR>\n")
# 
  f.write( "<TABLE BORDER=0 WIDTH=100%>\n" )
  f.write( "<TR>\n")
  f.write( "<TD ALIGN=CENTER>TODA DEVOLUCION CAUSA UN 10% POR FALSO MANEJO</TD>\n")
  f.write( "<TD ALIGN=CENTER>DEVOLUCION SOLO EL DIA DE LA VENTA, FORANEAS 5 DIAS DESPUES</TD>\n")
  f.write( "<TD ALIGN=CENTER>EN PARTES ELECTRICAS NO HAY GARANTIA NI DEVOLUCION</TD>\n")
  f.write( "<TD ALIGN=CENTER>SOLO ACEPTAMOS DEVOLUCIONES PRESENTANDO LA FACTURA</TD>\n")
  f.write( "</TR>\n")
  f.write( "</TABLE>\n")

  f.write( "</BODY>\n" )
  f.write( "</HTML>\n" )
  f.closed
  return

def fFacHTMLdbHP32(lHoy,lfacact,lSello,lXml,lfnd,lDirCfd,lObserva,lAplicar,lTipDoc):
  lEsOriginal=0
  if lEsOriginal==0:
#    lFilTim="timbre/"+lfacact+"t.xml"
    lFilTim=lDirCfd+lfacact+"t.xml"
    lPngTim=lDirCfd+lfacact+".png"
    doc=minidom.parse(lFilTim)
    lUUID=doc.childNodes[0].childNodes[4].childNodes[0].getAttributeNS(None,"UUID")
    lselloSAT=doc.childNodes[0].childNodes[4].childNodes[0].getAttributeNS(None,"selloSAT")
    lCertiSAT=doc.childNodes[0].childNodes[4].childNodes[0].getAttributeNS(None,"noCertificadoSAT")
    lselloCFD=doc.childNodes[0].childNodes[4].childNodes[0].getAttributeNS(None,"selloCFD")
    lFechaCFD=doc.childNodes[0].childNodes[4].childNodes[0].getAttributeNS(None,"FechaTimbrado")
    lCertiCSD=doc.childNodes[0].getAttributeNS(None,"noCertificado")
    lFormPAG=doc.childNodes[0].getAttributeNS(None,"formaDePago")
    lMetoPAG=doc.childNodes[0].getAttributeNS(None,"metodoDePago")
    lok=system("/usr/bin/qrencode -m 1 -v 1 -s 4 -o '"+lPngTim+\
      "' '?re="+lXml["EmiRfc"]+"&rr="+lXml["CliRfc"]+"&tt="+lXml["TotTotal"]+"&id="+lUUID+"'")
    """
    qrencode -d 200 -m 1 -v 1 -s 4 -o 'Timbre.png' \
    '?re=ROAF641217K94&rr=INC101109Q36&tt=1234567890.123456&id=ad662d33-6934-459c-a128-BDf0393f0f44
    """
  mcadori=lDirCfd+lfacact+".cadenaoriginal"
  mcadori=lDirCfd+lfacact+".cadenaoriginal"
  fichero = open(path.realpath(mcadori), "r")
  lCadOri=fichero.readline()
  fichero.closed
  lfactura=lDirCfd+lfacact+".html"
  f = open(path.realpath(lfactura), "w")
# Emisor
  f.write( "<HTML>\n" )
  f.write( "<BODY>\n" )
  f.write( "<CENTER>\n")
  f.write( "<TABLE BORDER=0 WIDTH=100%>\n" )
  f.write( "<TR>\n")
  f.write( "  <TD ALIGN=CENTER ROWSPAN=7> <IMG SRC=\"logo.jpg\" width=\"180\" height=\"110\" border=\"0\"> </TD> \n")
  f.write( "  <TD ALIGN=CENTER>EMISOR</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR>\n")
  f.write( "  <TD ALIGN=CENTER>"+lXml["EmiNom"]+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR>\n")
  f.write( "  <TD ALIGN=CENTER>"+lXml["EmiCal"]+" "+lXml["EmiNoE"]+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR>\n")
  f.write( "  <TD ALIGN=CENTER>"+lXml["EmiCol"]+" "+lXml["EmiLoc"]+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR>\n")
  f.write( "  <TD ALIGN=CENTER>"+lXml["EmiMun"]+" "+lXml["EmiEst"]+" "+lXml["EmiPai"]+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR>\n")
  f.write( "  <TD ALIGN=CENTER>"+lXml["EmiCod"]+" RFC. "+lXml["EmiRfc"]+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR>\n")
  f.write( "  <TD ALIGN=CENTER>&nbsp;</TD>\n")
  f.write( "</TR>\n")
  f.write( "</TABLE>\n")
  f.write( "<HR>\n")
# Cliente
  f.write( "<TABLE BORDER=0 WIDTH=100%>\n" )
  f.write( "<TR>\n")
  f.write( "  <TD ALIGN=CENTER><B>CLIENTE</B></TD>\n")
  if lTipDoc=='DR':
    f.write( "  <TD ALIGN=CENTER>NOTA DE CREDITO "+lTipDoc+" <B>CREDITO</B></TD>\n")
  else:
    f.write( "  <TD ALIGN=CENTER>NOTA DE CREDITO "+lTipDoc+" <B>CONTADO</B></TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR>\n")
#  lTex=lXml["CliNom"]
  lTex=lXml["CliNom"].encode("utf-8")
  lTex=lTex.replace("Ñ","&Ntilde;") 
  lTex=lTex.replace("ñ","&ntilde;")
  f.write( "  <TD ALIGN=LEFT>"+lTex+"</TD>\n")
  f.write( "  <TD ALIGN=CENTER>"+lfacact+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR> \n")
  f.write( "  <TD ALIGN=LEFT>"+lXml["CliDom"]+"</TD>\n")
  f.write( "  <TD ALIGN=CENTER>FECHA</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR> \n")
  f.write( "  <TD ALIGN=LEFT>"+lXml["CliCol"]+" "+lXml["CliLoc"]+"</TD>\n")
  lTex=lXml["FecAct"].replace("T"," ")
  f.write( "  <TD ALIGN=CENTER>"+lTex+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR> \n")
  f.write( "  <TD ALIGN=LEFT>"+lXml["CliMun"]+" "+lXml["CliEst"]+" "+lXml["CliPai"]+"</TD>\n")
  f.write( "  <TD ALIGN=CENTER>A&ntilde;o y No. de Aprobaci&oacute;n de Folios</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR> \n")
  f.write( "  <TD ALIGN=LEFT>"+lXml["CliCoP"]+" RFC. "+lXml["CliRfc"]+"</TD>\n")
  f.write( "  <TD ALIGN=CENTER>"+lXml["AnioAp"]+" "+lXml["Aproba"]+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "</TABLE>\n")
  f.write( "<HR>\n")
# Movimientos
  movs=fFetchAll("SELECT di_entrada,'PZ',di_descrip,di_precio,di_importe,di_numpar,di_impuesto FROM "+lfnd)
  f.write( "<TABLE BORDER=0 WIDTH=100%>\n" )
  f.write( "<TR> \n")
  f.write( "<TH ALIGN=LEFT> Cantidad </TH>\n")
  f.write( "<TH ALIGN=LEFT> Unidad </TH>\n")
  f.write( "<TH ALIGN=LEFT> Parte </TH>\n")
  f.write( "<TH ALIGN=LEFT> Descripcion </TH>\n")
  f.write( "<TH ALIGN=RIGHT> Precio </TH>\n")
  f.write( "<TH ALIGN=RIGHT> Importe </TH>\n")
  f.write( "</TR> \n")
  for mov in movs:
    f.write( "<TR> \n")
    f.write( "<TD ALIGN=LEFT> "+str(mov[0])+"</TD>\n")
    f.write( "<TD ALIGN=LEFT> "+str(mov[1])+"</TD>\n")
    f.write( "<TD ALIGN=LEFT> "+str(mov[5])+"</TD>\n")
    f.write( "<TD ALIGN=LEFT> "+str(mov[2])+"</TD>\n")
    lPre="%12.2f" % (mov[3])
    f.write( "<TD ALIGN=RIGHT> "+lPre.strip()+"</TD>\n")
    lImp="%12.2f" % (mov[4])
    if lXml["CliRfc"]=="XAXX010101000":
      lImp="%12.2f" % (float(mov[4])+float(mov[6]))
    f.write( "<TD ALIGN=RIGHT> "+lImp.strip()+"</TD>\n")
    f.write( "</TR> \n")
  f.write( "<TR>\n")
  f.write( "<TD>&nbsp;</TD>\n") 
  f.write( "<TD>&nbsp;</TD>\n") 
  f.write( "<TD>&nbsp;</TD>\n") 
  f.write( "<TD>&nbsp;</TD>\n") 
  f.write( "<TD ALIGN=RIGHT>SUBTOTAL</TD>\n")
  if lXml["CliRfc"]=="XAXX010101000":
    f.write( "<TD ALIGN=RIGHT>"+lXml["TotTotal"]+"</TD>\n")
  else:
    f.write( "<TD ALIGN=RIGHT>"+lXml["SubTotal"]+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR>\n")
  plin=ficdef.fPesos(float(lXml["TotTotal"]))
  f.write( "<TD COLSPAN=4 ROWSPAN=4 ALIGN=LEFT>Importe con letra: "+plin+"</TD>\n")
  f.write( "<TD ALIGN=RIGHT>16% IVA</TD>\n")
  if lXml["CliRfc"]=="XAXX010101000":
    f.write( "<TD ALIGN=RIGHT>&nbsp;</TD>\n")
  else:
    f.write( "<TD ALIGN=RIGHT>"+lXml["TotImpue"]+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR>\n")
  f.write( "<TD ALIGN=RIGHT>TOTAL</TD>\n")
  f.write( "<TD ALIGN=RIGHT>"+lXml["TotTotal"]+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "</TABLE>\n")
  f.write( "<HR>\n")
# Cadena Original, Sello digital
  if lEsOriginal==0:
    f.write( "<TABLE BORDER=0 WIDTH=100%>\n" )
    f.write( "<TR>\n")
    f.write( "  <TD ALIGN=CENTER ROWSPAN=9> <IMG SRC=\""+lfacact+".png\" width=\"120\" height=\"120\" border=\"0\"> </TD> \n")
    f.write( "  <TD ALIGN=LEFT>FOLIO FISCAL : "+lUUID+"</TD>\n")
    f.write( "</TR>\n")
#    f.write( "<TABLE BORDER=0 WIDTH=100%>\n" )
    lCadOri=lCadOri.replace("Ñ","&Ntilde;")
    lCadOri=lCadOri.replace("ñ","&ntilde;")
    lCadOri="||1.0|"+lUUID.strip()+"|"+lFechaCFD.strip()+"|"+lselloCFD.strip()+"|"+lCertiSAT.strip()+"||"
    lCadOri=lCadOri.encode("utf-8")
    f.write( "<TR>\n")
    f.write( "  <TD ALIGN=LEFT><FONT SIZE=-2>Sello SAT</FONT></TD>\n")
    f.write( "</TR>\n")
    f.write( "<TR>\n")
    f.write( "  <TD ALIGN=LEFT><FONT SIZE=-2>"+lselloSAT[:120]+"</FONT></TD>\n")
    f.write( "</TR>\n")
    f.write( "<TR>\n")
    f.write( "  <TD ALIGN=LEFT><FONT SIZE=-2>"+lselloSAT[120:]+"</FONT></TD>\n")
    f.write( "</TR>\n")
    f.write( "<TR>\n")
    f.write( "  <TD ALIGN=LEFT><FONT SIZE=-2>Sello Digital del CFDI</FONT></TD>\n")
    f.write( "</TR>\n")
    f.write( "<TR>\n")
    f.write( "  <TD ALIGN=LEFT><FONT SIZE=-2>"+lselloCFD[:140]+" "+lselloCFD[140:]+"</FONT></TD>\n")
    f.write( "</TR>\n")
    f.write( "<TR>\n")
    f.write( "  <TD ALIGN=LEFT><FONT SIZE=-2>Cadena original del complemento de certificacion digital del SAT</FONT></TD>\n")
    f.write( "</TR>\n")
    f.write( "<TR>\n")
    f.write( "  <TD ALIGN=LEFT><FONT SIZE=-2>"+lCadOri[:150]+" "+lCadOri[150:]+"</FONT></TD>\n")
    f.write( "</TR>\n")
    f.write( "<TR>\n")
    f.write( "  <TD ALIGN=LEFT><FONT SIZE=-2>&nbsp;</FONT></TD>\n")
    f.write( "</TR>\n")
    f.write( "</TABLE>\n")
    f.write( "<TABLE BORDER=0 WIDTH=100%>\n" )
    f.write( "<TR>\n")
#    f.write( "  <TD ALIGN=CENTER ROWSPAN=7> <IMG SRC=\""+lfacact+".png\" width=\"120\" height=\"120\" border=\"0\"> </TD> \n")
    f.write( "  <TD ALIGN=LEFT><FONT SIZE=-2>Fecha y Hora de certificado "+lFechaCFD+"</FONT></TD>\n")
    f.write( "  <TD ALIGN=RIGHT><FONT SIZE=-2>Numero de Certificado SAT "+lCertiSAT+"</FONT></TD>\n")
    f.write( "  <TD ALIGN=RIGHT><FONT SIZE=-2>Numero de Certificado CSD "+lCertiCSD+"</FONT></TD>\n")
    f.write( "</TR>\n")
    f.write( "</TABLE>\n")
    f.write( "<HR>\n")
# Observaciones y aplicar
  f.write( "<TABLE BORDER=0 WIDTH=100%>\n" )
  f.write( "<TR>\n")
  f.write( "<TD><FONT>"+lAplicar+" "+lObserva+"</FONT></TD>\n")
  f.write( "</TR>\n")
  (lanio,lmes,ldia)=lHoy.split('-')
  lTex=ficdef.fDatExt(lHoy,1)
  f.write( "<TR>\n")
  f.write( "<TD ALIGN=RIGHT>CHIHUAHUA, CHIH. a "+lTex+".</TD>\n")
  f.write( "</TR>\n")
  f.write( "</TABLE>\n")
  f.write( "<HR>\n")
# 
  f.write( "<TABLE BORDER=0 WIDTH=100%>\n" )
  f.write( "<TR>\n")
#  f.write( "<TD ALIGN=CENTER>Este documento es una impresi&oacute;n de un comprobante fiscal digital</TD>\n")
  f.write( "<TD ALIGN=CENTER>Este documento es una representaci&oacute;n impresa de un CFDI</TD>\n")
  f.write( "</TR>\n")
  f.write( "</TABLE>\n")

  f.write( "</BODY>\n" )
  f.write( "</HTML>\n" )
  f.closed
  return


# ************************************************************************************************************** HP Cfdi 32
# </Start>
# ************************************************************************************************************** HP Cfdi 32

# ************************************************************************************************************** SP Cfdi 32
# <Start/>
# ************************************************************************************************************** SP Cfdi 32
def fFacHTMLSP_32(lHoy,lfacact,lSello,lXml,lfnd,lDirCfd,lTipDoc,lEsOriginal):
  lReTim=False
  if ":" in lfnd:
    lfnd,lKk=lfnd.split(":")
    lReTim=True

  if lEsOriginal==1:
#    lFilTim="timbre/"+lfacact+"t.xml"
    lFilTim=lDirCfd+lfacact+"t.xml"
    lPngTim=lDirCfd+lfacact+".png"
    doc=minidom.parse(lFilTim)
    lUUID=doc.childNodes[0].childNodes[4].childNodes[0].getAttributeNS(None,"UUID")
    lselloSAT=doc.childNodes[0].childNodes[4].childNodes[0].getAttributeNS(None,"selloSAT")
    lCertiSAT=doc.childNodes[0].childNodes[4].childNodes[0].getAttributeNS(None,"noCertificadoSAT")
    lselloCFD=doc.childNodes[0].childNodes[4].childNodes[0].getAttributeNS(None,"selloCFD")
    lFechaCFD=doc.childNodes[0].childNodes[4].childNodes[0].getAttributeNS(None,"FechaTimbrado")
    lCertiCSD=doc.childNodes[0].getAttributeNS(None,"noCertificado")
    lFormPAG=doc.childNodes[0].getAttributeNS(None,"formaDePago")
    lMetoPAG=doc.childNodes[0].getAttributeNS(None,"metodoDePago")
    lok=system("/usr/bin/qrencode -m 1 -v 1 -s 4 -o '"+lPngTim+\
      "' '?re="+lXml["EmiRfc"]+"&rr="+lXml["CliRfc"]+"&tt="+lXml["TotTotal"]+"&id="+lUUID+"'")
    """
    qrencode -d 200 -m 1 -v 1 -s 4 -o 'Timbre.png' \
    '?re=ROAF641217K94&rr=INC101109Q36&tt=1234567890.123456&id=ad662d33-6934-459c-a128-BDf0393f0f44
    """
    mcadori=lDirCfd+lfacact+".cadenaoriginal"
    fichero = open(path.realpath(mcadori), "r")
    lCadOri=fichero.readline()
    fichero.closed

  lfactura=lDirCfd+lfacact+".html"
  f = open(path.realpath(lfactura), "w")
# Emisor
  f.write( "<HTML>\n" )
  f.write( "<BODY>\n" )
  f.write( "<CENTER>\n")
  f.write( "<TABLE BORDER=0 WIDTH=100%>\n" )
#  f.write( "<TR>\n")
#  f.write( "  <TD ALIGN=CENTER ROWSPAN=7> <IMG SRC=\"logo.jpg\"> </TD> \n")
#  f.write( "  <TD ALIGN=CENTER>EMISOR</TD>\n")
#  f.write( "</TR>\n")
  f.write( "<TR>\n")
  f.write( "  <TD ALIGN=CENTER>"+lXml["EmiNom"]+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR>\n")
  f.write( "  <TD ALIGN=CENTER>"+lXml["EmiCal"]+" "+lXml["EmiNoE"]+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR>\n")
  f.write( "  <TD ALIGN=CENTER>"+lXml["EmiCol"]+" "+lXml["EmiLoc"]+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR>\n")
  f.write( "  <TD ALIGN=CENTER>"+lXml["EmiMun"]+" "+lXml["EmiEst"]+" "+lXml["EmiPai"]+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR>\n")
  f.write( "  <TD ALIGN=CENTER>"+lXml["EmiCod"]+" RFC. "+lXml["EmiRfc"]+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR>\n")
  f.write( "  <TD ALIGN=CENTER>"+lXml["EmiTel"]+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR>\n")
  f.write( "  <TD ALIGN=CENTER>&nbsp;</TD>\n")
  f.write( "</TR>\n")
  f.write( "</TABLE>\n")
  f.write( "<HR>\n")
# Cliente
  f.write( "<TABLE BORDER=0 WIDTH=100%>\n" )
  f.write( "<TR>\n")
  f.write( "  <TD ALIGN=CENTER><B>CLIENTE</B></TD>\n")
  if lTipDoc=='FC':
    f.write( "  <TD ALIGN=CENTER><B>FACTURA CONTADO</B></TD>\n")
  else:
    f.write( "  <TD ALIGN=CENTER><B>FACTURA CREDITO</B></TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR>\n")
# 6630
# Fri Nov 28 16:51:09 MST 2014 JR
# se pone encode para pasar variable a unicode (str)
# por que 
# 1348 de ficxml se pasa a utf-8 para timbrar
  lTex=lXml["CliNom"].encode("utf-8")
  lTex=lTex.replace("Ñ","&Ntilde;") 
  lTex=lTex.replace("ñ","&ntilde;")

  f.write( "  <TD ALIGN=LEFT>"+lTex+"</TD>\n")
  f.write( "  <TD ALIGN=CENTER>"+lfacact+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR> \n")

# Mon Dec 01 09:28:19 MST 2014 JR
# los mismo que en 6630
  lTex=lXml["CliDom"].encode("utf-8")
  lTex=lTex.replace("Ñ","&Ntilde;") 
  lTex=lTex.replace("ñ","&ntilde;")

  f.write( "  <TD ALIGN=LEFT>"+lTex+"</TD>\n")
  f.write( "  <TD ALIGN=CENTER>FECHA</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR> \n")

# Mon Dec 01 09:28:19 MST 2014 JR
# los mismo que en 6630
  lTex=lXml["CliCol"].encode("utf-8")
  lTex=lTex.replace("Ñ","&Ntilde;") 
  lTex=lTex.replace("ñ","&ntilde;")

  f.write( "  <TD ALIGN=LEFT>"+lTex+" "+lXml["CliLoc"]+"</TD>\n")
  lTex=lXml["FecAct"].replace("T"," ")
  f.write( "  <TD ALIGN=CENTER>"+lTex+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR> \n")
  f.write( "  <TD ALIGN=LEFT>"+lXml["CliMun"]+" "+lXml["CliEst"]+" "+lXml["CliPai"]+"</TD>\n")
  f.write( "  <TD ALIGN=CENTER>A&ntilde;o y No. de Aprobaci&oacute;n de Folios</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR> \n")
  f.write( "  <TD ALIGN=LEFT>"+lXml["CliCoP"]+" RFC. "+lXml["CliRfc"]+"</TD>\n")
  f.write( "  <TD ALIGN=CENTER>"+lXml["AnioAp"]+" "+lXml["Aproba"]+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "</TABLE>\n")
  f.write( "<HR>\n")
# Movimientos
  movs=fFetchAll("SELECT fc_salida,fc_unimed,fc_descrip,fc_precio,fc_importe,(fc_fecha + fc_plazo),fc_numpar,fc_impuesto, \
    fc_clipro,fc_numpre,fc_vende,ve_nombre,fc_numdoc FROM fnfact, fnvend WHERE fc_numdoc='"+lfnd+"' AND fc_vende=ve_clave ORDER BY fc_serial;")
  f.write( "<TABLE BORDER=0 WIDTH=100%>\n" )
  f.write( "<TR> \n")
  f.write( "<TH ALIGN=LEFT> Cantidad </TH>\n")
  f.write( "<TH ALIGN=LEFT> Unidad </TH>\n")
  f.write( "<TH ALIGN=LEFT> Parte </TH>\n")
  f.write( "<TH ALIGN=LEFT> Descripcion </TH>\n")
  f.write( "<TH ALIGN=RIGHT> Precio </TH>\n")
  f.write( "<TH ALIGN=RIGHT> Importe </TH>\n")
  f.write( "</TR> \n")
  for mov in movs:
    f.write( "<TR> \n")
    f.write( "<TD ALIGN=LEFT> "+str(mov[0])+"</TD>\n")
    f.write( "<TD ALIGN=LEFT> "+str(mov[1])+"</TD>\n")
    f.write( "<TD ALIGN=LEFT> "+str(mov[6])+"</TD>\n")
    f.write( "<TD ALIGN=LEFT> "+str(mov[2])+"</TD>\n")
    lPre="%12.2f" % (mov[3])
    f.write( "<TD ALIGN=RIGHT> "+lPre.strip()+"</TD>\n")
    lImp="%12.2f" % (mov[4])
    if lXml["CliRfc"]=="XAXX010101000":
      lImp="%12.2f" % (mov[4]+mov[7])
      
    f.write( "<TD ALIGN=RIGHT> "+lImp.strip()+"</TD>\n")
    f.write( "</TR> \n")
    dVence = mov[5].strftime("%Y-%m-%d")
    (aVen, mVen, dVen) = dVence.split("-")
    mCli=mov[8]
    mNpr=mov[9]
    mVee=mov[10]
    mVno=mov[11]
    mTik=lfnd

  mVen=ficdef.fDatExt(dVence,3)
  f.write( "<TR>\n")
  f.write( "<TD>&nbsp;</TD>\n") 
  f.write( "<TD>&nbsp;</TD>\n") 
  f.write( "<TD>&nbsp;</TD>\n") 
  f.write( "<TD>&nbsp;</TD>\n") 
  f.write( "<TD ALIGN=RIGHT>SUBTOTAL</TD>\n")
  if lXml["CliRfc"]=="XAXX010101000":
    f.write( "<TD ALIGN=RIGHT>"+lXml["TotTotal"]+"</TD>\n")
  else:
    f.write( "<TD ALIGN=RIGHT>"+lXml["SubTotal"]+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR>\n")
  plin=ficdef.fPesos(float(lXml["TotTotal"]))
  f.write( "<TD COLSPAN=4 ROWSPAN=4 ALIGN=LEFT>Importe con letra: "+plin+"</TD>\n")
  f.write( "<TD ALIGN=RIGHT>16% IVA</TD>\n")
  if lXml["CliRfc"]=="XAXX010101000":
    f.write( "<TD ALIGN=RIGHT>&nbsp;</TD>\n")
  else:
    f.write( "<TD ALIGN=RIGHT>"+lXml["TotImpue"]+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR>\n")
  f.write( "<TD ALIGN=RIGHT>TOTAL</TD>\n")
  f.write( "<TD ALIGN=RIGHT>"+lXml["TotTotal"][:-4]+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "</TABLE>\n")
  f.write( "<TABLE BORDER=0 WIDTH=100%>\n" )
  f.write( "<TR>\n")
  f.write( "<TD ALIGN=LEFT>"+mCli+"</TD>\n")
  f.write( "<TD ALIGN=LEFT>"+mNpr+"</TD>\n")
  f.write( "<TD ALIGN=LEFT>"+mTik+"</TD>\n")
#  f.write( "<TD ALIGN=LEFT>"+mVee+"</TD>\n")
#  f.write( "<TD ALIGN=LEFT>"+mVno+"</TD>\n")
  f.write( "<TD ALIGN=LEFT>&nbsp;</TD>\n")
  f.write( "<TD ALIGN=LEFT>&nbsp;</TD>\n")
  f.write( "<TD ALIGN=LEFT>&nbsp;</TD>\n")
  f.write( "</TR>\n")
  f.write( "</TABLE>\n")
  f.write( "<HR>\n")
# Cadena Original, Sello digital
  if lEsOriginal==1:
    f.write( "<TABLE BORDER=0 WIDTH=100%>\n" )
    f.write( "<TR>\n")
    f.write( "<TD ALIGN=LEFT><FONT SIZE=-2>Cadena original<FONT></TD>\n")
    f.write( "<TD ALIGN=RIGHT><FONT SIZE=-2>Numero de Certificado:<FONT></TD>\n")
    f.write( "<TD ALIGN=LEFT><FONT SIZE=-2>"+lXml["NoCer"]+"<FONT></TD>\n")
#    f.write( "<TD ALIGN=RIGHT><FONT SIZE=-2>Metodo de Pago:<FONT></TD>\n")
#    f.write( "<TD ALIGN=LEFT><FONT SIZE=-2>"+lXml["CliFpa"]+"<FONT></TD>\n")

    f.write( "<TD ALIGN=LEFT><FONT SIZE=-2>Regimen Fiscal:<FONT></TD>\n")
    f.write( "<TD ALIGN=LEFT><FONT SIZE=-2>"+lXml["RegFis"]+"<FONT></TD>\n")
    f.write( "<TD ALIGN=LEFT><FONT SIZE=-2>Metodo de Pago:<FONT></TD>\n")
    f.write( "<TD ALIGN=LEFT><FONT SIZE=-2>"+lXml["CliFpa"]+"<FONT></TD>\n")
    if lXml["CliDpa"]:
      f.write( "<TD ALIGN=RIGHT><FONT SIZE=-2>Cta:<FONT></TD>\n")
      f.write( "<TD ALIGN=LEFT><FONT SIZE=-2>"+lXml["CliDpa"]+"<FONT></TD>\n")


    f.write( "</TR>\n")
    f.write( "<TR>\n")
    f.write( "</TABLE>\n")

    f.write( "<TABLE BORDER=0 WIDTH=100%>\n" )
    f.write( "<TR>\n")
    f.write( "  <TD ALIGN=CENTER ROWSPAN=9> <IMG SRC=\""+lfacact+".png\" width=\"120\" height=\"120\" border=\"0\"> </TD> \n")
    f.write( "  <TD ALIGN=LEFT>FOLIO FISCAL : "+lUUID+"</TD>\n")
    f.write( "</TR>\n")
#    f.write( "<TABLE BORDER=0 WIDTH=100%>\n" )
    lCadOri=lCadOri.replace("Ñ","&Ntilde;")
    lCadOri=lCadOri.replace("ñ","&ntilde;")
    lCadOri="||1.0|"+lUUID.strip()+"|"+lFechaCFD.strip()+"|"+lselloCFD.strip()+"|"+lCertiSAT.strip()+"||"
    lCadOri=lCadOri.encode("utf-8")
    f.write( "<TR>\n")
    f.write( "  <TD ALIGN=LEFT><FONT SIZE=-2>Sello SAT</FONT></TD>\n")
    f.write( "</TR>\n")
    f.write( "<TR>\n")
    f.write( "  <TD ALIGN=LEFT><FONT SIZE=-2>"+lselloSAT[:120]+"</FONT></TD>\n")
    f.write( "</TR>\n")
    f.write( "<TR>\n")
    f.write( "  <TD ALIGN=LEFT><FONT SIZE=-2>"+lselloSAT[120:]+"</FONT></TD>\n")
    f.write( "</TR>\n")
    f.write( "<TR>\n")
    f.write( "  <TD ALIGN=LEFT><FONT SIZE=-2>Sello Digital del CFDI</FONT></TD>\n")
    f.write( "</TR>\n")
    f.write( "<TR>\n")
    f.write( "  <TD ALIGN=LEFT><FONT SIZE=-2>"+lselloCFD[:140]+" "+lselloCFD[140:]+"</FONT></TD>\n")
    f.write( "</TR>\n")
    f.write( "<TR>\n")
    f.write( "  <TD ALIGN=LEFT><FONT SIZE=-2>Cadena original del complemento de certificacion digital del SAT</FONT></TD>\n")
    f.write( "</TR>\n")
    f.write( "<TR>\n")
    f.write( "  <TD ALIGN=LEFT><FONT SIZE=-2>"+lCadOri[:150]+" "+lCadOri[150:]+"</FONT></TD>\n")
    f.write( "</TR>\n")
    f.write( "<TR>\n")
    f.write( "  <TD ALIGN=LEFT><FONT SIZE=-2>&nbsp;</FONT></TD>\n")
    f.write( "</TR>\n")
    f.write( "</TABLE>\n")
    f.write( "<TABLE BORDER=0 WIDTH=100%>\n" )
    f.write( "<TR>\n")
#    f.write( "  <TD ALIGN=CENTER ROWSPAN=7> <IMG SRC=\""+lfacact+".png\" width=\"120\" height=\"120\" border=\"0\"> </TD> \n")
    f.write( "  <TD ALIGN=LEFT><FONT SIZE=-2>Fecha y Hora de certificado "+lFechaCFD+"</FONT></TD>\n")
    f.write( "  <TD ALIGN=RIGHT><FONT SIZE=-2>Numero de Certificado SAT "+lCertiSAT+"</FONT></TD>\n")
    f.write( "  <TD ALIGN=RIGHT><FONT SIZE=-2>Numero de Certificado CSD "+lCertiCSD+"</FONT></TD>\n")
    f.write( "</TR>\n")
    f.write( "</TABLE>\n")

#    lCadOri=lCadOri.replace("Ñ","&Ntilde;") 
#    lCadOri=lCadOri.replace("ñ","&ntilde;")
#    f.write( "<TD COLSPAN=3><FONT SIZE=-2>"+lCadOri+"<FONT></TD>\n")
#    f.write( "</TR>\n")
#    f.write( "<TR>\n")
#    f.write( "<TD ALIGN=LEFT COLSPAN=3><FONT SIZE=-2>Sello digital<FONT></TD>\n")
#    f.write( "</TR>\n")
#    f.write( "<TR>\n")
#    f.write( "<TD COLSPAN=3><FONT SIZE=-2>"+lSello+"</FONT></TD>\n")
#    f.write( "</TR>\n")
#    f.write( "</TABLE>\n")
#    f.write( "<HR>\n")

# Pagare
  f.write( "<TABLE BORDER=1 WIDTH=100%>\n" )
  f.write( "<TR>\n")
  f.write( "<TD><FONT SIZE=-1>POR ESTE PAGARE ME(NOS) COMPROMETO(EMOS) A PAGAR INCONDICIONALMENTE EL DIA <B>"+dVen+" DE \
"+mVen+" DE "+aVen+"</B> A LA ORDEN DE <B>SAUL ALONSO PONCE PEREZ</B>, EN SU DOMICILIO\
LA CANTIDAD DE "+plin+" MERCANCIAS RECIBIDAS DE CONFORMIDAD. SI ESTE PAGARE NO FUERA CUBIERTO A SU VENCIMIENTO \
CAUSARA UN INTERES MORATORIO DEL ..... % MENSUAL HASTA SU TOTAL LIQUIDACION.</FONT></TD>\n")
  f.write( "</TR>\n")
#  f.write( "<TR>\n")
#  f.write( "<TD ALIGN=RIGHT><FONT SIZE=-1>.................................<FONT></TD>\n")
#  f.write( "</TR>\n")
  f.write( "<TR>\n")
  f.write( "<TD ALIGN=RIGHT><FONT SIZE=-1>           F  I  R  M  A        .<FONT></TD>\n")
  f.write( "</TR>\n")
  f.write( "</TABLE>\n")
  f.write( "<TABLE BORDER=0 WIDTH=100%>\n" )
  (lanio,lmes,ldia)=lHoy.split('-')
  lTex=ficdef.fDatExt(lHoy,1)
  f.write( "<TR>\n")
  f.write( "<TD ALIGN=LEFT><FONT SIZE=-1>CHIHUAHUA, CHIH. a "+lTex+".<FONT></TD>\n")
  f.write( "<TD ALIGN=RIGHT><FONT SIZE=-1>Efectos fiscales al pago. Pago en una sola exhibicion<FONT></TD>\n")
  f.write( "</TR>\n")
  f.write( "</TABLE>\n")
# 
  f.write( "<TABLE BORDER=0 WIDTH=100%>\n" )
  f.write( "<TR>\n")
#  f.write( "<TD ALIGN=CENTER>Este documento es una impresi&oacute;n de un comprobante fiscal digital</TD>\n")
  f.write( "<TD ALIGN=CENTER>Este documento es una representaci&oacute;n impresa de un CFDI</TD>\n")
  f.write( "</TR>\n")
  f.write( "</TABLE>\n")
  f.write( "<HR>\n")
  
#  f.write( "<TABLE BORDER=0 WIDTH=100%>\n" )
#  f.write( "<TR>\n")
#  f.write( "<TD ALIGN=CENTER>TODA DEVOLUCION CAUSA UN 10% POR FALSO MANEJO</TD>\n")
#  f.write( "<TD ALIGN=CENTER>DEVOLUCION SOLO EL DIA DE LA VENTA, FORANEAS 5 DIAS DESPUES</TD>\n")
#  f.write( "<TD ALIGN=CENTER>EN PARTES ELECTRICAS NO HAY GARANTIA NI DEVOLUCION</TD>\n")
#  f.write( "<TD ALIGN=CENTER>SOLO ACEPTAMOS DEVOLUCIONES PRESENTANDO LA FACTURA</TD>\n")
#  f.write( "</TR>\n")
#  f.write( "</TABLE>\n")

  f.write( "</BODY>\n" )
  f.write( "</HTML>\n" )
  f.closed
  return


def fFacHTMLdbSP_32(lHoy,lfacact,lSello,lXml,lfnd,lDirCfd,lObserva,lAplicar,lTipDoc):

  lEsOriginal=0
  if lEsOriginal==0:
#    lFilTim="timbre/"+lfacact+"t.xml"
    lFilTim=lDirCfd+lfacact+"t.xml"
    lPngTim=lDirCfd+lfacact+".png"
    doc=minidom.parse(lFilTim)
    lUUID=doc.childNodes[0].childNodes[4].childNodes[0].getAttributeNS(None,"UUID")
    lselloSAT=doc.childNodes[0].childNodes[4].childNodes[0].getAttributeNS(None,"selloSAT")
    lCertiSAT=doc.childNodes[0].childNodes[4].childNodes[0].getAttributeNS(None,"noCertificadoSAT")
    lselloCFD=doc.childNodes[0].childNodes[4].childNodes[0].getAttributeNS(None,"selloCFD")
    lFechaCFD=doc.childNodes[0].childNodes[4].childNodes[0].getAttributeNS(None,"FechaTimbrado")
    lCertiCSD=doc.childNodes[0].getAttributeNS(None,"noCertificado")
    lFormPAG=doc.childNodes[0].getAttributeNS(None,"formaDePago")
    lMetoPAG=doc.childNodes[0].getAttributeNS(None,"metodoDePago")
    lok=system("/usr/bin/qrencode -m 1 -v 1 -s 4 -o '"+lPngTim+\
      "' '?re="+lXml["EmiRfc"]+"&rr="+lXml["CliRfc"]+"&tt="+lXml["TotTotal"]+"&id="+lUUID+"'")
    """
    qrencode -d 200 -m 1 -v 1 -s 4 -o 'Timbre.png' \
    '?re=ROAF641217K94&rr=INC101109Q36&tt=1234567890.123456&id=ad662d33-6934-459c-a128-BDf0393f0f44
    """
  mcadori=lDirCfd+lfacact+".cadenaoriginal"
  fichero = open(path.realpath(mcadori), "r")
  lCadOri=fichero.readline()
  fichero.closed
  lfactura=lDirCfd+lfacact+".html"
  f = open(path.realpath(lfactura), "w")
# Emisor
  f.write( "<HTML>\n" )
  f.write( "<BODY>\n" )
  f.write( "<CENTER>\n")
  f.write( "<TABLE BORDER=0 WIDTH=100%>\n" )
# Mon Apr 25 12:38:32 MDT 2011 agregar imagen 
#  f.write( "<TR>\n")
#  f.write( "  <TD ALIGN=CENTER ROWSPAN=7> <IMG SRC=\"logo.jpg\" width=\"180\" height=\"110\" border=\"0\"> </TD> \n")
#  f.write( "  <TD ALIGN=CENTER>EMISOR</TD>\n")
#  f.write( "</TR>\n")

#  f.write( "<TR>\n")
#  f.write( "  <TD ALIGN=CENTER ROWSPAN=6> <IMG SRC=\"logo.jpg\"> </TD> \n")
#  f.write( "  <TD ALIGN=CENTER>EMISOR</TD>\n")
#  f.write( "</TR>\n")

  f.write( "<TR>\n")
  f.write( "  <TD ALIGN=CENTER>"+lXml["EmiNom"]+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR>\n")
  f.write( "  <TD ALIGN=CENTER>"+lXml["EmiCal"]+" "+lXml["EmiNoE"]+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR>\n")
  f.write( "  <TD ALIGN=CENTER>"+lXml["EmiCol"]+" "+lXml["EmiLoc"]+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR>\n")
  f.write( "  <TD ALIGN=CENTER>"+lXml["EmiMun"]+" "+lXml["EmiEst"]+" "+lXml["EmiPai"]+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR>\n")
  f.write( "  <TD ALIGN=CENTER>"+lXml["EmiCod"]+" RFC. "+lXml["EmiRfc"]+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "</TABLE>\n")
  f.write( "<HR>\n")
# Cliente
  f.write( "<TABLE BORDER=0 WIDTH=100%>\n" )
  f.write( "<TR>\n")
  f.write( "  <TD ALIGN=CENTER><B>CLIENTE</B></TD>\n")
  if lTipDoc=='DR':
    f.write( "  <TD ALIGN=CENTER>NOTA DE CREDITO "+lTipDoc+" <B>CREDITO</B></TD>\n")
  else:
    f.write( "  <TD ALIGN=CENTER>NOTA DE CREDITO "+lTipDoc+" <B>CONTADO</B></TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR>\n")
# Fri Nov 28 17:12:00 MST 2014 segun nota de 6630
#  lTex=lXml["CliNom"]
  lTex=lXml["CliNom"].encode("utf-8")
  lTex=lTex.replace("Ñ","&Ntilde;") 
  lTex=lTex.replace("ñ","&ntilde;")

  f.write( "  <TD ALIGN=LEFT>"+lTex+"</TD>\n")
  f.write( "  <TD ALIGN=CENTER>"+lfacact+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR> \n")

# Fri Nov 28 17:12:00 MST 2014 segun nota de 6630
#  lTex=lXml["CliNom"]
  lTex=lXml["CliDom"].encode("utf-8")
  lTex=lTex.replace("Ñ","&Ntilde;") 
  lTex=lTex.replace("ñ","&ntilde;")
  f.write( "  <TD ALIGN=LEFT>"+lTex+"</TD>\n")

  f.write( "  <TD ALIGN=CENTER>FECHA</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR> \n")

# Fri Nov 28 17:12:00 MST 2014 segun nota de 6630
#  lTex=lXml["CliNom"]
  lTex=lXml["CliCol"].encode("utf-8")
  lTex=lTex.replace("Ñ","&Ntilde;") 
  lTex=lTex.replace("ñ","&ntilde;")
  f.write( "  <TD ALIGN=LEFT>"+lTex+" "+lXml["CliLoc"]+"</TD>\n")

  lTex=lXml["FecAct"].replace("T"," ")
  f.write( "  <TD ALIGN=CENTER>"+lTex+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR> \n")
  f.write( "  <TD ALIGN=LEFT>"+lXml["CliMun"]+" "+lXml["CliEst"]+" "+lXml["CliPai"]+"</TD>\n")
  f.write( "  <TD ALIGN=CENTER>A&ntilde;o y No. de Aprobaci&oacute;n de Folios</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR> \n")
  f.write( "  <TD ALIGN=LEFT>"+lXml["CliCoP"]+" RFC. "+lXml["CliRfc"]+"</TD>\n")
  f.write( "  <TD ALIGN=CENTER>"+lXml["AnioAp"]+" "+lXml["Aproba"]+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "</TABLE>\n")
  f.write( "<HR>\n")
# Movimientos
  movs=fFetchAll("SELECT di_entrada,'PZ',di_descrip,di_precio,di_importe,di_numpar,di_impuesto FROM "+lfnd)
  f.write( "<TABLE BORDER=0 WIDTH=100%>\n" )
  f.write( "<TR> \n")
  f.write( "<TH ALIGN=LEFT> Cantidad </TH>\n")
  f.write( "<TH ALIGN=LEFT> Unidad </TH>\n")
  f.write( "<TH ALIGN=LEFT> Parte </TH>\n")
  f.write( "<TH ALIGN=LEFT> Descripcion </TH>\n")
  f.write( "<TH ALIGN=RIGHT> Precio </TH>\n")
  f.write( "<TH ALIGN=RIGHT> Importe </TH>\n")
  f.write( "</TR> \n")
  for mov in movs:
    f.write( "<TR> \n")
    f.write( "<TD ALIGN=LEFT> "+str(mov[0])+"</TD>\n")
    f.write( "<TD ALIGN=LEFT> "+str(mov[1])+"</TD>\n")
    f.write( "<TD ALIGN=LEFT> "+str(mov[5])+"</TD>\n")
    lTex=mov[2]
    lTex=lTex.replace("Ñ","&Ntilde;") 
    lTex=lTex.replace("ñ","&ntilde;")
    f.write( "<TD ALIGN=LEFT> "+str(lTex)+"</TD>\n")
    lPre="%12.2f" % (mov[3])
    f.write( "<TD ALIGN=RIGHT> "+lPre.strip()+"</TD>\n")
    lImp="%12.2f" % (mov[4])
    if lXml["CliRfc"]=="XAXX010101000":
      lImp="%12.2f" % (float(mov[4])+float(mov[6]))
    f.write( "<TD ALIGN=RIGHT> "+lImp.strip()+"</TD>\n")
    f.write( "</TR> \n")
  f.write( "<TR>\n")
  f.write( "<TD>&nbsp;</TD>\n") 
  f.write( "<TD>&nbsp;</TD>\n") 
  f.write( "<TD>&nbsp;</TD>\n") 
  f.write( "<TD>&nbsp;</TD>\n") 
  f.write( "<TD ALIGN=RIGHT>SUBTOTAL</TD>\n")
  if lXml["CliRfc"]=="XAXX010101000":
    f.write( "<TD ALIGN=RIGHT>"+lXml["TotTotal"]+"</TD>\n")
  else:
    f.write( "<TD ALIGN=RIGHT>"+lXml["SubTotal"]+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR>\n")
  plin=ficdef.fPesos(float(lXml["TotTotal"]))
  f.write( "<TD COLSPAN=3 ROWSPAN=4 ALIGN=LEFT>Importe con letra: "+plin+"</TD>\n")
  f.write( "<TD ALIGN=RIGHT>16% IVA</TD>\n")
  if lXml["CliRfc"]=="XAXX010101000":
    f.write( "<TD ALIGN=RIGHT>&nbsp;</TD>\n")
  else:
    f.write( "<TD ALIGN=RIGHT>"+lXml["TotImpue"]+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "<TR>\n")
  f.write( "<TD ALIGN=RIGHT>TOTAL</TD>\n")
  f.write( "<TD ALIGN=RIGHT>"+lXml["TotTotal"]+"</TD>\n")
  f.write( "</TR>\n")
  f.write( "</TABLE>\n")
  f.write( "<HR>\n")
# Cadena Original, Sello digital
  f.write( "<TABLE BORDER=0 WIDTH=100%>\n" )
  f.write( "<TR>\n")
  f.write( "<TD ALIGN=LEFT><FONT SIZE=-2>Cadena original<FONT></TD>\n")
  f.write( "<TD ALIGN=RIGHT><FONT SIZE=-2>Numero de Certificado<FONT></TD>\n")
  f.write( "<TD ALIGN=LEFT><FONT SIZE=-2>"+lXml["NoCer"]+"<FONT></TD>\n")
  f.write( "<TD ALIGN=RIGHT><FONT SIZE=-2>Metodo de Pago:<FONT></TD>\n")
  f.write( "<TD ALIGN=LEFT><FONT SIZE=-2>"+lXml["CliFpa"]+"<FONT></TD>\n")
  f.write( "</TR>\n")
  f.write( "</TABLE>\n")

  if lEsOriginal==0:
    f.write( "<TABLE BORDER=0 WIDTH=100%>\n" )
    f.write( "<TR>\n")
    f.write( "  <TD ALIGN=CENTER ROWSPAN=9> <IMG SRC=\""+lfacact+".png\" width=\"120\" height=\"120\" border=\"0\"> </TD> \n")
    f.write( "  <TD ALIGN=LEFT>FOLIO FISCAL : "+lUUID+"</TD>\n")
    f.write( "</TR>\n")
#    f.write( "<TABLE BORDER=0 WIDTH=100%>\n" )
    lCadOri=lCadOri.replace("Ñ","&Ntilde;")
    lCadOri=lCadOri.replace("ñ","&ntilde;")
    lCadOri="||1.0|"+lUUID.strip()+"|"+lFechaCFD.strip()+"|"+lselloCFD.strip()+"|"+lCertiSAT.strip()+"||"
    lCadOri=lCadOri.encode("utf-8")
    f.write( "<TR>\n")
    f.write( "  <TD ALIGN=LEFT><FONT SIZE=-2>Sello SAT</FONT></TD>\n")
    f.write( "</TR>\n")
    f.write( "<TR>\n")
    f.write( "  <TD ALIGN=LEFT><FONT SIZE=-2>"+lselloSAT[:120]+"</FONT></TD>\n")
    f.write( "</TR>\n")
    f.write( "<TR>\n")
    f.write( "  <TD ALIGN=LEFT><FONT SIZE=-2>"+lselloSAT[120:]+"</FONT></TD>\n")
    f.write( "</TR>\n")
    f.write( "<TR>\n")
    f.write( "  <TD ALIGN=LEFT><FONT SIZE=-2>Sello Digital del CFDI</FONT></TD>\n")
    f.write( "</TR>\n")
    f.write( "<TR>\n")
    f.write( "  <TD ALIGN=LEFT><FONT SIZE=-2>"+lselloCFD[:140]+" "+lselloCFD[140:]+"</FONT></TD>\n")
    f.write( "</TR>\n")
    f.write( "<TR>\n")
    f.write( "  <TD ALIGN=LEFT><FONT SIZE=-2>Cadena original del complemento de certificacion digital del SAT</FONT></TD>\n")
    f.write( "</TR>\n")
    f.write( "<TR>\n")
    f.write( "  <TD ALIGN=LEFT><FONT SIZE=-2>"+lCadOri[:150]+" "+lCadOri[150:]+"</FONT></TD>\n")
    f.write( "</TR>\n")
    f.write( "<TR>\n")
    f.write( "  <TD ALIGN=LEFT><FONT SIZE=-2>&nbsp;</FONT></TD>\n")
    f.write( "</TR>\n")
    f.write( "</TABLE>\n")
    f.write( "<TABLE BORDER=0 WIDTH=100%>\n" )
    f.write( "<TR>\n")
#    f.write( "  <TD ALIGN=CENTER ROWSPAN=7> <IMG SRC=\""+lfacact+".png\" width=\"120\" height=\"120\" border=\"0\"> </TD> \n")
    f.write( "  <TD ALIGN=LEFT><FONT SIZE=-2>Fecha y Hora de certificado "+lFechaCFD+"</FONT></TD>\n")
    f.write( "  <TD ALIGN=RIGHT><FONT SIZE=-2>Numero de Certificado SAT "+lCertiSAT+"</FONT></TD>\n")
    f.write( "  <TD ALIGN=RIGHT><FONT SIZE=-2>Numero de Certificado CSD "+lCertiCSD+"</FONT></TD>\n")
    f.write( "</TR>\n")
    f.write( "</TABLE>\n")

#  f.write( "<TR>\n")
#  lCadOri=lCadOri.replace("Ñ","&Ntilde;") 
#  lCadOri=lCadOri.replace("ñ","&ntilde;")
#  f.write( "<TD COLSPAN=3><FONT SIZE=-2>"+lCadOri+"<FONT></TD>\n")
#  f.write( "</TR>\n")
#  f.write( "<TR>\n")
#  f.write( "<TD ALIGN=LEFT COLSPAN=3><FONT SIZE=-2>Sello digital<FONT></TD>\n")
#  f.write( "</TR>\n")
#  f.write( "<TR>\n")
#  f.write( "<TD COLSPAN=3><FONT SIZE=-2>"+lSello+"</FONT></TD>\n")
#  f.write( "</TR>\n")
#  f.write( "</TABLE>\n")

  f.write( "<HR>\n")
# Observaciones y aplicar
  f.write( "<TABLE BORDER=0 WIDTH=100%>\n" )
  f.write( "<TR>\n")
  f.write( "<TD><FONT>"+lAplicar+" "+lObserva+"</FONT></TD>\n")
  f.write( "</TR>\n")
  (lanio,lmes,ldia)=lHoy.split('-')
  lTex=ficdef.fDatExt(lHoy,1)
  f.write( "<TR>\n")
  f.write( "<TD ALIGN=RIGHT>CHIHUAHUA, CHIH. a "+lTex+".</TD>\n")
  f.write( "</TR>\n")
  f.write( "</TABLE>\n")
  f.write( "<HR>\n")
# 
  f.write( "<TABLE BORDER=0 WIDTH=100%>\n" )
  f.write( "<TR>\n")
#  f.write( "<TD ALIGN=CENTER>Este documento es una impresi&oacute;n de un comprobante fiscal digital</TD>\n")
  f.write( "<TD ALIGN=CENTER>Este documento es una representaci&oacute;n impresa de un CFDI</TD>\n")
  f.write( "</TR>\n")
  f.write( "</TABLE>\n")

  f.write( "</BODY>\n" )
  f.write( "</HTML>\n" )
  f.closed
  return


# End ficsql
