//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 invoice
* Fully updates an invoice, by ID. In the JSON request body, include a complete `invoice` object. This call does not support partial updates.
*/
export async function main(
auth: Paypal,
invoice_id: string,
send_to_recipient: string | undefined,
send_to_invoicer: string | undefined,
body: {
id?: string;
parent_id?: string;
status?:
| "DRAFT"
| "SENT"
| "SCHEDULED"
| "PAID"
| "MARKED_AS_PAID"
| "CANCELLED"
| "REFUNDED"
| "PARTIALLY_PAID"
| "PARTIALLY_REFUNDED"
| "MARKED_AS_REFUNDED"
| "UNPAID"
| "PAYMENT_PENDING";
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;
}[];
} & {
invoice_number?: string;
invoice_date?: 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";
} & { due_date?: string };
metadata?: {
create_time?: string;
created_by?: string;
last_update_time?: string;
last_updated_by?: string;
} & {
cancel_time?: string;
cancelled_by?: string;
first_sent_time?: string;
last_sent_time?: string;
last_sent_by?: string;
created_by_flow?:
| "MULTIPLE_RECIPIENTS_GROUP"
| "BATCH"
| "REGULAR_SINGLE";
recipient_view_url?: string;
invoicer_view_url?: 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 };
};
} & { template_id?: 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 };
gratuity?: { currency_code: string; value: string };
payments?: {
paid_amount?: { currency_code: string; value: string };
transactions?: {
type?: "PAYPAL" | "EXTERNAL";
payment_id?: string;
payment_date?: string;
method:
| "OTHER"
| "PAYPAL"
| "BANK_TRANSFER"
| "CASH"
| "CHECK"
| "CREDIT_CARD"
| "DEBIT_CARD"
| "WIRE_TRANSFER";
note?: string;
amount?: { currency_code: string; value: 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;
};
};
};
}[];
};
refunds?: {
refund_amount?: { currency_code: string; value: string };
transactions?: {
type?: "PAYPAL" | "EXTERNAL";
refund_id?: string;
refund_date?: string;
amount?: { currency_code: string; value: string };
method:
| "OTHER"
| "PAYPAL"
| "BANK_TRANSFER"
| "CASH"
| "CHECK"
| "CREDIT_CARD"
| "DEBIT_CARD"
| "WIRE_TRANSFER";
}[];
};
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/invoices/${invoice_id}`,
);
for (const [k, v] of [
["send_to_recipient", send_to_recipient],
["send_to_invoicer", send_to_invoicer],
]) {
if (v !== undefined && v !== "" && k !== undefined) {
url.searchParams.append(k, v);
}
}
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 invoice
* Fully updates an invoice, by ID. In the JSON request body, include a complete `invoice` object. This call does not support partial updates.
*/
export async function main(
auth: Paypal,
invoice_id: string,
send_to_recipient: string | undefined,
send_to_invoicer: string | undefined,
body: {
id?: string;
parent_id?: string;
status?:
| "DRAFT"
| "SENT"
| "SCHEDULED"
| "PAID"
| "MARKED_AS_PAID"
| "CANCELLED"
| "REFUNDED"
| "PARTIALLY_PAID"
| "PARTIALLY_REFUNDED"
| "MARKED_AS_REFUNDED"
| "UNPAID"
| "PAYMENT_PENDING";
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;
}[];
} & {
invoice_number?: string;
invoice_date?: 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";
} & { due_date?: string };
metadata?: {
create_time?: string;
created_by?: string;
last_update_time?: string;
last_updated_by?: string;
} & {
cancel_time?: string;
cancelled_by?: string;
first_sent_time?: string;
last_sent_time?: string;
last_sent_by?: string;
created_by_flow?:
| "MULTIPLE_RECIPIENTS_GROUP"
| "BATCH"
| "REGULAR_SINGLE";
recipient_view_url?: string;
invoicer_view_url?: 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 };
};
} & { template_id?: 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 };
gratuity?: { currency_code: string; value: string };
payments?: {
paid_amount?: { currency_code: string; value: string };
transactions?: {
type?: "PAYPAL" | "EXTERNAL";
payment_id?: string;
payment_date?: string;
method:
| "OTHER"
| "PAYPAL"
| "BANK_TRANSFER"
| "CASH"
| "CHECK"
| "CREDIT_CARD"
| "DEBIT_CARD"
| "WIRE_TRANSFER";
note?: string;
amount?: { currency_code: string; value: 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;
};
};
};
}[];
};
refunds?: {
refund_amount?: { currency_code: string; value: string };
transactions?: {
type?: "PAYPAL" | "EXTERNAL";
refund_id?: string;
refund_date?: string;
amount?: { currency_code: string; value: string };
method:
| "OTHER"
| "PAYPAL"
| "BANK_TRANSFER"
| "CASH"
| "CHECK"
| "CREDIT_CARD"
| "DEBIT_CARD"
| "WIRE_TRANSFER";
}[];
};
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/invoices/${invoice_id}`,
);
for (const [k, v] of [
["send_to_recipient", send_to_recipient],
["send_to_invoicer", send_to_invoicer],
]) {
if (v !== undefined && v !== "" && k !== undefined) {
url.searchParams.append(k, v);
}
}
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