Categories
Dolibarr Open Source

A Free Dolibarr Module for Fixed Multi-Currency Pricing (With Deviation Warnings)

If you sell in more than one currency and publish fixed prices in each — think MSRP lists, dealer catalogs, or B2B price sheets — you’ve probably noticed that Dolibarr’s native multi-currency module doesn’t quite account for this. It’s built around a conversion model: set your base price, apply an exchange rate, and the foreign-currency number falls where the math lands.

That works for a lot of businesses. But not for ones that set deliberate, stable prices in each market.

I built a module to bridge that gap. It’s free, open source, and available now.

GitHub: zacharymelo/doli-multicurrency-fixedprice


The Gap in Native Multi-Currency

Dolibarr’s multi-currency module is solid for what it does. You enable currencies, set or auto-update exchange rates, and your invoices, proposals, and orders render in the correct denomination. The conversion math is reliable and the dual-currency totals are useful for accounting.

But there’s an assumption baked in: the foreign-currency price is always a derived value. Your base-currency price is the source of truth, the rate is applied, and whatever number comes out the other end is what the customer sees.

For businesses that publish fixed prices across currencies, this creates friction. You don’t want your USD price to wiggle every time the rate updates. You’ve set your number, you’ve printed it in your catalog, and you expect it to show up exactly as entered when your team builds a quote or invoice.

Without a fixed-price mechanism, the options are:

  • Manually override every line item on every foreign-currency document
  • Disable rate auto-updates and accept stale conversion data
  • Maintain a spreadsheet alongside your ERP and hope nobody fat-fingers a number

None of these are real workflows. They’re workarounds — and they introduce exactly the kind of errors an ERP is supposed to prevent.

What This Module Does

Multi-Currency Fixed Prices for MSRP with Deviation Warnings adds a fixed-price table to Dolibarr at the product/variant level. You define the exact price you want for each product in each currency. Then the module handles the rest.

Fixed price insertion via back-calculation

When a product is added to an invoice, proposal, or sales order in a foreign currency, the module looks up the fixed price for that currency. Rather than overriding the multi-currency system, it works with it — back-calculating what the base-currency unit price needs to be so that Dolibarr’s own conversion logic arrives at your intended fixed price.

This means the native multi-currency module stays fully active. Your documents still show proper dual-currency totals. Your accounting data stays consistent. The module simply ensures the customer-facing number is the one you deliberately set, not whatever the rate happened to produce that day.

Deviation warnings

Exchange rates move. Your fixed prices don’t (until you decide to update them). Over time, the gap between what the rate would calculate and what you’ve fixed can grow — and at some point, it matters.

The module includes a configurable deviation threshold. Set it to whatever tolerance makes sense for your business — 3%, 5%, 10%. When a user adds a product to a document and the spread between the rate-calculated price and the fixed price exceeds that threshold, a native Dolibarr alert fires in the interface.

This doesn’t block the action or force a price change. It surfaces the information contextually, right when someone is working with that product, so your team can make an informed decision about whether it’s time to revisit pricing.

What It Doesn’t Do

A few deliberate boundaries:

  • It doesn’t modify the core multi-currency module. This is a standalone module that hooks into Dolibarr’s existing event and object system. No core patches, no forked files.
  • It doesn’t automate price adjustments. The deviation warning tells you there’s drift. Acting on it is a business decision.
  • It doesn’t replace rate tracking. You still want live or regularly updated rates for accounting accuracy. This module just decouples the customer-facing price from the rate-derived price.

Who This Is For

Any Dolibarr user who:

  • Publishes product prices in more than one currency
  • Needs those prices to stay fixed regardless of rate fluctuations
  • Wants to monitor when rates drift far enough from fixed prices to warrant a review
  • Sells B2B with price lists, catalogs, or distributor agreements where price stability matters

The common thread is businesses operating across currency borders where the customer expectation is a known, stable number — not a live-calculated conversion.

Installation

Drop it into your Dolibarr custom directory, enable it in the module list, and configure your fixed prices and deviation threshold in the module’s setup page. It works alongside the native multi-currency module with no conflicts.

Full details are in the repo: github.com/zacharymelo/doli-multicurrency-fixedprice

Why Free

