How can I change the value of the status when uploading documents, I am developing a small functionality to upload documents, this is in a table where I have an invoice number and a button to upload documents, the button to upload documents displays a modal window where there upload the documents.
Create this small code snippet to better explain the functionality.
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">
<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/js/bootstrap.min.js"></script>
<div class="col-sm-12">
<table id="example">
<thead>
<tr>
<th>Factura</th>
</tr>
</thead>
<tbody>
<tr>
<td>
2910
</td>
<td>
<button type="button" class="btn btn-primary" data-toggle="modal" data-target="#ModalCargaFactura">Cargar Documentos</button>
</td>
</tr>
</tbody>
</table>
</div>
<div class="modal fade bd-example-modal-lg" tabindex="-1" role="dialog" aria-labelledby="myLargeModalLabel" aria-hidden="true" id="ModalCargaFactura" data-backdrop="static" data-keyboard="false" >
<div class="modal-dialog modal-lg">
<div class="modal-content">
<div class="modal-header" style="background: #36AD52;">
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true" style="color: #FFFFFF;">×</span>
</button>
</div>
<div class="modal-body">
<form action="" enctype="multipart/form-data">
<div class="form-group row">
<label for="fileToUpload" class="col-sm-3 col-form-label"> Archivo XML:</label>
<div class="col-sm-8">
<input type="file" name="fileToUpload" id="XmlToUpload" class="btn" accept=".xml" onchange="ValidarArchivos()" required>
</div>
</div>
<div class="form-group row">
<label for="pdfToUpload" class="col-sm-3 col-form-label">Archivo PDF:</label>
<div class="col-sm-8">
<input type="file" name="pdfToUpload" id="pdfToUpload" class="btn" accept=".pdf" onchange="ValidarArchivos()" required>
</div>
</div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-dismiss="modal">Cancelar</button>
<button type="button" id="upload" class="btn btn-success">Subir Documentos</button>
</div>
</form>
</div>
<div class="upload-msg"></div>
</div>
</div>
I am loading the documents with AJAX and PHP, I attach below the following JQuery where I load the document and validate the format
$(document).ready(function(){
$("#upload").on("click", function(){
const ArchivoXml = $("#XmlToUpload").prop('files')[0];
const ArchivoPDF = $("#pdfToUpload").prop('files')[0];
//Validación para comprobar que sea el formato corecto
if (ArchivoXml.type !== 'text/xml') {
$('#XmlToUpload').val('');
//$('#pdfToUpload').val('');
alert('Por favor seleccione los archivos con el formato correcto');
return;
}
const datosForm = new FormData;
datosForm.append("XmlToUpload", ArchivoXml);
datosForm.append("pdfToUpload", ArchivoPDF);
const filePath="server.php"
//console.log(ArchivoXml);
$.ajax({
type:'POST',
cache: false,
contentType: false,
processData: false,
data: datosForm,
url:filePath
}).done(function(data){
alert(data)
}).fail(function(){
alert('El archivo no se pudo cargar')
});
});
});
The following is the PHP code with which I indicate the path where it will be stored
server.php
<?php
if(isset($_FILES["XmlToUpload"])){
$archivo = $_FILES["XmlToUpload"]["name"];
$ruta ="XML/";
if(move_uploaded_file($_FILES["XmlToUpload"]["tmp_name"],$ruta.$archivo)){
echo "Subido exitosamente";
}else{
echo "Error al subir";
}
}else {
echo "No se selecciono un archivo";
}
if(isset($_FILES["pdfToUpload"])){
$archivo = $_FILES["pdfToUpload"]["name"];
$ruta ="PDF/";
if(move_uploaded_file($_FILES["pdfToUpload"]["tmp_name"],$ruta.$archivo)){
echo "Subido exitosamente";
}else{
echo "Error al subir";
}
//echo "SI LLEGO";
}else {
echo "No se selecciono un archivo";
}
?>
If two different files are set, it is for this reason that two are addedinput
Now I will explain how the information is displayed in the table, the following is a Javascript function with which I build my table
/* Formatting function for row details - modify as you need */
function format(d) {
// `d` is the original data object for the row
console.log(d);
let tabla = `<table cellpadding="5" cellspacing="0" style="border-collapse: separate; border-spacing: 40px 5px;">
<thead>
<tr>
<th>
Factura
</th>
<th>
Estatus
</th>
</tr>
</thead>
<tbody>`;
d.Factura.forEach(f => {
tabla += `<tr>
<td>${f.Factura}</td>
<td>${f.Estatus}</td>
<td><button type="button" class="btn btn-primary" data-toggle="modal" data-target="#ModalCargaFactura" onclick="CargarFactura('${f.OrdenCompra}' , '${f.Factura}')"`;
if (disabled.indexOf(f.Estatus) > -1) {
tabla += ` disabled `;
}
tabla += `>Cargar Documentos</button></td>
<td><button type="button" class="btn btn-primary" onclick="MostrarDetalleFactura('${f.Factura}')">Ver Detalle</button></td>
</tr>`;
});
tabla += '</tbody></table>';
return tabla;
}
As you can see in the previous code I show the invoice and Status in addition to this contains the Upload Documents button which displays a modal window which I locate in the first code fragment.
The following is the code that I have in my back with the help of PHP
<?php
header('Content-Type: text/html; charset=utf-8');
//error_reporting(E_ALL ^ E_NOTICE);
$param = $_POST['param'];
switch($param) {
case '1':
$query = array();
include './db/conectar.php';
$USER = utf8_encode($_POST['proveedor']);
$sql = "{call SPTest(?)}";
$params = array($USER);
$stmt = sqlsrv_query($conn, $sql, $params);
$stmt1 = sqlsrv_query($conn, $sql, $params);
if ( $stmt === false) {
die( print_r( sqlsrv_errors(), true) );
}
//Se inicializa el arreglo antes del ciclo
$query = [];
$query1 = [];
//Se necesita numero de orden de compra para agrupar
$ultimaOrden = '';
$ultimaFactura = '';
while( $row1 = sqlsrv_fetch_array($stmt1) ) {
$record1 = array(
"Factura" => $row1['Factura']
);
array_push($query1, $record1);
}
while( $row = sqlsrv_fetch_array($stmt) ) {
if(strcmp($ultimaFactura, utf8_encode ($row['Factura'])) != 0) {
$query[$indice]["Factura"][] = [
"Factura" => utf8_encode ($row['Factura']), //No Factura
"Estatus" => $row['Estatus'],
];
$ultimaFactura = utf8_encode ($row['Factura']);
}
}
sqlsrv_free_stmt( $stmt);
sqlsrv_close($conn);
$json = [
"success"=> count($query) > 0 ? true : false,
"data"=>$query
];
echo json_encode($json);
break;
?>
As you can see here, I make the call to a stored procedure to display the information, this is how it displays the information in the table. I really don't know if it is relevant information to help solve the functionality that I raised in my initial question.
With the above explained in words more words less, what I want is to change the status that the invoice contains when uploading both documents, that status to which I want it to change is 0, of many ideas that come to my mind I was thinking of doing a new stored procedure and perform an UPDATE to the status of the invoice to which the documents were charged.
Update:
Seeing that in one of the responses it is necessary to change the status, I put myself in the task of creating a stored procedure that will make the change.
ALTER PROCEDURE [dbo].[SPTest]
@factura VARCHAR(30)
AS
BEGIN
UPDATE PACKING
SET ESTATUS = 1
WHERE ID=@factura;
END
Update 2:
This is the code I am using in myserver.php
<?php
// Obtén número de factura o cadena vacía
$factura = (isset($_POST['factura'])) ? trim($_POST['factura']) : '';
print_r($factura);
echo "Probando";
// Define el arreglo que vas a devolver
$res = [
'factura' => ($factura != ''),
'xml' => (isset($_FILES["XmlToUpload"]) && $_FILES["XmlToUpload"]['error'] == 0),
'pdf' => (isset($_FILES["pdfToUpload"]) && $_FILES["pdfToUpload"]['error'] == 0)
];
// Solo si hay número de factura
if($res['factura']) {
// Solo si se subió archivo XML y no tuvo error
if($res['xml']) {
$archivo = $_FILES["XmlToUpload"]["name"];
$ruta ="XML/";
if(!move_uploaded_file($_FILES["XmlToUpload"]["tmp_name"], $ruta . $archivo)) {
// Hubo error, poner propiedad en falso
$res['xml'] = false;
}
}
// Solo si se subió archivo PDF y no tuvo error
if($res['pdf']) {
$archivo = $_FILES["pdfToUpload"]["name"];
$ruta ="PDF/";
if(!move_uploaded_file($_FILES["pdfToUpload"]["tmp_name"], $ruta . $archivo)) {
// Hubo error, poner propiedad en falso
$res['pdf'] = false;
}
}
// ¿Se subieron los dos archivos?
if($res['xml'] && $res['pdf']) {
// Aquí ejecutas la consulta para actualizar estado de factura
// Ya tienes el número en la variable $factura
// $factura = (isset($_POST['factura']));
include './db/conectar.php';
$sql = "exec PortalProveedores_CambioEstatus(?)";
$factura = (isset($_POST['factura'])) ? trim($_POST['factura']) : '';
$stmt = sqlsrv_query($conn, $sql, $factura);
if ( $stmt === false) {
die( print_r( sqlsrv_errors(), true) );
}
sqlsrv_free_stmt( $stmt);
sqlsrv_close($conn);
}
}
// Devuelves el arreglo
echo json_encode($res);
?>
In addition to this code, I show the function together with the AJAX call to upload the documents:
//Función que carga los documentos
$(document).ready(function(){
$("#upload").on("click", function(){
const ArchivoXml = $("#XmlToUpload").prop('files')[0];
const ArchivoPDF = $("#pdfToUpload").prop('files')[0];
//Validación para comprobar que sea el formato corecto
if (ArchivoXml.type !== 'text/xml' && ArchivoPDF.type !== 'text/pdf' ) {
$('#XmlToUpload').val('');
$('#pdfToUpload').val('');
alert('Por favor seleccione los archivos con el formato correcto');
}
const datosForm = new FormData;
datosForm.append("XmlToUpload", ArchivoXml);
datosForm.append("pdfToUpload", ArchivoPDF);
datosForm.append('factura', $('#numToUpload').val());
//console.log('Factura es:', $("#numToUpload").text());
const filePath="server.php"
//console.log(ArchivoXml);
$.ajax({
type:'POST',
cache: false,
contentType: false,
processData: false,
data: datosForm,
url:filePath
}).done(function(data){
alert(data)
}).fail(function(){
alert('El archivo no se pudo cargar')
});
});
});
The code where I show my modal window is the following, in this code I show the invoice number along with the two inputs of the xml and pdf files
<!-- Modal -->
<div class="modal fade bd-example-modal-lg" tabindex="-1" role="dialog" aria-labelledby="myLargeModalLabel" aria-hidden="true" id="ModalCargaFactura" data-backdrop="static" data-keyboard="false" >
<div class="modal-dialog modal-lg">
<div class="modal-content">
<div class="modal-header" style="background: #36AD52;">
<h4 class="modal-title" id="exampleModalLongTitle" style="color: #FFFFFF;">Agregar Factura</h4>
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true" style="color: #FFFFFF;">×</span>
</button>
</div>
<div class="modal-body">
<div class="form-group row">
<label for="lblNombreVisita" class="col-sm-3 col-form-label">Factura:</label>
<div class="col-sm-8">
<input type="text" class="form-control" id="numToUpload" disabled>
</div>
</div>
<form action="" enctype="multipart/form-data">
<div class="form-group row">
<label for="fileToUpload" class="col-sm-3 col-form-label"> Archivo XML:</label>
<div class="col-sm-8">
<input type="file" name="fileToUpload" id="XmlToUpload" class="btn" accept=".xml" onchange="ValidarArchivos()" required>
</div>
</div>
<div class="form-group row">
<label for="pdfToUpload" class="col-sm-3 col-form-label">Archivo PDF:</label>
<div class="col-sm-8">
<input type="file" name="pdfToUpload" id="pdfToUpload" class="btn" accept=".pdf" onchange="ValidarArchivos()" required>
</div>
</div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-dismiss="modal">Cancelar</button>
<button type="button" id="upload" class="btn btn-success">Subir Documentos</button>
</div>
</form>
</div>
<div class="upload-msg"></div>
</div>
</div>
Ahora despues de borrar el codigo que me sobraba estoy obteniendo el siguiente error al subir los documentos
Warning: sqlsrv_query() expects parameter 3 to be array, string given in C:\xampp\htdocs\GUI-PT\server.php on line 77
Array ( [0] => Array ( [0] => IMSSP [SQLSTATE] => IMSSP [1] => -14 [code] => -14 [2] => An invalid parameter was passed to sqlsrv_query. [message] => An invalid parameter was passed to sqlsrv_query. ) )
Para ser mas exacto el error me lo indica en la siguiente linea
$stmt = sqlsrv_query($conn, $sql, $factura);
Aquí hay un problema de concepto muy grande, porque quieres realizar cambios en la factura y, sin embargo, no envías el número para saber cuál es la que está recibiendo documentos y, por lo tanto, solo subes los archivos, pero no los asocias a la factura.
Para que no tengas que hacer más modificaciones en tu script:
<button type="button" class="btn btn-primary carga-docs" data-toggle="modal" data-target="#ModalCargaFactura">Cargar Documentos</button>
En la petición AJAX agrega también el número de factura:
Al procesar la petición en PHP, verifica que se recibió el número de factura también y define un arreglo para devolver, con 3 propiedades, cada una representa el estado de la acción realizada:
Importante: Deberías tener una columna para guardar el nombre de cada archivo en la tabla de facturas.