Ejemplo sencillo de factura

Re: Ejemplo sencillo de factura

Postby ACC69 » Tue Apr 26, 2016 4:36 pm

FranciscoA wrote:
Adriano
Hola buenos dias Ing. Francisco sino es mucho pedir, sera que igual me puedes aportar tus ejemplos de facturacion y ver si logro hacerlo funcionar adaptandolo a mi sistema por medio de arrays() en txbrowse?,mucho les agradecere su ejemplo de ayuda.

Gracias Ing.

Atte: Adrian C. C.

acc69@hotmail.com


Enviado.
Saludos.[/quote]


Gracias Ing. Francisco muy amable en compartir su codigo,reviso mi correo.

Gracias

Atte: Adrian C. C.
ACC69
 
Posts: 632
Joined: Tue Dec 12, 2006 7:34 pm

Re: Ejemplo sencillo de factura

Postby ACC69 » Tue Apr 26, 2016 4:37 pm

joseluisysturiz wrote:
ACC69 wrote:
FranciscoA wrote:Persi, revisa tu correo.



Hola buenos dias Ing. Francisco sino es mucho pedir, sera que igual me puedes aportar tus ejemplos de facturacion y ver si logro hacerlo funcionar adaptandolo a mi sistema por medio de arrays() en txbrowse?,mucho les agradecere su ejemplo de ayuda.

Gracias Ing.

Atte: Adrian C. C.

acc69@hotmail.com


Saludos, enviado hoy, no habia revisado el foro desde hace dias, saludos...



Gracias Ing. Jose Luis muy amable en compartir su codigo, reviso mi correo.

Gracias

Atte: Adrian C. C.
ACC69
 
Posts: 632
Joined: Tue Dec 12, 2006 7:34 pm

Re: Ejemplo sencillo de factura

Postby Compuin » Tue Apr 26, 2016 4:41 pm

Hola

Podrias enviarme o compartir el codigo conmigo tambien?

MI email es compuin@gmail.com

Gracias de antemano
FWH 20.12
Hbmk2 32/64 Bits (Build 19.29.30133)
Microsoft Visual C 32 Bits
MySql 8.0.24 32/64 Bits
VS Code
Compuin
 
Posts: 1213
Joined: Tue Dec 28, 2010 1:29 pm
Location: Quebec, Canada

Re: Ejemplo sencillo de factura

Postby sysctrl2 » Tue Apr 26, 2016 5:49 pm

Las bases de datos solo son para almacenamiento,
yo recomiendo que uses puras variables para la edición de una factura,
un array para el xbrowse.

En samples de fivewin tenemos un MALLORCA.PRG ahi aprendí todo lo que sé de arrays
y xbrowse.

SALUDOS.
Cesar SysCtrl Software.

Image
Cesar Cortes Cruz
SysCtrl Software
Mexico

' Sin +- FWH es mejor "
User avatar
sysctrl2
 
Posts: 951
Joined: Mon Feb 05, 2007 7:15 pm

Re: Ejemplo sencillo de factura

Postby ACC69 » Tue Apr 26, 2016 6:41 pm

sysctrl2 wrote:Las bases de datos solo son para almacenamiento,
yo recomiendo que uses puras variables para la edición de una factura,
un array para el xbrowse.

En samples de fivewin tenemos un MALLORCA.PRG ahi aprendí todo lo que sé de arrays
y xbrowse.

SALUDOS.
Cesar SysCtrl Software.

Image



Hola Ing. Cesar tiene buen estilo tu pantalla y habra manera de compartir parte de tu codigo txbrowse con arrays , de como traer los datos desde dbf cargando al array?

Gracias

Saludos
Atte: Adrian C. C.
acc69@hotmail.com
ACC69
 
Posts: 632
Joined: Tue Dec 12, 2006 7:34 pm

Re: Ejemplo sencillo de factura

Postby joseluisysturiz » Tue Apr 26, 2016 8:24 pm

sysctrl2 wrote:Las bases de datos solo son para almacenamiento,
yo recomiendo que uses puras variables para la edición de una factura,
un array para el xbrowse.

En samples de fivewin tenemos un MALLORCA.PRG ahi aprendí todo lo que sé de arrays
y xbrowse.

SALUDOS.
Cesar SysCtrl Software.

Image


Cesar, que clases usas TExplore o TOulook, bajo que windows esta corriendo esa imagen y que diseño es 2010, 2013, 2015...? ya he visto los diseños del colega Armando Laguna y tiene unos colores espectacular, muy bien combinados, se ven muy bien presentados, gracias, saludos... :shock:

viewtopic.php?f=6&t=32275
Dios no está muerto...

Gracias a mi Dios ante todo!
User avatar
joseluisysturiz
 
Posts: 2064
Joined: Fri Jan 06, 2006 9:28 pm
Location: Guatire - Caracas - Venezuela

Re: Ejemplo sencillo de factura

Postby sysctrl2 » Thu Apr 28, 2016 4:52 pm

Hola Colegas,
le comparto:

En mi sistema uso la class tpanel y texplorer del colega Andres Reyes, en este foro hay mucho ejemplos,

y para el almacenamiento de datos uso MySql.

Hace mucho que ya no uso DBF no me sirve.

envio parte de mi código de ABCCOMPRAS.PRG

para que vean como hago la carga de datos y como doy mantenimiento al xbrowse.

cualquier duda estoy para ayudarles,
www.facebook.com/SysCtrlSoftware

Saludos Cesar.

Image

Code: Select all  Expand view
#include <fivewin.ch>
#include <xbrowse.ch>
#include <Splitter.ch>
#include <ribbon.ch>
#include "ttitle.ch"
#include <taskpanel.ch>
#include "dtpicker.ch"

#DEFINE C_SIMPLE CHR( 39 )
#DEFINE c_simple CHR( 39 )

#DEFINE CCODIGO SPACE(15)
#DEFINE NCANTIDAD 0.00
#DEFINE CUNIDAD SPACE(20)
#DEFINE CDESCRIPCION SPACE(60)
#DEFINE NPRECIO  0
#DEFINE NIMPORTE 0
#DEFINE CEXENTO  SPACE(1)
#DEFINE NRECNO   0
#DEFINE NDEC     5

#DEFINE AMONEDAS {"PESOS","DLS", "MXN"}  

#DEFINE AMEDIDAS { FWString("PIECES")    ,;
                   FWString("SERVICE")  ,;
                   FWString("LITER")    ,;
                   FWString("KILOGRAM")     ,;
                   FWString("KGS") ,;
                   FWString("DOES NOT APPLY")  }                  



STATIC oGet
STATIC oBrw
STATIC aData
STATIC n15
STATIC oSay
STATIC cUnidad_medida
STATIC nAmount := 0
STATIC nTot1 := 0
STATIC nTot2 := 0
STATIC nPorc_ret_isr := 0
STATIC nPorc_ret_iva := 0
STATIC nFactura := 0
STATIC cSerieX := ""
STATIC cTimbrado := ""
STATIC aItemsDel := {}

CLASS AbcCompras
    DATA oMain AS Object
    DATA oBrw  AS Object
    DATA oBox AS Object
    DATA lEdit
  DATA cCia

    DATA nCod_cte       INIT 0
    DATA cRfc           INIT SPACE(15)
    DATA cNombre        INIT SPACE(100)
  DATA cNumero_escuela
    DATA cCalle         INIT SPACE(100)
    DATA cNo_exterior   INIT SPACE(20)
    DATA cNo_Interior   INIT SPACE(20)
    DATA cColonia       INIT SPACE(60)
    DATA cLocalidad     INIT SPACE(60)
    DATA cMunicipio     INIT SPACE(60)
    DATA cEstado        INIT SPACE(60)
    DATA cCodigo_postal INIT space( 5 )
    DATA cPais          INIT space( 30 )
    DATA cMoneda        INIT "PESOS     "
    DATA nFolio         INIT 0
    DATA dFecha         INIT date()
  DATA cCalcula_ret_isr   INIT SPACE(1)
  DATA cCalcula_ret_iva INIT SPACE(1)

  DATA nCod_alumno INIT 0
  DATA cNombre_alumno INIT SPACE(100)
  DATA cCurp INIT SPACE(30)
  DATA cNivel_educativo INIT SPACE(30)
  DATA cGrupo INIT SPACE(20)
  DATA dFecha_alta INIT DATE()
  DATA cTelefono INIT SPACE(30)

    DATA nVenta_inicial INIT 0
    DATA nVenta_final   INIT 0
    DATA nImpuesto      INIT 0.00
    DATA nExento        INIT 0.00
    DATA nVenta_total   INIT 0.00
    DATA nDescuento     INIT 0.00
    DATA nSubtotal      INIT 0.00
    DATA nIva           INIT 0.00
    DATA nRedondeo      INIT 0.00
    DATA nIsr           INIT 0.00
    DATA nRetencion     INIT 0.00
    DATA nTotal         INIT 0.00
  DATA nSemana        INIT 0

    DATA cCodigo        INIT SPACE(15)
    DATA cDescripcion   INIT SPACE(100)
    DATA nPrecio        INIT 0.00
    DATA nCantidad      INIT 1.00
    DATA nImporte       INIT 0.00
    DATA cUnidad_medida INIT PADR( FWString( "PIECES" ) )
    DATA cExento        INIT "N"

    DATA nTipo          INIT 0
    DATA nPorc_dscto    INIT 0.00
  DATA nCosto_soporte INIT 0.00
  data nFormato INIT val( LeeIniFile("VENTAS_CONTADO", "CUAL_FORMATO", ".\COMPRAS.INI" ) )

    METHOD New()
    METHOD MakeDialogo()
    METHOD MakeGets()
    METHOD MakeBrwData()
    METHOD MakeSays()
    METHOD MakeGets2()
   METHOD ChkCod_cte()
   METHOD RefreshCliente()
   METHOD Funget1()
   METHOD Funget17()
   METHOD ChkRfc()
   METHOD Siguiente()
   METHOD PideUnidad_medida()
   METHOD ChkCodigo()
   METHOD AddItem()
   METHOD SumaCols()
   METHOD PideCantidad()
   METHOD ChkDescuento()
   METHOD GuardaDatos()
   METHOD AddDetalle()
   METHOD ShowFactura()
   METHOD Teclas()
   METHOD AddProveedor()
ENDCLASS

METHOD New( lEdit , oMain, nFolio,cSerie,cTimbre ) CLASS AbcCompras
    local cQry, oQry
    ::lEdit := lEdit
    ::oMain := oMain
  ::cCia := UPPER( LeeIniFile("DATOS_EMPRESA", "NOMBRE1", ".\SYSCTRL.INI" ) )
  ::cNumero_escuela := UPPER( LeeIniFile("ESCUELA", "NO_ESCUELA", ".\sysctrl.INI" ) )
   
  nFactura := nFolio
  cSerieX   := cSerie
  cTimbrado := cTimbre

   
    cGet_unidad_medida := UPPER( LeeIniFile("CONFIG", "GET_UNIDAD_MEDIDA", ".\SYSCTRL.INI" ) )

    nPorc_ret_isr := val( LeeIniFile("DATOS_EMPRESA", "PORC_RET_ISR", ".\SYSCTRL.INI" ) )
    nPorc_ret_iva := val( LeeIniFile("DATOS_EMPRESA", "PORC_RET_IVA", ".\SYSCTRL.INI" ) )

  cTomar_costo_soporte := LeeIniFile("CONFIG", "TOMAR_COSTO_SOPORTE", ".\SYSCTRL.INI" )

  n15 := val( LeeIniFile("DATOS_EMPRESA", "PORC_IVA", ".\SYSCTRL.INI" ) )
  Remaes():CreaArtics( ::oMain:oCon )
 

    ::MakeDialogo()

RETURN NIL

METHOD MakeDialogo() CLASS AbcCompras
    LOCAL oBrush
    local oFont
    local oBtn := array( 3 )
  local oSelf := Self
   if ::lEdit //nuevo cfdi
      ::nFolio := ::Siguiente()
   else
      ::nFolio := nFactura
   endif

    DEFINE FONT oFont NAME "TAHOMA" SIZE 5,-15

    DEFINE BRUSH oBrush Color nRGB( 219, 255, 119) //FILE ".\BMPS\five.bmp" 

    DEFINE DIALOG ::oBox BRUSH oBrush size 970, 650  FONT oFont //STYLE WS_POPUP
   ::oBox:lTransparent := .t.

   ::MakeGets()
   

   @ 15, 30 BUTTON oBtn[1] PROMPT "&" + FWString("Save Data")  SIZE 80, 24 OF ::oBox ;
       ACTION (  iif( ::GuardaDatos(), ::oBox:End(), ::oBox:setfocus() ) )  //WHEN ::lEdit

   @ 15, 45 BUTTON oBtn[2] PROMPT "&" + FWString("Not Save/Exit") SIZE 80, 24 OF ::oBox;
     ACTION ( ::oBox:end() ) CANCEL
   
   ::oBox:cTitle := FWString("Purchase Invoices")
   
   ::oBox:lHelpIcon := .f.
   if cTimbrado="S" //solo consulta
      oBtn[1]:disable()
   endif
   
   ACTIVATE DIALOG ::oBox CENTERED on init ( iif( oSelf:lEdit ,oSelf:oBox:SetFocus(),oSelf:ShowFactura() ) )

RETURN Nil