Dolibarr is open source. The community around it is one of the things that makes it viable for small and mid-sized businesses that can’t justify the cost of a proprietary ERP. This module scratches an itch I had, and the problem is generic enough that it’ll be useful to others. Releasing it free felt like the right move.

If you’re using it and find issues or have ideas, open a GitHub issue or drop a note on the Dolibarr forum thread. I’d also love to see fixed multi-currency pricing become a native feature someday — the UX patterns are already there in Dolibarr’s product and currency screens, and extending the data model to support per-currency fixed prices feels like a natural evolution.

Categories
Dolibarr Open Source Tutorials

Fix: Dolibarr Multi-Currency Module “invalid_access_key” Error on v22

If you’re running Dolibarr v22 and your Multi-Currency Module suddenly stopped syncing exchange rates — throwing an invalid_access_key error from CurrencyLayer — you’re not alone. The fix takes about 30 seconds.

The Problem

CurrencyLayer migrated their API infrastructure to a new domain under APILayer, but Dolibarr v22’s default endpoint URL still points to the old one. The result: your API key is perfectly valid, but the legacy endpoint no longer recognizes it.

Here’s the error you’ll see when testing the connection or when your scheduled CRON job tries to sync rates:

{
  "success": false,
  "error": {
    "code": 101,
    "type": "invalid_access_key",
    "info": "You have not supplied a valid API Access Key. [Technical Support: support@apilayer.com]"
  }
}

This is misleading — your key isn’t actually invalid. It just needs to be sent to the right place.

The Fix

Navigate to Setup → Modules/Applications → Multi-Currency, or go directly to:

/admin/multicurrency.php

Find the API endpoint URL field. It will contain the old default:

https://api.currencylayer.com/live?access_key=__MULTICURRENCY_APP_KEY__&source=__MULTICURRENCY_APP_SOURCE__

Replace it with CurrencyLayer’s current endpoint:

https://api.apilayer.com/currency_data/live?base=__MULTICURRENCY_APP_SOURCE__

Note two changes here:

  1. The domain moved from api.currencylayer.com to api.apilayer.com/currency_data
  2. The source parameter was renamed to base, and the access_key parameter is no longer passed in the URL (it’s handled differently by the new endpoint)

Hit save, then use the manual sync button to confirm rates pull correctly before relying on your CRON job again.

Will This Be Fixed in Future Versions?

I believe this will be addressed in Dolibarr v23, but if you’re running v22.0.x and don’t plan to upgrade immediately, this manual endpoint change gets you back up and running right away.

I originally posted this fix on the Dolibarr international forum — check the thread there for any additional community discussion or updates.

Quick Checklist

  • Go to /admin/multicurrency.php
  • Update the API endpoint URL to the new api.apilayer.com domain
  • Test with the manual sync button
  • Confirm your CRON job runs clean on the next scheduled cycle

That’s it. Thirty seconds and your multi-currency rates are flowing again.

Categories
Uncategorized

Open-Source Dolibarr Modules for Customer Product Lifecycle Management

I’ve taken full advantage of having Anthropic’s Claude Code tool. With it, I built a suite of three interconnected Dolibarr modules that give small manufacturers and distributors a complete view of the customer product lifecycle — from delivery to return to warranty resolution. We’re using it at DPG Supply to keep track of hardware out in the field.

All three are open-source, built for Dolibarr 16+, and designed to work together seamlessly.


Customer Inventory

What it does: Adds a dedicated tab to every customer’s third-party card showing every product and service they’ve ever received — pulled from shipments, invoices, and sales orders into a single, unified view.

Key features:

  • Four viewing modes: flat list, grouped by sales order, by invoice, or by product
  • Serial number and lot tracking from shipment batches
  • Sortable columns with pagination
  • When paired with the Customer Returns module, automatically calculates net quantities (shipped minus returned) and shows return status per item

No new database tables — it’s a read-only aggregation layer over your existing Dolibarr data.

GitHub: zacharymelo/dolibarr-customer-inventory


Customer Returns

What it does: Provides a full return management workflow — create, validate, and close customer merchandise returns with automatic stock movement tracking.

