PDA

Ver la Versión Completa : Cálculo de alimentación de viáticos


lKinGl
01-10-2008, 11:59:26
Salu2 amigos foristas

tengo 4 maskedits con 3 edits

estoy tratando de desarrollar un sistema de viáticos

en el maskedit1 pongo fecha de salida
en el maskedit2 pongo hora de salida
en el maskedit3 pongo fecha de retorno
en el maskedit4 pongo hora de retorno

necesito un algoritmo que lleve esta lógica:

en el edit1 deberia dar cuantos desayunos le tocan a pepe
en el eidt2 deberia dar cuantos almuerzos le tocan a pepe y
en el edit3 deberia dar cuantas cenas le tocan a pepe

ejemplo:



si pepe sale el 01/10/2008 a las 9:00am y regresa el 03/10/2008 a las 8:00pm

desayunos=2
almuerzos=3
cenas=3

gracias adelantadas a sus sugerencias

lKinGl
01-10-2008, 12:03:51
se me olvidaba un detalle:

la hora:

Desayuno=8:00am
Almuerzo=12:00m
Cena=6:00pm

tcp_ip_es
01-10-2008, 12:36:38
Pues en principio resta los datetimes y multiplica los días enteros que te salgan es decir con tu ejemplo :

3/10/2008 - 1/10/2008 = 2 días *1desayuno, 1comida, 1cena = 2 desayunos 2 comidas y dos cenas

y luego revisa las horas de entrada y llegada.

hora salida/hora llegada
<8am >= 6pm sumar 1desayuno, 1comida, 1cena
<8am >=12am sumar 1desayuno, 1comida
<8am >=8am sumar 1desayuno

en la unit dateutils (>d5) encontrarás funciones de fechas que te serviran....

lKinGl
01-10-2008, 13:49:21
ok muchas gracias intentaré con dateutils a ver que logro

ContraVeneno
01-10-2008, 14:32:48
el problema con restar las fechas y multiplicarlas, es que si Pepe sale en la tarde, esa operación igual le asignaría 1 desayuno, lo cuál sería incorrecto.

Yo no utilizaría TMAskEdit para las fechas, sería mejor utilizar TDateTimePIcker. Igual para las horas, nada más cambia la propiedad "Kind"

lKinGl
01-10-2008, 14:41:07
podrias explicarte mejor contraveneno?

pense que seria bueno con maskedit para filtrar las fechas pero creo que tambien se podria realizar con datatimepicker

pero mi dilema es:

si pepe sale hoy(01/10/2008) a las 3:10pm y llega mañana(02/10/2008) a las 9:20 pm

el 02/10/2008 cumplio el horario total asi que tiene 1 desayuno 1 almuerzo y 1 cena

pero el 01/10/2008 amerita solo 1 cena

creo que estoy en la lógica correcta pero no se como expresarlo con código

gracias adelantadas a sus sugerencias se acepta cualquier método que funcione :D

lKinGl
01-10-2008, 15:04:43
en relacion a lo que me indica contraveneno hice otro formulario el cual posee lo siguiente:

TDataTimePicker1 = Fecha de Salida
TDataTimePicker2 = Fecha de Retorno
TDataTimePicker3 = Hora de Salida
TDataTimePicker4 = Hora de Llegada
Edit1=Desayunos
Edit2=Almuerzos
Edit3=Cenas
Botón Calcular
Cotón Cerrar

creo que seria bueno calcular la cantidad de horas que hay entre la salida y la llegada dividir entre 24(horas del dia) y lo que sobre serán las últimas horas del dia trabajado incompletamente

