DLL_EPSON

// Programa      :     DLL_EPSON
// Fecha/Hora    :     26/04/2022 14:46:55
// Propósito     :     LLamadas Epson DLL
// Creado Por    :      Kelvis Escalante, Juan Navas
// Llamado por   :
// Aplicación    :
// Tabla        :

#INCLUDE "DPXBASE.CH"

PROCE MAIN(cTipDoc,cNumero)
   LOCAL cFileLog:="",cSql,cWhere,cEstatus
   LOCAL cMaqui,cNombre,cRif,cDir1,cTel1,cNumFav
   LOCAL cCant,cPrecio,cDescri,cAlicuota
   LOCAL cPuerto :=RIGHT(oDp:cImpFisCom,1) // si es COM9, será 9
   LOCAL nDivisa :=0
   LOCAL oEpson,oTable,cPicture:="999999999.99"

   DEFAULT cTipDoc:="TIK",;
           cNumero:=SQLGETMAX("DPDOCCLI","DOC_NUMERO","DOC_TIPDOC"+GetWhere("=",cTipDoc))

   cWhere:="DOC_CODSUC"+GetWhere("=",oDp:cSucursal)+" AND "+;
      "DOC_TIPDOC"+GetWhere("=",cTipDoc      )+" AND "+;
      "DOC_NUMERO"+GetWhere("=",cNumero      )+" AND "+;
      "DOC_TIPTRA"+GetWhere("=","D"          )

// Obtiene el Monto en Bs para que la impresora fiscal realice el Cálculo del IGTF.
   nDivisa :=EJECUTAR("DPDOCCLIPAGDIV",oDp:cSucursal,cTipDoc,cNumero)

   IF oDp:nImpFisLen>0
  cPicture:=BuildPicture(oDp:nImpFisLen+1,oDp:nImpFisEnt,.F.)
   ENDIF

   IF !TYPE("oEpson")="O"
  TDpClass():New(NIL,"oEpson")
 ENDIF

 oEpson:hDll :=NIL
 oEpson:cName :="EPSON"
 oEpson:cFileDll :="pnpdll.dll"
 oEpson:cEstatus :=""
 oEpson:oFile :=NIL
 oEpson:lError :=.F.

   cFileLog:="TEMP\"+cNumero+".LOG"

   FERASE(cFileLog)

   IF !FILE(oEpson:cFileDll)
     MsgMemo("No se Encuentra Archivo "+oEpson:cFileDll)
     RETURN NIL
   ENDIF

   oEpson:hDll := LoadLibrary(oEpson:cFileDll)
   oEpson:cPort :=cPuerto // Valor por Defecto

   IF !(Abs(oEpson:hDLL) > 32)
     MensajeErr("Error Leyendo Libreria "+oEpson:cFileDll)
     oEpson:IFCERRARDLL()
     RETURN NIL
   ENDIF

   oEpson:oFile:=TFile():New(cFileLog)

   oEpson:IFOPEN()

   WHILE .T.

     cEstatus:=oEpson:IFESTATUS()

     SQLUPDATE("DPDOCCLI",{"DOC_NUMPER","DOC_IMPRES"},{cEstatus,.F.},cWhere) // Estatus Impresora

     IF !Empty(oEpson:cEstatus).AND. MsgNoYes("Desea Intentar Nuevamente", "Estatus: "+oEpson:cEstatus)
   oEpson:lError:=.F.0
   LOOP
 ENDIF

 EXIT

   ENDDO

   IF !Empty(oEpson:cEstatus)
      oEpson:IFCLOSE()
 RETURN .F.
   ENDIF

   cSql:=" SELECT MOV_DOCUME,MOV_CODIGO,INV_DESCRI,MOV_TOTAL,DOC_OTROS,DOC_DCTO,MOV_PRECIO,MOV_DESCUE,MOV_CANTID,MOV_IVA,CCG_NOMBRE,CCG_RIF,CCG_DIR1,CCG_TEL1,"+;
     " DOC_IMPRES,SFI_SERIMP "+;
      " FROM DPMOVINV "+;
     " INNER JOIN DPINV ON MOV_CODIGO=INV_CODIGO "+;
      " INNER JOIN DPDOCCLI ON MOV_CODSUC=DOC_CODSUC AND MOV_TIPDOC=DOC_TIPDOC AND DOC_NUMERO=MOV_DOCUME AND DOC_TIPTRA='D'"+;
     " LEFT JOIN DPSERIEFISCAL ON DOC_SERFIS=SFI_LETRA "+;
      " LEFT JOIN DPCLIENTES ON DOC_CODIGO=CLI_CODIGO "+;
      " LEFT JOIN DPCLIENTESCERO ON CCG_CODSUC=DOC_CODSUC AND CCG_TIPDOC=DOC_TIPDOC AND CCG_NUMDOC=DOC_NUMERO "+;
      " WHERE MOV_CODSUC"+GetWhere("=",oDp:cSucursal)+;
     " AND MOV_TIPDOC"+GetWhere("=",cTipDoc )+;
      " AND MOV_DOCUME"+GetWhere("=",cNumero )+;      " AND MOV_INVACT=1 " +;
     " GROUP BY MOV_ITEM "+;
     " ORDER BY MOV_ITEM "

   oTable:=OpenTable(cSql,.T.)

   IF oTable:DOC_IMPRES
     MensajeErr("Número Fiscal "+cNumero+" ya fué impreso")
     oTable:End()
     RETURN .F.
   ENDIF

   // Serie Fiscal esta almacenada en DPSERFISCAL
 cMaqui := ALLTRIM(PADR(oTable:SFI_SERIMP ,10))
 cNombre := ALLTRIM(PADR(oTable:CCG_NOMBRE ,35))
 cRif := ALLTRIM(PADR(oTable:CCG_RIF ,12))
 cDir1 := ALLTRIM(PADR(oTable:CCG_DIR1 ,15))
 cTel1 := ALLTRIM(PADR(oTable:CCG_TEL1 ,12))
 cNumFav := ALLTRIM(PADR(oTable:MOV_DOCUME ,10))

 oEpson:IFABREFISCAL()
 oTable:Gotop()

 WHILE !oTable:Eof()

