يمكن استرداد الفواتير الشهرية لحساب على "إعلانات Google" باستخدام
InvoiceService.
المتطلبات الأساسية
- يجب تفعيل نظام الفواتير الشهرية لحساب "إعلانات Google". راجِع الأدلة حول عمليات إعداد الفوترة والميزانيات في الحساب للتعرّف على كيفية إدارة الفوترة باستخدام واجهة برمجة التطبيقات مع "إعلانات Google".
- في حال ضبطها، يجب أن تحدّد
login-customer-idرقم تعريف العميل الخاص بحساب إداري يدير حساب "إعلانات Google" الذي تستردّ فواتيره. يُصنّف هذا الحساب على أنّه الحساب الإداري للدفع في واجهة مستخدم "إعلانات Google".
استرداد الفواتير
لاسترداد الفواتير، يجب طلب
طريقة InvoiceService.ListInvoices
مع ضبط جميع الحقول المطلوبة في
ListInvoicesRequest:
customer_id وbilling_setup وissue_year وissue_month.
في حال إعداد الفوترة الموحّدة، تعرض Google Ads API فواتير جميع العملاء ضمن إعدادات الفوترة نفسها، وليس فقط فاتورة customer_id المحدّدة في طلب API.
يجب أن يكون customer_id حسابًا على "إعلانات Google" يعرض الإعلانات. للحصول على جميع فواتير الحساب الإداري للدفع، يجب تقديم طلب واحد لكل حساب عرض إعلانات على "إعلانات Google".
يُرجى الاطّلاع على المثال أدناه:
Java
// Issues the request. ListInvoicesResponse response = invoiceServiceClient.listInvoices( String.valueOf(customerId), ResourceNames.billingSetup(customerId, billingSetupId), String.valueOf(oneMonthAgo.getYear()), MonthOfYear.valueOf(oneMonthAgo.getMonth().toString()));
#C
ListInvoicesResponse response = invoiceServiceClient.ListInvoices(customerId.ToString(), ResourceNames.BillingSetup(customerId, billingSetupId), // Year must be 2019 or later. lastMonthDateTime.Year.ToString("yyyy"), lastMonth);
PHP
// Issues the request. $response = $googleAdsClient->getInvoiceServiceClient()->listInvoices( ListInvoicesRequest::build( $customerId, ResourceNames::forBillingSetup($customerId, $billingSetupId), // The year needs to be 2019 or later. date('Y', $lastMonth), MonthOfYear::value(strtoupper(date('F', $lastMonth))) ) );
Python
# Issues a request to list invoices. response = client.get_service("InvoiceService").list_invoices( customer_id=customer_id, billing_setup=client.get_service("GoogleAdsService").billing_setup_path( customer_id, billing_setup_id ), # The year needs to be 2019 or later, per the docs: # https://developers.google.com/google-ads/api/docs/billing/invoice?hl=en#retrieving_invoices issue_year=str(last_month.year), issue_month=last_month.strftime("%B").upper(), )
Ruby
# Issues a request to list invoices. response = client.service.invoice.list_invoices( customer_id: customer_id, billing_setup: client.path.billing_setup(customer_id, billing_setup_id), # The year needs to be 2019 or later. issue_year: last_month.year.to_s, # '%^B' option returns the uppercased full month name (e.g. 'JANUARY'). issue_month: last_month.strftime("%^B").to_sym, )
Perl
# Issue the request. my $response = $api_client->InvoiceService()->list({ customerId => $customer_id, billingSetup => Google::Ads::GoogleAds::V22::Utils::ResourceNames::billing_setup( ($customer_id, $billing_setup_id) ), # The year needs to be 2019 or later. issueYear => strftime("%Y", @last_month), issueMonth => uc(strftime("%B", @last_month))});
curl
# This code example gets invoices for a given billing setup. # # Variables: # API_VERSION, # CUSTOMER_ID, # DEVELOPER_TOKEN, # MANAGER_CUSTOMER_ID, # OAUTH2_ACCESS_TOKEN: # See https://developers.google.com/google-ads/api/rest/auth#request_headers # for details. # # BILLING_SETUP_ID: The billing setup resource name of the requested invoices. # ISSUE_MONTH: The issue month of the invoice, for example, JANUARY. # ISSUE_YEAR: The issue year to retrieve invoices, in yyyy format. curl -f "https://googleads.googleapis.com/v${API_VERSION}/customers/${CUSTOMER_ID}/invoices?billingSetup=${BILLING_SETUP_ID}&issueMonth=${ISSUE_MONTH}&issueYear=${ISSUE_YEAR}" \ --header "Content-Type: application/json" \ --header "developer-token: ${DEVELOPER_TOKEN}" \ --header "login-customer-id: ${MANAGER_CUSTOMER_ID}" \ --header "Authorization: Bearer ${OAUTH2_ACCESS_TOKEN}"
الاستجابة هي كائن ListInvoicesResponse
يحتوي على قائمة Invoices المطابقة،
ويحتوي كل منها على مجموعة كبيرة من الحقول، مثل:
- أرقام التعريف:
payments_account_idوpayments_profile_id - الوقت:
issue_dateوdue_dateوservice_date_range - المبالغ:
subtotal_amount_microsوtax_amount_microsوtotal_amount_micros - ملف PDF:
pdf_urlيمكنك الاطّلاع على تنزيل فاتورة بتنسيق PDF للحصول على التعليمات. - السجلّ:
corrected_invoiceوreplaced_invoices
ويتضمّن أيضًا حقولاً محدّدة أخرى عند الاقتضاء:
- التعديلات:
adjustments_subtotal_amount_micros،adjustments_tax_amount_micros،adjustments_total_amount_micros - التكاليف التنظيمية:
regulatory_costs_subtotal_amount_micros,regulatory_costs_tax_amount_micros,regulatory_costs_total_amount_micros - رسوم التصدير:
export_charge_subtotal_amount_micros,export_charge_tax_amount_micros,export_charge_total_amount_micros
الحصول على تفاصيل الميزانية
تقدّم السمة Invoice معلومات تفصيلية حول ميزانيات الحسابات ذات الصلة كقائمة من عناصر AccountBudgetSummary في الحقل account_budget_summaries:
- معرّفات:
customerوaccount_budgetوpurchase_order_number - الوقت:
billable_activity_date_range - المبالغ:
subtotal_amount_microsوtax_amount_microsوtotal_amount_microsوinvalid_activity_amount_microsوbilled_amount_microsوserved_amount_microsوoverdelivery_amount_micros
الحصول على تفاصيل الحساب
يوفّر Invoice معلومات حول الحسابات ذات الصلة كقائمة من عناصر AccountSummary في الحقل account_summaries. وتتضمّن تفاصيل حول تصحيحات الفوترة والتسويات ورسوم التصدير والتكاليف التنظيمية.
فهم المبالغ
يمكن تحديد مصدر جميع المبالغ المقدَّمة في عناصر
AccountBudgetSummary وAccountSummary وInvoice خلال فترات الخدمة، ويتم تقييمها وفقًا للقواعد التالية:
AccountBudgetSummary |
قاعدة التقييم |
|---|---|
served_amount_micros |
$account\_budget\_served$ |
billed_amount_micros |
$account\_budget\_billed$ |
overdelivery_amount_micros |
$account\_budget\_overdelivery$ |
invalid_activity_amount_micros |
$account\_budget\_invalid\_activity$ |
subtotal_amount_micros |
$account\_budget\_pretax$ |
tax_amount_micros |
$account\_budget\_tax$ |
total_amount_micros |
$account\_budget\_pretax + $ $account\_budget\_tax$ |
AccountSummary |
قاعدة التقييم |
|---|---|
billing_correction_subtotal_amount_micros |
$account\_billing\_correction\_pretax$ |
coupon_adjustment_subtotal_amount_micros |
$account\_coupon\_adjustment\_pretax$ |
excess_credit_adjustment_subtotal_amount_micros |
$account\_excess\_credit\_adjustment\_pretax$ |
regulatory_costs_subtotal_amount_micros |
$account\_regulatory\_costs\_pretax$ |
export_charge_subtotal_amount_micros |
$account\_export\_charge\_pretax$ |
billing_correction_tax_amount_micros |
$account\_billing\_correction\_tax$ |
coupon_adjustment_tax_amount_micros |
$account\_coupon\_adjustment\_tax$ |
excess_credit_adjustment_tax_amount_micros |
$account\_excess\_credit\_adjustment\_tax$ |
regulatory_costs_tax_amount_micros |
$account\_regulatory\_costs\_tax$ |
export_charge_tax_amount_micros |
$account\_export\_charge\_tax$ |
billing_correction_total_amount_micros |
$account\_billing\_correction\_pretax + $ $account\_billing\_correction\_tax$ |
coupon_adjustment_total_amount_micros |
$account\_coupon\_adjustment\_pretax + $ $account\_coupon\_adjustment\_tax$ |
excess_credit_adjustment_total_amount_micros |
$account\_excess\_credit\_adjustment\_pretax + $ $account\_excess\_credit\_adjustment\_tax$ |
regulatory_costs_total_amount_micros |
$account\_regulatory\_costs\_pretax + $ $account\_regulatory\_costs\_tax$ |
export_charge_total_amount_micros |
$account\_export\_charge\_pretax + $ $account\_export\_charge\_tax$ |
subtotal_amount_micros |
$account\_pretax$ |
tax_amount_micros |
$account\_tax$ |
total_amount_micros |
$account\_pretax + $ $account\_tax$ |
Invoice |
قاعدة التقييم |
|---|---|
adjustments_subtotal_amount_micros |
$\sum_{i=1}^n account\_billing\_correction\_pretax_i + $ $\sum_{i=1}^n account\_coupon\_adjustment\_pretax_i + $ $\sum_{i=1}^n account\_excess\_credit\_adjustment\_pretax_i$ |
regulatory_costs_subtotal_amount_micros |
$\sum_{i=1}^n account\_regulatory\_costs\_pretax_i$ |
export_charge_subtotal_amount_micros |
$\sum_{i=1}^n account\_export\_charge\_pretax_i$ |
adjustments_tax_amount_micros |
$\sum_{i=1}^n account\_billing\_correction\_tax_i + $ $\sum_{i=1}^n account\_coupon\_adjustment\_tax_i + $ $\sum_{i=1}^n account\_excess\_credit\_adjustment\_tax_i$ |
regulatory_costs_tax_amount_micros |
$\sum_{i=1}^n account\_regulatory\_costs\_tax_i$ |
export_charge_tax_amount_micros |
$\sum_{i=1}^n account\_export\_charge\_tax_i$ |
adjustments_total_amount_micros |
$adjustments\_pretax + $ $adjustments\_tax$ |
regulatory_costs_total_amount_micros |
$regulatory\_costs\_pretax + $ $regulatory\_costs\_tax$ |
export_charge_total_amount_micros |
$export\_charge\_pretax + $ $export\_charge\_tax$ |
subtotal_amount_micros |
$adjustments\_pretax + $ $\sum_{i=1}^n account\_budget\_pretax_i$ |
tax_amount_micros |
$adjustments\_tax + $ $regulatory\_costs\_tax + $ $export\_charge\_tax + $ $\sum_{i=1}^n account\_budget\_tax_i$ |
total_amount_micros |
$pretax + $ $regulatory\_costs\_pretax + $ $export\_charge\_pretax + $ $tax$ |
في ما يلي مثال على كيفية تكرار الفواتير التي تم استردادها:
Java
// Iterates over all invoices retrieved and prints their information. for (Invoice invoice : response.getInvoicesList()) { System.out.printf( "- Found the invoice '%s':\n" + " ID (also known as Invoice Number): '%s'\n" + " Type: %s\n" + " Billing setup ID: '%s'\n" + " Payments account ID (also known as Billing Account Number): '%s'\n" + " Payments profile ID (also known as Billing ID): '%s'\n" + " Issue date (also known as Invoice Date): %s\n" + " Due date: %s\n" + " Currency code: %s\n" + " Service date range (inclusive): from %s to %s\n" + " Adjustments: subtotal '%.2f', tax '%.2f', total '%.2f'\n" + " Regulatory costs: subtotal '%.2f', tax '%.2f', total '%.2f'\n" + " Replaced invoices: '%s'\n" + " Amounts: subtotal '%.2f', tax '%.2f', total '%.2f'\n" + " Corrected invoice: '%s'\n" + " PDF URL: '%s'\n" + " Account budgets: ", invoice.getResourceName(), invoice.getId(), invoice.getType(), invoice.getBillingSetup(), invoice.getPaymentsAccountId(), invoice.getPaymentsProfileId(), invoice.getIssueDate(), invoice.getDueDate(), invoice.getCurrencyCode(), invoice.getServiceDateRange().getStartDate(), invoice.getServiceDateRange().getEndDate(), convertMicrosToCurrency(invoice.getAdjustmentsSubtotalAmountMicros()), convertMicrosToCurrency(invoice.getAdjustmentsTaxAmountMicros()), convertMicrosToCurrency(invoice.getAdjustmentsTotalAmountMicros()), convertMicrosToCurrency(invoice.getRegulatoryCostsSubtotalAmountMicros()), convertMicrosToCurrency(invoice.getRegulatoryCostsTaxAmountMicros()), convertMicrosToCurrency(invoice.getRegulatoryCostsTotalAmountMicros()), invoice.getReplacedInvoicesList(), convertMicrosToCurrency(invoice.getSubtotalAmountMicros()), convertMicrosToCurrency(invoice.getTaxAmountMicros()), convertMicrosToCurrency(invoice.getTotalAmountMicros()), invoice.getCorrectedInvoice(), invoice.getPdfUrl()); for (AccountBudgetSummary accountBudgetSummary : invoice.getAccountBudgetSummariesList()) { System.out.printf( " - Account budget '%s':\n" + " Name (also known as Account Budget): '%s'\n" + " Customer (also known as Account ID): '%s'\n" + " Customer descriptive name (also known as Account): '%s'\n" + " Purchase order number (also known as Purchase Order): '%s'\n" + " Billing activity date range (inclusive): from %s to %s\n" + " Amounts: subtotal '%.2f', tax '%.2f', total '%.2f'\n", accountBudgetSummary.getAccountBudget(), accountBudgetSummary.getAccountBudgetName(), accountBudgetSummary.getCustomer(), accountBudgetSummary.getCustomerDescriptiveName(), accountBudgetSummary.getPurchaseOrderNumber(), accountBudgetSummary.getBillableActivityDateRange().getStartDate(), accountBudgetSummary.getBillableActivityDateRange().getEndDate(), convertMicrosToCurrency(accountBudgetSummary.getSubtotalAmountMicros()), convertMicrosToCurrency(accountBudgetSummary.getTaxAmountMicros()), convertMicrosToCurrency(accountBudgetSummary.getTotalAmountMicros())); } }
#C
// information. foreach (Invoice invoice in response.Invoices) { Console.WriteLine( "- Found the invoice '{0}':\n" + " ID (also known as Invoice Number): '{1}'\n" + " Type: {2}\n" + " Billing setup ID: '{3}'\n" + " Payments account ID (also known as Billing Account Number): '{4}'\n" + " Payments profile ID (also known as Billing ID): '{5}'\n" + " Issue date (also known as Invoice Date): {6}\n" + " Due date: {7}\n" + " Currency code: {8}\n" + " Service date range (inclusive): from {9} to {10}\n" + " Adjustments: subtotal '{11}', tax '{12}', total '{13}'\n" + " Regulatory costs: subtotal '{14}', tax '{15}', total '{16}'\n" + " Replaced invoices: '{17}'\n" + " Amounts: subtotal '{18}', tax '{19}', total '{20}'\n" + " Corrected invoice: '{21}'\n" + " PDF URL: '{22}'\n" + " Account budgets:\n", invoice.ResourceName, invoice.Id, invoice.Type.ToString(), invoice.BillingSetup, invoice.PaymentsAccountId, invoice.PaymentsProfileId, invoice.IssueDate, invoice.DueDate, invoice.CurrencyCode, invoice.ServiceDateRange.StartDate, invoice.ServiceDateRange.EndDate, FormatMicros(invoice.AdjustmentsSubtotalAmountMicros), FormatMicros(invoice.AdjustmentsTaxAmountMicros), FormatMicros(invoice.AdjustmentsTotalAmountMicros), FormatMicros(invoice.RegulatoryCostsSubtotalAmountMicros), FormatMicros(invoice.RegulatoryCostsTaxAmountMicros), FormatMicros(invoice.RegulatoryCostsTotalAmountMicros), invoice.ReplacedInvoices.Count > 0 ? string.Join("', '", invoice.ReplacedInvoices) : "none", FormatMicros(invoice.SubtotalAmountMicros), FormatMicros(invoice.TaxAmountMicros), FormatMicros(invoice.TotalAmountMicros), string.IsNullOrEmpty(invoice.CorrectedInvoice) ? invoice.CorrectedInvoice : "none", invoice.PdfUrl); foreach (AccountBudgetSummary accountBudgetSummary in invoice.AccountBudgetSummaries) { Console.WriteLine( "\t- Account budget '{0}':\n" + "\t Name (also known as Account Budget): '{1}'\n" + "\t Customer (also known as Account ID): '{2}'\n" + "\t Customer descriptive name (also known as Account): '{3}'\n" + "\t Purchase order number (also known as Purchase Order): '{4}'\n" + "\t Billing activity date range (inclusive): from {5} to {6}\n" + "\t Amounts: subtotal '{7}', tax '{8}', total '{9}'\n", accountBudgetSummary.AccountBudget, accountBudgetSummary.AccountBudgetName ?? "none", accountBudgetSummary.Customer, accountBudgetSummary.CustomerDescriptiveName ?? "none", accountBudgetSummary.PurchaseOrderNumber ?? "none", accountBudgetSummary.BillableActivityDateRange.StartDate, accountBudgetSummary.BillableActivityDateRange.EndDate, FormatMicros(accountBudgetSummary.SubtotalAmountMicros), FormatMicros(accountBudgetSummary.TaxAmountMicros), FormatMicros(accountBudgetSummary.TotalAmountMicros)); } }
PHP
// Iterates over all invoices retrieved and prints their information. foreach ($response->getInvoices() as $invoice) { /** @var Invoice $invoice */ printf( "- Found the invoice '%s':" . PHP_EOL . " ID (also known as Invoice Number): '%s'" . PHP_EOL . " Type: %s" . PHP_EOL . " Billing setup ID: '%s'" . PHP_EOL . " Payments account ID (also known as Billing Account Number): '%s'" . PHP_EOL . " Payments profile ID (also known as Billing ID): '%s'" . PHP_EOL . " Issue date (also known as Invoice Date): %s" . PHP_EOL . " Due date: %s" . PHP_EOL . " Currency code: %s" . PHP_EOL . " Service date range (inclusive): from %s to %s" . PHP_EOL . " Adjustments: subtotal '%.2f', tax '%.2f', total '%.2f'" . PHP_EOL . " Regulatory costs: subtotal '%.2f', tax '%.2f', total '%.2f'" . PHP_EOL . " Replaced invoices: '%s'" . PHP_EOL . " Amounts: subtotal '%.2f', tax '%.2f', total '%.2f'" . PHP_EOL . " Corrected invoice: '%s'" . PHP_EOL . " PDF URL: '%s'" . PHP_EOL . " Account budgets:" . PHP_EOL, $invoice->getResourceName(), $invoice->getId(), InvoiceType::name($invoice->getType()), $invoice->getBillingSetup(), $invoice->getPaymentsAccountId(), $invoice->getPaymentsProfileId(), $invoice->getIssueDate(), $invoice->getDueDate(), $invoice->getCurrencyCode(), $invoice->getServiceDateRange()->getStartDate(), $invoice->getServiceDateRange()->getEndDate(), Helper::microToBase($invoice->getAdjustmentsSubtotalAmountMicros()), Helper::microToBase($invoice->getAdjustmentsTaxAmountMicros()), Helper::microToBase($invoice->getAdjustmentsTotalAmountMicros()), Helper::microToBase($invoice->getRegulatoryCostsSubtotalAmountMicros()), Helper::microToBase($invoice->getRegulatoryCostsTaxAmountMicros()), Helper::microToBase($invoice->getRegulatoryCostsTotalAmountMicros()), $invoice->getReplacedInvoices() ? implode( "', '", iterator_to_array($invoice->getReplacedInvoices()->getIterator()) ) : 'none', Helper::microToBase($invoice->getSubtotalAmountMicros()), Helper::microToBase($invoice->getTaxAmountMicros()), Helper::microToBase($invoice->getTotalAmountMicros()), $invoice->getCorrectedInvoice() ?: 'none', $invoice->getPdfUrl() ); foreach ($invoice->getAccountBudgetSummaries() as $accountBudgetSummary) { /** @var AccountBudgetSummary $accountBudgetSummary */ printf( " - Account budget '%s':" . PHP_EOL . " Name (also known as Account Budget): '%s'" . PHP_EOL . " Customer (also known as Account ID): '%s'" . PHP_EOL . " Customer descriptive name (also known as Account): '%s'" . PHP_EOL . " Purchase order number (also known as Purchase Order): '%s'" . PHP_EOL . " Billing activity date range (inclusive): from %s to %s" . PHP_EOL . " Amounts: subtotal '%.2f', tax '%.2f', total '%.2f'" . PHP_EOL, $accountBudgetSummary->getAccountBudget(), $accountBudgetSummary->getAccountBudgetName() ?: 'none', $accountBudgetSummary->getCustomer(), $accountBudgetSummary->getCustomerDescriptiveName() ?: 'none', $accountBudgetSummary->getPurchaseOrderNumber() ?: 'none', $accountBudgetSummary->getBillableActivityDateRange()->getStartDate(), $accountBudgetSummary->getBillableActivityDateRange()->getEndDate(), Helper::microToBase($accountBudgetSummary->getSubtotalAmountMicros()), Helper::microToBase($accountBudgetSummary->getTaxAmountMicros()), Helper::microToBase($accountBudgetSummary->getTotalAmountMicros()) ); } }
Python
for invoice in response.invoices: print( f""" - Found the invoice {invoice.resource_name} ID (also known as Invoice Number): '{invoice.id}' Type: {invoice.type_} Billing setup ID: '{invoice.billing_setup}' Payments account ID (also known as Billing Account Number): '{invoice.payments_account_id}' Payments profile ID (also known as Billing ID): '{invoice.payments_profile_id}' Issue date (also known as Invoice Date): {invoice.issue_date} Due date: {invoice.due_date} Currency code: {invoice.currency_code} Service date range (inclusive): from {invoice.service_date_range.start_date} to {invoice.service_date_range.end_date} Adjustments: subtotal {_micros_to_currency(invoice.adjustments_subtotal_amount_micros)} tax {_micros_to_currency(invoice.adjustments_tax_amount_micros)} total {_micros_to_currency(invoice.adjustments_total_amount_micros)} Regulatory costs: subtotal {_micros_to_currency(invoice.regulatory_costs_subtotal_amount_micros)} tax {_micros_to_currency(invoice.regulatory_costs_tax_amount_micros)} total {_micros_to_currency(invoice.regulatory_costs_total_amount_micros)} Replaced invoices: {invoice.replaced_invoices.join(", ") if invoice.replaced_invoices else "none"} Amounts: subtotal {_micros_to_currency(invoice.subtotal_amount_micros)} tax {_micros_to_currency(invoice.tax_amount_micros)} total {_micros_to_currency(invoice.total_amount_micros)} Corrected invoice: {invoice.corrected_invoice or "none"} PDF URL: {invoice.pdf_url} Account budgets: """ ) for account_budget_summary in invoice.account_budget_summaries: print( f""" - Account budget '{account_budget_summary.account_budget}': Name (also known as Account Budget): '{account_budget_summary.account_budget_name}' Customer (also known as Account ID): '{account_budget_summary.customer}' Customer descriptive name (also known as Account): '{account_budget_summary.customer_descriptive_name}' Purchase order number (also known as Purchase Order): '{account_budget_summary.purchase_order_number}' Billing activity date range (inclusive): from #{account_budget_summary.billable_activity_date_range.start_date} to #{account_budget_summary.billable_activity_date_range.end_date} Amounts: subtotal '{_micros_to_currency(account_budget_summary.subtotal_amount_micros)}' tax '{_micros_to_currency(account_budget_summary.tax_amount_micros)}' total '{_micros_to_currency(account_budget_summary.total_amount_micros)}' """ )
Ruby
# Iterates over all invoices retrieved and prints their information. response.invoices.each do |invoice| puts <<~OUTPUT - Found the invoice '#{invoice.resource_name}' ID (also known as Invoice Number): '#{invoice.id}' Type: #{invoice.type} Billing Setup ID: '#{invoice.billing_setup}' Payments account ID (also known as Billing Account Number): '#{invoice.payments_account_id}' Payments profile ID (also known as Billing ID): '#{invoice.payments_profile_id}' Issue date (also known as Invoice Date): #{invoice.issue_date} Due date: #{invoice.due_date} Currency code: #{invoice.currency_code} Service date range (inclusive): from #{invoice.service_date_range.start_date} to #{invoice.service_date_range.end_date} Adjustments: subtotal '#{micro_to_base(invoice.adjustments_subtotal_amount_micros)}' tax '#{micro_to_base(invoice.adjustments_tax_amount_micros)}' total '#{micro_to_base(invoice.adjustments_total_amount_micros)}' Regulatory costs: subtotal '#{micro_to_base(invoice.regulatory_costs_subtotal_amount_micros)}' tax '#{micro_to_base(invoice.regulatory_costs_tax_amount_micros)}' total '#{micro_to_base(invoice.regulatory_costs_total_amount_micros)}' Replaced invoices: '#{invoice.replaced_invoices ? invoice.replaced_invoices.join(", ") : 'none'}' Amounts: subtotal '#{micro_to_base(invoice.subtotal_amount_micros)}' tax '#{micro_to_base(invoice.tax_amount_micros)}' total '#{micro_to_base(invoice.total_amount_micros)}' Corrected invoice: '#{invoice.corrected_invoices ? invoice.corrected_invoices : 'none'}' PDF URL: '#{invoice.pdf_url}' Account budgets: OUTPUT invoice.account_budget_summaries.each do |account_budget_summary| puts <<~OUTPUT \tAccount budget '#{account_budget_summary.account_budget}': \t Name (also known as Account Budget): '#{account_budget_summary.account_budget_name}' \t Customer (also known as Account ID): '#{account_budget_summary.customer}' \t Customer descriptive name (also known as Account): '#{account_budget_summary.customer_descriptive_name}' \t Purchase order number (also known as Purchase Order): '#{account_budget_summary.purchase_order_number}' \t Billing activity date range (inclusive): \t from #{account_budget_summary.billable_activity_date_range.start_date} \t to #{account_budget_summary.billable_activity_date_range.end_date} \t Amounts: \t subtotal '#{micro_to_base(account_budget_summary.subtotal_amount_micros)}' \t tax '#{micro_to_base(account_budget_summary.tax_amount_micros)}' \t total '#{micro_to_base(account_budget_summary.total_amount_micros)}' OUTPUT end end
Perl
# Iterate over all invoices retrieved and print their information. foreach my $invoice (@$response) { printf "- Found the invoice '%s':\n" . " ID (also known as Invoice Number): '%s'\n" . " Type: %s\n" . " Billing setup ID: '%s'\n" . " Payments account ID (also known as Billing Account Number): '%s'\n" . " Payments profile ID (also known as Billing ID): '%s'\n" . " Issue date (also known as Invoice Date): %s\n" . " Due date: %s\n" . " Currency code: %s\n" . " Service date range (inclusive): from %s to %s\n" . " Adjustments: subtotal '%.2f', tax '%.2f', total '%.2f'\n" . " Regulatory costs: subtotal '%.2f', tax '%.2f', total '%.2f'\n" . " Replaced invoices: '%s'\n" . " Amounts: subtotal '%.2f', tax '%.2f', total '%.2f'\n" . " Corrected invoice: '%s'\n" . " PDF URL: '%s'\n" . " Account budgets:\n", $invoice->{resourceName}, $invoice->{id}, $invoice->{type}, $invoice->{billingSetup}, $invoice->{paymentsAccountId}, $invoice->{paymentsProfileId}, $invoice->{issueDate}, $invoice->{dueDate}, $invoice->{currencyCode}, $invoice->{serviceDateRange}{startDate}, $invoice->{serviceDateRange}{endDate}, micro_to_base($invoice->{adjustmentsSubtotalAmountMicros}), micro_to_base($invoice->{adjustmentsTaxAmountMicros}), micro_to_base($invoice->{adjustmentsTotalAmountMicros}), micro_to_base($invoice->{regulatoryCostsSubtotalAmountMicros}), micro_to_base($invoice->{regulatoryCostsTaxAmountMicros}), micro_to_base($invoice->{regulatoryCostsTotalAmountMicros}), $invoice->{replacedInvoices} ? join(',', @{$invoice->{replacedInvoices}}) : "none", micro_to_base($invoice->{subtotalAmountMicros}), micro_to_base($invoice->{taxAmountMicros}), micro_to_base($invoice->{totalAmountMicros}), $invoice->{correctedInvoice} ? $invoice->{correctedInvoice} : "none", $invoice->{pdfUrl}; foreach my $account_budget_summary (@{$invoice->{accountBudgetSummaries}}) { printf " - Account budget '%s':\n" . " Name (also known as Account Budget): '%s'\n" . " Customer (also known as Account ID): '%s'\n" . " Customer descriptive name (also known as Account): '%s'\n" . " Purchase order number (also known as Purchase Order): '%s'\n" . " Billing activity date range (inclusive): from %s to %s\n" . " Amounts: subtotal '%.2f', tax '%.2f', total '%.2f'\n", $account_budget_summary->{accountBudget}, $account_budget_summary->{accountBudgetName} ? $account_budget_summary->{accountBudgetName} : "none", $account_budget_summary->{customer}, $account_budget_summary->{customerDescriptiveName} ? $account_budget_summary->{customerDescriptiveName} : "none", $account_budget_summary->{purchaseOrderNumber} ? $account_budget_summary->{purchaseOrderNumber} : "none", $account_budget_summary->{billableActivityDateRange}{startDate}, $account_budget_summary->{billableActivityDateRange}{endDate}, $account_budget_summary->{subtotalAmountMicros}, $account_budget_summary->{taxAmountMicros}, $account_budget_summary->{totalAmountMicros}; } }
تنزيل فاتورة بصيغة PDF
يمكن تنزيل أي فاتورة كملف PDF. بعد استرداد Invoice، عليك إرسال طلب HTTP لعنوان URL المخزَّن في الحقل pdf_url. يجب أن تتم مصادقة هذا الطلب باستخدام حساب Google نفسه المستخدَم لاسترداد الفاتورة، أي عليك تحديد رمز مميز للوصول إلى OAuth تم إنشاؤه باستخدام حساب Google في عنوان طلب Authorization: Bearer:
curl --request GET \
--header "Authorization: Bearer access token" \
Invoice.pdf_url > filename.pdfوالنتيجة هي محتوى فاتورة بتنسيق PDF مخزَّن في الملف filename.pdf.
رموز الخطأ الشائعة
| السيناريو | رمز الخطأ |
|---|---|
| إعدادات الفوترة أو سنة الإصدار أو شهر الإصدار غير متوفّرة أو فارغة | RequestError.REQUIRED_FIELD_MISSING
|
| يتعذّر تحليل إعدادات الفوترة أو سنة الإصدار أو شهر الإصدار المحدّدة. | FieldError.INVALID_VALUE
|
| أن يكون الطلب متعلقًا بفواتير صادرة قبل 1 يناير 2019. | InvoiceError.YEAR_MONTH_TOO_OLD
|
| الطلب مخصّص لعميل لا يتلقّى فواتير. | InvoiceError.NOT_INVOICED_CUSTOMER
|
| ليس لدى المستخدم إذن بالاطّلاع على فواتير إعداد الفوترة. | AuthorizationError.ACTION_NOT_PERMITTED
|