gestión de tarifas (de agua) [Solucionado]

gestión de tarifas (de agua) [Solucionado]

Postby joseluispalma » Thu Mar 13, 2014 6:29 pm

Hola compañeros,

Me gustaría pediros opinión a ver cómo se podría hacer lo siguiente.

Para una comunidad de propietarios que tiene que facturar a sus clientes el agua potable, aplican una escala de tarifas:

De 0 a 100 m3.....: 0,2 euros/litro
De 101 a 200 m3
De 201 a 300 m3
De 301 a 400 m3
etc.

Lo que no sé es de qué forma guardar estos valores en una dbf para que el cliente luego los pueda modificar y añadir más tramos.

A ver si algún alma caritativa me da algo de luz por favor.

Muchas gracias.
Last edited by joseluispalma on Sun Mar 16, 2014 5:03 pm, edited 1 time in total.
joseluispalma
 
Posts: 109
Joined: Mon Apr 30, 2012 9:10 am

Re: gestión de tarifas (de agua)

Postby cnavarro » Thu Mar 13, 2014 6:50 pm

Jose Luis
Se me ocurre lo siguiente, que creo es lo más fácil:
Base de datos:

nTarifa
IniTarifa
FinTarifa
Precio

Con eso ya tienes los campos a rellenar, pero quizás el único problema que te vas a encontrar es cuando vas a grabar:
Has de comprobar que el intervalo que defines no se superpone ni por la izda, ni por la derecha, ni interiormente con ninguno de los que ya hay grabados
Espero te ayude en algo
Cristobal Navarro
Hay dos tipos de personas: las que te hacen perder el tiempo y las que te hacen perder la noción del tiempo
El secreto de la felicidad no está en hacer lo que te gusta, sino en que te guste lo que haces
User avatar
cnavarro
 
Posts: 6548
Joined: Wed Feb 15, 2012 8:25 pm
Location: España

Re: gestión de tarifas (de agua)

Postby cnavarro » Thu Mar 13, 2014 6:55 pm

También otra idea sería no poner el ID de tarifa (nTarifa anterior) y crearlo con los datos de IniTarifa y FinTarifa pasándolos a cadena y concatenando ambos poniendo un separador (por ejemplo "/")
Cristobal Navarro
Hay dos tipos de personas: las que te hacen perder el tiempo y las que te hacen perder la noción del tiempo
El secreto de la felicidad no está en hacer lo que te gusta, sino en que te guste lo que haces
User avatar
cnavarro
 
Posts: 6548
Joined: Wed Feb 15, 2012 8:25 pm
Location: España

Re: gestión de tarifas (de agua)

Postby joseluispalma » Thu Mar 13, 2014 7:28 pm

Hola Cristóbal,

Muchas gracias por tu respuesta.

Has de comprobar que el intervalo que defines no se superpone ni por la izda, ni por la derecha, ni interiormente con ninguno de los que ya hay grabados


Eso es lo que realmente no sé como programarlo. Hay que sacar el desglose, ya que hay que debo facturar por tramos y sacar los tramos que correspondan. Eso es lo que no tengo tan claro cómo hacerlo:

Por ejemplo, si tengo 302 m3 de consumo:

De 0 a 100 m3: 0,2 x 100 m3
De 101 a 200: 0,3 x 99
De 201 a 300: 0,4 x 99
De 301 a 302: 0,5 x 2

Esto último es lo qué no se bien cómo programarlo.

Muchísimas gracias de verdad.
joseluispalma
 
Posts: 109
Joined: Mon Apr 30, 2012 9:10 am

Re: gestión de tarifas (de agua)

Postby Armando » Thu Mar 13, 2014 9:43 pm

Amigo:


También te puedes ahorrar el campo IniTarifa quedando solo

FinTarifa (indexar por este campo) y
Precio por litro

Si pudieras ser un poco más especifico sobre cómo se hace el cobro
tomando como ejemplo los 302 litros de consumo.

Saludos
SOI, s.a. de c.v.
estbucarm@gmail.com
http://www.soisa.mex.tl/
http://sqlcmd.blogspot.com/
Tel. (722) 174 44 45
Carpe diem quam minimum credula postero
User avatar
Armando
 
