Sincronizar números de Factura desincronizados - OdooAR/odoo-argentina-doc GitHub Wiki

Sincronizar números de Factura desincronizados entre Odoo y AFIP

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)
⚠️ **GitHub.com Fallback** ⚠️