IF oTable:Eof()
EXIT
ENDIF


cCant :=ALLTRIM(TRANSFORM(oTable:MOV_CANTID,"999999.999"))
cPrecio :=ALLTRIM(TRANSFORM(oTable:MOV_PRECIO,cPicture))
cDescri :=ALLTRIM(PADR(oTable:INV_DESCRI,20))
cAlicuota :=STRZERO(oTable:MOV_IVA*100,4)

  oEpson:IFRENGLON()

oTable:DbSkip()

SysRefresh(.T.)

 ENDDO

 oTable:End()

 oEpson:IFPRINT()
 oEpson:IFCLOSE()

 IF oEpson:lError
MsgMemo(MemoRead(cFileLog))
ENDIF

 SQLUPDATE("DPDOCCLI",{"DOC_NUMPER","DOC_IMPRES"},{oEpson:IFESTATUS(),.T.},cWhere) // Estatus Impresora

 SysRefresh(.T.)

RETURN .T.

/*
// Apertura del Puerto
*/
FUNCTION IFOPEN(cPort)
LOCAL cResp:=oEpson:PFRUNCMD("PFabrepuerto",cPuerto)
RETURN .T.

/*
// Mostrar el Estatu de la Impresora
*/
FUNCTION IFSHOWSTARTUS()
MsgMemo(oEpson:cEstatus)
RETURN .T.

/*
// Apertura del Encabezado
*/
FUNCTION IFABREFISCAL()
 LOCAL cResp
 LOCAL cLinea1,cLinea2,cLinea3,cLinea4

 IF cTipDoc = "TIK" .OR. cTipDoc="FAV"

 cResp:=oEpson:PFRUNCMD("PFabrefiscal",cNombre,cRif)
 cLinea1:="Nro. Documento: "+cNumFav
 cLinea2:="DIRECCION: "+cDIR1
 cLinea3:="TELEFONO: "+cTel1
 cLinea4:=REPLI("-",80)// ---------------------------------------"
 cResp:=oEpson:PFRUNCMD("PFTfiscal",cLinea1)
 cResp:=oEpson:PFRUNCMD("PFTfiscal",cLinea2)
 cResp:=oEpson:PFRUNCMD("PFTfiscal",cLinea3)
 cResp:=oEpson:PFRUNCMD("PFTfiscal",cLinea4)

 ENDIF

 IF cTipDoc = "DEV" .OR. cTipDoc = "CRE"

 cResp:=oEpson:PFRUNCMD("PFDevolucion",cNombre,cRIF,cNumFav,cMaqui,DTOC(DATE()),TIME())
 cLinea1:="Nro. Documento: "+cNumFav
 cLinea2:="DIRECCION: "+cDIR1
 cLinea3:="TELEFONO: "+cTel1
 cLinea4:=REPLI("-",80)// "----------------------------------------"
  cResp:=oEpson:PFRUNCMD("PFTfiscal",cLinea1)
 cResp:=oEpson:PFRUNCMD("PFTfiscal",cLinea2)
 cResp:=oEpson:PFRUNCMD("PFTfiscal",cLinea3)
 cResp:=oEpson:PFRUNCMD("PFTfiscal",cLinea4)

 ENDIF

