Tipo comprobante Boleta para Dolibarr

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!!!!

 

20 comentarios sobre “Tipo comprobante Boleta para Dolibarr

  1. Manuel Contestar

    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.

    • Andrés Sosa Autor del artículoContestar

      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.

  2. Alonso Contestar

    en dolibarr 7.0.1 el archivo compta/facture.php no existe, debe haber tomado otro nombre y locacion. ideas?

  3. Alonso Contestar

    ya encontre los nuevos archivos y las ubicaciones correspondientes, haciendo pruebas…

    • Andrés Sosa Autor del artículoContestar

      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

  4. Alonso Contestar

    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

        • Andrés Sosa Autor del artículoContestar

          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.

    • Andrés Sosa Autor del artículoContestar

      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.

  5. Daniel Contestar

    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 . “)”;
    }

  6. jose armando Contestar

    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!

  7. Luis Vargas Contestar

    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

Responder a Andrés Sosa Cancelar la respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *


El periodo de verificación de reCAPTCHA ha caducado. Por favor, recarga la página.