Avisos
Vaciar todo

Numeración de facturas en VirtueMart 2  

Página 1 / 2
 
Javier Gómez
 Javier Gómez
Estimable Member

Hola,

Ya estamos dando forma a la tienda en VM2, ahora se me presenta un problema a la hora de facturar...por lo que veo, VM2 asigna un numero aleatoria a la factura tipo (Factura 12040297a09), esto si no me equivoco, en la legislación española no es correcto, tenemos que poner los números de factura correlativos y relacionados con la fecha ¿no?

Estoy mirando (he comprado) ARTIO Invoice, pero me hace mal los cálculos de facturas y dentro de lo posible me gustaria hacerlo todo por VM2.

¿ Sabéis si hay manera de crear un numero de factura con su fecha que no tenga relación con la del pedido y que sean correlativas?, entiendo que si puedo facturar un pedido antes que otro y un pedido de principio de mes, por ejemplo, facturarlo después de uno de finales de mes...

Saludos
Javier Gomez

URL del sitio: http://www.sugo.es/vm

Citar
Respondido : 02/04/2012 7:04 pm
Jhon
 Jhon
Soporte CMS Webempresa Moderator

Hola Sugo

Si, efectivamente , el número de orden es un número creado por virtuemart, involucra partes aleatorias y fijas así como correlativas, puede ubicar la lógica en el siguiente archivo : administrator/components/com_virtuemart/models/orders.php en la línea 878 hay una función que genera los números de ordenes llamada generateOrderNumber

Tendrías que modificar esta función de acuerdo a tus necesidades.

Otra opción de modificación es lo que se sugiere en este hilo de discusión y es a través de plugings, tendrías que construir un pluging y modificar el comportamiento de la generación de ordenes.
http://forum.virtuemart.net/index.php?topic=98610.0

Saludos.

ResponderCitar
Respondido : 03/04/2012 12:29 am

Javier Gómez
 Javier Gómez
Estimable Member

Hola Jhon,

Muchas gracias por las indicaciones, he estado mirando, pero esas lineas que me dices no me cuadran en V2.0.3h (Estamos trabajando sobre esa mientras no sacan la estable por el tema de productos hijos..)

El código que me parece mas indicado seria este, lo posteo por si me equivoco y para que sirva a los demás usuarios:

Para el codigo de albaran/pedido:

	/**
	 * Generate a unique ordernumber. This is done in a similar way as VM1.1.x, although
	 * the reason for this is unclear to me :-S
	 *
	 * @author Oscar van Eijk
	 * @param integer $uid The user ID. Defaults to 0 for guests
	 * @return string A unique ordernumber
	 */
	public function generateOrderNumber($uid = 0,$length=10, $virtuemart_vendor_id=1)
	{

		$db = JFactory::getDBO();

		$q = 'SELECT COUNT(1) FROM #__virtuemart_orders WHERE `virtuemart_vendor_id`="'.$virtuemart_vendor_id.'"';
		$db->setQuery($q);

		//We can use that here, because the order_number is free to set, the invoice_number must often follow special rules
		$count = $db->loadResult();
		$count = $count + (int)VM_ORDER_OFFSET;
// 		vmdebug('my db creating ordernumber VM_ORDER_OFFSET '.VM_ORDER_OFFSET.' $count '.$count, $this->_db);
// 		$variable_fixed=sprintf("%06s",$num_rows);
		$data = substr( md5( session_id().(string)time().(string)$uid )
		,0
		,$length
		).'0'.$count;

		return $data;
	}