METHOD GuardaDatos() CLASS AbcCompras
    local cQry, oFac, nSeek, oArt
    local i
  local lExit := .f.
    local cSerie := cstr2( UPPER( LeeIniFile("DATOS_EMPRESA", "SERIE_FACTURA", ".\SYSCTRL.INI" ) ) )


  if MsgYesNo( FWString("Save data") +" ..?", ::oMain:cUser )

    lExit := .t.

    ::oMain:oCon:BeginTransaction()

        if ::lEdit //nuevo cfdi
        ::nFolio := ::Siguiente()
    else
        ::nFolio := nFactura
    endif   

    * ---------------------- *
    * quitamos los eliminados *

    for i := 1 to len( aItemsDel )

      cQry := "DELETE FROM compras_detalle"
      cQry += " WHERE folio=" + C_SIMPLE + cStr2( aItemsDel[i][1] ) + C_SIMPLE
      cQry += " AND   serie=" + C_SIMPLE + cStr2( aItemsDel[i][2] ) + C_SIMPLE
      cQry += " AND   item =" + C_SIMPLE + cStr2( aItemsDel[i][3] ) + C_SIMPLE
      cQry += " ORDER BY serie,folio,item"
     
      ::oMain:oCon:Execute( cQry )
      sysrefresh()

    NEXT


        for i:= 1 to len( oBrw:aArrayData )
       
            cQry := "SELECT catalogo,linea,planta"
        cQry += " FROM artics"
        cQry += " WHERE catalogo=" + C_SIMPLE + cstr2( oBrw:aArrayData[i][1] ) + C_SIMPLE
        cQry += " ORDER BY catalogo"
        oArt := ::oMain:oCon:Query( cQry )
           
            cQry := "SELECT serie,folio,item"
            cQry += " FROM compras_detalle"
            cQry += " WHERE folio=" + C_SIMPLE + cstr2( ::nFolio ) + C_SIMPLE
            cQry += " AND   serie=" + C_SIMPLE + cStr2( cSerie   ) + C_SIMPLE
            cQry += " AND   item =" + C_SIMPLE + cStr2( i ) + C_SIMPLE
            cQry += " ORDER BY serie,folio,item"
            oQry := ::oMain:oCon:Query( cQry )
            nSeek := oQry:nRecCount
            if nSeek = 0
                cQry := "INSERT INTO compras_detalle SET "     
            else
                cQry := "UPDATE compras_detalle SET "
            endif
            cQry += "folio="    + ClipValue2SQL( ::nFolio ) + ","
            cQry += "serie="    + ClipValue2SQL( cSerie   ) + ","
            cQry += "item="     + ClipValue2SQL( i ) + ","
            cQry += "codigo="   + ClipValue2SQL( oBrw:aArrayData[i][1] ) + ","
            cQry += "cantidad=" + ClipValue2SQL( oBrw:aArrayData[i][2] ) + ","
            cQry += "unidad="   + ClipValue2SQL( oBrw:aArrayData[i][3] ) + ","
            cQry += "nombre="   + ClipValue2SQL( oBrw:aArrayData[i][4] ) + ","
            cQry += "precio_unit=" + ClipValue2SQL( oBrw:aArrayData[i][5] ) + ","
            cQry += "importe="  + ClipValue2SQL( oBrw:aArrayData[i][6] ) + ","
            cQry += "fecha="    + ClipValue2SQL( ::dFecha ) + ","
            cQry += "exento="   + ClipValue2SQL( oBrw:aArrayData[i][7] ) + ","
            cQry += "linea="    + ClipValue2SQL( oArt:linea )
            if nSeek > 0
                cQry += " WHERE folio=" + C_SIMPLE + cstr2( ::nFolio ) + C_SIMPLE
                cQry += " AND   serie=" + C_SIMPLE + cStr2( cSerie   ) + C_SIMPLE
                cQry += " AND   item =" + C_SIMPLE + cStr2( i ) + C_SIMPLE
                cQry += " ORDER by serie,folio,item"
            endif
            ::oMain:oCon:Execute( cQry )

      cQry := "INSERT INTO movtos_inventario SET "
      cQry += "folio="         + ClipValue2SQL( ::nFolio )  + ","
      cQry += "anio="          + ClipValue2SQL( year( date() ) )  + ","
      cQry += "codigo="        + ClipValue2SQL( oBrw:aArrayData[i][1] )  + ","
      cCodigo := oBrw:aArrayData[i][1]
      cQry += "clave_fabrica=" + ClipValue2SQL( oArt:planta )  + ","
      cQry += "linea=" + ClipValue2SQL( oArt:linea )  + ","
      cQry += "descripcion="   + ClipValue2SQL( oBrw:aArrayData[i][4] )  + ","
      cQry += "tipo="          + ClipValue2SQL( 1 )  + "," //1=entradas, 2=salidas
     
        cQry += "cantidad="      + ClipValue2SQL( oBrw:aArrayData[i][2] )  + ","
        cQry += "costo="         + ClipValue2SQL( oBrw:aArrayData[i][5] )  + ","
        cQry += "concepto="      + ClipValue2SQL( "ENTRADAS"  )  + ","
        cQry += "concepto2="      + ClipValue2SQL( "COMPRAS"  )  + ","
        cQry += "referencia="    + ClipValue2SQL( cstr2(::nFolio) )  + ","
        cQry += "fecha="         + ClipValue2SQL( date() ) + ","
        cQry += "usuario="       + ClipValue2SQL( ::oMain:cUser ) + ","
        // cQry += "tipo_mov="       + ClipValue2SQL( ::cTipo_mov ) + ","
        cQry += "cierre="       + ClipValue2SQL( "N" ) + ","
        cQry += "item="          + ClipValue2SQL( i )
        ::oMain:oCon:Execute( cQry )
       
        //Servidor2013

        *Afectamos existencia*
        cQry := "UPDATE artics SET "
        cQry += "existencia=existencia+" + ClipValue2SQL( oBrw:aArrayData[i][2] ) + ","
        cQry += "compras=compras+" + ClipValue2SQL( oBrw:aArrayData[i][2] )

        cQry += " WHERE catalogo=" + C_SIMPLE + alltrim( oBrw:aArrayData[i][1]  ) + C_SIMPLE
        cQry += " ORDER BY catalogo"
        ::oMain:oCon:Execute( cQry )


            oArt:end()
            sysrefresh()
           
        next
       
        cQry := "SELECT serie,folio"
        cQry += " FROM compras"
        cQry += " WHERE folio=" + C_SIMPLE + cstr2( ::nFolio ) + C_SIMPLE
        cQry += " AND   serie=" + C_SIMPLE + cStr2( cSerie   ) + C_SIMPLE
        cQry += " ORDER by serie,folio"
        oQry := ::oMain:oCon:Query( cQry )
        nSeek := oQry:nRecCount
        if nSeek = 0
            cQry := "INSERT INTO compras SET "     
        else
            cQry := "UPDATE compras SET "
        endif
        cQry += "folio="    + ClipValue2SQL( ::nFolio ) + ","
        cQry += "serie="    + ClipValue2SQL( cSerie   ) + ","
        cQry += "fecha="    + ClipValue2SQL( ::dFecha   ) + ","
        cQry += "hora="     + ClipValue2SQL( time()   ) + ","
    cQry += "forma_pago="     + ClipValue2SQL( "PAGO EN UNA SOLA EXHIBICIÓN"   ) + ","
        cQry += "cliente="  + ClipValue2SQL( ::cRfc   ) + ","
        cQry += "nombre="   + ClipValue2SQL( ::cNombre   ) + ","
        cQry += "calle="    + ClipValue2SQL( ::cCalle   ) + ","
        cQry += "no_exterior="    + ClipValue2SQL( ::cNo_exterior   ) + ","
    cQry += "no_interior="    + ClipValue2SQL( ::cNo_Interior   ) + ","
    cQry += "colonia="    + ClipValue2SQL( ::cColonia   ) + ","
    cQry += "localidad="    + ClipValue2SQL( ::cLocalidad   ) + ","
    cQry += "municipio="    + ClipValue2SQL( ::cMunicipio   ) + ","
    cQry += "estado="    + ClipValue2SQL( ::cEstado   ) + ","
    cQry += "codigo_postal="    + ClipValue2SQL( ::cCodigo_postal   ) + ","
    cQry += "pais="    + ClipValue2SQL( ::cPais   ) + ","
    cQry += "subtotal="    + ClipValue2SQL( ::nSubtotal   ) + ","
    cQry += "descuento="    + ClipValue2SQL( ::nDescuento  ) + ","
    cQry += "porc_iva="    + ClipValue2SQL( n15   ) + ","
    cQry += "iva="    + ClipValue2SQL( ::nIva   ) + ","
    cQry += "total="    + ClipValue2SQL( ::nTotal   ) + ","
   
    cQry += "moneda="    + ClipValue2SQL( ::cMoneda   ) + ","
    cQry += "semana="   + ClipValue2SQL( ::nSemana   ) + ","
    cQry += "venta_inicial="   + ClipValue2SQL( ::nVenta_inicial   ) + ","
    cQry += "venta_final="   + ClipValue2SQL( ::nVenta_final   ) + ","
    cQry += "nom_usuario="   + ClipValue2SQL( ::oMain:cUserName   ) + ","
    cQry += "exento="   + ClipValue2SQL( ::nExento   ) + ","
    cQry += "redondeo="   + ClipValue2SQL( ::nRedondeo   ) + ","
    cQry += "impuesto="   + ClipValue2SQL( ::nImpuesto   ) + ","
    cQry += "usuario="   + ClipValue2SQL( ::oMain:cUser   ) + ","
    cQry += "cod_cte="   + ClipValue2SQL( ::nCod_cte   ) + ","
    cQry += "importe_isr="   + ClipValue2SQL( ::nIsr   ) + ","
    cQry += "importe_ret="   + ClipValue2SQL( ::nRetencion   ) + ","
    cQry += "timbrado="   + ClipValue2SQL( "N" ) + ","
    cQry += "venta_total="   + ClipValue2SQL( ::nVenta_total ) + ","
    cQry += "cantidad_descuento="   + ClipValue2SQL( ::nDescuento   ) + ","

    cQry += "porc_descuento="   + ClipValue2SQL( ::nPorc_dscto  )
    if nSeek > 0
      cQry += " WHERE folio=" + C_SIMPLE + cstr2( ::nFolio ) + C_SIMPLE
      cQry += " AND   serie=" + C_SIMPLE + cStr2( cSerie   ) + C_SIMPLE
      cQry += " ORDER by serie,folio"

    endif
   
    ::oMain:oCon:Execute( cQry )

    ::AddProveedor()
    ::oMain:oCon:CommitTransaction()

  IF lExit
    if ::nFormato=0
      //esto es para version spanish
      //RemisionCompras():New( ::oCon, ::nFolio )
    elseif ::nFormato=2
      InvoicePurchase():New( ::oMain:oCon, ::nFolio )
    else //tickets
      //Ventas1():New( ::oCon, ::nFolio )
    endif
  endif

       
       
    endif
   
RETURN lExit


METHOD AddProveedor() CLASS AbcCompras
    local cQry, oQry
   cQry := "SELECT cod_cte"
   cQry += " FROM proveedores"
   cQry += " WHERE cod_cte=" + C_SIMPLE + cstr2( ::nCod_cte ) + C_SIMPLE
   cQry += " ORDER BY cod_cte"
   oQry := ::oMain:oCon:Query( cQry )
   nSeek := oQry:nRecCount
   oQry:end()
   if nSeek = 0
      cQry := "INSERT INTO proveedores SET "  
   else  
      cQry := "UPDATE proveedores SET "    
   endif
   cQry += "cod_cte="       + ClipValue2SQL( ::nCod_cte   )       + ","
   cQry += "cliente="       + ClipValue2SQL( ::cRfc   )           + ","
   cQry += "nombre="        + ClipValue2SQL( ::cNombre   )        + ","
   cQry += "calle="         + ClipValue2SQL( ::cCalle   )         + ","
   cQry += "no_exterior="   + ClipValue2SQL( ::cNo_exterior   )   + ","
   cQry += "no_interior="   + ClipValue2SQL( ::cNo_Interior   )   + ","
   cQry += "colonia="       + ClipValue2SQL( ::cColonia   )       + ","
   cQry += "localidad="     + ClipValue2SQL( ::cLocalidad   )     + ","
   cQry += "municipio="     + ClipValue2SQL( ::cMunicipio   )     + ","
   cQry += "estado="        + ClipValue2SQL( ::cEstado   )        + ","
   cQry += "codigo_postal=" + ClipValue2SQL( ::cCodigo_postal   ) + ","
   cQry += "pais="          + ClipValue2SQL( ::cPais   )          + ","
   if nSeek = 0
      cQry += "fecha_alta="  + ClipValue2SQL( ::dFecha  ) + ","
   endif
   cQry += "borrado="  + ClipValue2SQL( "N"   )
   IF nSeek > 0
      cQry += " WHERE cod_cte=" + C_SIMPLE + cstr2( ::nCod_cte ) + C_SIMPLE
   endif

   ::oMain:oCon:Execute( cQry )

RETURN NIL

METHOD Siguiente() CLASS AbcCompras
   local nFolio
   local oQry := ::oMain:oCon:Query( "SELECT folio FROM compras ORDER BY folio")
   oQry:Gobottom()
   nFolio := oQry:folio+1
RETURN nFolio

