Una funcionalidad que no trae Dolibarr es crear otro tipo de comprobante además de la factura estándar. En nuestro caso aquí en Perú usamos Factura y Boleta. Boleta es el comprobante que necesitamos agregar en Dolibarr y que revisando en el dolistore hay un módulo 2series que te permite agregar tantos números de series que quisiéramos. En esta ocasión he agregado al boleta de una manera manual modificando archivos de dolibarr en su versión 5 y que ahora comparto para quienes necesiten agregar esta funcionalidad. Hasta el momento he probado que se genere los números de serie, se registre la boleta y se agreguen sus respectivos pagos. Ya no he llegado más allá porque es lo que solo necesito hasta el momento. No lo he revisado con el módulo de contabilidad avanzado que crea los asientos en doble partida, quizás lo haga en estos días en mi entorno de pruebas. Invito a nuestros amigos desarrolladores que prueben y agreguen estas funcionalidades si lo necesitan, corríjanme si estoy equivocado y si es posible hacer un módulo libre para la comunidad. No prometo nada pero si hay tiempo libre y mientras más comprenda como se ha desarrollado dolibarr quizás libere algunos módulos que vaya desarrollando en el camino. Esta solución se puede aplicar para cualquiera que necesite agregar otro tipo de comprobante. En mi caso al archivo de configuración lo nombre «peru». Solo hay que modificar por el nombre que quieran. Luego de todo esto paso a explicar los pasos, manos a la obra!
- Copiar el archivo mod_facture_peru.php en core/modules/facture/ (Descargar aquí)
- En el archivo compta/facture/class/facture.class.php, buscar y agregar
/** * Proforma invoice (should not be used. a proforma is an order) */ const TYPE_PROFORMA = 4; /** * Boleta */ const TYPE_BOLETA = 10;
- En el archivo admin/facture.php agregar las sgtes líneas:
if ($action == 'updateMask'){ $maskconstinvoice=GETPOST('maskconstinvoice','alpha'); $maskconstreplacement=GETPOST('maskconstreplacement','alpha'); $maskconstcredit=GETPOST('maskconstcredit','alpha'); $maskconstdeposit=GETPOST('maskconstdeposit','alpha'); $maskconstboleta=GETPOST('maskconstboleta','alpha'); //boleta $maskinvoice=GETPOST('maskinvoice','alpha'); $maskreplacement=GETPOST('maskreplacement','alpha'); $maskcredit=GETPOST('maskcredit','alpha'); $maskdeposit=GETPOST('maskdeposit','alpha'); $maskboleta=GETPOST('maskboleta','alpha'); //boleta if ($maskconstinvoice) $res = dolibarr_set_const($db,$maskconstinvoice,$maskinvoice,'chaine',0,'',$conf->entity); if ($maskconstreplacement) $res = dolibarr_set_const($db,$maskconstreplacement,$maskreplacement,'chaine',0,'',$conf->entity); if ($maskconstcredit) $res = dolibarr_set_const($db,$maskconstcredit,$maskcredit,'chaine',0,'',$conf->entity); if ($maskconstdeposit) $res = dolibarr_set_const($db,$maskconstdeposit,$maskdeposit,'chaine',0,'',$conf->entity); //boleta if ($maskconstboleta) $res = dolibarr_set_const($db,$maskconstboleta,$maskboleta,'chaine',0,'',$conf->entity);
- En el mismo archivo buscamos las línea debajo ponemos:
// Example for deposit invoice $facture->type=3; $nextval=$module->getNextValue($mysoc,$facture); if ("$nextval" != $langs->trans("NotAvailable")) { // Keep " on nextval $htmltooltip.=$langs->trans("NextValueForDeposit").': '; if ($nextval) { if (preg_match('/^Error/',$nextval) || $nextval=='NotConfigured') $nextval = $langs->trans($nextval); $htmltooltip.=$nextval; } else { $htmltooltip.=$langs->trans($module->error); } } //boleta // Example for standard boleta $facture->type=10; $nextval=$module->getNextValue($mysoc,$facture); if ("$nextval" != $langs->trans("NotAvailable")) { // Keep " on nextval $htmltooltip.=$langs->trans("NextValueForBoleta").': '; if ($nextval) { if (preg_match('/^Error/',$nextval) || $nextval=='NotConfigured') $nextval = $langs->trans($nextval); $htmltooltip.=$nextval.'<br>'; } else { $htmltooltip.=$langs->trans($module->error).'<br>'; } }
- Hasta aquí ya tenemos nuestra numeración para activar desde el panel del modulo facturación. Podemos ir agregando nuestras mascaras para los numeros de serie.
- En el archivo compta/facture.php buscamos las sgtes. Líneas y agregamos BOLETA a cada if
// Standard or deposit or proforma invoice, not from a Predefined template invoice if (($_POST['type'] == Facture::TYPE_STANDARD || $_POST['type'] == Facture::TYPE_DEPOSIT || $_POST['type'] == Facture::TYPE_PROFORMA || $_POST['type'] == Facture::TYPE_BOLETA || ($_POST['type'] == Facture::TYPE_SITUATION && empty($_POST['situations']))) && GETPOST('fac_rec') <= 0) {
- también
// Validate if ($object->statut == 0 && count($object->lines) > 0 && ((($object->type == Facture::TYPE_STANDARD || $object->type == Facture::TYPE_REPLACEMENT || $object->type == Facture::TYPE_DEPOSIT || $object->type == Facture::TYPE_PROFORMA || $object->type == Facture::TYPE_BOLETA || $object->type == Facture::TYPE_SITUATION) && (! empty($conf->global->FACTURE_ENABLE_NEGATIVE) || $object->total_ttc >= 0)) || ($object->type == Facture::TYPE_CREDIT_NOTE && $object->total_ttc <= 0))) {
- también
// Clone if (($object->type == Facture::TYPE_STANDARD || $object->type == Facture::TYPE_DEPOSIT || $object->type == Facture::TYPE_PROFORMA || $object->type == Facture::TYPE_BOLETA) && $user->rights->facture->creer) {
- también
// Clone as predefined / Create template if (($object->type == Facture::TYPE_STANDARD || $object->type == Facture::TYPE_DEPOSIT || $object->type == Facture::TYPE_PROFORMA || $object->type == Facture::TYPE_BOLETA) && $object->statut == 0 && $user->rights->facture->creer) {
- también
// Create a credit note if (($object->type == Facture::TYPE_STANDARD || $object->type == Facture::TYPE_DEPOSIT || $object->type == Facture::TYPE_PROFORMA || $object->type == Facture::TYPE_BOLETA) && $object->statut > 0 && $user->rights->facture->creer) {
- también agregamos las sgtes. líneas
// Standard invoice print '<div class="tagtr listofinvoicetype"><div class="tagtd listofinvoicetype">'; $tmp='<input type="radio" id="radio_standard" name="type" value="0"' . (GETPOST('type') == 0 ? ' checked' : '') . '> '; $desc = $form->textwithpicto($tmp.$langs->trans("InvoiceStandardAsk"), $langs->transnoentities("InvoiceStandardDesc"), 1, 'help', '', 0, 3); print $desc; print '</div></div>'; // Boleta print '<div class="tagtr listofinvoicetype"><div class="tagtd listofinvoicetype">'; $tmp='<input type="radio" id="radio_boleta" name="type" value="10"' . (GETPOST('type') == 10 ? ' checked' : '') . '> '; $desc = $form->textwithpicto($tmp.$langs->trans("InvoiceBoletaAsk"), $langs->transnoentities("InvoiceBoletaDesc"), 1, 'help', '', 0, 3); print $desc; print '</div></div>';
- Agregar la traducción de boleta en el archivo según el idioma del país, en mi caso langs/es_PE/bills.php
InvoiceBoleta=Boleta estándar InvoiceBoletaAsk=Boleta estándar InvoiceBoletaDesc=Este tipo de boleta es la boleta tradicional.
- Hasta aquí ya podemos visualizar el nuevo tipo de comprobante boleta cuando queremos registrar una venta para un cliente.
- Buscar y agregar la sgte linea de código en el archivo core/class/commoninvoice.class.php
/** * Proforma invoice */ const TYPE_PROFORMA = 4; /** * Proforma invoice */ const TYPE_BOLETA = 10;
- También
function getLibType() { global $langs; if ($this->type == CommonInvoice::TYPE_STANDARD) return $langs->trans("InvoiceStandard"); if ($this->type == CommonInvoice::TYPE_REPLACEMENT) return $langs->trans("InvoiceReplacement"); if ($this->type == CommonInvoice::TYPE_CREDIT_NOTE) return $langs->trans("InvoiceAvoir"); if ($this->type == CommonInvoice::TYPE_DEPOSIT) return $langs->trans("InvoiceDeposit"); if ($this->type == CommonInvoice::TYPE_PROFORMA) return $langs->trans("InvoiceProForma"); // Not used. if ($this->type == CommonInvoice::TYPE_SITUATION) return $langs->trans("InvoiceSituation"); if ($this->type == CommonInvoice::TYPE_BOLETA) return $langs->trans("InvoiceBoleta"); //boleta return $langs->trans("Unknown"); }
- En el archivo compta/paiement.php buscar las líneas sgtes y agregar el tipo de código que tendrá en este caso la boleta
if ($facture->type != 2) { //agregamos 10 como id de boleta $sql .= ' AND type IN (0,1,3,5,10)'; // Standard invoice, replacement, deposit, situation } else { $sql .= ' AND type = 2'; // If paying back a credit note, we show all credit notes }
- En el archivo paiement.class.php buscar las líneas y agregar:
//Invoice types that are eligible for changing status to paid $affected_types = array( Facture::TYPE_STANDARD, Facture::TYPE_REPLACEMENT, Facture::TYPE_CREDIT_NOTE, Facture::TYPE_DEPOSIT, Facture::TYPE_SITUATION, Facture::TYPE_BOLETA //boleta );
- Ahora ya podemos grabar nuestra boleta. En el ejemplo de pruebas tengo facturas, boletas y comprobantes por validar.
- Podemos visualizar el tipo de comprobante boleta con sus pagos
Servidos!!!!
Enamorado del blues, la trova y el rock. Un apasionado a tiempo completo de la tecnología, pivoteo y me adapto a cada nuevo paso que se da. Busco continuamente las mejores prácticas y metodologías para asegurar la calidad en el software y los procesos de negocio. Algunas horas las dedico a buscar conocimiento en filosofía y teología.
Saludos, una consulta porque todos estos cambios son en dolibarr 5.0.X, y no en el 7.0.1, se podrian realizar dichos cambios que haces en cualquier version.
Manuel disculpa la demora en contestar a tu inquietud. Efectivamente los cambios pueden aplicarse en Dolibarr 7. Inclusive ya he aplicado los cambios en un proyecto con Dolibarr 7 siguiendo los mismos pasos.
en dolibarr 7.0.1 el archivo compta/facture.php no existe, debe haber tomado otro nombre y locacion. ideas?
ya encontre los nuevos archivos y las ubicaciones correspondientes, haciendo pruebas…
Alonso que buena noticia. Para compartir la información en Dolibarr 7 el archivo ya no es compta/facture.php sino compta/facture/card.php
dejo la lista de archivos, ubicaciones a modificar, el codigo ha cambiado un poco, pero puedes tomas como referencias las lineas anteriores de cada archivo.
los archivos son ahora:
compta/facture/class/facture.class.php
admin/facture.php
compta/facture/card.php
langs/es_MX/bills.lang
core/class/commoninvoice.class.php
compta/paiement.php
compta/paiment/class/paiment.class.php
Gracias Alonso por compartir tus conocimientos y avances.
sabes de facturación electrónica SUNAT dolibar
Nino buenas tardes, por el momento estoy en un proyecto personal aplicando facturación electrónica con php y mysql. Estoy a la espera esta semana de Dolibarr 8 y sobre el cual aplicaré mi experiencia en facturación electrónica. Calculo que para fines de este año debo tener un modulo 100% validado.
Hola amigo, esto sirve para dolibarr 8 ?
Saludos
Fabián buenos días. No he probado aún en la versión 8, estoy a la espera de la 9 para agregar inclusive la facturación sunat.
Esta muy bueno el aporte, lo he implementado y estoy buscando como hacer para que se pueda usar por completo en los registros contables, hasta lo que tengo y que funciona es agregar el sig codigo en el archivo «accountancy/customer/list.php» el sig codigo:
if (! empty($conf->global->FACTURE_DEPOSITS_ARE_JUST_PAYMENTS)) {
$sql .= » AND f.type IN (» . Facture::TYPE_STANDARD . «,» . Facture::TYPE_REPLACEMENT . «,» . Facture::TYPE_CREDIT_NOTE . «,» . Facture::TYPE_SITUATION . «,» . Facture::TYPE_BOLETA . «)»;
} else {
$sql .= » AND f.type IN (» . Facture::TYPE_STANDARD . «,» . Facture::TYPE_STANDARD . «,» . Facture::TYPE_CREDIT_NOTE . «,» . Facture::TYPE_DEPOSIT . «,» . Facture::TYPE_SITUATION . «,» . Facture::TYPE_BOLETA . «)»;
}
También se deberá hacer lo mismo en los archivos de index.php y lines.php de esa misma carpeta
Gracias Daniel por tus aportes!!!
Muchas gracias, sirvío para la version 12 que acaba de salir, salvo que en el archivo mod_facture_peru.php ya no es facnumber sino ref.
Saludos!
Gracias a ti por la actualización!!
Hola a todos excelente información he aplicado lo que indicas y funciona a la perfección en la versión 17 de dolibarr, ahora estoy tratando de agregar para que en POS se pueda seleccionar el tipo de comprobante
Excelente Luis. Que buena noticia que siga funcionando para versiones posteriores.
Tendrán algun video de como realizar los pasos descritos, es que me arrojo un error
Hola Roger. Lo siento pero no contamos con un video de los pasos descritos en el presente artículo.