Generador de orders completado sin fulfillments
This commit is contained in:
@@ -8,24 +8,23 @@ import { ADDRESS } from "#data/data-pools/ADDRESS.js";
|
|||||||
import { CUSTOMER } from "#data/data-pools/CUSTOMER.js";
|
import { CUSTOMER } from "#data/data-pools/CUSTOMER.js";
|
||||||
import { FieldPool, PoolOf } from "#data/data-pools/pool.type.js";
|
import { FieldPool, PoolOf } from "#data/data-pools/pool.type.js";
|
||||||
import { Shopify } from "../webhooks/order";
|
import { Shopify } from "../webhooks/order";
|
||||||
|
import { LINE_ITEM } from "./LINE_ITEM";
|
||||||
import { PRICE_SET, randomPriceSet } from "./PRICE_SET";
|
import { PRICE_SET, randomPriceSet } from "./PRICE_SET";
|
||||||
import { CURRENCIES, pickCurrencies } from "./shared";
|
import { CURRENCIES, pickCurrencies, randomDecimal, randomDecimalGenerator, randomEmail, randomInteger, randomIntegerGenerator, randomISODate } from "./shared";
|
||||||
|
import { TAX_LINES } from "./TAX_LINES";
|
||||||
|
|
||||||
function genId(digits: number) {
|
function genId(digits: number) {
|
||||||
return Math.floor(Math.random() * (10 ^ digits))
|
return Math.floor(Math.random() * (10 ^ digits))
|
||||||
}
|
}
|
||||||
|
|
||||||
function generatePrice(enteros: number, decimales: number) {
|
|
||||||
return (Math.floor(
|
function randomID() {
|
||||||
Math.random() * (10 ** (enteros + decimales + 1)))
|
return Math.random().toString(36).substring(3)
|
||||||
/
|
|
||||||
(10 ** (decimales))
|
|
||||||
).toString()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export function generateOrder(pool: PoolOf<Shopify.Order>) {
|
export function generateOrder(pool: PoolOf<Shopify.Order>) {
|
||||||
const id = genId(8)
|
const id = genId(8)
|
||||||
const price = generatePrice(2, 2)
|
const price = randomDecimal(2, 2)
|
||||||
const shopCurrency = pickCurrencies(CURRENCIES)
|
const shopCurrency = pickCurrencies(CURRENCIES)
|
||||||
|
|
||||||
const ORDER = <Shopify.Order>{
|
const ORDER = <Shopify.Order>{
|
||||||
@@ -52,8 +51,55 @@ export const ORDER = new FieldPool<Shopify.Order>({
|
|||||||
customer: CUSTOMER.randomValue,
|
customer: CUSTOMER.randomValue,
|
||||||
shipping_address: ADDRESS.randomValue,
|
shipping_address: ADDRESS.randomValue,
|
||||||
currency: () => pickCurrencies(CURRENCIES),
|
currency: () => pickCurrencies(CURRENCIES),
|
||||||
current_subtotal_price: () => generatePrice(2, 2),
|
current_subtotal_price: () => randomDecimal(2, 2),
|
||||||
current_subtotal_price_set: PRICE_SET.randomValue,
|
current_subtotal_price_set: PRICE_SET.randomValue,
|
||||||
|
current_total_discounts: randomDecimalGenerator(3, 2),
|
||||||
|
current_total_discounts_set: PRICE_SET.randomValue,
|
||||||
|
current_total_duties_set: PRICE_SET.randomValue,
|
||||||
|
current_total_tax: randomDecimalGenerator(1, 2),
|
||||||
|
current_total_tax_set: PRICE_SET.randomValue,
|
||||||
|
customer_locale: ["es-ES", "pt-PT", "fr-FR", "en-GB"],
|
||||||
|
device_id: randomDecimalGenerator(10, 0),
|
||||||
|
discount_codes: [],
|
||||||
|
duties_included: [true, false],
|
||||||
|
email: randomEmail,
|
||||||
|
estimated_taxes: [true, false],
|
||||||
|
financial_status: ["paid", "unpaid", "pending"],
|
||||||
|
fulfillment_status: ["CANCELLED", "ERROR", "FAILURE", "SUCCESS", null],
|
||||||
|
landing_site: ["/"],
|
||||||
|
landing_site_ref: [""],
|
||||||
|
location_id: randomDecimalGenerator(10, 0),
|
||||||
|
merchant_business_entity_id: randomID,
|
||||||
|
merchant_of_record_app_id: randomID,
|
||||||
|
name: randomID,
|
||||||
|
note: [""],
|
||||||
|
note_attributes: [
|
||||||
|
// No se como se genera ni que hacer con ello
|
||||||
|
],
|
||||||
|
tax_exempt: [true, false],
|
||||||
|
taxes_included: [true, false],
|
||||||
|
tax_lines: [[TAX_LINES.randomValue()]], //! No he tenido en cuenta que hay que generar una lista de items
|
||||||
|
token: ["token1", "token2"],
|
||||||
|
total_cash_rounding_payment_adjustment_set: PRICE_SET.randomValue,
|
||||||
|
total_cash_rounding_refund_adjustment_set: PRICE_SET.randomValue,
|
||||||
|
total_discounts: randomDecimalGenerator(1, 2),
|
||||||
|
total_discounts_set: PRICE_SET.randomValue,
|
||||||
|
total_line_items_price: randomDecimalGenerator(3, 2),
|
||||||
|
total_line_items_price_set: PRICE_SET.randomValue,
|
||||||
|
total_price: randomDecimalGenerator(3, 2),
|
||||||
|
total_price_set: PRICE_SET.randomValue,
|
||||||
|
total_shipping_price_set: PRICE_SET.randomValue,
|
||||||
|
total_tax: randomDecimalGenerator(1, 2),
|
||||||
|
total_tax_set: PRICE_SET.randomValue,
|
||||||
|
total_tip_received: randomDecimalGenerator(2, 2),
|
||||||
|
total_weight: randomIntegerGenerator(100, 0),
|
||||||
|
updated_at: randomISODate,
|
||||||
|
user_id: randomID,
|
||||||
|
billing_address: ADDRESS.randomValue,
|
||||||
|
fulfillments: [],
|
||||||
|
line_items: () => LINE_ITEM.randomList(3),
|
||||||
|
|
||||||
|
|
||||||
}, generateOrder)
|
}, generateOrder)
|
||||||
|
|
||||||
export const INVALID_POOL = {
|
export const INVALID_POOL = {
|
||||||
|
|||||||
13
src/data/data-pools/TAX_LINES.ts
Normal file
13
src/data/data-pools/TAX_LINES.ts
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
import { Shopify } from "#data/webhooks/order.js";
|
||||||
|
import { FieldPool, PoolOf } from "./pool.type";
|
||||||
|
import { PRICE_SET } from "./PRICE_SET";
|
||||||
|
import { randomDecimalGenerator } from "./shared";
|
||||||
|
|
||||||
|
export const TAX_LINES = new FieldPool(<PoolOf<Shopify.TaxLine>>{
|
||||||
|
price: randomDecimalGenerator(3, 2),
|
||||||
|
rate: [0.16, 0.21],
|
||||||
|
title: ["VAT", "IVA"],
|
||||||
|
price_set: PRICE_SET.randomValue,
|
||||||
|
channel_liable: [true, false]
|
||||||
|
|
||||||
|
})
|
||||||
@@ -1,4 +1,5 @@
|
|||||||
import { NullablePartial } from "#shared/NullablePartail.js";
|
import { NullablePartial } from "#shared/NullablePartail.js";
|
||||||
|
import { randomInteger } from "./shared";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Una pool de valores derivada de un tipo existente
|
* Una pool de valores derivada de un tipo existente
|
||||||
@@ -43,7 +44,10 @@ function getRandomOfField<T>(field: PoolField<T> | undefined) {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Un FieldPool es un wraper de PoolOf que asocia una funcion
|
* Un FieldPool es un wraper de PoolOf que asocia una funcion
|
||||||
* aleatoria personalizada al tipo de la pool
|
* aleatoria personalizada al tipo de la pool.
|
||||||
|
* Por defecto los valores de los campos se generan de forma aleatoria
|
||||||
|
* a no ser que se use la funcion personalizada que puede "fijar" ciertos
|
||||||
|
* campos
|
||||||
*/
|
*/
|
||||||
export class FieldPool<T> {
|
export class FieldPool<T> {
|
||||||
public pool: PoolOf<T>
|
public pool: PoolOf<T>
|
||||||
@@ -61,6 +65,7 @@ export class FieldPool<T> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public static pickRandomOfField = getRandomOfField
|
public static pickRandomOfField = getRandomOfField
|
||||||
public static pickRandomOf = getRandomOf
|
public static pickRandomOf = getRandomOf
|
||||||
|
|
||||||
@@ -85,4 +90,16 @@ export class FieldPool<T> {
|
|||||||
return mock
|
return mock
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public randomList(length: number) {
|
||||||
|
const numberEntries = length ?? randomInteger(10, 1)
|
||||||
|
const list = []
|
||||||
|
for (let i = 0; i < numberEntries; i++) {
|
||||||
|
const value = this.randomValue()
|
||||||
|
list.push(value)
|
||||||
|
}
|
||||||
|
|
||||||
|
return list
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -12,3 +12,62 @@ export function pickCurrencies(currencies: string[]) {
|
|||||||
const select = Math.floor(Math.random() * (max - min)) + min
|
const select = Math.floor(Math.random() * (max - min)) + min
|
||||||
return currencies[select]
|
return currencies[select]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function randomDecimal(enteros: number, decimales: number) {
|
||||||
|
return (Math.floor(
|
||||||
|
Math.random() * (10 ** (enteros + decimales + 1)))
|
||||||
|
/
|
||||||
|
(10 ** (decimales))
|
||||||
|
).toString()
|
||||||
|
}
|
||||||
|
|
||||||
|
export function randomDecimalGenerator(enteros: number, decimales: number) {
|
||||||
|
return () => randomDecimal(enteros, decimales)
|
||||||
|
}
|
||||||
|
|
||||||
|
export function randomEmail() {
|
||||||
|
const domains = ["gmail.com", "outlook.com"]
|
||||||
|
const seleccionDominio = Math.floor(Math.random() * domains.length)
|
||||||
|
const randName = Math.random().toString(36).substring(3)
|
||||||
|
return randName + "@" + domains[seleccionDominio]
|
||||||
|
}
|
||||||
|
|
||||||
|
export function randomIntegerGenerator(max: number, min: number) {
|
||||||
|
return () => randomInteger(max, min)
|
||||||
|
}
|
||||||
|
|
||||||
|
export function randomInteger(max: number, min: number) {
|
||||||
|
return Math.floor(Math.random() * (max + min + 1) - min)
|
||||||
|
}
|
||||||
|
|
||||||
|
export function randomISODate() {
|
||||||
|
// 1. Generate a random date (between year 2000 and now)
|
||||||
|
const start = new Date(2000, 0, 1).getTime();
|
||||||
|
const end = new Date().getTime();
|
||||||
|
const date = new Date(Math.floor(Math.random() * (end - start + 1) + start));
|
||||||
|
|
||||||
|
// 2. Generate a random offset
|
||||||
|
// Standard offsets range from -12 to +14 hours.
|
||||||
|
// We'll pick a random hour and either 00, 30, or 45 minutes.
|
||||||
|
const offsetHours = Math.floor(Math.random() * (14 - (-12) + 1)) + (-12);
|
||||||
|
const offsetMinutes = [0, 30, 45][Math.floor(Math.random() * 3)];
|
||||||
|
|
||||||
|
// 3. Format the offset string (e.g., +05:30 or -08:00)
|
||||||
|
const sign = offsetHours >= 0 ? "+" : "-";
|
||||||
|
const absHours = Math.abs(offsetHours).toString().padStart(2, '0');
|
||||||
|
const absMinutes = offsetMinutes.toString().padStart(2, '0');
|
||||||
|
const offsetStr = `${sign}${absHours}:${absMinutes}`;
|
||||||
|
|
||||||
|
// 4. Manually construct the ISO string
|
||||||
|
const pad = (n: number) => n.toString().padStart(2, '0');
|
||||||
|
|
||||||
|
const year = date.getFullYear();
|
||||||
|
const month = pad(date.getMonth() + 1);
|
||||||
|
const day = pad(date.getDate());
|
||||||
|
const hours = pad(date.getHours());
|
||||||
|
const minutes = pad(date.getMinutes());
|
||||||
|
const seconds = pad(date.getSeconds());
|
||||||
|
const ms = date.getMilliseconds().toString().padStart(3, '0');
|
||||||
|
|
||||||
|
return `${year}-${month}-${day}T${hours}:${minutes}:${seconds}.${ms}${offsetStr}`;
|
||||||
|
}
|
||||||
|
|||||||
8
src/data/webhooks/order.d.ts
vendored
8
src/data/webhooks/order.d.ts
vendored
@@ -125,13 +125,13 @@ export declare namespace Shopify {
|
|||||||
province_code: string,
|
province_code: string,
|
||||||
}
|
}
|
||||||
|
|
||||||
export type TaxLine = {
|
export type TaxLine = NullablePartial<{
|
||||||
price: string,
|
price: string,
|
||||||
rate: 0.21,
|
rate: 0.21,
|
||||||
title: string,
|
title: string,
|
||||||
price_set: PriceSet,
|
price_set: PriceSet,
|
||||||
channel_liable: boolean
|
channel_liable: boolean
|
||||||
}
|
}>
|
||||||
|
|
||||||
export type NoteAtributte = {
|
export type NoteAtributte = {
|
||||||
name: string,
|
name: string,
|
||||||
@@ -233,8 +233,8 @@ export declare namespace Shopify {
|
|||||||
tags: string,
|
tags: string,
|
||||||
tax_exempt: boolean,
|
tax_exempt: boolean,
|
||||||
tax_lines: TaxLine[],
|
tax_lines: TaxLine[],
|
||||||
taxes_included: true,
|
taxes_included: boolean,
|
||||||
test: false,
|
test: boolean,
|
||||||
token: string,
|
token: string,
|
||||||
total_cash_rounding_payment_adjustment_set: PriceSet,
|
total_cash_rounding_payment_adjustment_set: PriceSet,
|
||||||
total_cash_rounding_refund_adjustment_set: PriceSet,
|
total_cash_rounding_refund_adjustment_set: PriceSet,
|
||||||
|
|||||||
Reference in New Issue
Block a user