METHOD MakeGets() CLASS AbcCompras
    local nRow := 10
    local nCol := 10
    local nSt := 15
    local nSalto := 12

    oGet := array(20)
    oSay := array(10)

    @ nRow, nCol SAY "* [ F2.sel. ]"+ FWString("Provider Code") OF ::oBox pixel
   @ nRow+10, nCol GET oGet[ 1 ] VAR ::nCod_cte of ::oBox ;
   SIZE 60, 10  PICTURE "9999999" PIXEL ;
   valid ::ChkCod_cte()
   oGet[1]:bKeyDown := { | nKey | ::FunGet1( nKey )  }  
   nCol += nSt*5

   @ nRow, nCol SAY "* " + FWString("TAX ID") OF ::oBox pixel
   @ nRow+10, nCol GET oGet[ 2 ] VAR ::cRfc of ::oBox ;
   SIZE 60, 10  PICTURE "@!K" PIXEL valid ::ChkRfc()  
   nCol += nSt*5

   @ nRow, nCol SAY "*" + FWString("Company/Name") OF ::oBox pixel
   @ nRow+10, nCol GET oGet[ 3 ] VAR ::cNombre of ::oBox ;
   SIZE 194, 10  PICTURE "@K!" PIXEL valid !Empty( ::cNombre )
   nCol += nSt*5

   nRow += nSalto*1.7
   nCol := 10

   @ nRow, nCol SAY "* " + FWString("Street address") OF ::oBox pixel
   @ nRow+10, nCol GET oGet[ 4 ] VAR ::cCalle of ::oBox ;
   SIZE 200, 10  PICTURE "@!K" PIXEL valid !Empty( ::cCalle)
   nCol += nSt*14

   @ nRow, nCol SAY "* " + FWString("Number Outside") OF ::oBox pixel
   @ nRow+10, nCol GET oGet[ 5 ] VAR ::cNo_exterior of ::oBox ;
   SIZE 60, 10  PICTURE "@!K" PIXEL  
   nCol += nSt*5

   @ nRow, nCol SAY "* " + FWString("Interior number") OF ::oBox pixel
   @ nRow+10, nCol GET oGet[ 6 ] VAR ::cNo_Interior of ::oBox ;
   SIZE 60, 10  PICTURE "@!K" PIXEL  
   nCol += nSt*5

   nRow += nSalto*1.7
   nCol := 10

   @ nRow, nCol SAY "* " + FWString("Address") OF ::oBox pixel
   @ nRow+10, nCol GET oGet[ 7 ] VAR ::cColonia of ::oBox ;
   SIZE 120, 10  PICTURE "@!K" PIXEL valid !Empty( ::cColonia )
   nCol += nSt*8.1

   @ nRow, nCol SAY "* " + FWString("City") OF ::oBox pixel
   @ nRow+10, nCol GET oGet[ 8 ] VAR ::cLocalidad of ::oBox ;
   SIZE 120, 10  PICTURE "@!K" PIXEL
   nCol += nSt*8.1

   @ nRow, nCol SAY "* " + FWString("Municipality") OF ::oBox pixel
   @ nRow+10, nCol GET oGet[ 9 ] VAR ::cMunicipio of ::oBox ;
   SIZE 102, 10  PICTURE "@!K" PIXEL
   nCol += nSt*8.1

   nRow += nSalto*1.7
   nCol := 10

   @ nRow, nCol SAY "* " + FWString("State") OF ::oBox pixel
   @ nRow+10, nCol GET oGet[ 10 ] VAR ::cEstado of ::oBox ;
   SIZE 120, 10  PICTURE "@!K" PIXEL
   nCol += nSt*8.1

   @ nRow, nCol SAY "* " + FWString("ZIP") OF ::oBox pixel
   @ nRow+10, nCol GET oGet[ 11 ] VAR ::cCodigo_postal of ::oBox ;
   SIZE 60, 10  PICTURE "@!K" PIXEL
   nCol += nSt*5

   /*@ nRow, nCol SAY "* Venta Inicial" OF ::oBox pixel
   @ nRow+10, nCol GET oGet[ 12 ] VAR ::nVenta_inicial of ::oBox ;
   SIZE 60, 10  PICTURE "9999999" PIXEL
   nCol += nSt*5

   @ nRow, nCol SAY "* Venta Final" OF ::oBox pixel
   @ nRow+10, nCol GET oGet[ 13 ] VAR ::nVenta_final of ::oBox ;
   SIZE 60, 10  PICTURE "9999999" PIXEL VALID ::AddDetalle() // WHEN ::lEdit
   nCol += nSt*5*/


   nRow += nSalto*1.7
   nCol := 10

   @ nRow, 10 SAY FWString( "Type of Currency" ) OF ::oBox pixel
   @ nRow+10, 10 COMBOBOX oGet[14] VAR ::cMoneda ITEMS AMONEDAS OF ::oBox  ;
            PIXEL SIZE 60, 200 UPDATE STYLE CBS_DROPDOWNLIST

   nCol += nSt*5

   @ nRow, nCol SAY "* " + FWString("Order No") OF ::oBox pixel
   @ nRow+10, nCol GET oGet[ 15 ] VAR ::nFolio of ::oBox ;
   SIZE 60, 10  PICTURE "9999999" PIXEL
   nCol += nSt*5

  //@ nRow, nCol SAY "Semana" OF ::oBox pixel
  // @ nRow+10, nCol GET oGet[ 16 ] VAR ::nSemana of ::oBox ;
  // SIZE 60, 10  PICTURE "99" PIXEL
  // nCol += nSt*5

   @ nRow, nCol SAY "* " + FWString("Date") OF ::oBox pixel
   @ nRow+10, nCol DTPICKER oGet[17] VAR ::dFecha OF ::oBox SIZE 60, 12 PIXEL
   /*@ nRow+10, nCol GET oGet[ 16 ] VAR ::dFecha of ::oBox ;
   SIZE 50, 10  PICTURE "d" PIXEL*/

   nCol += nSt*5

   ::MakeGets2()

   nRow += nSalto*1.7
   nCol := 10

   ::MakeBrwData( nRow )

   ::MakeSays()

RETURN NIL

//204652 to 204752, 201045 to 204651
METHOD AddDetalle() CLASS AbcCompras
   local cQry,oQry
   local oWait
   local nAt,i
   local nUno15 := 1+ (n15/100)

   if ::nVenta_final=0
      return .t.
   endif
   if ! ::lEdit
      return .t.
   endif

   if ! GETASYNCKEY( VK_RETURN)
    RETURN .t.
   endif


   cQry := "SELECT folio,semana"
   cQry += " FROM notas"
   cQry += " WHERE folio>=" + C_SIMPLE + cStr2( ::nVenta_inicial ) + C_SIMPLE
   cQry += " AND folio<=" + C_SIMPLE + cStr2( ::nVenta_final ) + C_SIMPLE
   cQry += " ORDER BY folio LIMIT 1"
   oQry := ::oMain:oCon:Query( cQry )
   IF oQry:nRecCount > 0
      ::nSemana := oQry:semana
   endif
   oQry:end()

   WAITON( space( 40 ), @oWait )

   ASize( oBrw:aArrayData, 0 )
   oBrw:refresh()
   oBrw:SetFocus()

   cQry := "SELECT folio, codigo,cantidad,descripcion,"
   cQry += "prec_unit,importe,linea,exento_iva"
   cQry += " FROM notas_detalle"

   cQry += " WHERE folio>=" + C_SIMPLE + cStr2( ::nVenta_inicial ) + C_SIMPLE
   cQry += " AND folio<=" + C_SIMPLE + cStr2( ::nVenta_final ) + C_SIMPLE
   cQry += " ORDER BY folio"
   oQry := ::oMain:oCon:Query( cQry )
   oQry:GoTop()
   while ! oQry:Eof()
      oWait:say( 1, 1, "Agregando partidas a la factura: " + cStr2( oQry:folio ) )
      if !empty( oQry:descripcion  )
        nAt := ascan( oBrw:aArrayData, {|aT | aT[1]=oQry:codigo } )
        if nAt = 0
           AADD( oBrw:aArrayData, { oQry:codigo      ,;
                                  oQry:cantidad    ,;
                                  "PIEZAS"         ,;
                                  oQry:descripcion ,;
                                  oQry:prec_unit   ,;
                                  oQry:importe     ,;
                                  oQry:exento_iva } )
           oBrw:refresh()
        else
           oBrw:aArrayData[nAt][2] += oQry:cantidad
           oBrw:aArrayData[nAt][6] += ROUND( oQry:importe, NDEC )
        endif

      ENDIF

      sysrefresh()
      oQry:skip()
   end
   oQry:end()

   //if ! "TORMENTA" $ ::cCia

   for i := 1 to len( oBrw:aArrayData )
      oWait:say( 2, 1, "Reg: " + cStr2( i ) )
      if oBrw:aArrayData[i][7]<>"S"
         oBrw:aArrayData[i][6] := ROUND( oBrw:aArrayData[i][6]/nUno15, NDEC )
         oBrw:aArrayData[i][5] := ROUND( oBrw:aArrayData[i][6]/oBrw:aArrayData[i][2], NDEC )
      else
        oBrw:aArrayData[i][5] := ROUND( oBrw:aArrayData[i][6]/oBrw:aArrayData[i][2], NDEC )
      endif
      sysrefresh()
   next

   //endif

   cQry := "SELECT sum(redondeo) FROM notas"
   cQry += " WHERE folio>=" + C_SIMPLE + cStr2( ::nVenta_inicial ) + C_SIMPLE
   cQry += " AND folio<=" + C_SIMPLE + cStr2( ::nVenta_final ) + C_SIMPLE
   cQry += " ORDER BY folio"
   oQry := ::oMain:oCon:Query( cQry )
   IF oQry:fieldget(1) <> 0
      ::nRedondeo := oQry:fieldget(1)
     
      AADD( oBrw:aArrayData, { "AJUSTE"      ,;
                                  1    ,;
                                  "PIEZAS"         ,;
                                  "AJUSTE POR REDONDEO" ,;
                                  oQry:fieldget(1)   ,;
                                  oQry:fieldget(1)     ,;
                                  "S" } )
     
   endif
   oQry:end()


   WAITOFF( @oWait )
   IF LEN( oBrw:aArrayData ) = 0

      AADD( oBrw:aArrayData, { CCODIGO      ,;
                                  NCANTIDAD    ,;
                                  CUNIDAD         ,;
                                  CDESCRIPCION ,;
                                  NPRECIO   ,;
                                  NIMPORTE    ,;
                                  CEXENTO } )
   
   ENDIF
   ::SumaCols()

   for i := 1 to len( oGet )
    if oGet[i] != nil
      oGet[i]:refresh()
    endif
  next

   oBrw:refresh()
   oBrw:SetFocus()


RETURN .t.

METHOD ShowFactura() CLASS AbcCompras
   local cQry,oQry
   local oWait
   local nAt,i
   local nUno15 := 1+ (n15/100)

   cQry := "SELECT serie,folio,fecha,semana,cliente,nombre,calle,"
   cQry += "no_exterior,no_interior,colonia,localidad,municipio,"
   cQry += "estado,codigo_postal,venta_inicial,venta_final,cod_cte,moneda,"
   cQry += "cod_alumno,nombre_alumno,curp,nivel_educativo,numero_escuela"
   cQry += " FROM compras"
   cQry += " WHERE folio=" + C_SIMPLE + cStr2( nFactura ) + C_SIMPLE
   cQry += " AND serie=" + C_SIMPLE + cStr2( cSerieX ) + C_SIMPLE
   cQry += " ORDER BY folio LIMIT 1"

   oQry := ::oMain:oCon:Query( cQry )
   
   ::nSemana      := oQry:semana
   ::nCod_cte     := oQry:cod_cte
   ::cRfc         := oQry:cliente
   ::cNombre      := oQry:nombre
   ::cCalle       := oQry:calle
   ::cNo_exterior := oQry:no_exterior
   ::cNo_interior := oQry:no_interior
   ::cColonia     := oQry:colonia
   ::cLocalidad   := oQry:localidad
   ::cMunicipio   := oQry:municipio
   ::cEstado      := oQry:estado
   ::cCodigo_postal := oQry:codigo_postal
   ::nVenta_inicial := oQry:venta_inicial
   ::nVenta_final   := oQry:venta_final
   ::cMoneda        := oQry:moneda
   ::dFecha         := oQry:fecha

   ::nCod_alumno    := oQry:cod_alumno
   ::cNombre_alumno := oQry:nombre_alumno
   ::cCurp          := oQry:curp
   ::cNivel_educativo := oQry:nivel_educativo
   ::cNumero_escuela  := oQry:numero_escuela

   oQry:end()
   for i := 1 to len( oGet )
      if oGet[i] != NIL
         oGet[i]:Refresh()
      endif
   next

   WAITON( space( 40 ), @oWait )

   ASize( oBrw:aArrayData, 0 )
   oBrw:refresh()

   cQry := "SELECT folio, codigo,cantidad,nombre,"
   cQry += "precio_unit,importe,linea,exento,unidad,item"
   cQry += " FROM compras_detalle"
   cQry += " WHERE folio=" + C_SIMPLE + cStr2( nFactura ) + C_SIMPLE
   cQry += " AND serie=" + C_SIMPLE + cStr2( cSeriex ) + C_SIMPLE
   cQry += " ORDER BY folio"
   oQry := ::oMain:oCon:Query( cQry )
   oQry:GoTop()
   while ! oQry:Eof()
     
      oWait:say( 1, 1, "Agregando partidas a la factura: " + cStr2( oQry:folio ) )

      AADD( oBrw:aArrayData, { oQry:codigo      ,;
                                  oQry:cantidad    ,;
                                  oQry:unidad         ,;
                                  oQry:nombre ,;
                                  oQry:precio_unit   ,;
                                  oQry:importe     ,;
                                  oQry:exento  ,;
                                  oQry:item } )
      if "AJUSTE POR REDONDEO" $ oQry:nombre
        ::nRedondeo := oQry:importe
      endif
      sysrefresh()
      oQry:skip()
   end
   oQry:end()

   WAITOFF( @oWait )

   IF LEN( oBrw:aArrayData ) = 0

      AADD( oBrw:aArrayData, { CCODIGO      ,;
                               NCANTIDAD    ,;
                               CUNIDAD      ,;
                               CDESCRIPCION ,;
                               NPRECIO      ,;
                               NIMPORTE     ,;
                               CEXENTO      ,;
                               NRECNO } )
   
   ENDIF

   ::SumaCols()

   for i := 1 to len( oGet )
    if oGet[i] != nil
      oGet[i]:refresh()
    endif
  next

   oBrw:refresh()


RETURN .t.

method Funget1( nKey, oBox ) class AbcCompras
   local cQry, oQry,nSeek,i

   if nKey = VK_F2
      ::nCod_cte := CatalogoProveedores():New( ::oMain:oCon )

      cQry := "SELECT cod_cte,cliente,nombre,calle,colonia,localidad,municipio,"
      cQry += "estado,pais,codigo_postal,telefono,no_exterior,no_interior,"
      cQry += "retencion_isr,retencion_iva,costo_soporte"
      cQry += " FROM proveedores"
      cQry += " WHERE cod_cte=" + C_SIMPLE + cstr2( ::nCod_cte ) + C_SIMPLE
      cQry += " ORDER BY cod_cte"
      oQry := ::oMain:oCon:Query( cQry )
      nSeek := oQry:nRecCount
      if nSeek > 0
         ::RefreshCliente( oQry )
      endif
      oQry:end()

  ENDIF
RETURN NIL

METHOD ChkCod_cte() CLASS AbcCompras
   local cQry, oQry,nSeek,i
   cQry := "SELECT cod_cte,cliente,nombre,calle,colonia,localidad,municipio,"
   cQry += "estado,pais,codigo_postal,telefono,no_exterior,no_interior,"
   cQry += "retencion_isr,retencion_iva,costo_soporte"
   cQry += " FROM proveedores"
   cQry += " WHERE cod_cte=" + C_SIMPLE + cstr2( ::nCod_cte ) + C_SIMPLE
   cQry += " ORDER BY cod_cte"
   oQry := ::oMain:oCon:Query( cQry )
   nSeek := oQry:nRecCount
   if nSeek > 0
      ::RefreshCliente( oQry )
   endif
   oQry:end()

RETURN .t.

METHOD ChkRfc() CLASS AbcCompras
   local cQry, oQry,nSeek,i
   cQry := "SELECT cod_cte,cliente,nombre,calle,colonia,localidad,municipio,"
   cQry += "estado,pais,codigo_postal,telefono,no_exterior,no_interior,"
   cQry += "retencion_isr,retencion_iva,costo_soporte"
   cQry += " FROM proveedores"
   cQry += " WHERE cod_cte=" + C_SIMPLE + cstr2( ::nCod_cte ) + C_SIMPLE
   cQry += " AND cliente=" + C_SIMPLE + cstr2( ::cRfc ) + C_SIMPLE
   cQry += " ORDER BY cliente"
   oQry := ::oMain:oCon:Query( cQry )
   nSeek := oQry:nRecCount
   if nSeek > 0
      ::nCod_cte := oQry:cod_cte
      ::RefreshCliente( oQry )
   endif
   oQry:end()

RETURN .t.

METHOD RefreshCliente( oQry ) CLASS AbcCompras
   ::cRfc           := oQry:cliente
   ::cNombre        := oQry:nombre
   ::cCalle         := oQry:calle
   ::cNo_exterior   := oQry:no_exterior
   ::cNo_Interior   := oQry:no_interior
   ::cColonia       := oQry:colonia
   ::cLocalidad     :=   oQry:localidad
   ::cMunicipio     :=   oQry:municipio
   ::cEstado        :=   oQry:estado
   ::cCodigo_postal := oQry:codigo_postal
   ::cPais          := "MÉXICO"  
   ::cCalcula_ret_isr := oQry:retencion_isr
   ::cCalcula_ret_iva := oQry:retencion_iva
   ::nCosto_soporte   := oQry:costo_soporte
   for i := 1 to len( oGet )
      if oGet[i] != Nil
         oGet[i]:Refresh()
      endif
   next

