{"id":1501,"date":"2017-07-24T17:21:30","date_gmt":"2017-07-24T22:21:30","guid":{"rendered":"http:\/\/creativapixel.com\/?p=1501"},"modified":"2018-01-30T17:57:20","modified_gmt":"2018-01-30T22:57:20","slug":"tipo-comprobante-boleta-para-dolibarr","status":"publish","type":"post","link":"https:\/\/creativapixel.com\/blog\/tipo-comprobante-boleta-para-dolibarr\/","title":{"rendered":"Tipo comprobante Boleta para Dolibarr"},"content":{"rendered":"<p>Una funcionalidad que no trae Dolibarr es crear otro tipo de comprobante adem\u00e1s de la factura est\u00e1ndar. En nuestro caso aqu\u00ed en Per\u00fa usamos Factura y Boleta. Boleta es el comprobante que necesitamos agregar en Dolibarr y que revisando en el dolistore hay un m\u00f3dulo 2series que te permite agregar tantos n\u00fameros de series que quisi\u00e9ramos. En esta ocasi\u00f3n he agregado al boleta de una manera manual modificando archivos de dolibarr en su versi\u00f3n 5 y que ahora comparto para quienes necesiten agregar esta funcionalidad. Hasta el momento he probado que se genere los n\u00fameros de serie, se registre la boleta y se agreguen sus respectivos pagos. Ya no he llegado m\u00e1s all\u00e1 porque es lo que solo necesito hasta el momento. No lo he revisado con el m\u00f3dulo de contabilidad avanzado que crea los asientos en doble partida, quiz\u00e1s lo haga en estos d\u00edas en mi entorno de pruebas.\u00a0 Invito a nuestros amigos desarrolladores que prueben y agreguen estas funcionalidades si lo necesitan, corr\u00edjanme si estoy equivocado y si es posible hacer un m\u00f3dulo libre para la comunidad. No prometo nada pero si hay tiempo libre y mientras m\u00e1s comprenda como se ha desarrollado dolibarr quiz\u00e1s libere algunos m\u00f3dulos que vaya desarrollando en el camino. Esta soluci\u00f3n se puede aplicar para cualquiera que necesite agregar otro tipo de comprobante. En mi caso al archivo de configuraci\u00f3n lo nombre \u00abperu\u00bb. Solo hay que modificar por el nombre que quieran. Luego de todo esto paso a explicar los pasos, manos a la obra!<\/p>\n<ul>\n<li>Copiar el archivo mod_facture_peru.php en core\/modules\/facture\/ (<a href=\"http:\/\/creativapixel.com\/wp-content\/uploads\/2017\/07\/mod_facture_peru.zip\">Descargar aqu\u00ed<\/a>)<\/li>\n<li>En el archivo compta\/facture\/class\/facture.class.php, buscar y agregar<\/li>\n<\/ul>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">\/**\r\n* Proforma invoice (should not be used. a proforma is an order)\r\n*\/\r\nconst TYPE_PROFORMA = 4;\r\n\r\n\/**\r\n* Boleta\r\n*\/ \r\nconst TYPE_BOLETA = 10;<\/pre>\n<ul>\n<li>En el archivo admin\/facture.php agregar las sgtes l\u00edneas:<\/li>\n<\/ul>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">if ($action == 'updateMask'){\r\n\r\n$maskconstinvoice=GETPOST('maskconstinvoice','alpha');\r\n\r\n$maskconstreplacement=GETPOST('maskconstreplacement','alpha');\r\n\r\n$maskconstcredit=GETPOST('maskconstcredit','alpha');\r\n\r\n$maskconstdeposit=GETPOST('maskconstdeposit','alpha');\r\n\r\n$maskconstboleta=GETPOST('maskconstboleta','alpha'); \/\/boleta\r\n\r\n\r\n$maskinvoice=GETPOST('maskinvoice','alpha');\r\n\r\n$maskreplacement=GETPOST('maskreplacement','alpha');\r\n\r\n$maskcredit=GETPOST('maskcredit','alpha');\r\n\r\n$maskdeposit=GETPOST('maskdeposit','alpha');\r\n\r\n$maskboleta=GETPOST('maskboleta','alpha'); \/\/boleta\r\n\r\n\r\nif ($maskconstinvoice) $res = dolibarr_set_const($db,$maskconstinvoice,$maskinvoice,'chaine',0,'',$conf-&gt;entity);\r\n\r\nif ($maskconstreplacement) $res = dolibarr_set_const($db,$maskconstreplacement,$maskreplacement,'chaine',0,'',$conf-&gt;entity);\r\n\r\nif ($maskconstcredit)  $res = dolibarr_set_const($db,$maskconstcredit,$maskcredit,'chaine',0,'',$conf-&gt;entity);\r\n\r\nif ($maskconstdeposit)  $res = dolibarr_set_const($db,$maskconstdeposit,$maskdeposit,'chaine',0,'',$conf-&gt;entity);\r\n\r\n\/\/boleta\r\nif ($maskconstboleta)  $res = dolibarr_set_const($db,$maskconstboleta,$maskboleta,'chaine',0,'',$conf-&gt;entity);\r\n\r\n<\/pre>\n<ul>\n<li>En el mismo archivo buscamos las l\u00ednea debajo ponemos:<\/li>\n<\/ul>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">\/\/ Example for deposit invoice\r\n\r\n$facture-&gt;type=3;\r\n\r\n$nextval=$module-&gt;getNextValue($mysoc,$facture);\r\n\r\nif (\"$nextval\" != $langs-&gt;trans(\"NotAvailable\")) {  \/\/ Keep \" on nextval\r\n\r\n$htmltooltip.=$langs-&gt;trans(\"NextValueForDeposit\").': ';\r\n\r\nif ($nextval) {\r\n\r\nif (preg_match('\/^Error\/',$nextval) || $nextval=='NotConfigured')\r\n\r\n$nextval = $langs-&gt;trans($nextval);\r\n\r\n$htmltooltip.=$nextval;\r\n\r\n} else {\r\n\r\n$htmltooltip.=$langs-&gt;trans($module-&gt;error);\r\n\r\n}\r\n\r\n}\r\n\r\n\r\n\/\/boleta\r\n\/\/ Example for standard boleta\r\n\r\n$facture-&gt;type=10;\r\n\r\n$nextval=$module-&gt;getNextValue($mysoc,$facture);\r\n\r\nif (\"$nextval\" != $langs-&gt;trans(\"NotAvailable\")) {  \/\/ Keep \" on nextval\r\n\r\n$htmltooltip.=$langs-&gt;trans(\"NextValueForBoleta\").': ';\r\n\r\nif ($nextval) {\r\n\r\nif (preg_match('\/^Error\/',$nextval) || $nextval=='NotConfigured')\r\n\r\n$nextval = $langs-&gt;trans($nextval);\r\n\r\n$htmltooltip.=$nextval.'&lt;br&gt;';\r\n\r\n} else {\r\n\r\n$htmltooltip.=$langs-&gt;trans($module-&gt;error).'&lt;br&gt;';\r\n\r\n}\r\n\r\n}<\/pre>\n<ul>\n<li>Hasta aqu\u00ed ya tenemos nuestra numeraci\u00f3n para activar desde el panel del modulo facturaci\u00f3n. Podemos ir agregando nuestras mascaras para los numeros de serie.<\/li>\n<\/ul>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-1516\" src=\"http:\/\/creativapixel.com\/wp-content\/uploads\/2017\/07\/configuracion.png\" alt=\"\" width=\"1144\" height=\"440\" srcset=\"https:\/\/creativapixel.com\/blog\/wp-content\/uploads\/2017\/07\/configuracion.png 1144w, https:\/\/creativapixel.com\/blog\/wp-content\/uploads\/2017\/07\/configuracion-300x115.png 300w, https:\/\/creativapixel.com\/blog\/wp-content\/uploads\/2017\/07\/configuracion-768x295.png 768w, https:\/\/creativapixel.com\/blog\/wp-content\/uploads\/2017\/07\/configuracion-1024x394.png 1024w\" sizes=\"auto, (max-width: 1144px) 100vw, 1144px\" \/><\/p>\n<ul>\n<li>En el archivo compta\/facture.php buscamos las sgtes. L\u00edneas y agregamos BOLETA a cada if<\/li>\n<\/ul>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">\/\/ Standard or deposit or proforma invoice, not from a Predefined template invoice\r\n\r\nif (($_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 &amp;&amp; empty($_POST['situations']))) &amp;&amp; GETPOST('fac_rec') &lt;= 0)\r\n\r\n{<\/pre>\n<ul>\n<li>tambi\u00e9n<\/li>\n<\/ul>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">\/\/ Validate\r\n\r\nif ($object-&gt;statut == 0 &amp;&amp; count($object-&gt;lines) &gt; 0 &amp;&amp; ((($object-&gt;type == Facture::TYPE_STANDARD || $object-&gt;type == Facture::TYPE_REPLACEMENT || $object-&gt;type == Facture::TYPE_DEPOSIT || $object-&gt;type == Facture::TYPE_PROFORMA || $object-&gt;type == Facture::TYPE_BOLETA || $object-&gt;type == Facture::TYPE_SITUATION) &amp;&amp; (! empty($conf-&gt;global-&gt;FACTURE_ENABLE_NEGATIVE) || $object-&gt;total_ttc &gt;= 0)) || ($object-&gt;type == Facture::TYPE_CREDIT_NOTE &amp;&amp; $object-&gt;total_ttc &lt;= 0))) {<\/pre>\n<ul>\n<li>tambi\u00e9n<\/li>\n<\/ul>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">\/\/ Clone\r\n\r\nif (($object-&gt;type == Facture::TYPE_STANDARD || $object-&gt;type == Facture::TYPE_DEPOSIT || $object-&gt;type == Facture::TYPE_PROFORMA || $object-&gt;type == Facture::TYPE_BOLETA) &amp;&amp; $user-&gt;rights-&gt;facture-&gt;creer)\r\n\r\n{<\/pre>\n<ul>\n<li>tambi\u00e9n<\/li>\n<\/ul>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">\/\/ Clone as predefined \/ Create template\r\n\r\nif (($object-&gt;type == Facture::TYPE_STANDARD || $object-&gt;type == Facture::TYPE_DEPOSIT || $object-&gt;type == Facture::TYPE_PROFORMA || $object-&gt;type == Facture::TYPE_BOLETA) &amp;&amp; $object-&gt;statut == 0 &amp;&amp; $user-&gt;rights-&gt;facture-&gt;creer)\r\n\r\n{<\/pre>\n<ul>\n<li>tambi\u00e9n<\/li>\n<\/ul>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">\/\/ Create a credit note\r\n\r\nif (($object-&gt;type == Facture::TYPE_STANDARD || $object-&gt;type == Facture::TYPE_DEPOSIT || $object-&gt;type == Facture::TYPE_PROFORMA || $object-&gt;type == Facture::TYPE_BOLETA) &amp;&amp; $object-&gt;statut &gt; 0 &amp;&amp; $user-&gt;rights-&gt;facture-&gt;creer)\r\n\r\n{<\/pre>\n<ul>\n<li>tambi\u00e9n agregamos las sgtes. l\u00edneas<\/li>\n<\/ul>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">\/\/ Standard invoice\r\n\r\nprint '&lt;div class=\"tagtr listofinvoicetype\"&gt;&lt;div class=\"tagtd listofinvoicetype\"&gt;';\r\n\r\n$tmp='&lt;input type=\"radio\" id=\"radio_standard\" name=\"type\" value=\"0\"' . (GETPOST('type') == 0 ? ' checked' : '') . '&gt; ';\r\n\r\n$desc = $form-&gt;textwithpicto($tmp.$langs-&gt;trans(\"InvoiceStandardAsk\"), $langs-&gt;transnoentities(\"InvoiceStandardDesc\"), 1, 'help', '', 0, 3);\r\n\r\nprint $desc;\r\n\r\nprint '&lt;\/div&gt;&lt;\/div&gt;';\r\n\r\n\r\n\/\/ Boleta\r\n\r\nprint '&lt;div class=\"tagtr listofinvoicetype\"&gt;&lt;div class=\"tagtd listofinvoicetype\"&gt;';\r\n\r\n$tmp='&lt;input type=\"radio\" id=\"radio_boleta\" name=\"type\" value=\"10\"' . (GETPOST('type') == 10 ? ' checked' : '') . '&gt; ';\r\n\r\n$desc = $form-&gt;textwithpicto($tmp.$langs-&gt;trans(\"InvoiceBoletaAsk\"), $langs-&gt;transnoentities(\"InvoiceBoletaDesc\"), 1, 'help', '', 0, 3);\r\n\r\nprint $desc;\r\n\r\nprint '&lt;\/div&gt;&lt;\/div&gt;';<\/pre>\n<ul>\n<li>Agregar la traducci\u00f3n de boleta en el archivo seg\u00fan el idioma del pa\u00eds, en mi caso langs\/es_PE\/bills.php<\/li>\n<\/ul>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">InvoiceBoleta=Boleta est\u00e1ndar\r\nInvoiceBoletaAsk=Boleta est\u00e1ndar\r\nInvoiceBoletaDesc=Este tipo de boleta es la boleta tradicional.<\/pre>\n<ul>\n<li>Hasta aqu\u00ed ya podemos visualizar el nuevo tipo de comprobante boleta cuando queremos registrar una venta para un cliente.<\/li>\n<\/ul>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-1518\" src=\"http:\/\/creativapixel.com\/wp-content\/uploads\/2017\/07\/boleta.png\" alt=\"\" width=\"965\" height=\"368\" srcset=\"https:\/\/creativapixel.com\/blog\/wp-content\/uploads\/2017\/07\/boleta.png 965w, https:\/\/creativapixel.com\/blog\/wp-content\/uploads\/2017\/07\/boleta-300x114.png 300w, https:\/\/creativapixel.com\/blog\/wp-content\/uploads\/2017\/07\/boleta-768x293.png 768w\" sizes=\"auto, (max-width: 965px) 100vw, 965px\" \/><\/p>\n<ul>\n<li>Buscar y agregar la sgte linea de c\u00f3digo en el archivo core\/class\/commoninvoice.class.php<\/li>\n<\/ul>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">\/**\r\n\r\n* Proforma invoice\r\n\r\n*\/\r\n\r\nconst TYPE_PROFORMA = 4;\r\n\r\n\/**\r\n\r\n* Proforma invoice\r\n\r\n*\/\r\n\r\nconst TYPE_BOLETA = 10;<\/pre>\n<ul>\n<li>Tambi\u00e9n<\/li>\n<\/ul>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">function getLibType()\r\n\r\n{\r\n\r\nglobal $langs;\r\n\r\nif ($this-&gt;type == CommonInvoice::TYPE_STANDARD) return $langs-&gt;trans(\"InvoiceStandard\");\r\n\r\nif ($this-&gt;type == CommonInvoice::TYPE_REPLACEMENT) return $langs-&gt;trans(\"InvoiceReplacement\");\r\n\r\nif ($this-&gt;type == CommonInvoice::TYPE_CREDIT_NOTE) return $langs-&gt;trans(\"InvoiceAvoir\");\r\n\r\nif ($this-&gt;type == CommonInvoice::TYPE_DEPOSIT) return $langs-&gt;trans(\"InvoiceDeposit\");\r\n\r\nif ($this-&gt;type == CommonInvoice::TYPE_PROFORMA) return $langs-&gt;trans(\"InvoiceProForma\");           \/\/ Not used.\r\n\r\nif ($this-&gt;type == CommonInvoice::TYPE_SITUATION) return $langs-&gt;trans(\"InvoiceSituation\");\r\n\r\nif ($this-&gt;type == CommonInvoice::TYPE_BOLETA) return $langs-&gt;trans(\"InvoiceBoleta\"); \/\/boleta\r\n\r\nreturn $langs-&gt;trans(\"Unknown\");\r\n\r\n}<\/pre>\n<ul>\n<li>En el archivo compta\/paiement.php buscar las l\u00edneas sgtes y agregar el tipo de c\u00f3digo que tendr\u00e1 en este caso la boleta<\/li>\n<\/ul>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">if ($facture-&gt;type != 2)\r\n\r\n{\r\n\/\/agregamos 10 como id de boleta\r\n$sql .= ' AND type IN (0,1,3,5,10)';           \/\/ Standard invoice, replacement, deposit, situation\r\n\r\n}\r\n\r\nelse\r\n\r\n{\r\n\r\n$sql .= ' AND type = 2';                  \/\/ If paying back a credit note, we show all credit notes\r\n\r\n}\r\n\r\n<\/pre>\n<ul>\n<li>En el archivo paiement.class.php buscar las l\u00edneas y agregar:<\/li>\n<\/ul>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">\/\/Invoice types that are eligible for changing status to paid\r\n\r\n$affected_types = array(\r\n\r\nFacture::TYPE_STANDARD,\r\n\r\nFacture::TYPE_REPLACEMENT,\r\n\r\nFacture::TYPE_CREDIT_NOTE,\r\n\r\nFacture::TYPE_DEPOSIT,\r\n\r\nFacture::TYPE_SITUATION,\r\n\r\nFacture::TYPE_BOLETA \/\/boleta\r\n\r\n);<\/pre>\n<ul>\n<li>Ahora ya podemos grabar nuestra boleta. En el ejemplo de pruebas tengo facturas, boletas y comprobantes por validar.<\/li>\n<\/ul>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-1519\" src=\"http:\/\/creativapixel.com\/wp-content\/uploads\/2017\/07\/listado.png\" alt=\"\" width=\"1159\" height=\"364\" srcset=\"https:\/\/creativapixel.com\/blog\/wp-content\/uploads\/2017\/07\/listado.png 1159w, https:\/\/creativapixel.com\/blog\/wp-content\/uploads\/2017\/07\/listado-300x94.png 300w, https:\/\/creativapixel.com\/blog\/wp-content\/uploads\/2017\/07\/listado-768x241.png 768w, https:\/\/creativapixel.com\/blog\/wp-content\/uploads\/2017\/07\/listado-1024x322.png 1024w\" sizes=\"auto, (max-width: 1159px) 100vw, 1159px\" \/><\/p>\n<ul>\n<li>Podemos visualizar el tipo de comprobante boleta con sus pagos<\/li>\n<\/ul>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-1520\" src=\"http:\/\/creativapixel.com\/wp-content\/uploads\/2017\/07\/boleta_edit.png\" alt=\"\" width=\"1179\" height=\"634\" srcset=\"https:\/\/creativapixel.com\/blog\/wp-content\/uploads\/2017\/07\/boleta_edit.png 1179w, https:\/\/creativapixel.com\/blog\/wp-content\/uploads\/2017\/07\/boleta_edit-300x161.png 300w, https:\/\/creativapixel.com\/blog\/wp-content\/uploads\/2017\/07\/boleta_edit-768x413.png 768w, https:\/\/creativapixel.com\/blog\/wp-content\/uploads\/2017\/07\/boleta_edit-1024x551.png 1024w\" sizes=\"auto, (max-width: 1179px) 100vw, 1179px\" \/><\/p>\n<p>Servidos!!!!<\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Una funcionalidad que no trae Dolibarr es crear otro tipo de comprobante adem\u00e1s de la factura est\u00e1ndar. En nuestro caso aqu\u00ed en Per\u00fa usamos Factura y Boleta. Boleta es el &#8230;<\/p>\n","protected":false},"author":1,"featured_media":1522,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[37,25],"tags":[28,27,26],"class_list":["post-1501","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-dolibarr","category-software-erp","tag-boleta-dolibarr","tag-dolibarr","tag-implementacion-de-erp"],"_links":{"self":[{"href":"https:\/\/creativapixel.com\/blog\/wp-json\/wp\/v2\/posts\/1501","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/creativapixel.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/creativapixel.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/creativapixel.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/creativapixel.com\/blog\/wp-json\/wp\/v2\/comments?post=1501"}],"version-history":[{"count":15,"href":"https:\/\/creativapixel.com\/blog\/wp-json\/wp\/v2\/posts\/1501\/revisions"}],"predecessor-version":[{"id":2273,"href":"https:\/\/creativapixel.com\/blog\/wp-json\/wp\/v2\/posts\/1501\/revisions\/2273"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/creativapixel.com\/blog\/wp-json\/wp\/v2\/media\/1522"}],"wp:attachment":[{"href":"https:\/\/creativapixel.com\/blog\/wp-json\/wp\/v2\/media?parent=1501"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/creativapixel.com\/blog\/wp-json\/wp\/v2\/categories?post=1501"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/creativapixel.com\/blog\/wp-json\/wp\/v2\/tags?post=1501"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}