চালান এবং ট্র্যাকিং উত্পন্ন করা হচ্ছে


11

প্রতি 2 সপ্তাহে, সিস্টেমটি সংস্থাগুলির জন্য চালান তৈরি করবে।

সংস্থাটি প্রতি মাসে 1 ম এবং 16 তারিখে একটি চালান পাবেন। (এটি প্রতি 2 সপ্তাহে ক্রোন জবের মাধ্যমে চলবে It

ordersসারণীতে গ্রাহকের অর্ডারগুলির তালিকা রয়েছে এবং এটি কোন সংস্থার ( orders.company_id) এর অন্তর্গত তাও নির্দেশ করে

invoiceটেবিল থেকে আদেশ মোট খরচ নিরূপণ ordersটেবিল।

আমি কীভাবে যুক্তিসঙ্গত চালান ট্র্যাকিং ডিজাইন করতে পারি তা বোঝার চেষ্টা করছি। কোনও সময় সংস্থাটি আমাকে ফিগুলি পাঠাতে হবে বা কোনও সময় আমি তাদের ফি পাঠাতে হবে ( invoice.amount)

আমাকে নিম্নলিখিতগুলি সহ চালানগুলি ট্র্যাক করতে হবে:

  • যখন সংস্থাটি আমাকে পরিমাণ পাঠিয়েছে
  • আমি কখন কোম্পানিকে অর্থ প্রেরণ করেছি?
  • সংস্থার কাছ থেকে কত পরিমাণ অর্থ প্রাপ্ত হয়েছে
  • আমি কত টাকা কোম্পানিকে পাঠিয়েছি
  • আমি কি পুরো পরিমাণ পেয়েছি (যদি না হয় তবে ডিবিতে আমার কী আপডেট করতে হবে?)
  • চালানের স্থিতি (চালান পাঠানো, বাতিল, প্রাপ্ত পরিমাণ, প্রেরিত পরিমাণ)

আমি যে ডাটাবেস ডিজাইনটি নিয়ে এসেছি তা এখানে:

সংস্থার টেবিল

mysql> select * from company;
+----+-----------+
| id | name      |
+----+-----------+
|  1 | Company A |
|  2 | Company B |
+----+-----------+

গ্রাহকরা আমার ওয়েবসাইট থেকে একটি সংস্থা নির্বাচন করতে পারেন।

অর্ডার টেবিল

mysql> select * from orders;
+----+---------+------------+------------+---------------------+-----------+
| id | user_id | company_id | total_cost | order_date          | status_id |
+----+---------+------------+------------+---------------------+-----------+
|  1 |       5 |          2 |      25.00 | 2012-02-03 23:30:24 |         1 |
|  2 |       7 |          2 |      30.00 | 2012-02-13 18:06:12 |         1 |
+----+---------+------------+------------+---------------------+-----------+

দুটি গ্রাহক সংস্থা বি ( orders.company_id = 2) থেকে পণ্য অর্ডার করেছেন । আমি জানি অর্ডার ক্ষেত্রগুলি যথেষ্ট নয়, কেবল আপনার জন্য সরলীকৃত।

অর্ডার_প্রডাক্টস টেবিল

mysql> select * from orders_products;
+----+----------+------------+--------------+-------+
| id | order_id | product_id | product_name | cost  |
+----+----------+------------+--------------+-------+
|  1 |        1 |         34 | Chair        | 10.00 |
|  2 |        1 |         25 | TV           | 10.00 |
|  3 |        1 |         27 | Desk         |  2.50 |
|  4 |        1 |         36 | Laptop       |  2.50 |
|  5 |        2 |         75 | PHP Book     | 25.00 |
|  6 |        2 |         74 | MySQL Book   |  5.00 |
+----+----------+------------+--------------+-------+

গ্রাহকরা কি আদেশ করেছেন এমন পণ্যের তালিকা।

চালানের টেবিল

mysql> select * from invoice;
+----+------------+------------+---------------------+--------+-----------+
| id | company_id | invoice_no | invoice_date        | amount | status_id |
+----+------------+------------+---------------------+--------+-----------+
|  7 |          2 |        123 | 2012-02-16 23:59:59 |  55.00 |         1 |
+----+------------+------------+---------------------+--------+-----------+

আমি এখানেই চালান টেবিলের নকশায় বেশ আটকে আছি। কীভাবে এটি করা উচিত তা আমি নিশ্চিত নই। চালান প্রতি 2 সপ্তাহে উত্পন্ন করা হবে। ফলাফল থেকে উদাহরণ invoice.amount55.00 কারণ এটি orders.company_id = 2টেবিল থেকে গণনা করা হয়েছে

যদি invoice.amount-50.00 (বিয়োগ) হয় তবে এর অর্থ সংস্থার আমাকে ফিগুলির পরিমাণ প্রেরণ করতে হবে।

যদি invoice.amount50.00 হয় তবে এর অর্থ আমার কাছে সংস্থাটি ফি পাঠানো দরকার।

স্ট্যাটাস_আইডিটি হতে পারে: (1) চালান প্রেরণ, (2) বাতিল, (3) সম্পূর্ণ

আমার invoice_idকি ordersটেবিলের ক্ষেত্র যুক্ত করার দরকার আছে ? orders.invoice_idসারিটি 'চালান' সারণিতে সন্নিবেশ করা হলে ক্ষেত্রটি আপডেট করুন ।

চালান_প্রদানের টেবিল

mysql> select * from invoice_payment;
+----+------------+-----------------+-------------+---------------------+---------------------+
| id | invoice_id | amount_received | amount_sent | date_received       | date_sent           |
+----+------------+-----------------+-------------+---------------------+---------------------+
|  1 |          1 |            0.00 |       55.00 | 0000-00-00 00:00:00 | 2012-02-18 22:20:53 |
+----+------------+-----------------+-------------+---------------------+---------------------+

এখানেই আমি লেনদেন ট্র্যাক এবং আপডেট করতে পারি .. পেমেন্টটি বিএসিএস এর মাধ্যমে দেওয়া হবে।

এই ভাল টেবিল ডিজাইন বা আমার উন্নতি প্রয়োজন? আমার কোন ক্ষেত্র এবং সারণী যুক্ত করা উচিত?

যদি চালানটি উত্পন্ন হয়েছে এবং পরে আমার পরিবর্তনগুলি orders_productsবা ordersটেবিলগুলিতে পরিবর্তন করা দরকার - এটি কি invoice.amountক্ষেত্রটি পুনরায় গণনা করা উচিত ? (আমি পিএইচপি / মাইএসকিউএল ব্যবহার করব)।

এসকিউএল ডাম্প :

CREATE TABLE IF NOT EXISTS `company` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(25) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=3 ;

INSERT INTO `company` (`id`, `name`) VALUES
(1, 'Company A'),
(2, 'Company B');

CREATE TABLE IF NOT EXISTS `invoice` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `company_id` int(11) NOT NULL,
  `invoice_no` int(11) NOT NULL,
  `invoice_date` datetime NOT NULL,
  `amount` decimal(6,2) NOT NULL,
  `status_id` tinyint(1) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=8 ;


INSERT INTO `invoice` (`id`, `company_id`, `invoice_no`, `invoice_date`, `amount`, `status_id`) VALUES
(7, 2, 123, '2012-02-16 23:59:59', '55.00', 1);


CREATE TABLE IF NOT EXISTS `invoice_payment` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `invoice_id` int(11) NOT NULL,
  `amount_received` decimal(6,2) NOT NULL,
  `amount_sent` decimal(6,2) NOT NULL,
  `date_received` datetime NOT NULL,
  `date_sent` datetime NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=2 ;

INSERT INTO `invoice_payment` (`id`, `invoice_id`, `amount_received`, `amount_sent`, `date_received`, `date_sent`) VALUES
(1, 1, '0.00', '55.00', '0000-00-00 00:00:00', '2012-02-18 22:20:53');


CREATE TABLE IF NOT EXISTS `orders` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `user_id` int(11) NOT NULL,
  `company_id` int(11) NOT NULL,
  `total_cost` decimal(6,2) NOT NULL,
  `order_date` datetime NOT NULL,
  `status_id` int(11) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=3 ;


INSERT INTO `orders` (`id`, `user_id`, `company_id`, `total_cost`, `order_date`, `status_id`) VALUES
(1, 5, 2, '25.00', '2012-02-03 23:30:24', 1),
(2, 7, 2, '30.00', '2012-02-13 18:06:12', 1);


CREATE TABLE IF NOT EXISTS `orders_products` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `order_id` int(11) NOT NULL,
  `product_id` int(11) NOT NULL,
  `product_name` varchar(100) NOT NULL,
  `cost` decimal(6,2) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=7 ;

INSERT INTO `orders_products` (`id`, `order_id`, `product_id`, `product_name`, `cost`) VALUES
(1, 1, 34, 'Chair', '10.00'),
(2, 1, 25, 'TV', '10.00'),
(3, 1, 27, 'Desk', '2.50'),
(4, 1, 36, 'Laptop', '2.50'),
(5, 2, 75, 'PHP Book', '25.00'),
(6, 2, 74, 'MySQL Book', '5.00');

এখানে উত্তরের জন্য আপনি সারণিগুলি আপডেট / আপডেট করতে চান নিখরচায়।

ধন্যবাদ

উত্তর:


8

নগদ ম্যাচিং

এটি নগদ ম্যাচিংয়ের সমস্যা। আপনি এটি দুটি স্তরের একটিতে ট্র্যাক করতে পারেন:

  • ইনভয়েসড নগদ পরিসংখ্যানের সাথে তুলনা করুন (কিছুটা ম্লান হলেও এটি আসলে বেশিরভাগ লয়েড সিন্ডিকেটস দ্বারা অভ্যন্তরীণ ব্যবসায়ের জন্য করা হয়, প্রায়শই তাকে 'লিখিত বনাম স্বাক্ষরিত' প্রতিবেদন বলা হয়)।

  • চালানের মাধ্যমে বিভক্ত নগদ অর্থ প্রদানের থেকে সুস্পষ্ট নগদ বরাদ্দ বজায় রাখুন।

আপনার প্রশ্ন থেকে আমি মনে করি আপনি পরবর্তীটি করতে চান।

সাধারণত নগদ লেনদেনের একটি পৃথক সেট এবং চালিতগুলিতে নগদ অর্থ প্রদানের বরাদ্দ থাকা একটি ব্রিজিং টেবিলের মাধ্যমে এটি করা হয়। যদি মানগুলি সমান হয় বা নগদ অর্থ প্রদান যদি একক চালানের রেফারেন্সের সাথে আসে তবে আপনি বরাদ্দটি স্বয়ংক্রিয়ভাবে করতে পারেন। চালান এবং অর্থ প্রদানের মধ্যে যদি এম: এম সম্পর্ক থাকে তবে আপনাকে একটি ম্যানুয়াল ম্যাচিং প্রক্রিয়া করতে হবে (স্বয়ংক্রিয়ভাবে এটি করা আসলে ন্যাপস্যাক সমস্যার একটি বৈকল্পিক )।

একটি বেসিক নগদ ম্যাচিং সিস্টেম

কল্পনা করুন যে আপনার কাছে একটি চালান টেবিল, নগদ অর্থ প্রদানের টেবিল এবং একটি বরাদ্দ সারণী রয়েছে। আপনি যখন চালান জারি করেন তখন আপনি চালান সারণীতে একটি চালানের রেকর্ড এবং বরাদ্দ সারণীতে একটি 'গ্রহণযোগ্য' বা 'প্রদেয়' রেকর্ড সেট করেন।

  • চালান # 1, $ 100

  • বরাদ্দ: চালান # 1, 'গ্রহণযোগ্য' লেনদেনের ধরণ এবং $ 100 owing বকেয়া রেফারেন্স সহ একটি রেকর্ড। এই রেকর্ডে নগদ অর্থ প্রদানের কোনও রেফারেন্স নেই।

এখন, আপনি নগদ অর্থ প্রদানের জন্য 100 ডলার পাবেন

  • নগদ অর্থ প্রদান (chq # 12345): $ 100

  • বরাদ্দ: চালান # 1 এবং chq # 12345, 'নগদ' লেনদেনের ধরণ এবং -100 বকেয়া (paid 100 প্রদত্ত) সম্পর্কিত একটি রেকর্ড।

আপনি এটি এম: এম সম্পর্কের ক্ষেত্রে সাধারণ করতে পারেন যেখানে আপনি একক চালানের বিপরীতে একাধিক অর্থ প্রদান করেন বা একাধিক চালানের আওতায় থাকা পেমেন্ট পাবেন। এই কাঠামোটি ক্রেডিট নিয়ন্ত্রণ প্রতিবেদনগুলি তৈরি করাও বেশ সহজ করে তোলে। প্রতিবেদনে কেবলমাত্র (180) দিনের চেয়ে বেশি পুরানো চালানগুলি খুঁজে পাওয়া দরকার যা এখনও অসামান্য ব্যালেন্স রয়েছে।

এখানে স্কিমা প্লাসের কয়েকটি দর্শন এবং একটি পুরানো debtণ কোয়েরির উদাহরণ। দুর্ভাগ্যক্রমে আমার কাছে কোনও চালনার জন্য মাইএসকিএল উদাহরণ নেই, সুতরাং এটি এসকিউএল সার্ভারের জন্য।

-- ==============================================================
-- === CashMatch.sql ============================================
-- ==============================================================
--


-- === Invoices =================================================
--
create table Invoice (
       InvoiceID        int identity (1,1) not null
      ,InvoiceRef       varchar (20)
      ,Amount           money
      ,InvoiceDate      datetime
)
go

alter table Invoice
  add constraint PK_Invoice 
      primary key nonclustered (InvoiceID)
go


-- === Cash Payments ============================================
--
create table CashPayment (
       CashPaymentID    int identity (1,1) not null
      ,CashPaymentRef   varchar (20)
      ,Amount           money
      ,PaidDate         datetime
)
go

alter table CashPayment
  add constraint PK_CashPayment
      primary key nonclustered (CashPaymentID)
go




-- === Allocations ==============================================
--
create table Allocation (
       AllocationID       int identity (1,1) not null
      ,CashPaymentID      int  -- Note that some records are not
      ,InvoiceID          int  -- on one side.
      ,AllocatedAmount    money
      ,AllocationType     varchar (20)
      ,TransactionDate    datetime
)
go

alter table Allocation
  add constraint PK_Allocation
      primary key nonclustered (AllocationID)
go


-- ==============================================================
-- === Scenarios ================================================
-- ==============================================================
--
declare @Invoice1ID int
       ,@Invoice2ID int
       ,@PaymentID int


-- === Raise a new invoice ======================================
--
insert Invoice (InvoiceRef, Amount, InvoiceDate)
values ('001', 100, '2012-01-01')

set @Invoice1ID = @@identity

insert Allocation (
       InvoiceID
      ,AllocatedAmount
      ,TransactionDate
      ,AllocationType
) values (@Invoice1ID, 100, '2012-01-01', 'receivable')


-- === Receive a payment ========================================
--
insert CashPayment (CashPaymentRef, Amount, PaidDate)
values ('12345', 100, getdate())

set @PaymentID = @@identity

insert Allocation (
       InvoiceID
      ,CashPaymentID
      ,AllocatedAmount
      ,TransactionDate
      ,AllocationType
) values (@Invoice1ID, @PaymentID, -100, getdate(), 'paid')



-- === Raise two invoices =======================================
--
insert Invoice (InvoiceRef, Amount, InvoiceDate)
values ('002', 75, '2012-01-01')

set @Invoice1ID = @@identity

insert Allocation (
       InvoiceID
      ,AllocatedAmount
      ,TransactionDate
      ,AllocationType
) values (@Invoice1ID, 75, '2012-01-01', 'receivable')


insert Invoice (InvoiceRef, Amount, InvoiceDate)
values ('003', 75, '2012-01-01')

set @Invoice2ID = @@identity

insert Allocation (
       InvoiceID
      ,AllocatedAmount
      ,TransactionDate
      ,AllocationType
) values (@Invoice2ID, 75, '2012-01-01', 'receivable')


-- === Receive a payment ========================================
-- The payment covers one invoice in full and part of the other.
--
insert CashPayment (CashPaymentRef, Amount, PaidDate)
values ('23456', 120, getdate()) 

set @PaymentID = @@identity

insert Allocation (
       InvoiceID
      ,CashPaymentID
      ,AllocatedAmount
      ,TransactionDate
      ,AllocationType
) values (@Invoice1ID, @PaymentID, -75, getdate(), 'paid')

insert Allocation (
       InvoiceID
      ,CashPaymentID
      ,AllocatedAmount
      ,TransactionDate
      ,AllocationType
) values (@Invoice2ID, @PaymentID, -45, getdate(), 'paid')



-- === Aged debt report ========================================
--
select i.InvoiceRef
      ,sum (a.AllocatedAmount)                 as Owing
      ,datediff (dd, i.InvoiceDate, getdate()) as Age
  from Invoice i
  join Allocation a
    on a.InvoiceID = i.InvoiceID
 group by i.InvoiceRef
         ,datediff (dd, i.InvoiceDate, getdate())
having sum (a.AllocatedAmount) > 0

চালান এবং অর্থ প্রদানের জন্য খনিতে পৃথক সারণী রয়েছে। আপনি অভ্যন্তরীণ সংযোগ সহ একটি সাধারণ টেবিল ব্যবহার করতে পারেন। অ্যাকাউন্টিং সিস্টেমগুলিতে নগদ মেলা প্রায়শই সেইভাবে প্রয়োগ করা হয়।
কনসার্নড

আমি আপনার এসকিউএল সার্ভার উদাহরণটি মাইএসকিউএলে অনুবাদ করতে পেরেছি। আমি পেরিয়েছি এবং আমি এখন খুব ভাল বুঝতে পেরেছি। AllocationTypeআমি ক্লায়েন্টের টাকা পাঠাতে চাইলে কী হবে ? আমারও কি CashPaymentটেবিলের মধ্যে sertোকানো দরকার (বলি যে তাদের বিএসিএসের মাধ্যমে প্রদান করা উচিত)?
ফিরে

1
হ্যাঁ, আপনি আগত এবং বহির্গামী উভয় অর্থের জন্য নগদ অর্থ প্রদানের রেকর্ড চান। নগদ মিলের লেনদেনের জন্য প্রকৃত লেনদেনের ধরণগুলি আপনার উপর নির্ভর করে।
কনসার্নড

1
আপনি চাইলে একক বন্দোবস্ত প্রদানের বিপরীতে উভয় দিক থেকে চালানগুলি থেকে লেনদেনের সাথে মিল রাখতে পারেন। উদাহরণস্বরূপ: ১০০ ডলারে আউটগোয়িং চালান, $ 50 (-50) এর জন্য আগত চালান এবং উভয় চালানের বিপরীতে মিলছে $ 50 এর জন্য ব্যালেন্সিং পেমেন্ট।
কনসার্নড
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.