RETURN NIL

METHOD MakeGets2() CLASS AbcCompras
    LOCAL nRow := 230
    LOCAL nST  := 15
    LOCAL nCol := 10
   local oBtn

    @ nRow, nCol SAY "[F2] " + FWString("Code") OF ::oBox pixel
   @ nRow+10, nCol GET oGet[ 17 ] VAR ::cCodigo of ::oBox ;
   SIZE 60, 12  PICTURE "@!k" PIXEL ;
   VALID ::ChkCodigo()
   nCol += nSt*4.1

   oGet[17]:bKeyDown := { | nKey | ::FunGet17( nKey )  }  

   @ nRow, nCol SAY FWString("Description") OF ::oBox pixel
   @ nRow+10, nCol GET oGet[ 18 ] VAR ::cDescripcion of ::oBox ;
   SIZE 150, 12  PICTURE "@!k" PIXEL
   nCol += nSt*10.3
   @ nRow, nCol SAY FWString("Price Unit") OF ::oBox pixel
   @ nRow+10, nCol GET oGet[ 19 ] VAR ::nPrecio PICTURE "999,999.99999" of ::oBox ;
   SIZE 50, 12  PIXEL
   nCol += nSt*3.5
   @ nRow, nCol SAY FWString("Quantity") OF ::oBox pixel
   @ nRow+10, nCol GET oGet[ 20 ] VAR ::nCantidad PICTURE "999,999.999" of ::oBox ;
   SIZE 30, 12 PIXEL
   nCol += nSt*2.5
   @ nRow, nCol BUTTONBMP oBtn OF ::oBox ACTION ::AddItem() ;
      BITMAP ".\bmps\yes.bmp" PROMPT "O.K." TEXTRIGHT PIXEL SIZE 40, 20

RETURN NIL

method Funget17( nKey ) class AbcCompras
   local cQry, oQry,nSeek,i

   if nKey = VK_F2

      ::cCodigo := BuscaProductos():New( ::oMain:oCon )

      cQry := "SELECT catalogo, nombre"
      cQry += " FROM artics"
      cQry += " WHERE catalogo=" + C_SIMPLE + cstr2( ::cCodigo ) + C_SIMPLE
      cQry += " ORDER BY catalogo"
      oQry := ::oMain:oCon:Query( cQry )
      nSeek := oQry:nRecCount
      if nSeek > 0
        ::cDescripcion := oQry:nombre
      endif
      oQry:end()
      oGet[17]:refresh()
      oGet[18]:refresh()
  ENDIF
RETURN NIL

METHOD AddItem() CLASS AbcCompras
  local i
  LOCAL nIva := 0

  try
    if EMPTY( ATail( aData )[4] )
      ASize( aData, Len( oBrw:aArrayData ) - 1 )
    endif
  CATCH
  * ...
  end
  oBrw:refresh()

  ::nImporte    := Round( ::nPrecio * ::nCantidad , NDEC)

  if ::nImporte = 0
      ::nCantidad := 0
  endif
  aadd( oBrw:aArrayData, { ::cCodigo,;
                           ::nCantidad ,;
                           ::cUnidad_medida,;
                           ::cDescripcion  ,;
                           ::nPrecio ,;
                           ::nImporte,;
                           ::cExento, 0 } )
  //oBrw:MakeTotals()
  oBrw:GoDown()
  oBrw:refresh()

  ::cCodigo   := space( 15 )
  ::cDescripcion    := space( 60 )
  ::nCantidad   := 1
  ::nPrecio     := 0
  ::nImporte    := 0
  ::cExento     := ""

  for i := 1 to len( oGet )
    if oGet[i] != nil
      oGet[i]:refresh()
    endif
  next

  ::SumaCols()

  oGet[17]:SetFocus()

RETURN .t.

METHOD SumaCols() CLASS AbcCompras
   local i
   nTot1 := 0
   nTot2 := 0
   for i:= 1 to len( oBrw:aArrayData )
      if oBrw:aArrayData[i][7] = "S"
         nTot1 += Round( oBrw:aArrayData[i][6] ,NDEC)
      ELSE
         nTot2 += Round( (oBrw:aArrayData[i][6]) ,NDEC)
      ENDIF
   next
   ::nExento := nTot1
   ::nImpuesto := nTot2
   ::nVenta_total := ROUND( ::nExento + ::nImpuesto, NDEC )
   if ::nTipo > 0
      ::PideCantidad()
      ::ChkDescuento()
   endif
   
   ::nSubtotal := ROUND( ::nVenta_total-::nDescuento, NDEC )

   ::nIva := ROUND( (::nSubtotal-::nExento) * ( N15/100 ), NDEC )

   if ::cCalcula_ret_isr = "S"
      ::nIsr := ROUND( ::nSubtotal * ( nPorc_ret_isr /100 ), NDEC )
   ENDIF

   if ::cCalcula_ret_iva = "S"
      ::nRetencion := ROUND( ::nSubtotal * ( nPorc_ret_iva /100 ), 6 )
   ENDIF

   ::nTotal := ROUND( ::nSubtotal+::nIva-::nIsr-::nRetencion, NDEC )

   for i := 1 to len( oSay )
      if oSay[i] != nil
         oSay[i]:Refresh()
      endif
   next
   ::nTipo := 0
return nil

METHOD ChkDescuento() CLASS AbcCompras
  IF ::nTipo = 1 //por importe
    ::nDescuento := ROUND( nAmount, NDEC )
    ::nPorc_dscto := 0
  ELSEIF ::nTipo = 2 //por porcentaje
    ::nDescuento := ROUND( ::nVenta_total*( nAmount/100 ), NDEC )
    ::nPorc_dscto := nAmount
  endif
RETURN NIL

METHOD PideCantidad() CLASS AbcCompras
   local cPass := ""
   local cSay := iif( ::nTipo=1, "Importe a descontar:", "%Porcentaje a aplicar" )
   local nVar := 0
   local cPic := iif( ::nTipo=1, "999,999.99", "99.99%")
   

   if _MsgGet( "APLICAR DESCUENTO ?", cSay, @nVar, "hand", cPic, .f. , cPass )
      nAmount := nVar
   endif  
RETURN NIL

METHOD ChkCodigo() CLASS AbcCompras
   local cQry, oQry, nSeek
   local i
   if empty( ::cCodigo )
      return .t.
   endif
   cQry := "SELECT catalogo,nombre,precio_chica,exento_iva,unidad_medida"
   cQry += " FROM artics"
   cQry += " WHERE catalogo=" + C_SIMPLE + cstr2( ::cCodigo ) + C_SIMPLE
   cQry += " ORDER BY catalogo"
   oQry := ::oMain:oCon:Query( cQry )
   nSeek := oQry:nRecCount

   if nSeek > 0
      ::cDescripcion := oQry:nombre
      ::nCantidad := 1
      ::nPrecio   := oQry:precio_chica
      ::cExento   := oQry:exento_iva
      ::cUnidad_medida := oQry:unidad_medida
     
   endif
   oQry:end()
   if cGet_unidad_medida = "S"
      ::PideUnidad_medida()
   endif

   if ! empty( ::cUnidad_medida ) .and. "SERVICIO" $ ::cUnidad_medida ;
    .and. UPPER( cTomar_costo_soporte ) = "S"
    if ::nCosto_soporte > 0
        ::nPrecio := ::nCosto_soporte
      endif

   endif
   for i := 17 to 20
      oGet[i]:Refresh()
   next
  if empty( ::cUnidad_medida )  
    ::cUnidad_medida := PADR(FWString( "PIECES" ))
    //? "::: NO PROCEDE EL PROD. DEBE DE TENER UNIDAD DE MEDIDA ::: "
  ENDIF
RETURN .T.

METHOD PideUnidad_medida() CLASS AbcCompras
   local oBtn, oGet, oFont

   DEFINE FONT oFont NAME "TAHOMA" SIZE 10,-20

   DEFINE DIALOG oDlg font oFont

   @ 10, 10 SAY "Unidad de medida: " OF oDlg pixel
   @ 20, 10 COMBOBOX oGet VAR ::cUnidad_medida ITEMS AMEDIDAS OF oDlg  ;
            PIXEL SIZE 120, 200 UPDATE STYLE (CBS_DROPDOWN )

   oGet:oGet:bValid = { || MsgBeep(), .T. }

   @ 50, 30 BUTTON oBtn PROMPT "Aceptar"  SIZE 60, 24 OF oDlg ;
       ACTION ( oDlg:end() ) PIXEL

   ACTIVATE DIALOG oDlg CENTERED
RETURN NIL

METHOD MakeSays() CLASS AbcCompras
    local nRow := 5
    local nSt := 15
    local nCol :=  nST*24.5
    local oFont2,oFont3
    local nSalto := 12
    local cPic := "$999,999.99"

    DEFINE FONT oFont2 NAME "TAHOMA" SIZE 10,-20 bold
    DEFINE FONT oFont3 NAME "TAHOMA" SIZE 15,-25 bold

    @ nRow, nCol SAY FWString("Tax Of")+": " + transform(n15,"99.99%") ;
   OF ::oBox pixel font oFont2

   nRow += nSalto
   @ nRow,nCol SAY oSay[1] PROMPT transform( ::nImpuesto,cPic) ;
   OF ::oBox SIZE 100,14 FONT oFont2 PIXEL COLOR CLR_HRED,CLR_YELLOW BORDER
   nRow += nSalto*1.5

   @ nRow, nCol SAY "+ " + FWString("No Tax") OF ::oBox pixel font oFont2

   nRow += nSalto
   @ nRow,nCol SAY oSay[2] PROMPT transform( ::nExento,cPic) ;
   OF ::oBox SIZE 100,14 FONT oFont2 PIXEL COLOR CLR_HRED,CLR_YELLOW BORDER
   nRow += nSalto*1.5

   @ nRow, nCol SAY "=Sub. Total 1" OF ::oBox pixel font oFont2
   nRow += nSalto
   @ nRow,nCol SAY oSay[3] PROMPT transform( ::nVenta_total,cPic) ;
   OF ::oBox SIZE 100,14 FONT oFont2 PIXEL COLOR CLR_HBLUE,CLR_YELLOW BORDER
   nRow += nSalto*1.5

   @ nRow, nCol SAY "- " + FWString("Discount") OF ::oBox pixel font oFont2
   nRow += nSalto
   @ nRow,nCol SAY oSay[4] PROMPT transform( ::nDescuento,cPic) ;
   OF ::oBox SIZE 100,14 FONT oFont2 PIXEL COLOR CLR_HBLUE,CLR_YELLOW BORDER
   nRow += nSalto*1.5

   @ nRow, nCol SAY "=Subtotal 2" OF ::oBox pixel font oFont2
   nRow += nSalto
   @ nRow,nCol SAY oSay[5] PROMPT transform( ::nSubtotal,cPic) ;
   OF ::oBox SIZE 100,14 FONT oFont2 PIXEL COLOR CLR_HBLUE,CLR_YELLOW BORDER
   nRow += nSalto*1.5

   @ nRow, nCol SAY "+ " + FWString("Tax") OF ::oBox pixel font oFont2
   nRow += nSalto
   @ nRow,nCol SAY oSay[6] PROMPT transform( ::nIva,cPic) ;
   OF ::oBox SIZE 100,14 FONT oFont2 PIXEL COLOR CLR_GREEN,CLR_YELLOW BORDER
   nRow += nSalto*1.5

   @ nRow, nCol SAY FWString("Total to pay") OF ::oBox pixel font oFont2 COLOR CLR_HMAGENTA
   nRow += nSalto
   @ nRow,nCol-10 SAY oSay[10] PROMPT transform( ::nTotal,"$9,999,999.99") ;
   OF ::oBox SIZE 150,20 FONT oFont3 PIXEL COLOR CLR_HMAGENTA,CLR_YELLOW BORDER
   nRow += nSalto*1.5


RETURN NIL

Method MakeBrwData( nRow ) class AbcCompras
  aData := { { CCODIGO,;
               NCANTIDAD,;
               CUNIDAD,;
               CDESCRIPCION         ,;
               NPRECIO,;
               NIMPORTE,;
               CEXENTO ,;
               NRECNO } }

  //if ! ::lEdit
  //  ::ShowFactura()
  //endif              

  @ nRow+10,10 XBROWSE oBrw SIZE -140,-100 PIXEL OF ::oBox ;
      DATASOURCE aData ;
      COLUMNS 1, 2, 3, 4,5,6,7,8 ;
      HEADERS FWString("Code"),;
              FWString("Quantity"),;
              FWString("Unit"),;
              FWString("Description"),;
              FWString("Price"),;
              FWString( "Amount" ),;
              FWString("Tax"),"Reg." ;
      PICTURES "@!k", "999999", "@!k", "@!k","999,999.99999",;
      "999,999.99999","@!k","999999" ;
      COLSIZES 90, 60, 80,175,90,90,60,60;
      CELL LINES FOOTERS NOBORDER //FASTEDIT

  // oBrw:bLDblClick := {|| ::PideCantidad(), oBrw:refresh(), oBrw:setfocus() }
  oBrw:nStretchCol         := STRETCHCOL_LAST

  oBrw:lFooter      := .t.
  // oBrw:aCols[ 3 ]:cFooter := "Cant. PIEZAS ...:"
  oBrw:bClrHeader := {|| { nRGB(140, 0, 0), nRGB( 231, 242, 255 ), } }
  oBrw:bClrFooter := oBrw:bClrHeader

  oBrw:nMarqueeStyle    = MARQSTYLE_HIGHLWIN7      
  oBrw:nDataLines := 2
  oBrw:bKeyDown := {|nKey| ::Teclas(nKey) }

  oBrw:CreateFromCode()

RETURN NIL

METHOD Teclas( nKey ) CLASS AbcCompras
  if nKey = VK_DELETE
    MsgBeep()
    if oBrw:aArrayData[oBrw:nArrayAt][8] > 0
      aadd( aItemsDel, { nFactura,cSeriex, oBrw:aArrayData[oBrw:nArrayAt][8] })
    endif
    ADel( oBrw:aArrayData, oBrw:nArrayAt )
    ASize( oBrw:aArrayData, Len( oBrw:aArrayData ) - 1 )
    oBrw:Refresh()
    ::SumaCols()
  ENDIF

RETURN NIL
 


saludos..
Cesar Cortes Cruz
SysCtrl Software
Mexico

