Sincronizar números de Factura desincronizados - OdooAR/odoo-argentina-doc GitHub Wiki
Por diversos errores entre ambos sistemas, hay veces que se han reportado casos de desincronización entre el número de la factura de Odoo y el número de factura que se genera en AFIP. En caso de experimentar períodos donde algunas facturas no tienen el número correcto, puede usarse el siguiente script de Python. Reversión del script original de Gustavo Orrillo:
#!/usr/bin/python
import sys
import xmlrpclib
import ssl
url = '' # Odoo URL
username = '' # Odoo user
pwd = '' # Password Odoo User
dbname = '' # Database Odoo User
gcontext = ssl._create_unverified_context()
# UID
sock_common = xmlrpclib.ServerProxy (url + '/xmlrpc/common', context=gcontext)
uid = sock_common.login(dbname, username, pwd)
sock = xmlrpclib.ServerProxy(url + '/xmlrpc/object', context=gcontext)
invoice_ids = sock.execute(dbname,uid,pwd,'account.move','search',[('state','=','posted'),('type','=','out_invoice'),('afip_auth_code','!=',False)])
cae_counter = 0
counter = 0
for invoice_id in invoice_ids:
invoice_data = sock.execute(dbname,uid,pwd,'account.move','read',invoice_id,['name','afip_auth_code','afip_xml_request','afip_xml_response'])
invoice_data = invoice_data[0]
xml_response = invoice_data['afip_xml_response']
txt_from = xml_response.find('<CbteDesde>') + len('<CbteDesde>')
txt_to = xml_response.find('</CbteDesde>')
pdv_from = xml_response.find('<PtoVta>') + len('<PtoVta>')
pdv_to = xml_response.find('</PtoVta>')
cae_from = xml_response.find('<CAE>') + len('<CAE>')
cae_to = xml_response.find('</CAE>')
prefix = invoice_data['name'][:5]
inv_number = xml_response[pdv_from:pdv_to].zfill(5) + '-' + xml_response[txt_from:txt_to].zfill(8)
new_number = prefix + inv_number
# Testing de ambos números para control
print(invoice_data['name'], new_number)
if invoice_data['name'] != new_number:
new_number = prefix + ' ' + inv_number
counter += 1
vals = {
'name': new_number,
}
# Modo Testing - Puede utilizarse para comparar los números de factura desincronizados
print(invoice_data['name'], new_number)
# Modo Producción, descomentar las siguientes dos líneas luego de probar el print anterior
#return_id = sock.execute(dbname, uid, pwd, 'account.move', 'write', invoice_id, vals)
#print return_id
# Detectar números de CAE desincronizados
#if invoice_data['afip_auth_code'] != xml_response[cae_from:cae_to]:
# cae_counter += 1
print("****************", counter, cae_counter)