meraproject/vendor/amocrm/amocrm-api-library/examples/invoices_actions.php

279 lines
14 KiB
PHP
Raw Permalink Normal View History

<?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());
}