Անցնել բովանդակությանը
Փաստաթղթեր ծրագրավորողների համար
Ուղեցույցv1

Կանխավճար API-ով

Ինչպես ընդունել կանխավճար VCR.AM-ի API-ով՝ կանխավճարի կտրոն, մնացորդի ստուգում, կանխավճարի օգտագործում վաճառքում և վերադարձ։ Օրինակներ TypeScript-ով և PHP-ով։

Երկու կտրոն

Կառավարության 1976-Ն որոշումը նախատեսում է էլեկտրոնային ՀԴՄ-ի կտրոնների երկու տեսակ՝ կանխավճարի կտրոն՝ ապրանքի մատակարարումից կամ ծառայության մատուցումից առաջ ստացված գումարի համար, և սովորական վաճառքի կտրոն (Հավելված 5, կետեր 12–14)։ Կանխավճարն օգտագործող վաճառքում այն արտացոլվում է «կանխավճարի օգտագործում» վճարման տեսակով (Հավելված 5, կետ 18)։ Կանխավճարի կտրոնում ապրանքներ, հանրագումար և ԱԱՀ չկան (Հավելված 7, կետ 2)։

Ուստի կանչերը երկուսն են՝ POST /prepayments, երբ հաճախորդը վճարում է կանխավճարը, և ավելի ուշ POST /sales՝ կանխավճարի գումարը amount.prepayment դաշտում։ ՊԵԿ-ը ստանում է միայն այդ գումարը․ հարցման մեջ ոչինչ վաճառքը չի կապում կոնկրետ կանխավճարի կտրոնի հետ։

VCR.AM-ն այդ կապը պահում է Ձեր փոխարեն՝ յուրաքանչյուր ընկերության մատյանում․ յուրաքանչյուր կանխավճար, օգտագործում և վերադարձ առանձին տող է՝ կապված գնորդի ՀՎՀՀ-ի հետ։ Յուրաքանչյուր կանխավճար վերադարձվում է հաշվարկված remaining և state դաշտերով։

1. Գրանցեք կանխավճարը

Գրանցեք կանխավճարը հենց որ հաճախորդը վճարի։ buyer-ը պարտադիր է՝ ընկերություն իր ՀՎՀՀ-ով կամ ֆիզիկական անձ։

TypeScript
import { VCRClient } from "@blob-solutions/vcr-am-sdk";

const apiKey = process.env.VCR_API_KEY;
if (apiKey === undefined) throw new Error("VCR_API_KEY is not set");
const client = new VCRClient(apiKey);

const prepayment = await client.registerPrepayment({
  cashier: { id: 1 },
  amount: { nonCash: "5000" },
  // A company buyer: the ledger tracks its balance by TIN.
  // For a private person: buyer: { type: "individual" }
  buyer: { type: "business_entity", tin: "01234567" },
});

// Keep prepayment.prepaymentId: a refund needs it.
PHP
use BlobSolutions\VcrAm\Input\Buyer;
use BlobSolutions\VcrAm\Input\CashierId;
use BlobSolutions\VcrAm\Input\PrepaymentAmount;
use BlobSolutions\VcrAm\Input\RegisterPrepaymentInput;
use BlobSolutions\VcrAm\VcrClient;

$client = new VcrClient(apiKey: $apiKey);

$prepayment = $client->registerPrepayment(new RegisterPrepaymentInput(
    cashier: CashierId::byInternalId(1),
    amount: new PrepaymentAmount(nonCash: '5000'),
    // For a private person: Buyer::individual()
    buyer: Buyer::businessEntity(tin: '01234567'),
));

// Keep $prepayment->prepaymentId: a refund needs it.

2. Ստուգեք մնացորդը

Երբ հաճախորդը վերադառնա, ստուգեք նրա բաց մնացորդը այն ՀՎՀՀ-ով, որով նա վճարել է։ Մնացորդը հաշվարկվում է ամբողջ ընկերության համար․ եթե մեկ ՀՎՀՀ-ի տակ մի քանի դրամարկղ կա, գանձապահը կարիք չունի իմանալու, թե որն է ընդունել կանխավճարը։

