Add ZarinPal e-payment and related checkout/search fixes.

Business settings can store ZarinPal merchant credentials, and the payment registry can initiate and verify ZarinPal alongside Mellat.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
Alireza Hassani
2026-08-16 01:45:41 +03:30
co-authored by Cursor
parent c76c3967bb
commit b991a60cbc
19 changed files with 542 additions and 39 deletions
+10 -5
View File
@@ -89,7 +89,10 @@ if [[ -f .next/standalone/server.js ]]; then
cp -a .next/static .next/standalone/.next/static
if [[ -d public ]]; then
rm -rf .next/standalone/public
cp -a public .next/standalone/public
# Follow symlinks (e.g. public/images -> ../src/images) so standalone
# serves real files. cp -a alone would copy a broken relative link.
mkdir -p .next/standalone/public
cp -aL public/. .next/standalone/public/
fi
SLUG="$SLUG" ROOT="$ROOT" ECOSYSTEM="$ECOSYSTEM" node <<'NODE'
@@ -121,6 +124,7 @@ app.cwd = root + '/.next/standalone';
app.script = 'server.js';
app.args = '';
app.env = {
...(app.env || {}),
NODE_ENV: 'production',
PORT: String(port),
HOSTNAME: '127.0.0.1',
@@ -136,15 +140,16 @@ cfg.apps.forEach((entry, idx) => {
lines.push(` args: ${JSON.stringify(entry.args)},`);
}
lines.push(' env: {');
lines.push(` NODE_ENV: ${JSON.stringify(entry.env.NODE_ENV)},`);
lines.push(` PORT: ${JSON.stringify(entry.env.PORT)},`);
if (entry.env.HOSTNAME) {
lines.push(` HOSTNAME: ${JSON.stringify(entry.env.HOSTNAME)},`);
for (const [key, value] of Object.entries(entry.env || {})) {
lines.push(` ${key}: ${JSON.stringify(String(value))},`);
}
lines.push(' },');
lines.push(` error_file: ${JSON.stringify(entry.error_file)},`);
lines.push(` out_file: ${JSON.stringify(entry.out_file)},`);
lines.push(' time: true,');
if (entry.max_memory_restart) {
lines.push(` max_memory_restart: ${JSON.stringify(entry.max_memory_restart)},`);
}
lines.push(idx === cfg.apps.length - 1 ? ' }' : ' },');
});
lines.push(' ],');