Posts: 3228
Joined: Fri Oct 07, 2005 8:20 pm
Location: Toluca, México

Re: gestión de tarifas (de agua)

Postby joseluisysturiz » Thu Mar 13, 2014 9:59 pm

Haber si entendi, como dice el colega, si creas ID para los intervalos de consumo y su tarifa, ya tienes casi todo hecho, ahora lo que necesitas es saber el monto consumido y hacer un recorrido por lo ID de los intervalos y ver si el consumo es sta dentro de alguno y en ese momento tomas el monto, si trabajas con mysql, eso lo haces solito con una clausula llamada between, si es con DBF entonces debes hacer el calculo con si es mayor o igual a nIni y menor e igual a nFin y asi saber a cual tarifa pertenece el consumo entrado, te explico..

id_tarifa 001
rango_ini 0 lts
rango_fin 100 lts
tarifa 0,2 euros

nTarifa := nConsumo := 0
Solicitas consumo: nConsumo = 70 lts

do while !eof()
if nConusmo >= rango_ini and nConsumo <= rango_fin
nTarifa := nConsumo * tarifa
skip
enddo

? "Ud pagara: " + str(nTarifa)
? "por el consumo de: " + str(nConsumo)

nose si es eso lo que quieres, si es asi espero haberte ayudado y sino, alli volvemos a leer haber, 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: gestión de tarifas (de agua)

Postby FranciscoA » Fri Mar 14, 2014 3:04 am

Hola, prueba este ejemplo, a ver si es lo que necesitas:
Code: Select all  Expand view
//----------------//BUSCAR UN RANGO ENTRE DOS VALORES
Function DeHasta()
local cAlias, oDlg, oBrw, nConsumo:=0, oConsumo
local nWd := GetSysMetrics(0) *  .90  // .75
local nHt := GetSysMetrics(1) / 1.20   // 2


dbCreate("C:\DeHasta",{{"DE",    "N", 10,0},;
                       {"HASTA", "N", 10,0},;
                       {"TARIFA","N", 10,2}})

dbusearea(.t.,,"C:\DeHasta","DeHasta",.t.)
cAlias:=Alias()

(cAlias)->(dbappend())
(cAlias)->de := 0  ;  (cAlias)->hasta := 100  ; (cAlias)->tarifa := 0.1
(cAlias)->(dbappend())
(cAlias)->de := 101  ;  (cAlias)->hasta := 200  ; (cAlias)->tarifa := 0.2
(cAlias)->(dbappend())
(cAlias)->de := 201  ;  (cAlias)->hasta := 300  ; (cAlias)->tarifa := 0.3
(cAlias)->(dbappend())
(cAlias)->de := 301  ;  (cAlias)->hasta := 400  ; (cAlias)->tarifa := 0.4
(cAlias)->(dbappend())
(cAlias)->de := 401  ;  (cAlias)->hasta := 500  ; (cAlias)->tarifa := 0.5


DEFINE DIALOG oDlg SIZE nWd,nHt PIXEL TITLE "RANGOS DE CONSUMO"
   nWd  /= 2
   nHt  /= 2