TypeScript
const balance = await client.getCustomerPrepaymentBalance({
  customerRef: "01234567", // the buyer's TIN
});

console.log(balance.balance); // 5000
for (const open of balance.openPrepayments) {
  console.log(`Prepayment #${open.prepaymentId}: ${open.remaining} left`);
}
PHP
$balance = $client->getCustomerPrepaymentBalance('01234567');

echo $balance->balance; // 5000.0
foreach ($balance->openPrepayments as $open) {
    printf("Prepayment #%d: %s left\n", $open->prepaymentId, $open->remaining);
}

3. Ցանկ և համադրում

Համադրման կամ Ձեր սեփական մատյանի համար ստացեք տվյալ դրամարկղում գրանցված կանխավճարների ցանկը։ Զտեք ըստ customerRef-ի (գնորդի ՀՎՀՀ) կամ ըստ state-ի։

TypeScript
const open = await client.listPrepayments({ state: "open" });
const forCustomer = await client.listPrepayments({ customerRef: "01234567" });
PHP
use BlobSolutions\VcrAm\PrepaymentState;

$open = $client->listPrepayments(state: PrepaymentState::Open);
$forCustomer = $client->listPrepayments(customerRef: '01234567');

Endpoint-ը վերադարձնում է առավելագույնը 500 վերջին կանխավճարները, և state-ը կիրառվում է այդ 500-ի ներսում։ Ակտիվ դրամարկղում ավելի հին կանխավճարներին հասնելու համար զտեք ըստ customerRef-ի։

4. Օգտագործեք կանխավճարը վաճառքում

Կանխավճարի օգտագործումը սովորական վաճառք է՝ amount-ում prepayment գումարով, անհրաժեշտության դեպքում cash-ի, nonCash-ի կամ compensation-ի հետ միասին։ Վճարումների գումարը պետք է հավասար լինի վաճառքի գումարին․ կտրոնը չի կարող գնի մի մասը թողնել չվճարված։

TypeScript
const sale = await client.registerSale({
  cashier: { id: 1 },
  buyer: { type: "business_entity", tin: "01234567" },
  // 5,000 from the advance, the remaining 10,000 paid now by card.
  amount: { prepayment: "5000", nonCash: "10000" },
  items: [
    {
      offer: { externalId: "legal-service" },
      quantity: "1",
      price: "15000",
      unit: "pc",
    },
  ],
});
PHP
use BlobSolutions\VcrAm\Input\Offer;
use BlobSolutions\VcrAm\Input\RegisterSaleInput;
use BlobSolutions\VcrAm\Input\SaleAmount;
use BlobSolutions\VcrAm\Input\SaleItem;
use BlobSolutions\VcrAm\Unit;

$sale = $client->registerSale(RegisterSaleInput::withAmount(
    cashier: CashierId::byInternalId(1),
    items: [
        new SaleItem(
            offer: Offer::existing('legal-service'),
            quantity: '1',
            price: '15000',
            unit: Unit::Piece,
        ),
    ],
    // 5,000 from the advance, the remaining 10,000 paid now by card.
    amount: new SaleAmount(prepayment: '5000', nonCash: '10000'),
    buyer: Buyer::businessEntity(tin: '01234567'),
));

Եթե գնորդը ընկերություն է, մատյանը գումարը դուրս է գրում այդ ՀՎՀՀ-ի բաց կանխավճարներից՝ սկսելով ամենահնից։

Եթե կանխավճարը վերաբերում է կոնկրետ պատվերի, նշեք այն prepaymentId-ով։ Այդ դեպքում վաճառքը կծախսի հենց այդ կանխավճարը և չի դիպչի մյուսներին, ուստի դրանք դեռ հնարավոր կլինի վերադարձնել։ Սա աշխատում է նաև ֆիզիկական անձ գնորդների համար։

