Pregunta:
Fecha: 01-10-2018 13:59:06
(En Español)
Tengo un pequeño problema cuando intento generar en un pago(según se el monto) la cancelación de "X" cantidad facturas, por ejemplo un cliente tiene en total 6 facturas "al crédito" sumando en total $155. Cuando el cliente se acerque a pagar o ha realizar un abono de por ejemplo $135, el código debe de ir restando el total de cada factura desde la más antigua hasta que el monto del abono se haya terminado, esto puede dar pie a tres cosas:
1. Cancela el total adeudado.
2. Quede remanente en una factura (siguiendo el ejemplo anterior, se paguen cuatro facturas, la quinta factura quede un remanente de $5 y la la seta de $20)
3. Pague el total y quede como débito para otras compras futuras.
Tengo una tabla que lleva el control de todas las facturas pendiente de pago por cada cliente, el monto, el abono y si está en mora, pago parcial, pagada o con débito a favor del cliente.
Cuando efectúo el update en vez de ir factura a factura, me monta el valor del abono a todas las facturas dando así un gran problema... siento que me perdí y ya no logro ver como hacerlo
Espero me puedan ayudar.
Aquí les dejo la llamada del update :
pagar multiple facturas en un sólo input[Resuelta]
Hola,Tengo un pequeño problema cuando intento generar en un pago(según se el monto) la cancelación de "X" cantidad facturas, por ejemplo un cliente tiene en total 6 facturas "al crédito" sumando en total $155. Cuando el cliente se acerque a pagar o ha realizar un abono de por ejemplo $135, el código debe de ir restando el total de cada factura desde la más antigua hasta que el monto del abono se haya terminado, esto puede dar pie a tres cosas:
1. Cancela el total adeudado.
2. Quede remanente en una factura (siguiendo el ejemplo anterior, se paguen cuatro facturas, la quinta factura quede un remanente de $5 y la la seta de $20)
3. Pague el total y quede como débito para otras compras futuras.
Tengo una tabla que lleva el control de todas las facturas pendiente de pago por cada cliente, el monto, el abono y si está en mora, pago parcial, pagada o con débito a favor del cliente.
Cuando efectúo el update en vez de ir factura a factura, me monta el valor del abono a todas las facturas dando así un gran problema... siento que me perdí y ya no logro ver como hacerlo
Espero me puedan ayudar.
Aquí les dejo la llamada del update :
$conn->beginTransaction();
$id = $_POST['idCliente']; // id del cliente
// A continuación se selecciona la cantidad de facturas que el cliente tiene en mora y/o pagado parcial
$sql = $conn->prepare("SELECT COUNT(refId) AS fMora FROM VENTAS WHERE idCliente = :idCliente
AND contacredito IN (0, 4, 5, 6) AND activo = '1'");
$sql->bindParam(':idCliente',$id);
$sql->execute();
// Se llama los campos a modificar de las facturas pendientes
while($row = $sql->fetch(PDO::FETCH_ASSOC)) $fMora = $row['fMora'];
$sth = $conn->prepare("SELECT idV, refVenta, refId, total, pagado
FROM VENTAS WHERE idCliente = :idCliente AND contacredito IN (0, 4, 5, 6) AND activo = '1'");
$sth->bindParam(':idCliente',$id);
$sth->execute();
// fMora arranca si es mayor o igual a uno
if($fMora >= '1') {
// Cada vez que termina sigue con la siguiente factura si hay más de una
for($i=0; $i< $fMora; $i++){
while($row2 = $sth->fetch(PDO::FETCH_ASSOC)) {
$percibido = $_POST['abono']; // lo que el cliente ha abonado
$percibido2 = $resta; // variable que sale al pasar cada vez por la base
$abona = $percibido - $percibido2; // variable del resto del abono
$idV = $row2['idV']; // id de la venta
$refVenta = $row2['refVenta']; // número de ref = a factura dada
$refId = $row2['refId']; // Valor en tabla de clientes
$total = $row2['total']; //total de factura
$pagado = $row2['pagado']; //pagado hasta ese día
// si lo pagado no es mayor al total de la factura genera la resta y termina la consulta
if($abona < $total && $abona > '0'){
$paga = $abona;
$contaCred = '4';
$sql = "UPDATE VENTAS SET
contacredito = :contacredito,
pagado = :pagado
WHERE refId = :refId";
$stmt = $conn->prepare($sql);
$stmt->bindParam(':contacredito', $contaCred, PDO::PARAM_STR);
$stmt->bindParam(':pagado', $paga, PDO::PARAM_STR);
$stmt->bindParam(':refId', $refId, PDO::PARAM_STR);
$stmt->execute();
}
// Si es mayor realiza la resta de lo abonado menos el total y genera la variable $resta.
else if($abona >= $total){
$paga = $total; // agrega el mismo valor del total para pagar factura
$pagado = $total-$pagado; // Genera el valor a restar del abono
$contaCred = '1';
$resta = $abona-$pagado;
$sql = "UPDATE VENTAS SET
contacredito = :contacredito,
pagado = :pagado
WHERE refId = :refId";
$stmt = $conn->prepare($sql);
$stmt->bindParam(':contacredito', $contaCred, PDO::PARAM_STR);
$stmt->bindParam(':pagado', $paga, PDO::PARAM_STR);
$stmt->bindParam(':refId', $refId, PDO::PARAM_STR);
$stmt->execute();
};
}
}
}
$conn->commit();
Votos: 0 -
Respuestas: 2 -
Vistas: 7
Compartir en: Google
Facebook
Twitter
LinkedIn
Link
Respuestas:
-
Fecha: 02-10-2018 10:39:39 No se como tienes estructuradas las tablas para darte una respuesta más clara, hasta donde se eso es Cuentas por Cobrar y lo que yo hago en esos casos es almacenar la data de la factura en la tabla de Cuentas por Cobrar, almaceno el id del cliente, codigo de factura, monto total, monto abonado y monto restante.
Luego tengo una tabla donde se almacena el detalle de los abonos, es en esta tabla donde almaceno el id de la factura, fecha del abono, modo de pago, monto abonado.
Durante el proceso de registro de la data en dicha tabla voy actualizando el registro asociado en la tabla CxC si fué pagada o no.
No sabría como explicarte más el asunto, te coloco un ejemplo con arrays para que te des una idea del proceso:
$facturas = [ ['cliente'=>'Carlos','factura'=>'FC-1001','monto'=>125], ['cliente'=>'Carlos','factura'=>'FC-1002','monto'=>100], ['cliente'=>'Carlos','factura'=>'FC-1003','monto'=>250], ['cliente'=>'Carlos','factura'=>'FC-1004','monto'=>100], ]; $abonado = 450; $pagadas = []; $abonadas = []; $restantes = []; foreach($facturas as $item){ if($abonado >= $item['monto']){ array_push($pagadas,[$item['factura'],$item['monto']]); $abonado = $abonado - $item['monto']; }else if($abonado < $item['monto'] && $abonado > 0){ $item['monto'] = $item['monto'] - $abonado; array_push($abonadas,[$item['factura'],$abonado]); array_push($restantes,[$item['factura'],$item['monto']]); $abonado = 0; }else{ array_push($restantes,[$item['factura'],$item['monto']]); } } echo "Pagadas:<br>"; var_dump($pagadas); echo "<bR>Abonadas:<br>"; var_dump($abonadas); echo "<br>"; echo "Pendientes:<br>"; var_dump($restantes); echo "<bR>Monto Restante:<br>".$abonado;
El Resultado Sería algo así:
Pagadas:
array(2) {
[0]=> array(2) {
[0]=> string(7) "FC-1001" [1]=> int(125)
}
[1]=> array(2) {
[0]=> string(7) "FC-1002" [1]=> int(100)
}
}
Abonadas:
array(1) {
[0]=> array(2) {
[0]=> string(7) "FC-1003" [1]=> int(225)//ABONADO 225
}
}
Pendientes:
array(2) {
[0]=> array(2) {
[0]=> string(7) "FC-1003" [1]=> int(25)//RESTA 25
}
[1]=> array(2) {
[0]=> string(7) "FC-1004" [1]=> int(100)
}
}
Monto Restante:
0
Como Ves en el arreglo de abonadas, aparece la factura FC-1003 con un abono de 225 y luego dicha factura aparece en el array de pendientes con un restante de 25.
Es solo una idea de lo que hago, pero con consultas a la base de datos, no es muy complejo de hacer.
NOTA IMPORTANTE: No edites tu tabla principal de facturas salvo para indicar si fué pagada o no, para ello crea las tablas en consecuencia para tal fin, como lo son Cuentas por Cobrar, Cuentas por pagar con sus respectivas sub tablas de detalles para futuros informes. Votos: 2 - Link respuesta -
Fecha: 02-10-2018 13:38:14 Gracias Carlos!, de hecho ya lo solucioné.
Sólo tenía que sacar del loop la variable:
$percibido = $_POST['abono'];
Pero tu solución también es muy buena, de hecho probaré en otro código tu solución.
Saludos. Votos: 0 - Link respuesta
Para participar activamente de la comunidad primero debes autenticarte, ingresa al sistema.Iniciar Sesión
