meta data za SMS
This commit is contained in:
parent
1395b72ae8
commit
46feba2df7
|
|
@ -98,6 +98,10 @@ public function show(Package $package, SmsService $sms): Response
|
||||||
'start_date' => (string) ($c->start_date ?? ''),
|
'start_date' => (string) ($c->start_date ?? ''),
|
||||||
'end_date' => (string) ($c->end_date ?? ''),
|
'end_date' => (string) ($c->end_date ?? ''),
|
||||||
];
|
];
|
||||||
|
// Include contract.meta as flattened key-value pairs
|
||||||
|
if (is_array($c->meta) && ! empty($c->meta)) {
|
||||||
|
$vars['contract']['meta'] = $this->flattenMeta($c->meta);
|
||||||
|
}
|
||||||
if ($c->account) {
|
if ($c->account) {
|
||||||
$initialRaw = (string) $c->account->initial_amount;
|
$initialRaw = (string) $c->account->initial_amount;
|
||||||
$balanceRaw = (string) $c->account->balance_amount;
|
$balanceRaw = (string) $c->account->balance_amount;
|
||||||
|
|
@ -157,6 +161,10 @@ public function show(Package $package, SmsService $sms): Response
|
||||||
'start_date' => (string) ($c->start_date ?? ''),
|
'start_date' => (string) ($c->start_date ?? ''),
|
||||||
'end_date' => (string) ($c->end_date ?? ''),
|
'end_date' => (string) ($c->end_date ?? ''),
|
||||||
];
|
];
|
||||||
|
// Include contract.meta as flattened key-value pairs
|
||||||
|
if (is_array($c->meta) && ! empty($c->meta)) {
|
||||||
|
$vars['contract']['meta'] = $this->flattenMeta($c->meta);
|
||||||
|
}
|
||||||
if ($c->account) {
|
if ($c->account) {
|
||||||
$initialRaw = (string) $c->account->initial_amount;
|
$initialRaw = (string) $c->account->initial_amount;
|
||||||
$balanceRaw = (string) $c->account->balance_amount;
|
$balanceRaw = (string) $c->account->balance_amount;
|
||||||
|
|
@ -479,4 +487,47 @@ public function storeFromContracts(StorePackageFromContractsRequest $request, Ph
|
||||||
|
|
||||||
return back()->with('success', 'Package created from contracts');
|
return back()->with('success', 'Package created from contracts');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Flatten nested meta structure into dot-notation key-value pairs.
|
||||||
|
* Extracts 'value' from objects with {title, value, type} structure.
|
||||||
|
* Also creates direct access aliases for nested fields (skipping numeric keys).
|
||||||
|
*/
|
||||||
|
private function flattenMeta(array $meta, string $prefix = ''): array
|
||||||
|
{
|
||||||
|
$result = [];
|
||||||
|
foreach ($meta as $key => $value) {
|
||||||
|
$newKey = $prefix === '' ? $key : "{$prefix}.{$key}";
|
||||||
|
|
||||||
|
if (is_array($value)) {
|
||||||
|
// Check if it's a structured meta entry with 'value' field
|
||||||
|
if (isset($value['value'])) {
|
||||||
|
$result[$newKey] = $value['value'];
|
||||||
|
// If parent key is numeric, also create direct alias without the number
|
||||||
|
if ($prefix !== '' && is_numeric($key)) {
|
||||||
|
$result[$key] = $value['value'];
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// Recursively flatten nested arrays
|
||||||
|
$nested = $this->flattenMeta($value, $newKey);
|
||||||
|
$result = array_merge($result, $nested);
|
||||||
|
|
||||||
|
// If current key is numeric, also flatten without it for easier access
|
||||||
|
if (is_numeric($key)) {
|
||||||
|
$directNested = $this->flattenMeta($value, $prefix);
|
||||||
|
foreach ($directNested as $dk => $dv) {
|
||||||
|
// Only add if not already set (prefer first occurrence)
|
||||||
|
if (! isset($result[$dk])) {
|
||||||
|
$result[$dk] = $dv;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$result[$newKey] = $value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return $result;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1836,7 +1836,7 @@ public function listContracts(ClientCase $clientCase)
|
||||||
{
|
{
|
||||||
$contracts = $clientCase->contracts()
|
$contracts = $clientCase->contracts()
|
||||||
->with('account.type')
|
->with('account.type')
|
||||||
->select('id', 'uuid', 'reference', 'active', 'start_date', 'end_date')
|
->select('id', 'uuid', 'reference', 'active', 'start_date', 'end_date', 'meta')
|
||||||
->latest('id')
|
->latest('id')
|
||||||
->get()
|
->get()
|
||||||
->map(function ($c) {
|
->map(function ($c) {
|
||||||
|
|
@ -1852,6 +1852,7 @@ public function listContracts(ClientCase $clientCase)
|
||||||
'active' => (bool) $c->active,
|
'active' => (bool) $c->active,
|
||||||
'start_date' => (string) ($c->start_date ?? ''),
|
'start_date' => (string) ($c->start_date ?? ''),
|
||||||
'end_date' => (string) ($c->end_date ?? ''),
|
'end_date' => (string) ($c->end_date ?? ''),
|
||||||
|
'meta' => is_array($c->meta) && ! empty($c->meta) ? $this->flattenMeta($c->meta) : null,
|
||||||
'account' => $acc ? [
|
'account' => $acc ? [
|
||||||
'reference' => $acc->reference,
|
'reference' => $acc->reference,
|
||||||
'type' => $acc->type?->name,
|
'type' => $acc->type?->name,
|
||||||
|
|
@ -1894,6 +1895,10 @@ public function previewSms(ClientCase $clientCase, Request $request, SmsService
|
||||||
'start_date' => (string) ($contract->start_date ?? ''),
|
'start_date' => (string) ($contract->start_date ?? ''),
|
||||||
'end_date' => (string) ($contract->end_date ?? ''),
|
'end_date' => (string) ($contract->end_date ?? ''),
|
||||||
];
|
];
|
||||||
|
// Include contract.meta as flattened key-value pairs
|
||||||
|
if (is_array($contract->meta) && ! empty($contract->meta)) {
|
||||||
|
$vars['contract']['meta'] = $this->flattenMeta($contract->meta);
|
||||||
|
}
|
||||||
if ($contract->account) {
|
if ($contract->account) {
|
||||||
$initialRaw = (string) $contract->account->initial_amount;
|
$initialRaw = (string) $contract->account->initial_amount;
|
||||||
$balanceRaw = (string) $contract->account->balance_amount;
|
$balanceRaw = (string) $contract->account->balance_amount;
|
||||||
|
|
@ -1917,4 +1922,47 @@ public function previewSms(ClientCase $clientCase, Request $request, SmsService
|
||||||
'variables' => $vars,
|
'variables' => $vars,
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Flatten nested meta structure into dot-notation key-value pairs.
|
||||||
|
* Extracts 'value' from objects with {title, value, type} structure.
|
||||||
|
* Also creates direct access aliases for nested fields (skipping numeric keys).
|
||||||
|
*/
|
||||||
|
private function flattenMeta(array $meta, string $prefix = ''): array
|
||||||
|
{
|
||||||
|
$result = [];
|
||||||
|
foreach ($meta as $key => $value) {
|
||||||
|
$newKey = $prefix === '' ? $key : "{$prefix}.{$key}";
|
||||||
|
|
||||||
|
if (is_array($value)) {
|
||||||
|
// Check if it's a structured meta entry with 'value' field
|
||||||
|
if (isset($value['value'])) {
|
||||||
|
$result[$newKey] = $value['value'];
|
||||||
|
// If parent key is numeric, also create direct alias without the number
|
||||||
|
if ($prefix !== '' && is_numeric($key)) {
|
||||||
|
$result[$key] = $value['value'];
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// Recursively flatten nested arrays
|
||||||
|
$nested = $this->flattenMeta($value, $newKey);
|
||||||
|
$result = array_merge($result, $nested);
|
||||||
|
|
||||||
|
// If current key is numeric, also flatten without it for easier access
|
||||||
|
if (is_numeric($key)) {
|
||||||
|
$directNested = $this->flattenMeta($value, $prefix);
|
||||||
|
foreach ($directNested as $dk => $dv) {
|
||||||
|
// Only add if not already set (prefer first occurrence)
|
||||||
|
if (! isset($result[$dk])) {
|
||||||
|
$result[$dk] = $dv;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$result[$newKey] = $value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return $result;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -9,8 +9,8 @@
|
||||||
use App\Models\SmsSender;
|
use App\Models\SmsSender;
|
||||||
use App\Models\SmsTemplate;
|
use App\Models\SmsTemplate;
|
||||||
use App\Services\Sms\SmsService;
|
use App\Services\Sms\SmsService;
|
||||||
use Illuminate\Bus\Queueable;
|
|
||||||
use Illuminate\Bus\Batchable;
|
use Illuminate\Bus\Batchable;
|
||||||
|
use Illuminate\Bus\Queueable;
|
||||||
use Illuminate\Contracts\Queue\ShouldQueue;
|
use Illuminate\Contracts\Queue\ShouldQueue;
|
||||||
use Illuminate\Foundation\Bus\Dispatchable;
|
use Illuminate\Foundation\Bus\Dispatchable;
|
||||||
use Illuminate\Queue\InteractsWithQueue;
|
use Illuminate\Queue\InteractsWithQueue;
|
||||||
|
|
@ -19,7 +19,7 @@
|
||||||
|
|
||||||
class PackageItemSmsJob implements ShouldQueue
|
class PackageItemSmsJob implements ShouldQueue
|
||||||
{
|
{
|
||||||
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels, Batchable;
|
use Batchable, Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
|
||||||
|
|
||||||
public function __construct(public int $packageItemId)
|
public function __construct(public int $packageItemId)
|
||||||
{
|
{
|
||||||
|
|
@ -70,6 +70,10 @@ public function handle(SmsService $sms): void
|
||||||
'start_date' => (string) ($contract->start_date ?? ''),
|
'start_date' => (string) ($contract->start_date ?? ''),
|
||||||
'end_date' => (string) ($contract->end_date ?? ''),
|
'end_date' => (string) ($contract->end_date ?? ''),
|
||||||
];
|
];
|
||||||
|
// Include contract.meta as flattened key-value pairs for template access
|
||||||
|
if (is_array($contract->meta) && ! empty($contract->meta)) {
|
||||||
|
$variables['contract']['meta'] = $this->flattenMeta($contract->meta);
|
||||||
|
}
|
||||||
if ($contract->account) {
|
if ($contract->account) {
|
||||||
// Preserve raw values and provide EU-formatted versions for SMS rendering
|
// Preserve raw values and provide EU-formatted versions for SMS rendering
|
||||||
$initialRaw = (string) $contract->account->initial_amount;
|
$initialRaw = (string) $contract->account->initial_amount;
|
||||||
|
|
@ -234,4 +238,47 @@ public function handle(SmsService $sms): void
|
||||||
$sendClosure();
|
$sendClosure();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Flatten nested meta structure into dot-notation key-value pairs.
|
||||||
|
* Extracts 'value' from objects with {title, value, type} structure.
|
||||||
|
* Also creates direct access aliases for nested fields (skipping numeric keys).
|
||||||
|
*/
|
||||||
|
private function flattenMeta(array $meta, string $prefix = ''): array
|
||||||
|
{
|
||||||
|
$result = [];
|
||||||
|
foreach ($meta as $key => $value) {
|
||||||
|
$newKey = $prefix === '' ? $key : "{$prefix}.{$key}";
|
||||||
|
|
||||||
|
if (is_array($value)) {
|
||||||
|
// Check if it's a structured meta entry with 'value' field
|
||||||
|
if (isset($value['value'])) {
|
||||||
|
$result[$newKey] = $value['value'];
|
||||||
|
// If parent key is numeric, also create direct alias without the number
|
||||||
|
if ($prefix !== '' && is_numeric($key)) {
|
||||||
|
$result[$key] = $value['value'];
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// Recursively flatten nested arrays
|
||||||
|
$nested = $this->flattenMeta($value, $newKey);
|
||||||
|
$result = array_merge($result, $nested);
|
||||||
|
|
||||||
|
// If current key is numeric, also flatten without it for easier access
|
||||||
|
if (is_numeric($key)) {
|
||||||
|
$directNested = $this->flattenMeta($value, $prefix);
|
||||||
|
foreach ($directNested as $dk => $dv) {
|
||||||
|
// Only add if not already set (prefer first occurrence)
|
||||||
|
if (! isset($result[$dk])) {
|
||||||
|
$result[$dk] = $dv;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$result[$newKey] = $value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return $result;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -250,6 +250,41 @@ const formatEu = (value, decimals = 2) => {
|
||||||
}).format(isNaN(num) ? 0 : num);
|
}).format(isNaN(num) ? 0 : num);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Flatten meta structure on the client side (mirrors backend logic)
|
||||||
|
const flattenMeta = (meta, prefix = "") => {
|
||||||
|
if (!meta || typeof meta !== "object") return {};
|
||||||
|
const result = {};
|
||||||
|
for (const [key, value] of Object.entries(meta)) {
|
||||||
|
const newKey = prefix === "" ? key : `${prefix}.${key}`;
|
||||||
|
if (value && typeof value === "object") {
|
||||||
|
// Check if it's a structured meta entry with 'value' field
|
||||||
|
if ("value" in value) {
|
||||||
|
result[newKey] = value.value;
|
||||||
|
// If parent key is numeric, also create direct alias
|
||||||
|
if (prefix !== "" && /^\d+$/.test(key)) {
|
||||||
|
result[key] = value.value;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// Recursively flatten nested objects
|
||||||
|
const nested = flattenMeta(value, newKey);
|
||||||
|
Object.assign(result, nested);
|
||||||
|
// If current key is numeric, also flatten without it
|
||||||
|
if (/^\d+$/.test(key)) {
|
||||||
|
const directNested = flattenMeta(value, prefix);
|
||||||
|
for (const [dk, dv] of Object.entries(directNested)) {
|
||||||
|
if (!(dk in result)) {
|
||||||
|
result[dk] = dv;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
result[newKey] = value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
};
|
||||||
|
|
||||||
const renderTokens = (text, vars) => {
|
const renderTokens = (text, vars) => {
|
||||||
if (!text) return "";
|
if (!text) return "";
|
||||||
const resolver = (obj, path) => {
|
const resolver = (obj, path) => {
|
||||||
|
|
@ -355,6 +390,7 @@ const buildVarsFromSelectedContract = () => {
|
||||||
if (!uuid) return {};
|
if (!uuid) return {};
|
||||||
const c = (contractsForCase.value || []).find((x) => x.uuid === uuid);
|
const c = (contractsForCase.value || []).find((x) => x.uuid === uuid);
|
||||||
if (!c) return {};
|
if (!c) return {};
|
||||||
|
|
||||||
const vars = {
|
const vars = {
|
||||||
contract: {
|
contract: {
|
||||||
uuid: c.uuid,
|
uuid: c.uuid,
|
||||||
|
|
@ -363,6 +399,15 @@ const buildVarsFromSelectedContract = () => {
|
||||||
end_date: c.end_date || "",
|
end_date: c.end_date || "",
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
// Include contract.meta - flatten if needed (in case server returns nested structure)
|
||||||
|
if (c.meta && typeof c.meta === "object") {
|
||||||
|
// Check if already flattened (no nested objects with 'value' property)
|
||||||
|
const hasStructuredMeta = Object.values(c.meta).some(
|
||||||
|
(v) => v && typeof v === "object" && "value" in v
|
||||||
|
);
|
||||||
|
vars.contract.meta = hasStructuredMeta ? flattenMeta(c.meta) : c.meta;
|
||||||
|
}
|
||||||
|
|
||||||
if (c.account) {
|
if (c.account) {
|
||||||
vars.account = {
|
vars.account = {
|
||||||
reference: c.account.reference,
|
reference: c.account.reference,
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user