--json prints only JSON on stdout (withJsonOutput around every command: logs, tables and prompts to stderr; printJson everywhere; test runs every --json command against the fake stores and parses stdout); prices ppp compares like with like: par = the store's own US-equivalent price (Play convertRegionPrices, Apple equalizations; offline base x fx x (1 + VAT) rounded up) scaled by the PPP price level; defaults only lower, only price levels <= 0.5, World Bank high-income at par, CN at par on Apple and skipped on Play, never above par (--only-decreases, --max-ratio, --min-ratio, --max-level, --include-high-income; --floor / --ceiling kept), top-10 revenue market drops > 20 % warned (sales reports, else a static list), unchanged regions out of the sheet; price changes of existing products only with --allow-price-changes, TTY or not (a terminal yes covered them), then their own question listing each old -> new, held section in dry runs (play products, prices import, play / apple subscriptions); pitfalls 61-63; tests
This commit is contained in:
parent
bab3f63227
commit
357319a775
30 changed files with 865 additions and 209 deletions
|
|
@ -714,9 +714,19 @@ export interface PppConfig {
|
|||
source?: 'worldbank' | 'bigmac' | 'file';
|
||||
/** CSV for source "file": region (ISO alpha-2), factor (local currency per US dollar at PPP), currency, fx (market rate, optional). */
|
||||
file?: string;
|
||||
/** Lowest price as a share of the US price after the PPP adjustment (default 0.3). */
|
||||
/** Lowest price as a share of the store's US-equivalent price (default 0.3). */
|
||||
minRatio?: number;
|
||||
/** Highest share of the US-equivalent price (default 1: never above it). */
|
||||
maxRatio?: number;
|
||||
/** Only economies whose price level (PPP factor / exchange rate) is at most this share of the US get a PPP price (default 0.5). */
|
||||
maxLevel?: number;
|
||||
/** Never propose a price above the current store price (default true). */
|
||||
onlyDecreases?: boolean;
|
||||
/** World Bank high-income economies get PPP prices too (default false: they keep the US-equivalent price). */
|
||||
includeHighIncome?: boolean;
|
||||
/** Old name of minRatio. */
|
||||
floor?: number;
|
||||
/** Highest share of the US price (default 1.2). */
|
||||
/** Old name of maxRatio. */
|
||||
ceiling?: number;
|
||||
/** Price sheet the proposal is written to (default store/prices-ppp.csv). */
|
||||
out?: string;
|
||||
|
|
@ -917,7 +927,7 @@ export function validateExtras(cfg: Partial<ShipConfig>): string[] {
|
|||
if (ppp) {
|
||||
if (ppp.source !== undefined && !['worldbank', 'bigmac', 'file'].includes(ppp.source)) e.push('prices.ppp.source: worldbank | bigmac | file');
|
||||
if (ppp.source === 'file' && !ppp.file) e.push('prices.ppp.file: needed with source "file"');
|
||||
for (const k of ['floor', 'ceiling'] as const) if (ppp[k] !== undefined && !(typeof ppp[k] === 'number' && ppp[k]! > 0 && ppp[k]! <= 5)) e.push(`prices.ppp.${k}: a share of the US price, e.g. 0.3`);
|
||||
for (const k of ['floor', 'ceiling', 'minRatio', 'maxRatio', 'maxLevel'] as const) if (ppp[k] !== undefined && !(typeof ppp[k] === 'number' && ppp[k]! > 0 && ppp[k]! <= 5)) e.push(`prices.ppp.${k}: a share of the US price, e.g. 0.3`);
|
||||
if (ppp.floor !== undefined && ppp.ceiling !== undefined && ppp.floor > ppp.ceiling) e.push('prices.ppp: floor is above ceiling');
|
||||
}
|
||||
const w = cfg.web;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue