Index: murachi/src/main/java/ve/gob/cenditel/murachi/MURACHIStatistic.java
===================================================================
--- murachi/src/main/java/ve/gob/cenditel/murachi/MURACHIStatistic.java	(revision fc4d3bb9878f9796c0afce1e42d9878a0ef38931)
+++ murachi/src/main/java/ve/gob/cenditel/murachi/MURACHIStatistic.java	(revision 5d188abb397e33fc741bddf7f6293d5c3a09b82b)
@@ -72,5 +72,6 @@
             
             sql = "CREATE TABLE VERIFICATIONS " +
-                    "(VERIFICATION_ID SERIAL PRIMARY KEY NOT NULL)";
+                    "(VERIFICATION_ID SERIAL PRIMARY KEY NOT NULL,"+
+            		"TYPE CHAR(4) NOT NULL)";
             stmt.executeUpdate(sql);                        
             System.out.println("table VERIFICATIONS created!");
@@ -79,5 +80,6 @@
             
             sql = "CREATE TABLE SIGNATURES_ERROR " +
-                    "(SIGNATURE_ERROR_ID SERIAL PRIMARY KEY NOT NULL)";
+                    "(SIGNATURE_ERROR_ID SERIAL PRIMARY KEY NOT NULL, "+
+            		"TYPE CHAR(4) NOT NULL)";
             stmt.executeUpdate(sql);
             System.out.println("table SIGNATURE_ERROR created!");
