@}&"y|Hcrlw[(KLR?ǩSPnܯ=oE*=;7v%dqdWTեż+	"uDՔݲx<r7:)ƍCpx6SE~C.sb1"s]'*ѫ↺2ᰬe<It@¶J$6^51ͭE<dw:sEwcX9z H5x߶&Ib70cILadEh+_.yrNeyC7]ݢtDɦd5b&N.}	!NNp  Sܿ"\1~I$m5/fg275khINA8p1Od4'I=epg'l[OԆR_.d͊↊|@pC\ڀrz1@R㥒:q;-xI?ztkˌ16O)̣I+*P*qf2Iet%xxS?)O }=xcy.lH&<W1Umms`6i'IuҙF~oP@a<Y	8}GKa@|~(&I 4fSVփ03fSVփ03fSVփ03+XK<+/R8N[bQ䕮L2X-iҕìpfSVփ03fSVփ03fSVփ03bYbSX?^0<~vH+&H>jxh~=
9KyNGzYߺZefKè+m
yXw}N[ZIyM<׻zT3Nᾣ1#ɎzJ1eŌ̧՘rpP(Cd;,G/XjlmBh)odNvqtup3Nᾣ1#Ɏz"r=KQp'd۴0C~n3Nᾣ1#ɎzX6ƺeY;Zғ敥]hD]	McW?K !7O@)|;K,e]ݩ$Ma4푨$S-v3Nᾣ1#Ɏz\YnM;И┒$)Rb%;}r)T#yqjn10}[3^{y3;$Mu䀆cDx7})hV dvC208Te:>Ǩzkd`)O("arWeIĮ͚YNYGH0gw9 .5ƒ2p yX֙-Udߵ/axRg.BӐUhFnb&14{R]f+V&$?oը_6Tw-,Un2GV/;N&s=8#w aa"ۇn O[Is\zb?݁qZw9"mu6fKhsd'r	{V@95T#:vl8qz MLnV{
+v,p)=&+Y3Q!*Y.?߀cDx7})hV dvC208Te:>Ǩzkd=Yx[mG-#ǩ{ *XB.U|qyTBvg~.D4m殒ɻd>XU[4FtWW!fSVփ03fSVփ03Z>Y.9wph$?g髭b 2VNq	ϼҕìpfSVփ03fSVփ03fSVփ03g'u Nu,=z.s+:ރa`c-eMV(0r`$ H3wyTD!*H=jK~r]pyu\cb6p}d^!_P%ixe4s[$܈,-Y)ޒ0;i6b+wS0/Ne-ԳoE1$JMg&Os܋(e{ޤ<[#.h8]F Ӷ.T35A_EV\+$.Z?Rov]<<G(|WW`L4\v`HEsGݤGdt lT9Wɷ$c=ꏳlD'>,3qh+_,vӚsDE9J:)]B
F_/($1bVNnlp#W 5"wb=30 [	r2W&zeq|۹\,8KH)᧠Xɏ;~?qvڅq%͍'o.E-þݷj-\E, eeT!FWH%:
fkDo@GJ0Zfr*} Qgp:Ӂu4O}S8 >?h.!p bvsdcuvw8ƝC]Yԯ٤qvb!J4}Ρk63=U+AbYqtv?AMw,:q}xpgZ3J@hдfO%qJ8`"y$&5$ʷK<icZvu́ɱ$KvQe'sS9
qY]
ĤGvY$Bߢf1]CߤgqOv5L_)L殒ɻd>XU[4FtWW!fSVփ03fSVփ03Z>Y.9wph$?7їӞ`(>5wQtFb[nӳBetRJXHfSVփ03fSVփ03fSVփ03<^.e1x?{#5/~7^Tڞӌ)1,hUP ?.Ӧ91IS8!%c
gc7>5z~c_>	B8v{!'9AyaEOc+&\ >c/oN< 0g.BӐUhFO?= Jr-8֤$gT御>!!JSt^%`#6 J%MP.bx_hthWXx+*HHO
6I-zF#Hzq{M՝v
+dN;dҊmN
MXϸևtq䲠 )ff 
6I-zF#Hzz_/z}Z>R!c殒ɻd>XU[4FtWW!fSVփ03fSVփ03Z>Y.9wph$?\N#7S9
>my0k#G "	 aQ깕MāҕìpfSVփ03fSVփ03fSVփ03x	>$b֓73s7!*d_|2/ۛTqؾ#s"
__%zz_8bpJf{F0rCN
HS1/B#Uj!MB7a"QB:\3kl|xԓ\	qo6K#ve8 z^qۓȝ͎b'k3Og83\P2Ā:X<DN٣Intidad    = (float)$det['cantidad'];
        $costo_unit  = (float)$det['costo'];   // Costo con ITBIS incluido
        $total_linea = (float)$det['total_costo'];
        $tipo_imp    = (float)$det['tipo_impuesto'];
        $total_imp   = (float)$det['total_impuesto'];
        
        // E41 (Compras informales): TaxTypes siempre 3 (Exento)
        // El proveedor informal no desglosa ITBIS, así que el monto 
        // del item debe ser el total completo (con ITBIS incluido).
        $tax_type = 3;
        
        // Retenciones: para compras informales el emisor es agente de retención
        $itbis_ret = 0;
        $isr_ret = 0;
        if ($total_imp > 0) {
            $monto_sin_itbis = $total_linea - $total_imp;
            $itbis_ret = round($total_imp, 2);    // Retención 100% del ITBIS
            $isr_ret = round($monto_sin_itbis * 0.27, 2); // ISR 27% sobre monto gravado
            $total_monto_gravado += $monto_sin_itbis;
            $total_itbis += $total_imp;
        }
        
        $item = array(
            'lineNumber'       => $linea,
            'retentionAgentInd' => 1,  // Indicador agente de retención
            'itbisRetAmount'   => $itbis_ret,
            'isrRetAmount'     => $isr_ret,
            'itemDescription'  => mb_substr($det['descripcion'], 0, 80),
            'serviceInd'       => '1',  // 1=Bien
            'itemQuantity'     => round($cantidad, 2),
            'unitMeasure'      => '43', // Unidad
            'unitPrice'        => round($costo_unit, 2),
            'itemAmount'       => round($total_linea, 2),
            'TaxTypes'         => $tax_type
        );
        
        $items[] = $item;
        $linea++;
    }
    
    if (empty($items)) {
        return array('ok' => false, 'json' => '', 'error' => "Compra #$id_compra no tiene items de detalle");
    }
    
    // ============================================================
    // 5. Forma de pago
    // ============================================================
    $payments = array();
    $termino = $compra['termino'];
    $total = (float)$compra['total'];
    
    $codigo_pago = isset($ECF_FORMAS_PAGO[$termino]) ? $ECF_FORMAS_PAGO[$termino] : 1;
    $payments[] = array(
        'type'   => $codigo_pago,
        'amount' => round($total, 2)
    );
    
    // ============================================================
    // 6. Datos del comprador (nuestra empresa = el comprador)
    // ============================================================
    $rnc_emisor = ECF_RNC_EMISOR;
    
    // RNC del proveedor (para compras informales puede ser cédula 11 dígitos)
    $rnc_proveedor = preg_replace('/[^0-9]/', '', $compra['rnc_proveedor']);
    
    // Para E41 el RNC/Cédula del proveedor es OBLIGATORIO
    if ($tipo_ecf == '41' && (empty($rnc_proveedor) || (strlen($rnc_proveedor) != 9 && strlen($rnc_proveedor) != 11))) {
        return array('ok' => false, 'json' => '', 'error' => "El proveedor '" . $compra['proveedor'] . "' no tiene RNC/Cédula válido (9 o 11 dígitos). Es obligatorio para Compras (e-CF 41).");
    }
    
    // ============================================================
    // 7. Construir estructura JSON formato GAE Digital - E41
    // ============================================================
    $ecf = array(
        'InvoiceNumber'      => (int)$compra['id_venta'],
        'ecf'                => $encf,
        'ecfType'            => $tipo_ecf,
        'sellerRnc'          => $rnc_emisor,
        'sellerCode'         => ECF_SELLER_CODE,
        'sequenceExpDate'    => !empty($fecha_vence_secuencia) ? $fecha_vence_secuencia : null,
        'taxedAmountInd'     => 0,
        'paymentCondition'   => (strpos($termino, 'Credito') !== false) ? '2' : '1',
        'paymentDeadline'    => $compra['fecha'],
        'issueDate'          => $compra['fecha'],
        'buyerRnc'           => $rnc_proveedor,
        'buyerBusinessName'  => $compra['proveedor'],
        'currencyType'       => 'DOP',
        'exchangeRate'       => 1.00,
        'InvoiceTotalAmount' => round($total, 2),
        'TotalTaxedAmount'   => round($total_itbis, 2),
        'items'              => $items,
        'payments'           => $payments
    );
    
    // Agregar dirección del proveedor si existe
    $dir_prov = trim($compra['direccion_proveedor']);
    if (!empty($dir_prov) && strlen($dir_prov) > 2) {
        $ecf['buyerAddress'] = $dir_prov;
    }
    
    // Si no tiene RNC válido y NO es E41, quitar el campo
    if ($tipo_ecf != '41' && (empty($rnc_proveedor) || (strlen($rnc_proveedor) != 9 && strlen($rnc_proveedor) != 11))) {
        unset($ecf['buyerRnc']);
    }
    
    // Quitar sequenceExpDate si es null
    if ($ecf['sequenceExpDate'] === null) {
        unset($ecf['sequenceExpDate']);
    }
    
    // Fecha vencimiento para crédito
    if (strpos($termino, 'Credito') !== false && !empty($compra['vence']) && $compra['vence'] != '0000-00-00') {
        $ecf['paymentDeadline'] = $compra['vence'];
    }
    
    $json = json_encode($ecf, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
    
    if ($json === false) {
        return array('ok' => false, 'json' => '', 'error' => 'Error codificando JSON: ' . json_last_error_msg());
    }
    
    return array('ok' => true, 'json' => $json, 'error' => '');
}
?>