' Sin +- FWH es mejor "
User avatar
sysctrl2
 
Posts: 951
Joined: Mon Feb 05, 2007 7:15 pm

Re: Ejemplo sencillo de factura

Postby sysctrl2 » Thu Apr 28, 2016 5:13 pm

otro programa donde usamos solo fivewin, nada de terceros,
es un sistema que lo desarrollamos, el colega: Jose Briseño de chile
y sus servidor.

Y por supuesto también usamos XBROWSE.

Saludos..

Image

Cesar SysCtrl Software
Cesar Cortes Cruz
SysCtrl Software
Mexico

' Sin +- FWH es mejor "
User avatar
sysctrl2
 
Posts: 951
Joined: Mon Feb 05, 2007 7:15 pm

Re: Ejemplo sencillo de factura

Postby sysctrl2 » Thu Apr 28, 2016 5:28 pm

Acá se ve mejor la IMG.

http://distribuidoraolmos.no-ip.info:80 ... eb/scr.php

Saludos.

Cesar.
Cesar Cortes Cruz
SysCtrl Software
Mexico

' Sin +- FWH es mejor "
User avatar
sysctrl2
 
Posts: 951
Joined: Mon Feb 05, 2007 7:15 pm

Re: Ejemplo sencillo de factura

Postby joseluisysturiz » Fri Apr 29, 2016 12:07 am

Saludos Cesar, lo que para mi es agradable es lo vistoso y la combinacion de colores, gracias por compartir como lo haces y algunos otros detalles de tus sistemas...saludos... :shock:
Dios no está muerto...

Gracias a mi Dios ante todo!
User avatar
joseluisysturiz
 
Posts: 2064
Joined: Fri Jan 06, 2006 9:28 pm
Location: Guatire - Caracas - Venezuela

Re: Ejemplo sencillo de factura

Postby sysctrl2 » Fri Apr 29, 2016 3:03 am

Hola Jose Luis,
el código es para compartir
hay lo que gustes.
saludos...
Cesar Cortes Cruz
SysCtrl Software
Mexico

' Sin +- FWH es mejor "
User avatar
sysctrl2
 
Posts: 951
Joined: Mon Feb 05, 2007 7:15 pm

Re: Ejemplo sencillo de factura

Postby ACC69 » Fri Apr 29, 2016 6:39 pm

sysctrl2 wrote:Hola Colegas,
le comparto:

En mi sistema uso la class tpanel y texplorer del colega Andres Reyes, en este foro hay mucho ejemplos,

y para el almacenamiento de datos uso MySql.

Hace mucho que ya no uso DBF no me sirve.

envio parte de mi código de ABCCOMPRAS.PRG

para que vean como hago la carga de datos y como doy mantenimiento al xbrowse.

cualquier duda estoy para ayudarles,
http://www.facebook.com/SysCtrlSoftware

Saludos Cesar.

Image

Code: Select all  Expand view
#include <fivewin.ch>
#include <xbrowse.ch>
#include <Splitter.ch>
#include <ribbon.ch>
#include "ttitle.ch"
#include <taskpanel.ch>
#include "dtpicker.ch"

#DEFINE C_SIMPLE CHR( 39 )
#DEFINE c_simple CHR( 39 )

#DEFINE CCODIGO SPACE(15)
#DEFINE NCANTIDAD 0.00
#DEFINE CUNIDAD SPACE(20)
#DEFINE CDESCRIPCION SPACE(60)
#DEFINE NPRECIO  0
#DEFINE NIMPORTE 0
#DEFINE CEXENTO  SPACE(1)
#DEFINE NRECNO   0
#DEFINE NDEC     5

#DEFINE AMONEDAS {"PESOS","DLS", "MXN"}  

#DEFINE AMEDIDAS { FWString("PIECES")    ,;
                   FWString("SERVICE")  ,;
                   FWString("LITER")    ,;
                   FWString("KILOGRAM")     ,;
                   FWString("KGS") ,;
                   FWString("DOES NOT APPLY")  }                  



STATIC oGet
STATIC oBrw
STATIC aData
STATIC n15
STATIC oSay
STATIC cUnidad_medida
STATIC nAmount := 0
STATIC nTot1 := 0
STATIC nTot2 := 0
STATIC nPorc_ret_isr := 0
STATIC nPorc_ret_iva := 0
STATIC nFactura := 0
STATIC cSerieX := ""
STATIC cTimbrado := ""
STATIC aItemsDel := {}

CLASS AbcCompras
    DATA oMain AS Object
    DATA oBrw  AS Object
    DATA oBox AS Object
    DATA lEdit
  DATA cCia

    DATA nCod_cte       INIT 0
    DATA cRfc           INIT SPACE(15)
    DATA cNombre        INIT SPACE(100)
  DATA cNumero_escuela
    DATA cCalle         INIT SPACE(100)
    DATA cNo_exterior   INIT SPACE(20)
    DATA cNo_Interior   INIT SPACE(20)
    DATA cColonia       INIT SPACE(60)
    DATA cLocalidad     INIT SPACE(60)
    DATA cMunicipio     INIT SPACE(60)
    DATA cEstado        INIT SPACE(60)
    DATA cCodigo_postal INIT space( 5 )
    DATA cPais          INIT space( 30 )
    DATA cMoneda        INIT "PESOS     "
    DATA nFolio         INIT 0
    DATA dFecha         INIT date()
  DATA cCalcula_ret_isr   INIT SPACE(1)
  DATA cCalcula_ret_iva INIT SPACE(1)

  DATA nCod_alumno INIT 0
  DATA cNombre_alumno INIT SPACE(100)
  DATA cCurp INIT SPACE(30)
  DATA cNivel_educativo INIT SPACE(30)
  DATA cGrupo INIT SPACE(20)
  DATA dFecha_alta INIT DATE()
  DATA cTelefono INIT SPACE(30)

    DATA nVenta_inicial INIT 0
    DATA nVenta_final   INIT 0
    DATA nImpuesto      INIT 0.00
    DATA nExento        INIT 0.00
    DATA nVenta_total   INIT 0.00
    DATA nDescuento     INIT 0.00
    DATA nSubtotal      INIT 0.00
    DATA nIva           INIT 0.00
    DATA nRedondeo      INIT 0.00
    DATA nIsr           INIT 0.00
    DATA nRetencion     INIT 0.00
    DATA nTotal         INIT 0.00
  DATA nSemana        INIT 0

    DATA cCodigo        INIT SPACE(15)
    DATA cDescripcion   INIT SPACE(100)
    DATA nPrecio        INIT 0.00
    DATA nCantidad      INIT 1.00
    DATA nImporte       INIT 0.00
    DATA cUnidad_medida INIT PADR( FWString( "PIECES" ) )
    DATA cExento        INIT "N"

    DATA nTipo          INIT 0
    DATA nPorc_dscto    INIT 0.00
  DATA nCosto_soporte INIT 0.00
  data nFormato INIT val( LeeIniFile("VENTAS_CONTADO", "CUAL_FORMATO", ".\COMPRAS.INI" ) )

    METHOD New()
    METHOD MakeDialogo()
    METHOD MakeGets()
    METHOD MakeBrwData()
    METHOD MakeSays()
    METHOD MakeGets2()
   METHOD ChkCod_cte()
   METHOD RefreshCliente()
   METHOD Funget1()
   METHOD Funget17()
   METHOD ChkRfc()
   METHOD Siguiente()
   METHOD PideUnidad_medida()
   METHOD ChkCodigo()
   METHOD AddItem()
   METHOD SumaCols()
   METHOD PideCantidad()
   METHOD ChkDescuento()
   METHOD GuardaDatos()
   METHOD AddDetalle()
   METHOD ShowFactura()
   METHOD Teclas()
   METHOD AddProveedor()
ENDCLASS

METHOD New( lEdit , oMain, nFolio,cSerie,cTimbre ) CLASS AbcCompras
    local cQry, oQry
    ::lEdit := lEdit
    ::oMain := oMain
  ::cCia := UPPER( LeeIniFile("DATOS_EMPRESA", "NOMBRE1", ".\SYSCTRL.INI" ) )
  ::cNumero_escuela := UPPER( LeeIniFile("ESCUELA", "NO_ESCUELA", ".\sysctrl.INI" ) )
   
  nFactura := nFolio
  cSerieX   := cSerie
  cTimbrado := cTimbre

   
    cGet_unidad_medida := UPPER( LeeIniFile("CONFIG", "GET_UNIDAD_MEDIDA", ".\SYSCTRL.INI" ) )

    nPorc_ret_isr := val( LeeIniFile("DATOS_EMPRESA", "PORC_RET_ISR", ".\SYSCTRL.INI" ) )
    nPorc_ret_iva := val( LeeIniFile("DATOS_EMPRESA", "PORC_RET_IVA", ".\SYSCTRL.INI" ) )

  cTomar_costo_soporte := LeeIniFile("CONFIG", "TOMAR_COSTO_SOPORTE", ".\SYSCTRL.INI" )

  n15 := val( LeeIniFile("DATOS_EMPRESA", "PORC_IVA", ".\SYSCTRL.INI" ) )
  Remaes():CreaArtics( ::oMain:oCon )
 

    ::MakeDialogo()

RETURN NIL

METHOD MakeDialogo() CLASS AbcCompras
    LOCAL oBrush
    local oFont
    local oBtn := array( 3 )
  local oSelf := Self
   if ::lEdit //nuevo cfdi
      ::nFolio := ::Siguiente()
   else
      ::nFolio := nFactura
   endif

    DEFINE FONT oFont NAME "TAHOMA" SIZE 5,-15

    DEFINE BRUSH oBrush Color nRGB( 219, 255, 119) //FILE ".\BMPS\five.bmp" 

    DEFINE DIALOG ::oBox BRUSH oBrush size 970, 650  FONT oFont //STYLE WS_POPUP
   ::oBox:lTransparent := .t.

   ::MakeGets()
   

   @ 15, 30 BUTTON oBtn[1] PROMPT "&" + FWString("Save Data")  SIZE 80, 24 OF ::oBox ;
       ACTION (  iif( ::GuardaDatos(), ::oBox:End(), ::oBox:setfocus() ) )  //WHEN ::lEdit

   @ 15, 45 BUTTON oBtn[2] PROMPT "&" + FWString("Not Save/Exit") SIZE 80, 24 OF ::oBox;
     ACTION ( ::oBox:end() ) CANCEL
   
   ::oBox:cTitle := FWString("Purchase Invoices")
   
   ::oBox:lHelpIcon := .f.
   if cTimbrado="S" //solo consulta
      oBtn[1]:disable()
   endif
   
   ACTIVATE DIALOG ::oBox CENTERED on init ( iif( oSelf:lEdit ,oSelf:oBox:SetFocus(),oSelf:ShowFactura() ) )

RETURN Nil

