From db03909b71a11d3c3b55eaacc0c020133252207c Mon Sep 17 00:00:00 2001 From: luca Date: Fri, 28 Nov 2003 15:48:09 +0000 Subject: [PATCH] Patch level :2.0 nopatch Files correlati :ce4.exe & co. Ricompilazione Demo : [ ] Commento :prima stesura calcolo cespiti per commessa git-svn-id: svn://10.65.10.50/trunk@11625 c028cbd2-c16b-5b4b-a496-9718f37d4682 --- ce/ce4.cpp | 4 +- ce/ce4.h | 2 +- ce/ce4200.cpp | 262 +++++++++++++++++++++++++++++++++++++++++++++++++ ce/ce4200.h | 8 ++ ce/ce4200a.frm | 112 +++++++++++++++++++++ ce/ce4200a.h | 20 ++++ ce/ce4200a.uml | 182 ++++++++++++++++++++++++++++++++++ ce/salcecms.h | 7 ++ 8 files changed, 594 insertions(+), 3 deletions(-) create mode 100755 ce/ce4200.cpp create mode 100755 ce/ce4200.h create mode 100755 ce/ce4200a.frm create mode 100755 ce/ce4200a.h create mode 100755 ce/ce4200a.uml create mode 100755 ce/salcecms.h diff --git a/ce/ce4.cpp b/ce/ce4.cpp index 67593405f..236471c11 100755 --- a/ce/ce4.cpp +++ b/ce/ce4.cpp @@ -7,9 +7,9 @@ int main(int argc,char** argv) const int r = (argc > 1) ? (argv[1][1]-'0') : 0; switch (r) { -/* case 1: + case 1: ce4200(argc,argv); break; //calcolo cespiti per commessa - case 2: +/* case 2: ce4300(argc,argv); break;*/ //stampa cespiti per commessa case 0: default: ce4100(argc,argv) ; break; // inserimento cespiti per commessa (personalizzazione CRPA) diff --git a/ce/ce4.h b/ce/ce4.h index 97322b33d..57ae87bb8 100755 --- a/ce/ce4.h +++ b/ce/ce4.h @@ -2,7 +2,7 @@ #define __CE4_H int ce4100(int argc, char* argv[]); -//int ce4200(int argc, char* argv[]); +int ce4200(int argc, char* argv[]); //int ce4300(int argc, char* argv[]); diff --git a/ce/ce4200.cpp b/ce/ce4200.cpp new file mode 100755 index 000000000..3f0799a30 --- /dev/null +++ b/ce/ce4200.cpp @@ -0,0 +1,262 @@ +#include +#include +#include +#include +#include + +#include "ce4200a.h" +#include "ce4200.h" + +#include "ammce.h" +#include "cespi.h" +#include "salcecms.h" + +#include "..\ve\velib.h" + +//=============================================================================================== +//maschera + +class TCalc_cesp_cms_mask: public TAutomask +{ +public: + virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly); + + TCalc_cesp_cms_mask():TAutomask("ce4200a") {} + +}; + +bool TCalc_cesp_cms_mask::on_field_event(TOperable_field& o, TField_event e, long jolly) +{ +/* switch (o.dlg()) + { + default: break; + }*/ + return true; +} + +//=============================================================================================== +//form +class TCalc_cesp_cms_form : public TForm +{ + +public: + virtual bool validate(TForm_item &cf, TToken_string &s); + void set_testata() {set_header(1,TRUE);} + void set_pedata() {set_footer(1,FALSE); set_footer(1,TRUE);} + TCalc_cesp_cms_form(); + + virtual ~TCalc_cesp_cms_form(); +}; + +TCalc_cesp_cms_form::TCalc_cesp_cms_form() :TForm ("ce4200a") +{ +} + +TCalc_cesp_cms_form::~TCalc_cesp_cms_form() +{ +} + +bool TCalc_cesp_cms_form::validate(TForm_item &cf, TToken_string &s) +{ + return TCalc_cesp_cms_form::validate(cf,s); //richiama la validate standard della classe genitore (TForm_cespiti) +} + + +//=============================================================================================== +//Applicazione + +class TCalc_cesp_cms : public TSkeleton_application +{ + TCalc_cesp_cms_mask* _mask; + TCalc_cesp_cms_form* _form; + +protected: + virtual void main_loop(); + virtual bool create(); + virtual bool destroy(); + +public: + void utilizzo_per_cms(const TRectype& ammce_rec); + real calc_perc_util_cesp(const TRectype& salcecms_rec, const TDate& dtinices, const TDate& dtfineces); +}; + + + +real TCalc_cesp_cms::calc_perc_util_cesp(const TRectype& salcecms_rec, const TDate& dtinices, const TDate& dtfineces) +{ +//prende il codice commessa del record.. + TString80 codcms = salcecms_rec.get(SALCECMS_CODCMS); +//..ed accede cosi' alla tabella delle commesse + const TRectype& cms = cache().get("CMS", codcms); +//prende le date di inizio e fine commessa dalla tabella per poterle confrontare con le date limite +//del cespite nell'esercizio + TDate dtfine = dtfineces; + const TDate dtfinecms = cms.get_date("D1"); + if ((dtfinecms.ok()) && (dtfinecms < dtfineces)) + dtfine = dtfinecms; + + TDate dtini = dtinices; + const TDate dtinicms = cms.get_date("D0"); + if ((dtinicms.ok()) && (dtinicms > dtinices)) + dtini = dtinicms; +//intervallo giorni di utilizzo cespite nella commessa + const real delta_cms = real(dtfine - dtini) / real(dtfineces - dtinices); + +//adeesso prende la percentuale di utilizzo del cespite nella commessa.. + real percutil = salcecms_rec.get_real(SALCECMS_PERCUTIL); +//normalizza la percentuale... + percutil = percutil / CENTO; +//...e la porta in giorni rispetto al totale di utilizzo dei giorni del cespite nell'esercizio +//(il 100% sono i giorni di utilizzo del cespite in tutte le commesse dell'esercizio) + percutil *= delta_cms; + + return percutil; +} + + + +void TCalc_cesp_cms::utilizzo_per_cms(const TRectype& ammce_rec) +{ +//totale quote del cespite in esame per l'esercizio corrente (per tutte le commesse) + real qtot = ammce_rec.get_real(AMMCE_QNOR); + qtot += ammce_rec.get_real(AMMCE_QACC); + qtot += ammce_rec.get_real(AMMCE_QANT); +//controllo su date inizio e fine del periodo di utilizzo del cespite nell'esercizio selezionato + if (qtot != ZERO) + { + const TString16 idcesp = ammce_rec.get(CESPI_IDCESPITE); + const TRectype& cespi = cache().get(LF_CESPI, idcesp); + + const TDate dtinies = _mask->get_date(F_INIZIO_ES); + const TDate dtfines = _mask->get_date(F_FINE_ES); + + TDate dtfine = dtfines; + const TDate dtalien = cespi.get_date(CESPI_DTALIEN); + if ((dtalien.ok()) && (dtalien < dtfines)) + dtfine = dtalien; + + TDate dtini = dtinies; + const TDate dtfunz = cespi.get_date(CESPI_DTFUNZ); + if ((dtfunz.ok()) && (dtfunz > dtinies)) + dtini = dtfunz; + //..a questo punto dtini e dtfine rappresentano il periodo di utilizzo del cespite + //nell'esercizio selezionato + //quindi il periodo di utilizzo del cespite nell'esercizio,in giorni,sara'... + const long delta_cesp = dtfine - dtini; + + //Adesso si controlla la durata di ogni commessa (alla quale il cespite ha partecipato) durante + //l'esercizio delezionato + const int current_ese = ammce_rec.get_int(AMMCE_CODES); + + //crea un record array dove memorizzare i record del file salcecms riguardanti il cespite e + //l'esercizio selezionati + TRecord_array salcecms(LF_SALCECMS, "NRIGA"); + TRectype* key = new TRectype(LF_SALCECMS); + key->put("IDCESPITE",idcesp); + key->put("CODES",current_ese); + salcecms.read(key); + + //ciclo su SALCECMS data una chiave idcespite + esercizio (si fa solo se salcecms non e' vuoto, + //e' inutile perdere tempo..) + if (salcecms.rows() > 0) + { + //crea documento relativo al cespite in questione (nell'esercizio);ogni riga del documento + //sara' relativa ad una commessa + const TString4 codnum = _mask->get(F_CODNUM); + const TString4 tipodoc = _mask->get(F_TIPODOC); + const TString4 tiporiga = _mask->get(F_TIPORIGA); + TDocumento doc_cesp('D', current_ese, codnum, atol(idcesp)); + doc_cesp.put(DOC_TIPODOC, tipodoc); + doc_cesp.put(DOC_DATADOC, TDate(TODAY)); + doc_cesp.body(LF_RIGHEDOC).destroy_rows(); + + TDistrib distrib(qtot, TCurrency::get_firm_dec()); + int i; + for (i=1; i<=salcecms.last_row(); i++ ) + { + const real perc = calc_perc_util_cesp(salcecms[i], dtini, dtfine); + distrib.add(perc * qtot); + } + //e riempiamo 'sta riga! + for (i=1; i<=salcecms.last_row(); i++ ) + { + TRiga_documento& rigadoc = doc_cesp.new_row(tiporiga); + rigadoc.put(RDOC_CODCMS, salcecms[i].get(SALCECMS_CODCMS)); //codice commessa + rigadoc.put(RDOC_QTA, 1); + const real quota = distrib.get(); + TString80 descr; //descrizione cosi' tanto x mettercela + descr.format("Quota ammortamento per l'esercizio %s", (const char *) quota.stringa()); + rigadoc.put(RDOC_DESCR, descr); + rigadoc.put(RDOC_PREZZO, quota); //ammortamento cespite per la commessa + const real perc_cms = salcecms[i].get_real(SALCECMS_PERCUTIL); + rigadoc.put(RDOC_QTAGG1, perc_cms); //% utilizzo cespite nella commessa + rigadoc.put(RDOC_QTAGG2, dtfine - dtini); //giorni di utilizzo cespite nella commessa + rigadoc.put(RDOC_QTAGG3, delta_cesp); //giorni di utilizzo cespite nell'esercizio + rigadoc.put(RDOC_DATACONS, TDate(TODAY)); //data di elaborazione + rigadoc.put(RDOC_CODIVA, _mask->get(F_CODIVA)); //codice IVA obbligatorio + } + //scrittura del documento + doc_cesp.write(); + } + + } +} + + + +bool TCalc_cesp_cms::create() +{ + _mask = new TCalc_cesp_cms_mask; + _form = new TCalc_cesp_cms_form; + + TConfig config_doc ("ce4200a.ini", "Main"); + _mask->set(F_CODNUM, config_doc.get("CODNUM")); + _mask->set(F_TIPODOC, config_doc.get("TIPODOC")); + _mask->set(F_TIPORIGA, config_doc.get("TIPORIGA")); + _mask->set(F_CODIVA, config_doc.get("CODIVA")); + + return TSkeleton_application::create(); +} + +bool TCalc_cesp_cms::destroy() +{ + delete _mask; + delete _form; + return TRUE; +} + +void TCalc_cesp_cms::main_loop() +{ + while (_mask->run() == K_ENTER) + { + TRectype darec(LF_AMMCE),arec(LF_AMMCE); + + const int esercizio = _mask->get_int(F_ESERCIZIO); + + darec.put(AMMCE_IDCESPITE, _mask->get(F_DA_IDCESPITE)); + arec.put(AMMCE_IDCESPITE, _mask->get(F_A_IDCESPITE)); + TString filtro; + filtro.format("(CODES==%d)&&(TPSALDO==2)&&(TPAMM==1)",esercizio); + + TRelation rel(LF_AMMCE); + TCursor cur(&rel, filtro, 1, &darec, &arec); + const long items = cur.items(); + cur.freeze(); + +//ciclo sui cespiti di AMMCE nel codes selezionato + for (cur=0; cur.pos()D0 + DISPLAY "Fine esercizio" 104@->D1 + OUTPUT F_ESERCIZIO CODTAB + OUTPUT F_INIZIO_ES 104@->D0 + OUTPUT F_FINE_ES 104@->D1 + CHECKTYPE REQUIRED + FIELD CODES +END + +DATE F_INIZIO_ES +BEGIN + PROMPT 26 3 "Inizio " + FLAGS "D" +END + +DATE F_FINE_ES +BEGIN + PROMPT 50 3 "Fine " + FLAGS "D" +END + +STRING F_DA_IDCESPITE 10 +BEGIN + PROMPT 1 5 "Dal cespite " + FLAGS "UZ" + USE LF_SALCECMS SELECT NRIGA==1 + JOIN LF_CESPI INTO IDCESPITE==IDCESPITE + INPUT IDCESPITE F_DA_IDCESPITE + DISPLAY "Codice@10" IDCESPITE + DISPLAY "Descrizione@50" LF_CESPI->DESC + DISPLAY "Cat." LF_CESPI->CODCAT + DISPLAY "Impianto@10" LF_CESPI->CODIMP + DISPLAY "Data Acq.@10" LF_CESPI->DTCOMP + DISPLAY "Data Ali.@10" LF_CESPI->DTALIEN + OUTPUT F_DA_IDCESPITE IDCESPITE + OUTPUT F_DA_DESC LF_CESPI->DESC + CHECKTYPE SEARCH + ADD RUN "ce0 -4" +END + +STRING F_DA_DESC 60 50 +BEGIN + PROMPT 26 5 "" + FLAGS "D" +END + +STRING F_A_IDCESPITE 10 +BEGIN + PROMPT 1 6 "Al cespite " + FLAGS "UZ" + COPY USE F_DA_IDCESPITE + INPUT IDCESPITE F_A_IDCESPITE + COPY DISPLAY F_DA_IDCESPITE + OUTPUT F_A_IDCESPITE IDCESPITE + OUTPUT F_A_DESC LF_CESPI->DESC + CHECKTYPE SEARCH + ADD RUN "ce0 -4" +END + +STRING F_A_DESC 60 50 +BEGIN + PROMPT 26 6 "" + FLAGS "D" +END + +STRING F_CODNUM 4 +BEGIN + PROMPT 1 9 "Numerazione " + USE %NUM + INPUT CODTAB F_CODNUM + OUTPUT F_DESNUM S0 + KEY 1 2 + CHECKTYPE NORMAL + FLAGS "UD" +END + +STRING F_DESNUM 50 +BEGIN + PROMPT 24 9 "" + FLAGS "D" +END + +STRING F_TIPODOC 4 +BEGIN + PROMPT 1 10 "Tipo " + USE %TIP + INPUT CODTAB F_TIPODOC + OUTPUT F_DESTIPODOC S0 + CHECKTYPE NORMAL + FLAGS "UD" +END + +STRING F_DESTIPODOC 50 +BEGIN + PROMPT 24 10 "" + FLAGS "D" +END + +STRING F_TIPORIGA 4 +BEGIN + PROMPT 1 11 "Tipo riga " + USE %TRI + INPUT CODTAB F_TIPORIGA + OUTPUT F_DESTIPORIGA S0 + CHECKTYPE NORMAL + FLAGS "D" +END + +STRING F_DESTIPORIGA 50 +BEGIN + PROMPT 24 11 "" + FLAGS "D" +END + +STRING F_CODIVA 4 +BEGIN + PROMPT 1 12 "Codice IVA " + USE %IVA + INPUT CODTAB F_CODIVA + OUTPUT F_DESIVA S0 + CHECTYPE NORMAL + FLAGS "D" +END + +STRING F_DESIVA 50 +BEGIN + PROMPT 24 12 "" + FLAGS "D" +END + +BOOLEAN F_STAMPA +BEGIN + PROMPT 1 14 "Stampa i documenti" +END + +ENDPAGE + +ENDMASK diff --git a/ce/salcecms.h b/ce/salcecms.h new file mode 100755 index 000000000..df25860aa --- /dev/null +++ b/ce/salcecms.h @@ -0,0 +1,7 @@ +#define SALCECMS_IDCESPITE "IDCESPITE" +#define SALCECMS_CODES "CODES" +#define SALCECMS_NRIGA "NRIGA" +#define SALCECMS_CODCMS "CODCMS" +#define SALCECMS_PERCUTIL "PERCUTIL" +#define SALCECMS_PERCOPE "PERCCOPE" +#define SALCECMS_FONDO "FONDO"