2 lines
30 KiB
JavaScript
2 lines
30 KiB
JavaScript
import{_ as Ee}from"./BasicMainCard-d630ef89.js";import{_ as he}from"./BasicModal.vue_vue_type_style_index_0_lang-5f2a723d.js";import{_ as De}from"./BasicTextArea.vue_vue_type_style_index_0_lang-c86088e0.js";import{_ as we}from"./BaseSwitch.vue_vue_type_script_setup_true_lang-3522768e.js";import{_ as ke}from"./BasicInput.vue_vue_type_style_index_0_lang-fb48873c.js";import{_ as Me,u as de}from"./useBaseTable-81e5e1c8.js";import{_ as Ie}from"./button.vue_vue_type_style_index_0_lang-262761a9.js";import{_ as Oe,G as L,J as Y,d as oe,g as k,h as U,v as Se,D as m,o as T,c as q,F as Fe,a as n,b as r,t as J,p as qe,w as v,e as Z,r as je,E as Ze,i as te,j as y,k as H,bB as He,H as pe,I as Ke}from"./index-6d106dd0.js";import{f as _e,a as Ge,b as Ve,c as Xe,d as Je,e as Ye}from"./supabaseTableQuery-95762ff3.js";import{t as re}from"./useDataTime-1b320de0.js";import{I as F}from"./Icon-a5ae3f4f.js";import{g as We}from"./index-701052cc.js";import{e as me,g as ve}from"./convert-2ad76038.js";import{F as fe}from"./index-8789a773.js";import{a as Qe}from"./index-432513d5.js";import{I as et}from"./index-b3dd29e1.js";import{a as ge}from"./index-5fa2b8ab.js";import{M as ae}from"./index-f7555b21.js";import{S as tt}from"./index-e9a5bd4c.js";import{T as j}from"./isSymbol-c370a0c8.js";import{U as at}from"./index-6575d336.js";import"./Grid-f13e2170.js";import"./index-56a3533c.js";import"./Col-4cc0b984.js";import"./styleChecker-e3fb407e.js";import"./isPlainObject-7b16eb57.js";import"./vnode-62570e84.js";import"./_plugin-vue_export-helper-7797a105.js";import"./index-812ee0b9.js";import"./FormItemContext-c47fa363.js";import"./omit-60677be5.js";import"./usePrice-bc935b83.js";import"./updateLocale-9e7c96d6.js";import"./index-bc659f42.js";import"./index-96dcc83e.js";import"./useState-7ef6eec1.js";import"./lodash-eb35a796.js";import"./index-6fd59bb9.js";import"./Badge-e97fb41c.js";import"./isNumeric-3f69e2aa.js";import"./index-3397bfbd.js";import"./index-47d62f0b.js";import"./index-0b1886ec.js";import"./DialogWrap-e684398e.js";import"./pickAttrs-c39578ea.js";import"./css-aae66f86.js";import"./toArray-f8613bd2.js";import"./index-281db256.js";import"./_flatRest-637ff229.js";import"./useRefs-779e4c26.js";function Ce(e,l){return Math.max(0,Math.round(e*(1-(l||0)/100)))}async function nt(e){const{TableEngineRequest:l}=await Oe(()=>import("./buildSupabaseQuery-28fb231d.js"),["assets/buildSupabaseQuery-28fb231d.js","assets/index-6d106dd0.js","assets/index-8e1e8848.css","assets/supabaseTableQuery-95762ff3.js"]),o={...e};!o.sort&&!o.order&&(o.order="-sort_order");const s=await l(o,"subscription_plans");if(Array.isArray(s==null?void 0:s.rows)){const x=s.rows.map((g,w)=>({...g,index:w,final_price:Ce(Number(g.price),Number(g.discount_percent||0))}));return{...s,rows:x}}return s}const st=new Set(["plan_title","payment_status","status","final_price","expires_at","created_at","user_id","plan_id"]),it=["plan_title","payment_status","status"];async function lt(e){const{limit:l=20,page:o=1,search:s,filters:x}=e;let g=L.from("subscription_purchases").select("*, users(name, phone, first_name, last_name)",{count:"exact"});if(s!=null&&s.trim()){const _=await _e(L,s);g=Ge(g,s,it,_)}if(x!=null&&x.length){for(const _ of x)if(!(_.hidden||!_.field)){if(_.field==="user_name"||_.field==="user_phone"){if(["eq","has","like"].includes(_.op)){const t=await _e(L,String(_.value));t.length?g=g.in("user_id",t):g=g.eq("user_id","00000000-0000-0000-0000-000000000000")}continue}st.has(_.field)&&(g=Ve(g,_))}}g=Xe(g,e,"-created_at",["created_at","plan_title","payment_status","status"]),g=Je(g,o,l);const{data:w,error:A,count:h}=await g;if(A)throw A;return Ye(w,h,e,_=>{const t=Array.isArray(_.users)?_.users[0]:_.users;let C="نامشخص";return t!=null&&t.name?C=t.name:t!=null&&t.first_name||t!=null&&t.last_name?C=`${t.first_name||""} ${t.last_name||""}`.trim():t!=null&&t.phone&&(C=t.phone),{..._,user_name:C,user_phone:(t==null?void 0:t.phone)||""}})}async function rt(e){const{data:l,error:o}=await L.from("subscription_plans").insert([{title:e.title,description:e.description||null,image_url:e.image_url,price:e.price,discount_percent:e.discount_percent??0,duration_days:e.duration_days,is_active:e.is_active??!0,sort_order:e.sort_order??0}]).select().single();if(o)throw o;return l}async function ot(e,l){const{data:o,error:s}=await L.from("subscription_plans").update({title:l.title,description:l.description||null,image_url:l.image_url,price:l.price,discount_percent:l.discount_percent??0,duration_days:l.duration_days,is_active:l.is_active??!0,sort_order:l.sort_order??0,updated_at:new Date().toISOString()}).eq("id",e).select();if(s)throw s;return o}async function ut(e){const{error:l}=await L.from("subscription_plans").delete().eq("id",e);if(l)throw l}async function ct(e,l){const{data:o,error:s}=await L.from("subscription_plans").update({is_active:l,updated_at:new Date().toISOString()}).eq("id",e).select();if(s)throw s;return o}async function dt(){const{data:e,error:l}=await L.from("subscription_plans").select("id, title, duration_days, price, discount_percent, is_active").order("sort_order",{ascending:!1}).order("id",{ascending:!1});if(l)throw l;return e||[]}async function pt(){return await Y.post("/admin/subscription/reconcile-pending")}async function _t(e){return await Y.post("/admin/subscription/grant",e)}async function mt(e){return await Y.post("/admin/subscription/extend",e)}async function vt(e){return await Y.post(`/admin/subscription/${e}/cancel`,{mode:"cancel"})}async function ft(e){return await Y.delete(`/admin/subscription/${e}`)}function be(e){return Number(e||0).toLocaleString("fa-IR")}const gt=[{title:"ردیف",dataIndex:"id",key:"id",filterable:!1,width:70,align:"center",customRender:e=>(e.record.index??0)+1},{title:"عنوان",dataIndex:"title",key:"title"},{title:"مدت (روز)",dataIndex:"duration_days",key:"duration_days",width:100,align:"center"},{title:"قیمت (ریال)",dataIndex:"price",key:"price",customRender:e=>be(e.record.price)},{title:"تخفیف %",dataIndex:"discount_percent",key:"discount_percent",width:90,align:"center"},{title:"قیمت نهایی",dataIndex:"final_price",key:"final_price",customRender:e=>be(e.record.final_price)},{title:"فعال",dataIndex:"is_active",key:"is_active",customRender:e=>e.record.is_active?"بله":"خیر"},{title:"ترتیب",dataIndex:"sort_order",key:"sort_order",width:80,align:"center"},{title:"ایجاد",dataIndex:"created_at",key:"created_at",customRender:e=>re(e.record.created_at)},{title:"عملیات",dataIndex:"action",key:"action",slot:"action",filterable:!1,align:"center"}];function bt(e){return Number(e||0).toLocaleString("fa-IR")}const ye={pending:"در انتظار",paid:"پرداخت شده",failed:"ناموفق",cancelled:"لغو شده"},xe={pending:"در انتظار",active:"فعال",expired:"منقضی",cancelled:"لغو شده"},yt=[{title:"ردیف",dataIndex:"id",key:"id",filterable:!1,width:70,align:"center",customRender:e=>(e.record.index??0)+1},{title:"کاربر",dataIndex:"user_name",key:"user_name",filterField:"user_name"},{title:"موبایل",dataIndex:"user_phone",key:"user_phone",filterField:"user_phone"},{title:"پلن",dataIndex:"plan_title",key:"plan_title"},{title:"مبلغ",dataIndex:"final_price",key:"final_price",customRender:e=>bt(e.record.final_price)},{title:"پرداخت",dataIndex:"payment_status",key:"payment_status",type:"Select",filterField:"payment_status",filterComponentProps:{options:Object.entries(ye).map(([e,l])=>({label:l,value:e})),allowClear:!0,placeholder:"انتخاب وضعیت پرداخت"},customRender:e=>ye[e.record.payment_status]||e.record.payment_status},{title:"وضعیت",dataIndex:"status",key:"status",type:"Select",filterField:"status",filterComponentProps:{options:Object.entries(xe).map(([e,l])=>({label:l,value:e})),allowClear:!0,placeholder:"انتخاب وضعیت"},customRender:e=>xe[e.record.status]||e.record.status},{title:"انقضا",dataIndex:"expires_at",key:"expires_at",customRender:e=>e.record.expires_at?re(e.record.expires_at):"-"},{title:"تاریخ خرید",dataIndex:"created_at",key:"created_at",customRender:e=>re(e.record.created_at)},{title:"عملیات",dataIndex:"action",key:"action",filterable:!1,width:140,align:"center"}],B={ZARINPAL_MERCHANT_ID:"zarinpal_merchant_id",ZARINPAL_SANDBOX:"zarinpal_sandbox",SUBSCRIPTION_CALLBACK_URL:"subscription_app_callback_url",ZARINPAL_ENABLED:"zarinpal_enabled"},xt=Object.values(B);function ht(e){const l=(e[B.ZARINPAL_SANDBOX]||"no").toLowerCase(),o=(e[B.ZARINPAL_ENABLED]||"yes").toLowerCase();return{zarinpal_merchant_id:e[B.ZARINPAL_MERCHANT_ID]||"",zarinpal_sandbox:l==="yes"||l==="true"||l==="1",zarinpal_enabled:o!=="no"&&o!=="false"&&o!=="0",subscription_app_callback_url:e[B.SUBSCRIPTION_CALLBACK_URL]||"https://macharta.ir"}}async function ne(e,l){const{data:o,error:s}=await L.from("configs").select("id").eq("key",e).maybeSingle();if(s)throw s;if(o!=null&&o.id){const{data:w,error:A}=await L.from("configs").update({value:l}).eq("key",e).select("id");if(A)throw A;if(!(w!=null&&w.length))throw new Error("ذخیره انجام نشد. لطفاً migration دسترسی configs را در Supabase اجرا کنید.");return}const{data:x,error:g}=await L.from("configs").insert({key:e,value:l}).select("id");if(g)throw g;if(!(x!=null&&x.length))throw new Error("ایجاد تنظیم انجام نشد. لطفاً migration دسترسی configs را در Supabase اجرا کنید.")}async function Ae(){const{data:e,error:l}=await L.from("configs").select("key, value").in("key",xt);if(l)throw l;const o=(e||[]).reduce((s,x)=>(s[x.key]=x.value??"",s),{});return ht(o)}async function wt(e){return await ne(B.ZARINPAL_MERCHANT_ID,e.zarinpal_merchant_id.trim()),await ne(B.ZARINPAL_SANDBOX,e.zarinpal_sandbox?"yes":"no"),await ne(B.ZARINPAL_ENABLED,e.zarinpal_enabled?"yes":"no"),await ne(B.SUBSCRIPTION_CALLBACK_URL,e.subscription_app_callback_url.trim().replace(/\/$/,"")),Ae()}const kt={class:"max-w-2xl space-y-4"},It=n("p",{class:"text-sm text-gray-600 mb-4"}," کد مرچنت و آدرس بازگشت از درگاه در اینجا تنظیم میشود. اپ کاربر از همین تنظیمات برای اتصال به زرینپال استفاده میکند. ",-1),St={key:0,class:"py-8 text-center"},Ct=n("div",{class:"mb-1 text-sm text-gray-600"},"کد مرچنت زرینپال (Merchant ID)",-1),At=n("div",{class:"mb-1 text-sm text-gray-600"},"آدرس بازگشت از درگاه (URL اپ کاربر)",-1),Pt=n("div",{class:"text-xs text-gray-500 mt-1"},[Z(" مسیر callback بهصورت خودکار اضافه میشود: "),n("code",null,"/subscriptions/callback")],-1),$t={class:"flex items-center gap-3"},Lt=n("span",{class:"text-sm"},"فعال بودن درگاه زرینپال",-1),Rt={class:"flex items-center gap-3"},Nt=n("span",{class:"text-sm"},"حالت تست (Sandbox)",-1),Tt=oe({__name:"PaymentGatewaySettings",setup(e){const l=k(!0),o=k(!1),s=k({zarinpal_merchant_id:"",zarinpal_sandbox:!1,zarinpal_enabled:!0,subscription_app_callback_url:"https://macharta.ir"}),x=U(()=>{var h;return s.value.zarinpal_enabled?s.value.zarinpal_sandbox?!0:!!((h=s.value.zarinpal_merchant_id)!=null&&h.trim()):!1}),g=U(()=>{var h;return s.value.zarinpal_enabled?s.value.zarinpal_sandbox?"حالت تست فعال است — پرداخت از sandbox زرینپال انجام میشود.":(h=s.value.zarinpal_merchant_id)!=null&&h.trim()?"درگاه برای پرداخت واقعی آماده است.":"کد مرچنت وارد نشده — درگاه آماده پرداخت واقعی نیست.":"درگاه غیرفعال است — کاربران نمیتوانند پرداخت کنند."}),w=U(()=>x.value?"bg-green-50 border-green-200 text-green-800":"bg-amber-50 border-amber-200 text-amber-800");Se(async()=>{try{s.value=await Ae()}catch(h){m.error((h==null?void 0:h.message)||"خطا در بارگذاری تنظیمات")}finally{l.value=!1}});async function A(){var h,_;if(!((h=s.value.subscription_app_callback_url)!=null&&h.trim())){m.warning("آدرس بازگشت از درگاه الزامی است");return}if(s.value.zarinpal_enabled&&!s.value.zarinpal_sandbox&&!((_=s.value.zarinpal_merchant_id)!=null&&_.trim())){m.warning("برای پرداخت واقعی، کد مرچنت الزامی است");return}o.value=!0;try{s.value=await wt(s.value),m.success("تنظیمات درگاه ذخیره شد")}catch(t){m.error((t==null?void 0:t.message)||"خطا در ذخیره")}finally{o.value=!1}}return(h,_)=>{const t=ke,C=we,E=Ie;return T(),q("div",kt,[It,l.value?(T(),q("div",St,"در حال بارگذاری...")):(T(),q(Fe,{key:1},[n("div",null,[Ct,r(t,{value:s.value.zarinpal_merchant_id,"onUpdate:value":_[0]||(_[0]=P=>s.value.zarinpal_merchant_id=P),placeholder:"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"},null,8,["value"])]),n("div",null,[At,r(t,{value:s.value.subscription_app_callback_url,"onUpdate:value":_[1]||(_[1]=P=>s.value.subscription_app_callback_url=P),placeholder:"https://macharta.ir"},null,8,["value"]),Pt]),n("div",$t,[r(C,{value:s.value.zarinpal_enabled,"onUpdate:value":_[2]||(_[2]=P=>s.value.zarinpal_enabled=P)},null,8,["value"]),Lt]),n("div",Rt,[r(C,{value:s.value.zarinpal_sandbox,"onUpdate:value":_[3]||(_[3]=P=>s.value.zarinpal_sandbox=P)},null,8,["value"]),Nt]),n("div",{class:qe(["rounded-lg border p-3 text-sm",w.value])},J(g.value),3),r(E,{type:"primary",loading:o.value,onClick:A},{default:v(()=>[Z(" ذخیره تنظیمات درگاه ")]),_:1},8,["loading"])],64))])}}}),Ut={key:3,class:"text-sm text-gray-500"},Bt=oe({__name:"AdminUserSubscriptionModal",props:{visible:{type:Boolean},mode:{},purchaseId:{},lockedUserId:{}},emits:["update:visible","success"],setup(e,{emit:l}){const o=e,s=Qe,x=et,g=fe,w=fe.Item,A=k(!1),h=k([]),_=k([]),t=je({user_id:void 0,plan_id:void 0,duration_days:null}),C=U({get:()=>o.visible,set:u=>l("update:visible",u)}),E=U(()=>o.mode==="grant"?"ایجاد اشتراک برای کاربر":"تمدید اشتراک"),P=U(()=>o.mode==="grant"?"ایجاد اشتراک":"تمدید"),K=U(()=>h.value.map(u=>{const p=u.name||`${u.first_name||""} ${u.last_name||""}`.trim()||"بدون نام",I=u.phone||"";return{value:u.id,label:I?`${p} — ${I}`:p,searchText:`${p} ${I}`.toLowerCase()}})),D=U(()=>_.value.map(u=>({value:u.id,label:`${u.title} (${u.duration_days} روز)${u.is_active?"":" — غیرفعال"}`,searchText:String(u.title||"").toLowerCase()}))),R=U(()=>_.value.find(u=>u.id===t.plan_id)||null);function z(u,p){return String((p==null?void 0:p.searchText)||(p==null?void 0:p.label)||"").toLowerCase().includes(u.toLowerCase())}function G(u,p){return String((p==null?void 0:p.searchText)||(p==null?void 0:p.label)||"").toLowerCase().includes(u.toLowerCase())}function f(){o.mode==="grant"&&R.value&&!t.duration_days&&(t.duration_days=Number(R.value.duration_days)||null)}function se(){t.user_id=o.lockedUserId||void 0,t.plan_id=void 0,t.duration_days=o.mode==="extend"?30:null}function W(){l("update:visible",!1)}async function Q(){try{const[u,p]=await Promise.all([He(),dt()]);h.value=u||[],_.value=p||[]}catch(u){m.error((u==null?void 0:u.message)||"خطا در بارگذاری اطلاعات")}}async function ee(){var u,p;if(o.mode==="grant"){if(!t.user_id){m.warning("کاربر را انتخاب کنید");return}if(!t.plan_id){m.warning("پلن را انتخاب کنید");return}}if(o.mode==="extend"){if(!o.purchaseId&&!t.user_id){m.warning("کاربر را انتخاب کنید");return}if(!t.duration_days||t.duration_days<1){m.warning("مدت تمدید را وارد کنید");return}}A.value=!0;try{if(o.mode==="grant"){const I={user_id:t.user_id,plan_id:t.plan_id};t.duration_days&&t.duration_days>0&&(I.duration_days=Number(t.duration_days)),await _t(I),m.success("اشتراک ایجاد شد")}else await mt({purchase_id:o.purchaseId||void 0,user_id:o.purchaseId?void 0:t.user_id,plan_id:t.plan_id||void 0,duration_days:Number(t.duration_days)}),m.success("اشتراک تمدید شد");l("success"),W()}catch(I){m.error(((p=(u=I==null?void 0:I.response)==null?void 0:u.data)==null?void 0:p.message)||(I==null?void 0:I.message)||"خطا در ذخیره")}finally{A.value=!1}}return Ze(()=>o.visible,u=>{u&&(se(),(!h.value.length||!_.value.length)&&Q())}),Se(()=>{Q()}),(u,p)=>{const I=he;return T(),te(I,{visible:C.value,"onUpdate:visible":p[4]||(p[4]=N=>C.value=N),title:E.value,"ok-text":P.value,"cancel-text":"انصراف","confirm-loading":A.value,width:"560px",onOk:ee,onCancel:W},{default:v(()=>[r(y(g),{layout:"vertical"},{default:v(()=>[u.mode==="grant"||u.mode==="extend"&&!u.purchaseId?(T(),te(y(w),{key:0,label:"کاربر",required:""},{default:v(()=>[r(y(s),{value:t.user_id,"onUpdate:value":p[0]||(p[0]=N=>t.user_id=N),"show-search":"",placeholder:"جستجو با نام یا موبایل",options:K.value,"filter-option":z,disabled:!!u.lockedUserId},null,8,["value","options","disabled"])]),_:1})):H("",!0),u.mode==="grant"?(T(),te(y(w),{key:1,label:"پلن اشتراک",required:""},{default:v(()=>[r(y(s),{value:t.plan_id,"onUpdate:value":p[1]||(p[1]=N=>t.plan_id=N),"show-search":"",placeholder:"انتخاب پلن",options:D.value,"filter-option":G,onChange:f},null,8,["value","options"])]),_:1})):H("",!0),u.mode==="extend"&&!u.purchaseId?(T(),te(y(w),{key:2,label:"پلن (اختیاری)"},{default:v(()=>[r(y(s),{value:t.plan_id,"onUpdate:value":p[2]||(p[2]=N=>t.plan_id=N),"show-search":"","allow-clear":"",placeholder:"در صورت خالی بودن از پلن فعال کاربر استفاده میشود",options:D.value,"filter-option":G},null,8,["value","options"])]),_:1})):H("",!0),r(y(w),{label:u.mode==="grant"?"مدت (روز) — اختیاری برای جایگزینی مدت پلن":"مدت تمدید (روز)",required:u.mode==="extend"},{default:v(()=>[r(y(x),{value:t.duration_days,"onUpdate:value":p[3]||(p[3]=N=>t.duration_days=N),min:1,class:"w-full",placeholder:u.mode==="grant"?"خالی = مدت پیشفرض پلن":"مثلاً ۳۰"},null,8,["value","placeholder"])]),_:1},8,["label","required"]),u.mode==="grant"&&R.value?(T(),q("div",Ut," مدت پیشفرض پلن: "+J(R.value.duration_days)+" روز ",1)):H("",!0)]),_:1})]),_:1},8,["visible","title","ok-text","confirm-loading"])}}}),zt={class:"flex justify-between items-center mb-4"},Et=n("h2",null,"مدیریت اشتراکها",-1),Dt={class:"gap-2 flex justify-center"},Mt=n("span",null,"حذف",-1),Ot=n("span",null,"ویرایش",-1),Ft={class:"flex justify-between items-center mb-4"},qt=n("h2",null,"لیست خرید اشتراک",-1),jt={class:"flex gap-2"},Zt={class:"gap-2 flex justify-center"},Ht=n("span",null,"تمدید",-1),Kt=n("span",null,"لغو اشتراک",-1),Gt=n("span",null,"حذف",-1),Vt=n("div",{class:"mb-4"},[n("h2",null,"تنظیمات درگاه پرداخت")],-1),Xt={class:"space-y-4 relative"},Jt={key:0,class:"absolute inset-0 bg-white/60 z-10 flex items-center justify-center"},Yt={class:"grid grid-cols-2 gap-4"},Wt=n("div",{class:"mb-1 text-sm text-gray-600"},"عنوان اشتراک",-1),Qt=n("div",{class:"mb-1 text-sm text-gray-600"},"مدت اشتراک (روز)",-1),ea={class:"grid grid-cols-3 gap-4"},ta=n("div",{class:"mb-1 text-sm text-gray-600"},"مبلغ (ریال)",-1),aa=n("div",{class:"mb-1 text-sm text-gray-600"},"تخفیف (درصد)",-1),na=n("div",{class:"mb-1 text-sm text-gray-600"},"قیمت نهایی (ریال)",-1),sa={class:"mt-2 font-semibold text-green-700"},ia={class:"grid grid-cols-2 gap-4"},la=n("div",{class:"mb-1 text-sm text-gray-600"},"ترتیب نمایش",-1),ra=n("div",{class:"mb-1 text-sm text-gray-600"},"وضعیت",-1),oa={class:"flex items-center gap-2 mt-2"},ua={class:"text-sm text-gray-600"},ca=n("div",{class:"mb-1 text-sm text-gray-600"},"توضیحات",-1),da={class:"flex justify-center"},pa=n("div",{class:"mb-1 text-sm text-gray-600"},"تصویر اشتراک",-1),_a={key:0},ma=n("div",null,"آپلود تصویر",-1),pn=oe({__name:"index",setup(e){const l=ge,o=ge.TabPane,s=k("plans"),x=k(!1),g=k(!1),w=k(null),[A,h]=de(),[_,t]=de(),C=k(!1),E=k("grant"),P=k(null),K=k(null),D=k(!1),R=k([]),z=k(0),G=()=>({title:"",description:"",image_url:null,price:0,discount_percent:0,duration_days:30,is_active:!0,sort_order:0}),f=k(G()),se=U(()=>Ce(Number(f.value.price),Number(f.value.discount_percent)).toLocaleString("fa-IR")),W={columns:gt,api:nt,defaultPageLimit:20},Q={columns:yt,api:lt,defaultPageLimit:20};function ee(){f.value=G(),R.value=[]}function u(){g.value=!1,w.value=null,ee(),x.value=!0}function p(){x.value=!1,ee()}function I(c){return c.type.startsWith("image/")?c.size/1024/1024>=5?(m.error("حجم تصویر باید کمتر از 5MB باشد"),!1):!0:(m.error("فقط فایل تصویری مجاز است"),!1)}async function N(c){const{file:a,onSuccess:b,onError:d,onProgress:$}=c,M=new FormData;M.append("file",a);const V=`${Ke}/upload/machartaa-img`;z.value++,await new Promise((ie,X)=>{const i=new XMLHttpRequest;i.open("POST",V);const O=We()||localStorage.getItem("tamin_token")||"";i.setRequestHeader("Authorization",`Bearer ${O}`),i.upload.onprogress=S=>{S.lengthComputable&&($==null||$({percent:Math.round(S.loaded/S.total*100)}))},i.onload=()=>{if(i.status>=200&&i.status<300)try{const S=JSON.parse(i.responseText||"{}"),ze=S.full_src||S.url||S.src||S.path||S.data&&(S.data.full_src||S.data.url||S.data.src||S.data.path)||"",le=me(ze),ce=ve(le);f.value.image_url=le,R.value=ce?[{uid:`${Date.now()}`,name:"image.jpg",status:"done",url:ce,response:{path:le}}]:[],b==null||b(S,i),m.success("تصویر با موفقیت آپلود شد!"),ie()}catch(S){d==null||d(S,i),X(S)}else d==null||d(new Error("خطا در آپلود تصویر"),i),X(new Error("خطا در آپلود تصویر"))},i.onerror=()=>{d==null||d(new Error("خطا در آپلود تصویر"),i),X(new Error("خطا در آپلود تصویر"))},i.onloadend=()=>{z.value=Math.max(0,z.value-1)},i.send(M)})}async function Pe(){var c;if(z.value>0){m.warning("لطفاً تا پایان آپلود صبر کنید");return}if(!((c=f.value.title)!=null&&c.trim())){m.warning("عنوان الزامی است");return}if(!f.value.duration_days||Number(f.value.duration_days)<1){m.warning("مدت اشتراک باید حداقل ۱ روز باشد");return}try{const a={...f.value,price:Number(f.value.price)||0,discount_percent:Number(f.value.discount_percent)||0,duration_days:Number(f.value.duration_days),sort_order:Number(f.value.sort_order)||0};g.value&&w.value?(await ot(w.value,a),m.success("اشتراک ویرایش شد")):(await rt(a),m.success("اشتراک افزوده شد")),p(),await h()}catch(a){m.error((a==null?void 0:a.message)||"خطا در ذخیره")}}function $e(c){g.value=!0,w.value=c.id;const a=me(c.image_url)||null;f.value={title:c.title||"",description:c.description||"",image_url:a,price:c.price||0,discount_percent:c.discount_percent||0,duration_days:c.duration_days||30,is_active:c.is_active??!0,sort_order:c.sort_order??0};const b=a?ve(a):null;R.value=b?[{uid:"-1",name:"image.jpg",status:"done",url:b,response:{path:a}}]:[],x.value=!0}function Le(c){ae.confirm({title:"حذف اشتراک",content:`آیا از حذف «${c.title}» مطمئن هستید؟`,okText:"بله، حذف کن",cancelText:"انصراف",okType:"danger",centered:!0,onOk:async()=>{try{await ut(c.id),m.success("حذف شد"),await h()}catch(a){m.error((a==null?void 0:a.message)||"خطا در حذف")}}})}async function Re(c){try{await ct(c.id,!c.is_active),m.success("وضعیت بهروز شد"),await h()}catch(a){m.error((a==null?void 0:a.message)||"خطا")}}function Ne(){E.value="grant",P.value=null,K.value=null,C.value=!0}async function Te(){D.value||ae.confirm({title:"همگامسازی پرداختهای زرینپال",content:"لیست تراکنشهای موفقِ اعتبارسنجینشده از زرینپال گرفته میشود، با توکن تراکنشهای اشتراک تطبیق داده میشود و در صورت تطبیق، اشتراک کاربر فعال میشود. ادامه میدهید؟",okText:"همگامسازی",cancelText:"انصراف",centered:!0,onOk:async()=>{var c,a;D.value=!0;try{const b=await pt(),d=(b==null?void 0:b.data)??b,$=Number((d==null?void 0:d.reconciled_count)||0),M=Number((d==null?void 0:d.total_zarinpal)||0),V=Number((d==null?void 0:d.matched_count)||0);$>0?m.success((d==null?void 0:d.message)||`${$} اشتراک فعال شد.`):m.info((d==null?void 0:d.message)||(M>0?`از ${M} تراکنش زرینپال، ${V} مورد با اشتراک محلی تطبیق خورد ولی فعالسازی انجام نشد.`:"تراکنش موفقِ اعتبارسنجینشدهای در زرینپال یافت نشد.")),await t()}catch(b){m.error(((a=(c=b==null?void 0:b.response)==null?void 0:c.data)==null?void 0:a.message)||(b==null?void 0:b.message)||"خطا در همگامسازی پرداختها")}finally{D.value=!1}}})}function ue(c){E.value="extend",P.value=(c==null?void 0:c.id)??null,K.value=(c==null?void 0:c.user_id)??null,C.value=!0}function Ue(c){ae.confirm({title:"لغو اشتراک",content:`اشتراک «${c.plan_title}» برای ${c.user_name||"کاربر"} لغو شود؟ اعتبار کاربر قطع میشود.`,okText:"بله، لغو کن",cancelText:"انصراف",okType:"danger",centered:!0,onOk:async()=>{var a,b;try{await vt(c.id),m.success("اشتراک لغو شد"),await t()}catch(d){m.error(((b=(a=d==null?void 0:d.response)==null?void 0:a.data)==null?void 0:b.message)||(d==null?void 0:d.message)||"خطا در لغو")}}})}function Be(c){ae.confirm({title:"حذف کامل",content:`رکورد خرید «${c.plan_title}» برای ${c.user_name||"کاربر"} کامل حذف شود؟`,okText:"بله، حذف کن",cancelText:"انصراف",okType:"danger",centered:!0,onOk:async()=>{var a,b;try{await ft(c.id),m.success("حذف شد"),await t()}catch(d){m.error(((b=(a=d==null?void 0:d.response)==null?void 0:a.data)==null?void 0:b.message)||(d==null?void 0:d.message)||"خطا در حذف")}}})}return(c,a)=>{const b=Ie,d=Me,$=ke,M=we,V=De,ie=he,X=Ee;return T(),q("div",null,[r(X,null,{default:v(()=>[r(y(l),{activeKey:s.value,"onUpdate:activeKey":a[2]||(a[2]=i=>s.value=i)},{default:v(()=>[r(y(o),{key:"plans",tab:"پلنهای اشتراک"},{default:v(()=>[n("div",zt,[Et,r(b,{type:"primary",onClick:u},{default:v(()=>[Z("افزودن اشتراک")]),_:1})]),r(d,pe(W,{ref:"table",onRegister:y(A)}),{action:v(({record:i})=>[n("div",Dt,[r(y(j),{class:"cursor-pointer"},{title:v(()=>[n("span",null,J(i.is_active?"غیرفعال کردن":"فعال کردن"),1)]),default:v(()=>[r(F,{icon:i.is_active?"vuesax-linear:eye-slash":"vuesax-linear:eye",color:i.is_active?"#F59E0B":"#16A34A",onClick:O=>Re(i)},null,8,["icon","color","onClick"])]),_:2},1024),r(y(j),{class:"cursor-pointer"},{title:v(()=>[Mt]),default:v(()=>[r(F,{icon:"vuesax-linear:trash",color:"#DC2626",onClick:O=>Le(i)},null,8,["onClick"])]),_:2},1024),r(y(j),{class:"cursor-pointer"},{title:v(()=>[Ot]),default:v(()=>[r(F,{icon:"vuesax-linear:edit",color:"#1D4ED8",onClick:O=>$e(i)},null,8,["onClick"])]),_:2},1024)])]),_:1},16,["onRegister"])]),_:1}),r(y(o),{key:"purchases",tab:"خریدهای کاربران"},{default:v(()=>[n("div",Ft,[qt,n("div",jt,[r(b,{loading:D.value,onClick:Te},{default:v(()=>[Z(" همگامسازی پرداختهای زرینپال ")]),_:1},8,["loading"]),r(b,{onClick:a[0]||(a[0]=i=>ue())},{default:v(()=>[Z("تمدید اشتراک")]),_:1}),r(b,{type:"primary",onClick:a[1]||(a[1]=i=>Ne())},{default:v(()=>[Z("ایجاد اشتراک برای کاربر")]),_:1})])]),r(d,pe(Q,{onRegister:y(_)}),{action:v(({record:i})=>[n("div",Zt,[r(y(j),{class:"cursor-pointer"},{title:v(()=>[Ht]),default:v(()=>[r(F,{icon:"vuesax-linear:add-circle",color:"#059669",onClick:O=>ue(i)},null,8,["onClick"])]),_:2},1024),r(y(j),{class:"cursor-pointer"},{title:v(()=>[Kt]),default:v(()=>[r(F,{icon:"vuesax-linear:close-circle",color:"#F59E0B",onClick:O=>Ue(i)},null,8,["onClick"])]),_:2},1024),r(y(j),{class:"cursor-pointer"},{title:v(()=>[Gt]),default:v(()=>[r(F,{icon:"vuesax-linear:trash",color:"#DC2626",onClick:O=>Be(i)},null,8,["onClick"])]),_:2},1024)])]),_:1},16,["onRegister"])]),_:1}),r(y(o),{key:"gateway",tab:"تنظیمات درگاه (زرینپال)"},{default:v(()=>[Vt,r(Tt)]),_:1})]),_:1},8,["activeKey"]),r(ie,{visible:x.value,"onUpdate:visible":a[11]||(a[11]=i=>x.value=i),title:g.value?"ویرایش اشتراک":"افزودن اشتراک",onOk:Pe,onCancel:p,width:"70%",confirmLoading:z.value>0},{default:v(()=>[n("div",Xt,[z.value>0?(T(),q("div",Jt,[r(y(tt),{size:"large"})])):H("",!0),n("div",Yt,[n("div",null,[Wt,r($,{value:f.value.title,"onUpdate:value":a[3]||(a[3]=i=>f.value.title=i),placeholder:"مثلاً اشتراک یک ماهه"},null,8,["value"])]),n("div",null,[Qt,r($,{value:f.value.duration_days,"onUpdate:value":a[4]||(a[4]=i=>f.value.duration_days=i),type:"number",min:"1",placeholder:"30"},null,8,["value"])])]),n("div",ea,[n("div",null,[ta,r($,{value:f.value.price,"onUpdate:value":a[5]||(a[5]=i=>f.value.price=i),type:"number",min:"0",placeholder:"100000"},null,8,["value"])]),n("div",null,[aa,r($,{value:f.value.discount_percent,"onUpdate:value":a[6]||(a[6]=i=>f.value.discount_percent=i),type:"number",min:"0",max:"100",placeholder:"0"},null,8,["value"])]),n("div",null,[na,n("div",sa,J(se.value),1)])]),n("div",ia,[n("div",null,[la,r($,{value:f.value.sort_order,"onUpdate:value":a[7]||(a[7]=i=>f.value.sort_order=i),type:"number",placeholder:"0"},null,8,["value"])]),n("div",null,[ra,n("div",oa,[r(M,{value:f.value.is_active,"onUpdate:value":a[8]||(a[8]=i=>f.value.is_active=i)},null,8,["value"]),n("span",ua,J(f.value.is_active?"فعال":"غیرفعال"),1)])])]),n("div",null,[ca,r(V,{value:f.value.description,"onUpdate:value":a[9]||(a[9]=i=>f.value.description=i),placeholder:"توضیحات اشتراک",rows:4},null,8,["value"])]),n("div",da,[n("div",null,[pa,r(y(at),{"file-list":R.value,"onUpdate:fileList":a[10]||(a[10]=i=>R.value=i),"before-upload":I,"custom-request":N,accept:"image/*","max-count":1,"list-type":"picture-card"},{default:v(()=>[R.value.length<1?(T(),q("div",_a,[r(F,{icon:"vuesax-linear:image",class:"text-2xl mb-2"}),ma])):H("",!0)]),_:1},8,["file-list"])])])])]),_:1},8,["visible","title","confirmLoading"]),r(Bt,{visible:C.value,"onUpdate:visible":a[12]||(a[12]=i=>C.value=i),mode:E.value,"purchase-id":P.value,"locked-user-id":K.value,onSuccess:y(t)},null,8,["visible","mode","purchase-id","locked-user-id","onSuccess"])]),_:1})])}}});export{pn as default};
|