Key features:

  • Draft → Validated → Closed status workflow
  • Automatic stock movements: returned items are re-added to your warehouse inventory on validation
  • Links returns to original shipments for full traceability
  • Serial number tracking on returned items
  • Per-line product detail with quantities, pricing, and warehouse assignment
  • Five-level permission system (read, write, delete, validate, close)

When a return is validated, stock is automatically replenished in the designated warehouse — no manual inventory adjustments needed.

GitHub: zacharymelo/doli-returns


Warranty & RMA Management

What it does: A comprehensive RMA (Return Merchandise Authorization) and warranty system designed for businesses selling serialized equipment. Handles service request intake, warranty coverage tracking, guided troubleshooting, and resolution workflows.

Key features:

  • Service Requests: Full lifecycle from intake to resolution with six resolution types (component shipment, full unit swap, on-site service, and more)
  • Warranty Records: Per-serial-number coverage tied to customers and products, with automatic expiry tracking
  • Auto-Warranty Creation: When a shipment is validated, warranty records can be created automatically for serialized products
  • Guided Troubleshooting: Product-aware diagnostic checklists with multi-session logging
  • Movement Tracking: Carrier and tracking number management for outbound and return shipments within a service case

GitHub: zacharymelo/Dolibarr-Warranties


How They Work Together

These three modules are designed as independent tools that become more powerful in combination. The integration points are lightweight and optional — each module functions on its own, but enabling all three creates a closed loop:

  1. A product ships out. The Warranty module can automatically create a warranty record from a validated shipment. The Customer Inventory module picks up the delivery and displays it on the customer’s card.
  2. A customer reports a problem. A service request is created in the Warranty module, which matches the serial number to the existing warranty for coverage verification and walks your team through troubleshooting.
  3. A return is needed. A Customer Return is created and linked to the service request. When validated, stock is automatically replenished. The Warranty module detects the return and advances the service request status.
  4. The customer’s card stays current. The Customer Inventory tab reflects net quantities — what was shipped minus what was returned — giving your team an accurate picture without manual reconciliation.

All cross-module communication happens through Dolibarr’s native element_element linking table and trigger system. There are no hard dependencies — just graceful enhancements when sibling modules are present.


Getting Started

All three modules require Dolibarr 16.0+ and PHP 7.0+. Install them like any custom module — drop the files into your htdocs/custom/ directory and activate from the module setup page.

Full disclosure, these tools were built with the help of AI coding tools. These modules do not strictly adhere to the Dolibarr module best practices and have not been registered with the Dolibarr foundation yet. I cared more about sharing the work that works for me than modifying the doc file to claim IDs for the modules – you may need to assign new ID for any of the modules to get it to work for you.

Categories
Offtopic Tutorials

Documenting a Success: Clearing SiC Yellowing Post Polish in a Glass Studio

Sometimes a tinkerer needs to accomplish something that literature says requires special lab equipment…

There is very little information online about correcting silicon carbide (SiC) discolouration outside of an industrial laboratory. After some experimentation in our glass studio, we successfully cleared the yellow tint from SiC using a modified atmospheric annealing process. Here is how we did it:

The Problem: Lattice Defects from Overheating during Polishing Turn White Moissanite Yellow

Yellowing in SiC is typically caused when clear or ‘white’ Moissanite gets too warm during faceting or polishing. I believe this was a 6H or 4H stone. To clear these, the material must be heated to a range where the atoms can “reset,” but doing this in open air causes the surface to oxidize and char.

The Custom Setup

We bypassed the need for an industrial vacuum furnace by repurposing high-heat glassblowing tools and cannabis paraphrenalia to create a controlled inert environment:

  • The Chamber: A high-purity quartz banger. Quartz was chosen for its ability to withstand extreme temperatures without cracking or reacting.
  • The Atmosphere: We flowed high-purity Argon through a flow meter into the bottom neck of the banger. We kept the flow very low—just enough to maintain a positive-pressure “blanket” that displaced all oxygen.
  • The Heat: An oxygen/propane glassblowing torch.

The Process

