Factuarea APIDevelopers
Afegit

Unitats comptades, pes per peces i substitució per canvi d'unitat base

Ven en paquets, caixes o peces un producte mesurat en quilos o litres, registra les peces a les línies de pes variable, substitueix un producte per un altre amb una altra unitat base amb vista prèvia i execució irreversible, i llegeix la unitat real a FacturaE i UBL. Dues operacions noves, dues tools MCP, l'esdeveniment product.replaced i camps nous a productes i línies de document.

15 d'octubre de 2026 — Un producte mesurat en quilos, litres o metres ara es pot vendre en unitats comptades com paquets, caixes o peces, i un producte que ja té historial pot canviar d'unitat base substituint-lo per un de nou. Tot és additiu: cap camp existent canvia de significat.

Unitats comptades

Hi ha 22 codis d'unitat en total: 9 unitats de mesura i 13 unitats comptades.

ClasseUnitats (codi UN/ECE)On es poden fer servir
Mesuraunitat C62, quilogram KGM, gram GRM, litre LTR, mil·lilitre MLT, metre MTR, metre quadrat MTK, hora HUR, dia DAYUnitat base, presentacions, ofertes de proveïdor, tarifes i línies de document
Comptadapeça H87, paquet XPK, caixa XBX, safata XDS, bossa XBG, ampolla XBO, garrafa XDJ, llauna XCA, tarrina XTB, pot XCI, bidó XJY, sobre XEN, estoig XCSPresentacions, ofertes de proveïdor, tarifes i línies de document

base_unit només admet les 9 unitats de mesura; les unitats comptades són unitats comercials.

  • Presentacions i ofertes de proveïdor. Una presentació fixa en una unitat comptada pot recolzar-se en una base mesurada si declara la seva equivalència (conversion_factor o nominal_base_quantity): «1 paquet = 0,5 kg». Una unitat de mesura ha de pertànyer a la mateixa família que la base. Una presentació o una oferta la unitat de la qual no es pot expressar sobre la unitat base del producte es rebutja amb 422 unit_not_expressible.
  • Pes per peces. Una presentació de pes variable la unitat de la qual és una unitat comptada accepta a counted_quantity les peces que va demanar el client. La línia es continua cobrant, i l'estoc es continua descomptant, per quantity, el pes real en la unitat base; les peces són informatives.
  • Documents. Les línies de factura, pressupost, proforma, albarà i factura recurrent porten counted_quantity i counted_unit, tots dos null quan la línia no té peces comptades. L'editor, el PDF, el tiquet i l'enllaç públic mostren «4 paquets = 2 kg» o «3 peces · 1,520 kg × 4,55 €/kg».
  • FacturaE i UBL. FacturaE declara el UnitOfMeasure real de cada línia i UBL envia el seu unitCode UN/ECE real.

Substitució per canvi d'unitat base

La unitat base d'un producte amb historial (estoc, moviments, presentacions, ofertes de proveïdor o variants amb estoc) no s'edita al lloc. El producte ho indica ara a base_unit_change, i el canvi es fa substituint el producte per un de nou.

  • Vista prèvia de la substitució per canvi d'unitat base calcula, sense escriure res, el pla i un impact_token que confirma aquest pla exacte. Envies la unitat base nova (target_base_unit, una de les 9 unitats de mesura), l'equivalence entre ambdues unitats, un base_price opcional i una decisió keep o retire per presentació.
  • Substituir un producte canviant la seva unitat base l'executa i respon 201 amb el producte nou. És irreversible, així que Idempotency-Key és obligatòria. L'estoc, les presentacions que conserves, les variants, les ofertes de proveïdor, les entrades de tarifa i els components de pack passen al producte nou, convertits a la seva unitat. El producte anterior es desactiva, conserva tot el seu historial i no es pot reactivar mai. No consumeix quota del pla.
  • Si la conversió perd precisió o no hi ha equivalència, cal confirmar base_price (422 base_unit_replacement_price_confirmation_required). Si el catàleg, les tarifes o els packs canvien després de la vista prèvia, la confirmació es rebutja amb 422 base_unit_replacement_preview_stale i es demana una vista prèvia nova.
  • Els altres rebuigs de la substitució són 422 business_rule_violation amb subcodi product_already_replaced, base_unit_replacement_conversion_unavailable o base_unit_replacement_blocked_by_packs, i 422 parameter_invalid_value amb subcodi base_unit_replacement_same_unit (el destí ja és la unitat base del producte), base_unit_replacement_equivalence_invalid o base_unit_replacement_decision_invalid.
  • L'equivalence és el nombre d'unitats de la base actual que equivalen a una unitat de la nova. És obligatòria entre una unitat de recompte i una de mesura, en qualsevol sentit; dins de la mateixa família de mesura es calcula sola, i entre dues famílies de mesura diferents no existeix.
  • Un producte que participa en una substitució, com a producte anterior o com a nou, no es pot eliminar: Elimina un producte i Elimina diversos productes de forma massiva responen 422 amb subcodi product_in_base_unit_replacement, i a l'operació en bloc el producte figura a failed[] amb aquest motiu. Les tools MCP delete_product i bulk_delete_products apliquen la mateixa regla.
  • Editar base_unit en un producte el base_unit_change.mode del qual és replacement respon 422 business_rule_violation amb subcodi product_base_unit_locked.

