@ cellarnode/ 财务
Canonical price-range Zod schemas, BASIS enum, 货币助手,格式助手,以及 CellarNode 的继承助手. 无头类型脚本——无回放,无UI分解.
安装
pnpm add @cellarnode/finance zod
# or
npm install @cellarnode/finance zod
# or
bun add @cellarnode/finance zod
zod 是同级依赖.
出口
import {
// BASIS
BASIS, type Basis,
// Price ranges
priceRangeSchema, type PriceRange,
fingerprintRange,
// Chosen price ranges (with rangeRef + label)
chosenPriceRangeSchema, type ChosenPriceRange,
// Inheritance
resolveEffective,
type DefaultPriceProfile,
type EffectiveRange,
// Currency
isValidCurrencyCode,
getCurrencyName,
getMinorUnits,
// Formatting
formatMoney,
formatBasis,
formatPriceRange,
} from "@cellarnode/finance";
快速实例
验证一个价格范围
import { priceRangeSchema } from "@cellarnode/finance";
const range = priceRangeSchema.parse({
min: 12.0,
max: 18.0,
currency: "EUR",
basis: "per_unit",
priceTypeId: "fob",
priceTypeOther: null,
basisNote: null,
});
审定规则superRefine:
max >= minpriceTypeId财务报告和审定财务报表priceTypeOther相互排斥,相互排斥basisNote如果需要的话fbasis === "other"
从组合配置中继承默认值
import { resolveEffective } from "@cellarnode/finance";
const range = { min: 1, max: 2, currency: null, basis: null, priceTypeId: null, priceTypeOther: null, basisNote: null };
const profile = { currency: "EUR", basis: "per_unit", priceTypeId: "fob" };
const effective = resolveEffective(range, profile);
// → { min:1, max:2, currency:"EUR", basis:"per_unit", priceTypeId:"fob", ... }
格式化显示的价格范围
import { formatPriceRange } from "@cellarnode/finance";
formatPriceRange({ min: 12, max: 18, currency: "EUR", basis: "per_unit", ... });
// → "€12.00 - €18.00 per unit"
比较正常价格金额
import { compareNormalizedPriceAmount } from "@cellarnode/finance";
const result = compareNormalizedPriceAmount({
amount: 7.5,
min: null,
max: 10,
fromBasis: "per_unit",
toBasis: "per_litre",
packageVolumeMl: 750,
fxRate: 1,
});
// { ok: true, relation: "within", comparisonAmount: 10 }
边界是包容性的、有限度的、非否定性的和有秩序的; null 打开一边.
两个界限都不能是 null. 数量必须是有限度的、非负的,以及FX率
必须是正和有限度的(通过) 1 (对同一种货币而言) 供应的软件包
数量必须是正的和有限度的,并且在基数不同时需要.
只有条子 per_unit 财务报告和审定财务报表 per_litre 基础被输入类型接受.
每一行都意味着 String(number) 十进制拼写,包括缩写.
关系使用精确的理性算法,不进行货币四舍五入或容忍.
资料 comparisonAmount 在 JavaScript 编号后方圆
比较;即使确切的关系不在其中,它也可能等同于约束.
流出或正结果四舍五入为零
{ ok: false, reason: "unrepresentable_amount" }其他失败原因有:
invalid_amount, (中文(简体) ), invalid_bounds, (中文(简体) ), invalid_fx_rate,以及 invalid_package_volume。 。 。 .
无 BigInt 值离开帮助者 .
呼叫者拥有货币身份, FX 选择/新鲜度, 信任的包量, (c) 合格的案件身份,以及不受限制的处理范围。 此助手执行 没有I/O,变异,评分或政策评价.
为什么是这个包裹?
在此之前 @cellarnode/finance{\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}这只犬的价程是Zod schema的 cellarnode-backend-v2/src/features/opportunities/price-range-schema.ts3个仪表板(管理人员、生产商、进口商)重复了验证规则——在Spec 1执行期间已经观察到一次漂移。 这个软件包拥有有线格式的端到端,因此所有消费者保持同步.
发展
make build # clean + typecheck + compile
make test # vitest run
make test-watch # vitest watch
make typecheck # tsc --noEmit
make check-exports # publint + arethetypeswrong
出版
发布至npm (公众访问 - publishConfig.access: "public"见CEL-1983 npm 信任出版(OIDC) —— 说
.github/workflows/publish.yml 在合并时自动发布到 main 变化
package.json'"版本. 出版工作没有长生不老的npm符号, 没有人运行
npm publish 手边。 这是私人财产 所以不像 @cellarnode/beverage-utils, npm 会
不生成此软件包的出处证明 .
切出一个本地发布,然后降落通过一个正常的PR:
make release-patch # bump patch, commit, tag
make release-minor # bump minor, commit, tag
make release-major # bump major, commit, tag
目标撞了 package.json、建设、承诺和标记——它们不出版。 推开
分支,打开 PR,并合并到 main 启动CI的发布工作.
许可证
UNLICENSED——版权(c) Cellar节点. 版权所有。 这个软件包是 为 CellarNode 自己的申请而公布; 不给许可证 其他用途.