git-svn-id: svn://10.65.10.50/branches/R_10_00@23025 c028cbd2-c16b-5b4b-a496-9718f37d4682
		
			
				
	
	
		
			323 lines
		
	
	
		
			9.0 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			323 lines
		
	
	
		
			9.0 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| #include "sl0200.h"
 | ||
| 
 | ||
| #include "../ve/velib04.h"
 | ||
| #include "../ca/commesse.h"
 | ||
| 
 | ||
| ///////////////////////////////////////////////////////////
 | ||
| // TCertificazione
 | ||
| ///////////////////////////////////////////////////////////
 | ||
| 
 | ||
| class TCertificazione : public TElaborazione_esterna
 | ||
| {
 | ||
| protected:
 | ||
|   const TRectype& find_cert(const TDocumento& doc);
 | ||
|   void set_codiva(TRiga_documento& rdoc) const;
 | ||
| 
 | ||
| public:
 | ||
|   virtual bool elabora(TLista_documenti& doc_in, TLista_documenti& doc_out,
 | ||
|                        const TDate& data_elab, bool interattivo = false);
 | ||
|   TCertificazione(const TString& cod);
 | ||
| };
 | ||
| 
 | ||
| const TRectype& TCertificazione::find_cert(const TDocumento& doc)
 | ||
| {
 | ||
|   const TString& codnum = codice_numerazione_finale();
 | ||
|   TString query, limit;
 | ||
|   limit << RDOC_DAPROVV  << '=' << doc.get(DOC_PROVV)    << ' ' 
 | ||
|         << RDOC_DAANNO   << '=' << doc.get_int(DOC_ANNO) << ' '  
 | ||
|         << RDOC_DACODNUM << '=' << doc.get(DOC_CODNUM)   << ' '  
 | ||
|         << RDOC_DANDOC   << '=' << doc.get_long(DOC_NDOC);
 | ||
|   query << "USE 34 KEY 4"
 | ||
|         << "\nSELECT CODNUM=\"" << codnum << '"'
 | ||
|         << "\nFROM " << limit << "\nTO " << limit;
 | ||
|   
 | ||
|   TISAM_recordset recset(query);
 | ||
|   const TRectype& rdoc = recset.cursor()->curr();
 | ||
|   TToken_string key;
 | ||
|   if (recset.move_first())
 | ||
|   {
 | ||
|     key = rdoc.get(RDOC_PROVV);
 | ||
|     key.add(rdoc.get(RDOC_ANNO));
 | ||
|     key.add(rdoc.get(RDOC_CODNUM));
 | ||
|     key.add(rdoc.get(RDOC_NDOC));
 | ||
|   }
 | ||
|   
 | ||
|   return cache().get(LF_DOC, key);
 | ||
| }
 | ||
| 
 | ||
| void TCertificazione::set_codiva(TRiga_documento& rdoc) const
 | ||
| {
 | ||
|   TString4 codiva;
 | ||
| 
 | ||
|   const TString80 codcms = rdoc.doc().get(DOC_CODCMS);
 | ||
|   if (codcms.full())
 | ||
|   {
 | ||
|     const TRectype& cms = cache().get(LF_COMMESSE, codcms);
 | ||
|     if (!cms.empty())
 | ||
|     {
 | ||
|       rdoc.put(RDOC_CODCMS, codcms);
 | ||
|       codiva = cms.get(COMMESSE_CODIVA);
 | ||
|     }
 | ||
|   }
 | ||
| 
 | ||
|   const TString80 codart = rdoc.get(RDOC_CODART);
 | ||
|   if (codart.full())
 | ||
|   {
 | ||
|     const TRectype& ana = cache().get(LF_ANAMAG, codart);
 | ||
|     if (!ana.empty())
 | ||
|     {
 | ||
|       rdoc.put(RDOC_CODARTMAG, codart);
 | ||
|       rdoc.put(RDOC_CHECKED, true);
 | ||
| 
 | ||
|       TToken_string key; key.add(codart); key.add(1);
 | ||
|       const TString& um = cache().get(LF_UMART, key, UMART_UM);
 | ||
|       rdoc.put(RDOC_UMQTA, um);
 | ||
| 
 | ||
|       if (codiva.blank())
 | ||
|         codiva = ana.get(ANAMAG_CODIVA);
 | ||
|     }
 | ||
|   }
 | ||
| 
 | ||
|   rdoc.put(RDOC_CODIVA, codiva);
 | ||
|   rdoc.importo(true, false); // Ricalcola IMPNS
 | ||
| }
 | ||