Para el de facturas:

	function createInvoiceNumber($orderDetails){

		$orderDetails = (array)$orderDetails;
		$db = JFactory::getDBO();
		if(!isset($orderDetails['virtuemart_order_id'])) vmWarn('createInvoiceNumber $orderDetails has no virtuemart_order_id ',$orderDetails);
		$q = 'SELECT * FROM `#__virtuemart_invoices` WHERE `virtuemart_order_id`= "'.$orderDetails['virtuemart_order_id'].'" '; // AND `order_status` = "'.$orderDetails->order_status.'" ';

		$db->setQuery($q);
		$result = $db->loadAssoc();
// 		vmdebug('my createInvoiceNumber $q '.$q,$result);
		if(!$result or empty($result['invoice_number']) ){

			$data['virtuemart_order_id'] = $orderDetails['virtuemart_order_id'];

			$data['order_status'] = $orderDetails['order_status'];

			$data['virtuemart_vendor_id'] = $orderDetails['virtuemart_order_id'];

			JPluginHelper::importPlugin('vmshopper');
			$dispatcher = JDispatcher::getInstance();
			$plg_datas = $dispatcher->trigger('plgVmOnUserInvoice',$orderDetails,$data);
			foreach($plg_datas as $plg_data){
// 				$data = array_merge($plg_data,$data);
			}

			if(empty($data['invoice_number'])) {
				$q = 'SELECT COUNT(1) FROM `#__virtuemart_invoices` WHERE `virtuemart_vendor_id`= "'.$orderDetails['virtuemart_vendor_id'].'" '; // AND `order_status` = "'.$orderDetails->order_status.'" ';
				$db->setQuery($q);

				$count = $db->loadResult()+1;

				if(empty($data['invoice_number'])) {
					//$variable_fixed=sprintf("%05s",$num_rows);
					$date = date("Y-m-d");
// 					$date = JFactory::getDate()->toMySQL();
					$data['invoice_number'] = str_replace('-', '', substr($date,2,8)).substr(md5($orderDetails['order_number'].$orderDetails['order_status']),0,3).'0'.$count;
				}
			}


			$table = $this->getTable('invoices');

			$table->bindChecknStore($data);

			return array($table->invoice_number,$table->created_on);

		} else {
			return array($result['invoice_number'],$result['created_on']);
		}

	}

Lo del tema de los plugins, aunque seria la mejor opción por el tema de las actualizaciones y demás, de momento no tengo horas para dedicarle, a ver si algun alma caritativa hace uno 🙂

Saludos
Javier Gomez

ResponderCitar
Respondido : 03/04/2012 12:19 pm
Jordi Sala
 Jordi Sala
Miembro Admin

Hola SUGO,

El tema es que hay que alterar el funcionamiento de Virtuemart, ya que en la serie 1.1.X el comportamiento de la generación de pedidos y facturas era secuencial.
En Virtuemart 2.0.x ha cambiado, no entiendo exactamente el motivo.

Como indica Max Milbers, pueden ser unas 4 horas de trabajo, pero entiendo que son para una persona con un conocimiento de Virtuemart y de programación muy elevado.

No entiendo nada de temas de facturas y legislación, pero buscando veo que en España:
La numeración de las facturas dentro de cada serie será correlativa.Se podrán expedir facturas mediante series separadas cuando existan razones que lo justifiquen y, entre otros supuestos, cuando el obligado a su expedición cuente con varios establecimientos desde los que efectué sus operaciones y cuando el obligado a su expedición realice operaciones de distinta naturaleza.

¿Pero no nos estamos harmonizando con Europa? 🙂

Saludos

ResponderCitar
Respondido : 03/04/2012 12:43 pm

