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