From 3753641f115790564811bf81032723e1d2834b37 Mon Sep 17 00:00:00 2001 From: luca Date: Wed, 2 Feb 2011 15:04:06 +0000 Subject: [PATCH] Patch level :10.0 917 Files correlati : Ricompilazione Demo : [ ] Commento : hardy git-svn-id: svn://10.65.10.50/branches/R_10_00@21572 c028cbd2-c16b-5b4b-a496-9718f37d4682 --- ha/ha0200a.h | 10 ++- ha/ha0200a.uml | 61 +++++++++----- ha/ha1200.cpp | 4 +- ha/ha1300.cpp | 214 +++++++++++++++++++++++++++++++++---------------- 4 files changed, 195 insertions(+), 94 deletions(-) diff --git a/ha/ha0200a.h b/ha/ha0200a.h index 9e7e6048e..4c401b04f 100755 --- a/ha/ha0200a.h +++ b/ha/ha0200a.h @@ -31,10 +31,10 @@ //pagina 2 //esportazione dati #define F_OUTPUT_PATH 250 -#define F_CARDOC_NUM 251 -#define F_CARDOC_TIP 252 -#define F_CARDOC_STA 253 -#define F_BARCODE_TIP 254 +#define F_OU_CARDOC_NUM 251 +#define F_OU_CARDOC_TIP 252 +#define F_OU_CARDOC_STA 253 +#define F_OU_BARCODE_TIP 254 //importazione dati #define F_INPUT_PATH 260 @@ -42,6 +42,8 @@ #define F_IN_TIPODOC_B 262 #define F_IN_TIPODOC_O 263 #define F_IN_TIPODOC_V 264 +#define F_IN_CODCAUS 265 +#define F_IN_DESCRCAUS 266 //comuni inportazione-esportazione #define F_CODICI_IVA 270 diff --git a/ha/ha0200a.uml b/ha/ha0200a.uml index 45c1e899c..74571591a 100755 --- a/ha/ha0200a.uml +++ b/ha/ha0200a.uml @@ -327,7 +327,7 @@ BEGIN PROMPT 1 1 "@bEsportazione" END -STRING F_OUTPUT_PATH 255 38 +STRING F_OUTPUT_PATH 255 39 BEGIN PROMPT 2 2 "Percorso files .txt da esportare " DSELECT @@ -342,45 +342,45 @@ BEGIN PROMPT 2 3 "@bDocumenti di carico" END -STRING F_CARDOC_NUM 4 +STRING F_OU_CARDOC_NUM 4 BEGIN PROMPT 3 4 "Numerazione " USE %NUM - INPUT CODTAB F_CARDOC_NUM + INPUT CODTAB F_OU_CARDOC_NUM DISPLAY "Codice@8" CODTAB DISPLAY "Descrizione@50" S0 - OUTPUT F_CARDOC_NUM CODTAB + OUTPUT F_OU_CARDOC_NUM CODTAB CHECKTYPE REQUIRED FIELD CarDocNum END -STRING F_CARDOC_TIP 4 +STRING F_OU_CARDOC_TIP 4 BEGIN PROMPT 23 4 "Tipo " USE %TIP - INPUT CODTAB F_CARDOC_TIP + INPUT CODTAB F_OU_CARDOC_TIP DISPLAY "Codice" CODTAB DISPLAY "Descrizione@50" S0 - OUTPUT F_CARDOC_TIP CODTAB + OUTPUT F_OU_CARDOC_TIP CODTAB CHECKTYPE REQUIRED FLAGS "U" FIELD CarDocTip END -STRING F_CARDOC_STA 1 +STRING F_OU_CARDOC_STA 1 BEGIN PROMPT 36 4 "Stato " USE %STD - INPUT CODTAB F_CARDOC_STA + INPUT CODTAB F_OU_CARDOC_STA DISPLAY "Codice" CODTAB DISPLAY "Descrizione@50" S0 - OUTPUT F_CARDOC_STA CODTAB + OUTPUT F_OU_CARDOC_STA CODTAB FLAGS "U" CHECKTYPE REQUIRED FIELD CarDocSta END -LISTBOX F_BARCODE_TIP 10 +LISTBOX F_OU_BARCODE_TIP 10 BEGIN PROMPT 2 6 "Tipo di barcode " ITEM "N|Normale" @@ -391,12 +391,12 @@ BEGIN FIELD "TipoBarcode" END -GROUPBOX DLG_NULL 76 12 +GROUPBOX DLG_NULL 76 14 BEGIN PROMPT 1 8 "@bImportazione" END -STRING F_INPUT_PATH 255 38 +STRING F_INPUT_PATH 255 44 BEGIN PROMPT 2 9 "Percorso files da importare " DSELECT @@ -461,22 +461,47 @@ END TEXT DLG_NULL BEGIN - PROMPT 2 13 "Le numerazioni sono generate automaticamente in base al tipo documento ricevuto" + PROMPT 2 12 "Le numerazioni sono generate automaticamente in base al tipo documento ricevuto" END TEXT DLG_NULL BEGIN - PROMPT 2 14 "ed al codice terminale, secondo la regola: 'TipoDocumento'+'CodiceTerminale. Es. 'F'+'001' -> F001" + PROMPT 2 13 "ed al codice terminale, secondo la regola: 'TipoDocumento'+'CodiceTerminale. Es. 'F'+'001' -> F001" +END + +STRING F_IN_CODCAUS 3 +BEGIN + PROMPT 2 14 "Causale movimenti da incassi " + FLAGS "UZ" + USE LF_CAUSALI + INPUT CODCAUS F_IN_CODCAUS + DISPLAY "Cod." CODCAUS + DISPLAY "Descrizione@50" DESCR + OUTPUT F_IN_CODCAUS CODCAUS + OUTPUT F_IN_DESCRCAUS DESCR + CHECKTYPE REQUIRED + FIELD InpCausale +END + +STRING F_IN_DESCRCAUS 50 37 +BEGIN + PROMPT 37 14 "" + USE LF_CAUSALI KEY 2 + INPUT DESCR F_IN_DESCRCAUS + DISPLAY "Descrizione @50" DESCR + DISPLAY "Cod." CODCAUS + COPY OUTPUT F_IN_CODCAUS + CHECKTYPE NORMAL END TEXT DLG_NULL BEGIN - PROMPT 2 15 "@bCodici IVA Campo da utilizzare in base alle aliquote" + PROMPT 2 16 "@bCodici IVA Campo da utilizzare in base alle aliquote" END -SPREADSHEET F_CODICI_IVA 74 3 +SPREADSHEET F_CODICI_IVA 74 4 BEGIN - PROMPT 2 16 "" + PROMPT 2 17 "" ITEM "%IVA@6" ITEM "Cod.IVA" ITEM "Descrizione" diff --git a/ha/ha1200.cpp b/ha/ha1200.cpp index c213f5525..485db8d81 100755 --- a/ha/ha1200.cpp +++ b/ha/ha1200.cpp @@ -610,8 +610,8 @@ void TFile2Txt::genera_carico_txt(const TMask& mask) TString query; query << "USE RDOC"; query << "\nSELECT (DOC.TIPODOC=#TIPODOC)&&(DOC.STATO=#STATO)"; - query << "\nJOIN DOC INTO PROVV=PROVV ANNO=ANNO CODNUM=CODNUM NDOC=NDOC"; - query << "\nBY DOC.CODAG"; + query << "\nBY DOC.CODAG NDOC"; + query << "\nJOIN DOC INTO PROVV==PROVV ANNO==ANNO CODNUM==CODNUM NDOC==NDOC"; query << "\nFROM CODNUM=#CODNUM ANNO=#ANNO PROVV=D NDOC=#DA_NDOC"; query << "\nTO CODNUM=#CODNUM ANNO=#ANNO PROVV=D NDOC=#A_NDOC"; diff --git a/ha/ha1300.cpp b/ha/ha1300.cpp index fd941e7ff..de037f0ea 100755 --- a/ha/ha1300.cpp +++ b/ha/ha1300.cpp @@ -3,6 +3,9 @@ #include #include +#include "../cg/cg2101.h" +#include "../cg/cg2103.h" +#include "../cg/cgsaldac.h" #include "../mg/movmag.h" #include "../mg/rmovmag.h" @@ -14,51 +17,44 @@ //funzione di ordinamento del file di upload una volta caricato in memoria + +static TToken_string tipi_record("SU|VC|TF|RF|SI|BR|RC"); + int ordina_upload(const TObject** o1, const TObject** o2) { const TString& s1 = *(TString*)*o1; const TString& s2 = *(TString*)*o2; - if (s1[0] == 'V' || s2[0] == 'V') + //ordinatore dei record Testata e Riga fattura + if (s1[1] == 'F' && s2[1] == 'F') { - if (s1[0] != 'V' || s2[0] != 'V') - return s1[0] == 'V' ? -1 : +1; - } - else - { - //ordinatore dei record Testata e Riga fattura - if (s1[1] == 'F' && s2[1] == 'F') + TToken_string k[2]; + for (int i = 0; i < 2; i++) { - TToken_string k[2]; - for (int i = 0; i < 2; i++) + const TString& rec = i == 0 ? s1 : s2; + TToken_string& key = k[i]; + if (rec[0] == 'T') { - const TString& rec = i == 0 ? s1 : s2; - TToken_string& key = k[i]; - if (rec[0] == 'T') - { - key.add(rec.mid(14,2)); //anno - key.add(rec.mid(16,1)); //tipodoc - key.add(rec.mid(5,5)); //numdoc - } - else - { - key.add(rec.mid(14,2)); //anno - key.add(rec.mid(28,1)); //tipodoc - key.add(rec.mid(5,5)); //numdoc - key.add(rec.mid(29,5)); //codart - } + key.add(rec.mid(14,2)); //anno + key.add(rec.mid(16,1)); //tipodoc + key.add(rec.mid(5,5)); //numdoc + } + else + { + key.add(rec.mid(14,2)); //anno + key.add(rec.mid(28,1)); //tipodoc + key.add(rec.mid(5,5)); //numdoc + key.add(rec.mid(29,5)); //codart } - return k[0].compare(k[1]); - } - else - { - if (s1[1] == 'F') - return +1; - if (s2[1] == 'F') - return -1; } + return k[0].compare(k[1]); } + const int pos1 = tipi_record.get_pos(s1.left(2)); + const int pos2 = tipi_record.get_pos(s2.left(2)); + if (pos1 != pos2) + return pos1 - pos2; + return s1.compare(s2); } @@ -101,13 +97,13 @@ THardy_upload_recordset::THardy_upload_recordset(const TFilename& filename) //-------------- add_trc_field("SU", "TipoRecord", T_X, 1, 2); //x add_trc_field("SU", "CodiceTerminale", T_N, 3, 3); //x - add_trc_field("SU", AGE_CODAGE, T_N, 6, 3); //x + add_trc_field("SU", "CodiceAgente", T_N, 6, 3); //x add_trc_field("SU", "NonUsato", T_X, 9, 6); add_trc_field("SU", "Targa", T_X, 15, 8); add_trc_field("SU", "nDDT", T_N, 23, 5); add_trc_field("SU", "nFATT", T_N, 28, 5); add_trc_field("SU", "nBOLLA", T_N, 33, 5); - add_trc_field("SU", AGE_RAGSOC, T_X, 38, 30); //x + add_trc_field("SU", "NomeAgente", T_X, 38, 30); //x //Tipo record TF //-------------- @@ -297,10 +293,11 @@ protected: //metodi di basso livello const TString& check_agente(TString& codice_terminale, TLog_report& log); const TString& check_articolo(TString& codart, TLog_report& log); + long check_cliente(const TString& str_codcf, TLog_report& log); void check_magazzino(const TString& codmag_age, TLog_report& log); void check_causale(TString& codcaus, TLog_report& log); - //metodi di alto livello + //metodi di alto livello void elabora_SU(THardy_upload_recordset& recset, TLog_report& log); void elabora_BR(THardy_upload_recordset& recset, TLog_report& log); void elabora_VC(THardy_upload_recordset& recset, TLog_report& log); @@ -315,7 +312,11 @@ public: virtual bool create(); }; -//metodo che controlla se il terminale corrisponde ad un agente registrato e restituisce l'agente +///////////////////////////////////////////////////////////////////////////////////////////////// +// Metodi di basso livello +///////////////////////////////////////////////////////////////////////////////////////////////// + +//controlla se il terminale corrisponde ad un agente registrato e restituisce l'agente const TString& TUpload2Campo::check_agente(TString& codice_terminale, TLog_report& log) { codice_terminale.right_just(3, '0'); @@ -336,7 +337,7 @@ const TString& TUpload2Campo::check_agente(TString& codice_terminale, TLog_repor } -//metodo che controlla che l'articolo esista su Campo +//controlla che l'articolo esista su Campo const TString& TUpload2Campo::check_articolo(TString& codart, TLog_report& log) { codart.trim(); @@ -352,7 +353,7 @@ const TString& TUpload2Campo::check_articolo(TString& codart, TLog_report& log) return rec_anamag.get(ANAMAG_DESCR); } - +//controlla l'esistenza del magazzino su Campo void TUpload2Campo::check_magazzino(const TString& codmag_age, TLog_report& log) { const TString& codmag_campo = cache().get("MAG", codmag_age, "CODTAB"); @@ -365,6 +366,43 @@ void TUpload2Campo::check_magazzino(const TString& codmag_age, TLog_report& log) } } +//controlla il cliente;se nuovo controlla che sia già stato importato nella lista dei nuovi clienti,se.. +//esistente controlla che ci sia negli archivi Campo +long TUpload2Campo::check_cliente(const TString& str_codcf, TLog_report& log) +{ + long codcf = 0L; + const bool new_cliente = str_codcf.find('*') >= 0; + + if (new_cliente) + { + const real* ptr = (const real*)_nuovi_clienti.objptr(str_codcf); + codcf = ptr ? ptr->integer() : 0L; + } + else + { + TToken_string key_clifo; + key_clifo.add("C"); + key_clifo.add(str_codcf); + codcf = atol(cache().get(LF_CLIFO, key_clifo, CLI_CODCF)); + } + + //controllo effettuabile solo se il cliente è già presente (vecchio o nuovo aggiunto con la importa_VC se era _can_write) + if (codcf <= 0) + { + _can_write = false; + TString msg; + msg << "Codice cliente " << str_codcf << " sconosciuto"; + log.log(2, msg); + } + + return codcf; +} + + +///////////////////////////////////////////////////////////////////////////////////////////////// +// Metodi di alto livello +///////////////////////////////////////////////////////////////////////////////////////////////// + //SU non è un tipo record di qualche utilità void TUpload2Campo::elabora_SU(THardy_upload_recordset& recset, TLog_report& log) { @@ -375,7 +413,7 @@ void TUpload2Campo::elabora_VC(THardy_upload_recordset& recset, TLog_report& log { //dati dal recordset di upload TString4 codice_terminale = recset.get("CodiceTerminale").as_string(); - const TString& codice_agente = check_agente(codice_terminale, log); + const TString8 codice_agente = check_agente(codice_terminale, log); long codcf = recset.get("CodiceCliente").as_int(); @@ -534,9 +572,63 @@ void TUpload2Campo::elabora_VC(THardy_upload_recordset& recset, TLog_report& log } } - +//movimenti di incasso void TUpload2Campo::elabora_SI(THardy_upload_recordset& recset, TLog_report& log) { + //dati dal recordset di upload (con i relativi controlli) + TString4 codice_terminale = recset.get("CodiceTerminale").as_string(); + const TString& codice_agente = check_agente(codice_terminale, log); + const TString& str_codcf = recset.get("CodiceCliente").as_string(); + long codcf = check_cliente(str_codcf, log); + + //crea un movimento contabile pescando i dati dal recordset (e inventandosene qualcuno!) + //testata + const char tipo_cf = 'C'; + const TDate data_incasso = recset.get("DataIncasso").as_date(); + const TDate datareg = data_incasso; + const TDate datacomp = data_incasso; + TEsercizi_contabili esc; + const int annoes = esc.date2esc(data_incasso); + const long numdoc = recset.get("NumeroFattura").as_int(); + const TDate datadoc = recset.get("DataFattura").as_date(); + const TString4 tipodoc = recset.get("TipoDocumento").as_string(); + const real incasso = recset.get("ImportoIncassato").as_real() / CENTO; + + TConfig config(CONFIG_DITTA, "ha"); + const TString& codcaus = config.get("InpCausale"); + const TCausale caus(codcaus, datareg.year()); + const int riga_abb = RIGA_ABBUONI_PASSIVI; + TBill conto_abbuoni; caus.bill(riga_abb, conto_abbuoni); + + TMovimentoPN mov; + TRectype& head = mov.curr(); + head.put(MOV_CODCAUS, codcaus); + head.put(MOV_DATAREG, datareg); + head.put(MOV_DATACOMP, datacomp); + TString descr; + descr << "Incasso. Cliente: " << codcf << " - Agente: " << codice_agente; + head.put(MOV_DESCR, descr); + + head.put(MOV_ANNOES, annoes); + head.put(MOV_DATADOC, datadoc); + head.put(MOV_NUMDOC, numdoc); + head.put(MOV_TIPODOC, tipodoc); + + if (_can_write) + { + if (mov.write() != NOERR) + _can_write = false; + TString msg; + msg << "Movimento di incasso non registrato. Cliente: " << codcf << " - Agente: " << codice_agente << " - Data: " << data_incasso; + log.log(2, msg); + } + + const long numreg = head.get_long(MOV_NUMREG); + //righe + + + //crea i pagamenti aggiornando anche la partita + } @@ -649,6 +741,11 @@ void TUpload2Campo::elabora_BR(THardy_upload_recordset& recset, TLog_report& log void TUpload2Campo::elabora_TF(THardy_upload_recordset& recset, TLog_report& log) { + char rec_tipodoc = recset.get(DOC_TIPODOC).as_string()[0]; + //i documenti di vendita annullati vanno ignorati + if (rec_tipodoc == 'A' || rec_tipodoc == 'N') + return; + //1) codice terminale (lungo 3) e codice agente (lungo 5) TString4 codice_terminale = recset.get("CodiceTerminale").as_string(); const TString& codice_agente = check_agente(codice_terminale, log); @@ -660,7 +757,7 @@ void TUpload2Campo::elabora_TF(THardy_upload_recordset& recset, TLog_report& log const TString& str_datadoc = recset.get(DOC_DATADOC).as_string(); const TDate datadoc = upload_format_date6(str_datadoc); - char rec_tipodoc = recset.get(DOC_TIPODOC).as_string()[0]; + //2a) tipo documento TString4 tipodoc; TConfig hardy(CONFIG_DITTA, "ha"); @@ -711,33 +808,10 @@ void TUpload2Campo::elabora_TF(THardy_upload_recordset& recset, TLog_report& log //2d) cliente e campi collegati via cli2doc() doc.put(DOC_TIPOCF, "C"); - //se il cliente è nuovo, ovvero aggiunto in un record di tipo VC precedentemente letto,.. - //..deve stabilire quale è il suo codcf campesco già determinato (è il caso dei codcf con *) - long codcf = 0L; + //dato il codice cliente sul recordset (stringa di 6) risale al codice di Campo (long di 6) stabilendo.. + //..eventuali relazioni con i clienti nuovi (con '*') importati nei record VC all'inizio della procedura const TString& str_codcf = recset.get(DOC_CODCF).as_string(); - const bool new_cliente = str_codcf.find('*') >= 0; - - if (new_cliente) - { - const real* ptr = (const real*)_nuovi_clienti.objptr(str_codcf); - codcf = ptr ? ptr->integer() : 0L; - } - else - { - TToken_string key_clifo; - key_clifo.add("C"); - key_clifo.add(str_codcf); - codcf = atol(cache().get(LF_CLIFO, key_clifo, CLI_CODCF)); - } - - //controllo effettuabile solo se il cliente è già presente (vecchio o nuovo aggiunto con la importa_VC se era _can_write) - if (codcf <= 0) - { - _can_write = false; - TString msg; - msg << "Codice cliente " << str_codcf << " sconosciuto"; - log.log(2, msg); - } + long codcf = check_cliente(str_codcf, log); doc.put(DOC_CODCF, codcf); doc.put(DOC_CODCFFATT, recset.get(DOC_CODCFFATT).as_int()); @@ -891,7 +965,7 @@ void TUpload2Campo::elabora_RC(THardy_upload_recordset& recset, TLog_report& log //2a) numerazione e tipo documento TConfig hardy(CONFIG_DITTA, "ha"); const TString4 codnum = hardy.get("CarDocNum"); - const TString4 tipodoc = hardy.get("CarDoctip"); + const TString4 tipodoc = hardy.get("CarDocTip"); const TString4 stato = hardy.get("CarDocSta"); //2b) documento vero e proprio (stessi campi del caso tipo record = TF) @@ -986,7 +1060,7 @@ void TUpload2Campo::elabora_RC(THardy_upload_recordset& recset, TLog_report& log void TUpload2Campo::elabora(const TMask& mask) { - TToken_string tipi_record("SU|TF|RF|SI|BR|VC|RC"); + //creazione del filename del file da importare TFilename src_file = mask.get(F_PATH);