@1,1 XBROWSE oBrw OF oDlg ;
     COLUMNS "DE","HASTA","TARIFA";
     ALIAS cAlias

   WITH OBJECT oBrw
      :nTop                   := 25  
      :nLeft                  := 10
      :nBottom                := :nTop + nHt - 45
      :nRight                 := :nLeft + nWd - 20
      :nMarqueeStyle          := MARQSTYLE_HIGHLROW  
      :lColDividerComplete    := .t.
      :nStyle                 := nAnd( :nStyle, nNot( WS_BORDER ) )
      :nColDividerStyle:=LINESTYLE_LIGHTGRAY
      :nRowDividerStyle:=LINESTYLE_LIGHTGRAY
      :nHeaderHeight    := 30  //altura del header
      :nHeadStrAligns := AL_CENTER  //texto cabeceras de cols centrado
   END

   WITH OBJECT oBrw:aCols[1]
      :nWidth := 60
      :nEditType := 1
   END  

   WITH OBJECT oBrw:aCols[2]
      :nWidth := 60
      :nEditType := 1
   END  

   WITH OBJECT oBrw:aCols[3]
      :nWidth := 60
      :nEditType := 1
   END  

   oBrw:CreateFromCode()

   @ nHt-135, 10  SAY "Consumo: " SIZE 50,8 PIXEL OF oDlg
   @ nHt-135, 50  GET oConsumo VAR nConsumo SIZE 54,10 PIXEL OF oDlg PICTURE "99,999";
         VALID ( BuscRango(nConsumo,oBrw,cAlias), .T. )

   @ nHt-15, 124 BUTTON 'Salir'  SIZE 35,11 PIXEL OF oDlg   ACTION ( oDlg:End() ) CANCEL

   ACTIVATE DIALOG oDlg CENTERED ;
        ON INIT ( FitSizes( oBrw, ), oConsumo:SetFocus() )

   (cAlias)->(DBCLOSEAREA())
   Ferase("C:\"+(cAlias)+".dbf")
RETURN nil

//----------------------------
Function BuscRango(nConsumo,oBrw,cAlias)
local nTarifa:=0

(cAlias)->(dbgotop())
While (cAlias)->(!eof())
   if (cAlias)->hasta >= nConsumo
      nTarifa:= (cAlias)->Tarifa
      Exit
   endif
   (cAlias)->(dbskip())
enddo

   MsgInfo("
Tarifa es: "+Transform(nTarifa,"9,999.99"))
   oBrw:Refresh()
   oBrw:SetFocus()
return nTarifa

Saludos.
Francisco J. Alegría P.
Chinandega, Nicaragua.

Fwxh-MySql-TMySql
User avatar
FranciscoA
 
Posts: 2158
Joined: Fri Jul 18, 2008 1:24 am
Location: Chinandega, Nicaragua, C.A.

Re: gestión de tarifas (de agua)

Postby joseluispalma » Fri Mar 14, 2014 7:55 am

Hola compañeros,

Muchísimas gracias a todos por la ayuda prestada. Ya prácticamente está.

El problema es que las tarifas deben ser acumulativas. Me explico, si tengo 303 m3 de agua:

- Los primeros 100 litros van a la primera tarifa, de 0,2/m3
- Los 99 siguientes van a la segunda tarifa, de 0,3/m3
- Los 99 siguientes van a la tercera tarifa, de 0,4/m3
- Los 5 últimos litros van a la cuarta tarifa, de 0,5/m3

Tal que así para 303 m3 de agua:

De 0 a 100 m3->: 0,2 x 100 m3 =20 euros
De 101 a 200->: 0,3 x 99 m3 =29,7 euros
De 201 a 300->: 0,4 x 99 m3 = 39,6 euros
De 301 a 303->: 0,5 x 5 m3 = 2,5 euros

Total: 91,8 euros

Esto de tener que aplicar varios tramos a la vez es lo que me estoy volviendo loco.

Disculparme el no haberme explicado bien.

Muchísimas gracias de verdad. Un saludo,
joseluispalma
 
Posts: 109
Joined: Mon Apr 30, 2012 9:10 am

Re: gestión de tarifas (de agua)

Postby Armando » Fri Mar 14, 2014 5:35 pm

José Luis:

Nada mas para mi cultura, cómo determinas los segundos y terceros 99 m3?
No me queda claro :oops:

Mi cerebro me indica que deberían ser así:

Si el consumo es de 303 m3

los primeros 100m3 tendrán un costo de ,2 = 20 euros y quedan por costear 203m3
los siguientes 200m2 tendrán un costo de ,3 = 60 euros y quedan por costear 3m3
los restantes 3m3 tendrán un costo de ,5 = 1,5 euros

Total: 20+60+1,5 = 81.5 euros

Saludos
SOI, s.a. de c.v.
estbucarm@gmail.com
http://www.soisa.mex.tl/
http://sqlcmd.blogspot.com/
Tel. (722) 174 44 45
Carpe diem quam minimum credula postero
User avatar
Armando
 
Posts: 3228
Joined: Fri Oct 07, 2005 8:20 pm
Location: Toluca, México

Re: gestión de tarifas (de agua)

Postby horacio » Fri Mar 14, 2014 9:25 pm

Me interesó el reto, aqui dejo un algoritmo ( hecho a las apuradas ) que calcula los metros cúbicos. Espero este bien

Code: Select all  Expand view

#include 'fivewin.ch'

Function Main()

    Local i
    Local nMin
    Local nMax
    Local nSubTotal     := 0
    Local nTotalPesos := 0
    Local aTotalAgua   := {}
    Local nTotalAgua   := 303
    Local aTarifas      := { { '0-100', '0.1' }, { '101-200', '0.3' }, { '201-300', '0.4' }, { '301-400', '0.5' } }
   
    For i := 1 To Len( aTarifas )
        nMin := Val( SubStr( aTarifas[ i ][ 1 ], 1, At( '-', aTarifas[ i ][ 1 ] ) - 1 ) )
        nMax := Val( SubStr( aTarifas[ i ][ 1 ], At( '-', aTarifas[ i ][ 1 ] ) + 1, 3 ) )
        If( nTotalAgua > nMax )
            Aadd( aTotalAgua, nMax - nMin )
        Else
            AEval( aTotalAgua, { | x | nSubTotal += x } )
            Aadd( aTotalAgua, nTotalAgua - nSubTotal )      
        End
    Next i
    For i := 1 To Len( aTotalAgua )                                
        ? aTotalAgua[ i ]
    Next
    Return 0   
 


De todas maneras tengo una duda, en el intervalo 101-200 serían 100 m3 si consideramos el 101 como el primero, serían 99 si no lo consideramos, en ese caso el 101 quedaría en el limbo.

Saludos
horacio
 
Posts: 1363
Joined: Wed Jun 21, 2006 12:39 am
Location: Capital Federal Argentina

Re: gestión de tarifas (de agua)

Postby joseluisysturiz » Sat Mar 15, 2014 5:40 am

joseluispalma wrote:Hola compañeros,

Muchísimas gracias a todos por la ayuda prestada. Ya prácticamente está.

El problema es que las tarifas deben ser acumulativas. Me explico, si tengo 303 m3 de agua:

- Los primeros 100 litros van a la primera tarifa, de 0,2/m3
- Los 99 siguientes van a la segunda tarifa, de 0,3/m3
- Los 99 siguientes van a la tercera tarifa, de 0,4/m3
- Los 5 últimos litros van a la cuarta tarifa, de 0,5/m3

Tal que así para 303 m3 de agua:

De 0 a 100 m3->: 0,2 x 100 m3 =20 euros
De 101 a 200->: 0,3 x 99 m3 =29,7 euros
De 201 a 300->: 0,4 x 99 m3 = 39,6 euros
De 301 a 303->: 0,5 x 5 m3 = 2,5 euros

Total: 91,8 euros

Esto de tener que aplicar varios tramos a la vez es lo que me estoy volviendo loco.

Disculparme el no haberme explicado bien.

Muchísimas gracias de verdad. Un saludo,



No entiendo porque tanta vuelta y enredo si con lo que dice el colega esta mas claro, el detalles es que no se toma todo el monto leido para buscar a que tarifa pertecene, sino que se va dividiendo y cobrando cada parte en el rango de las tarifas, en su ejemplo esta claro, como son 303, entonces revisa cual es el rango de la primera tarifa, como es de 0-100 y el monto leido es superior, entonces los primero 100 de la lectura de los 303 se cobran al precio de la tarifa 1, ahora quedan 203, pero en la 2da.tarifa no son 100 el rango, sino 99, como el monto faltante por cobrar supera los 99 porque son 203, entonces se toman solo 99 de los 203 para cobrarse a monto de la 2da.tarifa, ahora faltan por cobrar 104, pasamos a la 3ra.tarifa el cual el rango tanbien es de 99, asi que tomamos de nuevo 99 de los 104 que supera el rango y los cobramos al monto de la tarifa 3, ahora, solo nos faltan 5 por cobrar del consumo leido, nos vamos a la tarifa 4 y es donde entra su duda, porque el rango de la tarifa 4 es solo de 2, a menos que sea de 301 hasta nRangoFin, si tomasemos el rango, entonces solo seria de los 5 faltantes 2 del consumo, quedando aun pendiente por cobrar 3, para completar los 303, pero como al parecer no existe mas rango de tarifas, toma los 5 restantes y los cobra al precio de la ultima tarifa, dando asi la tabla de cobranza que el creo. En resumen, si ya las tarifas estan dadas y los rangos, con hacer unos IF anidados o CASE, creo que el problema estaria resuelto, nose, alguien que de alguna opinion al respecto, creo que es un sistema muy sincello y sin complicaciones, solo que el colega no lo aclaro desde el principio, es mi humilde opinion y analisis del sistema, 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: gestión de tarifas (de agua)

Postby FranciscoA » Sat Mar 15, 2014 3:13 pm

joseluispalma wrote:Disculparme el no haberme explicado bien.


Todo está claro ahora.
La única observación, es que considero que el intervalo o rango es de 100 y no de 99. (según consumo final en cada item)
Francisco J. Alegría P.
Chinandega, Nicaragua.

Fwxh-MySql-TMySql
User avatar
FranciscoA
 
Posts: 2158
Joined: Fri Jul 18, 2008 1:24 am
Location: Chinandega, Nicaragua, C.A.

Re: gestión de tarifas (de agua)

Postby joseluisysturiz » Sat Mar 15, 2014 4:37 pm

FranciscoA wrote:
joseluispalma wrote:Disculparme el no haberme explicado bien.


Todo está claro ahora.
La única observación, es que considero que el intervalo o rango es de 100 y no de 99. (según consumo final en cada item)


Tienes toda la razon Francisco, parece el colega solo resta 200-101 que le da 99 y se le olvida el consumo 101 o 201, dependiendo del caso, los consumos son de 100 en 100 y se deberia iniciar en 1 y no es cero(0), asi quedarian los rangos:
1-100 ----> 100
101-200 -> 100 (se debe contar el 101)
201-300-> 100 (se debe contar el 201)
301-n -> ???

Esperemos el colega y tocayo Jose Luis, nos de su opinion, saludos...
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: gestión de tarifas (de agua)

Postby FranciscoA » Sat Mar 15, 2014 9:08 pm

y se deberia iniciar en 1 y no es cero(0)

Lo mismo opino, Luis.
Saludos.
Francisco J. Alegría P.
Chinandega, Nicaragua.

Fwxh-MySql-TMySql
User avatar
FranciscoA
 
Posts: 2158
Joined: Fri Jul 18, 2008 1:24 am
Location: Chinandega, Nicaragua, C.A.

Re: gestión de tarifas (de agua)

Postby Armando » Sun Mar 16, 2014 12:01 am

Amigos:

Como decía el master, para rizar el rizo, yo lo haría así:

Crear mi tabla con los campos siguientes

nLinea nTramo nCosto Index por nLinea
1 100 ,20
2 99 ,30
3 99 ,40
5 99 ,50

Y el código sería así:
Code: Select all  Expand view

nSaldo     := nConsumo (303)
nImporte  := 0.00

Ir al Pincipio de la tabla
DBGOTOP()
DO WHILE ! EOF()
     IF nSaldo >= nTramo
          nImporte := ROUND(nImporte + nTramo * nCosto,2)
          nSaldo := nSaldo - nTramo
     ENDIF
     SKIP()
ENDDO

IF nSaldo > 0
     DBGOBOTTOM()
     nImporte := ROUND(nImporte + nTramo * nCosto,2)
ENDIF
 


Saludos
SOI, s.a. de c.v.
estbucarm@gmail.com
http://www.soisa.mex.tl/
http://sqlcmd.blogspot.com/
Tel. (722) 174 44 45
Carpe diem quam minimum credula postero
User avatar
Armando
 
Posts: 3228
Joined: Fri Oct 07, 2005 8:20 pm
Location: Toluca, México

Next

Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: Adolfredo Martinez, Google [Bot] and 52 guests