METHOD GuardaDatos() CLASS AbcCompras
    local cQry, oFac, nSeek, oArt
    local i
  local lExit := .f.
    local cSerie := cstr2( UPPER( LeeIniFile("DATOS_EMPRESA", "SERIE_FACTURA", ".\SYSCTRL.INI" ) ) )


  if MsgYesNo( FWString("Save data") +" ..?", ::oMain:cUser )

    lExit := .t.

    ::oMain:oCon:BeginTransaction()

        if ::lEdit //nuevo cfdi
        ::nFolio := ::Siguiente()
    else
        ::nFolio := nFactura
    endif   

    * ---------------------- *
    * quitamos los eliminados *

    for i := 1 to len( aItemsDel )

      cQry := "DELETE FROM compras_detalle"
      cQry += " WHERE folio=" + C_SIMPLE + cStr2( aItemsDel[i][1] ) + C_SIMPLE
      cQry += " AND   serie=" + C_SIMPLE + cStr2( aItemsDel[i][2] ) + C_SIMPLE
      cQry += " AND   item =" + C_SIMPLE + cStr2( aItemsDel[i][3] ) + C_SIMPLE
      cQry += " ORDER BY serie,folio,item"
     
      ::oMain:oCon:Execute( cQry )
      sysrefresh()

    NEXT


        for i:= 1 to len( oBrw:aArrayData )
       
            cQry := "SELECT catalogo,linea,planta"
        cQry += " FROM artics"
        cQry += " WHERE catalogo=" + C_SIMPLE + cstr2( oBrw:aArrayData[i][1] ) + C_SIMPLE
        cQry += " ORDER BY catalogo"
        oArt := ::oMain:oCon:Query( cQry )
           
            cQry := "SELECT serie,folio,item"
            cQry += " FROM compras_detalle"
            cQry += " WHERE folio=" + C_SIMPLE + cstr2( ::nFolio ) + C_SIMPLE
            cQry += " AND   serie=" + C_SIMPLE + cStr2( cSerie   ) + C_SIMPLE
            cQry += " AND   item =" + C_SIMPLE + cStr2( i ) + C_SIMPLE
            cQry += " ORDER BY serie,folio,item"
            oQry := ::oMain:oCon:Query( cQry )
            nSeek := oQry:nRecCount
            if nSeek = 0
                cQry := "INSERT INTO compras_detalle SET "     
            else
                cQry := "UPDATE compras_detalle SET "
            endif
            cQry += "folio="    + ClipValue2SQL( ::nFolio ) + ","
            cQry += "serie="    + ClipValue2SQL( cSerie   ) + ","
            cQry += "item="     + ClipValue2SQL( i ) + ","
            cQry += "codigo="   + ClipValue2SQL( oBrw:aArrayData[i][1] ) + ","
            cQry += "cantidad=" + ClipValue2SQL( oBrw:aArrayData[i][2] ) + ","
            cQry += "unidad="   + ClipValue2SQL( oBrw:aArrayData[i][3] ) + ","
            cQry += "nombre="   + ClipValue2SQL( oBrw:aArrayData[i][4] ) + ","
            cQry += "precio_unit=" + ClipValue2SQL( oBrw:aArrayData[i][5] ) + ","
            cQry += "importe="  + ClipValue2SQL( oBrw:aArrayData[i][6] ) + ","
            cQry += "fecha="    + ClipValue2SQL( ::dFecha ) + ","
            cQry += "exento="   + ClipValue2SQL( oBrw:aArrayData[i][7] ) + ","
            cQry += "linea="    + ClipValue2SQL( oArt:linea )
            if nSeek > 0
                cQry += " WHERE folio=" + C_SIMPLE + cstr2( ::nFolio ) + C_SIMPLE
                cQry += " AND   serie=" + C_SIMPLE + cStr2( cSerie   ) + C_SIMPLE
                cQry += " AND   item =" + C_SIMPLE + cStr2( i ) + C_SIMPLE
                cQry += " ORDER by serie,folio,item"
            endif
            ::oMain:oCon:Execute( cQry )

      cQry := "INSERT INTO movtos_inventario SET "
      cQry += "folio="         + ClipValue2SQL( ::nFolio )  + ","
      cQry += "anio="          + ClipValue2SQL( year( date() ) )  + ","
      cQry += "codigo="        + ClipValue2SQL( oBrw:aArrayData[i][1] )  + ","
      cCodigo := oBrw:aArrayData[i][1]
      cQry += "clave_fabrica=" + ClipValue2SQL( oArt:planta )  + ","
      cQry += "linea=" + ClipValue2SQL( oArt:linea )  + ","
      cQry += "descripcion="   + ClipValue2SQL( oBrw:aArrayData[i][4] )  + ","
      cQry += "tipo="          + ClipValue2SQL( 1 )  + "," //1=entradas, 2=salidas
     
        cQry += "cantidad="      + ClipValue2SQL( oBrw:aArrayData[i][2] )  + ","
        cQry += "costo="         + ClipValue2SQL( oBrw:aArrayData[i][5] )  + ","
        cQry += "concepto="      + ClipValue2SQL( "ENTRADAS"  )  + ","
        cQry += "concepto2="      + ClipValue2SQL( "COMPRAS"  )  + ","
        cQry += "referencia="    + ClipValue2SQL( cstr2(::nFolio) )  + ","
        cQry += "fecha="         + ClipValue2SQL( date() ) + ","
        cQry += "usuario="       + ClipValue2SQL( ::oMain:cUser ) + ","
        // cQry += "tipo_mov="       + ClipValue2SQL( ::cTipo_mov ) + ","
        cQry += "cierre="       + ClipValue2SQL( "N" ) + ","
        cQry += "item="          + ClipValue2SQL( i )
        ::oMain:oCon:Execute( cQry )
       
        //Servidor2013

        *Afectamos existencia*
        cQry := "UPDATE artics SET "
        cQry += "existencia=existencia+" + ClipValue2SQL( oBrw:aArrayData[i][2] ) + ","
        cQry += "compras=compras+" + ClipValue2SQL( oBrw:aArrayData[i][2] )

        cQry += " WHERE catalogo=" + C_SIMPLE + alltrim( oBrw:aArrayData[i][1]  ) + C_SIMPLE
        cQry += " ORDER BY catalogo"
        ::oMain:oCon:Execute( cQry )


            oArt:end()
            sysrefresh()
           
        next
       
        cQry := "SELECT serie,folio"
        cQry += " FROM compras"
        cQry += " WHERE folio=" + C_SIMPLE + cstr2( ::nFolio ) + C_SIMPLE
        cQry += " AND   serie=" + C_SIMPLE + cStr2( cSerie   ) + C_SIMPLE
        cQry += " ORDER by serie,folio"
        oQry := ::oMain:oCon:Query( cQry )
        nSeek := oQry:nRecCount
        if nSeek = 0
            cQry := "INSERT INTO compras SET "     
        else
            cQry := "UPDATE compras SET "
        endif
        cQry += "folio="    + ClipValue2SQL( ::nFolio ) + ","
        cQry += "serie="    + ClipValue2SQL( cSerie   ) + ","
        cQry += "fecha="    + ClipValue2SQL( ::dFecha   ) + ","
        cQry += "hora="     + ClipValue2SQL( time()   ) + ","
    cQry += "forma_pago="     + ClipValue2SQL( "PAGO EN UNA SOLA EXHIBICIÓN"   ) + ","
        cQry += "cliente="  + ClipValue2SQL( ::cRfc   ) + ","
        cQry += "nombre="   + ClipValue2SQL( ::cNombre   ) + ","
        cQry += "calle="    + ClipValue2SQL( ::cCalle   ) + ","
        cQry += "no_exterior="    + ClipValue2SQL( ::cNo_exterior   ) + ","
    cQry += "no_interior="    + ClipValue2SQL( ::cNo_Interior   ) + ","
    cQry += "colonia="    + ClipValue2SQL( ::cColonia   ) + ","
    cQry += "localidad="    + ClipValue2SQL( ::cLocalidad   ) + ","
    cQry += "municipio="    + ClipValue2SQL( ::cMunicipio   ) + ","
    cQry += "estado="    + ClipValue2SQL( ::cEstado   ) + ","
    cQry += "codigo_postal="    + ClipValue2SQL( ::cCodigo_postal   ) + ","
    cQry += "pais="    + ClipValue2SQL( ::cPais   ) + ","
    cQry += "subtotal="    + ClipValue2SQL( ::nSubtotal   ) + ","
    cQry += "descuento="    + ClipValue2SQL( ::nDescuento  ) + ","
    cQry += "porc_iva="    + ClipValue2SQL( n15   ) + ","
    cQry += "iva="    + ClipValue2SQL( ::nIva   ) + ","
    cQry += "total="    + ClipValue2SQL( ::nTotal   ) + ","
   
    cQry += "moneda="    + ClipValue2SQL( ::cMoneda   ) + ","
    cQry += "semana="   + ClipValue2SQL( ::nSemana   ) + ","
    cQry += "venta_inicial="   + ClipValue2SQL( ::nVenta_inicial   ) + ","
    cQry += "venta_final="   + ClipValue2SQL( ::nVenta_final   ) + ","
    cQry += "nom_usuario="   + ClipValue2SQL( ::oMain:cUserName   ) + ","
    cQry += "exento="   + ClipValue2SQL( ::nExento   ) + ","
    cQry += "redondeo="   + ClipValue2SQL( ::nRedondeo   ) + ","
    cQry += "impuesto="   + ClipValue2SQL( ::nImpuesto   ) + ","
    cQry += "usuario="   + ClipValue2SQL( ::oMain:cUser   ) + ","
    cQry += "cod_cte="   + ClipValue2SQL( ::nCod_cte   ) + ","
    cQry += "importe_isr="   + ClipValue2SQL( ::nIsr   ) + ","
    cQry += "importe_ret="   + ClipValue2SQL( ::nRetencion   ) + ","
    cQry += "timbrado="   + ClipValue2SQL( "N" ) + ","
    cQry += "venta_total="   + ClipValue2SQL( ::nVenta_total ) + ","
    cQry += "cantidad_descuento="   + ClipValue2SQL( ::nDescuento   ) + ","

    cQry += "porc_descuento="   + ClipValue2SQL( ::nPorc_dscto  )
    if nSeek > 0
      cQry += " WHERE folio=" + C_SIMPLE + cstr2( ::nFolio ) + C_SIMPLE
      cQry += " AND   serie=" + C_SIMPLE + cStr2( cSerie   ) + C_SIMPLE
      cQry += " ORDER by serie,folio"

    endif
   
    ::oMain:oCon:Execute( cQry )

    ::AddProveedor()
    ::oMain:oCon:CommitTransaction()

  IF lExit
    if ::nFormato=0
      //esto es para version spanish
      //RemisionCompras():New( ::oCon, ::nFolio )
    elseif ::nFormato=2
      InvoicePurchase():New( ::oMain:oCon, ::nFolio )
    else //tickets
      //Ventas1():New( ::oCon, ::nFolio )
    endif
  endif

       
       
    endif
   
RETURN lExit


METHOD AddProveedor() CLASS AbcCompras
    local cQry, oQry
   cQry := "SELECT cod_cte"
   cQry += " FROM proveedores"
   cQry += " WHERE cod_cte=" + C_SIMPLE + cstr2( ::nCod_cte ) + C_SIMPLE
   cQry += " ORDER BY cod_cte"
   oQry := ::oMain:oCon:Query( cQry )
   nSeek := oQry:nRecCount
   oQry:end()
   if nSeek = 0
      cQry := "INSERT INTO proveedores SET "  
   else  
      cQry := "UPDATE proveedores SET "    
   endif
   cQry += "cod_cte="       + ClipValue2SQL( ::nCod_cte   )       + ","
   cQry += "cliente="       + ClipValue2SQL( ::cRfc   )           + ","
   cQry += "nombre="        + ClipValue2SQL( ::cNombre   )        + ","
   cQry += "calle="         + ClipValue2SQL( ::cCalle   )         + ","
   cQry += "no_exterior="   + ClipValue2SQL( ::cNo_exterior   )   + ","
   cQry += "no_interior="   + ClipValue2SQL( ::cNo_Interior   )   + ","
   cQry += "colonia="       + ClipValue2SQL( ::cColonia   )       + ","
   cQry += "localidad="     + ClipValue2SQL( ::cLocalidad   )     + ","
   cQry += "municipio="     + ClipValue2SQL( ::cMunicipio   )     + ","
   cQry += "estado="        + ClipValue2SQL( ::cEstado   )        + ","
   cQry += "codigo_postal=" + ClipValue2SQL( ::cCodigo_postal   ) + ","
   cQry += "pais="          + ClipValue2SQL( ::cPais   )          + ","
   if nSeek = 0
      cQry += "fecha_alta="  + ClipValue2SQL( ::dFecha  ) + ","
   endif
   cQry += "borrado="  + ClipValue2SQL( "N"   )
   IF nSeek > 0
      cQry += " WHERE cod_cte=" + C_SIMPLE + cstr2( ::nCod_cte ) + C_SIMPLE
   endif

   ::oMain:oCon:Execute( cQry )

RETURN NIL

METHOD Siguiente() CLASS AbcCompras
   local nFolio
   local oQry := ::oMain:oCon:Query( "SELECT folio FROM compras ORDER BY folio")
   oQry:Gobottom()
   nFolio := oQry:folio+1
RETURN nFolio

METHOD MakeGets() CLASS AbcCompras
    local nRow := 10
    local nCol := 10
    local nSt := 15
    local nSalto := 12

    oGet := array(20)
    oSay := array(10)

    @ nRow, nCol SAY "* [ F2.sel. ]"+ FWString("Provider Code") OF ::oBox pixel
   @ nRow+10, nCol GET oGet[ 1 ] VAR ::nCod_cte of ::oBox ;
   SIZE 60, 10  PICTURE "9999999" PIXEL ;
   valid ::ChkCod_cte()
   oGet[1]:bKeyDown := { | nKey | ::FunGet1( nKey )  }  
   nCol += nSt*5

   @ nRow, nCol SAY "* " + FWString("TAX ID") OF ::oBox pixel
   @ nRow+10, nCol GET oGet[ 2 ] VAR ::cRfc of ::oBox ;
   SIZE 60, 10  PICTURE "@!K" PIXEL valid ::ChkRfc()  
   nCol += nSt*5

   @ nRow, nCol SAY "*" + FWString("Company/Name") OF ::oBox pixel
   @ nRow+10, nCol GET oGet[ 3 ] VAR ::cNombre of ::oBox ;
   SIZE 194, 10  PICTURE "@K!" PIXEL valid !Empty( ::cNombre )
   nCol += nSt*5

   nRow += nSalto*1.7
   nCol := 10

   @ nRow, nCol SAY "* " + FWString("Street address") OF ::oBox pixel
   @ nRow+10, nCol GET oGet[ 4 ] VAR ::cCalle of ::oBox ;
   SIZE 200, 10  PICTURE "@!K" PIXEL valid !Empty( ::cCalle)
   nCol += nSt*14

   @ nRow, nCol SAY "* " + FWString("Number Outside") OF ::oBox pixel
   @ nRow+10, nCol GET oGet[ 5 ] VAR ::cNo_exterior of ::oBox ;
   SIZE 60, 10  PICTURE "@!K" PIXEL  
   nCol += nSt*5

   @ nRow, nCol SAY "* " + FWString("Interior number") OF ::oBox pixel
   @ nRow+10, nCol GET oGet[ 6 ] VAR ::cNo_Interior of ::oBox ;
   SIZE 60, 10  PICTURE "@!K" PIXEL  
   nCol += nSt*5

   nRow += nSalto*1.7
   nCol := 10

   @ nRow, nCol SAY "* " + FWString("Address") OF ::oBox pixel
   @ nRow+10, nCol GET oGet[ 7 ] VAR ::cColonia of ::oBox ;
   SIZE 120, 10  PICTURE "@!K" PIXEL valid !Empty( ::cColonia )
   nCol += nSt*8.1

   @ nRow, nCol SAY "* " + FWString("City") OF ::oBox pixel
   @ nRow+10, nCol GET oGet[ 8 ] VAR ::cLocalidad of ::oBox ;
   SIZE 120, 10  PICTURE "@!K" PIXEL
   nCol += nSt*8.1

   @ nRow, nCol SAY "* " + FWString("Municipality") OF ::oBox pixel
   @ nRow+10, nCol GET oGet[ 9 ] VAR ::cMunicipio of ::oBox ;
   SIZE 102, 10  PICTURE "@!K" PIXEL
   nCol += nSt*8.1

   nRow += nSalto*1.7
   nCol := 10

   @ nRow, nCol SAY "* " + FWString("State") OF ::oBox pixel
   @ nRow+10, nCol GET oGet[ 10 ] VAR ::cEstado of ::oBox ;
   SIZE 120, 10  PICTURE "@!K" PIXEL
   nCol += nSt*8.1

   @ nRow, nCol SAY "* " + FWString("ZIP") OF ::oBox pixel
   @ nRow+10, nCol GET oGet[ 11 ] VAR ::cCodigo_postal of ::oBox ;
   SIZE 60, 10  PICTURE "@!K" PIXEL
   nCol += nSt*5

   /*@ nRow, nCol SAY "* Venta Inicial" OF ::oBox pixel
   @ nRow+10, nCol GET oGet[ 12 ] VAR ::nVenta_inicial of ::oBox ;
   SIZE 60, 10  PICTURE "9999999" PIXEL
   nCol += nSt*5

   @ nRow, nCol SAY "* Venta Final" OF ::oBox pixel
   @ nRow+10, nCol GET oGet[ 13 ] VAR ::nVenta_final of ::oBox ;
   SIZE 60, 10  PICTURE "9999999" PIXEL VALID ::AddDetalle() // WHEN ::lEdit
   nCol += nSt*5*/


   nRow += nSalto*1.7
   nCol := 10

   @ nRow, 10 SAY FWString( "Type of Currency" ) OF ::oBox pixel
   @ nRow+10, 10 COMBOBOX oGet[14] VAR ::cMoneda ITEMS AMONEDAS OF ::oBox  ;
            PIXEL SIZE 60, 200 UPDATE STYLE CBS_DROPDOWNLIST

   nCol += nSt*5

   @ nRow, nCol SAY "* " + FWString("Order No") OF ::oBox pixel
   @ nRow+10, nCol GET oGet[ 15 ] VAR ::nFolio of ::oBox ;
   SIZE 60, 10  PICTURE "9999999" PIXEL
   nCol += nSt*5

  //@ nRow, nCol SAY "Semana" OF ::oBox pixel
  // @ nRow+10, nCol GET oGet[ 16 ] VAR ::nSemana of ::oBox ;
  // SIZE 60, 10  PICTURE "99" PIXEL
  // nCol += nSt*5

   @ nRow, nCol SAY "* " + FWString("Date") OF ::oBox pixel
   @ nRow+10, nCol DTPICKER oGet[17] VAR ::dFecha OF ::oBox SIZE 60, 12 PIXEL
   /*@ nRow+10, nCol GET oGet[ 16 ] VAR ::dFecha of ::oBox ;
   SIZE 50, 10  PICTURE "d" PIXEL*/

   nCol += nSt*5

   ::MakeGets2()

   nRow += nSalto*1.7
   nCol := 10

   ::MakeBrwData( nRow )

   ::MakeSays()

