FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour Planning reservas hotel
Posts: 41
Joined: Wed Sep 23, 2009 11:50 AM
Planning reservas hotel
Posted: Mon Feb 25, 2013 10:31 PM

Buenas tardes,

Estoy empezando con la construcción de un planning de reservas para hotel.

Intento usar la clase Tgantt pero me parece que si uso la xBrowse (que conozco más), la cosa resultará mejor.

Por esto pido consejo a quien/es haya/n hecho algún planning de reservas.

Gracias.

Rolis

Posts: 2064
Joined: Fri Jan 06, 2006 09:28 PM
Re: Planning reservas hotel
Posted: Mon Feb 25, 2013 11:35 PM

Rolis, prueba con la TCalex de Daniel, es buena para eso, el colega Otto, creo tiene un sistema para HOTEL, muy completo y me parece verle visto algo como la TCalex en una de sus pantallas, saludos... :shock:

Dios no está muerto...



Gracias a mi Dios ante todo!
Posts: 2365
Joined: Wed Nov 02, 2005 11:46 PM
Re: Planning reservas hotel
Posted: Tue Feb 26, 2013 01:30 AM

Saludos

Mandame un email para enviarte una clase que te puede servir

Posts: 1144
Joined: Mon Feb 05, 2007 07:15 PM
Re: Planning reservas hotel
Posted: Tue Feb 26, 2013 02:05 AM

