meraproject/vendor/amocrm/amocrm-api-library/examples/invoices_actions.php
keboss-m 5c21d25d45 Initial commit: Merakomis portal, Docker stack and user-reader API.
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-24 11:04:05 +03:00

279 lines
14 KiB
PHP
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
use AmoCRM\Collections\LinksCollection;
use AmoCRM\Filters\CatalogsFilter;
use AmoCRM\Models\CustomFieldsValues\LinkedEntityCustomFieldValuesModel;
use AmoCRM\Models\CustomFieldsValues\NumericCustomFieldValuesModel;
use AmoCRM\Models\CustomFieldsValues\ValueCollections\LinkedEntityCustomFieldValueCollection;
use AmoCRM\Models\CustomFieldsValues\ValueCollections\NumericCustomFieldValueCollection;
use AmoCRM\Models\CustomFieldsValues\ValueModels\LinkedEntityCustomFieldValueModel;
use AmoCRM\Collections\CustomFieldsValuesCollection;
use AmoCRM\Enum\InvoicesCustomFieldsEnums;
use AmoCRM\Exceptions\AmoCRMApiException;
use AmoCRM\Helpers\EntityTypesInterface;
use AmoCRM\Models\CatalogElementModel;
use AmoCRM\Models\CustomFieldsValues\ItemsCustomFieldValuesModel;
use AmoCRM\Models\CustomFieldsValues\LegalEntityCustomFieldValuesModel;
use AmoCRM\Models\CustomFieldsValues\SelectCustomFieldValuesModel;
use AmoCRM\Models\CustomFieldsValues\TextCustomFieldValuesModel;
use AmoCRM\Models\CustomFieldsValues\ValueCollections\ItemsCustomFieldValueCollection;
use AmoCRM\Models\CustomFieldsValues\ValueCollections\LegalEntityCustomFieldValueCollection;
use AmoCRM\Models\CustomFieldsValues\ValueCollections\SelectCustomFieldValueCollection;
use AmoCRM\Models\CustomFieldsValues\ValueCollections\TextCustomFieldValueCollection;
use AmoCRM\Models\CustomFieldsValues\ValueModels\ItemsCustomFieldValueModel;
use AmoCRM\Models\CustomFieldsValues\ValueModels\LegalEntityCustomFieldValueModel;
use AmoCRM\Models\CustomFieldsValues\ValueModels\NumericCustomFieldValueModel;
use AmoCRM\Models\CustomFieldsValues\ValueModels\SelectCustomFieldValueModel;
use AmoCRM\Models\CustomFieldsValues\ValueModels\TextCustomFieldValueModel;
use AmoCRM\Models\LeadModel;
use League\OAuth2\Client\Token\AccessTokenInterface;
include_once __DIR__ . '/bootstrap.php';
$accessToken = getToken();
$apiClient->setAccessToken($accessToken)
->setAccountBaseDomain($accessToken->getValues()['baseDomain'])
->onAccessTokenRefresh(
function (AccessTokenInterface $accessToken, string $baseDomain) {
saveToken(
[
'accessToken' => $accessToken->getToken(),
'refreshToken' => $accessToken->getRefreshToken(),
'expires' => $accessToken->getExpires(),
'baseDomain' => $baseDomain,
]
);
}
);
//Получим каталоги счетов
try {
$catalogsFilter = new CatalogsFilter();
$catalogsFilter->setType(EntityTypesInterface::INVOICES_CATALOG_TYPE_STRING);
$invoicesCatalog = $apiClient->catalogs()->get($catalogsFilter)->first();
} catch (AmoCRMApiException $e) {
printError($e);
die;
}
//Получим счета с ссылками на оплату
try {
$invoicesCollection = $apiClient
->catalogElements($invoicesCatalog->getId())
->get(null, [CatalogElementModel::INVOICE_LINK]);
} catch (AmoCRMApiException $e) {
printError($e);
die;
}
//Возьмем первый счет
$invoice = $invoicesCollection->first();
//Получим ссылку на печатную форму счета
if ($invoiceLink = $invoice->getInvoiceLink()) {
var_dump($invoiceLink);
}
//Получим значения полей
$customFieldValues = $invoice->getCustomFieldsValues();
//Получим значение поля Статус
if ($statusValue = $customFieldValues->getBy('fieldCode', InvoicesCustomFieldsEnums::STATUS)) {
var_dump($statusValue->getValues()->first()->getValue());
}
//Получим значение поля Юр. лицо
if ($legalEntityValue = $customFieldValues->getBy('fieldCode', InvoicesCustomFieldsEnums::LEGAL_ENTITY)) {
var_dump($legalEntityValue->getValues()->first()->getValue());
}
//Получим значение поля Плательщик
if ($payerValue = $customFieldValues->getBy('fieldCode', InvoicesCustomFieldsEnums::PAYER)) {
var_dump($payerValue->getValues()->first()->getValue());
}
//Получим значение привязанные товары
if ($itemsValue = $customFieldValues->getBy('fieldCode', InvoicesCustomFieldsEnums::ITEMS)) {
/** @var ItemsCustomFieldValueModel $value */
foreach ($itemsValue->getValues() as $value) {
var_dump($value->getValue());
}
}
//Получим значение поля Комментарий
if ($commentField = $customFieldValues->getBy('fieldCode', InvoicesCustomFieldsEnums::COMMENT)) {
var_dump($commentField->getValues()->first()->getValue());
}
//Получим значение поля Итоговая сумма к оплате
if ($priceValue = $customFieldValues->getBy('fieldCode', InvoicesCustomFieldsEnums::PRICE)) {
var_dump($priceValue->getValues()->first()->getValue());
}
//Получим значение поля Тип НДС
if ($vatValue = $customFieldValues->getBy('fieldCode', InvoicesCustomFieldsEnums::VAT_TYPE)) {
var_dump($vatValue->getValues()->first()->getValue());
}
//Получим значение поля Дата оплаты, имеет значение, только если счет в статусе оплачен
if ($paymentDateValue = $customFieldValues->getBy('fieldCode', InvoicesCustomFieldsEnums::PAYMENT_DATE)) {
var_dump($paymentDateValue->getValues()->first()->getValue());
}
//Создадим новый счет
//Обязательно должно быть название и заполнено поле статус
$newInvoice = new CatalogElementModel();
//Зададим Имя
$newInvoice->setName('Счет #238');
//Зададим дату создания
$creationDate = new DateTime('2021-05-15 10:00:00');
$newInvoice->setCreatedAt($creationDate->getTimestamp());
$invoiceCustomFieldsValues = new CustomFieldsValuesCollection();
//Зададим статус
$statusCustomFieldValueModel = new SelectCustomFieldValuesModel();
$statusCustomFieldValueModel->setFieldCode(InvoicesCustomFieldsEnums::STATUS);
$statusCustomFieldValueModel->setValues(
(new SelectCustomFieldValueCollection())
->add((new SelectCustomFieldValueModel())->setValue('Оплачен в аванс')) //Текст должен совпадать с одним из значений поля статус
);
$invoiceCustomFieldsValues->add($statusCustomFieldValueModel);
//Зададим комментарий
$commentCustomFieldValueModel = new TextCustomFieldValuesModel();
$commentCustomFieldValueModel->setFieldCode(InvoicesCustomFieldsEnums::COMMENT);
$commentCustomFieldValueModel->setValues(
(new TextCustomFieldValueCollection())
->add((new TextCustomFieldValueModel())->setValue('Текст комментария к счету'))
);
$invoiceCustomFieldsValues->add($commentCustomFieldValueModel);
//Зададим плательщика (до поле связанная сущность, может хранить в себе связь с сущностью (контакт или компания))
$payerCustomFieldValueModel = new LinkedEntityCustomFieldValuesModel();
$payerCustomFieldValueModel->setFieldCode(InvoicesCustomFieldsEnums::PAYER);
$payerCustomFieldValueModel->setValues(
(new LinkedEntityCustomFieldValueCollection())
->add(
(new LinkedEntityCustomFieldValueModel())
//->setName('Вася Пупкин') //Можно передать или название сущности, или ID сущности, чтобы заполнить это поле
->setEntityId(11014723)
->setEntityType(EntityTypesInterface::CONTACTS)
)
);
$invoiceCustomFieldsValues->add($payerCustomFieldValueModel);
//Зададим юр. лицо, от имени которого выставлен счёт
$legalEntityCustomFieldValueModel = new LegalEntityCustomFieldValuesModel();
$legalEntityCustomFieldValueModel->setFieldCode(InvoicesCustomFieldsEnums::LEGAL_ENTITY);
$legalEntityCustomFieldValueModel->setValues(
(new LegalEntityCustomFieldValueCollection())
->add(
(new LegalEntityCustomFieldValueModel())
->setName('ООО "Рога и копыта"')
->setLegalEntityType(LegalEntityCustomFieldValueModel::LEGAL_ENTITY_TYPE_JURIDICAL_PERSON)
->setVatId('05124214')
->setTaxRegistrationReasonCode('0124125125')
->setAddress('Москва, Красная площадь, дом 1')
->setKpp('124352279')
->setBankCode('023532795')
->setExternalUid('125125-4457xcsf-erhery')
)
);
$invoiceCustomFieldsValues->add($legalEntityCustomFieldValueModel);
//Зададим товары в счете
$itemsCustomFieldValueModel = new ItemsCustomFieldValuesModel();
$itemsCustomFieldValueModel->setFieldCode(InvoicesCustomFieldsEnums::ITEMS);
$itemsCustomFieldValueModel->setValues(
(new ItemsCustomFieldValueCollection())
->add(
(new ItemsCustomFieldValueModel())
->setDescription('Описание товара')
->setExternalUid('ID товара во внешней учетной системе')
//->setProductId('ID товара в списке товаров в amoCRM') //Необзятальное поле
->setQuantity(10) //количество
->setSku('Артикул товара')
->setUnitPrice(150) //цена за единицу товара
->setUnitType('кг') //единица измерения товвара
->setVatRateValue(20) //НДС 20%
->setDiscount([
'type' => ItemsCustomFieldValueModel::FIELD_DISCOUNT_TYPE_AMOUNT, //amount - скидка абсолютная, percentage - скидка в процентах от стоимости товара
'value' => 15.15 //15 рублей 15 копеек
])
->setBonusPointsPerPurchase(20) //Сколько бонусных баллов будет начислено за покупку
)
);
$invoiceCustomFieldsValues->add($itemsCustomFieldValueModel);
//Зададим значение поля Итоговая сумма к оплате
//Отображается в списке счетов,
//при заходе в карточку счета, стоимость счета будет рассчитана с учетом товаров, ндс и отображена в карточке счета
//Если передать некорректную сумму, то до редактирования в интерфейсе, через API будет возвращаться некорректная сумма
$priceCustomFieldValueModel = new NumericCustomFieldValuesModel();
$priceCustomFieldValueModel->setFieldCode(InvoicesCustomFieldsEnums::PRICE);
$priceCustomFieldValueModel->setValues(
(new NumericCustomFieldValueCollection())
->add(
(new NumericCustomFieldValueModel())
->setValue(100)
)
);
$invoiceCustomFieldsValues->add($priceCustomFieldValueModel);
//Зададим Тип НДС
$vatTypeCustomFieldValueModel = new SelectCustomFieldValuesModel();
$vatTypeCustomFieldValueModel->setFieldCode(InvoicesCustomFieldsEnums::VAT_TYPE);
$vatTypeCustomFieldValueModel->setValues(
(new SelectCustomFieldValueCollection())
->add((new SelectCustomFieldValueModel())->setValue("НДС начисляется поверх стоимости"))
);
$invoiceCustomFieldsValues->add($vatTypeCustomFieldValueModel);
//Установим значения в модель и сохраним
$newInvoice->setCustomFieldsValues($invoiceCustomFieldsValues);
$catalogElementsService = $apiClient->catalogElements($invoicesCatalog->getId());
try {
$newInvoice = $catalogElementsService->addOne($newInvoice);
var_dump('ID счета - ' . $newInvoice->getId());
} catch (AmoCRMApiException $e) {
printError($e);
die;
}
//Свяжем счет со сделкой с ID 7856057
$leadsService = $apiClient->leads();
$lead = (new LeadModel())
->setId(7856057);
try {
$leadsService->link($lead, (new LinksCollection())->add($newInvoice));
} catch (AmoCRMApiException $e) {
printError($e);
die;
}
//Обновим статус счета, без изменения других полей
$invoiceForUpdate = (new CatalogElementModel())
->setId($newInvoice->getId())
->setCatalogId($invoicesCatalog->getId())
->setCustomFieldsValues(
(new CustomFieldsValuesCollection())
->add(
(new SelectCustomFieldValuesModel())
->setFieldCode(InvoicesCustomFieldsEnums::STATUS)
->setValues(
(new SelectCustomFieldValueCollection())
->add((new SelectCustomFieldValueModel())->setValue('Оплачен')) //Текст должен совпадать с одним из значений поля статус
)
)
);
try {
$updatedInvoice = $catalogElementsService->updateOne($invoiceForUpdate);
var_dump('ID обновленного счета - ' . $updatedInvoice->getId());
} catch (AmoCRMApiException $e) {
printError($e);
die;
}
//Получим значения поля статус
$invoicesCfService = $apiClient->customFields(EntityTypesInterface::CATALOGS . ':' . $invoicesCatalog->getId());
try {
$invoicesCfsCollection = $invoicesCfService->get();
} catch (AmoCRMApiException $e) {
printError($e);
die;
}
$invoiceStatusField = $invoicesCfsCollection->getBy('code', InvoicesCustomFieldsEnums::STATUS);
foreach ($invoiceStatusField->getEnums() as $enum) {
var_dump('Значение поля ' . $enum->getValue() . ' с ID ' . $enum->getId());
}