RETURN NIL

//204652 to 204752, 201045 to 204651
METHOD AddDetalle() CLASS AbcCompras
   local cQry,oQry
   local oWait
   local nAt,i
   local nUno15 := 1+ (n15/100)

   if ::nVenta_final=0
      return .t.
   endif
   if ! ::lEdit
      return .t.
   endif

   if ! GETASYNCKEY( VK_RETURN)
    RETURN .t.
   endif


   cQry := "SELECT folio,semana"
   cQry += " FROM notas"
   cQry += " WHERE folio>=" + C_SIMPLE + cStr2( ::nVenta_inicial ) + C_SIMPLE
   cQry += " AND folio<=" + C_SIMPLE + cStr2( ::nVenta_final ) + C_SIMPLE
   cQry += " ORDER BY folio LIMIT 1"
   oQry := ::oMain:oCon:Query( cQry )
   IF oQry:nRecCount > 0
      ::nSemana := oQry:semana
   endif
   oQry:end()

   WAITON( space( 40 ), @oWait )

   ASize( oBrw:aArrayData, 0 )
   oBrw:refresh()
   oBrw:SetFocus()

   cQry := "SELECT folio, codigo,cantidad,descripcion,"
   cQry += "prec_unit,importe,linea,exento_iva"
   cQry += " FROM notas_detalle"

   cQry += " WHERE folio>=" + C_SIMPLE + cStr2( ::nVenta_inicial ) + C_SIMPLE
   cQry += " AND folio<=" + C_SIMPLE + cStr2( ::nVenta_final ) + C_SIMPLE
   cQry += " ORDER BY folio"
   oQry := ::oMain:oCon:Query( cQry )
   oQry:GoTop()
   while ! oQry:Eof()
      oWait:say( 1, 1, "Agregando partidas a la factura: " + cStr2( oQry:folio ) )
      if !empty( oQry:descripcion  )
        nAt := ascan( oBrw:aArrayData, {|aT | aT[1]=oQry:codigo } )
        if nAt = 0
           AADD( oBrw:aArrayData, { oQry:codigo      ,;
                                  oQry:cantidad    ,;
                                  "PIEZAS"         ,;
                                  oQry:descripcion ,;
                                  oQry:prec_unit   ,;
                                  oQry:importe     ,;
                                  oQry:exento_iva } )
           oBrw:refresh()
        else
           oBrw:aArrayData[nAt][2] += oQry:cantidad
           oBrw:aArrayData[nAt][6] += ROUND( oQry:importe, NDEC )
        endif

      ENDIF

      sysrefresh()
      oQry:skip()
   end
   oQry:end()

   //if ! "TORMENTA" $ ::cCia

   for i := 1 to len( oBrw:aArrayData )
      oWait:say( 2, 1, "Reg: " + cStr2( i ) )
      if oBrw:aArrayData[i][7]<>"S"
         oBrw:aArrayData[i][6] := ROUND( oBrw:aArrayData[i][6]/nUno15, NDEC )
         oBrw:aArrayData[i][5] := ROUND( oBrw:aArrayData[i][6]/oBrw:aArrayData[i][2], NDEC )
      else
        oBrw:aArrayData[i][5] := ROUND( oBrw:aArrayData[i][6]/oBrw:aArrayData[i][2], NDEC )
      endif
      sysrefresh()
   next

   //endif

   cQry := "SELECT sum(redondeo) FROM notas"
   cQry += " WHERE folio>=" + C_SIMPLE + cStr2( ::nVenta_inicial ) + C_SIMPLE
   cQry += " AND folio<=" + C_SIMPLE + cStr2( ::nVenta_final ) + C_SIMPLE
   cQry += " ORDER BY folio"
   oQry := ::oMain:oCon:Query( cQry )
   IF oQry:fieldget(1) <> 0
      ::nRedondeo := oQry:fieldget(1)
     
      AADD( oBrw:aArrayData, { "AJUSTE"      ,;
                                  1    ,;
                                  "PIEZAS"         ,;
                                  "AJUSTE POR REDONDEO" ,;
                                  oQry:fieldget(1)   ,;
                                  oQry:fieldget(1)     ,;
                                  "S" } )
     
   endif
   oQry:end()


   WAITOFF( @oWait )
   IF LEN( oBrw:aArrayData ) = 0

      AADD( oBrw:aArrayData, { CCODIGO      ,;
                                  NCANTIDAD    ,;
                                  CUNIDAD         ,;
                                  CDESCRIPCION ,;
                                  NPRECIO   ,;
                                  NIMPORTE    ,;
                                  CEXENTO } )
   
   ENDIF
   ::SumaCols()

   for i := 1 to len( oGet )
    if oGet[i] != nil
      oGet[i]:refresh()
    endif
  next

   oBrw:refresh()
   oBrw:SetFocus()


RETURN .t.

METHOD ShowFactura() CLASS AbcCompras
   local cQry,oQry
   local oWait
   local nAt,i
   local nUno15 := 1+ (n15/100)

   cQry := "SELECT serie,folio,fecha,semana,cliente,nombre,calle,"
   cQry += "no_exterior,no_interior,colonia,localidad,municipio,"
   cQry += "estado,codigo_postal,venta_inicial,venta_final,cod_cte,moneda,"
   cQry += "cod_alumno,nombre_alumno,curp,nivel_educativo,numero_escuela"
   cQry += " FROM compras"
   cQry += " WHERE folio=" + C_SIMPLE + cStr2( nFactura ) + C_SIMPLE
   cQry += " AND serie=" + C_SIMPLE + cStr2( cSerieX ) + C_SIMPLE
   cQry += " ORDER BY folio LIMIT 1"

   oQry := ::oMain:oCon:Query( cQry )
   
   ::nSemana      := oQry:semana
   ::nCod_cte     := oQry:cod_cte
   ::cRfc         := oQry:cliente
   ::cNombre      := oQry:nombre
   ::cCalle       := oQry:calle
   ::cNo_exterior := oQry:no_exterior
   ::cNo_interior := oQry:no_interior
   ::cColonia     := oQry:colonia
   ::cLocalidad   := oQry:localidad
   ::cMunicipio   := oQry:municipio
   ::cEstado      := oQry:estado
   ::cCodigo_postal := oQry:codigo_postal
   ::nVenta_inicial := oQry:venta_inicial
   ::nVenta_final   := oQry:venta_final
   ::cMoneda        := oQry:moneda
   ::dFecha         := oQry:fecha

   ::nCod_alumno    := oQry:cod_alumno
   ::cNombre_alumno := oQry:nombre_alumno
   ::cCurp          := oQry:curp
   ::cNivel_educativo := oQry:nivel_educativo
   ::cNumero_escuela  := oQry:numero_escuela

   oQry:end()
   for i := 1 to len( oGet )
      if oGet[i] != NIL
         oGet[i]:Refresh()
      endif
   next

   WAITON( space( 40 ), @oWait )

   ASize( oBrw:aArrayData, 0 )
   oBrw:refresh()

   cQry := "SELECT folio, codigo,cantidad,nombre,"
   cQry += "precio_unit,importe,linea,exento,unidad,item"
   cQry += " FROM compras_detalle"
   cQry += " WHERE folio=" + C_SIMPLE + cStr2( nFactura ) + C_SIMPLE
   cQry += " AND serie=" + C_SIMPLE + cStr2( cSeriex ) + C_SIMPLE
   cQry += " ORDER BY folio"
   oQry := ::oMain:oCon:Query( cQry )
   oQry:GoTop()
   while ! oQry:Eof()
     
      oWait:say( 1, 1, "Agregando partidas a la factura: " + cStr2( oQry:folio ) )

      AADD( oBrw:aArrayData, { oQry:codigo      ,;
                                  oQry:cantidad    ,;
                                  oQry:unidad         ,;
                                  oQry:nombre ,;
                                  oQry:precio_unit   ,;
                                  oQry:importe     ,;
                                  oQry:exento  ,;
                                  oQry:item } )
      if "AJUSTE POR REDONDEO" $ oQry:nombre
        ::nRedondeo := oQry:importe
      endif
      sysrefresh()
      oQry:skip()
   end
   oQry:end()

   WAITOFF( @oWait )

   IF LEN( oBrw:aArrayData ) = 0

      AADD( oBrw:aArrayData, { CCODIGO      ,;
                               NCANTIDAD    ,;
                               CUNIDAD      ,;
                               CDESCRIPCION ,;
                               NPRECIO      ,;
                               NIMPORTE     ,;
                               CEXENTO      ,;
                               NRECNO } )
   
   ENDIF

   ::SumaCols()

   for i := 1 to len( oGet )
    if oGet[i] != nil
      oGet[i]:refresh()
    endif
  next

   oBrw:refresh()


RETURN .t.

method Funget1( nKey, oBox ) class AbcCompras
   local cQry, oQry,nSeek,i

   if nKey = VK_F2
      ::nCod_cte := CatalogoProveedores():New( ::oMain:oCon )

      cQry := "SELECT cod_cte,cliente,nombre,calle,colonia,localidad,municipio,"
      cQry += "estado,pais,codigo_postal,telefono,no_exterior,no_interior,"
      cQry += "retencion_isr,retencion_iva,costo_soporte"
      cQry += " FROM proveedores"
      cQry += " WHERE cod_cte=" + C_SIMPLE + cstr2( ::nCod_cte ) + C_SIMPLE
      cQry += " ORDER BY cod_cte"
      oQry := ::oMain:oCon:Query( cQry )
      nSeek := oQry:nRecCount
      if nSeek > 0
         ::RefreshCliente( oQry )
      endif
      oQry:end()

  ENDIF
RETURN NIL

METHOD ChkCod_cte() CLASS AbcCompras
   local cQry, oQry,nSeek,i
   cQry := "SELECT cod_cte,cliente,nombre,calle,colonia,localidad,municipio,"
   cQry += "estado,pais,codigo_postal,telefono,no_exterior,no_interior,"
   cQry += "retencion_isr,retencion_iva,costo_soporte"
   cQry += " FROM proveedores"
   cQry += " WHERE cod_cte=" + C_SIMPLE + cstr2( ::nCod_cte ) + C_SIMPLE
   cQry += " ORDER BY cod_cte"
   oQry := ::oMain:oCon:Query( cQry )
   nSeek := oQry:nRecCount
   if nSeek > 0
      ::RefreshCliente( oQry )
   endif
   oQry:end()

RETURN .t.

METHOD ChkRfc() CLASS AbcCompras
   local cQry, oQry,nSeek,i
   cQry := "SELECT cod_cte,cliente,nombre,calle,colonia,localidad,municipio,"
   cQry += "estado,pais,codigo_postal,telefono,no_exterior,no_interior,"
   cQry += "retencion_isr,retencion_iva,costo_soporte"
   cQry += " FROM proveedores"
   cQry += " WHERE cod_cte=" + C_SIMPLE + cstr2( ::nCod_cte ) + C_SIMPLE
   cQry += " AND cliente=" + C_SIMPLE + cstr2( ::cRfc ) + C_SIMPLE
   cQry += " ORDER BY cliente"
   oQry := ::oMain:oCon:Query( cQry )
   nSeek := oQry:nRecCount
   if nSeek > 0
      ::nCod_cte := oQry:cod_cte
      ::RefreshCliente( oQry )
   endif
   oQry:end()

RETURN .t.

METHOD RefreshCliente( oQry ) CLASS AbcCompras
   ::cRfc           := oQry:cliente
   ::cNombre        := oQry:nombre
   ::cCalle         := oQry:calle
   ::cNo_exterior   := oQry:no_exterior
   ::cNo_Interior   := oQry:no_interior
   ::cColonia       := oQry:colonia
   ::cLocalidad     :=   oQry:localidad
   ::cMunicipio     :=   oQry:municipio
   ::cEstado        :=   oQry:estado
   ::cCodigo_postal := oQry:codigo_postal
   ::cPais          := "MÉXICO"  
   ::cCalcula_ret_isr := oQry:retencion_isr
   ::cCalcula_ret_iva := oQry:retencion_iva
   ::nCosto_soporte   := oQry:costo_soporte
   for i := 1 to len( oGet )
      if oGet[i] != Nil
         oGet[i]:Refresh()
      endif
   next

RETURN NIL

METHOD MakeGets2() CLASS AbcCompras
    LOCAL nRow := 230
    LOCAL nST  := 15
    LOCAL nCol := 10
   local oBtn

    @ nRow, nCol SAY "[F2] " + FWString("Code") OF ::oBox pixel
   @ nRow+10, nCol GET oGet[ 17 ] VAR ::cCodigo of ::oBox ;
   SIZE 60, 12  PICTURE "@!k" PIXEL ;
   VALID ::ChkCodigo()
   nCol += nSt*4.1

   oGet[17]:bKeyDown := { | nKey | ::FunGet17( nKey )  }  

   @ nRow, nCol SAY FWString("Description") OF ::oBox pixel
   @ nRow+10, nCol GET oGet[ 18 ] VAR ::cDescripcion of ::oBox ;
   SIZE 150, 12  PICTURE "@!k" PIXEL
   nCol += nSt*10.3
   @ nRow, nCol SAY FWString("Price Unit") OF ::oBox pixel
   @ nRow+10, nCol GET oGet[ 19 ] VAR ::nPrecio PICTURE "999,999.99999" of ::oBox ;
   SIZE 50, 12  PIXEL
   nCol += nSt*3.5
   @ nRow, nCol SAY FWString("Quantity") OF ::oBox pixel
   @ nRow+10, nCol GET oGet[ 20 ] VAR ::nCantidad PICTURE "999,999.999" of ::oBox ;
   SIZE 30, 12 PIXEL
   nCol += nSt*2.5
   @ nRow, nCol BUTTONBMP oBtn OF ::oBox ACTION ::AddItem() ;
      BITMAP ".\bmps\yes.bmp" PROMPT "O.K." TEXTRIGHT PIXEL SIZE 40, 20

RETURN NIL

method Funget17( nKey ) class AbcCompras
   local cQry, oQry,nSeek,i

   if nKey = VK_F2

      ::cCodigo := BuscaProductos():New( ::oMain:oCon )

      cQry := "SELECT catalogo, nombre"
      cQry += " FROM artics"
      cQry += " WHERE catalogo=" + C_SIMPLE + cstr2( ::cCodigo ) + C_SIMPLE
      cQry += " ORDER BY catalogo"
      oQry := ::oMain:oCon:Query( cQry )
      nSeek := oQry:nRecCount
      if nSeek > 0
        ::cDescripcion := oQry:nombre
      endif
      oQry:end()
      oGet[17]:refresh()
      oGet[18]:refresh()
  ENDIF
