update marketing
All checks were successful
Build, Push and Deploy / build-and-push (push) Successful in 5m14s
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 17s
Build, Push and Deploy / deploy-staging (push) Successful in 41s
Build, Push and Deploy / deploy-production (push) Has been skipped

This commit is contained in:
2026-05-14 11:55:22 +07:00
parent f80fcc4c1b
commit 05fd3230b8
448 changed files with 17545 additions and 5128 deletions

View File

@@ -0,0 +1,39 @@
<?php
namespace Modules\MarketingAddon\App\Http\Controllers;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use Modules\MarketingAddon\App\Models\EmailSetting;
class AcnooEmailSettingController extends Controller
{
public function index()
{
$businessId = auth()->user()->business_id;
$email_setting = EmailSetting::where('business_id', $businessId)->first() ?? new EmailSetting();
return view('marketingaddon::email-settings.index', compact('email_setting'));
}
public function store(Request $request)
{
$request->validate([
'driver' => 'required|string|max:25|in:smtp,sendmail',
'host' => 'nullable|string|max:255',
'port' => 'nullable|numeric',
'username' => 'nullable|string|max:255',
'password' => 'nullable|string|max:255',
'encryption' => 'nullable|string|max:25',
'from_name' => 'nullable|string|max:255',
'from_address' => 'nullable|string|max:255',
]);
EmailSetting::updateOrCreate(
['business_id' => auth()->user()->business_id],
$request->only(['driver', 'host', 'port', 'username', 'password', 'encryption', 'from_name', 'from_address'])
);
return response()->json(__('Email setting updated successfully.'));
}
}

View File

@@ -0,0 +1,48 @@
<?php
namespace Modules\MarketingAddon\App\Http\Controllers;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Modules\MarketingAddon\App\Models\MessageReport;
class AcnooMessageLogController extends Controller
{
public function index(Request $request)
{
$message_logs = MessageReport::with('user:id,email')
->where('business_id', auth()->user()->business_id)
->when($request->search, function ($q) use ($request) {
$q->where(function ($q) use ($request) {
$q->where('title', 'like', '%' . $request->search . '%')
->orWhere('channel', 'like', '%' . $request->search . '%')
->orWhere('phone', 'like', '%' . $request->search . '%')
->orWhere('status', 'like', '%' . $request->search . '%')
->orWhereHas('user', function ($q) use ($request) {
$q->where('email', 'like', '%' . $request->search . '%');
});
});
})
->when($request->type, function ($q) use ($request) {
$q->where(function ($q) use ($request) {
$q->where('channel', $request->type);
});
})
->when($request->status, function ($q) use ($request) {
$q->where(function ($q) use ($request) {
$q->where('status', $request->status);
});
})
->latest()
->paginate($request->per_page ?? 20)
->appends($request->query());
if ($request->ajax()) {
return response()->json([
'data' => view('marketingaddon::message-logs.datas', compact('message_logs'))->render(),
]);
}
return view('marketingaddon::message-logs.index', compact('message_logs'));
}
}

View File

@@ -0,0 +1,154 @@
<?php
namespace Modules\MarketingAddon\App\Http\Controllers;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Illuminate\Validation\Rule;
use Maatwebsite\Excel\Facades\Excel;
use Modules\MarketingAddon\App\Exports\SmsGatewayExport;
use Modules\MarketingAddon\App\Models\GatewayType;
use Modules\MarketingAddon\App\Models\Smsgateway;
class AcnooSmsGatewayController extends Controller
{
public function index(Request $request)
{
$gateways = Smsgateway::with('type:id,name')
->where('business_id', auth()->user()->business_id)
->when($request->filled('channel'), function ($q) use ($request) {
$q->where('channel', $request->channel);
})
->when($request->filled('search'), function ($q) use ($request) {
$q->where(function ($query) use ($request) {
$query->where('name', 'like', '%' . $request->search . '%')
->orWhereHas('type', function ($type) use ($request) {
$type->where('name', 'like', '%' . $request->search . '%');
});
});
})
->latest()
->paginate($request->per_page ?? 20)
->appends($request->query());
if ($request->ajax()) {
return response()->json([
'data' => view('marketingaddon::sms-gateways.datas', compact('gateways'))->render()
]);
}
return view('marketingaddon::sms-gateways.index', compact('gateways'));
}
public function create(Request $request)
{
$types = GatewayType::where('channel', $request->channel)
->latest()
->get();
return view('marketingaddon::sms-gateways.create', compact('types'));
}
public function store(Request $request)
{
$request->validate([
'status' => 'required|integer',
'params' => 'required|array',
'params.*' => 'required|string',
'name' => [
'required',
Rule::unique('smsgateways')->where(function ($q) {
return $q->where('business_id', auth()->user()->business_id);
}),
],
'type_id' => 'required|exists:gateway_types,id',
]);
$type = GatewayType::findOrFail($request->type_id);
Smsgateway::create($request->all() + [
'driver' => $type->driver,
'namespace' => $type->namespace,
'business_id' => auth()->user()->business_id
]);
return response()->json([
'message' => __(':channel gateway created successfully.', ['channel' => ucfirst($request->channel)]),
'redirect' => route('business.sms-gateways.index', ['channel' => $request->channel])
]);
}
public function show(string $id)
{
$gateway = Smsgateway::findOrFail($id);
$gateway->update(['status' => !$gateway->status]);
return response()->json(['message' => 'Sms gateway']);
}
public function edit(Request $request, string $id)
{
$types = GatewayType::where('channel', $request->channel)->latest()->get();
$gateway = Smsgateway::where('business_id', auth()->user()->business_id)->findOrFail($id);
return view('marketingaddon::sms-gateways.edit', compact('gateway', 'types'));
}
public function update(Request $request, string $id)
{
$request->validate([
'status' => 'required|integer',
'params' => 'required|array',
'params.*' => 'required|string',
'type_id' => 'required|exists:gateway_types,id',
'name' => [
'required',
Rule::unique('smsgateways', 'name')->ignore($id)->where(function ($q) {
return $q->where('business_id', auth()->user()->business_id);
}),
],
]);
$type = GatewayType::findOrFail($request->type_id);
$gateway = Smsgateway::findOrFail($id);
$gateway->update($request->all() + [
'driver' => $type->driver,
'namespace' => $type->namespace
]);
return response()->json([
'message' => __(':channel gateway updated successfully.', ['channel' => ucfirst($request->channel)]),
'redirect' => route('business.sms-gateways.index', ['channel' => $request->channel])
]);
}
public function destroy(Request $request, string $id)
{
Smsgateway::where('id', $id)->delete();
return response()->json([
'message' => __(':channel gateway deleted successfully.', ['channel' => ucfirst($request->channel)]),
'redirect' => route('business.sms-gateways.index', ['channel' => $request->channel])
]);
}
public function deleteAll(Request $request)
{
Smsgateway::whereIn('id', $request->ids)->delete();
return response()->json([
'message' => __('Selected :channel gateway deleted successfully.', ['channel' => $request->channel]),
'redirect' => route('business.sms-gateways.index', ['channel' => $request->channel])
]);
}
public function exportExcel()
{
return Excel::download(new SmsGatewayExport, 'sms-gateway.xlsx');
}
public function exportCsv()
{
return Excel::download(new SmsGatewayExport, 'sms-gateway.csv');
}
}