Daniel se puede? sysctrl@prodigy.net.mx ( sysctrl arroba prodigy.net.mx

saludos.

Cesar Cortes Cruz

SysCtrl Software

Mexico



' Sin +- FWH es mejor "
Posts: 1078
Joined: Thu Sep 27, 2007 03:47 PM
Re: Planning reservas hotel
Posted: Tue Feb 26, 2013 02:10 AM

Daniel tengo tambien hacer algo similar ,
Una planta de produccion necesito un planificardor para planear los pedidos algo parecido como al project de office o el Tgantt no conosco tu clase me gustaria ver si me sirve la que tienes.
De antemano gracias y saludos.

Ruben Dario Gonzalez
Cali-Colombia
rubendariogd@hotmail.com - rubendariogd@gmail.com
Posts: 2365
Joined: Wed Nov 02, 2005 11:46 PM
Re: Planning reservas hotel
Posted: Tue Feb 26, 2013 02:39 AM

Saludos

Ante la demanda la publicare un demo aqui

Posts: 2365
Joined: Wed Nov 02, 2005 11:46 PM
Re: Planning reservas hotel
Posted: Tue Feb 26, 2013 05:48 PM
Aqui les dejo un ejemplo de una clase para planning de reservas de hotel (fue a peticion de un usuario)

Maneja los estatus de habitaciones de forma personalizada junto con los colores de las mismas, es decir, cada quien decide que tipo de estatus manejara...

La clase se encarga del pintado, el manejo de los datos va por cuenta de los programadores, tiene la opcion de mover las reservas mas no de ampliar/reducir los dias

aqui dejo el prg ejemplo y la url de descarga del exe

http://sitasoft.net/fivewin/samples/plann.zip



Code (fw): Select all Collapse
#include "fivewin.ch"
#include "ord.ch"
#include "planning.ch"
#include "dtpicker.ch"

REQUEST DBFCDX
REQUEST HB_Lang_ES
REQUEST HB_CODEPAGE_ESWIN

#define PLANNING_RESERVED   1
#define PLANNING_CONFIRMED  2
#define PLANNING_OCCUPIED   3
#define PLANNING_CANCELED   4
#define PLANNING_EMPTY      5

function Main()

   SET DATE FORMAT "MM/DD/YYYY"
   SET DELETE ON
      
   HB_LangSelect("ES") 
   HB_CDPSELECT("ESWIN")

      
   SamplePlan():New()

return nil

// status 01 reserved
// status 02 confirmed
// status 03 occupied
// status 04 canceled

//---------------------------------------------------//

CLASS SamplePlan

   DATA oPlann
   DATA oWnd
   DATA aStatus
   DATA dStart, dEnd
   
   METHOD New()
   
   METHOD BuildDbf()
   METHOD BuildDialog()
   METHOD BuildPlanning()
   METHOD BuildPop()
   
   METHOD DeleteData( oPlan, dCheckIn ) 
   
   METHOD ColorData( oData )
   
   METHOD LoadData() 
   METHOD LoadRooms()
   METHOD MoveReservation( nRow, nCol, nType )

   
ENDCLASS

//---------------------------------------------------//

METHOD New() CLASS SamplePlan
   
   local oMenu, oBrush
   local oSelf := Self
   
   ::aStatus = { "Reserved", "Confirmed", "Occupied", "Canceled", "Empty" }
   
   
   MENU oMenu
   ENDMENU
   
   DEFINE BRUSH oBrush COLOR CLR_WHITE
   
   ::BuildDbf()
   
   DEFINE WINDOW ::oWnd BRUSH obrush
   
   ::BuildPlanning()
   ::LoadRooms()
   ::LoadData()
   
   ::oWnd:oClient = ::oPlann
   
   ACTIVATE WINDOW ::oWnd
   
   oBrush:End()
 
   
RETURN Self

//---------------------------------------------------//


METHOD BuildDbf() CLASS SamplePlan

   local aStructure
   local i

   if ! File( "rooms.dbf" )
   
      aStructure = { { "id"   , "C",   4, 0 },;
                     { "name" , "C",  30, 0 },;
                     { "type" , "C",   2, 0 } }
                        
      DBCreate( "rooms", aStructure, "DBFCDX" )
      
   endif
   
   if ! File( "reserva.dbf" )
   
      aStructure = { { "date"     , "D",   8, 0 },;
                     { "rooms_id" , "C",   4, 0 },;
                     { "check_in" , "D",   8, 0 },;
                     { "check_out", "D",   8, 0 },; 
                     { "status"   , "C",   2, 0 },;
                     { "guest"    , "C",  30, 0 } }
                        
      DBCreate( "reserva", aStructure, "DBFCDX" )      
      
   ENDIF                        

   USE ROOMS ALIAS ROOMS VIA "DBFCDX" NEW   
   INDEX ON ROOMS->ID TAG rooms_id TO rooms
   
   USE RESERVA ALIAS RESERVA VIA "DBFCDX" NEW
   INDEX ON RESERVA->ROOMS_ID + DToS( RESERVA->CHECK_IN ) TAG room_in TO reserva
   
   if ROOMS->( LastRec() ) == 0
      for i = 1 to 30
         ROOMS->( DbAppend() )
         ROOMS->ID   = StrZero( i, 2 )
         ROOMS->NAME = "Room " + StrZero( i, 2 )
         ROOMS->TYPE = StrZero( i % 5, 2 )
      next
   endif
   

RETURN nil

//---------------------------------------------------//

METHOD BuildDialog( oPlan, dCheckIn, dCheckOut ) CLASS SamplePlan

   local oDlg, oCbx
   local lSave := .F.
   local lNew := .T.
   local cVar, cName := Space( 30 )
   local nAt := 1
   
   if oPlan:oLastData != NIL 
      lNew = ! oPlan:oLastData:lSelected
   endif   

   DEFINE DIALOG oDlg TITLE "Adding Data" SIZE 350, 370
   
   if ! lNew
      RESERVA->( DBSeek( oPlan:GetRowID() + DToS( dCheckIn ) ) )
      cName    := RESERVA->GUEST
      nAt      := Val( RESERVA->STATUS )
   endif

   
   //cCheckIn = oPlan:aSelected[ 1 ]
   
   @ 10, 10 SAY "Room: " + oPlan:GetRowText()  OF oDlg PIXEL
   @ 25, 10 SAY "Check In: " + DToC( dCheckIn ) OF oDlg PIXEL
   @ 40, 10 SAY "Check Out:" + DToC( dCheckOut ) OF oDlg PIXEL   
   @ 55, 10 SAY "Status:" OF oDlg PIXEL
   @ 55, 55 COMBOBOX oCbx VAR cVar; 
             ITEMS ::aStatus; 
             STYLE CBS_DROPDOWN PIXEL
   @ 70, 10 SAY "Guest Name:" OF oDlg PIXEL
   @ 70, 55 GET cName OF oDlg PIXEL

   @ 170, 10 BUTTON "OK" PIXEL ACTION ( lSave := .T., oDlg:End() )
   @ 170, 100 BUTTON "CANCEL" PIXEL ACTION ( oDlg:End() )

   ACTIVATE DIALOG oDlg CENTERED;
            ON INIT oCbx:Select( nAt )

   IF lSave 
      if lNew         
         RESERVA->( DBAppend() )
      else
         RESERVA->( DBSeek( oPlan:GetRowID() + DToS( dCheckIn ) ) )
      endif
                     
      RESERVA->DATE      = Date()
      RESERVA->ROOMS_ID  = oPlan:GetRowID()
      RESERVA->CHECK_IN  = dCheckIn
      RESERVA->CHECK_OUT = dCheckOut
      RESERVA->STATUS    = StrZero( oCbx:nAt, 2 )
      RESERVA->GUEST     = cName 
      RESERVA->( DbCommitAll() )
      
      ::LoadData()
      oPlan:Refresh()      
      
   ENDIF

RETURN nil

//---------------------------------------------------//

METHOD BuildPlanning() CLASS SamplePlan 

   LOCAL oSelf := Self

   DEFINE PLANNING ::oPlann OF ::oWnd;
          COLOR HEADER ( If( Dow( dDate ) == 1 .OR.  Dow( dDate ) == 7, CLR_WHITE, ::oPlann:nClrText )  );
          COLOR CELL ::ColorData( oData ) ;
          START DAY Date() - 5;
          END DAY Date() + 5;
          ON RIGHT SELECT oSelf:BuildPop( nRow, nCol, Self, dCheckIn, dCheckOut )
     
   ::oPlann:bOnCapture = { | nRow, nCol, pHitTest | If( pHitTest:nMoveType != 0, ::MoveReservation(nRow, nCol, pHitTest:nMoveType), ) }
   ::dStart = ::oPlann:dStart
   ::dEnd = ::oPlann:dEnd
   
   
   @ 10, 10 DTPICKER ::dStart OF ::oPlann pixel ;
            ON CHANGE ( if( oSelf:dStart != oSelf:oPlann:dStart, ( oSelf:oPlann:SetDates( oSelf:dStart ), oSelf:LoadData() ), ) )
            
   @ 10, 120 DTPICKER ::dEnd OF ::oPlann pixel;
            ON CHANGE ( if( oSelf:dEnd != oSelf:oPlann:dEnd, ( oSelf:oPlann:SetDates( , oSelf:dEnd ), oSelf:LoadData() ), ) )

RETURN nil


//---------------------------------------------------//

METHOD BuildPop( nRow, nCol, oPlan, dCheckIn, dCheckOut ) CLASS SamplePlan

   local oMenu
   local oSelf := Self
   local lNew := .T.
   
   if oPlan:oLastData != NIL 
      lNew = ! oPlan:oLastData:lSelected
   endif
      
   MENU oMenu POPUP
      MENUITEM If( lNew, "New Reserve",;
                         "Modify Reserve" ) ACTION oSelf:BuildDialog( oPlan, dCheckIn, dCheckOut )
      if ! lNew                         
         MENUITEM "Delete Reserve"  ACTION If( MsgYesNo( "Are you sure?" ), oSelf:DeleteData( oPlan, dCheckIn ) , )
      endif

   ENDMENU


   ACTIVATE POPUP oMenu OF oPlan AT nRow, nCol

RETURN nil  

//---------------------------------------------------//

METHOD DeleteData( oPlan, dCheckIn ) CLASS SamplePlan

   if RESERVA->( DBSeek( oPlan:GetRowID() + DToS( dCheckIn ) ) )
       RESERVA->( DBDelete() )
       oPlan:DeleteData( oPlan:oLastData )
   endif
      
   
RETURN nil   


//---------------------------------------------------//

METHOD ColorData( oData ) CLASS SamplePlan
   local aGrad
   
   //"Reserved", "Confirmed", "Occupied", "Calceled", "Empty"
   switch oData:Cargo
      case PLANNING_RESERVED
         aGrad = { { 1, RGB(0x9a,0xcd,0x32), RGB(0x9a,0xcd,0x32) } }
         exit
      case PLANNING_CONFIRMED
         aGrad = { { 1, RGB(0x00,0x80,0xff) , RGB(0x00,0x80,0xff) } }
         exit
      case PLANNING_OCCUPIED
         aGrad = { { 1, RGB(0xff,0xff,0x80), RGB(0xff,0xff,0x80) } }
         exit
      case PLANNING_CANCELED
         aGrad = { { 1, RGB(0xff,0x00,0x00), RGB(0xff,0x00,0x00) } }
         exit
      case PLANNING_EMPTY
         aGrad = { { 1, RGB(0xc0,0xc0,0xc0), RGB(0xc0,0xc0,0xc0) } }
         
   endswitch

return aGrad
      
//---------------------------------------------------//      

METHOD LoadData() CLASS SamplePlan      

   local cDescribe
   local nStatus
   local cTooltip, oData

   //Clear scopes
   RESERVA->( OrdSetFocus( "room_in" ) )
   RESERVA->( OrdScope( TOPSCOPE, NIL ) )
   RESERVA->( OrdScope( BOTTOMSCOPE, NIL ) )
   RESERVA->(  DBGoTop() )
   RESERVA->( OrdScope( TOPSCOPE, Month( ::oPlann:dStart ) ) )
   RESERVA->( OrdScope( BOTTOMSCOPE, Month( ::oPlann:dEnd ) ) )
   RESERVA->(  DBGoTop() )
  
   DO WHILE ! RESERVA->( Eof() )
      if DToS( RESERVA->CHECK_OUT ) > DToS( ::oPlann:dStart ) .AND. DToS( RESERVA->CHECK_IN ) < DToS( ::oPlann:dEnd )

         cDescribe = "Empty..."
         nStatus = Val( RESERVA->STATUS )
         if nStatus > 0 .and. nStatus < 5
            cDescribe = ::aStatus[ nStatus ]
         endif
         
   
         ROOMS->( DbSeek( RESERVA->ROOMS_ID ) )
         
         cTooltip  = "Room     : " + ROOMS->NAME + CRLF
         cTooltip += "Guest    : " + RESERVA->GUEST + CRLF
         cTooltip += "Check In : " + DToC( RESERVA->CHECK_IN ) + CRLF
         cTooltip += "Check Out: " + DToC( RESERVA->CHECK_OUT )
         oData = ::oPlann:AddData( RESERVA->ROOMS_ID,;
                           RESERVA->CHECK_IN,;
                           RESERVA->CHECK_OUT,;
                           cDescribe, cToolTip )
         if oData != NIL                  
            oData:Cargo = nStatus
         endif
      endif
                        
      RESERVA->( DbSkip() )
      
   ENDDO

return NIL


//---------------------------------------------------//

METHOD LoadRooms() CLASS SamplePlan

   local n
   local cRowName, cRowText
   local oData
   
   ROOMS->( DbGoTop() )
   
   DO WHILE ! ROOMS->( Eof() )
      ::oPlann:AddRow( ROOMS->ID, ROOMS->NAME )
      ROOMS->( DbSkip() )
   ENDDO   

   
RETURN nil

//---------------------------------------------------//

METHOD MoveReservation( nRow, nCol, nType ) CLASS SamplePlan

   local oPlann := ::oPlann
   local oItem := oPlann:oLastData
   local cDescribe, cTooltip, oData, nStatus
      
   if nType > 0
      cDescribe = oItem:cDescribe
      nStatus = oItem:Cargo
      oPlann:DeleteData( oItem, .F. )
      RESERVA->( DBSeek( oPlann:GetRowID() + DToS( oItem:dStart ) ) )
   endif
      
   switch nType
      case PLANNING_MOVE_RIGTH
         RESERVA->CHECK_IN = RESERVA->CHECK_IN + 1
         RESERVA->CHECK_OUT = RESERVA->CHECK_OUT + 1
         RESERVA->( DbCommitAll() )
         exit
      case PLANNING_MOVE_LEFT
         RESERVA->CHECK_IN = RESERVA->CHECK_IN - 1
         RESERVA->CHECK_OUT = RESERVA->CHECK_OUT - 1
         RESERVA->( DbCommitAll() )
         exit
      case PLANNING_MOVE_UP
      case PLANNING_MOVE_DOWN
         RESERVA->ROOMS_ID = oPlann:GetRowID(oPlann:GetAtRow( nRow ))
         RESERVA->( DbCommitAll() )
         exit 
   endswitch
   
   
   if nType > 0
      cTooltip  = "Room     : " + ROOMS->NAME + CRLF
      cTooltip += "Guest    : " + RESERVA->GUEST + CRLF
      cTooltip += "Check In : " + DToC( RESERVA->CHECK_IN ) + CRLF
      cTooltip += "Check Out: " + DToC( RESERVA->CHECK_OUT )
      oData = oPlann:AddData( RESERVA->ROOMS_ID,;
                       RESERVA->CHECK_IN,;
                       RESERVA->CHECK_OUT,;
                       cDescribe, cToolTip )
      oData:Cargo = nStatus
      oPlann:oLastData = NIL
      oPlann:SelectCell( nRow, nCol )
      oPlann:Refresh()
   endif

RETURN nil

//---------------------------------------------------//

function HB_COMPILEFROMBUF()
return nil

function curdrive()
return nil
Posts: 41
Joined: Wed Sep 23, 2009 11:50 AM
Re: Planning reservas hotel
Posted: Tue Feb 26, 2013 05:57 PM

Daniel,

Muchas gracias por tu atención. Parece ser lo que buscaba y más aún.

Ahora a probarlo.

De nuevo, gracias.

Rolis

Posts: 41
Joined: Wed Sep 23, 2009 11:50 AM
Re: Planning reservas hotel
Posted: Tue Feb 26, 2013 10:01 PM

Daniel,

No puedo compilar porque falta el planning.ch y no se si faltaría algo más, la clase parece muy sencilla (por todo lo que hace según el exe).

Espero tus comentarios. Gracias

Rolis

Posts: 2365
Joined: Wed Nov 02, 2005 11:46 PM
Re: Planning reservas hotel
Posted: Tue Feb 26, 2013 10:52 PM

Hola

no podras compilarlo, te mande el exe para que lo probases y el fuente del ejemplo para que vieras mas o menos como es el codigo... pero los fuentes de la clase y la cabecera no estan en el zip, si te interesa puedes enviarme un email

Posts: 845
Joined: Sun Oct 09, 2005 05:36 PM
Re: Planning reservas hotel
Posted: Tue Feb 26, 2013 11:25 PM
daniel, esta interesante y me interesa ya que yo lo hago con wbrowse y tarray, aqui una imagen, saludos



tcalex enviada a tu gmail
____________________

Paco
Posts: 593
Joined: Sat May 12, 2007 11:47 AM
Re: Planning reservas hotel
Posted: Tue Feb 26, 2013 11:49 PM

Daniel,

Muy bueno lo tuyo.

Francisco,

Se ve muy bien, yo estoy intentando el hacerlo con la xbrowse. Espero poder lograrlo.

Felicitaciones a ambos.

Rolando :D

Posts: 344
Joined: Sat Jul 22, 2006 09:04 PM
Re: Planning reservas hotel
Posted: Wed Feb 27, 2013 02:13 AM

Espectacular Daniel la clase, se me viene a la mente poder utilizarla en distintos proyectos.
Me anoto para que me envies la clase.
Saludos y gracias.
Marcelo

FWH - Harbour - BCC7 - PellesC
Posts: 880
Joined: Fri Jan 12, 2007 08:35 PM
Re: Planning reservas hotel
Posted: Wed Feb 27, 2013 05:07 AM

Impresionante :shock:

yo quisiera tenerla :mrgreen:

Saluditos :wink:

Que es mejor que programar? creo que nada :)
Atropellada pero aqui ando :P

I love Fivewin

séʌǝɹ ןɐ ɐʇsǝ opunɯ ǝʇsǝ
Posts: 694
Joined: Fri Oct 07, 2005 06:58 AM
Re: Planning reservas hotel
Posted: Wed Feb 27, 2013 09:25 AM

Muy, pero que muy bueno Daniel.

Un saludo

Fernando González Diez

ALSIS Sistemas Informáticos