Camps, esdeveniments i MCP

  • Producte. base_unit_change (mode i els blockers quantificats), replaces i replaced_by (id, name, base_unit, replaced_at, equivalence i stock_transferred). Es retornen en les lectures d'un sol producte i s'ometen als llistats.
  • Esdeveniment. product.replaced es publica amb el producte nou com a objecte. Consulta Esdeveniments.
  • Moviments d'estoc. Els motius base_unit_replacement_out i base_unit_replacement_in i l'origen base_unit_replacement registren el traspàs entre ambdós productes.
  • Tarifes. El motiu de retirada product_replaced identifica les entrades del producte substituït.
  • MCP. Dues tools noves, preview_product_base_unit_replacement i replace_product_base_unit, totes dues amb l'scope products:write; la segona és irreversible i accepta idempotency_key. Consulta el catàleg de tools.

Els components d'un pack no admeten peces: components.*.counted_quantity respon 422 si arriba amb valor, perquè les peces pertanyen a les línies dels documents de venda.

Les operacions que llegeixen o escriuen productes, presentacions, ofertes de proveïdor, tarifes i documents de venda conserven els seus scopes, i les seves respostes i cossos incorporen els camps i codis d'unitat descrits.

Nous endpoints2

EndpointDescripció
POST/v1/products/{product}/base_unit_replacement/previewVista prèvia de la substitució per canvi d'unitat base
POST/v1/products/{product}/base_unit_replacementSubstituir un producte canviant la seva unitat base

Endpoints actualitzats103