| 
 | ||
| bool TCertificazione::elabora(TLista_documenti& doc_in, TLista_documenti& doc_out,
 | ||
|                            const TDate& data_elab, bool interattivo)
 | ||
| {
 | ||
|   for (int i = 0; i < doc_in.items(); i++)
 | ||
|   {
 | ||
|     TDocumento& din = doc_in[i];
 | ||
| 
 | ||
|     // Mi assicuro che ad ogni documento in ingresso ne corrisponda uno in uscita
 | ||
|     if (i >= doc_out.items()) 
 | ||
|     {
 | ||
|       const TRectype& cert = find_cert(din);
 | ||
|       if (!cert.empty())
 | ||
|       {
 | ||
|         if (interattivo)
 | ||
|           warning_box("Il documento S.A.L. aggiorner<65> il certificato %s %d/%ld", 
 | ||
|                       (const char*)cert.get(DOC_CODNUM), cert.get_int(DOC_ANNO), cert.get_long(DOC_NDOC));
 | ||
|       }
 | ||
| 
 | ||
|       TDocumento* doc = NULL;
 | ||
|       if (cert.empty())
 | ||
|       {
 | ||
|         doc = new TDocumento('D', data_elab.year(), codice_numerazione_finale(), 0L);
 | ||
|         doc->put(DOC_TIPODOC, tipo_finale());
 | ||
|       }
 | ||
|       else
 | ||
|       {
 | ||
|         doc = new TDocumento(cert);
 | ||
|         doc->destroy_rows();
 | ||
|       }
 | ||
|       doc_out.add(doc);
 | ||
|     }
 | ||
| 
 | ||
|     TDocumento& don = doc_out[i];
 | ||
| 
 | ||
|     din.put(DOC_STATO,      stato_finale_doc_iniziale());
 | ||
|     
 | ||
|     don.put(DOC_NUMANT,     din.get(DOC_NUMANT));
 | ||
|     don.put(DOC_TIPOCF,     din.get(DOC_TIPOCF));
 | ||
|     don.put(DOC_CODCF,      din.get(DOC_CODCF));
 | ||
|     don.put(DOC_DATADOC,    data_elab);
 | ||
|     don.put(DOC_NOTE,       din.get(DOC_NOTE));
 | ||
|     don.put(DOC_CODCMS,     din.get(DOC_CODCMS));
 | ||
|     don.put(DOC_STATO,      stato_finale());
 | ||
|     don.put(DOC_NUMDOCRIF,  din.get(DOC_NDOC));
 | ||
|     don.put(DOC_DATADOCRIF, din.get(DOC_DATADOC));
 | ||
| 
 | ||
|     // don.put(DOC_G1,         din.get(DOC_G1));
 | ||
|     TToken_string g1(din.get(DOC_G1), '\n');
 | ||
|     FOR_EACH_TOKEN(g1, tok)
 | ||
|     {
 | ||
|       TToken_string fld(tok, '=');
 | ||
|       const char* name = fld.get(0);
 | ||
|       const char* value = fld.get();
 | ||
|       don.put(name, value);
 | ||
|     }
 | ||
| 
 | ||
|     const bool is_cli = don.get_char(DOC_TIPOCF) != 'F';
 | ||
|     const real sal_sal = din.get("SAL_SAL");
 | ||
|     if (sal_sal > ZERO)
 | ||
|     {
 | ||
|       TRiga_documento& rdoc = don.new_row("01");
 | ||
|       rdoc.put(RDOC_CODART, ini_get_string(CONFIG_DITTA, "ci", is_cli ? "CODARTLC" : "CODARTLF"));
 | ||
|       rdoc.put(RDOC_QTA, UNO);
 | ||
|       rdoc.put(RDOC_DESCR, TR("Lavori eseguiti"));
 | ||
|       rdoc.put(RDOC_PREZZO, sal_sal);
 | ||
|       rdoc.set_original_rdoc_key(din[1]);
 | ||
|       set_codiva(rdoc);
 | ||
|     }
 | ||
| 
 | ||
|     const real sal_gar = din.get("SAL_GAR");
 | ||
|     if (sal_gar > ZERO)
 | ||
|     {
 | ||
|       TRiga_documento& rdoc = don.new_row("01");
 | ||
|       rdoc.put(RDOC_CODART, ini_get_string(CONFIG_DITTA, "ci", is_cli ? "CODARTGC" : "CODARTGF"));
 | ||
|       rdoc.put(RDOC_QTA, -UNO);
 | ||
|       rdoc.put(RDOC_DESCR, TR("Ritenuta a garanzia"));
 | ||
|       rdoc.put(RDOC_PREZZO, sal_gar);
 | ||
|       rdoc.set_original_rdoc_key(din[1]);
 | ||
|       set_codiva(rdoc);
 | ||
|     }
 | ||
| 
 | ||
|     const real sal_ant = din.get("SAL_ANT");
 | ||
|     if (sal_ant > ZERO)
 | ||
|     {
 | ||
|       TRiga_documento& rdoc = don.new_row("01");
 | ||
|       rdoc.put(RDOC_CODART, ini_get_string(CONFIG_DITTA, "ci", is_cli ? "CODARTAC" : "CODARTAF"));
 | ||
|       rdoc.put(RDOC_QTA, -UNO);
 | ||
|       rdoc.put(RDOC_DESCR, TR("Anticipi"));
 | ||
|       rdoc.put(RDOC_PREZZO, sal_ant);
 | ||
|       rdoc.set_original_rdoc_key(din[1]);
 | ||
|       set_codiva(rdoc);
 | ||
|     }
 | ||
| 
 | ||
|     din.rewrite(); // Aggiorna codici fase nelle righe
 | ||
|     don.write();   // Salva ordine
 | ||
|   }
 | ||
|   
 | ||
|   return true;
 | ||
| }
 | ||
