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

 

Deja un comentario

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

*