//native
type Paypal = {
clientId: string;
clientSecret: string;
};
async function getToken(auth: Paypal): Promise<string> {
const url = new URL(`https://api-m.paypal.com/v1/oauth2/token`);
const response = await fetch(url, {
method: "POST",
headers: {
Authorization: `Basic ${btoa(`${auth.clientId}:${auth.clientSecret}`)}`,
},
body: new URLSearchParams({
grant_type: "client_credentials",
}),
});
if (!response.ok) {
const text = await response.text();
throw new Error(`Could not get token: ${response.status} ${text}`);
}
const json = await response.json();
return json.access_token;
}
/**
* Fully update template
* Fully updates a template, by ID. In the JSON request body, include a complete `template` object. This call does not support partial updates.
*/
export async function main(
auth: Paypal,
template_id: string,
body: {
id?: string;
name?: string;
default_template?: false | true;
template_info?: {
detail?: {
reference?: string;
currency_code: string;
note?: string;
terms_and_conditions?: string;
memo?: string;
attachments?: {
id?: string;
reference_url?: string;
content_type?: string;
create_time?: string;
size?: string;
}[];
} & {
payment_term?: {
term_type?:
| "DUE_ON_RECEIPT"
| "DUE_ON_DATE_SPECIFIED"
| "NET_10"
| "NET_15"
| "NET_30"
| "NET_45"
| "NET_60"
| "NET_90"
| "NO_DUE_DATE";
};
metadata?: {
create_time?: string;
created_by?: string;
last_update_time?: string;
last_updated_by?: string;
};
};
invoicer?: { business_name?: string } & {
name?: {
prefix?: string;
given_name?: string;
surname?: string;
middle_name?: string;
suffix?: string;
alternate_full_name?: string;
full_name?: string;
};
address?: {
address_line_1?: string;
address_line_2?: string;
address_line_3?: string;
admin_area_4?: string;
admin_area_3?: string;
admin_area_2?: string;
admin_area_1?: string;
postal_code?: string;
country_code: string;
address_details?: {
street_number?: string;
street_name?: string;
street_type?: string;
delivery_service?: string;
building_name?: string;
sub_building?: string;
};
};
} & {
email_address?: string;
phones?: {
country_code: string;
national_number: string;
extension_number?: string;
} & { phone_type?: "FAX" | "HOME" | "MOBILE" | "OTHER" | "PAGER" }[];
website?: string;
tax_id?: string;
additional_notes?: string;
logo_url?: string;
};
primary_recipients?: {
billing_info?: { business_name?: string } & {
name?: {
prefix?: string;
given_name?: string;
surname?: string;
middle_name?: string;
suffix?: string;
alternate_full_name?: string;
full_name?: string;
};
address?: {
address_line_1?: string;
address_line_2?: string;
address_line_3?: string;
admin_area_4?: string;
admin_area_3?: string;
admin_area_2?: string;
admin_area_1?: string;
postal_code?: string;
country_code: string;
address_details?: {
street_number?: string;
street_name?: string;
street_type?: string;
delivery_service?: string;
building_name?: string;
sub_building?: string;
};
};
} & {
email_address?: string;
phones?: {
country_code: string;
national_number: string;
extension_number?: string;
} & { phone_type?: "FAX" | "HOME" | "MOBILE" | "OTHER" | "PAGER" }[];
additional_info?: string;
language?: string;
};
shipping_info?: { business_name?: string } & {
name?: {
prefix?: string;
given_name?: string;
surname?: string;
middle_name?: string;
suffix?: string;
alternate_full_name?: string;
full_name?: string;
};
address?: {
address_line_1?: string;
address_line_2?: string;
address_line_3?: string;
admin_area_4?: string;
admin_area_3?: string;
admin_area_2?: string;
admin_area_1?: string;
postal_code?: string;
country_code: string;
address_details?: {
street_number?: string;
street_name?: string;
street_type?: string;
delivery_service?: string;
building_name?: string;
sub_building?: string;
};
};
};
}[];
additional_recipients?: string[];
items?: {
id?: string;
name: string;
description?: string;
quantity: string;
unit_amount: { currency_code: string; value: string };
tax?: {
name: string;
percent: string;
amount?: { currency_code: string; value: string };
};
item_date?: string;
discount?: {
percent?: string;
amount?: { currency_code: string; value: string };
};
unit_of_measure?: "QUANTITY" | "HOURS" | "AMOUNT";
}[];
configuration?: {
tax_calculated_after_discount?: false | true;
tax_inclusive?: false | true;
allow_tip?: false | true;
partial_payment?: {
allow_partial_payment?: false | true;
minimum_amount_due?: { currency_code: string; value: string };
};
};
amount?: {
currency_code?: string;
value?: string;
breakdown?: {
item_total?: { currency_code: string; value: string };
discount?: {
invoice_discount?: {
percent?: string;
amount?: { currency_code: string; value: string };
};
item_discount?: { currency_code: string; value: string };
};
tax_total?: { currency_code: string; value: string };
shipping?: {
amount?: { currency_code: string; value: string };
tax?: {
name: string;
percent: string;
amount?: { currency_code: string; value: string };
};
};
custom?: {
label: string;
amount?: { currency_code: string; value: string };
};
};
};
due_amount?: { currency_code: string; value: string };
};
settings?: {
template_item_settings?: {
field_name?:
| "ITEMS_QUANTITY"
| "ITEMS_DESCRIPTION"
| "ITEMS_DATE"
| "ITEMS_DISCOUNT"
| "ITEMS_TAX";
display_preference?: { hidden?: false | true };
}[];
template_subtotal_settings?: {
field_name?: "DISCOUNT" | "SHIPPING" | "CUSTOM";
display_preference?: { hidden?: false | true };
}[];
};
unit_of_measure?: "QUANTITY" | "HOURS" | "AMOUNT";
standard_template?: false | true;
links?: {
href: string;
rel: string;
method?:
| "GET"
| "POST"
| "PUT"
| "DELETE"
| "HEAD"
| "CONNECT"
| "OPTIONS"
| "PATCH";
}[];
},
) {
const token = await getToken(auth);
const url = new URL(
`https://api-m.paypal.com/v2/invoicing/templates/${template_id}`,
);
const response = await fetch(url, {
method: "PUT",
headers: {
"Content-Type": "application/json",
Authorization: "Bearer " + token,
},
body: JSON.stringify(body),
});
if (!response.ok) {
const text = await response.text();
throw new Error(`${response.status} ${text}`);
}
return await response.json();
}
Submitted by hugo697 428 days ago
//native
type Paypal = {
token: string;
};
/**
* Fully update template
* Fully updates a template, by ID. In the JSON request body, include a complete `template` object. This call does not support partial updates.
*/
export async function main(
auth: Paypal,
template_id: string,
body: {
id?: string;
name?: string;
default_template?: false | true;
template_info?: {
detail?: {
reference?: string;
currency_code: string;
note?: string;
terms_and_conditions?: string;
memo?: string;
attachments?: {
id?: string;
reference_url?: string;
content_type?: string;
create_time?: string;
size?: string;
}[];
} & {
payment_term?: {
term_type?:
| "DUE_ON_RECEIPT"
| "DUE_ON_DATE_SPECIFIED"
| "NET_10"
| "NET_15"
| "NET_30"
| "NET_45"
| "NET_60"
| "NET_90"
| "NO_DUE_DATE";
};
metadata?: {
create_time?: string;
created_by?: string;
last_update_time?: string;
last_updated_by?: string;
};
};
invoicer?: { business_name?: string } & {
name?: {
prefix?: string;
given_name?: string;
surname?: string;
middle_name?: string;
suffix?: string;
alternate_full_name?: string;
full_name?: string;
};
address?: {
address_line_1?: string;
address_line_2?: string;
address_line_3?: string;
admin_area_4?: string;
admin_area_3?: string;
admin_area_2?: string;
admin_area_1?: string;
postal_code?: string;
country_code: string;
address_details?: {
street_number?: string;
street_name?: string;
street_type?: string;
delivery_service?: string;
building_name?: string;
sub_building?: string;
};
};
} & {
email_address?: string;
phones?: {
country_code: string;
national_number: string;
extension_number?: string;
} & { phone_type?: "FAX" | "HOME" | "MOBILE" | "OTHER" | "PAGER" }[];
website?: string;
tax_id?: string;
additional_notes?: string;
logo_url?: string;
};
primary_recipients?: {
billing_info?: { business_name?: string } & {
name?: {
prefix?: string;
given_name?: string;
surname?: string;
middle_name?: string;
suffix?: string;
alternate_full_name?: string;
full_name?: string;
};
address?: {
address_line_1?: string;
address_line_2?: string;
address_line_3?: string;
admin_area_4?: string;
admin_area_3?: string;
admin_area_2?: string;
admin_area_1?: string;
postal_code?: string;
country_code: string;
address_details?: {
street_number?: string;
street_name?: string;
street_type?: string;
delivery_service?: string;
building_name?: string;
sub_building?: string;
};
};
} & {
email_address?: string;
phones?: {
country_code: string;
national_number: string;
extension_number?: string;
} & { phone_type?: "FAX" | "HOME" | "MOBILE" | "OTHER" | "PAGER" }[];
additional_info?: string;
language?: string;
};
shipping_info?: { business_name?: string } & {
name?: {
prefix?: string;
given_name?: string;
surname?: string;
middle_name?: string;
suffix?: string;
alternate_full_name?: string;
full_name?: string;
};
address?: {
address_line_1?: string;
address_line_2?: string;
address_line_3?: string;
admin_area_4?: string;
admin_area_3?: string;
admin_area_2?: string;
admin_area_1?: string;
postal_code?: string;
country_code: string;
address_details?: {
street_number?: string;
street_name?: string;
street_type?: string;
delivery_service?: string;
building_name?: string;
sub_building?: string;
};
};
};
}[];
additional_recipients?: string[];
items?: {
id?: string;
name: string;
description?: string;
quantity: string;
unit_amount: { currency_code: string; value: string };
tax?: {
name: string;
percent: string;
amount?: { currency_code: string; value: string };
};
item_date?: string;
discount?: {
percent?: string;
amount?: { currency_code: string; value: string };
};
unit_of_measure?: "QUANTITY" | "HOURS" | "AMOUNT";
}[];
configuration?: {
tax_calculated_after_discount?: false | true;
tax_inclusive?: false | true;
allow_tip?: false | true;
partial_payment?: {
allow_partial_payment?: false | true;
minimum_amount_due?: { currency_code: string; value: string };
};
};
amount?: {
currency_code?: string;
value?: string;
breakdown?: {
item_total?: { currency_code: string; value: string };
discount?: {
invoice_discount?: {
percent?: string;
amount?: { currency_code: string; value: string };
};
item_discount?: { currency_code: string; value: string };
};
tax_total?: { currency_code: string; value: string };
shipping?: {
amount?: { currency_code: string; value: string };
tax?: {
name: string;
percent: string;
amount?: { currency_code: string; value: string };
};
};
custom?: {
label: string;
amount?: { currency_code: string; value: string };
};
};
};
due_amount?: { currency_code: string; value: string };
};
settings?: {
template_item_settings?: {
field_name?:
| "ITEMS_QUANTITY"
| "ITEMS_DESCRIPTION"
| "ITEMS_DATE"
| "ITEMS_DISCOUNT"
| "ITEMS_TAX";
display_preference?: { hidden?: false | true };
}[];
template_subtotal_settings?: {
field_name?: "DISCOUNT" | "SHIPPING" | "CUSTOM";
display_preference?: { hidden?: false | true };
}[];
};
unit_of_measure?: "QUANTITY" | "HOURS" | "AMOUNT";
standard_template?: false | true;
links?: {
href: string;
rel: string;
method?:
| "GET"
| "POST"
| "PUT"
| "DELETE"
| "HEAD"
| "CONNECT"
| "OPTIONS"
| "PATCH";
}[];
},
) {
const url = new URL(
`https://api-m.paypal.com/v2/invoicing/templates/${template_id}`,
);
const response = await fetch(url, {
method: "PUT",
headers: {
"Content-Type": "application/json",
Authorization: "Bearer " + auth.token,
},
body: JSON.stringify(body),
});
if (!response.ok) {
const text = await response.text();
throw new Error(`${response.status} ${text}`);
}
return await response.json();
}
Submitted by hugo697 428 days ago