| 
 | ||
| TCertificazione::TCertificazione(const TString& cod) : TElaborazione_esterna(cod) 
 | ||
| { 
 | ||
| }
 | ||
| 
 | ||
| ///////////////////////////////////////////////////////////
 | ||
| // Utility pubbliche
 | ||
| ///////////////////////////////////////////////////////////
 | ||
| 
 | ||
| const TString& sl_trova_elaborazione(const TRectype& doc)
 | ||
| {
 | ||
|   const TString& codnum  = doc.get(DOC_CODNUM); // SAL
 | ||
|   TString str;
 | ||
|   str << "USE %ELD SELECT (STR(I0=\"0\"))&&(S3=\"sl0 -1\")&&(S5=\"" << codnum << "\")";
 | ||
|   
 | ||
|   TRecordset* eld = create_recordset(str);
 | ||
|   if (eld != NULL)
 | ||
|   {
 | ||
|     TString16 cod;
 | ||
|     for (bool ok = eld->move_first(); ok; ok = eld->move_next())
 | ||
|     {
 | ||
|       const TString& c = eld->get("CODTAB").as_string();
 | ||
|       const TElaborazione e(c);
 | ||
|       if (e.is_document_ok(doc))
 | ||
|       {
 | ||
|         cod = c;
 | ||
|         break;
 | ||
|       }
 | ||
|     }
 | ||
|     delete eld;
 | ||
|     return get_tmp_string() = cod;
 | ||
|   }
 | ||
|   return EMPTY_STRING;
 | ||
| }
 | ||
| 
 | ||
| const TString& sl_trova_elaborazione(const TMask& m)
 | ||
| {
 | ||
|   TRectype doc(LF_DOC);
 | ||
|   doc.put(DOC_PROVV,   'D');
 | ||
|   doc.put(DOC_ANNO,    m.get(DOC_ANNO));
 | ||
|   doc.put(DOC_CODNUM,  m.get(DOC_CODNUM));
 | ||
|   doc.put(DOC_NDOC,    m.get(DOC_NDOC));
 | ||
|   doc.put(DOC_TIPODOC, m.get(DOC_TIPODOC));
 | ||
|   doc.put(DOC_STATO,   m.get(DOC_STATO));
 | ||
|   return sl_trova_elaborazione(doc);
 | ||
| }
 | ||
