gestión de tarifas (de agua) [Solucionado]
-
- Posts: 109
- Joined: Mon Apr 30, 2012 9:10 am
gestión de tarifas (de agua) [Solucionado]
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.
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.
- cnavarro
- Posts: 6572
- Joined: Wed Feb 15, 2012 8:25 pm
- Location: España
- Has thanked: 4 times
- Been thanked: 6 times
Re: gestión de tarifas (de agua)
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
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
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
- cnavarro
- Posts: 6572
- Joined: Wed Feb 15, 2012 8:25 pm
- Location: España
- Has thanked: 4 times
- Been thanked: 6 times
Re: gestión de tarifas (de agua)
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
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
-
- Posts: 109
- Joined: Mon Apr 30, 2012 9:10 am
Re: gestión de tarifas (de agua)
Hola Cristóbal,
Muchas gracias por tu respuesta.
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.
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.
- Armando
- Posts: 3279
- Joined: Fri Oct 07, 2005 8:20 pm
- Location: Toluca, México
- Been thanked: 4 times
- Contact:
Re: gestión de tarifas (de agua)
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
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
estbucarm@gmail.com
http://www.soisa.mex.tl/
http://sqlcmd.blogspot.com/
Tel. (722) 174 44 45
Carpe diem quam minimum credula postero
- joseluisysturiz
- Posts: 2064
- Joined: Fri Jan 06, 2006 9:28 pm
- Location: Guatire - Caracas - Venezuela
- Contact:
Re: gestión de tarifas (de agua)
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...
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...

Dios no está muerto...
Gracias a mi Dios ante todo!
Gracias a mi Dios ante todo!
- FranciscoA
- Posts: 2164
- Joined: Fri Jul 18, 2008 1:24 am
- Location: Chinandega, Nicaragua, C.A.
Re: gestión de tarifas (de agua)
Hola, prueba este ejemplo, a ver si es lo que necesitas:
Saludos.
Code: Select all | Expand
//----------------//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
Chinandega, Nicaragua.
Fwxh-MySql-TMySql
-
- Posts: 109
- Joined: Mon Apr 30, 2012 9:10 am
Re: gestión de tarifas (de agua)
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,
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,
- Armando
- Posts: 3279
- Joined: Fri Oct 07, 2005 8:20 pm
- Location: Toluca, México
- Been thanked: 4 times
- Contact:
Re: gestión de tarifas (de agua)
José Luis:
Nada mas para mi cultura, cómo determinas los segundos y terceros 99 m3?
No me queda claro
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
Nada mas para mi cultura, cómo determinas los segundos y terceros 99 m3?
No me queda claro

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
estbucarm@gmail.com
http://www.soisa.mex.tl/
http://sqlcmd.blogspot.com/
Tel. (722) 174 44 45
Carpe diem quam minimum credula postero
Re: gestión de tarifas (de agua)
Me interesó el reto, aqui dejo un algoritmo ( hecho a las apuradas ) que calcula los metros cúbicos. Espero este bien
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
Code: Select all | Expand
#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 i
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
- joseluisysturiz
- Posts: 2064
- Joined: Fri Jan 06, 2006 9:28 pm
- Location: Guatire - Caracas - Venezuela
- Contact:
Re: gestión de tarifas (de agua)
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...

Dios no está muerto...
Gracias a mi Dios ante todo!
Gracias a mi Dios ante todo!
- FranciscoA
- Posts: 2164
- Joined: Fri Jul 18, 2008 1:24 am
- Location: Chinandega, Nicaragua, C.A.
Re: gestión de tarifas (de agua)
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
Chinandega, Nicaragua.
Fwxh-MySql-TMySql
- joseluisysturiz
- Posts: 2064
- Joined: Fri Jan 06, 2006 9:28 pm
- Location: Guatire - Caracas - Venezuela
- Contact:
Re: gestión de tarifas (de agua)
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!
Gracias a mi Dios ante todo!
- FranciscoA
- Posts: 2164
- Joined: Fri Jul 18, 2008 1:24 am
- Location: Chinandega, Nicaragua, C.A.
Re: gestión de tarifas (de agua)
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
Chinandega, Nicaragua.
Fwxh-MySql-TMySql
- Armando
- Posts: 3279
- Joined: Fri Oct 07, 2005 8:20 pm
- Location: Toluca, México
- Been thanked: 4 times
- Contact:
Re: gestión de tarifas (de agua)
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í:
Saludos
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
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
estbucarm@gmail.com
http://www.soisa.mex.tl/
http://sqlcmd.blogspot.com/
Tel. (722) 174 44 45
Carpe diem quam minimum credula postero