We took multiple tries at heating and cooling the stone. Three times of raising to glowing hot, briefly holding, and then cooling. There’s no way for us to know that those three heats were as good as one big heat – but this is simply what happened and worked in our little setup.

  1. Slow Warm-up: We brought the temperature up gradually to avoid thermal shock.
  2. Visual Heat Management: While we used a thermal camera and a thermocouple to monitor the start, our equipment maxed out at 1000°F. We pushed significantly hotter, using the bright incandescent glow of the crystal as our indicator that we had reached annealing temperatures.
  3. The Reducing Flame: To cool the piece, we used a large, bushy reducing flame. This provided a gentle thermal taper while adding an extra layer of protection against oxidation.
  4. Cycling: We repeated this heat-and-cool cycle three times.

The Result

By the end of the third cycle, the yellowing had completely dissipated. By maintaining a strict Argon environment and controlling the descent with a reducing flame, we achieved laboratory-grade clarity using studio equipment.

With precise atmospheric control and a good “feel” for heat, the yellowing of SiC can be fixed without industrial-scale machinery.


Categories
Marketing Resources Review Software

DoliSMS: Notes After Using It

I recently added the DoliSMS module to a Dolibarr backend to handle SMS for things like invoices, order updates, and payment reminders. It’s been a solid improvement for the people actually using the system.

I’m using it with Twilio, and setup was easy. When I had a couple of questions, Massaoud’s support was fast and straightforward — clear answers, no hand-waving.

The module handles both automated and manual messages, with templates and variables so you’re not rewriting the same texts over and over. One feature that’s been especially useful is the shared SMS inbox. Multiple permitted users can see and respond to messages in one place, which makes SMS usable for a team instead of feeling like a side channel.

From a dev standpoint, the module is clean. The API and provider connectors are simple, and it was easy to hook into existing workflows without fighting it.

It’s still under active development, updates are ongoing, and the code is well commented. Massaoud does great work, communicates clearly, and the module feels fairly priced for what it is.

10/10 — would recommend both the module and the dev.

Categories
3D Print Manufacturing

Universal Mate-N-Lok Install Tool

Tools Make Work Better.

The Stage 2 is a machine that controls oxygen production and storage, that I make and sell through my small business DPG Supply. In our assembly process of the Stage 2, we use a connector called the Universal Mate-N-Lok by TE Connectivity to make field service of our equipment easier.

We use two of these connectors for connecting our compressor, and unloader assembly to the controller via panel mount Mate-N-Lok variants. Installing these connectors is difficult without a tool.

We designed a simple tool for more comfortably installing these connectors. Download and print your own Universal Mate-N-Lok installation tool using this link:

Categories
Glass Stories

How I Help Glass Artists with Making Their Own Oxygen

The Origins of the Stage 2 and DPG Supply

When I first started glassblowing, oxygen was just part of the setup — something you dealt with, not something you really understood. Like most people, I used tanks. They worked well enough at first, but over time they became one of the biggest sources of friction in my studio. Running out mid-session, planning work around refills, inconsistent pressure — it all quietly shaped how and when I worked.

Categories
Glass Quick Tips

Bistabil Joints – What does it mean? Where did the name come from? About Glass Series

A preview of content to be found on https://dpgsupply.com – my glassblowing tools business website.

The term “Bistabil” in the context of glassware refers to a specific type of ground glass joint characterized by thicker walls on both the inner and outer surfaces of the grinding area. This design enhances the joint’s durability and stability, making it suitable for applications requiring robust connections.

Origin and Usage

Characteristics of Bistabil Joints

  • Heavy-Wall Construction: These joints are manufactured using thicker tubing, resulting in increased wall thickness compared to standard joints. This construction provides enhanced mechanical strength and resistance to thermal stress. (ACCUGRIND (PRECISION) GROUND GLASS JOINTS)
  • Enhanced Stability: The increased mass and rigidity of Bistabil joints contribute to a more stable connection between glassware components, reducing the risk of breakage during assembly or use. (1040-HEAVY WALL GROUND MALE (BISTABIL) JOINTS)
  • Standardization: Despite the variations in wall thickness, Bistabil joints maintain standardized taper dimensions (e.g., 14/23, 19/26), ensuring compatibility with other glassware components of the same nominal size . (ACCUGRIND (PRECISION) GROUND GLASS JOINTS)

Applications

