279 lines
14 KiB
PHP
279 lines
14 KiB
PHP
<?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());
|
||
}
|