Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
33 changes: 20 additions & 13 deletions components/control/PaymentsPendingPanel.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,18 @@ import { getTranslations } from "next-intl/server";
/**
* "Card payments are on their way" (SOFRA-PAYMENTS-PLAN §9 P4).
*
* The one window nothing else covers. A self-serve buyer of `online-payments` is
* provisioned WITHOUT it — P1 makes the module and the connected account a pair,
* because `provision-tenant.sh` refuses one without the other and refuses it before
* the database — so they go live on everything else and trade on cash while their
* Stripe account is being verified. Every other surface is honest about that state
* The one window nothing else covers. A buyer of `online-payments` is provisioned
* WITHOUT it — P1 makes the module and the connected account a pair, because
* `provision-tenant.sh` refuses one without the other and refuses it before the
* database — so they go live on everything else and trade on cash meanwhile.
*
* WHAT THIS WINDOW NOW MEANS (ADR-011 amendment). It used to be the ordinary state
* of every self-serve buyer, on the premise that only the restaurant could create a
* Stripe account. The control plane MINTS the account now, so reaching this panel
* means OUR creation did not happen — which makes "there is nothing for you to do
* right now" more true than it was, not less: the outstanding work is ours. That is
* also why the copy still gives no estimate and still names nothing they cannot act
* on; the failure is on our side of a wall they cannot see. Every other surface is honest about that state
* and silent about it: RUMI's own checklist cannot see the purchase (only the grant),
* and the tenant's checkout simply does not offer a card. Only this dashboard holds
* both halves, so only this dashboard can say the thing out loud.
Expand Down Expand Up @@ -38,14 +45,14 @@ export default async function PaymentsPendingPanel({ locale }: { readonly locale
<p className="font-hand text-2xl font-bold">{t("title")}</p>
<p className="text-muted-foreground">{t("body")}</p>
<p className="font-label text-sm text-muted-foreground">{t("billingNote")}</p>
<a
href="https://dashboard.stripe.com"
target="_blank"
rel="noopener noreferrer"
className="font-label underline underline-offset-4 text-muted-foreground w-fit"
>
{t("stripeLink")}
</a>
{/* Prose, not a link, and that is the Express change (ADR-011 amendment).
This used to be an <a> to https://dashboard.stripe.com. Under Express a
restaurant has no full Stripe dashboard to log into, and in THIS state
they have no account at all — so that link led somewhere they could not
get in. The sentence it carried was still useful ("your own Stripe view is
coming, here is what it will ask"), so it is re-stated rather than
deleted: what the short form asks for, and why no link can be kept. */}
<p className="font-label text-sm text-muted-foreground">{t("nextStep")}</p>
</div>
);
}
14 changes: 7 additions & 7 deletions messages/ar.json
Original file line number Diff line number Diff line change
Expand Up @@ -1012,7 +1012,7 @@
"rateLabel": "المعدل (نقاط أساس، 100 = 1٪)",
"rateHint": "مثال: 150 = 1.50٪. الحد الأقصى {max} نقطة أساس.",
"notEligibleRegistryUnavailable": "تعذّرت قراءة سجل المستأجرين، لذا لا يمكن التحقق من أهلية العمولة الآن.",
"notEligibleNotPaired": "سجل هذا المستأجر لا يتضمّن online-payments وstripe_account معًا — يرفض التجهيز أي معدل أكبر من صفر بدون هذا الاقتران، قبل قاعدة البيانات. تبقى العمولة معطّلة حتى يتوفّر الاثنان.",
"notEligibleNotPaired": "لا يحمل سجل هذا المطعم كلاً من online-payments و stripe_account معًا — ويرفض التزويد أي نسبة أكبر من صفر بدون هذا الاقتران، وقبل قاعدة البيانات. صرنا نفتح حساب Stripe بأنفسنا، فغيابه يعني أن الاقتراح لم يستطع إنشاءه (والسبب مذكور في طلب الدمج) أو أن السجل أقدم من ذلك. تبقى العمولة معطّلة حتى يتوفّر الاثنان.",
"submit": "حفظ",
"saving": "جارٍ الحفظ…",
"prOpened": "تم فتح طلب سحب للسجل — ادمجه، ثم أعد تجهيز المستأجر.",
Expand Down Expand Up @@ -1222,18 +1222,18 @@
"rateLabel": "المعدل (نقاط أساس، 100 = 1٪)",
"rateHint": "مثال: 150 = 1.50٪. الحد الأقصى {max} نقطة أساس.",
"notEligibleRegistryUnavailable": "لا يمكننا التحقق من إعداد هذا العميل الآن، لذا تبقى العمولة معطّلة في الوقت الحالي.",
"notEligibleNotPaired": "تتطلب العمولة أن يمتلك هذا العميل وحدة المدفوعات عبر الإنترنت وحساب Stripe خاصًا به. اطلب منّا الاثنين، وسيُفتح هذا الخيار.",
"notEligibleNotPaired": "تتطلّب العمولة أن يكون لدى هذا العميل وحدة online-payments وحساب Stripe. نحن من يفتح هذا الحساب له، فإن كان غائبًا فقد أخفق شيء لدينا — أخبرنا، وسيُفتح هذا الخيار.",
"submit": "حفظ",
"saving": "جارٍ الحفظ…",
"prOpened": "أُرسل إلى SofraPiwas. سنطبّقه على تطبيق عميلك ونؤكد لك — لم يتغيّر شيء في صفحة الدفع بعد.",
"alreadySet": "تطبيق عميلك يعمل بهذا المعدل بالفعل. لا شيء لإرساله."
},
"paymentsPending": {
"kicker": "الدفع بالبطاقة",
"title": "الدفع بالبطاقة في طريقه إليك",
"body": "الدفع بالبطاقة جزء من باقتك. نحن نقوم بتفعيله لك الآن — لا شيء عليك فعله في هذه اللحظة، وسنخبرك فور ظهوره عند صندوقك. حتى ذلك الحين مطعمك يعمل بالكامل ويقبل النقد كالمعتاد.",
"billingNote": "تُحتسب فاتورة باقتك من يوم بدايتها. إذا لم يكن الدفع بالبطاقة مفعّلًا بعد عند وصول فاتورتك الأولى، أخبرنا وسنُقيّد لك ذلك الشهر.",
"stripeLink": "لوحة Stripe الخاصة بك"
"kicker": "المدفوعات بالبطاقة",
"title": "مدفوعاتك بالبطاقة في الطريق",
"body": "المدفوعات بالبطاقة ضمن باقتك. نحن من يفتح حساب Stripe نيابةً عنك، فلا شيء عليك فعله الآن — وسنخبرك فور ظهور البطاقة في نقطة البيع لديك. حتى ذلك الحين مطعمك يعمل بالكامل ويقبل النقد كالمعتاد.",
"billingNote": "تُحتسب باقتك من يوم بدايتها. وإذا لم تكن المدفوعات بالبطاقة مفعّلة عند وصول فاتورتك الأولى، أخبرنا وسنقيّد لك ذلك الشهر.",
"nextStep": "عندما يحين دورك سيعرض عليك Stripe نموذجًا قصيرًا: تاريخ ميلادك، ورقم هاتف، والموافقة على شروطهم. سنرسل لك ذلك الرابط في حينه؛ ورابط Stripe لا يبقى صالحًا سوى دقائق معدودة، فلا فائدة من الاحتفاظ به."
},
"invoice": {
"title": "فاتورة",
Expand Down
14 changes: 7 additions & 7 deletions messages/de.json
Original file line number Diff line number Diff line change
Expand Up @@ -1012,7 +1012,7 @@
"rateLabel": "Satz (Basispunkte, 100 = 1 %)",
"rateHint": "z. B. 150 = 1,50 %. Obergrenze {max} Basispunkte.",
"notEligibleRegistryUnavailable": "Das Tenant-Registry konnte nicht gelesen werden, daher kann die Provisionsberechtigung gerade nicht geprüft werden.",
"notEligibleNotPaired": "Der Registry-Eintrag dieses Tenants enthält nicht beide, online-payments UND ein stripe_account — die Provisionierung lehnt einen Satz über null ohne dieses Paar ab, noch vor der Datenbank. Provision bleibt aus, bis beides vorhanden ist.",
"notEligibleNotPaired": "Der Registry-Eintrag dieses Betriebs führt nicht beides — online-payments und ein stripe_account. Das Provisioning verweigert einen Satz über null ohne dieses Paar, und zwar vor der Datenbank. Das Stripe-Konto eröffnen inzwischen wir, ein fehlendes heißt also: der Vorschlag konnte es nicht anlegen (sein PR nennt den Grund) oder der Eintrag ist älter. Die Provision bleibt aus, bis beides da ist.",
"submit": "Speichern",
"saving": "Wird gespeichert…",
"prOpened": "Registry-PR geöffnet — zusammenführen, dann den Tenant erneut bereitstellen.",
Expand Down Expand Up @@ -1222,18 +1222,18 @@
"rateLabel": "Satz (Basispunkte, 100 = 1 %)",
"rateHint": "z. B. 150 = 1,50 %. Obergrenze {max} Basispunkte.",
"notEligibleRegistryUnavailable": "Wir können die Einrichtung dieses Kunden gerade nicht prüfen, deshalb bleibt die Provision vorerst aus.",
"notEligibleNotPaired": "Für die Provision braucht dieser Kunde das Online-Zahlungsmodul und ein eigenes Stripe-Konto. Fragen Sie uns nach beidem, dann steht diese Wahl offen.",
"notEligibleNotPaired": "Für die Provision braucht dieser Kunde das Modul online-payments und ein Stripe-Konto. Dieses Konto eröffnen wir für ihn — fehlt es, ist bei uns etwas schiefgegangen. Sagen Sie uns Bescheid, dann lässt sich dieser Schalter umlegen.",
"submit": "Speichern",
"saving": "Wird gespeichert…",
"prOpened": "An SofraPiwas gesendet. Wir wenden es auf die App Ihres Kunden an und bestätigen — an der Kasse hat sich noch nichts geändert.",
"alreadySet": "Die App Ihres Kunden läuft bereits mit diesem Satz. Nichts zu senden."
},
"paymentsPending": {
"kicker": "Kartenzahlung",
"title": "Ihre Kartenzahlung ist unterwegs",
"body": "Kartenzahlung gehört zu Ihrem Paket. Wir schalten sie gerade für Sie frei — Sie müssen im Moment nichts tun, und wir sagen Ihnen Bescheid, sobald sie an Ihrer Kasse auftaucht. Bis dahin ist Ihr Restaurant vollständig online und nimmt wie gewohnt Bargeld an.",
"billingNote": "Ihr Paket wird ab dem Starttag abgerechnet. Ist die Kartenzahlung bei Ihrer ersten Rechnung noch nicht freigeschaltet, sagen Sie uns Bescheid — wir schreiben Ihnen diesen Monat gut.",
"stripeLink": "Ihr Stripe-Dashboard"
"kicker": "Kartenzahlungen",
"title": "Ihre Kartenzahlungen sind unterwegs",
"body": "Kartenzahlungen gehören zu Ihrem Tarif. Das Stripe-Konto eröffnen wir für Sie — Sie müssen also gerade nichts tun, und wir sagen Ihnen Bescheid, sobald die Karte an Ihrer Kasse erscheint. Bis dahin ist Ihr Restaurant vollständig live und nimmt wie gewohnt Bargeld an.",
"billingNote": "Ihr Tarif wird ab dem Starttag berechnet. Sind die Kartenzahlungen bei Ihrer ersten Rechnung immer noch nicht aktiv, sagen Sie uns Bescheid — wir schreiben Ihnen diesen Monat gut.",
"nextStep": "Wenn es so weit ist, zeigt Ihnen Stripe ein kurzes Formular: Geburtsdatum, eine Telefonnummer und die Zustimmung zu deren Bedingungen. Den Link dazu schicken wir Ihnen, wenn Sie an der Reihe sind; ein Stripe-Link gilt nur wenige Minuten, aufheben lohnt sich also nie."
},
"invoice": {
"title": "Rechnung",
Expand Down
8 changes: 4 additions & 4 deletions messages/en.json
Original file line number Diff line number Diff line change
Expand Up @@ -1012,7 +1012,7 @@
"rateLabel": "Rate (basis points, 100 = 1%)",
"rateHint": "e.g. 150 = 1.50%. Ceiling {max} bps.",
"notEligibleRegistryUnavailable": "The tenant registry could not be read, so commission eligibility cannot be checked right now.",
"notEligibleNotPaired": "This tenant's registry entry does not carry both online-payments and a stripe_account — provisioning refuses a non-zero rate without that pair, before the database. Commission stays off until both are there.",
"notEligibleNotPaired": "This tenant's registry entry does not carry both online-payments and a stripe_account — provisioning refuses a non-zero rate without that pair, before the database. We open the Stripe account ourselves now, so a missing one means the proposal could not create it (its PR says why) or the entry predates that. Commission stays off until both are there.",
"submit": "Save",
"saving": "Saving…",
"prOpened": "Registry PR opened — merge it, then re-provision the tenant.",
Expand Down Expand Up @@ -1222,7 +1222,7 @@
"rateLabel": "Rate (basis points, 100 = 1%)",
"rateHint": "e.g. 150 = 1.50%. Ceiling {max} bps.",
"notEligibleRegistryUnavailable": "We can't check this client's setup right now, so commission stays off for the moment.",
"notEligibleNotPaired": "Commission needs this client to have the online-payments module and their own Stripe account. Ask us for both, and this switch opens up.",
"notEligibleNotPaired": "Commission needs this client's tenant to have the online-payments module and a Stripe account. We open that account for them, so if it is missing something went wrong on our side — ask us, and this switch opens up.",
"submit": "Save",
"saving": "Saving…",
"prOpened": "Sent to SofraPiwas. We apply it to your client's app and confirm — nothing has changed at their checkout yet.",
Expand All @@ -1231,9 +1231,9 @@
"paymentsPending": {
"kicker": "Card payments",
"title": "Card payments are on their way",
"body": "You bought card payments with your plan. We're switching them on for you there's nothing for you to do right now, and we'll tell you the moment they appear at your checkout. Until then your restaurant is fully live and taking cash as usual.",
"body": "You bought card payments with your plan. We open the Stripe account for you, so there is nothing for you to do right nowand we will tell you the moment cards appear at your checkout. Until then your restaurant is fully live and taking cash as usual.",
"billingNote": "Your plan is billed from the day it started. If card payments still aren't switched on when your first invoice arrives, just ask us and we'll credit that month.",
"stripeLink": "Your Stripe dashboard"
"nextStep": "When it is ready you will get one short form from Stripe — your date of birth, a phone number, and agreeing to their terms. We will send you that link when it is your turn; a Stripe link only stays alive for a few minutes, so it is never worth keeping one."
},
"invoice": {
"title": "Invoice",
Expand Down
10 changes: 5 additions & 5 deletions messages/fr.json
Original file line number Diff line number Diff line change
Expand Up @@ -1012,7 +1012,7 @@
"rateLabel": "Taux (points de base, 100 = 1 %)",
"rateHint": "ex. 150 = 1,50 %. Plafond {max} points de base.",
"notEligibleRegistryUnavailable": "Le registre des tenants n'a pas pu être lu, l'éligibilité à la commission ne peut donc pas être vérifiée pour l'instant.",
"notEligibleNotPaired": "L'entrée de registre de ce tenant ne comporte pas à la fois online-payments et un stripe_account — le provisionnement refuse un taux non nul sans ce couple, avant même la base de données. La commission reste désactivée tant que les deux ne sont pas présents.",
"notEligibleNotPaired": "L'entrée de ce restaurant ne porte pas à la fois online-payments et un stripe_account — le provisioning refuse un taux non nul sans cette paire, avant la base de données. C'est nous qui ouvrons désormais le compte Stripe : son absence signifie donc que la proposition n'a pas pu le créer (sa PR en donne la raison), ou que l'entrée est antérieure. La commission reste désactivée tant que les deux ne sont pas .",
"submit": "Enregistrer",
"saving": "Enregistrement…",
"prOpened": "PR de registre ouverte — fusionnez-la, puis reprovisionnez le tenant.",
Expand Down Expand Up @@ -1222,7 +1222,7 @@
"rateLabel": "Taux (points de base, 100 = 1 %)",
"rateHint": "ex. 150 = 1,50 %. Plafond {max} points de base.",
"notEligibleRegistryUnavailable": "Nous ne pouvons pas vérifier la configuration de ce client pour l'instant : la commission reste donc désactivée.",
"notEligibleNotPaired": "La commission exige que ce client dispose du module de paiements en ligne et de son propre compte Stripe. Demandez-nous les deux et ce choix s'ouvrira.",
"notEligibleNotPaired": "La commission exige que ce client dispose du module online-payments et d'un compte Stripe. Ce compte, c'est nous qui l'ouvrons pour lui : s'il manque, c'est que quelque chose a échoué de notre côté — demandez-nous, et ce réglage s'ouvrira.",
"submit": "Enregistrer",
"saving": "Enregistrement…",
"prOpened": "Envoyé à SofraPiwas. Nous l'appliquons à l'application de votre client et vous confirmons — rien n'a encore changé à son encaissement.",
Expand All @@ -1231,9 +1231,9 @@
"paymentsPending": {
"kicker": "Paiements par carte",
"title": "Vos paiements par carte arrivent",
"body": "Votre offre inclut les paiements par carte. Nous sommes en train de les activer pour vous vous n'avez rien à faire pour l'instant, et nous vous préviendrons dès qu'ils apparaîtront à votre caisse. D'ici là, votre restaurant est pleinement en ligne et encaisse les espèces comme d'habitude.",
"billingNote": "Votre offre est facturée à partir du jour où elle a démarré. Si les paiements par carte ne sont toujours pas activés à l'arrivée de votre première facture, demandez-nous et nous créditons ce mois-là.",
"stripeLink": "Votre tableau de bord Stripe"
"body": "Vous avez pris les paiements par carte avec votre formule. C'est nous qui ouvrons le compte Stripe pour vous : vous n'avez donc rien à faire pour l'instant, et nous vous prévenons dès que la carte apparaît à votre caisse. D'ici là, votre restaurant est pleinement en ligne et encaisse en espèces comme d'habitude.",
"billingNote": "Votre formule est facturée à partir du jour de son démarrage. Si les paiements par carte ne sont toujours pas actifs à l'arrivée de votre première facture, demandez-nous et nous créditons ce mois-là.",
"nextStep": "Le moment venu, Stripe vous présentera un court formulaire : votre date de naissance, un numéro de téléphone, et l'acceptation de leurs conditions. Nous vous transmettrons ce lien quand ce sera votre tour ; un lien Stripe ne reste valable que quelques minutes, il ne sert donc jamais à rien d'en garder un."
},
"invoice": {
"title": "Facture",
Expand Down
Loading
Loading