campo-sirio/ci/ci1350.cpp
luca f93632a43c Patch level :10.0
Files correlati     :
Ricompilazione Demo : [ ]
Commento            :
comincia a stampare qualcosa anche per commessa cdc


git-svn-id: svn://10.65.10.50/branches/R_10_00@21681 c028cbd2-c16b-5b4b-a496-9718f37d4682
2011-02-17 16:08:30 +00:00

102 lines
2.9 KiB
C++
Executable File

#include "ci1350.h"
///////////////////////////////////////////////////////////////////////////////////////
// Metodi liberi per determinare giorni lavorativi e feriali (nati per ci1300 ci1400)
///////////////////////////////////////////////////////////////////////////////////////
bool ci_is_ferial_day(const TDate& data)
{
return data.wday() < 6 && !data.is_holiday();
}
long ci_calcola_giorni_lavorativi(const TDate& dataini, const TDate& datafine)
{
long num_giorni_lav = datafine - dataini + 1;
//e qui si parrà l'ultima stilla di nobilitate! deve eliminare i giorni festivi dal mucchio!
if (num_giorni_lav > 1)
{
for (TDate data = dataini; data <= datafine; ++data)
{
if (!ci_is_ferial_day(data))
num_giorni_lav--;
}
}
return num_giorni_lav;
}
long ci_calcola_giorni_lavorativi_cms(const int anno, const int mese, const TDate& ini_cms, const TDate& fine_cms,
const TDate& dataini, const TDate& datafine, TDate& inizio_lav, TDate& fine_lav)
{
//date del mese
TDate ini_mese(1, mese, anno);
TDate fine_mese = ini_mese;
fine_mese.set_end_month();
//se la commessa non "interseca" il mese selezionato -> finisce qui
if (fine_cms < ini_mese || ini_cms > fine_mese)
return 0;
//se le date limite lavorative non "intersecano" il mese selezionato -> finisce qui
if (datafine < ini_mese || dataini > fine_mese)
return 0;
//se è arrivato fin qui -> c'è qualcosa da considerare
//vanno prese la massima data inizio e la minima data fine
inizio_lav = fnc_max(ini_mese, ini_cms);
fine_lav = fnc_min(fine_mese, fine_cms);
//e qui si parrà l'ultima stilla di nobilitate! deve eliminare i giorni festivi dal mucchio!
return ci_calcola_giorni_lavorativi(inizio_lav, fine_lav);
}
void ci_fill_recset_from_ass(TAssoc_array& ass, TCSV_recordset& recset)
{
FOR_EACH_ASSOC_OBJECT(ass, obj, key, itm)
{
TToken_string& record_ass = (TToken_string&)*itm;
real totale_c = record_ass.get(32);
totale_c.round(1);
TGeneric_distrib esso(totale_c, 1);
for (int j = 1; j <= 31; j++)
{
real ore = record_ass.get(j);
esso.add(ore);
}
//chiave della riga (Cms-CdC-Fase o CdC-Cms-Fase)
TToken_string linea;
TToken_string chiave = key;
FOR_EACH_TOKEN(chiave, tok)
{
if (*tok > ' ')
{
if (!linea.empty())
linea << " -- ";
linea << tok;
}
}
// Totale preventivo
real totale_p = record_ass.get(0);
totale_p.round(1);
linea.add(totale_p.string());
// Totale consuntivo
for (int k = 1; k <= 31; k++)
{
const real ore_giorno = esso.get();
const char* str_ore = ore_giorno.string();
linea.add(str_ore, k+1);
}
linea.add(totale_c.string());
//aggiunge la riga tokenstringata al csv_recordset
recset.new_rec(linea);
}
//ordina il recordset per chiave
recset.sort();
}