Members choose how their link places people
Terry asked how a referral of his would be set up as "Direct with
spillover", and whether his team could follow suit. Two settings, on the
member's own dashboard:
Team rotation — the join goes to the next position IN THEIR OWN TEAM
that still needs its 2
Direct — every join lands directly under them, as depth
A new position starts on whatever its SPONSOR was using at the moment it
joined, so a team duplicates its leader by default. That is a one-time
copy, not a live link: a sponsor changing their mind later never moves
anyone already in their team, and an explicit choice is never overwritten
from above. The panel says where an inherited setting came from, so nobody
discovers months later that their link was doing something they did not
pick.
Also closed the hole behind Terry's original complaint: a member's
personal link no longer falls through to the COMPANY rotation when their
leg is fully qualified. Team rotation means rotation inside their own
downline and nothing else — handing someone's referral to a position they
have never met was never the intent, and it is what offered Terry's
prospects #148.
The five positions already on directDefaultIds (21, 137, 139, 30, 840)
read as explicit Direct, so nothing changes for them. Everyone else stays
on Team rotation, which is what they have today.
qa/placement.mjs, 17 checks: defaults, choosing, inheritance from the
sponsor, explicit choices surviving a re-run, a sponsor switching not
moving their existing team, and persistence across a restart.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -799,6 +799,7 @@
|
||||
// page has always honoured that; this panel did not, and told the member their link
|
||||
// routed to someone else. Two different answers about where their people land.
|
||||
const dd=!!d.directDefault;
|
||||
const pl=d.placement||null;
|
||||
// The personal QR is ALWAYS shown: /join/<id> self-rotates via the moving
|
||||
// link, so a scan is always placed correctly — even after 2/2. This is the
|
||||
// person-to-person flow: open your page, tap the QR, they scan, they see
|
||||
@@ -824,7 +825,32 @@
|
||||
<p class="micro" style="margin:0 0 8px">${dd?'Rotation is switched off for this position, so the link above already places every join <strong style="color:var(--text)">under you</strong>. To send someone into the team rotation instead, add <strong style="color:var(--text)">?direct=0</strong> to it.':`The link above is your <strong style="color:var(--text)">Team link</strong> ${q2?'— now that you’re qualified it routes new joins to the next teammate who needs directs, building your team in order (recommended).':'— it credits you and builds your first two.'} Want new people to land <strong style="color:var(--text)">under YOU</strong> as spillover instead? Use your <strong style="color:var(--text)">Direct link</strong>:`}</p>
|
||||
<div style="display:flex;gap:8px;flex-wrap:wrap;align-items:center"><button id="copyDirect" class="btn btn-secondary btn-sm">Copy Direct link</button><span class="micro" style="word-break:break-all;color:var(--muted)">${esc(directUrl)}</span></div>
|
||||
<p class="micro" style="margin:8px 0 0">${dd?'Either way you keep the entry reward on anyone you personally bring.':'<strong style="color:var(--text)">Team link</strong> helps your team qualify. <strong style="color:var(--text)">Direct link</strong> places every join under you (own spillover). Either way you keep the entry reward on anyone you personally bring.'}</p>
|
||||
</div>
|
||||
<div style="margin-top:16px;padding-top:14px;border-top:1px solid var(--line)">
|
||||
<div style="font-weight:800;font-size:14px;margin-bottom:4px">\u2699\ufe0f How your link places people</div>
|
||||
<p class="micro" style="margin:0 0 10px">This is your choice, and you can change it any time. It only affects where NEW joins are registered \u2014 nobody already placed ever moves.</p>
|
||||
<div style="display:flex;gap:8px;flex-wrap:wrap">
|
||||
<button id="plTeam" class="btn btn-sm ${dd?'btn-secondary':'btn-teal'}" data-mode="team">\ud83d\udc65 Team rotation</button>
|
||||
<button id="plDirect" class="btn btn-sm ${dd?'btn-teal':'btn-secondary'}" data-mode="direct">\u2b07\ufe0f Direct under me</button>
|
||||
</div>
|
||||
<p class="micro" id="plExplain" style="margin:10px 0 0">${dd
|
||||
? 'Every join through your page lands <strong style="color:var(--text)">directly under you</strong> as depth in your own leg.'
|
||||
: 'A join through your page goes to the next position <strong style="color:var(--text)">in your own team</strong> that still needs its 2 \u2014 your downline, in order. It is never handed to the company rotation or to anyone outside your team.'}</p>
|
||||
<p class="micro" id="plFrom" style="margin:6px 0 0;color:var(--muted)">${pl && !pl.explicit && pl.from && pl.from!=='admin'
|
||||
? 'Starting setting, copied from your sponsor #'+esc(pl.from)+' when you joined. Change it whenever you like.' : ''}</p>
|
||||
</div>`;
|
||||
{
|
||||
const setMode=async m=>{
|
||||
try{
|
||||
const r=await (await fetch('/api/public/placement',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({mode:m})})).json();
|
||||
if(r&&r.error){ const ex=document.getElementById('plExplain'); if(ex)ex.textContent=r.error; return; }
|
||||
load(d.id); // redraw from the server so the panel and the copy can never disagree
|
||||
}catch(e){}
|
||||
};
|
||||
const bt=document.getElementById('plTeam'), bd=document.getElementById('plDirect');
|
||||
if(bt)bt.addEventListener('click',()=>setMode('team'));
|
||||
if(bd)bd.addEventListener('click',()=>setMode('direct'));
|
||||
}
|
||||
const qr=document.getElementById('dQr');if(qr)qr.innerHTML=qrSvg(dashUrl);
|
||||
const qb=document.getElementById('dQrBtn');
|
||||
if(qb)qb.addEventListener('click',function(){
|
||||
|
||||
Reference in New Issue
Block a user