RETURN .T.

FUNCTION IFTEXTOFISCAL()
RETURN oEpson:PFRUNCMD("PFTfiscal","")

/*
// Imprime el cuerpo de la factura
*/

FUNCTION IFRENGLON()
 LOCAL cResp
 cResp:=oEpson:PFRUNCMD("PFrenglon",cDescri,cCant,cPrecio,cAlicuota)
RETURN cResp

/*
// Cancela Documento Fiscal
*/
FUNCTION IFCANCELADOC()
 cResp:=oEpson:PFRUNCMD("PFCancelaDoc","C","0")
RETURN cResp

/*
// Obtiene el Estatus de la Impresora
*/
FUNCTION IFESTATUS()
 LOCAL cResp

 cResp:=oEpson:PFRUNCMD("PFestatus","")

 oEpson:cEstatus:=""

 IF cResp = "TO"
 oEpson:cEstatus:="Se excedió el tiempo de espera,"
 oEpson:lError:=.T.
 ENDIF

 IF cResp = "NP"
 oEpson:cEstatus:="Puerto no Abierto"
 oEpson:lError:=.T.
 ENDIF

 IF cResp = "ER"
 oEpson:cEstatus:="Existe un Error de Impresora"
 oEpson:lError:=.T.
 ENDIF

RETURN cResp

/*
// Cortar el Papel
*/
FUNCTION IFCUTPAPER()
 LOCAL cResp
 cResp:=oEpson:PFRUNCMD("PFCortar","")
RETURN

/*
// Totalizador
*/
FUNCTION IFPRINT()
 LOCAL cResp,cMonto:=""

 IF nDivisa>0
 cMonto:="E|U|"+LSTR(nDivisa*100,10,0)
 cResp :=oEpson:PFRUNCMD("PFComando",cMonto)
 ELSE
 cMonto:="E|U|000"
 cResp :=oEpson:PFRUNCMD("PFComando",cMonto)
 ENDIF

RETURN .T.

/*
// Ejecuta llamadas de las Funciones de la Impresora Epson
*/
FUNCTION PFRUNCMD(cFunc,cPar1,cPar2,cPar3,cPar4,cPar5,cPar6,cPar7,cPar8,cPar9)
 LOCAL uResult, cFarProc, hDLL:=oEpson:hDll
 cFarProc:= GetProcAddress(hDLL,cFunc,.T.,8,8,8,8,8,8,8,8,8,8 )
 uResult := CallDLL(cFarProc,cPar1,cPar2,cPar3,cPar4,cPar5,cPar6,cPar7,cPar8,cPar9)

 IF ValType(uResult)="C" .AND. uResult="ER"
   oEpson:lError:=.T.
   oEpson:oFile:AppStr(cFunc+","+cPar1+uResult)
 ENDIF

RETURN uResult

/*
// Cierra la Conexión con la Impresora
*/
FUNCTION IFCLOSE()

 oEpson:PFRUNCMD("PFcierrapuerto","")

 oEpson:IFCERRARDLL()
 IF !oEpson:oFile=NIL
 oEpson:oFile:Close()
 ENDIF

RETURN

/*
// Cerrar el Archivo pnpdll.dll
*/
FUNCTION IFCERRARDLL()

 FreeLibrary(oEpson:hDLL )
 oEpson:hDLL:=NIL

RETURN .T.
// EOF