TypeScript
const sale = await client.registerSale({
  cashier: { id: 1 },
  buyer: { type: "individual" },
  amount: { prepayment: "15000" },
  // The prepayment taken for this order.
  prepaymentId: prepayment.prepaymentId,
  items: [
    {
      offer: { externalId: "legal-service" },
      quantity: "1",
      price: "15000",
      unit: "pc",
    },
  ],
});
PHP
$sale = $client->registerSale(RegisterSaleInput::withAmount(
    cashier: CashierId::byInternalId(1),
    items: [
        new SaleItem(
            offer: Offer::existing('legal-service'),
            quantity: '1',
            price: '15000',
            unit: Unit::Piece,
        ),
    ],
    amount: new SaleAmount(prepayment: '15000'),
    buyer: Buyer::individual(),
    // The prepayment taken for this order.
    prepaymentId: $prepayment->prepaymentId,
));

Եթե կանխավճարը չի ծածկում amount.prepayment-ը, վաճառքը մերժվում է 400 կոդով՝ նախքան ՊԵԿ ուղարկելը․ կանխավճարը վերադարձված է, հասանելի գումարը քիչ է, կամ այն պատկանում է այլ ՀՎՀՀ-ի։ Ոչինչ չի պահպանվում, ուստի ուղարկեք ուղղված վաճառքը նոր Idempotency-Key-ով։ Անհայտ համարի դեպքում պատասխանը 404 է։ Քանի դեռ վաճառքը սպասում է ՊԵԿ-ի պատասխանին, դրա գումարը ամրագրված է․ մեկ այլ վաճառք այն չի վերցնի, իսկ այդ կանխավճարի վերադարձը կպատասխանի 409, մինչև վաճառքն ավարտվի։

5. Վերադարձ

Վերադարձը հետ է տալիս ամբողջ կանխավճարը, իսկ returnRemainder: true-ի դեպքում՝ վաճառքներից հետո մնացած ամբողջ գումարը։ Հարցումում նշվում են կանխավճարի համարը և պատճառը, բայց ոչ գումարը։

TypeScript
await client.registerPrepaymentRefund({
  cashier: { id: 1 },
  prepaymentId: prepayment.prepaymentId,
  reason: "customer_request",
});
PHP
use BlobSolutions\VcrAm\Input\RegisterPrepaymentRefundInput;
use BlobSolutions\VcrAm\RefundReason;

$client->registerPrepaymentRefund(new RegisterPrepaymentRefundInput(
    cashier: CashierId::byInternalId(1),
    prepaymentId: $prepayment->prepaymentId,
    reason: RefundReason::CustomerRequest,
));
TypeScript
await client.registerPrepaymentRefund({
  cashier: { id: 1 },
  prepaymentId: prepayment.prepaymentId,
  returnRemainder: true,
  reason: "customer_request",
});
PHP
$client->registerPrepaymentRefund(new RegisterPrepaymentRefundInput(
    cashier: CashierId::byInternalId(1),
    prepaymentId: $prepayment->prepaymentId,
    returnRemainder: true,
    reason: RefundReason::CustomerRequest,
));

Կանխավճարի վիճակները

Ցանկի և մանրամասն պատասխանի յուրաքանչյուր կանխավճար ունի հաշվարկված state դաշտ։

ՎիճակՆշանակությունԱնցնում է
openremaining-ը զրոյից մեծ էconsumed, երբ վաճառքներն օգտագործեն ամբողջ գումարը․ refunded՝ վերադարձից հետո
consumedremaining-ը զրո է, վերադարձ չի եղելՎերջնական
refundedՎերադարձ է գրանցվելՎերջնական

Մինչև VCR.AM-ը ստացված կանխավճարներ

Մինչև VCR.AM-ի հետ աշխատելը ստացված կանխավճարները կարելի է ավելացնել մատյանում անձնական էջի ընկերության բաժնից («Ներմուծել գոյություն ունեցող կանխավճար»)։ Ներմուծումը ՊԵԿ-ին չի դիմում։ Ներմուծված գումարները երևում են միայն անձնական էջում․ API-ով մնացորդի ստուգումը և վաճառքների ավտոմատ դուրսգրումը դրանք չեն տեսնում։ Ներմուծման համար API endpoint չկա։