Gestor de Contraseñas - VPN Conexión Segura - Gestor 2FA (Segundo Factor de Autenticación

Javier Gómez
 Javier Gómez
Estimable Member

Hola Jordi,

gracias por la información.

He cambiado las siguientes lineas del archivo...

977	//$data = substr( md5( session_id().(string)time().(string)$uid ) ,0 ,$length ).'0'.$count;
988	$data = 'P-' . (string)date("Y") . '-' .$count;


1018	//$data['invoice_number'] = str_replace('-', '', substr($date,2,8)).substr(md5($orderDetails['order_number'].$orderDetails['order_status']),0,3).'0'.$count;
1019	$data['invoice_number'] = 'F-' . (string)date("Y") . '-' .$count;

y ahora si me genera unos números de pedido y factura correlativos y formateados.

Pedidos = P-2012-1
Facturas= F-2012-1

En la DB tienen que estar los contadores para poder resetear o poner los contadores a un numero especifico de pedido y factura por el que empezar a trabajar.

Yo también estoy pez en contabilidad, pero el gestor es maniático con estas cosas (sera de la antigua escuela, no se) :S

Y sí, deberíamos ir harmonizando con Europa...y el mundo mundial, que eso ya es arina de otro costal :unsure:

Saludos cordiales
Javier Gomez.

Edito:

En Virtuemart 2.0.x ha cambiado, no entiendo exactamente el motivo.

Según he leído en el foro es por temas de seguridad, en VM1 los pedidos eran por el ID de base de datos y quieren separar estas numeraciones por temas de seguridad.

ResponderCitar
Respondido : 03/04/2012 1:07 pm
Jhon
 Jhon
Soporte CMS Webempresa Moderator

Hola Sugo

Que bueno que solucionaste tu problema, y gracias por el aporte colocando el cambio que has realizado.

Sólo ten en cuenta guardar el archivo cambiado ya que si actualizas virtuemart posiblemente te sobreescriba este archivo y los cambios se perderán

Saludos.

ResponderCitar
Respondido : 03/04/2012 2:35 pm

Cursos Gratuitos WordPress

lola
 lola
Reputable Member

Hola Javier,

¿me podrías indicar exatamente en qué archivo has realizado las modificaciones de la generación correlativa de números de facturas y de pedidos?.

Adicionalmente comentas "En la DB tienen que estar los contadores para poder resetear o poner los contadores a un numero especifico de pedido y factura por el que empezar a trabajar." ¿Me puedes indicar cómo hacerlo?.

Mil gracias

ResponderCitar
Respondido : 25/06/2012 1:02 pm
lola
 lola
Reputable Member

Yo tengo la versión 2.0.6 y no encuentro por ningún lado las sentencias que has modificado ...

ResponderCitar
Respondido : 25/06/2012 1:19 pm

wpdoctor-revisa-la-salud-de-tu-wordpress

Pablo Velasco
 Pablo Velasco
Illustrious Member

Hola,

En Virtuemart 2.0.6 los cambios los tendrás que aplicar en el archivo administrator/components/com_virtuemart/models/orders.php concretamente en las líneas 992 y 1039.

Si vas a aplicar cambios ten cuidado porque cualquier error en el código haría que no se guardasen los pedidos de la tienda. Por seguridad, haz una copia de archivos antes de modificarlo.

ResponderCitar
Respondido : 25/06/2012 6:06 pm
lola
 lola
Reputable Member

Ya lo he hecho y me funciona genial. Ahora bien, tengo un par de dudas:

1- los números de facturas tienen 2 dígitos, por lo que entiendo que únicamente se pueden emitir 99 facturas. ¿Qué pasa cuando sobrepasa este número?.

2- "En la DB tienen que estar los contadores para poder resetear o poner los contadores a un numero especifico de pedido y factura por el que empezar a trabajar." ¿dónde residen estos contadores?. ¿Me puedes indicar cómo hacerlo?.

ResponderCitar
Respondido : 25/06/2012 10:04 pm

optimiza-automaticamente-todas-las-imagenes-de-tu-wordpress

Jhon
 Jhon
Soporte CMS Webempresa Moderator

Hola lola

1- Según veo no hay problema por la cantidad de dos dígitos, la variable $count toma el último número de orden y este número es de tipo int , es decir puede crecer hasta 4294967295 aprox

2- Crea una orden y verifica el campo invoice_number de la tabla #_virtuemart_invoices , es en este campo en donde se almacena la orden, si quieres empezar desde un número específico

El archivo
/administrator/components/com_virtuemart/helpers/config.php te da el número a agregar:

define('VM_ORDER_OFFSET',3);

Cambie el número 3 por otro valor.

Saludos.

ResponderCitar
Respondido : 26/06/2012 8:22 pm
lola
 lola
Reputable Member

No entiendo muy bien para qué sirve el valor 3. ¿El contador no se incrementa de 1 en 1?.

ResponderCitar
Respondido : 26/06/2012 10:06 pm

lola
 lola
Reputable Member

No me funciona cambiando el campo invoice_number. Lo he puesto a 00 y sigue incrementando el valor respecto al que tenía antes (en mi caso 70 en lugar de 01). Creo que el último valor de la variable no se almacena en el campo invoice_number, debe guardarse en otro sitio que desconozco.

ResponderCitar
Respondido : 26/06/2012 10:23 pm
Javier Gómez
 Javier Gómez
Estimable Member

Hola Lola,

Por lo que yo he podido averiguar, el numero de factura y orden lo saca por el numero de registros que tienes creados en la DB, si borras una orden o una factura, el contador se decrementa, por lo que no hay contador para los números de factura y orden.

Eso lo puedes conseguir con VM Invoice, con sus defectos y virtudes...

Un saludo.

ResponderCitar
Respondido : 27/06/2012 9:06 am

Gestor de Contraseñas - VPN Conexión Segura - Gestor 2FA (Segundo Factor de Autenticación

Pablo Velasco
 Pablo Velasco
Illustrious Member

Hola,

El está en que el valor lo saca de un campo de la base de datos que se autoincrementa, de forma que si se borrar un registro igualmente seguiría por el que le tocara.

Para reiniciar los valores sería necesario hacer un borrado de la tabla de facturas con las instrucción TRUNCATE de mysql, ya que de esta forma los campos autoincrementables sí que comentarán de nuevo desde el 1.

ResponderCitar
Respondido : 27/06/2012 10:49 am
Página 1 / 2