View File

@@ -0,0 +1,37 @@
<?php
namespace Modules\MarketingAddon\App\Http\Controllers;
use App\Models\Option;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Cache;
class AcnooSmsGatewaySettingController extends Controller
{
public function index()
{
$businessId = auth()->user()->business_id;
$sms_gateway_setting_key = 'sms-gateway-setting-' . $businessId;
$sms_gateway_setting = Option::where('key', $sms_gateway_setting_key)->first();
return view('marketingaddon::sms-gateway-settings.index', compact('sms_gateway_setting'));
}
public function store(Request $request)
{
$request->validate([
'sms_gateway_setting' => 'required|string|max:100|in:api,android',
]);
$key = 'sms-gateway-setting-' . auth()->user()->business_id;
Option::updateOrCreate(
['key' => $key],
['value' => $request->sms_gateway_setting]
);
Cache::forget($key);
return response()->json(__('SMS Gateway setting updated successfully.'));
}
}

View File

@@ -0,0 +1,87 @@
<?php
namespace Modules\MarketingAddon\App\Http\Controllers;
use App\Models\Option;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Cache;
use Modules\MarketingAddon\App\Models\Template;
class AcnooTemplateController extends Controller
{
public function index(Request $request)
{
$businessId = auth()->user()->business_id;
$type = $request->type;
$templates = Template::where('business_id', $businessId)
->where('type', $type)
->get()
->keyBy('title');
$page_data = Option::where('key', 'notification_settings_' . $businessId)->first()?->value ?? [];
return view('marketingaddon::templates.index', compact('templates', 'page_data'));
}
public function store(Request $request)
{
$businessId = auth()->user()->business_id;
$type = $request->type;
$tabs = ['new_sale', 'payment_received', 'payment_paid', 'purchase', 'payment_reminder', 'attendance'];
$request->validate(collect($tabs)
->flatMap(function ($key) use ($request, $type) {
if (!$request->has($key)) {
return [];
}
return [
"{$key}.template" => 'nullable|string|max:255',
"{$key}.subject" => $type === 'email' ? 'required|string|max:255' : 'nullable|string|max:255',
"{$key}.message" => 'required|string|max:1000',
];
})->toArray()
);
$optionKey = 'notification_settings_' . $businessId;
$option = Option::firstOrCreate(
['key' => $optionKey],
['value' => []]
);
$optionValue = $option->value ?? [];
foreach ($tabs as $tab) {
if (!$request->has($tab)) continue;
$tabData = $request->{$tab};
$optionValue[$tab][$type]['enabled'] = $tabData[$type]['enabled'] ?? 0;
$message = $tabData['message'] ?? null;
$variables = $message ? extractTemplateVariables($message) : [];
Template::updateOrCreate(
[
'business_id' => $businessId,
'title' => $tab,
'type' => $type,
],
[
'subject' => $tabData['subject'] ?? null,
'template' => $tabData['template'] ?? null,
'message' => $message,
'variables' => $variables,
]
);
}
$option->update(['value' => $optionValue]);
Cache::forget($optionKey);
return response()->json(__(ucfirst($type) . ' template updated successfully'));
}
}

View File

@@ -0,0 +1,21 @@
<?php
namespace Modules\MarketingAddon\App\Http\Controllers;
use App\Models\Party;
use App\Http\Controllers\Controller;
class PaymentReminderController extends Controller
{
/**
* Display a listing of the resource.
*/
public function index(string $party_id)
{
$party = Party::with('business')->findOrFail($party_id);
$this->paymentReminderMessage($party->business, $party);
return redirect()->back()->with('message', 'Payment reminder sent successfully.');
}
}