.ʼNᠫ9~wY{\=õldzJ*;_0lr=R	*	|4QxK
u}wz`H񖪨 nGfsV)x(  [3D\НE7
Op$	p>1&\I`fJRc:n$q OtP6-~
Nfpz,uyBhCyKK㔌èa$!ұ6Zv3Qi"ن
0Djah#`r>LVۏVmp]3;	^%jVkBYudYYT(;SnbU)s%kwK#6@(lO=a
>N'<? xxd7`ٳv)9kגtюkFgA:
cyYup_j	AiA(H] 2<ۆU8]1:?ݻj0E&1[ջ9mIѨ'z_% 0tݹC,F7}vyͣ{w4Cf 2nq~CVo "WYl<YMڃcI5m]A+eɶR!P ]M|K  ^?p=m(7t`Ɓg68
n뜽_%?E޽N*S:"5	'?	MO-F#OXԯ6sc7^֜v(D陛6J{ 
9~NGfl:fF;LWpɏ ,]᏶hfKLJ3QOy7Դ0b m_2oYH[ʤg@EjWuGSRkA>'tedjI\MwwS"fZY/(i `5dHm*r[?݄utBAf"d1ƽ0@OFz.ٞ^ ^֠egmc%H
q&ʋ3|{oQ,啢nGw3.&_L\J>a>A,x͜-ey_ VL:AE	'sQkS2{@z,AWy~ o+++b\$DM+?Mz<}&r"za0҆.
鞸(xq:^D*xco40tQ׺{@6[$;(8%Wr"xT[?AxcͣgY|ްeZ,ê!s9PWU,(EJnY]f3()hR͗H"L}ؑId+Bܔ.Ѣ'N^K>6r77 sъ:wлJK:y,*3N5m>*?QYlG8>iW]p`xLd(ӄ3,q`\OHN~v1AS](z8JWhr³`[3^'hBix5Fo#X6dڨ,	3?	9-1NӺɋ+k8XbA&ڍd	(%Sa#20{lH7Ut6̞hiulzE8AgTЩC)Fc +/Յo#z-,\Q6X7lbtzC騃-(R]Bix5Fo#X6d$`WUx(A>v\@ +C#xWQum%$Ao`BC}{k1IԚZip1Fvдܤ4rcD9IٜkhL[:.k*\~4߮U:4$rMFy{5..LXȡLjm3="܁z;>h~W`kg+lPv9)p<ak$!>`S\bs9oJ	
$TC]hW(HoO>hCD6,ۡ1r4yK
|>7Xo
56-OT>|!{.髿@x)VI0͜i۟]6GݞGE|,+3_!aAlbP|p⣦J}I&NF UG؂߇$-S0k$9(*",/'LGO))Հ o>ZMD+ʹh:ǥ:S;绪Zȶ~h%@5	-Y0>e/B/9jP&Mn-y1o;`Y+jsDn/½k{+h[GMI#~( ɖg&oInTz+AqmzFYlz٫=*مkzL)
zɚ]^F*5|}E_G{>h	lEXlgl=ZKVЫh͢}-KH0jhΐ=Ur/r9Q1ڢ@HogNo}X"o#	S}IDYn銏wAmE:uOXX?uɫƂ`cM_YԸQ^̃kF䇗G;^ةǷ=͌lr-&O7W4lW,DXx-q<s W/Z|~ҧHdo	QNe0<H&.&c&a強jaٵ`@G`i/鱶[Ruf*l/56.!IbmZTr%*] TJ_	<tBPWzO5&-{ԇ%cѥ>!vtLcP?wL ܟXQLuxbg(LD.먖SR`!RZI)NzblT>2E6_xԜ]-M=OK&a強jaٵ`@G`i/4NzfʇJKp:jLx,R ]nzBIknԜ]-M=OK&a強ja 
/JfIS`&5"`8E܌L'ᜂ<fǮ@wdF:QhZ3,:@|e4	 1EWX6R5Jܐ4X^w!7Nl&M\^5ߒfɒ0ãY#73~hV+5t]R? ;v!> erT*&WR(VJN,3E:je1(8u #.0ܓLFC57evs	`ꥧCq0\X7ԇ=2mSU #8<91:SQ	eNJSOB&'&{!J=Wd$C)C4gct寬)z;\fSVփ03fSVփ03fSVփ03񐗎yN&rplS1 7n<se&>;fSVփ03fSVփ03@*<(eL0r/YnĵwV"v
M]A+Fp+nvDȒi^hi]ei>f	YQ'p/\ln
F^ȝL(SGu`}S1Rg<`CQKQc>s: J"]>KriݟSs]gYB(j?dYxhCmHTO캊Frٮ:yyQ`VpA^YEm\/V\c%%3}]!Rla', S_GREEN_HDR)

# Fila 4 – Período
ws.write(4, 0, 'Periodo', S_GREEN_HDR)
ws.write(4, 2, int(periodo), S_INFO_VAL)

# Fila 5 – Cantidad + Líneas Error
ws.write(5, 0, 'Cantidad Registros', S_GREEN_HDR)
ws.write(5, 2, float(len(rows)), S_INFO_VAL)
ws.write(5, 10, 'Lineas de Error', S_ERR_LBL)
for c in (3,4,5,6,7,8,11):
    ws.write(5, c, '', S_EMPTY_WHITE)

# Fila 6 – valor Líneas Error
for c in (0,1,3,4,5,6,7,8):
    ws.write(6, c, '', S_EMPTY_WHITE)
ws.write(6, 10, 0.0, S_ERR_VAL)
for c in (11,15,16,17,18,19):
    ws.write(6, c, '', S_ERR_VAL)

# Fila 7 – vacía

# Fila 8 – barra "Detalle"
ws.write(8, 0, '', S_GREEN_BAR)
ws.write(8, 1, 'Detalle', S_GREEN_BAR)
for c in range(2, 27):
    ws.write(8, c, '', S_GREEN_BAR)

# Fila 9 – números de columna (1..23 con huecos en 7 y 9)
num_cols = {0: '', 1:1, 2:2, 3:3, 4:4, 5:5, 6:6, 7:'', 8:7, 9:'',
            10:8, 11:9, 12:10, 13:11, 14:12, 15:13, 16:14, 17:15,
            18:16, 19:17, 20:18, 21:19, 22:20, 23:21, 24:22, 25:23, 26:''}
for c, v in num_cols.items():
    ws.write(9, c, float(v) if v != '' else '', S_GREEN_HDR_C)

# Fila 10 – nombres de columna
hdr_names = [
    'Lineas','RNC o Cedula','Tipo Id','Tipo Bienes y Servicios Comprados',
    'NCF','NCF o Documento Modificado','Fecha Comprobante','',
    'Fecha Pago','','Monto Facturado en Servicios','Monto Facturado en Bienes',
    'Total Monto Facturado','ITBIS Facturado','ITBIS Retenido',
    'ITBIS sujeto a Proporcionalidad (Art. 349)','ITBIS llevado al Costo',
    'ITBIS por Adelantar','ITBIS percibido en compras','Tipo de Retencion en ISR',
    'Monto Retencion Renta','ISR Percibido en compras','Impuesto Selectivo al Consumo',
    'Otros Impuesto/Tasas','Monto Propina Legal','Forma de Pago','Estatus'
]
for c, h in enumerate(hdr_names):
    ws.write(10, c, h, S_GREEN_HDR_C)

# ============================================================
#  DATOS (a partir de fila 11)
# ============================================================
for i, row in enumerate(rows):
    r = 11 + i

    ws.write(r, 0, float(i+1), S_LINE_NUM)                                 # Linea
    ws.write(r, 1, row[0] or '', S_DATA_TXT)                                # RNC
    ws.write(r, 2, row[1] or '', S_DATA_TXT)                                # Tipo ID
    ws.write(r, 3, row[2] or '', S_DATA_TXT)                                # Tipo Bien
    ws.write(r, 4, row[3] or '', S_DATA_TXT)                                # NCF
    ws.write(r, 5, row[4] or '', S_DATA_TXT)                                # NCF Mod
    ws.write(r, 6, row[5] or '', S_DATA_TXT)                                # F.Comp
    ws.write(r, 7, '', S_DATA_TXT)                                          # (hueco)
    ws.write(r, 8, row[6] or '', S_DATA_TXT)                                # F.Pago
    ws.write(r, 9, '', S_DATA_TXT)                                          # (hueco)
    ws.write(r, 10, float(row[7] or 0), S_DATA_NUM)                         # Servicios
    ws.write(r, 11, float(row[8] or 0), S_DATA_NUM)                         # Bienes
    ws.write(r, 12, float(row[9] or 0), S_DATA_NUM)                         # Total
    ws.write(r, 13, float(row[10] or 0), S_DATA_NUM)                        # ITBIS Fact
    ws.write(r, 14, float(row[11] or 0), S_DATA_NUM)                        # ITBIS Ret
    ws.write(r, 15, float(row[12] or 0), S_DATA_NUM)                        # ITBIS Prop
    ws.write(r, 16, float(row[13] or 0), S_DATA_NUM)                        # ITBIS Costo
    ws.write(r, 17, float(row[14] or 0), S_DATA_NUM)                        # ITBIS Adel
    ws.write(r, 18, float(row[15] or 0), S_DATA_NUM)                        # ITBIS Perc
    ws.write(r, 19, row[16] or '', S_DATA_TXT)                              # Tipo Ret ISR
    ws.write(r, 20, float(row[17] or 0), S_DATA_NUM)                        # Ret Renta
    ws.write(r, 21, float(row[18] or 0), S_DATA_NUM)                        # ISR Perc
    ws.write(r, 22, float(row[19] or 0), S_DATA_NUM)                        # ISC
    ws.write(r, 23, float(row[20] or 0), S_DATA_NUM)                        # Otros Imp
    ws.write(r, 24, float(row[21] or 0), S_DATA_NUM)                        # Propina
    ws.write(r, 25, row[22] or '', S_DATA_TXT)                              # Forma Pago
    ws.write(r, 26, row[23] or '', S_DATA_TXT)                              # Estatus

# ============================================================
#  ANCHOS DE COLUMNA
# ============================================================
w = {
    0:2200, 1:4500, 2:2000, 3:6500, 4:5800, 5:5800, 6:3800, 7:1600,
    8:3800, 9:1600, 10:5200, 11:5200, 12:5200, 13:4400, 14:4400,
    15:5800, 16:4800, 17:4800, 18:4800, 19:4800, 20:4800, 21:4500,
    22:3800, 23:3800, 24:3800, 25:3400, 26:2200
}
for c, v in w.items():
    ws.col(c).width = v

# Congelar paneles (fila 11 hacia abajo, col A fija)
ws.set_panes_frozen(True)
ws.set_horz_split_pos(11)
ws.set_vert_split_pos(1)
ws.set_remove_splits(True)

wb.save(output_path)
print(f"OK:{output_path}")
cur.close()
db.close()