Bistabil joints are commonly used in laboratory settings where enhanced durability and stability are required, such as in: (1040-HEAVY WALL GROUND MALE (BISTABIL) JOINTS)

  • High-Temperature Reactions: Their robust construction makes them suitable for processes involving significant thermal cycling.
  • Vacuum Systems: The thicker walls provide better resistance to implosion under reduced pressure conditions.
  • Mechanical Stress Scenarios: They are ideal for setups where joints may experience mechanical strain or need to support heavier apparatus.

In summary, while “Bistabil” began as a proprietary term, it has evolved into a generic descriptor within the glassware industry, signifying ground glass joints with enhanced wall thickness for improved performance in demanding applications.

Categories
Apple Cracks Hacking Quick Tips Resources

A helpful tool for unpacking Mac TTC font families

Moving fonts is simple…

Fonts come packaged in such a way that makes them easy to install. Simply double click to install, or drag and drop into the font manager of your choosing.

Except for when they’re not

Windows will spit out an error when trying to install from a selection of fonts one might find on their Mac. Something like:

"Cannot install Font Name.ttc - The file 'D://Font Name.ttc' does not appear to be a valid font."

This error stumped me for a few minutes, and through a few Google search results. With a bit of digging I found a tool called transfonter that unpacked my Mac fonts and made them work on my Windows machine:

This frustration may be been manufactured…

So, if Microsoft’s Font Validator is right, then I assume Apple did a bad job implementing the specifications. (And maybe even on purpose, to stop distribution of the font to Windows?)

– Arjan
https://superuser.com/a/121746

As one user here explains, it seems that Apple has intentionally broken their fonts to make it difficult to move them onto a Windows machine.

Still looking for the link? It’s here.

Categories
Glass Resources

A Lampworker’s Introduction to Safety in the Glass Studio

This is not an official guide, and the following is offered as a free online article for entertainment purposes only. I accept no responsibility or liability for your actions after reading this text.

You can be seriously injured in almost any workshop

The glass studio can be a very dangerous place, but it doesn’t have to be. With proper respect and care, a lampworker can spend hundreds of hours behind their torch without incident or injury. To ensure such a positive track record, a few rules and guidelines must be adhered to at all times.

The most obvious risk to a lampworker is a burn. I am often asked, “isn’t it hot?” And the short answer is, “yes – very!” Our torches burn a flame many thousands of degrees (1980*c, 3590*f) in temperature. Incidentally, our workspaces, tools, and work can be very hot indeed. Some torches produce so much heat, that they require assistive cooling devices to prevent from overheating and melting themselves.

With all of the hot, dangerous things in our shop – it’s a miracle we aren’t burning ourselves at every turn. There are a few simple techniques to reduce the chances of being injured in the studio.