pero como lo expreso con código :(

gracias adelantadas

Caro
01-10-2008, 15:50:40
creo que seria bueno calcular la cantidad de horas que hay entre la salida y la llegada dividir entre 24(horas del dia) y lo que sobre serán las últimas horas del dia trabajado incompletamente

pero como lo expreso con código :(


Como te dijeron tienes varías funciones en la unidad DateUtils que te pueden ayudar, con DaysBetween (te da la cantidad de días entre dos fechas), HoursBetween (te da la cantidad de horas entre dos fechas).


showmessage(inttostr(DaysBetween(FechaFin, FechaIni)));
showmessage(inttostr(HoursBetween(FechaFin, FechaIni)));


donde FechaIni y FechaFin, serían tus fechas que ya estan unidas con sus respectivas horas.

Saluditos

AzidRain
01-10-2008, 20:49:45
Por que no cambias el algoritmo a algo no tan exacto pues es obvio que nadie come ni desayuna exactamente a las mismas horas y más cuando vas de viaje, digamos que sales a las 5:00 AM (obviamente no desayunas) y el viaje tarde 5 horas, llegas a tu destino y no te da tiempo de desayunar poruqe enseguida te pones a trabajar, dan las 3 y ya comes y luego como a las 8 cenas. Técnicamente te correspondía un desayuno (que no pudiste tomar).

Lo más simple y utilizado en casi todos lados es sacar un estimado de cuanto cuesta un día de las tres comidas y usar ese datos sin importar si se utilicen o no. Por ejemplo: supongamos $100 de comidas diarios para un viaje de 3 días, serían $300 y no nos importa si el tipo come a sus horas.

El control se lleva muy simple pues a su regreso el tipo tiene que comprobar $300 en facturas y/o efectivo. Obviamente las comidas que no haga no podrá presentar facturas (bueno teóricamente pq ya sabemos que en esto siempre hacen alguna transa): Esa verificación ya es parte del control interno de la empresa que es una función administrativa.

No es bueno codificar tan precisamente la cuestion de horas y fechas porque en un viaje de trabajo NUNCA se cumplen los horarios y corres el riesgo de que a alguien no le alcance o bien le sobre demasiado, por eso normalmente para viáticos siempre te consideran un % de imprevistos (más o menos un 20%) para esos casos. Nuevamente el control para que no haya desviaciones o malos manejos debe ser administrativo y no sistematizado. Otra cosa, las comidas no valen igual normalmente para un empleado de nivel medio que para un ejecutivo (ve tu a saber por qué, jejeje). Así como el hospedaje y demás, por otro lado hay que considerar que algunos trabajadores normalmente hacen comidas con clientes que obviamente a veces no están programadas sino que salen de improviso...ahi es donde te digo que es muy difícil y peligroso sistematizarlo todo.

Pero bueno, creo que sigo de metiche...solo era un comentario basado en mis experiencias.

ContraVeneno
01-10-2008, 22:01:46
yo estoy de acuerdo con Azid... pero pues cuando el cliente te lo pide... :D

egostar
01-10-2008, 22:03:01
... pero pues cuando el cliente te lo pide... :D

Deberias de asesorarlo bien :D:D:D

Salud OS

ContraVeneno
01-10-2008, 22:29:45
cierto, cierto... hay que saber cuando decir que no. :cool:

lKinGl
02-10-2008, 21:47:44
jaja creo que ya todos se pusieron en mi contra :( pues les comento que la empresa tiene una forma de trabajo y es que ellos calculan mediante su hora de llegada a destino que comidas le toca, si les toca hospedaje o no de acuerdo a la cantidad de dias y no creo que acepten cambiar su forma de trabajo por mi, además a las empresas no les interesa dar demás a sus empleados, ejemplo : es ilógico que si yo llego a mi destino a las 6pm me paguen desayuno y almuerzo de ese dia.... (Imaginense si la empresa fuese de 200 empleados y todos llegan a las 6pm a su destino y les pagan desayuno y almuerzo ) se imaginan la pérdida que yo le causaria a la empresa? asi que creo que no deberia tomarme esto tan a la ligera :(

de igual manera si a un empleado le dan el dinero para el desayuno, la empresa se lava las manos en caso de que el empleado no quiera comer para ahorrarse el dinero ó comer cualquier cosa para lograr el fin antes mencionado

lKinGl
02-10-2008, 21:49:55
asi que me ayudaria muchisimo si alguno de ustedes me indica alguna forma de hacer tal cálculo :D o alguna idea ....

gracias adelantadas
salu2.___

ContraVeneno
02-10-2008, 22:09:30
¿ el monto para el desayuno, la comida y la cena es diferente o es el mismo para las tres comidas ?

lKinGl
02-10-2008, 22:21:28
La unidad tributaria actual es 46 Bs.

Desayuno = 0.4 * Unidad Tributaria
Almuerzo = 1.7* Unidad Tributaria
Cena = 0.4* Unidad Tributaria

con una hoja y un lapiz he sacado los rangos (a ver si sirven de algo) creo que si :D

Desayuno= (<9:00am) y (<12:00m) y (<6:00pm)
Almuerzo= (>9:00am) y (<12:00m) y (<6:00pm)
Cena= (>9:00am) y (>12:00m) y (<6:00pm)

salu2 y gracias adelantadas

ContraVeneno
02-10-2008, 23:11:51
Pues se tendría que hacer al menos tres cálculos. Uno para determinar cuantas comidas le tocan al primer días, otro para determinar los días (este es el más fácil, daysbetween * 3 comidas por día) y otro para determinar cuantas comidas le corresponden al último día. Sumas y creo que con eso tienes.

lKinGl
03-10-2008, 13:50:46
Salu2

creo que la mejor forma de desarrollar el algoritmo es la siguiente

Salida: 20/01/2008
Retorno: 25/01/2008

HoraSalida:13:00pm
Hora Retorno:11:00 am

Sacar la diferencia que hay entre salida y retorno

Retorno - Salida = 5 - 2 =3
Por lo tanto

Dias completos= 1Desayuno+1Almuerzo+1Cena


// le resto 2 por que es muy posible que el dia de salida y el dia de retorno no se trabaje completo

AlimentosSalida:24:00-13:00 = 11:00 Horas (Aqui asumir que faltaron 11 horas para culminar el dia)

Por lo tanto Alimentos Salida = 1 Cena

Alimentos Retorno=24:00-11:00 = 13:00

Por lo tanto Alimentos Retorno=1 Almuerzo+1Cena


nota: yo se que para hacer una resta de horas se usa el hoursbetween de la libreria DateUtils, pero no se es como sacar la resta con hora militar :(

porfa les agradesco su ayuda y gracias adelantadas :)

lKinGl
03-10-2008, 15:49:43
Problema Resuelto:

Tengo lo siguiente:

MaskEdit1 = Formato(99/99/9999) es la fecha de Salida
MaskEdit2 = Formato(99/99/9999) esl la fecha de Retorno
MaskEdit3 = Formato (99:99) es la Hora de Salida
MaskEdit4 = Formato (99:99) es la hora de Retorno
Combobox1 = am ó pm del dia de salida
Combobox2 = am ó pm del dia de retorno
Edit1 = son los dias completos (que ameritan todas las comidas del dia).
Edit2 = son las horas restantes para que acabe el dia de salida
Edit3 = son las horas restantes para que acabe el dia de retorno
Edit4 = Total desayunos
Edit5 = Total Almuerzos
Edit6 = Total Cena
Button1 = Cálculos
Button2 = Cerrar

Código del Form


procedure TForm1.FormCreate(Sender: TObject);
begin
MaskEdit1.Text:='';
MaskEdit2.Text:='';
MaskEdit3.Text:='';
MaskEdit4.Text:='';
edit1.Text:='';
edit2.Text:='';
edit3.Text:='';
edit4.Text:='0';
edit5.Text:='0';
edit6.Text:='0';
ComboBox1.Text:='am';
ComboBox2.Text:='am';
end;


Código del Boton Calcular

procedure TForm15.Button1Click(Sender: TObject);
var
Fecha, Horas, Horae:String;
des, dest, almt, cent, alm, cen:Integer;
begin
des:=0;
alm:=0;
cen:=0;
Fecha := IntToSTr(DaysBetween(StrToDate(MaskEdit2.Text), StrToDate(MaskEdit1.Text)));
Horas := IntToSTr(HoursBetween(StrToDateTime(MaskEdit3.Text), StrToDateTime('12:00')));
Horae := IntToStr(HoursBetween(StrToDateTime(MaskEdit4.Text),StrToDateTime('12:00')));
edit1.Text:=Fecha;
edit4.Text:='0';

if ComboBox1.Text='am' then
begin
edit2.Text:=IntToStr(StrToInt(Horas)+12);
end
else
begin
edit2.Text:=IntToStr(StrToInt(Horas));
end;

if ComboBox2.Text='am' then
begin
edit3.Text:=IntToStr(StrToInt(Horae)+12);
end
else
begin
edit3.Text:=IntToStr(StrToInt(Horae));
end;

//Cálculos
if StrToInt(edit2.Text)<=15 then
begin
des:=1;
end;

if StrToInt(edit3.Text)<=15 then
begin
des:=des+1;
end;

//Si Faltan 12 horas para acabarse el dia

if StrToInt(edit2.Text)<=12 then
begin
alm:=1;
end;

if StrToInt(edit3.Text)<=12 then
begin
alm:=alm+1;
end;
//Si Faltan 6 Horas para acabarse el dia
if StrToInt(edit3.Text)<=6 then
begin
cen:=1;
end;

if StrToInt(edit3.Text)<=6 then
begin
cent:=cen+1;
end;

//SALIDAS
dest:=StrToInt(edit1.Text);
almt:=StrToInt(edit1.Text);
cent:=StrToInt(edit1.Text);
edit4.Text:=IntToStr(des+dest);
edit5.Text:=IntToStr(alm+almt);
edit6.Text:=IntToStr(cen+cent);
//FIN DESAYUNOS
end;



Código del Boton Cerrar

procedure TForm1.Button2Click(Sender: TObject);
begin
close;
end;



jejeje creo que me he ido por algo un tanto complicado pero fué la única forma que me surgio la solución :D espero que a alguien más le sirva :D