<?php
session_start();
$host = 'localhost';
$database = 'C:\Program Files (x86)\Common Files\Aspel\Sistemas Aspel\SAE7.00\Empresa01\Datos\SAE70EMPRE01.fdb';
$username = 'SYSDBA';
$password = 'masterkey';
setlocale(LC_MONETARY, 'es_MX');

if ($_SERVER["REQUEST_METHOD"] == "POST") {
    try {
        $dbh = new PDO("firebird:host=$host;dbname=$database;charset=UTF8", $username, $password);
        $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

        $folioCompleto = $_POST['cveDoc'];
        $serie = preg_replace('/\d+/', '', $folioCompleto);
        $numero = (int)filter_var($folioCompleto, FILTER_SANITIZE_NUMBER_INT);
        $cveDoc = $_POST['cveDoc'];

        $sql_update = "UPDATE FOLIOSF01 SET ULT_DOC = :new_number, FECH_ULT_DOC = CURRENT_DATE WHERE TIP_DOC = 'F' AND SERIE = :serie";
        $stmt_update = $dbh->prepare($sql_update);
        $stmt_update->execute([':new_number' => $numero, ':serie' => $serie]);

        $cliente = $_POST['cliente'];
        $esquema2 = $_POST['esquema2'] ?? '';
        $tipomoneda = $_POST['moneda'];
        $numpagos = $_POST['pago_de'];

        $fechaElaboracion = DateTime::createFromFormat('U.u', microtime(true))->format('Y-m-d H:i:s.v');
        $fechaPag = $_POST['fechapag'] ?? null;

        $observacion = $_POST['obs_gen'];
        $stmtObs = $dbh->query("SELECT MAX(CVE_OBS) AS LAST_OBS FROM OBS_DOCF01");
        $lastObs = $stmtObs->fetch(PDO::FETCH_ASSOC)['LAST_OBS'] ?? 0;
        $newObs = $lastObs + 1;
        $sqlObs = "INSERT INTO OBS_DOCF01 (CVE_OBS, STR_OBS) VALUES (:cve_obs, :str_obs)";
        $stmtObsInsert = $dbh->prepare($sqlObs);
        $cveObs = 0;
        if (!empty($_POST['obs_gen'])) {
            $stmtObsInsert->execute([
                ':cve_obs' => $newObs,
                ':str_obs' => $_POST['obs_gen']
            ]);
            $cveObs = $newObs;
            $newObs++;
        }

        $canTot = array_sum(array_column($_POST['productos'], 'subtotal_partida'));

        $stmtEnvio = $dbh->query("SELECT MAX(DAT_ENVIO) AS last_envio FROM FACTF01");
        $lastEnvio = $stmtEnvio->fetch(PDO::FETCH_ASSOC)['last_envio'];
        $newEnvio = ($lastEnvio !== null) ? $lastEnvio + 1 : 1;

        $stmtFol = $dbh->query("SELECT FOLIO FROM FACTF01");
        $folios = $stmtFol->fetchAll(PDO::FETCH_COLUMN);
        $numeric_folios = array_filter(array_map(fn($f) => preg_replace('/[^0-9]/', '', $f), $folios), 'is_numeric');
        $new_folio = !empty($numeric_folios) ? max($numeric_folios) + 1 : 1;

        $query_campos_libres = "SELECT CAMPO FROM PARAM_CAMPOSLIBRES01 WHERE IDTABLA = 'FACTF_CLIB'";
        $stmt_campos = $dbh->prepare($query_campos_libres);
        $stmt_campos->execute();
        $campos_libres = [];
        while ($row = $stmt_campos->fetch(PDO::FETCH_ASSOC)) {
            $campo = $row['CAMPO'];
            $campos_libres[$campo] = $_POST['campo_libre_' . htmlspecialchars($campo)] ?? null;
        }
        // Obtener NUMCTAPAGO del cliente
        $sqlCuenta = "SELECT NUMCTAPAGO FROM CLIE01 WHERE CLAVE = :cliente";
        $stmtCuenta = $dbh->prepare($sqlCuenta);
        $stmtCuenta->execute([':cliente' => $_POST['cliente']]);
        $cuenta = $stmtCuenta->fetch(PDO::FETCH_ASSOC);
        $numCtaPago = $cuenta ? $cuenta['NUMCTAPAGO'] : null;


        $sql = "INSERT INTO FACTF01 (TIP_DOC, CVE_DOC, ENLAZADO, TIP_DOC_E, FECHA_DOC, FECHA_ENT, FECHA_VEN, CVE_PEDI,
            CVE_CLPV, RFC, CVE_VEND, CONDICION, DES_TOT, NUM_ALMA, NUM_MONED, TIPCAMB,
            CAN_TOT, IMP_TOT1, IMP_TOT2, IMP_TOT3, IMP_TOT4, STATUS, FOLIO, DES_FIN, ACT_COI, ACT_CXC,
            DES_TOT_PORC, SERIE, CVE_OBS, FECHAELAB, CTLPOL, DAT_MOSTR, COM_TOT, ESCFD, AUTORIZA,
            DAT_ENVIO, METODODEPAGO, NUM_PAGOS, IMPORTE, PRIMERPAGO, NUMCTAPAGO, USO_CFDI, DES_FIN_PORC)
             VALUES (
            'F', :cveDoc, 'O', 'V', :fechaDoc, :fechaEnt, :fecha_ultimopago, :supedido, :cliente, :rfc, :vendedor, :condicion,
            :descuentofinal, :almacen, :moneda, :tcambio, :canTot, :impTot1, :impTot2, :impTot3, :impTot4, 'O',
            :folio, '0', 'N', 'S', :descuento, :serie, :cveObs, :fechaElaboracion, '0', '0', :comTot, 'S', '0',
            :datenvio, :metodo_pago, :pago_de, :total, :ultimo_pago, :numCtaPago, 'P01', '0' 
            )";


        $stmt = $dbh->prepare($sql);
        $stmt->execute([
            ':cveDoc' => $cveDoc,
            ':fechaDoc' => $_POST['fechaDoc'],
            ':fechaEnt' => $_POST['fechaEnt'],
            ':fecha_ultimopago' => $_POST['fecha_ultimopago'],
            ':supedido' => $_POST['supedido'],
            ':cliente' => $_POST['cliente'],
            ':rfc' => $_POST['rfc'],
            ':vendedor' => $_POST['vendedor'],
            ':condicion' => $_POST['condicion'],
            ':descuentofinal' => $_POST['descuentofinal'],
            ':almacen' => $_POST['almacen'],
            ':moneda' => $_POST['moneda'],
            ':tcambio' => $_POST['tcambio'],
            ':canTot' => $canTot,
            ':impTot1' => $_POST['impTot1'],
            ':impTot2' => $_POST['impTot2'],
            ':impTot3' => $_POST['impTot3'],
            ':impTot4' => $_POST['impTot4'],
            ':folio' => $new_folio,
            ':descuento' => $_POST['descuento'],
            ':serie' => $serie,
            ':cveObs' => $cveObs,
            ':fechaElaboracion' => $_POST['fechaDoc'],
            ':comTot' => $_POST['comTot'],
            ':metodo_pago' => $_POST['metodo_pago'],
            ':pago_de' => $_POST['pago_de'],
            ':total' => $_POST['total'],
            ':ultimo_pago' => $_POST['ultimo_pago'],
            ':numCtaPago' => $numCtaPago,
            ':datenvio' => $newEnvio
        ]);

        // 1. Obtener saldo actual
        $sqlSaldo = "SELECT SALDO FROM CLIE01 WHERE CLAVE = :cliente";
        $stmtSaldo = $dbh->prepare($sqlSaldo);
        $stmtSaldo->execute([':cliente' => $_POST['cliente']]);
        $saldoActual = $stmtSaldo->fetchColumn();

        if ($saldoActual === false) {
            // No se encontró el cliente, manejar error
            die("Cliente no encontrado");
        }

        // 2. Validar que 'total' sea numérico
        if (!is_numeric($_POST['total'])) {
            die("Total inválido");
        }

        $saldoNuevo = $saldoActual - floatval($_POST['total']);

        // Opcional: que el saldo no sea negativo
        if ($saldoNuevo < 0) {
            $saldoNuevo = 0;
        }

        // 3. Actualizar con saldo nuevo
        $updateSql = "UPDATE CLIE01 
    SET 
        METODODEPAGO = :metodopago,
        ULT_VENTAD = :ultVentd,
        ULT_COMPM = :ultCompm,
        FCH_ULTCOM = :fchUltcom,
        SALDO = :saldo
    WHERE CLAVE = :cliente";

        $updateStmt = $dbh->prepare($updateSql);
        $updateStmt->execute([
            ':metodopago' => $_POST['metodo_pago'],
            ':ultVentd' => $cveDoc,
            ':ultCompm' => $_POST['total'],
            ':fchUltcom' => $_POST['fechapag'],
            ':saldo' => $saldoNuevo,
            ':cliente' => $_POST['cliente']
        ]);


        if (!empty($campos_libres)) {
            $campos_nombres = implode(", ", array_keys($campos_libres));
            $campos_placeholders = implode(", ", array_map(fn($c) => ":$c", array_keys($campos_libres)));

            $sql_clib = "INSERT INTO FACTF_CLIB01 (CLAVE_DOC, $campos_nombres) VALUES (:clave, $campos_placeholders)";
            $stmt_clib = $dbh->prepare($sql_clib);
            $stmt_clib->bindValue(':clave', $cveDoc);
            foreach ($campos_libres as $campo => $valor) {
                $stmt_clib->bindValue(":$campo", $valor);
            }
            $stmt_clib->execute();
        } else {
            $sql_clib = "INSERT INTO FACTF_CLIB01 (CLAVE_DOC) VALUES (:clave)";
            $stmt_clib = $dbh->prepare($sql_clib);
            $stmt_clib->bindValue(':clave', $cveDoc);
            $stmt_clib->execute();
        }
        // tipo de moneda en FACTF01
        $sqlMoneda = "SELECT NUM_MONED FROM FACTF01 WHERE CVE_DOC = :cveDoc";
        $stmtMoneda = $dbh->prepare($sqlMoneda);
        $stmtMoneda->bindParam(':cveDoc', $cveDoc);
        $stmtMoneda->execute();
        $moneda = $stmtMoneda->fetch(PDO::FETCH_ASSOC)['NUM_MONED'] ?? null;


        // Tipo de Almacen en FACTF01
        $sqlInv = "SELECT NUM_ALMA FROM FACTF01 WHERE CVE_DOC = :cveDoc";
        $stmtInv = $dbh->prepare($sqlInv);
        $stmtInv->bindParam(':cveDoc', $cveDoc);
        $stmtInv->execute();
        $Inv = $stmtInv->fetch(PDO::FETCH_ASSOC)['NUM_ALMA'] ?? null;

        //  Por cada partida 
        $stmtObs = $dbh->query("SELECT MAX(CVE_OBS) AS LAST_OBS FROM OBS_DOCF01");
        $lastObs = $stmtObs->fetch(PDO::FETCH_ASSOC)['LAST_OBS'] ?? 0;
        $newObs = $lastObs + 1;
        $sqlObs = "INSERT INTO OBS_DOCF01 (CVE_OBS, STR_OBS) VALUES (:cve_obs, :str_obs)";
        $stmtObsInsert = $dbh->prepare($sqlObs);
        foreach ($_POST['productos'] as $index => $producto) {
            $numPar = $index + 1;
            $cveObs = 0;

            if (!empty($producto['observaciones'])) {
                // Insertar la observación y obtener el nuevo CVE_OBS
                $stmtObsInsert->execute([
                    ':cve_obs' => $newObs,
                    ':str_obs' => $producto['observaciones']

                ]);

                $cveObs = $newObs; // Asignar el nuevo consecutivo
                $newObs++; // Incrementar para la siguiente observación
            }
        }
        // Verificación de productos
        $productos = $_POST['productos'] ?? [];
        if (!is_array($productos) || empty($productos)) {
            die('Error: $productos está vacío o no es un array.');
        }

        // Validación de campos obligatorios
        if (!isset($_POST['almacen'], $_POST['esquema2'], $_POST['tcambio'])) {
            die("Error: faltan datos para almacenar, esquema o tipo de cambio.");
        }

        $almacen = $_POST['almacen'];
        $esquema2 = $_POST['esquema2'];
        $esquema2 = $_POST['esquema2'];

        // Inicializar totales para la actualización final de FACTF01
        $totalImpuesto1 = 0;
        $totalImpuesto2 = 0;
        $totalImpuesto3 = 0;
        $totalImpuesto4 = 0;
        $totalDescuento = 0;

        // Preparar consulta para inserción en PAR_FACTF01
        $sql2 = "INSERT INTO PAR_FACTF01 (
    CVE_DOC, NUM_PAR, CANT, PXS, CVE_ART, UNI_VENTA, PREC, TOT_PARTIDA, 
    IMPU1, IMPU2, IMPU3, IMPU4, CVE_ESQ, NUM_ALM, CVE_OBS,
    IMP1APLA, IMP2APLA, IMP3APLA, IMP4APLA, TOTIMP1, TOTIMP2, TOTIMP3, TOTIMP4, TIP_CAM, ACT_INV, DESC1, DESC2, DESC3, APAR, COMI, POLIT_APLI, TIPO_ELEM,
    IMPRIMIR, MAN_IEPS, APL_MAN_IMP, CUOTA_IEPS, APL_MAN_IEPS, MTO_PORC, MTO_CUOTA
) VALUES (
    :cveDoc, :numPar, :cantidad, :pxs, :cveArt, :unidad, :costoUnidad, :subtotal, 
    :ieps, :ret_isr, :ret_iva, :iva, :esquema2, :almacen, :cveObs,
    :imp1Apla, :imp2Apla, :imp3Apla, :imp4Apla, :totImp1, :totImp2, :totImp3, :totImp4,
    :tcambio, 'S', '0', '0', '0', '0', '0', '1', 'N', 'S', 'N', '1', '0', 'C', '0', '0'
)";
        $stmt2 = $dbh->prepare($sql2);

        foreach ($_POST['productos'] as $index => $producto) {
            $numPar = $index + 1;
            $paramCantidad = $producto['cantidad'];

            $porcentajeIeps = $producto['ieps'] / 100;
            $porcentajeRetIsr = $producto['ret_isr'] / 100;
            $porcentajeRetIva = $producto['ret_iva'] / 100;
            $porcentajeIva = $producto['iva'] / 100;
            $porcentajeDescuento = $producto['descuento'] / 100;
            $porcentajeDescuentoFin = $descuentofinal / 100;

            // 1. Subtotal sin descuentos
            $subtotalSinDescuentos = $producto['subtotal_partida'];

            // 2. Descuento normal
            $descuentoCalculado = $subtotalSinDescuentos * $porcentajeDescuento;
            $subtotalConDescuento = $subtotalSinDescuentos - $descuentoCalculado;

            // 3. Descuento financiero sobre subtotal con descuento
            $descuentoFinancieroCalculado = $subtotalConDescuento * $porcentajeDescuentoFin;
            $subtotalFinalAntesImpuestos = $subtotalConDescuento - $descuentoFinancieroCalculado;

            // COST_DEV = subtotal con descuento normal
            $cost_dev = $subtotalConDescuento;

            // 4. Impuestos aplicados al final
            $totImp1 = $subtotalFinalAntesImpuestos * $porcentajeIeps;
            $totImp2 = $subtotalFinalAntesImpuestos * $porcentajeRetIsr;
            $totImp3 = $subtotalFinalAntesImpuestos * $porcentajeRetIva;
            $totImp4 = $subtotalFinalAntesImpuestos * $porcentajeIva;

            // 5. Total final de la partida
            $totalPartidaFinal = $subtotalFinalAntesImpuestos + $totImp1 + $totImp2 + $totImp3 + $totImp4;

            // 6. Acumuladores
            $totalImpuesto1 += $totImp1;
            $totalImpuesto2 += $totImp2;
            $totalImpuesto3 += $totImp3;
            $totalImpuesto4 += $totImp4;
            $totalDescuento += $descuentoCalculado;
            $totalDescuentoFinanciero += $descuentoFinancieroCalculado;
            $totalimporte += $totalPartidaFinal;

            // Verifica existencia de datos obligatorios
            if (!isset(
                $producto['cantidad'],
                $producto['producto'],
                $producto['unidad'],
                $producto['costo_unidad'],
                $producto['subtotal_partida'],
                $producto['ieps'],
                $producto['ret_isr'],
                $producto['ret_iva'],
                $producto['iva'],
                $producto['descuento']
            )) {
                echo "Faltan datos en la línea: " . json_encode($producto);
                continue;
            }

            // Insertar observación si existe
            $cveObs = 0;
            if (!empty($producto['observaciones'])) {
                $stmtObsInsert = $dbh->prepare("INSERT INTO OBS_DOCF01 (CVE_OBS, STR_OBS) VALUES (:cve_obs, :str_obs)");
                $stmtObsInsert->execute([
                    ':cve_obs' => $newObs,
                    ':str_obs' => $producto['observaciones']
                ]);
                $cveObs = $newObs;
                $newObs++;
            }

            // Cálculo de impuestos
            $porcentajedescuento = $producto['descuento'] / 100;
            $subtotalConDescuento = $producto['subtotal_partida'] * (1 - $porcentajedescuento);

            $totImp1 = $subtotalConDescuento * ($producto['ieps'] / 100);
            $totImp2 = $subtotalConDescuento * ($producto['ret_isr'] / 100);
            $totImp3 = $subtotalConDescuento * ($producto['ret_iva'] / 100);
            $totImp4 = $subtotalConDescuento * ($producto['iva'] / 100);

            try {
                $stmt2->execute([
                    ':cveDoc' => $cveDoc,
                    ':numPar' => $numPar,
                    ':cantidad' => $producto['cantidad'],
                    ':pxs' => $producto['cantidad'],
                    ':cveArt' => $producto['producto'],
                    ':unidad' => $producto['unidad'],
                    ':costoUnidad' => $producto['costo_unidad'],
                    ':subtotal' => $producto['subtotal_partida'],
                    ':ieps' => $producto['ieps'],
                    ':ret_isr' => $producto['ret_isr'],
                    ':ret_iva' => $producto['ret_iva'],
                    ':iva' => $producto['iva'],
                    ':almacen' => $almacen,
                    ':cveObs' => $cveObs,
                    ':esquema2' => $esquema2,
                    ':imp1Apla' => $imp1Apla,
                    ':imp2Apla' => $imp2Apla,
                    ':imp3Apla' => $imp3Apla,
                    ':imp4Apla' => $imp4Apla,
                    ':totImp1' => $totImp1,
                    ':totImp2' => $totImp2,
                    ':totImp3' => $totImp3,
                    ':totImp4' => $totImp4,
                    ':tcambio' => $_POST['tcambio'],

                ]);

                // Inserción de campos libres
                $valores_campos = [];
                foreach ($campos_disponibles as $campo) {
                    $key_post = 'campo_libre_' . $campo . '_' . $index;
                    $valores_campos[$campo] = $_POST[$key_post] ?? null;
                }

                if (!empty($valores_campos)) {
                    $campos_nombres = implode(", ", array_keys($valores_campos));
                    $campos_placeholders = implode(", ", array_map(fn($c) => ':' . $c, array_keys($valores_campos)));

                    $sql_clib = "INSERT INTO PAR_FACTF_CLIB01 (CLAVE_DOC, NUM_PART, $campos_nombres) 
                         VALUES (:clave, :num_part, $campos_placeholders)";
                    $stmt_clib = $dbh->prepare($sql_clib);
                    $stmt_clib->bindValue(':clave', $cveDoc);
                    $stmt_clib->bindValue(':num_part', $numPar);

                    foreach ($valores_campos as $campo => $valor) {
                        $stmt_clib->bindValue(":$campo", $valor);
                    }

                    $stmt_clib->execute();
                } else {
                    $sql_simple = "INSERT INTO PAR_FACTF_CLIB01 (CLAVE_DOC, NUM_PART) VALUES (:clave, :num_part)";
                    $stmt_simple = $dbh->prepare($sql_simple);
                    $stmt_simple->bindValue(':clave', $cveDoc);
                    $stmt_simple->bindValue(':num_part', $numPar);
                    $stmt_simple->execute();
                }
            } catch (PDOException $e) {
                echo "Error al insertar producto: " . $e->getMessage();
            }
        }

        // Actualizar existencias en INVE01
        $sqlUpdateExistencias = "UPDATE INVE01 SET 
            EXIST = COALESCE(EXIST, 0) - :cantidad, 
            FCH_ULTCOM = :fechaUltCompra 
            WHERE CVE_ART = :cveArt";
        $stmtUpdateExistencias = $dbh->prepare($sqlUpdateExistencias);
        $stmtUpdateExistencias->execute([
            ':cantidad' => $producto['cantidad'],
            ':fechaUltCompra' => date('Y-m-d'),
            ':cveArt' => $producto['producto']
        ]);

        /*  Actualizar la columna IMPORTE en FACTF01 */
        $sqlUpdate = "UPDATE FACTF01 SET 
    IMP_TOT1 = :totalImpuesto1,
    IMP_TOT2 = :totalImpuesto2,
    IMP_TOT3 = :totalImpuesto3,
    IMP_TOT4 = :totalImpuesto4,
    DES_TOT = :totalDescuento
    WHERE CVE_DOC = :cveDoc";
        $stmtUpdate = $dbh->prepare($sqlUpdate);
        $stmtUpdate->bindParam(':totalImpuesto1', $totalImpuesto1);
        $stmtUpdate->bindParam(':totalImpuesto2', $totalImpuesto2);
        $stmtUpdate->bindParam(':totalImpuesto3', $totalImpuesto3);
        $stmtUpdate->bindParam(':totalImpuesto4', $totalImpuesto4);
        $stmtUpdate->bindParam(':totalDescuento', $totalDescuento);
        $stmtUpdate->bindParam(':cveDoc', $cveDoc);
        $stmtUpdate->execute();

        /** ← Agregado aquí tu código de pagos sin modificar **/

        if (!isset($_POST['pagos']) || !is_array($_POST['pagos']) || empty($_POST['pagos'])) {
            $fecha_venc = $_POST['fechaplazo'] ?? date('Y-m-d');
            $monto_total = $totalPartidaFinal ?? 0;

            $_POST['pagos'] = [[
                'fecha' => $fecha_venc,
                'monto' => $monto_total
            ]];
        }

        $sqlPAGA = "INSERT INTO CUEN_M01 (
    CVE_CLIE, REFER, NUM_CARGO, NUM_CPTO, CVE_OBS,
    DOCTO, IMPORTE, FECHA_APLI, FECHA_VENC,
    NUM_MONED, TCAMBIO, IMPMON_EXT, SIGNO,
    FECHAELAB, TIPO_MOV, USUARIO, STATUS
) VALUES (
    :cliente, :refer, :num_cargo, :num_cpto, :cveobspa,
    :docto, :importe, :fecha_apli, :fecha_venc,
    :num_mone, :tipocambio, :impmon_ext, 1,
    :fechalab, 'C', 0, 'A'
)";
        $stmtPAGA = $dbh->prepare($sqlPAGA);

        $sqlpagadet = "INSERT INTO CUEN_DET01 (
    CVE_CLIE, REFER, NUM_CPTO, NUM_CARGO, ID_MOV, CVE_OBS,
    DOCTO, IMPORTE, FECHA_APLI, FECHA_VENC, NUM_MONED, TCAMBIO,
    IMPMON_EXT, FECHAELAB, CTLPOL, TIPO_MOV, SIGNO, CVE_AUT,
    USUARIO, NO_PARTIDA
) VALUES (
    :cliente, :refer, :num_cpto, :num_cargo, 1, :cveobsdet,
    :docto, :importe, :fecha_apli, :fecha_venc, :num_moneda, :tcambio,
    :impmon_exte, :fechalabora, 0, 'A', -1, 0,
    0, :no_partida
)";
        $stmtpagadet = $dbh->prepare($sqlpagadet);

        $num_cargo = 1;
        $fecha_aplicacion_fija = $_POST['fechaplazo'];
        $fechalabora = date('Y-m-d H:i:s.v');
        $insertarEnDet = count($_POST['pagos']) === 1;

        foreach ($_POST['pagos'] as $index => $pago) {
            $fecha = $pago['fecha'];
            $monto = $pago['monto'];
            $num_cpto = $_POST['concepto'][$index] ?? 0;
            $docto = $_POST['documento_ref'][$index] ?? '';

            // Insertar siempre en CUEN_M01
            $stmtPAGA->execute([
                ':cliente' => $cliente,
                ':refer' => $cveDoc,
                ':num_cargo' => $num_cargo,
                ':num_cpto' => $num_cpto,
                ':cveobspa' => $cveObs,
                ':docto' => $cveDoc,
                ':importe' => $monto,
                ':fecha_apli' => $fecha_aplicacion_fija,
                ':fecha_venc' => $fecha,
                ':num_mone' => $tipomoneda,
                ':tipocambio' => $moneda,
                ':impmon_ext' => $monto,
                ':fechalab' => $fechalabora
            ]);

            // Insertar en CUEN_DET01 solo si hay un solo plazo
            if ($insertarEnDet) {
                $stmtpagadet->execute([
                    ':cliente' => $cliente,
                    ':refer' => $cveDoc,
                    ':num_cpto' => $num_cpto,
                    ':num_cargo' => $num_cargo,
                    ':cveobsdet' => $cveObs,
                    ':docto' => $docto,
                    ':importe' => $monto,
                    ':fecha_apli' => $fecha_aplicacion_fija,
                    ':fecha_venc' => $fecha,
                    ':num_moneda' => $tipomoneda,
                    ':tcambio' => $moneda,
                    ':impmon_exte' => $monto,
                    ':fechalabora' => $fechalabora,
                    ':no_partida' => $num_cpto
                ]);
            }

            $num_cargo++;
        }
        if ($stmt2->rowCount() > 0) {
            echo json_encode([
                'success' => true,
                'message' => 'Registro hecho correctamente.',
                'new_cve_doc' => $cveDoc
            ]);
        } else {
            echo json_encode([
                'success' => false,
                'message' => 'No se pudo registrar el documento.'
            ]);
        }
    } catch (PDOException $e) {
        // No enviar datos si hay un error
        echo json_encode([
            'success' => false,
            'message' => 'Error al insertar el registro: ' . $e->getMessage()
        ]);
        exit; // Asegurarse de que no se envíen más datos

    }
}