EndpointDescripció
POST/v1/proformas/{proforma}/acceptAcceptar una proforma
POST/v1/quotes/{quote}/acceptAcceptar un pressupost
POST/v1/recurring_invoices/{recurring_invoice}/activateActivar factura recurrent
POST/v1/invoices/{invoice}/annulAnul·lar una factura
POST/v1/invoices/{invoice}/assign-real-numberAssignar un número de factura real
POST/v1/delivery_notes/{delivery_note}/cancelAnul·lar un albarà
POST/v1/recurring_invoices/{recurring_invoice}/cancelAnul·lar factura recurrent
POST/v1/delivery_notes/{delivery_note}/convertConvertir albarà en factura
POST/v1/proformas/{proforma}/convertConvertir proforma en factura
POST/v1/quotes/{quote}/convertConvertir pressupost en factura
POST/v1/invoices/{invoice}/correctiveGenerar factura rectificativa
POST/v1/delivery_notesCrear un albarà
GET/v1/delivery_notesLlistar tots els albarans
POST/v1/invoicesCrea una factura
GET/v1/invoicesLlistar totes les factures
POST/v1/price-listsCrear una tarifa
GET/v1/price-listsLlistar tarifes
POST/v1/productsCrear un producte
GET/v1/productsLlistar tots els productes
POST/v1/products/{product}/presentationsCrear una presentació de producte
GET/v1/products/{product}/presentationsLlistar presentacions de producte
POST/v1/proformasCrea una proforma
GET/v1/proformasLlistar totes les proformes
POST/v1/purchase_invoicesCrea una despesa
POST/v1/quotesCrea un pressupost
GET/v1/quotesLlistar tots els pressupostos
POST/v1/invoices/{invoice}/create-recurringCrear una factura recurrent a partir d'una factura
POST/v1/recurring_invoicesCrea una factura recurrent
GET/v1/recurring_invoicesLlistar totes les factures recurrents
POST/v1/products/{product}/supplier-offersCrear una oferta de proveïdor
GET/v1/products/{product}/supplier-offersLlistar ofertes de proveïdor
POST/v1/webhook_endpointsCrea un webhook endpoint
GET/v1/webhook_endpointsLlistar tots els webhook endpoints
GET/v1/delivery_notes/{delivery_note}Obtenir un albarà
PUT/v1/delivery_notes/{delivery_note}Actualitzar un albarà
GET/v1/invoices/{invoice}Recupera una factura
PUT/v1/invoices/{invoice}Actualitzar una factura
GET/v1/price-lists/{priceList}Consultar una tarifa
PUT/v1/price-lists/{priceList}Actualitzar una tarifa
GET/v1/products/{product}Obtenir un producte
PUT/v1/products/{product}Actualitzar un producte
DEL/v1/products/{product}Elimina un producte
POST/v1/products/bulk-deleteElimina diversos productes de forma massiva
PUT/v1/products/{product}/presentations/{presentation}Actualitzar una presentació de producte
POST/v1/products/{product}/videoPuja un vídeo a un producte
GET/v1/proformas/{proforma}Obtenir una proforma
PUT/v1/proformas/{proforma}Actualitzar una proforma
PUT/v1/purchase_invoices/{purchase_invoice}Actualitzar una despesa
GET/v1/quotes/{quote}Obtenir un pressupost
PUT/v1/quotes/{quote}Actualitzar un pressupost
GET/v1/recurring_invoices/{recurring_invoice}Obtenir una factura recurrent
PUT/v1/recurring_invoices/{recurring_invoice}Actualitzar una factura recurrent
PUT/v1/products/{product}/supplier-offers/{offer}Actualitzar una oferta de proveïdor
GET/v1/webhook_endpoints/{webhook_endpoint}Obtenir un webhook endpoint
PUT/v1/webhook_endpoints/{webhook_endpoint}Actualitzar un webhook endpoint
POST/v1/delivery_notes/{delivery_note}/duplicateDuplicar un albarà
POST/v1/invoices/{invoice}/duplicateDuplicar una factura
POST/v1/proformas/{proforma}/duplicateDuplicar una proforma
POST/v1/quotes/{quote}/duplicateDuplicar un pressupost
POST/v1/delivery_notes/find-by-external-idCercar un albarà per external ID
POST/v1/invoices/find-by-external-idCercar una factura per external ID
POST/v1/invoices/find-by-numberCercar una factura per número
POST/v1/products/find-by-external-idCercar un producte per external ID
POST/v1/products/find-by-skuCercar un producte per SKU
POST/v1/proformas/find-by-external-idCercar una proforma per external ID
POST/v1/quotes/find-by-external-idCercar un pressupost per external ID
POST/v1/recurring_invoices/find-by-external-idCercar una factura recurrent per external ID
GET/v1/products/low-stock-reportLlista els productes per sota del llindar d'stock
POST/v1/invoices/{invoice}/issueEmet una factura
GET/v1/eventsLlistar tots els esdeveniments
GET/v1/invoices/{invoice}/correctivesLlistar factures rectificatives
GET/v1/price-lists/{priceList}/itemsLlistar ítems de tarifa
POST/v1/price-lists/{priceList}/itemsFer upsert d’un ítem de tarifa
GET/v1/price-lists/optionsLlistar opcions de tarifes actives
GET/v1/products/{product}/stock-movementsLlistar moviments d'estoc d'un producte
GET/v1/webhook_endpoints/{webhook_endpoint}/deliveriesLlista les entregues de webhook
POST/v1/delivery_notes/{delivery_note}/mark-deliveredMarca l'albarà com a lliurat
POST/v1/invoices/{invoice}/mark-paidMarca la factura com a pagada
POST/v1/invoices/{invoice}/mark-sentMarca una factura com a enviada
POST/v1/recurring_invoices/{recurring_invoice}/pausePausar factura recurrent
POST/v1/price-lists/{priceList}/items/{item}/reassignReassignar una entrada de tarifa retirada
POST/v1/proformas/{proforma}/rejectRebutjar una proforma
POST/v1/quotes/{quote}/rejectRebutjar un pressupost
PATCH/v1/invoices/{invoice}/rescheduleReprogramar una factura
POST/v1/recurring_invoices/{recurring_invoice}/resumeReprendre factura recurrent
POST/v1/webhook_endpoints/{webhook_endpoint}/rotate_secretRota el secret del webhook
POST/v1/invoices/{invoice}/scheduleProgramar una factura
GET/v1/products/searchCerca productes
POST/v1/invoices/{invoice}/sendEnvia la factura per email
POST/v1/proformas/{proforma}/sendEnvia la proforma per email
POST/v1/quotes/{quote}/sendEnvia el pressupost per email
POST/v1/webhook_endpoints/{webhook_endpoint}/test_eventEnviar un esdeveniment de prova
POST/v1/products/{product}/supplier-offers/{offer}/preferredEstablir l’oferta de proveïdor preferida
GET/v1/events/{event}Obtenir un esdeveniment
GET/v1/webhook_endpoints/{webhook_endpoint}/deliveries/{delivery}Recupera el lliurament del webhook
POST/v1/delivery_notes/{delivery_note}/signSignar un albarà
POST/v1/recurring_invoices/{recurring_invoice}/skipOmetre la pròxima generació de la factura recurrent
POST/v1/invoices/substitute-simplifiedSubstituir factures simplificades per factura completa
POST/v1/products/{product}/toggle-activeAlternar l'estat actiu del producte
POST/v1/invoices/{invoice}/unscheduleDesprogramar una factura
POST/v1/invoices/{invoice}/unsendAnul·lar l'enviament d'una factura
PUT/v1/products/{product}/stockActualitzar l'stock d'un producte
POST/v1/invoices/{invoice}/voidAnul·lar una factura

En aquesta pàgina

Et donem un cop de mà?Contactar amb suport