20 Helpful Safety Tips:

  1. Assume it’s hot! First and foremost, always assume that anything in the studio that could be hot to the touch; is. Most items on your bench, and near to your workspace will absorb radiant heat as you work. This radiant heat can make your bench, tools, materials, and anything else within line-of-sight of your torch flame hot to the touch.

    If you are unsure of whether or not something is hot, use the back of your hand to sense the radiant heat by placing it close but not touching the suspect item. A burn on the back of the hand will restrict work less than one to a fingertip or palm.
  2. Never accept a piece of passed glass overhand! What this means is when someone passes you a piece of glass, always grab below their hand on the handle away from the perceived hot end.
  3. Never catch falling glass! Let the piece fall to the floor or bench, and then pause. It may be necessary to stand back as to prevent the glass falling onto your foot. Grab your nearest pinching tool (tweezers) and use those to pick up the item. Do not panic, do not rush, and do not reflexively dive for the falling work piece.

    A broken piece is better than a burned palm or sliced digit. There are lampworkers who can no longer practice due to injuries sustained from catching falling glass. This is a very serious risk!
  4. Dress appropriately! Your clothing is your second layer of defense, should an accident happen. Your first line of defence is this safety training, use it well and you will not need your clothing to protect you from a burn. Do not dress as if planning on burning yourself.

    Foremost, dress for comfort. Heat stroke and dehydration are very real risks while working behind a torch. Dress for the weather and the workload you will be undertaking. Working in 40* heat while wearing a full mylar suit is a surefire way to black out.

    Proper attire can include:
    1. Approved Safety Glasses 
    2. Close toed shoes
    3. Loose fitting pants that fit over the cuff of your footwear
    4. Short sleeves, or a long sleeved shirt with tight fitting cuffs
    5. Hair ties for long hair
    6. Additional safety equipment like insulating gloves, vambraces, or hoods are worn in specific situations – though not required for most flame work.
  5. Grab tools by their handle! Graphite, and brass tools can absorb a lot of radiant heat as well as hold onto heat absorbed through contact for a long time. Accidentally grabbing a tool by the working end is a fast way to a burn.
  6. Do not force the glass! Glass if fragile, and using too much force can and will break glass in your hand. Be patient and allow for the heat base to soak into the glass before trying to make it move.
  7. Melt stringers and spikes back into balls! If you pull a thin thread of glass, or create a spike – take another second to melt the string back down into a ball. Thin threads and spikes create a puncture hazard, and can even break further when inside the body.
  8. Bubbles should melt – not pop! If you are blowing a bubble, stop before it becomes paper thin. When thin, the glass is weak and can pop under the pressure of your lungs. This wafer thin glass is light, and floats on the air. It’s colloquially known as bubble trash, and is an unnecessary respiratory hazard. If you blow your glass too thin, put it back into the flame to gather before popping the bubble within the flame.
  9. P before O or up you go! When lighting your torch, begin by opening your gas valve slightly and igniting a pilot flame. Only when this pilot flame is burning, should you introduce oxygen. Doing so in the opposite order can create explosive conditions and is very dangerous. The obverse is true as well: when shutting off your torch, shut off your oxygen before your gas.

    A handy acronym for remembering the on/off order is P.O.O.P. – Propane, Oxygen, Oxygen, Propane
  10. Install Flashback Arrestors! Flashback arrestors prevent a dangerous situation wherein the flame moves backwards into the torch and through the gas lines creating an explosion within the lines. 
  11. Ventilate your workspace! Our flames and the fumes from melting glass can be harmful in both the long and short term. Ensure adequate air exchange to prevent exposure to these harmful gasses.
  12. Keep tanks outside! Unused tanks of compressed gas should be stored away from open flame, and out of doors in an easily accessed area. In the event of fire, it poses a great risk to firefighters and anyone within the building to have compressed explosive gas cylinders inside.
  13. Keep your workspace clear of flammable or combustible materials! Lighters, aerosol cans, wood, and other flammable materials should be kept well away from your torch and work to avoid the risk of an unintended fire.
  14. Keep a fire extinguisher nearby! I hope this needs no further explanation. While glass doesn’t burn, anything flammable it touches while workable can. 
  15. Anneal your work! Leaving stress trapped in glass is a great way to let it break randomly. Annealing releases trapped stress and allows for glass to be used safely.
  16. Do not put glass inside of someone else!* Jewelry, sex toys, and other objects intended for insertion into the human body must be properly annealed and checked with a polariscope! If you do not have access to a kiln, and a polariscope – DO NOT MAKE SEX TOYS OR ANY OBJECT FOR INSERTION INTO A HUMAN!
  17. Stretch! Take it easy! This is exercise and involves many repetitive motions. Warm up before you begin, and take many breaks along the way. It’s easy to injure yourself, or spur along a strain related injury by lampworking. Listen to your body, and take care of yourself. 
  18. On inhaling: glass blowers often puff air into a hollow vessel to expand its walls. It’s also possible to contract the walls of the vessel in much the same way. Suction should only be applied in situations where the risk of pulling hot vapor or fumes into your mouth is negligible. 
  19. On treating a burn: Stop lampworking immediately. Glass burns can be terrible, but are often less severe than a similar sized burn from metal or another material. Glass being a poor insulator can save you from a more serious burn if quick action is taken.

    Treat burn wounds quickly as directed by a healthcare professional.
  20. Keep a first aid kit on hand. Cuts, burns, scrapes, and other injuries can almost all be addressed by the contents of a standard first aid kit. Keep one on hand in case of emergency.

There are more rules and guidelines that can help you in the shop, but I’ve just not thought of them yet – if I’ve missed something obvious to you, leave a comment and help me improve this article!