| 
 | ||
| bool sl_genera_documento(TRectype& doc, const TString& cod)
 | ||
| {
 | ||
|   TString16 codelab = cod;
 | ||
|   if (codelab.blank())
 | ||
|     codelab = sl_trova_elaborazione(doc);
 | ||
| 
 | ||
|   TCertificazione e(codelab);
 | ||
| 
 | ||
|   const TDate oggi(TODAY);
 | ||
|   TLista_documenti doc_in, doc_out;
 | ||
|   doc_in.add(new TDocumento(doc));
 | ||
| 
 | ||
|   bool ok = e.elabora(doc_in, doc_out, oggi, true);
 | ||
|   if (ok)
 | ||
|   {
 | ||
|     int err = doc_in.rewrite();
 | ||
|     if (err == NOERR)
 | ||
|     {
 | ||
|       const TRectype& idoc = doc_in[0];
 | ||
|       for (int i = 0; i < idoc.items(); i++)
 | ||
|       {
 | ||
|         const char* fld = idoc.fieldname(i);
 | ||
|         const TString& val = idoc.get(fld);
 | ||
|         if (val.full())
 | ||
|           doc.put(fld, val);
 | ||
|       }
 | ||
| 
 | ||
|       err = doc_out.write();
 | ||
|       if (err == NOERR)
 | ||
|         message_box(FR("E' stato generato il certificato %ld"), doc.get_long(DOC_NUMANT));
 | ||
|       else
 | ||
|         error_box(TR("Errore %d in scrittura del certificato"), err);
 | ||
|     }
 | ||
|   }
 | ||
|   
 | ||
|   return ok;
 | ||
| }
 | ||
| 
 | ||
| ///////////////////////////////////////////////////////////
 | ||
| // TCertificazione_app
 | ||
| ///////////////////////////////////////////////////////////
 | ||
| 
 | ||
| class TCertificazione_app : public TSkeleton_application
 | ||
| {
 | ||
| protected:
 | ||
|   virtual void main_loop();
 | ||
| };
 | ||
| 
 | ||
| void TCertificazione_app::main_loop()
 | ||
| {
 | ||
|   TFilename ininame;
 | ||
|   if (argc() >= 2)
 | ||
|   {
 | ||
|     const TFixed_string arg = argv(2);
 | ||
|     ininame = arg.starts_with("-i", true) ? arg.mid(2) : arg;
 | ||
|   }
 | ||
| 
 | ||
|   TConfig ini(ininame, "Transaction");
 | ||
|   const TString8 codelab = ini.get("Action");
 | ||
| 
 | ||
|   ini.set_paragraph("33");
 | ||
|   TRectype doc(LF_DOC);
 | ||
|   doc.put(DOC_PROVV,  ini.get(DOC_PROVV));
 | ||
|   doc.put(DOC_ANNO,   ini.get(DOC_ANNO));
 | ||
|   doc.put(DOC_CODNUM, ini.get(DOC_CODNUM));
 | ||
|   doc.put(DOC_NDOC,   ini.get(DOC_NDOC));
 | ||
| 
 | ||
|   if (sl_genera_documento(doc, codelab))
 | ||
|   {
 | ||
|     ini.set_paragraph("Transaction");
 | ||
|     ini.set("Result", "OK");
 | ||
|     ini.set("Error", "0");
 | ||
|     
 | ||
|     ini.set_paragraph("33");
 | ||
|     for (int i = 0; i < doc.items(); i++)
 | ||
|     {
 | ||
|       const char* fld = doc.fieldname(i);
 | ||
|       const TString& val = doc.get(fld);
 | ||
|       if (val.full())
 | ||
|         ini.set(fld, val);
 | ||
|     }
 | ||
|   }
 | ||
| }
 | ||
| 
 | ||
| int sl0200(int argc, char* argv[])
 | ||
| {
 | ||
|   TCertificazione_app a;
 | ||
|   a.run(argc, argv, TR("Certificazione di pagamento"));
 | ||
|   return 0;
 | ||
| }
 | ||
| 
 | ||
| 
 |