@@ -148,4 +150,89 @@
     
     /**
+     * Incrementa en una unidad la cuenta de las firmas incompletas realizadas con el servicio
+     * 
+     * @param type tipo de firma: 0->PDF, 1->BDOC
+     * 
+     */
+    public void incrementErrorSignatures(int type) {
+    	Connection c = null;
+        Statement stmt = null;
+        try {
+           Class.forName("org.postgresql.Driver");
+           
+           //c = DriverManager.getConnection("jdbc:postgresql://localhost:5432/databasemurachi", databaseLogin, databasePassword);
+           c = DriverManager.getConnection(databaseConnection, databaseLogin, databasePassword);
+           
+           c.setAutoCommit(false);
+           //System.out.println("Opened database successfully");
+
+           stmt = c.createStatement();
+           String signatureType = "";
+           
+           if (type == 0) {
+        	   signatureType = "pdf";
+           }else if (type == 1){
+        	   signatureType = "bdoc";
+           }else{
+        	   signatureType = "unknown";
+           }
+        	   
+           String sql = "INSERT INTO SIGNATURES_ERROR (TYPE) VALUES ('"+ signatureType +"');";
+           stmt.executeUpdate(sql);
+           stmt.close();
+           c.commit();
+           c.close();
+        } catch (Exception e) {
+        	logger.error(e.getClass().getName()+": "+ e.getMessage());
+            System.err.println( e.getClass().getName()+": "+ e.getMessage() );
+        }
+        //System.out.println("Records created successfully");
+    }
+    
+    
+    /**
+     * Incrementa en una unidad la cuenta de las verificaciones de firmas realizadas con el servicio
+     * 
+     * @param type tipo de firma: 0->PDF, 1->BDOC
+     * 
+     */
+    public void incrementVerifications(int type) {
+    	Connection c = null;
+        Statement stmt = null;
+        try {
+           Class.forName("org.postgresql.Driver");
+           
+           //c = DriverManager.getConnection("jdbc:postgresql://localhost:5432/databasemurachi", databaseLogin, databasePassword);
+           c = DriverManager.getConnection(databaseConnection, databaseLogin, databasePassword);
+           
+           c.setAutoCommit(false);
+           //System.out.println("Opened database successfully");
+
+           stmt = c.createStatement();
+           String signatureType = "";
+           
+           if (type == 0) {
+        	   signatureType = "pdf";
+           }else if (type == 1){
+        	   signatureType = "bdoc";
+           }else{
+        	   signatureType = "unkn";
+           }
+        	   
+           String sql = "INSERT INTO VERIFICATIONS (TYPE) VALUES ('"+ signatureType +"');";
+           stmt.executeUpdate(sql);
+           stmt.close();
+           c.commit();
+           c.close();
+        } catch (Exception e) {
+        	logger.error(e.getClass().getName()+": "+ e.getMessage());
+            System.err.println( e.getClass().getName()+": "+ e.getMessage() );
+        }
+        
+    }
+    
+    
+    
+    /**
      * Retorna el número de firmas realizadas exitosamente con el servicio.
      * 
Index: murachi/src/main/java/ve/gob/cenditel/murachi/MurachiRESTWS.java
===================================================================
--- murachi/src/main/java/ve/gob/cenditel/murachi/MurachiRESTWS.java	(revision 6c39b8adbc341a7cb3564358d121847169edd7f2)
+++ murachi/src/main/java/ve/gob/cenditel/murachi/MurachiRESTWS.java	(revision 5d188abb397e33fc741bddf7f6293d5c3a09b82b)
@@ -625,5 +625,5 @@
 		jsonObject = verifyALocalFile(fileId);
 		logger.info("/firmados: " + jsonObject.toString());
-		
+				
 		return Response.status(200).entity(jsonObject.toString()).build();
 	}
@@ -840,4 +840,7 @@
 				logger.info("/{"+idFile+"}: "+ result);
 				
+				// registrar la verificacion exitosa en el contador de verificaciones
+				registerAVerification(1);
+				
 				return Response.status(200).entity(result).build();
 			}
@@ -850,4 +853,7 @@
 				logger.info("/{"+idFile+"}: "+ result);
 				
+				// registrar la verificacion exitosa en el contador de verificaciones
+				registerAVerification(0);
+				
 				return Response.status(200).entity(result).build();				
 			}
@@ -855,4 +861,7 @@
 			else 
 			{
+				// registrar la verificacion exitosa en el contador de verificaciones
+				registerAVerification(2);
+				
 				jsonObject.put("fileExist", "true");
 				jsonObject.put("error", "extension not supported");
@@ -956,10 +965,12 @@
 			String mime = getMimeType(path);
 			System.out.println("mimetype : " + mime);
-			
-			
+						
 			if (mime.equals("application/zip")) {
 				jsonObject = verifySignaturesInBdoc(path, false);
 				result = jsonObject.toString();
 				logger.info("/{"+idFile+"}: "+ result);
+				
+				// registrar la verificacion exitosa en el contador de verificaciones
+				registerAVerification(1);
 				
 				return jsonObject;
@@ -972,4 +983,7 @@
 				result = jsonObject.toString();
 				logger.info("/{"+idFile+"}: "+ result);
+				
+				// registrar la verificacion exitosa en el contador de verificaciones
+				registerAVerification(0);
 				
 				return jsonObject;				
@@ -980,4 +994,8 @@
 				jsonObject.put("fileExist", "true");
 				jsonObject.put("error", "extension not supported");
+				
+				// registrar la verificacion exitosa en el contador de verificaciones
+				registerAVerification(2);
+				
 				return jsonObject;
 			}			
@@ -1833,6 +1851,11 @@
 
 		if (postsignPar == null) {
+			
+			// registrar error de firma en estadisticas
+			registerASignatureError(0);
+						
 			logger.error("solicitud mal formada.");
 			result = "\"error\":\"solicitud mal formada\"";
+			
 			return Response.status(400).entity(result).build();	
 		}
@@ -1841,4 +1864,8 @@
 		String signature = postsignPar.getSignature();
 		if (signature == null) {
+			
+			// registrar error de firma en estadisticas
+			registerASignatureError(0);
+			
 			logger.debug("signature == null");
 			logger.error("solicitud mal formada: no esta especificada la firma realizada en el cliente.");
@@ -1869,4 +1896,8 @@
 		
 		if (fileId == null) {
+			
+			// registrar error de firma en estadisticas
+			registerASignatureError(0);			
+			
 			System.out.println("fileId == null");
 			logger.error("Error en completacion de firma: identificador de archivo nulo");
@@ -1878,4 +1909,7 @@
 		
 		if (stamper == null) {
+			// registrar error de firma en estadisticas
+			registerASignatureError(0);
+			
 			System.out.println("stamper == null");
 			logger.error("Error en completacion de firma: estructura PdfStamper nula");
@@ -1887,4 +1921,7 @@
 		
 		if (sgn == null) {
+			// registrar error de firma en estadisticas
+			registerASignatureError(0);
+
 			System.out.println("sgn == null");
 			logger.error("Error en completacion de firma: estructura PdfPKCS7 nula");
@@ -1895,4 +1932,7 @@
 		}
 		if (hash == null) {
+			// registrar error de firma en estadisticas
+			registerASignatureError(0);
+
 			System.out.println("hash == null");
 			logger.error("Error en completacion de firma: hash nulo");
@@ -1902,4 +1942,7 @@
 		}
 		if (cal == null) {
+			// registrar error de firma en estadisticas
+			registerASignatureError(0);
+
 			System.out.println("cal == null");
 			logger.error("Error en completacion de firma: estructura de fecha nula");
@@ -1910,4 +1953,7 @@
 		}
 		if (sap == null) {
+			// registrar error de firma en estadisticas
+			registerASignatureError(0);
+
 			System.out.println("sap == null");
 			logger.error("Error en completacion de firma: estructura de apariencia de firma pdf nula");
@@ -1918,4 +1964,7 @@
 		}
 		if (os == null) {
+			// registrar error de firma en estadisticas
+			registerASignatureError(0);
+
 			System.out.println("os == null");
 			logger.error("Error en completacion de firma: bytes de archivo nulos");
@@ -1944,4 +1993,8 @@
 			
 		}catch(DocumentException e) {
+			// registrar error de firma en estadisticas
+			registerASignatureError(0);
+
+			
 			System.out.println("throw new IOException");
 			logger.error("postsignPdf: ocurrio una excepcion", e);
@@ -1951,4 +2004,7 @@
 			
 		} catch (IOException e) {
+			// registrar error de firma en estadisticas
+			registerASignatureError(0);
+
 			System.out.println("IOException e");
 			logger.error("postsignPdf: ocurrio una excepcion", e);
@@ -1984,7 +2040,6 @@
 		
 		// registrar la firma exitosa en el contador de firmas
-		MURACHIStatistic statistic = new MURACHIStatistic(databaseHost, databasePort, databaseName, databaseLogin, databasePassword);
-		statistic.incrementSignatures(0);
-		
+		registerASignature(0);
+				
 		return Response.status(200).entity(jsonFinalResult.toString()).build();
 	}
@@ -2636,4 +2691,7 @@
 		} catch(IOException e)
 		{
+			// registrar error de firma en estadisticas
+			registerASignatureError(1);
+			
 			presignHash.setError(e.getMessage());
 			presignHash.setHash("");
@@ -2641,10 +2699,12 @@
 		} catch(CertificateException e)
 		{
+			// registrar error de firma en estadisticas
+			registerASignatureError(1);
+
 			presignHash.setError(e.getMessage());
 			presignHash.setHash("");
 			return Response.status(500).entity(presignHash).build();
 		}
-			
-			
+						
 		// creacion del json
 		JSONObject jsonHash = new JSONObject();
@@ -2751,4 +2811,7 @@
 			//e.printStackTrace();
 			
+			// registrar error de firma en estadisticas
+			registerASignatureError(1);
+			
 			JSONObject jsonError = new JSONObject();
 						
@@ -2774,6 +2837,7 @@
 		
 		// registrar la firma exitosa en el contador de firmas
-		MURACHIStatistic statistic = new MURACHIStatistic(databaseHost, databasePort, databaseName, databaseLogin, databasePassword);
-		statistic.incrementSignatures(1);
+		//MURACHIStatistic statistic = new MURACHIStatistic(databaseHost, databasePort, databaseName, databaseLogin, databasePassword);
+		//statistic.incrementSignatures(1);		
+		registerASignature(1);
 		
 		return Response.status(200).entity(jsonFinalResult.toString()).build();
@@ -2882,4 +2946,7 @@
 	            if (is == null) 
 	            {
+	            	// registrar error de firma en estadisticas
+	    			registerASignatureError(1);
+	    			
 	            	logger.debug("is: null");
 	            	result = "\"error\":\"archivo pasado al recurso es nulo.\"";
@@ -4093,4 +4160,7 @@
 		
 		if (presignPar == null) {
+        	// registrar error de firma en estadisticas
+			registerASignatureError(1);
+			
 			logger.error("solicitud mal formada.");
 			result = "\"error\":\"solicitud mal formada\"";
@@ -4101,4 +4171,7 @@
 		String containerId = presignPar.getFileId();		
 		if (containerId == null) {
+        	// registrar error de firma en estadisticas
+			registerASignatureError(1);
+			
 			logger.debug("containerId == null");
 			logger.error("solicitud mal formada: no esta especificado el identificador del contenedor.");
@@ -4111,4 +4184,7 @@
 		String certHex = presignPar.getCertificate();		
 		if (certHex == null) {
+        	// registrar error de firma en estadisticas
+			registerASignatureError(1);
+			
 			logger.debug("certHex == null");
 			logger.error("solicitud mal formada: no esta especificado el certificado firmante en hexadecimal.");
@@ -4120,4 +4196,7 @@
 		String city = presignPar.getCity();
 		if (city == null) {
+        	// registrar error de firma en estadisticas
+			registerASignatureError(1);
+			
 			logger.debug("city == null");
 			logger.error("solicitud mal formada: no esta especificada la ciudad donde se realiza la firma.");
@@ -4129,4 +4208,7 @@
 		String state = presignPar.getState();
 		if (state == null) {
+        	// registrar error de firma en estadisticas
+			registerASignatureError(1);
+			
 			logger.debug("state == null");
 			logger.error("solicitud mal formada: no esta especificado el estado donde se realiza la firma.");
@@ -4138,4 +4220,7 @@
 		String postalCode = presignPar.getPostalCode();
 		if (postalCode == null) {
+        	// registrar error de firma en estadisticas
+			registerASignatureError(1);
+			
 			logger.debug("state == null");
 			logger.error("solicitud mal formada: no esta especificado el codigo postal donde se realiza la firma.");
@@ -4147,4 +4232,7 @@
 		String country = presignPar.getCountry();
 		if (country == null) {
+        	// registrar error de firma en estadisticas
+			registerASignatureError(1);
+			
 			logger.debug("country == null");
 			logger.error("solicitud mal formada: no esta especificado el pais donde se realiza la firma.");
@@ -4156,4 +4244,7 @@
 		String role = presignPar.getRole();
 		if (role == null) {
+        	// registrar error de firma en estadisticas
+			registerASignatureError(1);
+			
 			logger.debug("role == null");
 			logger.error("solicitud mal formada: no esta especificado el rol del firmante.");
@@ -4188,4 +4279,7 @@
 		
 		if (!f.exists()) {
+        	// registrar error de firma en estadisticas
+			registerASignatureError(1);
+			
 			logger.error("el contenedor "+ fullPathContainerId + " no existe.");
 			result = "\"error\":\"el contenedor "+ fullPathContainerId + " no existe\"";
@@ -4307,4 +4401,9 @@
 		} catch(IOException e)
 		{
+        	// registrar error de firma en estadisticas
+			registerASignatureError(1);
+			
+        	// registrar error de firma en estadisticas
+			registerASignatureError(1);
 			presignHash.setError(e.getMessage());
 			presignHash.setHash("");
@@ -4312,8 +4411,14 @@
 		} catch(CertificateException e)
 		{
+        	// registrar error de firma en estadisticas
+			registerASignatureError(1);
+			
 			presignHash.setError(e.getMessage());
 			presignHash.setHash("");
 			return Response.status(500).entity(presignHash).build();
 		} catch (ClassNotFoundException e) {
+        	// registrar error de firma en estadisticas
+			registerASignatureError(1);
+			
 			presignHash.setError(e.getMessage());
 			presignHash.setHash("");
@@ -4405,4 +4510,7 @@
 		
 		if (postsignPar == null) {
+        	// registrar error de firma en estadisticas
+			registerASignatureError(1);
+			
 			logger.error("solicitud mal formada.");
 			result = "\"error\":\"solicitud mal formada\"";
@@ -4413,4 +4521,7 @@
 		String signature = postsignPar.getSignature();
 		if (signature == null) {
+        	// registrar error de firma en estadisticas
+			registerASignatureError(1);
+			
 			logger.debug("signature == null");
 			logger.error("solicitud mal formada: no esta especificada la firma realizada en el cliente.");
@@ -4423,4 +4534,7 @@
 		String containerId = postsignPar.getContainerId();
 		if (containerId == null) {
+        	// registrar error de firma en estadisticas
+			registerASignatureError(1);
+			
 			logger.debug("containerId == null");
 			logger.error("solicitud mal formada: no esta especificado el identificador del contenedor.");
@@ -4440,4 +4554,7 @@
 		
 		if (!f.exists()) {
+        	// registrar error de firma en estadisticas
+			registerASignatureError(1);
+			
 			logger.error("el contenedor "+ serializedContainerId + " no existe.");
 			result = "\"error\":\"el contenedor "+ serializedContainerId + " no existe\"";
@@ -4535,4 +4652,7 @@
 		} catch (ClassNotFoundException e) {
 			//e.printStackTrace();
+        	
+			// registrar error de firma en estadisticas
+			registerASignatureError(1);
 			
 			JSONObject jsonError = new JSONObject();
@@ -4544,4 +4664,8 @@
 			return Response.status(500).entity(jsonError).build();				
 		} catch (DSSException e) {
+			
+        	// registrar error de firma en estadisticas
+			registerASignatureError(1);
+			
 			JSONObject jsonError = new JSONObject();
 			
@@ -4567,7 +4691,5 @@
 		
 		// registrar la firma exitosa en el contador de firmas
-		MURACHIStatistic statistic = new MURACHIStatistic(databaseHost, databasePort, databaseName, databaseLogin, databasePassword);
-		statistic.incrementSignatures(1);
-
+		registerASignature(1);
 		
 		return Response.status(200).entity(jsonFinalResult.toString()).build();
@@ -5025,4 +5147,5 @@
 		  
 		  
+		  
 		  //statistic.incrementSignatures(0);
 		  
@@ -5035,7 +5158,9 @@
 		  int countSignaturesError = statistic.countOfSiganturesFailed();
 		  jsonObject.put("numeroDeFimasIncompletas", Integer.toString(countSignaturesError));
+		  logger.debug("firmas incorrectas: "+ Integer.toString(countSignaturesError));
 		  
 		  int countVerifications = statistic.countOfVerifications();
 		  jsonObject.put("numeroDeVerificaciones", Integer.toString(countVerifications));
+		  logger.debug("verificaciones realizadas correctamente: "+ Integer.toString(countVerifications));
 		  
 		  result = jsonObject.toString();
@@ -5044,5 +5169,37 @@
 	  }
 	  
+	  /**
+	   * Registra un evento de firma electrónica en la base de datos de estadisticas
+	   * @param type 0-> PDF; 1->BDOC; 2->UNKN
+	   */
+	  private void registerASignature(int type) {
+			// registrar la verificacion exitosa en el contador de verificaciones
+			  MURACHIStatistic statistic = new MURACHIStatistic(databaseHost, databasePort, databaseName, databaseLogin, databasePassword);
+			  statistic.incrementSignatures(type);
+		  }
 	  