RETURN NIL

METHOD AddItem() CLASS AbcCompras
  local i
  LOCAL nIva := 0

  try
    if EMPTY( ATail( aData )[4] )
      ASize( aData, Len( oBrw:aArrayData ) - 1 )
    endif
  CATCH
  * ...
  end
  oBrw:refresh()

  ::nImporte    := Round( ::nPrecio * ::nCantidad , NDEC)

  if ::nImporte = 0
      ::nCantidad := 0
  endif
  aadd( oBrw:aArrayData, { ::cCodigo,;
                           ::nCantidad ,;
                           ::cUnidad_medida,;
                           ::cDescripcion  ,;
                           ::nPrecio ,;
                           ::nImporte,;
                           ::cExento, 0 } )
  //oBrw:MakeTotals()
  oBrw:GoDown()
  oBrw:refresh()

  ::cCodigo   := space( 15 )
  ::cDescripcion    := space( 60 )
  ::nCantidad   := 1
  ::nPrecio     := 0
  ::nImporte    := 0
  ::cExento     := ""

  for i := 1 to len( oGet )
    if oGet[i] != nil
      oGet[i]:refresh()
    endif
  next

  ::SumaCols()

  oGet[17]:SetFocus()

RETURN .t.

METHOD SumaCols() CLASS AbcCompras
   local i
   nTot1 := 0
   nTot2 := 0
   for i:= 1 to len( oBrw:aArrayData )
      if oBrw:aArrayData[i][7] = "S"
         nTot1 += Round( oBrw:aArrayData[i][6] ,NDEC)
      ELSE
         nTot2 += Round( (oBrw:aArrayData[i][6]) ,NDEC)
      ENDIF
   next
   ::nExento := nTot1
   ::nImpuesto := nTot2
   ::nVenta_total := ROUND( ::nExento + ::nImpuesto, NDEC )
   if ::nTipo > 0
      ::PideCantidad()
      ::ChkDescuento()
   endif
   
   ::nSubtotal := ROUND( ::nVenta_total-::nDescuento, NDEC )

   ::nIva := ROUND( (::nSubtotal-::nExento) * ( N15/100 ), NDEC )

   if ::cCalcula_ret_isr = "S"
      ::nIsr := ROUND( ::nSubtotal * ( nPorc_ret_isr /100 ), NDEC )
   ENDIF

   if ::cCalcula_ret_iva = "S"
      ::nRetencion := ROUND( ::nSubtotal * ( nPorc_ret_iva /100 ), 6 )
   ENDIF

   ::nTotal := ROUND( ::nSubtotal+::nIva-::nIsr-::nRetencion, NDEC )

   for i := 1 to len( oSay )
      if oSay[i] != nil
         oSay[i]:Refresh()
      endif
   next
   ::nTipo := 0
return nil

METHOD ChkDescuento() CLASS AbcCompras
  IF ::nTipo = 1 //por importe
    ::nDescuento := ROUND( nAmount, NDEC )
    ::nPorc_dscto := 0
  ELSEIF ::nTipo = 2 //por porcentaje
    ::nDescuento := ROUND( ::nVenta_total*( nAmount/100 ), NDEC )
    ::nPorc_dscto := nAmount
  endif
RETURN NIL

METHOD PideCantidad() CLASS AbcCompras
   local cPass := ""
   local cSay := iif( ::nTipo=1, "Importe a descontar:", "%Porcentaje a aplicar" )
   local nVar := 0
   local cPic := iif( ::nTipo=1, "999,999.99", "99.99%")
   

   if _MsgGet( "APLICAR DESCUENTO ?", cSay, @nVar, "hand", cPic, .f. , cPass )
      nAmount := nVar
   endif  
RETURN NIL

METHOD ChkCodigo() CLASS AbcCompras
   local cQry, oQry, nSeek
   local i
   if empty( ::cCodigo )
      return .t.
   endif
   cQry := "SELECT catalogo,nombre,precio_chica,exento_iva,unidad_medida"
   cQry += " FROM artics"
   cQry += " WHERE catalogo=" + C_SIMPLE + cstr2( ::cCodigo ) + C_SIMPLE
   cQry += " ORDER BY catalogo"
   oQry := ::oMain:oCon:Query( cQry )
   nSeek := oQry:nRecCount

   if nSeek > 0
      ::cDescripcion := oQry:nombre
      ::nCantidad := 1
      ::nPrecio   := oQry:precio_chica
      ::cExento   := oQry:exento_iva
      ::cUnidad_medida := oQry:unidad_medida
     
   endif
   oQry:end()
   if cGet_unidad_medida = "S"
      ::PideUnidad_medida()
   endif

   if ! empty( ::cUnidad_medida ) .and. "SERVICIO" $ ::cUnidad_medida ;
    .and. UPPER( cTomar_costo_soporte ) = "S"
    if ::nCosto_soporte > 0
        ::nPrecio := ::nCosto_soporte
      endif

   endif
   for i := 17 to 20
      oGet[i]:Refresh()
   next
  if empty( ::cUnidad_medida )  
    ::cUnidad_medida := PADR(FWString( "PIECES" ))
    //? "::: NO PROCEDE EL PROD. DEBE DE TENER UNIDAD DE MEDIDA ::: "
  ENDIF
RETURN .T.

METHOD PideUnidad_medida() CLASS AbcCompras
   local oBtn, oGet, oFont

   DEFINE FONT oFont NAME "TAHOMA" SIZE 10,-20

   DEFINE DIALOG oDlg font oFont

   @ 10, 10 SAY "Unidad de medida: " OF oDlg pixel
   @ 20, 10 COMBOBOX oGet VAR ::cUnidad_medida ITEMS AMEDIDAS OF oDlg  ;
            PIXEL SIZE 120, 200 UPDATE STYLE (CBS_DROPDOWN )

   oGet:oGet:bValid = { || MsgBeep(), .T. }

   @ 50, 30 BUTTON oBtn PROMPT "Aceptar"  SIZE 60, 24 OF oDlg ;
       ACTION ( oDlg:end() ) PIXEL

   ACTIVATE DIALOG oDlg CENTERED
RETURN NIL

METHOD MakeSays() CLASS AbcCompras
    local nRow := 5
    local nSt := 15
    local nCol :=  nST*24.5
    local oFont2,oFont3
    local nSalto := 12
    local cPic := "$999,999.99"

    DEFINE FONT oFont2 NAME "TAHOMA" SIZE 10,-20 bold
    DEFINE FONT oFont3 NAME "TAHOMA" SIZE 15,-25 bold

    @ nRow, nCol SAY FWString("Tax Of")+": " + transform(n15,"99.99%") ;
   OF ::oBox pixel font oFont2

   nRow += nSalto
   @ nRow,nCol SAY oSay[1] PROMPT transform( ::nImpuesto,cPic) ;
   OF ::oBox SIZE 100,14 FONT oFont2 PIXEL COLOR CLR_HRED,CLR_YELLOW BORDER
   nRow += nSalto*1.5

   @ nRow, nCol SAY "+ " + FWString("No Tax") OF ::oBox pixel font oFont2

   nRow += nSalto
   @ nRow,nCol SAY oSay[2] PROMPT transform( ::nExento,cPic) ;
   OF ::oBox SIZE 100,14 FONT oFont2 PIXEL COLOR CLR_HRED,CLR_YELLOW BORDER
   nRow += nSalto*1.5

   @ nRow, nCol SAY "=Sub. Total 1" OF ::oBox pixel font oFont2
   nRow += nSalto
   @ nRow,nCol SAY oSay[3] PROMPT transform( ::nVenta_total,cPic) ;
   OF ::oBox SIZE 100,14 FONT oFont2 PIXEL COLOR CLR_HBLUE,CLR_YELLOW BORDER
   nRow += nSalto*1.5

   @ nRow, nCol SAY "- " + FWString("Discount") OF ::oBox pixel font oFont2
   nRow += nSalto
   @ nRow,nCol SAY oSay[4] PROMPT transform( ::nDescuento,cPic) ;
   OF ::oBox SIZE 100,14 FONT oFont2 PIXEL COLOR CLR_HBLUE,CLR_YELLOW BORDER
   nRow += nSalto*1.5

   @ nRow, nCol SAY "=Subtotal 2" OF ::oBox pixel font oFont2
   nRow += nSalto
   @ nRow,nCol SAY oSay[5] PROMPT transform( ::nSubtotal,cPic) ;
   OF ::oBox SIZE 100,14 FONT oFont2 PIXEL COLOR CLR_HBLUE,CLR_YELLOW BORDER
   nRow += nSalto*1.5

   @ nRow, nCol SAY "+ " + FWString("Tax") OF ::oBox pixel font oFont2
   nRow += nSalto
   @ nRow,nCol SAY oSay[6] PROMPT transform( ::nIva,cPic) ;
   OF ::oBox SIZE 100,14 FONT oFont2 PIXEL COLOR CLR_GREEN,CLR_YELLOW BORDER
   nRow += nSalto*1.5

   @ nRow, nCol SAY FWString("Total to pay") OF ::oBox pixel font oFont2 COLOR CLR_HMAGENTA
   nRow += nSalto
   @ nRow,nCol-10 SAY oSay[10] PROMPT transform( ::nTotal,"$9,999,999.99") ;
   OF ::oBox SIZE 150,20 FONT oFont3 PIXEL COLOR CLR_HMAGENTA,CLR_YELLOW BORDER
   nRow += nSalto*1.5


RETURN NIL

Method MakeBrwData( nRow ) class AbcCompras
  aData := { { CCODIGO,;
               NCANTIDAD,;
               CUNIDAD,;
               CDESCRIPCION         ,;
               NPRECIO,;
               NIMPORTE,;
               CEXENTO ,;
               NRECNO } }

  //if ! ::lEdit
  //  ::ShowFactura()
  //endif              

  @ nRow+10,10 XBROWSE oBrw SIZE -140,-100 PIXEL OF ::oBox ;
      DATASOURCE aData ;
      COLUMNS 1, 2, 3, 4,5,6,7,8 ;
      HEADERS FWString("Code"),;
              FWString("Quantity"),;
              FWString("Unit"),;
              FWString("Description"),;
              FWString("Price"),;
              FWString( "Amount" ),;
              FWString("Tax"),"Reg." ;
      PICTURES "@!k", "999999", "@!k", "@!k","999,999.99999",;
      "999,999.99999","@!k","999999" ;
      COLSIZES 90, 60, 80,175,90,90,60,60;
      CELL LINES FOOTERS NOBORDER //FASTEDIT

  // oBrw:bLDblClick := {|| ::PideCantidad(), oBrw:refresh(), oBrw:setfocus() }
  oBrw:nStretchCol         := STRETCHCOL_LAST

  oBrw:lFooter      := .t.
  // oBrw:aCols[ 3 ]:cFooter := "Cant. PIEZAS ...:"
  oBrw:bClrHeader := {|| { nRGB(140, 0, 0), nRGB( 231, 242, 255 ), } }
  oBrw:bClrFooter := oBrw:bClrHeader

  oBrw:nMarqueeStyle    = MARQSTYLE_HIGHLWIN7      
  oBrw:nDataLines := 2
  oBrw:bKeyDown := {|nKey| ::Teclas(nKey) }

  oBrw:CreateFromCode()

RETURN NIL

METHOD Teclas( nKey ) CLASS AbcCompras
  if nKey = VK_DELETE
    MsgBeep()
    if oBrw:aArrayData[oBrw:nArrayAt][8] > 0
      aadd( aItemsDel, { nFactura,cSeriex, oBrw:aArrayData[oBrw:nArrayAt][8] })
    endif
    ADel( oBrw:aArrayData, oBrw:nArrayAt )
    ASize( oBrw:aArrayData, Len( oBrw:aArrayData ) - 1 )
    oBrw:Refresh()
    ::SumaCols()
  ENDIF

RETURN NIL
 


saludos..



Gracias Ing. Cesar Cortez por compartir tu codigo,aunque no llego a la parte de sql tdolphin, pero ya da mas la idea de como implementarlo.

Gracias de nuevo

Saludos

Atte: Adrian C. C.
ACC69
 
Posts: 632
Joined: Tue Dec 12, 2006 7:34 pm

Re: Ejemplo sencillo de factura

Postby Compuin » Thu Nov 23, 2017 9:50 pm

FranciscoA wrote:Rosita:

Se que Jose Luis te está atendiendo, sin embargo quiero participar para que inicies tu proyecto.

Saludos, José Luis.

Te he enviado los fuentes de un programa de facturacion completo.

Lo hice cuando comenzaba a independizarme en esto (1996). Muy novato en ese entonces.

Las .dll son de 16 bits, asi que necesitaras pasarlas a 32. Aqui en el foro de FiveWin encontrarás como hacerlo.

Renombra el archivo .zip a .zop

Espero te sean de ayuda para finalizar tu proyecto.


Hola Francisco,

Podrias enviarme este programa a mi tambien ? Mi email es compuin@gmail.com

Gracias de antemano

Saludos.
FWH 20.12
Hbmk2 32/64 Bits (Build 19.29.30133)
Microsoft Visual C 32 Bits
MySql 8.0.24 32/64 Bits
VS Code
Compuin
 
Posts: 1213
Joined: Tue Dec 28, 2010 1:29 pm
Location: Quebec, Canada

Re: Ejemplo sencillo de factura

Postby Compuin » Thu Nov 23, 2017 9:51 pm

joseluisysturiz wrote:Enviado a tu correo un programito completo de facturacion que consegui en el baul, renombralo de .ror a .rar y luego descomprimes, saludos... :shock:


Hola Jose luis, podrias enviarme el programa a mi tambien ? Mi email es compuin@gmail.com

Gracias
FWH 20.12
Hbmk2 32/64 Bits (Build 19.29.30133)
Microsoft Visual C 32 Bits
MySql 8.0.24 32/64 Bits
VS Code
Compuin
 
Posts: 1213
Joined: Tue Dec 28, 2010 1:29 pm
Location: Quebec, Canada

Re: Ejemplo sencillo de factura

Postby TOTOVIOTTI » Thu Dec 21, 2017 12:35 pm

Serías tan amable de compartírmelo también? rjviotti@gmail.com
Muchas gracias!
Univ@c I.S.I.
Desarrolladores de Software
http://www.elcolegioencasa.edu.ar
User avatar
TOTOVIOTTI
 
Posts: 387
Joined: Fri Feb 05, 2010 11:30 am
Location: San Francisco - Córdoba - Argentina

PreviousNext

Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: No registered users and 21 guests