PageSourceSearch

https://faturapro-ks.org/assets/inventory-DkrRh204.js

js faturapro-ks.org collected 2026-09-25 14:55:33 UTC 48,798 bytes, 1 lines download raw bytes

1import{ac as H,N as w,s as Z,_ as m,cH as I,bn as B,a7 as K,ad as tt,a4 as Q,a5 as x,a1 as G,cz as et,cI as M}from"./index-CzDHRh-U.js";const p=Z,Y={inventory_products:"inventory-products",inventory_categories:"inventory-categories",inventory_warehouses:"inventory-warehouses",inventory_suppliers:"inventory-suppliers",inventory_lots:"inventory-lots",inventory_counts:"inventory-counts",inventory_count_items:"inventory-count-items",inventory_reservations:"inventory-reservations",inventory_reservation_allocations:"inventory-reservation-allocations",inventory_transfers:"inventory-transfers",inventory_stock_movements:"inventory-stock-movements",inventory_current_stock:"inventory-current-stock"};async function l(e,t){const r=[];for(let a=0;a<100;a+=1){const _=await Q(e,t,{limit:5e3,offset:a*5e3});if(r.push(..._),_.length<5e3)break}if(r.length>0)return r;const i=Y[t];if(!i)return[];const o=await x(e,i);return Array.isArray(o)?o:[]}async function E(e,t,r){const n=Y[t];n&&await K(e,n,r).catch(i=>{console.warn(`[inventory] local snapshot deferred for ${t}:`,i)})}async function S(e,t){const r=new Date().toISOString();for(const n of t){const i={...n.payload,id:n.entityId,company_id:n.payload.company_id||e};await B({companyId:e,entityType:n.entityType,entityId:n.entityId,payload:i,branchId:i.branch_id??null,createdAt:i.created_at||r,updatedAt:i.updated_at||r,cloudUpdatedAt:i.updated_at||i.created_at||r,syncStatus:"synced",syncVersion:Number(i.sync_version||0),originDeviceId:i.origin_device_id||null})}}function z(e){return[...e].sort((t,r)=>{const n=String(t.updated_at||t.created_at||"");return String(r.updated_at||r.created_at||"").localeCompare(n)||String(t.id||"").localeCompare(String(r.id||""))})}function rt(e,t){return e.map(r=>({...r,...Object.fromEntries(Object.entries(t).map(([n,i])=>{const o=`${n==="category"?"category":n}_id`;return[n,r[n]||r[o]&&i[String(r[o])]||null]}))}))}async function W(e){return((await Q(e,"companies",{limit:1}))[0]||(await x(e,"company-context"))?.company)?.inventory_enabled===!0}function R(e,t,r){const n=new Date().toISOString();return{id:t,company_id:e,created_at:n,updated_at:n,deleted_at:null,...r}}async function L(e,t){const r=await l(e,"inventory_products"),n=[t,...r.filter(i=>String(i.id)!==String(t.id))];await K(e,"inventory-products",n,{mirrorReplica:!1}),await B({companyId:e,entityType:"inventory_products",entityId:String(t.id),payload:t,branchId:t.branch_id??null,createdAt:t.created_at,updatedAt:t.updated_at,cloudUpdatedAt:null,syncStatus:"pending",syncVersion:Number(t.sync_version||0),deletedAt:t.deleted_at??null,originDeviceId:t.origin_device_id??null})}function q(e,t=4){const r=String(e??"0").trim();if(!/^-?\d+(?:\.\d+)?$/.test(r))throw new Error(`Sasia dhjetore është e pavlefshme: ${r}`);const n=r.startsWith("-"),i=n?r.slice(1):r,[o,a=""]=i.split(".");if(a.length>t)throw new Error(`Sasia mund të ketë maksimumi ${t} shifra dhjetore.`);const _=BigInt(o)*10n**BigInt(t)+BigInt((a+"0".repeat(t)).slice(0,t)||"0");return n?-_:_}function $(e,t=4){const r=e<0n,n=r?-e:e,i=10n**BigInt(t),o=String(n%i).padStart(t,"0").replace(/0+$/,"");return`${r?"-":""}${n/i}${o?`.${o}`:""}`}function O(e,t){return $(q(e)+q(t))}function nt(e,t){return e==="sale"||e==="transfer_out"?-Math.abs(t):t}async function F(e,t){const r=await x(e,"pos-workspace"),n=await x(e,"inventory-current-stock"),i=Array.isArray(r?.inventoryStock)&&r.inventoryStock.length>0?r.inventoryStock:Array.isArray(n)?n:await l(e,"inventory_current_stock"),o=String(t.product_id),a=String(t.warehouse_id),_=i.map(s=>String(s.product_id)!==o||String(s.warehouse_id)!==a?s:{...s,current_quantity:O(s.current_quantity??0,t.quantity),offline_pending:!0,offline_pending_operation_ids:Array.from(new Set([...Array.isArray(s.offline_pending_operation_ids)?s.offline_pending_operation_ids:[],String(t.operation_id||t.id||"")].filter(Boolean)))});_.some(s=>String(s.product_id)===o&&String(s.warehouse_id)===a)||_.push({product_id:o,warehouse_id:a,current_quantity:String(t.quantity),stock_value:"0",offline_pending:!0,offline_pending_operation_ids:[String(t.operation_id||t.id||"")].filter(
1Boolean)}),await K(e,"inventory-current-stock",_,{mirrorReplica:!1}),r&&await K(e,"pos-workspace",{...r,inventoryStock:_},{mirrorReplica:!1})}async function it(e){const t=await l(e,"inventory_stock_movements"),r=new Map;for(const n of t){const i=String(n.product_id||""),o=String(n.warehouse_id||"");if(!i||!o)continue;const a=`${i}:${o}`,_=r.get(a)||{product_id:i,warehouse_id:o,current_quantity:"0",stock_value:"0"};_.current_quantity=O(_.current_quantity,n.quantity??0);const s=q(n.quantity??0)*q(n.unit_cost??0)/10000n;_.stock_value=O(_.stock_value,$(s)),r.set(a,_)}return[...r.values()]}async function ot(e){const[t,r,n,i]=await Promise.all([M(e,"invoices",{limit:5e3}),M(e,"invoice_items",{limit:5e3}),l(e,"inventory_warehouses"),l(e,"inventory_stock_movements")]),o=new Set(["local","pending","sending","retry","failed"]),a=t.filter(c=>{if(!o.has(String(c.syncStatus||"")))return!1;const f=c.payload||{};return String(f.invoice_type||"standard")==="standard"&&!["draft","cancelled"].includes(String(f.status||""))});if(a.length===0)return[];const _=new Set(a.map(c=>String(c.entityId||c.entity_id||c.payload?.id||""))),s=new Map;for(const c of r){const f=c.payload||{},k=String(f.invoice_id||"");if(!_.has(k))continue;const T=s.get(k)||[];T.push(f),s.set(k,T)}const u=new Set(i.map(c=>String(c.reference_id||c.source_invoice_item_id||"")).filter(Boolean)),y=n.find(c=>c.is_default&&c.is_active!==!1)||n.find(c=>c.is_active!==!1)||null,d=[];for(const c of a){const f=String(c.entityId||c.entity_id||c.payload?.id||""),k=c.payload||{};for(const T of s.get(f)||[]){const N=String(T.inventory_product_id||""),b=String(T.quantity??"0");if(!N||!b||b==="0"||u.has(String(T.id||"")))continue;const A=String(T.warehouse_id||k.warehouse_id||y?.id||"");A&&d.push({invoiceId:f,productId:N,warehouseId:A,quantity:b})}}return d}async function J(e){const t=await x(e,"pos-workspace"),r=await x(e,"inventory-current-stock"),n=Array.isArray(t?.inventoryStock)&&t.inventoryStock.length>0?t.inventoryStock:Array.isArray(r)?r:[],i=await it(e),o=i.length>0?i:n.length>0?n:await l(e,"inventory_current_stock"),a=i.length>0?[]:(await M(e,"inventory_stock_movements",{limit:1e4})).filter(s=>["local","pending","sending","retry","failed"].includes(String(s.syncStatus||""))),_=o.map(s=>({...s}));for(const s of a){const u=s.payload||{},y=String(u.product_id||""),d=String(u.warehouse_id||"");if(!y||!d)continue;const c=String(u.operation_id||u.id||""),f=_.find(k=>String(k.product_id||"")===y&&String(k.warehouse_id||"")===d);if(f){if(c&&Array.isArray(f.offline_pending_operation_ids)&&f.offline_pending_operation_ids.includes(c))continue;f.current_quantity=O(f.current_quantity??0,u.quantity??0),f.offline_pending=!0,f.offline_pending_operation_ids=Array.from(new Set([...Array.isArray(f.offline_pending_operation_ids)?f.offline_pending_operation_ids:[],c].filter(Boolean)))}else _.push({product_id:y,warehouse_id:d,current_quantity:String(u.quantity??0),stock_value:"0",offline_pending:!0,offline_pending_operation_ids:[c].filter(Boolean)})}for(const s of await ot(e)){const u=_.find(d=>String(d.product_id||"")===s.productId&&String(d.warehouse_id||"")===s.warehouseId),y=s.invoiceId;if(u){if(Array.isArray(u.offline_pending_operation_ids)&&u.offline_pending_operation_ids.map(String).includes(y))continue;u.current_quantity=O(u.current_quantity??0,`-${s.quantity}`),u.offline_pending=!0,u.offline_pending_operation_ids=Array.from(new Set([...Array.isArray(u.offline_pending_operation_ids)?u.offline_pending_operation_ids:[],y]))}else _.push({product_id:s.productId,warehouse_id:s.warehouseId,current_quantity:`-${s.quantity}`,stock_value:"0",offline_pending:!0,offline_pending_operation_ids:[y]})}return _}async function X(e,t,r,n){const o=(await J(e)).find(_=>String(_.product_id||"")===t&&String(_.warehouse_id||"")===r&&(!n||String(_.lot_id||"")===n));return o&&o.current_quantity!==void 0&&o.current_quantity!==null?String(o.current_quantity):(await l(e,"inventory_stock_movements")).filter(_=>String(_.product_id||"")===t).filter(_=>String(_.warehouse_id||"")===r).filter(_=>!n||String(_.lot_id||"")===n).reduce((_,s)=>O(_,s.quantity??0),"0")}function at(e,t,r){return t.map(n=>
1({companyId:e,entityType:n.entityType,entityId:n.entityId,payload:{id:n.entityId,...n.payload,company_id:n.payload.company_id||e},createdAt:n.payload.created_at||r,updatedAt:n.payload.updated_at||r,localUpdatedAt:r,syncStatus:"pending"}))}async function U(e){const t=new Date().toISOString();await G([{entity:e.entity,operation:e.payload.action?"update":"create",companyId:e.companyId,entityId:e.entityId,operationId:e.operationId,idempotencyKey:e.idempotencyKey,payload:{companyId:e.companyId,entityId:e.entityId,operationId:e.operationId,idempotencyKey:e.idempotencyKey,...e.payload}}],{replicaRecords:at(e.companyId,e.replicaRows,t),auditEvents:[{entityType:e.auditEntityType,entityId:e.entityId,operation:e.payload.action?"update":"create",eventType:"operation_created",payload:e.payload,idempotencyKey:e.idempotencyKey}]})}async function st(e,t){const[r,n,i]=await Promise.all([l(e,"inventory_products"),l(e,"inventory_lots"),l(e,"inventory_stock_movements")]),o=r.filter(s=>s.is_active!==!1&&s.track_stock!==!1),a=[],_=(s,u)=>{const y=i.filter(d=>String(d.product_id||"")===s).filter(d=>String(d.warehouse_id||"")===t.warehouse_id).filter(d=>u?String(d.lot_id||"")===u:!d.lot_id).reduce((d,c)=>O(d,c.quantity??0),"0");t.include_zero===!1&&Math.abs(Number(y))<=5e-5||a.push({id:crypto.randomUUID(),inventory_product_id:s,warehouse_id:t.warehouse_id,lot_id:u,system_quantity:y,counted_quantity:null,count_notes:null})};for(const s of o){const u=n.filter(d=>String(d.inventory_product_id||"")===String(s.id)&&String(d.warehouse_id||"")===t.warehouse_id);for(const d of u)_(String(s.id),String(d.id));const y=i.some(d=>String(d.product_id||"")===String(s.id)&&String(d.warehouse_id||"")===t.warehouse_id&&!d.lot_id);(u.length===0||y)&&_(String(s.id),null)}return a}
1async function D(e){await tt({entity:e.entity,operation:e.operation,companyId:e.companyId,entityId:e.entityId,payload:{companyId:e.companyId,entityId:e.entityId,id:e.entityId,data:e.data}})}function h(e){if(!e)throw new Error("Kompania mungon.")}function v(e){const t=e?.trim();return t||null}function j(e,t){const r=v(e);if(!r)throw new Error(`${t} është i detyrueshëm.`);return r}function P(e,t,r=4){if(e==null)return e;const n=String(e).trim().replace(",",".");if(!/^(?:\d+(?:\.\d*)?|\.\d+)$/.test(n))throw new Error(`${t} duhet të jetë numër pozitiv.`);if((n.split(".")[1]||"").length>r)throw new Error(`${t} lejon maksimumi ${r} shifra dhjetore.`);return typeof e=="number"?Number(n):n}async function _t(e){if(h(e),w())return{inventory_enabled:await W(e)};const{data:t,error:r}=await p.from("companies").select("id, inventory_enabled").eq("id",e).maybeSingle();if(r){if(m(r))return{inventory_enabled:await W(e)};throw r}return t&&await E(e,"companies",[t]),{inventory_enabled:t?.inventory_enabled===!0}}async function yt(e,t){return h(e),{inventory_enabled:(await et(e,{inventory_enabled:t}))?.inventory_enabled===!0}}async function g(e){const t=await _t(e);if(!t.inventory_enabled)throw new Error("Moduli i inventarit nuk është aktiv për këtë kompani.");return t}async function ct(e,t={}){h(e),await g(e);const r=async a=>{const _=await l(e,"inventory_categories"),s=await l(e,"inventory_suppliers"),u=Object.fromEntries(_.map(d=>[String(d.id),d])),y=Object.fromEntries(s.map(d=>[String(d.id),d]));return rt(z(a.filter(d=>{if(t.categoryId&&String(d.category_id||"")!==t.categoryId||t.status==="active"&&d.is_active!==!0||t.status==="inactive"&&d.is_active===!0)return!1;if(!t.search)return!0;const c=t.search.trim().toLowerCase();return[d.name,d.sku,d.barcode].some(f=>String(f||"").toLowerCase().includes(c))})),{category:u,supplier:y})};if(w())return r(await l(e,"inventory_products"));let n=p.from("inventory_products").select("*, category:inventory_categories(id,name), supplier:inventory_suppliers(id,name)").eq("company_id",e).is("deleted_at",null).order("created_at",{ascending:!1});if(t.categoryId&&(n=n.eq("category_id",t.categoryId)),t.status==="active"&&(n=n.eq("is_active",!0)),t.status==="inactive"&&(n=n.eq("is_active",!1)),t.search){const a=t.search.replace(/[%_]/g,"").trim();a&&(n=n.or(`name.ilike.%${a}%,sku.ilike.%${a}%,barcode.ilike.%${a}%`))}const{data:i,error:o}=await n;if(o){if(m(o))return r(await l(e,"inventory_products"));throw o}return await E(e,"inventory_products",i??[]),i??[]}async function lt(e,t){h(e),await g(e);const r=H({name:t.name,description:t.description,sku:t.sku,barcode:t.barcode,price:t.sale_price??0,purchase_price:t.purchase_price??0,tax_rate:t.vat_rate??18,vat_norm:t.vat_norm,tvsh_norm:t.tvsh_norm,atk_category_code:t.atk_category_code,measurement_unit_code:t.measurement_unit_code,item_type:t.item_type,track_stock:t.track_stock,is_active:t.is_active,fiscal_metadata_review_required:t.fiscal_metadata_review_required}),n={category_id:t.category_id||null,supplier_id:t.supplier_id||null,name:j(t.name,"Emri i produktit"),description:v(t.description),sku:v(t.sku),barcode:v(t.barcode),catalog_product_id:t.catalog_product_id||null,unit:r.measurement_unit_code,purchase_price:r.purchase_price,sale_price:r.price,vat_rate:r.tax_rate,vat_norm:r.vat_norm,tvsh_norm:r.tvsh_norm,atk_category_code:r.atk_category_code,measurement_unit_code:r.measurement_unit_code,item_type:r.item_type,fiscal_metadata_review_required:r.fiscal_metadata_review_required,min_stock_quantity:P(t.min_stock_quantity??0,"Stoku minimal"),track_stock:r.track_stock,allow_negative_stock:t.allow_negative_stock===!0,is_active:t.is_active!==!1},i=t.id||crypto.randomUUID(),o=R(e,i,n);if(w())return await L(e,o),await D({companyId:e,entity:"inventory_product",operation:"create",entityId:i,data:n}),o;try{const{data:a,error:_}=await p.rpc("create_inventory_product_atomic",{p_company_id:e,p_entity_id:i,p_payload:n});if(_)throw _;return a&&await S(e,[{entityType:"inventory_products",entityId:i,payload:a}]),a}catch(a){if(m(a))return await L(e,o),await D({companyId:e,entity:"inventory_product",operation:"create",entityId:i,data:n}),o;throw a}}async function ft(e,t,r){h(e),await g(e);const n=(await l(e,"inventory_products")).find(s=>String(s.id)===t)||null;let i=n;if(!w()){const{data:s,error:u}=await p.from("inventory_products").select("*").eq("company_id",e).eq("id",t).maybeSingle();if(u&&!m(u))throw u;i=s||n}if(!i&&!r.name)throw new Error("Produkti i inventarit nuk u gjet për përditësim canonical.");const o=H({name:r.name??i?.name??"",description:r.description!==void 0?r.description:i?.description,sku:r.sku!==void 0?r.sku:i?.sku,barcode:r.barcode!==void 0?r.barcode:i?.barcode,price:r.sale_price!==void 0?r.sale_price:i?.sale_price??0,purchase_price:r.purchase_price!==void 0?r.purchase_price:i?.purchase_price??0,tax_rate:r.vat_rate!==void 0?r.vat_rate:i?.vat_rate??18,vat_norm:r.vat_norm!==void 0?r.vat_norm:i?.vat_norm,tvsh_norm:r.tvsh_norm!==void 0?r.tvsh_norm:i?.tvsh_norm,atk_category_code:r.atk_category_code!==void 0?r.atk_category_code:i?.atk_category_code,measurement_unit_code:r.measurement_unit_code!==void 0?r.measurement_unit_code:i?.measurement_unit_code,item_type:r.item_type!==void 0?r.item_type:i?.item_type,track_stock:r.track_stock!==void 0?r.track_stock:i?.track_stock,is_active:r.is_active!==void 0?r.is_active:i?.is_active,fiscal_metadata_review_required:r.fiscal_metadata_review_required!==void 0?r.fiscal_metadata_review_required:i?.fiscal_metadata_review_required}),a={category_id:r.category_id!==void 0?r.category_id||null:i?.category_id||null,supplier_id:r.supplier_id!==void 0?r.supplier_id||null:i?.supplier_id||null,name:o.name,description:o.description,sku:o.sku,barcode:o.barcode,catalog_product_id:r.catalog_product_id!==void 0?r.catalog_product_id||null:i?.catalog_product_id||null,unit:o.measurement_unit_code,purchase_price:o.purchase_price,sale_price:o.price,vat_rate:o.tax_rate,vat_norm:o.vat_norm,tvsh_norm:o.tvsh_norm,atk_category_code:o.atk_category_code,measurement_unit_code:o.measurement_unit_code,item_type:o.item_type,fiscal_metadata_review_required:o.fiscal_metadata_review_required,min_stock_quantity:r.min_stock_quantity!==void 0?P(r.min_stock_quantity,"Stoku minimal"):i?.min_stock_quantity??0,track_stock:o.track_stock,allow_negative_stock:r.allow_negative_stock!==void 0?r.allow_negative_stock:i?.allow_negative_stock===!0,is_active:o.is_active},_=async()=>{const s=R(e,t,{...i||{id:t,company_id:e},...a,id:t,company_id:e});return await L(e,s),await D({companyId:e,entity:"inventory_product",operation:"update",entityId:t,data:a}),s};if(w())return _();try{const{data:s,error:u}=await p.rpc("update_inventory_product_atomic",{p_company_id:e,p_entity_id:t,p_patch:a});if(u)throw u;return s&&await S(e,[{entityType:"inventory_products",entityId:t,payload:s}]),s}catch(s){if(m(s))return _();throw s}}async function vt(e){if(h(e),await g(e),w())return z(await l(e,"inventory_categories"));const{data:t,error:r}=await p.from("inventory_categories").select("*").eq("company_id",e).is("deleted_at",null).order("name");if(r){if(m(r))return z(await l(e,"inventory_categories"));throw r}return await E(e,"inventory_categories",t??[]),t??[]}async function pt(e,t){h(e),await g(e);const r={name:j(t.name,"Emri i kategorisë"),description:v(t.description),is_active:t.is_active!==!1},n=t.id||crypto.randomUUID(),i=R(e,n,r);if(w())return await D({companyId:e,entity:"inventory_category",operation:"create",entityId:n,data:r}),i;try{const{data:o,error:a}=await p.rpc("create_inventory_category_atomic",{p_company_id:e,p_entity_id:n,p_payload:r});if(a)throw a;return o&&await S(e,[{entityType:"inventory_categories",entityId:n,payload:o}]),o}catch(o){if(m(o))return await D({companyId:e,entity:"inventory_category",operation:"create",entityId:n,data:r}),i;throw o}}async function wt(e,t,r){h(e),await g(e);const n={};r.name!==void 0&&(n.name=j(r.name,"Emri i kategorisë")),r.description!==void 0&&(n.description=v(r.description)),r.is_active!==void 0&&(n.is_active=r.is_active);const i=async()=>{const o=(await l(e,"inventory_categories")).find(_=>String(_.id)===t)||{id:t,company_id:e},a=R(e,t,{...o,...n,id:t,company_id:e});return await D({companyId:e,entity:"inventory_category",operation:"update",entityId:t,data:n}),a};if(w())return i();try{const{data:o,error:a}=await p.rpc("update_inventory_category_atomic",{p_company_id:e,p_entity_id:t,p_patch:n});if(a)throw a;return o&&await S(e,[{entityType:"inventory_categories",entityId:t,payload:o}]),o}catch(o){if(m(o))return i();throw o}}async function mt(e){h(e),await g(e);const t=async()=>(await l(e,"inventory_warehouses")).filter(r=>r.deleted_at==null).sort((r,n)=>+(n.is_default===!0)-+(r.is_default===!0)||String(r.name||"").localeCompare(String(n.name||"")));if(w())return t();try{const{data:r,error:n}=await p.from("inventory_warehouses").select("*").eq("company_id",e).is("deleted_at",null).order("is_default",{ascending:!1}).order("name");if(n)throw n;return await E(e,"inventory_warehouses",r??[]),r??[]}catch(r){if(m(r))return t();throw r}}async function ht(e,t){h(e),await g(e);const r=t.id||crypto.randomUUID(),n={name:j(t.name,"Emri i depos"),code:j(t.code,"Kodi i depos"),address:v(t.address),is_default:t.is_default===!0,is_active:t.is_active!==!1},i=R(e,r,n),o=async()=>(await D({companyId:e,entity:"inventory_warehouse",operation:"create",entityId:r,data:n}),i);if(w())return o();try{const{data:a,error:_}=await p.rpc("create_inventory_warehouse_atomic",{p_company_id:e,p_entity_id:r,p_payload:n});if(_)throw _;return a&&await S(e,[{entityType:"inventory_warehouses",entityId:r,payload:a}]),a}catch(a){if(m(a))return o();throw a}}async function gt(e,t,r){h(e),await g(e);const n={};r.name!==void 0&&(n.name=j(r.name,"Emri i depos")),r.code!==void 0&&(n.code=j(r.code,"Kodi i depos")),r.address!==void 0&&(n.address=v(r.address)),r.is_default!==void 0&&(n.is_default=r.is_default),r.is_active!==void 0&&(n.is_active=r.is_active);const i=async()=>{const o=(await l(e,"inventory_warehouses")).find(_=>String(_.id)===t)||{id:t,company_id:e},a=R(e,t,{...o,...n,id:t,company_id:e});return await D({companyId:e,entity:"inventory_warehouse",operation:"update",entityId:t,data:n}),a};if(w())return i();try{const{data:o,error:a}=await p.rpc("update_inventory_warehouse_atomic",{p_company_id:e,p_entity_id:t,p_patch:n});if(a)throw a;return o&&await S(e,[{entityType:"inventory_warehouses",entityId:t,payload:o}]),o}catch(o){if(m(o))return i();throw o}}async function St(e){h(e),await g(e);const t=async()=>(await l(e,"inventory_suppliers")).filter(r=>r.deleted_at==null).sort((r,n)=>String(r.name||"").localeCompare(String(n.name||"")));if(w())return t();try{const{data:r,error:n}=await p.from("inventory_suppliers").select("*").eq("company_id",e).is("deleted_at",null).order("name");if(n)throw n;return await E(e,"inventory_suppliers",r??[]),r??[]}catch(r){if(m(r))return t();throw r}}async function kt(e,t){h(e),await g(e);const r=t.id||crypto.randomUUID(),n={name:j(t.name,"Emri i furnitorit"),business_number:v(t.business_number),fiscal_number:v(t.fiscal_number),vat_number:v(t.vat_number),phone:v(t.phone),email:v(t.email),address:v(t.address),is_active:t.is_active!==!1},i=R(e,r,n),o=async()=>(await D({companyId:e,entity:"inventory_supplier",operation:"create",entityId:r,data:n}),i);if(w())return o();try{const{data:a,error:_}=await p.rpc("create_inventory_supplier_atomic",{p_company_id:e,p_entity_id:r,p_payload:n});if(_)throw _;return a&&await S(e,[{entityType:"inventory_suppliers",entityId:r,payload:a}]),a}catch(a){if(m(a))return o();throw a}}async function qt(e,t,r){h(e),await g(e);const n={};r.name!==void 0&&(n.name=j(r.name,"Emri i furnitorit")),r.business_number!==void 0&&(n.business_number=v(r.business_number)),r.fiscal_number!==void 0&&(n.fiscal_number=v(r.fiscal_number)),r.vat_number!==void 0&&(n.vat_number=v(r.vat_number)),r.phone!==void 0&&(n.phone=v(r.phone)),r.email!==void 0&&(n.email=v(r.email)),r.address!==void 0&&(n.address=v(r.address)),r.is_active!==void 0&&(n.is_active=r.is_active);const i=async()=>{const o=(await l(e,"inventory_suppliers")).find(_=>String(_.id)===t)||{id:t,company_id:e},a=R(e,t,{...o,...n,id:t,company_id:e});return await D({companyId:e,entity:"inventory_supplier",operation:"update",entityId:t,data:n}),a};if(w())return i();try{const{data:o,error:a}=await p.rpc("update_inventory_supplier_atomic",{p_company_id:e,p_entity_id:t,p_patch:n});if(a)throw a;return o&&await S(e,[{entityType:"inventory_suppliers",entityId:t,payload:o}]),o}catch(o){if(m(o))return i();throw o}}async function bt(e,t){h(e),await g(e);const r=async()=>{const i=await l(e,"inventory_lots"),o=Object.fromEntries((await l(e,"inventory_products")).map(_=>[String(_.id),_])),a=Object.fromEntries((await l(e,"inventory_warehouses")).map(_=>[String(_.id),_]));return i.filter(_=>_.deleted_at==null&&!0).sort((_,s)=>String(_.expiry_date||"9999-12-31").localeCompare(String(s.expiry_date||"9999-12-31"))||String(_.lot_number||"").localeCompare(String(s.lot_number||""))).map(_=>({..._,product:o[String(_.inventory_product_id)]||null,warehouse:a[Str
1ing(_.warehouse_id)]||null}))};if(w())return r();let n=p.from("inventory_lots").select("*, product:inventory_products(id,name,sku), warehouse:inventory_warehouses(id,name,code)").eq("company_id",e).order("expiry_date",{ascending:!0,nullsFirst:!1}).order("lot_number",{ascending:!0});try{const{data:i,error:o}=await n;if(o)throw o;return await E(e,"inventory_lots",i??[]),i??[]}catch(i){if(m(i))return r();throw i}}async function Et(e,t){if(h(e),await g(e),!t.inventory_product_id||!t.warehouse_id)throw new Error("Produkti dhe depoja janë të detyrueshme.");const r=j(t.lot_number,"Numri i lot-it");if(t.serial_number&&t.serial_number.trim().length>120)throw new Error("Seriali është shumë i gjatë.");const n=t.id||crypto.randomUUID(),i={inventory_product_id:t.inventory_product_id,warehouse_id:t.warehouse_id,lot_number:r,serial_number:v(t.serial_number),expiry_date:t.expiry_date||null},o=R(e,n,i),a=async()=>(await D({companyId:e,entity:"inventory_lot",operation:"create",entityId:n,data:i}),o);if(w())return a();try{const{data:_,error:s}=await p.rpc("create_inventory_lot_atomic",{p_company_id:e,p_entity_id:n,p_payload:i});if(s)throw s;return _&&await S(e,[{entityType:"inventory_lots",entityId:n,payload:_}]),_}catch(_){if(m(_))return a();throw _}}async function Tt(e){h(e),await g(e);const t=async()=>{const r=Object.fromEntries((await l(e,"inventory_warehouses")).map(n=>[String(n.id),n]));return z(await l(e,"inventory_counts")).map(n=>({...n,warehouse:r[String(n.warehouse_id)]||null}))};if(w())return t();try{const{data:r,error:n}=await p.from("inventory_counts").select("*, warehouse:inventory_warehouses(id,name,code)").eq("company_id",e).order("count_date",{ascending:!1}).order("created_at",{ascending:!1});if(n)throw n;return await E(e,"inventory_counts",r??[]),r??[]}catch(r){if(m(r))return t();throw r}}async function Dt(e,t){if(h(e),!t)throw new Error("Inventari fizik mungon.");await g(e);const r=async()=>{const[o,a,_,s]=await Promise.all([l(e,"inventory_count_items"),l(e,"inventory_products"),l(e,"inventory_warehouses"),l(e,"inventory_lots")]),u=f=>Object.fromEntries(f.map(k=>[String(k.id),k])),y=u(a),d=u(_),c=u(s);return o.filter(f=>String(f.count_id)===t).map(f=>({...f,product:y[String(f.inventory_product_id)]||null,warehouse:d[String(f.warehouse_id)]||null,lot:c[String(f.lot_id)]||null}))};if(w())return r();const{data:n,error:i}=await p.from("inventory_count_items").select("*, product:inventory_products(id,name,sku,unit), warehouse:inventory_warehouses(id,name,code), lot:inventory_lots(id,lot_number,serial_number,expiry_date)").eq("company_id",e).eq("count_id",t).order("inventory_product_id",{ascending:!0}).order("lot_id",{ascending:!0,nullsFirst:!0});if(i){if(m(i))return r();throw i}return await E(e,"inventory_count_items",n??[]),n??[]}async function jt(e,t){if(h(e),await g(e),!t.warehouse_id)throw new Error("Depoja e inventarit është e detyrueshme.");if(t.count_date&&!/^\d{4}-\d{2}-\d{2}$/.test(t.count_date))throw new Error("Data e inventarit fizik nuk është e vlefshme.");const r=v(t.idempotency_key)||`inventory-count:${e}:${crypto.randomUUID()}`;if(r.length>200)throw new Error("Idempotency key është shumë e gjatë.");const n=t.id||crypto.randomUUID(),i=await st(e,t),o=new Date().toISOString(),a={id:n,company_id:e,count_number:`IC-${(t.count_date||o.slice(0,10)).replace(/-/g,"")}-${n.replace(/-/g,"").slice(0,8).toUpperCase()}`,warehouse_id:t.warehouse_id,count_date:t.count_date||o.slice(0,10),status:"draft",include_zero:t.include_zero!==!1,idempotency_key:r,notes:v(t.notes),created_by:null,created_at:o,updated_at:o,submitted_by:null,submitted_at:null,approved_by:null,approved_at:null,cancelled_by:null,cancelled_at:null,items:i,offline_pending:!0},_=async()=>(await U({companyId:e,entity:"inventory_count",entityId:n,operationId:n,idempotencyKey:r,payload:{data:a,items:i},replicaRows:[{entityType:"inventory_counts",entityId:n,payload:a},...i.map(s=>({entityType:"inventory_count_items",entityId:s.id,payload:{...s,count_id:n,company_id:e}}))],auditEntityType:"inventory_counts"}),a);if(w())return _();try{const{data:s,error:u}=await p.rpc("create_inventory_count_idempotent",{p_company_id:e,p_count_id:n,p_operation_id:n,p_idempotency_key:r,p_warehouse_id:t.warehouse_id,p_count_date:t.count_date||null,p_include_zero:t.include_zero!==!1,p_notes:v(t.notes),p_items:i});if(u)throw u;const y={...a,...s||{},offline_pending:!1};return await S(e,[{entityType:"inventory_counts",entityId:n,payload:y},...i.map(d=>({entityType:"inventory_count_items",entityId:d.id,payload:{...d,count_id:n,company_id:e}}))]),s}catch(s){if(m(s))return _();throw s}}async function Ut(e,t,r){if(h(e),!t)throw new Error("Inventari fizik mungon.");if(!Array.isArray(r))throw new Error("Rreshtat e numërimit duhet të jenë listë.");const n=r.map(o=>{if(!o.id)throw new Error("Rreshti i numërimit mungon.");if(o.counted_quantity!==null&&(!Number.isFinite(o.counted_quantity)||o.counted_quantity<0))throw new Error("Sasia e numëruar duhet të jetë numër jo-negativ.");return{id:o.id,counted_quantity:o.counted_quantity,count_notes:v(o.count_notes)}});await g(e);const i=async()=>{const o=(await l(e,"inventory_counts")).find(y=>String(y.id)===t),_=(await l(e,"inventory_count_items")).map(y=>{const d=n.find(c=>c.id===y.id);return d?{...y,...d,count_id:t,company_id:e}:y}),s={...o||{id:t,company_id:e,status:"draft"},status:o?.status==="draft"?"in_progress":o?.status||"in_progress",updated_at:new Date().toISOString(),items:_,offline_pending:!0},u=crypto.randomUUID();return await U({companyId:e,entity:"inventory_count",entityId:t,operationId:u,idempotencyKey:`inventory-count-record:${t}:${u}`,payload:{action:"record",countId:t,data:s,items:n},replicaRows:[{entityType:"inventory_counts",entityId:t,payload:s},..._.map(y=>({entityType:"inventory_count_items",entityId:y.id,payload:y}))],auditEntityType:"inventory_counts"}),s};if(w())return i();try{const{data:o,error:a}=await p.rpc("record_inventory_count",{p_company_id:e,p_count_id:t,p_items:n});if(a)throw a;const _=(await l(e,"inventory_counts")).find(s=>String(s.id)===t);return o&&await S(e,[{entityType:"inventory_counts",entityId:t,payload:{..._||{},...o,offline_pending:!1}},...n.map(s=>({entityType:"inventory_count_items",entityId:s.id,payload:{...s,count_id:t,company_id:e}}))]),o}catch(o){if(m(o))return i();throw o}}async function Rt(e,t){if(h(e),!t)throw new Error("Inventari fizik mungon.");await g(e);const r=async()=>{const n=(await l(e,"inventory_counts")).find(a=>String(a.id)===t);if(!n)throw new Error("Inventari fizik nuk është i disponueshëm lokalisht.");const i={...n,status:"submitted",submitted_at:new Date().toISOString(),offline_pending:!0},o=crypto.randomUUID();return await U({companyId:e,entity:"inventory_count",entityId:t,operationId:o,idempotencyKey:`inventory-count-submit:${t}:${o}`,payload:{action:"submit",countId:t,data:i,items:await l(e,"inventory_count_items")},replicaRows:[{entityType:"inventory_counts",entityId:t,payload:i}],auditEntityType:"inventory_counts"}),i};if(w())return r();try{const{data:n,error:i}=await p.rpc("submit_inventory_count_idempotent",{p_company_id:e,p_count_id:t});if(i)throw i;return n&&await S(e,[{entityType:"inventory_counts",entityId:t,payload:n}]),n}catch(n){if(m(n))return r();throw n}}async function $t(e,t,r){if(h(e),!t)throw new Error("Inventari fizik mungon.");await g(e);const n=async()=>{const i=(await l(e,"inventory_counts")).find(_=>String(_.id)===t);if(!i)throw new Error("Inventari fizik nuk është i disponueshëm lokalisht.");const o={...i,notes:v(r)||i.notes,offline_pending:!0,pending_action:"approve"},a=crypto.randomUUID();return await U({companyId:e,entity:"inventory_count",entityId:t,operationId:a,idempotencyKey:`inventory-count-approve:${t}:${a}`,payload:{action:"approve",countId:t,notes:v(r),data:o},replicaRows:[{entityType:"inventory_counts",entityId:t,payload:o}],auditEntityType:"inventory_counts"}),o};if(w())return n();try{const{data:i,error:o}=await p.rpc("approve_inventory_count_idempotent",{p_company_id:e,p_count_id:t,p_notes:v(r)});if(o)throw o;return i&&await S(e,[{entityType:"inventory_counts",entityId:t,payload:i}]),i}catch(i){if(m(i))return n();throw i}}async function Ot(e,t,r){if(h(e),!t)throw new Error("Inventari fizik mungon.");await g(e);const n=async()=>{const i=(await l(e,"inventory_counts")).find(_=>String(_.id)===t);if(!i)throw new Error("Inventari fizik nuk është i disponueshëm lokalisht.");const o={...i,status:"cancelled",notes:v(r)||i.notes,cancelled_at:new Date().toISOString(),offline_pending:!0},a=crypto.randomUUID();return await U({companyId:e,entity:"inventory_count",entityId:t,operationId:a,idempotencyKey:`inventory-count-cancel:${t}:${a}`,payload:{action:"cancel",countId:t,reason:v(r),data:o},replicaRows:[{entityType:"inventory_counts",entityId:t,payload:o}],auditEntityType:"inventory_counts"}),o};if(w())return n();try{const{data:i,error:o}=await p.rpc("cancel_inventory_count_idempotent",{p_company_id:e,p_count_id:t,p_reason:v(r)});if(o)throw o;return i&&await S(e,[{entityType:"inventory_counts",entityId:t,payload:i}]),i}catch(i){if(m(i))return n();throw i}}async function At(e){h(e),await g(e);const t=async()=>z(await l(e,"inventory_reservations"));if(w())return t();try{const{data:r,error:n}=await p.from("inventory_reservations").select("*").eq("company_id",e).order("created_at",{ascending:!1});if(n)throw n;return await E(e,"inventory_reservations",r??[]),r??[]}catch(r){if(m(r))return t();throw r}}async function Ct(e){h(e),await g(e);const t=async()=>{const r=Object.fromEntries((await l(e,"inventory_lots")).map(n=>
1[String(n.id),n]));return(await l(e,"inventory_reservation_allocations")).sort((n,i)=>String(n.created_at||"").localeCompare(String(i.created_at||""))).map(n=>({...n,lot:r[String(n.lot_id)]||null}))};if(w())return t();try{const{data:r,error:n}=await p.from("inventory_reservation_allocations").select("*, lot:inventory_lots(id,lot_number,serial_number,expiry_date)").eq("company_id",e).order("created_at",{ascending:!0});if(n)throw n;return await E(e,"inventory_reservation_allocations",r??[]),r??[]}catch(r){if(m(r))return t();throw r}}async function xt(e,t){if(h(e),await g(e),!t.inventory_product_id||!t.warehouse_id||!t.reference_type.trim())throw new Error("Produkti, depoja dhe referenca janë të detyrueshme.");if(!Number.isFinite(t.quantity)||t.quantity<=0)throw new Error("Sasia e rezervimit duhet të jetë më e madhe se zero.");const r=$(q(t.quantity)),n=t.id||crypto.randomUUID(),i=crypto.randomUUID(),o=v(t.idempotency_key)||`inventory-reservation:${n}`;if(o.length>200)throw new Error("Idempotency key është shumë e gjatë.");const a={id:n,company_id:e,inventory_product_id:t.inventory_product_id,warehouse_id:t.warehouse_id,lot_id:t.lot_id||null,reference_type:t.reference_type.trim(),reference_id:t.reference_id||null,quantity:r,status:"reserved",expires_at:t.expires_at||null,created_by:null,created_at:new Date().toISOString(),updated_at:new Date().toISOString(),offline_pending:!0},_=t.lot_id?[{id:crypto.randomUUID(),company_id:e,reservation_id:n,inventory_product_id:t.inventory_product_id,warehouse_id:t.warehouse_id,lot_id:t.lot_id,quantity:r,movement_id:null,created_at:a.created_at}]:[],s=async()=>{const u=await X(e,t.inventory_product_id,t.warehouse_id,t.lot_id);if(q(u)<q(r))throw new Error("Stoku lokal nuk mjafton për rezervimin.");return await U({companyId:e,entity:"inventory_reservation",entityId:n,operationId:i,idempotencyKey:o,payload:{data:a,allocations:_,allocationIds:_.map(y=>({lot_id:y.lot_id,id:y.id}))},replicaRows:[{entityType:"inventory_reservations",entityId:n,payload:a},..._.map(y=>({entityType:"inventory_reservation_allocations",entityId:y.id,payload:y}))],auditEntityType:"inventory_reservations"}),{...a,allocations:_}};if(w())return s();try{const{data:u,error:y}=await p.rpc("reserve_inventory_stock_idempotent",{p_company_id:e,p_reservation_id:n,p_operation_id:i,p_idempotency_key:o,p_inventory_product_id:t.inventory_product_id,p_warehouse_id:t.warehouse_id,p_quantity:r,p_reference_type:t.reference_type.trim(),p_reference_id:t.reference_id||null,p_lot_id:t.lot_id||null,p_expires_at:t.expires_at||null,p_allocation_ids:_.map(d=>({lot_id:d.lot_id,id:d.id}))});if(y)throw y;return u&&await S(e,[{entityType:"inventory_reservations",entityId:n,payload:{...a,...u,offline_pending:!1}},..._.map(d=>({entityType:"inventory_reservation_allocations",entityId:d.id,payload:d}))]),u}catch(u){if(m(u))return s();throw u}}async function zt(e,t,r="released"){h(e),await g(e);const n=async()=>{const i=(await l(e,"inventory_reservations")).find(_=>String(_.id)===t);if(!i)throw new Error("Rezervimi nuk është i disponueshëm lokalisht.");if(i.status===r)return i;const o={...i,status:r,updated_at:new Date().toISOString(),offline_pending:!0},a=crypto.randomUUID();return await U({companyId:e,entity:"inventory_reservation",entityId:t,operationId:a,idempotencyKey:`inventory-reservation-release:${t}:${a}`,payload:{action:"release",reservationId:t,status:r,data:o},replicaRows:[{entityType:"inventory_reservations",entityId:t,payload:o}],auditEntityType:"inventory_reservations"}),o};if(w())return n();try{const{data:i,error:o}=await p.rpc("release_inventory_reservation_idempotent",{p_company_id:e,p_reservation_id:t,p_status:r});if(o)throw o;return i&&await S(e,[{entityType:"inventory_reservations",entityId:t,payload:i}]),i}catch(i){if(m(i))return n();throw i}}async function Nt(e,t,r,n){h(e),await g(e);const i=r||new Date().toISOString().slice(0,10),o=crypto.randomUUID(),a=`inventory-reservation-commit:${t}:${i}:${v(n)||""}`.slice(0,200),_=async()=>{const s=(await l(e,"inventory_reservations")).find(c=>String(c.id)===t);if(!s)throw new Error("Rezervimi nuk është i disponueshëm lokalisht.");if(s.status==="committed"){const c=(await l(e,"inventory_stock_movements")).find(f=>String(f.reference_id||"")===t&&f.movement_type==="sale");if(c)return c}const u=(await l(e,"inventory_reservation_allocations")).filter(c=>String(c.reservation_id)===t),y=(u.length>0?u:[{id:null,inventory_product_id:s.inventory_product_id,warehouse_id:s.warehouse_id,lot_id:s.lot_id||null,quantity:s.quantity}]).map(c=>({id:c.id?`${o}:${c.id}`:o,company_id:e,product_id:c.inventory_product_id||s.inventory_product_id,warehouse_id:c.warehouse_id||s.warehouse_id,lot_id:c.lot_id||null,movement_type:"sale",quantity:`-${$(q(c.quantity))}`,unit_cost:null,total_cost:null,reference_type:c.id?"inventory_reservation_allocation":"inventory_reservation",reference_id:c.id||t,movement_date:i,notes:v(n),created_at:new Date().toISOString(),updated_at:new Date().toISOString(),offline_pending:!0,operation_id:o})),d={...s,status:"committed",updated_at:new Date().toISOString(),offline_pending:!0};await U({companyId:e,entity:"inventory_reservation",entityId:t,operationId:o,idempotencyKey:a,payload:{action:"commit",reservationId:t,movementDate:i,notes:v(n),data:d,movements:y},replicaRows:[{entityType:"inventory_reservations",entityId:t,payload:d},...y.map(c=>({entityType:"inventory_stock_movements",entityId:c.id,payload:c}))],auditEntityType:"inventory_reservations"});for(const c of y)await F(e,c);
1return y[0]};if(w())return _();try{const{data:s,error:u}=await p.rpc("commit_inventory_reservation_idempotent",{p_company_id:e,p_reservation_id:t,p_operation_id:o,p_idempotency_key:a,p_movement_date:i,p_notes:v(n)});if(u)throw u;return s&&await S(e,[{entityType:"inventory_stock_movements",entityId:String(s.id),payload:s}]),s}catch(s){if(m(s))return _();throw s}}async function Kt(e){h(e),await g(e);const t=async()=>z(await l(e,"inventory_transfers"));if(w())return t();try{const{data:r,error:n}=await p.from("inventory_transfers").select("*").eq("company_id",e).order("transfer_date",{ascending:!1}).order("created_at",{ascending:!1});if(n)throw n;return await E(e,"inventory_transfers",r??[]),r??[]}catch(r){if(m(r))return t();throw r}}async function Pt(e,t){if(h(e),await g(e),!t.from_warehouse_id||!t.to_warehouse_id||!t.inventory_product_id)throw new Error("Produkti dhe të dy depot janë të detyrueshme.");if(t.from_warehouse_id===t.to_warehouse_id)throw new Error("Depoja burimore dhe destinacioni duhet të jenë të ndryshme.");if(!Number.isFinite(t.quantity)||t.quantity<=0)throw new Error("Sasia e transferimit duhet të jetë më e madhe se zero.");const r=$(q(t.quantity)),n=t.id||crypto.randomUUID(),i=crypto.randomUUID(),o=v(t.idempotency_key)||`inventory-transfer:${n}`;if(o.length>200)throw new Error("Idempotency key është shumë e gjatë.");const a=t.transfer_date||new Date().toISOString().slice(0,10),_=`TR-${a.replace(/-/g,"")}-${n.replace(/-/g,"").slice(0,8).toUpperCase()}`,s=crypto.randomUUID(),u=crypto.randomUUID(),y=crypto.randomUUID(),d=(await l(e,"inventory_products")).find(b=>String(b.id)===t.inventory_product_id),c=d?.purchase_price==null?null:$(q(d.purchase_price)),f={id:n,company_id:e,transfer_number:_,from_warehouse_id:t.from_warehouse_id,to_warehouse_id:t.to_warehouse_id,inventory_product_id:t.inventory_product_id,lot_id:t.lot_id||null,quantity:r,transfer_date:a,status:"posted",notes:v(t.notes),created_by:null,created_at:new Date().toISOString(),updated_at:new Date().toISOString(),offline_pending:!0},k=[{id:s,company_id:e,product_id:t.inventory_product_id,warehouse_id:t.from_warehouse_id,lot_id:t.lot_id||null,movement_type:"transfer_out",quantity:`-${r}`,unit_cost:c,total_cost:c==null?null:$(q(r)*q(c)/10000n),reference_type:"inventory_transfer",reference_id:n,movement_date:a,notes:v(t.notes),created_at:f.created_at,updated_at:f.updated_at,offline_pending:!0,operation_id:i},{id:u,company_id:e,product_id:t.inventory_product_id,warehouse_id:t.to_warehouse_id,lot_id:null,movement_type:"transfer_in",quantity:r,unit_cost:c,total_cost:c==null?null:$(q(r)*q(c)/10000n),reference_type:"inventory_transfer",reference_id:n,movement_date:a,notes:v(t.notes),created_at:f.created_at,updated_at:f.updated_at,offline_pending:!0,operation_id:i}],T={id:y,company_id:e,transfer_id:n,inventory_product_id:t.inventory_product_id,lot_id:t.lot_id||null,quantity:r,unit_cost:c,out_movement_id:s,in_movement_id:u,created_at:f.created_at},N=async()=>{const b=await X(e,t.inventory_product_id,t.from_warehouse_id,t.lot_id);if(!(d?.allow_negative_stock===!0)&&q(b)<q(r))throw new Error("Stoku lokal nuk mjafton për transferimin.");await U({companyId:e,entity:"inventory_transfer",entityId:n,operationId:i,idempotencyKey:o,payload:{data:f,items:[T],movements:k,outMovementId:s,inMovementId:u,itemId:y},replicaRows:[{entityType:"inventory_transfers",entityId:n,payload:f},{entityType:"inventory_transfer_items",entityId:y,payload:T},...k.map(C=>({entityType:"inventory_stock_movements",entityId:C.id,payload:C}))],auditEntityType:"inventory_transfers"});for(const C of k)await F(e,C);return f};if(w())return N();try{const{data:b,error:A}=await p.rpc("post_inventory_transfer_idempotent",{p_company_id:e,p_transfer_id:n,p_operation_id:i,p_idempotency_key:o,p_out_movement_id:s,p_in_movement_id:u,p_item_id:y,p_from_warehouse_id:t.from_warehouse_id,p_to_warehouse_id:t.to_warehouse_id,p_inventory_product_id:t.inventory_product_id,p_quantity:r,p_lot_id:t.lot_id||null,p_transfer_date:a,p_notes:v(t.notes)});if(A)throw A;const C={...f,...b||{},offline_pending:!1};return await S(e,[{entityType:"inventory_transfers",entityId:n,payload:C},{entityType:"inventory_transfer_items",entityId:y,payload:T},...k.map(V=>({entityType:"inventory_stock_movements",entityId:V.id,payload:V}
1))]),b}catch(b){if(m(b))return N();throw b}}async function Mt(e,t,r){if(h(e),await g(e),!t)throw new Error("Transferi mungon.");const n=async()=>{const i=(await l(e,"inventory_transfers")).find(a=>String(a.id)===t);if(!i)throw new Error("Transferi nuk është i disponueshëm lokalisht.");const o=crypto.randomUUID();return await U({companyId:e,entity:"inventory_transfer",entityId:t,operationId:o,idempotencyKey:`inventory-transfer-cancel:${t}:${o}`,payload:{action:"cancel",transferId:t,reason:v(r),data:i},replicaRows:[{entityType:"inventory_transfers",entityId:t,payload:{...i,pending_action:"cancel"}}],auditEntityType:"inventory_transfers"}),{...i,pending_action:"cancel",offline_pending:!0}};if(w())return n();try{const{data:i,error:o}=await p.rpc("cancel_inventory_transfer",{p_company_id:e,p_transfer_id:t,p_reason:v(r)});if(o)throw o;return i}catch(i){if(m(i))return n();throw i}}async function Lt(e,t){h(e),await g(e);const r=async()=>{const[i,o,a,_]=await Promise.all([l(e,"inventory_stock_movements"),l(e,"inventory_products"),l(e,"inventory_warehouses"),l(e,"inventory_lots")]),s=c=>Object.fromEntries(c.map(f=>[String(f.id),f])),u=s(o),y=s(a),d=s(_);return i.filter(c=>!0).sort((c,f)=>String(f.created_at||"").localeCompare(String(c.created_at||""))).map(c=>({...c,product:u[String(c.product_id)]||null,warehouse:y[String(c.warehouse_id)]||null,lot:d[String(c.lot_id)]||null}))};if(w())return r();let n=p.from("inventory_stock_movements").select("*, product:inventory_products(id,name,sku), warehouse:inventory_warehouses(id,name,code), lot:inventory_lots(id,lot_number,serial_number,expiry_date)").eq("company_id",e).order("created_at",{ascending:!1});try{const{data:i,error:o}=await n;if(o)throw o;return await E(e,"inventory_stock_movements",i??[]),i??[]}catch(i){if(m(i))return r();throw i}}async function Bt(e,t){if(h(e),await g(e),!t.product_id||!t.warehouse_id)throw new Error("Produkti dhe depoja janë të detyrueshme.");if(!Number.isFinite(t.quantity)||t.quantity===0)throw new Error("Sasia duhet të jetë numër jo-zero.");if(t.quantity<0&&t.movement_type!=="adjustment")throw new Error("Sasia negative lejohet vetëm për korrigjim stoku.");const r=crypto.randomUUID(),n=t.idempotency_key||r,i=P(t.unit_cost,"Kosto për njësi"),o=P(t.total_cost,"Kosto totale"),a=i==null?null:Number(i),_=o==null?null:Number(o),s={id:r,company_id:e,product_id:t.product_id,warehouse_id:t.warehouse_id,movement_type:t.movement_type,quantity:nt(t.movement_type,t.quantity),unit_cost:a,total_cost:_,movement_date:t.movement_date||new Date().toISOString().slice(0,10),lot_id:t.lot_id||null,reference_type:v(t.reference_type)||"manual_inventory",reference_id:t.reference_id||null,notes:v(t.notes),created_at:new Date().toISOString(),updated_at:new Date().toISOString(),offline_pending:!0,operation_id:r,idempotency_key:n},u=async()=>{if(t.movement_type==="adjustment")throw new Error("Korrigjimet e stokut kërkojnë aprovim; lidheni pajisjen për t’i dërguar në aprovim.");return await G([{entity:"inventory_movement",operation:"create",companyId:e,entityId:r,operationId:r,idempotencyKey:n,payload:{companyId:e,entityId:r,operationId:r,idempotencyKey:n,data:s}}],{auditEvents:[{entityType:"inventory_stock_movements",entityId:r,operation:"create",eventType:"operation_created",payload:s,idempotencyKey:n}]}),await F(e,s),s};if(w())return u();const y=t.movement_type==="adjustment"?{p_company_id:e,p_product_id:t.product_id,p_warehouse_id:t.warehouse_id,p_movement_type:t.movement_type,p_quantity:t.quantity,p_unit_cost:a,p_total_cost:_,p_movement_date:t.movement_date||null,p_lot_id:t.lot_id||null,p_reference_type:v(t.reference_type),p_reference_id:t.reference_id||null,p_notes:v(t.notes)}:{p_company_id:e,p_operation_id:r,p_idempotency_key:n,p_product_id:t.product_id,p_warehouse_id:t.warehouse_id,p_movement_type:t.movement_type,p_quantity:t.quantity,p_unit_cost:a,p_total_cost:_,p_movement_date:t.movement_date||null,p_lot_id:t.lot_id||null,p_reference_type:v(t.reference_type),p_reference_id:t.reference_id||null,p_notes:v(t.notes)},{data:d,error:c}=t.movement_type==="adjustment"?await p.rpc("post_inventory_movement_public",y):await p.rpc("post_inventory_movement_idempotent",y);if(c){const f=String(c.message||c).toLowerCase();if(t.movement_type==="adjustment"&&f.includes("kërkon aprovim"))return{approval_pending:!0,approval_request:await I(e,{inventoryProductId:t.product_id,warehouseId:t.warehouse_id,quantity:t.quantity,unitCost:a,totalCost:_,movementDate:t.movement_date||null,lotId:t.lot_id||null,notes:v(t.notes),idempotencyKey:n})};if(m(c))return u();throw c}return d&&t.movement_type!=="adjustment"&&await B({companyId:e,entityType:"inventory_stock_movements",entityId:r,payload:{...d,id:r,cloud_id:d.id||null,operation_id:r,idempotency_key:n,offline_pending:!1},createdAt:String(d.created_at||new Date().toISOString()),updatedAt:String(d.updated_at||new Date().toISOString()),cloudUpdatedAt:String(d.updated_at||new Date().toISOString()),syncStatus:"synced",deviceId:null,originDeviceId:null}).catch(f=>{console.warn("[inventory] local movement mirror deferred:",f)}),d}async function dt(e){h(e),await g(e);const t=async()=>J(e);if(w())return t();try{const{data:r,error:n}=await p.rpc("inventory_current_stock",{_company_id:e});if(n)throw n;return await E(e,"inventory_current_stock",r??[]),r??[]}catch(r){if(m(r))return t();throw r}}async function Ft(e){h(e),await g(e);const t=async()=>{const[r,n]=await Promise.all([ct(e,{status:"active"}),dt(e)]),i=Object.fromEntries(n.map(o=>[String(o.inventory_product_id||o.product_id),o]));return r.map(o=>({...o,current_quantity:i[String(o.id)]?.current_quantity??i[String(o.id)]?.quantity??0})).filter(o=>Number(o.current_quantity)<=Number(o.min_stock_quantity||0))};if(w())return t();try{const{data:r,error:n}=await p.rpc("inventory_low_stock_products",{_company_id:e});if(n)throw n;return r??[]}catch(r){if(m(r))return t();throw r}}export{Lt as A,bt as B,At as C,Ct as D,Kt as E,Tt as F,Dt as G,g as H,yt as I,pt as a,ht as b,lt as c,kt as d,Et as e,zt as f,Nt as g,Mt as h,jt as i,Ut as j,$t as k,Ot as l,Bt as m,wt as n,gt as o,Pt as p,qt as q,xt as r,Rt as s,vt as t,ft as u,mt as v,St as w,ct as x,dt as y,Ft as z};

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.