+	  /**
+	   * Registra un evento de verificacion de firma electrónica en la base de datos de estadisticas
+	   * @param type 0-> PDF; 1->BDOC; 2->UNKN
+	   */
+	  private void registerAVerification(int type) {
+		  // registrar la verificacion exitosa en el contador de verificaciones
+		  MURACHIStatistic statistic = new MURACHIStatistic(databaseHost, databasePort, databaseName, databaseLogin, databasePassword);
+		  statistic.incrementVerifications(type);		  
+	  }
+	  
+	  /**
+	   * Registra un evento de firma electrónica incompleta en la base de datos de estadisticas
+	   * @param type 0-> PDF; 1->BDOC; 2->UNKN
+	   */
+	  private void registerASignatureError(int type) {
+		  // registrar la verificacion exitosa en el contador de verificaciones
+		  MURACHIStatistic statistic = new MURACHIStatistic(databaseHost, databasePort, databaseName, databaseLogin, databasePassword);
+		  statistic.incrementErrorSignatures(type);	  
+	  }
+      
+	  
+	
+	 
 	
 	  
@@ -6016,5 +6173,97 @@
 	
 	
-	
+	@POST
+	@Path("/phpcargas")
+	@Consumes(MediaType.MULTIPART_FORM_DATA)
+	@Produces(MediaType.APPLICATION_JSON)
+	@Authenticator
+	public Response uploadPHP(FormDataMultiPart formParams) throws MurachiException {
+		
+		logger.info("recurso /phpcargas");
+		logger.debug("	uploadPHP...");
+		
+		// cadena con la respuesta
+		String result = "";
+		
+		String fileId = "";
+		
+		if (formParams == null) {
+			logger.error("solicitud mal formada.");
+			result = "\"error\":\"solicitud mal formada\"";
+			return Response.status(400).entity(result).build();
+		}
+		
+		Map<String, List<FormDataBodyPart>> fieldsByName = formParams.getFields();
+		logger.debug("	contenido de Map: " + Integer.toString(fieldsByName.size()));
+		
+		for (List<FormDataBodyPart> fields : fieldsByName.values())
+	    {
+	        for (FormDataBodyPart field : fields)
+	        {
+	            InputStream is = field.getEntityAs(InputStream.class);
+	            
+	            if (is == null) 
+	            {
+	            	logger.debug("is: null");
+	            	result = "\"error\":\"archivo pasado al recurso es nulo.\"";
+	    			return Response.status(500).entity(result).build();
+	            }	           
+	            
+	            FormDataContentDisposition file = field.getFormDataContentDisposition();	            
+	            String fileName = file.getFileName();
+	            logger.debug("fileName: " + fileName);	            
+	            /* 
+	            if (fileName == null)
+	            {
+	            	logger.debug("fileName: null");
+	            	result = "\"error\":\"nombre del archivo pasado al recurso es nulo. Debe especificar un nombre de archivo.\"";
+	    			return Response.status(500).entity(result).build();
+	            }	            
+	            
+	            String mimeType = field.getMediaType().toString();	            	            
+	            logger.debug("mimeType: " + mimeType);
+	            
+	            if (mimeType == null)
+	            {
+	            	logger.debug("mimeType: null");
+	            	result = "\"error\":\"tipo mime del archivo pasado al recurso es nulo.\"";
+	    			return Response.status(500).entity(result).build();
+	            }
+		    */
+	            	            	            
+	            try
+	            {
+	            	//addFileToBDOCContainer(is, fileName, mimeType, c);
+	            	
+	            	fileId = UUID.randomUUID().toString();
+	        		System.out.println(fileId);
+	        		
+	        		saveToDisk(is, null, fileId);
+	            	logger.info("se guardó el archivo" + fileId + "en el disco");
+	            }
+	            catch(Exception e) 
+	            {
+	            	logger.debug("excepcion: " + e.getMessage());	            	
+	    			result = "\"error\":\"no se pudo guardar el archivo en el servidor.\"";
+	    			return Response.status(500).entity(result).build();
+	            }	            
+	            	           
+	        }
+	    }		
+		
+		//logger.debug("cantidad de DataFile del contenedor: " + Integer.toString(c.getDataFiles().size()));
+		//String fileId = UUID.randomUUID().toString();
+		//System.out.println("id contenedor serializado: "+fileId);
+				
+		// establecer el nombre del archivo a serializar 
+		//String serializedContainerId = SERVER_UPLOAD_LOCATION_FOLDER + fileId + "-serialized";
+		//logger.debug("	id de contenedor serializado: "+ serializedContainerId);
+	
+		result = "{\"fileId\":\""+ fileId +"\"}";
+		logger.debug(result);
+		
+		logger.debug("	{containerId:"+ fileId+"}");
+		return Response.status(200).entity(result).build();
+	}
 	
 	
